Anda butuh aplikasi kasir untuk toko sendiri atau untuk klien, dan membangunnya dari nol jelas memakan waktu berbulan-bulan. Masalahnya, di internet ada puluhan source code POS Laravel dengan demo yang mirip-mirip. Bagaimana membedakan yang benar-benar siap dipakai bisnis nyata dari yang hanya bagus di tangkapan layar?
Alih-alih menyusun peringkat produk yang subjektif dan cepat basi, artikel ini memberi Anda sepuluh kriteria yang bisa dipakai untuk menilai source code kasir mana pun pada 2026. Setiap kriteria disertai alasan teknis dan cara mengeceknya, ditambah desain tabel, langkah instalasi lokal, dan batasan yang perlu Anda ketahui.
Masalah yang Diselesaikan Aplikasi Kasir
Aplikasi kasir menggantikan nota tulis tangan dan rekap manual di buku. Transaksi tercatat otomatis, stok berkurang sendiri setiap kali barang terjual, dan laporan laba bisa dilihat tanpa menghitung ulang. Karena berbasis web, aplikasi POS Laravel juga memudahkan akses dari beberapa cabang dan integrasi dengan payment gateway. Jika konsep dasarnya masih baru bagi Anda, baca dulu apa itu aplikasi kasir dan cara kerjanya.
10 Kriteria Source Code POS Laravel yang Layak Dipakai
- Manajemen produk, stok, dan varian yang lengkap. Produk dengan ukuran atau rasa berbeda harus punya stok sendiri per varian. Cek di demo: tambah satu varian, jual, lalu lihat apakah stok varian itu saja yang berkurang.
- Riwayat pergerakan stok. Stok yang hanya berupa satu angka tanpa riwayat menyulitkan audit. Source code yang baik mencatat setiap penjualan, pembelian, dan penyesuaian di tabel terpisah.
- Laporan penjualan dan laba yang bisa difilter per periode. Laba hanya akurat jika harga modal disimpan saat transaksi, bukan dibaca dari harga modal terbaru.
- Multi-user dengan hak akses. Minimal ada peran kasir, admin, dan owner. Kasir tidak boleh menghapus transaksi atau mengubah harga.
- Cetak struk dan dukungan printer thermal. Tanyakan ukuran kertas yang didukung (58 mm atau 80 mm) dan cara cetaknya, apakah lewat dialog print browser atau aplikasi perantara.
- Manajemen diskon. Diskon per item dan per transaksi sebaiknya tercatat terpisah agar laporan bisa menunjukkan berapa omzet yang hilang karena promo.
- Pembayaran digital. Untuk UMKM, dukungan pencatatan QRIS dan e-wallet penting, minimal sebagai metode bayar yang bisa dipilih kasir sehingga rekap kas dan non-tunai terpisah.
- Kartu member. Fitur pelanggan terdaftar membantu retensi dan memberi data siapa pembeli yang paling sering kembali.
- Kesiapan multi-outlet. Jika bisnis berencana membuka cabang, pastikan tabel stok dan transaksi punya kolom outlet sejak awal. Menambahkannya belakangan jauh lebih sulit.
- Dokumentasi dan pembaruan berkala. Panduan instalasi, file
.env.example, dan riwayat versi menunjukkan proyek dirawat. Laravel versi lama tanpa jalur upgrade adalah utang teknis.
Desain Tabel yang Perlu Anda Cari
Kriteria nomor 2 dan 3 paling mudah dicek dengan membuka folder migrasi. Struktur minimal yang sehat kira-kira seperti ini:
CREATE TABLE sales (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
outlet_id BIGINT UNSIGNED NOT NULL,
cashier_id BIGINT UNSIGNED NOT NULL,
invoice_no VARCHAR(30) NOT NULL UNIQUE,
payment_method VARCHAR(20) NOT NULL,
discount DECIMAL(12,2) NOT NULL DEFAULT 0,
total DECIMAL(12,2) NOT NULL,
created_at TIMESTAMP NULL,
INDEX (outlet_id, created_at)
);
CREATE TABLE sale_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sale_id BIGINT UNSIGNED NOT NULL,
variant_id BIGINT UNSIGNED NOT NULL,
qty INT NOT NULL,
price DECIMAL(12,2) NOT NULL,
cost_price DECIMAL(12,2) NOT NULL
);
CREATE TABLE stock_movements (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
outlet_id BIGINT UNSIGNED NOT NULL,
variant_id BIGINT UNSIGNED NOT NULL,
type ENUM('sale','purchase','adjustment','transfer') NOT NULL,
qty INT NOT NULL,
reference VARCHAR(40) NULL,
created_at TIMESTAMP NULL,
INDEX (variant_id, outlet_id)
);
Perhatikan kolom cost_price di sale_items. Tanpa kolom ini, laporan laba bulan lalu akan berubah setiap kali harga modal diperbarui. Dengan data seperti di atas, laporan laba per periode cukup satu query:
$laba = SaleItem::query()
->join('sales', 'sales.id', '=', 'sale_items.sale_id')
->whereBetween('sales.created_at', [$dari, $sampai])
->selectRaw('SUM(sale_items.qty * (sale_items.price - sale_items.cost_price)) AS laba_kotor')
->value('laba_kotor');
Uji Pengurangan Stok Saat Dua Kasir Bersamaan
Di toko dengan dua kasir atau lebih, dua transaksi bisa mengambil barang terakhir di detik yang sama. Source code yang kurang hati-hati akan membuat stok menjadi minus. Cari di kode transaksi apakah pengurangan stok dibungkus transaksi database dan memakai penguncian baris, kira-kira seperti ini:
DB::transaction(function () use ($cart, $outletId) {
foreach ($cart as $line) {
$stock = Stock::where('variant_id', $line['variant_id'])
->where('outlet_id', $outletId)
->lockForUpdate()
->firstOrFail();
if ($stock->qty < $line['qty']) {
throw new RuntimeException('Stok tidak cukup');
}
$stock->decrement('qty', $line['qty']);
}
// simpan sales, sale_items, dan stock_movements di sini
});
Jika seluruh proses gagal di tengah jalan, misalnya printer error setelah stok berkurang, transaksi database memastikan semua perubahan dibatalkan sehingga data tetap konsisten.
Perbandingan Tingkat Kesiapan
| Tingkat | Ciri-ciri | Cocok untuk |
|---|---|---|
| Dasar | Transaksi, produk, laporan sederhana, satu user | Belajar atau toko sangat kecil |
| Siap UMKM | Varian, hak akses, struk thermal, diskon, metode bayar | Toko atau kafe satu lokasi |
| Siap tumbuh | Riwayat stok, multi-outlet, member, laporan laba akurat | Bisnis yang berencana buka cabang |
Cara Menjalankan di Lokal untuk Evaluasi
- Pasang PHP 8.2+, Composer, MySQL, dan Node.js. Panduan lengkapnya ada di setup environment PHP, Composer, dan MySQL.
- Ekstrak source code, jalankan
composer install. - Salin
.env.exampleke.env, isi koneksi database, laluphp artisan key:generate. - Jalankan
php artisan migrate --seeduntuk data contoh. - Jalankan
npm install && npm run buildbila ada asset frontend. - Login sebagai kasir, buat sepuluh transaksi campuran dengan diskon, lalu login sebagai owner dan cocokkan laporannya dengan hitungan manual.
Langkah keenam adalah ujian paling jujur. Jika angka laporan tidak cocok dengan hitungan Anda di kertas, lebih baik ketahuan sebelum dipakai di toko.
Kustomisasi yang Aman
Simpan versi asli di Git sebelum mengubah apa pun. Tambah kolom lewat migrasi baru, jangan mengedit migrasi lama yang sudah dijalankan. Ubah tampilan struk di file Blade, bukan di logika transaksi. Untuk perubahan besar seperti menambah multi-outlet pada aplikasi yang belum mendukungnya, rencanakan migrasi data dan uji di salinan database. Panduan detailnya ada di cara kustomisasi source code tanpa merusak.
Kesalahan Umum Saat Memilih
- Hanya menilai dari tampilan. UI bisa diganti dalam hitungan hari; desain tabel yang salah butuh berminggu-minggu untuk diperbaiki.
- Tidak menguji struk dengan printer asli. Cetak dari browser sering bermasalah dengan margin dan ukuran kertas.
- Mengabaikan lisensi. Pastikan Anda boleh memasang untuk klien atau beberapa toko sebelum membayar.
Checklist Sebelum Membeli
- [ ] Demo kasir dan admin bisa dicoba langsung
- [ ] Versi Laravel dan PHP masih didukung
- [ ] Stok per varian dan ada riwayat pergerakan stok
- [ ] Harga modal disimpan di item transaksi
- [ ] Peran kasir, admin, owner dibedakan
- [ ] Struk thermal sudah diuji dengan ukuran kertas Anda
- [ ] Dokumentasi instalasi dan .env.example tersedia
- [ ] Lisensi dan cakupan dukungan teknis tertulis jelas
Batasan yang Perlu Diketahui
Instalasi dasar bisa dilakukan tanpa keahlian mendalam, tetapi kustomisasi tetap membutuhkan pemahaman Laravel. Integrasi langsung dengan perangkat keras tertentu, misalnya timbangan digital, biasanya tidak tersedia dan perlu dibangun sendiri. Anda juga bertanggung jawab atas hosting, backup, dan keamanan server. Jika ingin melihat contoh untuk diuji dengan kriteria di atas, katalog GudangCode memuat beberapa source code POS Laravel.