Papicode
FREEPHP

Aplikasi POS (Point of Sale) untuk Coffee Shop

Gabung Saluran WhatsApp Papicode

Update source code terbaru langsung ke HP kamu, nggak pakai spam.

Deskripsi

Aplikasi kasir (POS) khusus coffee shop: dari transaksi kasir, manajemen menu & variant/add-on, stok bahan baku dengan resep otomatis, shift kasir, cetak struk thermal, sampai laporan penjualan semua dalam satu sistem terintegrasi. Dibangun sepenuhnya dengan PHP Native (arsitektur MVC buatan sendiri, tanpa Laravel/framework lain, tanpa Node.js sebagai backend), untuk kebutuhan operasional satu coffee shop (bukan produk SaaS, tanpa multi-tenant, tanpa skema langganan). Mencakup seluruh siklus transaksi harian mulai dari buka shift, transaksi kasir dengan variant & add-on, pengurangan stok otomatis berbasis resep, sampai tutup shift dengan rekonsiliasi kas, lengkap dengan role-based access control (Admin/Manager/Cashier) dan sistem printer thermal yang persisten lintas halaman.

Sistem

Admin mendaftarkan kategori dan produk menu lengkap dengan foto, harga, variant (misalnya Size/Temperature/Sugar), dan add-on/topping, serta mengatur resep (BOM) bahan baku per produk di menu Inventory & Recipes. Setiap hari kasir wajib membuka shift dengan mengisi modal kas awal sebelum bisa memproses transaksi apa pun. Di halaman POS, kasir memilih produk lewat product grid yang bisa difilter berdasarkan kategori/pencarian/ketersediaan secara real-time, memilih variant & add-on lewat modal konfigurasi, lalu menambahkannya ke keranjang lengkap dengan diskon, pajak, dan service charge yang terhitung otomatis. Order bisa di-hold untuk dilayani nanti dan di-recall kembali. Saat pembayaran (Cash/QRIS/Debit/Credit/E-Wallet) diselesaikan, sistem membuat nomor transaksi otomatis (format CS-YYYYMMDD-XXXXX), menyimpan seluruh detail transaksi dalam satu database transaction (BEGIN/COMMIT/ROLLBACK) sehingga jika stok bahan baku tidak mencukupi, seluruh transaksi dibatalkan tanpa data setengah jadi lalu stok bahan baku otomatis berkurang sesuai resep produk yang terjual. Struk dapat langsung dicetak ke printer thermal 58mm/80mm lewat koneksi Web Bluetooth atau Local Print Bridge yang tersambung persisten selama sesi browser, tidak perlu connect ulang setiap pindah halaman. Di akhir hari, kasir menutup shift dengan memasukkan uang fisik hasil hitungan, dan sistem otomatis menghitung selisih terhadap kas yang seharusnya. Admin memantau semuanya lewat Dashboard real-time, riwayat transaksi dengan filter & cetak ulang struk, serta Report Center untuk ekspor laporan ke CSV.

Fitur

  • Report Center 7 jenis laporan (sales, produk, kategori, pembayaran, kasir, shift, inventory)
  • Export laporan ke CSV asli (dibuat murni dengan PHP)
  • Manajemen user dengan role Admin/Manager/Cashier (RBAC diperiksa di server, bukan cuma UI)
  • Reset password oleh Admin
  • Pengaturan coffee shop: nama, logo, alamat, pajak, service charge, currency, ukuran kertas struk
  • Dark mode & light mode dengan CSS variables, preferensi tersimpan di localStorage
  • Responsive penuh: desktop, tablet kasir, dan mobile
  • PWA: bisa di-install, manifest & service worker untuk cache asset (transaksi tetap butuh koneksi server)
  • Database backup: download file .sql lengkap (struktur + data) langsung dari browser
  • Keamanan: CSRF token, escaping XSS, prepared statement PDO (anti SQL injection), validasi upload, session aman (httponly, regenerate ID saat login)
  • Kasir/POS dengan product grid, pencarian & filter real-time tanpa reload
  • Manajemen produk lengkap dengan upload gambar (validasi MIME asli, bukan hanya ekstensi)
  • Manajemen kategori menu
  • Variant produk configurable (Size/Temperature/Sugar, dll) — tidak di-hardcode
  • Add-on/topping dengan harga sendiri, bisa dipasangkan ke produk manapun
  • Keranjang transaksi dengan diskon, pajak, dan service charge otomatis
  • Hold order & recall order untuk melayani banyak customer bergantian
  • Dine In (nomor meja) & Take Away dengan nama customer opsional
  • Pembayaran Cash (dengan hitung kembalian otomatis), QRIS, Debit, Credit, E-Wallet
  • Nomor transaksi otomatis format CS-YYYYMMDD-XXXXX
  • Database transaction aman (BEGIN/COMMIT/ROLLBACK) — transaksi gagal total jika stok tidak cukup
  • Struk thermal 58mm/80mm, bisa cetak ulang (reprint) dari riwayat transaksi
  • Printer service abstraction: Web Bluetooth (BLE) + Local Print Bridge untuk printer non-BLE
  • Koneksi printer persisten lintas halaman, status CONNECTED/DISCONNECTED jelas di topbar
  • Riwayat transaksi dengan filter tanggal, kasir, tipe order, metode pembayaran, dan pencarian
  • Shift kasir: buka/tutup dengan rekonsiliasi kas otomatis (expected vs actual cash)
  • Manajemen inventory bahan baku: stock in/out/adjustment dengan riwayat pergerakan stok
  • Resep/BOM per produk — stok bahan baku otomatis berkurang sesuai resep saat terjual
  • Peringatan stok menipis (low stock alert) di Dashboard & Inventory
  • Pengaturan Allow Negative Stock (opsional, default tidak diizinkan)
  • Dashboard real-time: sales 7 hari, penjualan per kategori, metode pembayaran (chart vanilla JS)
  • Top selling products & recent transactions berbasis data asli

Panduan Instalasi

Instalasi deengan XAMPP

  1. Copy folder coffeshop ke C:\xampp\htdocs\coffeshop (atau lokasi htdocs Anda).
  2. Jalankan Apache dan MySQL dari XAMPP Control Panel.
  3. Buka phpMyAdmin, buat database baru bernama coffee_pos (atau biarkan kosong — file SQL sudah membuat database-nya sendiri), lalu import database/database.sql. Atau via terminal: mysql -u root < database/database.sql
  4. Edit config/database.php jika kredensial MySQL Anda berbeda dari default XAMPP (root tanpa password).
  5. Karena XAMPP menyajikan seluruh folder project (bukan hanya public/), set base_path di config/app.php menjadi path ke folder public, contoh:
    'base_path' => '/coffeshop/public',
    
  6. Akses aplikasi di http://localhost/coffeshop/public/login

Alternatif (lebih rapi): buat Virtual Host Apache yang document root-nya langsung ke coffeshop/public, lalu base_path cukup ''.

Instalasi dengan Laragon

  1. Copy folder coffeshop ke C:\laragon\www\coffeshop.
  2. Laragon otomatis membuat virtual host coffeshop.test. Pastikan document root Laragon mengarah ke public/ (Laragon mendukung auto-detect public/ sebagai web root untuk banyak project PHP modern — jika tidak, buat custom site dengan document root coffeshop/public).
  3. Start Laragon (Apache + MySQL).
  4. Import database: buka HeidiSQL bawaan Laragon atau terminal mysql -u root < database/database.sql.
  5. Sesuaikan config/database.php bila perlu.
  6. Jika document root sudah langsung ke public/, set base_path di config/app.php menjadi ''.
  7. Akses http://coffeshop.test/login

Menjalankan dengan PHP Built-in Server (development cepat)

php -S 127.0.0.1:8000 -t public public/router.php

public/router.php hanya dipakai untuk built-in server (agar asset statis tetap ter-serve dengan benar). Tidak dipakai oleh Apache. Set base_path ke ''. Akses http://127.0.0.1:8000/login.

Konfigurasi Database

Edit config/database.php:

return [
    'driver'   => 'mysql',
    'host'     => '127.0.0.1',
    'port'     => '3306',
    'database' => 'coffee_pos',
    'username' => 'root',
    'password' => '',
    'charset'  => 'utf8mb4',
];

Kredensial database TIDAK pernah tampil ke browser — file ini dilindungi .htaccess (deny all) dan berada di luar public/.

Konfigurasi Aplikasi

config/app.php berisi:

  • env: development (menampilkan error detail) atau production (menyembunyikan error, log ke storage/logs/app.log)
  • base_path: subfolder aplikasi jika tidak di root domain
  • upload: path folder upload, ukuran maksimal, tipe file yang diizinkan

Login Default (Seed Data)

Semua akun seed memakai password yang sama: password123

username : admin, manager, cashier

Catatan: aplikasi ini memakai MySQL sebagai database, sehingga wajib menjalankan langkah import skema di atas sebelum bisa digunakan. Untuk fitur cetak struk lewat printer thermal Bluetooth, gunakan browser Chrome/Edge (Web Bluetooth API tidak didukung Firefox/Safari); untuk printer non-Bluetooth-LE, gunakan mode Local Print Bridge yang sudah dijelaskan lengkap di halaman Printer Settings & README.md. Kredensial login default hanya untuk keperluan development segera ganti password lewat menu Users setelah instalasi di lingkungan production.