FloCafe
FloCafe is the free, local-first restaurant POS in the FloPOS ecosystem. Run orders, tables, kitchen display, and local data without a software subscription.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Papan TV 16:9 "Ranking Jastiper": semua jastiper diurutkan dari belanja terbesar per nomor HP, dalam
dua kolom yang mengalir sebagai satu daftar (kolom kanan melanjutkan kolom kiri, berhenti sejenak di
peringkat 1), plus "Juara sementara" di kanan atas. Data dibaca dari Postgres (warehouse),
Google Sheet per brand (satu folder Drive) dan opsional Jubelio,
digabung per nomor HP di server, lalu halaman TV polling /api/state.
Postgres ─┐
Folder Drive ┼─► server (Node) ─ gabung per nomor HP ─► /api/state ─► public/index.html (TV)
(Sheet brand)│ poll tiap POLL_MS, simpan data terakhir yang berhasil
Jubelio ───┘
0812…, 62812…, +62 812… dianggap nomor yang sama, dari sumber mana pun.***********24) dikenali dari nama + 2 digit terakhir, dan tampil
sebagai xxxx-xxxx-xx24. Pembeli tersamar digabung ke pembeli Sheet brand yang nomornya berakhiran sama
dan nama depannya sama, kalau hanya ada satu yang cocok.0812-xxxx-7890) di server; nomor lengkap tidak pernah dikirim ke browser.#cek dan /healthz.Butuh Node.js 20.12+.
cp .env.example .env # isi data koneksi database dan DRIVE_FOLDER
npm install
npm start # http://localhost:3000
Atau semua sekaligus dengan Postgres contoh: docker compose up --build.
Repo ini siap untuk Vercel (vercel.json):
public/./api/state dilayani Vercel Function api/state.js; /healthz di-rewrite ke function yang sama.
Logikanya di server/api.js, memakai kode yang sama dengan server Node (server/).sin1 (Singapura), dekat dengan database.npm test; deploy batal kalau tes gagal.Langkah:
martech-sys/IMPERPECT-SALES-2026. Framework Preset
Other; pengaturan build lain sudah diambil dari vercel.json, tidak perlu diubah.https://<project>.vercel.app/healthz → 200 artinya minimal satu sumber terbaca.Bedanya dengan server Node: di Vercel sumber data dibaca saat ada request (bukan timer), paling sering
sekali per CACHE_SECONDS per instance, dan hasil /api/state di-cache di CDN Vercel selama
CACHE_SECONDS. Setelah itu CDN tetap langsung menjawab dengan ranking terakhir sambil
memperbarui di belakang layar (stale-while-revalidate, juga saat function error), jadi TV tidak
menunggu function yang baru menyala membaca ulang semua Sheet brand. Jadi berapa pun TV yang membuka halaman, database dibaca paling sering sekali per
CACHE_SECONDS. Kalau satu sumber gagal, data terakhirnya hanya bertahan selama instance function masih
hangat.
Kalau belum ada sumber data yang terbaca, /healthz menjawab 500 beserta daftar variabel yang diterima
deploy (terisi/kosong, tanpa nilainya) dan alasan tiap sumber dilewati.
Tambahkan #cek di URL (http://localhost:3000/#cek) untuk melihat jumlah baris valid / dilewati per sumber.
we_data_store)Langkah menyambungkan papan ke tabel laporan_penjualan. Password database cukup diisi di .env
(lokal) dan di Vercel; jangan dikirim lewat chat atau di-commit.
Minta DBA membuat user khusus papan yang hanya bisa membaca satu tabel. Lebih aman, dan bebannya terbatas:
CREATE ROLE imperfect_tv LOGIN PASSWORD 'ganti-password-kuat' CONNECTION LIMIT 5;
GRANT CONNECT ON DATABASE we_data_store TO imperfect_tv;
GRANT USAGE ON SCHEMA public TO imperfect_tv; -- ganti public kalau tabelnya di schema lain
GRANT SELECT ON laporan_penjualan TO imperfect_tv;
ALTER ROLE imperfect_tv SET statement_timeout = '20s';
Sementara belum ada, user read-only yang dipakai OFFLINE-STORE / data-db juga bisa (secrets
DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME di repo itu).
Pilih salah satu cara. Kalau keduanya terisi, DATABASE_URL yang dipakai.
a. Variabel terpisah (disarankan, terutama kalau password banyak tanda bacanya). Password ditulis apa adanya, tanpa encode:
DATABASE_HOST=1.2.3.4
DATABASE_PORT=5432
DATABASE_USER=imperfect_tv
DATABASE_PASSWORD='Rh#4s!a/9?q@x:%20'
DATABASE_NAME=we_data_store
Di .env, selalu apit password dengan kutip tunggal. Tanpa kutip, # di posisi mana pun dibaca
sebagai awal komentar: DATABASE_PASSWORD=Rh#4s hanya terbaca Rh. Kalau password sendiri memuat
kutip tunggal, pakai kutip ganda ("..."). Di Vercel tidak perlu kutip: tempel apa adanya di kolom
nilai.
b. Satu DATABASE_URL.
postgres://USER:PASSWORD@HOST:5432/we_data_store
Tanda baca di password harus di-encode (# → %23, / → %2F, ? → %3F, @ → %40,
: → %3A, % → %25, dst.). Supaya tidak salah, biarkan komputer yang meng-encode. Perintah ini
meminta password tanpa menampilkannya dan tidak menyimpannya di riwayat shell:
read -rs PW && PW="$PW" node -e 'console.log(encodeURIComponent(process.env.PW))'; unset PW
Lainnya:
This is the beginning of the README. Read the rest at the original. Read the full README ↗