maziggy
4436349a03
fix(stats): scope per-run filament to the printed plate, not the whole 3MF ( #2614 )
...
A single plate dispatched from a multi-plate 3MF could log the entire file's
filament against that one plate. When the AMS tracker measured nothing, a
completed run's PrintLogEntry.filament_used_grams fell back to
PrintArchive.filament_used_grams -- the sum over every plate (correct for the
archive card / project rollup, #1593 ) -- ignoring the archive's plate_id. So
each printed plate of a 22-plate file logged the full ~12 kg; cost inherited
the same whole-file value.
Forward: when the archive has a plate_id and its 3MF is on disk, the completed-
run fallback uses that plate's own slicer estimate (extract_plate_metadata_from_3mf)
and scales cost by the plate's share of the whole. Tracker-measured runs and
single-plate archives are unchanged.
Backfill: a startup migration repairs rows already written -- completed entries
whose stored grams exactly equal the archive's whole-file value, with a plate_id
and an on-disk 3MF, get recomputed to plate-scoped grams + cost. The exact-match
guard never touches tracker-measured or partial rows; idempotent, data-only,
identical on SQLite and Postgres, and logs the correction.
2026-07-20 11:52:18 +02:00
..
2026-06-06 10:41:28 +02:00
2026-07-18 16:54:48 +02:00
2026-07-01 09:50:30 +02:00
2026-06-04 11:30:26 +02:00
2026-04-26 09:40:02 +02:00
2026-07-18 08:11:44 +02:00
2026-07-18 13:06:01 +02:00
2026-07-16 07:50:51 +02:00
2026-07-19 09:29:54 +02:00
2026-06-03 10:14:57 +02:00
2026-04-27 16:14:31 +02:00
2026-05-30 13:49:09 +02:00
2026-06-20 12:07:20 +02:00
2026-07-16 15:21:47 +02:00
2026-07-17 07:03:10 +02:00
2026-05-22 10:02:41 +02:00
2026-06-06 13:40:56 +02:00
2026-04-27 16:32:10 +02:00
2026-06-25 09:00:57 +02:00
2026-07-14 11:29:56 +02:00
2026-05-24 12:51:24 +02:00
2026-05-08 09:01:51 +02:00
2026-05-15 15:43:37 +02:00
2026-07-18 16:15:09 +02:00
2026-05-08 11:52:42 +02:00
2026-07-18 13:48:14 +02:00
2026-05-24 10:16:30 +02:00
2026-06-05 13:53:26 +02:00
2026-04-26 14:24:28 +02:00
2026-05-29 10:55:41 +02:00
2026-05-24 08:49:21 +02:00
2026-06-09 07:38:59 +02:00
2026-07-18 16:15:09 +02:00
2026-05-28 08:40:43 +02:00
2026-06-05 13:53:26 +02:00
2026-07-09 08:17:59 +02:00
2026-06-06 13:30:13 +02:00
2026-07-13 09:18:17 +02:00
2026-06-19 11:29:07 +02:00
2026-04-27 16:32:10 +02:00
2026-05-11 12:27:41 +02:00
2026-05-03 08:12:36 +02:00
2026-04-24 16:02:55 +02:00
2026-05-08 14:06:40 +02:00
2026-06-20 12:07:20 +02:00
2026-07-18 13:48:14 +02:00
2026-07-11 14:44:45 +02:00
2026-05-16 14:35:47 +02:00
2026-06-02 14:51:08 +02:00
2026-04-22 11:14:42 +02:00
2026-06-02 14:51:08 +02:00
2026-05-22 10:22:14 +02:00
2026-07-12 08:44:53 +02:00
2026-06-22 14:23:30 +02:00
2026-06-17 11:33:23 +02:00
2026-06-17 11:33:23 +02:00
2026-04-26 10:01:17 +02:00
2026-07-14 11:29:56 +02:00
2026-07-14 11:29:56 +02:00
2026-04-24 16:48:59 +02:00
2026-07-14 10:35:58 +02:00
2026-06-02 10:02:17 +02:00
2026-06-02 10:02:17 +02:00
2026-06-02 12:42:16 +02:00
2026-06-20 08:28:44 +02:00
2026-05-21 08:45:59 +02:00
2026-05-15 08:50:37 +02:00
2026-05-15 08:50:37 +02:00
2026-05-15 08:50:37 +02:00
2026-05-15 08:50:37 +02:00
2026-05-08 11:52:42 +02:00
2026-06-25 14:54:27 +02:00
2026-04-22 17:48:53 +02:00
2026-07-11 14:22:31 +02:00
2026-04-29 11:17:43 +02:00
2026-05-17 09:30:02 +02:00
2026-07-18 09:58:21 +02:00
2026-05-20 08:12:17 +02:00
2026-06-09 09:16:36 +02:00
2026-06-20 12:07:20 +02:00
2026-07-09 08:43:59 +02:00
2026-07-16 09:20:12 +02:00
2026-05-21 08:30:17 +02:00
2026-06-20 12:55:24 +02:00
2026-05-04 10:34:36 +02:00
2026-07-17 10:02:19 +02:00
2026-06-08 08:18:13 +02:00
2026-06-11 09:23:03 +02:00
2026-06-25 11:07:29 +02:00
2026-07-18 13:06:01 +02:00
2026-05-05 16:00:22 +02:00
2026-06-22 14:13:44 +02:00
2026-07-20 11:52:18 +02:00
2026-07-20 11:52:18 +02:00
2026-05-25 09:04:47 +02:00
2026-06-02 12:12:54 +02:00
2026-07-07 12:17:46 +02:00
2026-07-05 09:32:02 +02:00
2026-07-07 12:17:46 +02:00
2026-07-18 16:41:15 +02:00
2026-06-29 12:59:09 +02:00
2026-07-19 09:29:54 +02:00
2026-07-07 10:07:47 +02:00
2026-07-19 08:34:38 +02:00
2026-04-28 17:19:17 +02:00
2026-06-09 10:43:07 +02:00
2026-05-20 11:25:45 +02:00
2026-05-24 09:18:38 +02:00
2026-07-17 06:51:51 +02:00
2026-07-08 08:57:56 +02:00
2026-07-18 16:15:09 +02:00
2026-07-18 16:15:09 +02:00
2026-07-14 10:35:58 +02:00
2026-04-24 13:24:00 +02:00
2026-06-17 12:04:57 +02:00
2026-07-02 11:32:22 +02:00
2026-05-14 15:28:41 +02:00
2026-06-12 10:14:06 +02:00
2026-06-12 10:14:06 +02:00
2026-06-28 13:52:05 +02:00
2026-04-29 09:13:33 +02:00
2026-04-25 13:24:49 +02:00
2026-05-12 16:02:24 +02:00
2026-05-08 11:52:42 +02:00
2026-05-08 14:28:41 +02:00
2026-05-08 11:52:42 +02:00
2026-05-18 08:51:27 +02:00
2026-06-17 11:33:23 +02:00
2026-06-25 10:46:57 +02:00
2026-05-12 08:48:30 +02:00
2026-05-20 11:00:54 +02:00
2026-07-15 07:29:16 +02:00
2026-05-08 11:52:42 +02:00
2026-05-22 09:05:25 +02:00
2026-07-14 10:35:58 +02:00
2026-06-14 10:58:02 +02:00
2026-07-12 08:44:53 +02:00
2026-06-18 11:46:07 +02:00
2026-07-17 08:26:23 +02:00
2026-05-24 12:30:12 +02:00
2026-05-12 09:20:53 +02:00
2026-04-26 14:24:28 +02:00
2026-06-27 11:28:00 +02:00
2026-05-15 08:50:37 +02:00
2026-07-15 07:29:16 +02:00
2026-07-18 13:18:59 +02:00
2026-06-22 11:15:39 +02:00
2026-06-05 17:19:16 +02:00
2026-05-30 13:34:10 +02:00
2026-05-30 13:34:10 +02:00
2026-07-05 10:32:13 +02:00
2026-06-02 14:33:20 +02:00
2026-07-11 10:06:03 +02:00
2026-07-02 10:13:01 +02:00
2026-06-03 10:04:37 +02:00
2026-06-11 13:35:20 +02:00
2026-06-27 11:28:00 +02:00