Sistem Warehouse Dinamis (Smart WH)
Sistem manajemen warehouse dengan alur kerja scan barcode/QR, pelacakan kapasitas rak real-time, dan penyesuaian stok.
Ringkasan
Sistem manajemen warehouse berbasis web yang dibangun untuk PT. Nihon Seiki Indonesia, dirancang untuk melacak penempatan material, status rak, dan alur barang masuk-keluar warehouse — semuanya lewat scan barcode/QR sederhana, bukan pencatatan manual di kertas.
Masalah
- Pelacakan komponen mana yang disimpan di rak mana mengandalkan catatan manual yang cepat menjadi usang.
- Rak bisa kelebihan muatan atau kehabisan ruang tanpa disadari, tanpa ada cara otomatis untuk menandainya.
- Penghitungan stok (opname), retur, dan pelaporan masih berupa proses manual yang lambat.
Solusi
- Scan untuk check-in: memindai barcode komponen otomatis menempatkannya di rak yang tersedia dengan ukuran yang sesuai, atau ke overflow storage jika rak utama penuh.
- Scan untuk check-out: operator bisa memindai dan memproses banyak item dalam satu batch, tanpa perlu reload halaman.
- Scan untuk penyesuaian stok: mencocokkan inventaris fisik dengan sistem cukup dengan satu scan per rak, langsung menampilkan item yang hilang atau lebih.
- Penanganan retur untuk item yang perlu dikembalikan ke penyimpanan.
- Dashboard berbasis role untuk QC, Delivery, Customer Service, dan Admin, masing-masing hanya melihat tools yang relevan dengan pekerjaannya.
- Pelaporan: riwayat transaksi lengkap dan ekspor Excel satu klik untuk data rak, stok, dan audit.
Matriks Role
| Menu / Fitur | QC | Delivery | CS | Admin | | :--- | :---: | :---: | :---: | :---: | | Check-in (scan masuk) | ✅ | | | ✅ | | Check-out (scan keluar) | | ✅ | | ✅ | | Penyesuaian stok | | | ✅ | ✅ | | Master komponen / rak | | | ✅ | ✅ | | Retur | | | ✅ | ✅ | | Info rak, riwayat, pengguna | ✅ | ✅ | ✅ | ✅ |
Arsitektur & Alur Sistem
Login & Sesi
flowchart LR
A[GET /login] --> B{Sesi sudah aktif?}
B -- Ya --> C[Redirect ke /dashboard]
B -- Tidak --> D[Tampilkan form login]
D --> E[POST kredensial]
E --> F{password_verify}
F -- Cocok --> G[Set sesi, redirect ke dashboard]
F -- Tidak cocok --> H[Tampilkan error, redirect kembali]
Check-in (barang diterima)
Input berupa satu string hasil scan barcode/QR dengan format partNumber,lot,quantity,uniqueScanId.
flowchart TD
A[Scan barcode/QR] --> B{Format 4-bagian valid?}
B -- Tidak --> Z1[Gagal: scan ulang]
B -- Ya --> C{Part number terdaftar?}
C -- Tidak --> Z2[Gagal: part tidak dikenal]
C -- Ya --> D{Sudah check-in sebelumnya?}
D -- Ya --> Z3[Gagal: scan duplikat]
D -- Tidak --> E{Part punya rak aktif?}
E -- Tidak --> F[Cari rak kosong sesuai ukuran part]
F --> G{Rak kosong ditemukan?}
G -- Tidak --> H[Fallback ke Over Area]
G -- Ya --> I[Gunakan rak tersebut]
E -- Ya --> J{Rak yang ada masih punya kapasitas?}
J -- Ya --> I
J -- Tidak --> H
I --> K[Insert transaksi: status=checkin]
H --> K
K --> L[Update kapasitas & status rak]
L --> M[Tambahkan event ke log riwayat transaksi]
M --> N[Berhasil: part ditempatkan di rak]
Check-out (barang dikirim)
Check-out bersifat AJAX-only — operator memindai banyak item di sisi client sebelum mengirim seluruh batch sebagai satu request.
flowchart TD
A[Scan banyak item di sisi client] --> B[POST array JSON via AJAX]
B --> C[Loop tiap item]
C --> D{Sedang check-in?}
D -- Tidak --> E[Lewati item]
D -- Ya --> F[Kurangi kapasitas rak, update status]
F --> G[Tambahkan event ke log riwayat transaksi]
G --> H[Update transaksi: status=checkout]
H --> I[Item berikutnya]
I --> C
Model Data (ERD)
erDiagram
RACK ||--o{ TRANSACTION : menyimpan
PART ||--o{ TRANSACTION : "jenis item"
USER {
int id PK
varchar username
varchar password "hashed"
enum role "QC|Delivery|CS|Admin"
}
PIC {
int id PK
varchar name
enum department "CS|QC|Delivery"
}
RACK {
int id PK
varchar code
enum rack_type "Large|Small|Over Area"
enum status "Empty|Filled|Full"
int total_packing
}
PART {
int id PK
varchar part_number
int max_capacity
enum rack_type "Large|Small"
}
TRANSACTION {
int id PK
int part_id FK
int rack_id FK
varchar unique_scan_id
varchar lot
int quantity
enum status "checkin|checkout|adjust_in|adjust_out"
varchar pic
datetime checked_in_at
datetime checked_out_at
}
TRANSACTION_HISTORY {
int id PK
json event_snapshot "audit log, not FK-linked"
}
status adalah state machine inti aplikasi ini: checkin → checkout → (retur) kembali ke checkin, dengan adjust_in/adjust_out sebagai varian yang dihasilkan oleh alur stock-opname (penyesuaian). TRANSACTION_HISTORY tidak bersifat relasional — setiap event check-in/out/adjustment/retur ditambahkan sebagai snapshot JSON, yang menjadi dasar halaman History tanpa perlu join yang berat.
Dampak Utama
- Menggantikan pelacakan rak manual dengan visibilitas real-time berbasis scan atas stok warehouse.
- Memangkas waktu yang dibutuhkan untuk stock opname (penghitungan fisik) dari rekonsiliasi manual menjadi satu kali proses scan.
- Memberi setiap role dashboard yang disesuaikan dengan tanggung jawabnya, mengurangi waktu training untuk staf baru.

