Skip to content

feat(order): lifecycle gate with ports, idempotency, and rollback - #596

Open
Ibochkarev wants to merge 1 commit into
betafrom
feat/issue-592-order-lifecycle
Open

feat(order): lifecycle gate with ports, idempotency, and rollback#596
Ibochkarev wants to merge 1 commit into
betafrom
feat/issue-592-order-lifecycle

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

OrderStatusService становится единым gate для non-draft смены статуса: опциональный allow-list переходов, DI-порты lifecycle под #589#591 (пока no-op), режим idempotent для интеграций, rollback status_id если порт или msOnChangeOrderStatus вернули ошибку. Manager update больше не пишет status_id в общий save() до вызова сервиса. Пример в Payment docblock ведёт через gate.

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

  • Новая функциональность (non-breaking change)
  • Исправление бага (non-breaking change)

Связанные Issues

Closes #592

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

Gate E (локально):

cd core/components/minishop3
php -l src/Services/Order/OrderStatusService.php   # exit 0
php -l src/Services/Order/OrderStatusTransitionPolicy.php
php -l src/Services/Order/ManagerOrderMutationService.php
./vendor/bin/phpunit tests/Unit/Services/Order/     # OK 18 tests
./vendor/bin/phpunit --testsuite Unit               # OK 195 tests (2 pre-existing deprecations)
php tests/OrderStatusFixedRevalidateTest.php        # OK
php tests/ServiceRegistryFactoryMapTest.php         # OK 70 factories
  • Автоматические тесты (composer test / phpunit Unit + smoke scripts)
  • Ручное тестирование на живом MODX

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

  • MiniShop3: ветка feat/issue-592-order-lifecycle
  • MODX: stubs / без полной установки
  • PHP: 8.4.17

Чеклист

  • Код соответствует стилю проекта
  • Лексиконы добавлены на двух языках (ru/en)
  • Изменения не ломают существующую функциональность (default = final/fixed, ports no-op)
  • PHPStan — CI job
  • CHANGELOG.md — не трогали (релизный процесс)

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

Gate A (AC)

AC Code Test
Single gate documented / manager path via service yes manager mutation + Payment docblock
Orchestration ports contract (#589#591) yes (ms3_order_lifecycle_ports) paid/cancel/shipped unit
Fail after save → rollback (no silent status+error) yes after-event + port fail tests
Idempotent same-status for integrations yes options['idempotent'] unit
Additive transition policy yes ms3_order_status_transitions policy + lifecycle unit
Keep msOrderStatus admin model yes n/a

Deferred (не blockers этого PR)

@Ibochkarev
Ibochkarev requested a review from biz87 August 17, 2026 05:21
@Ibochkarev
Ibochkarev force-pushed the feat/issue-592-order-lifecycle branch from 853d8fa to 7292c16 Compare August 17, 2026 09:18
Make OrderStatusService the non-draft status gate: optional transition
allow-list, NullOrderLifecyclePorts for #589#591, idempotent retries,
and status rollback when after-event or a port fails.
@Ibochkarev
Ibochkarev force-pushed the feat/issue-592-order-lifecycle branch from 7292c16 to 596abac Compare August 17, 2026 10:20
@Ibochkarev Ibochkarev added the enhancement New feature or request label Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Core: make order lifecycle the orchestration layer for status-driven side effects

1 participant