All projects
Web·2023

Sistem Order Lokal: Kasir Digital untuk UMKM Tanpa Biaya Server

PythonFastAPISQLiteHTML

Tidak semua bisnis butuh cloud. Beberapa cukup butuh sistem yang berjalan di laptop mereka sendiri, bisa diakses dari HP kasir, dan tidak memerlukan biaya server bulanan. Proyek ini adalah jawaban dari pertanyaan sederhana: bagaimana cara membuat sistem order yang murah, mudah digunakan, dan tetap bisa diandalkan?

Latar Belakang

Ide ini muncul ketika saya masih di perkuliahan. Saya sering melihat pemilik bisnis menengah, mulai dari pemilik kafe kecil hingga pedagang warung, yang masih mengelola pesanan dan stok secara manual: catatan di buku, order lewat WhatsApp, atau sekadar ingatan kepala kasir. Tidak ada sistem pencatatan, tidak ada data historis, dan tidak ada cara untuk melihat pola penjualan.

Bukan berarti tidak ada solusi di pasaran. Banyak aplikasi POS dan kasir yang bagus. Masalahnya adalah biaya berlangganan bulanan, kebutuhan koneksi internet yang stabil, dan setup yang tidak sederhana menjadi beban tambahan bagi bisnis yang margin-nya sudah tipis.

Pertanyaannya: bisakah dibuat sistem yang cukup andal untuk bisnis menengah, tanpa biaya cloud, tanpa langganan, dan bisa berjalan di perangkat yang sudah mereka miliki?

Untuk Siapa Sistem Ini

Sistem ini cocok untuk:

  • Pemilik kafe atau kedai yang ingin mengontrol order dari meja kasir
  • Pedagang kaki lima atau warung kelontong yang ingin mencatat pemasukan harian
  • Teknisi atau developer yang ingin template sistem kasir siap pakai dan bisa dikustomisasi
  • Anak-anak yang ingin membantu orang tua mengelola bisnis dengan sistem sederhana

Fitur utama yang tersedia: pencatatan order, kontrol stok, pencatatan pemasukan, dan analisis pola penjualan per periode.

Tiga Skenario Penggunaan

Bergantung pada perangkat yang tersedia, sistem ini bisa dijalankan dalam tiga konfigurasi berbeda.

Skenario 1: Monolith di Laptop

Laptop berfungsi sebagai server sekaligus interface. Cocok untuk satu kasir yang beroperasi di satu tempat, tanpa perlu koneksi WiFi.

[Laptop Kasir]
  ├── FastAPI server  ──>  http://localhost:8000
  ├── SQLite database       tersimpan di disk lokal
  └── Browser lokal   ──>  tampilan order dan stok

Seluruh sistem berjalan dalam satu mesin. Tidak ada koneksi keluar, tidak ada dependensi eksternal. Kasir membuka browser di laptop yang sama dengan server.

Skenario 2: Laptop sebagai Server, HP sebagai Interface

Laptop dijalankan oleh pemilik atau admin sebagai backend server. HP kasir mengakses antarmuka melalui browser menggunakan IP lokal WiFi yang sama.

[WiFi Router Lokal]
        |
        |-- [Laptop - Server]
        |       ├── FastAPI (bind ke IP WiFi lokal)
        |       ├── SQLite database
        |       └── IP: 192.168.1.100:8000
        |
        |-- [HP Kasir]          [HP Owner/Admin]
                Browser               Browser
                → 192.168.1.100:8000  → 192.168.1.100:8000
                  input order           pantau real-time

Semua data yang diinput dari HP kasir tersimpan di laptop server. Pemilik bisa memantau transaksi secara real-time dari laptop yang sama.

Skenario 3: Full Berjalan di Termux (Hanya HP)

Jika yang tersedia hanya HP tanpa laptop, sistem bisa dijalankan langsung di HP menggunakan Termux, emulator terminal untuk Android.

[HP Android + Termux]
  ├── pkg install python git
  ├── git clone <repo>
  ├── pip install -r requirements.txt
  ├── python main.py
  └── Browser HP → http://localhost:8000
        └── Interface berjalan lokal di HP itu sendiri

Tidak perlu perangkat tambahan. Server dan interface berjalan di HP yang sama. Setiap kali data dirasa terlalu besar, tersedia fitur arsip untuk meringankan penyimpanan.

Struktur Folder

app/
├── backend/
│   ├── api/
│   │   ├── orders.py           # endpoint pencatatan order
│   │   ├── customers.py        # endpoint data pelanggan
│   │   ├── products.py         # endpoint stok produk
│   │   └── archive.py          # endpoint arsip data lama
│   ├── web/
│   │   ├── pages.py            # routing halaman HTML via FastAPI
│   │   └── templates/          # template Jinja2
│   ├── services/
│   │   ├── order_service.py    # logika bisnis order
│   │   ├── archive_service.py  # logika pengarsipan data
│   │   └── report_service.py   # laporan dan analisis penjualan
│   ├── repositories/
│   │   ├── order_repo.py       # query SQLite untuk order
│   │   └── customer_repo.py    # query SQLite untuk pelanggan
│   ├── models/                 # definisi struktur data
│   ├── schemas/                # validasi input dan output API
│   └── main.py                 # entry point FastAPI
│
├── frontend/
│   └── static-app/             # halaman HTML statis
│       ├── index.html          # dashboard utama
│       ├── orders.html         # halaman order
│       ├── js/
│       └── css/
│
├── core/
│   ├── domain/                 # logika bisnis inti, bebas framework
│   └── utils/                  # fungsi helper
│
└── data/
    ├── app.db                  # file SQLite database
    └── archives/               # data arsip periode sebelumnya

Keputusan Teknis

SQLite sebagai database. Tidak perlu PostgreSQL atau MySQL yang harus dikonfigurasi terpisah. SQLite adalah satu file di disk: portabel, zero-setup, dan lebih dari cukup untuk skala UMKM dengan ratusan transaksi per hari. Data tetap tersimpan di server apapun skenario yang dipakai.

FastAPI sebagai backend. Cepat dikembangkan, dokumentasi API otomatis, validasi input bawaan via Pydantic, dan berjalan lancar di Termux. Untuk bisnis yang tidak butuh skalabilitas cloud, ini adalah keseimbangan tepat antara kecepatan pengembangan dan performa runtime.

Frontend statis berbasis template HTML. Ringan dan tidak bergantung pada framework JavaScript besar. Bisa dibuka di browser HP entry-level sekalipun, tanpa delay render yang berarti. Halaman dikontrol dari sisi server menggunakan Jinja2.

Export ke Excel dan fitur arsip. Data bisa diekspor ke format Excel kapan saja untuk keperluan laporan. Untuk skenario Termux di HP, arsip berkala tersedia agar penyimpanan tidak penuh seiring berjalannya waktu.

Keterbatasan

Sistem ini bukan untuk skala enterprise dan bukan pengganti sistem POS berbasis cloud penuh. Beberapa keterbatasan yang perlu diketahui:

  • Tidak ada sinkronisasi antar lokasi. Jika bisnis punya dua cabang berbeda jaringan, data tidak tersinkron secara otomatis.
  • Backup manual. SQLite hanya file biasa, jadi backup harus dilakukan secara eksplisit atau dijadwalkan sendiri.
  • Termux memiliki batasan performa. Untuk volume transaksi sangat tinggi, HP mungkin menjadi bottleneck dibandingkan laptop.

Trade-off ini disengaja. Kompleksitas yang rendah berarti maintenance yang rendah juga. Untuk bisnis satu lokasi dengan volume transaksi moderat, sistem ini sudah lebih dari cukup.

Next Step

Pada saat ini saya belum share repo secara public, buat next time, saya akan buat repo secara open source.