Lewati ke konten utama

Pemesanan Penjualan (Sales Order v2)

Formulir Sales Order v2 dirancang khusus untuk transaksi penjualan grosir B2B, penjualan termin kredit berjangka (Accounts Receivable), serta pesanan pengiriman terjadwal yang memerlukan koordinasi logistik gudang.


1. Diagram Alur Siklus Hidup Pesanan (Stage Stepper)

Setiap Sales Order bergerak melalui tahapan terstruktur yang dipantau melalui indikator visual Stage Stepper di bagian atas layar:

Rincian Perilaku Tiap Stage:

  1. Draft (Penyusunan Rencana Pesanan):
    • Dokumen bebas disunting (menambah/menghapus barang atau mengubah kuantitas dan harga).
    • Belum memotong saldo fisik di gudang.
  2. Confirmed (Pesanan Sah & Penguncian Dokumen):
    • Header dan baris pesanan dikunci dari perubahan sembarangan.
    • Sistem menerbitkan dokumen pengeluaran logistik (StockPicking OUT) dengan status Ready yang menugaskan petugas gudang untuk mengambil barang di rak.
    • Faktur piutang pelanggan tercatat di modul keuangan.
  3. Done (Barang Telah Diserahkan / Selesai):
    • Petugas logistik menekan tombol Kirim Barang (Deliver) saat armada keluar dari gerbang gudang.
    • Saldo stok fisik resmi terpotong di kartu stok (StockLedger).
    • Jurnal akuntansi Harga Pokok Penjualan (HPP) dan Pendapatan Penjualan diposting ke buku besar.
  4. Cancelled (Pembatalan Pesanan):
    • Jika dibatalkan saat masih Draft: Dokumen ditandai batal tanpa mutasi keuangan atau logistik.
    • Jika dibatalkan setelah Confirmed atau Done: Sistem secara otomatis menerbitkan dokumen pengembalian barang (Picking Reversal) dan pembatalan piutang.

2. Struktur Formulir Sales Order v2

Formulir Sales Order v2 menggunakan arsitektur antarmuka tingkat lanjut dengan pembagian area yang ergonomis:

A. Bagian Header Dokumen

Nama FieldTipe DataWajib?Keterangan & Validasi
Nomor Pesanan (orderNumber)StringOtomatisDiterbitkan otomatis oleh generator sequence (misal: SO-202609-0012).
Pelanggan (customerId)Relasi (Customer)WajibMemilih mitra bisnis pelanggan. Menampilkan informasi plafon kredit dan alamat kirim.
Tanggal Pesanan (orderDate)DateWajibTanggal disepakatinya pesanan.
Jatuh Tempo (dueDate)DateWajibBatas akhir pembayaran piutang pelanggan. Validasi: dueDate >= orderDate.
Cabang Operasional (branchId)Relasi (Branch)WajibKantor cabang yang melayani pesanan. (Lihat aturan Branch Locking).
Catatan Pengiriman (notes)TextOpsionalInstruksi khusus untuk sopir atau kurir ekspedisi.

B. Bagian Baris Barang (Lines Dialog)

Pengguna menekan tombol + Tambah Baris Barang untuk memunculkan modal dialog input produk yang detail:

  • Produk (productId): Memilih barang yang dijual.
  • Pilihan Satuan / Kemasan: Memilih apakah barang dijual per Satuan Dasar (Pcs) atau Kemasan Pabrik Grosir (Dus isi 24).
  • Kuantitas (qty): Jumlah yang dipesan.
  • Harga Satuan (unitPrice): Harga per unit sebelum diskon (otomatis terisi dari master produk, dapat disesuaikan).
  • Diskon Baris (discountPercent / discountAmount): Potongan harga promosi.
  • Kalkulasi PPN (taxAmount): Dihitung otomatis sesuai tarif PPN produk (misal: 11%).

3. Mekanisme Penentuan Gudang Asal & Alur Pemotongan Stok (Two-Phase Fulfillment)

Berbeda dengan transaksi ritel POS yang memotong stok kasir secara instan/atomik, transaksi grosir atau distribusi pada Sales Order (SO) menggunakan pendekatan dua tahap (Two-Phase Fulfillment). Pendekatan ini memisahkan antara komitmen komersial dan serah terima logistik fisik.

A. Hierarki Penentuan Gudang Asal Persediaan

  1. Afiliasi Cabang & Gudang Default Cabang (Branch.warehouseId): Setiap dokumen Sales Order wajib memilih Cabang (branchId). Setiap kantor cabang memiliki tautan ke gudang utama operasionalnya (warehouseId).
  2. Penentuan Lokasi Sumber per Item via Master Produk (Product.defaultLocation): Untuk menjamin barang diambil dari rak penyimpanan yang tepat, sistem menentukan gudang pengeluaran (Source Location) berdasarkan konfigurasi master produk:
    • Sistem membaca kolom defaultLocation pada entitas Product.
    • Wajib Dikonfigurasi: Jika ada produk dalam pesanan yang belum memiliki defaultLocation, sistem akan menolak konfirmasi pesanan dengan pesan galat:

      "Produk '[Nama Produk]' belum punya defaultLocation — wajib utk lokasi sumber OUT"

  3. Penanganan Produk Resep / Rakitan (recipe / BOM): Jika item yang dipesan merupakan produk bertipe resep (recipe), sistem menelusuri komponen penyusunnya (BundleComponent) dan mengambil lokasi pengeluaran dari masing-masing defaultLocation komponen bahan baku tersebut.

B. Siklus Pemotongan Stok Dua Tahap (Two-Phase Flow)

  1. Tahap 1: Konfirmasi Pesanan (Confirmed) — Alokasi Dokumen (Stage Ready):
    • Saat dokumen Sales Order dialihkan dari Draft ke Confirmed, sistem secara otomatis membuat dokumen StockPicking OUTGOING (bertipe SALES) dengan stage Ready.
    • Rute picking: dari Product.defaultLocation menuju VIRTUAL-CUSTOMER.
    • Pada tahap ini, picking berfungsi sebagai Daftar Ambil Barang (Pick List) dan Surat Jalan Pengiriman.
    • Saldo fisik di gudang belum dipotong pada StockLedger, namun pesanan telah tercatat sebagai komitmen pengeluaran logistik.
  2. Tahap 2: Pengiriman Barang (Deliver) — Eksekusi Fisik (Stage Done):
    • Ketika armada pengiriman siap berangkat atau barang diserahkan ke kurir ekspedisi, staf menekan tombol Deliver (Kirim Barang).
    • Sistem memajukan dokumen picking yang berstatus Ready tersebut menjadi Done (atau menerbitkan picking Done baru dengan fallback ke Product.defaultLocation atau lokasi WAREHOUSE pertama cabang terkait).
    • Pada momen inilah saldo fisik persediaan di gudang asal resmi terpotong dan tercatat di kartu stok (StockLedger).
  3. Validasi Saldo Outbound Ketat (validateOutboundBalance):
    • Tepat sebelum picking dimajukan ke Done, sistem menjalankan validasi saldo keluar secara komprehensif (validateOutboundBalance).
    • Apabila stok riil di lokasi gudang sumber tidak mencukupi dan produk tidak mengizinkan stok minus (allowNegativeStock = false), proses Deliver langsung digagalkan demi menjaga integritas stok fisik.

4. Hal-Hal Kritis yang Wajib Diperhatikan (Why)

A. Pengecekan Ketersediaan Stok Sebelum Menjanjikan Pengiriman

Sebelum mengklik Confirm, selalu periksa kolom ketersediaan stok fisik gudang cabang. Jika stok fisik kurang dari jumlah yang dipesan dan produk disetel allowNegativeStock = false, konfirmasi pengiriman akan gagal saat petugas gudang mencoba memproses dokumen pengeluaran barang.

B. Ketelitian Memilih Satuan vs Kemasan Grosir

Perhatikan perbedaan mendasar antara menginput:

  • 10 Pcs = Total 10 unit barang fisik.
  • 10 Dus isi 24 = Total 240 unit barang fisik! Kekeliruan memilih kemasan pada baris pesanan dapat mengakibatkan selisih pengiriman barang dalam jumlah yang sangat masif.

C. Penguncian Cabang (Branch Locking)

Penguncian Cabang Transaksional

Setelah Sales Order berstatus Confirmed atau menghasilkan pergerakan stok/jurnal, kolom Cabang (branchId) akan dikunci secara permanen. Anda tidak dapat memindahkan transaksi ke cabang lain karena nomor faktur, gudang asal persediaan, dan rekening buku besar cabang telah terikat erat di basis data.