code wiki / (root) / nx_money_ledger_gate.nx

nx_money_ledger_gate.nx source

↩ module page · 53 lines · 3110 B

1// nx_money_ledger_gate.nx -- proves the sovereign data-in path end-to-end: parse a real statement CSV, sum income, 2// auto-categorize outflows (need/want/save + recurring), then run nx_spend_analyze ON THE INGESTED DATA (integration: 3// CSV -> ledger -> analyzer). Exit 0 iff all pass. license_tier: ORIGINAL 4import "nx_gate.nx" 5import "nx_money_ledger.nx" 6 7func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 8 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 9 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) } 10 return 0 11} 12 13func main() -> i64 { 14 let st: *i64 = sys_mmap(16) as *i64 15 st[0] = 0; st[1] = 0 16 17 let csv: *u8 = "2024-01-01,PAYROLL DEPOSIT,3000.00\n2024-01-02,RENT PAYMENT,-1500.00\n2024-01-03,WHOLE FOODS MARKET,-85.50\n2024-01-05,NETFLIX SUBSCRIPTION,-15.99\n2024-01-06,STARBUCKS COFFEE,-6.50\n2024-01-10,TRANSFER TO SAVINGS,-200.00\n" as *u8 18 var len: i64 = 0; while csv[len] != (0 as u8) { len = len + 1 } 19 20 let sp: *i64 = sys_mmap(8 * SP_FIELDS * 16) as *i64 21 let inc: *i64 = sys_mmap(16) as *i64 22 let n: i64 = lg_parse_csv(csv, len, sp, 16, inc) 23 24 chk("parsed outflow rows = 5" as *u8, n, 5, st) 25 chk("income (inflows) = $3000" as *u8, inc[0], 300000, st) 26 27 // amount parser spot-checks 28 chk("parse \"-1500.00\" = -150000c" as *u8, lg_parse_amount("-1500.00" as *u8, 0, 8), 0 - 150000, st) 29 chk("parse \"-6.50\" = -650c" as *u8, lg_parse_amount("-6.50" as *u8, 0, 5), 0 - 650, st) 30 31 // categorization of specific rows 32 chk("row0 RENT -> class NEED" as *u8, sp[0*SP_FIELDS+1], SP_NEED, st) 33 chk("row0 RENT -> recurring 1" as *u8, sp[0*SP_FIELDS+2], 1, st) 34 chk("row0 RENT -> $1500" as *u8, sp[0*SP_FIELDS+0], 150000, st) 35 chk("row2 NETFLIX -> class WANT" as *u8, sp[2*SP_FIELDS+1], SP_WANT, st) 36 chk("row2 NETFLIX -> recurring 1" as *u8, sp[2*SP_FIELDS+2], 1, st) 37 chk("row2 NETFLIX -> $15.99" as *u8, sp[2*SP_FIELDS+0], 1599, st) 38 chk("row3 STARBUCKS -> WANT, not recurring" as *u8, sp[3*SP_FIELDS+2], 0, st) 39 chk("row4 SAVINGS -> class SAVE" as *u8, sp[4*SP_FIELDS+1], SP_SAVE, st) 40 41 // INTEGRATION: run the analyzer on the ingested ledger 42 chk("analyzer: total outflow = $1807.99" as *u8, sp_total(sp, n), 180799, st) 43 chk("analyzer: needs = $1585.50" as *u8, sp_total_by_class(sp, n, SP_NEED), 158550, st) 44 chk("analyzer: wants = $22.49" as *u8, sp_total_by_class(sp, n, SP_WANT), 2249, st) 45 chk("analyzer: savings = $200" as *u8, sp_total_by_class(sp, n, SP_SAVE), 20000, st) 46 chk("analyzer: cancellable subs = $15.99 (Netflix)" as *u8, sp_recurring_want_total(sp, n), 1599, st) 47 chk("analyzer: largest want = row 2 (Netflix)" as *u8, sp_largest_want(sp, n), 2, st) 48 49 gw("nx_money_ledger_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8) 50 if st[1] == 0 { gw("nx_money_ledger: GREEN (sovereign CSV -> ledger -> auto-categorize -> analyzer, end-to-end)\n" as *u8); return 0 } 51 gw("nx_money_ledger: RED\n" as *u8) 52 return 1 53}