Skip to content

5. Database Design

Halaman ini mendokumentasikan seluruh skema tabel database Siloora WMS, dikelompokkan berdasarkan Functional Area: Master, Transaction, dan Stock.

Setiap tabel menyertakan:

  • Nama Tabel — mengikuti konvensi snake_case (plural)
  • Deskripsi — entitas yang direpresentasikan
  • Functional Area — modul operasional tabel
  • Skema Kolom — nama kolom, tipe data, constraint, nullable, dan deskripsi/relasi

Diagram berikut menampilkan relasi lengkap antara 27 tabel database Siloora WMS dengan cardinality dan constraint relationships:

Siloora WMS Entity Relationship Diagram

Struktur ERD:

  • Master Entities — Organisasi, Site, Warehouse, Zone, Location, Product, UOM, Business Partner
  • Transaction Entities — Purchase Order, Inbound Order, Sales Order, Outbound Order, Picking Task, Dispatch Stage, Material Request
  • Stock Entities — Stock Moves, Stock Balances, Stock Reservations
  • Cardinality Notation||--o{ (1-to-N), }o--|| (N-to-1), ||--|{ (identifying relationships)

  • Table Name: organisations
  • Description: Menyimpan data entitas organisasi (tenant) induk yang mengelola seluruh operasional WMS.
  • Functional Area: Master – Organisation
  • Primary Key: organisation_id (UUID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
organisation_idUUIDPKNOIdentifier unik organisasi
codeVARCHAR50, Unique, Not NullNOKode organisasi untuk identifikasi internal
legal_nameVARCHAR255, Not NullNONama legal organisasi
statusENUMactive, inactive, Default activeNOStatus operasional organisasi
tax_idVARCHAR50, UniqueYESNomor identitas pajak/NPWP
country_codeCHAR2, ISO 3166-1 alpha-2NOKode negara organisasi
created_atTIMESTAMPDefault CURRENT_TIMESTAMPNOWaktu pencatatan data dibuat
updated_atTIMESTAMPAuto updateNOWaktu pembaruan data terakhir

Relationships:

  • organisations (1) → (N) sites

  • Table Name: sites
  • Description: Menyimpan data lokasi/cabang operasional yang berada di bawah satu organisasi.
  • Functional Area: Master – Sites
  • Primary Key: site_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
site_idCHAR26 (ULID), PKNOIdentifier unik site
organisation_idUUIDFK → organisations.organisation_idNORelasi site ke organisasi induk
site_codeVARCHAR50, Unique per organisation, Not NullNOKode site untuk identifikasi operasional
nameVARCHAR255, Not NullNONama site
cityVARCHAR100, Not NullNOKota lokasi operasional site
country_codeCHAR2, ISO 3166-1 alpha-2NOKode negara site
is_primaryBOOLEANDefault falseNOPenanda site utama dalam organisasi
is_activeBOOLEANDefault trueNOStatus aktivasi site

Relationships:

  • sites (N) → (1) organisationsON DELETE RESTRICT
  • sites (1) → (N) warehouses

  • Table Name: user_role_permissions
  • Description: Menyimpan kebijakan hak akses pengguna berupa kombinasi role, permission, dan cakupan organisasi/gudang.
  • Functional Area: Master – User Role & Permission
  • Primary Key: user_id (UUID, composite with scope columns)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
user_idUUIDPK / FK on assignmentNOIdentifier pengguna yang menerima hak akses
organisation_idUUIDFK → organisations.organisation_idYESCakupan organisasi pengguna bila berlaku
role_nameVARCHAR100, Not NullNONama role yang diberikan ke pengguna
permission_nameVARCHAR100, Not NullNONama permission granular untuk kontrol fitur
guard_nameVARCHAR50, Framework constraintNOKonteks guard untuk validasi otorisasi
address_idUUIDFK → business_partner_addresses.address_idYESCakupan alamat atau cabang yang dapat diakses
warehouse_idUUIDFK → warehouses.warehouse_idYESCakupan gudang operasional yang diotorisasi
is_activeBOOLEANDefault trueNOStatus aktivasi kebijakan akses

Relationships:

  • user_role_permissions (N) → (1) organisations
  • user_role_permissions (N) → (1) warehouses

  • Table Name: business_partners
  • Description: Menyimpan data mitra bisnis (vendor dan/atau customer) yang terlibat dalam transaksi inbound dan outbound.
  • Functional Area: Master – Business Partner
  • Primary Key: partner_id (UUID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
partner_idUUIDPKNOIdentifier unik business partner
partner_codeVARCHAR50, Unique, Not NullNOKode partner untuk identifikasi operasional
legal_nameVARCHAR255, Not NullNONama legal mitra
is_vendorBOOLEANDefault falseNOPenanda partner berperan sebagai vendor
is_customerBOOLEANDefault falseNOPenanda partner berperan sebagai customer
tax_idVARCHAR50, UniqueYESNomor identitas pajak partner
currency_codeCHAR3, ISO 4217YESMata uang utama transaksi partner
is_activeBOOLEANDefault trueNOStatus aktivasi partner

Relationships:

  • business_partners (1) → (N) business_partner_contacts
  • business_partners (1) → (N) business_partner_addresses
  • business_partners (1) → (N) purchase_orders (as vendor)
  • business_partners (1) → (N) sales_orders (as customer)

  • Table Name: business_partner_contacts
  • Description: Menyimpan data kontak person in charge (PIC) dari setiap business partner.
  • Functional Area: Master – Business Partner
  • Primary Key: contact_id (UUID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
contact_idUUIDPKNOIdentifier unik kontak partner
partner_idUUIDFK → business_partners.partner_idNORelasi kontak ke business partner
contact_nameVARCHAR255, Not NullNONama person in charge
job_titleVARCHAR100YESJabatan atau fungsi kontak
emailVARCHAR255, Valid email formatYESAlamat email kontak
phoneVARCHAR50, Valid phone formatYESNomor telepon kontak
is_primaryBOOLEANDefault falseNOPenanda kontak utama partner
is_activeBOOLEANDefault trueNOStatus aktivasi kontak

Relationships:

  • business_partner_contacts (N) → (1) business_partnersON DELETE RESTRICT
  • Rule: Hanya satu kontak utama aktif per business partner

  • Table Name: business_partner_addresses
  • Description: Menyimpan alamat pengiriman dan alamat default dari setiap business partner.
  • Functional Area: Master – Business Partner
  • Primary Key: address_id (UUID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
address_idUUIDPKNOIdentifier unik alamat partner
partner_idUUIDFK → business_partners.partner_idNORelasi alamat ke business partner
address_typeENUMDEFAULT, SHIPPING, Not NullNOJenis alamat yang didukung sistem
address_line_1VARCHAR255, Not NullNOBaris alamat utama
cityVARCHAR100, Not NullNOKota alamat partner
postal_codeVARCHAR20, Not NullNOKode pos alamat
is_primaryBOOLEANDefault falseNOPenanda alamat utama untuk tipe terkait
is_activeBOOLEANDefault trueNOStatus aktivasi alamat

Relationships:

  • business_partner_addresses (N) → (1) business_partnersON DELETE RESTRICT
  • Rule: Satu alamat default per tipe per business partner

  • Table Name: product_templates
  • Description: Menyimpan definisi induk produk (template) yang menjadi dasar pembuatan item/varian produk.
  • Functional Area: Master – Product
  • Primary Key: product_template_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
product_template_idCHAR26 (ULID), PKNOIdentifier unik template produk
nameVARCHAR255, Unique, Not NullNONama template produk
category_codeVARCHAR50, Not NullNOKategori utama produk
base_uom_idCHAR26 (ULID), FK → uoms.uom_idNOSatuan dasar yang dipakai template
descriptionTEXTYESDeskripsi ringkas template
is_activeBOOLEANDefault trueNOStatus aktivasi template
created_atTIMESTAMPDefault CURRENT_TIMESTAMPNOWaktu pencatatan template
updated_atTIMESTAMPAuto updateNOWaktu pembaruan template

Relationships:

  • product_templates (1) → (N) product_products
  • product_templates (N) → (1) uoms (via base_uom_id)

  • Table Name: product_products
  • Description: Menyimpan data item/varian produk (SKU level) yang digunakan pada seluruh operasional gudang.
  • Functional Area: Master – Product
  • Primary Key: product_product_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
product_product_idCHAR26 (ULID), PKNOIdentifier unik item produk
product_template_idCHAR26 (ULID), FK → product_templates.product_template_idNORelasi item ke template produk
skuVARCHAR50, Unique, Not NullNOKode SKU unik operasional
barcodeVARCHAR100, Not NullNOKode barcode untuk scan proses gudang
base_uom_idCHAR26 (ULID), FK → uoms.uom_idNOSatuan dasar item
weightDECIMAL15,2, >= 0YESBerat item untuk kalkulasi logistik
volumeDECIMAL15,2, >= 0YESVolume item untuk perhitungan kapasitas
is_activeBOOLEANDefault trueNOStatus aktivasi item

Relationships:

  • product_products (N) → (1) product_templates
  • product_products (N) → (1) uoms
  • product_products (1) → (N) stock_balances
  • product_products (1) → (N) stock_moves

  • Table Name: uoms
  • Description: Menyimpan definisi satuan ukur (Unit of Measure) yang digunakan pada produk dan konversi.
  • Functional Area: Master – UOM
  • Primary Key: uom_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
uom_idCHAR26 (ULID), PKNOIdentifier unik satuan ukur
codeVARCHAR50, Unique, Not NullNOKode UOM untuk referensi teknis
nameVARCHAR50, Unique, Not NullNONama satuan ukur
descriptionTEXTYESDeskripsi satuan
precision_scaleINT>= 0NOSkala pembulatan kuantitas
is_referenceBOOLEANDefault falseNOPenanda satuan referensi dalam kategori
is_activeBOOLEANDefault trueNOStatus aktivasi satuan
updated_atTIMESTAMPAuto updateNOWaktu pembaruan data terakhir

Relationships:

  • uoms (1) → (N) product_templates (via base_uom_id)
  • uoms (1) → (N) product_products
  • uoms (1) → (N) uom_conversions (as from_uom_id or to_uom_id)

  • Table Name: uom_categories
  • Description: Menyimpan kategori pengelompokan satuan ukur untuk mendukung aturan konversi antar satuan dalam domain yang sama.
  • Functional Area: Master – UOM
  • Primary Key: uom_category_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
uom_category_idCHAR26 (ULID), PKNOIdentifier unik kategori satuan
codeVARCHAR50, Unique, Not NullNOKode kategori UOM
nameVARCHAR100, Unique, Not NullNONama kategori pengukuran
descriptionTEXTYESDeskripsi domain pengukuran
reference_uom_idCHAR26 (ULID), FK → uoms.uom_idYESSatuan referensi utama kategori
is_activeBOOLEANDefault trueNOStatus kategori
created_atTIMESTAMPDefault CURRENT_TIMESTAMPNOWaktu pencatatan kategori
updated_atTIMESTAMPAuto updateNOWaktu pembaruan kategori

Relationships:

  • uom_categories (1) → (N) uom_conversions
  • uom_categories (N) → (1) uoms (via reference_uom_id)

  • Table Name: uom_conversions
  • Description: Menyimpan aturan konversi antara dua satuan ukur dalam satu kategori UOM, termasuk rasio dan metode pembulatan.
  • Functional Area: Master – UOM
  • Primary Key: uom_conversion_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
uom_conversion_idCHAR26 (ULID), PKNOIdentifier unik aturan konversi
uom_category_idCHAR26 (ULID), FK → uom_categories.uom_category_idNOKategori domain konversi
from_uom_idCHAR26 (ULID), FK → uoms.uom_idNOSatuan asal
to_uom_idCHAR26 (ULID), FK → uoms.uom_idNOSatuan tujuan
conversion_ratioDECIMAL15,6, > 0, Not NullNORasio konversi dari satuan asal ke tujuan
rounding_modeENUMUP, DOWN, HALF_UP, Not NullNOMetode pembulatan hasil konversi
levelINT>= 0NOUrutan prioritas konversi dalam kategori
is_activeBOOLEANDefault trueNOStatus aturan konversi

Relationships:

  • uom_conversions (N) → (1) uom_categories
  • uom_conversions (N) → (1) uoms (via from_uom_id)
  • uom_conversions (N) → (1) uoms (via to_uom_id)

  • Table Name: warehouses
  • Description: Menyimpan data gudang fisik yang beroperasi di bawah satu site, sebagai unit pengelolaan stok dan transaksi.
  • Functional Area: Master – Warehouse
  • Primary Key: warehouse_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
warehouse_idCHAR26 (ULID), PKNOIdentifier unik gudang
site_idCHAR26 (ULID), FK → sites.site_idNORelasi gudang ke site
warehouse_codeVARCHAR20, Unique per site, Not NullNOKode gudang operasional
nameVARCHAR100, Not NullNONama gudang
cityVARCHAR100YESKota lokasi gudang
country_codeCHAR2, ISO 3166-1 alpha-2YESKode negara gudang
requires_confirmationBOOLEANDefault trueNOKebutuhan konfirmasi proses gudang
is_activeBOOLEANDefault trueNOStatus aktivasi gudang

Relationships:

  • warehouses (N) → (1) sites
  • warehouses (1) → (N) zones
  • warehouses (1) → (N) inbound_orders
  • warehouses (1) → (N) sales_orders

  • Table Name: zones
  • Description: Menyimpan data zona/area operasional dalam gudang, mendukung hierarki zona berbasis path untuk navigasi dan penugasan lokasi.
  • Functional Area: Master – Warehouse
  • Primary Key: zone_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
zone_idCHAR26 (ULID), PKNOIdentifier unik zona
warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNORelasi zona ke gudang
parent_zone_idCHAR26 (ULID), Self FK → zones.zone_idYESRelasi parent untuk hierarki zona
zone_codeVARCHAR20, Unique per warehouse, Not NullNOKode zona
nameVARCHAR100, Not NullNONama zona
zone_typeVARCHAR50, Not NullNOTipe area operasional zona
pathTEXTIndexed path hierarchyYESJalur hierarki zona untuk query turunan
is_activeBOOLEANDefault trueNOStatus aktivasi zona

Relationships:

  • zones (N) → (1) warehouses
  • zones (N) → (1, self) zones (via parent_zone_id) — hierarki tanpa siklus
  • zones (1) → (N) locations

  • Table Name: locations
  • Description: Menyimpan data lokasi fisik (rak, lantai, atau virtual) dalam zona gudang sebagai titik penyimpanan stok.
  • Functional Area: Master – Warehouse
  • Primary Key: location_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
location_idCHAR26 (ULID), PKNOIdentifier unik lokasi
zone_idCHAR26 (ULID), FK → zones.zone_idNORelasi lokasi ke zona
location_codeVARCHAR50, Unique, Not NullNOKode lokasi untuk proses scan
location_typeENUMRACK, FLOOR, VIRTUAL, Not NullNOKlasifikasi tipe lokasi
location_statusENUMEMPTY, PARTIAL, FULL, BLOCKED, Default EMPTYNOStatus okupansi lokasi
max_weightDECIMAL15,2, >= 0YESBatas kapasitas berat lokasi
max_volumeDECIMAL15,2, >= 0YESBatas kapasitas volume lokasi
is_mixed_sku_allowedBOOLEANDefault falseNOPenanda lokasi dapat menampung multi SKU
is_activeBOOLEANDefault trueNOStatus aktivasi lokasi

Relationships:

  • locations (N) → (1) zones
  • locations (1) → (N) stock_balances
  • locations (1) → (N) stock_moves (as from_location or to_location)
  • locations (1) → (N) picking_task_lines

  • Table Name: purchase_orders
  • Description: Menyimpan header dokumen Purchase Order yang dikeluarkan kepada vendor untuk pengadaan barang.
  • Functional Area: Transaction – Purchasing
  • Primary Key: purchase_order_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
purchase_order_idCHAR26 (ULID), PKNOIdentifier unik purchase order
po_numberVARCHAR50, Unique, Not NullNONomor dokumen PO
partner_idCHAR26 (ULID), FK → business_partners.partner_idNOVendor pemasok untuk PO
order_dateDATENot NullNOTanggal pembuatan PO
expected_delivery_dateDATENot NullNOTanggal estimasi kedatangan barang
statusENUMDRAFT, OPEN, PARTIAL, CLOSED, VOID, Not NullNOStatus siklus hidup PO
total_amountDECIMAL15,2, >= 0NONilai total PO
currency_codeCHAR3, ISO 4217, Not NullNOMata uang transaksi

Relationships:

  • purchase_orders (N) → (1) business_partners
  • purchase_orders (1) → (N) purchase_order_items
  • Status lifecycle: DRAFTOPENPARTIALCLOSED / VOID

  • Table Name: purchase_order_items
  • Description: Menyimpan rincian line item dari setiap Purchase Order, termasuk kuantitas dipesan dan diterima.
  • Functional Area: Transaction – Purchasing
  • Primary Key: purchase_order_item_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
purchase_order_item_idCHAR26 (ULID), PKNOIdentifier unik line item PO
purchase_order_idCHAR26 (ULID), FK → purchase_orders.purchase_order_idNORelasi line ke header PO
product_idCHAR26 (ULID), FK → product_products.product_product_idNOProduk yang dipesan
sku_snapshotVARCHAR100, Not NullNOSnapshot SKU saat PO dibuat
uom_snapshotVARCHAR20, Not NullNOSnapshot UOM saat PO dibuat
quantity_orderedDECIMAL15,2, > 0NOKuantitas yang dipesan
quantity_receivedDECIMAL15,2, Default 0NOKuantitas yang sudah diterima
unit_priceDECIMAL15,2, >= 0NOHarga satuan item

Relationships:

  • purchase_order_items (N) → (1) purchase_ordersON DELETE CASCADE
  • purchase_order_items (N) → (1) product_products

  • Table Name: inbound_orders
  • Description: Menyimpan dokumen penerimaan barang ke gudang, baik dari vendor maupun transfer antar gudang.
  • Functional Area: Transaction – Inbound
  • Primary Key: inbound_order_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
inbound_order_idCHAR26 (ULID), PKNOIdentifier unik inbound order
ib_numberVARCHAR50, Unique, Not NullNONomor dokumen inbound
inbound_typeENUMVENDOR, TRANSFER, Not NullNOJenis inbound
vendor_idCHAR26 (ULID), FK → business_partners.partner_idYESVendor pemasok (untuk inbound vendor)
source_warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idYESGudang asal (untuk transfer)
warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNOGudang tujuan inbound
statusENUMDRAFT, SCHEDULED, ARRIVED, RECEIVING, COMPLETED, CANCELLED, Not NullNOStatus proses inbound
expected_dateTIMESTAMPIndexed, Not NullNOJadwal kedatangan barang

Relationships:

  • inbound_orders (N) → (1) business_partners (vendor)
  • inbound_orders (N) → (1) warehouses (destination)
  • Status lifecycle: DRAFTSCHEDULEDARRIVEDRECEIVINGCOMPLETED / CANCELLED

  • Table Name: sales_orders
  • Description: Menyimpan header dokumen Sales Order dari customer sebagai dasar proses pemenuhan dan pengiriman barang.
  • Functional Area: Transaction – Sales
  • Primary Key: sales_order_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
sales_order_idCHAR26 (ULID), PKNOIdentifier unik sales order
so_numberVARCHAR50, Unique, Not NullNONomor dokumen sales order
reference_numberVARCHAR100, IndexedYESReferensi eksternal order
customer_idCHAR26 (ULID), FK → business_partners.partner_idNOCustomer pemesan
warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNOGudang pemenuhan order
order_dateTIMESTAMPIndexed, Not NullNOTanggal order dibuat
required_dateTIMESTAMPIndexed, Not NullNOTanggal target pemenuhan
statusENUMDRAFT, RELEASED, ALLOCATING, PICKING, PACKED, SHIPPED, CANCELLED, Not NullNOStatus siklus order

Relationships:

  • sales_orders (N) → (1) business_partners (customer)
  • sales_orders (N) → (1) warehouses
  • sales_orders (1) → (N) outbound_orders
  • Status lifecycle: DRAFTRELEASEDALLOCATINGPICKINGPACKEDSHIPPED / CANCELLED

  • Table Name: outbound_orders
  • Description: Menyimpan dokumen instruksi pengeluaran barang dari gudang, mencakup tipe SALES, TRANSFER, RTV, dan SCRAP.
  • Functional Area: Transaction – Outbound
  • Primary Key: outbound_order_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
outbound_order_idCHAR26 (ULID), PKNOIdentifier unik outbound order
ob_numberVARCHAR50, Unique, Not NullNONomor dokumen outbound
order_typeENUMSALES, TRANSFER, RTV, SCRAP, Not NullNOJenis outbound
reference_numberVARCHAR100, Indexed, Not NullNOReferensi sumber order
origin_warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNOGudang asal barang
target_warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idYESGudang tujuan untuk transfer
customer_idCHAR26 (ULID), FK → business_partners.partner_idYESCustomer tujuan pengiriman
statusENUMDRAFT, ALLOCATED, PICKING, PACKED, SHIPPED, DELIVERED, CANCELLED, Not NullNOStatus proses outbound

Relationships:

  • outbound_orders (N) → (1) warehouses (origin)
  • outbound_orders (N) → (1) business_partners (customer)
  • outbound_orders (1) → (N) picking_orders
  • outbound_orders (1) → (N) dispatch_stages
  • Status lifecycle: DRAFTALLOCATEDPICKINGPACKEDSHIPPEDDELIVERED / CANCELLED

  • Table Name: picking_orders
  • Description: Menyimpan instruksi tugas picking yang diberikan kepada operator gudang untuk proses pengambilan barang dari lokasi rak.
  • Functional Area: Transaction – Picking
  • Primary Key: picking_order_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
picking_order_idCHAR26 (ULID), PKNOIdentifier unik picking task
task_numberVARCHAR50, Unique, Not NullNONomor task picking
outbound_order_idCHAR26 (ULID), FK → outbound_orders.outbound_order_idNORelasi task ke outbound order
assigned_toCHAR26 (ULID), FK → users.user_idYESOperator yang ditugaskan
statusENUMDRAFT, ASSIGNED, IN_PROGRESS, COMPLETED, CANCELLED, Not NullNOStatus task picking
started_atTIMESTAMPYESWaktu mulai eksekusi picking
completed_atTIMESTAMPYESWaktu selesai picking
picked_qty_totalDECIMAL15,2, >= 0NOTotal kuantitas hasil pick

Relationships:

  • picking_orders (N) → (1) outbound_orders
  • picking_orders (1) → (N) dispatch_stages
  • Status lifecycle: DRAFTASSIGNEDIN_PROGRESSCOMPLETED / CANCELLED

  • Table Name: picking_tasks
  • Description: Menyimpan dokumen instruksi picking internal WMS sebagai header tugas pengambilan barang dari rak oleh operator.
  • Functional Area: Transaction – Picking
  • Primary Key: id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
idCHAR26 (ULID), PKNOPrimary Key
task_numberVARCHAR50, UniqueNONomor instruksi/tugas Picking internal WMS
outbound_order_idCHAR26 (ULID), FK → outbound_orders.id, IndexNORelasi ke outbound_orders.id (Dokumen dasar pengeluaran)
assigned_toCHAR26 (ULID), FK → users.id, IndexYESID Operator / Picker yang ditugaskan
statusENUMDRAFT, ASSIGNED, IN_PROGRESS, COMPLETED, CANCELLEDNOStatus workflow tugas
started_atTIMESTAMPYESWaktu aktual operator mulai melakukan scan lokasi/barang
completed_atTIMESTAMPYESWaktu aktual seluruh baris tugas selesai dikonfirmasi
extJSONYESEkstra kolom dinamis (catatan prioritas, alat angkut, dsb)
created_byCHAR26 (ULID)NOAudit: ID User/Sistem pembuat tugas
updated_byCHAR26 (ULID)YESAudit: ID User pengubah terakhir
created_atTIMESTAMPNOLaravel standard
updated_atTIMESTAMPNOLaravel standard
deleted_atTIMESTAMPIndexYESSoft delete marker

Relationships:

  • picking_tasks (N) → (1) outbound_ordersON DELETE RESTRICT
  • picking_tasks (1) → (N) picking_task_linesON DELETE CASCADE
  • Status lifecycle: DRAFTASSIGNEDIN_PROGRESSCOMPLETED / CANCELLED

  • Table Name: picking_task_lines
  • Description: Menyimpan rincian lokasi spesifik rak, SKU, target kuantitas yang harus diambil (to pick), dan realisasi hasil (picked) per instruksi tugas picking.
  • Functional Area: Transaction – Picking
  • Primary Key: id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
idCHAR26 (ULID), PKNOPrimary Key
picking_task_idCHAR26 (ULID), FK → picking_tasks.id, IndexNORelasi ke picking_tasks.id
outbound_line_idCHAR26 (ULID), FK → outbound_order_lines.id, IndexNORelasi ke outbound_order_lines.id
location_idCHAR26 (ULID), FK → locations.location_id, IndexNORelasi ke locations.location_id (Lokasi rak/bin sumber)
product_idCHAR26 (ULID), FK → product_products.id, IndexNORelasi ke product_products.id
uom_idCHAR26 (ULID), FK → uoms.uom_idNORelasi ke uoms.uom_id
qty_to_pickDECIMAL15,2, Default 0.00NOTarget kuantitas instruksi pengambilan
qty_pickedDECIMAL15,2, Default 0.00NOKuantitas fisik yang aktual terambil di rak
batch_numberVARCHAR50, IndexYESNomor lot/batch yang diinstruksikan atau dikonfirmasi scan
extJSONYESCatatan item (barang rusak saat diambil, dsb)
created_byCHAR26 (ULID)NOAudit: ID User pembuat
updated_byCHAR26 (ULID)YESAudit: ID User pengubah terakhir
created_atTIMESTAMPNOLaravel standard
updated_atTIMESTAMPNOLaravel standard

Relationships:

  • picking_task_lines (N) → (1) picking_tasksON DELETE CASCADE
  • picking_task_lines (N) → (1) locationsON DELETE RESTRICT
  • picking_task_lines (N) → (1) outbound_order_linesON DELETE RESTRICT
  • picking_task_lines (N) → (1) product_productsON DELETE RESTRICT
  • picking_task_lines (N) → (1) uoms

  • Table Name: dispatch_stages
  • Description: Menyimpan rekaman serah kirim barang dari hasil picking ke proses pengiriman, termasuk status posting goods issue.
  • Functional Area: Transaction – Dispatch
  • Primary Key: dispatch_stage_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
dispatch_stage_idCHAR26 (ULID), PKNOIdentifier unik tahapan dispatch
outbound_order_idCHAR26 (ULID), FK → outbound_orders.outbound_order_idNORelasi dispatch ke outbound order
picking_order_idCHAR26 (ULID), FK → picking_orders.picking_order_idNORelasi dispatch ke picking task
dispatch_numberVARCHAR50, Unique, Not NullNONomor dokumen dispatch
dispatched_atTIMESTAMPNot NullNOWaktu serah kirim dilakukan
dispatched_byCHAR26 (ULID), FK → users.user_idYESPetugas yang memproses dispatch
goods_issue_statusENUMPENDING, POSTED, FAILED, Not NullNOStatus posting goods issue
statusENUMREADY, DISPATCHED, CLOSED, Not NullNOStatus lifecycle dispatch stage

Relationships:

  • dispatch_stages (N) → (1) outbound_orders
  • dispatch_stages (N) → (1) picking_orders
  • Status lifecycle: READYDISPATCHEDCLOSED

  • Table Name: material_requests
  • Description: Menyimpan permintaan pengadaan material internal dari satu area/gudang ke gudang lain, dengan alur approval bertahap.
  • Functional Area: Transaction – Material Request
  • Primary Key: material_request_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
material_request_idCHAR26 (ULID), PKNOIdentifier unik material request
mr_numberVARCHAR50, Unique, Not NullNONomor dokumen material request
requester_idCHAR26 (ULID), FK → users.user_idNOPengguna yang membuat request
source_warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNOGudang asal pemenuhan
target_warehouse_idCHAR26 (ULID), FK → warehouses.warehouse_idNOGudang atau area tujuan
required_dateDATENot NullNOTanggal kebutuhan material
priorityENUMLOW, MEDIUM, HIGH, URGENT, Default MEDIUMNOPrioritas pemenuhan request
statusENUMDRAFT, SUBMITTED, APPROVED, ALLOCATED, FULFILLED, CANCELLED, Not NullNOStatus workflow material request

Relationships:

  • material_requests (N) → (1) warehouses (source)
  • material_requests (N) → (1) warehouses (target)
  • Status lifecycle: DRAFTSUBMITTEDAPPROVEDALLOCATEDFULFILLED / CANCELLED

  • Table Name: stock_moves
  • Description: Menyimpan dokumen pergerakan stok (header dan baris item) yang mencatat setiap perpindahan produk antar lokasi dalam gudang.
  • Functional Area: Stock – Movement
  • Primary Key: move_id (ULID, header); item_id (ULID, line item)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
move_idCHAR26 (ULID), PK (header)NOIdentifier dokumen stock move
statusENUMDRAFT, POSTED, CANCELLED, Not NullNOStatus workflow dokumen
posting_dateTIMESTAMPIndexed, Not NullNOWaktu stok resmi berubah di sistem
move_type_groupENUMGR, GI, TP, ADJ, Not NullNOGR=receipt, GI=issue, TP=transfer, ADJ=adjustment
item_idCHAR26 (ULID), PK (line)NOIdentifier baris item move
product_idCHAR26 (ULID), FK → product_products.product_product_idNOProduk yang bergerak
from_locationCHAR26 (ULID), FK → locations.location_idYESLokasi asal pergerakan
to_locationCHAR26 (ULID), FK → locations.location_idYESLokasi tujuan pergerakan
qty_actualDECIMAL15,3, > 0NOKuantitas aktual yang berpindah

Relationships:

  • stock_moves (N) → (1) product_products
  • stock_moves (N) → (1) locations (via from_location)
  • stock_moves (N) → (1) locations (via to_location)
  • Status lifecycle: DRAFTPOSTED / CANCELLED

  • Table Name: stock_balances
  • Description: Menyimpan saldo stok aktual per produk, lokasi, dan satuan (quant model), termasuk kuantitas tersedia dan yang sudah direservasi.
  • Functional Area: Stock – Balance
  • Primary Key: balance_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
balance_idCHAR26 (ULID), PKNOIdentifier unik quant balance
product_idCHAR26 (ULID), FK → product_products.product_product_idNOProduk pada quant
location_idCHAR26 (ULID), FK → locations.location_idNOLokasi penyimpanan
uom_idCHAR26 (ULID), FK → uoms.uom_idNOSatuan penyimpanan
qty_on_handDECIMAL15,2, Default 0, >= 0NOKuantitas fisik aktual
qty_reservedDECIMAL15,2, Default 0, >= 0NOKuantitas yang sudah dibooking
qty_availableDECIMAL15,2, Computed: on_hand - reservedNOKuantitas tersedia untuk alokasi
batch_numberVARCHAR50, IndexedYESIdentitas batch atau lot
serial_numberVARCHAR100, IndexedYESNomor seri unit

Relationships:

  • stock_balances (N) → (1) product_products
  • stock_balances (N) → (1) locations
  • stock_balances (N) → (1) uoms
  • stock_balances (1) → (N) stock_reservations

  • Table Name: stock_reservations
  • Description: Menyimpan data reservasi stok yang mengunci kuantitas tertentu pada quant balance sebagai jaminan ketersediaan untuk dokumen transaksi yang sedang aktif.
  • Functional Area: Stock – Reservation
  • Primary Key: reservation_id (ULID)
Column NameData TypeSize / ConstraintsNullableDescription / Relasi
reservation_idCHAR26 (ULID), PKNOIdentifier unik reservasi
balance_idCHAR26 (ULID), FK → stock_balances.balance_idNORelasi ke quant balance
product_idCHAR26 (ULID), FK → product_products.product_product_idNOProduk yang direservasi
location_idCHAR26 (ULID), FK → locations.location_idNOLokasi pengambilan stok
reference_typeVARCHAR50, Indexed, Not NullNOJenis dokumen pemicu reservasi
reference_idCHAR26 (ULID), Indexed, Not NullNOID dokumen pemicu reservasi
qty_reservedDECIMAL15,3, > 0NOJumlah stok yang dibooking
statusENUMACTIVE, COMPLETED, CANCELLED, Not NullNOStatus lifecycle reservasi
reserved_atTIMESTAMPNot NullNOWaktu stok dikunci

Relationships:

  • stock_reservations (N) → (1) stock_balances
  • stock_reservations (N) → (1) product_products
  • stock_reservations (N) → (1) locations
  • Status lifecycle: ACTIVECOMPLETED / CANCELLED