Ringkasan Sistem

Alur Kerja End-to-End

Gambaran lengkap seluruh alur dari request Engineer hingga barang diterima, melibatkan semua role.

ENG Engineering

Membuat Part Request dengan spesifikasi, urgency, dan justifikasi kebutuhan. Request otomatis masuk ke antrian review PPC.

PPC PPC

Mereview kelengkapan data, memvalidasi kebutuhan operasional. Bisa approve atau reject. Juga bisa buat direct request ke procurement.

STR Storeman

Cek stok gudang setelah PPC approve. Tiga kemungkinan: full fulfillment dari stok, partial, atau redirect ke procurement.

PRO Procurement

Mencari vendor, melakukan negosiasi harga, dan membuat purchase order. Mengajukan anggaran ke Finance untuk approval sebelum beli.

FIN Finance

Memverifikasi anggaran dan menyetujui pembelian. Setelah barang datang, mereview variance antara harga estimasi dan aktual.

STR Storeman (Kirim)

Menyiapkan shipment, generate dokumen DO/IWU/PL, dan mengirimkan barang ke Engineer. WhatsApp notifikasi otomatis dikirim.

flowchart LR
    ENG["ENGINEER\nBuat Request"] ==>|"ppc_review"| PPC["PPC\nReview & Approve"]
    PPC ==>|"ppc_approved"| STR["STOREMAN\nCek Stok"]

    STR ==>|"Stok Ada"| PREP["STOREMAN\nBuat Shipment\nSiapkan & Kirim"]
    STR ==>|"Stok Kurang/Kosong"| PROC["PROCUREMENT\nBeli dari Vendor"]

    PROC ==>|"finance_review"| FIN["FINANCE\nApprove Budget"]
    FIN ==>|"approved"| PROC
    PROC ==>|"Barang Datang"| PREP

    PREP ==>|"shipping - completed"| ENG2["ENGINEER\nTerima Barang"]

    EXEC["EXECUTIVE\nMonitor Analytics"] -.->|"View Only"| ENG
    EXEC -.->|"View Only"| PPC
    EXEC -.->|"View Only"| STR
    EXEC -.->|"View Only"| PROC
    EXEC -.->|"View Only"| FIN

    ALL_USERS["ALL USERS\nBug Report"] ==>|"open"| SA["SUPERADMIN\nManage Tickets"]
    SA ==>|"resolved/closed"| ALL_USERS

    style ENG fill:#BBDEFB,stroke:#1565C0,color:#000
    style PPC fill:#C8E6C9,stroke:#2E7D32,color:#000
    style STR fill:#FFE0B2,stroke:#E65100,color:#000
    style PROC fill:#E1BEE7,stroke:#6A1B9A,color:#000
    style FIN fill:#FFF9C4,stroke:#F9A825,color:#000
    style PREP fill:#B2DFDB,stroke:#00695C,color:#000
    style ENG2 fill:#C8E6C9,stroke:#1B5E20,color:#000
    style EXEC fill:#F5F5F5,stroke:#616161,color:#000
    style ALL_USERS fill:#FFCCBC,stroke:#BF360C,color:#000
    style SA fill:#D7CCC8,stroke:#4E342E,color:#000
                    

Notifikasi WhatsApp Otomatis (per status)

ppc_review — PPC + Superadmin
ppc_approved — Engineer + Storeman + Superadmin
ppc_rejected — Engineer
partial_out — Engineer + Procurement + Superadmin
procurement_process — Engineer + Procurement + Superadmin
finance_review — Engineer + Finance + Superadmin
purchasing — Engineer + Procurement + Superadmin
shipping — Engineer + Superadmin
completed — Engineer + Superadmin + Executive
Alur Utama

Part Request 11 Status

Alur lengkap Part Request dari dibuat Engineer hingga selesai, termasuk semua percabangan status.

requested
0%
ppc_review
10%
ppc_approved
20%
ppc_rejected
0%
stock_check
30%
preparing
45%
partial_out
50%
procurement_process
55%
finance_review
65%
purchasing
75%
shipping
85%
completed
100%
flowchart TD
    START(["Engineer"]) --> CREATE["Buat Part Request\n- Pilih Part\n- Jumlah\n- Urgency\n- Notes"]
    CREATE --> S1["STATUS: requested"]
    S1 --> AUTO_PPC["Auto ke ppc_review"]
    AUTO_PPC --> S2["STATUS: ppc_review"]

    S2 -.->|"Observer"| WA1["WhatsApp ke PPC + Superadmin"]
    S2 -.->|"Observer"| BC1["Broadcast: PartRequestCreated"]

    S2 --> PPC_REVIEW{"PPC Review"}
    PPC_REVIEW -->|"Reject"| S4["STATUS: ppc_rejected\nTerminal"]
    PPC_REVIEW -->|"Approve"| S3["STATUS: ppc_approved"]

    S4 -.->|"Observer"| WA2["WhatsApp ke Engineer"]
    S3 -.->|"Observer"| WA3["WhatsApp ke Engineer + Storeman"]

    S3 --> STOCK_CHECK["Storeman Cek Stok"]
    STOCK_CHECK --> S5["STATUS: stock_check"]
    S5 --> STOCK_DECISION{"Stok Tersedia?"}

    STOCK_DECISION -->|"Stok Cukup"| FULL["Full Fulfillment\nKurangi Stok Part"]
    FULL --> S6["STATUS: preparing"]

    STOCK_DECISION -->|"Stok Sebagian"| PARTIAL["Partial Fulfillment\nKirim yang ada + Buat ProcurementRequest"]
    PARTIAL --> S7["STATUS: partial_out"]
    S7 --> S8B["STATUS: procurement_process"]

    STOCK_DECISION -->|"Stok Kosong"| REDIRECT["Redirect to Procurement\nBuat ProcurementRequest"]
    REDIRECT --> S8["STATUS: procurement_process"]

    S8 --> PROC_FLOW["Alur Procurement"]
    S8B --> PROC_FLOW
    PROC_FLOW --> PROC_DONE{"Procurement Selesai?"}
    PROC_DONE -->|"Barang Diterima"| S6

    S6 --> CREATE_SHIP["Create Shipment\ntype: stock/procurement"]
    CREATE_SHIP --> GEN_DOC["Generate Dokumen DO/IWU/PL"]
    GEN_DOC --> SHIP["Storeman Kirim"]
    SHIP --> S10["STATUS: shipping"]
    S10 --> RECEIVE["Barang Diterima"]
    RECEIVE --> S11["STATUS: completed\nTerminal"]
    S11 -.->|"Observer"| WA6["WhatsApp ke Engineer + Superadmin + Executive"]

    style S1 fill:#E3F2FD,stroke:#1565C0,color:#000
    style S2 fill:#FFF3E0,stroke:#E65100,color:#000
    style S3 fill:#E8F5E9,stroke:#2E7D32,color:#000
    style S4 fill:#FFEBEE,stroke:#C62828,color:#000
    style S5 fill:#FFF3E0,stroke:#E65100,color:#000
    style S6 fill:#E8F5E9,stroke:#2E7D32,color:#000
    style S7 fill:#FFF9C4,stroke:#F9A825,color:#000
    style S8 fill:#F3E5F5,stroke:#6A1B9A,color:#000
    style S8B fill:#F3E5F5,stroke:#6A1B9A,color:#000
    style S10 fill:#E0F7FA,stroke:#00695C,color:#000
    style S11 fill:#C8E6C9,stroke:#1B5E20,color:#000
                    
Storeman

Stock Check & Fulfillment

Storeman menerima request yang sudah di-approve PPC, lalu mengecek ketersediaan stok dengan tiga kemungkinan hasil.

Full Fulfillment
Stok tersedia ≥ yang dibutuhkan. Stok langsung dikurangi, status ke preparing.
Partial Fulfillment
Stok ada tapi kurang. Kirim yang ada, buat ProcurementRequest untuk kekurangannya.
Full Redirect
Stok kosong. Seluruh kebutuhan dialihkan ke Procurement untuk pembelian.
flowchart TD
    START(["Storeman Menerima Request\nStatus: ppc_approved"]) --> CHECK["Cek Ketersediaan Stok Part"]
    CHECK --> COMPARE{"Bandingkan:\nStok Tersedia vs\nQuantity Requested"}

    COMPARE -->|"available >= requested"| FULL_PATH["FULL FULFILLMENT"]
    FULL_PATH --> DEDUCT_FULL["Kurangi Stok Part\nquantity -= requested"]
    DEDUCT_FULL --> SET_QTY_FULL["Set quantity_fulfilled = requested\nquantity_pending = 0"]
    SET_QTY_FULL --> STATUS_PREP["Status ke preparing"]
    STATUS_PREP --> CREATE_SHIPMENT_FULL["Create Shipment\ntype = stock\nstatus = preparing"]
    CREATE_SHIPMENT_FULL --> GEN_DOCS["Generate Dokumen:\nDelivery Order\nIssue Warehouse Unit\nPackage List"]

    COMPARE -->|"0 < available < requested"| PARTIAL_PATH["PARTIAL FULFILLMENT"]
    PARTIAL_PATH --> DEDUCT_PARTIAL["Kurangi Stok Part\nquantity -= available"]
    DEDUCT_PARTIAL --> SET_QTY_PARTIAL["Set quantity_fulfilled = available\nquantity_pending = requested - available"]
    SET_QTY_PARTIAL --> STATUS_PARTIAL["Status ke partial_out"]
    STATUS_PARTIAL --> CREATE_PR_PARTIAL["Buat ProcurementRequest\nquantity = shortage"]
    CREATE_PR_PARTIAL --> STATUS_PROC["Status ke procurement_process"]
    STATUS_PROC --> PROC_FLOW["Ke Alur Procurement"]

    COMPARE -->|"available = 0"| REDIRECT_PATH["FULL REDIRECT"]
    REDIRECT_PATH --> SET_QTY_REDIR["Set quantity_fulfilled = 0\nquantity_pending = requested"]
    SET_QTY_REDIR --> STATUS_REDIR["Status ke procurement_process"]
    STATUS_REDIR --> CREATE_PR_REDIR["Buat ProcurementRequest\nquantity = full requested"]
    CREATE_PR_REDIR --> PROC_FLOW2["Ke Alur Procurement"]

    style FULL_PATH fill:#C8E6C9,stroke:#2E7D32,color:#000
    style PARTIAL_PATH fill:#FFF9C4,stroke:#F9A825,color:#000
    style REDIRECT_PATH fill:#FFCDD2,stroke:#C62828,color:#000
                    
Procurement

Alur Procurement

Dari penerimaan ProcurementRequest, pencarian vendor, pengajuan ke Finance, pembelian, hingga penerimaan barang.

flowchart TD
    START(["Procurement Menerima ProcurementRequest"]) --> VIEW["Lihat Detail Request\n+ Vendor History + Scoring"]
    VIEW --> FILL["Isi Data Procurement:\nVendor Name\nEstimated Unit Price\nQuotation Reference\nVendor Contact\nJustification"]
    FILL --> SAVE["Simpan sebagai Draft"]
    SAVE --> SUBMIT_FIN{"Submit ke Finance?"}

    SUBMIT_FIN -->|"Ya"| SET_PENDING["finance_status = pending"]
    SET_PENDING --> UPDATE_PR["PartRequest Status ke finance_review"]
    UPDATE_PR --> FIN_REVIEW["Alur Finance Review"]
    FIN_REVIEW --> FIN_RESULT{"Hasil Finance?"}

    FIN_RESULT -->|"Approved"| START_BUY["Start Purchasing\npurchasing_status = in_progress"]
    START_BUY --> UPDATE_PURCHASING["PartRequest Status ke purchasing"]
    UPDATE_PURCHASING --> BUY_VENDOR["Beli dari Vendor"]

    BUY_VENDOR --> COMPLETE_BUY["Complete Purchasing:\nInput actual_unit_price\nHitung variance\nUpload over_budget_proof jika ada"]
    COMPLETE_BUY --> CALC_VAR["Kalkulasi Variance:\nvariance = actual - estimated\nvariance % = variance/estimated x 100"]
    CALC_VAR --> CAT_VAR{"Kategori Variance?"}

    CAT_VAR -->|"= 0%"| ON_BUDGET["on_budget"]
    CAT_VAR -->|"< 5%"| MINOR["minor"]
    CAT_VAR -->|"5% - 15%"| MODERATE["moderate - perlu review Finance"]
    CAT_VAR -->|"> 15%"| SIGNIFICANT["significant - perlu review Finance"]

    ON_BUDGET --> PURCHASE_DONE["purchasing_status = completed"]
    MINOR --> PURCHASE_DONE
    MODERATE --> VAR_REVIEW["variance_status = pending_review"]
    SIGNIFICANT --> VAR_REVIEW
    VAR_REVIEW --> PURCHASE_DONE

    PURCHASE_DONE --> GOODS_IN{"Barang Diterima?"}
    GOODS_IN -->|"Ya"| RECEIVE["Record Goods In:\nTransaction Number\nQuantity\nSupplier Info\nDelivery Type"]
    RECEIVE --> DELIVERY_TYPE{"Delivery Type?"}
    DELIVERY_TYPE -->|"restock_warehouse"| RESTOCK["Tambah Stok Part\n+ Alokasi ke Request"]
    DELIVERY_TYPE -->|"direct_to_requester"| DIRECT["Update PartRequest\nCreate Shipment procurement"]
    RESTOCK --> STOREMAN_PREP["Storeman Siapkan\nPartRequest Status ke preparing"]
    DIRECT --> GEN_DOC["Generate Dokumen"]

    FIN_RESULT -->|"Rejected"| BACK_PROC["PartRequest ke procurement_process\nCari vendor alternatif"]
    BACK_PROC --> VIEW

    style START fill:#E1BEE7,stroke:#6A1B9A,color:#000
    style PURCHASE_DONE fill:#C8E6C9,stroke:#2E7D32,color:#000
    style BACK_PROC fill:#FFCDD2,stroke:#C62828,color:#000
                    

Kategori Variance Harga

= 0%
on_budget
< 5%
minor
5–15%
moderate — review Finance
> 15%
significant — review Finance
Finance

Finance Review & Variance

Finance mengelola dua alur: approval anggaran pembelian dan review variance harga aktual vs estimasi.

Budget Approval Flow
flowchart TD
    FA_START(["Finance Menerima\nProcurement Request\nfinance_status = pending"]) --> FA_REVIEW["Review Detail:\nEstimated Price\nVendor Info\nJustification\nVendor Score/History"]
    FA_REVIEW --> FA_DECISION{"Keputusan Finance?"}
    FA_DECISION -->|"Approve"| FA_APPROVE["finance_status = approved\nSet approved_budget\nfinance_approved_by = user"]
    FA_APPROVE --> FA_UPDATE_PR["PartRequest Status ke purchasing"]
    FA_APPROVE -.->|"Observer"| FA_WA["WhatsApp ke Procurement + Superadmin"]
    FA_DECISION -->|"Reject"| FA_REJECT["finance_status = rejected\nfinance_notes = alasan"]
    FA_REJECT --> FA_BACK["PartRequest Status ke procurement_process"]
    FA_REJECT -.->|"Observer"| FA_WA2["WhatsApp ke Procurement"]

    style FA_APPROVE fill:#C8E6C9,stroke:#2E7D32,color:#000
    style FA_REJECT fill:#FFCDD2,stroke:#C62828,color:#000
                        
Variance Review Flow
flowchart TD
    VR_START(["Finance Menerima\nVariance Alert\nvariance_status = pending_review"]) --> VR_REVIEW["Review Variance Detail:\nEstimated vs Actual\nVariance Amount dan %\nKategori moderate/significant\nOver-budget Proof"]
    VR_REVIEW --> VR_DECISION{"Variance Action?"}
    VR_DECISION -->|"Accept"| VR_ACCEPT["variance_status = accepted\nvariance_reviewed_by = user"]
    VR_DECISION -->|"Flag"| VR_FLAG["variance_status = flagged\n+ Finance Notes"]
    VR_DECISION -->|"Escalate"| VR_ESCALATE["variance_status = escalated\nEskalasi ke Executive"]

    style VR_ACCEPT fill:#C8E6C9,stroke:#2E7D32,color:#000
    style VR_FLAG fill:#FFF9C4,stroke:#F9A825,color:#000
    style VR_ESCALATE fill:#FFCDD2,stroke:#C62828,color:#000
                        

Status Variance

no_variance
Harga sama persis
pending_review
Menunggu review
accepted
Diterima
flagged
Ditandai
escalated
Eskalasi ke Executive
Shipment

Shipment Tracking

Sistem shipment mendukung dua tipe: dari stok gudang (stock) dan dari proses procurement. Setiap shipment memiliki dokumen yang di-generate otomatis.

Shipment Type: stock
Nomor: SHP-STK/{reqId}-{seq}/{MM}/{YYYY}
Dibuat saat Storeman memenuhi request dari stok gudang yang tersedia.
Shipment Type: procurement
Nomor: SHP-PRC/{reqId}-{seq}/{MM}/{YYYY}
Dibuat setelah barang procurement diterima dan siap dikirim ke requester.
flowchart TD
    START(["Shipment System"]) --> TYPE{"Tipe Shipment?"}

    TYPE -->|"Dari Stok"| STOCK_SHIP["Shipment Type: stock\nNomor: SHP-STK/{reqId}-{seq}/{MM}/{YYYY}"]
    STOCK_SHIP --> PREP_S["Status: preparing\npreparing_at = now"]
    PREP_S --> GEN_DOC_S["Generate Dokumen:\nDO, IWU, PL\nLinked ke Shipment"]
    GEN_DOC_S --> SHIP_S["Status: shipping\nshipping_at = now"]
    SHIP_S --> COMP_S["Status: completed\ncompleted_at = now"]

    TYPE -->|"Dari Procurement"| PROC_SHIP["Shipment Type: procurement\nNomor: SHP-PRC/{reqId}-{seq}/{MM}/{YYYY}"]
    PROC_SHIP --> PREP_P["Status: preparing\npreparing_at = now"]
    PREP_P --> GEN_DOC_P["Generate Dokumen:\nDO, IWU, PL\nLinked ke Shipment"]
    GEN_DOC_P --> SHIP_P["Status: shipping\nshipping_at = now"]
    SHIP_P --> COMP_P["Status: completed\ncompleted_at = now"]

    COMP_S --> UPDATE_PR["Update PartRequest\nStatus ke completed jika semua shipment selesai"]
    COMP_P --> UPDATE_PR

    style STOCK_SHIP fill:#C8E6C9,stroke:#2E7D32,color:#000
    style PROC_SHIP fill:#E1BEE7,stroke:#6A1B9A,color:#000
    style COMP_S fill:#C8E6C9,stroke:#1B5E20,color:#000
    style COMP_P fill:#C8E6C9,stroke:#1B5E20,color:#000
                    
Dokumen

Document Generation

Setiap shipment secara otomatis menghasilkan tiga dokumen resmi dalam format PDF, tersimpan di storage dan bisa diunduh.

Delivery Order (DO)
Nomor: DO/XXX/MM/YYYY
Issue Warehouse Unit (IWU)
Nomor: IWU/XXX/MM/YYYY
Package List (PL)
Nomor: PL/XXX/MM/YYYY
flowchart TD
    START(["Storeman: Shipment Siap\nShipment Status: preparing"]) --> GEN["Generate Documents\nLinked ke Shipment"]

    GEN --> DO["Delivery Order (DO)\nNomor: DO/XXX/MM/YYYY"]
    GEN --> IWU["Issue Warehouse Unit (IWU)\nNomor: IWU/XXX/MM/YYYY"]
    GEN --> PL["Package List (PL)\nNomor: PL/XXX/MM/YYYY"]

    DO --> PDF1["Generate PDF\nLaravel DomPDF"]
    IWU --> PDF2["Generate PDF\nLaravel DomPDF"]
    PL --> PDF3["Generate PDF\nLaravel DomPDF"]

    PDF1 --> STORE1["Simpan ke Storage:\ndocuments/{request_id}/DO_XXX.pdf"]
    PDF2 --> STORE2["Simpan ke Storage:\ndocuments/{request_id}/IWU_XXX.pdf"]
    PDF3 --> STORE3["Simpan ke Storage:\ndocuments/{request_id}/PL_XXX.pdf"]

    STORE1 --> DB["Simpan Record ke\nTable: documents\nwith shipment_id"]
    STORE2 --> DB
    STORE3 --> DB

    DB --> DOWNLOAD["Download Available\ndi Detail Request dan Shipment"]
                    
Invoice Generation (Procurement)
flowchart LR
    INV_START(["Procurement: Generate Invoice"]) --> INV["Invoice Procurement\nData: Vendor, Price, Quantity"]
    INV --> INV_PDF["Generate PDF View"]
    INV_PDF --> INV_SAVE["invoice_generated_at = now\ninvoice_generated_by = user"]
    INV_SAVE --> INV_VIEW["View/Download Invoice"]
                    
Mobile App

Mobile / Scan RFID

Aplikasi Android native (Flutter) untuk Storeman menggunakan handheld RFID EL-UHF-RH03. Mendukung scan RFID, QR Code, dan manual input.

RFID Handheld
EL-UHF-RH03
RFID Desktop
Fixed reader
QR Code
Kamera HP
Manual
Input part number
flowchart TD
    START(["User Buka Mobile App\nStoreman"]) --> DASH["Mobile Dashboard:\nScan Hari Ini\nLow Stock Alerts\nTotal Parts"]
    DASH --> MENU{"Pilih Menu?"}

    MENU -->|"Scan"| SCAN_PAGE["Halaman Scan"]
    SCAN_PAGE --> SCAN_METHOD{"Metode Scan?"}
    SCAN_METHOD -->|"RFID Handheld"| RFID_H["Scan RFID Handheld EL-UHF-RH03"]
    SCAN_METHOD -->|"RFID Desktop"| RFID_D["Scan RFID Desktop"]
    SCAN_METHOD -->|"QR Code"| QR["Scan QR Code"]
    SCAN_METHOD -->|"Manual"| MANUAL["Input Part Number"]

    RFID_H --> LOOKUP["Lookup Part by Code"]
    RFID_D --> LOOKUP
    QR --> LOOKUP
    MANUAL --> LOOKUP

    LOOKUP --> FOUND{"Part Ditemukan?"}
    FOUND -->|"Tidak"| NOT_FOUND["Part Tidak Ditemukan"]
    FOUND -->|"Ya"| PART_INFO["Tampilkan Info Part:\nNama, Stok\nLokasi, Kategori"]

    PART_INFO --> ADJUST{"Adjust Stok?"}
    ADJUST -->|"Add"| ACT_ADD["Tambah Stok"]
    ADJUST -->|"Subtract"| ACT_SUB["Kurangi Stok"]
    ADJUST -->|"Set"| ACT_SET["Set Nilai Absolut"]

    ACT_ADD --> INPUT_QTY["Input Quantity + Notes"]
    ACT_SUB --> INPUT_QTY
    ACT_SET --> INPUT_QTY

    INPUT_QTY --> SAVE_ADJ["Simpan StockAdjustment:\nreference_number\nquantity_before/change/after\nscan_method\ndevice_identifier\nGPS coordinates"]
    SAVE_ADJ --> UPDATE_STOCK["Update Part Quantity"]
    UPDATE_STOCK --> SUCCESS["Stok Berhasil Diupdate"]

    MENU -->|"Batch Scan"| BATCH_PAGE["Halaman Batch Scan"]
    BATCH_PAGE --> BATCH_SCAN["Scan Multiple Items"]
    BATCH_SCAN --> BATCH_LIST["Daftar Items di Batch"]
    BATCH_LIST --> BATCH_MORE{"Tambah Item?"}
    BATCH_MORE -->|"Ya"| BATCH_SCAN
    BATCH_MORE -->|"Tidak"| BATCH_PROCESS["Process All Items\nTransaction-safe"]
    BATCH_PROCESS --> BATCH_RESULT["Semua StockAdjustment Tersimpan"]

    MENU -->|"Parts"| PARTS_LIST["Daftar Parts + Filter + Search"]
    MENU -->|"History"| HISTORY["History StockAdjustment\n+ Filter Tanggal/Method/Type"]

    style NOT_FOUND fill:#FFCDD2,stroke:#C62828,color:#000
    style SUCCESS fill:#C8E6C9,stroke:#2E7D32,color:#000
    style BATCH_RESULT fill:#C8E6C9,stroke:#2E7D32,color:#000
                    
Referensi

Status Transition Matrix

Tabel referensi lengkap semua transisi status pada sistem, beserta trigger dan aksi yang dilakukan.

Part Request Status Flow

From Status To Status Triggered By Action
newrequestedEngineerCreate request
requestedppc_reviewSystem (auto)Auto-transition
ppc_reviewppc_approvedPPCApprove request
ppc_reviewppc_rejectedPPCReject request
ppc_approvedstock_checkStoremanCheck stock availability
stock_checkpreparingStoremanFull stock available, deduct stock
stock_checkpartial_outStoremanPartial stock, send available
stock_checkprocurement_processStoremanNo stock, redirect to procurement
partial_outprocurement_processSystemAuto-create ProcurementRequest
procurement_processfinance_reviewProcurementSubmit to finance for budget
finance_reviewpurchasingFinanceApprove budget
finance_reviewprocurement_processFinanceReject budget (re-submit)
purchasingpreparingStoremanGoods received, prepare shipment
preparingshippingStoremanShip items (Shipment → shipping)
shippingcompletedStoremanDelivery confirmed

Progress Percentage per Status

requested 0%
ppc_review 10%
ppc_approved 20%
ppc_rejected 0%
stock_check 30%
preparing 45%
partial_out 50%
procurement_process 55%
finance_review 65%
purchasing 75%
shipping 85%
completed 100%

Shipment Status Flow

FromToTriggered ByAction
newpreparingStoremanCreate shipment
preparingshippingStoremanShip items, generate documents
shippingcompletedStoremanDelivery confirmed

Procurement Request Status Flow

Finance StatusPurchasing StatusDeskripsi
draftnot_startedBaru dibuat, belum submit ke Finance
pendingnot_startedMenunggu approval Finance
approvednot_startedDisetujui, siap dibeli
approvedin_progressSedang dalam proses pembelian
approvedcompletedPembelian selesai
rejectednot_startedDitolak Finance, cari vendor alternatif
Referensi

Role & Hak Akses

Sistem memiliki 8 role dengan hak akses yang berbeda-beda. Setiap role hanya dapat mengakses fitur yang relevan dengan tugasnya.

Superadmin
Full access ke semua fitur sistem.
User Admin
Manajemen user (kecuali Superadmin).
Engineering
Membuat dan memantau Part Request.
PPC
Review, approve/reject request, direct procurement.
Storeman
Cek stok, fulfillment, shipment, RFID scan.
Procurement
Pembelian dari vendor, goods in, invoice.
Finance
Approval anggaran dan review variance harga.
Executive Manager
Dashboard analytics read-only.

Matriks Hak Akses Per Fitur

Fitur Superadmin User Admin Engineering PPC Storeman Procurement Finance Executive
Dashboard Ya Ya Ya Ya Ya Ya Ya Ya
User Management Ya Ya (limited) Tidak Tidak Tidak Tidak Tidak Tidak
Parts CRUD Ya Tidak View View Ya View Tidak Tidak
Create Part Request Tidak Tidak Ya Ya (direct) Tidak Tidak Tidak Tidak
PPC Review Ya Tidak Tidak Ya Tidak Tidak Tidak Tidak
Stock Check & Ship Ya Tidak Tidak Tidak Ya Tidak Tidak Tidak
Procurement Process Ya Tidak Tidak Tidak Tidak Ya Tidak Tidak
Finance Approval Ya Tidak Tidak Tidak Tidak Tidak Ya Tidak
Variance Review Ya Tidak Tidak Tidak Tidak Tidak Ya Tidak
Executive Analytics Ya Tidak Tidak Tidak Tidak Tidak Tidak Ya
Mobile Scan Ya Tidak Tidak Tidak Ya Ya Tidak Tidak
General Chat Ya Ya Ya Ya Ya Ya Ya Ya
Bug Report Ya (manage) Ya Ya Ya Ya Ya Ya Ya
Add On

Executive Dashboard & Analytics

Dashboard read-only khusus Executive Manager — KPI operasional, visualisasi tren, dan tabel analitik untuk pengambilan keputusan strategis.

M
Total Requests
Per bulan
%
Completion Rate
Persentase selesai
Rp
Total Spending
Realisasi anggaran
hr
Avg Process Time
Rata-rata hari
%
Avg Variance
Selisih harga rata-rata
Charts & Grafik
Status Distribution
Pie Chart — proporsi status request aktif
6-Month Trends
Line Chart — volume request 6 bulan terakhir
Budget Spending
Bar Chart — realisasi vs estimasi per bulan
Variance Trend
Line Chart — tren variance harga procurement
Spend Forecast
Prediksi pengeluaran + Confidence Interval ±10%
Tabel Analitik
Fast-Moving Parts
Part paling sering di-request (most requested)
Slow-Moving Parts
Part jarang di-request (least requested)
Vendor Rankings
Peringkat vendor berdasarkan score 100 poin
Variance Alerts
Item dengan variance harga tinggi
Step Process Times
Waktu proses per departemen & per orang
Department Activity
Ringkasan aktivitas per divisi
Diagram Alur Executive Dashboard
flowchart TD START(["Executive Manager\nBuka Dashboard"]) --> METRICS["KPI Metrics:\nTotal Requests/Bulan\nCompletion Rate\nTotal Spending\nAvg Process Time\nAvg Variance"] METRICS --> CHARTS["Charts & Graphs"] CHARTS --> C1["Status Distribution\nPie Chart"] CHARTS --> C2["6-Month Trends\nLine Chart"] CHARTS --> C3["Budget Spending\nBar Chart"] CHARTS --> C4["Variance Trend\nLine Chart"] CHARTS --> C5["Spend Forecast\n+ Confidence Interval"] CHARTS --> TABLES["Data Tables"] TABLES --> T1["Fast-Moving Parts"] TABLES --> T2["Slow-Moving Parts"] TABLES --> T3["Vendor Rankings\nby Score"] TABLES --> T4["Variance Alerts"] TABLES --> T5["Step Process Times\nPer Dept & Person"] TABLES --> T6["Department Activity"]
Formulasi

Vendor Scoring & Spend Forecast

Algoritma penilaian vendor berbasis 4 komponen (total 100 poin) dan model forecast anggaran menggunakan Weighted Moving Average.

Komponen Vendor Score (Total 100 Poin)
Price Accuracy 40%
100 − (avg_variance × 5)

Selisih harga estimasi vs aktual. Makin akurat, makin tinggi skor.

Delivery Timeliness 30%
(on_time / total) × 100

Rasio pengiriman tepat waktu dari total transaksi vendor.

Quality 20%
avg_rating × 20

Rating kualitas barang rata-rata (skala 1–5).

Consistency 10%
100 − (std_dev × 10)

Konsistensi harga — makin stabil, makin rendah standar deviasi.

Klasifikasi Tier Vendor
Tier Skor Label Keterangan
Tier A ≥ 80 Preferred Vendor terpercaya, prioritas utama dalam pengadaan.
Tier B ≥ 60 Acceptable Vendor dapat diterima, perlu pemantauan rutin.
Tier C ≥ 40 Under Review Performa menurun, sedang dievaluasi lebih lanjut.
Tier D < 40 Blacklist Candidate Kandidat blacklist, tidak direkomendasikan untuk digunakan.
Algoritma Spend Forecast — Weighted Moving Average
Weight 0.5
Bulan Terakhir (t)
50% bobot
Weight 0.3
2 Bulan Lalu (t−1)
30% bobot
Weight 0.2
3 Bulan Lalu (t−2)
20% bobot
Forecast = (Spend_t × 0.5) + (Spend_t−1 × 0.3) + (Spend_t−2 × 0.2)

Hasil forecast ditampilkan dengan Confidence Interval ±10% sebagai batas atas dan bawah prediksi.

Diagram Formulasi
flowchart TD subgraph SCORING["Vendor Scoring System — 100 Poin"] VS["Vendor Score"] --> VS1["Price Accuracy 40%\n100 - avg_variance x 5"] VS --> VS2["Delivery Timeliness 30%\non_time / total x 100"] VS --> VS3["Quality 20%\navg_rating x 20"] VS --> VS4["Consistency 10%\n100 - std_dev x 10"] VS1 --> TIER{"Vendor Tier"} VS2 --> TIER VS3 --> TIER VS4 --> TIER TIER -->|">= 80"| TIER_A["Tier A: Preferred"] TIER -->|">= 60"| TIER_B["Tier B: Acceptable"] TIER -->|">= 40"| TIER_C["Tier C: Under Review"] TIER -->|"< 40"| TIER_D["Tier D: Blacklist Candidate"] end subgraph FORECAST["Spend Forecast — Weighted Moving Average"] FC["Data Historis\n3 Bulan Terakhir"] --> FC1["Bulan t: Weight 0.5"] FC --> FC2["Bulan t-1: Weight 0.3"] FC --> FC3["Bulan t-2: Weight 0.2"] FC1 --> FC_RESULT["Forecast Amount\n+ Confidence Interval +-10%"] FC2 --> FC_RESULT FC3 --> FC_RESULT end