def __init__(self, sku, on_hand_buffer=None): self.sku = sku # Minimum on hand quantity before we need to physically verify stock levels, off by default self.on_hand_buffer = on_hand_buffer if on_hand_buffer else 0 self.tracker = TrackingStateMachine() self.tracker.add_state(OnHandState("OnHand")) self.tracker.add_state(CommittedState("Committed")) self.tracker.add_state(BackorderState("Backorder")) self.tracker.add_state(FulfilledState("Fulfilled")) self.tracker.add_state(PurchaseOrderState("PurchaseOrder")) self.tracker.add_state(LostAndFoundState("Lost")) self.tracker.add_state(LostAndFoundState("Found")) self.tracker.add_transition("commit", "OnHand", "Committed") self.tracker.add_transition("allocate", "OnHand", "Backorder") self.tracker.add_transition("fulfill_backorder", "Backorder", "Committed") self.tracker.add_transition("cancel_backorder", "Backorder", "OnHand") self.tracker.add_action("verify", "Committed") self.tracker.add_transition("verify_out_of_stock", "Committed", "Backorder") self.tracker.add_transition("backorder_commitment", "Committed", "Backorder") self.tracker.add_transition("revert", "Committed", "OnHand") self.tracker.add_transition("fulfill", "Committed", "Fulfilled") self.tracker.add_transition("delivery", "PurchaseOrder", "OnHand") self.tracker.add_action("cancel_purchase_order", "PurchaseOrder") self.tracker.add_transition("lost", "OnHand", "Lost") self.tracker.add_transition("found", "Found", "OnHand") # Some shortcut attributes self.on_hand = self.tracker.state("OnHand") self.committed = self.tracker.state("Committed") self.verification = self.tracker.state("Verify") self.backorders = self.tracker.state("Backorder") self.fulfilled = self.tracker.state("Fulfilled") self.purchase_orders = self.tracker.state("PurchaseOrder") self.lost = self.tracker.state("Lost") self.found = self.tracker.state("Found")