code wiki / (root) / nx_docket_lib.nx

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}