@flowselections/logistiek-engine 1.0.94 → 1.0.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist-lib/components/MisluktVerzendbrievenCard.d.ts +2 -0
  2. package/dist-lib/components/MisluktVerzendbrievenCard.d.ts.map +1 -0
  3. package/dist-lib/components/MisluktVerzendbrievenCard.js +50 -0
  4. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  5. package/dist-lib/components/RegiePage.js +2 -1
  6. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
  7. package/dist-lib/components/RuleEnginePage.js +3 -1
  8. package/dist-lib/integrations/supabase/auth-middleware.d.ts +59 -0
  9. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  10. package/dist-lib/integrations/supabase/client.server.d.ts +59 -0
  11. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/moduleClient.d.ts +59 -0
  13. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  14. package/dist-lib/integrations/supabase/types.d.ts +59 -0
  15. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  16. package/dist-lib/lib/cartCoverage.functions.d.ts +59 -0
  17. package/dist-lib/lib/cartCoverage.functions.d.ts.map +1 -1
  18. package/dist-lib/lib/controlScan.server.d.ts +2 -0
  19. package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
  20. package/dist-lib/lib/controlScan.server.js +59 -53
  21. package/dist-lib/lib/expandGroups.test.d.ts +2 -0
  22. package/dist-lib/lib/expandGroups.test.d.ts.map +1 -0
  23. package/dist-lib/lib/expandGroups.test.js +80 -0
  24. package/dist-lib/lib/floridayDocuments.functions.d.ts +177 -0
  25. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floridayPush.functions.d.ts +59 -0
  27. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/layoutPrint.server.d.ts +27 -0
  29. package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -0
  30. package/dist-lib/lib/layoutPrint.server.js +48 -0
  31. package/dist-lib/lib/layoutPrint.test.d.ts +2 -0
  32. package/dist-lib/lib/layoutPrint.test.d.ts.map +1 -0
  33. package/dist-lib/lib/layoutPrint.test.js +47 -0
  34. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +295 -0
  35. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  37. package/dist-lib/lib/loadCarrierPlanning.server.js +72 -8
  38. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +118 -0
  39. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +59 -0
  41. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  43. package/dist-lib/lib/modulePrompts.js +54 -0
  44. package/dist-lib/lib/moduleVersion.d.ts +2 -0
  45. package/dist-lib/lib/moduleVersion.d.ts.map +1 -0
  46. package/dist-lib/lib/moduleVersion.js +2 -0
  47. package/dist-lib/lib/plannerDiff.functions.d.ts +59 -0
  48. package/dist-lib/lib/plannerDiff.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  50. package/dist-lib/lib/shippingNoteQueue.server.js +40 -49
  51. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  // naar order_carts / order_cart_items.
7
7
  // ============================================================================
8
8
  import { planLoadUnits, LOAD_CARRIER_PLANNER_VERSION, } from "./loadCarrierPlanner";
9
+ import { traceBatch } from "./trace.server";
10
+ import { MODULE_VERSION } from "./moduleVersion";
9
11
  import { fallbackCarrierProfile } from "./loadCarrierTypes";
10
12
  import { planByDimensions, DIMENSION_PLANNER_VERSION } from "./dimensionPlanner";
11
13
  import { buildDimensionItems, carrierDimensions } from "./dimensionData.server";
@@ -146,6 +148,8 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
146
148
  let groupSet = new Set();
147
149
  // Groepsregels dragen niet altijd een product_id. Zonder koppeling wordt de
148
150
  // groep op naam opgezocht, zodat de leden en hun afmetingen alsnog meetellen.
151
+ // Een regel die aan een echt artikel gekoppeld is, blijft altijd dat artikel,
152
+ // ook als er toevallig een productgroep met dezelfde naam bestaat.
149
153
  const groupByName = new Map();
150
154
  {
151
155
  const { data: allGroups } = await sb.from("product_groups").select("id, name");
@@ -154,9 +158,12 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
154
158
  groupByName.set(String(g.name).trim().toLowerCase(), String(g.id));
155
159
  }
156
160
  }
161
+ let realProductIds = new Set();
157
162
  if (groupIds.length > 0) {
158
163
  const { data: groups } = await sb.from("product_groups").select("id").in("id", groupIds);
159
164
  groupSet = new Set((groups ?? []).map((g) => g.id));
165
+ const { data: realProds } = await sb.from("products").select("id").in("id", groupIds);
166
+ realProductIds = new Set((Array.isArray(realProds) ? realProds : []).map((p) => String(p.id)));
160
167
  }
161
168
  for (const row of rows) {
162
169
  const orderKey = row.order_id ? String(row.order_id) : null;
@@ -169,14 +176,18 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
169
176
  : null;
170
177
  const { belading: base, source } = resolveBelading(row, packing, linePacking);
171
178
  const plants = Math.max(0, Number(row.quantity ?? 0));
179
+ const explicitGroupPrefix = /^\[Groep\]/i.test(String(row.product_name ?? ""));
172
180
  const groupNameKey = String(row.product_name ?? "")
173
181
  .replace(/^\[Groep\]\s*/i, "")
174
182
  .trim()
175
183
  .toLowerCase();
184
+ const linkedToRealProduct = typeof row.product_id === "string" && realProductIds.has(row.product_id) && !groupSet.has(row.product_id);
176
185
  const groupId = row.product_id && groupSet.has(row.product_id)
177
186
  ? String(row.product_id)
178
- : groupByName.get(groupNameKey) ?? null;
179
- const isGroup = groupId != null || String(row.product_name ?? "").startsWith("[Groep]");
187
+ : !linkedToRealProduct || explicitGroupPrefix
188
+ ? groupByName.get(groupNameKey) ?? null
189
+ : null;
190
+ const isGroup = groupId != null || (explicitGroupPrefix && !linkedToRealProduct);
180
191
  if (!isGroup) {
181
192
  options.sources?.set(String(row.id), source);
182
193
  out.push({
@@ -219,7 +230,9 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
219
230
  const { data: prods } = await sb
220
231
  .from("products")
221
232
  .select("id, product, plants_per_crate, crates_per_layer, layers_per_cart, weight, floriday_trade_item_id")
222
- .or(tradeIds.map((t) => `floriday_trade_item_id.eq.${t}`).join(","));
233
+ .or(tradeIds
234
+ .flatMap((t) => UUID_RE.test(t) ? [`floriday_trade_item_id.eq.${t}`, `id.eq.${t}`] : [`floriday_trade_item_id.eq.${t}`])
235
+ .join(","));
223
236
  const prodByTrade = new Map();
224
237
  for (const p of prods ?? []) {
225
238
  if (p.floriday_trade_item_id)
@@ -228,6 +241,9 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
228
241
  }
229
242
  const resolved = memberList.map((m) => {
230
243
  const p = prodByTrade.get(String(m.trade_item_id));
244
+ // Onbekend groepslid: niet gokken en geen kale id als artikelnaam.
245
+ if (!p)
246
+ return { m, p, belading: { ...base }, source: "geen" };
231
247
  // Een handmatig vastgezette regel blijft leidend voor de hele groep.
232
248
  if (source === "handmatig") {
233
249
  return { m, p, belading: { ...base }, source };
@@ -283,7 +299,7 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
283
299
  order_id: row.order_id ?? null,
284
300
  customer_id: row.customer_id ?? null,
285
301
  product_id: r.p?.id ?? null,
286
- product_name: `${row.product_name ?? "Groep"} — ${r.p?.product ?? r.m.trade_item_id}`,
302
+ product_name: `${row.product_name ?? "Groep"} — ${r.p?.product ?? "onbekend groepslid"}`,
287
303
  plants: shares[idx],
288
304
  ...r.belading,
289
305
  packing_authoritative: isAuthoritative(r.source),
@@ -551,8 +567,12 @@ export function dimensionCartsToPlannedUnits(carts) {
551
567
  // ---------------------------------------------------------------------------
552
568
  // Herplannen van een buffer
553
569
  // ---------------------------------------------------------------------------
554
- /** Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. */
555
- const MAX_CARTS_PER_BUFFER = 500;
570
+ /**
571
+ * Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. De grootste
572
+ * echte buffers kwamen op 725–867 karren; 1.000 houdt een vangnet tegen
573
+ * opgeblazen aantallen zonder echte grote orders te blokkeren.
574
+ */
575
+ const MAX_CARTS_PER_BUFFER = 1000;
556
576
  /** Statussen waarbij een order niet meer ingedeeld hoeft te worden. */
557
577
  const TERMINALE_STATUSSEN = new Set([
558
578
  "verzonden",
@@ -1013,6 +1033,24 @@ async function replanBufferUnlocked(sb, bufferId, options = {}) {
1013
1033
  for (const s of sources.values())
1014
1034
  beladingSources[s] = (beladingSources[s] ?? 0) + 1;
1015
1035
  console.log(`[logistiek-engine] buffer ${bufferId}: beladingbronnen ${JSON.stringify(beladingSources)}`);
1036
+ // Sporenregel: welke codeversie en welke groepsregel deze ronde gebruikte.
1037
+ try {
1038
+ const orderIdsInRonde = [...new Set(itemToOrder.values())];
1039
+ await traceBatch(sb, orderIdsInRonde.map((oid) => ({
1040
+ orderRef: oid,
1041
+ phase: "indeling",
1042
+ step: "Planner-logica vastgelegd",
1043
+ status: "geslaagd",
1044
+ actor: "planner",
1045
+ decision: `Moduleversie ${MODULE_VERSION}`,
1046
+ reason: "Een bestelregel die aan een echt artikel gekoppeld is, blijft dat artikel, ook als er een productgroep met dezelfde naam bestaat. Onbekende groepsleden blokkeren.",
1047
+ rule: "gekoppeld_artikel_voor_groepsnaam",
1048
+ values: { moduleVersion: MODULE_VERSION, bufferId, beladingSources },
1049
+ })));
1050
+ }
1051
+ catch {
1052
+ // logboek is nooit sturend
1053
+ }
1016
1054
  // Bestaande beladingen tellen en wissen.
1017
1055
  const { data: existingCarts } = await sb
1018
1056
  .from("order_carts")
@@ -1217,9 +1255,11 @@ async function replanBufferUnlocked(sb, bufferId, options = {}) {
1217
1255
  // omzeild kan worden.
1218
1256
  const totalCartsAfterPlan = plannedCarts.length + frozenCartCount;
1219
1257
  if (totalCartsAfterPlan > MAX_CARTS_PER_BUFFER) {
1220
- const reason = `Deze orderbuffer komt uit op ${totalCartsAfterPlan} ladingdragers ` +
1258
+ const reason = `Orderbuffer met order(s) ${orderRefs.join(", ")} komt uit op ${totalCartsAfterPlan} ladingdragers ` +
1221
1259
  `(${frozenCartCount} al vastgelegd + ${plannedCarts.length} nieuw), meer dan de grens van ` +
1222
- `${MAX_CARTS_PER_BUFFER}. Er is niets ingedeeld; controleer de aantallen of de belading van de producten.`;
1260
+ `${MAX_CARTS_PER_BUFFER}. Alleen deze buffer is niet ingedeeld. Wat te doen: controleer de ` +
1261
+ `aantallen in de order (dubbele regels?) en de belading per ladingdrager van de producten; ` +
1262
+ `daarna opnieuw berekenen.`;
1223
1263
  console.error(`[logistiek-engine] buffer ${bufferId} geblokkeerd: ${reason}`);
1224
1264
  if (!options.dryRun) {
1225
1265
  const { error: blockError } = await sb.rpc("logistics_plan_block", {
@@ -1264,6 +1304,30 @@ async function replanBufferUnlocked(sb, bufferId, options = {}) {
1264
1304
  carts: plannedCarts,
1265
1305
  };
1266
1306
  }
1307
+ // Tussen lezen en schrijven kan de buffer zijn afgesloten (bijv. door het
1308
+ // losmaken van late orders). Dan niets meer schrijven.
1309
+ {
1310
+ const { data: bufRow, error: bufError } = await sb
1311
+ .from("order_buffers")
1312
+ .select("closed_at")
1313
+ .eq("id", bufferId)
1314
+ .maybeSingle();
1315
+ if (bufError || bufRow?.closed_at) {
1316
+ const reason = bufError
1317
+ ? `Status van de buffer kon niet worden gelezen: ${bufError.message}`
1318
+ : "De buffer is inmiddels afgesloten; er is niets weggeschreven.";
1319
+ return {
1320
+ ok: true,
1321
+ bufferId,
1322
+ orderIds,
1323
+ cartsCreated: 0,
1324
+ replacedManualCount,
1325
+ usedFloridayPacking,
1326
+ warnings: [...warnings, reason],
1327
+ skipped: "locked",
1328
+ };
1329
+ }
1330
+ }
1267
1331
  const persistentIdentities = assignPersistentCartIdentities(plannedCarts, itemToOrder, {
1268
1332
  shared: isBufferOrder || isSupplement,
1269
1333
  startNumber: cartNumberStart,
@@ -16106,18 +16106,24 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
16106
16106
  Row: {
16107
16107
  id: boolean;
16108
16108
  last_cleanup_at: string | null;
16109
+ last_error: string | null;
16110
+ last_error_at: string | null;
16109
16111
  last_sync_at: string | null;
16110
16112
  updated_at: string;
16111
16113
  };
16112
16114
  Insert: {
16113
16115
  id?: boolean;
16114
16116
  last_cleanup_at?: string | null;
16117
+ last_error?: string | null;
16118
+ last_error_at?: string | null;
16115
16119
  last_sync_at?: string | null;
16116
16120
  updated_at?: string;
16117
16121
  };
16118
16122
  Update: {
16119
16123
  id?: boolean;
16120
16124
  last_cleanup_at?: string | null;
16125
+ last_error?: string | null;
16126
+ last_error_at?: string | null;
16121
16127
  last_sync_at?: string | null;
16122
16128
  updated_at?: string;
16123
16129
  };
@@ -26391,6 +26397,27 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
26391
26397
  };
26392
26398
  Returns: boolean;
26393
26399
  };
26400
+ layout_print_document: {
26401
+ Args: {
26402
+ _documentnaam: string;
26403
+ _documenttype: string;
26404
+ _herkomst?: string;
26405
+ _idempotentie_sleutel?: string;
26406
+ _is_herprint?: boolean;
26407
+ _kopieen?: number;
26408
+ _layout_id?: string;
26409
+ _payload?: import("../integrations/supabase/types").Json;
26410
+ _pdf_base64?: string;
26411
+ _pdf_url?: string;
26412
+ _print_plek_id?: string;
26413
+ _werkplek?: string;
26414
+ };
26415
+ Returns: {
26416
+ bestaand: boolean;
26417
+ job_id: string;
26418
+ printer_id: string;
26419
+ }[];
26420
+ };
26394
26421
  list_medewerkers: {
26395
26422
  Args: never;
26396
26423
  Returns: {
@@ -27093,6 +27120,13 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
27093
27120
  };
27094
27121
  Returns: import("../integrations/supabase/types").Json;
27095
27122
  };
27123
+ logistics_control_scan_print_own: {
27124
+ Args: {
27125
+ p_is_herprint?: boolean;
27126
+ p_scan_id: string;
27127
+ };
27128
+ Returns: import("../integrations/supabase/types").Json;
27129
+ };
27096
27130
  logistics_control_scan_retry: {
27097
27131
  Args: {
27098
27132
  _id: string;
@@ -27997,6 +28031,21 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
27997
28031
  };
27998
28032
  Returns: import("../integrations/supabase/types").Json;
27999
28033
  };
28034
+ logistics_print_via_layout: {
28035
+ Args: {
28036
+ _documentnaam: string;
28037
+ _documenttype: string;
28038
+ _herkomst: string;
28039
+ _idempotentie_sleutel: string;
28040
+ _is_herprint: boolean;
28041
+ _layout_id: string;
28042
+ _payload: import("../integrations/supabase/types").Json;
28043
+ _pdf_base64: string;
28044
+ _pdf_url: string;
28045
+ _print_plek_id: string;
28046
+ };
28047
+ Returns: import("../integrations/supabase/types").Json;
28048
+ };
28000
28049
  logistics_prune_buffer_member_queue: {
28001
28050
  Args: never;
28002
28051
  Returns: number;
@@ -28352,6 +28401,12 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
28352
28401
  };
28353
28402
  Returns: undefined;
28354
28403
  };
28404
+ logistics_slip_note_retry: {
28405
+ Args: {
28406
+ _id: string;
28407
+ };
28408
+ Returns: import("../integrations/supabase/types").Json;
28409
+ };
28355
28410
  logistics_sticker_follows_slip: {
28356
28411
  Args: never;
28357
28412
  Returns: boolean;
@@ -29096,6 +29151,10 @@ export declare const startRecalcJob: import("@tanstack/start-client-core").Optio
29096
29151
  };
29097
29152
  Returns: string;
29098
29153
  };
29154
+ pick_is_reference_admin: {
29155
+ Args: never;
29156
+ Returns: boolean;
29157
+ };
29099
29158
  pick_mark_printed: {
29100
29159
  Args: {
29101
29160
  _queue_item_id: string;
@@ -47270,18 +47329,24 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
47270
47329
  Row: {
47271
47330
  id: boolean;
47272
47331
  last_cleanup_at: string | null;
47332
+ last_error: string | null;
47333
+ last_error_at: string | null;
47273
47334
  last_sync_at: string | null;
47274
47335
  updated_at: string;
47275
47336
  };
47276
47337
  Insert: {
47277
47338
  id?: boolean;
47278
47339
  last_cleanup_at?: string | null;
47340
+ last_error?: string | null;
47341
+ last_error_at?: string | null;
47279
47342
  last_sync_at?: string | null;
47280
47343
  updated_at?: string;
47281
47344
  };
47282
47345
  Update: {
47283
47346
  id?: boolean;
47284
47347
  last_cleanup_at?: string | null;
47348
+ last_error?: string | null;
47349
+ last_error_at?: string | null;
47285
47350
  last_sync_at?: string | null;
47286
47351
  updated_at?: string;
47287
47352
  };
@@ -57555,6 +57620,27 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
57555
57620
  };
57556
57621
  Returns: boolean;
57557
57622
  };
57623
+ layout_print_document: {
57624
+ Args: {
57625
+ _documentnaam: string;
57626
+ _documenttype: string;
57627
+ _herkomst?: string;
57628
+ _idempotentie_sleutel?: string;
57629
+ _is_herprint?: boolean;
57630
+ _kopieen?: number;
57631
+ _layout_id?: string;
57632
+ _payload?: import("../integrations/supabase/types").Json;
57633
+ _pdf_base64?: string;
57634
+ _pdf_url?: string;
57635
+ _print_plek_id?: string;
57636
+ _werkplek?: string;
57637
+ };
57638
+ Returns: {
57639
+ bestaand: boolean;
57640
+ job_id: string;
57641
+ printer_id: string;
57642
+ }[];
57643
+ };
57558
57644
  list_medewerkers: {
57559
57645
  Args: never;
57560
57646
  Returns: {
@@ -58257,6 +58343,13 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
58257
58343
  };
58258
58344
  Returns: import("../integrations/supabase/types").Json;
58259
58345
  };
58346
+ logistics_control_scan_print_own: {
58347
+ Args: {
58348
+ p_is_herprint?: boolean;
58349
+ p_scan_id: string;
58350
+ };
58351
+ Returns: import("../integrations/supabase/types").Json;
58352
+ };
58260
58353
  logistics_control_scan_retry: {
58261
58354
  Args: {
58262
58355
  _id: string;
@@ -59161,6 +59254,21 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
59161
59254
  };
59162
59255
  Returns: import("../integrations/supabase/types").Json;
59163
59256
  };
59257
+ logistics_print_via_layout: {
59258
+ Args: {
59259
+ _documentnaam: string;
59260
+ _documenttype: string;
59261
+ _herkomst: string;
59262
+ _idempotentie_sleutel: string;
59263
+ _is_herprint: boolean;
59264
+ _layout_id: string;
59265
+ _payload: import("../integrations/supabase/types").Json;
59266
+ _pdf_base64: string;
59267
+ _pdf_url: string;
59268
+ _print_plek_id: string;
59269
+ };
59270
+ Returns: import("../integrations/supabase/types").Json;
59271
+ };
59164
59272
  logistics_prune_buffer_member_queue: {
59165
59273
  Args: never;
59166
59274
  Returns: number;
@@ -59516,6 +59624,12 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
59516
59624
  };
59517
59625
  Returns: undefined;
59518
59626
  };
59627
+ logistics_slip_note_retry: {
59628
+ Args: {
59629
+ _id: string;
59630
+ };
59631
+ Returns: import("../integrations/supabase/types").Json;
59632
+ };
59519
59633
  logistics_sticker_follows_slip: {
59520
59634
  Args: never;
59521
59635
  Returns: boolean;
@@ -60260,6 +60374,10 @@ export declare const tickRecalcJob: import("@tanstack/start-client-core").Option
60260
60374
  };
60261
60375
  Returns: string;
60262
60376
  };
60377
+ pick_is_reference_admin: {
60378
+ Args: never;
60379
+ Returns: boolean;
60380
+ };
60263
60381
  pick_mark_printed: {
60264
60382
  Args: {
60265
60383
  _queue_item_id: string;