docs(money): пользовательская инструкция docs/money.md + финал прогресс-дока
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
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:
parent
4a064de96b
commit
659a749d7f
|
|
@ -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
153
docs/money.md
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
# Деньги — пользовательская инструкция
|
||||||
|
|
||||||
|
Раздел **«Деньги»** (простой режим) помогает магазину держать под контролем
|
||||||
|
наличные и безналичные деньги: где сколько лежит, кому вы должны, как прошли
|
||||||
|
смены кассы и сколько оплачено поставщикам.
|
||||||
|
|
||||||
|
В меню слева раздел видят:
|
||||||
|
|
||||||
|
- **Администратор** — всё: Отчёт «Деньги», Счета и кассы, Платежи и ордера,
|
||||||
|
Смены, Долги поставщикам.
|
||||||
|
- **Кассир** — только **Смены** (свои смены, внесения/выплаты).
|
||||||
|
- **Кладовщик** — пунктов «Денег» в меню нет; оплаченность приёмки он видит
|
||||||
|
прямо в карточке приёмки.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Счета и кассы
|
||||||
|
|
||||||
|
Это справочник мест, где лежат деньги. Типы:
|
||||||
|
|
||||||
|
| Тип | Для чего |
|
||||||
|
|---|---|
|
||||||
|
| **Касса** | наличные в ящике ККМ на точке продаж. Привязывается к магазину. |
|
||||||
|
| **Сейф** | наличные у директора/бухгалтера (инкассация касса → сейф). |
|
||||||
|
| **Банковский счёт** | расчётный счёт (Kaspi, Halyk…). Можно несколько. |
|
||||||
|
| **Эквайринг** | счёт, куда банк зачисляет оплаты картой с кассы. |
|
||||||
|
|
||||||
|
**Создать счёт:** «Счета и кассы» → «Добавить». Укажите название, тип, валюту,
|
||||||
|
**начальный остаток** и **дату начала учёта** (сколько денег было на счёте на
|
||||||
|
старте работы в системе). Для кассы обязателен магазин; для банковского счёта —
|
||||||
|
номер счёта.
|
||||||
|
|
||||||
|
> ⚠️ Тип, дата начала и начальный остаток после создания **не меняются** — иначе
|
||||||
|
> разойдётся история остатков. Если счётом ещё не пользовались, его можно
|
||||||
|
> удалить; если по нему уже есть движения — только **архивировать** (снять
|
||||||
|
> галочку «Активен»).
|
||||||
|
|
||||||
|
Текущий остаток считается сам: `начальный + все проведённые приходы − расходы`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Платежи и ордера
|
||||||
|
|
||||||
|
Движения денег между вами и контрагентами и внутри ваших счетов:
|
||||||
|
|
||||||
|
- **Приход наличных / Поступление (безнал)** — деньги пришли.
|
||||||
|
- **Расход наличных / Расход (безнал)** — деньги ушли (нужна **статья расхода**).
|
||||||
|
- **Перевод** (кнопка «Перевод») — инкассация между своими счетами: касса → банк,
|
||||||
|
касса → сейф. Создаётся черновиком-парой; проведите его, чтобы деньги
|
||||||
|
переместились.
|
||||||
|
|
||||||
|
**Как создать:** «Платежи и ордера» → «Добавить» → выберите тип, счёт, сумму,
|
||||||
|
при расходе — статью. Документ создаётся **черновиком** — он ещё не влияет на
|
||||||
|
остатки. Нажмите **«Провести»**, чтобы учесть его. Проведённый документ
|
||||||
|
заблокирован; чтобы изменить — сначала «Отменить проведение».
|
||||||
|
|
||||||
|
**Статьи расходов** (кнопка «Статьи») — справочник: Закупка товара, Аренда,
|
||||||
|
Зарплата, Коммунальные, Прочее (эти пять системные, их нельзя удалить, но можно
|
||||||
|
переименовать). Добавляйте свои (например, «Хоз-товары»).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Оплата поставщику (из приёмки)
|
||||||
|
|
||||||
|
Откройте проведённую **приёмку** → блок **«Оплата»** внизу. Там видно: сумма
|
||||||
|
приёмки, сколько оплачено, остаток и статус (**Не оплачена / Частично /
|
||||||
|
Оплачена**).
|
||||||
|
|
||||||
|
1. Нажмите **«Оплатить»**.
|
||||||
|
2. Выберите, **откуда платите** — касса (наличные) или банковский счёт (безнал).
|
||||||
|
3. Введите сумму — можно **частично** (например, половину сейчас, остаток потом).
|
||||||
|
4. Готово: создаётся и сразу проводится расходный документ, привязанный к этой
|
||||||
|
приёмке; «оплачено» и статус пересчитываются.
|
||||||
|
|
||||||
|
Переплатить больше суммы приёмки система не даст.
|
||||||
|
|
||||||
|
В списке приёмок есть колонка **«Оплата»** и фильтр по статусу — быстро найти
|
||||||
|
всё неоплаченное.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Долги поставщикам
|
||||||
|
|
||||||
|
«Долги поставщикам» — отчёт «кому я должен»:
|
||||||
|
|
||||||
|
```
|
||||||
|
долг = приёмки − оплаченные приёмки − (возвраты − возвращённые деньги) + корректировки
|
||||||
|
```
|
||||||
|
|
||||||
|
По каждому поставщику видно суммы, долг и **дату самой старой неоплаченной
|
||||||
|
приёмки**. Сверху — общий итог.
|
||||||
|
|
||||||
|
**Начальный долг / корректировка** (кнопка вверху) — для перехода на систему,
|
||||||
|
когда с поставщиком уже есть долг: выберите поставщика, направление («Мы должны»
|
||||||
|
увеличивает долг, «Поставщик должен» уменьшает), сумму. Корректировка влияет
|
||||||
|
только на этот отчёт, на остатки счетов — нет.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Смены кассы
|
||||||
|
|
||||||
|
Продавать на точке можно **только при открытой смене**. Если смена не открыта,
|
||||||
|
при проведении чека касса выдаст понятную ошибку.
|
||||||
|
|
||||||
|
**Открыть смену:** «Смены» → «Открыть смену» → точка продаж, касса для наличных,
|
||||||
|
при необходимости счёт эквайринга (для карт), **разменник** на начало (сколько
|
||||||
|
наличных положили в ящик). На одной точке одновременно — одна открытая смена.
|
||||||
|
|
||||||
|
**Во время смены** (откройте смену из списка):
|
||||||
|
|
||||||
|
- **Внести** — положили деньги в ящик (размен из сейфа).
|
||||||
|
- **Выплатить** — выдали из ящика (инкассация, оплата курьеру). Нужна причина.
|
||||||
|
|
||||||
|
**Закрыть смену:** кнопка «Закрыть смену». Система показывает, сколько **должно
|
||||||
|
быть** наличных:
|
||||||
|
|
||||||
|
```
|
||||||
|
разменник + продажи наличными − возвраты наличными + внесения − выплаты
|
||||||
|
```
|
||||||
|
|
||||||
|
Вы вводите, **сколько по факту** в ящике. Разница подсвечивается: красным —
|
||||||
|
недостача, жёлтым — излишек. Карточная выручка учитывается отдельно.
|
||||||
|
|
||||||
|
**Z-отчёт** — у закрытой смены кнопка «Z-отчёт»: печатный вид всех цифр смены
|
||||||
|
(кнопка «Печать»).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Отчёт «Деньги»
|
||||||
|
|
||||||
|
«Отчёт «Деньги»» — две части:
|
||||||
|
|
||||||
|
- **Остатки по счетам** — сколько сейчас на каждом счёте/кассе и общий итог.
|
||||||
|
- **Движение за период** — приход и расход по дням или месяцам за выбранный
|
||||||
|
интервал (переводы между своими счетами в приход/расход не попадают — это
|
||||||
|
деньги внутри магазина).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Частые вопросы
|
||||||
|
|
||||||
|
**Продажа не проводится — «не открыта кассовая смена».** Откройте смену на этой
|
||||||
|
точке (раздел «Смены»).
|
||||||
|
|
||||||
|
**Не могу удалить счёт.** По нему есть движения или смены — архивируйте его
|
||||||
|
(снимите «Активен»).
|
||||||
|
|
||||||
|
**Оплатил поставщику, а долг не уменьшился.** Проверьте, что платёж **проведён**
|
||||||
|
и привязан к приёмке (оплата из блока «Оплата» в приёмке делает это сама).
|
||||||
|
|
||||||
|
**Ошибся в смене/платеже.** Платёж можно «Отменить проведение» и исправить.
|
||||||
|
Закрытая смена неизменяема — расхождение фиксируется как разница (недостача/
|
||||||
|
излишек) и видно в Z-отчёте.
|
||||||
Loading…
Reference in a new issue