Skip to content

YofhiFauda/Admin-Payment

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

233 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏢 WHUSNET Admin Payment

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 License Status


🚀 Quick Links


📋 Daftar Isi


✨ Fitur Utama

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.

🛠 Tech Stack

Backend

  • 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

Frontend

  • 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.

Infrastructure

  • Docker & Docker Compose — Containerized deployment
  • Nginx — Reverse proxy & web server
  • n8n — Workflow automation untuk OCR processing

External Services

  • Google Gemini AI — OCR untuk ekstraksi data nota (via n8n webhook)

🏗 Arsitektur Sistem

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]
Loading

🔄 Alur Kerja (Workflows)

1. Rembush (OCR Flow)

  1. Upload: User upload foto nota.
  2. Security Check (L1 & L2): Sistem mengecek duplikasi hash file dan validitas tanggal (maks 2 hari).
  3. AI Extraction (L3): Gemini mengekstrak Vendor, Item, dan Nominal. User melengkapi kategori & alokasi cabang.
  4. Approval: Admin/Atasan menyetujui. Jika nominal ≥ 1 Jt, memerlukan approval Owner.
  5. Payment: Admin upload bukti bayar (Transfer/Cash).
  6. Verification (L4):
    • Transfer: AI mengecek nominal struk vs transaksi. Jika selisih, status menjadi flagged.
    • Cash: Teknisi konfirmasi terima uang via Telegram Bot.

2. Pengajuan (Dual-Version Flow)

  1. Input: Teknisi input detail pengajuan. Sistem menyimpan snapshot original.
  2. Management Review: Owner/Atasan dapat merevisi item/nominal. Sistem menandai is_edited_by_management = true.
  3. Transparency: Semua user dapat melihat perbandingan antara "Versi Pengaju" dan "Versi Management" melalui toggle di modal detail.
  4. Payment holding: Transaksi beralih ke waiting_payment setelah disetujui. Saat invoice diupload, status akan tetap waiting_payment jika terdapat cabang yang masih berhutang (inter-unit debt).
  5. Finalization: Status otomatis menjadi completed hanya setelah invoice terunggah DAN seluruh hutang antar cabang telah dilunaskan. Pengeditan kini dikunci total.

3. Gudang (Internal Flow)

  1. Input: Staff internal (Admin/Owner) input belanja gudang.
  2. Review Management: Persetujuan oleh Management. Status menjadi pending -> waiting_payment.
  3. Payment: Upload bukti bayar (Tanpa OCR).
  4. Finalization: Status langsung menjadi completed tanpa perlu konfirmasi Telegram teknisi.

🛡️ OCR & Security Layers

Sistem menerapkan 4-Layer Verification untuk menjamin validitas keuangan:

  1. Layer 1 (Duplicate): Pengecekan MD5 hash file nota di Redis/DB untuk mencegah nota ganda.
  2. Layer 2 (Date Logic): Nota berumur > 2 hari kalender otomatis berstatus auto-reject (dapat di-override oleh Admin/Owner).
  3. Layer 3 (AI Extraction): Gemini Pro mengekstrak data dengan parameter confidence. Status low-confidence memerlukan review manual.
  4. Layer 4 (Payment Audit): Verifikasi nominal pada struk transfer. Jika tidak cocok, transaksi di-flag dan memerlukan Force Approve dengan alasan tertulis.

🔍 Hybrid Search Logic

Sistem pencarian transaksi dirancang untuk performa optimal pada berbagai skala data:

  1. Threshold: 5.000 records benchmark.
  2. Mode Client-Side (< 5k): Seluruh data dimuat ke frontend (lean version) untuk pencarian instan tanpa latency server.
  3. Mode Server-Side (≥ 5k): Sistem beralih ke paginasi database standar untuk menjaga penggunaan memori browser tetap rendah.
  4. Auto-Adaptive: Setiap pemuatan halaman melakukan pengecekan jumlah data via /transactions/count untuk menentukan mode terbaik secara otomatis.


🤖 Integrasi Telegram

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.

Docker Services

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

📦 Persyaratan

  • Docker ≥ 20.x & Docker Compose ≥ 2.x
  • Git

Semua dependency lainnya (PHP, Node, MySQL, Redis, dll.) sudah termasuk dalam Docker containers.


🚀 Instalasi & Setup

1. Clone Repository

git clone <repository-url>
cd Admin-Payment

2. Setup Environment

cp .env.example .env

Edit file .env sesuai konfigurasi (lihat bagian Konfigurasi Environment).

3. Jalankan Docker

docker-compose up -d --build

4. Setup Aplikasi

# 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

5. Akses Aplikasi

Layanan URL
Aplikasi http://localhost:8000
API Documentation http://localhost:8000/docs/api
phpMyAdmin http://localhost:8080
Horizon Dashboard http://localhost:8000/horizon

⚙ Konfigurasi Environment

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>

📂 Struktur Project

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

👥 Peran Pengguna (Roles)

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)

Detail Akses Khusus

  • Admin Limited Edit: Admin dapat mengakses halaman edit Pengajuan dalam status waiting_payment untuk 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.

📦 Modul Aplikasi

1. 🔐 Autentikasi (AuthController)

  • 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

2. 📊 Dashboard (DashboardController)

  • 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)

3. 💰 Transaksi Rembush (RembushController)

Alur lengkap reimbursement dengan OCR:

  1. Upload Nota → Foto nota diupload ke server
  2. OCR Processing → Job dikirim ke queue, foto dikirim ke n8n webhook → Gemini AI
  3. Loading Page → Frontend polling status OCR setiap 2 detik
  4. Form Auto-fill → Data hasil OCR mengisi form otomatis (customer, items, amount, dll.)
  5. Review & Submit → User verifikasi dan submit transaksi

4. 📝 Pengajuan Pembelian (PengajuanController)

Alur pengajuan tanpa OCR:

  1. Isi Form → Nama vendor, spesifikasi, jumlah, estimasi harga, alasan pembelian
  2. Upload Foto (opsional) → Foto pendukung
  3. Submit → Langsung masuk ke daftar pending

5. ✅ Approval Transaksi (TransactionController)

  • Approve: Mengubah status menjadi approved atau completed
    • Jika nominal < Rp 1.000.000 → langsung completed
    • Jika nominal ≥ Rp 1.000.000 → status approved, menunggu Owner approval
  • Reject: Mengubah status menjadi rejected dengan alasan penolakan
  • Edit: Mengubah detail transaksi (hanya Admin, Atasan, Owner)
  • Delete: Menghapus transaksi beserta file attachment

6. 🏢 Manajemen Cabang (BranchController)

  • CRUD cabang (nama cabang)
  • Cabang yang masih memiliki transaksi tidak dapat dihapus
  • Mendukung response JSON untuk AJAX interactions

7. 👤 Manajemen User (UserController)

  • CRUD user dengan validasi role-based
  • Admin & Atasan hanya bisa mengelola Teknisi
  • Owner bisa mengelola semua role
  • Tidak dapat menghapus akun sendiri

8. 📁 Kelola Kategori (TransactionCategoryController)

  • 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.

9. 🔔 Notifikasi (NotificationController)

  • 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

10. 📜 Activity Log (ActivityLogController)

  • Mencatat semua aktivitas user: create, update, approve, reject, delete
  • Menyimpan referensi ke user dan transaksi terkait

11. 🧮 Price Index & Deteksi Anomali (PriceIndexController)

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.

🔄 Alur Transaksi

Status Lifecycle

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
Loading

Alur Approval

  1. 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.
  2. Payment & Debt Flow:
    • Invoice Uploaded: Jika ada hutang antar cabang, status tetap waiting_payment.
    • Debt Settled: Transaksi otomatis completed saat hutang terakhir dilunaskan (dan invoice sudah ada).

🌐 API Documentation (Scramble)

Proyek ini menggunakan Scramble untuk menghasilkan dokumentasi API secara otomatis. Dokumentasi ini mengikuti standar OpenAPI 3.1 dan dapat diakses melalui antarmuka interaktif.

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.

🔄 Primary vs Legacy Endpoints

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.

🌐 API Endpoints

Web Routes (routes/web.php)

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

API Routes (routes/api.php)

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 & Notifikasi

Events (Broadcasting via Reverb WebSocket)

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

Notifications

Notification Trigger Penerima
TransactionStatusNotification Approve/Reject transaksi Submitter transaksi
OwnerApprovalNotification Transaksi ≥ 1 Jt di-approve Admin Semua Owner
OcrStatusNotification OCR selesai / error Submitter transaksi

🔧 Perintah Berguna

# ── 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 dependencies

🔍 Pull Request Guidelines

Sebelum membuat Pull Request, pastikan code Anda lolos semua validation checks:

Quick Check

# Jalankan PR readiness checker
./scripts/check-pr-ready.sh

Manual Checks

  1. Code Style - Pastikan code mengikuti Laravel Pint standards

    ./vendor/bin/pint --test
  2. Tests - Semua tests harus pass dengan coverage ≥ 80%

    php artisan test --coverage --min=80
  3. 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\()"
  4. Security - Tidak ada credentials atau sensitive data

    composer audit
    npm audit --audit-level=moderate

PR Title Format

Gunakan Semantic Commit format:

<type>: <description>

atau

<type>(<scope>): <description>

Valid Types:

  • feat - Fitur baru
  • fix - Bug fix
  • docs - Dokumentasi
  • refactor - Code refactoring
  • perf - Performance improvements
  • test - Menambah tests
  • chore - 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

Troubleshooting PR Validation

Jika PR validation gagal, lihat:



📊 Database Schema

Tabel Utama

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

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.


📚 Dokumentasi Lengkap

Untuk dokumentasi yang lebih detail, silakan lihat:

📖 Core Documentation

🏗️ Architecture & Design

⚙️ Features & Modules

🌐 API Documentation

🚀 Deployment & Operations

📊 Monitoring & Logging

🔧 Troubleshooting

🧪 Testing

📖 Reference


🤝 Contributing

Tertarik untuk berkontribusi? Silakan baca:


📝 Lisensi

Project ini dikembangkan secara internal untuk WHUSNET.


📞 Support

Untuk pertanyaan atau bantuan:


Last Updated: 4 Mei 2026
Version: 4.5
Maintainer: WHUSNET Development Team

About

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.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors