Operasional Kasir Toko (Point of Sale / POS)
Modul Kasir POS melayani transaksi ritel cepat baik pada terminal desktop/laptop kasir toko web maupun perangkat smartphone kasir lapangan (Android Mobile POS).
1. Diagram Alur Siklus Sesi Kasir & Rekonsiliasi Kas
Setiap kasir bekerja dalam siklus sesi kerja (Cash Session) yang ketat untuk mencegah kebocoran uang kas fisik:
2. Membuka Shift Kasir (CashSession)
Sebelum dapat melayani pelanggan, kasir wajib membuka sesi kerja:
- Buka menu Penjualan > Kasir POS.
- Pilih Mesin Kasir (
CashRegister) yang berada di cabang tempat kasir bertugas. (Catatan: Satu mesin kasir hanya dapat digunakan oleh 1 sesi aktif dalam satu waktu). - Masukkan Modal Awal Kasir (
openingFloat): Uang pecahan kecil yang disediakan toko untuk uang kembalian pelanggan (misal: Rp 200.000). - Klik Buka Sesi (Open Session).
3. Melakukan Transaksi Penjualan
A. Memasukkan Produk ke Keranjang
- Pemindai Barcode: Arahkan scanner ke barcode produk atau kemasan grosir. Produk otomatis masuk ke keranjang belanja dengan kuantitas bertambah 1 per pemindaian.
- Pencarian Nama / SKU: Ketik minimal 2 karakter pada kotak pencarian cepat di bagian atas layar kasir.
- Katalog Kategori: Klik tombol kategori (misal: Minuman Dingin) untuk melihat grid foto produk.
B. Pemberian Diskon & Batas Wewenang (PosDiscountPolicy)
Kasir dapat memberikan diskon per baris barang (persentase atau nominal rupiah) serta diskon total nota belanja.
Sistem membatasi diskon maksimal yang dapat diinput oleh kasir biasa (misalnya maksimal 5%). Jika kasir memasukkan diskon 15%, sistem menampilkan modal verifikasi otorisasi Supervisor/Manajer Toko untuk memasukkan PIN/Password persetujuan.
C. Metode Pembayaran & Penyelesaian Transaksi
Sistem mendukung metode pembayaran majemuk (Split Payment):
- Tunai (CASH): Kasir memasukkan nominal uang yang diserahkan pelanggan. Sistem secara otomatis menghitung dan menampilkan nilai uang kembalian (change due).
- QRIS Dinamis / Statis: Pelanggan memindai QR Code pembayaran.
- Kartu Debit / Kredit (EDC): Kasir menginput nomor referensi atau nomor slip mesin EDC perbankan.
- Transfer Bank: Pelanggan mentransfer ke rekening perusahaan.
4. Mekanisme Penentuan & Pengambilan Stok Gudang Kasir
Pada operasional ritel toko, kecepatan dan kepastian lokasi fisik pemotongan persediaan adalah faktor paling krusial. Sistem menerapkan pemotongan stok terpadu dan atomik yang terikat langsung pada terminal fisik tempat kasir bertransaksi.
A. Lokasi Stok Mesin Kasir (CashRegister.stockLocation)
- Konfigurasi Wajib Mesin Kasir:
Setiap terminal atau mesin kasir (
CashRegister) terikat pada sebuah kantor cabang (branch_id) dan wajib memiliki konfigurasi lokasi stok pengeluaran barang (stock_location_id). - Hanya Lokasi Fisik Riil:
Lokasi pengeluaran kasir harus berupa lokasi fisik toko bertipe
WAREHOUSE(Gudang/Toko) atauRACK(Rak/Pajangan). Sistem secara ketat melarang lokasi virtual sebagai lokasi pengeluaran kasir (akan ditolak dengan kode validasi galatPOS_INVALID_ISSUE_LOCATION). - Keterikatan Sesi Kasir (
CashSession): Saat kasir membuka shift, transaksi kasir yang tercipta otomatis terikat pada mesin kasir aktif tersebut. Kasir tidak perlu (dan tidak diperkenankan) memilih gudang asal secara manual di setiap transaksi, sehingga mengeliminasi risiko kesalahan input oleh staf kasir.
B. Pemotongan Stok Instan & Atomik (Single-Phase Fulfillment)
Berbeda dengan penjualan grosir (Sales Order B2B) yang memerlukan verifikasi bertahap (status Ready lalu Deliver), pada transaksi kasir POS:
- Saat pembayaran diselesaikan lunas (
checkout,completeOrder, atausettleOrder), sistem backend memanggil layanansalesOrderService.confirmForPos(orderId, issueLocationId)di manaissueLocationId = register.getStockLocation().getId(). - Sistem secara otomatis dan langsung menerbitkan dokumen logistik
StockPickingOUTGOING (bertipeSALES):- Lokasi Asal:
register.stockLocation(Lokasi fisik mesin kasir). - Lokasi Tujuan:
VIRTUAL-CUSTOMER. - Stage Picking: Langsung disahkan ke tahap
Donesecara atomik dalam satu transaksi basis data yang sama dengan penerbitan struk.
- Lokasi Asal:
- Saldo fisik barang di rak kasir langsung berkurang seketika di kartu stok (
StockLedger) tanpa memerlukan tindakan konfirmasi kirim tambahan dari tim gudang.
C. Penanganan Produk Resep / Menu Racikan (recipe / BOM Expansion)
Untuk toko kuliner, kafe, atau gerai ritel yang menjual produk racikan:
- Jika produk yang dijual bertipe resep (
recipe/ Bill of Materials), sistem tidak memotong stok induk produk (karena induk adalah produk menu/virtual), melainkan secara otomatis melakukan ekspansi resep (BundleComponent). - Seluruh bahan baku penyusunnya langsung dipotong secara proporsional dari lokasi stok fisik kasir yang sama (
issueLocationId). - Contoh: Menjual 1 cangkir "Kopi Susu Gula Aren" akan langsung memotong Biji Kopi (20 gr), Susu UHT (150 ml), dan Gula Aren (25 ml) dari rak/bar kasir tersebut.
D. Pengecekan Saldo & Validasi Stok Minus (OnHandService)
- Sebelum pemotongan disahkan, sistem memanggil
OnHandServiceuntuk memverifikasi ketersediaan saldo dengan kalkulasi Roll-up Subtree (menghitung ketersediaan di lokasi kasir beserta seluruh sub-rak atau sekat penyimpanan di bawahnya). - Jika pada master produk diatur
allowNegativeStock = falsedan persediaan fisik tidak mencukupi, transaksi kasir langsung ditolak demi mencegah terjadinya saldo negatif pada pembukuan.
5. Keabsahan Struk Belanja (PosReceipt) & Hash SHA-256
Setelah pembayaran diterima, sistem menerbitkan struk belanja resmi (PosReceipt):
- Keamanan Anti-Pemalsuan Hash SHA-256: Setiap data struk ditandatangani secara kriptografis menggunakan algoritma SHA-256 yang merangkum nomor urut struk, ID register, waktu timestamp, daftar item, dan total nominal. Kode hash pendek dicetak di bagian bawah struk fisik.
- Cetak Struk Termal: Struk dikirim ke printer thermal POS (kertas 58mm atau 80mm via USB, LAN, atau Bluetooth).
- Audit Cetak Ulang (Reprint Counter): Jika struk dicetak ulang, sistem mencetak tanda peringatan "DUPLICATE / REPRINT KE-[X]" pada kertas struk demi mencegah penyalahgunaan klaim nota ganda oleh oknum pelanggan.
- Prosedur Pembatalan Struk (Void Receipt) & Pembatasan Wewenang:
- Untuk mencegah tindak manipulasi keuangan (fraud), staf kasir (
CASHIER) sama sekali tidak memiliki akses untuk membatalkan atau mem-void struk yang telah diterbitkan. - Pembatalan struk resmi (
POST /api/pos/receipts/:id/void) wajib diotorisasi oleh Supervisor Toko (POS_ADMIN) atau Administrator Perusahaan (ADMIN_TENANT). - Saat pembatalan disetujui, status struk berubah menjadi
Void, barang dagangan otomatis dikembalikan ke saldo kartu stok rak kasir, dan alasan pembatalan tersimpan permanen di catatan audit.
- Untuk mencegah tindak manipulasi keuangan (fraud), staf kasir (
6. Tutup Kasir & Rekonsiliasi Kas (Cash Reconciliation)
Di akhir jam kerja, kasir melakukan serah terima uang fisik:
- Klik tombol Tutup Sesi Kasir (Close Session) di pojok kanan atas layar POS.
- Hitung seluruh uang kertas dan koin fisik yang ada di dalam laci kasir (Cash Drawer).
- Masukkan total uang riil tersebut pada kolom Uang Fisik Kasir (
actualCash). - Sistem secara instan menampilkan perbandingan rekonsiliasi:
Expected Cash = Modal Awal + Total Kas Masuk - Kas Refund Retur
Variance (Selisih) = actualCash - Expected Cash
Variance == 0: Kas seimbang sempurna (Perfect Match).Variance < 0(Tekor / Shortage): Uang fisik di laci kurang dari catatan komputer. Kasir wajib menginput catatan penjelasan sebelum menutup sesi.Variance > 0(Surplus): Uang fisik di laci lebih banyak dari catatan komputer.
- Klik Konfirmasi Tutup Sesi. Jika ada selisih kas (variance != 0), supervisor toko (
POS_ADMIN) akan memeriksa dan memberi verifikasi persetujuan sebelum sesi dikunci permanen dan jurnal akuntansi diterbitkan.
7. Matriks Pembagian Wewenang Kasir vs Supervisor Toko (CASHIER vs POS_ADMIN)
Dalam operasional toko fisik harian, sistem membagi peran meja kasir dan pengawasan secara tegas demi keamanan finansial dan kelancaran pelayanan:
| Tanggung Jawab Operasional Toko | Staf Kasir (CASHIER) | Supervisor / Kepala Toko (POS_ADMIN) | SOP & Prosedur Sistem di Lapangan |
|---|---|---|---|
| Halaman Awal Saat Login (Landing Page) | Layar Kasir (/pos) | Beranda Dashboard (/) | Kasir langsung diarahkan ke terminal penjualan tanpa distraksi; akses Dashboard ringkasan eksekutif diblokir (403). Supervisor dapat memantau ringkasan metrik toko di Beranda. |
| Buka Shift & Input Modal Awal | ✅ | ✅ | Kasir memilih mesin kasir (CashRegister) di cabang tugasnya dan mengisi uang pecahan modal awal. |
| Keterikatan Sesi Mandiri (Session Lock) | ✅ Khusus Sesi Sendiri | ✅ | Transaksi penjualan hanya dapat diproses oleh kasir pembuka sesi (session.cashier_id). Kasir lain tidak dapat memproses penjualan pada sesi rekannya. |
| Pelayanan Penjualan & Cetak Struk | ✅ | ✅ | Scan barcode item, terima pembayaran tunai/non-tunai, dan cetak nota belanja ber-hash SHA-256. |
| Cetak Ulang Struk (Reprint) | ✅ | ✅ | Kasir berhak mencetak ulang nota jika kertas macet, dengan penanda otomatis watermark peringatan DUPLICATE REPRINT. |
| Diskon Reguler (Sesuai Plafon) | ✅ | ✅ | Kasir dapat memberikan diskon per baris atau total nota selama tidak melampaui plafon kebijakan toko (misal: maks 5%). |
| Otorisasi Diskon Khusus / Melebihi Plafon | ❌ (Butuh Otorisasi) | ✅ (Bisa Mengesahkan) | Jika diskon melampaui plafon kasir, sistem mengunci formulir hingga supervisor memasukkan PIN/kredensial persetujuan. |
| Pembatalan / Void Struk Belanja | ❌ (Ditolak Sistem) | ✅ (Wewenang Khusus) | Hanya POS_ADMIN yang dapat membatalkan nota belanja resmi (/void). Kasir dilarang membatalkan nota yang sudah terbit. |
| Verifikasi Tutup Shift dengan Selisih Kas | ⚠️ Wajib Beri Catatan | ✅ Verifikasi & Setujui | Kasir wajib menghitung uang fisik laci; jika tekor/lebih, supervisor toko memeriksa dan memberikan pengesahan penutupan sesi. |
| Konfigurasi Mesin Kasir & Lokasi Stok | ❌ | ✅ | Mengatur master terminal kasir (CashRegister) dan menetapkan lokasi rak gudang toko pengeluaran barang. |
| Pemantauan Margin Laba Harian Cabang | ❌ | ✅ (/reports/daily-profit) | Supervisor toko berhak memantau tren margin laba kotor harian cabang tugasnya untuk mengevaluasi kinerja shift. |
| Hak Menghapus Data (Delete Privilege) | ❌ (Zero Delete) | ❌ Master / ✅ Transaksi | Kasir sama sekali tidak memiliki hak hapus (DELETE) pada seluruh data sistem demi menjamin jejak audit keuangan. |