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 Postingmenyusul 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
- Tombol besar
- 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:
Field Tipe Mandatory Keterangan Customer Name Text No Nama pembeli Phone Number Text No Nomor HP pembeli Table Number Text / Number No Nomor meja Notes Textarea No Catatan 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 Orderyang 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 nominalMock 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:
- Muncul input field: "Nominal Uang Diterima"
- Setelah input, sistem langsung menampilkan nilai kembalian secara real-time
- Validasi: nominal yang dimasukkan tidak boleh kurang dari Grand Total
- Alur Mock Payment Gateway:
- Tampilkan tombol konfirmasi simulasi pembayaran berhasil
- 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:
| Kolom | Tipe Data | Nullable | Keterangan |
|---|---|---|---|
additional_property_1 | VARCHAR(500) | YES | Header Notes dari POS |
additional_property_2 | VARCHAR(100) | YES | Nomor Meja (Table Number) untuk F&B |
pos_payment_type | VARCHAR(50) | YES | Metode pembayaran: cash, debit, credit, qris, ewallet |
pos_grandtotal | DECIMAL(18,2) | YES | Grand Total transaksi POS |
pos_payment_cash | DECIMAL(18,2) | YES | Nominal uang diterima (khusus Cash) |
pos_payment_change | DECIMAL(18,2) | YES | Kembalian (khusus Cash) |
pos_subtotal | DECIMAL(18,2) | YES | Subtotal sebelum pajak & diskon |
pos_discount | DECIMAL(18,2) | YES | Total diskon |
pos_tax_percent | DECIMAL(5,2) | YES | Persentase pajak yang diterapkan |
pos_tax_amount | DECIMAL(18,2) | YES | Nominal pajak |
pos_tax_include_exclude | VARCHAR(10) | YES | Nilai: include atau exclude |
source_transaction | VARCHAR(20) | YES | Nilai: POS untuk transaksi dari POS |
Jika penambahan kolom langsung pada tabel
sales_ordertidak memungkinkan (constraint skema), buat tabel relasi terpisahsales_order_pos_detaildengan FK kesales_order_id.
Tabel inventory / product_master — tambah kolom baru:
| Kolom | Tipe Data | Nullable | Default | Keterangan |
|---|---|---|---|---|
pos_available | BOOLEAN | NO | FALSE | Flag produk tampil di katalog POS |
- Hanya produk dengan
pos_available = TRUEdan status produk aktif yang dikembalikan oleh API katalog POS - Tambahkan field
pos_availablepada 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 = TRUEANDstatus = 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_typetidak kosong - Untuk pembayaran Cash: validasi
pos_payment_cash >= pos_grandtotal - Proses: buat Sales Order dengan
source_transaction = 'POS',order_type = 'POS_CASH', statusApproved - 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 POSorder_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:
| Key | Tipe | Keterangan |
|---|---|---|
pos_tax_percent | Decimal | Default persentase pajak POS |
pos_tax_include_exclude | Enum | include / exclude |
pos_table_number_enabled | Boolean | Aktifkan field Table Number (mode F&B) |
pos_receipt_header | Text | Header teks pada struk cetak |
pos_receipt_footer | Text | Footer teks pada struk cetak |
pos_shortcut_button_visible | Boolean | Tampilkan 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-salesoleh 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 = TRUEdan 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