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-09-14 17:39:53 +08:00
2026-09-11 17:25:24 +08:00
2026-09-08 15:57:47 +08:00
2026-08-28 09:59:07 +08:00
2026-08-31 15:33:07 +08:00
2026-08-31 15:33:07 +08:00
2026-08-31 15:33:07 +08:00
2026-07-12 17:46:08 +08:00
2026-07-12 17:46:08 +08:00
2026-08-31 15:33:07 +08:00
2026-07-12 17:46:08 +08:00
2026-08-31 15:33:07 +08:00
2026-08-31 07:44:00 +08:00
2026-05-28 17:32:22 +08:00
2026-09-13 00:37:10 +08:00
2026-07-12 17:46:08 +08:00
2026-09-14 16:41:15 +08:00
2026-08-31 07:44:00 +08:00
2026-09-11 19:33:52 +08:00
2026-08-10 23:56:14 +08:00
2026-08-31 17:05:21 +08:00
2026-09-12 23:34:35 +08:00
2026-09-12 23:34:35 +08:00
2026-08-30 12:05:36 +08:00
2026-07-12 17:46:08 +08:00
2026-08-31 15:33:07 +08:00
2026-08-31 15:33:07 +08:00
2026-08-27 15:51:19 +08:00
2026-09-03 18:15:05 +08:00
2026-05-28 17:32:22 +08:00
2026-07-14 16:02:33 +08:00
2026-07-14 16:02:33 +08:00
2026-06-05 07:51:20 +08:00
2026-07-14 16:02:33 +08:00
2026-08-31 15:33:07 +08:00
2026-06-05 07:51:20 +08:00
2026-07-12 17:46:08 +08:00
2026-08-31 15:33:07 +08:00
2026-09-12 23:34:35 +08:00
2026-09-11 17:25:24 +08:00
2026-08-28 09:59:07 +08:00
2026-07-12 17:46:08 +08:00
2026-07-29 18:16:37 +08:00
2026-09-12 23:34:35 +08:00
2026-09-12 23:34:35 +08:00
2026-09-14 17:25:49 +08:00
2026-09-12 20:08:31 +08:00
2026-07-14 16:02:33 +08:00
2026-07-14 16:02:33 +08:00
2026-09-14 18:21:33 +08:00
2026-09-14 19:05:16 +08:00
2026-09-14 17:19:49 +08:00
2026-07-22 17:43:59 +08:00
2026-08-27 15:51:19 +08:00
2026-09-12 23:34:35 +08:00
2026-07-14 16:02:33 +08:00
2026-08-27 10:59:56 +08:00
2026-07-14 17:32:22 +08:00
2026-07-21 23:41:40 +08:00
2026-09-11 19:33:52 +08:00
2026-08-04 15:35:15 +08:00
2026-08-30 19:16:19 +08:00
2026-09-12 01:03:31 +08:00
2026-08-30 12:05:36 +08:00
2026-07-12 17:46:08 +08:00
2026-06-05 07:51:20 +08:00
2026-07-12 17:46:08 +08:00
2026-07-16 16:39:24 +08:00
2026-08-28 07:18:54 +08:00
2026-07-12 17:46:08 +08:00
2026-09-12 23:34:35 +08:00
2026-07-12 17:46:08 +08:00
2026-07-21 17:30:50 +08:00
2026-07-12 17:46:08 +08:00
2026-08-11 00:11:25 +08:00
2026-07-13 09:52:06 +08:00
2026-07-21 17:22:43 +08:00
2026-08-19 22:58:10 +08:00
2026-07-14 16:02:33 +08:00
2026-07-14 16:02:33 +08:00
2026-09-03 18:41:44 +08:00
2026-07-14 16:02:33 +08:00
2026-09-08 13:43:20 +08:00
2026-09-12 20:35:20 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 18:44:39 +08:00
2026-09-14 17:39:53 +08:00
2026-09-13 07:38:58 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-11 17:25:24 +08:00
2026-09-06 16:47:25 +08:00