' 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