Sample output from the Record-to-Report Period Close 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

Record-to-Report: Period Close Process Mining Analysis

NetSuite account TD3016323 (production, OneWorld, USD) · Case = monthly accounting period · Scope: all 168 monthly periods (Jan 2016 – Dec 2029) for close state; Oct 2024 – Oct 2026 for posting activity · Prepared 2026-09-04 · Revision 1 · Method: SuiteQL via sqlReduce and runSql over accountingperiod, transaction, transactionline, transactionaccountingline, account, systemnote · Third study in the series after Order-to-Cash and Procure-to-Pay · Document numbers link to the source record when opened inside NetSuite
  1. 0Executive summary
  2. 1Method, lineage and assumptions
  3. 2What the account records — and does not
  4. 3Period close: state and cycle time
  5. 4Journal population and process model
  6. 5Reversal, reclassification and approval trail
  7. 6Who touched what
  8. 7Intercompany and elimination
  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 and run metadata

0Executive summary

57
Periods past their end date that have never been closed or locked
748 d
Median period-end → close for the 71 periods that were closed
0
Lock / close / reopen events recorded in system notes
40
Genuine journal entries; 6 reversal pairs, 9 tests, 4 pending approval

Record-to-report is the process finance leads most want measured and least often see. In this account it is not so much unmeasured as absent: no accounting period ending after November 2021 has been closed or locked. The 71 periods that were closed (Jan 2016 – Nov 2021) were closed in four bulk batches on four calendar days, a median of 748 days after period end — the shortest interval was 71 days, the longest 1,417. Every one of the 25 periods carrying the account's live transaction history (Oct 2024 → Sep 2026, 6,240 posting transactions, $19.8M gross in 2026 alone) is open to posting with A/R, A/P and GL unlocked, and the oldest unclosed period, Dec 2021, has been open 1,708 days.

Three findings follow from what can be measured:

  1. The close is a state, not a process. NetSuite records no system note when a period is locked or closed in this account; only closedondate survives. Cycle time from period end to close is therefore known for 71 historical periods (median 748 days, in four batches) and undefined for the 57 open ones. There is no close checklist activity, no lock sequence (A/R → A/P → All), and nothing that distinguishes a soft close from a hard one. §3.
  2. Journals are few, but a third of them are reversals or tests. Of 40 genuine journal entries, 6 pairs (12 entries, 30%) are original + reversal, 5 (12.5%) are reclassifications or allocations, and 9 (22.5%) carry a "Test" memo or an Atlas sweep-test external id and post $100–$555 to real bank and A/R accounts in the current period. Four entries ($10,316) sit in Pending Approval with no approver assigned, two of them in periods that have already ended. Only one approval transition is observable in system notes, and it was self-approved by the administrator who entered it. §5.
  3. Intercompany runs, elimination has never. Three Advanced Intercompany Journals (JE91–JE93, $1,000/month, Sub 2 → Sub 3) and six intercompany operational documents exist; the elimination subsidiary xElim has zero lines in its history, the two accounts flagged for elimination (1910, 2910) have zero postings, and no transaction line anywhere carries eliminate = T. Consolidated statements have never been eliminated. §7.

1Method, lineage and assumptions

The O2C and P2P studies used documents as objects and link tables as edges. Record-to-report has a different shape: the case is the accounting period; the events are (a) postings into the period, (b) journal entries with their approval, reversal and reclassification lineage, and (c) lock/close actions on the period record. Events of type (c) are read from systemnote; they turned out not to exist (§2), so the period lifecycle collapses to its recorded end state.

StageCountNote
Monthly accounting periods (isquarter=F AND isyear=F)168Jan 2016 → Dec 2029; 71 closed, 57 open past end, 40 future
Transactions carrying a posting period (excl. non-posting order types)6,2926,254 posting; 38 non-posting (pending-approval journals, deposits-in-transit, etc.)
Posting transactions, Oct 2024 → Oct 20266,24025 types; Journal 84 (1.3%)
Journals8848 synthetic "Beg Balance Entries" (JE102–JE149, excluded) · 40 genuine
System notes on journals29 on 9 journals1 status transition; 0 on the other 31 journals
System notes on accounting periods0No field on recordtype accountingperiod has ever been noted
Intercompany-flagged or paired transactions3 + 63 Advanced IC journals; 3 transfer orders, 1 receipt, 2 PO↔SO pairs

Assumptions register

#AssumptionEffect
A1Case = monthly period; quarter and year roll-ups excluded.168 cases.
A2Close cycle time = closedondate − enddate in whole days; open periods have undefined cycle time and a "days open" = 2026-09-04 − enddate.Only the 71 closed periods have a cycle time.
A3"Genuine journal" = type='Journal' and memo not LIKE 'Beg Balance%'. The 48 synthetic monthly journals are excluded from all journal analysis but retained in posting counts where stated.40 genuine journals.
A4Reversal detected two ways: system field isreversal='T' / reversal populated, OR memo LIKE 'Reversal of%' / externalid LIKE '%reversal-of%'.3 system-linked + 3 memo-linked pairs.
A5Reclassification/allocation = externalid LIKE 'Reclass%' or line memo 'Allocation%' or journaltype containing INTERCOMPANY.5 journals.
A6Test entry = memo LIKE 'Test%' or externalid LIKE 'atlas:%sweep-test%'.9 journals.
A7Actor = lastmodifiedby (and createdby where populated) resolved via BUILTIN.DF; system-note actors from systemnote.name.Negative ids are system identities (§9).
A8Late posting cannot be measured from createddate in this account (demo load: 100% of Oct 2024 – Aug 2026 postings were created after period end; see §9). Trandate-vs-period mismatch is measured instead.0 mismatches.
A9Elimination "has run" if any transactionline.eliminate='T', any line on subsidiary 4, or any posting to an account.eliminate='T' account.All three are zero.
A10Amounts = debit totals per journal from transactionaccountingline; USD single currency.—
A11Ages as at 2026-09-04 (SYSDATE at run); negative = future-dated.Sep 2026 and Oct 2026 periods contain future-dated postings.

2What the account records — and does not

Evidence soughtWhere it should beFoundConsequence
Period lock / close / reopen eventssystemnote on recordtype accountingperiodNone. Zero notes on any of 168 periods; the only "closed"-named fields noted anywhere are EVENT.DCLOSED (calendar events) and CUSTJOB.DEXPCLOSED (projects)Close is observable only as end state (closed, closedondate, alllocked/aplocked/arlocked)
Period close checklist tasksPeriod Close Checklist (UI); no SuiteQL tableaccountingperiodclosetask is not a searchable typeTask-level close activity unobservable
Journal approval transitionssystemnote field TRANDOC.KSTATUS1 (JE100, Pending Approval → Approved for Posting, 2026-05-10 by Timothy Dietrich)Approval lead time unmeasurable
Journal create/edit notessystemnote recordtypeid −3029 notes on 9 of 40 journals, all by one actor, all 2026-0531 journals have no audit trail beyond header fields
Reversal lineagetransaction.reversal / isreversal / reversaldatePopulated on 3 pairs; 3 further pairs linked only by memo and externalidHalf of reversals invisible to a field-based search
Creator identitytransaction.createdbyPopulated on 9 of 40; lastmodifiedby on all"Who created" unknown for 31 journals
Next approvertransaction.nextapprover, approvalstatusNULL on all 4 pending journalsNobody is assigned to approve them
Eliminationsubsidiary 4 lines; eliminate flags0 / 0 / 0Never run (§7)
Every other process in this series had a recorded trail to mine. Record-to-report has a recorded state and almost no trail. The analysis below is therefore honest about what is a measurement (period state, journal population, reversal pairs, actor matrix, intercompany postings) and what is an absence (close events, approval timing, creator identity).

3Period close: state and cycle time

Figure 1 — All 168 monthly periods. Emerald = closed (with days from period end to close); grey = open past end (bar = days open as at 2026-09-04); hollow = future. Four close batches are visible as plateaus.

Close batch (closedondate)PeriodsRangeMin daysMeanMax days
2019-12-1834Jan 2016 – Oct 20184139161,417
2019-12-191Nov 2018384384384
2022-01-2713Dec 2018 – Dec 20197589411,123
2022-02-0923Jan 2020 – Nov 202171406740
All closed periods71Jan 2016 – Nov 202171median 748 · P90 1,2041,417
Open past end57Dec 2021 – Aug 20264median 8571,708
Future / current40Sep 2026 – Dec 2029All open, none locked

The pattern is unambiguous: periods were closed in bulk, years in arrears, on four occasions — and not at all since 2022-02-09. All 71 closed periods have alllocked = aplocked = arlocked = T; all 97 open periods have every lock flag F and allownonglchanges = F. There is no soft-close (locked but not closed) state anywhere. The 25 periods that hold the account's operational history are all posting-open:

PeriodPeriod endPosting txnsNon-postingJournalsGenuine JEsJE shareLast postingDays open
Oct 20242024-10-313650200.5%2024-10-26673
Nov 20242024-11-302060201.0%2024-11-25643
Dec 20242024-12-312130200.9%2024-12-24612
Jan 20252025-01-312160200.9%2025-01-26581
Feb 20252025-02-282070201.0%2025-02-25553
Mar 20252025-03-312140200.9%2025-03-25522
Apr 20252025-04-302940200.7%2025-04-25492
May 20252025-05-312210200.9%2025-05-26461
Jun 20252025-06-302250200.9%2025-06-25431
Jul 20252025-07-312870200.7%2025-07-25400
Aug 20252025-08-312100201.0%2025-08-24369
Sep 20252025-09-302290200.9%2025-09-30339
Oct 20252025-10-312160311.4%2025-10-25308
Nov 20252025-11-302940311.0%2025-11-30278
Dec 20252025-12-312150200.9%2025-12-26247
Jan 20262026-01-312280311.3%2026-01-26216
Feb 20262026-02-282200200.9%2026-02-28188
Mar 20262026-03-312270311.3%2026-03-25157
Apr 20262026-04-302220200.9%2026-04-27127
May 20262026-05-313480310.9%2026-05-3196
Jun 20262026-06-303120421.3%2026-06-3066
Jul 20262026-07-313356752.1%2026-07-3135
Aug 20262026-08-3135741082.8%2026-08-314
Sep 20262026-09-303772820185.3%2026-09-30−26
Oct 20262026-10-312022100%2026-10-02−57
25 periods · none closed · none locked6,2403884401.3%Genuine journal activity concentrates in the last 3 periods (31 of 40)

4Journal population and process model

Figure 2 — The 40 genuine journals classified by purpose (A4–A6). Counts and debit totals.

ClassJournalsDebit totalEntries
Capital injection ("Negative Cash Flow": Dr 1010 Cash / Cr 3510 Capital Stock)8680,000.00JE151 Oct-25 50K · JE152 Nov-25 120K · JE153 Jan-26 100K · JE154 May-26 50K · JE155 Jun-26 175K · JE156 Jul-26 50K · JE157 Aug-26 15K · JE158 Sep-26 120K
Inventory reclassification (no memo; Cr 1210 Inventory / Dr A/R, A/P, Cash)3262,000.00JE160 Dr 1110 A/R 85,000 · JE161 Cr 2010 A/P 65,000 · JE162 Dr 1010 Cash 112,000 — all 2026-09-01, created 2026-09-14
Accrual + reversal pairs (system-linked)657,700.00JE49 → JE50 legal fees 2,000 · JE52 → JE53 rent 10,000 · void-payment JE 41132 → JE150 33,700
Test entry + reversal (memo-linked, Atlas sweep)6600.00JE166 → JE171 · JE167 → JE168 · JE169 → JE170 (all 2026-09-17, $100 each, 1014 Payroll ↔ 1010 Checking)
Other test entries3755.00JE163 "Test" Dr 1100 A/R / Cr 5340 COGS 100 · JE164 "Test 1138" Dr 1100 / Cr 1090 555 · JE165 "Test 1217" petty cash 100
Reclassification / allocation26,084.10JE86 "Reclass1" rent accrual 2,880 · JE89 marketing allocation 3,204.10 (6 lines, all within 6757)
Advanced intercompany journal36,000.00JE91 Jul · JE92 Aug · JE93 Sep — 1,000 Sub 2 → Sub 3 via 6900 (§7)
Recurring / operational51,665.00JE51, JE97, JE98 vehicle insurance 300 · JE78 depreciation 750 · JE79 prepayment for PO318 15
Fixed-asset depreciation (book-specific)3207.62JE99 24.28 (pending) · JE100 91.67 · JE101 91.67 (pending)
Pending, unclassified1200.00JE88 Dr 2010 A/P / Cr 6610 Rent — Sep 2026, Pending Approval
Total401,015,211.7236 Approved for Posting · 4 Pending Approval · 33 JOURNAL · 4 BOOK_SPECIFIC · 3 ADVANCED_INTERCOMPANY

Journal lifecycle model

Figure 3 — Journal lifecycle as observed. Solid = evidenced by a system field or system note; dashed = inferred from header state only. Counts are journals.

The reference lifecycle is Created → (Pending Approval → Approved) → Posted → [Reversed]. What the account evidences: 40 created (9 with a create note, 31 without); 4 currently Pending Approval; 1 observed approval transition (JE100); 36 posted; 6 reversed by a linked entry. There is no rejection, no edit-after-post, no reopen, and no voided journal. Because the approval step leaves a system note only when it happens through the UI and every other journal arrived Approved for Posting at creation, the process is effectively Created-as-Approved → Posted for 35 of 40 entries.

5Reversal, reclassification and approval trail

Reversal pairs (6)

OriginalPostedAmountReversalPostedDaysLinkageNature
JE49 accrue legal fees2026-08-12 (Aug 2026)2,000.00JE502026-09-01 (Sep 2026)20reversal field, both directionsMonth-end accrual, auto-reversed next period — textbook
JE52 rent expense accrual2026-10-01 (Oct 2026)10,000.00JE532026-10-02 (Oct 2026)1reversal fieldAccrual and reversal in the same period, one day apart — net zero effect; future-dated
41132 (void of payment 00000005/1-12102024-181841)2026-03-0133,700.00JE1502026-03-03 (Mar 2026)2reversal field; isreversal=TReversal of a voided vendor payment (P2P study §8-E); Ben Morgan, Controller
JE166 Atlas sweep test2026-09-17100.00JE1712026-09-170memo + externalid onlyTest entry reversed same day; memo says "orphan from first sweep run (pre-reverseJE fix)"
JE167 Atlas sweep test2026-09-17100.00JE1682026-09-170memo + externalid onlyTest entry reversed same day
JE169 Atlas sweep test2026-09-17100.00JE1702026-09-170memo + externalid onlyTest entry reversed same day

Reversal rate: 6 of 40 genuine journals are reversals (15.0%); 12 of 40 (30.0%) participate in a reversal pair. Excluding test entries, 3 of 31 substantive journals are reversals (9.7%), and all three are legitimate accrual or void reversals. Median original → reversal interval: 1.5 days overall; 20 days for the one genuine month-end accrual (JE49 → JE50). Half of the reversal pairs are invisible to a search on the reversal field — the Atlas-generated reversals set memo and externalid but not the system reversal link.

Reclassification and allocation (5)

JournalDateAmountPattern
JE86 "Rent Expense Accrual", externalid Reclass12026-09-152,880.00Dr 6610 Rent / Cr 2210 Accrued Expenses — labelled reclass, shaped like an accrual; created 2026-09-13, two days before its trandate
JE89 marketing allocation2026-08-273,204.10Six lines all within account 6757 — two "Allocation Source" credits (1,500 + 1,704.10) spread across four "Allocation" debits (801.03 ×3 + 801.01); a departmental re-spread with no department set on any line
JE91 · JE92 · JE93Jul · Aug · Sep 20261,000.00 eachAdvanced Intercompany allocation: Sub 2 Dr 6900 IC Expenses / Cr 6250 Automobile; Sub 3 Dr 6250 / Cr 6900 — moves $1,000 of automobile expense from Sub 2 to Sub 3 each month (§7)

Approval trail

JournalTrandate · PeriodAmountStatusLast modified byCreatedNext approverNote
JE99 LP - Capitalize Asset JE2026-07-01 · Jul 202624.28Pending ApprovalEmma Richards (Accountant)2026-09-21—Period ended 35 days ago
JE101 book-specific depreciation2026-07-31 · Jul 202691.67Pending Approval-System-2026-09-21—Fixed-asset module output awaiting approval; sibling JE100 was approved
JE159 prepaid rent2026-08-01 · Aug 202610,000.00Pending ApprovalKathryn Glass2026-09-09—Largest pending; Dr 6610 Rent / Cr 1400 Prepaid
JE882026-09-13 · Sep 2026200.00Pending ApprovalKathryn Glass2026-09-30—No memo
4 pending · $10,316 · no approver assigned on any10,315.95Only observed approval: JE100 — Pending Approval → Approved for Posting, 2026-05-10 18:37, by Timothy Dietrich (Administrator), who is also its lastmodifiedby; no separate creator recorded

6Who touched what

Figure 4 — Genuine journals by last-modifying identity (bars) and by creator where recorded (dots).

IdentityResolved asLast modifiedCreated (recorded)System notesJournalsObservation
−5Kathryn Glass2700JE49–53, 78, 79, 86, 88, 89, 91–93, 97, 98, 151–162A negative internal id resolving to an employee name — a system/import identity aliased to a person. Owns all capital injections ($680K), all inventory reclasses ($262K), all IC journals and 2 of 4 pending. Zero audit notes on any of the 27.
3894Timothy Dietrich (Administrator)10929JE100, 163–171All 9 test entries and the one observed approval (self-approved JE100). The only identity with an audit trail. Context: SLT (UI) for JE163–165, RST (RESTlet) for JE166–171.
−4-System-1 (+48 Beg Balance)00JE101Fixed-asset module depreciation journal.
143Emma Richards (Accountant Boss, Sub 1)100JE99Pending approval since entry.
149Ben Morgan (Controller, Sub 1)100JE150Reversal of the voided $33,700 vendor payment — the one journal touched by the Controller.
5 identities40929No journal has a recorded creator different from its last modifier → no maker/checker separation is observable anywhere

Segregation of duties cannot be demonstrated from the record: no journal shows a creator, approver and poster as three different people; the single observed approval was performed by the entrant; the finance roles (Controller, Accountant) touch one journal each while a system-aliased identity carries 67.5% of entries, including every entry over $10,000.

7Intercompany and elimination

ElementEvidenceState
Elimination subsidiarySubsidiary 4 "xElim" (iselimination=T)0 transaction lines in all history
Elimination-flagged accounts1910 Intercompany Receivables US · 2910 Intercompany Payables - US (account.eliminate=T)0 postings each
Elimination-flagged linestransactionline.eliminate='T'0
Intercompany accounts with activity6900 Intercompany Expenses (6 lines, JE91–93) · 1091 Intercompany Clearing (2 lines)Used, but neither is elimination-flagged; 4900 IC Revenue, 5900 IC COGS, 1900/2900 IC AR/AP parents: 0 postings
Advanced Intercompany JournalsJE91 2026-07-10 · JE92 2026-08-11 · JE93 2026-09-11 — $1,000 eachBoth sides post to 6900; Sub 2 Dr / Sub 3 Cr — the account nets to zero on consolidation arithmetically, without an elimination entry
Intercompany transfer ordersTO13 2026-08-01 Received (→ IR405) · TO14 2026-09-03 Pending Fulfillment · TO12 2026-09-08 Pending Receipt — Sub 2 → Sub 3, $3.99 each1 complete, 2 open
Intercompany PO ↔ SO pairsPO374 ↔ SO3148 (Interco Vendor US1-US2 / Interco Client US2-US1) · PO375 ↔ SO3149 — 2026-09-25, $29.99 each, intercotransaction populatedBoth Pending Receipt / Pending Fulfillment — future-dated
Elimination has never run
The configuration is in place — an elimination subsidiary, two eliminate-flagged accounts, paired intercompany entities — but every consolidated report ever produced from this account has been produced without an elimination pass. The current intercompany exposure that would need eliminating is small ($3,000 of 6900 expense across Sub 2/Sub 3, which nets arithmetically, plus $67.96 of open goods movement), so the balance-sheet consequence today is immaterial. The process consequence is not: there is no evidence anyone has ever executed the intercompany elimination step of a close in this account.

8Exception registers

Complete lists. Ages as at 2026-09-04.

8-A · Open periods past end (57) — summary by year

YearOpen periodsRangeDays open (oldest → newest)Posting txnsNote
20211Dec 20211,7080Oldest open period; nothing posted to it
202212Jan – Dec 20221,677 → 1,3430Empty
202312Jan – Dec 20231,312 → 9780Empty
202412Jan – Dec 2024947 → 612784Oct–Dec 2024 hold live history
202512Jan – Dec 2025581 → 2472,828Full year of live history, all open
20268Jan – Aug 2026216 → 42,249Current fiscal year
Total57Dec 2021 – Aug 2026median 8575,861Plus 379 postings in the current/future Sep–Oct 2026

8-B · All genuine journals (40)

JEIdTrandatePeriodCreatedStatusTypeDebitsSubLast modified byClassMemo
JE151417772025-10-01Oct 20252026-09-12ApprovedJOURNAL50,000.002Kathryn GlassCapitalNegative Cash Flow
JE152417782025-11-01Nov 20252026-09-12ApprovedJOURNAL120,000.002Kathryn GlassCapitalNegative Cash Flow
JE153417792026-01-01Jan 20262026-09-12ApprovedJOURNAL100,000.002Kathryn GlassCapitalNegative Cash Flow
JE150411332026-03-03Mar 20262026-09-10ApprovedJOURNAL33,700.002Ben MorganReversal00000005/1-12102024-181841
JE154417802026-05-01May 20262026-09-12ApprovedJOURNAL50,000.002Kathryn GlassCapitalNegative Cash Flow
JE155417812026-06-01Jun 20262026-09-12ApprovedJOURNAL175,000.002Kathryn GlassCapitalNegative Cash Flow
JE100317362026-06-30Jun 20262026-09-21ApprovedBOOK_SPECIFIC91.672Timothy DietrichDepreciation
JE97317072026-07-01Jul 20262026-09-08ApprovedJOURNAL300.002Kathryn GlassRecurringMonthly Vehicle Insurance
JE99317252026-07-01Jul 20262026-09-21PendingJOURNAL24.282Emma RichardsDepreciationLP - Capitalize Asset JE
JE156417822026-07-01Jul 20262026-09-12ApprovedJOURNAL50,000.002Kathryn GlassCapitalNegative Cash Flow
JE91286672026-07-10Jul 20262026-09-30ApprovedADV_INTERCOMPANY2,000.002,3Kathryn GlassIntercompany
JE101317372026-07-31Jul 20262026-09-21PendingBOOK_SPECIFIC91.672-System-Depreciation
JE512042026-08-01Aug 20262026-09-26ApprovedJOURNAL300.002Kathryn GlassRecurringMonthly Vehicle Insurance
JE98317082026-08-01Aug 20262026-09-08ApprovedJOURNAL300.002Kathryn GlassRecurringMonthly Vehicle Insurance
JE157417832026-08-01Aug 20262026-09-12ApprovedJOURNAL15,000.002Kathryn GlassCapitalNegative Cash Flow
JE159420292026-08-01Aug 20262026-09-09PendingBOOK_SPECIFIC10,000.002Kathryn GlassPending
JE92286702026-08-11Aug 20262026-09-30ApprovedADV_INTERCOMPANY2,000.002,3Kathryn GlassIntercompany
JE492012026-08-12Aug 20262026-09-26ApprovedJOURNAL2,000.002Kathryn GlassAccrual (reversed)accrue for legal fees in property damage dispute claim
JE89286642026-08-27Aug 20262026-09-30ApprovedBOOK_SPECIFIC3,204.102Kathryn GlassAllocation
JE79241512026-08-31Aug 20262026-09-08ApprovedJOURNAL15.002Kathryn GlassOperationalPrepayment for PO318
JE502022026-09-01Sep 20262026-09-26ApprovedJOURNAL2,000.002Kathryn GlassReversalaccrue for legal fees in property damage dispute claim
JE158418052026-09-01Sep 20262026-09-16ApprovedJOURNAL120,000.002Kathryn GlassCapitalNegative Cash Flow
JE160420392026-09-01Sep 20262026-09-14ApprovedJOURNAL85,000.002Kathryn GlassInventory reclass
JE161420402026-09-01Sep 20262026-09-14ApprovedJOURNAL65,000.002Kathryn GlassInventory reclass
JE78241272026-09-07Sep 20262026-09-07ApprovedJOURNAL750.002Kathryn GlassOperationalJE - LP
JE163422592026-09-08Sep 20262026-09-08ApprovedJOURNAL100.001Timothy DietrichTestTest
JE164422602026-09-08Sep 20262026-09-08ApprovedJOURNAL555.001Timothy DietrichTestTest 1138
JE93286712026-09-11Sep 20262026-09-30ApprovedADV_INTERCOMPANY2,000.002,3Kathryn GlassIntercompany
JE88286582026-09-13Sep 20262026-09-30PendingJOURNAL200.002Kathryn GlassPending
JE162420412026-09-14Sep 20262026-09-14ApprovedJOURNAL112,000.002Kathryn GlassInventory reclass
JE86274232026-09-15Sep 20262026-09-13ApprovedJOURNAL2,880.002Kathryn GlassReclassRent Expense Accrual
JE165423292026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichTestTest 1217
JE166423302026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichTest (reversed)Atlas sweep test JE (sweep-test-1779080388)
JE167423312026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichTest (reversed)Atlas sweep test JE (sweep-test-1779080976)
JE168423322026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichReversal (test)Reversal of JE167
JE169423332026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichTest (reversed)Atlas sweep test JE (sweep-test-1779081054)
JE170423342026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichReversal (test)Reversal of JE169
JE171423352026-09-17Sep 20262026-09-17ApprovedJOURNAL100.002Timothy DietrichReversal (test)Reversal of JE166
JE522112026-10-01Oct 20262026-10-15ApprovedJOURNAL10,000.002Kathryn GlassAccrual (reversed)Rent Expense Accrual
JE532122026-10-02Oct 20262026-10-15ApprovedJOURNAL10,000.002Kathryn GlassReversalRent Expense Accrual
40 journals · 36 approved · 4 pending · 12 in reversal pairs · 9 tests1,015,211.72Debits summed once per journal (IC journals counted across both subsidiaries)

8-C · Test entries posted to production (9)

JE163 (Dr 1100 A/R / Cr 5340 COGS, $100, Parent Company), JE164 (Dr 1100 A/R / Cr 1090 Undeposited Funds, $555, Parent Company), JE165 (petty cash ↔ checking, $100), JE166–JE171 (1014 Payroll ↔ 1010 Checking, $100 each, three pairs net to zero). Net residual on the ledger: JE163 + JE164 + JE165 = $755 of unreversed test postings — $655 of it inflating Parent Company A/R and understating COGS / Undeposited Funds in Sep 2026. All nine were entered by the administrator between 2026-05-08 and 2026-05-17 (system-note clock) into Sep 2026 trandates.

8-D · Intercompany documents (9) — see §7 table

9Data quality — what limits the analysis

LimitationEvidenceWhat it prevents
No system notes on accounting periods0 notes on 168 period records; only closedondate survivesLock sequence, reopen events, who closed, soft-vs-hard close — all unobservable
Two clocksSystem notes on JE163–171 are dated 2026-05-08 → 05-17; the same journals' createddate and trandate read 2026-09-08 → 09-17; DB SYSDATE = 2026-09-04A ~4-month offset between the note clock and the transaction clock; timing across the two sources cannot be combined
createddate is a load date100% of Oct 2024 – Aug 2026 postings have createddate after their period end (max 686 days); Sep 2026 has 2 of 377Late-posting and cutoff analysis impossible; only trandate-vs-period mismatch is testable (0 found)
Creator not recordedcreatedby NULL on 31 of 40 genuine journals and on all 48 Beg Balance journalsMaker/checker separation cannot be evidenced
Negative-id identities resolve to nameslastmodifiedby = −5 → "Kathryn Glass" (27 journals); −4 → "-System-"Attribution to a human is unreliable for two-thirds of journals
Half of reversals unlinkedJE168/170/171 have memo "Reversal of JE…" and externalid "reversal-of-<id>" but reversal and isreversal are NULL/FA field-based reversal search finds 3 of 6 pairs
Synthetic ledger48 "Beg Balance Entries" journals, JE102–JE149, ~$0.75–0.93M/monthExcluded here; any GL reconciliation must exclude them too
Future-dated activitySep 2026 (26 days ahead) and Oct 2026 hold 379 postings and 20 journals"Current period" analysis is partly forward-looking

10Findings and recommended actions

  1. Institute the close — start by locking, not closing. Fifty-seven periods past their end are open to posting; the 25 that carry live history (Oct 2024 → Aug 2026, $19.8M gross in 2026) can be altered by anyone with transaction permissions and no note would record it. Lock A/R, A/P and All on every period through Jul 2026 now; close Dec 2021 → Dec 2024 (zero or complete activity) outright; then adopt a standing rule — lock by working day 5, close by working day 10 — and enforce it through the Period Close Checklist so the close leaves a trail. Measure cycle time from the first month this is done; today it cannot be measured because it does not occur.
  2. Clean the journal population and close the approval gap. Reverse JE163, JE164 and JE165 ($755 of test postings sitting in Parent Company A/R, COGS, Undeposited Funds and petty cash — the six Atlas pairs already net to zero). Assign an approver and clear the four pending journals ($10,316; JE99 and JE101 are in a period that ended 35 days ago). Require the reversal link on script-generated reversals so all six pairs — not three — are discoverable. Enforce a memo on every journal: JE88, JE89, JE91–93, JE100–101, JE159–162 ($292K) have none.
  3. Run elimination once, then every month. The elimination subsidiary and eliminate-flagged accounts exist and have never been used; JE91–93 are the only intercompany postings and they self-net, so a first elimination run will post nothing material — which is exactly the right moment to establish the step. Pair it with the actor finding: two-thirds of journals, including all eight capital injections ($680K) and three inventory reclasses ($262K, no memo, created the same day), are attributed to a negative-id system identity that displays as a person; the Controller has touched one journal. Decide who owns journals in this account and make the record show it.

AAppendix A — SuiteQL used

Verbatim as executed. Q1–Q2 feed the reducer; the rest are probes and registers.

Q1 — Monthly periods with close state (reducer input periods)

SELECT id, periodname, TO_CHAR(startdate,'YYYY-MM-DD') AS startdate, TO_CHAR(enddate,'YYYY-MM-DD') AS enddate, closed,
       TO_CHAR(closedondate,'YYYY-MM-DD') AS closedon, alllocked, aplocked, arlocked
FROM accountingperiod WHERE isquarter='F' AND isyear='F'

Q2 — Period-bearing transactions (reducer input txns)

SELECT t.id, t.type, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, TO_CHAR(t.createddate,'YYYY-MM-DD') AS created,
       t.postingperiod, t.posting, t.status, t.journaltype, t.isreversal, t.reversal, t.createdby, t.lastmodifiedby,
       CASE WHEN t.memo LIKE 'Beg Balance%' THEN 'T' ELSE 'F' END AS begbal,
       CASE WHEN t.memo LIKE 'Reversal of%' OR t.externalid LIKE '%reversal-of%' THEN 'T' ELSE 'F' END AS memo_reversal,
       CASE WHEN t.externalid LIKE 'Reclass%' OR t.memo LIKE '%Reclass%' OR t.memo LIKE '%Allocation%' THEN 'T' ELSE 'F' END AS reclass
FROM transaction t
WHERE t.postingperiod IS NOT NULL
  AND t.type NOT IN ('SalesOrd','PurchOrd','Estimate','Opprtnty','WorkOrd','TrnfrOrd','VendAuth','RtnAuth','PurchReq')

Q3 — Journal 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.memo LIKE 'Beg Balance%' THEN 1 ELSE 0 END) AS beg_bal, SUM(CASE WHEN t.posting='T' THEN 1 ELSE 0 END) AS posting
FROM transaction t WHERE UPPER(t.type) LIKE '%JOURNAL%' GROUP BY t.type

Q4 — System notes on journals (field coverage)

SELECT sn.field, sn.type, COUNT(*) AS notes, COUNT(DISTINCT sn.recordid) AS journals, COUNT(DISTINCT sn.name) AS actors
FROM systemnote sn JOIN transaction t ON t.id = sn.recordid AND sn.recordtypeid = -30
WHERE t.type = 'Journal' GROUP BY sn.field, sn.type ORDER BY COUNT(*) DESC

Q5 — System notes on accounting periods (none found)

SELECT sn.recordtypeid, sn.field, COUNT(*) AS notes, COUNT(DISTINCT sn.recordid) AS recs
FROM systemnote sn WHERE UPPER(sn.field) LIKE '%LOCK%' OR UPPER(sn.field) LIKE '%CLOSE%'
   OR UPPER(sn.field) LIKE '%ACCTPERIOD%' OR UPPER(sn.field) LIKE '%ACCOUNTINGPERIOD%'
GROUP BY sn.recordtypeid, sn.field ORDER BY COUNT(*) DESC

Q6 — Genuine journals with lineage fields

SELECT t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, TO_CHAR(t.createddate,'YYYY-MM-DD') AS created,
       ap.periodname, BUILTIN.DF(t.status) AS status_label, t.posting, t.isreversal, t.reversal,
       TO_CHAR(t.reversaldate,'YYYY-MM-DD') AS reversaldate, t.journaltype, t.createdby, t.lastmodifiedby,
       BUILTIN.DF(t.createdby) AS created_by, t.externalid, t.memo
FROM transaction t LEFT JOIN accountingperiod ap ON ap.id = t.postingperiod
WHERE t.type = 'Journal' AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%') ORDER BY t.trandate, t.id

Q7 — Journal line composition

SELECT t.id, t.tranid, tl.subsidiary, a.accttype, COUNT(*) AS lines,
       ROUND(SUM(CASE WHEN tal.amount > 0 THEN tal.amount ELSE 0 END),2) AS debits,
       ROUND(SUM(CASE WHEN tal.amount < 0 THEN -tal.amount ELSE 0 END),2) AS credits,
       MAX(a.acctnumber || ' ' || a.fullname) AS sample_account
FROM transaction t JOIN transactionline tl ON tl.transaction = t.id
JOIN transactionaccountingline tal ON tal.transaction = t.id AND tal.transactionline = tl.id JOIN account a ON a.id = tal.account
WHERE t.type = 'Journal' AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%')
GROUP BY t.id, t.tranid, tl.subsidiary, a.accttype ORDER BY t.id, tl.subsidiary, a.accttype

Q8 — Full system-note trail on journals

SELECT t.tranid, sn.recordid, TO_CHAR(sn.date,'YYYY-MM-DD HH24:MI') AS note_time, sn.name AS actor_id, BUILTIN.DF(sn.name) AS actor,
       sn.field, sn.type, sn.oldvalue, sn.newvalue, sn.context, BUILTIN.DF(sn.role) AS role
FROM systemnote sn JOIN transaction t ON t.id = sn.recordid AND sn.recordtypeid = -30
WHERE t.type = 'Journal' ORDER BY sn.date, sn.recordid

Q9 — Pending-approval queue

SELECT t.id, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, TO_CHAR(t.createddate,'YYYY-MM-DD') AS created, ap.periodname,
       t.journaltype, t.nextapprover, BUILTIN.DF(t.nextapprover) AS approver, t.approvalstatus, BUILTIN.DF(t.lastmodifiedby) AS last_modified_by,
       t.memo, (SELECT ROUND(SUM(CASE WHEN tal.amount > 0 THEN tal.amount ELSE 0 END),2) FROM transactionaccountingline tal WHERE tal.transaction = t.id) AS debit_total
FROM transaction t LEFT JOIN accountingperiod ap ON ap.id = t.postingperiod WHERE t.type = 'Journal' AND t.posting = 'F' ORDER BY t.trandate

Q10 — Intercompany / elimination evidence

SELECT (SELECT COUNT(*) FROM transactionline WHERE eliminate = 'T') AS elim_flagged_lines,
       (SELECT COUNT(*) FROM transactionline WHERE subsidiary = 4) AS sub4_lines,
       (SELECT COUNT(*) FROM account WHERE eliminate = 'T') AS elim_accounts,
       (SELECT COUNT(*) FROM transaction WHERE intercompany = 'T') AS interco_flagged_txns,
       (SELECT COUNT(*) FROM transaction WHERE intercotransaction IS NOT NULL) AS interco_paired_txns,
       (SELECT COUNT(*) FROM accountingperiod WHERE isquarter='F' AND isyear='F' AND closed='F' AND enddate < SYSDATE) AS open_periods_past_end,
       (SELECT MIN(periodname) FROM accountingperiod WHERE isquarter='F' AND isyear='F' AND closed='F') AS oldest_open_period
FROM dual;

SELECT a.id, a.acctnumber, a.fullname, a.accttype, a.eliminate, (SELECT COUNT(*) FROM transactionaccountingline tal WHERE tal.account = a.id) AS postings
FROM account a WHERE a.eliminate = 'T' OR a.fullname LIKE '%Intercompany%' OR a.fullname LIKE '%Elimination%' ORDER BY a.acctnumber;

SELECT t.id, t.type, t.tranid, TO_CHAR(t.trandate,'YYYY-MM-DD') AS trandate, BUILTIN.DF(t.status) AS status_label, t.intercompany, t.intercotransaction,
       BUILTIN.DF(t.entity) AS entity, t.tosubsidiary, ROUND(ABS(t.foreigntotal),2) AS total
FROM transaction t WHERE t.intercompany = 'T' OR t.intercotransaction IS NOT NULL ORDER BY t.trandate, t.id

Q11 — Trandate vs posting period mismatch (0 rows)

SELECT t.type, COUNT(*) AS docs FROM transaction t JOIN accountingperiod ap ON ap.id = t.postingperiod
WHERE t.posting = 'T' AND (t.trandate < ap.startdate OR t.trandate > ap.enddate) GROUP BY t.type

Q12 — Close batches

SELECT TO_CHAR(closedondate,'YYYY-MM-DD') AS closed_on, COUNT(*) AS periods, MIN(periodname) AS first_period, MAX(periodname) AS last_period,
       MIN(closedondate - enddate) AS min_days, ROUND(AVG(closedondate - enddate),0) AS avg_days, MAX(closedondate - enddate) AS max_days
FROM accountingperiod WHERE isquarter='F' AND isyear='F' AND closed='T' GROUP BY TO_CHAR(closedondate,'YYYY-MM-DD') ORDER BY 1
Query notes
Two probes failed and are recorded: GROUP BY BUILTIN.DF(t.lastmodifiedby) → "Invalid or unsupported search" (group on the raw id, resolve in a separate SELECT); accountingperiodclosetask → "Invalid search type" (the Period Close Checklist has no SuiteQL surface). closedondate − enddate returns fractional days (time component on closedondate); whole-day figures are floored.

BAppendix B — Reducer logic

// sqlReduce, contract "whole": rows.periods (168), rows.txns (6,292)
P = indexBy(periods, id); today = 2026-09-04
for each period: rs = txns in period; posting = rs.posting==='T'; je = type==='Journal'; realJe = je && begbal==='F'
  reversalJe = realJe with isreversal==='T' or memo_reversal==='T'; reversedJe = realJe with reversal set and not itself a reversal
  reclassJe = realJe.reclass==='T'; icJe = journaltype contains 'INTERCOMPANY'; pendingJe = realJe.posting==='F'
  daysOpen = closed ? null : daysBetween(enddate, today); closeDays = closedon ? daysBetween(enddate, closedon) : null
closeCycleDays = H.stats(closed periods' closeDays); closeBatches = countBy(closedon)
openPastEnd = open periods with enddate < today → H.stats(daysOpen)
actor matrix = countBy(realJE, lastmodifiedby) and countBy(realJE, createdby); reversalPairs from isreversal rows; memoReversals from memo flag
return per-period rows for Oct 2024 → Oct 2026 + aggregates (6.6 KB)

Worker 18 ms; queries 944 ms; 1.75 MB decoded / 147 KB on wire. Classification of the 40 journals into purpose classes (§4) was done from Q6/Q7 output by inspection — the population is small enough that every entry is listed in §8-B.

CAppendix C — Worked hand-check

CheckWorkingResult
Period counts71 closed + 57 open past end + 40 future/current = 168✓
Close batches34 + 1 + 13 + 23 = 71✓
Nov 2021 close cycleclosedondate 2022-02-09 − enddate 2021-11-30 = 71 days (the minimum)✓ matches Q12 min
Dec 2021 days open2026-09-04 − 2021-12-31 = 1,708✓ matches reducer max
Journal counts88 = 48 Beg Balance + 40 genuine; 40 = 36 Approved + 4 Pending; 33 JOURNAL + 4 BOOK_SPECIFIC + 3 ADV_IC = 40✓
Purpose classes8 + 3 + 6 + 6 + 3 + 2 + 3 + 5 + 3 + 1 = 40✓
Debit total680,000 + 262,000 + 57,700 + 600 + 755 + 6,084.10 + 6,000 + 1,665 + 207.62 + 200 = 1,015,211.72✓
Actors27 + 10 + 1 + 1 + 1 = 40; creators 9 recorded + 31 NULL = 40✓
Reversal pairs3 system-linked (JE49→50, JE52→53, 41132→JE150) + 3 memo-linked (JE166→171, 167→168, 169→170) = 6; 12 journals involved = 30%✓
Consolidated payment tie-inJE150 $33,700 = P2P study voided payment 00000005/1-12102024-181841 $33,700✓ cross-study
Window postingsΣ type mix Oct 2024 → Oct 2026 = 6,240; Journal 84 → 1.3%✓

DAppendix D — Glossaries and run metadata

Status codes (live labels)

TypeCodeLabelDocs
JournalBApproved for Posting84
JournalAPending Approval4

Journal types observed

journaltypeDocs
JOURNAL81 (33 genuine)
BOOK_SPECIFIC_JOURNAL4
BOOK_SPECIFIC_ADVANCED_INTERCOMPANY_JOURNAL3

System-note contexts

SLT Suitelet/UI · RST RESTlet. Field ids: TRANDOC.KSTATUS status · TRANDOC.NKEY create · TRANDOC.SDOCNUM number · TRANDOC.KSUBSIDIARYMAIN subsidiary · TRANDOC.IMPACT GL impact flag.

Run metadata

ItemValue
Account / environmentTD3016323 · production · OneWorld · USD
Analysis date2026-09-04 (SYSDATE 07:01)
ToolingSonar AI v1.15.0 · 1 sqlReduce (whole) · 17 runSql probes/registers · no records created, modified or deleted
Inputs168 periods · 6,292 transactions · 29 system notes · 9 accounts · 9 IC documents
CompanionsOrder-to-Cash and Procure-to-Pay object-centric studies, same account and date; JE150 and the voided payment cross-reference P2P §8-E
PrivacyEmployee names appear in §6 as resolved by the account; a redacted edition can be produced on request