## 1. Pendahuluan

### Tentang UMI Cell

UMI Cell adalah sistem manajemen Konter berbasis web yang dirancang untuk memudahkan pengelolaan bisnis HP, meliputi:

- ✅ Manajemen Produk dengan Multi-Cabang & Multi-Harga
- ✅ Transaksi Pembelian & Penjualan
- ✅ Service & Reparasi HP dengan Tracking Status
- ✅ Portal Customer untuk Cek Status Service & History Transaksi
- ✅ Dashboard Admin dengan Monitoring Real-time
- ✅ Manajemen Pelanggan & Supplier
- ✅ Laporan Laba Rugi, Stok, dan Kinerja
- ✅ QR Code untuk Produk & Transaksi
- ✅ Import Produk via Excel

### Kebutuhan Sistem

Komponen | Spesifikasi
--- | ---
Web Server | Apache/Nginx + PHP 8.1+
Database | MySQL 5.7+ / MariaDB
Browser | Chrome, Firefox, Edge (versi terbaru)
Kamera (Optional) | Untuk fitur scan QR Code

## 2. Login & Akses

### Cara Login

Langkah 1: Buka browser dan akses URL aplikasi (contoh: https://codekilat.my.id/umi-cell/)
Langkah 2: Masukkan `Email` dan `Password`
Langkah 3: Klik tombol Login

### Tipe User & Hak Akses

Role | Akses & Wewenang
--- | ---
Super Admin | Akses penuh ke semua fitur, manage user & cabang
Admin | Kelola transaksi, produk, service, dan laporan
Kasir | Input transaksi penjualan & pembelian
Teknisi | Kelola service, update status service
Customer | Cek status service

⚠️ Keamanan: Jaga kerahasiaan password. Logout setelah selesai. Jangan share akun.

## 3. Dashboard & Portal Customer

### 3.1 Dashboard Admin

Dashboard Admin merupakan halaman utama yang ditampilkan setelah login sebagai Admin, Super Admin, Kasir, atau Teknisi. Dashboard menyediakan ringkasan informasi penting untuk monitoring bisnis.

#### Informasi di Dashboard Admin

📊 Dashboard Admin menampilkan 3 Section Utama:

#### 1. Produk yang Sudah Mencapai Batas Minimum Stok

Section ini menampilkan tabel dengan kartu merah (danger) yang berisi informasi produk yang stoknya sudah rendah atau mencapai batas minimum. Menampilkan maksimal 10 produk dengan stok terendah.

Kolom | Informasi
--- | ---
# | Nomor urut
Kode Produk | Format: B-0001, B-0002, dst (auto generated dari ID produk)
Nama Produk | Nama lengkap produk
Cabang | Nama cabang tempat produk berada
Stok Saat Ini | Jumlah stok tersedia (badge merah dengan unit)
Stok Minimum | Batas minimum stok yang ditentukan
Status | Badge status: - Hitam "Habis": Stok = 0 - Merah "Di Bawah Minimum": Stok kurang dari Min Stock - Kuning "Mencapai Minimum": Stok sama dengan Min Stock

✅ Jika semua stok aman: Muncul alert hijau dengan pesan "Semua produk masih aman, tidak ada yang mencapai batas minimum stok"

#### 2. Peringkat Produk Terlaris

Section ini menampilkan tabel dengan kartu hijau (success) yang berisi 10 produk dengan penjualan tertinggi.

Kolom | Informasi
--- | ---
# | Ranking (1-10)
Produk | Nama produk (bold) dan nama merek (kecil abu-abu di bawahnya)
Terjual | Total quantity yang terjual (badge hijau)
Pendapatan | Total pendapatan dari produk tersebut (dalam Rupiah)

📌 Catatan: Data ini dihitung dari SEMUA transaksi penjualan yang pernah tercatat di sistem, bukan hanya periode tertentu.

#### 3. Peringkat Customer

Section ini menampilkan tabel dengan kartu biru (info) yang berisi 10 customer dengan total belanja tertinggi.

Kolom | Informasi
--- | ---
# | Ranking (1-10)
Customer | Nama customer (bold) dan nomor WhatsApp (kecil abu-abu di bawahnya)
Transaksi | Total jumlah transaksi (badge biru dengan format: 5x, 10x, dst)
Total Belanja | Total uang yang telah dibelanjakan (dalam Rupiah)

📌 Catatan: Hanya customer yang pernah tercatat dalam transaksi yang akan muncul di ranking ini.
💡 Tips Menggunakan Dashboard:

- Cek section "Produk Mencapai Batas Minimum Stok" setiap hari untuk mengetahui produk yang perlu di-restock
- Gunakan data "Peringkat Produk Terlaris" untuk strategi stocking - pastikan produk laris selalu tersedia
- Manfaatkan data "Peringkat Customer" untuk program loyalitas atau promo khusus customer setia
- Dashboard ini otomatis update setiap kali ada transaksi baru

### 3.2 Dashboard Customer

Sistem ini menyediakan halaman khusus untuk customer, dimana customer dapat mengakses informasi penting terkait transaksi dan service mereka secara mandiri tanpa perlu menghubungi toko.

#### Cara Customer Mengakses Dashboard

Langkah 1: Customer login menggunakan akun yang telah dibuat oleh admin
Langkah 2: Masukkan `Email` dan `Password` yang diberikan
Langkah 3: Setelah login, customer akan masuk ke halaman dashboard customer

#### Informasi di Dashboard Customer

📊 Dashboard Customer menampilkan 4 Kartu Statistik:

- Total Pembelian - Jumlah transaksi pembelian yang pernah dilakukan
- Total Belanja - Total uang yang telah dibelanjakan (dalam Rupiah)
- Total Service - Jumlah service yang pernah dilakukan
- Service Aktif - Jumlah service yang sedang dalam proses (belum selesai)

#### Section Service Aktif

Jika customer memiliki service yang sedang dikerjakan, akan ditampilkan dalam bentuk kartu khusus dengan background gradient ungu yang menarik. Setiap kartu service aktif menampilkan:

- Merek & Model Device - Contoh: Samsung Galaxy A12
- Nomor Service - Kode unik untuk tracking
- Keluhan - Masalah yang dilaporkan customer
- Diagnosa - Hasil pemeriksaan teknisi (jika sudah ada)
- Tanggal Service - Kapan barang masuk
- Status - Status terkini (badge putih di tengah kartu)
- Tombol "Lihat Detail" - Untuk melihat informasi lengkap service

#### Section Riwayat Pembelian

Menampilkan 5 transaksi pembelian terakhir. Setiap item menampilkan:

- Nomor Invoice - Nomor transaksi pembelian
- Tanggal & Waktu - Kapan pembelian dilakukan
- Nama Cabang - Lokasi toko tempat pembelian
- Produk Dibeli - Daftar produk dengan quantity (maksimal 3 produk ditampilkan, sisanya "+X lainnya")
- Total Pembayaran - Jumlah yang dibayarkan (dengan warna ungu)
- Metode Pembayaran - Badge hijau menampilkan metode (Cash/Transfer/dll)

#### Section Riwayat Service

Menampilkan 5 service terakhir (semua status). Setiap item menampilkan:

- Merek & Model Device - HP yang diservice
- Nomor Service - Kode tracking
- Tanggal Service - Kapan barang masuk
- Keluhan - Deskripsi masalah (dipotong 40 karakter)
- Status - Badge berwarna sesuai status:
  - 🟡 Kuning (Warning) - Menunggu Diagnosa
  - 🔵 Biru (Info) - Dalam Pengerjaan
  - ⚫ Abu-abu (Secondary) - Menunggu Sparepart
  - 🟢 Hijau (Success) - Selesai / Diambil
  - 🔴 Merah (Danger) - Dibatalkan
- Total Biaya - Jika sudah ada (dengan warna ungu)
- Tombol "Detail" - Untuk melihat informasi lengkap

#### Section Informasi Kontak

Menampilkan data profil customer:

- Nama - Nama lengkap customer
- WhatsApp - Nomor telepon/WA
- Email - Alamat email
- Alamat - Alamat lengkap customer

#### Keuntungan Dashboard Customer

✅ Manfaat untuk Customer:

- Tidak perlu datang ke toko atau telepon untuk cek status service
- Dapat memantau progress service kapan saja, 24/7
- Melihat semua riwayat pembelian dan service di satu tempat
- Akses mudah ke history pembelian untuk keperluan garansi
- Lebih transparan dan meningkatkan kepercayaan
- Statistik lengkap tentang total belanja dan service

✅ Manfaat untuk Toko:

- Mengurangi telepon/chat customer yang menanyakan status service
- Meningkatkan kepuasan dan loyalitas customer
- Memperkuat citra profesional toko
- Efisiensi waktu staff untuk fokus pada pekerjaan lain
- Customer dapat self-service untuk mengecek informasi mereka

⚠️ Catatan Penting:

- Setiap customer harus memiliki akun (email & password) untuk bisa login
- Admin harus membuat akun customer saat menambah data customer baru
- Customer hanya bisa melihat data milik mereka sendiri (privacy terjaga)
- Teknisi harus rajin update status service agar customer mendapat informasi akurat
- Dashboard menampilkan maksimal 5 transaksi dan 5 service terakhir di halaman utama

## 4. Data Master

### 4.1 Kategori Produk

Pengelompokan produk berdasarkan jenis (Smartphone, Aksesoris, Sparepart, dll)

#### Menambah Kategori

Langkah 1: Klik menu Master Data → Kategori
Langkah 2: Klik + Tambah Kategori
Langkah 3: Isi form:

- Nama Kategori - Wajib diisi (contoh: "Smartphone")
- Deskripsi - Wajib diisi (deskripsi kategori)

Langkah 4: Klik Simpan

### 4.2 Merek

Daftar merek produk (Samsung, Xiaomi, iPhone, Oppo, dll)

#### Menambah Merek

Langkah 1: Klik menu Master Data → Merek
Langkah 2: Klik + Tambah Merek
Langkah 3: Isi Nama Merek (wajib)
Langkah 4: Klik Simpan

### 4.3 Supplier

Data pemasok produk

#### Menambah Supplier

Langkah 1: Klik menu Master Data → Supplier
Langkah 2: Klik + Tambah Supplier
Langkah 3: Isi form:

- Nama Supplier - Wajib
- NO WhatsApp - Wajib
- Alamat - Wajib
- Email - Opsional

Langkah 4: Klik Simpan

### 4.4 Customer

Database pelanggan

#### Menambah Customer

Langkah 1: Klik menu Master Data → Customer
Langkah 2: Klik + Tambah Customer
Langkah 3: Isi form:

- Nama Customer - Wajib
- NO WhatsApp - Wajib
- Alamat - Wajib
- Email - Wajib

Langkah 4: Klik Simpan

### 4.5 Cabang (Branch)

Data cabang toko (untuk multi-branch)

#### Menambah Cabang

Langkah 1: Klik menu Master Data → Cabang
Langkah 2: Klik + Tambah Cabang
Langkah 3: Isi form:

- Nama Cabang - Wajib
- Alamat - Wajib
- NO WhatsApp - Wajib

Langkah 4: Klik Simpan
💡 Penting: Pastikan data master sudah lengkap sebelum input produk atau transaksi.

## 4. Manajemen Produk

### 4.1 Tambah Produk Manual

Fitur produk menggunakan sistem Multi-Cabang dengan Stok & Harga per Cabang

Langkah 1: Klik menu Produk
Langkah 2: Klik + Tambah Produk
Langkah 3: Isi form dengan sistem 3 Tab

#### 📋 Tab 1: Data Produk

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Nama Produk | Text | ✅ Ya | Nama lengkap produk
Kategori | Dropdown | ✅ Ya | Pilih kategori dari master
Merek | Dropdown | ✅ Ya | Pilih merek dari master
Satuan Unit | Text | ✅ Ya | Contoh: pcs, box, unit
Minimal Stok | Number | ✅ Ya | Batas minimum stok (min: 0)
Deskripsi | Textarea | ❌ Tidak | Deskripsi produk

#### 📦 Tab 2: Stok per Cabang

Tambahkan stok untuk setiap cabang:

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Cabang | Dropdown | ✅ Ya | Pilih cabang
Jumlah Stok | Number | ✅ Ya | Qty stok (min: 0)

⚠️ Validasi:

- Minimal 1 stok cabang harus ditambahkan
- Tidak boleh ada duplikasi cabang yang sama
- Cabang di Tab 2 HARUS sama dengan cabang di Tab 3

#### 💰 Tab 3: Harga per Cabang

Tambahkan harga untuk setiap cabang:

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Cabang | Dropdown | ✅ Ya | Pilih cabang (harus sama dengan Tab 2)
Harga Beli | Number | ✅ Ya | Modal/HPP produk (min: 0)
Harga Jual | Number | ✅ Ya | Harga jual ke customer (min: 0)

⚠️ Validasi:

- Minimal 1 harga cabang harus ditambahkan
- Tidak boleh duplikasi cabang
- Cabang di Tab 3 HARUS sinkron dengan Tab 2

Langkah 4: Setelah semua tab terisi, klik Simpan
✨ QR Code Otomatis: Sistem akan generate QR Code unik untuk setiap produk.

### 4.2 Import Produk dari Excel

Langkah 1: Di halaman Produk, klik Import Excel
Langkah 2: Download template Excel dengan klik Download Template
Langkah 3: Isi data produk di Excel sesuai kolom:

- Nama Produk - Wajib
- Kategori - Nama kategori yang sudah ada di master
- Merek - Nama merek yang sudah ada di master
- Unit - Satuan (pcs, box, dll)
- Cabang - Nama cabang
- Harga Beli - Harga modal
- Harga Jual - Harga jual
- Stok - Jumlah stok
- Stok Minimal - Batas minimum
- Deskripsi - Opsional

Langkah 4: Upload file Excel
Langkah 5: Klik Proses Import
🚨 Penting Sebelum Import:

- Pastikan kategori dan merek sudah ada di database
- Pastikan cabang sudah dibuat
- Format angka harus numerik (tidak boleh ada huruf)
- Tidak boleh ada data duplikat
- Barcode akan digenerate otomatis oleh sistem

### 4.3 Scan QR Code Produk

Langkah 1: Di halaman Produk, klik Scan QR Code
Langkah 2: Pilih metode:

- Tab "Input Manual" - Ketik/paste barcode lalu Enter
- Tab "Scan dengan Kamera" - Aktifkan kamera dan arahkan ke QR Code

Langkah 3: Sistem otomatis redirect ke halaman detail produk

### 4.4 Download QR Code Produk

Langkah 1: Buka detail produk (klik nama produk)
Langkah 2: Klik Unduh QR Code (JPG)
Langkah 3: File JPG akan didownload (bisa dicetak dan ditempel di produk)

### 4.5 Detail Produk (Show)

Halaman detail produk menampilkan:

- ✅ QR Code produk (dapat diunduh)
- ✅ Informasi: Nama, Kategori, Merek, Unit, Min Stock, Deskripsi
- ✅ Total Stok - Dengan indikator warna:
  - 🟢 Hijau: Stok aman (≥ min stock)
  - 🟡 Kuning: Stok rendah (< min stock)
  - 🔴 Merah: Stok habis (0)
- ✅ Nilai Stok - Total harga beli × quantity
- ✅ Tabel Stok per Cabang - Stok, status, nilai per cabang
- ✅ Tabel Harga per Cabang - Harga beli, jual, margin (Rp & %), tanggal efektif
- ✅ Statistik - Total stok, nilai total, tersedia di berapa cabang

Rumus Kalkulasi:
Margin (Rp) = Harga Jual - Harga Beli
Margin (%) = ((Harga Jual - Harga Beli) / Harga Beli) × 100%
Nilai Total Stok = Harga Beli × Quantity

## 5. Transaksi Pembelian

### 5.1 Buat Transaksi Pembelian

Langkah 1: Klik menu Transaksi → Pembelian
Langkah 2: Klik + Buat Pembelian
Langkah 3: Isi form informasi pembelian

#### 📋 Form Informasi Pembelian

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
No. Pembelian | Text | - | Auto-generate, readonly
Supplier | Dropdown | ✅ Ya | Pilih dari master supplier
Cabang | Dropdown | ✅ Ya | Cabang tujuan pembelian
Tanggal Pembelian | Date | ✅ Ya | Default: hari ini
Catatan | Textarea | ❌ Tidak | Catatan tambahan

Langkah 4: Tambah produk dengan 2 metode:

#### 📦 Metode 1: Pilih Produk (Tab 1)

a. Pilih cabang terlebih dahulu (dropdown produk aktif setelah cabang dipilih)
b. Pilih produk dari dropdown (format: Kode - Nama - Merek (Stok: xxx))
c. Masukkan Qty (jumlah yang dibeli, min: 1)
d. Harga akan auto-load dari database, bisa diubah manual
e. Subtotal = Qty × Harga (auto calculate)
f. Klik + Tambah

#### 📷 Metode 2: Scan QR Code (Tab 2)

a. Klik tab "Scan dengan Kamera"
b. Aktifkan kamera dan scan QR Code produk
c. Produk otomatis ditambahkan ke tabel

#### 📊 Tabel Detail Produk

Kolom | Keterangan
--- | ---
Produk | Nama produk (display only)
Stok | Stok tersedia di cabang (display only)
Qty | Jumlah yang dibeli (editable, min: 1)
Harga | Harga beli per unit (editable, min: 0)
Subtotal | Qty × Harga (auto calculate)
Aksi | Tombol hapus baris

Langkah 5: Ulangi untuk produk lain
Langkah 6: Cek Total Pembelian (auto sum dari semua subtotal)
Langkah 7: Klik Simpan Pembelian
✨ Otomatis: Stok produk akan bertambah setelah pembelian disimpan.
🚨 Validasi:

- Supplier dan Cabang wajib dipilih
- Minimal 1 produk harus ditambahkan
- Total pembelian harus > 0

### 5.2 Halaman Index Pembelian

Menampilkan daftar semua pembelian dengan kolom:

- No. Pembelian
- Tanggal
- Supplier
- Cabang
- Total
- Status (Badge: Pending🟡, Completed🟢, Cancelled🔴)
- User (yang input)
- Aksi (Detail, Edit, Delete)

### 5.3 Detail Pembelian (Show)

Menampilkan informasi lengkap:

- QR Code pembelian (dapat diunduh JPG)
- Tabel detail produk yang dibeli
- Informasi pembelian lengkap
- Tombol: Cetak Faktur (PDF)

## 6. Transaksi Penjualan

### 6.1 Buat Transaksi Penjualan

Langkah 1: Klik menu Transaksi → Penjualan
Langkah 2: Klik + Buat Penjualan
Langkah 3: Isi form informasi penjualan

#### 📋 Form Informasi Penjualan

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
No. Penjualan | Text | - | Auto-generate, readonly
Cabang | Dropdown | ✅ Ya | Cabang penjualan
Customer | Dropdown | ❌ Tidak | Default: Umum
Tanggal Penjualan | Date | ✅ Ya | Default: hari ini
Metode Pembayaran | Dropdown | ✅ Ya | cash, transfer, credit
Catatan | Textarea | ❌ Tidak | Catatan tambahan

#### 💳 Metode Pembayaran

Metode | Badge | Keterangan
--- | --- | ---
Tunai (cash) | Cash | Pembayaran tunai
Transfer (transfer) | Transfer | Transfer bank
Kredit (credit) | Credit | Hutang/tempo

Langkah 4: Tambah produk (sama seperti pembelian, ada 2 metode)

#### 📦 Metode Input Produk

Tab 1: Pilih Produk - Dropdown select produk

Tab 2: Scan QR Code - Input manual atau scan dengan kamera

#### 📊 Tabel Detail Produk Penjualan

Kolom | Keterangan
--- | ---
Produk | Nama produk
Stok | Stok tersedia
Qty | Jumlah jual (max = stok tersedia)
Harga | Harga jual per unit (editable)
Diskon | Diskon per item (min: 0)
Subtotal | (Qty × Harga) - Diskon
Aksi | Hapus baris

Langkah 5: Isi informasi total

#### 💰 Kalkulasi Total Penjualan

Field | Tipe | Keterangan
--- | --- | ---
Subtotal | Display | Sum dari semua subtotal items
Diskon | Number | Diskon global (opsional, min: 0)
Pajak | Number | Pajak global (opsional, min: 0)
Total Pembayaran | Display | Subtotal - Diskon + Pajak

Rumus Kalkulasi:
Subtotal Item = (Qty × Harga) - Diskon Item
Subtotal = Sum dari semua Subtotal Item
Total Pembayaran = Subtotal - Diskon Global + Pajak
Langkah 6: Klik Simpan Penjualan
✨ Otomatis: Stok produk akan berkurang dan profit dihitung otomatis.
🚨 Validasi:

- Cabang dan Metode Pembayaran wajib dipilih
- Minimal 1 produk harus ditambahkan
- Qty tidak boleh melebihi stok tersedia

### 6.2 Detail Penjualan (Show)

Menampilkan:

- Detail produk yang dijual
- Total: Subtotal, Diskon, Pajak, Total
- Informasi penjualan lengkap
- QR Code penjualan (download JPG)
- Tombol: Cetak Faktur PDF

## 7. Manajemen Stok

Modul manajemen stok digunakan untuk monitoring pergerakan stok dan melakukan stock opname (inventarisasi fisik). Fitur ini membantu menjaga akurasi data stok dengan kondisi fisik barang di toko.

### 7.1 Pergerakan Stok (Stock Movement)

Halaman pergerakan stok menampilkan histori/riwayat semua transaksi yang mempengaruhi jumlah stok produk. Halaman ini bersifat read-only (hanya untuk melihat data, tidak ada input manual).

#### Akses Menu

Langkah 1: Klik menu Transaksi → Pergerakan Stok
💡 Catatan Penting: Pergerakan stok tercatat secara OTOMATIS saat terjadi transaksi pembelian, penjualan, atau stock opname. Anda TIDAK bisa menambah/edit data pergerakan stok secara manual di halaman ini.

#### 📊 Kolom yang Ditampilkan

Kolom | Keterangan
--- | ---
No | Nomor urut
Tanggal | Tanggal & waktu terjadinya pergerakan stok
Produk | Nama produk yang stoknya berubah
Cabang | Cabang tempat stok berubah
Tipe | Masuk (in), Keluar (out), atau Penyesuaian (adjustment)
Qty | Jumlah perubahan stok (dengan tanda + untuk masuk, - untuk keluar)
Referensi | Sumber transaksi: Pembelian, Penjualan, atau Stock Opname
Catatan | Keterangan tambahan (jika ada)
User | User yang melakukan transaksi

#### 🔍 Filter Data

Gunakan filter untuk mempermudah pencarian data:

Filter | Keterangan
--- | ---
Produk | Filter berdasarkan produk tertentu (dropdown)
Cabang | Filter berdasarkan cabang (dropdown)
Tipe | Filter berdasarkan tipe pergerakan: - Masuk (in) - Keluar (out) - Penyesuaian (adjustment)
Dari Tanggal | Tanggal awal periode (date picker)
Sampai Tanggal | Tanggal akhir periode (date picker)

Cara Filter: Pilih filter yang diinginkan → Klik tombol 🔍 (icon search)

#### 📋 Jenis-jenis Pergerakan Stok

Sumber Transaksi | Tipe | Keterangan
--- | --- | ---
Pembelian | Masuk (in) | Stok bertambah dari pembelian barang ke supplier
Penjualan | Keluar (out) | Stok berkurang karena terjual ke customer
Stock Opname | Penyesuaian (adjustment) | Penyesuaian stok dari hasil stock opname (bisa + atau - tergantung selisih)

💡 Fungsi Pergerakan Stok:

- Audit Trail: Semua perubahan stok tercatat dan dapat dilacak
- Tracking Riwayat: Melihat histori stok per produk atau per cabang
- Analisa Pergerakan: Identifikasi produk fast-moving (laku cepat) atau slow-moving (laku lambat)
- Deteksi Anomali: Monitoring pola pergerakan stok yang tidak normal

⚠️ Perhatian: Halaman ini hanya menampilkan data histori. Untuk mengubah stok, gunakan menu Stock Opname atau lakukan transaksi pembelian/penjualan.

### 7.2 Stock Opname (Inventarisasi Fisik)

Stock opname adalah proses menghitung fisik barang di toko dan menyesuaikannya dengan data sistem. Dilakukan secara berkala untuk memastikan akurasi data.

⚠️ Catatan Penting: Stock opname langsung berstatus COMPLETED saat disimpan dan LANGSUNG mengupdate stok sistem. Sistem hanya menyimpan produk yang memiliki selisih (stok fisik ≠ stok sistem).

#### Akses Menu

Langkah 1: Klik menu Transaksi → Stock Opname

#### Halaman Index Stock Opname

Menampilkan daftar semua stock opname yang pernah dilakukan:

Kolom | Keterangan
--- | ---
No | Nomor urut
No. Opname | Nomor unik SO (format: OPYYYYMMDD0001)
Tanggal | Tanggal pelaksanaan stock opname
Cabang | Cabang yang di-opname
Jumlah Item | Jumlah produk yang memiliki selisih
Status | Pending, Selesai, atau Batal
User | User yang melakukan SO
Aksi | 👁️ Detail, ✏️ Edit, 🗑️ Hapus

#### Membuat Stock Opname Baru

Langkah 1: Klik + Tambah Stock Opname
Langkah 2: Isi form di panel kanan (Informasi Stock Opname)

#### 📋 Panel Kanan: Informasi Stock Opname

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
No. Opname | Text | - | Auto-generate (readonly)
Cabang | Dropdown | ✅ Ya | Pilih cabang yang akan di-opname
Tanggal Opname | Date | ✅ Ya | Default: hari ini
Catatan | Textarea | ❌ Tidak | Keterangan SO (contoh: "SO Bulanan Januari 2026")
Total Item dengan Selisih | Display | - | Auto calculate (contoh: "5 item")

Langkah 3: Pilih cabang terlebih dahulu, kemudian klik 🔄 Muat Produk untuk load semua produk dari cabang tersebut
💡 Catatan: Tombol "Muat Produk" baru aktif setelah cabang dipilih. Tombol ini akan memuat SEMUA produk yang ada stok di cabang yang dipilih.

#### 📦 Panel Kiri: Tabel Detail Produk

Setelah klik "Muat Produk", semua produk dari cabang akan ditampilkan dalam tabel:

Kolom | Keterangan
--- | ---
No | Nomor urut
Produk | Nama produk - Merek (readonly)
Satuan | Unit produk (readonly, contoh: pcs, box)
Stok Sistem | Stok yang tercatat di database (readonly, badge biru)
Stok Fisik | Input hasil hitung fisik (editable, default = stok sistem)
Selisih | Auto calculate: Stok Fisik - Stok Sistem Warna badge: 🟢 +5 jika positif (kelebihan) 🔴 -3 jika negatif (kekurangan) ⚪ 0 jika tidak ada selisih
Catatan | Input keterangan selisih (editable, opsional)

Langkah 4: Ubah nilai Stok Fisik sesuai hasil hitung fisik barang di toko
Langkah 5: Sistem otomatis menghitung Selisih dan menampilkannya dengan warna:

- Hijau (+) = Stok fisik lebih banyak dari sistem (ada kelebihan)
- Merah (-) = Stok fisik lebih sedikit dari sistem (ada kekurangan)
- Abu-abu (0) = Stok cocok

Langkah 6: Isi Catatan untuk produk yang memiliki selisih (opsional, untuk audit trail)
Langkah 7: Indikator "Total Item dengan Selisih" akan otomatis update (contoh: "5 item")
Langkah 8: Jika sudah selesai, klik 💾 Simpan Stock Opname
Rumus Kalkulasi Stock Opname:
Selisih = Stok Fisik - Stok Sistem
Interpretasi Selisih:
- Selisih > 0 (Positif): Ada kelebihan stok → Stok sistem akan ditambah
- Selisih < 0 (Negatif): Ada kekurangan stok → Stok sistem akan dikurangi
- Selisih = 0: Stok cocok → Produk TIDAK disimpan dalam SO (dilewati)
🚨 Perhatian Sebelum Simpan:

- Tombol "Simpan Stock Opname" akan DISABLED jika tidak ada produk dengan selisih
- Stock opname berstatus completed (selesai) saat disimpan
- Stok sistem LANGSUNG diupdate ke stok fisik saat simpan
- Sistem HANYA menyimpan produk yang memiliki selisih (≠ 0)
- Pergerakan stok otomatis tercatat dengan tipe "adjustment"
- Pastikan stok fisik sudah benar sebelum simpan (tidak bisa undo otomatis)

✨ Setelah Simpan:

- Status SO: Selesai (completed)
- Stok sistem sudah diupdate sesuai stok fisik
- Pergerakan stok tercatat di menu "Pergerakan Stok" dengan referensi "Stock Opname"
- SO masih bisa diedit atau dihapus (tidak ada lock)

#### Detail Stock Opname (Show)

Klik tombol 👁️ untuk melihat detail SO. Halaman detail menampilkan:

- ✅ Informasi SO: No. Opname, Tanggal, Cabang, Status, User, Catatan
- ✅ Tabel Detail Produk: Produk, Stok Sistem, Stok Fisik, Selisih (dengan warna), Catatan
- ✅ Tombol Aksi:
  - ✏️ Edit - Edit SO
  - 🗑️ Hapus - Hapus SO

#### Edit Stock Opname

Stock opname bisa diedit kapan saja (tidak ada batasan status):

Langkah 1: Di halaman index atau detail SO, klik ✏️ Edit
Langkah 2: Ubah tanggal, catatan, atau data produk
Langkah 3: Klik Update
💡 Catatan Edit: Saat edit SO, detail lama akan dihapus dan diganti dengan detail baru. Pastikan data sudah benar sebelum update.

#### Hapus Stock Opname

Langkah 1: Klik 🗑️ pada SO yang ingin dihapus
Langkah 2: Konfirmasi penghapusan
⚠️ Perhatian: Menghapus SO akan menghapus record SO, tapi TIDAK otomatis mengembalikan stok ke kondisi sebelumnya. Jika ingin mengembalikan stok, buat SO baru dengan nilai kebalikannya.

#### 📅 Rekomendasi Jadwal Stock Opname

Frekuensi | Jenis Produk | Keterangan
--- | --- | ---
Harian | Produk high-value (HP flagship) | Untuk produk dengan nilai tinggi
Mingguan | Produk fast-moving (aksesoris populer) | Produk yang sering terjual
Bulanan | Semua produk | Stock opname menyeluruh semua cabang
Tahunan | Full inventory audit | Audit lengkap dengan eksternal auditor (jika perlu)

#### 🔍 Tips Stock Opname yang Efektif

- Persiapan: Siapkan barcode scanner atau checklist produk sebelum mulai
- Waktu: Lakukan di luar jam operasional atau saat toko tutup
- Tim: Libatkan minimal 2 orang (1 hitung, 1 input data) untuk akurasi
- Sistematis: Hitung per kategori atau per rak agar tidak terlewat
- Double Check: Cek ulang produk dengan selisih besar sebelum approve
- Dokumentasi: Foto kondisi barang jika ada selisih untuk audit trail
- Analisa: Review penyebab selisih untuk mencegah di periode berikutnya

⚠️ Penyebab Umum Selisih Stock Opname:

- Transaksi yang belum/salah diinput ke sistem
- Barang rusak atau cacat yang belum dicatat
- Kehilangan atau pencurian (shrinkage)
- Kesalahan penempatan produk (produk A tercampur dengan produk B)
- Retur customer yang belum diproses
- Transfer antar cabang yang belum tercatat

## 8. Service HP

### 8.1 Buat Pesanan Service

Langkah 1: Klik menu Service
Langkah 2: Klik + Buat Service
Langkah 3: Isi form dengan 4 Card

#### 📱 Card 1: Informasi Perangkat

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Jenis Perangkat | Dropdown | ✅ Ya | Handphone, Tablet, Laptop, Smartwatch, Lainnya
Merek | Text | ✅ Ya | Contoh: Samsung, iPhone, Xiaomi
Model | Text | ✅ Ya | Contoh: Galaxy S23, iPhone 14 Pro
IMEI | Text | ❌ Tidak | Nomor IMEI perangkat

#### 🔧 Card 2: Keluhan & Diagnosa

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Keluhan Pelanggan | Textarea | ✅ Ya | Deskripsi masalah yang dialami customer
Diagnosa Teknisi | Textarea | ❌ Tidak | Hasil diagnosa awal (bisa diisi nanti)

#### 🔩 Card 3: Spare Part Yang Digunakan

Dapat menambahkan beberapa spare part:

Field | Tipe | Keterangan
--- | --- | ---
Spare Part | Dropdown | Pilih dari master produk
Qty | Number | Jumlah (min: 1)
Harga Satuan | Number | Auto-fill dari harga jual produk
Subtotal | Display | Qty × Harga Satuan (auto calculate)

Tombol: + Tambah Spare Part dan Hapus

#### 📋 Card 4: Informasi Service

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Tanggal Service | Date | ✅ Ya | Default: hari ini
Customer | Dropdown | ✅ Ya | Pilih dari master customer
Cabang | Dropdown | ✅ Ya | Pilih cabang
Teknisi | Display | - | Auto: user yang login
Prioritas | Dropdown | ❌ Tidak | normal, urgent, very urgent
Estimasi Selesai | Datetime-local | ❌ Tidak | Target selesai
Biaya Jasa Service | Number | ❌ Tidak | Default: 0
Total Biaya Spare Part | Display | - | Sum dari spare part (auto)
Estimasi Total Biaya | Display | - | Biaya Jasa + Spare Part
Uang Muka (DP) | Number | ❌ Tidak | Default: 0
Catatan | Textarea | ❌ Tidak | Catatan tambahan

Rumus Kalkulasi Service:
Total Biaya Spare Part = Sum dari (Qty × Harga Satuan)
Estimasi Total Biaya = Biaya Jasa + Total Biaya Spare Part
Sisa Pembayaran = Estimasi Total Biaya - DP
Langkah 4: Klik Simpan
✨ QR Code Service: Setiap service mendapat QR Code untuk tracking status.

### 8.2 Status Service (Lifecycle)

Urutan status service dari awal sampai selesai:

No | Status | Badge | Keterangan
--- | --- | --- | ---
1 | Menunggu Diagnosa | Menunggu | Service baru masuk, belum diperiksa
2 | Sedang Diagnosa | Diagnosa | Teknisi sedang cek masalah
3 | Menunggu Persetujuan | Persetujuan | Menunggu customer approve biaya
4 | Menunggu Spare Part | Spare Part | Menunggu spare part datang
5 | Dalam Pengerjaan | Pengerjaan | Sedang dikerjakan teknisi
6 | Quality Control | QC | Pengecekan kualitas hasil service
7 | Siap Diambil | Siap Diambil | Service selesai, menunggu diambil customer
8 | Selesai | Selesai | Sudah diambil customer
9 | Dibatalkan | Dibatalkan | Service dibatalkan

### 8.3 Update Status Service

Langkah 1: Buka detail service (klik no. service)
Langkah 2: Di bagian bawah halaman, lihat form Update Status
Langkah 3: Pilih status baru dari dropdown
Langkah 4: Tambahkan catatan progres (opsional)
Langkah 5: Klik Update Status
💡 Riwayat Status: Setiap perubahan status tercatat dalam timeline dengan tanggal, status, notes, dan user yang mengupdate.

### 8.4 Detail Service (Show)

Halaman detail menampilkan:

- ✅ Informasi Perangkat: Jenis, Merek, Model, IMEI
- ✅ Keluhan & Diagnosa
- ✅ Spare Part yang Digunakan (tabel)
- ✅ Riwayat Status: Timeline lengkap dengan tanggal, status, notes, user
- ✅ Informasi Service: No, Tanggal, Customer, Cabang, Teknisi, Prioritas, Status, Estimasi, Catatan
- ✅ Biaya Service:
  - Biaya Jasa
  - Biaya Spare Part
  - Total
  - DP (Down Payment)
  - Sisa Pembayaran
- ✅ Form Update Status (jika belum selesai/dibatalkan)
- ✅ QR Code Service (download JPG)
- ✅ Tombol: Print Nota

### 8.5 Customer Cek Status Service

Customer bisa cek status tanpa login:

Langkah 1: Buka URL: `/customer`
Langkah 2: Scan QR Code service atau masukkan nomor service
Langkah 3: Status dan progres akan ditampilkan

## 9. Laporan

### 9.1 Laporan Laba Rugi

Laporan analisa keuntungan dan kerugian bisnis dalam periode tertentu. Menampilkan ringkasan keuangan, grafik penjualan, produk terlaris, pelanggan terbaik, dan detail laba rugi per produk.

#### 🔍 Filter Laporan

Filter | Wajib | Keterangan
--- | --- | ---
Tanggal Mulai | ✅ Ya | Tanggal awal periode laporan
Tanggal Akhir | ✅ Ya | Tanggal akhir periode laporan
Cabang | ❌ Tidak | Dropdown: "Semua Cabang" atau pilih cabang tertentu

Setelah memilih filter, klik 🔍 Filter

#### 📊 BAGIAN 1: Summary Cards (4 Kartu Ringkasan)

Card | Label | Warna | Rumus
--- | --- | --- | ---
Card 1 | Total Penjualan | Biru (bg-info) | SUM(sale.total_amount) dari semua penjualan completed
Card 2 | Harga Pokok Penjualan (HPP) | Kuning (bg-warning) | SUM(quantity × purchase_price) dari semua sale_details
Card 3 | Laba Kotor | Hijau (bg-success) | Total Penjualan - HPP
Card 4 | Laba Bersih | Hijau/Merah (tergantung nilai) | Total Penjualan - Total Diskon + Total Pajak - HPP

#### 📈 BAGIAN 2: Additional Metrics (3 Info Box)

Box | Label | Icon | Rumus
--- | --- | --- | ---
Box 1 | Margin Laba | 📊 (percent) | (Laba Bersih / Total Penjualan) × 100%
Box 2 | Total Diskon | 🏷️ (tags) | SUM(sale.discount) dari semua penjualan
Box 3 | Total Pajak | 🧾 (receipt) | SUM(sale.tax) dari semua penjualan

#### 📉 BAGIAN 3: Grafik Penjualan & Pembelian

Judul: "Grafik Penjualan & Pembelian"

Jenis: Line Chart (grafik garis)

Data yang ditampilkan:

- Garis Biru: Total penjualan per hari (dari tabel sales)
- Garis Merah: Total pembelian per hari (dari tabel purchases)

X-axis: Tanggal (format: "15 Jan", "16 Jan", dll)

Y-axis: Nominal dalam Rupiah

#### 🏆 BAGIAN 4: Top 10 Produk Terlaris

Judul Card: "Top 10 Produk Terlaris"

Urutan: Diurutkan berdasarkan Total Laba tertinggi (bukan quantity)

Kolom | Keterangan | Rumus
--- | --- | ---
No | Nomor urut (1-10) | -
Produk | Nama produk | product.name
Qty Terjual | Jumlah terjual + satuan | SUM(quantity) + unit (contoh: "150 pcs")
Total Penjualan | Total pendapatan dari produk | SUM(quantity × selling_price - discount)
Total Laba | Total keuntungan dari produk (badge hijau/merah) | SUM(quantity × (selling_price - purchase_price) - discount)

#### 👥 BAGIAN 5: Top 10 Customer

Judul Card: "Top 10 Customer"

Urutan: Diurutkan berdasarkan Total Pembelian tertinggi

Kolom | Keterangan | Rumus
--- | --- | ---
No | Nomor urut (1-10) | -
Nama Customer | Nama + nomor telepon | customer.name + phone
Total Transaksi | Jumlah transaksi (badge biru) | COUNT(*) transaksi + "transaksi"
Total Pembelian | Total belanja customer | SUM(total_amount)
Rata-rata Pembelian | Rata-rata per transaksi | AVG(total_amount)

#### 💰 BAGIAN 6: Laporan Laba Rugi (Tabel Detail)

Judul Card: "Laporan Laba Rugi"

Tombol Export: 📄 Export PDF, 📊 Export Excel

Header Tabel: "Periode: [Tanggal Mulai] - [Tanggal Akhir]"

Baris | Label | Nilai | Warna Background
--- | --- | --- | ---
SECTION: PENDAPATAN
Header | PENDAPATAN | - | Biru (bg-info)
Sub-item | Penjualan | Rp [totalRevenue] | Putih
Sub-item | Diskon Penjualan | (Rp [totalSalesDiscount]) | Putih
Sub-item | Pajak | Rp [totalSalesTax] | Putih
Subtotal | Total Pendapatan Bersih | Rp [totalRevenue - totalSalesDiscount + totalSalesTax] | Putih (font bold)
SECTION: HPP
Header | HARGA POKOK PENJUALAN (HPP) | - | Kuning (bg-warning)
Sub-item | HPP | Rp [totalCOGS] | Putih
SECTION: LABA
Total | LABA KOTOR | Rp [grossProfit] | Hijau (bg-success, font bold)
Total | LABA BERSIH | Rp [netProfit] | Hijau/Merah (tergantung nilai, font bold, text white)

#### 📦 BAGIAN 7: Laporan Laba Rugi Per Produk

Judul Card: "Laporan Laba Rugi Per Produk"

Tombol Export: 📄 Export PDF, 📊 Export Excel

Header Tabel (2 baris):

Nota | Nama Item | Total Jual | Harga Pokok | Potongan | Laba
--- | --- | --- | --- | --- | ---
Laba Kotor | Laba %

Isi Tabel (per produk):

Kolom | Keterangan | Rumus dari Controller
--- | --- | ---
Nota | Nomor urut | Auto increment (1, 2, 3, ...)
Nama Item | Nama produk - Brand | product.name + " - " + brand.name
Total Jual | Total penjualan produk | `SUM(quantity * selling_price)`
Harga Pokok | HPP produk | `SUM(quantity * purchase_price)`
Potongan | Total diskon produk (level item) | `SUM(discount)` dari sale_details
Laba Kotor | Laba kotor produk | `SUM(quantity * (selling_price - purchase_price))`
Laba % | Persentase laba | `(SUM(quantity * (selling_price - purchase_price)) / SUM(quantity * selling_price) * 100)`

Baris Sub Total (setiap produk):

- Label: "Sub Total" (colspan 2)
- Menampilkan nilai yang sama dengan baris produk di atasnya
- Background: abu-abu muda (bg-light)
- Font: Bold

Baris TOTAL (Grand Total di akhir tabel):

Kolom | Nilai
--- | ---
Label | TOTAL (colspan 2)
Total Jual | SUM semua total_jual
Harga Pokok | SUM semua harga_pokok
Potongan | SUM semua potongan
Laba Kotor | SUM semua laba_kotor
Laba % | Kosong

Style Grand Total: Background hijau (bg-success), Text putih, Font bold

#### 🧮 Rumus Kalkulasi Lengkap

1. Total Penjualan:
SUM(sale.total_amount) WHERE status = 'completed'
2. Total Diskon:
SUM(sale.discount) WHERE status = 'completed'
Catatan: Ini diskon level transaksi (dari tabel sales)
3. Total Pajak:
SUM(sale.tax) WHERE status = 'completed'
4. Harga Pokok Penjualan (HPP):
SUM(sale_detail.quantity × sale_detail.purchase_price)
5. Laba Kotor:
Total Penjualan - HPP
6. Laba Bersih:
Total Penjualan - Total Diskon + Total Pajak - HPP
Catatan: Belum termasuk biaya operasional (gaji, sewa, listrik, dll)
7. Margin Laba:
(Laba Bersih / Total Penjualan) × 100%
--- UNTUK TABEL PER PRODUK ---
8. Total Jual (per produk):
SUM(quantity × selling_price) GROUP BY product_id
9. Harga Pokok (per produk):
SUM(quantity × purchase_price) GROUP BY product_id
10. Potongan (per produk):
SUM(discount) dari tabel sale_details GROUP BY product_id
Catatan: Ini diskon level item (beda dengan Total Diskon di atas)
11. Laba Kotor (per produk):
SUM(quantity × (selling_price - purchase_price)) GROUP BY product_id
12. Laba % (per produk):
(Laba Kotor per produk / Total Jual per produk) × 100%

#### 📤 Tombol Export yang Tersedia

- Export PDF Laporan Utama: 📄 Export PDF (di card "Laporan Laba Rugi")
- Export Excel Laporan Utama: 📊 Export Excel (di card "Laporan Laba Rugi")
- Export PDF Per Produk: 📄 Export PDF (di card "Laporan Laba Rugi Per Produk")
- Export Excel Per Produk: 📊 Export Excel (di card "Laporan Laba Rugi Per Produk")

### 9.2 Laporan Daftar Item (Product List)

Daftar seluruh produk beserta nilai aset

#### 📅 Filter

Filter | Keterangan
--- | ---
Cabang | Semua Cabang / pilih cabang tertentu

#### 📊 Kolom yang Ditampilkan

- Kode (B-xxxx)
- Nama Produk
- Kategori
- Merek
- Total Stok
- Stok Min
- Harga Beli
- Harga Jual
- Deskripsi
- Aset (Harga Beli × Qty) - Per produk dan Total keseluruhan

Rumus Nilai Aset:
Nilai Aset per Produk = Harga Beli × Total Stok
Total Nilai Aset = Sum dari semua Nilai Aset per Produk

#### 📤 Export

- Export PDF

### 9.3 Laporan Pendapatan Service

Laporan analisa pendapatan dari service HP dalam periode tertentu. Menampilkan ringkasan keuangan, grafik tren pendapatan harian, pendapatan per cabang, dan detail transaksi service.

#### 🔍 Filter Laporan

Filter | Wajib | Keterangan
--- | --- | ---
Tanggal Mulai | ✅ Ya | Tanggal awal periode laporan
Tanggal Akhir | ✅ Ya | Tanggal akhir periode laporan
Cabang | ❌ Tidak | Dropdown: "Semua Cabang" atau pilih cabang tertentu

Setelah memilih filter, klik 🔍 Tampilkan

Tombol Export (di atas tabel):

- 📄 Export PDF
- 📊 Export Excel

💡 Catatan Format Rupiah:

- Semua nilai pendapatan ditampilkan dalam format Rupiah PENUH dengan pemisah titik ribuan
- Contoh: Rp 1.250.000 (bukan Rp 1.250K)
- Format ini berlaku untuk tampilan web, export PDF, dan export Excel

#### 📊 BAGIAN 1: Summary Cards (4 Kartu Ringkasan)

Card | Label | Warna | Format Nilai | Rumus
--- | --- | --- | --- | ---
Card 1 | Total Pendapatan | Hijau (bg-success) | Rp 1.250.000 (format penuh dengan pemisah titik) | SUM(service.total_cost)
Card 2 | Biaya Jasa Service | Biru (bg-info) | Rp 850.000 (format penuh dengan pemisah titik) | SUM(service.service_fee)
Card 3 | Biaya Spare Part | Kuning (bg-warning) | Rp 400.000 (format penuh dengan pemisah titik) | SUM(service.parts_cost)
Card 4 | Sisa Pembayaran | Merah (bg-danger) | Rp 150.000 (format penuh dengan pemisah titik) | SUM(service.remaining_payment)

#### 📈 BAGIAN 2: Additional Metrics (3 Info Box)

Box | Label | Warna | Rumus
--- | --- | --- | ---
Box 1 | Down Payment (DP) | Biru (bg-primary) | SUM(service.down_payment)
Box 2 | Rata-rata DP | Hijau (bg-success) | (Total DP / Total Pendapatan) × 100% Format: "...%"
Box 3 | Rata-rata Nilai per Service | Biru (bg-info) | Total Pendapatan / COUNT(service) Format: "Rp ..."

#### 📉 BAGIAN 3: Tren Pendapatan Harian (Grafik)

Judul Card: "Tren Pendapatan Harian"

Jenis: Line Chart (grafik garis)

Warna Header: Biru (bg-info)

Data yang ditampilkan:

- Garis Hijau: Total pendapatan per hari (dari service_date)

X-axis: Tanggal (format: "15 Jan", "16 Jan", dll)

Y-axis: Nominal dalam Rupiah (format: "Rp ...")

Rumus Data Chart: GROUP BY DATE(service_date), lalu SUM(total_cost)

#### 💰 BAGIAN 4: Pendapatan Per Cabang (Tabel)

Judul Card: "Pendapatan Per Cabang"

Warna Header: Hijau (bg-success)

Kolom | Keterangan | Rumus
--- | --- | ---
Cabang | Nama cabang (bold) | branch.name
Jumlah Service | Total service di cabang | COUNT(*) GROUP BY branch_id
Biaya Jasa | Total biaya jasa cabang | SUM(service_fee) GROUP BY branch_id
Biaya Spare Part | Total biaya spare part cabang | SUM(parts_cost) GROUP BY branch_id
Total Pendapatan | Total pendapatan cabang (bold) | SUM(total_cost) GROUP BY branch_id
Persentase | Kontribusi cabang (badge biru) | (Pendapatan Cabang / Total Pendapatan Semua) × 100%

Baris TOTAL (Footer):

Kolom | Nilai
--- | ---
Label | TOTAL
Jumlah Service | SUM semua total_services
Biaya Jasa | Total service fee semua cabang
Biaya Spare Part | Total parts cost semua cabang
Total Pendapatan | Total pendapatan semua cabang
Persentase | 100%

Style Footer: Background abu-abu muda (bg-light), Font bold

#### 📋 BAGIAN 5: Detail Transaksi Service (Tabel)

Judul Card: "Detail Transaksi Service"

Warna Header: Abu-abu (bg-secondary)

Kolom | Keterangan | Data/Rumus
--- | --- | ---
No. Service | Nomor service (clickable link) | service.service_number (link ke detail service)
Tanggal | Tanggal service | service_date (format: d/m/Y)
Customer | Nama customer | customer.name
Device | Merek + Model HP | device_brand + " " + device_model
Cabang | Nama cabang | branch.name
Biaya Jasa | Biaya jasa service (align right) | service.service_fee
Biaya Spare Part | Biaya spare part (align right) | service.parts_cost
Total | Total biaya (bold, align right) | service.total_cost
DP | Down payment (align right) | service.down_payment
Sisa | Sisa pembayaran (align right, warna merah jika > 0, hijau jika 0) | service.remaining_payment

Baris TOTAL (Footer):

Kolom | Nilai
--- | ---
Label | TOTAL: (colspan 5, align right)
Biaya Jasa | SUM(service_fee)
Biaya Spare Part | SUM(parts_cost)
Total | SUM(total_cost)
DP | SUM(down_payment)
Sisa | SUM(remaining_payment)

Style Footer: Font bold

Fitur Tabel: DataTables (pagination, search, sorting), default 25 rows per page, order by Tanggal desc

#### 🧮 Rumus Kalkulasi Lengkap

1. Total Pendapatan:
SUM(service.total_cost) WHERE service_date BETWEEN start_date AND end_date
Catatan: total_cost = service_fee + parts_cost
2. Biaya Jasa Service:
SUM(service.service_fee)
3. Biaya Spare Part:
SUM(service.parts_cost)
4. Total Down Payment (DP):
SUM(service.down_payment)
5. Sisa Pembayaran:
SUM(service.remaining_payment)
Catatan: remaining_payment = total_cost - down_payment
6. Rata-rata DP (%):
(Total Down Payment / Total Pendapatan) × 100%
7. Rata-rata Nilai per Service:
Total Pendapatan / COUNT(service)
--- UNTUK TABEL PER CABANG ---
8. Pendapatan Per Cabang:
SUM(total_cost) GROUP BY branch_id
9. Persentase Kontribusi Cabang:
(Pendapatan Cabang / Total Pendapatan Semua Cabang) × 100%

#### 📤 Tombol Export yang Tersedia

- Export PDF: 📄 Export PDF - Download laporan dalam format PDF
- Export Excel: 📊 Export Excel - Download laporan dalam format Excel (lengkap dengan ringkasan, per cabang, dan detail transaksi)

### 9.4 Laporan Service Berdasarkan Status

Laporan ini menampilkan monitoring distribusi status service, mendeteksi service yang tertunda, dan memantau service yang siap diambil customer. Laporan ini sangat berguna untuk monitoring operasional service dan customer service.

#### 📅 Filter Laporan

Filter yang tersedia untuk mengatur tampilan data:

Filter | Tipe | Keterangan
--- | --- | ---
Tanggal Mulai | Date Input | Wajib diisi. Tanggal awal periode laporan
Tanggal Akhir | Date Input | Wajib diisi. Tanggal akhir periode laporan
Cabang | Dropdown | Opsional. Pilih "Semua Cabang" atau cabang tertentu
Tombol Aksi: 🔍 Tampilkan

#### 📊 BAGIAN 1: Summary Cards

Menampilkan ringkasan utama dengan 4 kartu informasi:

Card | Warna | Icon | Label | Keterangan
--- | --- | --- | --- | ---
Card 1 | bg-info (Biru) | 🔧 fa-wrench | Total Service | Total semua service dalam periode (count)
Card 2 | bg-success (Hijau) | ✅ fa-check-circle | Selesai | Jumlah service dengan status "selesai" (count)
Card 3 | bg-warning (Kuning) | ⚠️ fa-exclamation-triangle | Tertunda (>3 hari) | Service yang berjalan > 3 hari dari tanggal service (count)
Card 4 | bg-primary (Biru Tua) | 🔔 fa-bell | Siap Diambil | Service dengan status "siap diambil" (count)

#### 📊 BAGIAN 2: Distribusi Status Service (Pie Chart)

Visualisasi grafik berbentuk Pie Chart yang menampilkan distribusi persentase tiap status service:

- Judul: "Distribusi Status Service"
- Warna Card Header: bg-info (Biru)
- Tipe Chart: Pie Chart (Chart.js)
- Data: Menampilkan semua status yang ada dengan warna berbeda:
  - Menunggu Diagnosa - Kuning (#FFC107)
  - Sedang Diagnosa - Orange (#FF9800)
  - Menunggu Persetujuan - Biru (#2196F3)
  - Menunggu Spare Part - Ungu (#9C27B0)
  - Dalam Pengerjaan - Cyan (#00BCD4)
  - Quality Control - Hijau Tua (#4CAF50)
  - Siap Diambil - Hijau Muda (#8BC34A)
  - Selesai - Hijau (#4CAF50)
  - Dibatalkan - Merah (#F44336)
- Legend Position: Bottom (bawah chart)
- Responsive: Ya, menyesuaikan ukuran layar

#### 📊 BAGIAN 3: Statistik Per Status (Tabel)

Tabel yang menampilkan rincian per status dalam bentuk tabel:

Kolom | Alignment | Keterangan
--- | --- | ---
Status | Left | Nama status (ucwords/kapital per kata)
Jumlah | Center | Count service dengan status tersebut
Total Nilai | Right | Sum total_cost dari service dengan status tersebut (format Rupiah)
FOOTER (bg-light, bold): TOTAL | Total Count | Total Sum Nilai

Warna Card Header: bg-info (Biru)

Judul Card: "Statistik Per Status"

#### 📋 BAGIAN 4: Service Tertunda (>3 hari)

Kondisi Tampil: Hanya muncul jika ada service yang tertunda (>3 hari dari tanggal service)

Warna Card Header: bg-warning (Kuning)

Judul Card: "Service Tertunda (>3 hari)"

Kolom | Keterangan
--- | ---
No. Service | Service number (clickable link ke detail service)
Tanggal | Tanggal service (format: dd/mm/yyyy)
Customer | Nama customer
Device | Merk dan model device (contoh: "Samsung Galaxy A52")
Status | Status saat ini (badge warning kuning)
Teknisi | Nama teknisi atau "-" jika belum ada
Lama (Hari) | Jumlah hari sejak tanggal service sampai sekarang (contoh: "5 hari")

#### 📋 BAGIAN 5: Service Siap Diambil

Kondisi Tampil: Hanya muncul jika ada service dengan status "siap diambil"

Warna Card Header: bg-primary (Biru Tua)

Judul Card: "Service Siap Diambil"

Kolom | Alignment | Keterangan
--- | --- | ---
No. Service | Left | Service number (clickable link ke detail service)
Tanggal | Left | Tanggal service (format: dd/mm/yyyy)
Customer | Left | Nama customer
Device | Left | Merk dan model device
Teknisi | Left | Nama teknisi atau "-"
Total Biaya | Right | Total cost service (format Rupiah)
Sisa Bayar | Right | Remaining payment (format Rupiah)

#### 📋 BAGIAN 6: Detail Semua Service (DataTables)

Tabel lengkap semua service dengan fitur DataTables (sortir, search, pagination):

Warna Card Header: bg-secondary (Abu-abu)

Judul Card: "Detail Semua Service"

Kolom | Alignment | Keterangan
--- | --- | ---
No. Service | Left | Service number (clickable link)
Tanggal | Left | Tanggal service (dd/mm/yyyy)
Customer | Left | Nama customer
Device | Left | Merk dan model device
Status | Left | Badge dengan warna sesuai status: menunggu diagnosa → warning (kuning) sedang diagnosa → info (biru muda) menunggu persetujuan → primary (biru tua) menunggu spare part → secondary (abu-abu) dalam pengerjaan → info (biru muda) quality control → success (hijau) siap diambil → primary (biru tua) selesai → success (hijau) dibatalkan → danger (merah)
Cabang | Left | Nama cabang
Teknisi | Left | Nama teknisi atau "-"
Total | Right | Total cost (format Rupiah)

Fitur DataTables:

- Responsive: Ya
- Length Change: Ya (bisa ganti jumlah baris per halaman)
- Page Length Default: 25 baris
- Order Default: Kolom Tanggal (index 1), descending (terbaru di atas)
- Search: Ya (kotak pencarian global)
- Pagination: Ya

#### 🧮 Rumus dan Perhitungan

Berikut rumus yang digunakan dalam laporan ini:

1. Total Service: COUNT semua service dalam periode
2. Selesai: COUNT service dengan status = 'selesai'
3. Tertunda (>3 hari): COUNT service dimana (NOW - service_date) > 3 hari DAN status ≠ 'selesai' DAN status ≠ 'dibatalkan'
4. Siap Diambil: COUNT service dengan status = 'siap diambil'
5. Lama Service (hari): DATEDIFF(NOW, service_date) untuk service yang belum selesai
6. Total Nilai per Status: SUM(total_cost) GROUP BY status
7. Persentase Distribusi Status: (COUNT status tertentu / Total Service) × 100%

#### 📤 Tombol Export yang Tersedia

- Export PDF: 📄 Export PDF - Download laporan dalam format PDF (target="_blank", buka tab baru)
- Export Excel: 📊 Export Excel - Download laporan dalam format Excel (lengkap dengan ringkasan, statistik per status, dan detail semua service)

Parameter Export: Semua filter yang dipilih (start_date, end_date, branch_id) akan di-pass ke URL export.

### 9.5 Laporan Kinerja Teknisi

Laporan ini menampilkan evaluasi performa dan produktivitas teknisi dalam menangani service. Berguna untuk penilaian kinerja, bonus, dan alokasi tugas teknisi.

#### 📅 Filter Laporan

Filter yang tersedia untuk mengatur tampilan data:

Filter | Tipe | Keterangan
--- | --- | ---
Tanggal Mulai | Date Input | Wajib diisi. Tanggal awal periode laporan
Tanggal Akhir | Date Input | Wajib diisi. Tanggal akhir periode laporan
Teknisi | Dropdown | Opsional. Pilih "Semua Teknisi" atau teknisi tertentu untuk melihat data spesifik
Cabang | Dropdown | Opsional. Pilih "Semua Cabang" atau cabang tertentu
Tombol Aksi: 🔍 Tampilkan

#### 📊 BAGIAN 1: Summary Cards

Menampilkan ringkasan utama dengan 4 kartu informasi:

Card | Warna | Icon | Label | Keterangan
--- | --- | --- | --- | ---
Card 1 | bg-info (Biru) | 🔧 fa-wrench | Total Service | Total semua service dalam periode (count)
Card 2 | bg-success (Hijau) | ✅ fa-check-circle | Selesai | Jumlah service dengan status "selesai" (count)
Card 3 | bg-warning (Kuning) | 👥 fa-users | Jumlah Teknisi | Total teknisi yang menangani service (count distinct teknisi)
Card 4 | bg-primary (Biru Tua) | 💰 fa-money-bill-wave | Total Pendapatan | Total pendapatan dari service yang selesai (format penuh: "Rp 1.250.000")

#### 📊 BAGIAN 2: Grafik Kinerja Teknisi (Bar Chart Stacked)

Visualisasi grafik berbentuk Stacked Bar Chart yang menampilkan kinerja per teknisi:

- Judul: "Grafik Kinerja Teknisi"
- Warna Card Header: bg-info (Biru)
- Tipe Chart: Bar Chart (Chart.js) - Stacked (bertumpuk)
- Sumbu X: Nama teknisi
- Sumbu Y: Jumlah service (begin at zero)
- Dataset (3 layer bertumpuk):
  - Selesai - Hijau (#4CAF50)
  - Dalam Proses - Biru (#2196F3)
  - Dibatalkan - Merah (#F44336)
- Legend Position: Top (atas chart)
- Responsive: Ya, menyesuaikan ukuran layar
- Stacked Mode: Ya (sumbu X dan Y di-stack)

#### 📊 BAGIAN 3: Statistik Per Teknisi (Tabel)

Tabel detail yang menampilkan statistik lengkap setiap teknisi:

Warna Card Header: bg-success (Hijau)

Judul Card: "Statistik Per Teknisi"

Kolom | Alignment | Format/Badge | Keterangan
--- | --- | --- | ---
Teknisi | Left | Bold | Nama teknisi (bold/tebal)
Total Service | Center | Plain text | Jumlah total service yang ditangani teknisi
Selesai | Center | badge badge-success (hijau) | Jumlah service yang selesai
Dalam Proses | Center | badge badge-info (biru muda) | Jumlah service yang masih dalam proses
Dibatalkan | Center | badge badge-danger (merah) | Jumlah service yang dibatalkan
Success Rate | Center | badge dengan warna dinamis: ≥ 80% → badge-success (hijau) 60-79% → badge-warning (kuning) < 60% → badge-danger (merah) | Persentase keberhasilan (contoh: "85%")
Avg. Durasi | Center | Plain text + " hari" | Rata-rata durasi pengerjaan (contoh: "3 hari")
Total Pendapatan | Right | Format Rupiah | Total pendapatan dari semua service teknisi (contoh: "Rp 5.250.000")
FOOTER (bg-light, bold): TOTAL | Sum Total Service | Sum Selesai | Sum Dalam Proses | Sum Dibatalkan | "-" | "-" | Sum Total Pendapatan

#### 📋 BAGIAN 4: Detail Service (DataTables)

Tabel lengkap semua service dengan fitur DataTables (sortir, search, pagination):

Warna Card Header: bg-secondary (Abu-abu)

Judul Card: "Detail Service"

Kolom | Alignment | Keterangan
--- | --- | ---
No. Service | Left | Service number (clickable link ke detail service)
Tanggal | Left | Tanggal service (format: dd/mm/yyyy)
Customer | Left | Nama customer
Device | Left | Merk dan model device (contoh: "Samsung Galaxy A52")
Teknisi | Left | Nama teknisi atau "-" jika belum ada
Status | Left | Badge dengan warna sesuai status: selesai → badge-success (hijau) dibatalkan → badge-danger (merah) siap diambil → badge-primary (biru tua) lainnya → badge-warning (kuning)
Durasi | Left | Durasi pengerjaan: Jika sudah selesai: selisih hari dari service_date ke completed_at (contoh: "5 hari") Jika belum selesai: selisih hari dari service_date ke sekarang + "(berjalan)" (contoh: "3 hari (berjalan)")
Total | Right | Total cost service (format Rupiah)

Fitur DataTables:

- Responsive: Ya
- Length Change: Ya (bisa ganti jumlah baris per halaman)
- Page Length Default: 25 baris
- Order Default: Kolom Tanggal (index 1), descending (terbaru di atas)
- Search: Ya (kotak pencarian global)
- Pagination: Ya

#### 🧮 Rumus dan Perhitungan

Berikut rumus yang digunakan dalam laporan ini:

1. Total Service: COUNT semua service dalam periode
2. Selesai: COUNT service dengan status = 'selesai'
3. Jumlah Teknisi: COUNT DISTINCT(technician_id)
4. Total Pendapatan (Card): SUM(total_cost) WHERE status = 'selesai' / 1000 (dalam ribuan)
5. Total Service Per Teknisi: COUNT service WHERE technician_id = X
6. Selesai Per Teknisi: COUNT service WHERE technician_id = X AND status = 'selesai'
7. Dalam Proses Per Teknisi: COUNT service WHERE technician_id = X AND status NOT IN ('selesai', 'dibatalkan')
8. Dibatalkan Per Teknisi: COUNT service WHERE technician_id = X AND status = 'dibatalkan'
9. Success Rate (%): (Selesai / Total Service) × 100
10. Avg. Durasi (hari): AVG(DATEDIFF(completed_at, service_date)) untuk service yang selesai
11. Total Pendapatan Per Teknisi: SUM(total_cost) WHERE technician_id = X
12. Durasi Service (untuk tabel detail):
    - Jika selesai: DATEDIFF(completed_at, service_date)
    - Jika belum selesai: DATEDIFF(NOW, service_date)

#### 🎨 Badge Warna Success Rate

Success Rate menggunakan badge dinamis dengan aturan:

- 🟢 badge-success (Hijau): Success Rate ≥ 80%
- 🟡 badge-warning (Kuning): Success Rate 60-79%
- 🔴 badge-danger (Merah): Success Rate < 60%

#### 📤 Tombol Export yang Tersedia

- Export PDF: 📄 Export PDF - Download laporan dalam format PDF (target="_blank", buka tab baru)
- Export Excel: 📊 Export Excel - Download laporan dalam format Excel (lengkap dengan ringkasan, statistik per teknisi, dan detail service)

Parameter Export: Semua filter yang dipilih (start_date, end_date, technician_id, branch_id) akan di-pass ke URL export.

## 10. Pengaturan Sistem

Modul pengaturan sistem digunakan untuk mengelola user, roles, dan permissions menggunakan package Spatie Laravel Permission. Fitur ini memerlukan permission khusus untuk mengaksesnya.

### 10.1 Manajemen Roles (Peran)

Roles adalah peran atau jabatan user dalam sistem yang menentukan hak akses (permissions) yang dimiliki user.

#### 📋 Halaman Daftar Roles

Menampilkan tabel dengan kolom:

Kolom | Keterangan
--- | ---
NO. | Nomor urut
Nama Role | Nama role (contoh: Super Admin, Admin, Kasir, Teknisi, Customer)
Permission | Daftar permission yang dimiliki role (ditampilkan sebagai button hijau kecil)
Aksi | Tombol Edit (kuning) dan Hapus (merah)

#### ➕ Menambah Role Baru

Langkah 1: Klik menu Pengaturan → Roles
Langkah 2: Klik tombol ✚ Tambah di kanan atas
Langkah 3: Modal "Tambah Role" akan muncul. Isi form dengan field berikut:

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Nama Role | Text Input | ✅ Ya | Nama role harus unique (tidak boleh sama dengan role yang sudah ada)
Permission | Checkbox (inline) | ❌ Tidak | Centang permission yang ingin diberikan ke role ini. Semua permission yang ada di database akan ditampilkan sebagai checkbox

Langkah 4: Klik tombol 📤 Simpan
💡 Catatan: Setelah klik Simpan, role baru akan langsung ter-assign dengan permissions yang sudah dicentang.

#### ✏️ Edit Role

Langkah 1: Di halaman daftar Roles, klik tombol ✏️ pada row role yang ingin diedit
Langkah 2: Modal "Edit Data" akan muncul dengan form yang sama seperti form tambah
Langkah 3: Ubah nama role atau centang/uncheck permissions
Langkah 4: Klik 📤 Simpan
💡 Catatan: Permissions akan di-sync ulang dengan pilihan baru menggunakan method `syncPermissions()`

#### 🗑️ Hapus Role

Langkah 1: Klik tombol 🗑️ pada role yang ingin dihapus
Langkah 2: Konfirmasi penghapusan (akan muncul dialog konfirmasi)
⚠️ Perhatian:

- Role yang dihapus tidak dapat dikembalikan
- User yang memiliki role ini akan kehilangan semua permissions dari role tersebut
- Sebaiknya jangan hapus role default sistem

### 10.2 Manajemen Permissions (Hak Akses)

Halaman permissions menampilkan daftar READ-ONLY dari semua permission yang tersedia di sistem. Halaman ini TIDAK MEMILIKI fitur tambah, edit, atau hapus permission.

#### 📋 Halaman Daftar Permissions

Menampilkan tabel dengan kolom:

Kolom | Keterangan
--- | ---
NO. | Nomor urut
Nama Permission | Nama permission (contoh: products.index, sales.create, users.delete, dll)

💡 Catatan Penting:

- Halaman ini HANYA untuk melihat daftar permissions yang ada
- TIDAK ADA tombol Tambah, Edit, atau Hapus permission
- Permissions di-manage langsung di database atau via seeder
- Untuk assign permission ke role, gunakan halaman Roles (Section 10.1)

#### 🔑 Format Nama Permission

Permission di sistem ini menggunakan format: `module.action`

Contoh permission yang umum ada di sistem:

Modul | Contoh Permission
--- | ---
Products | products.index, products.create, products.edit, products.delete
Sales | sales.index, sales.create, sales.edit, sales.delete
Purchases | purchases.index, purchases.create, purchases.edit, purchases.delete
Services | services.index, services.create, services.edit, services.delete
Roles | roles.index, roles.create, roles.edit, roles.delete
Users | users.index, users.create, users.edit, users.delete
Permissions | permissions.index

#### 📌 Cara Assign Permission ke Role

Karena halaman Permissions hanya READ-ONLY, untuk memberikan permission ke role dilakukan di halaman Roles:

Langkah 1: Buka halaman Pengaturan → Roles
Langkah 2: Klik tombol Edit pada role yang ingin diatur
Langkah 3: Di form edit, centang/uncheck permission yang ingin diberikan/dicabut
Langkah 4: Klik Simpan

### 10.3 Manajemen Users (Pengguna)

Kelola akun pengguna yang dapat mengakses sistem.

#### 📋 Halaman Daftar Users

Menampilkan tabel dengan kolom:

Kolom | Keterangan
--- | ---
NO. | Nomor urut
Nama User | Nama lengkap user
Role | Role yang dimiliki user (ditampilkan sebagai badge hijau)
Aksi | Tombol Edit (kuning) dan Hapus (merah)

#### ➕ Menambah User Baru

Langkah 1: Klik menu Pengaturan → Users
Langkah 2: Klik tombol ✚ Tambah di kanan atas
Langkah 3: Modal "Tambah User" akan muncul. Isi form dengan field berikut:

Field | Tipe | Wajib | Keterangan
--- | --- | --- | ---
Nama User | Text Input | ✅ Ya | Nama lengkap user
Email | Email Input | ✅ Ya | Email harus valid dan unique (digunakan untuk login)
Password | Password Input | ✅ Ya | Password untuk login
Konfirmasi Password | Password Input | ✅ Ya | Harus sama dengan password (validasi konfirmasi)
Role | Checkbox (inline) | ❌ Tidak | Centang role yang ingin diberikan ke user. User bisa memiliki LEBIH DARI 1 role

Langkah 4: Klik tombol 📤 Simpan
💡 Catatan Penting:

- Field yang ada HANYA: Nama User, Email, Password, Konfirmasi Password, dan Role
- TIDAK ADA field: Cabang, No. Telepon, Alamat, atau Status
- User bisa memiliki multiple roles (checkbox, bukan dropdown)
- Password akan di-hash dengan bcrypt sebelum disimpan

#### ✏️ Edit User

Langkah 1: Di halaman daftar Users, klik tombol ✏️ pada row user yang ingin diedit
Langkah 2: Modal "Edit Data" akan muncul dengan form yang mirip seperti form tambah
Langkah 3: Ubah data yang diperlukan (nama, email, role)
Langkah 4: Password: Kosongkan field password jika TIDAK ingin mengubah password. Jika diisi, maka password lama akan diganti dengan yang baru
Langkah 5: Klik 📤 Simpan
💡 Logika Update Password:

- Jika field password KOSONG → password tidak diubah (tetap password lama)
- Jika field password DIISI → password lama akan di-replace dengan password baru (di-hash)

#### 🗑️ Hapus User

Langkah 1: Klik tombol 🗑️ pada user yang ingin dihapus
Langkah 2: Konfirmasi penghapusan (akan muncul dialog konfirmasi)
⚠️ Perhatian:

- User yang dihapus tidak dapat dikembalikan
- Riwayat transaksi yang dibuat user tetap tersimpan (tidak dihapus)

#### 🔐 Validasi Form

Form tambah dan edit user memiliki validasi JavaScript:

- Nama User: Tidak boleh kosong
- Email: Tidak boleh kosong, harus format email valid
- Password (Tambah): Wajib diisi
- Konfirmasi Password: Harus sama dengan password
- Error akan muncul dengan class `is-invalid` dan pesan di bawah field
- Modal akan auto-buka kembali jika ada error dari server

## 11. Tips & Troubleshooting

### 11.1 Tips Penggunaan

#### 🎯 Best Practices

- Siapkan Master Data Dulu - Buat kategori, merek, supplier, customer, dan cabang sebelum input produk
- Import Excel untuk Bulk - Gunakan fitur import Excel untuk input produk massal (lebih cepat)
- Perhatikan Stok & Harga per Cabang - Pastikan cabang di Tab Stok = cabang di Tab Harga
- Cek Stok Harian - Monitor stok menipis setiap hari dari dashboard
- Update Status Service - Update progres service berkala agar customer informed
- Cetak QR Code - Print QR Code dan tempel di produk untuk scan cepat saat transaksi
- Rekap Laporan Bulanan - Export laporan laba rugi setiap akhir bulan untuk evaluasi
- Backup Data Rutin - Backup database minimal 1 minggu sekali

#### ⚡ Shortcut Cepat

- Scan QR di Penjualan - Gunakan scan QR saat transaksi untuk input produk lebih cepat
- Filter Tanggal - Manfaatkan filter tanggal di semua laporan
- Search Box - Gunakan search untuk cari produk/customer/transaksi cepat
- Export Excel - Export laporan ke Excel untuk analisa lebih lanjut di spreadsheet

### 11.2 Troubleshooting

#### ❌ Masalah: QR Code Tidak Tergenerate

Solusi:

- Pastikan library BaconQrCode sudah terinstall (cek composer)
- Periksa permission folder `public/qrcodes` (harus writable)
- Restart web server
- Cek log error di `storage/logs/laravel.log`

#### ❌ Masalah: Import Excel Gagal

Solusi:

- Pastikan format Excel sesuai template yang didownload
- Cek kategori dan merek sudah ada di database
- Cek cabang sudah dibuat
- Pastikan tidak ada data duplikat
- Periksa format angka (harga & stok harus numerik, tidak boleh ada huruf)
- Jangan ada baris kosong di tengah data
- Nama kategori, merek, cabang harus sama persis dengan yang ada di database (case sensitive)

#### ❌ Masalah: Cabang di Stok & Harga Tidak Sinkron

Solusi:

- Saat tambah produk, pastikan cabang di Tab 2 (Stok) sama dengan Tab 3 (Harga)
- Jika sudah terlanjur, edit produk dan tambahkan cabang yang kurang
- Validasi sistem akan menolak jika cabang tidak sinkron

#### ❌ Masalah: Stok Tidak Update Setelah Transaksi

Solusi:

- Periksa transaksi sudah tersimpan dengan benar (cek di index)
- Cek tidak ada error saat simpan transaksi
- Refresh halaman produk (Ctrl + F5)
- Periksa log error di server
- Pastikan cabang di transaksi ada di produk

#### ❌ Masalah: Qty Penjualan Melebihi Stok

Solusi:

- Sistem akan otomatis validasi qty tidak boleh > stok tersedia
- Jika tetap bisa, berarti ada bug - hubungi developer
- Cek stok di cabang yang dipilih (bukan total stok semua cabang)

#### ❌ Masalah: Kamera QR Tidak Muncul

Solusi:

- Pastikan browser mendukung akses kamera (Chrome, Firefox, Edge recommended)
- Berikan permission kamera saat diminta browser
- Gunakan HTTPS (jika deploy online, localhost bisa HTTP)
- Coba browser lain jika masih tidak bisa
- Pastikan kamera tidak sedang digunakan aplikasi lain

#### ❌ Masalah: Laporan Tidak Muncul / Kosong

Solusi:

- Periksa filter tanggal sudah benar
- Pastikan ada data di periode yang dipilih
- Cek filter cabang (jika pilih cabang tertentu, pastikan ada data di cabang tersebut)
- Clear cache browser (Ctrl + Shift + Del)
- Coba periode tanggal yang berbeda untuk testing

#### ❌ Masalah: Tidak Bisa Login

Solusi:

- Periksa email dan password benar
- Pastikan akun tidak dinonaktifkan (hubungi admin)
- Clear cookies browser
- Coba browser lain atau mode incognito
- Hubungi admin untuk reset password jika lupa

#### ❌ Masalah: Margin/Laba Negatif di Laporan

Solusi:

- Periksa harga jual < harga beli (rugi)
- Cek apakah ada diskon terlalu besar
- Review harga jual produk yang margin-nya negatif
- Sesuaikan harga jual agar profit positif

### 11.3 Keamanan Data

#### 🔒 Praktik Keamanan

- Gunakan password kuat (minimal 8 karakter, kombinasi huruf besar-kecil-angka-simbol)
- Jangan share password antar user
- Logout setelah selesai menggunakan aplikasi
- Jangan akses dari komputer publik/warnet
- Ganti password secara berkala (3-6 bulan sekali)
- Backup database ke storage eksternal (Google Drive, Dropbox, dll)
- Gunakan HTTPS jika deploy online (SSL Certificate)

### 11.4 Maintenance Rutin

Periode | Aktivitas yang Harus Dilakukan
--- | ---
Harian | - Cek stok menipis dari dashboard - Update status service yang sedang berjalan - Review transaksi hari ini
Mingguan | - Backup database - Review laporan penjualan minggu ini - Cek service yang tertunda - Update harga produk jika ada perubahan
Bulanan | - Export laporan laba rugi lengkap - Analisa profit per produk - Inventory check (stock opname) - Review kinerja teknisi - Evaluasi produk slow-moving
3 Bulan | - Ganti password semua user - Cleanup data lama (transaksi >1 tahun ke arsip) - Optimize database (VACUUM/OPTIMIZE TABLE) - Review & update master data

### 11.5 FAQ (Frequently Asked Questions)

#### ❓ Apakah bisa ubah harga produk setelah dibuat?

Jawab: Ya, bisa. Edit produk → Tab 3 (Harga per Cabang) → ubah harga beli/jual → simpan. Perubahan harga tidak mempengaruhi transaksi yang sudah lewat.

#### ❓ Bagaimana cara tambah cabang baru untuk produk yang sudah ada?

Jawab: Edit produk → Tab 2 (tambah stok cabang baru) → Tab 3 (tambah harga cabang baru) → simpan. Pastikan cabang yang ditambah di Tab 2 dan Tab 3 sama.

#### ❓ Apakah bisa hapus transaksi yang sudah disimpan?

Jawab: Tergantung role user. Admin/Super Admin bisa hapus transaksi. Namun sebaiknya jangan hapus untuk menjaga integritas data. Jika ada kesalahan, buat transaksi koreksi.

#### ❓ Bagaimana cara melihat history perubahan harga produk?

Jawab: Di halaman detail produk → Tabel Harga per Cabang → ada kolom "Tanggal Efektif" yang menunjukkan kapan harga terakhir diupdate.

#### ❓ Apakah laporan bisa difilter per kasir/teknisi?

Jawab: Laporan kinerja teknisi bisa filter per teknisi. Untuk laporan penjualan per kasir, belum tersedia filter (tapi data kasir ditampilkan di tabel transaksi).

#### ❓ Bagaimana cara handle produk yang ada di 2 cabang dengan harga berbeda?

Jawab: Sistem sudah support Multi-Harga per Cabang. Di Tab 3, tambahkan harga untuk masing-masing cabang dengan nilai yang berbeda.

#### ❓ Apakah bisa cetak label QR Code dalam jumlah banyak sekaligus?

Jawab: Saat ini harus download QR Code satu per satu dari halaman detail produk. Untuk cetak massal, bisa gunakan software label printing eksternal.