From 8785fd60d134d82f84509ccea89b26e2ac2cc982 Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 8 Oct 2026 02:10:11 +0500 Subject: [PATCH] =?UTF-8?q?fix(money):=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D1=81=D0=BC=D0=B5=D0=BD=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9/=D0=BD=D0=B5=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=82=D0=BE=D1=87=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6=20=E2=86=92=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenShiftAsync проверяет RetailPoint.IsActive (retail-point-inactive) и привязку кассира к точке (retail-point-not-assigned; у кого привязок нет — на любой точке). Co-Authored-By: Claude Opus 5.5 --- .../Money/MoneyService.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/food-market.infrastructure/Money/MoneyService.cs b/src/food-market.infrastructure/Money/MoneyService.cs index cc46c69..153d10f 100644 --- a/src/food-market.infrastructure/Money/MoneyService.cs +++ b/src/food-market.infrastructure/Money/MoneyService.cs @@ -181,6 +181,33 @@ public async Task UnpostAsync(Guid transactionId, Guid curre return new(MoneyServiceStatus.ShiftAlreadyOpen, null, null, "shift-already-open", "На этой точке уже открыта смена."); + // Точка продаж должна существовать и быть активной — на деактивированной + // точке открывать смену (и, значит, продавать) нельзя. + var rp = await _db.RetailPoints.FirstOrDefaultAsync(r => r.Id == retailPointId, ct); + if (rp is null) + return new(MoneyServiceStatus.ValidationFailed, null, null, + "retail-point-not-found", "Точка продаж не найдена."); + if (!rp.IsActive) + return new(MoneyServiceStatus.ValidationFailed, null, null, + "retail-point-inactive", "Точка продаж деактивирована — открыть смену нельзя."); + + // Привязка кассира к точкам: если у сотрудника настроены привязки к точкам + // продаж, открывать смену он может ТОЛЬКО на закреплённой точке. У кого + // привязок нет (администратор/управляющий) — на любой. + var emp = await _db.Employees.FirstOrDefaultAsync(e => e.UserId == cashierUserId, ct); + if (emp is not null) + { + var hasAnyAssignment = await _db.EmployeeRetailPointAssignments.AnyAsync(a => a.EmployeeId == emp.Id, ct); + if (hasAnyAssignment) + { + var assigned = await _db.EmployeeRetailPointAssignments + .AnyAsync(a => a.EmployeeId == emp.Id && a.RetailPointId == retailPointId, ct); + if (!assigned) + return new(MoneyServiceStatus.ValidationFailed, null, null, + "retail-point-not-assigned", "Вы не закреплены за этой точкой продаж — открыть смену нельзя."); + } + } + var cash = await _db.MoneyAccounts.FirstOrDefaultAsync(a => a.Id == cashAccountId, ct); if (cash is null || cash.Kind != MoneyAccountKind.Cash) return new(MoneyServiceStatus.ValidationFailed, null, null,