food-market/docs/money-module-progress.md
nns 659a749d7f
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
docs(money): пользовательская инструкция docs/money.md + финал прогресс-дока
docs/money.md — как открыть смену, оплатить приёмку, смотреть долги/остатки,
права ролей. Прогресс-док: пп.8–9 отмечены, журнал с тремя фиксами по ходу
e2e (back-fill прав, date-only→UTC, список счетов 500). Итог 10/10.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-07 22:49:21 +05:00

78 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Модуль «Деньги» (простой режим) — прогресс
**Старт:** 2026-10-07.
**Решение владельца от 07.10.2026:** собрать базовый финансовый контур
в простом режиме (счета, кассовые/безналичные движения, оплата приёмок,
долги поставщикам, смены кассы, отчёт «Деньги»).
## Чек-лист
- [x] **0. Сверка с МойСкладом** → `docs/money-moysklad-reference.md`
- [x] **1. Счета и кассы** (тип: касса / сейф / банк, начальный остаток,
магазин, активный флаг; поддержка нескольких банковских счетов на магазин;
счёт эквайринга) — domain + миграция, сидер статей расходов
- [x] **2. Денежные документы** (PaymentIn/Out, CashIn/Out, Transfer между
своими счетами; статьи расходов; проведение/отмена; аудит) — MoneyService
с Serializable-транзакциями, controllers `MoneyTransactionsController` +
`ExpenseItemsController`
- [x] **3. Оплата поставщикам** (платёж ↔ приёмки/возвраты с распределением,
payedSum на приёмке, статус оплаты, кнопка «Оплатить» из приёмки,
частичная оплата) — колонка `PayedSum`, `MoneyTransactionLink`,
`SuppliesController` отдаёт `PaymentStatus` + фильтр
- [x] **4. Взаиморасчёты (долги поставщикам)** (отчёт, корректировки,
самая старая неоплаченная дата) — `CounterpartyAdjustmentsController`,
`MoneyReportsController.SupplierDebts`
- [x] **5. Смены кассы** (open/close, внесения/выплаты, «должно быть ↔ по факту»,
Z-отчёт, запрет продажи без смены) — `CashShiftsController`, Z-отчёт
в `/shifts/{id}/report`, проверка в `RetailSalesController.PostCoreAsync`
- [x] **6. Отчёт «Деньги»** (остатки по счетам, движение за период,
инвариант остатков) — `MoneyReportsController.Balances`/`Movement`
- [x] **7. UI и меню** (раздел «Деньги»: Отчёт/Счета/Платежи/Смены/Долги;
блок оплаты в приёмке `SupplyPaymentSection`; колонка+фильтр оплаты в списке
приёмок; mobile-first через ListPageShell/Modal; меню: админ — всё, кассир —
только смены, кладовщик — ничего (оплаченность видит в приёмке).
`src/pages/money/*`, `src/lib/money.ts`, роуты в App.tsx, i18n ru/en)
- [x] **8. Тесты** — unit `MoneyMathTests` 25/25 (статус оплаты, ожидаемая
наличность, разница смены, остаток счёта, долг поставщика, защита от
переплаты, money-флаги ролей); integration `MoneyModuleTests` 8/8 на реальном
Postgres (мультитенантность, инвариант остатка, частичная→полная оплата,
переплата→409, долг поставщика, продажа без смены→409 + после open→ok,
расчёт expected/difference, date-only openingDate + список с данными);
e2e на стенде РЕАЛЬНЫМИ запросами (создание счёта date-only, CashIn→баланс
80000, open-shift→drawer→close expected=9000/diff=500) + menu-walk
(quality-watchdog step 9) **3/3 зелёный** (admin 33 пункта вкл. 5 money-
страниц, keeper 17 без денег, cashier 8 вкл. /money/shifts; 0 4xx/5xx/toast/
console.error).
- [x] **9. Деплой + документация** — `~/deploy-stage.sh` (api+web на
test.admin.food-market.kz, миграция Phase33a + back-fill применились на
старте), `docs/money.md` (инструкция: счета, платежи, оплата приёмки, долги,
смены, отчёт).
## Границы
**НЕ в этом спринте:**
банк-клиент / выгрузка платёжек, импорт выписок, валюты, зарплата,
полный P&L.
**Запрещено трогать:** прод, shared-postgres, `global.json`, gateway nginx,
соседний проект `sklad`.
## Журнал
### 2026-10-07
- Старт. Создан этот прогресс-док. Готовлю `docs/money-moysklad-reference.md`
через headless Playwright (SPA-рендер нужен).
- Бэкенд пп.0–6 (домен/инфра/API/миграция/сидер) закоммичен, build зелёный.
- UI п.7: раздел «Деньги» (5 страниц + блок оплаты приёмки + колонка/фильтр
оплаты), роуты, меню (admin/cashier/keeper), i18n ru/en. tsc+eslint зелёные.
- MoneyMath вынесен из сервиса/контроллеров → unit 25/25, integration 8/8.
- Деплой на stage. Поймано и починено по ходу e2e/menu-walk:
1. **back-fill** money-прав кассиру и статей расходов для орг, созданных до
Sprint 33 (`EnsureMoneyDefaultsAsync`) — иначе 403 на /money/shifts.
2. **date-only даты** (UI шлёт `YYYY-MM-DD`) → Npgsql 500 на timestamptz →
`MoneyMath.AsUtc` во всех money-контроллерах.
3. **список счетов 500 на данных** — `EF.Property(xmin)` в памяти на
AsNoTracking → перенесён в server-side Select.
Все три закрыты регресс-тестами. menu-walk 3/3, реальные запросы на стенде ОК.
- **ИТОГ: 10/10 (п.0 + пп.1–9). Модуль «Деньги» готов на stage.**