SAKA POS
Resto POS · KDS Dapur · QR Order Meja

SAKA POS

Masuk untuk mengelola restoran Anda

{{ loginError }}

SakaPOS · Resto Management System

SAKA POS

{{ clockTime }}

{{ clockDate }}

{{ (user.name || '?').charAt(0).toUpperCase() }}
🔒

Shift kasir belum dibuka

Belum ada menu. Tambahkan dari tab Pengaturan.
Tidak ada menu yang cocok dengan pencarian / kategori.
# {{ allFilteredMenu.length }} menu Geser daftar untuk melihat menu lainnya
🔒

Shift Belum Dibuka

Buka shift kasir terlebih dahulu agar halaman kasir aktif dan dapat memproses transaksi.

Total Rp {{ formatNum(cartTotal) }}
✏️ Mengedit {{ editingOrder.order_number }}

Belum ada meja terdaftar, jadi nomor meja tidak bisa dipilih. Tambahkan meja di menu Meja dulu, atau pilih Takeaway.

Modul QR Order Meja nonaktif — nomor meja tidak wajib, Dine-In tetap bisa diproses tanpa meja.

▼
🛒

Keranjang masih kosong

Klik item menu untuk menambahkan

{{ item.name }}

Rp {{ formatNum(item.price) }}
Rp {{ formatNum(item.price * item.qty) }}
{{ item.qty }}
SubtotalRp {{ formatNum(cartSubtotal) }}
PPN Resto ({{ settingsForm.tax_rate }}%)Rp {{ formatNum(cartTax) }}
TOTAL BAYAR Rp {{ formatNum(cartTotal) }}
🔍
{{ selectedOrders.length }} pesanan dipilih
Belum ada pesanan aktif
Pelanggan “{{ activeOrderSearch }}” tidak ditemukan
{{ order.order_number }}
{{ order.payment_status === 'Paid' ? 'LUNAS' : 'PENDING' }}
🪑 {{ order.table_name || 'Walk-in' }} 👤 {{ order.customer_name || 'Pelanggan' }} ⏰ {{ formatTime(order.created_at) }}
{{ item.qty }}x {{ item.name }} Rp {{ formatNum(item.price * item.qty) }}

Note: "{{ item.note }}"

Total: Rp {{ formatNum(order.total) }}

👨‍🍳 Kitchen Display System (KDS Dapur)

Monitor dan perbarui status hidangan dapur secara real-time

👨‍🍳

Tidak ada antrean pesanan di dapur

{{ order.order_number }} {{ order.table_name || 'Tanpa Meja' }} 👤 {{ kitchenCustomerName(order) }}

⏰ {{ formatTime(order.created_at) }} • ({{ order.type }})

{{ item.qty }}x {{ item.name }}

Note: "{{ item.note }}"

💰 Kas Restoran

Pantau saldo kas serta catat setiap uang masuk (setoran) dan keluar (pengeluaran).

💰

Saldo Kas Saat Ini

Rp {{ formatNum(cashData.balance) }}

↗

Total Kas Masuk

Rp {{ formatNum(cashData.total_in) }}

↙

Total Kas Keluar

Rp {{ formatNum(cashData.total_out) }}

↗ Rincian Kas Masuk

{{ cat }} Rp {{ formatNum(val) }}

↙ Rincian Kas Keluar

{{ cat }} Rp {{ formatNum(val) }}

📒 Riwayat Pergerakan Kas

{{ cashData.logs.length }} catatan
Tipe Kategori Jumlah Keterangan Operator Waktu Aksi
Belum ada catatan kas. Klik "Kas Masuk / Kas Keluar" untuk memulai.
{{ log.type === 'in' ? 'MASUK' : 'KELUAR' }} {{ log.category || '-' }} {{ log.type === 'in' ? '+' : '-' }} Rp {{ formatNum(log.amount) }} {{ log.description || '-' }} {{ log.operator || '-' }} {{ formatTime(log.created_at) }} otomatis
Menampilkan {{ (cashPage - 1) * cashPerPage + 1 }}-{{ Math.min(cashPage * cashPerPage, cashData.logs.length) }} dari {{ cashData.logs.length }} catatan
Per halaman

🔄 Riwayat Shift Kasir

Rekap shift yang sudah ditutup beserta selisih kas fisik.

{{ shiftHistory.length }} shift
Sesi Kasir Dibuka Ditutup Kas Awal Penjualan Kas Diperkirakan Kas Akhir Selisih Aksi
Belum ada riwayat shift.
{{ s.shift_name || '-' }} {{ s.user_name || '-' }} {{ formatDateTime(s.opened_at) }} {{ formatDateTime(s.closed_at) }} Rp {{ formatNum(s.opening_cash) }} Rp {{ formatNum(s.sales_total) }} Rp {{ formatNum(s.expected_cash) }} Rp {{ formatNum(s.closing_cash) }} {{ s.difference >= 0 ? '+' : '' }} Rp {{ formatNum(s.difference) }}

📈 Laporan Penjualan & Analytics

Ringkasan lengkap pendapatan, transaksi, menu terlaris & ulasan pelanggan.

📊 Excel 📄 PDF
{{ reconReport.ok ? '✅' : '⚠️' }}

Hasil Cocokkan Rekap

{{ reconReport.ok ? 'Semua cocok — tidak ada selisih antara Riwayat Transaksi dan Laporan Shift.' : 'Ditemukan selisih/permasalahan — lihat rincian di bawah.' }}

Shift Jendela Waktu Laporan Shift Riwayat (filter Shift) Selisih
{{ r.name }} {{ formatDateTime(r.open) }} → {{ r.closed ? formatDateTime(r.closed) : 'berjalan' }} {{ r.modalCount }} trx · Rp {{ formatNum(r.modal) }} {{ r.riwayatCount }} trx · Rp {{ formatNum(r.riwayat) }} {{ r.diff === 0 ? '✓ 0' : (r.diff > 0 ? '+' : '') + 'Rp ' + formatNum(r.diff) }}
TOTAL Rp {{ formatNum(reconReport.totalShift) }} Rp {{ formatNum(reconReport.totalRiwayat) }} {{ reconReport.totalDiff === 0 ? '✓ 0' : (reconReport.totalDiff > 0 ? '+' : '') + 'Rp ' + formatNum(reconReport.totalDiff) }}

🧾 {{ reconReport.nullPaid.length }} transaksi lunas tanpa waktu bayar — tidak terhitung pada filter tanggal maupun laporan shift

Perbaiki dengan memperbarui waktu pembayaran transaksi agar tercatat pada tanggal & shift yang benar.

{{ o.order_number }} (dibuat {{ formatDateTime(o.created_at) }}) Rp {{ formatNum(o.total) }}

🕒 {{ reconReport.outside.length }} transaksi lunas di luar semua jendela shift (masuk Riwayat, tidak masuk Laporan Shift)

Cocokkan lewat filter tanggal di Riwayat, atau abaikan bila pembayaran memang terjadi di luar jam shift.

{{ o.order_number }} bayar {{ formatDateTime(o.paid_at) }} Rp {{ formatNum(o.total) }}
💵

Total Pendapatan

Rp {{ formatNum(reports.total_revenue) }}

📋

Transaksi Selesai

{{ reports.total_transactions }} Transaksi

📅

Pendapatan Hari Ini

Rp {{ formatNum(reports.today_revenue) }}

🧾

Transaksi Hari Ini

{{ reports.today_transactions }} Transaksi

⏳

Pesanan Menunggu

{{ reports.pending_orders }} Pending

Hutang: Rp {{ formatNum(reports.pending_total) }}

💹

Laporan Laba Rugi

Pendapatan penjualan, harga pokok (modal menu), biaya operasional & laba bersih.

Pendapatan Penjualan Rp {{ formatNum(reports.total_revenue) }}
Harga Pokok Penjualan (HPP) − Rp {{ formatNum(reports.cogs) }}

HPP masih Rp 0 karena harga modal belum diisi. Untuk produk belum jadi (makanan) HPP memang 0, tetapi produk jadi (minuman) yang modalnya belum diisi membuat Laba Kotor & Margin di bawah terlihat lebih besar dari kenyataannya. Isi modalnya di menu Manajemen › Menu.

Laba Kotor Rp {{ formatNum(reports.gross_profit) }}
Biaya Operasional (Pengeluaran Kas) − Rp {{ formatNum(reports.expenses) }}
LABA BERSIH Rp {{ formatNum(reports.net_profit) }}

Margin Laba Bersih

Total: Rp {{ formatNum(reports.total_revenue) }}

{{ reports.profit_margin }}%

Rata-rata per Transaksi Rp {{ formatNum(reports.total_transactions ? Math.round(reports.total_revenue / reports.total_transactions) : 0) }}
Margin Laba Kotor {{ reports.total_revenue ? Math.round((reports.gross_profit / reports.total_revenue) * 100) : 0 }}%

HPP dihitung dari harga modal menu. Biaya operasional diambil dari catatan pengeluaran kas (tab Kas).

📋

Laporan Hutang — Pesanan Belum Lunas

Tagihan pelanggan yang masih menunggu pelunasan.

Total Hutang Aktif

Rp {{ formatNum(reports.pending_total) }}

No. Order Pelanggan Tipe Meja Item Total Waktu Kasir
Tidak ada hutang aktif — semua pesanan sudah lunas. 🎉
{{ o.order_number }} {{ o.customer_name || '-' }} {{ o.type }} {{ o.table_name || '-' }} {{ o.items_count }}x Rp {{ formatNum(o.total) }} {{ formatDateTime(o.created_at) }} {{ o.cashier || '-' }}
TOTAL HUTANG Rp {{ formatNum(reports.pending_total) }}

🏆 Menu Terlaris

Belum ada data menu terjual.
{{ idx + 1 }}

{{ m.name }}

{{ m.total_qty }} terjual

Rp {{ formatNum(m.total_revenue) }}

⭐ Ulasan Pelanggan

⭐

{{ reports.review_stats?.average_rating || '0.0' }} / 5.0

{{ reports.review_stats?.total_reviews || 0 }} ulasan diterima

Total Pendapatan Rp {{ formatNum(reports.total_revenue) }}
Total Transaksi {{ reports.total_transactions }}
Rata-rata / Transaksi Rp {{ formatNum(reports.total_transactions ? Math.round(reports.total_revenue / reports.total_transactions) : 0) }}

📊 Penjualan Produk

{{ productSales.length }} produk terjual

{{ formatNum(productSummary.qty) }} pcs terjual · Pendapatan Rp {{ formatNum(productSummary.revenue) }}

No Produk Qty Terjual Transaksi Terakhir Dibeli Pendapatan Share
Belum ada penjualan produk pada periode ini.
{{ (productPage - 1) * productPerPage + i + 1 }} {{ p.name }} {{ p.qty }}x {{ p.orders }} {{ formatDateTime(p.last) }} Rp {{ formatNum(p.revenue) }}
{{ productSummary.revenue > 0 ? ((p.revenue / productSummary.revenue) * 100).toFixed(1) : 0 }}%
Menampilkan {{ (productPage - 1) * productPerPage + 1 }}-{{ Math.min(productPage * productPerPage, productSales.length) }} dari {{ productSales.length }} produk
Per halaman

📜 Riwayat Transaksi

{{ filteredPaidOrders.length }} selesai
Menampilkan Rp {{ formatNum(txSummary.total) }} dari {{ filteredPaidOrders.length }} transaksi
No. Order Pelanggan Tipe Metode Shift Tanggal / Waktu Total Aksi
Belum ada riwayat transaksi selesai.
{{ o.order_number }} {{ o.customer_name || '-' }} {{ o.type }} {{ o.payment_method || '-' }} {{ shiftBadge(o) }} — {{ formatDateTime(o.paid_at || o.created_at) }} Rp {{ formatNum(o.total) }}
Menampilkan {{ (txPage - 1) * txPerPage + 1 }}-{{ Math.min(txPage * txPerPage, filteredPaidOrders.length) }} dari {{ filteredPaidOrders.length }} transaksi
Per halaman

🧩 Fitur & Modul

Aktifkan / nonaktifkan modul aplikasi. Menu tab di bagian atas otomatis menyesuaikan. Untuk QR order meja, aktifkan satu atau keduanya: Bayar di Kasir & Bayar Sekarang QRIS.

Kitchen Display System (KDS)

Halaman dapur untuk memantau & memperbarui status pesanan masakan.

QR Order Meja

Pelanggan scan kode QR untuk melihat menu & memesan sendiri dari meja.

Bayar di Kasir (QR Order)

Izinkan pelanggan memilih 'Bayar di Kasir' saat order meja QR & melunasi di kasir.

QRIS Bayar Sekarang

Izinkan pelanggan memilih 'Bayar Sekarang' & lunasi via QRIS langsung saat order meja QR.

Kas Restoran

Modul pencatatan uang masuk & keluar kas.

Laporan & Rekap

Ringkasan pendapatan, top menu, dan ekspor laporan PDF/Excel.

Shift Kasir

Mewajibkan karyawan buka shift sebelum melayani transaksi.

🏪 Profil Restoran

Informasi yang tampil pada struk pembayaran dan halaman menu digital.

🛡️

Cloudflare Turnstile

OPSIONAL

Proteksi halaman pemesanan publik dari bot. Widget captcha gratis dari Cloudflare. Kosongkan jika tidak dipakai.

💳 Pajak & Pembayaran

Atur persentase pajak restoran dan metode pembayaran yang tersedia di kasir.

%
{{ m }}

📲 Pembayaran QRIS Otomatis

Aktifkan agar pembayaran QRIS terdeteksi otomatis oleh aplikasi notifier di HP kasir, lalu order langsung menjadi LUNAS tanpa konfirmasi manual.

Aktifkan Notifikasi QRIS

Terima pembayaran QRIS secara otomatis dari aplikasi notifier.

Salin token ini ke aplikasi notifier agar hanya aplikasi tersebut yang bisa memicu pembayaran.

Isi di aplikasi notifier (APK) bersama token. Server harus dapat diakses dari HP kasir.

🖨️ Printer Thermal Struk

Struk langsung dicetak ke printer thermal Bluetooth 58/80mm dari perangkat yang menjalankan SakaPOS. Pilih lebar kertas, cari & pilih printer Bluetooth di bawah, lalu aktifkan — struk otomatis dikirim setelah pembayaran lunas.

Aktifkan Cetak Struk Otomatis

Setelah transaksi lunas, struk otomatis dikirim ke printer Bluetooth terpilih.

🧑‍🍳 Cetak Struk Dapur

Cetak tiket pesanan untuk dapur secara otomatis setelah transaksi lunas (dipisah dari struk kasir, tanpa harga). Tombol cetak dapur juga tersedia di form cetak struk kasir.

Pilih printer Bluetooth thermal (58/80mm) dari daftar perangkat yang muncul setelah tombol cari diklik. Tombol Uji Cetak Struk akan mengirim langsung ke printer terpilih.

Terisi otomatis saat memilih perangkat dari daftar Bluetooth.

🔄 Shift Kasir

Atur daftar sesi shift. On/off sistem shift dikelola di .

Nama & jam sesi membantu kasir memilih sesi saat membuka shift. Jam lintas tengah malam didukung (mis. Malam 22:00 - 06:59).

s/d
Belum ada sesi shift. Klik "+ Tambah Sesi" untuk menambah.

👥 Akun Pengguna & Peran

Kelola akun login staf restoran dan hak aksesnya.

Nama Email Peran Aksi
{{ u.name }} Anda {{ u.email }} {{ roleLabel(u.role) }}

📖 Menu Restoran

Kelola daftar menu, harga, kategori & ketersediaan stok.

🗂️ Kategori Menu

{{ cat.name }}
{{ menuInitials(item.name) }}
{{ item.category?.name }}
Habis

{{ item.name }}

Rp {{ formatNum(item.price) }}

🪑 Meja Restoran

Kelola nomor meja, kapasitas dan status. Klik sakelar untuk ubah status.

{{ t.number }}

Kapasitas {{ t.capacity }}

📱 Kode QR Pemesanan Meja

Cetak & tempel di meja. Pelanggan scan untuk pesan langsung ke dapur.

{{ settingsForm.resto_name || 'Resto' }}

{{ t.number }}

Kapasitas {{ t.capacity }}

Cara Order

1. Scan kode QR di atas

2. Pilih menu & jumlahnya

3. Kirim ke dapur, lalu bayar di kasir atau Bayar Sekarang QRIS

3. Kirim ke dapur, lalu bayar di kasir

👤 Pelanggan

Daftar pelanggan — dipilih cepat lewat kolom nama saat transaksi POS.

{{ editingCustomerId ? '✏️ Edit Pelanggan' : '➕ Pelanggan Baru' }}

Nama No. HP Catatan Jml Order Aksi
{{ c.name }} {{ c.phone || '-' }} {{ c.notes || '-' }} {{ orders.filter(o => o.customer_name === c.name).length }}
Belum ada pelanggan terdaftar. Tambahkan lewat tombol di atas.

⭐ Ulasan Pelanggan

Rating & komentar dari pelanggan menu digital QR & kasir.

⭐

Rata-rata Rating

{{ reviewsAvg }} / 5

💬

Total Ulasan

{{ reviews.length }}

👍

Positif (4-5)

{{ reviewsPositive }}

👎

Rendah (1-2)

{{ reviewsNegative }}

{{ (r.customer_name || '?').charAt(0).toUpperCase() }}

{{ r.customer_name || 'Pelanggan' }}

{{ r.table_name ? 'Meja ' + r.table_name : 'Walk-in' }} • {{ formatDateTime(r.created_at) }}

⭐

{{ r.comment }}

Tanpa komentar tertulis.

⭐

Belum ada ulasan pelanggan.

Ulasan akan muncul di sini setelah pelanggan memberi rating.

Menampilkan {{ (reviewPage - 1) * reviewPerPage + 1 }}-{{ Math.min(reviewPage * reviewPerPage, reviews.length) }} dari {{ reviews.length }} ulasan
Per halaman

🕘 Riwayat Perubahan

Keterangan fitur baru & perbaikan bug tiap versi aplikasi. Saat ini terpasang versi v{{ appVersion }}.

Belum ada catatan riwayat perubahan.
✅

v{{ item.version }} — {{ item.date }} TERPASANG

{{ item.subject }}

  • {{ line }}

💾 Backup Data

Unduh seluruh data aplikasi (transaksi, menu, kategori, meja, kas, shift, ulasan, akun & pengaturan) ke file JSON. Simpan file ini di tempat aman untuk cadangan / pindah perangkat.

📥 Pulihkan Data

Pilih file backup .json lalu pulihkan. Seluruh data aplikasi saat ini akan DIGANTI oleh isi file backup.

🔄 Riset Data

Hapus SEMUA transaksi, pesanan, menu, kategori, meja, ulasan, kas & shift. Akun & pengaturan TIDAK ikut terhapus. Tindakan ini tidak bisa dibatalkan — unduh backup dulu sebelum melanjutkan.

{{ confirmState.title }}

{{ confirmState.danger ? '⚠️' : '❓' }}

{{ confirmState.message }}

👤 Profil Saya

{{ (user.name || '?').charAt(0).toUpperCase() }}

{{ user.name }}

{{ user.email }}

{{ user.role }}

🔒 Ganti Password

🔄 Pembaruan Aplikasi

⏳ Memeriksa versi terbaru dari situs sumber...
Versi terpasang v{{ updateInfo.current }}
Versi sumber v{{ updateInfo.latest }}
Rilis sumber {{ new Date(updateInfo.released_at).toLocaleString('id-ID', { day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' }) }}
Status Situs sumber (master) 🔔 Ada pembaruan ✓ Sudah terbaru

{{ String(sec.label).replace(/^#\s*/, '') }}

Yang baru

  • ▸{{ n }}

{{ updateInfo.error }}

{{ updateState === 'queued' ? 'Menunggu penjadwal (maksimal 60 detik)...' : 'Sedang memperbarui — mohon tunggu tanpa menutup jendela.' }}
{{ updateLog }}

{{ userForm.id ? '✏️ Ubah Akun' : '➕ Tambah Akun' }}

💵 Proses Pembayaran Kasir

Tipe Transaksi: {{ orderType }} ({{ orderType === 'Dine-In' ? (selectedTable || (featureOn('qr_order_enabled') ? 'nomor meja belum dipilih' : 'tanpa meja')) : selectedTable }})
Total Item: {{ cart.reduce((a, b) => a + b.qty, 0) }} Porsi
{{ item.qty }}x {{ item.name }}Rp {{ formatNum(item.price * item.qty) }}
Note: "{{ item.note }}"
TOTAL TAGIHAN: Rp {{ formatNum(cartTotal) }}
Kembalian: Rp {{ formatNum(cashChange) }}
QRIS
QRIS statis belum diatur di Pengaturan > Pembayaran

Minta pelanggan memindai QRIS di atas

Rp {{ formatNum(cartTotal) }}

Menyiapkan pembayaran QRIS...

💵 Proses Pembayaran Kasir

No. Pesanan: {{ settleOrder.order_number }}
Tipe Transaksi: {{ settleOrder.type }} ({{ settleOrder.table_name || 'tanpa meja' }})
Total Item: {{ settleOrder.items?.reduce((a, b) => a + b.qty, 0) }} Porsi
TOTAL TAGIHAN: Rp {{ formatNum(settleTotal) }}
Kembalian: Rp {{ formatNum(settleChange) }}
QRIS
QRIS statis belum diatur di Pengaturan > Pembayaran

Minta pelanggan memindai QRIS di atas

Rp {{ formatNum(settleTotal) }}

Menyiapkan pembayaran QRIS otomatis...

✏️ Edit Metode Pembayaran

No. Pesanan: {{ editPaymentOrder.order_number }}
Pelanggan: {{ editPaymentOrder.customer_name || '-' }}
Metode saat ini: {{ editPaymentOrder.payment_method || '-' }}
TOTAL: Rp {{ formatNum(editPaymentOrder.total) }}

Daftar metode kosong — tambahkan di Pengaturan › Pembayaran.

Perubahan otomatis diterapkan ke Riwayat Transaksi, Laporan, Keuangan, dan rincian per metode di rekap shift.

🔗 Gabungkan Pesanan

Gabungkan {{ selectedOrders.length }} pesanan yang belum lunas menjadi satu? Item yang sama akan dijumlahkan otomatis.

{{ o.order_number }}
{{ o.type }} · {{ (o.items || []).reduce((a, b) => a + b.qty, 0) }} porsi · {{ (o.items || []).length }} item
Rp {{ formatNum(o.total) }}
+
= Hasil gabungan
{{ it.name }} ({{ it.note }}) ×{{ it.qty }} Rp {{ formatNum(it.price * it.qty) }}
TOTAL GABUNGAN Rp {{ formatNum(mergeCombinedTotal) }}

Menunggu Pembayaran QRIS...

Aplikasi notifier akan mendeteksi pembayaran dan mengonfirmasi otomatis.

QRIS
QRIS statis belum diatur di Pengaturan > Pembayaran

Minta pelanggan memindai QRIS di atas

No. Pesanan {{ qrisWaiting.order_number }}
Total Rp {{ formatNum(qrisWaiting.total) }}
⏰ {{ qrisCountdown }} detik

Sesi pembayaran QRIS dibatasi 120 detik.

⏰ Batas waktu pembayaran habis.
Tutup sesi & minta pemindaian ulang jika perlu.

Notifier tidak berubah? Minta pelanggan buka aplikasi pembayaran, lalu tekan verifikasi di bawah.

{{ editingMenuId ? '✏️ Edit Item Menu' : '➕ Tambah Item Menu Baru' }}

{{ editingTableId ? '✏️ Edit Meja' : '🪑 Tambah Meja Baru' }}

🗑️ Hapus Kategori

⚠️

Anda akan menghapus kategori

{{ deleteCategoryTarget?.name }}

Tindakan ini tidak dapat dibatalkan.

⛔ Kategori ini masih memiliki {{ deleteCatMenuCount }} menu. Kategori tidak bisa dihapus selama masih ada menu di dalamnya.

{{ deleteCategoryError }}

🔓 Buka Shift Kasir

🔒 Tutup Shift Kasir

Kas AwalRp {{ formatNum(shiftData.opening_cash) }}
Penjualan ShiftRp {{ formatNum(shiftData.sales_total) }}
Kas KeluarRp {{ formatNum(shiftData.cash_out) }}
Kas DiperkirakanRp {{ formatNum(shiftData.expected_cash) }}

Rincian Penjualan per Metode

{{ m.method }} ({{ m.count }} trx) Rp {{ formatNum(m.total) }}
Total {{ shiftData.sales_count }} trx · Rp {{ formatNum(shiftData.sales_total) }}

📄 Laporan Shift Kasir {{ shiftReportData.shift.shift_name }}

{{ shiftReportData.shift.closed_at ? 'Shift ditutup' : 'Shift masih berjalan — angka dapat berubah' }} · {{ shiftReportData.shift.user_name || '-' }}

Periode

{{ formatDateTime(shiftReportData.shift.opened_at) }} → {{ shiftReportData.shift.closed_at ? formatDateTime(shiftReportData.shift.closed_at) : 'Sekarang' }}

Kas Awal

Rp {{ formatNum(shiftReportData.shift.opening_cash) }}

Penjualan ({{ shiftReportData.shift.sales_count }} trx)

Rp {{ formatNum(shiftReportData.shift.sales_total) }}

Kas Tunai Penjualan

Rp {{ formatNum(shiftReportData.shift.cash_sales) }}

Kas Masuk Manual

+ Rp {{ formatNum(shiftReportData.shift.cash_in) }}

Kas Keluar

− Rp {{ formatNum(shiftReportData.shift.cash_out) }}

Kas Diperkirakan

Rp {{ formatNum(shiftReportData.shift.expected_cash) }}

Kas Akhir

{{ shiftReportData.shift.closing_cash !== null ? 'Rp ' + formatNum(shiftReportData.shift.closing_cash) : '—' }}

Selisih

{{ shiftReportData.shift.difference >= 0 ? '+' : '' }} Rp {{ formatNum(shiftReportData.shift.difference) }}

—

📝 {{ shiftReportData.shift.notes }}

Rincian Penjualan per Metode

{{ m.method }}

Rp {{ formatNum(m.total) }}

{{ m.count }} transaksi

🧾 Transaksi Shift ({{ shiftReportData.transactions.length }})

No. Order Waktu Pelanggan Metode Total
Tidak ada transaksi pada shift ini.
{{ t.order_number }} {{ formatTime(t.paid_at || t.created_at) }} {{ t.customer_name || (t.table_name ? 'Meja ' + t.table_name : '-') }} {{ t.payment_method || '-' }} Rp {{ formatNum(t.total) }}

💸 Pergerakan Kas Manual

Tipe Kategori Jumlah Keterangan Operator Waktu
Tidak ada pergerakan kas manual.
{{ cl.type === 'in' ? 'MASUK' : 'KELUAR' }} {{ cl.category || '-' }} {{ cl.type === 'in' ? '+' : '-' }} Rp {{ formatNum(cl.amount) }} {{ cl.description || '-' }} {{ cl.operator || '-' }} {{ formatTime(cl.created_at) }}

Shift Ditutup

Shift {{ closeRecap.shift.shift_name || 'Kasir' }} oleh {{ closeRecap.shift.user_name }} berhasil ditutup.

Kas AwalRp {{ formatNum(closeRecap.shift.opening_cash) }}
Penjualan ShiftRp {{ formatNum(closeRecap.shift.sales_total) }}
Kas KeluarRp {{ formatNum(closeRecap.shift.cash_out) }}
Kas DiperkirakanRp {{ formatNum(closeRecap.shift.expected_cash) }}
Kas AkhirRp {{ formatNum(closeRecap.shift.closing_cash) }}
Selisih Kas {{ closeRecap.shift.difference >= 0 ? '+' : '' }} Rp {{ formatNum(closeRecap.shift.difference) }}

{{ cashForm.type === 'in' ? '↗ Kas Masuk' : '↙ Kas Keluar' }}

Saldo Saat Ini Rp {{ formatNum(cashData.balance) }}

🖨️ Cetak Struk Kasir

🖨️

Transaksi {{ receiptOrder.order_number }}

Rp {{ formatNum(receiptOrder.total) }}

Struk akan langsung dikirim ke printer thermal yang terhubung. Tekan Cetak Struk untuk mengirim.

{{ toast.message }}