invoice v1

examples/invoice/invoice.flow · dandori doc

An order holds its goods until its payment is due, then ships them once paid, or puts them back

flow
on out_of_stocktrueon expiredfalseon expiredinvoice v156 hold ← reserve(…)book stock.reserve.holdstartsout_of_stock → line 57; timeout, failure → on failure!57 succeed outcome = out_of_stock, due = none58 due = terms.payment(…)dates payment_terms.caltimeout, failure → on failure!59 wait until due.at60 payment = check_payment(…)GET https://payments.example.com/orders/{order}/paymentretry 2 times every 10 secondstimeout, failure → on failure!61 match payment.paid63 hold ← ship(…)book stock.reserve.postsends postexpired → line 64; timeout, failure → on failure!64 succeed outcome = not_paid, due = due.day65 succeed outcome = shipped, due = due.day67 hold ← put_back(…)book stock.reserve.voidsends voidexpired → line 68; already_posted, timeout, failure → on failure!69 succeed outcome = not_paid, due = due.day
on failure
heldon failurenoneon expiredon already_posted71 on failure72 match hold.state75 hold ← put_back(…)book stock.reserve.voidsends void78 fail NotPutBack"the goods held for the order could not be put …leaving holdfails with the same error

Calls

LineCallCallsRetriesTimeoutWhen it failsCase after
56hold ← reserve(…)book stock.reserve.hold, starts stock.reserve——out_of_stock → line 57
timeout, failure → on failure
hold: held
58due = terms.payment(…)the date payment of payment_terms.cal2 times, after 1 second and 2 (failure)—timeout, failure → on failure—
60payment = check_payment(…)GET https://payments.example.com/orders/{order}/payment, idempotent2 times every 10 seconds (failure, timeout)—timeout, failure → on failure—
63hold ← ship(…)book stock.reserve.post, sends post——expired → line 64
timeout, failure → on failure
hold: posted
67hold ← put_back(…)book stock.reserve.void, sends void——expired → line 68
already_posted, timeout, failure → on failure
hold: voided
75hold ← put_back(…)book stock.reserve.void, sends void——expired → line 76
already_posted → line 77
timeout, failure → line 78
hold: voided

Ends

LineEndhold
57succeed outcome = out_of_stock, due = nonenot started
64succeed outcome = not_paid, due = due.dayexpired
65succeed outcome = shipped, due = due.dayposted
69succeed outcome = not_paid, due = due.dayvoided, expired
78fail NotPutBack "the goods held for the order could not be put back" leaving holdhanded over as it is: held, posted, voided, expired
78on failure runs to its end, and the workflow fails with the error that started itnot started, or posted, voided, expired