Skip to main content

Transaction Flow

Dokumentasi lengkap alur transaksi di MStore Backend, mencakup state machine, offline-first capability, inventory movement, dan journal accounting.

🎯 Overview

Sistem transaksi MStore dirancang dengan prinsip:
  • βœ… State Machine untuk lifecycle management yang jelas
  • βœ… Offline-First untuk operasional tanpa internet (CASH only)
  • βœ… Multi-Payment support (CASH, QRIS, E-Wallet, VA, Credit Card)
  • βœ… Inventory Integration dengan automatic stock movement
  • βœ… Journal Accounting untuk setiap transaksi
  • βœ… Idempotent untuk retry safety

πŸ—οΈ Transaction State Machine

State Definitions


πŸ“‘ Transaction API Endpoints

1. Create Transaction (Draft)

Membuat transaksi baru dalam status draft.
Response:

2. Submit Payment

Mengubah status dari draft β†’ pending_payment dan membuat payment request.
Response (QRIS):
Response (CASH):

3. Verify Payment

Verifikasi pembayaran dari payment gateway (webhook atau manual check).
Response:

4. Sync Transaction (Accounting)

Sync transaksi ke accounting system (post journal entries).
Response:

5. Void Transaction

Membatalkan transaksi (dengan reversal journal jika sudah synced).
Response:

πŸ”„ Offline-First Flow

Untuk transaksi CASH, sistem mendukung offline-first:

Flutter Implementation

Complete guide untuk Flutter + Isar DB

Backend Implementation

Complete backend implementation dengan Go
Lihat dokumentasi lengkap: Offline-First POS System Lihat dokumentasi lengkap: Offline-First Architecture (coming soon)

πŸ“¦ Inventory Integration

Setiap transaksi yang paid atau synced akan otomatis membuat inventory movement:

Inventory Movement Flow

Movement Record Example


πŸ’° Journal Accounting Integration

Setiap transaksi yang di-sync akan membuat journal entries:

Journal Mapping Rules

Journal Entry Example


πŸ§ͺ Testing Scenarios

Scenario 1: CASH Transaction (Happy Path)

Scenario 2: QRIS Transaction with Webhook


πŸ“Š Performance Metrics


πŸ”’ Security Considerations

1. Transaction Code Generation

2. Idempotency

  • Gunakan idempotency_key untuk retry safety
  • Cek duplicate transaction_code sebelum insert
  • Webhook handler harus idempotent

3. Authorization

  • Cashier hanya bisa create/view transaksi di branch sendiri
  • Manager bisa void transaksi
  • Admin bisa view semua transaksi

πŸ’‘ Best Practices

DO βœ…

  • Selalu gunakan state machine untuk update status
  • Simpan snapshot payment request/response di tabel payments
  • Buat inventory movement setelah payment verified
  • Post journal entries setelah sync
  • Handle webhook idempotent
  • Log semua state transitions

DON’T ❌

  • Jangan skip state machine (direct DB update)
  • Jangan lupa create inventory movement
  • Jangan post journal sebelum payment verified
  • Jangan ignore webhook errors
  • Jangan hardcode account codes

πŸ†˜ Troubleshooting

Problem: Transaction Stuck in pending_payment

Symptoms: Status tidak update setelah payment success Solution:

Problem: Journal Not Posted

Symptoms: Transaction status paid tapi belum ada journal Solution:

Problem: Inventory Not Reduced

Symptoms: Stock tidak berkurang setelah transaksi Solution:
  • Cek inventory_movements table
  • Verify warehouse stock calculation
  • Re-sync transaction jika perlu

Payment Gateway

Integrasi Xendit & Midtrans

Inventory Flow

Warehouse & stock management

Need Help? Contact backend team atau check GitHub Issues