Kaki POS · redesign · operator

Every counter screen, one floor

The whole operator side of the POS, redesigned on the approved Floor + Schedule direction. It covers the web POS at pos.kakiapp.co/pos/*, which is primary, and notes where the Kaki POS app (Expo) differs. Every screen sits in a landscape iPad frame because that is the counter tablet. A few native phone variants come at the end. Tap the tables, pay methods, timeline blocks and state switches to try them. All names and figures are sample data.

01 · Masuk

Sign-in and choosing the counter

Operators sign in with a USERNAME that the owner set, and owners sign in with email. An operator's account has no real inbox (the synthetic address ends in .invalid), so there is no "Lupa kata sandi" for them. The owner resets their password from Lokasi.

/Web + Appapp: /sign-in

Masuk ke Kaki POS

One field that accepts a username or an email. The web has Owner/Operator tabs today and the app has a single field that relabels itself, so the redesign keeps the app's single field and puts it on both. The "Lupa kata sandi?" link only appears once the input reads as an email. Switch the states to see errors.

KosongUsernameSalah sandiServer lambatSudah masuk

Masuk ke Kaki POS

Pemilik masuk dengan email. Kasir masuk dengan username dari pemilik.

/pos?location=Web + Appapp: /choose-venue

Pilih lokasi, "Di kasir mana Anda?"

This only shows when the account can reach more than one venue, which is how owners work (Mahjong Dojo has seven). An operator is bound to one venue and goes straight to Hari ini. A remembered venue that is no longer on the account is REFUSED and named back, never swapped for another one. Otherwise money would be taken on the wrong till.

DaftarLokasi ditolakTidak ada lokasiGagal memuat

Di kasir mana Anda?

Tablet ini akan mengingat pilihan Anda sampai ada yang keluar.

1
Mahjong Dojo Winbardi
Lembang, Bandung · 8 meja · Buka s/d 01:00
Buka
2
Mahjong Dojo Dago
Dago, Bandung · 6 meja
Tutup
3
Mahjong Dojo x Shooters
Buka 11:00 – 02:00 · lewat tengah malam
Buka

Keluar · Dashboard pemilik

/pos/* (layout)Web + App

Shell gates: no access, session expired, account menu

The layout decides who may enter the POS: an owner of the venue or its operator. The account menu under the staff monogram holds Ganti lokasi (owners), Dashboard pemilik, Bagikan link booking, and Keluar. Signing out ends this till's shift: the app asks twice, and the redesign asks twice on the web too.

Mahjong Dojo Winbardi · Rab, 23 Sep

Hari ini

Akses ditolak

Akun agus@gmail.com bukan pemilik atau kasir di venue ini. POS hanya untuk staf venue.

Sesi Anda berakhir

Masuk lagi sebelum menagih. Pembayaran yang sedang berjalan tidak dibatalkan.

SR
Sari Rahma
Kasir · Mahjong Dojo Winbardi
Bagikan link booking
Ganti lokasi
Pemilik saja
Dashboard pemilik
Pemilik saja
Keluar mengakhiri shift di kasir ini. Kasir berikutnya harus masuk sendiri.
02 · Hari ini

The counter screen: who is coming, who owes

Live mode opens here (/pos/pos/arrivals). It lists the day's bookings grouped by what the counter must do next, a strip of the floor right now, unpaid holds pinned in red, and the tables held at the counter. Red on this screen means only one thing: money that has not arrived.

/pos/arrivalsWeb + Appapp: /(counter)/today

Hari ini

Groups, in order: Di meja sekarang, Berikutnya · 18 menit lagi, Nanti hari ini, Selesai, tidak ada yang mencatat, Sudah datang, Tidak datang. A booking whose hour arrived and whose party has not checked in reads "Belum datang", never "Main". Every row shows its money state and its check-in state as two separate chips, because a booking's status is never the same word as its payment. Switch the top segment to see the floor grouped by table kind.

  • Row actions: Sudah datang (check in), Tagih / Tampilkan QR, Tandai tidak datang (asks first), Lepas meja N (no refund, asks first), Email, Pesan di aplikasi. "Buka tab" on a booking card is behind BOOKING_CARD_HANDOFF_ACTIONS_ENABLED=false.
  • A disabled action says why: "Tidak ada email di akun", "Duduk di kasir, tidak punya akun aplikasi".
KedatanganDenah per jenis meja
Mahjong Dojo Winbardi · Hari ini · Rab, 23 Sep · 19:41

Hari ini

Buka · tutup 01:00
Dibooking11
Belum dibayarRp 120.000
Di meja sekarang4 / 8
Sudah datang5
KedatanganDenah
8 meja · 4 main · 2 kosong · 1 ditahan · 1 belum bayarTabJadwalCheck-inTransaksiPeringkat
Belum dibayar · Meja 7 · mulai 19:30Dewi belum membayar Rp 120.000. Meja lepas sendiri 19:45.

Di meja sekarang

19:003 jam
Andi +3 · Meja 3KK7Q4M · Aplikasi · Chinese
Belum datang · 41 mnt
17:36tab
Agus +3 · Meja 1Walk-in · buka tab di kasir
Tab berjalan · Rp 126.000

Berikutnya · 18 menit lagi

19:302 jam
Dewi +1 · Meja 7KK3F9A · Web · dewi.p@gmail.com
Belum dibayarBelum check-in
20:00held
Ditahan: Rina · Meja 6Ditahan di kasir 19:25–21:25 · bukan booking, tidak ada uang

Nanti hari ini

21:302,5 jam
Sari +3 · Meja 5KK8P2Z · Web
21:302,5 jam
Putri +3 · Meja 2KK9H1E · Aplikasi
23:003 jam
Hendra +3 · Meja 7KK6N3T · Kasir · tanpa biaya
Tanpa biaya

Selesai, tidak ada yang mencatat

15:002 jam
Lina +3 · Meja 8KK1X7C · lunas · tidak di-check-in
/pos/arrivals · statesWeb + App

Hari ini: loading, failed, empty, write failed, demo

A failed read is never shown as an empty day. A failed WRITE says exactly that nothing changed. A demo build names itself and points to the Floor, never inventing bookings.

MemuatGagal memuatKosongAksi gagalJenis meja tak dimuatMode demo
Mahjong Dojo Winbardi · Hari ini · Rab, 23 Sep

Hari ini

Jam buka belum dimuat

Memuat kedatangan hari ini…

BookingDetailSheetWeb + App

Detail booking

This is opened by booking ID and re-read on every poll, so it never says "belum dibayar" after the payment landed. Sections: Kapan, Siapa, Uang, Cara booking. Only one money control shows at a time: Tagih, Tampilkan QR, or Tagih tetap (when comped, with a confirm). A cancelled booking shows "Pulihkan", or names why it cannot be restored (day over, a released hold, the slot sold since). Booking codes are case-sensitive, and the sheet says so.

LunasTanpa pembayaranTanpa biayaDibatalkan

Hari ini

Booking

Andi +3

Kapan
Tanggal
Rab, 23 Sep
Jam
19:00–22:00 · 3 jam
Meja
Meja 3 · Chinese
Kursi
Seluruh meja (4)
Siapa
Nama
Andi Wijaya
Email
andi.w@gmail.com
Catatan
Tidak ada catatan
Uang
Status
Dibayar
Rp 180.000
Cara booking
Kode
KK7Q4M
Sumber
Aplikasi Kaki
Dibuat
Sen, 21 Sep 14:02

Kode booking membedakan huruf besar dan kecil.

BookingQrDialog · POST /operator/bookings/:id/collectWeb + App

Tagih booking: QRIS on an existing booking

Modes are collect and resume. Closing keeps the QR live. A live QR can be cancelled and replaced. The day-over guard allows last night's table for 60 minutes after it ends. Refusals are named: already paid, collection in progress, comped, nothing to collect, booking not live, source not collectable, gateway failed.

KonfirmasiMenungguSudah ada QRLunasHari lewat
7

Tagih booking Dewi

KK3F9A · Meja 7 · 19:30–21:30

Rp 120.000

+ biaya QRIS · QR dibuat lewat gateway pembayaran

BlockDialog · BlockSlotDialog · POST/DELETE /venues/:id/blackoutsWebApp: not built

Tahan meja for a walk-in, and blocking a slot

Hold a table for a named walk-in for N hours, so online customers cannot book it. The rounding rule is the owner's own example: 07:25 + 2 jam blocks slots 7, 8 AND 9. Past close is refused, a span that runs over close is clamped (and the dialog says so), midnight never wraps, and "24 jam" is refused. "Blokir slot" can close one table or the whole venue. A whole-venue hold cannot be released from a row. The app does not read blocks at all.

Tahan mejaDipotong jam tutupKembalikan ke penjualan
6

Tahan Meja 6

Mulai sekarang, 19:25

Berapa lama?
Menahan slot 19, 20 dan 21 (19:25–21:25). Slot 21:00 ikut ditahan karena masih ada orang di meja sampai 21:25.
ReinstateDialog · POST /operator/bookings/:id/reinstateWebApp: none

Pulihkan booking

This brings a cancelled booking back and restores its list price. If the hour has been sold since (409 slot_taken), it moves to a "pick a new time" step, which runs the same three-source check. The done state says whether the customer was told.

PulihkanSudah terjualSelesai

Pulihkan booking ini

KK5M4R · Budi +3 · Kam 24 Sep 16:00 · Meja 2 · Rp 60.000

03 · Denah

The floor, the bill, and every way money leaves a table

This is the approved direction. Each table is a tile, and tapping one opens its bill on the right. The floor is the only screen that can settle an OPEN TAB or close one without charging, so it must never be hidden while tabs exist. Today POS_UNREADY_NAV_ENABLED=false hides Tab and Open play on the web, and the app has no Denah at all.

/pos/floorWebApp: NotBuilt

Denah + tagihan

Tile states: Main (open tab, felt green, running clock and total), Segera selesai (red: 10 minutes or less left, or overtime), Datang (booked, hour arrived, not checked in: gold edge), Belum bayar (unpaid hold, red chip), Kosong (until the next booking), Ditahan (block, hatched), and Tab lama (open 24 hours or more: gold warning, never auto-selected). The tile also shows the table kind (Chinese / Riichi saja). Tap any table.

  • The bill shows the /quote figure, never the raw meter. When the quote cannot load: "Tagihan belum bisa dihitung, jangan tagih di mesin kartu dulu."
  • A promo code only works with QRIS. On Tunai and Kartu the field locks with a reason.
  • Kartu / e-wallet settle on the venue's OWN terminal (net to Kaki 0). Only QRIS goes through Kaki.
Mahjong Dojo Winbardi · Rab, 23 Sep · 19:41

Denah

Semua 8Chinese 4Riichi saja 4
Main 3Segera 1Datang 1Kosong 1
Meja 4 selesai 6 menit lagiBudi +3 · rencana 3 jam
6Ditahan
Ditahan untuk Rina
19:25–21:25 · slot 19, 20, 21
/pos/floor · /pos/schedule → WalkinDialogWebApp: none

Walk-in: seat a party, open a live tab

Pick a table (only free tables that may host the chosen style are enabled: a Riichi-only table never takes Hong Kong or ITM, and an unclassified table takes anything), the game format, party size and the planned duration from the venue's ladder (only rungs the rules allow, capped by close and by the next booking). The rate shown comes from the price config, never an invented figure. It opens a TAB: no booking row, billed on close.

Mahjong Dojo Winbardi · 19:41

Denah

Walk-in

Membuka tab langsung. Dibayar saat meja ditutup.

Meja
Jumlah orang
Format
HanchanEast-onlySanma
Meja 5 hanya untuk Riichi. Hong Kong dan ITM ada di meja Chinese.
Rencana durasi
Hanya pengingat. Tab tetap dihitung per jam penuh sampai ditutup.
Membuka tab · Meja 5 · s/d 21:41Rp 60.000 / jam
WalkinDialog · 409 table_booked / table_busyWeb

Bentrok kursi: the POS warns, it never blocks

Owner decision: staff are never blocked, only never surprised. table_booked asks once and re-sends with override:true. table_busy means another open tab already sits on that table, and it cannot be overridden.

Dibooking (bisa lanjut)Ada tab (ditolak)
!

Meja 5 dibooking Sari jam 21:30

Tab 2 jam akan berjalan sampai 21:41, bentrok 11 menit dengan booking KK8P2Z. Kalau yang datang memang Sari, check-in booking-nya saja.

POST /operator/sessions/:id/extend · POST /operator/bookings/:id/extendWebApp: none

Perpanjang: a tab adds an hour, a booking re-quotes the whole span

An open tab extends by +1 jam (it is only a countdown, because a tab bills on close). A booking extension first asks for a PREVIEW quote: the API re-prices the WHOLE span, because tiers change (Sen–Kam half price, peak hours, the trading night after midnight), and charges the difference. Only the added tail is claimed, through the single three-source check. When the next booking is in the way, staff may "Perpanjang tetap", but they must type why. Price-lock reasons (already paid, collection in progress, comped, quote unavailable) are named, never silent.

Tab +1 jamBooking: harga ulangBentrok: alasanHarga terkunci
4

Perpanjang tab Meja 4

Budi +3 · rencana 3 jam, s/d 19:47

Pengingat pindah ke 20:47. Tab tetap dihitung per jam penuh saat ditutup, jadi tidak ada tagihan sekarang.
PaymentDialog · POST /operator/sessions/:id/closeWeb + App

Pembayaran tab: QRIS, Tunai, Kartu

QRIS mints a QR through the payment gateway and polls until it is paid, expires or is cancelled. Kartu and e-wallet are the venue's own terminal, so the POS only records them (manual:true). Tunai does not exist in the code today: the close route accepts only qris / ewallet / card. It is in the approved direction, so it is designed here and flagged as an API gap. Switch states:

QRIS menungguQR kedaluwarsaBatalkan QR?Kartu / e-walletTunaiDitolakQR uji
2

Tagih Meja 2

QRIS · semua bank & e-wallet

Rp 91.000

Tagihan meja Rp 90.000 · termasuk biaya QRIS Rp 1.000

 Menunggu pembayaran · berakhir dalam 14:32

ReceiptDialogWeb + App

Struk: paid, table freed

The receipt names the method and whether the money came through Kaki (QRIS) or the venue terminal. The web shares by WhatsApp (receiptWhatsAppHref, a real link since the dead button was fixed), and the app has no share at all. Only actions that really do something are shown.

Lunas

lewat QRIS · 19:52 · Meja 2 · Rudi +3

Sesi meja · 1 jamRp 60.000
Teh tarik ×2Rp 30.000
Biaya QRISRp 1.000
TotalRp 91.000
Meja 2 kosong lagi dan bisa dijual.
POST /operator/sessions/:id/cancelWebApp: none

Tutup tanpa menagih

This is for a forgotten tab or a party that left. The refusals stay distinct: payment_pending means void the QR first, and already_paid means this is a refund, not a cancel. A tab left open never ages out, and its table is unsellable at the counter for as long as it stays open.

7

Tutup Meja 7 tanpa menagih?

Tab dibuka 11 Sep 17:10 · 12 hari 22 jam

Meter menunjukkan Rp 24.720.000, dan angka ini hampir pasti salah: tab dengan umur segini biasanya lupa ditutup. Tidak ada uang yang ditagih.
Kenapa? (wajib)
Tidak bisa dibatalkan. Kalau ada QR yang belum selesai di meja ini, batalkan dulu lewat Tagih. Kalau sudah dibayar, ini refund, bukan pembatalan.
SessionAlerts (every /pos screen)WebApp: none

Alarm waktu habis: toasts, flash, sound bar

A red toast appears when an open tab or a booking reaches its end (at 10 minutes left, at 0, and in overtime). The tile flashes and a tone plays. Sound only exists after a real tap, and the sound bar tells the truth about it. After a reload it asks for one tap. It never claims "Suara aktif" over a locked audio context. A reload SHOWS every standing alarm but does not ring them again. Demo builds render no booking alarms. An iPad's hardware mute switch silences the tone, and the page cannot detect it, so the bar reminds the staff.

Suara aktifPerlu satu ketukanSuara mati
Mahjong Dojo Winbardi · 19:47

Hari ini

Suara alarm aktif. Pastikan tombol bisu iPad tidak menyala.
19:002 jam
Andi +3 · Meja 3Lunas · belum datang
20:003 jam
Tomo +3 · Meja 1Lunas
Waktu Meja 4 habis

Budi +3 · lewat 2 menit · Rp 180.000 berjalan

Meja 1 selesai 10 menit lagi

Booking Tomo +3 · s/d 20:00 · lunas

04 · Jadwal · FITUR BARU

Tonight on one timeline

The owner asked for this. Today's /pos/schedule is a time-ordered LIST of bookings, today's tabs and holds, with a source filter (Semua / Web / App / Walk-in). The new Jadwal draws one row per table with every source of occupancy on one line: bookings (paid, unpaid-hold, not-arrived), open tabs, open-play tables and blocks. It has a red now-line that scrolls itself into view, :30 starts exactly on the half hour, and a trading night that runs past midnight. Tap a block for its detail card. Tap empty space to start a walk-in, a booking or a block. The list view stays available as the "Daftar" toggle, so nothing the list does today is lost.

/pos/scheduleBARU: timelineWebApp: daftar 14 hari saja

Jadwal: tables × hours

Rows are the venue's bookable tables (venues.table_count, never venue_tables), grouped and filterable by mahjong kind. The grid runs from opening to the last START plus its longest rung, so a venue closing at 01:00 still shows the 00:00–02:00 booking. The now-line scrolls to about one third of the width when the screen opens and follows the clock. Tap any block, or tap an empty span. A new-span ghost turns red and shows the seat-conflict warning when it overlaps.

  • Paid booking: Check-in, Pindah jadwal, Perpanjang, Tandai tidak datang, Batalkan.
  • Unpaid hold (red): shows the 15-minute hold countdown, with Tagih (QRIS), Tampilkan QR and Lepas meja.
  • Not arrived (gold edge): the hour has come and nobody checked in. It is never shown as "in play".
  • Open tab: Tagih & tutup, Perpanjang, Tutup tanpa menagih. A tab has no booking code and no QR-on-booking.
  • Open play: seats filled, with a link to Open play. Block: Lepas tahanan, or open a walk-in for that person.
Mahjong Dojo Winbardi · 8 meja · buka 11:00 · mulai terakhir 01:00

Jadwal

Hari ini · Rab, 23 Sep
TimelineDaftar
Semua mejaChineseRiichi saja
1 belum bayarMasih ditahan: 1Open play 21:00 · 2/4 · belum dapat meja
/pos/schedule?date=2026-09-23 (00:35)BARU

Lewat tengah malam: the trading night

At 00:35 on Wednesday, "today" on the till is still Tuesday's trading night until the doors shut. Starts are stored on the calendar day (00:30 is a Wednesday row) but priced on Tuesday night. The header says both so staff are never confused, and the date navigator follows the SERVER's WIB day, never the tablet's UTC date. A closed day still sells the previous night's tail: the second frame shows a Sunday that is closed but still carries Saturday night's tables until 02:00.

Mahjong Dojo x Shooters · buka 11:00 · mulai terakhir 01:00 · pintu tutup 02:00

Jadwal

Malam Sel, 23 Sep → Rab 02:00
Sekarang 00:35 Rabu. Booking setelah tengah malam tercatat di Rab, 24 Sep, tetapi harganya ikut malam Selasa.
Mahjong Dojo x Shooters · Minggu tutup

Jadwal

Min, 27 Sep · tutup
Minggu tidak membuka sesi sendiri, tapi malam Sabtu masih berjalan sampai 02:00. Meja itu tetap dijual dan ditagih seperti biasa. Setelah 02:00 tidak ada slot.
/pos/schedule · statesBARU

Empty, loading, error: "not known" is never "no bookings"

A read that has not landed, or has failed, must never say "Tidak ada booking". Saying so is how an operator tells an arriving guest their reservation does not exist and then sells the table. Empty is only stated on a successful read.

KosongMemuatGagal
Mahjong Dojo Dago · 6 meja

Jadwal

Kam, 24 SepBesok
ManualBookingDialog · POST /venues/:id/manual-bookingWeb + App

Booking manual

This is dated with the day on screen, and the dialog keeps its day through midnight (it warns instead of moving the write). Starts come from the venue's timeline (:00 and :30). Duration uses the rungs of the table's ruleset, or the packages when the venue sells packages. Settlement is Bayar sekarang (QRIS) or Tanpa biaya (comp). Owner decision: "bayar di kasir" was removed. The app still offers "Pay at the counter", which is a parity gap.

FormHari sudah lewatSlot diambilJam berbeda

Booking meja

Hari ini · Rab, 23 Sep

Meja
Mulai
Berapa lama
Meja 5 dibooking lagi jam 21:30. Pendekkan atau pilih meja lain.
Pembayaran
Bayar sekarang · QRISTanpa biaya (comp)
20:30–21:30 · Meja 5 · Jam puncakRp 80.000
RescheduleBookingDialogWebApp: none

Pindah jadwal (no refund)

Pick a new date, start and table. The server runs the same three-source check and answers with a specific sentence per refusal: "Slot sudah mulai", "Tidak bisa dipindah lagi", "Venue tutup di jam itu", "Tinggal N kursi".

Pindah booking

KK7Q4M · Andi +3 · Rab 19:00, 3 jam

Tanggal baru
Mulai
Meja
Pindah jadwal tidak mengembalikan uang. Harga tidak dihitung ulang.
05 · Tab, check-in, open play, pelatih, pesan, riwayat, peringkat

The rest of the counter

Each of these routes exists on the web today. Tab and Open play are hidden from the bar by a flag. Riwayat and Peringkat sit off the bar, linked from Hari ini. In the redesign they share the rail's "Lainnya" group.

/pos/tabsWeb + Apphidden on both (flag)

Tab: every open tab, with its quoted bill

Each row shows the /quote figure and opens the same payment dialog as Denah. A tab older than 24 hours is flagged for review, never pre-selected. "Makanan & minuman" and "Retail" are shown as coming soon, exactly as today. A failed read says "ini bukan denah kosong".

Mahjong Dojo Winbardi · 4 tab berjalan

Tab

Waktu mejaBuka tab walk-in
Makanan & minumanSegera
RetailSegera
1
Agus +3 · Meja 1Buka 17:36 · 2 jam 5 mnt · Hanchan
2
Rudi +3 · Meja 2Buka 19:00 · 41 mnt · Riichi
4
Budi +3 · Meja 4Buka 16:47 · lewat 2 menit
7
Walk-in · Meja 7Buka 11 Sep 17:10 · lebih dari 24 jam, periksa dulu
Kosong: "Tidak ada tab terbuka. Dudukkan tamu dari Denah." Gagal: "Tab belum bisa dimuat. Ini bukan denah kosong." dengan tombol Coba lagi.
/pos/checkinWeb + AppPOST /venues/:id/bookings/:code/checkin

Check-in: scan the QR or type the code

Scan with the camera (the web starts it on tap, and the app keeps it on while the tab is focused, with a 4-second duplicate latch), or type the code. Codes are normalised, and a code check-in writes check_in_at only. Try typing KK7Q4M, KK1X7C or KK5M4R, or switch results.

BerhasilSudah check-inBooking dibatalkanKode tidak adaKamera mati
Mahjong Dojo Winbardi · 19:44

Check-in

Arahkan ke QR konfirmasi tamu

Sudah check-in

Tamu
Andi +3
Meja
Meja 3 · Chinese
Jam
19:00–22:00
Rombongan
4 orang
Tanggal
Rab, 23 Sep
Dibayar
Sumber
Aplikasi
/pos/open-playWebhidden (flag) · App: NotBuilt

Open play: tables players fill seat by seat

Post N tables at a start time and a style, and players claim seats in the Kaki app. The fill state is spelled out: "Sebagian bayar", "Penuh, meja ditahan sementara semua bayar: jangan dudukkan walk-in", "Waktu tambahan", "Refund terutang". A Chinese table may host several styles. A Riichi-only table sticks to Riichi.

DaftarMeja open baru
Rab, 23 Sep · 2 diposting · 1 menahan meja · 1 refund terutang

Open play

20:30 · Meja 43/4 kursi
Hong Kong, ITM · Rp 50.000 / kursi · 2 sudah bayar, 1 menunggu
Sebagian bayar
21:00 · Meja 5Penuh
Penuh. Meja 5 ditahan sementara semua bayar. Jangan dudukkan walk-in di sini.
Sel 22 Sep · 19:00Refund terutang

Tidak penuh sampai jam mulai. 2 pemain sudah bayar dan menunggu refund.

/pos/coachesWebApp: NotBuilt (visible tab)

Pelatih: roster, week and time off

A roster of coach cards with today's booked sessions. Actions: Tambah pelatih, Jadwal (weekly opening and last start, plus time off), Ubah, Pensiunkan / Kembalikan ke roster. When sessions fail to load, the roster still shows and says only the sessions are missing. The coach dialog refuses emoji and requires a rate above Rp 0.

RosterTambah / ubahJadwal & libur
Mahjong Dojo Winbardi · Rab, 23 Sep

Pelatih

HT
Hendra TanRiichi · menengah · Rp 150.000/orang/jam
16:0018:0019:0020:00
SW
Sari WulandariHong Kong · pemula · Rp 100.000
14:0015:0017:00
YP
Yudi PratamaPensiun
Sesi hari ini belum bisa dimuat. Roster di atas tetap benar, hanya sesi yang sudah dibooking yang belum tampil.
/pos/messages · /pos/messages/[conversationId]WebApp: NotBuilt (visible tab)

Pesan: inbox and thread

Customers message the venue from the Kaki app. The inbox refreshes on every socket event. The thread shows read receipts ("Dibaca oleh …") and deleted messages, can attach a booking reference from "Booking terbaru", and names refusals: "Anda dibisukan di chat ini", "Tidak bisa mengirim, coba lagi", "Anda tidak punya akses ke chat ini".

PercakapanInbox kosongTanpa akses
Mahjong Dojo Winbardi

Pesan

DP
Dewi Putri
Bisa bayar di tempat?
2
AW
Andi Wijaya
Oke, sampai jam 7
RS
Rina Susanti
Belum ada pesan
DP
Dewi Putri
Pelanggan · booking KK3F9A
Hari ini
Halo, saya booking Meja 7 jam 19:30.19:12
Bisa bayar di tempat?19:13
7
Booking KK3F9A
Rab 19:30–21:30 · Rp 120.000 · belum bayar
Bisa, Kak. Nanti scan QRIS di kasir ya. Mejanya kami tahan sampai 19:45.19:15 · Dibaca

Pesan

Belum ada percakapanPesan dari pelanggan aplikasi Kaki akan muncul di sini.
!
Anda tidak punya akses ke chat ini
/pos/historyWebApp: noneGET /operator/venues/:id/bookings

Riwayat (Transaksi)

Every booking, newest first. Filters: Semua, Datang, Tidak datang, Dibatalkan, Tidak pernah lunas, Tidak cocok. There are window chips plus "termasuk hari ini", and paging with "Tampilkan lagi". Status and money are separate columns. A test fixture is labelled as one. Tapping a row opens the detail sheet (with Pulihkan). Owners get a link to Keuangan.

Mahjong Dojo Winbardi · 7 hari terakhir

Riwayat

Keuangan (pemilik) ›
SemuaDatangTidak datangDibatalkanTidak pernah lunasTidak cocok
Kemarin7 hari30 hari
TanggalKodeTamuMejaStatusUangJumlah
Sel 22 · 20:00KK1B5DTomo +32DatangRp 120.000
Sel 22 · 19:00KK5M4RBudi +32DibatalkanDirefundRp 60.000
Sen 21 · 21:30KK0Q2WEko +15Tidak datangRp 90.000
Sen 21 · 18:00KK9Z9YNina +31DibookingTidak pernah lunasRp 120.000
Min 20 · 15:00KK4E8RLina +38DatangTanpa biayaRp 0
Min 20 · 13:00KK2T0TTest1DibookingData ujiRp 1.000
/pos/leaderboardWebApp: none

Peringkat di venue ini

Boards: Riichi · Standar, Riichi · WRC, Riichi · 3 pemain, Hong Kong. Medal ranks use gold, silver and bronze tiles. Pills mark PEMULA and TAMU, and players who have not qualified yet sit in a separate "Belum memenuhi syarat" block. Columns show the venue rating and the global rating. States: venue unknown, failed, and "Belum ada game tercatat di sini".

Mahjong Dojo Winbardi · papan venue

Peringkat

Riichi · StandarRiichi · WRCRiichi · 3 pemainHong Kong
#PemainGameDi siniGlobal
1AWAndi Wijaya421.6421.588
2DPDewi Putri381.6111.570
3RSRina Susanti291.5771.540
4BSBudi Santoso PEMULA121.5301.512
5TTamu · Meja 3 TAMU81.504

Belum memenuhi syarat

Putri (3 game), Agus (2 game): belum cukup game untuk masuk papan.
06 · Kaki POS app on a phone · optional, later wave

The same screens at phone width

The native app (apps/kaki-pos) is portrait-only, has no tablet layout, and is built for phones. Today its bar has five tabs: Today, Schedule, Check-in, Coaches and Messages (the last two are "Not built yet" placeholders). The redesign proposes Hari ini · Denah · Jadwal · Check-in · Lainnya, so the bar never points at an empty screen, and moves Pelatih, Pesan, Tab, Open play, Riwayat and Peringkat under Lainnya once they are built. The components are the same as on the iPad: tiles, bill, timeline, sheets.

19:41●●●
Dojo Winbardi · Rab 23 Sep

Hari ini

Buka
Meja 7 belum bayar
Dewi · Rp 120.000 · lepas 19:45
1Mains/d 20:36
3DatangAndi
4Segera0:06

Di meja sekarang

19:003 jam
Andi +3 · Meja 3
Belum datang

Berikutnya

19:302 jam
Dewi +1 · Meja 7
Belum dibayar
19:41●●●
8 meja · 4 main

Denah

1Main
2:05
Rp 126.000
4Segera
0:06
Rp 180.000
319:00
Andi +3
5Kosong
s/d 21:30
4
Meja 4Tab · Budi +3 · 16:47
Sesi meja · 3 jamRp 180.000
QRISTunaiKartu
19:44●●●
Scan atau ketik kode

Check-in

Sudah check-in. Andi +3 · Meja 3 · 19:00 · lunas
19:41●●●
Hari ini · Rab 23 Sep

Jadwal

SemuaChineseRiichi
19:00Meja 3
Andi +319:00–22:00 · belum datang
19:30Meja 7
Dewi +1belum bayar · lepas 19:45
20:30Meja 4
Open play3/4 kursi
21:30Meja 5
Sari +3lunas · s/d 00:00

At phone width the timeline turns into a list per hour, and the tables-per-kind filter stays. Tapping a row opens the same detail sheet as the iPad.