# Order-Case Integration Model ## Principle Orders are **transactional satellites** that orbit cases. They exist independently but gain process context through relations. ## Architecture ### Order Table (Future - Not in Sag Module) ```sql CREATE TABLE orders ( id SERIAL PRIMARY KEY, order_number VARCHAR(50) UNIQUE NOT NULL, customer_id INT NOT NULL, total_amount DECIMAL(10,2), status VARCHAR(50), -- 'draft', 'sent', 'paid', etc. created_at TIMESTAMP DEFAULT NOW(), deleted_at TIMESTAMP ); ``` ### Integration via Relations When an Order is created from a Case: 1. **Create Order independently** ```python order = create_order({ 'customer_id': 123, 'total_amount': 1500.00 }) ``` 2. **Create relation to Case** ```python create_relation({ 'kilde_sag_id': case_id, 'målsag_id': None, # Relations can point to other entities 'relationstype': 'ordre', 'metadata': {'order_id': order.id} }) ``` ## Valid Use Cases ### ✅ Scenario 1: Case Leads to Order 1. Customer opens case: "Need new server" 2. Tech works case, adds tags: ['hardware', 'quote_needed'] 3. Salesperson closes tag 'quote_needed' by creating Order 4. Relation created: Case → Order (relationstype='ordre_oprettet') 5. Case continues with tag 'installation' 6. When installed, case closed **Result**: Order exists, Case tracks the work process. ### ✅ Scenario 2: Order Triggers Case 1. Order created by salesperson 2. System auto-creates Case: "Deliver order #1234" 3. Relation created: Order → Case (relationstype='leverance') 4. Case gets tags: ['pick_items', 'ship', 'install'] 5. Each tag closed as work progresses 6. Case closed when complete **Result**: Order is transaction, Case is the delivery process. ### ✅ Scenario 3: Multiple Cases per Order 1. Large order for multiple items 2. Each item gets its own Case: - Case A: "Install firewall" (relation to Order) - Case B: "Configure switches" (relation to Order) - Case C: "Setup monitoring" (relation to Order) 3. Each Case has independent lifecycle with tags 4. Order tracks payment/billing 5. Cases track work processes **Result**: One transactional Order, three process Cases. ## Anti-Patterns (DO NOT) ### ❌ Anti-Pattern 1: Embedding Process in Order ```python # WRONG - Order should NOT have workflow state order.status = 'awaiting_installation' # This belongs in a Case tag! ``` **Fix**: Create Case with tag 'installation', link to Order. ### ❌ Anti-Pattern 2: Making Order Replace Case ```python # WRONG - Don't create Order instead of Case order = Order(description="Fix customer server") ``` **Fix**: Create Case, optionally link to Order if billing needed. ### ❌ Anti-Pattern 3: Storing Case ID in Order ```python # WRONG - Don't embed references order.case_id = 42 ``` **Fix**: Use Relations table to link Order ↔ Case. ## Implementation Guidelines ### When to Create Order - Customer needs invoice/quote - Financial transaction required - External system (e-conomic) integration needed - Legal/accounting documentation ### When to Create Case - Work needs to be tracked - Workflow has multiple steps - Tags represent responsibilities - Multiple people involved - Need audit trail of process ### When to Create Both - Order for billing + Case for work process - Link them via Relation ## Database Schema Addition To support Order-Case links, add metadata to relations: ```sql ALTER TABLE sag_relationer ADD COLUMN metadata JSONB DEFAULT '{}'; -- Example usage: INSERT INTO sag_relationer (kilde_sag_id, målsag_id, relationstype, metadata) VALUES (42, NULL, 'ordre', '{"order_id": 1234, "order_number": "ORD-2025-001"}'); ``` This allows relations to point to external entities (Orders) while keeping the Case model clean. ## API Contract ### Create Order from Case ``` POST /api/v1/cases/{case_id}/orders { "customer_id": 123, "total_amount": 1500.00, "description": "Server upgrade" } Response: { "order_id": 1234, "order_number": "ORD-2025-001", "relation_id": 56 // Auto-created relation } ``` ### List Orders for Case ``` GET /api/v1/cases/{case_id}/orders Response: [ { "order_id": 1234, "order_number": "ORD-2025-001", "status": "sent", "total_amount": 1500.00 } ] ``` ### Create Case from Order ``` POST /api/v1/orders/{order_id}/cases { "titel": "Deliver order ORD-2025-001", "tags": ["pick_items", "ship", "install"] } Response: { "case_id": 87, "relation_id": 57 // Auto-created relation } ``` ## Summary **Remember**: - Orders = Transactions (billing, invoices, quotes) - Cases = Processes (work, workflow, responsibilities) - Relations = Links (give meaning to both) **Never**: - Put process in Order - Put transaction in Case - Create hard references between entities **Always**: - Use Relations to link - Keep entities independent - Let UI derive the connections