@flowselections/pick-schermen-kwekers 1.0.62 → 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 (32) hide show
  1. package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
  2. package/dist-lib/components/pick/PickScherm.js +18 -7
  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/hooks/usePickPrintStatus.d.ts +14 -0
  7. package/dist-lib/hooks/usePickPrintStatus.d.ts.map +1 -0
  8. package/dist-lib/hooks/usePickPrintStatus.js +47 -0
  9. package/dist-lib/hooks/usePickQueue.d.ts +2 -0
  10. package/dist-lib/hooks/usePickQueue.d.ts.map +1 -1
  11. package/dist-lib/hooks/usePickQueue.js +29 -8
  12. package/dist-lib/integrations/supabase/types.d.ts +504 -2
  13. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  14. package/dist-lib/integrations/supabase/types.js +1 -0
  15. package/dist-lib/lib/__tests__/pick143.test.js +1 -1
  16. package/dist-lib/lib/__tests__/pick163.test.d.ts +2 -0
  17. package/dist-lib/lib/__tests__/pick163.test.d.ts.map +1 -0
  18. package/dist-lib/lib/__tests__/pick163.test.js +68 -0
  19. package/dist-lib/lib/pick143.d.ts +7 -2
  20. package/dist-lib/lib/pick143.d.ts.map +1 -1
  21. package/dist-lib/lib/pick143.js +24 -5
  22. package/dist-lib/lib/pick159.js +1 -1
  23. package/dist-lib/lib/pickPerf.d.ts +11 -0
  24. package/dist-lib/lib/pickPerf.d.ts.map +1 -0
  25. package/dist-lib/lib/pickPerf.js +35 -0
  26. package/dist-lib/lib/pickPrintStatus.d.ts +36 -0
  27. package/dist-lib/lib/pickPrintStatus.d.ts.map +1 -0
  28. package/dist-lib/lib/pickPrintStatus.js +98 -0
  29. package/dist-lib/lib/pickRowState.d.ts +2 -1
  30. package/dist-lib/lib/pickRowState.d.ts.map +1 -1
  31. package/dist-lib/lib/pickRowState.js +4 -2
  32. 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=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
+ });
@@ -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,7 +95,7 @@ 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
100
  "pick_read_unscanned_earlier", "pick_resolve_scan_code", "pick_read_print_job_uitwijk", "pick_read_vroege_sticker_waarschuwing",
101
101
  ]);
@@ -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
+ }
@@ -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"}
@@ -15,13 +15,15 @@ export function isNoDocumentError(e) {
15
15
  return msg.includes("geen documenten beschikbaar") || msg.includes("geen document beschikbaar");
16
16
  }
17
17
  /** De bovenste zichtbare rij die nog geprint moet worden (volgorde van de lijst). */
18
- export function firstVisibleTarget(items, lockedIds) {
18
+ /** `inPrintIds`: regels met een open printopdracht (wachtend/bezig) worden overgeslagen. */
19
+ export function firstVisibleTarget(items, lockedIds, inPrintIds) {
19
20
  const list = Array.isArray(items) ? items : [];
20
21
  return (list.find((item) => !item.printed_at
21
22
  && !item.cancelled_at
22
23
  && !item.completed_at
23
24
  && !(item.payload && item.payload["printbaar"] === false)
24
- && !lockedIds?.has(item.id)) ?? null);
25
+ && !lockedIds?.has(item.id)
26
+ && !inPrintIds?.has(item.id)) ?? null);
25
27
  }
26
28
  /** Kenmerk "kar xxxxxx" als meer rijen dezelfde documentnaam hebben. */
27
29
  export function duplicateNameTag(items, item) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/pick-schermen-kwekers",
3
- "version": "1.0.62",
3
+ "version": "1.0.64",
4
4
  "flowselections": {
5
5
  "moduleId": "pick-schermen",
6
6
  "pages": [