Deskripsi Modul
Modul Sales Order (SO) merupakan inti transaksi penjualan pada Toya ERP. Modul ini menghubungkan pelanggan dan proyek dengan anggaran proyek (estimator), item produk, termin pembayaran, alur persetujuan multi-tahap, serta tindak lanjut operasional meliputi invoice, dokumen, produksi (FLK/FRK), realisasi anggaran, dan delivery order.
Nomor SO dihasilkan otomatis saat pembuatan. Record baru dimulai dengan status Draft.
Fitur Modul
| Fitur | Deskripsi |
|---|
| Daftar & Pencarian | Tabel paginasi (20/halaman) dengan pencarian cepat nomor SO. |
| Filter Lanjutan | Filter berdasarkan sales, customer, status, dan rentang tanggal transaksi. |
| Tambah / Edit SO | Form multi-section: customer, order, budgeting, produk, termin pembayaran. |
| Lihat Detail | Tampilan read-only informasi customer, order, dan produk beserta audit trail. |
| Tab Estimator | Daftar anggaran proyek yang disalin dari estimator. |
| Tab Invoices | Termin pembayaran dan daftar invoice terkait. |
| Tab Documents | Unggah dan kelola lampiran dokumen. |
| Tab Produksi | Ringkasan dan daftar FLK/FRK terkait. |
| Tab Realisasi | Perbandingan estimasi vs biaya aktual per komponen. |
| Tab Delivery Order | Ringkasan dan daftar DO; pembuatan DO saat In Progress. |
| Alur Persetujuan | Approve Sales → Approve Manager Estimator → Approve Finance → In Progress → Complete. |
| Tolak (Decline) | Menolak SO dengan alasan wajib. |
| Cetak PDF | Dokumen sales order format A4 portrait. |
Penjelasan Field — Filter Daftar
| Field | Wajib | Deskripsi |
|---|
Pencarian (number) | Tidak | Pencarian berdasarkan nomor SO. |
Sales by (sales_id) | Tidak | Filter berdasarkan staff penjualan. |
Customer (customer_id) | Tidak | Filter berdasarkan pelanggan. |
Status (sales_order_status_id) | Tidak | Filter berdasarkan status SO. |
Tanggal Mulai (transaction_date_start) | Tidak | Batas awal rentang tanggal transaksi. |
Tanggal Akhir (transaction_date_end) | Tidak | Batas akhir rentang tanggal transaksi. |

Gambar 1. Halaman daftar Sales Order.
| Field | Wajib | Deskripsi |
|---|
Nama Customer (customer_id) | Ya | Dipilih melalui modal pencarian customer. |
NIK/NPWP (npwp) | Tidak | Terisi otomatis dari data customer (read-only). |
Code Customer (code) | Tidak | Kode customer (read-only). |
Alamat Pajak (tax_address) | Tidak | Alamat NPWP (read-only). |
Tipe Customer (customer_type) | Tidak | Tipe customer (read-only). |
Customer Baru (new_customer) | Tidak | Ya/Tidak; default Tidak. |
No. Telepon (phone) | Tidak | Telepon customer (read-only). |
No PO Customer (po_number) | Tidak | Nomor PO dari customer. |
Alamat Customer (address) | Tidak | Alamat customer (read-only). |
| Field | Wajib | Deskripsi |
|---|
Tanggal Transaksi (transaction_date) | Ya | Default hari ini; read-only. |
Nama & Lokasi Proyek (project_name) | Ya | Nama dan lokasi proyek. |
Kategori Penjualan (sales_category_id) | Ya | Reguler atau Project. |
Tipe Proyek (project_type_id) | Ya | KP, PS-G, PS-I, PN-G, PN-I, CR. |
Penjualan Cabang (sales_branch) | Ya | Surabaya, Jakarta, Banjarmasin. |
Nama PIC Penerima (pic_name) | Ya | Terisi otomatis dari customer. |
Nama Sales (sales_id) | Ya | Staff penjualan penanggung jawab. |
Kontak PIC Penerima (pic_phone) | Ya | Nomor kontak PIC. |
Alamat Penagihan (billing_address) | Ya | Alamat penagihan. |
Alamat Pengiriman (shipping_address) | Ya | Alamat pengiriman. |
Payment Category (payment_category_id) | Ya | Cash, COD, atau TOP. |
Term Of Payment (term_of_payment) | Conditional | Wajib jika kategori pembayaran = TOP. |
Penjelasan Field — Project Budgeting
| Field | Wajib | Deskripsi |
|---|
Estimator (estimator_id[]) | Ya | Minimal 1 estimator; dipilih via modal (hanya estimator locked). |
Qty (estimator_qty[]) | Ya | Pengali jumlah; integer ≥ 1. |
Grand Total (estimator_total[]) | — | Dihitung otomatis: harga satuan × qty. |
| Field | Wajib | Deskripsi |
|---|
Produk (product_id[]) | Ya | Minimal 1 produk; dipilih via modal. |
Alias (alias[]) | Tidak | Nama tampilan untuk customer. |
Keterangan (description[]) | Tidak | Deskripsi produk. |
Qty (qty[]) | Ya | Jumlah; harus > 0. |
Harga (price[]) | Ya | Harga per unit. |
Catatan (note) | Tidak | Catatan umum order. |
PPN 11% dihitung otomatis dari subtotal. Grand Total = Subtotal + PPN.
Penjelasan Field — Termin Pembayaran
| Field | Wajib | Deskripsi |
|---|
Presentase (termin_value[]) | Ya | Persentase termin; default baris pertama 100%. |
Nama Termin (termin_name[]) | Ya | Nama termin pembayaran. |
Keterangan (termin_description[]) | Tidak | Deskripsi termin. |
Penjelasan Field — Rincian Harga
| Field | Wajib | Deskripsi |
|---|
Catatan Harga (price_note) | Tidak | Catatan tambahan terkait harga. |

Gambar 2. Form tambah/edit Sales Order.
Status Sales Order
| Status | Deskripsi |
|---|
| Draft | SO baru atau hasil edit; menunggu persetujuan sales. |
| Approved Sales | Disetujui oleh sales penanggung jawab. |
| Approved Manager Estimator | Disetujui oleh manager estimator. |
| Approved Finance | Disetujui oleh finance/KAP. |
| Declined | Ditolak dengan alasan. |
| In Progress | SO sedang berjalan; produksi dan DO dapat dilakukan. |
| Completed | SO selesai. |
Tab Detail Sales Order
| Tab | Deskripsi |
|---|
| Detail Sales Order | Informasi customer, order, dan produk (default). |
| Estimator | Daftar anggaran proyek + tautan detail estimator. |
| Invoices | Termin pembayaran dan daftar invoice. |
| Documents | Lampiran file dengan kategori Sales/Finance/Production. |
| Produksi | Ringkasan FLK dan FRK terkait. |
| Realisasi | Dashboard perbandingan estimasi vs realisasi biaya. |
| Delivery Order | Ringkasan dan daftar delivery order. |

Gambar 3. Halaman detail Sales Order dengan header status dan tab navigasi.
Catatan Penting
- Minimal 1 estimator dan 1 produk wajib ada saat penyimpanan.
- PPN dihitung 11% dari subtotal produk.
- Data customer di-snapshot ke SO saat penyimpanan.
- Estimator di-deep-copy beserta seluruh struktur biaya dengan pengali qty.
- Edit hanya tersedia pada status Draft dan Declined; penyimpanan edit mengembalikan status ke Draft.
- Approve Sales hanya dapat dilakukan oleh sales penanggung jawab atau Super Admin.
- Decline memerlukan alasan (wajib).
- Pembuatan invoice diizinkan dari status Approved Finance, In Progress, atau Completed; hanya satu termin aktif untuk "Buat Invoice" pada satu waktu.
- Delivery Order hanya dapat dibuat saat status In Progress.
- Tab Laporan belum diimplementasikan (placeholder).
- Permission terkait:
salesorder.show, create, edit, approve_sales, approve_manager_estimator, approve_manager_finance, decline, in_progress, complete, print.