Invoice Lifecycle Flow

stateDiagram-v2 [*] --> Draft : Admin creates invoice Draft --> Sent : Send to customer Sent --> Paid : Customer pays (Stripe/PayPal) Sent --> Overdue : Due date passed (batch job) Sent --> Cancelled : Admin cancels Draft --> Cancelled : Admin cancels Overdue --> Paid : Late payment received Paid --> [*] Cancelled --> [*]

Payment Flow (Stripe)

sequenceDiagram participant C as Customer Portal participant B as Backend API participant S as Stripe API C->>B: POST /payment/stripe/create-intent (invoiceId, amount) B->>S: Create PaymentIntent S-->>B: clientSecret B-->>C: Return clientSecret C->>S: Confirm payment (card details) S-->>C: Payment confirmed C->>B: POST /payment/stripe/confirm (paymentIntentId) B->>B: invoice.markAsPaid("stripe", paymentIntentId) B-->>C: Success — Invoice paid

Payment Flow (PayPal)

sequenceDiagram participant C as Customer Portal participant B as Backend API participant P as PayPal API C->>B: POST /payment/paypal/create-order (invoiceId, amount) B->>P: POST /v2/checkout/orders P-->>B: orderId + approval URL B-->>C: Redirect to PayPal C->>P: Customer approves payment P-->>C: Redirect back with orderId C->>B: POST /payment/paypal/capture-order (orderId) B->>P: POST /v2/checkout/orders/{id}/capture P-->>B: COMPLETED B->>B: invoice.markAsPaid("paypal", orderId) B-->>C: Success — Invoice paid