Skip to content

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

Open
Ibochkarev wants to merge 2 commits into
betafrom
feat/issue-366-unify-order-cost-engine
Open

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

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

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

  • OrderCostEngine — delivery (weight, free threshold, price/%), payment surcharge, commission base cart + delivery, composeBreakdown() через OrderService::clampComputedTotal
  • Web adapter (OrderCostCalculator) — MODX cost events; payment fee считается от cart+delivery ([Bug] Комиссия оплаты %: storefront считает от cart, manager — от cart+delivery #372); getTotalCost передаёт уже посчитанные cart/delivery в 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 + delivery (как в manager), раньше web брал только cart. Осознанное выравнивание (#372). Округление/clamp без изменений.

Связанные Issues

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

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

cd core/components/minishop3
composer ci:php
# exit 0 — php -l (378 files) + 19 smoke tests

OrderCostEngineTest.php: commission base, #372 (1000+500 → 3% = 45), wiring grep, single-pass getTotalCost.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php)
  • Тестирование на разных версиях 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: runtime unit-тесты delivery formulas без MODX stub; 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
Extract OrderCostEngine for shared delivery/payment math, align web
payment commission base with manager (cart + delivery), and register
manager recalculator in DI.
@Ibochkarev
Ibochkarev force-pushed the feat/issue-366-unify-order-cost-engine branch from 4d3e2dd to c03e18d Compare July 29, 2026 11:31
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
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

1 participant