Skip to content

Унификация расчёта стоимости заказа: checkout ↔ manager - #476

Merged
biz87 merged 3 commits into
betafrom
feat/issue-366-unify-order-cost-engine
Aug 10, 2026
Merged

Унификация расчёта стоимости заказа: checkout ↔ manager#476
biz87 merged 3 commits into
betafrom
feat/issue-366-unify-order-cost-engine

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Jul 29, 2026

Copy link
Copy Markdown
Member

Описание

Общий слой формул стоимости заказа для витрины и менеджера вместо дублирования в OrderCostCalculator, ManagerOrderCostRecalculator, Delivery и Payment.

  • OrderCostEngine — delivery (weight, free threshold, price/%), payment surcharge, paymentCommissionBase() делегирует в OrderService::paymentCommissionBase() (cart-only, fix(order): единая база для процентной комиссии оплаты (cart-only) #460), composeBreakdown() через OrderService::clampComputedTotal
  • Web adapter (OrderCostCalculator) — MODX cost events; payment fee от cart-only; getTotalCost передаёт уже посчитанный cart в getPaymentCost (один проход pipeline)
  • Manager adapter (ManagerOrderCostRecalculator) — modes/warnings/log; default handlers делегируют в engine
  • DI: ms3_manager_order_cost_recalculator в ServiceRegistry, OrdersController берёт сервис из контейнера

Closes #366

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Поведение storefront: %-комиссия оплаты — cart-only (MS2-паритет, #460). Rebase на beta после #460. Округление/clamp без изменений.

Связанные Issues

Closes #366
Refs #372, #373, #338, #363, #361, #460

Как это было протестировано?

cd core/components/minishop3
composer ci:php   # exit 0 — php -l + 37 smoke + 109 PHPUnit
composer stan     # exit 0

OrderCostEngineTest.php: cart-only commission base, delivery free-threshold/percent edge cases, wiring grep, single-pass getTotalCost.
PaymentCommissionBaseTest.php: cart-only guards (#460).

  • Ручное тестирование
  • Автоматические тесты (composer ci:php, composer stan)
  • Тестирование на разных версиях PHP/MODX

Чеклист

  • Код соответствует стилю проекта
  • Комментарии в class docblocks (web vs mgr events)
  • Изменения согласованы между checkout и manager для default handlers
  • Лексиконы — не требуется
  • CHANGELOG — при релизе

Дополнительные заметки

Events (документировано в docblocks):

  • Web: msOnBefore/GetCartCost, DeliveryCost, PaymentCost, OrderCost
  • Manager recalc: событий cost нет; mgr-only modes (auto / manual / force_provider) и warnings

Deferred: OrderFinalizeService payment fee (#373) — отдельный issue; полный runtime integration smoke с mock modX.

@Ibochkarev
Ibochkarev requested a review from biz87 July 29, 2026 03:40
@Ibochkarev Ibochkarev added enhancement New feature or request priority: medium Средний приоритет tech-debt Maintainability / refactor / architecture debt labels Jul 29, 2026
@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch 2 times, most recently from f1eba56 to 31bd029 Compare August 2, 2026 02:33
@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch 3 times, most recently from f5eece4 to 1fa8ded Compare August 7, 2026 18:44
@biz87

biz87 commented Aug 9, 2026

Copy link
Copy Markdown
Member

Обновление по базе процентной комиссии оплаты (после разбора #372 на живом примере).

Принято решение: база комиссии оплаты — cart-only (MS2-паритет), НЕ cart + delivery.

Почему (на примере: корзина 10 000, доставка +2 000, оплата +4 %):

  • «сейчас» витрина считает % от корзины (400), менеджер «Пересчитать» — от корзины+доставки (480), а finalize вообще сохраняет заказ с комиссией 0три разных итога за один заказ (12 400 / 12 000 / 12 480);
  • cart-only даёт одинаковый итог на всех этапах (checkout = запись в БД = пересчёт менеджера) и не даёт скидке/промо на доставку «протекать» в банковскую комиссию (кейс с отрицательной доставкой это обнажает).

Зафиксировано в #460 (уже merged в beta): OrderService::paymentCommissionBase($cartCost) = cart-only; OrderCostCalculator (storefront) и ManagerOrderCostRecalculator приведены к нему.

Про этот PR (#476). Архитектурно он нам нужен — OrderCostEngine убирает дублирование формул в 4 местах (OrderCostCalculator / ManagerOrderCostRecalculator / Delivery / Payment), это хотим сохранить и влить как канонический унификатор. Но сейчас движок «зашит» на базу cart + delivery, что теперь противоречит beta (#460) и сдвинет клиентскую цену на витрине.

Просьба:

  1. Свести OrderCostEngine на базу комиссии cart-only — переиспользовать OrderService::paymentCommissionBase() из fix(order): единая база для процентной комиссии оплаты (cart-only) #460 вместо cart + delivery.
  2. Ребейз на текущий beta (там уже fix(order): единая база для процентной комиссии оплаты (cart-only) #460 + весь auth-кластер).
  3. После этого Унификация расчёта стоимости заказа: checkout ↔ manager #476 можно влить как канон, заменив точечные правки (fix(order): единая база для процентной комиссии оплаты (cart-only) #460 — по базе, fix(order): align finalize cost with ManagerOrderCostRecalculator #448 — finalize уже подтянется через делегирование).
  4. Прогнать composer stan + composer ci:php после ребейза.

Мы не закрываем #476 — откладываем до сведения на cart-only. Спасибо!

@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch from 1fa8ded to 17e627c Compare August 9, 2026 09:38
@Ibochkarev

Copy link
Copy Markdown
Member Author

@biz87 готово по комментарию:

Описание PR обновлено. Можно смотреть повторно.

@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch from 17e627c to 7e918ce Compare August 9, 2026 10:51
@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch 2 times, most recently from 22c7395 to 741a4fd Compare August 10, 2026 01:59
Extract OrderCostEngine for shared delivery/payment math, align web
payment commission base with manager (cart + delivery), and register
manager recalculator in DI.
Add unit tests in OrderCostEngineTest for the math edge cases called out
in #366 review:

- Delivery free-threshold: cart at/above free_delivery_amount → 0; just
  below → weight_price × weight + price; free_delivery_amount = 0 disables it
- Percent delivery price applied to cart
- Payment percent surcharge base = cart + delivery (#372): 3% of 1500 = 45,
  total 1545; fixed and empty-price surcharges
…460)

OrderCostEngine delegates to OrderService::paymentCommissionBase(); update
OrderCostEngineTest and PaymentCommissionBaseTest for MS2 cart-only parity
after rebase on beta.
@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch from cbaf520 to 645b822 Compare August 10, 2026 11:46
@biz87
biz87 merged commit 66730e5 into beta Aug 10, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority: medium Средний приоритет tech-debt Maintainability / refactor / architecture debt

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Унифицировать cost: checkout calculator ↔ manager recalculator

2 participants