[598-51] Членский взнос в сумме заказа + чистка TS-ошибок Стола заказов #156

Merged
ant merged 3 commits from fix/598-51-membership-fee-and-type-cleanup into marketplace2 2026-07-21 08:53:46 +00:00
Owner

Что сделано

Членский взнос в сумме заказа. Заказчик на карточке предложения и на странице деталей видел себестоимость без взноса — вместо 1300 ₽ (как в каталоге) показывалось 1000 ₽. Причина: на контракте total_cost и membership_fee — раздельные поля (сам контракт складывает их только как одноразовую локальную переменную для проверки баланса, никуда не сохраняя сумму). Backend теперь зеркалит membership_fee из блокчейна через delta-mapper и отдаёт готовое вычисляемое поле total_cost_with_fee в DTO заказа — фронту не нужно ничего складывать самому.

  • Заказчик (MyOrders, OrdererOrderDetail, OrdererConsolidated, OrderCard) — видит цену с взносом.
  • Поставщик (OffererIncomingOrders, SupplyPartyCard) — видит свою себестоимость + отдельную строку-подсказку со взносом пайщика.
  • Реестр заказов администратора — сумма с взносом (реально списанное).

Строгая типизация sync-пути. При добавлении membership_fee починил ровно то место, где раньше терялись on-chain-поля при синке (persistDomain в repository adapter принимал QueryDeepPartialEntity без проверки компилятором) — теперь именованный Pick-тип форсирует добавлять новые on-chain-поля в explicit update.

Корневая причина ~35 ошибок компиляции desktop. @Field(() => ID) в 5 marketplace DTO (apl-reception, inventory, outgoing-payment, shipment, stock) давал на фронте тип unknown вместо string — у Zeus-кодогена нет scalar-маппинга для ID. Заменил на @Field(() => String), как уже сделано в 42+ других полях кодовой базы.

Реальный баг, не просто типы. StockRestockPanel.vue (докладка у стойки выдачи) звал createStockProposal напрямую, пропуская обязательный этап — оператор должен сначала получить order_hash + акт через getStockIssuancePayloads и подписать его локально. В рантайме это падало бы на валидации бэка. Реализовал двухфазный флоу по образцу IssueActOpenDialog.vue.

Тесты после PR #152 (whitelist → реестр поставщиков). 7 файлов не компилировались — конструкторы сервисов набрали новые обязательные параметры, моки не обновили. Добавил новый marketplace-supplier-registry.service.spec.ts взамен удалённого теста несуществующего MarketplaceWhitelistService.

Плюс UI-полировка стола поставщика (текст онбординга, реальные контакты кооператива вместо "обратитесь в поддержку", ФИО/наименование в реестре поставщиков и на пунктах выдачи вместо голого username, разные иконки в меню администратора) и точечные фиксы (YANDEX_MAPS_API_KEY отсутствовал в 3 из 4 мест сборки конфига, мёртвая ссылка на удалённый boot/map.ts, опечатка copyFullHashcopyText).

Проверено

  • tsc --noEmit в controller — 0 ошибок
  • vue-tsc --noEmit в desktop — 0 ошибок
  • generate-schemagenerate-clientsdk build — пройден дважды (после каждого schema-affecting изменения)

Задача: 598-51

## Что сделано **Членский взнос в сумме заказа.** Заказчик на карточке предложения и на странице деталей видел себестоимость без взноса — вместо `1300 ₽` (как в каталоге) показывалось `1000 ₽`. Причина: на контракте `total_cost` и `membership_fee` — раздельные поля (сам контракт складывает их только как одноразовую локальную переменную для проверки баланса, никуда не сохраняя сумму). Backend теперь зеркалит `membership_fee` из блокчейна через delta-mapper и отдаёт готовое вычисляемое поле `total_cost_with_fee` в DTO заказа — фронту не нужно ничего складывать самому. - Заказчик (`MyOrders`, `OrdererOrderDetail`, `OrdererConsolidated`, `OrderCard`) — видит цену с взносом. - Поставщик (`OffererIncomingOrders`, `SupplyPartyCard`) — видит свою себестоимость + отдельную строку-подсказку со взносом пайщика. - Реестр заказов администратора — сумма с взносом (реально списанное). **Строгая типизация sync-пути.** При добавлении `membership_fee` починил ровно то место, где раньше терялись on-chain-поля при синке (`persistDomain` в repository adapter принимал `QueryDeepPartialEntity` без проверки компилятором) — теперь именованный `Pick`-тип форсирует добавлять новые on-chain-поля в explicit update. **Корневая причина ~35 ошибок компиляции desktop.** `@Field(() => ID)` в 5 marketplace DTO (apl-reception, inventory, outgoing-payment, shipment, stock) давал на фронте тип `unknown` вместо `string` — у Zeus-кодогена нет scalar-маппинга для `ID`. Заменил на `@Field(() => String)`, как уже сделано в 42+ других полях кодовой базы. **Реальный баг, не просто типы.** `StockRestockPanel.vue` (докладка у стойки выдачи) звал `createStockProposal` напрямую, пропуская обязательный этап — оператор должен сначала получить `order_hash` + акт через `getStockIssuancePayloads` и подписать его локально. В рантайме это падало бы на валидации бэка. Реализовал двухфазный флоу по образцу `IssueActOpenDialog.vue`. **Тесты после PR #152 (whitelist → реестр поставщиков).** 7 файлов не компилировались — конструкторы сервисов набрали новые обязательные параметры, моки не обновили. Добавил новый `marketplace-supplier-registry.service.spec.ts` взамен удалённого теста несуществующего `MarketplaceWhitelistService`. **Плюс UI-полировка стола поставщика** (текст онбординга, реальные контакты кооператива вместо "обратитесь в поддержку", ФИО/наименование в реестре поставщиков и на пунктах выдачи вместо голого username, разные иконки в меню администратора) и точечные фиксы (`YANDEX_MAPS_API_KEY` отсутствовал в 3 из 4 мест сборки конфига, мёртвая ссылка на удалённый `boot/map.ts`, опечатка `copyFullHash`→`copyText`). ## Проверено - `tsc --noEmit` в `controller` — 0 ошибок - `vue-tsc --noEmit` в `desktop` — 0 ошибок - `generate-schema` → `generate-client` → `sdk build` — пройден дважды (после каждого schema-affecting изменения) Задача: 598-51
claude added 3 commits 2026-07-21 08:45:55 +00:00
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ant approved these changes 2026-07-21 08:53:33 +00:00
ant merged commit bd174634fc into marketplace2 2026-07-21 08:53:46 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#156