Ringkasan
Dashboard bisnis
Ringkasan periode {{ dashboardPeriodLabel }} mengikuti data toko, barang, penjualan, beban, absensi, gaji, dan laba rugi.
Pilih range tanggal
Klik tanggal awal lalu tanggal akhir.
Pendapatan
{{ formatMoney(dashboard?.totals?.revenue || 0) }}
Pengeluaran
{{ formatMoney(dashboard?.totals?.totalBebanPeriode || 0) }}
HPP
{{ formatMoney(dashboard?.totals?.hpp || 0) }}
Laba Bersih
{{ formatMoney(dashboard?.totals?.netProfit || 0) }}
Total Transaksi Penjualan
{{ dashboard?.counts?.totalOrders || 0 }} Pesanan
Tren Pendapatan
Kontribusi Platform
| Platform & Toko | Total Pesanan | Total Produk | Total Penjualan |
|---|---|---|---|
| {{ row.label }} | {{ row.totalOrders }} | {{ row.totalQty }} | {{ formatMoney(row.totalSales) }} |
| Belum ada data penjualan. | |||
Kinerja Top Produk
| Rank | Nama Produk | QTY | Total Penjualan |
|---|---|---|---|
| {{ row.rank }} | {{ row.name }} | {{ row.qty }} | {{ formatMoney(row.totalSales) }} |
| Belum ada data penjualan. | |||
Ringkasan
Halo, {{ user.fullName }}
Ringkasan akses Anda: gaji, absensi, uang makan, dan lemburan periode {{ salaryWeekLabel }}.
Gaji
{{ formatMoney(mySalaryRow?.netSalary || 0) }}
Absen
{{ mySalaryRow?.presentDays || 0 }} hari
Hari ini: belum absen sudah masuk{{ todayAttendance.isLate ? ' (Telat)' : '' }} lengkap
Uang Makan
{{ formatMoney(mySalaryRow?.allowanceTotal || 0) }}
{{ formatMoney(mySalaryRow?.mealAllowance || 0) }} / hari hadir
Lemburan
{{ formatMoney(mySalaryRow?.overtimePay || 0) }}
Periode {{ salaryWeekLabel }}
Karyawan
Data karyawan
Kelola akun karyawan, jabatan, shift, dan komponen gaji.
| Nama | Username | Jabatan | Shift | Gaji Harian | Wajah | Status | Aksi | |
|---|---|---|---|---|---|---|---|---|
| {{ row.fullName }} | {{ row.username }} | {{ row.jobTitle || '-' }} | {{ row.workShift || '-' }} | {{ formatMoney(row.dailyWage) }} | {{ row.faceRegistered ? 'Terdaftar' : 'Belum' }} | {{ row.active ? 'Aktif' : 'Nonaktif' }} | ||
| Belum ada data karyawan. |
Wajah
Daftar wajah
Daftar wajah cukup dilakukan satu kali. Setelah tersimpan, absensi harian dilakukan dari tab Absensi.
{{ faceStatus || 'Kamera belum aktif.' }} Alur: buka kamera, ambil foto, lalu simpan wajah sebagai acuan profil.
Foto yang akan disimpan
Absensi
{{ isAttendanceSelfView ? 'Absensi mandiri' : 'Rekap absensi' }}
{{ isAttendanceSelfView ? 'Catat absensi masuk dan pulang Anda menggunakan kamera, lalu lihat riwayat absensi pribadi.' : 'Owner/Kepala Toko bisa memantau, menambah, dan mengoreksi absensi (misalnya izin/sakit/cuti atau lupa absen) dari sini.' }}
Wajah Anda belum terdaftar. Daftarkan wajah terlebih dahulu sebelum bisa absen.
Jam masuk: {{ myShiftWindow.checkInStart }} - {{ myShiftWindow.checkInDeadline }} (batas telat), jam pulang mulai {{ myShiftWindow.checkOutStart }} · Shift: {{ myShiftWindow.name }}
Status hari ini: Belum absen masuk Sudah absen masuk{{ todayAttendance.isLate ? ' (Telat)' : '' }}, belum absen pulang Absensi hari ini lengkap
Wajah sudah terdaftar. Daftar ulang wajah
Ambil foto untuk {{ !todayAttendance ? 'absen masuk' : 'absen pulang' }}
Posisikan wajah Anda di depan kamera, lalu klik Ambil Foto & Kirim Absen.
{{ faceStatus || 'Kamera belum aktif.' }}
{{ row.user?.fullName || user.fullName }}
{{ formatDate(row.workDate) }}
Masuk
{{ row.checkInAt ? formatDateTime(row.checkInAt) : '-' }}
Pulang
{{ row.checkOutAt ? formatDateTime(row.checkOutAt) : '-' }}
Metode
{{ row.method }}
Lokasi
Masuk: {{ row.checkInLocationName }}
Pulang: {{ row.checkOutLocationName }}
| Nama | Tanggal | Masuk | Pulang | Metode | Status | Telat | Lokasi | Foto | Jam Lembur | Aksi | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ row.user?.fullName || user.fullName }} | {{ formatDate(row.workDate) }} | {{ row.checkInAt ? formatDateTime(row.checkInAt) : '-' }} | {{ row.checkOutAt ? formatDateTime(row.checkOutAt) : '-' }} | {{ row.method }} | {{ row.status }} | Telat - {{ row.shiftName }} |
Masuk: {{ row.checkInLocationName }} Pulang: {{ row.checkOutLocationName }} - |
{{ row.overtimeHours ? row.overtimeHours.toFixed(1) + ' jam' : '-' }} | |||
| Belum ada data absensi. |
Data Toko
Master toko
Struktur mengikuti sheet Data Toko pada workbook acuan.
| Nama Platform/Toko | Nama Akun/Toko | Nama Lengkap Toko | Pajak Iklan | Aksi | |
|---|---|---|---|---|---|
| {{ row.platform }} | {{ row.name }} | {{ row.platformStore }} | {{ formatPercent(row.taxRate) }} | ||
| Belum ada data toko. | |||||
Data Barang
Master barang
Barang, SKU, jenis, dan HPP mengikuti sheet Data Barang.
Import barang terakhir: {{ productImportSummary.productsCreated }} barang baru, {{ productImportSummary.productsUpdated }} barang diperbarui.
| SKU {{ serverSortIndicator(productFilters, 'sku') }} | Nama Barang {{ serverSortIndicator(productFilters, 'name') }} | Jenis {{ serverSortIndicator(productFilters, 'variant') }} | HPP {{ serverSortIndicator(productFilters, 'hpp') }} | Aksi | |
|---|---|---|---|---|---|
| {{ row.sku }} | {{ row.name }} | {{ row.variant }} | {{ formatMoney(row.hpp) }} HPP belum diisi | ||
| Belum ada data barang. | |||||
Menampilkan {{ products.length }} dari {{ productPagination.total }} barang
Penjualan
Rekap penjualan
Mencatat transaksi penjualan berdasarkan acuan laporan penjualan Excel.
Import terakhir: {{ importSummary.salesCreated }} transaksi masuk, {{ importSummary.salesSkipped }} duplikat dilewati, {{ importSummary.productsCreated }} barang baru, {{ importSummary.productsUpdated }} barang diperbarui.
| Tanggal {{ serverSortIndicator(saleFilters, 'saleDate') }} | Channel {{ serverSortIndicator(saleFilters, 'channel') }} | Toko {{ serverSortIndicator(saleFilters, 'storeName') }} | No Pesanan {{ serverSortIndicator(saleFilters, 'orderNumber') }} | Pelanggan {{ serverSortIndicator(saleFilters, 'customer') }} | Item {{ serverSortIndicator(saleFilters, 'itemCount') }} | Qty {{ serverSortIndicator(saleFilters, 'totalQty') }} | Sub Total {{ serverSortIndicator(saleFilters, 'totalSubtotal') }} | Biaya Admin {{ serverSortIndicator(saleFilters, 'totalAdminFee') }} | HPP {{ serverSortIndicator(saleFilters, 'totalHpp') }} | Laba {{ serverSortIndicator(saleFilters, 'profit') }} | Detail | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ formatDate(row.saleDate) }} | {{ row.channel }} | {{ row.storeName }} | {{ row.orderNumber || '-' }} | {{ row.customer || '-' }} | {{ row.itemCount }} | {{ row.totalQty }} | {{ formatMoney(row.totalSubtotal) }} | {{ formatMoney(row.totalAdminFee) }} | {{ formatMoney(row.totalHpp) }} | {{ formatMoney(row.totalSubtotal - row.totalAdminFee - row.totalHpp) }} | ||
| Belum ada data penjualan. |
Menampilkan {{ sales.length }} dari {{ salePagination.total }} transaksi
Beban Operasional
Input beban operasional
Tanggal, kategori, keterangan, nominal, dan pembayaran.
| Tanggal | Kategori | Keterangan | Nominal | Pembayaran | Aksi | |
|---|---|---|---|---|---|---|
| {{ formatDate(row.expenseDate) }} | {{ row.category }} | {{ row.description }} | {{ formatMoney(row.nominal) }} | {{ row.paymentMethod }} | ||
| Belum ada data beban operasional. | ||||||
Beban Marketing
Input beban marketing
Tanggal, kategori, platform & toko, keterangan, dan nominal.
Import marketing terakhir: {{ marketingImportSummary.marketingCreated }} data baru, {{ marketingImportSummary.marketingUpdated }} data diperbarui.
| Tanggal | Kategori | Toko | Keterangan | Nominal | Pajak Iklan | Total Pajak | Aksi | |
|---|---|---|---|---|---|---|---|---|
| {{ formatDate(row.expenseDate) }} | {{ row.category }} | {{ row.platformStore }} | {{ row.description }} | {{ formatMoney(row.nominal) }} | {{ formatPercent(row.taxRate) }} | {{ formatMoney(row.totalTax) }} | ||
| Belum ada data beban marketing. | ||||||||
Laporan Gaji
Rekap gaji mingguan
Hitung otomatis dari jumlah hadir, gaji harian, uang makan, bonus, THR, lemburan (per jam), dan potongan periode Minggu-Sabtu.
Total Gaji
Periode penggajian {{ salaryWeekLabel }}
{{ formatMoney(salaryTotal) }}
Laporan Gaji Owner
| Nama | Hadir | Gaji Harian | Uang Makan | Jam Lembur | Lemburan | Bonus | THR | Potongan | Gaji Bersih | Status Gajian |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ row.user.fullName }} | {{ row.presentDays }} | {{ formatMoney(row.dailyWage) }} | {{ formatMoney(row.allowanceTotal) }} | {{ row.overtimeHours.toFixed(1) }} | {{ formatMoney(row.overtimePay) }} | {{ formatMoney(row.bonus) }} | {{ formatMoney(row.thr) }} | {{ formatMoney(row.deduction) }} | {{ formatMoney(row.netSalary) }} |
{{ row.paid ? 'Sudah Dibayar' : 'Belum Dibayar' }}
|
Laporan Gaji Karyawan
| Nama | Hadir | Gaji Harian | Uang Makan | Jam Lembur | Lemburan | Bonus | THR | Potongan | Gaji Bersih | Status Gajian |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ row.user.fullName }} | {{ row.presentDays }} | {{ formatMoney(row.dailyWage) }} | {{ formatMoney(row.allowanceTotal) }} | {{ row.overtimeHours.toFixed(1) }} | {{ formatMoney(row.overtimePay) }} | {{ formatMoney(row.bonus) }} | {{ formatMoney(row.thr) }} | {{ formatMoney(row.deduction) }} | {{ formatMoney(row.netSalary) }} |
{{ row.paid ? 'Sudah Dibayar' : 'Belum Dibayar' }}
|
| Belum ada laporan gaji. | ||||||||||
Laba Rugi
Laporan laba rugi
Disusun dari pendapatan, HPP, beban operasional, marketing, biaya admin, dan non-operasional.
Periode laporan
{{ profitReport?.periodLabel || dashboardPeriodLabel }}
Mengikuti filter periode di dashboard.
Pilih range tanggal
Klik tanggal awal lalu tanggal akhir.
Pendapatan
{{ formatAccountingMoney(profitReport?.totals?.revenue || 0) }}
Laba Kotor
{{ formatAccountingMoney(profitReport?.totals?.grossProfit || 0) }}
Total Beban Operasional
{{ formatAccountingMoney(profitReport?.totals?.operatingExpense || ((profitReport?.totals?.operational || 0) + (profitReport?.totals?.marketing || 0) + (profitReport?.totals?.adminFee || 0))) }}
Laba Bersih
{{ formatAccountingMoney(profitReport?.totals?.netProfit || 0) }}
Pendapatan
Dikelompokkan per channel penjualan
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| JUMLAH PENDAPATAN | {{ formatAccountingMoney(profitReport?.totals?.revenue || 0) }} |
Beban Operasional Toko
Beban gaji, listrik, telekomunikasi, dan lain-lain
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| JUMLAH BEBAN OPERASIONAL TOKO | {{ formatAccountingMoney(profitReport?.totals?.operational || 0) }} |
Beban Marketing
Nominal sudah termasuk pajak iklan
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| JUMLAH BIAYA MARKETING | {{ formatAccountingMoney(profitReport?.totals?.marketing || 0) }} |
| Nominal iklan | {{ formatAccountingMoney(profitReport?.totals?.marketingNominal || 0) }} |
| Pajak iklan | {{ formatAccountingMoney(profitReport?.totals?.marketingTax || 0) }} |
Biaya Admin
Komisi dan biaya admin per channel
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| JUMLAH BIAYA ADMIN | {{ formatAccountingMoney(profitReport?.totals?.adminFee || 0) }} |
Pendapatan dan Beban Non Operasional
Jika belum ada data, nilainya akan tampil sebagai dash
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| Jumlah Pendapatan Non Operasional | {{ formatAccountingMoney(profitReport?.totals?.nonOperationalIncome || 0) }} |
| Keterangan | Nominal |
|---|---|
| {{ row.label }} | {{ formatAccountingMoney(row.amount) }} |
| Jumlah Beban Non Operasional | {{ formatAccountingMoney(profitReport?.totals?.nonOperationalExpense || 0) }} |
Total Beban Operasional
{{ formatAccountingMoney(profitReport?.totals?.operatingExpense || 0) }}
Pendapatan Operasional
{{ formatAccountingMoney(profitReport?.totals?.operatingProfit || 0) }}
Laba Bersih
{{ formatAccountingMoney(profitReport?.totals?.netProfit || 0) }}
Total Pendapatan Non Operasional
{{ formatAccountingMoney(profitReport?.totals?.nonOperationalIncome || 0) }}
Pengaturan
Reset database
Hapus seluruh data transaksi dan master untuk bisnis yang sedang aktif ({{ currentBusinessId === 'all' ? 'pilih satu bisnis dahulu' : (businesses.find(b => String(b.id) === String(currentBusinessId))?.name || '-') }}), lalu data bisnis tersebut dibuat ulang. Bisnis lain dan akun owner tidak terpengaruh. Aksi ini hanya bisa dijalankan dengan password admin.
Yang akan dihapus (bisnis aktif saja)
- • Data penjualan dan import Excel
- • Data barang, toko, beban, absensi, dan laporan
- • Karyawan pada bisnis ini (akun owner tidak terhapus)
Setelah reset, silakan masuk lagi dengan akun admin awal.
Pengaturan
Jam kerja & toleransi telat
Absensi masuk setelah batas telat akan tetap tercatat, namun ditandai "Telat".
Penggajian tetap dihitung per minggu Minggu-Sabtu; ini hanya label pengingat hari pembayaran.
Lokasi & radius absensi
Jika diaktifkan, absensi masuk/pulang di luar radius akan ditolak sistem. Pastikan Anda berada di lokasi toko sebelum mengambil koordinat.
Koordinat tersimpan
{{ attendanceSettingsForm.latitude !== null && attendanceSettingsForm.latitude !== undefined ? `${attendanceSettingsForm.latitude.toFixed(6)}, ${attendanceSettingsForm.longitude.toFixed(6)}` : 'Belum diset' }}
Shift kerja (dinamis)
Untuk karyawan yang jam kerjanya berubah-ubah (pagi/malam). Assign shift ke karyawan lewat Ubah Karyawan.
| Nama Shift | Jam Masuk | Batas Telat | Jam Pulang | Status | Aksi |
|---|---|---|---|---|---|
| {{ row.name }} | {{ row.checkInStart }} | {{ row.checkInDeadline }} | {{ row.checkOutStart }} | {{ row.active ? 'Aktif' : 'Nonaktif' }} | |
| Belum ada shift kerja. | |||||
Hari libur
Absensi di hari Minggu otomatis dihitung lembur. Tambahkan tanggal lain (hari libur nasional/cuti bersama) di sini agar ikut otomatis dihitung lembur.
| Tanggal | Keterangan | Aksi |
|---|---|---|
| {{ formatDate(row.date) }} | {{ row.label || '-' }} | |
| Belum ada hari libur tambahan. | ||