PO-2026-115 Partially received v2 · amended 24-06 160 short

CIC · Guangzhou · 9 lines · 1,800 ordered, 1,640 received, 1,628 accepted · one cost revision posted 26-07 after the DHL freight invoice landed 8 days late

SupplierCICpreferred DestinationHQ_319 BrandMinimalist IncotermFOBwe own freight from Shenzhen CurrencyUSDpinned 3.6730 at confirm · 3.6725 at invoice Ordered27-05-2026 Ready02-07 ETA07-07+11d Arrived18-07 Lead time52d FOBAED 342,000 LandedAED 366,819rev 1 · partial actual NetSuitePO-00312
All POs →
Lifecycle Draft› Submitted› Confirmed› In production› Shipped› In transit› At customs› Receiving› QC› Partially received› Received› Closed Branch Cancelled · legal rewinds shipped → in_production, closed → receiving
Lines 9 Terms + PI Milestones 18 Cost allocation rev 1 Documents 9 Receipts + QC 2 RFID 3 Ledger 11

Lines · per-line quantity ladder

line 4 short by 160 · claim SC-2026-0041 Ordered → Confirmed → Produced → Shipped → Received → Accepted
#SKUTitle BatchHS OrdConfProdShipRecvAccRejShort Fill Unit FOBLine FOBLanded unitLine landed State
1MSR31-07Signature Strap 42mm BlackB-26044202.31 30030030030030029820
166.0049,800194.9758,491settled
2MSR31-08Signature Strap 42mm TanB-26044202.31 30030030030030030000
166.0049,800194.9758,491settled
3CDW01Card Wallet BifoldB-26054202.31 48048048048048047820
110.5053,040131.1062,930settled
4LBA01Leather Belt AdjustableB-26054203.30 160160160160000160
201.2532,200no layer - short · claim open
5MST-CRM-42-BLKChrono Mesh 42 BlackB-26069102.11 12012012012012011820
911.00109,3201,004.05120,486settled
6MIN-2159Minimal Tote CanvasB-26064202.92 20020020020020019640
141.0028,200212.9642,592freight-heavy
7PP02Pocket Pouch SuedeB-26074202.31 90909090908910
94.008,460111.9110,072settled
8ALM02Almond Card HolderB-26074202.31 90909090908910
80.407,23695.788,620settled
9XTRA-STRAPSpare Strap KitB-26084202.31 60606060606000
65.733,94485.625,137settled
Totals 1,8001,8001,8001,8001,6401,62812160 342,000223.67366,819
FOB on the cost layer · 1,640 received units only, line 4 excluded309,800
Freight · air · basis chargeable weight 189.5 kg33,620
Insurance · basis value1,549
Duty 5.00% · basis value15,490
Clearance · basis quantity3,900
Inland Jebel Ali to HQ_319 · basis quantity1,640
Handling · basis quantity820
Landed total · AED · revision 1366,819
Line 4 has no cost layer line. LBA01 was shipped but never arrived, so there is nothing to cost. Its 160 units were written off GIT_INBOUND to LOST_IN_TRANSIT so the transit balance closes, and the money sits on supplier claim SC-2026-0041 instead of on a stock valuation (rule R-05.11). Its AED 32,200 of FOB is excluded from the allocation denominators, which is why the landed unit cost of every other line is higher than a naive PO-wide average would give.

Terms

Incoterm
FOB Shenzhen · title and risk pass at the port of loading, so we own freight, insurance, duty, clearance and inland
Payment
30% deposit on PI confirmation, 70% balance against the bill of lading copy
Currency
USD
FX at confirm
3.6730 · pinned 27-05-2026
FX at invoice
3.6725 · booked 22-07-2026
FX variance
AED -47 · allocated on value, revision 1
Lead time
45d contracted · 52d actual · +7d
Claim window
14 days from receipt for short or damaged
NetSuite ref
PO-00312
Versions
v1 27-05 · v2 24-06 (line 5 qty 100 → 120, price unchanged). v1 is frozen, not deleted.

Proforma invoice PI-871

Issued
04-06-2026
Confirmed
05-06-2026
Lead days
45 calendar
Expected ready
20-07 · actual 02-07 (18d early at the factory, lost again in transit)
Declared total
AED 348,840
Line subtotal
AED 342,000
Gap
AED 6,840 · 2.00%
Attribution
freight prepaid accepted by Ramesh K. on 06-06, booked as an estimated freight component on the layer
Milestone%AEDDuePaidNetSuite
Deposit30104,65208-0607-06NS-PAY-4471
Balance70244,18810-0709-07NS-PAY-4503
Freight (DHL, direct) - 33,62005-08unpaidNS-INV-88301
Broker (clearance + duty) - 19,39002-08unpaidpending

Milestones · order to shelf

total slippage +11d, all of it between factory-ready and dock
PO created and submitted to CIC27-05 · 11:20
Ramesh K. · 9 lines · AED 342,000 FOB · expected ready 20-07
PI-871 received and confirmed05-06 · 09:14
Declared AED 348,840 against a AED 342,000 subtotal · the AED 6,840 gap accepted as prepaid freight, not folded into unit prices
Deposit paid · 30%07-06 · 14:02
AED 104,652 · NetSuite NS-PAY-4471
Production · materials12-06 · planned 10-06
+2d · 1,800 units posted to IN_PRODUCTION @ HQ_319 · this is the first ledger row this PO produced
Production · cutting18-06 · planned 17-06
+1d · leather batch B-2605 approved after a re-dye
PO amended to v224-06 · 16:40
Line 5 MST-CRM-42-BLK 100 → 120. v1 frozen with superseded_at set, v2 inserted. The document was never edited in place.
Production · assembly25-06 · planned 24-06
+1d
Production · finishing29-06 · planned 28-06
+1d
Production · packing complete02-07 · planned 02-07
On time · 24 master cartons, packing list XLSX received
Balance paid · 70%09-07 · 10:35
AED 244,188 · NetSuite NS-PAY-4503
Shipped · DHL 442911884008-07 · 19:04
IN_PRODUCTION -1,800 and GIT_INBOUND +1,800 in one transaction @ HQ_319 · 24 pieces, 189.5 kg gross, 196.0 kg chargeable
Customs · declaration SDEC-2026-0712 lodged12-07 · 08:22
DXB Air · broker Al Futtaim Logistics · assessed value AED 309,800 · duty 5% AED 15,490 · VAT AED 15,490
Customs hold · valuation query13-07 → 16-07
3 days · HS 9102.11 on line 5 queried, COO certificate supplied · the entire +11d ETA slippage originates here plus a 4-day DHL backlog
Cleared and delivered to HQ_31918-07 · 07:40
23 of 24 pieces · piece 14 (LBA01, 160 units) never scanned at origin
GRN GRN-2026-0718-115-1 · 1,640 of 1,80018-07 · 09:12
Ramesh K. · GIT_INBOUND -1,640, RECEIVED_NOT_INVOICED +1,640 · cost layer CL-2026-0718-0044 created at revision 0, AED 358,979
Short receipt · 160 units LBA0118-07 · 09:40
GIT_INBOUND -160, LOST_IN_TRANSIT +160 · transit balance closed, claim SC-2026-0041 opened for AED 32,200 FOB plus its share of prepaid freight
QC 5-bucket · 12 rejected to supplier19-07 · 14:05
1,628 accept · 12 reject_supplier (stitching) · 0 reject_local · 0 repair · RECEIVED_NOT_INVOICED -12, QUARANTINE +12 · the 12 units keep their landed cost into the RTS claim
Supplier invoice booked · NS-INV-8821422-07 · 11:00
RECEIVED_NOT_INVOICED -1,628, STOCK +1,628 · FX variance AED -47 booked as a cost component
Freight invoice landed 8 days late · cost revision 126-07 · 16:18
DHL NS-INV-88301 AED 33,620 against an estimate of AED 26,400, plus broker clearance AED 3,900 against AED 3,280. Delta AED +7,840. Reallocated at revision 1, split AED 5,823 revaluation on 1,228 units still on hand and AED 2,017 COGS variance on the 412 already sold. No posted ledger row was modified.

Cost allocation · layer CL-2026-0718-0044

partial actual · broker invoice outstanding 1,640 units · 8 lines
SKU Qty FOB Freight
weight
Insurance
value
Duty 5%
value
Clearance
qty
Inland
qty
Handling
qty
Landed Unit rev 0 Unit rev 1 Δ unit Revalue COGS var
MSR31-0730049,800 4,7902482,490713300150 58,491191.16194.97+3.81830312
MSR31-0830049,800 4,7902482,490713300150 58,491191.16194.97+3.81860282
CDW01 residue48053,040 5,1092652,6521,144480240 62,930128.44131.10+2.67939342
MST-CRM-42-BLK120109,320 4,6845505,46728512060 120,486995.291,004.05+8.76893158
MIN-215920028,200 12,0661411,410475200100 42,592199.63212.96+13.331,853813
PP02908,460 798424232149045 10,072109.63111.91+2.2815550
ALM02907,236 638363612149045 8,62093.8895.78+1.9013536
XTRA-STRAP603,944 745191971426030 5,13782.5885.62+3.0315824
Component total1,640309,800 33,6201,54915,4903,9001,640820 366,819218.89223.67+4.785,8232,017
Allocation is lossless: every column sums to its component to the fils ✓ Δ totalAED 7,840
Read the Δ unit column against a quantity-only basis. INV1's cost_engine.allocate_receipt_costs spread every overhead by unit count, which would have given all eight lines the same +AED 4.78. i3's per-component basis gives MIN-2159 +13.33 because a canvas tote is 0.34 kg and takes 36% of the air freight on 12% of the units, and gives ALM02 +1.90. That difference flows straight into gross margin per SKU and into the reorder engine's cost input, so it is not a rounding preference.

Rounding residue is placed, not lost. Each line gets floor(amount x numerator / denominator); the remainder goes entirely to the single line with the largest basis numerator and that cell is outlined. Clearance carried AED 3 of residue to CDW01, insurance AED 4 and duty AED 1 to MST-CRM-42-BLK.

Cost components · every revision

append-only · nothing here is ever updated
RevComponentBasisStateAmount AEDSource documentBookedSupersedes
0FOBdirectactual309,800PI-87118-07 09:12 -
0Freight · airweightestimated26,400CIC std rate 139.3/kg18-07 09:12 -
0Insurancevalueactual1,549POL-2026-070818-07 09:12 -
0Duty 5.00%valueestimated15,490SDEC-2026-071218-07 09:12 -
0Clearancequantityestimated3,280broker quote18-07 09:12 -
0Inlandquantityactual1,640TRK-884118-07 09:12 -
0Handlingquantityactual820HQ_319 tariff18-07 09:12 -
1Freight · airweightactual33,620NS-INV-88301 (DHL)26-07 16:18#2 (est 26,400)
1Clearancequantityactual3,900Al Futtaim broker26-07 16:18#5 (est 3,280)
1Duty 5.00%valueactual15,490SDEC-2026-0712 final26-07 16:18#4 (est 15,490)
1FX variancevalueactual-473.6730 → 3.672526-07 16:18new
2Demurragequantitynot raised0no hold at DXB Air - -
The revision-0 rows are still here and still say AED 26,400. They were superseded, not corrected. That is ruling L4 applied to money: a posted number is evidence of what we believed at the time, and destroying it destroys the audit trail that explains the variance.

How a late freight invoice is handled

  1. At receipt, the layer is costed with whatever exists. Missing components are booked estimated from the supplier's standard rate and the open freight accrual. Stock is never received uncosted, because uncosted stock is exactly the i2 failure.
  2. When the actual lands, a new component row is inserted at revision + 1 with supersedes_id pointing at the estimate. The estimate is not deleted and not updated.
  3. The whole layer is reallocated at the new revision, per component, on its own basis. The per-line unit-cost delta falls out of the difference.
  4. A cost_ledger row is appended, split between revaluation of the units still on hand and COGS variance on the units already sold. No ledger_entries row is ever modified.
What this replaces. INV1's cost_engine.py did UPDATE receipt_lines SET unit_cost_aed = ... in place, which destroys the prior number with no trail. It also had zero callers and read a receipt_lines table that no migration ever created, so it never ran at all.
rev1 - rev0 = 7,840
on hand 1,228 u → revalue 5,823
sold    412 u → cogs var 2,017
5,823 + 2,017 = 7,840  CHECK

Documents

deduped on sha256 · a re-upload of the same file does not create a second row
Proforma invoice · PI-871.pdf
418 KB · 04-06
Packing list · PL-115-B2604.xlsx
31 KB · 02-07 · parsed, 24 cartons pre-created
Commercial invoice · CIC-INV-7712.pdf
276 KB · 08-07
Air waybill · DHL 4429118840
164 KB · 08-07 · 24 pieces
Certificate of origin · COO-CN-4471.pdf
92 KB · 13-07 · supplied to clear the hold
Insurance certificate · POL-2026-0708
58 KB · 08-07 · 100% of declared value
Customs entry · SDEC-2026-0712.pdf
204 KB · 12-07 · duty 15,490 · VAT 15,490
Freight invoice · NS-INV-88301
88 KB · 26-07 · triggered revision 1
Short-shipment claim · SC-2026-0041
44 KB · 18-07 · AED 32,200 FOB
Drop the broker invoice here
PDF, XLSX, PNG · max 20 MB

Receipts and QC

QPI quantity · price · invoice
GRN-2026-0718-115-1
18-07 09:12 · Ramesh K. · 23 of 24 pieces · 1,640 of 1,800 units · piece 14 (LBA01) never scanned at origin
1,640
units
QPI
Qty -160
QC-2026-0719-115
19-07 14:05 · Priya S. · 5-bucket: 1,628 accept · 12 reject_supplier · 0 reject_local · 0 repair_local · 0 repair_supplier
1,628
accepted
QPI
12 to RTS
The 12 rejected units keep the landed cost that was allocated to them and carry it into the RTS claim. They are not silently revalued to zero, and they are not left in stock value. The remaining 1,628 units absorb no part of the rejected units' cost, because the layer was allocated over the 1,640 received.

RFID encode batches

S01 · S02 · S05 detection
BatchSKUPO lineExpectedEncodedDamagedOutcomeStation
ENC-2026-0718-11MSR31-07#13003000S01 matchedZT411R WH-319
ENC-2026-0718-12CDW01#34804782S04 damage at intakeZT411R WH-319
ENC-2026-0718-13LBA01#416000S05 short receiptnot started
Expected quantity is read from purchase_order_lines.qty_confirmed and inbound_shipment_lines.qty_shipped, so short, excess and wrong-SKU are computed rather than typed. rfid-app models S05, S06 and S07 as MISSING today because inflow_rfid_sessions.po_reference is a bare VARCHAR(50) with no foreign key. i3's encode batch carries po_line_id and receipt_line_id as real FKs (ruling L5).

Ledger rows this PO produced

9 quantity rows · 2 cost rows · hash chain verified 29-07 05:02 zero updates, zero deletes
WhenSource typeLocationStock typeΔ qtyBalance afterΔ value AEDIdempotency keyHash
12-06 08:14production_startHQ_319IN_PRODUCTION+1,8001,8000i3:prod-mile:PRD-2026-0412:materialsa41f9c…
08-07 19:04pi_shippedHQ_319IN_PRODUCTION-1,80000i3:pi-ship:INB-2026-0708-002:871-17b02e4…
08-07 19:04pi_shippedHQ_319GIT_INBOUND+1,8001,8000i3:pi-ship:INB-2026-0708-002:871-2c19d80…
18-07 09:12grn_receiptHQ_319GIT_INBOUND-1,6401600i3:grn:GRN-2026-0718-115-1:out2ee5a7…
18-07 09:12grn_receiptHQ_319RECEIVED_NOT_INVOICED+1,6401,6400i3:grn:GRN-2026-0718-115-1:in90b3f1…
18-07 09:40short_receiptHQ_319GIT_INBOUND-16000i3:short:GRN-2026-0718-115-1:pol-4:out55c0ab…
18-07 09:40short_receiptHQ_319LOST_IN_TRANSIT+1601600i3:short:GRN-2026-0718-115-1:pol-4:ine7f224…
19-07 14:05qc_reject_supplierHQ_319RECEIVED_NOT_INVOICED-121,6280i3:qc:QC-2026-0719-115:rej:out3a91cd…
19-07 14:05qc_reject_supplierHQ_319QUARANTINE+12120i3:qc:QC-2026-0719-115:rej:indf6018…
22-07 11:00invoice_bookedHQ_319RECEIVED_NOT_INVOICED-1,62800i3:inv-book:NS-INV-88214:outb8420e…
22-07 11:00invoice_bookedHQ_319STOCK+1,6281,6280i3:inv-book:NS-INV-88214:in14ac7d…
18-07 09:12cost_ledger · initialHQ_319RECEIVED_NOT_INVOICED0n/a+358,979i3:cost:CL-2026-0718-0044:r06c1e93…
26-07 16:18cost_ledger · cost_revisionHQ_319STOCK0n/a+7,840i3:cost:CL-2026-0718-0044:r1f0d5b2…
Why cost rows live in a second journal. The v2 PRD constrains inventory_ledger.quantity_delta to be non-zero, and a cost revision moves value with zero quantity. Rather than weaken that constraint for every module, i3 keeps quantity in ledger_entries and value in cost_ledger, hash-chained the same way and reconciled against it nightly. This is open question Q-05.1 in the module spec and needs a lead ruling.

Note that the eleven quantity rows sum to zero across the two supplier-side stock types: IN_PRODUCTION opened 1,800 and closed 0, GIT_INBOUND opened 1,800 and closed 0. That is acceptance criterion AC-05.2 and AC-05.3 satisfied for this PO. Nothing was stranded in transit.

Connected to

All POs → Production → Goods in transit → Shipment register → GRN + QC → GRN events → Supplier detail → Return to supplier → Cartons → RFID unit events → SKU detail → Cost + price → Cash + valuation → Corrections → Audit log → Reports →