Skip to content

fix(order): align finalize cost with ManagerOrderCostRecalculator#448

Open
Ibochkarev wants to merge 4 commits into
betafrom
fix/issue-373-finalize-order-cost
Open

fix(order): align finalize cost with ManagerOrderCostRecalculator#448
Ibochkarev wants to merge 4 commits into
betafrom
fix/issue-373-finalize-order-cost

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Jul 24, 2026

Copy link
Copy Markdown
Member

Описание

При finalize черновика стоимость считалась упрощённо (delivery.price + вес × weight_price, комиссия оплаты всегда 0). Теперь OrderFinalizeService::calculateCosts() делегирует в ManagerOrderCostRecalculator::calculateBreakdown() — те же правила, что у «Пересчитать стоимость» (#212): free_delivery_amount, % доставки через PriceAdjustment, комиссия оплаты (база cart + delivery).

Коммиты (4)

  1. fix(order): align finalize costcalculateBreakdown() из recalculate(), wiring в finalize
  2. refactor(order): OrderPersistedCostRules — pure-формулы default delivery/payment, общий слой для recalculator и тестов
  3. fix(order): block finalize on warnings — при delivery_manual_required / payment_manual_required finalize возвращает error, не переводит заказ в «Новый»; Vue показывает подсказки пересчёта
  4. test(order): calculateBreakdown smoke — xPDO/modX stubs + интеграционные кейсы production-класса

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

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

Связанные Issues

Closes #373

Follow-up (вне scope PR): #449OrdersController::recalculateOrderTotals() без payment fee в preview черновика

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

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

cd ../../../vueManager && npx eslint src/components/OrderView.vue
# exit 0

ManagerOrderCostRecalculatorRulesTest:

  • OrderPersistedCostRules — free delivery, percent delivery, payment на базе cart+delivery

  • ManagerOrderCostRecalculator::calculateBreakdown() через stubs — integrated total (1102.1), warning для custom delivery

  • Ручное тестирование — рекомендуется: draft с free_delivery_amount / оплатой с %; finalize vs recalculate-cost; custom delivery → error + hints в UI

  • Автоматические тесты (composer ci:php, ESLint на OrderView.vue)

  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: branch fix/issue-373-finalize-order-cost
  • MODX: n/a (smoke без полного MODX)
  • PHP: локальный Herd

Скриншоты (если применимо)

До После
n/a n/a

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах (docblock recalculator, OrderPersistedCostRules)
  • Изменения не ломают существующую функциональность (default handlers; custom — блок finalize вместо silent wrong total)
  • Лексиконы добавлены на двух языках (ru/en) — ms3_order_finalize_cost_recalc_required
  • PHPStan проходит без новых ошибок (локально; в CI пока нет)
  • ESLint проходит без ошибок (OrderView.vue)
  • Обновлён CHANGELOG.md — по политике проекта, только при релизе

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

  • Warnings: WARN в лог + HTTP error ms3_order_finalize_cost_recalc_required с errors.warnings; Vue заполняет costRecalcWarnings и показывает hints (order_cost_recalc_*_hint).
  • $order->save() после записи cost — с проверкой результата.
  • База комиссии оплаты в manager path: cart + delivery (как в ManagerOrderCostRecalculator); web checkout (OrderCostCalculator) может отличаться — отдельная тема.
  • Preview при add/update товара (recalculateOrderTotals) — не менялся; см. [Bug] OrdersController::recalculateOrderTotals без payment fee в preview черновика #449.

Extract calculateBreakdown() from manager recalculate and use it when
finalizing draft orders so free_delivery_amount, percent delivery, and
payment commission match the recalculate-cost path.

Closes #373
Move default delivery/payment formulas to a pure helper used by
ManagerOrderCostRecalculator and smoke tests. Clarify recalculator
docblock for manager recalculate and draft finalize paths.
Return error from calculateCosts when ManagerOrderCostRecalculator
reports degraded AUTO breakdown so draft orders are not finalized
with potentially wrong totals. Surface warnings in Vue with recalc hints.
Add xPDO/modX stubs and integration cases for ManagerOrderCostRecalculator
including free delivery, cart+delivery payment fee, and custom handler warnings.
@Ibochkarev Ibochkarev changed the title Finalize: расчёт стоимости через ManagerOrderCostRecalculator fix(order): align finalize cost with ManagerOrderCostRecalculator Jul 24, 2026
@Ibochkarev Ibochkarev added bug Something isn't working priority: high Важно исправить в ближайшее время labels Jul 24, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 July 24, 2026 03:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high Важно исправить в ближайшее время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] OrderFinalizeService: payment fee=0 и нет free_delivery_amount

1 participant