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 printedTransaction 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:#e8f5e9Item 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:#e8f5e9Modifier 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.]
endPayment 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:#ffebeeCard 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
endDiscount 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:#e8f5e9Void 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:#fff3e0Receipt 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:#e8f5e9Transaction 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
}