Lewati ke konten utama

Mini Pos Brd

Problem Statement

Saat ini transaksi penjualan di TessaERP hanya dapat dilakukan melalui menu Sales Order Existing yang dirancang untuk kebutuhan distribusi dan wholesale. Alur tersebut tidak optimal untuk industri Retail dan F&B yang membutuhkan proses transaksi kasir yang cepat dan sederhana.

Kondisi ini menyebabkan:

  • Form transaksi Sales Order terlalu kompleks untuk digunakan kasir sehari-hari
  • Belum tersedia fitur scan barcode pada transaksi cepat
  • Belum tersedia tampilan katalog produk/menu bergambar yang mudah digunakan (khususnya F&B)
  • Belum tersedia catatan pesanan per item
  • Tampilan belum optimal untuk tablet atau perangkat handheld
  • Banyak field yang tidak relevan untuk transaksi outlet Retail & F&B

Goals

Mengembangkan fitur Point of Sales (POS) sebagai antarmuka transaksi penjualan cepat (Quick Sales Transaction) di TessaERP yang mendukung industri Retail dan F&B, tanpa menggantikan atau mengubah alur Sales Order Existing yang sudah berjalan.

Tujuan utama:

  • Menyediakan antarmuka POS yang sederhana, responsif, dan dapat digunakan kasir tanpa pelatihan teknis mendalam
  • Mendukung scan barcode, pencarian produk, dan katalog produk bergambar
  • Mengotomatiskan proses downstream Insert ke Sales Order only (Phase 1)Shipment, Inventory, AR Invoice, AR Payment, GL Posting menyusul di phase berikutnya
  • Mendukung berbagai metode pembayaran: Cash & Mock Payment Gateway (i.e. Midtrans) untuk Debit/Credit Card, QRIS, dan E-Wallet

Scope of Works

Frontend

1. POS Dashboard

Menu POS baru yang hanya dapat diakses oleh user dengan hak akses, responsif di Desktop, Tablet, dan Mobile Browser.

Detail Teknis:

  • Tambahkan menu POS pada sidebar navigasi, ditempatkan setelah menu Sales Order
  • (Optional/Configurable) Tambahkan Shortcut Button di Navigation Bar atas atau halaman Dashboard untuk akses cepat ke POS — dapat di-show/hide melalui konfigurasi user preference atau system setting
  • POS dapat diakses melalui URL path khusus handheld: /handheld/point-of-sales — route ini dioptimalkan untuk tampilan layar kecil (tablet/handheld)
  • Pada halaman Dashboard POS, tampilkan:
    • Tombol besar [+] Tambah Entry Transaksi Baru — mengarahkan ke halaman POS Transaction Entry
    • Tombol [×] Exit — mengembalikan user ke menu ERP utama
  • Gunakan layout full-screen tanpa sidebar ERP agar ruang transaksi maksimal
  • Implementasi session/context POS terpisah dari session Sales Order Existing

2. POS Transaction Entry

Halaman utama entry transaksi yang menampilkan form header, katalog produk, dan summary cart secara bersamaan dalam satu layar.

Detail Teknis — Form Header (kiri atas / atas):

  • Input field yang ditampilkan:

    FieldTipeMandatoryKeterangan
    Customer NameTextNoNama pembeli
    Phone NumberTextNoNomor HP pembeli
    Table NumberText / NumberNoNomor meja
    NotesTextareaNoCatatan header transaksi

Detail Teknis — Panel Katalog Produk:

  • Tampilkan panel katalog produk dengan grid card bergambar
  • Setiap card menampilkan: Product Image, Product Name, SKU, Unit Price, dan badge Available Stock
  • Di atas katalog, sediakan search field yang mendukung pencarian real-time berdasarkan:
    • Barcode (via input keyboard atau scanner USB/Bluetooth)
    • SKU
    • Nama Produk / Nama Menu
  • Filter katalog hanya menampilkan produk dengan nilai pos_available = TRUE (lihat bagian Backend
  • Saat scan barcode berhasil menemukan produk, produk langsung ditambahkan ke cart tanpa klik tambahan

Detail Teknis — Panel Summary Cart (side-by-side dengan katalog):

  • Tampilkan di sisi kanan (desktop) atau di bawah katalog (mobile/tablet) secara side-by-side responsif
  • Isi panel:
    • Daftar produk yang sudah dipilih: Nama, Qty, Harga Satuan, Subtotal per item
    • Tombol + / untuk ubah quantity langsung dari cart
    • Tombol hapus item (ikon trash)
    • Tombol Additional Notes per item — membuka modal input catatan per produk
    • Total Qty dan Subtotal sementara di bagian bawah panel
  • Data cart bersifat temporary (local storage / state management frontend), tidak disimpan ke database hingga proses payment selesai
  • Di bagian bawah halaman, tampilkan tombol besar → Lanjutkan Order yang aktif hanya jika minimal ada 1 item di cart

3. Shopping Cart & Checkout

Halaman review order sebelum pembayaran dilakukan.

Detail Teknis:

  • Tampilkan summary lengkap pesanan:
    • Nama Customer / Nomor Meja / Header Notes (jika diisi)
    • Daftar produk: Nama, Qty, Harga Satuan, Notes per item, Subtotal per item
    • Total Item, Total Qty
    • Subtotal, Diskon, Tax (label: include/exclude sesuai konfigurasi), Grand Total
  • Tombol ← Kembali ke Entry — kembali ke halaman Transaction Entry tanpa kehilangan data cart (state dipertahankan)
  • Tombol besar → Lanjutkan ke Pembayaran — mengarahkan ke halaman Payment Processing
  • Kalkulasi Grand Total dilakukan di sisi frontend secara real-time, menggunakan konfigurasi tax dari system setting

4. Payment Processing

Halaman pemilihan metode pembayaran dan proses submission transaksi.

Detail Teknis:

  • Tampilkan pilihan metode pembayaran:
    • Cash — alur manual dengan input nominal
    • Mock Payment Gateway (i.e. tombol Midtrans) — simulasi pembayaran digital (Debit/Credit Card, QRIS, E-Wallet); untuk Phase 1 cukup tombol saja tanpa integrasi real gateway
  • Alur Cash:
    1. Muncul input field: "Nominal Uang Diterima"
    2. Setelah input, sistem langsung menampilkan nilai kembalian secara real-time
    3. Validasi: nominal yang dimasukkan tidak boleh kurang dari Grand Total
  • Alur Mock Payment Gateway:
    1. Tampilkan tombol konfirmasi simulasi pembayaran berhasil
    2. Tidak ada integrasi API eksternal di Phase 1
  • Setelah pembayaran dikonfirmasi, tampilkan tombol Simpan & Cetak Resi:
    • Trigger submission data ke backend (create Sales Order)
    • Tampilkan modal / halaman cetak Resi Struk (ukuran struk kasir, ~58mm atau 80mm) berisi:
      • Header Struk (nama outlet, alamat — dari system config)
      • Nomor Transaksi POS & Tanggal
      • Daftar item: Nama, Qty, Harga
      • Subtotal, Diskon, Tax, Grand Total
      • Metode Pembayaran, Nominal Bayar, Kembalian
      • Footer Struk (pesan penutup — dari system config)
  • Setelah cetak/close resi, arahkan kembali ke POS Dashboard

Backend

1. Perubahan Skema Database

Tabel sales_order — tambah kolom baru:

KolomTipe DataNullableKeterangan
additional_property_1VARCHAR(500)YESHeader Notes dari POS
additional_property_2VARCHAR(100)YESNomor Meja (Table Number) untuk F&B
pos_payment_typeVARCHAR(50)YESMetode pembayaran: cash, debit, credit, qris, ewallet
pos_grandtotalDECIMAL(18,2)YESGrand Total transaksi POS
pos_payment_cashDECIMAL(18,2)YESNominal uang diterima (khusus Cash)
pos_payment_changeDECIMAL(18,2)YESKembalian (khusus Cash)
pos_subtotalDECIMAL(18,2)YESSubtotal sebelum pajak & diskon
pos_discountDECIMAL(18,2)YESTotal diskon
pos_tax_percentDECIMAL(5,2)YESPersentase pajak yang diterapkan
pos_tax_amountDECIMAL(18,2)YESNominal pajak
pos_tax_include_excludeVARCHAR(10)YESNilai: include atau exclude
source_transactionVARCHAR(20)YESNilai: POS untuk transaksi dari POS

Jika penambahan kolom langsung pada tabel sales_order tidak memungkinkan (constraint skema), buat tabel relasi terpisah sales_order_pos_detail dengan FK ke sales_order_id.

Tabel inventory / product_master — tambah kolom baru:

KolomTipe DataNullableDefaultKeterangan
pos_availableBOOLEANNOFALSEFlag produk tampil di katalog POS
  • Hanya produk dengan pos_available = TRUE dan status produk aktif yang dikembalikan oleh API katalog POS
  • Tambahkan field pos_available pada UI Product Master agar dapat dikonfigurasi per produk

2. API Endpoints (Contoh)

GET /api/pos/products — Ambil daftar produk untuk katalog POS

  • Query params: search (keyword: barcode / SKU / nama), page, limit
  • Filter otomatis: pos_available = TRUE AND status = active
  • Response per item: product_code, product_name, sku, barcode, unit_price, available_stock, image_url, notes
  • Implementasi pagination untuk performa pada katalog besar

POST /api/pos/transaction — Submit transaksi POS dan buat Sales Order

Request body:

{
"customer_name": "string",
"phone_number": "string",
"table_number": "string",
"header_notes": "string",
"items": [
{
"product_id": "string",
"qty": 1,
"unit_price": 0,
"discount": 0,
"notes": "string"
}
],
"pos_payment_type": "cash",
"pos_subtotal": 0,
"pos_discount": 0,
"pos_tax_percent": 0,
"pos_tax_amount": 0,
"pos_tax_include_exclude": "exclude",
"pos_grandtotal": 0,
"pos_payment_cash": 0,
"pos_payment_change": 0
}
  • Validasi: minimal 1 item, pos_grandtotal > 0, pos_payment_type tidak kosong
  • Untuk pembayaran Cash: validasi pos_payment_cash >= pos_grandtotal
  • Proses: buat Sales Order dengan source_transaction = 'POS', order_type = 'POS_CASH', status Approved
  • Response: sales_order_id, sales_order_number, status
  • Implementasi idempotency key pada header request untuk mencegah duplikasi transaksi akibat double-submit

GET /api/pos/config — Ambil konfigurasi sistem untuk POS

  • Response: tax_percent, tax_include_exclude, default_cost_center, receipt_header, receipt_footer, table_number_enabled

3. Business Rules & Validasi Backend

  • Nomor Sales Order mengikuti numbering existing (tidak ada sequence baru)
  • source_transaction = 'POS' wajib diset pada setiap SO yang dibuat dari POS
  • order_type = 'POS_CASH' wajib diset
  • Status SO langsung Approved setelah berhasil dibuat

4. System Configuration (Jika memungkinkan, nice-to-have)

Tambahkan konfigurasi berikut pada System Setting ERP:

KeyTipeKeterangan
pos_tax_percentDecimalDefault persentase pajak POS
pos_tax_include_excludeEnuminclude / exclude
pos_table_number_enabledBooleanAktifkan field Table Number (mode F&B)
pos_receipt_headerTextHeader teks pada struk cetak
pos_receipt_footerTextFooter teks pada struk cetak
pos_shortcut_button_visibleBooleanTampilkan shortcut POS di navbar/dashboard

Out of Scope (Phase 1)

  • Auto Create Shipment & Auto Confirm Shipment
  • Auto Inventory Deduction
  • Auto AR Invoice & Auto AR Payment
  • Auto GL Posting
  • Split Payment
  • Refund & Return Sales
  • Loyalty Program, Membership, Voucher & Promotion Engine
  • Payment Gateway Integration (real)
  • Mobile Native Application
  • Pre-Order & Delivery Order
  • Transaksi Kredit

Acceptance Criteria

  • Menu POS dapat diakses melalui sidebar dan URL /handheld/point-of-sales oleh user dengan hak akses POS
  • Halaman Dashboard POS menampilkan tombol Tambah Transaksi dan tombol Exit
  • Kasir dapat menambahkan produk via scan barcode, search SKU, search nama produk, dan katalog bergambar
  • Katalog hanya menampilkan produk dengan pos_available = TRUE dan status aktif
  • Quantity dan item dapat diubah/dihapus sebelum checkout; data cart tidak hilang saat kembali ke halaman entry
  • Catatan per item (Additional Notes) dapat diinput melalui modal
  • Halaman Checkout menampilkan summary lengkap termasuk data customer, item, dan kalkulasi total
  • Ringkasan transaksi (Subtotal, Diskon, Tax, Grand Total) dihitung otomatis
  • Metode pembayaran wajib dipilih sebelum transaksi disubmit
  • Sistem menghitung dan menampilkan kembalian secara real-time untuk pembayaran tunai
  • Setelah pembayaran, resi struk dapat ditampilkan dan dicetak
  • Setelah submit, Sales Order terbuat otomatis dengan source_transaction = 'POS', order_type = 'POS_CASH', status Approved
  • Kolom POS pada tabel Sales Order terisi dengan benar sesuai data transaksi
  • Tidak terjadi duplikasi transaksi meski terjadi double-submit
  • Tampilan responsif di Desktop, Tablet, dan Mobile Browser

Referensi

BRD: BRD_POS.docx