Bill payment in this account is disciplined to the point of being expensive. Of 1,005 bill-to-payment pairs, 995 (99.0%) were paid before the due date — 896 of them 10–30 days early, 99 more than 30 days early — and exactly one was paid on the due date. Weighted by value, $2.91M of bills were paid 25.9 days ahead of terms. Only 7 bills were paid materially late, and they are one story: seven Generation N bills on Net 15 terms dated Sep 2025 – May 2026 sat unpaid for 95–330 days past due and were all settled in a single $341,743.03 payment on 2026-09-07 — the only many-to-one payment in the account.
approvalstatus = Approved with no approver recorded and no approval system note; the only trace of a human approval step in 1,017 bills is 7 status-change notes written by the administrator in one sitting on 2026-01-07. Approval lead time therefore cannot be measured. Four bills ($3,114) are Pending Approval today; two have an approver (Frank Davenport, $50 total) and two have none — including the oldest, Bedline $1,500, pending since 1 July and 35 days past its due date.| # | Assumption | Effect |
|---|---|---|
| A1 | Case = vendor bill (1,017). Activities: Entered (trandate), Approved (approvalstatus, nextapprover, TRANDOC.KSTATUS system notes), Paid (VendPymt via nexttransactionlinelink), Credited (VendCred). | Approval timestamp exists only where a system note exists (7 bills). |
| A2 | Links = distinct nexttransactionlinelink (previousdoc, nextdoc) pairs; VendBill→VendPymt counted once per pair even when the payment was later voided. | 1,005 bill-payment pairs incl. 1 voided-and-reissued. |
| A3 | Timing vs terms = payment trandate − bill duedate (negative = early). Lag = payment trandate − bill trandate. Day resolution. | Bills with no duedate (6, no terms) use trandate as due. |
| A4 | Discount available = rate in terms name × bill total, if paid on or before discountdate. | Only 5 bills carry discount terms. |
| A5 | Cost of early payment = Σ(amount × days early) / 365 × assumed 5% cost of funds. The rate is an assumption, shown so the reader can substitute their own. | Illustrative, not a booked figure. |
| A6 | Vendor payments not linked to any bill (expense-report payments, unapplied) reported separately. | 3 payments. |
Figure 1 — Bill lifecycle. Approval is a recorded state but not a recorded event; payment is 1:1 except for one 7-bill sweep. Labels: count · median days.
| Multiplicity | 0 | 1 | 2 | 7 | Note |
|---|---|---|---|---|---|
| Bills per vendor payment | 3 | 998 | 0 | 1 | The 7-bill payment is Generation N 2026-09-07, $341,743.03. 3 payments link to no bill: 2 expense-report payments (Abby Kwan EXP05 $650, EXP03 $80), 1 unlinked Generation N $59.98 "Vendor Returns" |
| Payments/credits per bill | 12 | 1,002 | 2 | — | VB01: payment + vendor credit VRMA20 $89.97. VB05: payment voided ("Demo Ex") and reissued same day 2026-03-01, both $33,700 |
| Bills with no payment link | 12 | 8 Open ($60,934) + 4 Pending Approval ($3,114). One Open bill (Davidson Leasing $120,000) links only to a RevRec journal JE159 | |||
| Approvers named | 1,014 | 3 | — | — | Frank Davenport on 2 pending bills ($50); Larry Nelson on VB843 ($52,550, already Approved/Open) |
| Evidence | Bills | Value | What it tells us |
|---|---|---|---|
approvalstatus = Approved, status Paid In Full | 1,004 | 3,218,685.23 | Approved at some point; no timestamp |
approvalstatus = Approved, status Open | 9 | 180,934.00 | Approved, awaiting payment |
approvalstatus = Pending Approval | 4 | 3,114.00 | In the queue; 2 with approver, 2 without |
TRANDOC.KSTATUS system notes (Open → Paid In Full) | 7 | — | All 2026-01-07 by the administrator via UI — a status change, not an approval |
| Bills with any approval-field system note | 0 | — | Approval routing (if any) leaves no trace in systemnote |
Approval lead time — bill entered to bill approved — is unobservable on 1,013 of 1,017 bills. The state is set (Approved) but no event records when or by whom. The 4 pending bills are the only cases where the queue can be timed: Bedline 65 days (since 2026-07-01), Ad4tech, Lotion Co and Harris Technology future-dated. If the account intends bills to be approved by someone other than the entering user, the approval routing workflow is not running, or is running without writing to the record.
Figure 2 — Payment date − due date, 1,005 pairs.
Figure 3 — Bill date → payment date, 1,005 pairs.
| vs due date | Pairs | Share | Value | Lag same-day | 1–7 d | 8–30 d | > 30 d |
|---|---|---|---|---|---|---|---|
| > 30 days early (31–32) | 99 | 9.9% | 320,100.54 | 98 | 1 | 0 | 0 |
| 8–30 days early (10–30) | 896 | 89.2% | 2,588,601.69 | 203 | 690 | 3 | 0 |
| On due date | 1 | 0.1% | 350.00 | 1 | 0 | 0 | 0 |
| 1–7 days late (2) | 2 | 0.2% | 1,500.00 | 0 | 1 | 1 | 0 |
| > 30 days late (95–330) | 7 | 0.7% | 341,833.00 | 0 | 0 | 0 | 7 |
| Total | 1,005 | 100% | 3,252,385.23 | 302 | 692 | 4 | 7 |
The lag columns explain the early payments: 302 bills were paid the day they were entered and 692 within a week, against terms that are Net 30 on 901 bills and Net 15 on 105. Payment is driven by bill arrival, not by due date. The 99 payments >30 days early are Net 30 bills paid on entry (lag 0, 31–32 days early because of month length).
| Terms on bills | Bills | Value | Terms | Bills | Value |
|---|---|---|---|---|---|
| Net 30 | 901 | 2,508,395.97 | 1% 10 Net 30 | 3 | 174,050.00 |
| Net 15 | 105 | 712,959.26 | 2% 10 Net 30 | 2 | 3,495.00 |
| (none — due on entry) | 6 | 3,833.00 |
| Measure | Value | Formula |
|---|---|---|
| Pairs paid before due date | 995 | d = duedate − payment date > 0 |
| Value paid early | $2,908,702.23 | Σ bill total |
| Value-weighted days early | 25.9 | Σ(amount × d) / Σ amount |
| Working capital given up (illustrative) | ≈ $10,300 | 2,908,702.23 × 25.9 / 365 × 5% = $10,320; over the 23-month window ≈ $5,400 / yr |
| Bill | Vendor | Bill date | Discount by | Due | Total | Terms | Discount if paid in window | Days left (from 09-04) |
|---|---|---|---|---|---|---|---|---|
| (no number) | Davidson Leasing | 2026-09-03 | 2026-09-13 | 2026-10-02 | 120,000.00 | 1% 10 Net 30 | 1,200.00 | 9 |
| VB843 | Cloud Consulting | 2026-09-03 | 2026-09-13 | 2026-10-02 | 52,550.00 | 1% 10 Net 30 | 525.50 | 9 |
| VB397 | Generation N | 2026-09-01 | 2026-09-11 | 2026-09-30 | 2,995.00 | 2% 10 Net 30 | 59.90 | 7 |
| VB385 | Witt & Anderson | 2026-08-31 | 2026-09-10 | 2026-09-30 | 1,500.00 | 1% 10 Net 30 | 15.00 | 6 |
| VB842 | Cloud Consulting | 2026-09-01 | 2026-09-11 | 2026-09-30 | 500.00 | 2% 10 Net 30 | 10.00 | 7 |
| 5 bills — the only discount-term bills ever entered | 177,545.00 | 1,810.40 | ||||||
Discount terms appear for the first time on bills dated 31 Aug – 3 Sep 2026. Given the account's habit of paying within a week of entry, all five would normally be paid inside the window — but none has been, and the Davidson bill is linked only to a revenue-recognition journal, suggesting it is a lease accrual rather than a payable in the usual sense.
| Bill | Vendor | Bill date | Due (Net 15) | Amount | Paid | Days late |
|---|---|---|---|---|---|---|
| VB01 | Generation N | 2025-09-27 | 2025-10-12 | 22,499.00 | 2026-09-07 | 330 |
| VB02 | Generation N | 2025-11-30 | 2025-12-12 | 22,575.00 | 2026-09-07 | 269 |
| VB03 | Generation N | 2025-12-26 | 2026-01-12 | 30,100.00 | 2026-09-07 | 238 |
| VB04 | Generation N | 2026-01-25 | 2026-02-09 | 31,000.00 | 2026-09-07 | 210 |
| VB06 | Generation N | 2026-03-23 | 2026-04-07 | 55,660.00 | 2026-09-07 | 153 |
| VB07 | Generation N | 2026-04-21 | 2026-05-06 | 69,699.00 | 2026-09-07 | 124 |
| VB08 | Generation N | 2026-05-20 | 2026-06-04 | 110,300.00 | 2026-09-07 | 95 |
| One payment, 2026-09-07 (VB01 net of credit VRMA20 $89.97) | 341,833.00 | weighted 165 | ||||
| LP- interco alloc 3 | Flexsteel | 2026-09-10 | 2026-09-25 | 1,000.00 | 2026-09-27 | 2 |
| (no number) | — | 2026-08-01 | 2026-08-01 | 500.00 | 2026-08-03 | 2 |
The VB01–VB08 series (VB05 was paid on time, twice — see §8) is Generation N's monthly bill, Net 15, ignored for eleven months and then cleared in one sweep three days from now. Every other Generation N bill (81 of 88) was paid within 3 days of entry. This is not a slow vendor relationship; it is one numbered series of bills that was excluded from the normal payment run.
| Bill | Vendor | Bill date | Due | Past due | Amount | Status | Approver | Note |
|---|---|---|---|---|---|---|---|---|
| (none) | Bedline | 2026-07-01 | 2026-07-31 | 35 | 1,500.00 | Pending Approval | — | 65 days in queue, nobody assigned |
| LP- interco alloc | Flexsteel | 2026-07-09 | 2026-07-24 | 42 | 1,000.00 | Open | — | Intercompany allocation, Net 15 |
| LP- interco alloc 2 | Flexsteel | 2026-08-10 | 2026-08-25 | 10 | 1,000.00 | Open | — | Same series; alloc 3 was paid |
| INV-005 | Ad4tech Material LLC | 2026-09-11 | 2026-09-11 | −7 | 1,564.00 | Pending Approval | — | No terms |
| (none) | Well | 2026-09-13 | 2026-09-13 | −9 | 1,000.00 | Open | — | No terms |
| (none) | Lotion Co | 2026-09-15 | 2026-09-15 | −11 | 30.00 | Pending Approval | Frank Davenport | |
| (none) | Cable Plus Distributors | 2026-09-15 | 2026-09-15 | −11 | 389.00 | Open | — | No terms |
| (none) | Harris Technology | 2026-09-15 | 2026-10-15 | −41 | 20.00 | Pending Approval | Frank Davenport | |
| Plus the 5 discount-term bills of §5 (VB385, VB397, VB842, VB843, Davidson $120,000), all Open, all not yet due. | ||||||||
| 13 bills · 9 Open $180,934.00 · 4 Pending $3,114.00 | 184,048.00 | 3 past due ($3,500); 10 not yet due | ||||||
VB05 (Generation N, 2026-02-28, $33,700) has two payments dated 2026-03-01 for $33,700: 00000005/1-12102024-181841 (memo "Demo Ex", status Voided, also linked to journal JE150) and 00000005/1 (status Undefined, live). Net effect is one payment; the audit trail shows a duplicate caught and voided the same day.
| Payment | Date | Payee | Amount | Applied to | Reading |
|---|---|---|---|---|---|
| (none) | 2026-09-07 | Abby Kwan | 650.00 | Expense report EXP05 | Employee reimbursement via bill payment — legitimate, different object |
| 362 | 2026-09-24 | Abby Kwan | 80.00 | Expense report EXP03 | Same |
| 167 | 2026-09-08 | Generation N | 59.98 | nothing | Memo "Vendor Returns - LP"; paid with no bill or credit applied — unapplied vendor payment |
Davidson Leasing $120,000 (2026-09-03, 1% 10 Net 30) links forward only to journal JE159 "RevRec". It is the largest open bill and carries the largest available discount ($1,200); whether it is a payable at all should be confirmed before the 13 September discount date.
| Limitation | Evidence | Effect |
|---|---|---|
| Approval is a state, not an event | approvalstatus populated on all 1,017; approval system notes on 0; nextapprover on 3 | Approval lead time unmeasurable; approver accountability unmeasurable |
| Status notes are one-off | 7 TRANDOC.KSTATUS notes, all 2026-01-07 13:xx by the administrator | Cannot distinguish system-driven from manual status changes |
| Voided payments remain linked | VB05 shows 2 payment links, one Voided | Pair counts include 1 voided pair (1,005 vs 1,004 live) |
| Future-dated documents | Payment run 2026-09-07 and 10 open bills dated after 2026-09-04 | "Days left" and "past due" computed against SYSDATE; demo data is partly in the future |
| Un-numbered bills | 6 open/pending bills with blank tranid | Referenced by internal id in this report |
nextapprover and a system note (so lead time and segregation of duties become auditable), or set the preference to auto-approve openly. Meanwhile assign an approver to the two orphaned pending bills — Bedline ($1,500) has waited 65 days and is 35 days past due.SELECT CASE WHEN d < -30 THEN 'a >30 early' WHEN d < -7 THEN 'b 8-30 early' WHEN d < 0 THEN 'c 1-7 early' WHEN d = 0 THEN 'd on due'
WHEN d <= 7 THEN 'e 1-7 late' WHEN d <= 30 THEN 'f 8-30 late' ELSE 'g >30 late' END AS vs_due,
COUNT(*) AS pairs, MIN(d), MAX(d), ROUND(SUM(amt),2) AS value,
SUM(CASE WHEN lag=0 THEN 1 ELSE 0 END) AS lag0, SUM(CASE WHEN lag BETWEEN 1 AND 7 THEN 1 ELSE 0 END) AS lag1_7,
SUM(CASE WHEN lag BETWEEN 8 AND 30 THEN 1 ELSE 0 END) AS lag8_30, SUM(CASE WHEN lag > 30 THEN 1 ELSE 0 END) AS lag_over30
FROM (SELECT DISTINCT b.id, p.id AS pid, TRUNC(p.trandate)-TRUNC(b.duedate) AS d, TRUNC(p.trandate)-TRUNC(b.trandate) AS lag, ABS(b.foreigntotal) AS amt
FROM nexttransactionlinelink l JOIN transaction b ON b.id=l.previousdoc AND b.type='VendBill' JOIN transaction p ON p.id=l.nextdoc AND p.type='VendPymt')
GROUP BY [same CASE] ORDER BY 1
SELECT 'bills_per_payment' AS metric, k AS n, COUNT(*) AS docs, ROUND(SUM(v),2) AS value FROM (SELECT l.nextdoc, COUNT(DISTINCT l.previousdoc) AS k, MAX(ABS(p.foreigntotal)) AS v
FROM nexttransactionlinelink l JOIN transaction b ON b.id=l.previousdoc AND b.type='VendBill' JOIN transaction p ON p.id=l.nextdoc AND p.type='VendPymt' GROUP BY l.nextdoc) GROUP BY k
UNION ALL SELECT 'payments_per_bill', k, COUNT(*), ROUND(SUM(v),2) FROM (SELECT l.previousdoc, COUNT(DISTINCT l.nextdoc) AS k, MAX(ABS(b.foreigntotal)) AS v
FROM nexttransactionlinelink l JOIN transaction b ON b.id=l.previousdoc AND b.type='VendBill' JOIN transaction p ON p.id=l.nextdoc AND p.type IN ('VendPymt','VendCred') GROUP BY l.previousdoc) GROUP BY k
UNION ALL SELECT 'bills_no_payment_link_' || BUILTIN.DF(b.status), 0, COUNT(*), ROUND(SUM(ABS(b.foreigntotal)),2) FROM transaction b
WHERE b.type='VendBill' AND NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l WHERE l.previousdoc=b.id) GROUP BY BUILTIN.DF(b.status) ORDER BY 1,2
SELECT 'approvalstatus ' || COALESCE(BUILTIN.DF(b.approvalstatus),'(null)') || ' / ' || BUILTIN.DF(b.status) AS k, COUNT(*) AS n, ROUND(SUM(ABS(b.foreigntotal)),2) AS v, NULL AS x
FROM transaction b WHERE b.type='VendBill' GROUP BY COALESCE(BUILTIN.DF(b.approvalstatus),'(null)'), BUILTIN.DF(b.status)
UNION ALL SELECT 'early_pay_weighted', COUNT(*), ROUND(SUM(amt),2), ROUND(SUM(amt*dearly)/SUM(amt),1)
FROM (SELECT DISTINCT b.id, p.id AS pid, ABS(b.foreigntotal) AS amt, TRUNC(b.duedate)-TRUNC(p.trandate) AS dearly FROM nexttransactionlinelink l
JOIN transaction b ON b.id=l.previousdoc AND b.type='VendBill' JOIN transaction p ON p.id=l.nextdoc AND p.type='VendPymt') WHERE dearly > 0
UNION ALL SELECT 'bill_terms ' || COALESCE(BUILTIN.DF(b.terms),'(none)'), COUNT(*), ROUND(SUM(ABS(b.foreigntotal)),2), NULL FROM transaction b WHERE b.type='VendBill' GROUP BY COALESCE(BUILTIN.DF(b.terms),'(none)')
ORDER BY 1
SELECT b.id, b.tranid, TO_CHAR(b.trandate,'YYYY-MM-DD') AS bill_date, TO_CHAR(b.duedate,'YYYY-MM-DD') AS due, TRUNC(SYSDATE)-TRUNC(b.duedate) AS days_past_due, BUILTIN.DF(b.entity) AS vendor, ROUND(ABS(b.foreigntotal),2) AS total, ROUND(b.foreignamountunpaid,2) AS unpaid, BUILTIN.DF(b.status) AS status, BUILTIN.DF(b.terms) AS terms, BUILTIN.DF(b.nextapprover) AS approver, TO_CHAR(b.discountdate,'YYYY-MM-DD') AS discount_date, b.memo FROM transaction b WHERE b.type='VendBill' AND b.status <> 'B' ORDER BY b.status, b.duedate
SELECT 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 amt, p.tranid AS pymt, TO_CHAR(p.trandate,'YYYY-MM-DD') AS paid, TRUNC(p.trandate)-TRUNC(b.duedate) AS days_late, BUILTIN.DF(b.terms) AS terms FROM (SELECT DISTINCT previousdoc, nextdoc FROM nexttransactionlinelink) l JOIN transaction b ON b.id=l.previousdoc AND b.type='VendBill' JOIN transaction p ON p.id=l.nextdoc AND p.type='VendPymt' WHERE TRUNC(p.trandate)-TRUNC(b.duedate) > 0 ORDER BY days_late DESC
SELECT 'pymt_no_bill' AS kind, p.tranid, TO_CHAR(p.trandate,'YYYY-MM-DD') AS d, BUILTIN.DF(p.entity) AS vendor, ROUND(ABS(p.foreigntotal),2) AS amt, BUILTIN.DF(p.status) AS status, p.memo
FROM transaction p WHERE p.type='VendPymt' AND NOT EXISTS (SELECT 1 FROM nexttransactionlinelink l WHERE l.nextdoc=p.id)
UNION ALL SELECT 'bill_2_pymts', b.tranid, TO_CHAR(b.trandate,'YYYY-MM-DD'), BUILTIN.DF(b.entity), ROUND(ABS(b.foreigntotal),2), BUILTIN.DF(b.status),
(SELECT LISTAGG(DISTINCT n.tranid || ' ' || TO_CHAR(n.trandate,'MM-DD') || ' $' || ROUND(ABS(n.foreigntotal),2), '; ') FROM nexttransactionlinelink l JOIN transaction n ON n.id=l.nextdoc WHERE l.previousdoc=b.id)
FROM transaction b WHERE b.type='VendBill' AND (SELECT COUNT(DISTINCT l.nextdoc) FROM nexttransactionlinelink l JOIN transaction n ON n.id=l.nextdoc AND n.type IN ('VendPymt','VendCred') WHERE l.previousdoc=b.id) = 2
UNION ALL SELECT 'open_bill_with_link', b.tranid, TO_CHAR(b.trandate,'YYYY-MM-DD'), BUILTIN.DF(b.entity), ROUND(ABS(b.foreigntotal),2), BUILTIN.DF(b.status) || ' unpaid $' || ROUND(b.foreignamountunpaid,2),
(SELECT LISTAGG(DISTINCT n.type || ' ' || n.tranid || ' ' || l.linktype, '; ') FROM nexttransactionlinelink l JOIN transaction n ON n.id=l.nextdoc WHERE l.previousdoc=b.id)
FROM transaction b WHERE b.type='VendBill' AND b.status <> 'B' AND EXISTS (SELECT 1 FROM nexttransactionlinelink l WHERE l.previousdoc=b.id)
BUILTIN.DF(status); filter on the letter). VendPymt status shows "Undefined" for live payments and "Voided" for voided — voided payments keep their nexttransactionlinelink rows. Bill payments to employees link to ExpRept, not VendBill. approvalstatus, nextapprover, discountdate, terms are all exposed on transaction.Bills 1,004 + 9 + 4 = 1,017 ✓ · Terms 901 + 105 + 6 + 3 + 2 = 1,017; 2,508,395.97 + 712,959.26 + 3,833 + 174,050 + 3,495 = 3,402,733.23 = 3,218,685.23 + 180,934 + 3,114 ✓ · Pairs by vs-due 99 + 896 + 1 + 2 + 7 = 1,005 = 998 × 1 + 1 × 7 ✓ · Lag columns 302 + 692 + 4 + 7 = 1,005 ✓ · Early pairs 99 + 896 = 995; value 320,100.54 + 2,588,601.69 = 2,908,702.23 ✓ · Cost 2,908,702.23 × 25.9 / 365 × 0.05 = 10,320 ✓ · Discount 1,200 + 525.50 + 59.90 + 15 + 10 = 1,810.40; totals 120,000 + 52,550 + 2,995 + 1,500 + 500 = 177,545 ✓ · Late sweep 22,499 + 22,575 + 30,100 + 31,000 + 55,660 + 69,699 + 110,300 = 341,833; less credit 89.97 = 341,743.03 = payment ✓ · Open 1,000 × 2 + 1,000 + 389 + 2,995 + 1,500 + 500 + 120,000 + 52,550 = 180,934 ✓ · Pending 1,500 + 1,564 + 30 + 20 = 3,114 ✓ · Unlinked bills 8 + 4 = 12; bills with links 1,002 + 2 + 1 (Davidson, journal only) = 1,005; 1,005 + 12 = 1,017 ✓.