' Copyright (C) 2024 Declan Teevan ' ' This program is free software: you can redistribute it and/or modify ' it under the terms of the GNU Affero General Public License as published by ' the Free Software Foundation, either version 3 of the License, or ' (at your option) any later version. ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU Affero General Public License for more details. ' ' You should have received a copy of the GNU Affero General Public License ' along with this program. If not, see . @startuml placeordersaga !theme mars |Order| start :OrderCreatedEvent; |Product| :ProductPriceQuoteEvent; if (type) is (UNAVAILABLE) then |Order| :OrderRejectedEvent; kill else (AVAILABLE) endif |Order| :OrderPendingEvent; |Warehouse| :StockReservationEvent; if (type) is (INSUFFICIENT_STOCK) then |Order| :OrderRejectedEvent; kill else (STOCK_RESERVED) endif |Shipping| :ShipmentAllocationEvent; if (type) is (FAILED) then |Warehouse| :StockReservationEvent\ntype: STOCK_RETURNED; |Order| :OrderRejectedEvent; kill else (ALLOCATED) endif |Payment| :PaymentProcessedEvent; if (type) is (FAILED) then |Shipping| :ShipmentAllocationEvent\ntype: ALLOCATION_RELEASED; |Warehouse| :StockReservationEvent\ntype: STOCK_RETURNED; |Order| :OrderRejectedEvent; kill else (SUCCESS) endif fork |Warehouse| :StockReservationEvent\ntype: STOCK_CONSUMED; kill fork again |Order| :OrderApprovedEvent; stop end merge @enduml