{{ toastMsg }}
HF

HARINFOOD POS

{{ storeStatus.next_open_text ? 'Buka ' + storeStatus.next_open_text : 'Kedai sedang tutup' }}Kedai online & tracking realtime

Pasang Aplikasi HarinFood

Lebih cepat dibuka dari Layar Utama

Ketuk Bagikan, lalu Tambah ke Layar Utama

📴 Mode Offline — Aplikasi tetap bisa dipakai, pesanan akan otomatis terkirim saat internet kembali.
⏳ Menyinkronkan {{ pendingOfflineCount }} pesanan offline...
🔴 Kedai Sedang Tutup — {{ storeStatus.closed_message }} · Buka {{ storeStatus.next_open_text }}
Stok: {{ p.stok }}
⭐ Best Seller
👑 Member
{{ !isItemAktif(p) ? 'TIDAK TERSEDIA' : 'STOK HABIS' }}

{{ p.nama }}

{{ formatRupiah(p.harga) }}

🏷️ Beli {{ p.grosir_min_qty }}+ jadi {{ formatRupiah(p.harga_grosir) }}/pcs

{{ getCartQty(p.id) }}
{{ cartTotalItems }}
{{ userRole === 'kasir' ? 'Keranjang Kasir' : 'Keranjang Pesanan' }}
{{ formatRupiah(cartTotalHarga) }}

📋 Pesanan Tertunda

Lanjutkan pesanan pelanggan yang tadi ditinggal.

🗂️
Belum ada pesanan tertunda
Tekan 💾 Simpan di keranjang saat pelanggan ditinggal.
{{ h.label }}
{{ h.item_count }} item · {{ formatRupiah(h.total_preview) }}
{{ fmtHeldTime(h.created_at) }} · oleh {{ h.kasir_nama }}
💾

Simpan Pesanan Tertunda

Keranjang akan disimpan lalu dikosongkan, supaya kasir bisa melayani pelanggan lain.

🛒 Keranjang Pesanan ({{ cartTotalItems }} Item)

Akses: {{ userRole === 'kasir' ? 'Kasir' : (isMember ? '👑 Member' : 'Pelanggan') }}
Detail Pemesan

Data pelanggan dan kontak untuk pesanan ini.

👑 Terisi otomatis dari profil member kamu, supaya poin tercatat dengan benar.

Update status pesanan Anda akan dikirim kasir ke nomor ini. Wajib diisi jika ingin memakai Delivery.

Daftar Produk
🛒

Keranjang masih kosong

Yuk pilih menu favorit dari katalog.

{{ item.product.nama }} MANUAL 🎁 POIN

GRATIS ({{ item.poinPerItem * item.qty }} poin)
Rp
{{ formatRupiah(getItemUnitPrice(item)) }}

🏷️ Harga grosir aktif

{{ formatRupiah(getItemUnitPrice(item)) }}

🏷️ Harga grosir aktif

{{ item.qty }} x {{ formatRupiah(getItemUnitPrice(item)) }} = {{ formatRupiah(getItemSubtotal(item)) }}

{{ item.qty }}
"{{ cartUndo.item.product.nama }}" dihapus dari keranjang.

{{ r.nama }}

⭐ {{ r.poin }} poin • sisa {{ r.stok }}

Pesanan & Pembayaran

⚠️ Lokasi Anda saat ini berada di luar semua area delivery yang kami layani. Silakan pilih "Ambil Sendiri", atau hubungi kasir untuk info area terdekat.⚠️ Fitur delivery ini akan menyesuaikan minimum transaksi di area yang anda tempati sekarang dan sesuai lokasi yang masuk area delivery order misal area tertentu {{ formatRupiah(lowestPossibleDeliveryMinOrder) }} dan Nomor WhatsApp sudah diisi.

Nomor WhatsApp kamu di atas wajib diisi — begitu pesanan dikirim, WhatsApp akan otomatis terbuka ke penyedia jasa titip untuk konfirmasi.

Scan / simpan QRIS berikut untuk pembayaran:

QRIS HARINFOOD

Tekan tombol "Download QRIS & Kirim Pesanan" di bawah untuk menyimpan gambar QRIS ini sekaligus mengirim pesanan Anda ke kasir.

Saldo Tabungan Tersedia: {{ formatRupiah(checkoutMemberSaldoTabungan) }}
Dipotong dari Tabungan:
Sisa Dibayar Tunai: {{ formatRupiah(tabunganSisaTunai) }}

✅ Saldo tabungan cukup untuk melunasi seluruh belanja ini.

📲 Setelah dikirim, WhatsApp akan terbuka ke kasir untuk konfirmasi. Saldo baru terpotong setelah kasir menyetujui.

🔽 Pilih Varian — {{ variantPickerProduct.nama }}

{{ entry.variant.nama }}
{{ formatRupiah(entry.variant.harga) }}
🏷️ Beli {{ entry.variant.grosir_min_qty }}+ jadi {{ formatRupiah(entry.variant.harga_grosir) }}/pcs
{{ getVariantCartQty(variantPickerProduct, entry.index) }}

➕ Tambah Item Manual

⚠️ Item ini hanya untuk keperluan transaksi & struk saat ini. Tidak akan tersimpan ke database produk maupun mengubah stok.

🛒 {{ editOrderCustomerMode ? 'Ubah Isi Pesanan' : 'Edit Pesanan' }} ({{ editOrderForm.items.length }} Item)

#{{ editOrderData.invoice_code }}

Ikut tercantum di pesan update WhatsApp & struk yang dicetak.

Belum ada item. Tambahkan produk di bawah.

{{ it.nama }} MANUAL {{ editOrderItemDelta(it) > 0 ? '+' : '' }}{{ editOrderItemDelta(it) }}

{{ formatRupiah(it.harga) }}
{{ it.qty }}
Total Baru: {{ formatRupiah(editOrderTotal) }}

Catatan ini menggantikan catatan sebelumnya dan ikut dikirim ke kasir.

{{ editOrderCardTotalQty(p) }} 👑 MEMBER
{{ p.nama }}
{{ editOrderCardQty(p) }}
{{ editOrderProductSearch ? '🔍 Produk tidak ditemukan.' : '😔 Tidak ada produk yang tersedia saat ini.' }}

🔍 Lacak Status Pesanan Realtime

💡 Cukup masukkan angka / nomor invoice saja tanpa perlu 'TRX-'.
KODE INVOICE
{{ trackedOrder.invoice_code }}
PEMESANAN
{{ trackedOrder.nama_pelanggan }} • {{ trackedOrder.metode_pemesanan }}
Status Pesanan Saat Ini:
PESANAN MASUK ANTRIAN

Mengantre menunggu konfirmasi dan proses dari kasir/dapur.

SEDANG DIPROSES

🔥 Dapur sedang menyiapkan & memasak makanan Anda!

{{ trackedOrder.metode_pemesanan === 'Delivery' ? 'SIAP DIANTAR' : 'SIAP DIAMBIL' }}

✨ Makanan SUDAH SIAP! {{ trackedOrder.metode_pemesanan === 'Delivery' ? 'Sedang menunggu untuk diantar ke alamat Anda.' : 'Silakan ambil pesanan di kasir.' }}

PESANAN SELESAI

Pesanan telah diserahkan. Selamat menikmati!

PESANAN TIDAK BISA DILANJUTKAN

Mohon maaf, pesanan ini tidak dapat kami proses lebih lanjut.

1. Antrian
2. Diproses
3. Siap
4. Selesai

Ketuk tahap untuk langsung mengubah status pesanan ini.

📍 Lokasi Kedai Harinfood (Ambil Sendiri):
🔒 Kesempatan main untuk pesanan ini sudah tidak berlaku
🔒 Kesempatan main untuk pesanan ini sudah dipakai
Catatan Pesanan: "{{ trackedOrder.catatan_pesanan }}"
Rincian Item Makanan/Minuman:
Pesanan terkunci
{{ it.product_nama }} x{{ it.qty }}
{{ formatRupiah(it.subtotal) }}
Total Akhir: {{ formatRupiah(trackedOrder.total_akhir) }}
🏆

🎉 Selamat! Kamu Memenangkan Hadiah Game 🎁

{{ trackedOrder.game_reward }}

Hadiah ini otomatis tercantum di struk & pesan WhatsApp pesanan ini.

🎮

Skor Game ({{ trackedOrder.game_score_info.game_type_label }}) untuk pesanan ini

{{ trackedOrder.game_score_info.score }} • Level {{ trackedOrder.game_score_info.level_reached }}

✏️

Edit Pesanan

● MASIH BISA DIUBAH

Tambah atau kurangi pesanan sebelum Siap.

{{ it.product_nama }} x{{ it.qty }} {{ formatRupiah(it.subtotal) }}
Total Akhir: {{ formatRupiah(trackedOrder.items.reduce((sum, it) => sum + (Number(it.subtotal) || ((Number(it.harga_jual) || 0) * (Number(it.qty) || 0))), 0)) }}
💬Setelah perubahan, wajib kirim pemberitahuan ke WhatsApp kasir.
🔒

Edit Pesanan Ditutup

Pesanan sudah siap, sehingga tidak dapat ditambah atau dikurangi.

💬 Chat dengan {{ userRole === 'kasir' ? 'Pelanggan' : 'Kasir' }}
Belum ada pesan. Mulai obrolan di bawah 👇

{{ msg.message }}

{{ formatChatTime(msg.created_at) }}

🔒 Akses Login Kasir

🔑

Atur PIN Cepat?

Supaya login berikutnya di perangkat ini cukup pakai PIN 4-6 digit, tanpa ketik username & password lagi.

📍
Aktifkan Lokasi (GPS)

🖨️
{{ autoPrintNeedTap }} pesanan menunggu dicetak
Tekan tombol di bawah untuk mencetak struk.
{{ autoPrintStatus }}

☰ Menu Kasir

🖼️ Logo & Header di Struk {{ receiptLogoOn ? 'Aktif: logo kedai + tulisan header tercetak di struk.' : 'Mati: struk normal tanpa logo.' }}
📡 Perangkat ini tanpa printerStruk pesanan dikirim ke printer pusat
🖨️ Cetak Otomatis Pesanan Masuk
{{ autoPrintStatus }}
Printer Bluetooth
{{ nativePrinters.error }}
Belum ada printer terpasang. Pasangkan (pair) printer di Pengaturan Bluetooth HP, lalu muat ulang.
Tetap mencetak saat HP terkunci
{{ bgPrint.on ? 'Layanan latar belakang AKTIF (lihat notifikasi "Harinfood Printer aktif"). Pesanan tetap tercetak walau layar mati.' : 'Layanan latar belakang mati. Nyalakan saklar Cetak Otomatis di atas.' }}
✓ Penghemat baterai sudah dinonaktifkan untuk aplikasi ini

Aplikasi ini harus tetap terbuka & layar HP menyala agar pesanan bisa tercetak otomatis.

📝 Buat Catatan

Catatan ini bukan struk transaksi. Cocok untuk pesan bebas seperti pengumuman, catatan dapur, atau titipan pesan ke pelanggan. Ukuran tulisan isinya dibuat besar agar mudah dibaca.

{{ (noteMakerForm.isi || '').length }}/300

🪪 Cetak Kartu Nama Kedai

Kartu nama berisi QR & alamat link katalog online, untuk dibagikan ke pelanggan supaya bisa langsung scan atau ketik alamatnya di browser untuk mulai memesan. Ukuran kartu 49mm × 95mm (ramping) — pas 12 kartu (4 kolom × 3 baris) dalam satu lembar A4. Semua kartu isinya sama, tinggal tentukan jumlah yang mau dicetak sekaligus.

Tema berwarna: gaya elegan gradasi maroon-emas. Tema hitam putih: hemat tinta untuk cetak harian.

Kedai Sedang Tutup

🕒 Buka kembali {{ storeStatus.next_open_text }}

💾 Penyimpanan Hosting

⏳ Menghitung pemakaian storage...

📶 Voucher WiFi MikroTik

✅ {{ wifiResult.qty }} voucher siap

{{ wifiResult.profile }} · {{ formatRupiah(wifiResult.price) }}/lembar

⏱️

Batas waktu pakai voucher

Paket: {{ wifiPendingProfile ? wifiPendingProfile.name : wifiForm.profile }}

Gunakan format RouterOS, misalnya 30m, 2h atau 1d.

🔔 Kelola Status Buka/Tutup Toko

Status saat ini: {{ storeStatusForm.is_closed ? 'TOKO TUTUP' : 'TOKO BUKA' }}

🕒 Jadwal otomatis aktif · Hari ini: {{ storeStatus.today_text }} · ✋ Diatur manual, kembali mengikuti jadwal setelah {{ storeStatus.override_until_text }}

Pesan ini langsung tampil sebagai pop-up di layar pelanggan begitu toko ditandai tutup.

Atur jam buka & jam tutup tiap hari. Saat aktif, toko otomatis BUKA/TUTUP sesuai jadwal dan pesan di atas tampil ke pelanggan saat tutup. Tombol Tutup/Buka manual tetap bisa dipakai kapan saja — berlaku sampai jadwal berganti status berikutnya. Kalau jam tutup lebih kecil dari jam buka (mis. 18.00 → 02.00), dianggap tutup lewat tengah malam.

{{ scheduleDayNames[d] }} Libur

Unggah file MP3 (maks. 2MB, disarankan 1-3 detik) untuk mengganti nada notifikasi bawaan. Nada ini otomatis dipakai oleh HP semua pelanggan, tanpa perlu setting apa pun di sisi mereka.

{{ notifSoundUrl ? 'Nada kustom aktif' : 'Memakai nada bawaan aplikasi' }}

Unggah file MP3 (maks. 8MB) yang akan diputar SEKALI setiap kali ada yang membuka aplikasi ini — baik pelanggan maupun kasir. Kalau tidak diunggah, aplikasi dibuka tanpa musik seperti biasa.

{{ openingMusicUrl ? 'Musik pembuka aktif' : 'Belum ada musik pembuka' }}

Tombol di iTag akan memutar musik bel ini setiap ditekan. Hanya bisa dipakai di aplikasi Harinfood Printer (Android).

Buka halaman ini dari aplikasi Harinfood Printer untuk mengatur bel iTag.

Nada ini sengaja dibedakan dari nada chat di atas, supaya kasir bisa langsung membedakan dari suaranya saja: ada pesanan baru masuk atau cuma pesan chat dari pelanggan.

{{ orderNotifSoundUrl ? 'Nada kustom aktif' : 'Memakai nada bawaan aplikasi' }}

🚚 Pengaturan Delivery

Status saat ini: Fitur Delivery {{ deliveryEnabled ? 'AKTIF' : 'NONAKTIF' }}

Kalau dinonaktifkan, pilihan "Delivery" akan hilang dari menu pemesanan pelanggan (cuma tersisa "Ambil Sendiri" & "Jasa Titip" kalau ada) — begitu juga syarat wajib isi No. WhatsApp dan keterangan minimal belanja untuk Delivery ikut disembunyikan karena memang tidak relevan lagi. Pengaturan Area Delivery & minimal belanja per area tetap tersimpan seperti semula, tinggal diaktifkan lagi kapan saja tanpa perlu diatur ulang.

🎮 Kelola Game

Unggah file MP3 (maks. 5MB) untuk musik latar yang diputar berulang-ulang selama game berlangsung, dan otomatis berhenti saat game over. Berlaku sama untuk semua pemain.

{{ gameBgmUrl ? 'Musik kustom aktif' : 'Belum ada musik (game senyap)' }}

Atur nama hadiah yang otomatis muncul saat pemain mencapai level tertentu. Isi ulang level yang sama untuk memperbarui nama/stoknya. Kolom Stok boleh dikosongkan kalau hadiahnya tak terbatas — kalau diisi, hadiah otomatis berhenti dibagikan setelah stoknya habis diklaim pemain.

Belum ada hadiah level diatur.
Lv.{{ r.level }} {{ r.reward_name }}

Unggah file MP3 (maks. 5MB) khusus untuk game Royal Battle — terpisah dari musik Ayam Loncat di atas. Diputar berulang-ulang selama game berlangsung dan otomatis berhenti saat game over.

{{ rbBgmUrl ? 'Musik kustom aktif' : 'Belum ada musik (game senyap)' }}

Atur nama hadiah yang otomatis muncul saat pemain mencapai level tertentu di game Royal Battle — terpisah dari hadiah game Ayam Loncat di atas. Kolom Stok boleh dikosongkan kalau tak terbatas.

Belum ada hadiah level diatur.
Lv.{{ r.level }} {{ r.reward_name }}

Unggah file MP3 (maks. 5MB) khusus untuk game Si Rakus — terpisah dari musik 2 game lain di atas. Diputar berulang-ulang selama game berlangsung dan otomatis berhenti saat game over.

{{ srBgmUrl ? 'Musik kustom aktif' : 'Belum ada musik (game senyap)' }}

Atur nama hadiah yang otomatis muncul saat pemain mencapai level tertentu di game Si Rakus — terpisah dari hadiah 2 game lain di atas. Kolom Stok boleh dikosongkan kalau tak terbatas.

Belum ada hadiah level diatur.
Lv.{{ r.level }} {{ r.reward_name }}

🏆 Leaderboard Game

Peringkat skor terbaik tiap pemain — direset otomatis tiap hari.

Memuat...
Belum ada skor untuk game ini hari ini.
{{ idx + 1 }}

{{ row.player_name }}

🎁 {{ row.reward_won }}

Lv.{{ getKasirLeaderboardLevel(row.best_score) }} {{ row.best_score }}

👑 {{ isMember ? 'Member Harinfood' : 'Jadi Member' }}

Halo, Member Harinfood 👋

{{ memberInfo.nama }}

📱 {{ memberInfo.wa }}

📍 {{ memberInfo.alamat }}

⭐ Poin Loyalitas {{ memberInfo.points }} pts

🎁 Kamu bisa melihat & memesan menu khusus member. Tiap kelipatan Rp10.000 belanja yang selesai = 1 poin.

Memuat...
Belum ada transaksi tercatat.
⏳

Menunggu Persetujuan Kasir

Permintaan member atas nama {{ memberInfo.nama }} ({{ memberInfo.wa }}) sedang ditinjau. Halaman ini otomatis diperbarui begitu kasir memutuskan.

😔 Permintaan member kamu sebelumnya ditolak kasir.

Alasan: {{ memberRejectionNote }}

Sudah pernah didaftarkan sebagai member di kedai? Masukkan No. WhatsApp yang terdaftar untuk langsung masuk.

🏪 Nomor ini belum terdaftar sebagai member.

Pendaftaran member Harinfood saat ini dilakukan langsung oleh kasir di kedai. Silakan bertanya pada kasir apakah masih ada pendaftaran member baru ya 🙏

👑 Kelola Member

{{ memberList.length }} ditampilkan • {{ memberPendingCount }} menunggu persetujuan

Dipakai untuk mendaftarkan pelanggan yang datang & mendaftar langsung di kedai. Member akan langsung AKTIF (tanpa menunggu persetujuan), karena identitasnya sudah diverifikasi kasir secara langsung.

Tertata rapat di kertas F4/A4/HVS sesuai printer Anda — cetak, lalu gunting per kartu (ukuran standar ISO ID-1 potret, seukuran KTP/ATM).

Memuat...
Tidak ada data member di kategori ini.
Nama No. WhatsApp Alamat Status Poin Sejak Aksi
{{ m.status === 'pending' ? '⏳' : m.status === 'rejected' ? '🚫' : '👑' }} {{ m.nama }} 🏪 OFFLINE 📱 {{ m.wa }} {{ m.alamat || '-' }} {{ m.status === 'pending' ? 'Menunggu' : m.status === 'rejected' ? 'Ditolak' : 'Disetujui' }}

Alasan: {{ m.rejection_note }}

⭐ {{ m.points }} {{ formatShortDate(m.created_at) }}

👑 Detail Member

Memuat...

🔍 Kaitkan Member

Kaitkan member ke pesanan yang sedang dibuat, supaya poin belanja langsung di kedai otomatis masuk ke akun member tersebut.

👑 {{ kasirCartMemberNama }}

{{ kasirCartMemberWa }}

{{ cartMemberSearchError }}

{{ barcodeScanPurpose === 'incomingSearch' ? '📷 Scan Invoice Pesanan' : '📷 Scan Kartu Member' }}

{{ scannerError }}

{{ barcodeScanPurpose === 'incomingSearch' ? 'Arahkan kamera ke barcode pada struk pesanan.' : 'Arahkan kamera ke barcode pada kartu member.' }}

💳 Tabungan Saya

Saldo Tabungan

{{ formatRupiah(savingsBalance) }}

{{ savingsRequestType === 'setor' ? '➕ Ajukan Setor Tabungan' : '➖ Ajukan Tarik Tabungan' }}

WhatsApp akan terbuka otomatis berisi link persetujuan untuk dikirim ke kasir. Saldo baru bertambah/berkurang setelah kasir menyetujui.

🎁 Tukar Poin ke Saldo

Kurs: {{ pointSaldoRate.poin_per_konversi }} poin = {{ formatRupiah(pointSaldoRate.rupiah_per_konversi) }}. Poin kamu saat ini: {{ memberInfo.points }} pts.

= {{ formatRupiah(estimasiHasilTukarPoin) }} saldo tabungan

📖 Riwayat

Memuat...
Belum ada riwayat tabungan.

{{ h.tipe === 'setor' ? '➕ Setor' : h.tipe === 'tarik' ? '➖ Tarik' : '🛒 Bayar Belanja' }} MENUNGGU

{{ formatShortDateTime(h.created_at) }}

{{ h.tipe === 'setor' ? '+' : '-' }}{{ formatRupiah(h.jumlah) }}

Saldo {{ formatRupiah(h.saldo_setelah) }}

💳 Kelola Tabungan

⏳ Menunggu Persetujuan ({{ savingsPendingList.length }})

Memuat...
Tidak ada permintaan menunggu.

{{ item.member_nama }}

{{ item.tipe === 'setor' ? 'SETOR' : item.tipe === 'bayar' ? 'BAYAR BELANJA' : 'TARIK' }}

Invoice #{{ item.order_invoice }} • Total {{ formatRupiah(item.order_total) }}

{{ formatRupiah(item.jumlah) }}

{{ formatShortDateTime(item.created_at) }} • {{ item.member_wa }}

🧑‍💼 Layani Langsung (Teller)

Cocok saat member datang bawa kartu tapi tidak bawa HP — cari member, lalu tambah/tarik saldo langsung tanpa perlu persetujuan WhatsApp.

{{ savingsAdminSearchError }}

{{ savingsAdminMember.nama }}

{{ savingsAdminMember.wa }}

{{ formatRupiah(savingsAdminMember.saldo_tabungan) }}

Kurs: {{ pointSaldoRate.poin_per_konversi }} poin = {{ formatRupiah(pointSaldoRate.rupiah_per_konversi) }}. Poin member: {{ savingsAdminMember.points || 0 }} pts

= {{ formatRupiah(kasirEstimasiTukarPoin) }} masuk ke saldo tabungan

📖 Riwayat

Belum ada riwayat.

{{ h.tipe === 'setor' ? '➕ Setor' : h.tipe === 'tarik' ? '➖ Tarik' : '🛒 Bayar' }} MENUNGGU

{{ formatShortDateTime(h.created_at) }}

{{ h.tipe === 'setor' ? '+' : '-' }}{{ formatRupiah(h.jumlah) }}

💳 Konfirmasi Tabungan

Memuat data permintaan...

🎁 Kelola Tukar Poin

Atur hadiah yang bisa ditukar member dengan poin loyalitas mereka

💰 Tukar Poin ke Saldo Tabungan

Atur kursnya (mis. 10 poin = Rp1.000). Member bisa menukar poinnya sendiri jadi saldo tabungan kapan saja dari menu Tabungan mereka — langsung masuk, tanpa perlu persetujuan.

poin = Rp

✅ Kurs aktif: {{ pointSaldoRate.poin_per_konversi }} poin = {{ formatRupiah(pointSaldoRate.rupiah_per_konversi) }}

Belum diaktifkan — member belum bisa tukar poin ke saldo.

{{ pointRewardForm.id ? '✏️ Edit Hadiah' : '➕ Tambah Hadiah Baru' }}

Memuat...
Belum ada hadiah tukar poin diatur.
🎁

{{ r.nama }} NONAKTIF

⭐ {{ r.poin }} poin • {{ r.stok === null ? 'stok tak terbatas' : ('sisa ' + r.stok) }}

🔑 Kelola Akun Kasir

Satu akun hanya bisa login di satu perangkat pada satu waktu

{{ kasirAccountForm.id ? '✏️ Edit Akun' : '➕ Tambah Akun Baru' }}

Huruf kecil, angka, titik, atau underscore. 3-30 karakter.

Memuat...
🔑

{{ acc.nama }} KAMU PIN AKTIF

@{{ acc.username }}

{{ acc.device_bound ? ('📱 Terikat: ' + (acc.device_label || 'Perangkat tidak dikenal')) : '📱 Belum terikat perangkat' }}

🛵 Jasa Titip

Mau nitip pesanan? Pilih "Jasa Titip" saat checkout, lalu pilih salah satu penyedia di bawah ini.

Belum ada jasa titip yang aktif saat ini.
🛵

{{ o.member_nama }}

Tiba sekitar {{ formatShortDateTime(o.jam_tiba) }}

📍 {{ o.alamat }}

🛵 Jadi Jasa Titip

Kamu sedang aktif sebagai jastip

Tiba sekitar {{ formatShortDateTime(myJastipOffer.jam_tiba) }}

📍 {{ myJastipOffer.alamat }}

Invoice masuk:

Siapa saja boleh mendaftar — isi data di bawah ini.

Supaya pelanggan lain bisa menimbang dekat/jauhnya lokasi kamu.

Minimal 1 jam dari sekarang, supaya pelanggan lain sempat menitip.

🛵 Kelola Jasa Titip

Pengawasan tawaran jasa titip dari member

Invoice lewat {{ jastipSelectedOffer?.member_nama }}

Belum ada invoice.
Memuat...
Belum ada yang pernah mendaftar jadi jasa titip.
🛵

{{ o.member_nama }} AKTIF {{ o.status === 'kadaluarsa' ? 'KADALUARSA' : 'DIHAPUS' }}

Tiba {{ formatShortDateTime(o.jam_tiba) }} • {{ o.total_invoice }} invoice • {{ o.menunggu_konfirmasi }} menunggu

📍 {{ o.alamat }}

🛵 Konfirmasi Jasa Titip

Memuat pesanan...

{{ jastipConfirmOrder._error }}

{{ jastipConfirmOrder._resolved === 'terima' ? '✅' : '❌' }}

{{ jastipConfirmOrder._resolved === 'terima' ? 'Permintaan diterima. Terima kasih!' : 'Permintaan ditolak.' }}

Ada pelanggan ingin menitip pesanan berikut lewat kamu:

👤 {{ jastipConfirmOrder.nama_pelanggan || 'Tanpa nama' }}

📍 {{ jastipConfirmOrder.alamat_pelanggan }}

📱 {{ jastipConfirmOrder.no_wa_pelanggan }}

#{{ jastipConfirmOrder.invoice_code }}

{{ it.product_nama }} x{{ it.qty }} {{ formatRupiah(it.subtotal) }}

🎁 Hadiah Game: {{ jastipConfirmOrder.game_reward }}

"{{ jastipConfirmOrder.catatan_pesanan }}"

🎮 Pilih Game

😔 Hadiah semua game sedang habis. Terima kasih sudah ingin bermain, tunggu hadiah berikutnya ya!

Ada game yang hadiahnya sudah habis, jadi disembunyikan. Pilih game yang masih ada hadiahnya di bawah ini ya!

Sambil nunggu pesanan, main yuk! Pilih salah satu game di bawah ini.

🐔

Ayam Loncat

⭐ {{ gameScore }} 🏅 Level {{ gameLevel }}
🎁 Hadiah Level {{ gameRewardPing.level }}: {{ gameRewardPing.reward_name }} Tercatat untuk pesanan Anda — dikonfirmasi saat main selesai
{{ n <= gameLives ? '❤️' : '🖤' }}
🎉 LEVEL {{ gameLevel }}! 🎉
🐔

Ketuk di mana saja di layar atau tekan Spasi untuk mulai lompat!

Lompati makanan yang lewat, kumpulkan skor sebanyak-banyaknya, dan naik level!

🔒

Kesempatan Main Sudah Dipakai

Setiap pesanan hanya dapat 1 kali kesempatan main. Buat pesanan baru untuk main lagi ya!

🏆

🎉 SELAMAT, {{ gamePlayerName }}! 🎉

Kamu memenangkan hadiah dari permainan ini:

Lv.{{ r.level }} 🎁 {{ r.reward_name }}
😅 Sayang sekali, hadiah level {{ i > 0 ? ', ' : ' ' }}{{ r.level }} sudah keburu habis diklaim pemain lain. Semangat coba lagi lain kali!

Game Over!

Skor Kamu: {{ gameScore }} • Level {{ gameLevel }}

🏆 Peringkat #{{ gameRank }} di Leaderboard

Skor otomatis tersimpan ke leaderboard global memakai nama: {{ gamePlayerName }}

🏆 Leaderboard Hari Ini

Otomatis reset kosong lagi tiap pergantian hari

Memuat...
Belum ada skor. Jadilah yang pertama!
{{ idx === 0 ? '🥇' : idx === 1 ? '🥈' : idx === 2 ? '🥉' : (idx + 1) }} {{ row.player_name }} Lv.{{ getLeaderboardLevel(row.best_score) }} {{ row.best_score }}
🏆 Menang: {{ row.reward_won }}
🎯

Harinfood Royal Battle

⭐ {{ rbScore }} 🏅 Level {{ rbLevel }}
{{ n <= rbLives ? '❤️' : '🖤' }} 👈 Gerak  •  Tahan & Arahkan 👉 untuk Tembak
🎉 LEVEL {{ rbLevel }}! 🎉
🎯

Ketuk di mana saja untuk mulai!

Sentuh & geser di sisi KIRI layar untuk bergerak, tahan & arahkan di sisi KANAN untuk menembak musuh. Kumpulkan makanan, hindari peluru musuh!

🔒

Kesempatan Main Sudah Dipakai

Setiap pesanan hanya dapat 1 kali kesempatan main. Buat pesanan baru untuk main lagi ya!

🏆

🎉 SELAMAT, {{ gamePlayerName }}! 🎉

Kamu memenangkan hadiah dari permainan ini:

Lv.{{ r.level }} 🎁 {{ r.reward_name }}
😅 Sayang sekali, hadiah level {{ i > 0 ? ', ' : ' ' }}{{ r.level }} sudah keburu habis diklaim pemain lain. Semangat coba lagi lain kali!

Game Over!

Skor Kamu: {{ rbScore }} • Level {{ rbLevel }}

🏆 Peringkat #{{ gameRank }} di Leaderboard

Skor otomatis tersimpan ke leaderboard global memakai nama: {{ gamePlayerName }}

🏆 Leaderboard Hari Ini

Otomatis reset kosong lagi tiap pergantian hari

Memuat...
Belum ada skor. Jadilah yang pertama!
{{ idx === 0 ? '🥇' : idx === 1 ? '🥈' : idx === 2 ? '🥉' : (idx + 1) }} {{ row.player_name }} Lv.{{ getRbLeaderboardLevel(row.best_score) }} {{ row.best_score }}
🏆 Menang: {{ row.reward_won }}
🐍

Si Rakus

📏 {{ srScore }} 🏅 Level {{ srLevel }}
🕹️ Sentuh & geser untuk bergerak
🎉 LEVEL {{ srLevel }}! 🎉
🐍

Ketuk di mana saja untuk mulai!

Sentuh & geser untuk mengarahkan ular. Makan sebanyak mungkin, jangan sampai menabrak badan ular lain!

🔒

Kesempatan Main Sudah Dipakai

Setiap pesanan hanya dapat 1 kali kesempatan main. Buat pesanan baru untuk main lagi ya!

🏆

🎉 SELAMAT, {{ gamePlayerName }}! 🎉

Kamu memenangkan hadiah dari permainan ini:

Lv.{{ r.level }} 🎁 {{ r.reward_name }}
😅 Sayang sekali, hadiah level {{ i > 0 ? ', ' : ' ' }}{{ r.level }} sudah keburu habis diklaim pemain lain. Semangat coba lagi lain kali!

Kamu Habis Dimakan!

Panjang Kamu: {{ srScore }} • Level {{ srLevel }}

🏆 Peringkat #{{ gameRank }} di Leaderboard

Skor otomatis tersimpan ke leaderboard global memakai nama: {{ gamePlayerName }}

🏆 Leaderboard Hari Ini

Otomatis reset kosong lagi tiap pergantian hari

Memuat...
Belum ada skor. Jadilah yang pertama!
{{ idx === 0 ? '🥇' : idx === 1 ? '🥈' : idx === 2 ? '🥉' : (idx + 1) }} {{ row.player_name }} Lv.{{ getSrLeaderboardLevel(row.best_score) }} {{ row.best_score }}
🏆 Menang: {{ row.reward_won }}

📋 Kelola Pesanan Masuk (Kasir)

💡 Pesanan berstatus Selesai disembunyikan dari daftar ini. Ketik nomor invoice, nama, atau nomor WhatsApp di kolom pencarian kalau perlu dicari lagi.

Belum ada pesanan masuk.
Tidak ada pesanan yang cocok dengan pencarian tersebut.
✏️
Pesanan diubah pelanggan
Diubah {{ fmtEditTime(tx.edited_by_customer_at) }} — cek item & catatan terbaru
#{{ tx.invoice_code }}
{{ tx.nama_pelanggan || 'Pelanggan Umum' }} 🎁 Hadiah: {{ tx.game_reward }} 🎮 {{ tx.game_score_info.game_type_label }}: belum beruntung (skor {{ tx.game_score_info.score }}) 🎮 Sudah main 💬 PESAN BARU ✏️ DIEDIT PELANGGAN
{{ tx.metode_pemesanan === 'Delivery' ? '🚚' : (tx.metode_pemesanan === 'Ambil Sendiri' ? '🏃' : '🤝') }} {{ tx.metode_pemesanan }}
🛵 Dititip lewat: {{ tx.jastip_member_nama || '—' }}
{{ tx.status }}
Alamat: {{ tx.alamat_pelanggan }}
📍 Lokasi GPS pelanggan{{ tx.location_accuracy ? ' • akurasi ±' + Math.round(tx.location_accuracy) + ' m' : '' }}
🗺️ Buka di Google Maps
📍 Pelanggan tidak membagikan lokasi GPS — pastikan nama & alamat masuk akal sebelum diproses.
Catatan: "{{ tx.catatan_pesanan }}"
{{ it.product_nama }} x{{ it.qty }} {{ formatRupiah(it.subtotal) }}
Total: {{ formatRupiah(tx.total_akhir) }}
💬 Chat dengan Pelanggan
Belum ada pesan.

{{ msg.message }}

{{ formatChatTime(msg.created_at) }}

📊 Laporan Penjualan

Total Omset (Kasir + Online)
{{ formatRupiah(reportsSummary.total_pendapatan || 0) }}
Est. Keuntungan
{{ formatRupiah(reportsSummary.total_keuntungan || 0) }}
🧾 Penjualan Kasir
{{ formatRupiah((reportsSummary.kasir && reportsSummary.kasir.total_pendapatan) || 0) }}
{{ (reportsSummary.kasir && reportsSummary.kasir.jumlah_transaksi) || 0 }} transaksi
🌐 Pesanan Online
{{ formatRupiah((reportsSummary.online && reportsSummary.online.total_pendapatan) || 0) }}
{{ (reportsSummary.online && reportsSummary.online.jumlah_transaksi) || 0 }} transaksi
Kas Awal (Modal Buka Laci)
Kas Keluar (Pengeluaran)
- {{ formatRupiah(totalKasKeluar) }}
Belum ada kas keluar hari ini.
{{ entry.keterangan }}
{{ formatShortDate(entry.created_at) }}
- {{ formatRupiah(entry.jumlah) }}
Pendapatan Bersih
{{ formatRupiah(totalPendapatanBersih) }}
Omset − Kas Keluar
Estimasi Kas di Laci
{{ formatRupiah(estimasiKasLaci) }}
Kas Awal + Omset − Kas Keluar
Belum ada transaksi pada periode ini.
#{{ tx.invoice_code }}
{{ tx.nama_pelanggan || 'Pelanggan Umum' }} 💬 BELUM DIBALAS 💬 {{ tx.chat_count }}
{{ tx.status }}
{{ (tx.items || []).map(it => `${it.product_nama} x${it.qty}`).join(', ') }}
{{ formatShortDate(tx.tanggal) }} {{ formatRupiah(tx.total_akhir) }}
Tidak ditemukan pelanggan dengan nama/nomor tersebut.
{{ c.nama_pelanggan || 'Pelanggan Umum' }}
{{ c.no_wa_pelanggan || 'Tanpa nomor WA' }}
Transaksi terakhir: {{ formatShortDate(c.transaksi_terakhir) }}
{{ formatRupiah(c.total_belanja) }}
{{ c.jumlah_transaksi }}x transaksi

🍽️ Kelola Produk (Kasir)

📂 Pintasan Kategori

Tombol di bawah mengubah status seluruh menu dalam satu kategori. Menu tetap bisa diaktifkan atau dinonaktifkan satu per satu di daftar bawah.

{{ cat.nama }}
{{ products.filter(p => Number(p.kategori_id) === Number(cat.id) && p.is_active).length }} dari {{ products.filter(p => Number(p.kategori_id) === Number(cat.id)).length }} menu aktif
✨ Produk Baru

Kosongkan kalau tidak ada harga grosir untuk produk ini.

Preview
⚠️ Gambar tidak ditemukan di server

Contoh: "Cup" Rp5.000, "Plastik" Rp4.000 — pelanggan akan memilih salah satu saat pesan.

📦 Grosir: qty =
⚠️ Menampilkan stok menipis saja ({{ kasirFilteredProducts.length }})
🔍 Produk "{{ kasirProductSearch }}" tidak ditemukan. ✅ Tidak ada produk dengan stok menipis.
{{ p.nama }} NONAKTIF ⭐ BEST SELLER 👑 MEMBER
{{ formatRupiah(p.harga) }} • Stok: {{ p.stok_unlimited ? '∞ Tak Terbatas' : p.stok }}

Kosongkan kalau tidak ada harga grosir untuk produk ini.

Preview
⚠️ Gambar tidak ditemukan di server
📦 Grosir: qty =

🖼️ Kelola Banner/Iklan (Kasir)

Banner di sini akan muncul sebagai pop-up (harus ditutup pelanggan) setiap kali ada yang membuka aplikasi. Kosongkan semua banner kalau tidak ingin pop-up muncul sama sekali.

Belum ada banner. Unggah foto pertama di atas ✨

{{ b.is_active == 1 ? '✅ Tampil di pop-up' : '🚫 Disembunyikan' }}

📍 Kelola Area {{ zoneModalType === 'jastip' ? 'Jasa Titip' : 'Delivery' }}

Gambar area (desa/wilayah) yang boleh memesan Delivery langsung di peta. Ketuk peta untuk menambah titik batas area (minimal 3 titik), lalu beri nama & simpan. Kalau belum ada area yang diatur di sini, fitur Delivery tetap berlaku normal untuk semua pelanggan tanpa batasan lokasi.

Gambar area yang boleh mendaftar jadi Jasa Titip langsung di peta. Pelanggan yang lokasinya di luar area ini tidak akan bisa mendaftar jadi jastip. Kalau belum ada area yang diatur di sini, pendaftaran jastip tetap terbuka untuk siapa saja tanpa batasan lokasi.

Titik ditandai: {{ drawingZonePoints.length }} {{ drawingZonePoints.length > 0 && drawingZonePoints.length < 3 ? '(minimal 3)' : '' }}
Rp
Belum ada area {{ zoneModalType === 'jastip' ? 'jasa titip' : 'delivery' }} diatur. Gambar area pertama di peta atas ✨
📍

{{ z.nama }}

🛵 Min. belanja
Rp

👥 Daftar Pengunjung

Setiap perangkat yang membuka aplikasi ini hari ini otomatis tercatat di sini (dikenali dari perangkatnya, bukan akun), lengkap dengan waktu kunjungan terakhir, jenis/model perangkat, browser, alamat IP, dan perkiraan lokasi (kota/kabupaten) dari IP yang dipakai. Daftar ini dihitung harian — otomatis kosong lagi tiap pergantian hari.

{{ visitorsTotal }}

Perangkat Hari Ini

{{ visitorsToday }}

Total Kunjungan Hari Ini

Memuat...
Belum ada pengunjung hari ini.
📱

{{ v.device_label }}

Terakhir: {{ formatChatTime(v.last_seen) }} · {{ v.visit_count }}x kunjungan

IP: {{ v.ip_address }}

📍 {{ v.location_label }}

🍢

Memuat HarinFood...