@flowselections/logistiek-engine 1.0.138 → 1.0.147

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 (47) hide show
  1. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts +2 -0
  2. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts.map +1 -0
  3. package/dist-lib/components/GearchiveerdeOrdersCard.js +32 -0
  4. package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
  5. package/dist-lib/components/GeblokkeerdeOrdersCard.js +1 -1
  6. package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -1
  7. package/dist-lib/components/PlanWachtrijPage.js +20 -13
  8. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
  9. package/dist-lib/components/RuleEnginePage.js +24 -3
  10. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +20 -0
  11. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
  12. package/dist-lib/hooks/useGeblokkeerdeOrders.js +57 -0
  13. package/dist-lib/index.d.ts +1 -0
  14. package/dist-lib/index.d.ts.map +1 -1
  15. package/dist-lib/index.js +1 -0
  16. package/dist-lib/integrations/supabase/types.d.ts +728 -0
  17. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  18. package/dist-lib/lib/briefTransport.server.d.ts +17 -0
  19. package/dist-lib/lib/briefTransport.server.d.ts.map +1 -0
  20. package/dist-lib/lib/briefTransport.server.js +41 -0
  21. package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
  22. package/dist-lib/lib/controlScan.server.js +16 -1
  23. package/dist-lib/lib/handlers/logistics-tick.server.js +21 -0
  24. package/dist-lib/lib/layoutPrint.server.d.ts +18 -0
  25. package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -1
  26. package/dist-lib/lib/layoutPrint.server.js +32 -1
  27. package/dist-lib/lib/logisticsTasks.d.ts +1 -0
  28. package/dist-lib/lib/logisticsTasks.d.ts.map +1 -1
  29. package/dist-lib/lib/logisticsTasks.js +2 -1
  30. package/dist-lib/lib/modulePrompts.d.ts +1 -0
  31. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  32. package/dist-lib/lib/modulePrompts.js +338 -1
  33. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  34. package/dist-lib/lib/moduleVersion.js +1 -1
  35. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  36. package/dist-lib/lib/planQueue.server.js +13 -0
  37. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  38. package/dist-lib/lib/ruleEngineSchema.js +18 -0
  39. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  40. package/dist-lib/lib/shippingNoteQueue.server.js +18 -1
  41. package/dist-lib/lib/stickerQueue.server.d.ts +15 -0
  42. package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -0
  43. package/dist-lib/lib/stickerQueue.server.js +349 -0
  44. package/dist-lib/lib/stickerRules.d.ts +38 -0
  45. package/dist-lib/lib/stickerRules.d.ts.map +1 -0
  46. package/dist-lib/lib/stickerRules.js +111 -0
  47. package/package.json +2 -2
@@ -0,0 +1,17 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export interface BriefTransport {
3
+ velden: Record<string, unknown>;
4
+ onbekend: string[];
5
+ }
6
+ /** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
7
+ export declare function bouwBriefTransport(data: unknown): BriefTransport;
8
+ export declare function onbekendTekst(onbekend: string[]): string | null;
9
+ /** Haalt het blok op; een fout blokkeert het printen niet. */
10
+ export declare function briefTransport(sb: SupabaseClient, orderId: string | null, cartId: string | null, log: {
11
+ traceId?: string | null;
12
+ orderRef?: string | null;
13
+ cartRef?: string | null;
14
+ phase: string;
15
+ actor: string;
16
+ }): Promise<Record<string, unknown>>;
17
+ //# sourceMappingURL=briefTransport.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefTransport.server.d.ts","sourceRoot":"","sources":["../../src/lib/briefTransport.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAiBhE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAO/D;AAED,8DAA8D;AAC9D,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChH,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlC"}
@@ -0,0 +1,41 @@
1
+ import { trace } from "./trace.server.js";
2
+ /** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
3
+ export function bouwBriefTransport(data) {
4
+ const r = (data && typeof data === "object" ? data : {});
5
+ const velden = {};
6
+ const v = r["vervoerder"];
7
+ const naam = typeof v?.["naam"] === "string" ? v["naam"].trim() : "";
8
+ if (naam) {
9
+ const code = typeof v?.["code"] === "string" ? v["code"].trim() : "";
10
+ velden["vervoerder"] = code ? { naam, code } : { naam };
11
+ }
12
+ const om = r["ophaalmoment"];
13
+ if (typeof om === "string" && !Number.isNaN(Date.parse(om)))
14
+ velden["ophaalmoment"] = om;
15
+ const adres = r["ophaaladres"];
16
+ if (typeof adres === "string" && adres.trim())
17
+ velden["ophaaladres"] = adres.trim();
18
+ const onbekend = Array.isArray(r["onbekend"]) ? r["onbekend"].map(String) : [];
19
+ if (!naam && !onbekend.includes("vervoerder"))
20
+ onbekend.push("vervoerder");
21
+ if (!velden["ophaalmoment"] && !onbekend.some((x) => x.startsWith("ophaalmoment")))
22
+ onbekend.push("ophaalmoment");
23
+ return { velden, onbekend };
24
+ }
25
+ export function onbekendTekst(onbekend) {
26
+ const delen = onbekend
27
+ .filter((x) => x !== "ophaaladres")
28
+ .map((x) => x === "ophaalmoment_niet_eenduidig" ? "ophaalmoment niet eenduidig" : x === "order" ? "order niet gevonden" : `${x} onbekend`);
29
+ return delen.length ? `Op deze brief ontbreekt: ${delen.join(", ")}.` : null;
30
+ }
31
+ /** Haalt het blok op; een fout blokkeert het printen niet. */
32
+ export async function briefTransport(sb, orderId, cartId, log) {
33
+ if (!orderId)
34
+ return {};
35
+ const { data, error } = await sb.rpc("logistics_brief_transport", { p_order_id: orderId, p_cart_id: cartId });
36
+ const res = error ? { velden: {}, onbekend: ["vervoerder", "ophaalmoment"] } : bouwBriefTransport(data);
37
+ const tekst = error ? `Vervoerder/ophaalmoment niet te lezen: ${error.message}` : onbekendTekst(res.onbekend);
38
+ if (tekst)
39
+ await trace(sb, { ...log, step: "Vervoerder/ophaalmoment voor de brief", status: "waarschuwing", reason: tekst });
40
+ return res.velden;
41
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiBD,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAgBzC,mDAAmD;AACnD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1F,GAAG,GAAE,MAAmB,GACvB,UAAU,GAAG,MAAM,GAAG,IAAI,CAK5B;AA6BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CAwPzB"}
1
+ {"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiBD,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAgBzC,mDAAmD;AACnD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1F,GAAG,GAAE,MAAmB,GACvB,UAAU,GAAG,MAAM,GAAG,IAAI,CAK5B;AA6BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CAuQzB"}
@@ -14,7 +14,8 @@
14
14
  // en dubbele scans worden al in de database geblokkeerd. Geen omgevings- of
15
15
  // klantwaarden in deze code; de printer komt uit de werkwijze in de database.
16
16
  // ============================================================================
17
- import { printViaLayoutGecontroleerd, floridayLayout } from "./layoutPrint.server.js";
17
+ import { printViaLayoutGecontroleerd, floridayLayout, floridayPdfOpslag } from "./layoutPrint.server.js";
18
+ import { briefTransport } from "./briefTransport.server.js";
18
19
  import { isFloridayCancelled, FLORIDAY_CANCELLED_REASON } from "./floridayCancellation.server.js";
19
20
  import { trace } from "./trace.server.js";
20
21
  /** Maximaal aantal wachtrondes op Floriday voordat de controle als mislukt stopt. */
@@ -238,7 +239,19 @@ export async function runControlScanQueue(sb, options = {}) {
238
239
  run.failed++;
239
240
  continue;
240
241
  }
242
+ // Blijvende verwijzing { bucket, pad } naast de tijdelijke link.
243
+ const pdfOpslag = await floridayPdfOpslag(sb, {
244
+ fulfillmentOrderId,
245
+ labelCode: doc["logisticLabelCode"] ?? null,
246
+ pdfUrl: url,
247
+ });
241
248
  // Via de Layout maker; idempotent per controle.
249
+ const transport = await briefTransport(sb, row.order_id ?? null, row.cart_id ?? null, {
250
+ orderRef: row.order_number ?? row.order_id ?? null,
251
+ cartRef: row.cart_id ?? null,
252
+ phase: "controle",
253
+ actor: "logistiek-engine:controlescan",
254
+ });
242
255
  const printed = await printViaLayoutGecontroleerd(sb, {
243
256
  documenttype: "afleverbrief",
244
257
  layoutId: layout.layoutId,
@@ -259,6 +272,8 @@ export async function runControlScanQueue(sb, options = {}) {
259
272
  cart_id: row.cart_id,
260
273
  fulfillment_order_id: fulfillmentOrderId,
261
274
  control_scan_id: row.id,
275
+ ...(pdfOpslag ? { pdf_opslag: pdfOpslag } : {}),
276
+ ...transport,
262
277
  },
263
278
  });
264
279
  if (!printed.ok) {
@@ -265,6 +265,15 @@ async function runTickRound(supabase, tickJob, ident) {
265
265
  shippingNotes = { error: String(e?.message ?? e) };
266
266
  shippingNotesOk = false;
267
267
  }
268
+ // Stickerronde: klant- en tray-stickers (Engine is eigenaar).
269
+ let stickers = null;
270
+ try {
271
+ const { runStickerQueue } = await import("../stickerQueue.server.js");
272
+ stickers = await runStickerQueue(supabase, { limit: 10 });
273
+ }
274
+ catch (e) {
275
+ stickers = { error: String(e?.message ?? e) };
276
+ }
268
277
  // Seintjes van de pickschermen: karplan ontbreekt. Direct oppakken.
269
278
  let cartPlanRequests = null;
270
279
  try {
@@ -285,6 +294,16 @@ async function runTickRound(supabase, tickJob, ident) {
285
294
  catch (e) {
286
295
  queueCleanup = { error: String(e?.message ?? e) };
287
296
  }
297
+ // Blokkades van verzonden orders sluiten, niet-geleverde verlopen orders
298
+ // archiveren en meldingen sluiten waarvan de oorzaak weg is.
299
+ let housekeeping = null;
300
+ try {
301
+ const { data, error } = await supabase.rpc("logistics_plan_housekeeping");
302
+ housekeeping = error ? { error: error.message } : data;
303
+ }
304
+ catch (e) {
305
+ housekeeping = { error: String(e?.message ?? e) };
306
+ }
288
307
  // Pakbonnen zonder kar, of van een kar die na een herindeling niet meer
289
308
  // bestaat, kunnen nooit een barcode krijgen. Die worden hier afgesloten met
290
309
  // een leesbare reden in plaats van eeuwig te blijven wachten.
@@ -339,7 +358,9 @@ async function runTickRound(supabase, tickJob, ident) {
339
358
  shippingNotes,
340
359
  barcodes,
341
360
  cartPlanRequests,
361
+ stickers,
342
362
  queueCleanup,
363
+ housekeeping,
343
364
  orphanPrintJobs,
344
365
  }, { status: shippingNotesOk ? 200 : 500, headers: CORS_HEADERS });
345
366
  }
@@ -8,6 +8,8 @@ export interface LayoutPrintInput {
8
8
  printPlekId?: string | null;
9
9
  herkomst?: string | null;
10
10
  isHerprint?: boolean;
11
+ /** Aantal kopieën (standaard 1). */
12
+ kopieen?: number;
11
13
  /** Alleen snake_case-velden: print_plek_id, order_id, ordernummer, queue_item_id, cart_id, fulfillment_order_id. */
12
14
  payload: Record<string, unknown>;
13
15
  idempotentieSleutel: string;
@@ -33,6 +35,22 @@ export declare function floridayLayout(sb: SupabaseClient, documenttype: string)
33
35
  layoutId: string | null;
34
36
  reden: string | null;
35
37
  }>;
38
+ /** Bucket uit een ondertekende opslaglink (/storage/v1/object/sign/<bucket>/<pad>). */
39
+ export declare function bucketUitLink(url: string | null | undefined): string | null;
40
+ /**
41
+ * Blijvende verwijzing naar de opgeslagen Floriday-pdf: { bucket, pad }.
42
+ * Het pad komt op id uit floriday_logistic_labels_cache (eigendom van de
43
+ * Floriday-koppeling); de bucket uit de ondertekende link. Alleen bij precies
44
+ * één rij; anders null (geen gok, printen gaat door met pdf_url).
45
+ */
46
+ export declare function floridayPdfOpslag(sb: SupabaseClient, input: {
47
+ fulfillmentOrderId: string | null;
48
+ labelCode?: string | null;
49
+ pdfUrl: string | null;
50
+ }): Promise<{
51
+ bucket: string;
52
+ pad: string;
53
+ } | null>;
36
54
  export declare function foutcode(message: string): string;
37
55
  export declare function printViaLayout(sb: SupabaseClient, input: LayoutPrintInput): Promise<LayoutPrintResult>;
38
56
  export type GecontroleerdResult = {
@@ -1 +1 @@
1
- {"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oHAAoH;IACpH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACxE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAInF,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAuBvE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAQ5D;AAKD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAOD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAChG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,0EAA0E;AAC1E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI9F;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,gBAAgB,EACvB,MAAM,SAAI,GACT,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
1
+ {"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,37 @@ export async function floridayLayout(sb, documenttype) {
51
51
  const id = typeof r["layout_id"] === "string" ? r["layout_id"] : null;
52
52
  return { layoutId: id, reden: id ? null : String(r["reden"] ?? "Geen actieve Floriday-layout gevonden.") };
53
53
  }
54
+ /** Bucket uit een ondertekende opslaglink (/storage/v1/object/sign/<bucket>/<pad>). */
55
+ export function bucketUitLink(url) {
56
+ if (!url)
57
+ return null;
58
+ const m = /\/storage\/v1\/object\/(?:sign|public|authenticated)\/([^/?#]+)\//.exec(url);
59
+ return m ? decodeURIComponent(m[1]) : null;
60
+ }
61
+ /**
62
+ * Blijvende verwijzing naar de opgeslagen Floriday-pdf: { bucket, pad }.
63
+ * Het pad komt op id uit floriday_logistic_labels_cache (eigendom van de
64
+ * Floriday-koppeling); de bucket uit de ondertekende link. Alleen bij precies
65
+ * één rij; anders null (geen gok, printen gaat door met pdf_url).
66
+ */
67
+ export async function floridayPdfOpslag(sb, input) {
68
+ if (!input.fulfillmentOrderId)
69
+ return null;
70
+ const bucket = bucketUitLink(input.pdfUrl);
71
+ if (!bucket)
72
+ return null;
73
+ let q = sb
74
+ .from("floriday_logistic_labels_cache")
75
+ .select("storage_path")
76
+ .eq("fulfillment_order_id", input.fulfillmentOrderId);
77
+ if (input.labelCode)
78
+ q = q.eq("logistic_label_code", input.labelCode);
79
+ const { data, error } = await q.limit(2);
80
+ if (error || !Array.isArray(data) || data.length !== 1)
81
+ return null;
82
+ const pad = String(data[0]["storage_path"] ?? "").trim();
83
+ return pad ? { bucket, pad } : null;
84
+ }
54
85
  const HINT = ' Los dit op bij Layouts en printers en druk daarna op "Opnieuw proberen"; opnieuw scannen is niet nodig.';
55
86
  export function foutcode(message) {
56
87
  const m = /^([A-Z_]+):/.exec(message.trim());
@@ -65,7 +96,7 @@ export async function printViaLayout(sb, input) {
65
96
  _layout_id: input.layoutId ?? null,
66
97
  _print_plek_id: input.printPlekId ?? null,
67
98
  _werkplek: null,
68
- _kopieen: 1,
99
+ _kopieen: Math.max(1, Math.floor(input.kopieen ?? 1)),
69
100
  _herkomst: input.herkomst ?? null,
70
101
  _is_herprint: input.isHerprint ?? false,
71
102
  _payload: input.payload,
@@ -7,6 +7,7 @@ export declare const LOGISTICS_MODULES: {
7
7
  readonly klanten: "Floriday - Klanten Module";
8
8
  readonly mailbox: "Mail box voor bestellingen ERP Kwekers";
9
9
  readonly personeelsplanning: "Personeelsplanning module";
10
+ readonly logistiek: "Logistiek Engine";
10
11
  };
11
12
  export type LogisticsModuleKey = keyof typeof LOGISTICS_MODULES;
12
13
  export declare const TASK_TYPES: readonly ["buffer.close", "stock.reserve", "load.compose", "pick.execute", "scan.verify", "control.execute", "print.packing_slip", "print.sticker", "print.shipping_note", "print.control_note", "print.production_note", "transport.dispatch"];
@@ -1 +1 @@
1
- {"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;;;;;CASpB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEhE,eAAO,MAAM,UAAU,iPAab,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAapE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAaxD,CAAC;AAEF,eAAO,MAAM,aAAa,wGAShB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CASjE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAMnD,CAAC;AAGF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEvE"}
1
+ {"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEhE,eAAO,MAAM,UAAU,iPAab,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAapE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAaxD,CAAC;AAEF,eAAO,MAAM,aAAa,wGAShB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CASjE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAMnD,CAAC;AAGF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEvE"}
@@ -13,6 +13,7 @@ export const LOGISTICS_MODULES = {
13
13
  klanten: "Floriday - Klanten Module",
14
14
  mailbox: "Mail box voor bestellingen ERP Kwekers",
15
15
  personeelsplanning: "Personeelsplanning module",
16
+ logistiek: "Logistiek Engine",
16
17
  };
17
18
  export const TASK_TYPES = [
18
19
  "buffer.close",
@@ -36,7 +37,7 @@ export const TASK_OWNER = {
36
37
  "scan.verify": "scanners",
37
38
  "control.execute": "afhandeling",
38
39
  "print.packing_slip": "pickschermen",
39
- "print.sticker": "pickschermen",
40
+ "print.sticker": "logistiek",
40
41
  "print.shipping_note": "afhandeling",
41
42
  "print.control_note": "afhandeling",
42
43
  "print.production_note": "pickschermen",
@@ -6,6 +6,7 @@
6
6
  export declare const PROMPT_MODULE_LABELS: {
7
7
  readonly layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)";
8
8
  readonly floridaykoppeling: "Floriday koppeling (authenticatie en gateway)";
9
+ readonly dashboards: "Dashboards (dashboard-erp-kwekers)";
9
10
  readonly verkoop: "Floriday - Verkoop Module";
10
11
  readonly voorraad: "Floriday - Voorraad Module";
11
12
  readonly afhandeling: "Floriday - Afhandeling Module";
@@ -1 +1 @@
1
- {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAIvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAqzJD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
1
+ {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAgpKD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}