- Shipped
- October 15, 2026 at 4:36 AM UTC
- Author
- Kamo
- Commit
- c313d48
One company-wide list per organization (owner 2026-10-15), scoped per channel: a CALL entry blocks calls only, SMS texts only, EMAIL email only. Package com.kamo.z.shared.comms.dnc: DO_NOT_CONTACT (unique ORG_ID, CHANNEL, ADDRESS), the append-only DO_NOT_CONTACT_EVENT audit trail and DO_NOT_CONTACT_SETTINGS (per-org call mode WARN | BLOCK, default WARN). DoNotContactList (plain class; each service declares the bean) is the one reader and writer: isBlocked(orgId, channel, address) / find / filterBlocked for every contact path, add (idempotent, first date kept), remove and removeById (a reason of 3+ characters is required, and the REMOVED event keeps it), search, history, activity and the call mode. Addresses are E.164 for CALL and SMS (PhoneE164, then E164's NANP reading) and lower-cased for EMAIL; an unreadable address is refused. DDL: voipservice **************** (applied 2026-10-15 04:35Z). Tests: DoNotContactListTest, ****************
