Afteroffice Studio EN
ENTRI 013 Plat lipat

Kasir yang tetap jalan waktu internet mati

Sepiring POS

Sistem kasir Android untuk restoran yang bekerja penuh tanpa internet, mencetak struk ke printer termal, dan menyinkronkan datanya belakangan.

CapacitorKotlinReactTypeScriptPostgreSQLExpress

Masalahnya

Restoran tidak bisa berhenti melayani hanya karena internet putus. Tapi kasir yang sepenuhnya offline juga tidak berguna kalau pemiliknya tidak pernah bisa melihat laporan dari luar. Keduanya harus jalan sekaligus.

Alur penggunanya

  1. Staf masuk dengan PIN, membuka shift, dan mulai menerima pesanan — semuanya dari database di dalam tablet itu sendiri.
  2. Pesanan dibayar tunai atau terbagi ke beberapa metode, lalu struk dan tiket dapur dicetak ke printer termal lewat Bluetooth.
  3. Shift ditutup, dan sistem menghitung sendiri berapa uang tunai yang seharusnya ada di laci.
  4. Pelanggan yang memindai QR di meja bisa memesan sendiri dari ponselnya, dan pesanan itu masuk ke antrean kasir yang sama.

Yang dibangun

Aplikasi React di dalam Capacitor dengan dua plugin Kotlin yang saya tulis sendiri: satu untuk mencetak ESC/POS lewat Bluetooth Classic, satu lagi untuk SQLite native. Di belakangnya ada PostgreSQL dan API Express yang saya jalankan sendiri, bukan layanan pihak ketiga.

Arsitektur

Tablet Capacitor · SQLite lokal
Printer Bluetooth · ESC/POS
Self-order QR meja · ponsel tamu
Express API sync engine
PostgreSQL multi-tenant

Bagian yang sulit

Printer termal Bluetooth tidak didukung Web Bluetooth, jadi tidak ada jalan pintas lewat browser — plugin native harus ditulis. Dan pencetakannya tidak bisa dianggap berhasil sebelum diuji ke perangkat fisik sungguhan.

Hasilnya

  • Alur kasir lengkap berjalan offline penuh: login, buka shift, pesan, bayar, cetak, tutup shift, laporan harian.
  • Pencetakan diverifikasi di printer termal fisik, bukan hanya di emulator.
  • Pemesanan mandiri lewat QR berjalan di production, dan restoran kedua sudah dibuat lewat dashboard oleh pemiliknya sendiri.
  • Pembaruan aplikasi dikirim sendiri tanpa melalui toko aplikasi, dan tidak pernah diterapkan di tengah shift.

Yang belum selesai

Belum ada alur persetujuan manajer untuk selisih kas, diskon, atau pembatalan — siapa pun yang login bisa melakukannya. Refund juga baru bisa untuk satu pesanan penuh, belum per item. Keduanya sudah tercatat sebagai pekerjaan berikutnya.

Peran saya

Product, arsitektur, aplikasi, plugin native, backend, dan operasional.

Dicatat oleh
Ihsan Nugraha
Diperiksa
6 Agu 2026, 17.17 WIB
Cara verifikasi
Klik URL mana pun di halaman ini
Dicatat oleh