Hermes CI Fix
8693c8e342
feat(kpi): route all voucher_details consumers through single void-mark guard
...
Single source: app/utils/voucher_guard.py (NOT EXISTS on voucher_void_marks,
key = entity_id+voucher_no+voucher_date and revoked_at IS NULL; same caliber as
the DB view cma.v_voucher_details_active). No hardcoded voucher numbers.
Consumers now guarded: cash.py import linkage (2 fns), reports.py subject/BS
amount (2 sites, also entity_id isolation added), dashboard.py _bep_sum_field,
alert_attribution.py build_subject_attribution. kpi_value_collector.py now
delegates to the shared guard (removes the previous duplicate implementation).
Tests: new tests/test_void_marker_consumers_20260914.py (6 cases).
2026-09-14 19:05:16 +08:00
..
2026-05-28 17:32:22 +08:00
2026-09-14 11:19:05 +08:00
2026-09-07 10:22:24 +08:00
2026-08-31 09:07:54 +08:00
2026-09-10 09:56:50 +08:00
2026-09-14 11:19:05 +08:00
2026-09-14 16:41:15 +08:00
2026-07-29 18:25:08 +08:00
2026-09-12 10:07:20 +08:00
2026-09-14 16:41:15 +08:00
2026-08-23 18:20:29 +08:00
2026-09-13 00:37:10 +08:00
2026-09-13 00:37:10 +08:00
2026-08-28 00:31:31 +08:00
2026-09-07 10:22:24 +08:00
2026-09-03 18:08:27 +08:00
2026-08-11 11:29:39 +08:00
2026-07-12 17:46:08 +08:00
2026-09-14 17:56:26 +08:00
2026-08-28 18:03:47 +08:00
2026-09-11 17:13:07 +08:00
2026-09-14 19:05:16 +08:00
2026-09-03 01:34:13 +08:00
2026-09-14 16:41:15 +08:00
2026-07-12 17:46:08 +08:00
2026-09-14 19:05:16 +08:00
2026-08-26 07:51:39 +08:00
2026-09-14 12:09:04 +08:00
2026-09-08 11:19:38 +08:00
2026-08-28 18:03:47 +08:00
2026-09-13 00:37:10 +08:00
2026-07-22 12:58:04 +08:00
2026-07-19 10:07:46 +08:00
2026-08-23 18:20:29 +08:00
2026-08-11 11:29:39 +08:00
2026-09-03 23:09:58 +08:00
2026-09-03 23:00:15 +08:00
2026-08-27 15:51:19 +08:00
2026-08-21 16:28:23 +08:00
2026-09-11 17:25:24 +08:00
2026-07-22 18:22:48 +08:00
2026-09-08 20:24:44 +08:00
2026-09-14 16:41:15 +08:00
2026-08-26 23:45:20 +08:00
2026-09-11 19:33:52 +08:00
2026-08-27 12:50:30 +08:00
2026-08-27 10:59:56 +08:00
2026-05-28 17:32:22 +08:00
2026-09-14 16:41:15 +08:00
2026-09-14 16:41:15 +08:00
2026-09-14 16:41:15 +08:00
2026-09-14 19:05:16 +08:00
2026-07-12 17:46:08 +08:00
2026-07-21 23:41:40 +08:00
2026-08-11 11:32:30 +08:00
2026-08-10 23:40:31 +08:00
2026-09-14 16:41:15 +08:00
2026-09-11 17:27:12 +08:00
2026-05-28 17:32:22 +08:00
2026-08-28 18:03:47 +08:00
2026-08-30 19:16:19 +08:00
2026-09-08 20:11:59 +08:00
2026-08-28 18:03:47 +08:00