Skip to content

fix(order): multiply draft weight by product count#403

Open
Ibochkarev wants to merge 3 commits into
betafrom
fix/issue-375-draft-weight-count
Open

fix(order): multiply draft weight by product count#403
Ibochkarev wants to merge 3 commits into
betafrom
fix/issue-375-draft-weight-count

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Jul 16, 2026

Copy link
Copy Markdown
Member

Описание

OrderDraftManager::recalculate суммировал unit weight без × count, поэтому msOrder.weight расходился с cart.status.total_weight и занижал доставку по весу.

Исправление и сопутствующее:

  1. Вес draftOrderService::aggregateProductsTotals() считает weight × count (и line cost без повторного умножения), draft recalculate пишет эти totals в заказ.
  2. Одна агрегация — тот же хелпер используют OrderFinalizeService, ManagerOrderCostRecalculator::calculateProductTotals, OrdersController::recalculateOrderTotals; totals округляются до 6 знаков.
  3. События — TODO про «recalculate events» убраны: persist идёт через msOnBeforeSaveOrder / msOnSaveOrder при save(). Зарегистрированные, но мёртвые msOnBeforeGetOrderCost / msOnGetOrderCost подключены в OrderCostCalculator::getTotalCost (путь чтения стоимости, как в MS2).

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

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

Связанные Issues

Closes #375

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

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Gate E (exit codes):

  • php -l OrderDraftManager / OrderService / OrderFinalizeService / ManagerOrderCostRecalculator / OrdersController / OrderCostCalculator / OrderDraftWeightTest → 0
  • php core/components/minishop3/tests/OrderDraftWeightTest.php → 0 (OK)
  • red-green: без × count → fail (expected 3.0, actual 1.0); с фиксом → 0

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

  • MiniShop3: ветка fix/issue-375-draft-weight-count
  • MODX: n/a (unit stubs для веса)
  • PHP: 8.x локально

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

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений)
  • Обновлён CHANGELOG.md (для значимых изменений)

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

  • Плагины на пересчёт draft: msOnBeforeSaveOrder / msOnSaveOrder. Корректировка отображаемой стоимости: msOnBeforeGetOrderCost / msOnGetOrderCost (теперь реально вызываются из getTotalCost).
  • Не трогали OrderService::updateProducts (там price × count, не cost) и cart status (другой слой данных).
  • Review: формула веса ок; thermo code-judo (dedupe циклов) закрыт; TODO-события убраны без выдуманных event names.

OrderDraftManager::recalculate summed unit weight only, so draft
msOrder.weight disagreed with cart status and undercharged weight-based
delivery. Aggregate via OrderService with weight × count.
@Ibochkarev Ibochkarev added priority: high Важно исправить в ближайшее время bug Something isn't working labels Jul 16, 2026
@Ibochkarev Ibochkarev requested a review from biz87 July 16, 2026 04:29
Wire draft, finalize, manager recalculate, and OrdersController through
OrderService::aggregateProductsTotals so weight×count lives in one place.
Also round totals to 6 decimals like the former manager helper.
@Ibochkarev

Copy link
Copy Markdown
Member Author

Thermo-nuclear follow-up

Сделано:

  • агрегация на OrderService::aggregateProductsTotals (canonical)
  • подключены: OrderDraftManager, OrderFinalizeService, ManagerOrderCostRecalculator::calculateProductTotals, OrdersController::recalculateOrderTotals
  • round(..., 6) в хелпере
  • мёртвый ternary уже убран ранее

Не трогал: updateProducts (там price * count, не cost) и cart status (другой слой данных).

Draft recalculate persists via msOnBefore/SaveOrder on save — do not invent
unregistered recalculate events. Invoke the already-registered
msOnBeforeGetOrderCost / msOnGetOrderCost from OrderCostCalculator::getTotalCost.
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] OrderDraftManager::recalculate — weight без умножения на count

1 participant