Sistem manajemen keuangan internal untuk WHUSNET — mengelola transaksi rembush (reimbursement) & pengajuan pembelian, dengan fitur OCR otomatis menggunakan AI (Gemini via n8n), alur approval multi-level, serta dashboard analitik real-time.
Version: 4.5.0 | Laravel: 12 | PHP: 8.4 | Last Updated: 4 Mei 2026
- 📖 Documentation Index - Central hub untuk semua dokumentasi
- ⚡ Quick Start (5 min) - Setup cepat untuk development
- 🤝 Contributing Guide - Panduan kontribusi
- 🔧 Troubleshooting - Solusi masalah umum
- 📝 Changelog - Version history
- Fitur Utama
- Tech Stack
- Arsitektur Sistem
- Persyaratan
- Instalasi & Setup
- Konfigurasi Environment
- Struktur Project
- Peran Pengguna (Roles)
- Modul Aplikasi
- Alur Transaksi
- API Endpoints
- Event & Notifikasi
- Perintah Berguna
- 📚 Dokumentasi Lengkap
| Fitur | Deskripsi |
|---|---|
| Rembush (Reimbursement) | Flow otomatis: Upload nota → 4-Layer Security (Duplikat, Tanggal, AI, Payment Verification) → Auto-fill data → Submit. |
| Pengajuan Pembelian | Sistem Dual-Version (Teknisi vs Management). Mendukung perbandingan versi, snapshot items, dan alokasi cabang manual. |
| Gudang (Warehouse) | Modul internal untuk pencatatan belanja gudang. Alur cepat: Tanpa OCR/Telegram, status langsung completed setelah bukti upload. |
| OCR AI (Gemini) | Ekstraksi data dari foto nota secara otomatis via n8n + Gemini API dengan parameter confidence. |
| Multi-Level Approval | Transaksi < Rp 1.000.000 auto-complete (jika disetujui Admin), ≥ Rp 1.000.000 perlu approval Owner. |
| Dual-Version System | Melacak perubahan data antara input asli Teknisi dan hasil revisi Management untuk audit trail yang transparan. |
| Edit Protection | Proteksi otomatis: Transaksi dengan status completed tidak dapat diedit oleh peran apapun (termasuk Owner). |
| Dashboard Analitik | Statistik transaksi, rincian biaya per cabang, dan monitoring real-time Hutang & Piutang Antar Cabang via AJAX widgets. |
| Alokasi Cabang | Distribusi biaya transaksi ke beberapa cabang dengan persentase alokasi (Equal, Percentage, atau Manual). |
| Hutang Antar Cabang | Pelunasan hutang antar-unit dengan fitur upload bukti transfer dan catatan pelunasan otomatis. |
| Prive (Withdrawal) | Pencatatan pengambilan dana pribadi owner dengan tracking sumber dana cabang dan bukti transfer. |
| Kelola Kategori | Sistem manajemen kategori dinamis untuk Rembush & Pengajuan dengan antarmuka Glass Admin modern. |
| Rekening Cabang | Manajemen rekening bank/e-wallet untuk tiap cabang dengan kontrol akses ketat (Owner full-access, Atasan & Admin read-only). |
| Notifikasi Real-time | Notifikasi via WebSocket (Laravel Reverb) untuk update status transaksi & OCR. |
| Bypass AI Control | Fitur Override (untuk memulihkan auto-reject) dan Force Approve (untuk memulihkan flagged nominal). |
| Telegram Bot Sync | Notifikasi real-time, konfirmasi pembayaran cash, dan alert selisih nominal langsung ke Telegram. |
| Activity Log & Audit | Audit trail lengkap untuk setiap aksi dan laporan kebocoran dana bulanan via PaymentDiscrepancyAudit. |
| Responsive UI | Antarmuka mobile-first dengan modal rincian transaksi komprehensif dan toggle perbandingan versi. |
| Price Index System | Referensi harga belanja otomatis dengan filter outlier (IQR), deteksi anomali real-time (AJAX), dan penanganan Cold Start untuk barang baru. |
| Hybrid Search | Menjamin performa dengan switch otomatis antara Client-Side (< 5k data) dan Server-Side (≥ 5k data). |
| API Documentation | Dokumentasi API interaktif dan otomatis menggunakan Scramble (OpenAPI/Swagger). |
| Export Excel Optimized | Export Laporan Transaksi 40k+ baris dengan 3-Layer Optimization (OpenSpout streaming + Async Job + keyset pagination). Memori konstan 30 MB, progress real-time via Reverb. |
-
PHP 8.4 + Laravel 12
-
Scramble — Automated API documentation (OpenAPI 3.1)
-
MySQL 8.0 — Database utama
-
Redis 7.2 — Cache, session, queue, rate limiter, ID generator
-
Laravel Horizon — Monitoring & manajemen queue worker
-
Laravel Reverb — WebSocket server untuk notifikasi real-time
- Blade Templates — Server-side rendering dengan logic role-based.
- Tailwind CSS v4 — Modern utility-first CSS framework.
- Vite — Asset bundling & HMR.
- Vanilla JS & Axios — AJAX interactions & real-time UI synchronization.
- Docker & Docker Compose — Containerized deployment
- Nginx — Reverse proxy & web server
- n8n — Workflow automation untuk OCR processing
- Google Gemini AI — OCR untuk ekstraksi data nota (via n8n webhook)
graph TD
A[Frontend/User] -->|Upload| B(Laravel API /v1/nota/upload)
B -->|Dispatch Job| C{Redis Queue}
C -->|Trigger| D[n8n Workflow]
subgraph n8n_Logic [Security & AI Extraction]
D1[Layer 1: Duplicate Detection] --> D2[Layer 2: Date Logic Check]
D2 --> D3[Layer 3: Gemini AI Extraction]
D3 --> D4[Layer 4: Payment Verification]
end
D --> n8n_Logic
D4 -->|Callback| E[Laravel API /ai/auto-fill]
E -->|Broadcast| F[Laravel Reverb WS]
F -->|Real-time UI| A
E -->|Notify| G[Telegram / Push Notif]
- Upload: User upload foto nota.
- Security Check (L1 & L2): Sistem mengecek duplikasi hash file dan validitas tanggal (maks 2 hari).
- AI Extraction (L3): Gemini mengekstrak Vendor, Item, dan Nominal. User melengkapi kategori & alokasi cabang.
- Approval: Admin/Atasan menyetujui. Jika nominal ≥ 1 Jt, memerlukan approval Owner.
- Payment: Admin upload bukti bayar (Transfer/Cash).
- Verification (L4):
- Transfer: AI mengecek nominal struk vs transaksi. Jika selisih, status menjadi
flagged. - Cash: Teknisi konfirmasi terima uang via Telegram Bot.
- Transfer: AI mengecek nominal struk vs transaksi. Jika selisih, status menjadi
- Input: Teknisi input detail pengajuan. Sistem menyimpan snapshot original.
- Management Review: Owner/Atasan dapat merevisi item/nominal. Sistem menandai
is_edited_by_management = true. - Transparency: Semua user dapat melihat perbandingan antara "Versi Pengaju" dan "Versi Management" melalui toggle di modal detail.
- Payment holding: Transaksi beralih ke
waiting_paymentsetelah disetujui. Saat invoice diupload, status akan tetapwaiting_paymentjika terdapat cabang yang masih berhutang (inter-unit debt). - Finalization: Status otomatis menjadi
completedhanya setelah invoice terunggah DAN seluruh hutang antar cabang telah dilunaskan. Pengeditan kini dikunci total.
- Input: Staff internal (Admin/Owner) input belanja gudang.
- Review Management: Persetujuan oleh Management. Status menjadi
pending->waiting_payment. - Payment: Upload bukti bayar (Tanpa OCR).
- Finalization: Status langsung menjadi
completedtanpa perlu konfirmasi Telegram teknisi.
Sistem menerapkan 4-Layer Verification untuk menjamin validitas keuangan:
- Layer 1 (Duplicate): Pengecekan MD5 hash file nota di Redis/DB untuk mencegah nota ganda.
- Layer 2 (Date Logic): Nota berumur > 2 hari kalender otomatis berstatus
auto-reject(dapat di-override oleh Admin/Owner). - Layer 3 (AI Extraction): Gemini Pro mengekstrak data dengan parameter
confidence. Statuslow-confidencememerlukan review manual. - Layer 4 (Payment Audit): Verifikasi nominal pada struk transfer. Jika tidak cocok, transaksi di-flag dan memerlukan Force Approve dengan alasan tertulis.
Sistem pencarian transaksi dirancang untuk performa optimal pada berbagai skala data:
- Threshold: 5.000 records benchmark.
- Mode Client-Side (< 5k): Seluruh data dimuat ke frontend (lean version) untuk pencarian instan tanpa latency server.
- Mode Server-Side (≥ 5k): Sistem beralih ke paginasi database standar untuk menjaga penggunaan memori browser tetap rendah.
- Auto-Adaptive: Setiap pemuatan halaman melakukan pengecekan jumlah data via
/transactions/countuntuk menentukan mode terbaik secara otomatis.
Bot Telegram digunakan sebagai jembatan komunikasi real-time:
- Teknisi: Menerima notifikasi pembayaran cash dan tombol ✅ Konfirmasi Terima.
- Admin/Owner: Menerima alert 🚨 Selisih Nominal atau ⛔ Auto-Reject.
- Owner: Menerima notifikasi untuk Force Approve pada transaksi yang di-flag.
- Broadcast: Pengiriman pesan ke seluruh staf atau role tertentu.
| Service | Container | Port | Fungsi |
|---|---|---|---|
| app | whusnet-app |
9000 | Laravel PHP-FPM |
| nginx | whusnet-nginx |
8000 | Web server |
| db | whusnet-db |
3306 | MySQL database |
| redis | whusnet-redis |
6379 | Cache, session, queue |
| horizon | whusnet-horizon |
— | Queue worker & monitoring |
| reverb | whusnet-reverb |
8081 | WebSocket server |
| scheduler | whusnet-scheduler |
— | Laravel cron scheduler |
| node | nodeJS |
3000 | Vite dev server |
| phpmyadmin | phpmyadmin |
8080 | Database management |
- Docker ≥ 20.x & Docker Compose ≥ 2.x
- Git
Semua dependency lainnya (PHP, Node, MySQL, Redis, dll.) sudah termasuk dalam Docker containers.
git clone <repository-url>
cd Admin-Paymentcp .env.example .envEdit file .env sesuai konfigurasi (lihat bagian Konfigurasi Environment).
docker-compose up -d --build# Masuk ke container app
docker exec -it whusnet-app bash
# Install dependencies
composer install
# Generate application key
php artisan key:generate
# Jalankan migrasi database
php artisan migrate
# Buat symbolic link untuk storage
php artisan storage:link
# (Opsional) Jalankan seeder
php artisan db:seed| Layanan | URL |
|---|---|
| Aplikasi | http://localhost:8000 |
| API Documentation | http://localhost:8000/docs/api |
| phpMyAdmin | http://localhost:8080 |
| Horizon Dashboard | http://localhost:8000/horizon |
Variabel penting yang perlu dikonfigurasi di file .env:
# ── Aplikasi ──────────────────────────────────────────
APP_NAME="WHUSNET Admin Payment"
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost:8000
# ── Database ──────────────────────────────────────────
DB_CONNECTION=mysql
DB_HOST=whusnet-db # nama container Docker
DB_PORT=3306
DB_DATABASE=admin-payment
DB_USERNAME=admin
DB_PASSWORD=root
# ── Redis ─────────────────────────────────────────────
REDIS_HOST=redis # nama container Docker
REDIS_PORT=6379
REDIS_PASSWORD=<your-redis-password>
# ── Session, Cache, Queue (gunakan Redis) ─────────────
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
# ── Broadcasting (Reverb WebSocket) ───────────────────
BROADCAST_CONNECTION=reverb
REVERB_APP_ID=<your-reverb-app-id>
REVERB_APP_KEY=<your-reverb-app-key>
REVERB_APP_SECRET=<your-reverb-app-secret>
# ── n8n OCR Integration ──────────────────────────────
N8N_WEBHOOK_URL=<your-n8n-webhook-url>
N8N_SECRET=<your-n8n-secret>Admin-Payment/
├── app/
│ ├── Console/ # Artisan commands
│ ├── Events/ # Event classes (broadcasting)
│ │ ├── ActivityLogged.php
│ │ ├── NotificationReceived.php
│ │ ├── OcrStatusUpdated.php
│ │ ├── TransactionCreated.php
│ │ └── TransactionUpdated.php
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Api/
│ │ │ │ └── AiAutoFillController.php # OCR callback & polling
│ │ │ ├── AuthController.php # Login / Logout
│ │ │ ├── BranchController.php # CRUD Cabang
│ │ │ ├── DashboardController.php # Dashboard & analytics
│ │ │ ├── GudangController.php # Alur belanja gudang (internal)
│ │ │ ├── NotificationController.php # Notifikasi
│ │ │ ├── PengajuanController.php # Alur pengajuan
│ │ │ ├── RembushController.php # Alur rembush + OCR
│ │ │ ├── TransactionController.php # CRUD & status transaksi
│ │ │ └── UserController.php # CRUD User
│ │ └── Middleware/
│ │ └── CheckRole.php # Role-based access control
│ ├── Jobs/
│ │ └── OcrProcessingJob.php # Background OCR processing
│ ├── Models/
│ │ ├── ActivityLog.php # Log aktivitas
│ │ ├── Branch.php # Cabang
│ │ ├── Transaction.php # Transaksi (model utama)
│ │ └── User.php # Pengguna
│ ├── Notifications/
│ │ ├── OcrStatusNotification.php # Notif status OCR
│ │ ├── OwnerApprovalNotification.php # Notif approval owner
│ │ └── TransactionStatusNotification.php # Notif status transaksi
│ ├── Providers/
│ └── Services/
│ ├── IdGeneratorService.php # Generator ID sequential (Redis)
│ └── OCR/
│ └── GeminiRateLimiter.php # Rate limiter Gemini API
├── database/
│ └── migrations/ # 15 migration files
├── docker/
│ └── nginx/ # Konfigurasi Nginx
├── resources/
│ └── views/
│ ├── auth/ # Halaman login
│ ├── branches/ # Manajemen cabang
│ ├── dashboard/ # Dashboard & analytics
│ ├── layouts/ # Layout utama
│ ├── notifications/ # Halaman notifikasi
│ ├── transactions/ # Halaman transaksi (8 views + gudang-form)
│ └── users/ # Manajemen pengguna
├── routes/
│ ├── api.php # API routes (OCR callback)
│ ├── channels.php # Broadcasting channels
│ ├── console.php # CLI routes
│ └── web.php # Web routes utama
├── docker-compose.yml # Konfigurasi Docker (9 services)
├── Dockerfile # PHP 8.4-FPM image
└── composer.json # PHP dependencies
Terdapat 4 peran pengguna dengan hak akses hierarkis:
| Role | Dashboard | Input Transaksi | Edit Pengajuan | Approval | Kelola Cabang |
|---|---|---|---|---|---|
| Teknisi | ❌ | ✅ | ❌ | ❌ | ❌ |
| Admin | ✅ | ✅ | ✅ (Limited Edit) | ✅ (< 1 Jt) | ✅ |
| Atasan | ✅ | ✅ (Gudang/PR) | ✅ (Full Edit) | ✅ (< 1 Jt) | ✅ |
| Owner | ✅ | ✅ | ✅ (Full Edit) | ✅ (Semua) | ✅ |
- Admin Limited Edit: Admin dapat mengakses halaman edit Pengajuan dalam status
waiting_paymentuntuk mengelola Pembagian Cabang dan Metode Distribusi. Bidang finansial (Item, Harga, DPP, PPN) tetap terkunci (Read-only). - Settlement Lockout: Jika transaksi memasuki fase pelunasan (
isSettlementPhase), seluruh akses edit akan dikunci total untuk SEMUA role, termasuk Owner. - Edit Protection: Jika status transaksi adalah
completed, tombol edit akan disembunyikan untuk SEMUA role guna menjaga integritas audit.
- Login dengan email + password + pemilihan role
- Validasi role saat login (role pada akun harus cocok dengan role yang dipilih)
- Auto-redirect berdasarkan role setelah login
- Statistik Transaksi: Total transaksi, total pending, total disetujui, total ditolak
- Rincian Biaya per Cabang: Breakdown biaya per cabang dengan filter bulan/tahun (AJAX) dan fitur interaktif Hutang Rembush (menampilkan list transaksi pending/waiting payment per cabang).
- Daftar Transaksi Pending: Tabel transaksi yang menunggu approval (AJAX refresh)
Alur lengkap reimbursement dengan OCR:
- Upload Nota → Foto nota diupload ke server
- OCR Processing → Job dikirim ke queue, foto dikirim ke n8n webhook → Gemini AI
- Loading Page → Frontend polling status OCR setiap 2 detik
- Form Auto-fill → Data hasil OCR mengisi form otomatis (customer, items, amount, dll.)
- Review & Submit → User verifikasi dan submit transaksi
Alur pengajuan tanpa OCR:
- Isi Form → Nama vendor, spesifikasi, jumlah, estimasi harga, alasan pembelian
- Upload Foto (opsional) → Foto pendukung
- Submit → Langsung masuk ke daftar pending
- Approve: Mengubah status menjadi
approvedataucompleted- Jika nominal < Rp 1.000.000 → langsung
completed - Jika nominal ≥ Rp 1.000.000 → status
approved, menunggu Owner approval
- Jika nominal < Rp 1.000.000 → langsung
- Reject: Mengubah status menjadi
rejecteddengan alasan penolakan - Edit: Mengubah detail transaksi (hanya Admin, Atasan, Owner)
- Delete: Menghapus transaksi beserta file attachment
- CRUD cabang (nama cabang)
- Cabang yang masih memiliki transaksi tidak dapat dihapus
- Mendukung response JSON untuk AJAX interactions
- CRUD user dengan validasi role-based
- Admin & Atasan hanya bisa mengelola Teknisi
- Owner bisa mengelola semua role
- Tidak dapat menghapus akun sendiri
- Manajemen Dinamis: CRUD kategori untuk tipe Rembush dan Pengajuan.
- Toggle Status: Aktifkan/Nonaktifkan kategori tanpa menghapus data historis.
- UI Modern: Desain Glassmorphism dengan statistik ringkasan dan pencarian real-time.
- Sync Otomatis: Kategori yang aktif langsung muncul di form Rembush & Pengajuan.
- Notifikasi in-app menggunakan Laravel Notification system
- Filter berdasarkan tipe (OCR status, transaction status)
- Mark as read (satuan atau semua)
- Hapus notifikasi (satuan atau semua)
- Badge unread count via AJAX polling
- Mencatat semua aktivitas user: create, update, approve, reject, delete
- Menyimpan referensi ke user dan transaksi terkait
Sistem untuk menjaga efisiensi anggaran belanja:
- Auto-Calculated: Menghitung harga Min/Max/Avg berdasarkan riwayat transaksi yang disetujui.
- Outlier Filtering: Menggunakan algoritma IQR (Interquartile Range) untuk membuang data harga yang tidak wajar dari kalkulasi.
- Real-time Detection: Memperingatkan user jika harga yang diinput pada Pengajuan melebihi referensi maksimal.
- Anomaly Hub: Dashboard khusus untuk Owner mereview pelanggaran harga (Critical/Medium/Low).
- Manual Lock: Owner dapat mengunci harga referensi secara manual untuk kestabilan kebijakan.
graph TD
A[Pending] -->|Reject| B[Rejected]
A -->|< 1jt Approve| C[Waiting Payment]
A -->|>= 1jt Approve| D[Approved]
D -->|Owner Approve| C
C -->|Upload Invoice| E{Has Branch Debt?}
E -->|Yes| C
E -->|No| F[Completed]
C -->|Settle Final Debt| F
- Gate Approval:
- Transaksi < Rp 1.000.000: Admin/Atasan approve →
waiting_payment. - Transaksi ≥ Rp 1.000.000: Admin/Atasan approve →
approved(menunggu Owner) → Owner approve →waiting_payment.
- Transaksi < Rp 1.000.000: Admin/Atasan approve →
- Payment & Debt Flow:
- Invoice Uploaded: Jika ada hutang antar cabang, status tetap
waiting_payment. - Debt Settled: Transaksi otomatis
completedsaat hutang terakhir dilunaskan (dan invoice sudah ada).
- Invoice Uploaded: Jika ada hutang antar cabang, status tetap
Proyek ini menggunakan Scramble untuk menghasilkan dokumentasi API secara otomatis. Dokumentasi ini mengikuti standar OpenAPI 3.1 dan dapat diakses melalui antarmuka interaktif.
- Interactive UI: http://localhost:8000/docs/api
- OpenAPI Spec (JSON): http://localhost:8000/docs/api.json
Tip
Dokumentasi ini diperbarui secara otomatis setiap ada perubahan pada route atau controller. Pastikan untuk menambahkan type-hinting pada method controller untuk hasil dokumentasi yang lebih akurat.
Dalam dokumentasi API, Anda akan menemukan beberapa endpoint yang ditandai sebagai Primary atau Legacy:
- Primary: Endpoint standar terbaru yang direkomendasikan untuk semua integrasi baru. Memiliki penamaan yang benar dan konsisten.
- Legacy: Endpoint lama yang dipertahankan untuk backward compatibility. Endpoint ini mungkin memiliki typo yang sudah diperbaiki di versi primary (misal:
/ai/auto-fil) atau struktur URL lama. Keduanya menjalankan logic yang sama di backend.
| Method | URI | Controller | Akses |
|---|---|---|---|
GET |
/login |
AuthController@showLogin |
Guest |
POST |
/login |
AuthController@login |
Guest |
POST |
/logout |
AuthController@logout |
Auth |
GET |
/dashboard |
DashboardController@index |
Auth |
GET |
/dashboard/branch-cost-data |
DashboardController@branchCostData |
Auth |
GET |
/dashboard/pending-list-data |
DashboardController@pendingListData |
Auth |
GET |
/dashboard/branch-hutang |
DashboardController@branchHutangData |
Auth |
GET |
/transactions |
TransactionController@index |
Auth |
GET |
/transactions/{id}/detail |
TransactionController@show |
Auth |
GET |
/transactions/{id}/detail-json |
TransactionController@detailJson |
Auth |
GET |
/transactions/{id}/image |
TransactionController@serveImage |
Auth |
GET |
/transactions/create |
TransactionController@create |
Teknisi, Admin, Owner |
POST |
/rembush/upload |
RembushController@processUpload |
Teknisi, Admin, Owner |
GET |
/rembush/loading |
RembushController@loading |
Teknisi, Admin, Owner |
GET |
/rembush/form |
RembushController@showForm |
Teknisi, Admin, Owner |
POST |
/rembush/store |
RembushController@store |
Teknisi, Admin, Owner |
GET |
/pengajuan/form |
PengajuanController@showForm |
Teknisi, Admin, Owner |
POST |
/pengajuan/upload |
PengajuanController@uploadPhoto |
Teknisi, Admin, Owner |
POST |
/pengajuan/store |
PengajuanController@store |
Teknisi, Admin, Owner |
GET |
/gudang/form |
GudangController@showForm |
Admin, Owner |
POST |
/gudang/store |
GudangController@store |
Admin, Owner |
GET |
/transactions/{id}/edit |
TransactionController@edit |
Admin, Atasan, Owner |
PUT |
/transactions/{id} |
TransactionController@update |
Admin, Atasan, Owner |
PATCH |
/transactions/{id}/status |
TransactionController@updateStatus |
Admin, Atasan, Owner |
DELETE |
/transactions/{id} |
TransactionController@destroy |
Admin, Atasan, Owner |
GET/POST/... |
/users/* |
UserController |
Admin, Atasan, Owner |
GET/POST/... |
/branches/* |
BranchController |
Admin, Atasan, Owner |
GET/POST/... |
/branch-bank-accounts/* |
BranchBankAccountController |
Admin, Atasan, Owner (Mutasi hanya Owner) |
GET |
/activity-logs |
ActivityLogController@index |
Admin, Atasan, Owner |
GET/POST/DELETE |
/notifications/* |
NotificationController |
Auth |
| Method | URI | Fungsi |
|---|---|---|
POST |
/api/ai/auto-fill |
Callback dari n8n setelah OCR selesai |
GET |
/api/ai/auto-fill/status/{uploadId} |
Polling status OCR dari frontend |
GET |
/api/admin/ocr-status |
Admin monitoring OCR (auth:sanctum) |
GET |
/api/notifications/unread-count |
Count notifikasi unread (auth) |
| Event | Channel | Deskripsi |
|---|---|---|
TransactionCreated |
Private | Transaksi baru dibuat |
TransactionUpdated |
Private | Status transaksi diperbarui |
OcrStatusUpdated |
Private | Status OCR berubah (processing → done/error) |
ActivityLogged |
Private | Aktivitas baru tercatat |
NotificationReceived |
Private | Notifikasi baru diterima |
| Notification | Trigger | Penerima |
|---|---|---|
TransactionStatusNotification |
Approve/Reject transaksi | Submitter transaksi |
OwnerApprovalNotification |
Transaksi ≥ 1 Jt di-approve Admin | Semua Owner |
OcrStatusNotification |
OCR selesai / error | Submitter transaksi |
# ── Docker ──────────────────────────────────────────────
docker-compose up -d # Start semua service
docker-compose down # Stop semua service
docker-compose logs -f app # Log container app
docker exec -it whusnet-app bash # Masuk ke container app
# ── Laravel ─────────────────────────────────────────────
php artisan migrate # Jalankan migrasi
php artisan migrate:fresh --seed # Reset DB + seeder
php artisan cache:clear # Bersihkan cache
php artisan config:clear # Bersihkan config cache
php artisan queue:work # Jalankan queue worker
php artisan horizon # Jalankan Horizon
php artisan reverb:start # Jalankan WebSocket server
# ── Price Index ─────────────────────────────────────────
php artisan price-index:recalculate --mode=incremental # Recalc item dengan transaksi baru (daily)
php artisan price-index:recalculate --mode=full # Recalc semua item non-manual (weekly)
# ── Development ─────────────────────────────────────────
npm run dev # Vite dev server
npm run build # Build assets untuk production
composer dev # Jalankan server + queue + vite sekaligus
# ── PR Validation ───────────────────────────────────────
./scripts/check-pr-ready.sh # Check apakah code siap untuk PR
./vendor/bin/pint # Auto-fix code style
./vendor/bin/pint --test # Check code style tanpa fix
php artisan test --coverage --min=80 # Run tests dengan minimum 80% coverage
composer audit # Security audit untuk PHP dependencies
npm audit --audit-level=moderate # Security audit untuk Node dependenciesSebelum membuat Pull Request, pastikan code Anda lolos semua validation checks:
# Jalankan PR readiness checker
./scripts/check-pr-ready.sh-
Code Style - Pastikan code mengikuti Laravel Pint standards
./vendor/bin/pint --test
-
Tests - Semua tests harus pass dengan coverage ≥ 80%
php artisan test --coverage --min=80 -
Debug Statements - Hapus semua debug code
# Check untuk dd(), dump(), var_dump(), console.log() git diff origin/main | grep -E "(dd\(|dump\(|var_dump\(|console\.log\()"
-
Security - Tidak ada credentials atau sensitive data
composer audit npm audit --audit-level=moderate
Gunakan Semantic Commit format:
<type>: <description>
atau
<type>(<scope>): <description>
Valid Types:
feat- Fitur barufix- Bug fixdocs- Dokumentasirefactor- Code refactoringperf- Performance improvementstest- Menambah testschore- Maintenance tasks
Contoh:
✅ feat: add price anomaly detection
✅ fix(auth): resolve login redirect issue
✅ docs: update deployment guide
✅ refactor(services): optimize price index calculation
❌ Added new feature
❌ Fixed bug
❌ Update
Jika PR validation gagal, lihat:
- 📋 Troubleshooting PR Validation - Solusi lengkap untuk semua PR validation errors
users
├── id, name, email, password, role
├── email_verified_at, remember_token
└── created_at, updated_at
transactions
├── id, type (rembush/pengajuan/gudang)
├── invoice_number, upload_id, trace_id
├── customer, category, description
├── amount, payment_method, items (JSON)
├── date, file_path, status
├── submitted_by → users.id
├── reviewed_by → users.id, reviewed_at, rejection_reason
├── ai_status, confidence
├── vendor, specs (JSON), quantity, estimated_price
└── created_at, updated_at
transaction_categories
├── id, name, type (rembush/pengajuan)
├── is_active, color_code
└── created_at, updated_at
branches
├── id, name
└── created_at, updated_at
transaction_branches (pivot)
├── transaction_id → transactions.id
├── branch_id → branches.id
├── allocation_percent, allocation_amount
└── created_at, updated_at
activity_logs
├── id, user_id → users.id
├── action, transaction_id, target_id, description
└── created_at, updated_at
notifications (Laravel default)
├── id, type, notifiable_type, notifiable_id
├── data (JSON), read_at
└── created_at, updated_at
document_sequences
└── Tabel pendukung untuk sequential ID generation
Sistem menggunakan Redis untuk menghasilkan ID sequential yang atomic dan aman dari race condition:
| Tipe ID | Format | Contoh |
|---|---|---|
| Upload ID | UP-YYYYMMDD-XXXXX |
UP-20260304-00003 |
| Invoice Number | INV-YYYYMMDD-XXXXX |
INV-20260304-00003 |
| Trace ID | TRX-XXXXXXXX |
TRX-8DK29XQZ |
Upload ID dan Invoice Number selalu menggunakan counter yang sama (shared sequence), sehingga selalu sinkron.
Untuk dokumentasi yang lebih detail, silakan lihat:
- 📑 Documentation Index - Central hub untuk semua dokumentasi
- 📊 Analisis Dokumentasi - Gap analysis & roadmap dokumentasi
- 🗺️ Visual Flowcharts - Diagram Mermaid lengkap untuk semua alur sistem
- 🏛️ Architecture Diagram - Perbandingan Polling vs Reverb
- 🗄️ Database Schema - ER Diagram & struktur database lengkap
- ⚙️ Backend Documentation - Arsitektur mendalam dan logika bisnis
- 🧮 Price Index System - Sistem referensi harga, anomali, dan IQR logic
- 🎯 Price Index AVG System - Dual-Mode AVG (Auto vs Manual) - Quick Reference
- 📝 Implementasi AVG Manual - Detail implementasi fitur AVG Manual
- 📋 Pengajuan Specification - Sistem Dual-Version dan proteksi edit
- 💰 Rembush Flow Detail - Alur reimbursement dan integrasi AI
- 🔄 Realtime Migration - Migrasi ke Laravel Reverb
- 📊 Export Excel Optimization - Sistem export 3-lapis untuk dataset 40k+ rows
- 📡 API Documentation v4.5 - Webhook n8n, Telegram, dan Endpoint Flow
- 🚀 API Interactive Docs - Dokumentasi API real-time via Scramble
- 🐳 Docker Production Guide - Setup Docker untuk production
- 🔄 CI/CD Guide - GitHub Actions pipeline
- ⚡ Quick Setup (30 min) - Setup cepat Docker & CI/CD
- ✅ Production Checklist - Pre-deployment checklist
- 🔒 Security Checklist - Security best practices
- 📈 Monitoring Setup - Setup monitoring tools
- 📝 Logging Solution - Logging strategy lengkap
- 🔍 Pulse & Log Viewer - Setup Pulse & Log Viewer
- 🚨 Export Troubleshooting - Diagnosa & fix masalah export Excel
- 🩺 503 Error Analysis - Diagnose 503 Service Unavailable
- 🔧 Operations Troubleshooting - Masalah operasional umum
- 🧪 Testing Realtime - Testing fitur real-time
- 💰 Testing Pembagian Biaya - Testing cost allocation
- 📚 Quick Reference - Command reference cepat
- 📊 Technical Audit - Audit teknis & roadmap
Tertarik untuk berkontribusi? Silakan baca:
- 📝 Contributing Guide (Coming Soon)
- 🎨 Code Style Guide (Coming Soon)
- 🔀 Git Workflow (Coming Soon)
Project ini dikembangkan secara internal untuk WHUSNET.
Untuk pertanyaan atau bantuan:
- 📧 Email: [support@whusnet.com]
- 💬 Slack: [#admin-payment-support]
- 📖 Documentation: DOCUMENTATION_INDEX.md
Last Updated: 4 Mei 2026
Version: 4.5
Maintainer: WHUSNET Development Team