The Delivery Note (DN) and Proof of Delivery (POD) are two views of the same document that closes the order-to-cash flow. The DN is generated at the PACKED stage and travels with the goods on the truck. When the customer signs at the receiving end, the same spec is overlaid with the receiver's name, signature, date/time and condition note — that overlay is the POD. The signed POD is the legal evidence that the customer accepted the goods, and triggers the FG → CUSTOMER inventory move plus the SO line transition to COMPLETE.
This document mirrors NetSuite WMS Pick/Pack/Ship + POD, SAP S/4HANA Outbound Delivery + Goods Issue confirmation (VL02N + VL01N), Oracle WMS Cloud Shipment + Delivery Confirmation, and Sage X3 "Delivery + Customer Confirmation". The POD is also the SARS / VAT supporting document for the sales-tax point-in-time invoice.
The DN-POD pair is the only place in the lifecycle where an external counterparty (the customer) signs — so capture quality matters: receiver name, condition flag (Acceptable / Damaged / Short), photo where required.
IN_PROD to packed/dispatch ready — DN is generated at the PACKED stage.The DeliveryNote spec (frontend/js/erp-templates/delivery-note.js) and the PodDoc overlay (frontend/js/erp-templates/pod-doc.js) build from sales orders + customers + vehicle / route metadata. Each row below is wired to a real column.
| Field on document | API endpoint | DB table.column | Example value |
|---|---|---|---|
| DN Ref No. | generated client-side · previewRef() | (stamped on print) | DN-2026-0481 |
| POD Ref No. | derived | podRef(dnRef) · DN- swapped to POD- | POD-2026-0481 |
| DN date | POST /api/sales-orders/… | sales_orders.due_date / dispatch date | 2026-05-08 |
| Sales Order ref | GET /api/sales-orders/:id | sales_orders.order_no | SO-2026-1142 |
| Customer code & name | GET /api/customers | customers.code & customers.name | SHOPRITE · Shoprite Checkers |
| Customer P.O. | POST /api/sales-orders | sales_orders.notes (PO captured here) | PO-SHO-882139 |
| Bill-to address | GET /api/customers/:id | customers.notes (parsed) / external CRM | 1 Brackenfell Bvd, Brackenfell |
| Ship-to address | GET /api/customers/:id | delivery fields on customer / SO | 14 Voortrekker Rd, Goodwood |
| Item code | GET /api/products | products.code (FK sales_order_lines.product_id) | A4_72PG_FM |
| Item description | GET /api/products | products.name | A4 72-page FM |
| UoM | master data | products.code → items.uom | EA |
| Qty ordered | GET /api/sales-orders/:id | sales_order_lines.qty | 5 000 |
| Qty packed | captured at packing | sales_order_lines.qty_planned (post-packing) | 5 000 |
| Qty delivered | captured at POD | sales_order_lines.qty_produced at delivery | 4 980 (20 short) |
| Lot / batch ref | FGRN cross-ref | production_batches.batch_ref | BATCH-2026-0481 |
| Route code & label | logistics master | vehicle.route_code (planned in dispatch view) | CT-NORTH |
| Truck reg | logistics | vehicle.truck_reg | CA 184-329 |
| Driver name & clock | GET /api/employees | employees.first_name + last_name + clock_no | S. Goosen (clock 4407) |
| Picker / Loader sign | captured on dispatch | cross-ref to employees.clock_no | P. Mokoena (1042) |
| Dispatch warehouse | GET /api/warehouses?type=FG | warehouses.code | FG-MAIN |
| Special instructions | POST /api/sales-orders | sales_orders.notes | "Deliver before 11:00" |
| Receiver name (POD only) | captured by driver / app | not stored on SO · carried in document_links + POD spec | T. Khumalo |
| Received date / time (POD) | captured by driver / app | FG → CUSTOMER inventory_transactions.txn_date | 2026-05-08 09:42 |
| Condition (POD) | captured by driver / app | encoded in POD spec · "Acceptable / Damaged / Short / Rejected" | Acceptable |
| Proof photo URL | captured by driver / app | documents.s3_key · document_links.entity_type='sales_order_line' | s3://…/pod-2026-0481.jpg |
| FG → CUSTOMER inventory move | POST /api/inventory/transactions | inventory_transactions.txn_type='ISSUE' with reference_type='sales_order' | −5 000 EA from FG-MAIN |
POST /api/sales-orders creates the header + lines. SO lines pegged against FG stock once FGRN posts.products (ream count, shrink-wrap, pallet height).Print Delivery Note. Frontend calls DeliveryNote.print(salesOrder, lines, customer, vehicle). Spec status starts as CONFIRMED at PACKED stage.DISPATCHED.PodDoc.build(deliveryNote, receivedBy, receivedAt, condition, photoUrl) in the dispatch view, which overlays the receiver block on the existing DN spec, swaps title to "Proof of Delivery", and stamps a "RECEIVED ✓" subtitle.POST /api/inventory/transactions with txn_type='ISSUE', from_warehouse_id = FG-MAIN, reference_type='sales_order', reference_id=sales_order.id. FG units leave PalmStat stock.sales_order_lines.qty_produced += qty_delivered. When all lines deliver, sales_orders.status flips to COMPLETE.POST /api/documents with kind=POD. document_links ties to entity_type='sales_order'. Retained 7 years for SARS audit.| Action | Admin | Dispatch | Driver | Finance | Customer |
|---|---|---|---|---|---|
| Generate DN | ✓ | ✓ | – | – | – |
| Sign Picker / Loader / Driver | ✓ | ✓ | ✓ | – | – |
| Capture POD (receiver, condition) | ✓ | ✓ | ✓ | – | ✓ (signature only) |
| Post FG → CUSTOMER move | ✓ | ✓ | – | ✓ | – |
| Reprint after archive | ✓ | ✓ | – | ✓ | – |
| Email externally to customer | ✓ | ✓ | – | ✓ | – |
| Reverse / void (returns) | ✓ (with audit reason) | – | – | – | – |
Permission gate enforced by requireRole('admin','planner') on POST /api/sales-orders and the standard inventory write gate on the FG → CUSTOMER move.
Happy path: 5 000 units delivered, customer signs Acceptable. Driver returns signed DN. Operations runs PodDoc.build, posts FG → CUSTOMER, SO closes, finance invoices. Cycle time pick→invoice < 8h.
Happy path: Truck loaded with 5 000 but only 4 980 arrive intact (20 damaged in transit). Customer signs Short, condition: 20 EA damaged. POD reflects 4 980 delivered. SO line stays partial-open. Replacement run scheduled.
Sad path: Driver records full 5 000 as Acceptable. Customer disputes invoice. Recovery: cycle-count + investigation, retroactive credit note + adjustment txn.
Happy path: Customer refuses goods because batch ref is not the agreed one (lot mismatch). Driver records condition Rejected. Goods return to FG-MAIN via reverse PROD_IN. SO line reopens. Dispatch retries with the correct batch.
Happy path: Truck visits 4 customers. One DN per customer is generated upfront; each DN becomes a separate POD when signed. Driver returns 4 signed PODs at end of route. Each posts its own FG → CUSTOMER move.
Happy path: 1 of 4 pallets has water damage. Driver photographs at unloading, customer signs Damaged with note. POD photo URL stored. Insurance claim opens against the carrier with POD as supporting evidence.
sales_orders, sales_order_lines)customers) & Product master (products)inventory_transactions rows of type ISSUE (FG → CUSTOMER)fg_stock_snapshots (month-end FG closing position)| Stage | Target | Owner | Escalation |
|---|---|---|---|
| FG ready → DN print | 15 min | Dispatch supervisor | Logistics Manager |
| Pick + load + truck depart | 2h from print | Dispatch + Driver | Logistics Manager |
| Customer receipt | Within booked window | Driver | Customer Service if > 30 min late |
| POD captured (electronic) | At unloading | Driver / app | Dispatch supervisor |
| POD scanned + filed | End of route · same day | Dispatch clerk | Operations Director |
| FG → CUSTOMER inventory move | Same day as POD | Dispatch / Finance | Finance Controller |
| Customer invoice raised | Within 24h of POD | Finance | CFO |