@startuml state "Approval Pending" as AP state "Canceled (with paid fee)" as CP AP: status = "n" AP: require_approval = true Pending: status = "n" Pending: require_approval = false Pending: Tickets reserved: yes Expired: status = "e" Expired: Tickets reserved: no Paid: status = "p" Paid: count(positions | !canceled) > 0 Paid: Tickets reserved: yes CP: status = "p" CP: count(positions | !canceled) = 0 Canceled: status = "c" Canceled: Tickets reserved: no [*] -> Pending: order placed\ntotal > 0 [*] -> Paid: order placed\ntotal = 0 [*] -> AP: order placed\napproval required Pending --> Paid: order paid Pending --> Expired: after payment\ndeadline Expired --> Paid: order paid\n(only if quota left) Expired -[dashed]-> Canceled Expired -[dashed]-> Pending: order extended Paid --> Canceled: order canceled Pending --> Canceled: order canceled Paid -[dashed]-> Pending: refund AP --> Pending: order approved AP --> Canceled: order denied Paid --> CP: order canceled\n(with cancellation fee) Canceled -[dashed]-> Pending: order reactivated Canceled -[dashed]-> Paid: order reactivated CP -[dashed]-> Canceled: fee canceled @enduml