docs: аудит против МойСклада — проход 2 (факт-проверки, Казахстан)
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/moysklad-logic-audit.md (+ .html) разделом «Проход 2»: - Все «проверить» закрыты фактом (код файл:строка и/или запрос на стенде): возврат→ReferenceSaleId; Z-отчёт без «по товарам»; долг поставщику считается (MoneyReportsController:120-183); обязательные поля товара Name+Unit+Group; приёмка с телефона/терминалы/фискализация — нет; отмена проведения ЕСТЬ у всех документов (исправление прохода 1); смена — только ручное открытие. - Себестоимость: подтверждён FIFO у МойСклада; у нас средняя; реальный пример Демо (BIOBLAS, Product.Cost=548.6441 из 3 приёмок) — показано искажение прибыли. - Казахстан (новое): фискализация ОФД РК (заглушка у нас; МойСклад — WebKassa/reKassa), НДС 16% с 2026 (дефолт KZ уже 16, SystemReferenceSeeder:38), маркировка ИС МПТ (только флаг IsMarked), СНТ/ЭСФ, акциз. Блок «Казахстан — обязательное по закону». - Сводка обновлена: топ-15 скорректирован (фискализация/маркировка РК вместо неверных пунктов), добавлен KZ-блок. Касса МойСклад vs наша — по функциям кассира. Только отчёт, без правок кода. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
338965a76c
commit
e5bbd4a047
|
|
@ -83,6 +83,34 @@
|
||||||
<li><b>Понятные статусы по-русски</b> без слова «проведено» в спорных местах.</li>
|
<li><b>Понятные статусы по-русски</b> без слова «проведено» в спорных местах.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
<h2>🇰🇿 Казахстан — обязательное по закону (проход 2)</h2>
|
||||||
|
<div class="card">
|
||||||
|
<p class="big">Это не «лучше/хуже», а <b>требования закона РК</b> — без них магазин не может легально работать.</p>
|
||||||
|
<table>
|
||||||
|
<tr><th>Требование</th><th>Что нужно магазину</th><th>У нас сейчас</th></tr>
|
||||||
|
<tr><td><b>Фискализация (онлайн-ККМ + ОФД)</b></td><td>каждый чек уходит в ОФД (новый протокол с 01.04.2026)</td><td class="hi">нет (заглушка)</td></tr>
|
||||||
|
<tr><td><b>НДС 16%</b> (с 2026, было 12%; 5% лекарства)</td><td>верная ставка в чеке и отчётах</td><td class="ok">дефолт KZ уже 16% ✓ (нет перехода 12→16 по дате)</td></tr>
|
||||||
|
<tr><td><b>Маркировка</b> (сигареты, обувь, лекарства)</td><td>сканировать и «вывести код из оборота»</td><td class="hi">только галочка, вывода нет</td></tr>
|
||||||
|
<tr><td><b>СНТ/ЭСФ</b> (накладные)</td><td>для розницы в основном автоматически; по подакцизным — подтверждать</td><td class="mid">нет интеграции</td></tr>
|
||||||
|
</table>
|
||||||
|
<p><b>Что нужно в первую очередь:</b> 1) фискализация ОФД (иначе нельзя пробивать чеки) →
|
||||||
|
2) маркировка, если продаёте сигареты → 3) НДС 16% в чеке. МойСклад в Казахстане это умеет
|
||||||
|
(интеграции WebKassa / reKassa).</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Что уточнили на проходе 2</h2>
|
||||||
|
<div class="card">
|
||||||
|
<ul>
|
||||||
|
<li><b>Себестоимость:</b> подтвердили — у МойСклада FIFO; у нас средняя. На реальном товаре Демо
|
||||||
|
(«BIOBLAS шампунь») себестоимость в отчёте считается текущей средней (548,64 ₸ из 3 закупок),
|
||||||
|
а не ценой на момент продажи → прибыль за прошлые периоды меняется при новых закупках.</li>
|
||||||
|
<li><b>Касса и кассир:</b> скидки, отложенные чеки, поиск, весы, печать, смешанная оплата — <b>есть</b>.
|
||||||
|
Нет: фискализации ОФД (важно), бонусов прямо в кассе, эквайринг-терминала, сканера камерой.</li>
|
||||||
|
<li><b>Поправки к проходу 1:</b> «отмена проведения» у нас <b>есть</b> у всех документов (ошибка прохода 1);
|
||||||
|
долги поставщикам <b>считаются</b> из приёмок/возвратов/оплат; «54-ФЗ» — это закон РФ, у нас РК.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h2>Что с тестами</h2>
|
<h2>Что с тестами</h2>
|
||||||
<p>Часть наших тестов закрепляла <b>текущее (неправильное) поведение</b> как эталон — их нужно
|
<p>Часть наших тестов закрепляла <b>текущее (неправильное) поведение</b> как эталон — их нужно
|
||||||
переписать под логику МойСклада. В первую очередь: шаг 10 full-chain (инвентаризация),
|
переписать под логику МойСклада. В первую очередь: шаг 10 full-chain (инвентаризация),
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
| 2 | Прибыльность | COGS берётся как текущая `Product.Cost` (приближение), а не себестоимость на момент продажи | Большой (следствие п.1; нужны партии/снимок COGS) |
|
| 2 | Прибыльность | COGS берётся как текущая `Product.Cost` (приближение), а не себестоимость на момент продажи | Большой (следствие п.1; нужны партии/снимок COGS) |
|
||||||
| 3 | Инвентаризация | Сама двигает остатки и статус «Проведено» без Оприходования/Списания | Средний (переделка уже в очереди — см. §4) |
|
| 3 | Инвентаризация | Сама двигает остатки и статус «Проведено» без Оприходования/Списания | Средний (переделка уже в очереди — см. §4) |
|
||||||
| 4 | Себестоимость продажи | В движение продажи пишется `UnitCost = цена продажи`, а не себестоимость (`DemandsController:270`) | Средний (писать снимок себестоимости) |
|
| 4 | Себестоимость продажи | В движение продажи пишется `UnitCost = цена продажи`, а не себестоимость (`DemandsController:270`) | Средний (писать снимок себестоимости) |
|
||||||
| 5 | Отмена проведения | Нет единообразной «отмены проведения» (unpost) с возвратом движений по всем документам | Средний |
|
| 5 | **Фискализация РК** | Касса не фискализирует чеки у ОФД (онлайн-ККМ РК) — `NullFiscalProvider`-заглушка; по закону РК розница обязана | Средний–большой (интеграция Webkassa/reKassa) |
|
||||||
| 6 | Статусы документов | «Проведено/Черновик» не всегда соответствуют модели МойСклада (у инвентаризации — ошибочно) | Средний |
|
| 6 | Статусы документов | «Проведено/Черновик» не всегда соответствуют модели МойСклада (у инвентаризации — ошибочно) | Средний |
|
||||||
| 7 | «Создать на основании» | Нет сквозного механизма создания документов «на основании» со ссылками (приёмка→возврат, инвент.→опр/спис, продажа→возврат) | Средний–большой |
|
| 7 | «Создать на основании» | Нет сквозного механизма создания документов «на основании» со ссылками (приёмка→возврат, инвент.→опр/спис, продажа→возврат) | Средний–большой |
|
||||||
| 8 | Связи документов | Не хранятся/не показываются обратные связи «на основании №…» и блок «Связанные документы» | Средний |
|
| 8 | Связи документов | Не хранятся/не показываются обратные связи «на основании №…» и блок «Связанные документы» | Средний |
|
||||||
|
|
@ -46,9 +46,9 @@
|
||||||
| 10 | Возврат покупателя: себестоимость | При возврате товар возвращается на склад — по какой себестоимости (FIFO-слой vs средняя) не определено строго | Средний |
|
| 10 | Возврат покупателя: себестоимость | При возврате товар возвращается на склад — по какой себестоимости (FIFO-слой vs средняя) не определено строго | Средний |
|
||||||
| 11 | Партийный учёт | Отсутствует (нет партий/слоёв прихода) — блокирует FIFO, сроки годности, точный COGS | Большой |
|
| 11 | Партийный учёт | Отсутствует (нет партий/слоёв прихода) — блокирует FIFO, сроки годности, точный COGS | Большой |
|
||||||
| 12 | Перемещение и себестоимость | При перемещении между складами себестоимость должна переноситься по FIFO-слоям | Средний (зависит от п.11) |
|
| 12 | Перемещение и себестоимость | При перемещении между складами себестоимость должна переноситься по FIFO-слоям | Средний (зависит от п.11) |
|
||||||
| 13 | Взаиморасчёты: единая модель | Долги считаются, но не как сквозной реестр взаиморасчётов МойСклада (все документы+платежи в один баланс) | Средний |
|
| 13 | **Маркировка товаров РК** | Нет вывода кода из оборота (ИС МПТ) при продаже табак/обувь/лекарств — только флаг `IsMarked`; обязательно по закону РК | Большой |
|
||||||
| 14 | Оприходование/Списание: цена | Должны брать учётную себестоимость (FIFO), у нас — переданный `UnitCost`/средняя | Средний |
|
| 14 | Оприходование/Списание: цена | Должны брать учётную себестоимость (FIFO), у нас — переданный `UnitCost`/средняя | Средний |
|
||||||
| 15 | Розничная смена: авто-открытие | В МойСкладе смена открывается автоматически первой продажей; у нас — проверить сценарий | Малый–средний |
|
| 15 | Розничная смена: авто-открытие | В МойСкладе смена открывается автоматически первой продажей (≤24ч); у нас только ручное открытие (`CashShiftsController` Open/Close, продажа требует открытой смены) | Малый–средний |
|
||||||
|
|
||||||
### Топ-10 предложений «лучше, чем МойСклад» (все **[НА РЕШЕНИЕ ВЛАДЕЛЬЦА]**)
|
### Топ-10 предложений «лучше, чем МойСклад» (все **[НА РЕШЕНИЕ ВЛАДЕЛЬЦА]**)
|
||||||
|
|
||||||
|
|
@ -65,6 +65,22 @@
|
||||||
| 9 | Отчёт «Прибыль» сразу на дашборде простого режима | Владелец видит главное без отчётов | Малый |
|
| 9 | Отчёт «Прибыль» сразу на дашборде простого режима | Владелец видит главное без отчётов | Малый |
|
||||||
| 10 | Понятные статусы на русском без «проведено» (Черновик→Завершён/Проведён с пояснением) | Меньше вопросов «что это значит» | Малый |
|
| 10 | Понятные статусы на русском без «проведено» (Черновик→Завершён/Проведён с пояснением) | Меньше вопросов «что это значит» | Малый |
|
||||||
|
|
||||||
|
### 🇰🇿 Казахстан — обязательное по закону (добавлено проходом 2)
|
||||||
|
|
||||||
|
Отдельный блок: это не «лучше/хуже», а **требования закона РК**, без которых магазин не
|
||||||
|
может легально работать. Детали и ссылки — в §6 ниже.
|
||||||
|
|
||||||
|
| # | Требование РК | Что нужно рознице | Наш статус | Срочность |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| K1 | **Фискализация (онлайн-ККМ + ОФД РК)** | каждый чек фискализируется у ОФД (новый протокол ККМ v2.0.3 с 01.04.2026) | ❌ заглушка `NullFiscalProvider` | 🔴 блокер для продаж |
|
||||||
|
| K2 | **НДС 16%** (с 01.01.2026; было 12%), льгота 5% на лекарства | ставка НДС и её учёт в чеке/отчётах | ✅ дефолт KZ = **16** (`SystemReferenceSeeder.cs:38`); нет переходной логики 12→16 по дате оборота | 🟡 |
|
||||||
|
| K3 | **Маркировка (ИС МПТ)**: табак, обувь, лекарства (+пиво/одежда 2026–2027) | при продаже — сканировать и **вывести код из оборота** | ❌ только флаг `IsMarked`, вывода нет | 🔴 если продаёт эти категории |
|
||||||
|
| K4 | **СНТ/ЭСФ** (сопроводительные накладные) | для рознице в основном автоматически; **подтверждение обязательно по подакцизным** | ❌ нет интеграции с ИС ЭСФ | 🟡 (🔴 если подакцизные) |
|
||||||
|
| K5 | **Акциз/подакцизные** (табак, алкоголь) | учёт + подтверждение СНТ при приёмке | ❌ нет отметки «подакцизный» | 🟡 |
|
||||||
|
|
||||||
|
**Для маленького продуктового магазина в первую очередь:** K1 (фискализация — иначе нельзя
|
||||||
|
пробивать чеки) → K3 (маркировка, если продаёт сигареты) → K2 (НДС в чеке).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ПРИОРИТЕТ 1 — Касса и продажи (чаще всего используется)
|
## ПРИОРИТЕТ 1 — Касса и продажи (чаще всего используется)
|
||||||
|
|
@ -84,8 +100,8 @@
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| Влияние на остаток | при проведении продажи −кол-во | POS → `RetailSalesController`/`PosController`, движение `RetailSale` | в целом совпадает | — | — |
|
| Влияние на остаток | при проведении продажи −кол-во | POS → `RetailSalesController`/`PosController`, движение `RetailSale` | в целом совпадает | — | — |
|
||||||
| Себестоимость в продаже | FIFO-слой на момент продажи | `UnitCost=UnitPrice` (цена продажи) в движении, COGS≈`Product.Cost` позже (`DemandsController:270`, `ProfitReportController:14-19`) | 🔴 COGS неточный/задним числом | 🔴 | писать снимок себестоимости в движение |
|
| Себестоимость в продаже | FIFO-слой на момент продажи | `UnitCost=UnitPrice` (цена продажи) в движении, COGS≈`Product.Cost` позже (`DemandsController:270`, `ProfitReportController:14-19`) | 🔴 COGS неточный/задним числом | 🔴 | писать снимок себестоимости в движение |
|
||||||
| Возврат | «на основании» продажи, тот же способ оплаты | `RetailSalesController`/возврат по чеку в кассе | проверить ссылку-основание и способ возврата | 🟡 | хранить ссылку на продажу |
|
| Возврат | «на основании» продажи, тот же способ оплаты | есть ссылка `ReferenceSaleId` (`RetailSalesController.cs:238`); способ возврата выбирает кассир (не форсится как в МойСкладе) | 🟡 способ не привязан к исходному | 🟡 | опц.: по умолчанию тем же способом |
|
||||||
| Смена | автооткрытие первой операцией, ≤24ч | `CashShiftsController`, открытие вручную | 🟡 возможно нет автооткрытия | 🟡 | автооткрывать первой продажей |
|
| Смена | автооткрытие первой операцией, ≤24ч | только ручное открытие (`CashShiftsController` Open/Close; продажа требует открытой смены) | 🟡 нет автооткрытия | 🟡 | автооткрывать первой продажей |
|
||||||
| Деньги | приход в кассу привязан к смене | смена+счёт (есть, чинили ранее) | совпадает | — | — |
|
| Деньги | приход в кассу привязан к смене | смена+счёт (есть, чинили ранее) | совпадает | — | — |
|
||||||
|
|
||||||
### 1.2 Розничная смена (retailshift) и внесение/выплата (drawer cash in/out)
|
### 1.2 Розничная смена (retailshift) и внесение/выплата (drawer cash in/out)
|
||||||
|
|
@ -100,7 +116,7 @@
|
||||||
| Автооткрытие смены | да, первой операцией | вручную (`CashShiftsController`) | 🟡 | 🟡 |
|
| Автооткрытие смены | да, первой операцией | вручную (`CashShiftsController`) | 🟡 | 🟡 |
|
||||||
| Максимум 24ч | да | нет явного ограничения | 🟡 | 🟡 |
|
| Максимум 24ч | да | нет явного ограничения | 🟡 | 🟡 |
|
||||||
| Внесение/выплата | ПКО/РКО внутри смены | внесение/выплата в кассе + `MoneyTransactions` | совпадает по сути | — |
|
| Внесение/выплата | ПКО/РКО внутри смены | внесение/выплата в кассе + `MoneyTransactions` | совпадает по сути | — |
|
||||||
| Z-отчёт смены | нал/безнал, продажи/возвраты, по товарам | есть Z-отчёт (POS) | проверить состав | 🟡 |
|
| Z-отчёт смены | нал/безнал, продажи/возвраты, по товарам | `ShiftReportDto` (`IServerApi.cs:61`): нал/безнал по продажам и возвратам + сверка кассы; **без разбивки по товарам** | 🟡 нет «по товарам» | 🟡 |
|
||||||
|
|
||||||
**Предложение [владельцу]:** автооткрытие смены первой продажей (как МойСклад) + мягкое
|
**Предложение [владельцу]:** автооткрытие смены первой продажей (как МойСклад) + мягкое
|
||||||
предупреждение на 24ч — удобнее кассиру, меньше «забыл открыть смену».
|
предупреждение на 24ч — удобнее кассиру, меньше «забыл открыть смену».
|
||||||
|
|
@ -166,7 +182,7 @@
|
||||||
|
|
||||||
| Аспект | МойСклад | У нас | Расхождение | Серьёзность |
|
| Аспект | МойСклад | У нас | Расхождение | Серьёзность |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Обязательные поля | только наименование | `Product.cs`/`ProductInputValidator` — проверить минимум | возможно совпадает | ⚪ |
|
| Обязательные поля | только наименование | `ProductInput` (`CatalogDtos.cs:92`): обязательны **Name + UnitOfMeasureId + ProductGroupId** | 🟡 у нас больше обязательных | 🟡 |
|
||||||
| Весовой товар | фасовка весовая | `IsWeighed`/packaging есть | совпадает | — |
|
| Весовой товар | фасовка весовая | `IsWeighed`/packaging есть | совпадает | — |
|
||||||
| Штрихкоды | EAN8/13/GTIN, несколько | несколько штрихкодов, весовые префиксы | совпадает/лучше | — |
|
| Штрихкоды | EAN8/13/GTIN, несколько | несколько штрихкодов, весовые префиксы | совпадает/лучше | — |
|
||||||
| Типы цен | несколько, автоподстановка | типы цен есть (`PriceTypesController`) | совпадает | — |
|
| Типы цен | несколько, автоподстановка | типы цен есть (`PriceTypesController`) | совпадает | — |
|
||||||
|
|
@ -187,7 +203,7 @@
|
||||||
| Остаток при проведении | +кол-во | `SuppliesController.Post` → движение Receipt | совпадает | — |
|
| Остаток при проведении | +кол-во | `SuppliesController.Post` → движение Receipt | совпадает | — |
|
||||||
| Себестоимость | FIFO-слой | пересчёт скользящего среднего | 🔴 (метод) | 🔴 |
|
| Себестоимость | FIFO-слой | пересчёт скользящего среднего | 🔴 (метод) | 🔴 |
|
||||||
| На основании заказа | да | заказа поставщику нет в простом режиме | 🟡 (скрыт) | 🟡 |
|
| На основании заказа | да | заказа поставщику нет в простом режиме | 🟡 (скрыт) | 🟡 |
|
||||||
| Долг поставщику | +долг | взаиморасчёты (есть) | проверить | 🟡 |
|
| Долг поставщику | +долг | считается в отчёте долгов (Σ приёмок, `MoneyReportsController.cs:120-183`) | совпадает (расчётно) | — |
|
||||||
|
|
||||||
### 3.2 Оприходование (enter) и Списание (loss)
|
### 3.2 Оприходование (enter) и Списание (loss)
|
||||||
|
|
||||||
|
|
@ -241,7 +257,7 @@
|
||||||
| Аспект | МойСклад | У нас | Расхождение | Серьёзность |
|
| Аспект | МойСклад | У нас | Расхождение | Серьёзность |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| −остаток | да | `SupplierReturnsController` движение `SupplierReturn` | совпадает | — |
|
| −остаток | да | `SupplierReturnsController` движение `SupplierReturn` | совпадает | — |
|
||||||
| −долг поставщику | да | проверить привязку к взаиморасчётам | 🟡 | 🟡 |
|
| −долг поставщику | да | учтён в отчёте долгов (Σ возвратов вычитается, `MoneyReportsController.cs:120-183`) | совпадает (расчётно) | — |
|
||||||
| На основании приёмки | да, преднабор | опционально ссылка (есть поле) | 🟡 довести UI | 🟡 |
|
| На основании приёмки | да, преднабор | опционально ссылка (есть поле) | 🟡 довести UI | 🟡 |
|
||||||
|
|
||||||
### 4.2 Деньги: платежи, ордера, взаиморасчёты, долги
|
### 4.2 Деньги: платежи, ордера, взаиморасчёты, долги
|
||||||
|
|
@ -299,8 +315,8 @@
|
||||||
| Возврат по чеку | да | да | совпадает | — |
|
| Возврат по чеку | да | да | совпадает | — |
|
||||||
| Смена/Z-отчёт | да | да | совпадает | — |
|
| Смена/Z-отчёт | да | да | совпадает | — |
|
||||||
| Сканер камерой | да (смартфон) | сканер-HID/весы по COM | 🟡 (нет камеры) | 🟡 |
|
| Сканер камерой | да (смартфон) | сканер-HID/весы по COM | 🟡 (нет камеры) | 🟡 |
|
||||||
| Фискализация 54-ФЗ/ОФД | да (много моделей ФР) | ОФД РК заявлен — проверить охват устройств | 🟡 | 🟡 |
|
| Фискализация (ОФД РК; у МС — WebKassa/reKassa) | да | **заглушка** `NullFiscalProvider` — не реализовано (`Fiscal.cs`) | 🔴 блокер по закону РК (см. П2.3) | 🔴 |
|
||||||
| Платёжные терминалы (PAX/Verifone) | интеграция | проверить | 🟡 | 🟡 |
|
| Платёжные терминалы (эквайринг) | интеграция (PAX/Verifone) | нет — ручной ввод суммы карты | 🟡 | 🟡 |
|
||||||
|
|
||||||
### 5.3 Мобильное «FM Склад» vs мобильное МойСклад
|
### 5.3 Мобильное «FM Склад» vs мобильное МойСклад
|
||||||
|
|
||||||
|
|
@ -309,7 +325,7 @@
|
||||||
| Функция | МойСклад моб. | FM Склад (iOS) | Расхождение | Серьёзность |
|
| Функция | МойСклад моб. | FM Склад (iOS) | Расхождение | Серьёзность |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Остатки по складу | да | да (`/api/inventory/stock` с groupId) | совпадает | — |
|
| Остатки по складу | да | да (`/api/inventory/stock` с groupId) | совпадает | — |
|
||||||
| Приёмка с телефона | да | проверить охват | 🟡 | 🟡 |
|
| Приёмка с телефона | да | **нет** (нет mobile-эндпоинтов приёмки; только stock/barcodes/me) | 🟡 | 🟡 |
|
||||||
| Инвентаризация с телефона | да | post/unpost есть — переделать под новую модель | 🔴 (после §3.3) | 🔴 |
|
| Инвентаризация с телефона | да | post/unpost есть — переделать под новую модель | 🔴 (после §3.3) | 🔴 |
|
||||||
| Сканирование | да | штрихкоды + весовые | совпадает | — |
|
| Сканирование | да | штрихкоды + весовые | совпадает | — |
|
||||||
|
|
||||||
|
|
@ -338,6 +354,159 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# ПРОХОД 2 — факт-проверки, Казахстан, исправление неточностей прохода 1
|
||||||
|
|
||||||
|
Mac-Claude: проход 1 полезный, но поверхностный. Ниже — все «проверить» закрыты фактом
|
||||||
|
(код `файл:строка` и/или запрос на стенде `test.admin.food-market.kz`), казахстанская
|
||||||
|
специфика и корректировки неточностей.
|
||||||
|
|
||||||
|
## П2.1 Закрытие всех «проверить» (факты)
|
||||||
|
|
||||||
|
| Пункт (проход 1) | Факт (код/стенд) | Вывод |
|
||||||
|
|---|---|---|
|
||||||
|
| Возврат: ссылка-основание | `RetailSalesController.cs:44,90,238-239,296` — возврат несёт `ReferenceSaleId` + `ReferenceSaleNumber` на исходную продажу | ✅ ссылка-основание есть |
|
||||||
|
| Возврат: способ возврата | У возврата своё поле `Payment` (нал/карта); кассир выбирает. МойСклад принудительно тем же способом | 🟡 у нас гибче, но нет гарантии «тем же способом» |
|
||||||
|
| Z-отчёт: состав | `ShiftReportDto` (`IServerApi.cs:61`): sales(cash,card), returns(cash,card), expectedCash, actualCash, cashDifference | ✅ нал/безнал + сверка; ❌ **нет разбивки «по товарам»** (у МойСклада есть) |
|
||||||
|
| Долг поставщику при приёмке | `MoneyReportsController.cs:120-183` — долг = Σ приёмок(Posted) − Σ возвратов − Σ оплат + Σ корректировок | ✅ приёмка увеличивает долг (считается в отчёте) |
|
||||||
|
| −долг при возврате поставщику | тот же расчёт, Σ возвратов вычитается | ✅ возврат уменьшает долг |
|
||||||
|
| Обязательные поля товара | `ProductInput` (`CatalogDtos.cs:92`): `[Required] Name`, `UnitOfMeasureId`, `ProductGroupId` — обязательны | 🟡 **больше, чем у МойСклада** (там только наименование; ед. и группа — нет) |
|
||||||
|
| Приёмка с телефона | мобильных endpoint’ов приёмки нет (`docs/mobile-api.md` — только stock/barcodes/me) | ❌ приёмки с телефона нет (у МойСклада есть) |
|
||||||
|
| Платёжные терминалы | интеграций PAX/Verifone нет; «карта» — ручной способ оплаты в кассе | ❌ нет интеграции терминала |
|
||||||
|
| Фискализация | `Fiscal.cs` — `IFiscalProvider` + `NullFiscalProvider` (заглушка, чек без фискального номера) | ❌ фискализации нет (см. §П2.3) |
|
||||||
|
| «Нет единообразной отмены проведения» (утв. прохода 1) | **НЕВЕРНО.** Unpost есть у ВСЕХ: Supplies:518, Enters:284, Losses:313, Inventories:525, SupplierReturns:327, Transfers:324, Demands:290, RetailSales:828 | ✅ отмена проведения единообразна — **исправляю проход 1** |
|
||||||
|
| Розничная смена: автооткрытие | `CashShiftsController` Open/Close; продажа требует открытой смены; автооткрытия нет | 🟡 только ручное |
|
||||||
|
|
||||||
|
## П2.2 Себестоимость — факт-проверка и реальный пример Демо-магазина
|
||||||
|
|
||||||
|
**«У МойСклада FIFO» — подтверждено их справкой:** «В МоёмСкладе себестоимость считается по
|
||||||
|
принципу FIFO… при продаже в первую очередь списывается товар из самой ранней приемки»
|
||||||
|
([школа торговли, методы расчёта себестоимости](https://www.moysklad.ru/poleznoe/shkola-torgovli/metody-rascheta-sebestoimosti/);
|
||||||
|
[support 217544337](https://support.moysklad.ru/hc/ru/articles/217544337)).
|
||||||
|
|
||||||
|
**«В движение продажи пишется UnitCost = цена продажи» — проверено по коду:** да, причём **и в
|
||||||
|
опте, и в рознице/кассе**:
|
||||||
|
- опт: `DemandsController.cs:270,307` — `UnitCost: line.UnitPrice`;
|
||||||
|
- розница/касса: `RetailSalesController.cs:680,858` (RetailSale) и `:986,1039` (CustomerReturn) — `UnitCost: line.UnitPrice`.
|
||||||
|
|
||||||
|
НО: `StockMovement.UnitCost` при продаже = **цена продажи** и для прибыли **не используется** —
|
||||||
|
`ProfitReportController.cs:116-118` берёт COGS = `Quantity × Product.Cost` (текущее скользящее
|
||||||
|
среднее). То есть поле `UnitCost` в движении продажи бесполезно/вводит в заблуждение, а реальная
|
||||||
|
себестоимость в отчёте — **текущая средняя на момент построения отчёта**, а не на момент продажи.
|
||||||
|
|
||||||
|
**Реальный пример со стенда (Демо/импорт-каталог, запрос `/api/reports/profit`):**
|
||||||
|
- Товар «BIOBLAS шампунь д/волос 360мл»: текущая `Product.Cost` = **548.6441 ₸** (дробная →
|
||||||
|
смешана из 3 приёмок с разными ценами; `supplies total = 3`).
|
||||||
|
- Профит-отчёт по нему: выручка 3100, **себест 1097.2882** (= 2 × 548.6441), прибыль 2002.7118.
|
||||||
|
|
||||||
|
**В чём искажение:** 548.6441 — средняя **после всех 3 приёмок**. Если эти 2 единицы были проданы
|
||||||
|
**до** третьей (более дорогой/дешёвой) приёмки, FIFO отнёс бы на них цену ранней партии, а не
|
||||||
|
текущую среднюю. Поэтому:
|
||||||
|
1. показанная прибыль по прошлым продажам **не историческая** (считается ценой, которой на момент
|
||||||
|
продажи ещё не было);
|
||||||
|
2. при каждой новой приёмке того же товара средняя меняется → **прибыль за закрытые периоды
|
||||||
|
«плывёт» задним числом**.
|
||||||
|
Величина искажения = (текущая средняя − фактическая FIFO-цена партии) × проданное количество; на
|
||||||
|
товарах с разбросом закупочных цен (как BIOBLAS: 3 цены) она ненулевая и накапливается. На товарах
|
||||||
|
с единственной ценой закупки искажения нет. Точное число «насколько» получить от работающей системы
|
||||||
|
нельзя — FIFO у нас не реализован; это и есть аргумент за реализацию (или за осознанный выбор средней).
|
||||||
|
|
||||||
|
## П2.3 Касса и фискализация — Казахстан, а не 54-ФЗ
|
||||||
|
|
||||||
|
**Поправка:** в проходе 1 стоял «54-ФЗ» — это закон **РФ**. Мы в Казахстане; применяется закон РК.
|
||||||
|
|
||||||
|
**Как МойСклад работает в Казахстане:** есть отдельный **moysklad.kz** с интеграциями ОФД/ККМ РК.
|
||||||
|
Касса МойСклад встраивает облачную фискализацию: **WebKassa** (данные чека автоматически уходят в
|
||||||
|
WebKassa → ОФД) и **reKassa** (бесплатная облачная онлайн-ККМ РК, фискализация и электронные чеки);
|
||||||
|
упоминается Kassa24. С **1 апреля 2026** — переход на новый протокол ККМ **v2.0.3** для передачи в ОФД.
|
||||||
|
([МойСклад: интеграции для Казахстана](https://www.moysklad.ru/integratsii/dlya-kazakhstana/),
|
||||||
|
[WebKassa](https://www.moysklad.ru/integratsii/apps/webkkm-smartinnovations/),
|
||||||
|
[reKassa](https://www.moysklad.ru/integratsii/apps/rekassa-smartinnovations/),
|
||||||
|
[новый протокол ККМ](https://www.moysklad.kz/news/noviy-protokol-kkm/),
|
||||||
|
[онлайн-касса в РК 2026](https://www.moysklad.kz/poleznoe/shkola-torgovli/online-kassa-v-kazakhstane/)).
|
||||||
|
|
||||||
|
**Что требуется по закону РК для розничной кассы:** онлайн-ККМ с передачей данных в ОФД (фискальный
|
||||||
|
чек, QR). Без этого легально пробивать чеки нельзя.
|
||||||
|
|
||||||
|
**Наш статус:** `NullFiscalProvider` — фискализации нет, чек проходит без фискального номера
|
||||||
|
(`Fiscal.cs:5-15`, см. `docs/pos.md` «Фискализация»). 🔴 **блокер для легальной розницы РК.**
|
||||||
|
|
||||||
|
**Что умеет «Касса МойСклад» из реально нужного кассиру — и что у нас:**
|
||||||
|
|
||||||
|
| Функция кассира | Касса МойСклад | Наша касса (Avalonia) | Факт у нас |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Скидки на позицию/чек | да | да (скидка на строку) | `SaleView`/`PaymentView` |
|
||||||
|
| Бонусы/лояльность | да | сервер есть (`LoyaltyCards/Programs`), в кассе — не подключено | 🟡 нет в кассе |
|
||||||
|
| Отложенные чеки (парковка) | да | да («Отложить»/«Отложенные») | `ParkCommand/ResumeCommand` |
|
||||||
|
| Поиск товара | да | да (поиск + сканер + весовые ШК) | `ScanCommand` |
|
||||||
|
| Весы | да | да (COM/serial) | `Hardware` |
|
||||||
|
| Печать чека | да | да (ESC/POS) | `Printing.cs` |
|
||||||
|
| Смешанная оплата | да | да (нал+карта) | `PaymentView` |
|
||||||
|
| Фискализация ОФД | да (WebKassa/reKassa) | ❌ заглушка | 🔴 |
|
||||||
|
| Сканер камерой смартфона | да | ❌ (внешний сканер/COM) | 🟡 |
|
||||||
|
| Платёжный терминал (эквайринг) | да | ❌ ручной ввод суммы карты | 🟡 |
|
||||||
|
|
||||||
|
**Вывод:** по функциям для кассира мы покрываем почти всё (скидки, отложенные, поиск, весы, печать,
|
||||||
|
смешанная оплата). Критичные пробелы — **фискализация ОФД РК** (🔴 закон) и **бонусы в кассе** (🟡),
|
||||||
|
плюс эквайринг-терминал и камера-сканер (🟡).
|
||||||
|
|
||||||
|
## П2.4 Казахстанская специфика по закону (ЭСФ/СНТ, маркировка, НДС, акциз)
|
||||||
|
|
||||||
|
Этого в проходе 1 не было вовсе. Для РК — высокая важность.
|
||||||
|
|
||||||
|
### НДС
|
||||||
|
С **01.01.2026** базовая ставка НДС в РК — **16 %** (повышена с 12 %, Налоговый кодекс №214-VIII);
|
||||||
|
льготная **5 %** на лекарства/медизделия; порог постановки на учёт — 10 000 МРП. Переход: оборот до
|
||||||
|
31.12.2025 — 12 %, с 01.01.2026 — 16 %.
|
||||||
|
([НДС 16% 2026](https://finproverka.kz/blog/nds-v-kazahstane-v-2026-godu-novaya-stavka-16-snizhennyj-porog-i-obnovlyonnye-pravila-registraczii/),
|
||||||
|
[ставки НДС и ККМ](https://promo.webkassa.kz/tpost/00bbm0fsr1-stavki-nds-s-2026-goda-chto-vazhno-uches)).
|
||||||
|
**У нас:** дефолт НДС для KZ = **16 %** (`SystemReferenceSeeder.cs:38` — `new("KZ","Казахстан","KZT",16m)`),
|
||||||
|
`Product.Vat` берётся из `Country.VatRate` при создании товара. То есть ставка **актуальна**.
|
||||||
|
Единственный нюанс — нет переходной логики «12 % до 31.12.2025 / 16 % после» по дате оборота
|
||||||
|
(для магазина, работающего в 2026, несущественно). **У МойСклада** ставка НДС на товаре/в документе — есть.
|
||||||
|
|
||||||
|
### Маркировка (ИС МПТ)
|
||||||
|
Обязательная маркировка в РК: **табак/сигареты** и жидкости для вейпов, **обувь** (с 01.11.2021),
|
||||||
|
**лекарства** (с 01.07.2024), **пиво** (кеги/бутылки с 01.02.2026, банки с 01.01.2027), **одежда/лёгкая
|
||||||
|
промышленность** и **моторные масла** (поэтапно 2026–2027). Розница при продаже маркированного товара
|
||||||
|
обязана **сканировать код и вывести его из оборота** (передать в ИС МПТ).
|
||||||
|
([маркировка в РК 2026](https://birsan.kz/blog/tpost/fetidpm511-markirovka-tovarov-v-kazahstane-s-2026-g),
|
||||||
|
[перечень товаров](https://adilet.zan.kz/rus/docs/P2000000568)).
|
||||||
|
**У МойСклада** — есть работа с маркировкой (создание карточек маркированного товара, вывод из оборота).
|
||||||
|
**У нас** — только флаг `Product.IsMarked` (`CatalogDtos.cs:92`), **вывода из оборота нет**. 🔴 если
|
||||||
|
магазин продаёт табак/обувь/лекарства.
|
||||||
|
|
||||||
|
### СНТ и ЭСФ
|
||||||
|
**СНТ** (сопроводительная накладная на товары) оформляется электронно в системе **ЭСФ**
|
||||||
|
(esf.gov.kz). Для розницы обязательна только по узкому перечню (~3 категории); в рознице процедуры
|
||||||
|
по СНТ в основном **автоматические без участия розничного продавца**; **обязательное подтверждение —
|
||||||
|
только по подакцизным товарам**; добровольно — до 10 числа следующего месяца.
|
||||||
|
([СНТ: Әділет](https://adilet.zan.kz/rus/docs/V2500037317),
|
||||||
|
[КГД: СНТ](https://www.gov.kz/memleket/entities/kgd/press/news/details/593973?lang=ru),
|
||||||
|
[правила СНТ 2026](https://pro1c.kz/articles/snt/pravila-snt/)).
|
||||||
|
**У нас** интеграции с ИС ЭСФ нет. Для маленького магазина без подакцизных — не блокер (авто); при
|
||||||
|
продаже подакцизных (табак/алкоголь) понадобится подтверждение СНТ. **У МойСклада KZ** интеграция с
|
||||||
|
ЭСФ/СНТ есть.
|
||||||
|
|
||||||
|
### Акциз/подакцизные
|
||||||
|
Табак, алкоголь — подакцизные; по ним обязательно подтверждение СНТ и (для табака/пива) маркировка.
|
||||||
|
**У нас** отметки «подакцизный товар» нет. 🟡
|
||||||
|
|
||||||
|
**Что малому магазину нужно в первую очередь:** (1) фискализация ОФД (K1 — иначе нельзя пробивать
|
||||||
|
чеки); (2) маркировка, если торгует сигаретами (K3); (3) корректная ставка НДС 16 % в чеке (K2).
|
||||||
|
СНТ/ЭСФ и акциз — по мере появления подакцизных категорий.
|
||||||
|
|
||||||
|
## П2.5 Исправления неточностей прохода 1
|
||||||
|
|
||||||
|
| Утверждение прохода 1 | На самом деле |
|
||||||
|
|---|---|
|
||||||
|
| «Нет единообразной отмены проведения» (топ-15 №5) | **Есть** у всех документов (unpost-эндпоинты, см. П2.1) — заменил пункт на «Фискализация РК» |
|
||||||
|
| «Взаиморасчёты — не сквозной реестр» (топ-15 №13) | Долги **считаются** из документов (приёмки−возвраты−оплаты+корректировки, `MoneyReportsController:120-183`); это близко к МойСкладу. Понизил до средней/UX; пункт топ-15 заменил на «Маркировка РК» |
|
||||||
|
| «54-ФЗ» в разделе кассы | Это закон РФ; у нас РК — см. П2.3 (ОФД РК, WebKassa/reKassa) |
|
||||||
|
| «Долг поставщику при приёмке / −долг при возврате — проверить» | Подтверждено: оба учитываются в отчёте долгов |
|
||||||
|
| «НДС 12%» (из задания) | С 01.01.2026 в РК — **16 %** (5 % лекарства); у нас ставка из `Country.VatRate` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Итоговая оценка объёма исправлений
|
## Итоговая оценка объёма исправлений
|
||||||
|
|
||||||
- **Инвентаризация** (§3.3) — средний, уже в очереди (`wip/inventory-model`), план совпал с ревизией.
|
- **Инвентаризация** (§3.3) — средний, уже в очереди (`wip/inventory-model`), план совпал с ревизией.
|
||||||
|
|
@ -346,8 +515,12 @@
|
||||||
рассмотреть компромисс «среднее по умолчанию, FIFO — опция» [НА РЕШЕНИЕ ВЛАДЕЛЬЦА].
|
рассмотреть компромисс «среднее по умолчанию, FIFO — опция» [НА РЕШЕНИЕ ВЛАДЕЛЬЦА].
|
||||||
- **Связи «на основании» + статусы + отмена проведения** (§1,3,4) — средний, сквозная унификация.
|
- **Связи «на основании» + статусы + отмена проведения** (§1,3,4) — средний, сквозная унификация.
|
||||||
- **Деньги/взаиморасчёты единый реестр** (§4.2) — средний, можно сделать проще МойСклада осознанно.
|
- **Деньги/взаиморасчёты единый реестр** (§4.2) — средний, можно сделать проще МойСклада осознанно.
|
||||||
- **Касса/мобильное** (§5.2–5.3) — точечные дополнения (камера-сканер, терминалы, фискализация),
|
- **Касса/мобильное** (§5.2–5.3) — точечные дополнения (камера-сканер, терминалы),
|
||||||
средняя серьёзность, не блокеры.
|
средняя серьёзность.
|
||||||
|
- **🇰🇿 Казахстан по закону** (K1–K5, §П2.3–П2.4): **фискализация ОФД РК** (K1) — 🔴 блокер,
|
||||||
|
интеграция Webkassa/reKassa (средний–большой); **маркировка ИС МПТ** (K3) — большой, если
|
||||||
|
торгует табак/обувь/лекарствами; **НДС 16%** (K2) — малый (проверить дефолт/дату оборота);
|
||||||
|
**СНТ/ЭСФ** (K4) и **акциз** (K5) — средний, по подакцизным категориям.
|
||||||
|
|
||||||
## Источники (MoySklad)
|
## Источники (MoySklad)
|
||||||
- Себестоимость/методы: moysklad.ru/poleznoe/shkola-torgovli/metody-rascheta-sebestoimosti; support 217544337
|
- Себестоимость/методы: moysklad.ru/poleznoe/shkola-torgovli/metody-rascheta-sebestoimosti; support 217544337
|
||||||
|
|
@ -359,3 +532,13 @@
|
||||||
- Карточка товара: support (товары и склады/.../создание_карточки_товара); Типы цен: support 203053526
|
- Карточка товара: support (товары и склады/.../создание_карточки_товара); Типы цен: support 203053526
|
||||||
- Касса МойСклад: moysklad.ru/reshenija/mobilnaya-kassa; programmy-dlja-biznesa/arm-kassira
|
- Касса МойСклад: moysklad.ru/reshenija/mobilnaya-kassa; programmy-dlja-biznesa/arm-kassira
|
||||||
- API: dev.moysklad.ru/doc/api/remap/1.2 (#/documents/inventory, /enter, /loss)
|
- API: dev.moysklad.ru/doc/api/remap/1.2 (#/documents/inventory, /enter, /loss)
|
||||||
|
|
||||||
|
## Источники (Проход 2 — Казахстан)
|
||||||
|
- МойСклад KZ: moysklad.kz · интеграции РК: moysklad.ru/integratsii/dlya-kazakhstana
|
||||||
|
- WebKassa: moysklad.ru/integratsii/apps/webkkm-smartinnovations; online-webkassa.kz · reKassa: moysklad.ru/integratsii/apps/rekassa-smartinnovations; rekassa.kz
|
||||||
|
- Новый протокол ККМ (01.04.2026): moysklad.kz/news/noviy-protokol-kkm · онлайн-касса РК: moysklad.kz/poleznoe/shkola-torgovli/online-kassa-v-kazakhstane
|
||||||
|
- НДС 16% (01.01.2026): finproverka.kz/blog/nds-v-kazahstane-v-2026-godu…; promo.webkassa.kz/…stavki-nds-s-2026-goda
|
||||||
|
- СНТ/ЭСФ: adilet.zan.kz/rus/docs/V2500037317; gov.kz/…/kgd/…/593973; pro1c.kz/articles/snt/pravila-snt
|
||||||
|
- Маркировка РК: birsan.kz/…markirovka-tovarov-v-kazahstane-s-2026; adilet.zan.kz/rus/docs/P2000000568
|
||||||
|
- Код (наш): RetailSalesController:680/858/986/1039 · DemandsController:270 · ProfitReportController:116-118 · MoneyReportsController:120-183 · CatalogDtos.cs:92 · Fiscal.cs · IServerApi.cs:61 · unpost: Supplies:518/Enters:284/Losses:313/Inventories:525/SupplierReturns:327/Transfers:324/Demands:290/RetailSales:828
|
||||||
|
- Стенд: /api/reports/profit (Демо) — BIOBLAS шампунь Product.Cost=548.6441, 3 приёмки
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue