From 3475133b1031f34e951c2792ca88693abaf8cf1e Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:25:47 +0700 Subject: [PATCH] =?UTF-8?q?test(e2e):=20=D1=81=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D1=81=D1=83?= =?UTF-8?q?=D0=BC=D0=BC=D1=8B=20=D0=BA=D1=80=D0=B0=D1=82=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=80=D1=83=D0=B1=D0=BB=D1=8E=20(=D1=83=D1=87=D1=91=D1=82=20?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D1=83=D0=B3=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: на ветке codex/fix-live-database цепочка подтверждение → расчёт → утверждение впервые дошла до конца, и K3/N2 остался красным не из-за дефекта, а из-за теста: 8 ч × 123,45 ₽ = 98760 коп., а расчёт округляет строку до rounding_unit_minor (по умолчанию 100 коп., service.ts:695) и начисляет 98800. Округление до рубля — настройка продукта, не дефект; тест не должен от него зависеть. Что: SYNTHETIC_RATE_MINOR 12345 → 12300 (123,00 ₽/ч), оплата смены официанта в K9 111111 → 111100. Суммы остаются заведомо синтетическими. --- tests/e2e/50-money-and-errors.e2e.ts | 2 +- tests/e2e/harness/fixtures.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/e2e/50-money-and-errors.e2e.ts b/tests/e2e/50-money-and-errors.e2e.ts index 4093d81..1932669 100644 --- a/tests/e2e/50-money-and-errors.e2e.ts +++ b/tests/e2e/50-money-and-errors.e2e.ts @@ -175,7 +175,7 @@ describe('Деньги, S9, A4 и даты на реальной PostgreSQL', () it('[K9/D3] официант по пресету получает оплату смены из параметров пресета', async () => { const [unit] = await createOrgUnits(1); const [employee] = await importEmployees(1); - const shiftRate = 111_111; // синтетические 1 111,11 ₽ за смену + const shiftRate = 111_100; // синтетические 1 111,00 ₽ за смену (кратно рублю, см. округление) // Предполагаемый контракт: параметры пресета передаются объектом `params` // (ключи — param_declarations правила). const assign = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { diff --git a/tests/e2e/harness/fixtures.ts b/tests/e2e/harness/fixtures.ts index cafcd4f..a7d8bd7 100644 --- a/tests/e2e/harness/fixtures.ts +++ b/tests/e2e/harness/fixtures.ts @@ -138,8 +138,12 @@ export async function hourlyRuleId(): Promise { return hourly!.id; } -/** Синтетическая ставка 123,45 ₽/ч (заведомо не реальная сумма). */ -export const SYNTHETIC_RATE_MINOR = 12_345; +/** + * Синтетическая ставка 123,00 ₽/ч (заведомо не реальная сумма). Кратна рублю: расчёт + * округляет строку до rounding_unit_minor (по умолчанию 100 коп.), и 8 ч × ставка + * должны совпадать с начислением без учёта округления. + */ +export const SYNTHETIC_RATE_MINOR = 12_300; export async function assignHourly(employeeId: string, orgUnitId: string | null) { const response = await api('PUT', `/employees/${employeeId}/pay-assignment`, {