diff --git a/docs/money-module-progress.md b/docs/money-module-progress.md index de80ab5..9da75ce 100644 --- a/docs/money-module-progress.md +++ b/docs/money-module-progress.md @@ -32,9 +32,21 @@ приёмок; mobile-first через ListPageShell/Modal; меню: админ — всё, кассир — только смены, кладовщик — ничего (оплаченность видит в приёмке). `src/pages/money/*`, `src/lib/money.ts`, роуты в App.tsx, i18n ru/en) -- [ ] **8. Тесты** (unit + integration на реальном Postgres + e2e на стенде - изнутри сети + меню-прогон watchdog step 9 зелёный) -- [ ] **9. Деплой + документация** (`~/deploy-stage.sh`, `docs/money.md`) +- [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` (инструкция: счета, платежи, оплата приёмки, долги, + смены, отчёт). ## Границы @@ -50,3 +62,16 @@ ### 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.** diff --git a/docs/money.md b/docs/money.md new file mode 100644 index 0000000..925822f --- /dev/null +++ b/docs/money.md @@ -0,0 +1,153 @@ +# Деньги — пользовательская инструкция + +Раздел **«Деньги»** (простой режим) помогает магазину держать под контролем +наличные и безналичные деньги: где сколько лежит, кому вы должны, как прошли +смены кассы и сколько оплачено поставщикам. + +В меню слева раздел видят: + +- **Администратор** — всё: Отчёт «Деньги», Счета и кассы, Платежи и ордера, + Смены, Долги поставщикам. +- **Кассир** — только **Смены** (свои смены, внесения/выплаты). +- **Кладовщик** — пунктов «Денег» в меню нет; оплаченность приёмки он видит + прямо в карточке приёмки. + +--- + +## 1. Счета и кассы + +Это справочник мест, где лежат деньги. Типы: + +| Тип | Для чего | +|---|---| +| **Касса** | наличные в ящике ККМ на точке продаж. Привязывается к магазину. | +| **Сейф** | наличные у директора/бухгалтера (инкассация касса → сейф). | +| **Банковский счёт** | расчётный счёт (Kaspi, Halyk…). Можно несколько. | +| **Эквайринг** | счёт, куда банк зачисляет оплаты картой с кассы. | + +**Создать счёт:** «Счета и кассы» → «Добавить». Укажите название, тип, валюту, +**начальный остаток** и **дату начала учёта** (сколько денег было на счёте на +старте работы в системе). Для кассы обязателен магазин; для банковского счёта — +номер счёта. + +> ⚠️ Тип, дата начала и начальный остаток после создания **не меняются** — иначе +> разойдётся история остатков. Если счётом ещё не пользовались, его можно +> удалить; если по нему уже есть движения — только **архивировать** (снять +> галочку «Активен»). + +Текущий остаток считается сам: `начальный + все проведённые приходы − расходы`. + +--- + +## 2. Платежи и ордера + +Движения денег между вами и контрагентами и внутри ваших счетов: + +- **Приход наличных / Поступление (безнал)** — деньги пришли. +- **Расход наличных / Расход (безнал)** — деньги ушли (нужна **статья расхода**). +- **Перевод** (кнопка «Перевод») — инкассация между своими счетами: касса → банк, + касса → сейф. Создаётся черновиком-парой; проведите его, чтобы деньги + переместились. + +**Как создать:** «Платежи и ордера» → «Добавить» → выберите тип, счёт, сумму, +при расходе — статью. Документ создаётся **черновиком** — он ещё не влияет на +остатки. Нажмите **«Провести»**, чтобы учесть его. Проведённый документ +заблокирован; чтобы изменить — сначала «Отменить проведение». + +**Статьи расходов** (кнопка «Статьи») — справочник: Закупка товара, Аренда, +Зарплата, Коммунальные, Прочее (эти пять системные, их нельзя удалить, но можно +переименовать). Добавляйте свои (например, «Хоз-товары»). + +--- + +## 3. Оплата поставщику (из приёмки) + +Откройте проведённую **приёмку** → блок **«Оплата»** внизу. Там видно: сумма +приёмки, сколько оплачено, остаток и статус (**Не оплачена / Частично / +Оплачена**). + +1. Нажмите **«Оплатить»**. +2. Выберите, **откуда платите** — касса (наличные) или банковский счёт (безнал). +3. Введите сумму — можно **частично** (например, половину сейчас, остаток потом). +4. Готово: создаётся и сразу проводится расходный документ, привязанный к этой + приёмке; «оплачено» и статус пересчитываются. + +Переплатить больше суммы приёмки система не даст. + +В списке приёмок есть колонка **«Оплата»** и фильтр по статусу — быстро найти +всё неоплаченное. + +--- + +## 4. Долги поставщикам + +«Долги поставщикам» — отчёт «кому я должен»: + +``` +долг = приёмки − оплаченные приёмки − (возвраты − возвращённые деньги) + корректировки +``` + +По каждому поставщику видно суммы, долг и **дату самой старой неоплаченной +приёмки**. Сверху — общий итог. + +**Начальный долг / корректировка** (кнопка вверху) — для перехода на систему, +когда с поставщиком уже есть долг: выберите поставщика, направление («Мы должны» +увеличивает долг, «Поставщик должен» уменьшает), сумму. Корректировка влияет +только на этот отчёт, на остатки счетов — нет. + +--- + +## 5. Смены кассы + +Продавать на точке можно **только при открытой смене**. Если смена не открыта, +при проведении чека касса выдаст понятную ошибку. + +**Открыть смену:** «Смены» → «Открыть смену» → точка продаж, касса для наличных, +при необходимости счёт эквайринга (для карт), **разменник** на начало (сколько +наличных положили в ящик). На одной точке одновременно — одна открытая смена. + +**Во время смены** (откройте смену из списка): + +- **Внести** — положили деньги в ящик (размен из сейфа). +- **Выплатить** — выдали из ящика (инкассация, оплата курьеру). Нужна причина. + +**Закрыть смену:** кнопка «Закрыть смену». Система показывает, сколько **должно +быть** наличных: + +``` +разменник + продажи наличными − возвраты наличными + внесения − выплаты +``` + +Вы вводите, **сколько по факту** в ящике. Разница подсвечивается: красным — +недостача, жёлтым — излишек. Карточная выручка учитывается отдельно. + +**Z-отчёт** — у закрытой смены кнопка «Z-отчёт»: печатный вид всех цифр смены +(кнопка «Печать»). + +--- + +## 6. Отчёт «Деньги» + +«Отчёт «Деньги»» — две части: + +- **Остатки по счетам** — сколько сейчас на каждом счёте/кассе и общий итог. +- **Движение за период** — приход и расход по дням или месяцам за выбранный + интервал (переводы между своими счетами в приход/расход не попадают — это + деньги внутри магазина). + +--- + +## Частые вопросы + +**Продажа не проводится — «не открыта кассовая смена».** Откройте смену на этой +точке (раздел «Смены»). + +**Не могу удалить счёт.** По нему есть движения или смены — архивируйте его +(снимите «Активен»). + +**Оплатил поставщику, а долг не уменьшился.** Проверьте, что платёж **проведён** +и привязан к приёмке (оплата из блока «Оплата» в приёмке делает это сама). + +**Ошибся в смене/платеже.** Платёж можно «Отменить проведение» и исправить. +Закрытая смена неизменяема — расхождение фиксируется как разница (недостача/ +излишек) и видно в Z-отчёте.