Sample output from the Procure-to-Pay Object-Centric Process Mining prompt in the Sonar AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library

Procure-to-Pay: Object-Centric Process Mining Analysis

NetSuite account TD3016323 (production, OneWorld, USD) · Scope: all history, 2024-10-01 to 2026-09-30 by transaction date · Prepared 2026-09-04 · Revision 1 · Method: SuiteQL via sqlReduce — transactionline streamed by keyset on uniquekey; nexttransactionlinelink and headers materialised · Companion to the Order-to-Cash study of the same date · Document numbers link to the source record when opened inside NetSuite
  1. 0Executive summary
  2. 1Method, lineage and assumptions
  3. 2Event log
  4. 3Structure
  5. 4Process model
  6. 5Variants and timing
  7. 6Bottlenecks and payment timing
  8. 7Conformance and three-way match
  9. 8Exception registers
  10. 9Data quality
  11. 10Findings and recommended actions
  12. AAppendix A — SuiteQL used
  13. BAppendix B — Reducer logic
  14. CAppendix C — Worked hand-check
  15. DAppendix D — Glossaries
  16. EAppendix E — Run metadata

0Executive summary

3,492
Documents = events = objects across six types
1,053
Connected components (end-to-end cases)
98.4%
Components conforming to the reference models
705 / 705
PO-backed bills matching PO value to the cent

The account's purchase-to-pay flow is disciplined where a purchase order exists. Every PO maps to at most one receipt and one bill; 698 of 740 POs run the complete Order Placed → Received → Billed → Paid chain in a median of four days; every one of the 705 billed POs matches its bill total exactly; and the single voided payment was reversed and re-issued the same day. Unlike the sales side there is one genuine consolidation — a single payment covering seven bills — and a bill-from-receipt path used 19 times, so the perspectives do diverge and the divergences are explained in §4.

The exposure sits outside the PO-controlled flow and in payment timing:

  1. The account pays a median 28 days before due. 994 of 1,004 bill→payment pairs (99.0%) were settled early; the typical bill is paid three days after it is entered against 30-day terms. On roughly $1.7M of annual bill volume that is ~$130K of working capital permanently surrendered (§6). Only one episode of late payment exists — and it is the same vendor cluster as finding 3.
  2. 44% of bill value bypasses purchase orders. 312 non-PO bills carry $1,489,907.21 of $3,402,733.23; 288 of them are a twice-monthly card-memo cadence from six vendors, but the remainder includes the two largest open payables in the account — Davidson Leasing $120,000.00 and Cloud Consulting $52,550.00 — with no PO, receipt or approval trail. Non-PO bills are 99% of open payables ($182,548 of $184,048).
  3. One vendor is the sandbox for every P2P edge case. Generation N accounts for the 7-bill consolidated payment (bills 95–330 days late at settlement), the voided payment, all four vendor returns, both bill credits, the prepayment, seven of fourteen POs pending receipt and the account's longest case (345 days). Separately, 19 POs are received-not-billed — $29,706.97 of accrual exposure, oldest 85 days — and two POs show received quantity with no receipt document.

1Method, lineage and assumptions

Figure 1 — Row funnel. Nothing is lost between mainline rows and objects; the reduction from 3,492 to 1,053 is the linking itself.

StageCountNote
transactionline rows streamed29,7866 keyset pages on uniquekey, 2.2–2.9 s per pass, peak held ≈ 1 page + headers
Mainline rows (one per document)3,492Equals header count — no document dropped
createdfrom candidates → used1,440 → 1,4328 dropped: target outside the six types (transfer orders, sales orders on drop-ship POs, requisitions)
nexttransactionlinelink raw in-scope rows → distinct pairs16,275 → 2,458PO→receipt 7,695 → 722; PO→bill 7,491 → 705 (multi-line POs, median 8 lines); receipt→bill 66 → 19
Distinct edges after merging both sources2,458PO→IR 722 · PO→VB 705 · VB→VP 1,005 · IR→VB 19 · PO→VRMA 4 · VRMA→VC 1 · VB→VC 1 · VB→IR 1
Events / objects3,492 / 3,492One event per document; payments inherit PO objects through their bills; the voided payment is its own activity
Connected components1,053Union-find over 2,458 edges
PO child lines streamed (three-way match)7,7212 pages; 740 POs; 1–29 lines each

Assumptions register

#AssumptionEffect
A1Scope is all history (740 POs, 1,017 bills — too few to trim); window on trandate.~170 future-dated documents retained (§9).
A2One event per document; activity = type: PurchOrd → Order Placed, ItemRcpt → Received, VendBill → Billed, VendPymt → Paid (status V → Paid (voided)), VendAuth → Return Authorised, VendCred → Credited.Approval, pick-up and putaway are not activities.
A3Timestamp = trandate, day resolution.All durations in whole days; same-day chains have cycle 0.
A4Same-day tie-break: Order Placed < Received < Billed < Paid < Return Authorised < Credited, then internal id.Same-day bill-before-receipt is undetectable.
A5Links = distinct nexttransactionlinelink pairs ∪ transactionline.createdfrom on the mainline row.2,458 edges; reachability per source in §2.
A6A payment inherits PO objects through its bill(s); a bill inherits receipt objects via BillRcpt when present.Payment perspective includes Order Placed and Received.
A7Case = connected component.Unlinked documents are size-1 components and counted.
A8Two reference models: PO-backed — one Order Placed, then Received and Billed in either order (Received first expected), then one Paid, nothing after; non-PO — Billed → Paid. Open prefixes conforming.Returns, credits, voids, multiple bills or payments per PO are deviations and are each explained.
A9Three-way match at PO line level: quantity vs quantityshiprecv vs quantitybilled; header amount match = Σ OrdBill bills vs PO foreigntotal.Lines classified full / received-not-billed / billed-not-received / open / over / partial.
A10Payment timing measured two ways: bill date → payment date, and payment date − bill duedate (negative = early).Early-payment cost estimated as annual bill value × median early days ÷ 365.
A11Out of scope: cash-sale deposits, expense reports, journals, checks, requisitions, landed cost. Receipts from transfer orders and return authorisations are traced and excluded.3 payments and 5 receipts appear unlinked for this reason (§8-F).
A12Percentiles exact (whole arrays in the Worker).No reservoir estimates.
A13Amounts = ABS(foreigntotal) (vendor bills are negative in NetSuite); status labels live via BUILTIN.DF.PurchOrd G = "Fully Billed", F = "Pending Bill", B = "Pending Receipt".
A14Bills with NULL tranid (999 of 1,017) are shown as #<internal id>.Document numbering is itself a §9 finding.

2Event log

Object typeObjectsBoth sourcesntll onlycreatedfrom onlyUnreachedUnreached examples
Purchase order (PurchOrd)740root object18 with no downstreamPO314 2026-09-08 · PO364 2026-09-01 (both Pending Receipt)
Item receipt (ItemRcpt)727722005IR311 2026-08-26 · IR317 2026-09-12 — transfer orders / RMAs (§8-F)
Vendor bill (VendBill)1,01770500312#27120 2026-09-03 $120,000 · VB2 2026-06-01 $350 "Quarterly Postage Meter Rental"
Vendor payment (VendPymt)1,002099903167 2026-09-08 $59.98 · 362 2026-09-24 $80.00
Return authorisation (VendAuth)44000—
Bill credit (VendCred)210014433911592582809 2026-09-24 $29.99

As on the sales side, the two link sources agree completely where both apply: all 1,432 PO→receipt and PO→bill edges are present in both. Bill→payment (1,005) and receipt→bill (19, linktype BillRcpt) exist only in nexttransactionlinelink. Example edges: PO1202 2026-09-17 → IR1211 2026-09-18 [ShipRcpt + createdfrom]; PO1204 2026-09-03 → #42202 2026-09-05 [OrdBill + createdfrom]. Example events: Order Placed PO388 2026-06-01; Billed #31726 2026-06-01 (objects: bill, PO388, IR406).

3Structure

Multiplicity012+Example
Receipts per PO1872200: PO314 2026-09-08 $59.98 · PO395 2026-06-01 $6,110.00
Bills per PO3570500: PO1018 2026-06-11 received IR1163, unbilled 85 days
POs per bill31270500: #27120 Davidson Leasing $120,000 · VB843 Cloud Consulting $52,550
Receipts directly linked to bill (BillRcpt)9981901: IR1174 2026-08-15 → #40098 2026-08-16
Payments per bill (non-voided)131,00400: #27120 · VB843 (both open)
Bills per payment39971 (×7)7: #42228 2026-09-07 $341,743.03 ← VB01, VB02, VB03, VB04, VB06, VB07, VB08
POs per payment29770400: the 291 non-PO bill payments + 3 unlinked + 3 other

Component sizes: 1 doc 39 · 2 docs 307 · 3 docs 2 · 4 docs 702 · 5 docs 1 · 6 docs 1 · 14 docs 1. Strict 1:1:1:1 chains: 704 of 740 POs (95.1%). Lines per PO: median 8, P90 20, max 29.

The PO-controlled flow is effectively 1:1 — no partial receipts, no split bills, no PO billed twice. But the account is not purely 1:1: one consolidated payment settles seven bills (and applies a credit), and a bill-from-receipt path exists for 19 POs. The payment perspective therefore legitimately sees Billed → Billed transitions and one 8-event trace that the PO perspective does not. The dominant second population — 307 two-document components — is the non-PO Billed → Paid flow, which has no PO to anchor it and is analysed against its own reference model.

4Process model

Figure 2 — Directly-follows graph across all 1,053 components. Labels: count · median wait. Main PO path in emerald; the non-PO Billed → Paid entry (291) is drawn as a second start. Grey arcs are the minority routes. Return / credit / void edges (≤ 2 each) are listed in the table.

TransitionPurchOrd lifecyclesVendBill lifecyclesItemRcpt lifecyclesReading
Order Placed → Received719——Main path
Received → Billed702119Main path; 19 receipt lifecycles carry it via BillRcpt
Billed → Paid7001,002—302 bill lifecycles carry it without a PO
Order Placed → Billed3——Billed before received (2) + PO626 date anomaly
Billed → Received2——PO1192, PO1204 — receipt one day after bill
Billed → Return Authorised / Return Authorised → Paid2 / 2——PO1155, PO1158 (Generation N)
Received → Return Authorised / RA → RA1 / 1——PO1156: VRMA22 then VRMA23, 8 days apart
Received → Order Placed1——IR684 2026-01-08 precedes PO626 2026-02-08 (31 days)
Billed → Paid (voided) → Paid—1 / 1—VB05: void and re-issue same day
Billed → Credited → Paid—1 / 1—#40098 → VRMA20 credit → applied in #42228

Lifecycle lengths: PurchOrd 4 events 703 · 1 event 18 · 2 events 16 · 5 events 2 · 3 events 1; VendBill 2 events 1,001 · 1 event 13 · 3 events 3; ItemRcpt 1 event 708 · 2 events 19; VendPymt all single. Convergence = 1 on every transition: no single event touches two objects of the same type, even in the consolidated payment (it touches seven bills but each bill is one object of type VendBill per edge).

PO perspective versus payment perspective

TransitionPO viewmed / P90 / maxPayment viewmed / P90 / max
Billed → Paid7003 / 3 / 149963 / 3 / 110
Order Placed → Received7190 / 0 / 27010 / 0 / 2
Received → Billed7021 / 1 / 37011 / 1 / 3
Billed → Billed——629.5 / 60.5 / 64
Trace startsOrder Placed 739 · Received 1Order Placed 703 · Billed 295 · Paid 3 · Received 1
Trace endsPaid 704 · Order Placed 18 · Received 16 · Return Authorised 1 · Billed 1Paid 1,001 · Paid (voided) 1
Trace lengths1: 18 · 2: 16 · 3: 1 · 4: 703 · 5: 21: 3 · 2: 294 · 4: 704 · 8: 1

Three divergences, each structural. (1) The payment view has 296 more Billed → Paid transitions and a 110-day maximum: these are the non-PO bills, invisible from any PO. (2) The payment view alone contains Billed → Billed (6) and an 8-event trace — that is the consolidated payment #42228 walking VB01 → VB02 → … → VB08 in one case; the PO view sees none of it because those bills have no PO. (3) The PO view has 36 traces ending before payment (18 unreceived, 16 received-not-billed, 1 in return, 1 billed-unpaid) that the payment view cannot see. No divergence involves partial receipt or split billing; §3 rules those out.

5Variants and timing

Component-level variants; cycle = first to last event, whole days; percentiles exact (A12). Sixteen distinct variants; the top twelve cover 1,049 of 1,053.

Figure 3 — Components by variant, log-scaled bars, exact counts printed.

#VariantCountMedianP90MaxExamples (raw dates)
1Order Placed → Received → Billed → Paid6984414PO388 2026-06-01 → IR406 06-01 → #31726 06-01 → 539 2026-06-15
PO389 2026-07-01 → IR407 07-01 → #31730 07-01 → 540 2026-07-15
2Billed → Paid (non-PO)2910017VB2 2026-06-01 → 1 2026-06-01 · #206 2026-08-01 → 360 2026-08-03
3Order Placed (only)18000PO314 2026-09-08 · PO364 2026-09-01
4Order Placed → Received16000PO1055 2026-08-18 → IR1156 08-18 · PO1073 2026-09-21 → IR1157 09-21
5Billed (only)12000#26022 2026-09-13 · #26042 2026-09-15
6Received (only)5000IR311 2026-08-26 · IR317 2026-09-12
7Paid (only)3000167 2026-09-08 · 362 2026-09-24
8Order Placed → Billed → Received → Paid2444PO1204 09-03 → #42202 09-05 → IR1217 09-06 → 1179 09-07
PO1192 09-12 → #42167 09-14 → IR1213 09-15 → 1167 09-16
9Credited (only)10004433911592582809 2026-09-24
10Received → Order Placed → Billed → Paid1353535IR684 2026-01-08 → PO626 02-08 → #33413 02-09 → 241 2026-02-12
11Order Placed → Received → Billed → Return Authorised → Paid1444PO1155 08-01 → IR1172 → #40097 08-02 → VRMA21 08-03 → #40099 08-05
12Order Placed → Received → Return Authorised → Return Authorised1999PO1156 09-01 → IR1173 → VRMA22 09-02 → VRMA23 09-10

Remaining four (one each): the 14-event Generation N case anchored on PO1158 (345 days; §8-E); PO1162 with two bills and two payments; VB05 Billed → Paid (voided) → Paid; and one Order Placed → Billed with no receipt or payment.

Monthly volume

Figure 4 — Documents per month by transaction date. The PO/receipt line runs at a flat 18 a month with quarterly spikes (Apr, Jul, Nov) and a step-up from June 2026; bills run at 30 a month — the 12-a-month surplus is the recurring non-PO cadence. September 2026 payment value ($538K) includes the $341,743 consolidated payment.

Monthly table
MonthPOsReceiptsBillsPaymentsPO valueBill valuePaid value

6Bottlenecks and payment timing

TransitionCountMedianP90MaxSame-dayExamples
Billed → Paid991331730.5%VB2 06-01 → 1 06-01 (0d) · #206 08-01 → 360 08-03 (2d)
Order Placed → Received71900297.8%PO388 06-01 → IR406 06-01 · PO389 07-01 → IR407 07-01
Received → Billed70211313.0%IR406 06-01 → #31726 06-01 · IR407 07-01 → #31730 07-01
Billed → Billed72959.8640%VB01 2025-09-27 → VB02 2025-11-30 (64d) · PO1162 07-01 → #41129 07-03 (2d)
Order Placed → Billed32220%PO626 02-08 → #33413 02-09 · PO1204 09-03 → #42202 09-05
Paid → Paid29.517.11950%#41130 07-04 → 1154 07-04 · 00000002/1 08-19 → #42228 09-07 (19d)
Billed → Received21110%#42202 09-05 → IR1217 09-06 · #42167 09-14 → IR1213 09-15
Billed → Return Authorised20.50.9150%#40097 08-02 → VRMA21 08-03 · #40098 08-16 → VRMA20 08-16

The PO flow has no bottleneck: receipt on the order day, bill the next day, payment three days later. The waiting time worth managing is not a delay — it is the opposite.

Payment timing against due date

Figure 5 — 1,004 non-voided bill→payment pairs by days between payment date and bill due date. Negative = paid early.

Relative to due datePairsShare
More than 30 days early999.9%
8–30 days early89589.1%
1–7 days early00%
On due date10.1%
1–7 days late20.2%
More than 30 days late70.7%
Total · median −28 days · P90 −141,004100%

994 of 1,004 payments (99.0%) were made before the due date, a median of 28 days early; bill-to-payment is a median of 3 days (30% same day) against what are evidently 30-day terms. Example: #40503 due 2024-12-03 paid by 1010 on 2024-11-01 (−32 days); #40505 due 2025-02-01 paid by 1012 on 2025-01-01 (−31). The only late payments are #206 (Cloud Consulting, +2 days) and the seven Generation N bills settled by #42228 at 95–330 days past due (§8-E). Working-capital estimate: bill value over the 24-month window is $3.40M ≈ $1.70M a year; paying a median 28 days early holds ≈ $1.70M × 28 ÷ 365 ≈ $130K permanently ahead of terms. If no early-payment discount is being captured, that is float given away.

Ten slowest components

ComponentCycle daysLongest waitNote
PO1158 (Generation N, 14 docs)345Billed VB08 2026-05-20 → Order Placed PO1158 2026-08-15 (87d)VB01–VB08 non-PO bills joined to PO1158 by the consolidated payment #42228; §8-E
PO62635Received IR684 2026-01-08 → Order Placed PO626 2026-02-08 (31d)Receipt dated before its PO — date integrity
LP- interco alloc 317Billed 2026-09-10 → Paid 370 2026-09-27 (17d)Flexsteel intercompany allocation bill
PO388 · PO389 · PO39014Billed → Paid 14d on each (e.g. #31726 06-01 → 539 06-15)The only PO chains paid on a 14-day cycle rather than 3
PO11569VRMA22 09-02 → VRMA23 09-10 (8d)Two return authorisations, no bill
PO10748Billed #39249 09-25 → Paid 332 09-30 (5d)
PO1059 · PO10607Billed → Paid 4d

7Conformance and three-way match

Figure 6 — 1,053 components by conformance outcome against the two reference models (A8).

OutcomeComponentsShare
PO-backed, complete and conforming69866.3%
PO-backed, conforming open prefix (18 ordered · 16 received · 1 billed)353.3%
Non-PO, complete (Billed → Paid)29127.6%
Non-PO, open (Billed only)121.1%
Deviant171.6%
Conforming share1,036 of 1,05398.4%

Deviation patterns (all 17)

PatternCountRoot causeExamples
Unlinked receipt5Receipts of transfer orders / return authorisations — out of P2P scope (§8-F)IR311 2026-08-26 · IR317 2026-09-12
Unlinked payment31 expense-report payment, 1 journal-sourced, 1 genuinely unlinked362 2026-09-24 $80 "Meal Allowance" · 167 2026-09-08 $59.98 "Vendor Returns - LP"
Billed before received2Bill entered one day before the receipt; both paid within 4 daysPO1204: #42202 09-05, IR1217 09-06 · PO1192: #42167 09-14, IR1213 09-15
Return / credit present2Vendor returns on PO1155, PO1156 (Generation N)PO1155 → VRMA21 Pending Credit · PO1156 → VRMA22, VRMA23
Multiple bills for one PO1PO1162 billed twice (a bill carrying the PO's own number, then #41129), paid twicePO1162 07-01 → IR1182 → PO1162 (bill) 07-01 → #41129 07-03 → #41130 · 1154 07-04
Voided payment present1Payment voided and re-issued same day — the control worked; no recovery dueVB05 02-28 → 00000005/1-12102024-181841 (voided) 03-01 → 00000005/1 03-01
Receipt before PO1Date integrityIR684 2026-01-08 → PO626 2026-02-08
PO not first (starts with Billed)1Seven non-PO bills joined to PO1158's chain by consolidated payment #42228VB01 2025-09-27 … VB08 → PO1158 2026-08-15 → … → #42228 2026-09-07
Unlinked credit1Bill credit applied to nothing4433911592582809 2026-09-24 $29.99

Three-way match at PO line level

Figure 7 — 7,721 PO lines classified by ordered / received / billed quantity.

Line classLinesPOsExamples
Fully received and fully billed7,491705PO388 uk443460 item 17518 qty 1 / 1 / 1 @ 2,000.00
Received, not billed20719PO1018 uk496538 item 80 qty 15 / 15 / 0 @ 30.00 · PO383 uk403615 item 42 qty 1 / 1 / 0 @ 167.50
Open — nothing received or billed2316PO314 uk257131 item 115 qty 2 / 0 / 0 @ 29.99
Billed, not received · over-billed · over-received · partial · closed short00None
Header amount match (Σ bills vs PO total)705 exact · 0 within 1% · 0 varianceEvery billed PO reconciles to the cent
Received-not-billed — 19 POs, $29,706.97, flagged separately
The only three-way-match exposure is goods received with no vendor bill. Nineteen POs in status Pending Bill hold 207 lines received in full and billed at zero — $29,706.97 of un-invoiced receipts that belong in the period-end GR/IR accrual. Oldest: PO1018 (Lotion Co, $5,140.00, received IR1163 2026-06-11, 85 days). Two of the nineteen — PO383 and PO1174, both Flexsteel — show received quantity on their lines but have no item receipt document linked; that is a data-integrity item, not a process step (§8-C).

8Exception registers

Complete lists. Sortable. Amounts USD (absolute). Ages as at 2026-09-04; negative = future-dated.

8-A · Open vendor bills (13) — $184,048.00

BillIdDateDueStatusVendorTotalUnpaidDays past duePOMemo
#27120271202026-09-032026-10-02OpenDavidson Leasing120,000.00120,000.00-28—
VB843317062026-09-032026-10-02OpenCloud Consulting52,550.0052,550.00-28—
VB397278592026-09-012026-09-30OpenGeneration N2,995.002,995.00-26—4433911592582809
INV-005422662026-09-112026-09-11Pending ApprovalAd4tech Material LLC1,564.001,564.00-7—Vendor bill from Ad4tech Material LLC - INV-005
VB385271092026-08-312026-09-30OpenWitt & Anderson1,500.001,500.00-26—For Allocation Schedule
#41773417732026-07-012026-07-31Pending ApprovalBedline1,500.001,500.0035PO1173Only PO-backed open bill; 35 days past due in approval
LP- interco alloc 2286682026-08-102026-08-25OpenFlexsteel1,000.001,000.0010—4434236567426894
#26022260222026-09-132026-09-13OpenWell1,000.001,000.00-9—
LP- interco alloc286662026-07-092026-07-24OpenFlexsteel1,000.001,000.0042—4434236567426894
VB842317052026-09-012026-09-30OpenCloud Consulting500.00500.00-26—
#26043260432026-09-152026-09-15OpenCable Plus Distributors389.00389.00-11—
#26042260422026-09-152026-09-15Pending ApprovalLotion Co30.0030.00-11—
#26044260442026-09-152026-10-15Pending ApprovalHarris Technology20.0020.00-41—
13 bills · 12 non-PO ($182,548.00) · 1 PO-backed ($1,500.00) · 4 Pending Approval184,048.00184,048.00

8-B · Non-PO bills by vendor (312 bills, $1,489,907.21)

VendorBillsTotalUnpaidFirstLastPattern
FrisCo US48476,235.000.002024-10-012026-09-01Twice-monthly, card-number memo
Generation N9378,528.002,995.002025-09-272026-09-01VB01–VB08 consolidated (§8-E) + VB397
Dell US48194,147.040.002024-10-012026-09-01Twice-monthly, card-number memo
Brocade Communications Systems US48161,788.880.002024-10-012026-09-01Twice-monthly, card-number memo
Davidson Leasing1120,000.00120,000.002026-09-032026-09-03Single open bill, no PO, no memo
Staples US4864,406.280.002024-10-012026-09-01Twice-monthly, card-number memo
Cloud Consulting353,550.0053,050.002026-08-012026-09-03Training fee; two open
XCOM US4819,413.130.002024-10-012026-09-01Twice-monthly, card-number memo
CDW US4813,865.880.002024-10-012026-09-01Twice-monthly, card-number memo
Flexsteel33,000.002,000.002026-07-092026-09-10Intercompany allocation bills
Ad4tech Material LLC11,564.001,564.002026-09-112026-09-11Pending Approval
Witt & Anderson11,500.001,500.002026-08-312026-08-31Allocation schedule
Well11,000.001,000.002026-09-132026-09-13
Cable Plus Distributors1389.00389.002026-09-152026-09-15
EFX Imports1350.000.002026-06-012026-06-01Postage meter rental
Evolve Transport Services1120.000.002026-07-012026-07-01
Lotion Co130.0030.002026-09-152026-09-15Pending Approval
Harris Technology120.0020.002026-09-152026-09-15Pending Approval
18 vendors · 288 recurring (6 vendors × 48) = $929,856.21 · 24 non-recurring = $560,051.003121,489,907.21182,548.0043.8% of all bill value; PO-backed bills = 705, $1,912,826.02

8-C · Received, not billed (19 POs, $29,706.97)

POIdDateVendorTotalAge daysReceiptNote
PO1018387392026-06-11Lotion Co5,140.0085IR1163 2026-06-11Oldest
PO1053387742026-08-14Lotion Co4,955.0021IR1166 2026-08-14
PO1102388232026-07-02Bedline4,357.5064IR1158 2026-07-02
PO1048387692026-08-07Mac Oca & Co.3,540.0028IR1164 2026-08-07
PO1055387762026-08-18The Apparel Co Inc.2,469.6017IR1156 2026-08-18
PO1154388752026-09-19The Apparel Co Inc.2,091.98-15IR1162 2026-09-19
PO1153388742026-09-18The Apparel Co Inc.1,481.98-14IR1161 2026-09-18
PO1073387942026-09-21The Apparel Co Inc.1,454.60-17IR1157 2026-09-21
PO1080388012026-08-16Mac Oca & Co.790.0019IR1165 2026-08-16
PO1081388022026-09-11Mac Oca & Co.790.00-7IR1167 2026-09-11
PO1121388422026-08-04Mac Oca & Co.636.0031IR1168 2026-08-04
PO1151388722026-09-16The Apparel Co Inc.396.96-12IR1159 2026-09-16
PO383288752026-09-06Flexsteel335.00-2noneLines show qty received 2 of 2, no receipt document
PO1156400882026-09-01Generation N299.903IR1173 2026-09-01In return (VRMA22, VRMA23)
PO1152388732026-09-17The Apparel Co Inc.279.96-13IR1160 2026-09-17
PO1143388642026-09-08Betty Black, Inc.266.00-4IR1169 2026-09-08
PO1206422182026-08-19Core4Solutions225.0016IR1219 2026-08-19
PO1174417852026-08-01Flexsteel167.5034noneLines show qty received, no receipt document
PO1181420302026-09-09China Manufacturer29.99-5IR1200 2026-09-09
19 POs · 207 lines · The Apparel Co 6 ($8,175.08) · Mac Oca 4 ($5,756.00) · Lotion Co 2 ($10,095.00)29,706.97Equals the line-level (received − billed) × rate exposure to the cent

8-D · POs with no receipt (18, $11,900.61)

POIdDateStatusVendorTotalAge daysMemo
PO395318452026-06-01Pending ReceiptJohnson Supply6,110.0095Oldest and largest
PO1175417942026-06-01Pending ReceiptGeneration N37.0095
PO1177417962026-07-01Pending ReceiptGeneration N299.9965
PO1174417852026-08-01Pending BillFlexsteel167.5034See 8-C
PO1171417652026-08-25Pending Supervisor ApprovalChina Manufacturer750.0010
PO391318362026-09-01Pending Supervisor ApprovalCrown Equipment Corporation1,300.003LP - Purchase Request
PO1176417952026-09-01Pending ReceiptGeneration N37.003
PO364270912026-09-01Pending ReceiptGeneration N89.973
PO383288752026-09-06Pending BillFlexsteel335.00-2See 8-C
PO314241452026-09-08Pending ReceiptGeneration N59.98-4
PO1157400892026-09-15Pending ReceiptGeneration N149.95-11DIG - P2P
PO1186420472026-09-15Pending ReceiptJohnson Supply224.50-11
PO1178418032026-09-20Pending ReceiptGeneration N149.95-16Control Tower DB
PO374279772026-09-25Pending ReceiptInterco Vendor US1 - US229.99-21Intercompany
PO375280842026-09-25Pending ReceiptInterco Vendor US2 - US129.99-21Intercompany
PO394318402026-09-27Pending ReceiptGeneration N329.89-23LP - Adv Proc - Purchase Req
PO1183420442026-09-27Pending ReceiptGeneration N299.90-23
PO1187420482026-09-30Pending ReceiptBedline1,500.00-26
18 POs · 14 Pending Receipt · 2 Pending Supervisor Approval · 2 Pending Bill without receipt document11,900.61Generation N 9 of 18

8-E · The Generation N cluster

DocumentDateStatusAmountRole in the process
VB01 · VB02 · VB03 · VB04 · VB06 · VB07 · VB082025-09-27 → 2026-05-20Paid In Full341,833.00Seven non-PO bills (memo 0722407033737), due 2025-10-12 → 2026-06-04, left open 95–330 days
VB052026-02-28Paid In Full33,700.00Paid by 00000005/1-12102024-181841 on 2026-03-01, voided, re-paid by 00000005/1 same day — near-miss, control worked
PO1158 → IR1174 → #400982026-08-15 / 08-15 / 08-16Fully Billed—PO received and billed next day via BillRcpt
VRMA20 → bill credit VRMA202026-08-16Credited89.97Return authorised and credited same day; credit applied inside #42228
#422282026-09-07Bill Payment341,743.03= 341,833.00 (seven bills) − 89.97 (VRMA20 credit). The one consolidated payment in the account; reconciles to the cent
VRMA212026-08-03Pending Credit149.95Return on PO1155 — credit agreed, never received (32 days)
VRMA22 · VRMA232026-09-02 · 09-10Pending Return · Pending Approval119.96 · 29.99Two returns on PO1156, goods not yet shipped back
Bill credit 44339115925828092026-09-24Open29.99Credit received, applied to nothing
Prepayment 3542026-09-24Paid99.97Prepayment not offset against any bill
Payment 1672026-09-08Deposited59.98Linked to nothing; memo "Vendor Returns - LP"; PO314 ($59.98, same vendor) is Pending Receipt
VB3972026-09-01Open2,995.00Open non-PO bill
PO314 · PO364 · PO1157 · PO1175 · PO1176 · PO1177 · PO1178 · PO1183 · PO3942026-06 → 2026-09Pending Receipt1,453.63Nine of the fourteen unreceived POs

One vendor carries every P2P edge case in the account: the only consolidated payment, the only late payments, the only void, all returns, both credits, the prepayment and the longest case. Whether Generation N is a real supplier relationship in distress or the demonstration vendor for procurement scenarios, it warrants one consolidated review rather than eleven tickets.

8-F · Unlinked documents traced to source

DocumentDateAmountSourceDisposition
IR311 · IR317 + 3 more receipts2026-08 / 09—Transfer orders (3), return authorisations (2)Out of P2P scope
Payment 3622026-09-2480.00Expense report ("Meal Allowance")Out of scope
Payment (journal-sourced)——Journal → VendPymt linkOut of scope
Payment 1672026-09-0859.98NoneGenuinely unlinked — §8-E
Bill credit 44339115925828092026-09-2429.99NoneUnapplied — §8-E

9Data quality — what limits the analysis

LimitationEvidenceWhat it prevents
Day-level datestrandate carries no time componentSame-day order/receipt/bill sequences (97.8% of PO→receipt) rely on the assumed rank (A4); same-day bill-before-receipt undetectable.
Bills without document numbers999 of 1,017 vendor bills have NULL tranid; two payments share number 167 and two share 362Bills cannot be cited by number; the vendor's invoice number is not captured for 98% of bills, so duplicate-invoice detection by reference is impossible.
No approval eventsStatus-change system notes on 7 bills, 0 POs; 4 bills and 2 POs currently pending approvalApproval lead time unmeasurable; #41773 (Bedline, $1,500) has sat in Pending Approval 35 days past its due date with no timestamp for when it entered.
Received quantity without receipt documentPO383 and PO1174 lines show quantityshiprecv > 0 with no ItemRcpt linkedThree-way match passes on quantity but the receiving evidence is absent; likely a direct edit or an import.
Demo-load dating~172 documents dated after 2026-09-04 (PO 46, VP 44, VB 42, IR 40); IR684 precedes PO626 by 31 daysAges for recent items unreliable; one receipt-before-order case is dating, not process.
Recurring bills via card memo288 bills from 6 vendors carry a 16-digit card-number-like memoSpend category and contract cannot be inferred from the bill; whether these are card statements or supplier invoices is undeterminable from the record.
Prepayments and credits not linked to billsVPrep 354 and bill credit 4433911592582809 have zero linksCannot tell whether they are awaiting application or forgotten.
Synthetic GL journalsMonthly "Beg Balance" journals JE102–JE149 (not in scope)Any reconciliation to GL AP or expense must exclude them.

10Findings and recommended actions

  1. Move the payment run to due dates. 994 of 1,004 payments were early, a median of 28 days ahead of terms; only three PO chains (PO388, PO389, PO390) were paid on a 14-day cycle and none on a 30-day one. At ≈ $1.70M of annual bill value that is ≈ $130K of cash permanently surrendered (§6 formula). Either confirm an early-payment discount is being taken on the recurring vendors (FrisCo, Dell, Brocade, Staples, XCOM, CDW — 288 bills) or schedule payment for due date − 2. Exception: the seven Generation N bills settled 95–330 days late by #42228 show the opposite failure and need a vendor-level explanation.
  2. Bring non-PO spend under control documents. $1,489,907.21 (43.8%) of bill value has no purchase order, and 99% of open payables — Davidson Leasing $120,000.00 (#27120, due 2026-10-02), Cloud Consulting $52,550.00 (VB843) and $500.00 (VB842) — is non-PO with no receipt or approval evidence. Put the six recurring vendors on blanket POs or vendor contracts so their 288 bills match automatically; require a PO or an approval record above a threshold for the rest. Clear the four bills in Pending Approval, starting with #41773 (Bedline, 35 days past due).
  3. Book the GR/IR accrual and run one Generation N review. 19 POs hold $29,706.97 of goods received but unbilled (§8-C; oldest PO1018, 85 days; The Apparel Co and Mac Oca & Co. account for ten) — chase the vendor invoices or accrue at period end. Correct PO383 and PO1174, which show received quantity with no receipt document. Then take the Generation N register (§8-E) as a single agenda: chase the VRMA21 credit ($149.95, 32 days), apply the open credit ($29.99) and prepayment ($99.97), apply or refund payment 167 ($59.98), and receive or close nine small pending POs.

AAppendix A — SuiteQL used

Verbatim as executed. Q3–Q5 feed the shared reducer core; Q6–Q7 feed the three-way-match pass; the rest are probes and registers.

Q1 — Link-type census

SELECT p.type AS prev_type, n.type AS next_type, l.linktype, COUNT(*) AS link_rows,
       COUNT(DISTINCT l.previousdoc || '-' || l.nextdoc) AS distinct_pairs
FROM nexttransactionlinelink l JOIN transaction p ON p.id = l.previousdoc JOIN transaction n ON n.id = l.nextdoc
WHERE p.type IN ('PurchReq','PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth','VPrep','Check')
   OR n.type IN ('PurchReq','PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth','VPrep','Check')
GROUP BY p.type, n.type, l.linktype ORDER BY COUNT(*) DESC

Q2 — Header census

SELECT t.type, COUNT(*) AS docs, COUNT(DISTINCT t.status) AS statuses,
       TO_CHAR(MIN(t.trandate),'YYYY-MM-DD') AS first_date, TO_CHAR(MAX(t.trandate),'YYYY-MM-DD') AS last_date,
       SUM(CASE WHEN t.trandate > SYSDATE THEN 1 ELSE 0 END) AS future_dated,
       SUM(CASE WHEN t.memo LIKE 'TEST%' THEN 1 ELSE 0 END) AS test_memo
FROM transaction t WHERE t.type IN ('PurchReq','PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth','VPrep','Check')
GROUP BY t.type ORDER BY COUNT(*) DESC

Q3 — Streamed lines (keyset on uk, no ORDER BY)

SELECT tl.uniquekey AS uk, tl.transaction AS tid, tl.mainline, tl.createdfrom
FROM transactionline tl JOIN transaction t ON t.id = tl.transaction
WHERE t.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth')

Q4 — Materialised headers

SELECT t.id, t.type, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, TO_CHAR(t.duedate,'YYYY-MM-DD') AS duedate,
       t.status, t.entity, t.foreigntotal AS total, t.foreignamountunpaid AS unpaid, t.memo
FROM transaction t WHERE t.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth')

Q5 — Materialised distinct links

SELECT DISTINCT l.previousdoc, l.nextdoc, l.linktype
FROM nexttransactionlinelink l JOIN transaction p ON p.id = l.previousdoc JOIN transaction n ON n.id = l.nextdoc
WHERE p.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth')
  AND n.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth')

Q6 — Streamed PO child lines (three-way match)

SELECT tl.uniquekey AS uk, tl.transaction AS tid, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS podate, t.status,
       tl.item, tl.quantity AS qty, tl.quantityshiprecv AS qrecv, tl.quantitybilled AS qbill, tl.rate, tl.foreignamount AS amt, tl.isclosed
FROM transactionline tl JOIN transaction t ON t.id = tl.transaction
WHERE t.type = 'PurchOrd' AND tl.mainline = 'F' AND tl.taxline = 'F'

Q7 — Bills per PO for header amount match

SELECT b.id AS bill_id, b.tranid AS bill_tranid, TO_CHAR(b.trandate,'YYYY-MM-DD') AS bill_date,
       ROUND(ABS(b.foreigntotal),2) AS bill_total, l.previousdoc AS po_id
FROM transaction b JOIN nexttransactionlinelink l ON l.nextdoc = b.id AND l.linktype = 'OrdBill'
JOIN transaction p ON p.id = l.previousdoc AND p.type = 'PurchOrd'
WHERE b.type = 'VendBill' GROUP BY b.id, b.tranid, b.trandate, b.foreigntotal, l.previousdoc

Q8 — Live status glossary

SELECT x.type, x.status, x.docs, BUILTIN.DF(t.status) AS label
FROM (SELECT type, status, COUNT(*) AS docs, MIN(id) AS sample_id FROM transaction
      WHERE type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt','VendCred','VendAuth','VPrep','PurchReq') GROUP BY type, status) x
JOIN transaction t ON t.id = x.sample_id ORDER BY x.type, x.docs DESC

Q9 — Approval observability and terms population

SELECT t.type, COUNT(*) AS docs, SUM(CASE WHEN t.duedate IS NULL THEN 1 ELSE 0 END) AS null_duedate,
       SUM(CASE WHEN t.terms IS NULL THEN 1 ELSE 0 END) AS null_terms,
       (SELECT COUNT(DISTINCT sn.recordid) FROM systemnote sn JOIN transaction x ON x.id = sn.recordid
         WHERE sn.recordtypeid = -30 AND sn.field = 'TRANDOC.KSTATUS' AND x.type = t.type) AS docs_with_status_notes
FROM transaction t WHERE t.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt') GROUP BY t.type

Q10 — Register 8-B: non-PO bills by vendor

SELECT v.entityid AS vendor, COUNT(*) AS bills, ROUND(SUM(ABS(t.foreigntotal)),2) AS total, ROUND(SUM(t.foreignamountunpaid),2) AS unpaid,
       MIN(TO_CHAR(t.trandate,'YYYY-MM-DD')) AS first_date, MAX(TO_CHAR(t.trandate,'YYYY-MM-DD')) AS last_date, MAX(t.memo) AS sample_memo
FROM transaction t LEFT JOIN vendor v ON v.id = t.entity
WHERE t.type = 'VendBill' AND NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l JOIN transaction p ON p.id = l.previousdoc
                                          WHERE l.nextdoc = t.id AND p.type = 'PurchOrd')
GROUP BY v.entityid ORDER BY SUM(ABS(t.foreigntotal)) DESC

Q11 — Register 8-A: open bills

SELECT t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, TO_CHAR(t.duedate,'YYYY-MM-DD') AS duedate,
       BUILTIN.DF(t.status) AS status_label, v.entityid AS vendor, ROUND(ABS(t.foreigntotal),2) AS total,
       ROUND(t.foreignamountunpaid,2) AS unpaid, TRUNC(SYSDATE)-TRUNC(t.duedate) AS days_past_due, t.memo,
       (SELECT MAX(p.tranid) FROM nexttransactionlinelink l JOIN transaction p ON p.id = l.previousdoc
         WHERE l.nextdoc = t.id AND p.type = 'PurchOrd') AS po
FROM transaction t LEFT JOIN vendor v ON v.id = t.entity
WHERE t.type = 'VendBill' AND t.foreignamountunpaid > 0 ORDER BY t.foreignamountunpaid DESC

Q12 — Register 8-C: received-not-billed POs

SELECT t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, BUILTIN.DF(t.status) AS status_label, v.entityid AS vendor,
       ROUND(ABS(t.foreigntotal),2) AS total, TRUNC(SYSDATE)-TRUNC(t.trandate) AS age_days,
       (SELECT MAX(r.tranid) || ' ' || TO_CHAR(MAX(r.trandate),'YYYY-MM-DD') FROM nexttransactionlinelink l
         JOIN transaction r ON r.id = l.nextdoc WHERE l.previousdoc = t.id AND r.type = 'ItemRcpt') AS receipt
FROM transaction t LEFT JOIN vendor v ON v.id = t.entity
WHERE t.type = 'PurchOrd' AND t.status = 'F' ORDER BY ABS(t.foreigntotal) DESC

Q13 — Register 8-D: POs with no receipt

SELECT t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, BUILTIN.DF(t.status) AS status_label, v.entityid AS vendor,
       ROUND(ABS(t.foreigntotal),2) AS total, TRUNC(SYSDATE)-TRUNC(t.trandate) AS age_days, t.memo
FROM transaction t LEFT JOIN vendor v ON v.id = t.entity
WHERE t.type = 'PurchOrd' AND NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l JOIN transaction n ON n.id = l.nextdoc
                                          WHERE l.previousdoc = t.id AND n.type = 'ItemRcpt')
ORDER BY t.trandate

Q14 — Register 8-E / 8-F: returns, credits, prepayments, voided and unlinked payments

SELECT t.type, t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, BUILTIN.DF(t.status) AS status_label,
       v.entityid AS vendor, ROUND(ABS(t.foreigntotal),2) AS total, t.memo,
       (SELECT COUNT(*) FROM nexttransactionlinelink l WHERE l.nextdoc = t.id) AS inbound,
       (SELECT COUNT(*) FROM nexttransactionlinelink l WHERE l.previousdoc = t.id) AS outbound
FROM transaction t LEFT JOIN vendor v ON v.id = t.entity
WHERE (t.type = 'VendPymt' AND (t.status = 'V' OR NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l WHERE l.nextdoc = t.id)))
   OR (t.type = 'ItemRcpt' AND NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l WHERE l.nextdoc = t.id))
   OR t.type IN ('VendCred','VendAuth','VPrep')
ORDER BY t.type, t.trandate

Q15 — Consolidated payment reconciliation

SELECT b.id, b.tranid, TO_CHAR(b.trandate,'YYYY-MM-DD') AS bill_date, TO_CHAR(b.duedate,'YYYY-MM-DD') AS due,
       ROUND(ABS(b.foreigntotal),2) AS total, BUILTIN.DF(b.status) AS status_label, b.memo,
       TRUNC(TO_DATE('2026-09-07','YYYY-MM-DD'))-TRUNC(b.duedate) AS days_late_at_payment
FROM transaction b JOIN nexttransactionlinelink l ON l.previousdoc = b.id AND l.nextdoc = 42228
WHERE b.type = 'VendBill' ORDER BY b.trandate

Q16 — Monthly volumes

SELECT TO_CHAR(t.trandate,'YYYY-MM') AS ym, t.type, COUNT(*) AS docs, ROUND(SUM(ABS(t.foreigntotal)),2) AS total
FROM transaction t WHERE t.type IN ('PurchOrd','ItemRcpt','VendBill','VendPymt') AND t.trandate < TO_DATE('2026-10-01','YYYY-MM-DD')
GROUP BY TO_CHAR(t.trandate,'YYYY-MM'), t.type ORDER BY 1, 2
Query notes
No query failed on this run. Lessons carried from the O2C study and applied here: BUILTIN.DF(status) cannot sit inside GROUP BY (Q8 uses a sample-id subquery); a four-way self-join across link pairs errors — chains are assembled in the Worker; t.shipdate must not be selected alongside a transactionline join. Vendor bill foreigntotal is negative — every amount is wrapped in ABS().

BAppendix B — Reducer logic

Four sqlReduce passes. Passes 1–3 share Q3 (stream) + Q4 + Q5 (materialised) and the core below; pass 4 streams Q6 with Q7 and PO headers materialised. Only the returned summaries entered the model context.

// fold — keep mainline rows and their createdfrom pointer
fold(acc,page){ for (r of page){ acc.linesIn++; if (r.mainline==='T'){ acc.mainlines++;
  if (r.createdfrom) acc.cf.push([+r.createdfrom,+r.tid]); } } return acc; }
// finalize — docs from Q4; edges = distinct(Q5) ∪ acc.cf; drop self/out-of-scope; record source per edge
// events: activity by type; VendPymt status 'V' → 'Paid (voided)'; objects = own + upstream;
//         payments inherit PurchOrd via VendBill; bills inherit ItemRcpt via BillRcpt
RANK = { 'Order Placed':0, 'Received':1, 'Billed':2, 'Paid':3, 'Paid (voided)':3, 'Return Authorised':4, 'Credited':5 }
cmp  = (a,b) => a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : (RANK[a.activity]-RANK[b.activity]) || (a.docId-b.docId)
// components: union-find → sorted trace, variant, cycle = daysBetween(first,last)

// Pass 1: funnel; objects by type; edge/doc reachability by source; seven multiplicity histograms
// Pass 2: H.ocdfg(events,{tieBreak}); PO traces; payment traces (payment + bills + their POs + POs' receipts
//         + BillRcpt receipts); H.dfg on both; variants; transitions; two-model conformance;
//         due-date timing: for each non-voided bill→payment pair, rel = daysBetween(bill.duedate, pay.date)
// Pass 3: payment perspective detail; variants 5–16; slowest 10; open PO components by last activity × status
// Pass 4 (three-way match): per PO line classify (qty, qrecv, qbill, isclosed) →
//         full | openNotRecv | recvNotBilled | billedNotRecv | overBilled | overRecv | partialRecv | partialBill | closedShort
//         exposure: Σ (qrecv − qbill) × rate on recvNotBilled; header: Σ OrdBill bills vs PO foreigntotal (exact / ≤1% / over / under)

Conformance rules — PO-backed: starts with Order Placed; one PO; no return/credit/void; ≤ 1 Billed; ≤ 1 Paid; nothing after Paid; Paid requires Billed and Received; every Received after the Billed → "billed before received". Non-PO: exactly Billed → Paid (complete) or Billed (open); anything else deviant with a named reason.

CAppendix C — Worked hand-check

StepDocumentInternal idDateStatusAmountLink
Order PlacedPO388317252026-06-01Fully Billed3,300.002 lines: item 17518 qty 1 @ 2,000; item 17519 qty 1 @ 1,300
ReceivedIR406—2026-06-01Item Receipt—ntll ShipRcpt; createdfrom = 31725
Billed#31726317262026-06-01Paid In Full3,300.00ntll OrdBill; createdfrom = 31725; header match exact
Paid539—2026-06-15Bill Payment3,300.00ntll Payment; 14 days after bill
Cycle = 14 days. Variant 1. Conforming, complete. Lines: both qty 1 / recv 1 / billed 1 → class "full". One of only three PO chains paid on a 14-day cycle.
Consolidated payment reconciliation
Paid#42228422282026-09-07Bill Payment341,743.037 inbound ntll Payment links
VB01 22,499.00 + VB02 22,575.00 + VB03 30,100.00 + VB04 31,000.00 + VB06 55,660.00 + VB07 69,699.00 + VB08 110,300.00 = 341,833.00; less bill credit VRMA20 89.97 (ntll VendBill→VendCred Payment) = 341,743.03 ✓. Days late at payment: 330, 269, 238, 210, 153, 124, 95.

Arithmetic checks. Conformance 698 + 35 + 291 + 12 + 17 = 1,053 ✓; (1,053 − 17) / 1,053 = 0.9839 ✓. Edges 722 + 705 + 1,005 + 19 + 4 + 1 + 1 + 1 = 2,458 ✓. Bill value: PO-backed 1,912,826.02 + non-PO 1,489,907.21 = 3,402,733.23; non-PO share 43.8% ✓. Open bills: 182,548.00 + 1,500.00 = 184,048.00 = Σ register 8-A ✓. Received-not-billed: Σ 19 PO totals = 29,706.97 = line-level exposure ✓. Due-date buckets 99 + 895 + 0 + 1 + 2 + 7 = 1,004 ✓. Deviations 5 + 3 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 17 ✓. Component sizes 39 + 307×2 + 2×3 + 702×4 + 5 + 6 + 14 = 3,492 documents ✓.

DAppendix D — Glossaries

Status codes observed (live labels, Q8)

TypeCodeLabelDocs
PurchOrdGFully Billed705
PurchOrdFPending Bill19
PurchOrdBPending Receipt14
PurchOrdAPending Supervisor Approval2
ItemRcptY(no status)727
VendBillBPaid In Full1,004
VendBillAOpen9
VendBillDPending Approval4
VendPymtY(no status)1,001
VendPymtVVoided1
VendAuthA / B / F / GPending Approval / Pending Return / Pending Credit / Credited1 each
VendCredY(no status)2
VPrepBPaid1

Link types (nexttransactionlinelink.linktype)

LinktypeFrom → ToRows → pairsMeaning
ShipRcptPurchOrd → ItemRcpt7,695 → 722Receipt of PO lines
OrdBillPurchOrd → VendBill7,491 → 705Billing of PO lines
PaymentVendBill → VendPymt / VendCred1,006Payment or credit applied to bill
BillRcptItemRcpt → VendBill66 → 19Bill created from receipt
PurchRetPurchOrd → VendAuth8 → 4Vendor return authorisation
DropShip / SpecOrd / CtrctOrd / POrdBlnkSalesOrd / WorkOrd / PurchCon / BlankOrd → PurchOrd6PO origins (out of scope)
LandCost / RevRec / TOrdCostvarious5Costing links (out of scope)

Terms

Three-way match — PO quantity/amount vs receipt vs bill. GR/IR — goods received / invoice received accrual for received-not-billed lines. Convergence — objects of one type touched by one event. Component — maximal linked document set (the case). ntll — nexttransactionlinelink.

EAppendix E — Run metadata

ItemValue
Account / environmentTD3016323 · production · OneWorld · USD
Analysis date2026-09-04 (SYSDATE for ages)
ToolingSonar AI v1.15.0 · sqlReduce streaming fold (keyset on transactionline.uniquekey) · runSql registers · no records created, modified or deleted
Stream statisticsQ3: 29,786 rows · 6 pages · 2.2–2.9 s · ~22 KB on wire per pass (≈ 80:1 vs 1.8 MB decoded) · Q6: 7,721 rows · 2 pages · 1.0 s
Materialised inputsQ4 headers 3,492 · Q5 links 2,458 · Q7 bills 705 · PO headers 740
Worker timePass 1 3.0 s · Pass 2 2.5 s · Pass 3 2.5 s · Pass 4 1.0 s
Percentile methodExact (A12)
PrivacyVendor names appear in §8 as recorded; a redacted edition can be produced on request
CompanionOrder-to-Cash Object-Centric Process Mining, same account and date; the two share the reducer core and the Precision Slate template