@company-manager/docs

Transaction Flow

POS transaction processing, payment handling, and receipt generation diagrams

POS Transaction Flow

This page covers the complete point of sale transaction process from order entry to payment completion.

Transaction Sequence

sequenceDiagram
    participant Staff as Staff
    participant POS as POS Terminal
    participant API as POS API
    participant DB as Database
    participant Payment as Payment Gateway
    participant Printer as Receipt Printer

    Staff->>POS: Start new transaction
    POS->>API: createTransaction(terminalId, employeeId)
    API->>DB: Create transaction record
    DB-->>API: Transaction ID
    API-->>POS: Transaction created

    loop Add Items
        Staff->>POS: Scan/Select item
        POS->>API: addItem(transactionId, productId, qty)
        API->>DB: Create transaction item
        API->>API: Calculate totals
        DB-->>API: Updated totals
        API-->>POS: Display updated cart
    end

    Staff->>POS: Apply discount (optional)
    POS->>API: applyDiscount(transactionId, discount)
    API->>DB: Update transaction
    API-->>POS: Updated totals

    Staff->>POS: Proceed to payment
    POS->>API: initiatePayment(transactionId)
    API->>DB: Update status (PAYMENT_PENDING)

    alt Card Payment
        Staff->>POS: Insert/Tap card
        POS->>Payment: Process payment
        Payment-->>POS: Payment result
        POS->>API: recordPayment(transactionId, paymentData)
    else Cash Payment
        Staff->>POS: Enter cash amount
        POS->>API: recordPayment(transactionId, cash)
        API-->>POS: Change due
    end

    API->>DB: Record payment, update status
    API-->>POS: Transaction complete

    POS->>Printer: Print receipt
    Printer-->>Staff: Receipt printed

Transaction Creation Flow

flowchart TD
    START[Start Transaction] --> TYPE{Transaction Type}

    TYPE --> DINE_IN[Dine-In]
    TYPE --> TAKEOUT[Takeout]
    TYPE --> DELIVERY[Delivery]
    TYPE --> QUICK[Quick Sale]

    DINE_IN --> TABLE[Select Table]
    TABLE --> COVERS[Enter Cover Count]
    COVERS --> CREATE[Create Transaction]

    TAKEOUT --> CUSTOMER[Customer Info]
    CUSTOMER --> PICKUP[Pickup Time]
    PICKUP --> CREATE

    DELIVERY --> ADDRESS[Delivery Address]
    ADDRESS --> DRIVER[Assign Driver]
    DRIVER --> CREATE

    QUICK --> CREATE

    CREATE --> READY[Ready for Items]

    style CREATE fill:#e8f5e9

Item Entry Flow

flowchart TD
    ITEM[Add Item] --> METHOD{Entry Method}

    METHOD --> SCAN[Barcode Scan]
    METHOD --> SEARCH[Search/Browse]
    METHOD --> QUICK[Quick Keys]

    SCAN --> LOOKUP[Product Lookup]
    SEARCH --> LOOKUP
    QUICK --> LOOKUP

    LOOKUP --> FOUND{Found?}
    FOUND -->|No| NOT_FOUND[Show Error]
    FOUND -->|Yes| MODIFIERS{Has Modifiers?}

    MODIFIERS -->|Yes| SELECT_MOD[Select Modifiers]
    MODIFIERS -->|No| QTY[Enter Quantity]

    SELECT_MOD --> REQUIRED{Required Mods?}
    REQUIRED -->|Yes| ENFORCE[Enforce Selection]
    REQUIRED -->|No| OPTIONAL[Optional Selection]
    ENFORCE --> QTY
    OPTIONAL --> QTY

    QTY --> PRICE{Custom Price?}
    PRICE -->|Yes| ENTER_PRICE[Enter Price]
    PRICE -->|No| ADD[Add to Order]
    ENTER_PRICE --> ADD

    ADD --> SEND_KDS{Send to Kitchen?}
    SEND_KDS -->|Yes| ROUTE[Route to KDS]
    SEND_KDS -->|No| HOLD[Hold Order]

    ROUTE --> CONFIRM[Item Added]
    HOLD --> CONFIRM

    style CONFIRM fill:#e8f5e9

Modifier Selection

flowchart TD
    ITEM[Item Selected] --> CHECK_MOD{Has Modifier Groups?}

    CHECK_MOD -->|No| CONTINUE[Continue to Cart]
    CHECK_MOD -->|Yes| LOAD_GROUPS[Load Modifier Groups]

    LOAD_GROUPS --> LOOP{More Groups?}
    LOOP -->|Yes| GROUP[Show Group]

    GROUP --> GROUP_TYPE{Group Type}
    GROUP_TYPE --> SINGLE[Single Select]
    GROUP_TYPE --> MULTI[Multi Select]

    SINGLE --> PICK_ONE[Pick One Option]
    MULTI --> PICK_MANY[Pick Multiple]

    PICK_ONE --> VALIDATE
    PICK_MANY --> VALIDATE

    VALIDATE{Valid Selection?}
    VALIDATE -->|No| ERROR[Show Error]
    ERROR --> GROUP
    VALIDATE -->|Yes| NEXT[Next Group]
    NEXT --> LOOP

    LOOP -->|No| PRICE_MOD[Calculate Modifier Price]
    PRICE_MOD --> CONTINUE

    subgraph "Example Groups"
        SIZE[Size: Small/Medium/Large]
        COOK[Doneness: Rare/Medium/Well]
        EXTRAS[Add-ons: Bacon, Cheese, etc.]
    end

Payment Processing

flowchart TD
    PAY[Initiate Payment] --> CALC[Calculate Total Due]

    CALC --> SPLIT{Split Payment?}
    SPLIT -->|Yes| SPLIT_TYPE{Split Type}
    SPLIT -->|No| SINGLE[Single Payment]

    SPLIT_TYPE --> EQUAL[Split Equally]
    SPLIT_TYPE --> ITEMS[Split by Items]
    SPLIT_TYPE --> CUSTOM[Custom Amounts]

    EQUAL --> DIVIDE[Calculate Per Person]
    ITEMS --> SELECT_ITEMS[Select Items per Guest]
    CUSTOM --> ENTER_AMOUNTS[Enter Custom Amounts]

    DIVIDE --> COLLECT
    SELECT_ITEMS --> COLLECT
    ENTER_AMOUNTS --> COLLECT
    SINGLE --> COLLECT

    COLLECT[Collect Payment] --> METHOD{Payment Method}

    METHOD --> CARD[Card Payment]
    METHOD --> CASH[Cash Payment]
    METHOD --> GIFT[Gift Card]
    METHOD --> MOBILE[Mobile Pay]
    METHOD --> ACCOUNT[House Account]

    CARD --> PROCESS_CARD[Process Card]
    CASH --> PROCESS_CASH[Process Cash]
    GIFT --> PROCESS_GIFT[Process Gift Card]
    MOBILE --> PROCESS_MOBILE[Process Mobile]
    ACCOUNT --> PROCESS_ACCOUNT[Charge Account]

    PROCESS_CARD --> VERIFY{Approved?}
    PROCESS_CASH --> CHANGE[Calculate Change]
    PROCESS_GIFT --> BALANCE{Sufficient Balance?}
    PROCESS_MOBILE --> VERIFY
    PROCESS_ACCOUNT --> CREDIT{Credit Available?}

    VERIFY -->|Yes| RECORD
    VERIFY -->|No| DECLINE[Payment Declined]
    CHANGE --> RECORD
    BALANCE -->|Yes| RECORD
    BALANCE -->|No| PARTIAL[Partial Payment]
    CREDIT -->|Yes| RECORD
    CREDIT -->|No| DECLINE

    PARTIAL --> COLLECT

    RECORD[Record Payment] --> COMPLETE{Fully Paid?}
    COMPLETE -->|Yes| CLOSE[Close Transaction]
    COMPLETE -->|No| COLLECT

    DECLINE --> RETRY{Retry?}
    RETRY -->|Yes| COLLECT
    RETRY -->|No| CANCEL[Cancel Payment]

    style CLOSE fill:#e8f5e9
    style DECLINE fill:#ffebee

Card Payment Sequence

sequenceDiagram
    participant Terminal as POS Terminal
    participant Reader as Card Reader
    participant Gateway as Payment Gateway
    participant Processor as Card Processor
    participant Bank as Issuing Bank

    Terminal->>Reader: Request payment
    Reader->>Reader: Wait for card

    alt Chip Card
        Reader->>Reader: Read chip
        Reader->>Terminal: Card data (encrypted)
    else Contactless
        Reader->>Reader: NFC read
        Reader->>Terminal: Token
    else Swipe
        Reader->>Reader: Read stripe
        Reader->>Terminal: Track data
    end

    Terminal->>Gateway: Authorization request
    Gateway->>Processor: Process authorization
    Processor->>Bank: Authorize transaction

    Bank-->>Processor: Authorization response
    Processor-->>Gateway: Response
    Gateway-->>Terminal: Result

    alt Approved
        Terminal->>Terminal: Display "Approved"
        Terminal->>Reader: Request signature (if needed)
        Reader-->>Terminal: Signature captured
    else Declined
        Terminal->>Terminal: Display decline reason
    end

Discount Application

flowchart TD
    DISCOUNT[Apply Discount] --> TYPE{Discount Type}

    TYPE --> PERCENT[Percentage Off]
    TYPE --> AMOUNT[Fixed Amount]
    TYPE --> COUPON[Coupon Code]
    TYPE --> EMPLOYEE[Employee Discount]
    TYPE --> MANAGER[Manager Override]

    PERCENT --> SCOPE{Apply To}
    AMOUNT --> SCOPE
    COUPON --> VALIDATE[Validate Coupon]
    EMPLOYEE --> AUTH_EMP[Employee PIN]
    MANAGER --> AUTH_MGR[Manager Override]

    VALIDATE --> VALID{Valid?}
    VALID -->|Yes| SCOPE
    VALID -->|No| INVALID[Show Invalid]

    AUTH_EMP --> SCOPE
    AUTH_MGR --> SCOPE

    SCOPE --> ENTIRE[Entire Order]
    SCOPE --> ITEM[Specific Item]
    SCOPE --> CATEGORY[Category]

    ENTIRE --> CALC[Calculate Discount]
    ITEM --> SELECT[Select Items]
    CATEGORY --> FILTER[Filter Items]

    SELECT --> CALC
    FILTER --> CALC

    CALC --> LIMIT{Within Limit?}
    LIMIT -->|Yes| APPLY[Apply Discount]
    LIMIT -->|No| NEED_AUTH[Require Authorization]

    NEED_AUTH --> AUTH_MGR
    APPLY --> UPDATED[Update Totals]

    style APPLY fill:#e8f5e9

Void and Refund

flowchart TD
    ACTION[Void/Refund Request] --> TYPE{Action Type}

    TYPE --> VOID_ITEM[Void Item]
    TYPE --> VOID_TRANS[Void Transaction]
    TYPE --> REFUND[Refund]

    VOID_ITEM --> SELECT_ITEM[Select Item]
    SELECT_ITEM --> REASON_ITEM[Enter Reason]
    REASON_ITEM --> AUTH_VOID{Requires Auth?}

    VOID_TRANS --> CHECK_PAID{Transaction Paid?}
    CHECK_PAID -->|Yes| MUST_REFUND[Must Refund Instead]
    CHECK_PAID -->|No| REASON_TRANS[Enter Reason]
    REASON_TRANS --> AUTH_VOID

    AUTH_VOID -->|Yes| MGR_AUTH[Manager Authorization]
    AUTH_VOID -->|No| PROCESS_VOID[Process Void]
    MGR_AUTH --> PROCESS_VOID

    PROCESS_VOID --> UPDATE_INV[Update Inventory]
    UPDATE_INV --> VOID_COMPLETE[Void Complete]

    MUST_REFUND --> REFUND

    REFUND --> SELECT_REFUND[Select Items to Refund]
    SELECT_REFUND --> REFUND_AMT[Calculate Refund Amount]
    REFUND_AMT --> REFUND_AUTH[Manager Authorization]

    REFUND_AUTH --> REFUND_METHOD{Original Payment Method}
    REFUND_METHOD --> CARD_REFUND[Card Refund]
    REFUND_METHOD --> CASH_REFUND[Cash Refund]

    CARD_REFUND --> PROCESS_REFUND[Process with Gateway]
    CASH_REFUND --> DRAWER[Open Cash Drawer]

    PROCESS_REFUND --> REFUND_COMPLETE[Refund Complete]
    DRAWER --> REFUND_COMPLETE

    style VOID_COMPLETE fill:#fff3e0
    style REFUND_COMPLETE fill:#fff3e0

Receipt Generation

flowchart TD
    COMPLETE[Transaction Complete] --> RECEIPT{Receipt Options}

    RECEIPT --> PRINT[Print Receipt]
    RECEIPT --> EMAIL[Email Receipt]
    RECEIPT --> SMS[Text Receipt]
    RECEIPT --> NONE[No Receipt]

    PRINT --> FORMAT[Format Receipt]
    EMAIL --> COLLECT_EMAIL[Collect Email]
    SMS --> COLLECT_PHONE[Collect Phone]

    COLLECT_EMAIL --> FORMAT
    COLLECT_PHONE --> FORMAT

    FORMAT --> CONTENT[Receipt Content]
    CONTENT --> HEADER[Store Header]
    CONTENT --> ITEMS_LIST[Items List]
    CONTENT --> TAXES[Tax Breakdown]
    CONTENT --> PAYMENTS[Payments]
    CONTENT --> FOOTER[Footer/Survey]

    HEADER --> BUILD[Build Receipt]
    ITEMS_LIST --> BUILD
    TAXES --> BUILD
    PAYMENTS --> BUILD
    FOOTER --> BUILD

    BUILD --> DELIVER{Delivery Method}

    DELIVER --> PRINTER[Send to Printer]
    DELIVER --> SEND_EMAIL[Send Email]
    DELIVER --> SEND_SMS[Send SMS]

    PRINTER --> DONE[Receipt Delivered]
    SEND_EMAIL --> DONE
    SEND_SMS --> DONE
    NONE --> DONE

    style DONE fill:#e8f5e9

Transaction Data Structure

erDiagram
    TRANSACTION ||--o{ TRANSACTION_ITEM : contains
    TRANSACTION ||--o{ TRANSACTION_PAYMENT : paid_by
    TRANSACTION ||--o{ TRANSACTION_DISCOUNT : has
    TRANSACTION_ITEM ||--o{ ITEM_MODIFIER : has

    TRANSACTION {
        string id PK
        string terminalId FK
        string employeeId FK
        string tableId FK
        enum type
        enum status
        decimal subtotal
        decimal taxAmount
        decimal discountAmount
        decimal tipAmount
        decimal total
        int guestCount
        timestamp openedAt
        timestamp closedAt
    }

    TRANSACTION_ITEM {
        string id PK
        string transactionId FK
        string productId FK
        string name
        decimal unitPrice
        int quantity
        decimal discount
        decimal total
        string notes
        enum status
    }

    TRANSACTION_PAYMENT {
        string id PK
        string transactionId FK
        enum method
        decimal amount
        decimal tipAmount
        string referenceNumber
        json processorResponse
        timestamp processedAt
    }

    TRANSACTION_DISCOUNT {
        string id PK
        string transactionId FK
        string itemId FK
        enum type
        decimal amount
        string reason
        string authorizedBy
    }

    ITEM_MODIFIER {
        string id PK
        string itemId FK
        string modifierId FK
        string name
        decimal price
    }