Aplikasi kasir
Makano POS
Aplikasi kasir web untuk tablet yang tetap jalan saat internet mati: katalog, keranjang, shift kas, struk thermal, dan laporan — semuanya dari satu perangkat, dengan sinkron ke cloud ketika koneksi kembali.
Masalah
Warung ayam crispy ini mencatat penjualan secara manual. Waktu yang paling dirugikan bukan saat ramai, melainkan saat menghitung ulang di akhir hari: total penjualan per shift, uang kas yang seharusnya ada, dan menu apa yang paling laku harus direkap dari catatan tangan. Pemilik juga tidak punya cara cepat untuk tahu penjualan minggu lalu tanpa membuka buku.
Kendala lapangannya nyata. Tablet kasir dipakai di meja yang sinyalnya tidak selalu bagus, dapur dan kasir berbagi satu ruangan yang ramai, dan operatornya bukan orang teknis. Aplikasi tidak boleh berhenti bekerja hanya karena internet hilang, dan tidak boleh menuntut langkah yang rumit untuk mencatat satu porsi ayam.
Peran & batasan
Saya merancang sekaligus membangun aplikasi ini sendiri — dari struktur basis data, alur layar, sampai proses deploy. Batasannya: satu tablet Android sebagai perangkat utama, printer struk thermal yang sudah ada, dan tanpa server yang perlu dirawat. Karena itu semua data ditulis lebih dulu ke perangkat, lalu disinkronkan ke cloud di belakang layar.
Solusi
- Offline-first, bukan "offline sekadar tampil". Basis data SQLite hidup di perangkat (di browser berjalan di atas IndexedDB) dan menjadi sumber kebenaran. Kasir mencatat pesanan tanpa menunggu jaringan; sinkron ke Cloudflare D1 terjadi belakangan.
- Alur kasir dua panel — katalog per kategori di kiri, keranjang di kanan — dengan pilihan Dine In / Take Away, agar satu pesanan bisa selesai tanpa berpindah layar.
- PIN, bukan kata sandi. Kasir masuk dengan 4 digit, owner dengan 6 digit, disimpan sebagai hash PBKDF2 — bukan teks biasa. Ada pantauan PIN bawaan agar pemilik didorong menggantinya.
- Shift & kas. Kasir membuka shift dengan kas awal, aplikasi menghitung total penjualan, kas yang seharusnya ada, dan selisih kas saat shift ditutup.
- Struk thermal disusun sebagai perintah ESC/POS lewat wrapper printer tersendiri, sehingga penggantian metode cetak tidak menyentuh kode kasir.
- Laporan dan riwayat untuk owner, termasuk pengelolaan menu, backup/restore data, dan ekspor rekap ke Excel.
Tantangan & keputusan
Keputusan paling berpengaruh adalah menaruh SQLite sebagai sumber kebenaran dan membiarkan antarmuka hanya menyimpan state sesi. Setiap transaksi menulis ke basis data lebih dulu, baru memperbarui tampilan — jadi tidak ada pesanan yang "hilang karena tab ditutup".
Sinkronisasi antarperangkat lewat D1 adalah bagian yang paling sulit dan belum sepenuhnya tuntas: ada kasus operasi yang tertunda saat offline hilang setelah halaman dimuat ulang, dan potensi duplikasi nomor order saat dua perangkat menulis bersamaan. Adaptasi grafik dan printer juga menuntut pendekatan berbeda di web dibanding aplikasi Android asli. Saya memilih mencatatnya sebagai pekerjaan yang tersisa, bukan menutupinya.
Hasil
Aplikasi berjalan di pos-makano.pages.dev dan dipakai untuk mencatat penjualan harian. Rekap yang dulu dikerjakan manual di akhir hari sekarang terbaca dari aplikasi: total per shift, selisih kas, dan menu terlaris. Karena data tersimpan lokal, kasir tetap bisa bekerja ketika koneksi bermasalah.
Pelajaran
Menulis fitur offline lebih dekat ke kerja sistem terdistribusi daripada ke kerja antarmuka. Bagian tersulit bukan membuat kasir bisa menjual tanpa internet, tetapi memastikan dua perangkat tidak saling menimpa data ketika keduanya baru kembali online — dan itu pelajaran yang saya bawa ke proyek berikutnya.