code wiki / _hdl_build / nx_vizsla_deal.nx
nx_vizsla_deal.nx source
↩ module page · 427 lines · 17642 B
1// nx_vizsla_deal.nx -- NISHI VIZSLA business CRM: the deal/pipeline focus (operator 2026-06-23: "crm for
2// business ... with seperate focuses"). What makes a CRM more than relationship-tending: DEALS with pipeline
3// STAGES + value + a stage-weighted forecast. Same sovereign CID/seg_store plane as money (V1) + relationships
4// (V4): a deal is a record, a stage change is an ADDITIVE event (latest-by-date wins, history kept). Lives in
5// the business realm's deal store. The stage->win-probability map is the MODEL AS DATA (refine = edit, law 11).
6// load <dealfile> <prefix> [segid] DEAL <id> <account> <value_cents> <title> -> "deal:" records
7// STAGE <date> <deal-id> <stage> -> "stg:" records
8// pipeline <prefix> <today> per deal: latest stage, value, weighted=value*prob; verdict =
9// deals/open/won/lost + total_value/won_value/weighted_pipeline
10// Stages: lead 10 / qualified 30 / proposal 50 / negotiation 70 / won 100 / lost 0 (percent). Determinism:
11// stdout has no clocks (today via argv). Loud-fail: bad value/date, unknown stage. license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_canon_cid.nx"
14import "nx_seg_store.nx"
15const K_MAGIC_1970: i64 = 1970
16const K_MAGIC_146097: i64 = 146097
17const K_MAGIC_719468: i64 = 719468
18const K_MAGIC_2048: i64 = 2048
19const K_MAGIC_4096: i64 = 4096
20const K_MAGIC_1024: i64 = 1024
21const K_MAGIC_131072: i64 = 131072
22
23func vd_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
24func vd_p(s: *u8) -> i64 { sys_write(1, s, vd_slen(s)); return 0 }
25
26func vd_eq(a: *u8, b: *u8) -> i64 {
27 var i: i64 = 0
28 var go: i64 = 1
29 while go == 1 { if a[i] != b[i] { return 0 } if a[i] == (0 as u8) { return 1 } i = i + 1 }
30 return 0
31}
32
33func vd_dup(s: *u8) -> *u8 {
34 let n: i64 = vd_slen(s)
35 let d: *u8 = sys_mmap(n + 2)
36 var i: i64 = 0
37 while i <= n { d[i] = s[i]; i = i + 1 }
38 return d
39}
40
41func vd_atoi(s: *u8) -> i64 {
42 var v: i64 = 0
43 var i: i64 = 0
44 while s[i] != (0 as u8) { let d: i64 = (s[i] as i64) - 48; if d >= 0 { if d <= 9 { v = v * 10 + d } } i = i + 1 }
45 return v
46}
47
48func vd_digits(s: *u8) -> i64 {
49 if s[0] == (0 as u8) { return 0 }
50 var i: i64 = 0
51 while s[i] != (0 as u8) { let d: i64 = (s[i] as i64) - 48; if d < 0 { return 0 } if d > 9 { return 0 } i = i + 1 }
52 return 1
53}
54
55func vd_isws(c: i64) -> i64 {
56 if c == 32 { return 1 }
57 if c == 13 { return 1 }
58 if c == 9 { return 1 }
59 return 0
60}
61
62func vd_tok(b: *u8, off: i64, lend: i64, dst: *u8, cap: i64) -> i64 {
63 var p: i64 = off
64 var go: i64 = 1
65 while go == 1 { if p >= lend { go = 0 } else { if vd_isws(b[p] as i64) == 1 { p = p + 1 } else { go = 0 } } }
66 var t: i64 = 0
67 go = 1
68 while go == 1 {
69 if p >= lend { go = 0 } else {
70 if vd_isws(b[p] as i64) == 1 { go = 0 } else {
71 if t < cap - 1 { dst[t] = b[p]; t = t + 1 }
72 p = p + 1
73 }
74 }
75 }
76 dst[t] = 0 as u8
77 return p
78}
79
80func vd_cat(dst: *u8, off: i64, s: *u8) -> i64 {
81 var i: i64 = 0
82 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 }
83 return off + i
84}
85
86func vd_catn(dst: *u8, off: i64, v: i64) -> i64 {
87 var o: i64 = off
88 var m: i64 = v
89 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
90 let t: *u8 = sys_mmap(28)
91 var k: i64 = 0
92 if m == 0 { t[0] = 48 as u8; k = 1 }
93 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
94 var i: i64 = 0
95 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
96 return o + k
97}
98
99func vd_kmemeq(b: *u8, off: i64, n: i64, s: *u8) -> i64 {
100 if vd_slen(s) != n { return 0 }
101 var i: i64 = 0
102 while i < n { if b[off + i] != s[i] { return 0 } i = i + 1 }
103 return 1
104}
105
106func vd_field(rec: *u8, rl: i64, want: *u8, out: *u8, cap: i64) -> i64 {
107 if rl < 8 { return 0 }
108 let nf: i64 = ss_r32(rec, 4)
109 var off: i64 = 8
110 var fi: i64 = 0
111 while fi < nf {
112 if off + 8 > rl { return 0 }
113 let kl: i64 = ss_r32(rec, off)
114 let koff: i64 = off + 4
115 let vl: i64 = ss_r32(rec, koff + kl)
116 let voff: i64 = koff + kl + 4
117 if vd_kmemeq(rec, koff, kl, want) == 1 {
118 var t: i64 = 0
119 while t < vl { if t < cap - 1 { out[t] = rec[voff + t] } t = t + 1 }
120 if t > cap - 1 { t = cap - 1 }
121 out[t] = 0 as u8
122 return 1
123 }
124 off = voff + vl
125 fi = fi + 1
126 }
127 return 0
128}
129
130func vd_iskind(b: *u8, koff: i64, kl: i64, pfx: *u8) -> i64 {
131 let pl: i64 = vd_slen(pfx)
132 if kl <= pl { return 0 }
133 return vd_kmemeq(b, koff, pl, pfx)
134}
135
136// civil "YYYY-MM-DD" -> days since epoch (Hinnant); -1 malformed
137func vd_datedays(s: *u8) -> i64 {
138 let nums: *i64 = sys_mmap(8 * 4) as *i64
139 var nn: i64 = 0
140 var cur: i64 = 0
141 var indig: i64 = 0
142 var i: i64 = 0
143 var go: i64 = 1
144 while go == 1 {
145 let c: i64 = s[i] as i64
146 var isd: i64 = 0
147 if c >= 48 { if c <= 57 { isd = 1 } }
148 if isd == 1 { cur = cur * 10 + (c - 48); indig = 1 }
149 if isd == 0 { if indig == 1 { if nn < 4 { nums[nn] = cur; nn = nn + 1 } cur = 0; indig = 0 } }
150 if c == 0 { go = 0 }
151 i = i + 1
152 }
153 if nn != 3 { return 0 - 1 }
154 var y: i64 = nums[0]
155 let m: i64 = nums[1]
156 let d: i64 = nums[2]
157 if y < K_MAGIC_1970 { return 0 - 1 }
158 if m < 1 { return 0 - 1 }
159 if m > 12 { return 0 - 1 }
160 if d < 1 { return 0 - 1 }
161 if d > 31 { return 0 - 1 }
162 if m <= 2 { y = y - 1 }
163 let era: i64 = y / 400
164 let yoe: i64 = y - era * 400
165 var mp: i64 = m - 3
166 if m <= 2 { mp = m + 9 }
167 let doy: i64 = (153 * mp + 2) / 5 + d - 1
168 let doe: i64 = yoe * 365 + yoe / 4 - yoe / 100 + doy
169 return era * K_MAGIC_146097 + doe - K_MAGIC_719468
170}
171
172// stage -> win probability percent, or -1 if unknown (the MODEL AS DATA)
173func vd_prob(stage: *u8) -> i64 {
174 if vd_eq(stage, "lead" as *u8) == 1 { return 10 }
175 if vd_eq(stage, "qualified" as *u8) == 1 { return 30 }
176 if vd_eq(stage, "proposal" as *u8) == 1 { return 50 }
177 if vd_eq(stage, "negotiation" as *u8) == 1 { return 70 }
178 if vd_eq(stage, "won" as *u8) == 1 { return 100 }
179 if vd_eq(stage, "lost" as *u8) == 1 { return 0 }
180 return 0 - 1
181}
182
183// canonicalize+store one record; st: [0]=writer [1]=seen [2]=nseen [3]=added [4]=dup_infile [5]=dup_instore [6]=prefix
184func vd_put(keys: *i64, vals: *i64, nf: i64, kp: *u8, st: *i64) -> i64 {
185 let enc: *u8 = sys_mmap(K_MAGIC_2048)
186 let el: i64 = canon_encode(keys, vals, nf, enc)
187 let cid: *u8 = sys_mmap(96)
188 cid_of(enc, el, cid)
189 let kbuf: *u8 = sys_mmap(128)
190 var ko: i64 = 0
191 ko = vd_cat(kbuf, ko, kp)
192 ko = vd_cat(kbuf, ko, cid)
193 kbuf[ko] = 0 as u8
194 let seen: *i64 = st[1] as *i64
195 var fresh: i64 = 1
196 var si: i64 = 0
197 while si < st[2] { if vd_eq(seen[si] as *u8, kbuf) == 1 { fresh = 0; st[4] = st[4] + 1; si = st[2] } si = si + 1 }
198 if fresh == 1 { if st[2] < K_MAGIC_2048 { seen[st[2]] = vd_dup(kbuf) as i64; st[2] = st[2] + 1 } }
199 if fresh == 1 {
200 let pp: *i64 = sys_mmap(16) as *i64
201 let ll: *i64 = sys_mmap(16) as *i64
202 if ss_get_idx(st[6] as *u8, kbuf, pp, ll) == 1 { fresh = 0; st[5] = st[5] + 1 }
203 }
204 if fresh == 1 {
205 if ss_add(st[0] as *i64, 1, kbuf, enc, el) != 0 { return 0 - 1 }
206 st[3] = st[3] + 1
207 }
208 return 0
209}
210
211// ---------------- LOAD ----------------
212func vd_cmd_load(argc: i64, argv: *i64) -> i64 {
213 if argc < 4 { vd_p("VIZSLA-DEAL load needs <dealfile> <prefix> -- fail loud\n" as *u8); return 1 }
214 let lfile: *u8 = argv[2] as *u8
215 let prefix: *u8 = argv[3] as *u8
216 var segid: i64 = 0
217 if argc > 4 { segid = vd_atoi(argv[4] as *u8) }
218 if segid == 0 { segid = sys_now_us() }
219
220 let szp: *i64 = sys_mmap(16) as *i64
221 let b: *u8 = ss_readall(lfile, szp)
222 let sz: i64 = szp[0]
223 if sz <= 0 { vd_p("VIZSLA-DEAL dealfile MISSING/EMPTY -- fail loud\n" as *u8); return 1 }
224
225 let dkeys: *i64 = sys_mmap(8 * 8) as *i64
226 let dvals: *i64 = sys_mmap(8 * 8) as *i64
227 dkeys[0] = "kind" as *u8 as i64; dkeys[1] = "id" as *u8 as i64; dkeys[2] = "account" as *u8 as i64
228 dkeys[3] = "value" as *u8 as i64; dkeys[4] = "title" as *u8 as i64
229 dvals[0] = "deal" as *u8 as i64
230 let skeys: *i64 = sys_mmap(8 * 8) as *i64
231 let svals: *i64 = sys_mmap(8 * 8) as *i64
232 skeys[0] = "kind" as *u8 as i64; skeys[1] = "date" as *u8 as i64; skeys[2] = "deal" as *u8 as i64; skeys[3] = "stage" as *u8 as i64
233 svals[0] = "stg" as *u8 as i64
234
235 let st: *i64 = sys_mmap(8 * 8) as *i64
236 st[0] = ss_begin() as i64; st[1] = sys_mmap(8 * K_MAGIC_2048); st[2] = 0; st[3] = 0; st[4] = 0; st[5] = 0; st[6] = prefix as i64
237
238 let t0: *u8 = sys_mmap(128)
239 let f1: *u8 = sys_mmap(128)
240 let f2: *u8 = sys_mmap(128)
241 let f3: *u8 = sys_mmap(128)
242 let f4: *u8 = sys_mmap(256)
243 var scanned: i64 = 0
244 var i: i64 = 0
245 while i < sz {
246 var e: i64 = i
247 var go: i64 = 1
248 while go == 1 { if e >= sz { go = 0 } else { if b[e] == (10 as u8) { go = 0 } else { e = e + 1 } } }
249 var p: i64 = vd_tok(b, i, e, t0, 128)
250 if t0[0] == (35 as u8) { t0[0] = 0 as u8 }
251 if vd_eq(t0, "DEAL" as *u8) == 1 {
252 p = vd_tok(b, p, e, f1, 128); p = vd_tok(b, p, e, f2, 128); p = vd_tok(b, p, e, f3, 128); p = vd_tok(b, p, e, f4, 256)
253 if f1[0] == (0 as u8) { vd_p("VIZSLA-DEAL DEAL missing id -- fail loud\n" as *u8); return 1 }
254 if f2[0] == (0 as u8) { vd_p("VIZSLA-DEAL DEAL missing account -- fail loud\n" as *u8); return 1 }
255 if vd_digits(f3) == 0 { vd_p("VIZSLA-DEAL DEAL value not digits (cents) -- fail loud\n" as *u8); return 1 }
256 if f4[0] == (0 as u8) { vd_p("VIZSLA-DEAL DEAL missing title -- fail loud\n" as *u8); return 1 }
257 dvals[1] = f1 as i64; dvals[2] = f2 as i64; dvals[3] = f3 as i64; dvals[4] = f4 as i64
258 scanned = scanned + 1
259 if vd_put(dkeys, dvals, 5, "deal:" as *u8, st) != 0 { vd_p("VIZSLA-DEAL writer full -- fail loud\n" as *u8); return 1 }
260 }
261 if vd_eq(t0, "STAGE" as *u8) == 1 {
262 p = vd_tok(b, p, e, f1, 128); p = vd_tok(b, p, e, f2, 128); p = vd_tok(b, p, e, f3, 128)
263 if vd_datedays(f1) < 0 { vd_p("VIZSLA-DEAL STAGE bad date -- fail loud\n" as *u8); return 1 }
264 if f2[0] == (0 as u8) { vd_p("VIZSLA-DEAL STAGE missing deal-id -- fail loud\n" as *u8); return 1 }
265 if vd_prob(f3) < 0 { vd_p("VIZSLA-DEAL STAGE unknown stage (lead|qualified|proposal|negotiation|won|lost) -- fail loud\n" as *u8); return 1 }
266 svals[1] = f1 as i64; svals[2] = f2 as i64; svals[3] = f3 as i64
267 scanned = scanned + 1
268 if vd_put(skeys, svals, 4, "stg:" as *u8, st) != 0 { vd_p("VIZSLA-DEAL writer full -- fail loud\n" as *u8); return 1 }
269 }
270 i = e + 1
271 }
272
273 var committed: i64 = 0
274 if st[3] > 0 {
275 if ss_commit(prefix, st[0] as *i64, segid) != 0 { vd_p("VIZSLA-DEAL commit FAILED -- fail loud\n" as *u8); return 1 }
276 committed = 1
277 }
278
279 let rep: *u8 = sys_mmap(K_MAGIC_4096)
280 var o: i64 = 0
281 o = vd_cat(rep, o, "VIZSLA-DEAL-LOAD scanned=" as *u8); o = vd_catn(rep, o, scanned)
282 o = vd_cat(rep, o, " new=" as *u8); o = vd_catn(rep, o, st[3])
283 o = vd_cat(rep, o, " dup_infile=" as *u8); o = vd_catn(rep, o, st[4])
284 o = vd_cat(rep, o, " dup_instore=" as *u8); o = vd_catn(rep, o, st[5])
285 o = vd_cat(rep, o, " segment=" as *u8)
286 if committed == 1 { o = vd_cat(rep, o, "seg-" as *u8); o = vd_catn(rep, o, segid) } else { o = vd_cat(rep, o, "none" as *u8) }
287 o = vd_cat(rep, o, "\n" as *u8)
288 sys_write(1, rep, o)
289 return 0
290}
291
292// ---------------- PIPELINE ----------------
293func vd_cmd_pipeline(argc: i64, argv: *i64) -> i64 {
294 if argc < 3 { vd_p("VIZSLA-DEAL pipeline needs <prefix> [today] -- fail loud\n" as *u8); return 1 }
295 let prefix: *u8 = argv[2] as *u8
296
297 let d_id: *i64 = sys_mmap(8 * K_MAGIC_1024) as *i64
298 let d_acct: *i64 = sys_mmap(8 * K_MAGIC_1024) as *i64
299 let d_val: *i64 = sys_mmap(8 * K_MAGIC_1024) as *i64
300 let d_stage: *i64 = sys_mmap(8 * K_MAGIC_1024) as *i64
301 let d_sdate: *i64 = sys_mmap(8 * K_MAGIC_1024) as *i64
302 var nd: i64 = 0
303 let s_deal: *i64 = sys_mmap(8 * K_MAGIC_2048) as *i64
304 let s_date: *i64 = sys_mmap(8 * K_MAGIC_2048) as *i64
305 let s_stage: *i64 = sys_mmap(8 * K_MAGIC_2048) as *i64
306 var ns: i64 = 0
307
308 let segs: *i64 = sys_mmap(8 * 260) as *i64
309 let nseg: i64 = ss_manifest(prefix, segs)
310 let fa: *u8 = sys_mmap(128)
311 let fb: *u8 = sys_mmap(128)
312 let fc: *u8 = sys_mmap(256)
313 let fd: *u8 = sys_mmap(128)
314 var s: i64 = 0
315 while s < nseg {
316 let path: *u8 = sys_mmap(512)
317 var po: i64 = 0
318 po = vd_cat(path, po, prefix); po = vd_cat(path, po, segs[s] as *u8); po = vd_cat(path, po, ".docs" as *u8)
319 path[po] = 0 as u8
320 let szp: *i64 = sys_mmap(16) as *i64
321 let b: *u8 = ss_readall(path, szp)
322 let sz: i64 = szp[0]
323 var j: i64 = 0
324 while j + 9 <= sz {
325 let kind: i64 = b[j]
326 let kl: i64 = ss_r32(b, j + 1)
327 let koff: i64 = j + 5
328 let vl: i64 = ss_r32(b, koff + kl)
329 let voff: i64 = koff + kl + 4
330 let rec: *u8 = (b as i64 + voff) as *u8
331 var isd: i64 = 0
332 var iss: i64 = 0
333 if kind == 1 { isd = vd_iskind(b, koff, kl, "deal:" as *u8) }
334 if kind == 1 { iss = vd_iskind(b, koff, kl, "stg:" as *u8) }
335 if isd == 1 {
336 if vd_field(rec, vl, "id" as *u8, fa, 128) == 1 {
337 if nd < K_MAGIC_1024 {
338 vd_field(rec, vl, "account" as *u8, fb, 128)
339 vd_field(rec, vl, "value" as *u8, fd, 128)
340 vd_field(rec, vl, "title" as *u8, fc, 256)
341 d_id[nd] = vd_dup(fa) as i64
342 d_acct[nd] = vd_dup(fb) as i64
343 d_val[nd] = vd_atoi(fd)
344 d_stage[nd] = "(none)" as *u8 as i64
345 d_sdate[nd] = 0 - 1
346 nd = nd + 1
347 }
348 }
349 }
350 if iss == 1 {
351 if vd_field(rec, vl, "deal" as *u8, fa, 128) == 1 {
352 if ns < K_MAGIC_2048 {
353 vd_field(rec, vl, "date" as *u8, fb, 128)
354 vd_field(rec, vl, "stage" as *u8, fc, 256)
355 s_deal[ns] = vd_dup(fa) as i64
356 s_date[ns] = vd_datedays(fb)
357 s_stage[ns] = vd_dup(fc) as i64
358 ns = ns + 1
359 }
360 }
361 }
362 j = voff + vl
363 }
364 s = s + 1
365 }
366
367 // latest stage per deal (by date)
368 var di: i64 = 0
369 while di < nd {
370 var k: i64 = 0
371 while k < ns {
372 if vd_eq(s_deal[k] as *u8, d_id[di] as *u8) == 1 { if s_date[k] > d_sdate[di] { d_sdate[di] = s_date[k]; d_stage[di] = s_stage[k] } }
373 k = k + 1
374 }
375 di = di + 1
376 }
377
378 let rep: *u8 = sys_mmap(K_MAGIC_131072)
379 var o: i64 = 0
380 var nopen: i64 = 0
381 var nwon: i64 = 0
382 var nlost: i64 = 0
383 var total: i64 = 0
384 var wonv: i64 = 0
385 var wpipe: i64 = 0
386 var i2: i64 = 0
387 while i2 < nd {
388 let stage: *u8 = d_stage[i2] as *u8
389 let val: i64 = d_val[i2]
390 var prob: i64 = vd_prob(stage)
391 if prob < 0 { prob = 0 }
392 total = total + val
393 var stt: *u8 = "OPEN" as *u8
394 var weighted: i64 = 0
395 if vd_eq(stage, "won" as *u8) == 1 { stt = "WON" as *u8; nwon = nwon + 1; wonv = wonv + val }
396 if vd_eq(stage, "lost" as *u8) == 1 { stt = "LOST" as *u8; nlost = nlost + 1 }
397 if vd_eq(stt, "OPEN" as *u8) == 1 { nopen = nopen + 1; weighted = val * prob / 100; wpipe = wpipe + weighted }
398 o = vd_cat(rep, o, "VIZSLA-DEAL-PIPE deal=" as *u8); o = vd_cat(rep, o, d_id[i2] as *u8)
399 o = vd_cat(rep, o, " account=" as *u8); o = vd_cat(rep, o, d_acct[i2] as *u8)
400 o = vd_cat(rep, o, " stage=" as *u8); o = vd_cat(rep, o, stage)
401 o = vd_cat(rep, o, " value=" as *u8); o = vd_catn(rep, o, val)
402 o = vd_cat(rep, o, " prob=" as *u8); o = vd_catn(rep, o, prob)
403 o = vd_cat(rep, o, " weighted=" as *u8); o = vd_catn(rep, o, weighted)
404 o = vd_cat(rep, o, " state=" as *u8); o = vd_cat(rep, o, stt)
405 o = vd_cat(rep, o, "\n" as *u8)
406 i2 = i2 + 1
407 }
408 o = vd_cat(rep, o, "VIZSLA-DEAL-PIPE-VERDICT deals=" as *u8); o = vd_catn(rep, o, nd)
409 o = vd_cat(rep, o, " open=" as *u8); o = vd_catn(rep, o, nopen)
410 o = vd_cat(rep, o, " won=" as *u8); o = vd_catn(rep, o, nwon)
411 o = vd_cat(rep, o, " lost=" as *u8); o = vd_catn(rep, o, nlost)
412 o = vd_cat(rep, o, " total_value=" as *u8); o = vd_catn(rep, o, total)
413 o = vd_cat(rep, o, " won_value=" as *u8); o = vd_catn(rep, o, wonv)
414 o = vd_cat(rep, o, " weighted_pipeline=" as *u8); o = vd_catn(rep, o, wpipe)
415 o = vd_cat(rep, o, "\n" as *u8)
416 sys_write(1, rep, o)
417 return 0
418}
419
420func main(argc: i64, argv: *i64) -> i64 {
421 if argc < 2 { vd_p("VIZSLA-DEAL usage: load|pipeline -- fail loud\n" as *u8); return 1 }
422 let cmd: *u8 = argv[1] as *u8
423 if vd_eq(cmd, "load" as *u8) == 1 { return vd_cmd_load(argc, argv) }
424 if vd_eq(cmd, "pipeline" as *u8) == 1 { return vd_cmd_pipeline(argc, argv) }
425 vd_p("VIZSLA-DEAL unknown command (load|pipeline) -- fail loud\n" as *u8)
426 return 1
427}