nx_docket_lib.nx source
↩ module page · 81 lines · 2981 B
1// nx_docket_lib.nx -- Nishi Office DOCKETING / deadline engine (F507, Utah URCP).
2// Never-miss = the biggest malpractice tail-risk. DATA-DRIVEN rules (rule-11): each rule
3// {days, mode, desc} lives in the seg-store, NOT hardcoded -- add a rule = a data change.
4// URCP Rule 6: a calendar deadline landing on a weekend ROLLS FORWARD to the next business
5// day. Business-day mode counts only business days. Dates = integer day-index (day 0 = Monday;
6// day%7: 0..4 = Mon..Fri, 5/6 = Sat/Sun). YYYYMMDD conversion + court-holiday table = flagged
7// next rungs. DRY: reuses nx_matter_lib helpers. LIB (no main). license_tier: ORIGINAL
8
9import "nx_matter_lib.nx"
10const K_MAGIC_1024: i64 = 1024
11
12func dk_atoi(s: *u8) -> i64 {
13 var v: i64 = 0
14 var i: i64 = 0
15 while s[i] != (0 as u8) {
16 if s[i] >= 48 as u8 { if s[i] <= 57 as u8 { v = v * 10 + (s[i] - 48) } }
17 i = i + 1
18 }
19 return v
20}
21
22func dk_is_weekend(day: i64) -> i64 {
23 let w: i64 = day % 7
24 if w >= 5 { return 1 }
25 return 0
26}
27
28// seed/store a deadline rule (data-driven): key "rule:<id>".
29func dk_rule_put(prefix: *u8, id: *u8, days: i64, mode: i64, desc: *u8) -> i64 {
30 let ds: *u8 = sys_mmap(24)
31 var a: i64 = mt_catn(ds, 0, days)
32 ds[a] = 0 as u8
33 let ms: *u8 = sys_mmap(8)
34 var b: i64 = mt_catn(ms, 0, mode)
35 ms[b] = 0 as u8
36 let k: *i64 = sys_mmap(8 * 3) as *i64
37 let v: *i64 = sys_mmap(8 * 3) as *i64
38 k[0] = ("days" as *u8) as i64
39 v[0] = ds as i64
40 k[1] = ("desc" as *u8) as i64
41 v[1] = desc as i64
42 k[2] = ("mode" as *u8) as i64
43 v[2] = ms as i64
44 let rec: *u8 = sys_mmap(K_MAGIC_1024)
45 let rl: i64 = canon_encode(k, v, 3, rec)
46 return reg_put(prefix, "rule:" as *u8, "rule:__idx__" as *u8, id, rec, rl)
47}
48
49// read a rule's days (mode into mode_out[0]); -1 if the rule is absent.
50func dk_rule_days(prefix: *u8, id: *u8, mode_out: *i64) -> i64 {
51 let po: *i64 = sys_mmap(16) as *i64
52 let lo: *i64 = sys_mmap(16) as *i64
53 mode_out[0] = 0
54 if reg_get(prefix, "rule:" as *u8, id, po, lo) != 1 { return 0 - 1 }
55 let df: *u8 = sys_mmap(32)
56 let mf: *u8 = sys_mmap(32)
57 mt_field(po[0] as *u8, lo[0], "days" as *u8, 4, df)
58 mt_field(po[0] as *u8, lo[0], "mode" as *u8, 4, mf)
59 mode_out[0] = dk_atoi(mf)
60 return dk_atoi(df)
61}
62
63// compute the deadline day for a rule from a trigger day. mode 0 = calendar (+ URCP Rule 6
64// weekend roll); mode 1 = business-days. Returns the deadline day-index, or -1 if rule absent.
65func dk_compute(prefix: *u8, id: *u8, trigger: i64) -> i64 {
66 let mode: *i64 = sys_mmap(16) as *i64
67 let days: i64 = dk_rule_days(prefix, id, mode)
68 if days < 0 { return 0 - 1 }
69 if mode[0] == 0 {
70 var d: i64 = trigger + days
71 while dk_is_weekend(d) == 1 { d = d + 1 }
72 return d
73 }
74 var d: i64 = trigger
75 var counted: i64 = 0
76 while counted < days {
77 d = d + 1
78 if dk_is_weekend(d) == 0 { counted = counted + 1 }
79 }
80 return d
81}