docs(money): пользовательская инструкция docs/money.md + финал прогресс-дока
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run

docs/money.md — как открыть смену, оплатить приёмку, смотреть долги/остатки,
права ролей. Прогресс-док: пп.8–9 отмечены, журнал с тремя фиксами по ходу
e2e (back-fill прав, date-only→UTC, список счетов 500). Итог 10/10.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nns 2026-10-07 22:49:21 +05:00
parent 4a064de96b
commit 659a749d7f
2 changed files with 181 additions and 3 deletions

View file

@ -32,9 +32,21 @@
приёмок; mobile-first через ListPageShell/Modal; меню: админ — всё, кассир — приёмок; mobile-first через ListPageShell/Modal; меню: админ — всё, кассир —
только смены, кладовщик — ничего (оплаченность видит в приёмке). только смены, кладовщик — ничего (оплаченность видит в приёмке).
`src/pages/money/*`, `src/lib/money.ts`, роуты в App.tsx, i18n ru/en) `src/pages/money/*`, `src/lib/money.ts`, роуты в App.tsx, i18n ru/en)
- [ ] **8. Тесты** (unit + integration на реальном Postgres + e2e на стенде - [x] **8. Тесты** — unit `MoneyMathTests` 25/25 (статус оплаты, ожидаемая
изнутри сети + меню-прогон watchdog step 9 зелёный) наличность, разница смены, остаток счёта, долг поставщика, защита от
- [ ] **9. Деплой + документация** (`~/deploy-stage.sh`, `docs/money.md`) переплаты, 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 ### 2026-10-07
- Старт. Создан этот прогресс-док. Готовлю `docs/money-moysklad-reference.md` - Старт. Создан этот прогресс-док. Готовлю `docs/money-moysklad-reference.md`
через headless Playwright (SPA-рендер нужен). через 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.**

153
docs/money.md Normal file
View file

@ -0,0 +1,153 @@
# Деньги — пользовательская инструкция
Раздел **«Деньги»** (простой режим) помогает магазину держать под контролем
наличные и безналичные деньги: где сколько лежит, кому вы должны, как прошли
смены кассы и сколько оплачено поставщикам.
В меню слева раздел видят:
- **Администратор** — всё: Отчёт «Деньги», Счета и кассы, Платежи и ордера,
Смены, Долги поставщикам.
- **Кассир** — только **Смены** (свои смены, внесения/выплаты).
- **Кладовщик** — пунктов «Денег» в меню нет; оплаченность приёмки он видит
прямо в карточке приёмки.
---
## 1. Счета и кассы
Это справочник мест, где лежат деньги. Типы:
| Тип | Для чего |
|---|---|
| **Касса** | наличные в ящике ККМ на точке продаж. Привязывается к магазину. |
| **Сейф** | наличные у директора/бухгалтера (инкассация касса → сейф). |
| **Банковский счёт** | расчётный счёт (Kaspi, Halyk…). Можно несколько. |
| **Эквайринг** | счёт, куда банк зачисляет оплаты картой с кассы. |
**Создать счёт:** «Счета и кассы» → «Добавить». Укажите название, тип, валюту,
**начальный остаток** и **дату начала учёта** (сколько денег было на счёте на
старте работы в системе). Для кассы обязателен магазин; для банковского счёта —
номер счёта.
> ⚠️ Тип, дата начала и начальный остаток после создания **не меняются** — иначе
> разойдётся история остатков. Если счётом ещё не пользовались, его можно
> удалить; если по нему уже есть движения — только **архивировать** (снять
> галочку «Активен»).
Текущий остаток считается сам: `начальный + все проведённые приходы − расходы`.
---
## 2. Платежи и ордера
Движения денег между вами и контрагентами и внутри ваших счетов:
- **Приход наличных / Поступление (безнал)** — деньги пришли.
- **Расход наличных / Расход (безнал)** — деньги ушли (нужна **статья расхода**).
- **Перевод** (кнопка «Перевод») — инкассация между своими счетами: касса → банк,
касса → сейф. Создаётся черновиком-парой; проведите его, чтобы деньги
переместились.
**Как создать:** «Платежи и ордера» → «Добавить» → выберите тип, счёт, сумму,
при расходе — статью. Документ создаётся **черновиком** — он ещё не влияет на
остатки. Нажмите **«Провести»**, чтобы учесть его. Проведённый документ
заблокирован; чтобы изменить — сначала «Отменить проведение».
**Статьи расходов** (кнопка «Статьи») — справочник: Закупка товара, Аренда,
Зарплата, Коммунальные, Прочее (эти пять системные, их нельзя удалить, но можно
переименовать). Добавляйте свои (например, «Хоз-товары»).
---
## 3. Оплата поставщику (из приёмки)
Откройте проведённую **приёмку** → блок **«Оплата»** внизу. Там видно: сумма
приёмки, сколько оплачено, остаток и статус (**Не оплачена / Частично /
Оплачена**).
1. Нажмите **«Оплатить»**.
2. Выберите, **откуда платите** — касса (наличные) или банковский счёт (безнал).
3. Введите сумму — можно **частично** (например, половину сейчас, остаток потом).
4. Готово: создаётся и сразу проводится расходный документ, привязанный к этой
приёмке; «оплачено» и статус пересчитываются.
Переплатить больше суммы приёмки система не даст.
В списке приёмок есть колонка **«Оплата»** и фильтр по статусу — быстро найти
всё неоплаченное.
---
## 4. Долги поставщикам
«Долги поставщикам» — отчёт «кому я должен»:
```
долг = приёмки − оплаченные приёмки − (возвраты − возвращённые деньги) + корректировки
```
По каждому поставщику видно суммы, долг и **дату самой старой неоплаченной
приёмки**. Сверху — общий итог.
**Начальный долг / корректировка** (кнопка вверху) — для перехода на систему,
когда с поставщиком уже есть долг: выберите поставщика, направление («Мы должны»
увеличивает долг, «Поставщик должен» уменьшает), сумму. Корректировка влияет
только на этот отчёт, на остатки счетов — нет.
---
## 5. Смены кассы
Продавать на точке можно **только при открытой смене**. Если смена не открыта,
при проведении чека касса выдаст понятную ошибку.
**Открыть смену:** «Смены» → «Открыть смену» → точка продаж, касса для наличных,
при необходимости счёт эквайринга (для карт), **разменник** на начало (сколько
наличных положили в ящик). На одной точке одновременно — одна открытая смена.
**Во время смены** (откройте смену из списка):
- **Внести** — положили деньги в ящик (размен из сейфа).
- **Выплатить** — выдали из ящика (инкассация, оплата курьеру). Нужна причина.
**Закрыть смену:** кнопка «Закрыть смену». Система показывает, сколько **должно
быть** наличных:
```
разменник + продажи наличными − возвраты наличными + внесения − выплаты
```
Вы вводите, **сколько по факту** в ящике. Разница подсвечивается: красным —
недостача, жёлтым — излишек. Карточная выручка учитывается отдельно.
**Z-отчёт** — у закрытой смены кнопка «Z-отчёт»: печатный вид всех цифр смены
(кнопка «Печать»).
---
## 6. Отчёт «Деньги»
«Отчёт «Деньги»» — две части:
- **Остатки по счетам** — сколько сейчас на каждом счёте/кассе и общий итог.
- **Движение за период** — приход и расход по дням или месяцам за выбранный
интервал (переводы между своими счетами в приход/расход не попадают — это
деньги внутри магазина).
---
## Частые вопросы
**Продажа не проводится — «не открыта кассовая смена».** Откройте смену на этой
точке (раздел «Смены»).
**Не могу удалить счёт.** По нему есть движения или смены — архивируйте его
(снимите «Активен»).
**Оплатил поставщику, а долг не уменьшился.** Проверьте, что платёж **проведён**
и привязан к приёмке (оплата из блока «Оплата» в приёмке делает это сама).
**Ошибся в смене/платеже.** Платёж можно «Отменить проведение» и исправить.
Закрытая смена неизменяема — расхождение фиксируется как разница (недостача/
излишек) и видно в Z-отчёте.