Zamítnutí objednávky
Sklad nemá dost zboží – nezarezervuje nic a sága objednávku zamítne s důvodem.
Shrnutí: Nedostatek zboží není chyba požadavku (HTTP 400), ale business výsledek. Sklad zkontroluje všechny položky, a když některá nestačí, nezarezervuje nic a odpoví
StockReservationFailedV1s důvodem.
sequenceDiagram
autonumber
actor Z as Zákazník
participant W as Web (Ordering)
participant SG as OrderSagaOrchestrator
participant MQ as RabbitMQ
participant RH as ReserveStockHandler
participant IDB as inventory.db
Z->>W: objednat 50 ks (skladem 3)
W-->>Z: přijato (Pending)
Note over W,MQ: sága pošle ReserveStockV1 (jako při vytvoření)
MQ->>RH: ReserveStockV1
RH->>IDB: zkontrolovat VŠECHNY položky
RH->>RH: chybí: „Klávesnice: požadováno 50 ks, skladem 3 ks“
RH->>IDB: COMMIT: žádná změna zásob, Outbox[StockReservationFailedV1]
RH->>MQ: StockReservationFailedV1 (důvod)
MQ->>SG: StockReservationFailedV1
SG->>SG: saga → Rejected, akce RejectOrder
SG->>W: Order.Reject(důvod) → OrderRejected
W->>W: SendRejectionNoticeHandler: omluva zákazníkovi (log)
Co si všimnout
- Všechno, nebo nic. Sklad nejdřív zkontroluje všechny položky a teprve pak odečítá. Nikdy nezarezervuje půlku objednávky – nebylo by co kompenzovat.
- Důvod putuje až k zákazníkovi – v UI je u zamítnuté objednávky vidět, které zboží chybělo.
- Kontrola zásoby ve formuláři (údaj ze skladu přes HTTP) je jen orientační. Rozhoduje až rezervace – mezi zobrazením formuláře a objednáním mohl zboží koupit někdo jiný.
Kód
ReserveStockHandler · OrderSaga.StockReservationFailed · SendRejectionNoticeHandler