Marc-André Bombeck
34a220421c
test(medications): prove the reported export lands, row for row
...
The fixture is the export a self-hoster attached, de-identified as it
arrived: 3,395 rows, sixteen medications, three and a half years, two UTC
offsets, three statuses, two units, blank cells in four columns. A
hand-built fixture would have carried one status and one offset and proved
nothing about the file that prompted the work.
The integration pass runs it through the real derivation into a real
Postgres, because the claim is about rows: 3,387 land, 8 are refused because
the file records no decision about them, and imported plus refused equals
every row read. 2,799 of the doses were taken after they were due, which is
the fact that survives only because the scheduled slot and the take are two
columns.
Structural cover so the verdicts cannot rot: every column of both shapes has
exactly one ruling, and every parse-time refusal is spelled the same as a job
skip reason — a reason that exists in only one vocabulary renders as "reason
not recorded", which is a refusal nobody can act on.
2026-07-26 16:37:10 +02:00
..
2026-05-10 10:34:32 +02:00
2026-05-09 21:00:23 +02:00
2026-07-25 15:20:47 +02:00
2026-05-09 20:46:20 +02:00
2026-07-20 13:42:38 +02:00
2026-07-20 12:24:15 +02:00
2026-06-27 20:37:35 +02:00
2026-06-19 22:20:31 +02:00
2026-05-10 11:05:40 +02:00
2026-06-19 22:20:31 +02:00
2026-06-28 19:26:16 +02:00
2026-06-14 14:26:58 +02:00
2026-07-04 14:46:19 +02:00
2026-05-16 19:46:43 +02:00
2026-05-14 23:49:32 +02:00
2026-05-24 22:22:30 +02:00
2026-07-16 08:48:41 +02:00
2026-07-21 13:08:28 +02:00
2026-07-14 11:56:29 +02:00
2026-07-22 04:14:15 +02:00
2026-07-19 11:41:12 +02:00
2026-07-19 11:40:56 +02:00
2026-07-18 02:09:33 +02:00
2026-07-19 01:07:43 +02:00
2026-06-28 14:00:55 +02:00
2026-07-20 00:40:20 +02:00
2026-06-14 14:26:58 +02:00
2026-06-19 22:20:31 +02:00
2026-06-27 22:40:01 +02:00
2026-06-27 20:37:35 +02:00
2026-05-10 11:05:40 +02:00
2026-07-21 01:34:29 +02:00
2026-06-19 22:20:31 +02:00
2026-06-26 14:17:36 +02:00
2026-07-16 23:32:28 +02:00
2026-05-10 16:11:12 +02:00
2026-05-11 02:38:17 +02:00
2026-07-24 18:28:41 +02:00
2026-06-01 19:54:26 +02:00
2026-07-15 22:49:07 +02:00
2026-07-25 21:57:06 +02:00
2026-06-19 22:20:31 +02:00
2026-06-19 22:20:31 +02:00
2026-07-20 00:40:20 +02:00
2026-07-17 14:29:07 +02:00
2026-07-17 14:29:07 +02:00
2026-07-20 12:24:15 +02:00
2026-07-26 00:45:08 +02:00
2026-07-26 00:45:08 +02:00
2026-07-08 22:05:05 +02:00
2026-07-22 04:14:15 +02:00
2026-07-21 13:08:28 +02:00
2026-07-21 00:36:40 +02:00
2026-05-10 00:11:36 +02:00
2026-06-22 09:00:39 +02:00
2026-06-22 09:00:39 +02:00
2026-07-19 13:40:03 +02:00
2026-07-21 00:36:40 +02:00
2026-05-09 18:08:11 +02:00
2026-06-19 22:20:31 +02:00
2026-05-10 01:30:06 +02:00
2026-05-10 11:05:40 +02:00
2026-06-28 19:23:57 +02:00
2026-06-19 22:20:31 +02:00
2026-07-07 15:55:50 +02:00
2026-06-19 22:20:31 +02:00
2026-06-11 02:19:28 +02:00
2026-07-25 11:36:18 +02:00
2026-07-26 14:19:13 +02:00
2026-07-26 14:37:57 +02:00
2026-06-28 02:00:37 +02:00
2026-07-25 15:03:44 +02:00
2026-06-19 22:20:31 +02:00
2026-06-19 22:20:31 +02:00
2026-05-16 10:59:42 +02:00
2026-05-31 14:36:17 +02:00
2026-07-25 15:03:44 +02:00
2026-06-19 22:20:31 +02:00
2026-07-26 00:45:08 +02:00
2026-06-19 22:20:31 +02:00
2026-06-10 11:18:00 +02:00
2026-07-26 16:37:10 +02:00
2026-07-26 16:37:10 +02:00
2026-07-26 14:37:57 +02:00
2026-06-19 22:20:31 +02:00
2026-07-25 18:41:40 +02:00
2026-06-27 19:56:30 +02:00
2026-05-09 18:08:11 +02:00
2026-06-14 11:31:52 +02:00
2026-06-05 03:45:04 +02:00
2026-06-27 19:33:10 +02:00
2026-06-19 22:20:31 +02:00
2026-06-19 22:20:31 +02:00
2026-06-27 19:33:10 +02:00
2026-07-14 13:10:47 +02:00
2026-07-25 11:36:18 +02:00
2026-06-19 22:20:31 +02:00
2026-05-14 23:49:32 +02:00
2026-07-26 14:37:57 +02:00
2026-07-22 04:14:15 +02:00
2026-07-19 02:31:45 +02:00
2026-05-08 17:46:31 +02:00
2026-07-14 11:56:29 +02:00
2026-06-26 13:24:30 +02:00
2026-06-19 22:20:31 +02:00
2026-07-23 15:16:48 +02:00
2026-07-19 13:48:46 +02:00
2026-05-21 23:13:21 +02:00
2026-07-26 14:04:44 +02:00
2026-07-23 09:04:43 +02:00
2026-07-07 22:00:14 +02:00
2026-07-26 14:04:44 +02:00
2026-06-04 10:05:47 +02:00
2026-05-24 22:22:30 +02:00
2026-07-15 22:49:07 +02:00
2026-07-19 14:29:34 +02:00
2026-07-26 14:04:44 +02:00
2026-06-19 22:20:31 +02:00
2026-07-22 04:14:15 +02:00
2026-06-19 22:20:31 +02:00
2026-06-05 08:10:13 +02:00
2026-07-22 04:14:15 +02:00
2026-05-17 15:36:38 +02:00
2026-07-18 02:30:33 +02:00
2026-05-24 22:22:30 +02:00
2026-05-14 23:49:32 +02:00
2026-05-17 15:36:38 +02:00
2026-07-22 04:14:15 +02:00
2026-07-22 04:14:15 +02:00
2026-07-20 00:40:20 +02:00