Skip to main content

Knowledge Base

Quick reference dan analogi sederhana untuk memahami struktur data dan relasi antar entity.

πŸ›οΈ Product Domain

Analogi Sederhana

Bayangkan product seperti β€œmobil utama”:
EntityAnalogiFungsi
productMobil utamaMaster product data
product_variantsWarna/tipe mobilVariasi dari product (size, color, dll)
product_pricesHarga di tiap dealerPrice list per branch/customer type
product_suppliersVendor yang supply sparepartSupplier mapping
product_inventoryStok fisik di gudangInventory allocation
product_addonsAksesoris tambahanAdd-ons (topping, extra)
product_accountsMapping ke akun keuanganChart of accounts mapping
product_trialsMobil prototype/trialTrial products sebelum dijual massal

Relasi Product


πŸ’° Transaction Domain

Tabel Inti (Wajib)

transactions
  • Fungsi: Header transaksi (waktu, kasir, outlet/cabang, total, metode bayar, status)
  • Kolom kunci: id, transaction_date, branch_id, cashier_id, total_amount, payment_method, status, deleted_at
transaction_items
  • Fungsi: Detail item per transaksi (qty, harga, subtotal)
  • Kolom kunci: transaction_id, product_id, quantity, price, subtotal, deleted_at

Tabel Referensi (Direkomendasikan)

users
  • Tujuan: Ambil nama kasir
  • Join: users.id = transactions.cashier_id
branches
  • Tujuan: Nama outlet/cabang
  • Join: branches.id = transactions.branch_id
payment_methods
  • Tujuan: Nama metode bayar dari transactions.payment_method (kode)
  • Join: payment_methods.code = transactions.payment_method

Tabel Opsional (Sesuai Kebutuhan)

cashier_shifts
  • Tujuan: Filter transaksi berdasarkan shift yang sedang/tertentu
  • Contoh: Transaksi dalam rentang start_timeβ€”end_time untuk user_id dan branch_id tertentu
transaction_item_addons
  • Tujuan: Jika ada add-on per item (tambahan topping/variant) dan ingin dihitung/ditampilkan
transaction_accounts
  • Tujuan: Jejak jurnal/komponen nilai (mis. potongan/pajak) bila ingin breakdown akuntansi per transaksi

Kunci Join Utama

-- Transaction with items
transaction_items.transaction_id = transactions.id

-- Transaction with cashier
users.id = transactions.cashier_id

-- Transaction with branch
branches.id = transactions.branch_id

-- Transaction with payment method
payment_methods.code = transactions.payment_method

Indeks yang Direkomendasikan

transactions: Indeks gabungan sesuai filter UI kasir
  • (transaction_date)
  • (branch_id)
  • (cashier_id)
  • (status)
  • (payment_method)
  • (deleted_at)
transaction_items: (transaction_id) payment_methods: (code) users: (id) branches: (id)

πŸ“¦ Inventory Domain

Warehouse Hierarchy

Merchant
└── Branch
    └── Warehouses (multiple)
        β”œβ”€β”€ Priority 0 (Default)
        β”œβ”€β”€ Priority 1 (Backup 1)
        └── Priority 2 (Backup 2)

Stock Tracking

Source of Truth: warehouse_stocks table
-- Available stock formula
available_stock = qty_on_hand - qty_reserved

-- Stock per warehouse
SELECT 
    warehouse_id,
    inventory_id,
    qty_on_hand,
    qty_reserved,
    (qty_on_hand - qty_reserved) AS available
FROM warehouse_stocks
WHERE merchant_id = ?
  AND deleted_at IS NULL;

Movement Types

TypeDirectionDescription
purchase_receiptIN (+)Penerimaan pembelian
sales_issueOUT (-)Pengeluaran penjualan
return_inIN (+)Return dari customer
return_outOUT (-)Return ke supplier
adjustmentIN/OUTPenyesuaian manual
stock_opname_adjIN/OUTStock opname adjustment
production_issueOUT (-)Issue bahan baku produksi
production_receiptIN (+)Receipt hasil produksi
transfer_outOUT (-)Transfer keluar ke warehouse lain
transfer_inIN (+)Transfer masuk dari warehouse lain

πŸ” Authentication & Authorization

JWT Token Structure

{
  "sub": 123,              // User ID
  "email": "[email protected]",
  "role": "cashier",
  "merchant_id": 1,
  "branch_id": 5,
  "exp": 1697123456,       // Expiration timestamp
  "iat": 1697120000        // Issued at timestamp
}

Role Hierarchy

admin
β”œβ”€β”€ manager
β”‚   β”œβ”€β”€ supervisor
β”‚   β”‚   └── cashier
β”‚   └── warehouse_staff
└── accountant

Permission Mapping

RolePermissions
adminAll permissions
managerBranch management, reports, user management
supervisorTransaction approval, shift management
cashierCreate transaction, view own transactions
warehouse_staffInventory management, stock movement
accountantView reports, journal entries

πŸ’³ Payment Methods

Payment Method Codes

CodeNameTypeRequires Gateway
CASHCashOfflineNo
QRISQRISOnlineYes (Xendit)
DEBITDebit CardOnlineYes (Xendit)
CREDITCredit CardOnlineYes (Xendit)
OVOOVOOnlineYes (Xendit)
GOPAYGoPayOnlineYes (Xendit)
DANADANAOnlineYes (Xendit)
SHOPEEPAYShopeePayOnlineYes (Xendit)

Payment Status Flow

PENDING β†’ PROCESSING β†’ PAID
                    ↓
                  FAILED
                    ↓
                  REFUNDED

πŸ“Š Reporting Queries

Daily Sales Report

SELECT 
    DATE(transaction_date) AS date,
    COUNT(*) AS total_transactions,
    SUM(grand_total) AS total_sales,
    AVG(grand_total) AS avg_transaction,
    payment_method
FROM transactions
WHERE branch_id = ?
  AND transaction_date >= CURDATE()
  AND transaction_date < CURDATE() + INTERVAL 1 DAY
  AND status = 'paid'
  AND deleted_at IS NULL
GROUP BY DATE(transaction_date), payment_method
ORDER BY date DESC;

Top Selling Products

SELECT 
    p.product_name,
    SUM(ti.quantity) AS total_qty,
    SUM(ti.subtotal) AS total_revenue,
    COUNT(DISTINCT ti.transaction_id) AS transaction_count
FROM transaction_items ti
JOIN products p ON ti.product_id = p.id
JOIN transactions t ON ti.transaction_id = t.id
WHERE t.branch_id = ?
  AND t.transaction_date >= ?
  AND t.transaction_date < ?
  AND t.status = 'paid'
  AND t.deleted_at IS NULL
GROUP BY p.id, p.product_name
ORDER BY total_revenue DESC
LIMIT 10;

Stock Movement Summary

SELECT 
    i.inventory_name,
    w.warehouse_name,
    im.movement_type,
    SUM(im.quantity) AS total_quantity,
    COUNT(*) AS movement_count
FROM inventory_movements im
JOIN inventory i ON im.inventory_id = i.id
JOIN warehouses w ON im.warehouse_id = w.id
WHERE im.merchant_id = ?
  AND im.movement_date >= ?
  AND im.movement_date < ?
GROUP BY i.id, w.id, im.movement_type
ORDER BY i.inventory_name, w.warehouse_name;

πŸ”§ Common Patterns

Soft Delete Pattern

// Soft delete
db.Model(&Transaction{}).
    Where("id = ?", id).
    Update("deleted_at", time.Now())

// Query without deleted
db.Where("deleted_at IS NULL").Find(&transactions)

// Include deleted (admin only)
db.Unscoped().Find(&transactions)

Pagination Pattern

// Calculate offset
offset := (page - 1) * limit

// Query with pagination
db.Offset(offset).
    Limit(limit).
    Find(&results)

// Count total
var total int64
db.Model(&Transaction{}).Count(&total)

// Calculate total pages
totalPages := int(math.Ceil(float64(total) / float64(limit)))

Transaction Pattern

// Start transaction
tx := db.Begin()

// Defer rollback
defer func() {
    if r := recover(); r != nil {
        tx.Rollback()
    }
}()

// Do operations
if err := tx.Create(&transaction).Error; err != nil {
    tx.Rollback()
    return err
}

if err := tx.Create(&items).Error; err != nil {
    tx.Rollback()
    return err
}

// Commit
return tx.Commit().Error

Database ERD

Complete database schema

Internal Flow Diagrams

Handler & service flow diagrams

API Spec Template

API specification templates

AI Assistant Reference: Dokumentasi ini dioptimalkan untuk AI assistant context dan developer quick reference.