@flowselections/pick-schermen-kwekers 1.0.60 → 1.0.64

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 (57) hide show
  1. package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
  2. package/dist-lib/components/pick/PickScherm.js +28 -10
  3. package/dist-lib/components/pick/QueueTable.d.ts +5 -1
  4. package/dist-lib/components/pick/QueueTable.d.ts.map +1 -1
  5. package/dist-lib/components/pick/QueueTable.js +14 -31
  6. package/dist-lib/components/pick/ShippingNoteScan.d.ts.map +1 -1
  7. package/dist-lib/components/pick/ShippingNoteScan.js +52 -13
  8. package/dist-lib/components/pick/StickerState.d.ts +4 -0
  9. package/dist-lib/components/pick/StickerState.d.ts.map +1 -1
  10. package/dist-lib/components/pick/StickerState.js +30 -4
  11. package/dist-lib/hooks/usePickPrintStatus.d.ts +14 -0
  12. package/dist-lib/hooks/usePickPrintStatus.d.ts.map +1 -0
  13. package/dist-lib/hooks/usePickPrintStatus.js +47 -0
  14. package/dist-lib/hooks/usePickQueue.d.ts +2 -0
  15. package/dist-lib/hooks/usePickQueue.d.ts.map +1 -1
  16. package/dist-lib/hooks/usePickQueue.js +29 -8
  17. package/dist-lib/integrations/supabase/types.d.ts +937 -7
  18. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  19. package/dist-lib/integrations/supabase/types.js +1 -0
  20. package/dist-lib/lib/__tests__/pick143.test.js +1 -1
  21. package/dist-lib/lib/__tests__/pick161.test.d.ts +2 -0
  22. package/dist-lib/lib/__tests__/pick161.test.d.ts.map +1 -0
  23. package/dist-lib/lib/__tests__/pick161.test.js +29 -0
  24. package/dist-lib/lib/__tests__/pick163.test.d.ts +2 -0
  25. package/dist-lib/lib/__tests__/pick163.test.d.ts.map +1 -0
  26. package/dist-lib/lib/__tests__/pick163.test.js +68 -0
  27. package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts +2 -0
  28. package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts.map +1 -0
  29. package/dist-lib/lib/__tests__/pickUitwijk.test.js +36 -0
  30. package/dist-lib/lib/pick143.d.ts +7 -2
  31. package/dist-lib/lib/pick143.d.ts.map +1 -1
  32. package/dist-lib/lib/pick143.js +24 -5
  33. package/dist-lib/lib/pick159.js +2 -2
  34. package/dist-lib/lib/pick161.d.ts +27 -0
  35. package/dist-lib/lib/pick161.d.ts.map +1 -0
  36. package/dist-lib/lib/pick161.js +86 -0
  37. package/dist-lib/lib/pickPerf.d.ts +11 -0
  38. package/dist-lib/lib/pickPerf.d.ts.map +1 -0
  39. package/dist-lib/lib/pickPerf.js +35 -0
  40. package/dist-lib/lib/pickPreview.d.ts.map +1 -1
  41. package/dist-lib/lib/pickPreview.js +2 -1
  42. package/dist-lib/lib/pickPrintStatus.d.ts +36 -0
  43. package/dist-lib/lib/pickPrintStatus.d.ts.map +1 -0
  44. package/dist-lib/lib/pickPrintStatus.js +98 -0
  45. package/dist-lib/lib/pickRowState.d.ts +2 -1
  46. package/dist-lib/lib/pickRowState.d.ts.map +1 -1
  47. package/dist-lib/lib/pickRowState.js +4 -2
  48. package/dist-lib/lib/pickStickers.d.ts +5 -0
  49. package/dist-lib/lib/pickStickers.d.ts.map +1 -1
  50. package/dist-lib/lib/pickStickers.js +3 -0
  51. package/dist-lib/lib/pickUitwijk.d.ts +25 -0
  52. package/dist-lib/lib/pickUitwijk.d.ts.map +1 -0
  53. package/dist-lib/lib/pickUitwijk.js +93 -0
  54. package/dist-lib/lib/shippingNote.d.ts +2 -0
  55. package/dist-lib/lib/shippingNote.d.ts.map +1 -1
  56. package/dist-lib/lib/shippingNote.js +2 -1
  57. package/package.json +1 -1
@@ -40,6 +40,7 @@ export const Constants = {
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
42
  "traysticker",
43
+ "eigen_sticker",
43
44
  ],
44
45
  doc_orientation: ["portrait", "landscape"],
45
46
  exact_env: ["staging", "live"],
@@ -10,7 +10,7 @@ describe("1.0.43 buffer met 2 karren, kar 2 wacht", () => {
10
10
  const k2 = row("K2", { cartRowFor: "k2", cartId: "k2", cartSeq: 2, cartTotal: 2, cartPlanReady: true, cartPlanReleased: true, barcode: "LC2", printbaar: false, wachtTot: "2026-10-16T20:40:00Z" });
11
11
  it("kar 2 is zichtbaar maar niet printbaar en wordt door Volgende printen overgeslagen", () => {
12
12
  expect(isRowPrintable(k2)).toBe(false);
13
- expect(rowWaitMessage(rowWaitOf(k2.payload), TZ)).toBe("Deelkar wacht tot 22:40 op mogelijke aanvulling");
13
+ expect(rowWaitMessage(rowWaitOf(k2.payload), TZ, Date.parse("2026-10-16T20:00:00Z"))).toBe("Deelkar wacht tot 22:40 op mogelijke aanvulling");
14
14
  expect(firstVisibleTarget([k2, k1])?.id).toBe("K1");
15
15
  expect(firstVisibleTarget([k2])).toBeNull();
16
16
  expect(printBlockMessage(k2, TZ)).toBe("Deze kar wacht nog tot 22:40 op mogelijke aanvulling en kan nog niet geprint worden.");
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pick161.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick161.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick161.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ vi.mock("@flowselections/core", () => ({ supabase: {} }));
3
+ import { friendlyEngineMessage, isPakbonNumber, quantityText, slipVariantText, stickerLine } from "../pick161.js";
4
+ import { parseCartStickerState } from "../pickStickers.js";
5
+ describe("1.0.61", () => {
6
+ it("pakbonnummer herkend, kar-barcode niet", () => {
7
+ expect(isPakbonNumber("PB-AO-2601450-K1")).toBe(true);
8
+ expect(isPakbonNumber("LCA6CF37D617D54EF6")).toBe(false);
9
+ });
10
+ it("geen ruwe varianten of codes", () => {
11
+ expect(slipVariantText("partial_order")).toBe("Deel van de order");
12
+ expect(slipVariantText("iets_raars")).toBeNull();
13
+ const f = friendlyEngineMessage("GEEN_LAYOUT: geen layout gevonden voor documenttype verzendlabel.", "x");
14
+ expect(f.message).not.toMatch(/GEEN_LAYOUT|verzendlabel/);
15
+ expect(f.detail).toMatch(/GEEN_LAYOUT/);
16
+ });
17
+ it("fust en stuks", () => {
18
+ expect(quantityText(48, 2)).toBe("2 fust (48 st)");
19
+ expect(quantityText(48, null)).toBe("48 st");
20
+ });
21
+ it("stickers per kar met printplek", () => {
22
+ const s = parseCartStickerState({ totaal: 6, regels: [{ status: "geprint", kopieen: 6, uitwijkroute: "a4", printerNaam: "Kantoorprinter" }] });
23
+ expect(stickerLine(s)).toBe("6 stickers geprint op A4-vel (Kantoorprinter)");
24
+ const w = parseCartStickerState({ totaal: 2, regels: [{ status: "in_printwachtrij", kopieen: 2 }] });
25
+ expect(stickerLine(w)).toBe("2 stickers naar de printer gestuurd");
26
+ expect(stickerLine(parseCartStickerState({ totaal: 0, regels: [], geenStickersReden: "koper wil geen sticker" }))).toBe("Geen stickers nodig: koper wil geen sticker");
27
+ expect(stickerLine(null)).toBe("Stickerstand onbekend");
28
+ });
29
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pick163.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick163.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick163.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { inPrintIds, parsePrintStatus, printStatusLabel } from "../pickPrintStatus.js";
3
+ import { firstVisibleTarget } from "../pickRowState.js";
4
+ import { rowWaitMessage } from "../pick143.js";
5
+ import { sameQueueScope } from "../../hooks/usePickQueue.js";
6
+ const row = (id) => ({ id, document_number: id, printed_at: null, cancelled_at: null, completed_at: null, payload: {} });
7
+ const answer = {
8
+ beschikbaar: true,
9
+ reden: null,
10
+ items: [
11
+ { queue_item_id: "a", status: "voltooid", fase: "afleveren", melding: "done" },
12
+ { queue_item_id: "b", status: "wachtend", fase: null, melding: null },
13
+ { queue_item_id: "c", status: "bezig", fase: "opmaken", melding: null },
14
+ { queue_item_id: "d", status: "mislukt", fase: null, melding: "Printer offline" },
15
+ { queue_item_id: "e", status: null, melding: null },
16
+ { queue_item_id: "f", status: null, melding: "Hoort niet bij dit station" },
17
+ ],
18
+ };
19
+ describe("1.0.63 printstatus: tekst uit één bron", () => {
20
+ const r = parsePrintStatus(answer);
21
+ const label = (id) => printStatusLabel({ status: r.byId.get(id), loading: false, beschikbaar: true, reden: null });
22
+ it("geprint alleen bij voltooid", () => {
23
+ expect(label("a").label).toBe("Geprint");
24
+ expect(label("b").label).toBe("Wacht op printer");
25
+ expect(label("c").label).toBe("Wordt geprint (opmaken)");
26
+ });
27
+ it("mislukt: reden en opnieuw printen", () => {
28
+ expect(label("d")).toMatchObject({ label: "Niet geprint", reason: "Printer offline", retry: true });
29
+ });
30
+ it("geen opdracht: nog niet geprint; ander station: status onbekend met reden", () => {
31
+ expect(label("e").label).toBe("Nog niet geprint");
32
+ expect(label("f")).toMatchObject({ label: "Status onbekend", reason: "Hoort niet bij dit station" });
33
+ });
34
+ it("Engine te oud: status onbekend met reden, geen standaard", () => {
35
+ const old = parsePrintStatus({ beschikbaar: false, reden: "Printstatus nog niet beschikbaar: de Logistiek Engine is te oud.", items: [] });
36
+ const l = printStatusLabel({ status: undefined, loading: false, beschikbaar: old.beschikbaar, reden: old.reden });
37
+ expect(l.label).toBe("Status onbekend");
38
+ expect(l.reason).toContain("te oud");
39
+ });
40
+ it("laden: …", () => {
41
+ expect(printStatusLabel({ status: undefined, loading: true, beschikbaar: true, reden: null }).label).toBe("…");
42
+ });
43
+ });
44
+ describe("1.0.63 geen dubbele print", () => {
45
+ it("regels in print (wachtend/bezig) worden niet als volgende gekozen", () => {
46
+ const r = parsePrintStatus(answer);
47
+ const busy = inPrintIds(r);
48
+ expect([...busy].sort()).toEqual(["b", "c"]);
49
+ expect(firstVisibleTarget([row("b"), row("c"), row("d")], new Set(), busy)?.id).toBe("d");
50
+ });
51
+ });
52
+ describe("1.0.63 verlopen deelkar", () => {
53
+ it("wachttijd voorbij: met dag en datum en melding voor kantoor", () => {
54
+ const msg = rowWaitMessage({ printable: false, until: "2026-10-23T09:35:00Z", reason: null }, "Europe/Amsterdam", Date.parse("2026-10-26T10:00:00Z"));
55
+ expect(msg).toContain("wachtte tot");
56
+ expect(msg).toContain("23");
57
+ expect(msg).toContain("Meld dit bij kantoor");
58
+ });
59
+ it("nog binnen de wachttijd: wacht tot", () => {
60
+ const msg = rowWaitMessage({ printable: false, until: "2026-10-26T11:00:00Z", reason: null }, "Europe/Amsterdam", Date.parse("2026-10-26T10:00:00Z"));
61
+ expect(msg.startsWith("Deelkar wacht tot")).toBe(true);
62
+ });
63
+ });
64
+ describe("1.0.63 lijst springt niet tussen pickdagen", () => {
65
+ it("andere pickdag = andere scope", () => {
66
+ expect(sameQueueScope(["pick", "queue", "s", "-", "2026-10-26"], ["pick", "queue", "s", "-", "2026-10-27"])).toBe(false);
67
+ });
68
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pickUitwijk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickUitwijk.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickUitwijk.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ vi.mock("@flowselections/core", () => ({ supabase: {} }));
3
+ import { parseUitwijkList, parseVroegeWaarschuwing, uitwijkRouteText, vroegeWaarschuwingText } from "../pickUitwijk.js";
4
+ import { stickerLine } from "../pick161.js";
5
+ import { parseCartStickerState } from "../pickStickers.js";
6
+ describe("uitwijk Layouts", () => {
7
+ it("routes in gewone taal, onbekend niet tonen", () => {
8
+ expect(uitwijkRouteText("a4_vel")).toBe("A4");
9
+ expect(uitwijkRouteText("verkleind")).toBe("verkleind");
10
+ expect(uitwijkRouteText("raar")).toBeNull();
11
+ });
12
+ it("reden uit print_jobs.uitwijk achter de stickerregel", () => {
13
+ const s = parseCartStickerState({ totaal: 6, regels: [{ status: "geprint", kopieen: 6, printJobId: "j1" }] });
14
+ const u = parseUitwijkList([{ id: "j1", uitwijk: { uitwijkroute: "a4_vel", printerNaam: "Kantoorprinter", schaal: 1, reden: "past niet op Label Printer 25×89" } }]);
15
+ expect(stickerLine(s, u)).toBe("6 stickers geprint op A4 (Kantoorprinter) – past niet op Label Printer 25×89");
16
+ });
17
+ it("zonder uitwijk blijft de oude regel", () => {
18
+ const s = parseCartStickerState({ totaal: 2, regels: [{ status: "geprint", kopieen: 2, printJobId: "j1" }] });
19
+ expect(stickerLine(s, parseUitwijkList("x"))).toBe("2 stickers geprint");
20
+ });
21
+ it("vroege waarschuwing: niet beschikbaar = null, alleen A4/verkleind", () => {
22
+ expect(parseVroegeWaarschuwing(null)).toBeNull();
23
+ const w = parseVroegeWaarschuwing([{ dag: "2026-10-24", route: "a4_vel", aantal: 12, maat: "25×89 mm", printplek: "Expeditie" }, { dag: "2026-10-24", route: "precies", aantal: 5 }]);
24
+ expect(w).toHaveLength(1);
25
+ expect(vroegeWaarschuwingText(w[0], "2026-10-23")).toBe("Morgen: 12 stickers (25×89 mm) worden op A4 geprint bij Expeditie");
26
+ });
27
+ });
28
+ import { parseVroegeWaarschuwing as pvw } from "../pickUitwijk.js";
29
+ describe("vroege waarschuwing objectvorm", () => {
30
+ it("leest {regels, reden}", () => {
31
+ expect(pvw({ regels: [{ dag: "2026-10-24", maat: "25×89", aantal: 6, uitwijkroute: "a4_vel" }], reden: null })).toHaveLength(1);
32
+ });
33
+ it("lege lijst met reden geeft lege lijst", () => {
34
+ expect(pvw({ regels: [], reden: "nog niet beschikbaar" })).toEqual([]);
35
+ });
36
+ });
@@ -18,8 +18,13 @@ export declare function isRowOpen(item: Pick<PickQueueItem, "cancelled_at"> & {
18
18
  /** Mag deze regel geclaimd/geprint worden? Nooit bij printbaar = false of afgesloten. */
19
19
  export declare function isRowPrintable(item: PickQueueItem): boolean;
20
20
  export declare const WAIT_ROW_GENERIC = "Deelkar wacht op mogelijke aanvulling";
21
- /** Grijze regeltekst voor een wachtende deelkar. */
22
- export declare function rowWaitMessage(wait: RowWait, timeZone: string | null): string;
21
+ /** Dag, datum en tijd in de tijdzone van de vestiging (bv. "vr 23 okt 11:35"). */
22
+ export declare function formatSiteDayTime(iso: string, timeZone: string | null): string;
23
+ /**
24
+ * Grijze regeltekst voor een wachtende deelkar. Is de wachttijd verstreken en
25
+ * heeft de Engine de kar nog niet vrijgegeven, dan zeggen we dat met dag en datum.
26
+ */
27
+ export declare function rowWaitMessage(wait: RowWait, timeZone: string | null, now?: number): string;
23
28
  /** Melding als een printactie lokaal al geweigerd wordt; null = mag. */
24
29
  export declare function printBlockMessage(item: PickQueueItem, timeZone: string | null): string | null;
25
30
  export declare const CLOSED_ROW_MESSAGE = "Deze kar is al gescand en afgemeld.";
@@ -1 +1 @@
1
- {"version":3,"file":"pick143.d.ts","sourceRoot":"","sources":["../../src/lib/pick143.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWjD,MAAM,WAAW,OAAO;IACtB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASlD;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAEjH;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAE/G;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAG3D;AAED,eAAO,MAAM,gBAAgB,0CAA0C,CAAC;AAExE,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI7E;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAK7F;AAID,eAAO,MAAM,kBAAkB,wCAAwC,CAAC;AAExE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIxF;AAGD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,QAEjD;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAgB,GAAG,MAAM,GAAG,IAAI,CASlH;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIzD;AAID,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKxE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAE5D"}
1
+ {"version":3,"file":"pick143.d.ts","sourceRoot":"","sources":["../../src/lib/pick143.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWjD,MAAM,WAAW,OAAO;IACtB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASlD;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAEjH;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAE/G;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAG3D;AAED,eAAO,MAAM,gBAAgB,0CAA0C,CAAC;AAExE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAU9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAMvG;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAK7F;AAID,eAAO,MAAM,kBAAkB,wCAAwC,CAAC;AAExE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIxF;AAGD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,QAEjD;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAgB,GAAG,MAAM,GAAG,IAAI,CASlH;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIzD;AAID,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKxE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAE5D"}
@@ -36,11 +36,30 @@ export function isRowPrintable(item) {
36
36
  return rowWaitOf(item.payload).printable;
37
37
  }
38
38
  export const WAIT_ROW_GENERIC = "Deelkar wacht op mogelijke aanvulling";
39
- /** Grijze regeltekst voor een wachtende deelkar. */
40
- export function rowWaitMessage(wait, timeZone) {
41
- return wait.until
42
- ? `Deelkar wacht tot ${formatSiteTime(wait.until, timeZone)} op mogelijke aanvulling`
43
- : WAIT_ROW_GENERIC;
39
+ /** Dag, datum en tijd in de tijdzone van de vestiging (bv. "vr 23 okt 11:35"). */
40
+ export function formatSiteDayTime(iso, timeZone) {
41
+ const d = new Date(iso);
42
+ try {
43
+ return new Intl.DateTimeFormat("nl-NL", {
44
+ weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit",
45
+ ...(timeZone ? { timeZone } : {}),
46
+ }).format(d).replace(",", "").replace(/\./g, "");
47
+ }
48
+ catch {
49
+ return formatSiteTime(iso, timeZone);
50
+ }
51
+ }
52
+ /**
53
+ * Grijze regeltekst voor een wachtende deelkar. Is de wachttijd verstreken en
54
+ * heeft de Engine de kar nog niet vrijgegeven, dan zeggen we dat met dag en datum.
55
+ */
56
+ export function rowWaitMessage(wait, timeZone, now = Date.now()) {
57
+ if (!wait.until)
58
+ return WAIT_ROW_GENERIC;
59
+ if (new Date(wait.until).getTime() < now) {
60
+ return `Deelkar wachtte tot ${formatSiteDayTime(wait.until, timeZone)}; nog niet vrijgegeven. Meld dit bij kantoor.`;
61
+ }
62
+ return `Deelkar wacht tot ${formatSiteTime(wait.until, timeZone)} op mogelijke aanvulling`;
44
63
  }
45
64
  /** Melding als een printactie lokaal al geweigerd wordt; null = mag. */
46
65
  export function printBlockMessage(item, timeZone) {
@@ -95,9 +95,9 @@ export const KEYED_RPCS = new Set([
95
95
  "pickstation_auto_send_status", "pickstation_cart_sticker_state", "pickstation_document_for_order",
96
96
  "pickstation_get_orders_raw", "pickstation_get_planning_context", "pickstation_get_settings", "pickstation_log_print",
97
97
  "pickstation_order_sticker_meldingen", "pickstation_resolve_delivery_orders", "pickstation_sticker_past_controle",
98
- "pickstation_sticker_reprint",
98
+ "pickstation_sticker_reprint", "pickstation_print_status",
99
99
  "pick_read_station", "pick_read_locks", "pick_read_queue", "pick_read_country_counts", "pick_read_by_code",
100
- "pick_read_unscanned_earlier",
100
+ "pick_read_unscanned_earlier", "pick_resolve_scan_code", "pick_read_print_job_uitwijk", "pick_read_vroege_sticker_waarschuwing",
101
101
  ]);
102
102
  /** Engine-functies: via een eigen pickstation_-omhulsel met sleutelcontrole. */
103
103
  export const ENGINE_WRAPPED = new Set([
@@ -0,0 +1,27 @@
1
+ import type { CartStickerState } from "./pickStickers.js";
2
+ import { type Uitwijk } from "./pickUitwijk.js";
3
+ export declare const SCAN_UNKNOWN = "Scan de barcode onderaan de pakbon";
4
+ /** PB-<order>-K<n>: pakbonnummer, moet eerst naar de kar-barcode. */
5
+ export declare function isPakbonNumber(code: string): boolean;
6
+ /** Onbekende varianten tonen we niet (geen ruwe waarde op het scherm). */
7
+ export declare function slipVariantText(v: string | null | undefined): string | null;
8
+ /** "2 fust (48 st)" als het fust bekend is, anders "48 st". */
9
+ export declare function quantityText(qty: number | null, crates: number | null): string;
10
+ /** Haalt een technische code uit een melding; tekst voor de vloer + detail voor beheer. */
11
+ export declare function friendlyEngineMessage(raw: string | null | undefined, fallback: string): {
12
+ message: string;
13
+ detail: string | null;
14
+ };
15
+ export declare function printRouteText(v?: string | null): string | null;
16
+ export interface StickerPlace {
17
+ route: string | null;
18
+ printer: string | null;
19
+ count: number;
20
+ printed: boolean;
21
+ reden: string | null;
22
+ }
23
+ /** Telt per (uitwijkroute, printer) de stickers die naar de printer zijn gegaan. */
24
+ export declare function stickerPlaces(s: CartStickerState, uitwijk?: Map<string, Uitwijk>): StickerPlace[];
25
+ /** "6 stickers naar de printer gestuurd op A4-vel (Kantoorprinter)" of "Geen stickers nodig: <reden>". */
26
+ export declare function stickerLine(s: CartStickerState | null, uitwijk?: Map<string, Uitwijk>): string;
27
+ //# sourceMappingURL=pick161.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick161.d.ts","sourceRoot":"","sources":["../../src/lib/pick161.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,YAAY,uCAAuC,CAAC;AAEjE,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAMD,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE3E;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG9E;AASD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQlI;AAUD,wBAAgB,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAErI,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAejG;AAMD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAY9F"}
@@ -0,0 +1,86 @@
1
+ import { uitwijkRouteText } from "./pickUitwijk.js";
2
+ export const SCAN_UNKNOWN = "Scan de barcode onderaan de pakbon";
3
+ /** PB-<order>-K<n>: pakbonnummer, moet eerst naar de kar-barcode. */
4
+ export function isPakbonNumber(code) {
5
+ return /^PB-.+-K\d+$/i.test(code.trim());
6
+ }
7
+ const VARIANT_TEXT = {
8
+ partial_order: "Deel van de order",
9
+ full_cart: "Volle kar",
10
+ };
11
+ /** Onbekende varianten tonen we niet (geen ruwe waarde op het scherm). */
12
+ export function slipVariantText(v) {
13
+ return v ? VARIANT_TEXT[v] ?? null : null;
14
+ }
15
+ /** "2 fust (48 st)" als het fust bekend is, anders "48 st". */
16
+ export function quantityText(qty, crates) {
17
+ const st = `${qty ?? 0} st`;
18
+ return crates != null && crates > 0 ? `${crates} fust (${st})` : st;
19
+ }
20
+ const ENGINE_CODE_TEXT = {
21
+ GEEN_LAYOUT: "Er is geen verzendbrief ingesteld voor deze order. Meld dit bij kantoor.",
22
+ GEEN_PRINTER: "Er is geen printer voor dit document. Meld dit bij kantoor.",
23
+ GEEN_PRINTPLEK: "Deze werkplek heeft geen printplek. Meld dit bij kantoor.",
24
+ PRINTER_OFFLINE: "De printer is niet bereikbaar. Controleer of hij aan staat en probeer het opnieuw.",
25
+ };
26
+ /** Haalt een technische code uit een melding; tekst voor de vloer + detail voor beheer. */
27
+ export function friendlyEngineMessage(raw, fallback) {
28
+ if (!raw)
29
+ return { message: fallback, detail: null };
30
+ const m = /^\s*([A-Za-z][A-Za-z0-9_]{2,})\s*:/.exec(raw);
31
+ if (m && /[_A-Z]/.test(m[1]) && m[1] === m[1].toUpperCase()) {
32
+ return { message: ENGINE_CODE_TEXT[m[1]] ?? fallback, detail: raw };
33
+ }
34
+ if (/^[a-z]+(_[a-z]+)+$/.test(raw.trim()))
35
+ return { message: fallback, detail: raw };
36
+ return { message: raw, detail: null };
37
+ }
38
+ const ROUTE_TEXT = {
39
+ passend: "passend etiket",
40
+ passend_etiket: "passend etiket",
41
+ groter: "groter etiket",
42
+ groter_etiket: "groter etiket",
43
+ a4: "A4-vel",
44
+ a4_vel: "A4-vel",
45
+ };
46
+ export function printRouteText(v) {
47
+ return v ? ROUTE_TEXT[v.toLowerCase()] ?? null : null;
48
+ }
49
+ /** Telt per (uitwijkroute, printer) de stickers die naar de printer zijn gegaan. */
50
+ export function stickerPlaces(s, uitwijk) {
51
+ const map = new Map();
52
+ for (const r of s.regels) {
53
+ if (r.status !== "in_printwachtrij" && r.status !== "afgemeld" && r.status !== "geprint")
54
+ continue;
55
+ const u = r.printJobId ? uitwijk?.get(r.printJobId) : undefined;
56
+ const route = (u ? uitwijkRouteText(u.route) : null) ?? printRouteText(r.route);
57
+ const printer = u?.printerNaam ?? r.printerNaam ?? null;
58
+ const reden = u?.reden ?? null;
59
+ const printed = r.status === "geprint";
60
+ const k = `${route}|${printer}|${printed}|${reden}`;
61
+ const cur = map.get(k) ?? { route, printer, count: 0, printed, reden };
62
+ cur.count += r.kopieen ?? 1;
63
+ map.set(k, cur);
64
+ }
65
+ return [...map.values()];
66
+ }
67
+ function str(v) {
68
+ return typeof v === "string" && v.trim() ? v.trim() : null;
69
+ }
70
+ /** "6 stickers naar de printer gestuurd op A4-vel (Kantoorprinter)" of "Geen stickers nodig: <reden>". */
71
+ export function stickerLine(s, uitwijk) {
72
+ if (!s)
73
+ return "Stickerstand onbekend";
74
+ const places = stickerPlaces(s, uitwijk);
75
+ const geenReden = s.geenStickersReden ?? null;
76
+ if (s.totaal === 0)
77
+ return geenReden ? `Geen stickers nodig: ${geenReden}` : "Geen stickers nodig voor deze kar";
78
+ if (places.length === 0)
79
+ return `${s.totaal} stickers nodig, nog niet naar de printer gestuurd`;
80
+ return places
81
+ .map((p) => {
82
+ const waar = [p.route ? `op ${p.route}` : null, p.printer ? `(${p.printer})` : null].filter(Boolean).join(" ");
83
+ return `${p.count} ${p.count === 1 ? "sticker" : "stickers"} ${p.printed ? "geprint" : "naar de printer gestuurd"}${waar ? ` ${waar}` : ""}${p.reden ? ` – ${p.reden}` : ""}`;
84
+ })
85
+ .join(" · ");
86
+ }
@@ -0,0 +1,11 @@
1
+ export interface PickCallTiming {
2
+ name: string;
3
+ ms: number;
4
+ }
5
+ /** Meet de duur van één aanroep en bewaart hem (laatste 200). */
6
+ export declare function pickMeasure<T>(name: string, fn: () => PromiseLike<T> | T): Promise<T>;
7
+ export declare function pickMark(name: string): void;
8
+ /** Tijd van het openen van het scherm tot de lijst klaar is (ms), of null. */
9
+ export declare function pickMeasureReady(): number | null;
10
+ export declare function pickCallTimings(): PickCallTiming[];
11
+ //# sourceMappingURL=pickPerf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickPerf.d.ts","sourceRoot":"","sources":["../../src/lib/pickPerf.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,iEAAiE;AACjE,wBAAsB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAS3F;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,QAEpC;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAElD"}
@@ -0,0 +1,35 @@
1
+ // Laadtijdmeting met performance-marks. Alleen meten, niets veranderen.
2
+ const hasPerf = () => typeof performance !== "undefined" && typeof performance.mark === "function";
3
+ const calls = [];
4
+ /** Meet de duur van één aanroep en bewaart hem (laatste 200). */
5
+ export async function pickMeasure(name, fn) {
6
+ const start = hasPerf() ? performance.now() : Date.now();
7
+ try {
8
+ return await fn();
9
+ }
10
+ finally {
11
+ const ms = (hasPerf() ? performance.now() : Date.now()) - start;
12
+ calls.push({ name, ms: Math.round(ms) });
13
+ if (calls.length > 200)
14
+ calls.shift();
15
+ }
16
+ }
17
+ export function pickMark(name) {
18
+ if (hasPerf())
19
+ performance.mark(`pick:${name}`);
20
+ }
21
+ /** Tijd van het openen van het scherm tot de lijst klaar is (ms), of null. */
22
+ export function pickMeasureReady() {
23
+ if (!hasPerf())
24
+ return null;
25
+ try {
26
+ const m = performance.measure("pick:lijst-klaar", "pick:start", "pick:lijst-klaar");
27
+ return Math.round(m.duration);
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export function pickCallTimings() {
34
+ return calls.slice();
35
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,qFAAqF;IACrF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,2BAA2B,uGAC8D,CAAC;AAEvG,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;CAMnF;AAcD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C7B"}
1
+ {"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,qFAAqF;IACrF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,2BAA2B,uGAC8D,CAAC;AAEvG,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;CAMnF;AAcD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C7B"}
@@ -3,6 +3,7 @@
3
3
  // Deze module print hier nooit mee; de RPC raakt print_jobs niet aan.
4
4
  import { supabase } from "../integrations/supabase/client.js";
5
5
  import { activeDeviceKey, keyedCall } from "./pick159.js";
6
+ import { friendlyEngineMessage } from "./pick161.js";
6
7
  export const PREVIEW_UNAVAILABLE_MESSAGE = "Voorbeeld niet beschikbaar.";
7
8
  export const PREVIEW_LAYOUT_ONLY_MESSAGE = "Voorbeeld niet beschikbaar. Het document wordt bij het printen opgemaakt met de ingestelde layout.";
8
9
  export class PickPreviewError extends Error {
@@ -39,7 +40,7 @@ export async function fetchPickPreview(args) {
39
40
  }
40
41
  const foutmelding = tekst(doc["foutmelding"]);
41
42
  if (foutmelding)
42
- throw new PickPreviewError(foutmelding, "document_fout");
43
+ throw new PickPreviewError(friendlyEngineMessage(foutmelding, PREVIEW_UNAVAILABLE_MESSAGE).message, "document_fout");
43
44
  const bron = tekst(doc["herkomst"]);
44
45
  const layoutId = tekst(doc["layout_id"]);
45
46
  const pdfBase64 = tekst(doc["pdf_base64"]);
@@ -0,0 +1,36 @@
1
+ export type PrintStatusCode = "voltooid" | "wachtend" | "bezig" | "mislukt" | "geen" | "onbekend";
2
+ export interface RowPrintStatus {
3
+ queueItemId: string;
4
+ code: PrintStatusCode;
5
+ fase: string | null;
6
+ melding: string | null;
7
+ }
8
+ export interface PrintStatusResult {
9
+ beschikbaar: boolean;
10
+ reden: string | null;
11
+ byId: Map<string, RowPrintStatus>;
12
+ }
13
+ /** Leest het antwoord van pickstation_print_status of logistics_print_status. */
14
+ export declare function parsePrintStatus(raw: unknown): PrintStatusResult;
15
+ /** Een open opdracht (wachtend of bezig): de regel is "in print". */
16
+ export declare function isInPrint(s: RowPrintStatus | undefined | null): boolean;
17
+ export interface PrintStatusLabel {
18
+ label: string;
19
+ tone: "done" | "waiting" | "failed" | "todo" | "unknown" | "loading";
20
+ reason: string | null;
21
+ /** Alleen bij mislukt: knop "Opnieuw printen" tonen. */
22
+ retry: boolean;
23
+ }
24
+ /**
25
+ * Tekst voor de statuskolom. `loading` = de status is nog onderweg ("…").
26
+ * Niet beschikbaar of onbekend: "Status onbekend" met reden, nooit een stille standaard.
27
+ */
28
+ export declare function printStatusLabel(args: {
29
+ status: RowPrintStatus | undefined;
30
+ loading: boolean;
31
+ beschikbaar: boolean;
32
+ reden: string | null;
33
+ }): PrintStatusLabel;
34
+ /** Ids van regels met een open opdracht. */
35
+ export declare function inPrintIds(result: PrintStatusResult | undefined | null): Set<string>;
36
+ //# sourceMappingURL=pickPrintStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickPrintStatus.d.ts","sourceRoot":"","sources":["../../src/lib/pickPrintStatus.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAElG,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACnC;AAiBD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CA4BhE;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAEvE;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,gBAAgB,CAmBnB;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAKpF"}
@@ -0,0 +1,98 @@
1
+ // Pickschermen 1.0.63: printstatus per wachtrijregel uit de Engine
2
+ // (logistics_print_status, via pickstation_print_status op het openbare
3
+ // scherm). Eén bron voor de statustekst; printed_at/print_count worden
4
+ // hiervoor niet gelezen.
5
+ function text(v) {
6
+ return typeof v === "string" && v.trim() ? v.trim() : null;
7
+ }
8
+ function codeOf(raw) {
9
+ const s = text(raw)?.toLowerCase() ?? null;
10
+ if (s === null)
11
+ return "onbekend";
12
+ if (s === "voltooid")
13
+ return "voltooid";
14
+ if (s === "wachtend")
15
+ return "wachtend";
16
+ if (s === "bezig")
17
+ return "bezig";
18
+ if (s === "mislukt" || s === "geannuleerd")
19
+ return "mislukt";
20
+ if (s === "geen" || s === "geen_opdracht" || s === "none")
21
+ return "geen";
22
+ return "onbekend";
23
+ }
24
+ /** Leest het antwoord van pickstation_print_status of logistics_print_status. */
25
+ export function parsePrintStatus(raw) {
26
+ const byId = new Map();
27
+ let rows = [];
28
+ let beschikbaar = true;
29
+ let reden = null;
30
+ if (Array.isArray(raw))
31
+ rows = raw;
32
+ else if (raw && typeof raw === "object") {
33
+ const r = raw;
34
+ if (r["beschikbaar"] === false)
35
+ beschikbaar = false;
36
+ reden = text(r["reden"]);
37
+ const list = r["items"] ?? r["regels"];
38
+ rows = Array.isArray(list) ? list : [];
39
+ }
40
+ else {
41
+ return { beschikbaar: false, reden: "Printstatus kon niet worden gelezen.", byId };
42
+ }
43
+ for (const row of rows) {
44
+ if (!row || typeof row !== "object")
45
+ continue;
46
+ const r = row;
47
+ const id = text(r["queue_item_id"] ?? r["queueItemId"]);
48
+ if (!id)
49
+ continue;
50
+ // Geen opdracht: de Engine levert status null zonder melding, of "geen".
51
+ const rawStatus = r["status"];
52
+ const melding = text(r["melding"]);
53
+ const code = rawStatus === null || rawStatus === undefined ? (melding ? "onbekend" : "geen") : codeOf(rawStatus);
54
+ byId.set(id, { queueItemId: id, code, fase: text(r["fase"]), melding });
55
+ }
56
+ return { beschikbaar, reden, byId };
57
+ }
58
+ /** Een open opdracht (wachtend of bezig): de regel is "in print". */
59
+ export function isInPrint(s) {
60
+ return !!s && (s.code === "wachtend" || s.code === "bezig");
61
+ }
62
+ /**
63
+ * Tekst voor de statuskolom. `loading` = de status is nog onderweg ("…").
64
+ * Niet beschikbaar of onbekend: "Status onbekend" met reden, nooit een stille standaard.
65
+ */
66
+ export function printStatusLabel(args) {
67
+ const { status, loading, beschikbaar, reden } = args;
68
+ if (loading)
69
+ return { label: "…", tone: "loading", reason: null, retry: false };
70
+ if (!beschikbaar)
71
+ return { label: "Status onbekend", tone: "unknown", reason: reden ?? "Printstatus niet beschikbaar.", retry: false };
72
+ if (!status)
73
+ return { label: "Status onbekend", tone: "unknown", reason: "Geen printstatus ontvangen voor deze regel.", retry: false };
74
+ switch (status.code) {
75
+ case "voltooid":
76
+ return { label: "Geprint", tone: "done", reason: null, retry: false };
77
+ case "wachtend":
78
+ return { label: "Wacht op printer", tone: "waiting", reason: null, retry: false };
79
+ case "bezig":
80
+ return { label: status.fase ? `Wordt geprint (${status.fase})` : "Wordt geprint", tone: "waiting", reason: null, retry: false };
81
+ case "mislukt":
82
+ return { label: "Niet geprint", tone: "failed", reason: status.melding ?? "De printer meldde een fout.", retry: true };
83
+ case "geen":
84
+ return { label: "Nog niet geprint", tone: "todo", reason: null, retry: false };
85
+ default:
86
+ return { label: "Status onbekend", tone: "unknown", reason: status.melding, retry: false };
87
+ }
88
+ }
89
+ /** Ids van regels met een open opdracht. */
90
+ export function inPrintIds(result) {
91
+ const out = new Set();
92
+ if (!result)
93
+ return out;
94
+ for (const [id, s] of result.byId)
95
+ if (isInPrint(s))
96
+ out.add(id);
97
+ return out;
98
+ }
@@ -7,7 +7,8 @@ export declare function isRowGoneError(e: unknown): boolean;
7
7
  /** Fout van "Volgende printen" als de wachtrij volgens de database leeg is. */
8
8
  export declare function isNoDocumentError(e: unknown): boolean;
9
9
  /** De bovenste zichtbare rij die nog geprint moet worden (volgorde van de lijst). */
10
- export declare function firstVisibleTarget(items: PickQueueItem[], lockedIds?: Set<string>): PickQueueItem | null;
10
+ /** `inPrintIds`: regels met een open printopdracht (wachtend/bezig) worden overgeslagen. */
11
+ export declare function firstVisibleTarget(items: PickQueueItem[], lockedIds?: Set<string>, inPrintIds?: Set<string>): PickQueueItem | null;
11
12
  /** Kenmerk "kar xxxxxx" als meer rijen dezelfde documentnaam hebben. */
12
13
  export declare function duplicateNameTag(items: PickQueueItem[], item: PickQueueItem): string | null;
13
14
  export declare function isJobFinished(job: PickPrintJob | null | undefined): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"pickRowState.d.ts","sourceRoot":"","sources":["../../src/lib/pickRowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,gBAAgB,wFAAwF,CAAC;AACtH,eAAO,MAAM,uBAAuB,8GACyE,CAAC;AAC9G,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQlD;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAYxG;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAQ3F;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"pickRowState.d.ts","sourceRoot":"","sources":["../../src/lib/pickRowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,gBAAgB,wFAAwF,CAAC;AACtH,eAAO,MAAM,uBAAuB,8GACyE,CAAC;AAC9G,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQlD;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,qFAAqF;AACrF,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAalI;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAQ3F;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}