@flowselections/pick-schermen-kwekers 1.0.41 → 1.0.44

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 (41) hide show
  1. package/dist-lib/components/PickstationsPage.js +1 -1
  2. package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
  3. package/dist-lib/components/pick/PickScherm.js +174 -36
  4. package/dist-lib/components/pick/QueueTable.d.ts +6 -1
  5. package/dist-lib/components/pick/QueueTable.d.ts.map +1 -1
  6. package/dist-lib/components/pick/QueueTable.js +44 -11
  7. package/dist-lib/components/pick/ReferentiedataBanner.js +1 -1
  8. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  10. package/dist-lib/integrations/supabase/types.d.ts +368 -0
  11. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  12. package/dist-lib/lib/__tests__/pick142.test.d.ts +2 -0
  13. package/dist-lib/lib/__tests__/pick142.test.d.ts.map +1 -0
  14. package/dist-lib/lib/__tests__/pick142.test.js +80 -0
  15. package/dist-lib/lib/__tests__/pick143.test.d.ts +2 -0
  16. package/dist-lib/lib/__tests__/pick143.test.d.ts.map +1 -0
  17. package/dist-lib/lib/__tests__/pick143.test.js +61 -0
  18. package/dist-lib/lib/pick142.d.ts +58 -0
  19. package/dist-lib/lib/pick142.d.ts.map +1 -0
  20. package/dist-lib/lib/pick142.js +235 -0
  21. package/dist-lib/lib/pick143.d.ts +31 -0
  22. package/dist-lib/lib/pick143.d.ts.map +1 -0
  23. package/dist-lib/lib/pick143.js +93 -0
  24. package/dist-lib/lib/pickApi.d.ts +13 -0
  25. package/dist-lib/lib/pickApi.d.ts.map +1 -1
  26. package/dist-lib/lib/pickApi.js +28 -5
  27. package/dist-lib/lib/pickCartResults.d.ts +1 -1
  28. package/dist-lib/lib/pickCartResults.d.ts.map +1 -1
  29. package/dist-lib/lib/pickCartResults.js +2 -2
  30. package/dist-lib/lib/pickI18n.js +6 -6
  31. package/dist-lib/lib/pickPrintJobText.js +2 -2
  32. package/dist-lib/lib/pickRowState.d.ts +1 -1
  33. package/dist-lib/lib/pickRowState.d.ts.map +1 -1
  34. package/dist-lib/lib/pickRowState.js +6 -2
  35. package/dist-lib/lib/pickTypes.d.ts +29 -1
  36. package/dist-lib/lib/pickTypes.d.ts.map +1 -1
  37. package/dist-lib/lib/pickTypes.js +42 -8
  38. package/dist-lib/lib/pickUiText.d.ts.map +1 -1
  39. package/dist-lib/lib/pickUiText.js +10 -0
  40. package/dist-lib/lib/shippingNoteStatus.js +2 -2
  41. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pick142.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick142.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick142.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ vi.mock("../pickApi", () => ({ pickDb: { rpc: vi.fn() } }));
3
+ import { CART_PLAN_MISMATCH_MESSAGE, autoSendMessage, cartPlanMismatchesOf, cartWaitMessage, formatSiteTime, mismatchReason, nextWorkday, orderNumbersLabel, parseAutoSend, printErrorText, printStageLabel, } from "../pick142";
4
+ import { parsePickCartPlan } from "../pickTypes";
5
+ const cart = (id, seq, total, extra = {}) => ({
6
+ cartId: id, cartSeq: seq, cartTotal: total, barcode: "LC" + id, items: [], ...extra,
7
+ });
8
+ describe("1.0.42 karindeling", () => {
9
+ it("tegenstrijdige nummers worden gemeld, niet hersteld", () => {
10
+ const raw = { orderId: "o", cartTotal: 2, rowCartId: "k2", carts: [cart("k2", 2, 1)] };
11
+ expect(parsePickCartPlan(raw)).toBeNull();
12
+ const m = cartPlanMismatchesOf(raw);
13
+ expect(m).toEqual([{ cartId: "k2", cartTotal: 1, planTotal: 2 }]);
14
+ expect(mismatchReason(m)).toContain("cartTotal 1 ≠ plan 2");
15
+ expect(CART_PLAN_MISMATCH_MESSAGE).toContain("de karindeling klopt niet");
16
+ });
17
+ it("na de Engine-fix: Kar 2 van 2 wordt geaccepteerd (PB-…-K2)", () => {
18
+ const k1 = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "k1", carts: [cart("k1", 1, 2)] });
19
+ const k2 = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "k2", carts: [cart("k2", 2, 2)] });
20
+ expect(k1?.carts[0].cartIndex).toBe(1);
21
+ expect(k2?.carts[0].cartIndex).toBe(2);
22
+ expect(k2?.cartTotal).toBe(2);
23
+ expect(cartPlanMismatchesOf({ orderId: "o", cartTotal: 2, carts: [cart("k2", 2, 2)] })).toEqual([]);
24
+ });
25
+ it("wachtTot/wachtReden/printbaar staan in de root (1.0.152)", () => {
26
+ const p = parsePickCartPlan({ orderId: "o", cartTotal: 1, rowCartId: "k", printbaar: false, wachtTot: "2026-10-16T21:05:00Z", wachtReden: "aanvulling", carts: [cart("k", 1, 1)] });
27
+ expect(p?.printable).toBe(false);
28
+ expect(p?.waitUntil).toBe("2026-10-16T21:05:00Z");
29
+ expect(p?.waitReason).toBe("aanvulling");
30
+ const q = parsePickCartPlan({ orderId: "o", cartTotal: 1, rowCartId: "k", carts: [cart("k", 1, 1)] });
31
+ expect(q?.printable).toBe(true);
32
+ expect(q?.waitUntil).toBeNull();
33
+ expect(cartWaitMessage({ until: "2026-10-16T21:05:00Z", reason: null }, "Europe/Amsterdam")).toBe("Deelkar wacht tot 23:05 op mogelijke aanvulling");
34
+ });
35
+ });
36
+ describe("1.0.42 tijdzone", () => {
37
+ it("tijd in de zone van de vestiging; zonder zone 'tijd onbekend'", () => {
38
+ expect(formatSiteTime("2026-10-16T21:05:00Z", "Europe/Amsterdam")).toBe("23:05");
39
+ expect(formatSiteTime("2026-10-16T21:05:00Z", "Europe/London")).toBe("22:05");
40
+ expect(formatSiteTime("2026-10-16T21:05:00Z", null)).toBe("tijd onbekend");
41
+ });
42
+ });
43
+ describe("1.0.42 automatisch versturen", () => {
44
+ it("wachtend, verstuurd en onbekend", () => {
45
+ const wacht = parseAutoSend({ status: "wachtend", volgendePoging: "2026-10-15T21:05:00Z" }, false);
46
+ expect(autoSendMessage(wacht, "Europe/Amsterdam")).toBe("Gescand ✓ — wacht op versturen naar Floriday (nieuwe poging om 23:05)");
47
+ expect(autoSendMessage(parseAutoSend({ status: "verstuurd" }, false), "Europe/Amsterdam")).toBe("Verzendbrief wordt geprint");
48
+ expect(autoSendMessage(parseAutoSend({ status: "verstuurd", sentAt: "2026-10-16T07:10:00Z", sentHow: "automatisch" }, false), "Europe/Amsterdam")).toBe("Verstuurd om 09:10 · Verzendbrief wordt geprint");
49
+ expect(autoSendMessage(parseAutoSend({ status: "mislukt", nextAttemptAt: "2026-10-16T07:20:00Z" }, false), "Europe/Amsterdam")).toBe("Versturen naar Floriday nog niet gelukt (nieuwe poging om 09:20)");
50
+ expect(autoSendMessage(parseAutoSend({ status: "geen" }, false), "Europe/Amsterdam")).toBeNull();
51
+ expect(autoSendMessage(parseAutoSend({ toegang: false, reden: "x" }, true), "Europe/Amsterdam")).toBeNull();
52
+ expect(autoSendMessage(parseAutoSend(null, false), "Europe/Amsterdam")).toBeNull();
53
+ expect(parseAutoSend({ toegang: true, status: { status: "verstuurd" } }, true)?.status).toBe("verstuurd");
54
+ });
55
+ });
56
+ describe("1.0.42 ordernummers en werkdagen", () => {
57
+ it("bufferrij toont beide orders", () => {
58
+ const item = { order_number: null, payload: { bufferOrders: ["FO-2601428", "FO-2601429"] } };
59
+ expect(orderNumbersLabel(item)).toBe("FO-2601428 + FO-2601429");
60
+ const single = { order_number: "FO-1", payload: {} };
61
+ expect(orderNumbersLabel(single)).toBe("FO-1");
62
+ });
63
+ it("slaat za/zo over; leesfout = null", async () => {
64
+ const wd = async (iso) => ![6, 0].includes(new Date(`${iso}T00:00:00Z`).getUTCDay());
65
+ expect(await nextWorkday("2026-10-16", 1, wd)).toBe("2026-10-19");
66
+ expect(await nextWorkday("2026-10-19", -1, wd)).toBe("2026-10-16");
67
+ expect(await nextWorkday("2026-10-16", 1, async () => null)).toBeNull();
68
+ });
69
+ });
70
+ describe("1.0.42 printfouten en printstatus", () => {
71
+ it("codes worden vertaald", () => {
72
+ expect(printErrorText("GEEN_PRINTER: printplek x")?.message).toBe("Printen mislukt: er is geen printer voor dit document. Meld het bij kantoor.");
73
+ expect(printErrorText("gewone tekst")).toBeNull();
74
+ });
75
+ it("drie standen", () => {
76
+ expect(printStageLabel({ status: "voltooid", printnode_status: null })).toBe("Naar printer gestuurd");
77
+ expect(printStageLabel({ status: "voltooid", printnode_status: "done" })).toBe("Bij printer aangekomen");
78
+ expect(printStageLabel({ status: "mislukt" })).toBe("Niet geprint");
79
+ });
80
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pick143.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick143.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick143.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ vi.mock("../pickApi", () => ({ pickDb: { rpc: vi.fn() } }));
3
+ import { CLOSED_ROW_MESSAGE, isRowPrintable, pickDayShortLabel, pickModeValue, pickRefusalText, printBlockMessage, rowWaitMessage, rowWaitOf, } from "../pick143";
4
+ import { firstVisibleTarget } from "../pickRowState";
5
+ import { parsePickCartPlan, pickReadiness } from "../pickTypes";
6
+ const TZ = "Europe/Amsterdam";
7
+ const row = (id, payload, extra = {}) => ({ id, document_number: `PB-FO-1-${id}`, printed_at: null, cancelled_at: null, completed_at: null, payload, ...extra });
8
+ describe("1.0.43 buffer met 2 karren, kar 2 wacht", () => {
9
+ const k1 = row("K1", { cartRowFor: "k1", cartId: "k1", cartSeq: 1, cartTotal: 2, cartPlanReady: true, cartPlanReleased: true, barcode: "LC1" });
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
+ it("kar 2 is zichtbaar maar niet printbaar en wordt door Volgende printen overgeslagen", () => {
12
+ expect(isRowPrintable(k2)).toBe(false);
13
+ expect(rowWaitMessage(rowWaitOf(k2.payload), TZ)).toBe("Deelkar wacht tot 22:40 op mogelijke aanvulling");
14
+ expect(firstVisibleTarget([k2, k1])?.id).toBe("K1");
15
+ expect(firstVisibleTarget([k2])).toBeNull();
16
+ expect(printBlockMessage(k2, TZ)).toBe("Deze kar wacht nog tot 22:40 op mogelijke aanvulling en kan nog niet geprint worden.");
17
+ });
18
+ it("niet printklaar volgens readiness (batch- en alles-printen gebruiken dit)", () => {
19
+ const plan = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "k2", printbaar: false, carts: [{ cartId: "k2", cartSeq: 2, cartTotal: 2, barcode: "LC2", items: [] }] });
20
+ const r = pickReadiness(plan, { ready: true, released: true, reason: null }, k2);
21
+ expect(r.ready).toBe(false);
22
+ expect(r.missing).toContain("wait");
23
+ });
24
+ it("na de wachttijd: printbaar als Kar 2 van 2", () => {
25
+ const later = row("K2", { ...k2.payload, printbaar: true, wachtTot: null });
26
+ const plan = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "k2", printbaar: true, carts: [{ cartId: "k2", cartSeq: 2, cartTotal: 2, barcode: "LC2", items: [] }] });
27
+ expect(isRowPrintable(later)).toBe(true);
28
+ expect(plan?.carts[0].cartIndex).toBe(2);
29
+ expect(pickReadiness(plan, { ready: true, released: true, reason: null }, later).ready).toBe(true);
30
+ });
31
+ });
32
+ describe("1.0.43 afgesloten regels en foutcodes", () => {
33
+ it("afgesloten regel wordt niet geclaimd", () => {
34
+ const done = row("D", {}, { completed_at: "2026-10-16T06:00:00Z" });
35
+ expect(isRowPrintable(done)).toBe(false);
36
+ expect(firstVisibleTarget([done])).toBeNull();
37
+ expect(printBlockMessage(done, TZ)).toBe(CLOSED_ROW_MESSAGE);
38
+ });
39
+ it("vaste codes worden gewone zinnen", () => {
40
+ expect(pickRefusalText("PICK_REGEL_AFGESLOTEN: regel x is afgesloten", TZ)).toBe("Deze kar is al gescand en afgemeld.");
41
+ expect(pickRefusalText("PICK_DEELKAR_WACHT: 2026-10-16T20:40:00Z", TZ)).toBe("Deze kar wacht nog tot 22:40 op mogelijke aanvulling en kan nog niet geprint worden.");
42
+ expect(pickRefusalText("PICK_DEELKAR_WACHT: -", TZ)).toContain("wacht nog op mogelijke aanvulling");
43
+ expect(pickRefusalText("iets anders", TZ)).toBeNull();
44
+ });
45
+ });
46
+ describe("1.0.43 overig", () => {
47
+ it("pickMode als object of tekst", () => {
48
+ expect(pickModeValue({ pickMode: "smallest", cartsPerPrint: 2 })).toBe("smallest");
49
+ expect(pickModeValue("full")).toBe("full");
50
+ expect(pickModeValue(null)).toBeNull();
51
+ });
52
+ it("pickdag kort", () => {
53
+ expect(pickDayShortLabel("2026-10-19")).toBe("ma 19 okt");
54
+ });
55
+ it("meldingen alleen uit het karplan van kar 1", () => {
56
+ const k1 = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "a", warnings: ["Tekort"], carts: [{ cartId: "a", cartSeq: 1, cartTotal: 2, items: [] }] });
57
+ const k2 = parsePickCartPlan({ orderId: "o", cartTotal: 2, rowCartId: "b", carts: [{ cartId: "b", cartSeq: 2, cartTotal: 2, items: [] }] });
58
+ expect(k1?.warnings).toEqual(["Tekort"]);
59
+ expect(k2?.warnings).toEqual([]);
60
+ });
61
+ });
@@ -0,0 +1,58 @@
1
+ import type { PickQueueItem } from "./pickTypes";
2
+ export declare const CART_PLAN_MISMATCH_MESSAGE = "Deze kar kan nu niet geprint worden: de karindeling klopt niet. Meld dit bij kantoor.";
3
+ export { cartPlanMismatchesOf, type CartPlanMismatch } from "./pickTypes";
4
+ import type { CartPlanMismatch } from "./pickTypes";
5
+ /** Reden voor de bewaking; technisch, alleen voor beheer. */
6
+ export declare function mismatchReason(m: CartPlanMismatch[]): string;
7
+ export interface CartWait {
8
+ until: string;
9
+ reason: string | null;
10
+ }
11
+ /** Alleen als de Engine wachtTot meestuurt; anders null (niets tonen). */
12
+ export declare function cartWaitOf(rawCart: unknown): CartWait | null;
13
+ /** Tijdzone uit de werktijden van de Engine. Ontbreekt die: null (fail closed). */
14
+ export declare function siteTimeZone(): Promise<string | null>;
15
+ export declare const TIME_UNKNOWN = "tijd onbekend";
16
+ /** HH:MM in de tijdzone van de vestiging; zonder zone nooit de browsertijd. */
17
+ export declare function formatSiteTime(iso: string | null | undefined, timeZone: string | null): string;
18
+ /** Kalenderdag (YYYY-MM-DD) in de tijdzone van de vestiging. */
19
+ export declare function siteToday(timeZone: string | null): string | null;
20
+ export declare function cartWaitMessage(wait: CartWait, timeZone: string | null): string;
21
+ export interface AutoSendState {
22
+ status: string | null;
23
+ nextAttemptAt: string | null;
24
+ sentAt: string | null;
25
+ detail: string | null;
26
+ }
27
+ /** Leest het Engine-antwoord; onbekende vorm of geen toegang: null. */
28
+ export declare function parseAutoSend(value: unknown, withEnvelope: boolean): AutoSendState | null;
29
+ export declare function fetchAutoSend(orderId: string, slug: string | null): Promise<AutoSendState | null>;
30
+ /** Tekst voor de picker; null = terugvallen op de bestaande melding. */
31
+ export declare function autoSendMessage(state: AutoSendState | null, timeZone: string | null): string | null;
32
+ export declare function orderNumbersLabel(item: PickQueueItem): string;
33
+ export declare function addDaysIso(iso: string, delta: number): string;
34
+ /**
35
+ * Eerstvolgende werkdag in de richting van delta. Geeft null als de werkdagen
36
+ * niet te lezen zijn of er binnen maxSteps geen werkdag is (fail closed).
37
+ */
38
+ export declare function nextWorkday(base: string, delta: 1 | -1, isWorkday: (iso: string) => Promise<boolean | null>, maxSteps?: number): Promise<string | null>;
39
+ export declare function isPickWorkday(iso: string): Promise<boolean | null>;
40
+ export declare const WORKDAYS_UNKNOWN = "Werkdagen konden niet worden gelezen";
41
+ /** Vertaalt "CODE: tekst" naar een leesbare melding; de ruwe tekst blijft detail. */
42
+ export declare function printErrorText(raw: string | null | undefined): {
43
+ message: string;
44
+ detail: string | null;
45
+ } | null;
46
+ export declare const PRINT_SENT = "Naar printer gestuurd";
47
+ export declare const PRINT_ARRIVED = "Bij printer aangekomen";
48
+ export declare const PRINT_FAILED = "Niet geprint";
49
+ export declare const PRINT_FAILED_HINT = "Klik op \u2018Opnieuw printen\u2019 of meld het bij kantoor.";
50
+ export declare function printStage(job: {
51
+ status?: string | null;
52
+ printnode_status?: string | null;
53
+ } | null | undefined): "sent" | "arrived" | "failed";
54
+ export declare function printStageLabel(job: {
55
+ status?: string | null;
56
+ printnode_status?: string | null;
57
+ } | null | undefined): string;
58
+ //# sourceMappingURL=pick142.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick142.d.ts","sourceRoot":"","sources":["../../src/lib/pick142.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ // Pickschermen 1.0.42: karindelingscontrole, automatisch versturen, tijden in
2
+ // de tijdzone van de vestiging, werkdagen en leesbare printfouten. Alles komt
3
+ // uit de Engine; hier wordt niets herberekend.
4
+ import { pickDb } from "./pickApi";
5
+ function recordOf(value) {
6
+ return value && typeof value === "object" && !Array.isArray(value)
7
+ ? value
8
+ : null;
9
+ }
10
+ function textOf(value) {
11
+ return typeof value === "string" && value.trim() ? value : null;
12
+ }
13
+ function numberOf(value) {
14
+ if (value === null || value === undefined || value === "")
15
+ return null;
16
+ const n = Number(value);
17
+ return Number.isFinite(n) ? n : null;
18
+ }
19
+ /* ---------- P0: karindeling klopt niet ---------- */
20
+ export const CART_PLAN_MISMATCH_MESSAGE = "Deze kar kan nu niet geprint worden: de karindeling klopt niet. Meld dit bij kantoor.";
21
+ export { cartPlanMismatchesOf } from "./pickTypes";
22
+ /** Reden voor de bewaking; technisch, alleen voor beheer. */
23
+ export function mismatchReason(m) {
24
+ return m.map((x) => `kar ${x.cartId}: cartTotal ${x.cartTotal} ≠ plan ${x.planTotal}`).join("; ");
25
+ }
26
+ /** Alleen als de Engine wachtTot meestuurt; anders null (niets tonen). */
27
+ export function cartWaitOf(rawCart) {
28
+ const cart = recordOf(rawCart);
29
+ const until = textOf(cart?.["wachtTot"] ?? cart?.["wacht_tot"]);
30
+ if (!until || Number.isNaN(new Date(until).getTime()))
31
+ return null;
32
+ return { until, reason: textOf(cart?.["wachtReden"] ?? cart?.["wacht_reden"]) };
33
+ }
34
+ /* ---------- Tijdzone van de vestiging ---------- */
35
+ let zoneCache = null;
36
+ /** Tijdzone uit de werktijden van de Engine. Ontbreekt die: null (fail closed). */
37
+ export function siteTimeZone() {
38
+ if (!zoneCache) {
39
+ zoneCache = (async () => {
40
+ try {
41
+ const { data, error } = await pickDb.rpc("logistics_working_hours_status");
42
+ if (error)
43
+ throw error;
44
+ const tz = textOf(recordOf(data)?.["timezone"]);
45
+ if (!tz)
46
+ return null;
47
+ // Ongeldige zone: niet gebruiken.
48
+ new Intl.DateTimeFormat("nl-NL", { timeZone: tz });
49
+ return tz;
50
+ }
51
+ catch {
52
+ zoneCache = null;
53
+ return null;
54
+ }
55
+ })();
56
+ }
57
+ return zoneCache;
58
+ }
59
+ export const TIME_UNKNOWN = "tijd onbekend";
60
+ /** HH:MM in de tijdzone van de vestiging; zonder zone nooit de browsertijd. */
61
+ export function formatSiteTime(iso, timeZone) {
62
+ if (!iso || !timeZone)
63
+ return TIME_UNKNOWN;
64
+ const d = new Date(iso);
65
+ if (Number.isNaN(d.getTime()))
66
+ return TIME_UNKNOWN;
67
+ try {
68
+ return d.toLocaleTimeString("nl-NL", { hour: "2-digit", minute: "2-digit", timeZone });
69
+ }
70
+ catch {
71
+ return TIME_UNKNOWN;
72
+ }
73
+ }
74
+ /** Kalenderdag (YYYY-MM-DD) in de tijdzone van de vestiging. */
75
+ export function siteToday(timeZone) {
76
+ if (!timeZone)
77
+ return null;
78
+ try {
79
+ return new Date().toLocaleDateString("sv-SE", { timeZone });
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ export function cartWaitMessage(wait, timeZone) {
86
+ return `Deelkar wacht tot ${formatSiteTime(wait.until, timeZone)} op mogelijke aanvulling`;
87
+ }
88
+ /** Leest het Engine-antwoord; onbekende vorm of geen toegang: null. */
89
+ export function parseAutoSend(value, withEnvelope) {
90
+ let row = recordOf(value);
91
+ if (withEnvelope) {
92
+ if (!row || row["toegang"] !== true)
93
+ return null;
94
+ row = recordOf(row["status"]) ?? row;
95
+ }
96
+ if (!row)
97
+ return null;
98
+ const status = textOf(row["status"]);
99
+ if (!status)
100
+ return null;
101
+ return {
102
+ status,
103
+ nextAttemptAt: textOf(row["nextAttemptAt"] ?? row["volgendePoging"] ?? row["next_attempt_at"]),
104
+ sentAt: textOf(row["sentAt"] ?? row["verstuurdOm"] ?? row["sent_at"]),
105
+ detail: [
106
+ textOf(row["tekst"] ?? row["reden"] ?? row["reason"]),
107
+ textOf(row["sentHow"]) ? `verstuurd: ${row["sentHow"]}` : null,
108
+ numberOf(row["attempts"] ?? row["poging"]) !== null
109
+ ? `poging ${numberOf(row["attempts"] ?? row["poging"])} van ${numberOf(row["maxAttempts"] ?? row["maxPogingen"]) ?? "?"}`
110
+ : null,
111
+ ].filter(Boolean).join(" · ") || null,
112
+ };
113
+ }
114
+ export async function fetchAutoSend(orderId, slug) {
115
+ try {
116
+ if (slug) {
117
+ const { data, error } = await pickDb.rpc("pickstation_auto_send_status", { p_slug: slug, p_order_id: orderId });
118
+ if (error)
119
+ return null;
120
+ return parseAutoSend(data, true);
121
+ }
122
+ const { data, error } = await pickDb.rpc("logistics_auto_send_status", { p_order_id: orderId });
123
+ if (error)
124
+ return null;
125
+ return parseAutoSend(data, false);
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ /** Tekst voor de picker; null = terugvallen op de bestaande melding. */
132
+ export function autoSendMessage(state, timeZone) {
133
+ if (!state)
134
+ return null;
135
+ const retry = state.nextAttemptAt ? ` (nieuwe poging om ${formatSiteTime(state.nextAttemptAt, timeZone)})` : "";
136
+ if (state.status === "verstuurd") {
137
+ return state.sentAt
138
+ ? `Verstuurd om ${formatSiteTime(state.sentAt, timeZone)} · Verzendbrief wordt geprint`
139
+ : "Verzendbrief wordt geprint";
140
+ }
141
+ if (state.status === "wachtend" || state.status === "bezig") {
142
+ return `Gescand ✓ — wacht op versturen naar Floriday${retry}`;
143
+ }
144
+ if (state.status === "mislukt") {
145
+ return state.nextAttemptAt
146
+ ? `Versturen naar Floriday nog niet gelukt${retry}`
147
+ : "Versturen naar Floriday mislukt. Meld het bij kantoor.";
148
+ }
149
+ return null;
150
+ }
151
+ /* ---------- Ordernummers bij een bufferrij ---------- */
152
+ export function orderNumbersLabel(item) {
153
+ const p = recordOf(item.payload) ?? {};
154
+ const raw = p["bufferOrders"] ?? p["buffer_orders"];
155
+ const refs = Array.isArray(raw)
156
+ ? raw.filter((v) => typeof v === "string" && !!v.trim())
157
+ : [];
158
+ const unique = Array.from(new Set(refs));
159
+ if (unique.length > 1)
160
+ return unique.join(" + ");
161
+ return item.order_number ?? unique[0] ?? "";
162
+ }
163
+ /* ---------- Werkdagen ---------- */
164
+ export function addDaysIso(iso, delta) {
165
+ const d = new Date(`${iso}T00:00:00Z`);
166
+ d.setUTCDate(d.getUTCDate() + delta);
167
+ return d.toISOString().slice(0, 10);
168
+ }
169
+ /**
170
+ * Eerstvolgende werkdag in de richting van delta. Geeft null als de werkdagen
171
+ * niet te lezen zijn of er binnen maxSteps geen werkdag is (fail closed).
172
+ */
173
+ export async function nextWorkday(base, delta, isWorkday, maxSteps = 14) {
174
+ let day = base;
175
+ for (let i = 0; i < maxSteps; i += 1) {
176
+ day = addDaysIso(day, delta);
177
+ const ok = await isWorkday(day);
178
+ if (ok === null)
179
+ return null;
180
+ if (ok)
181
+ return day;
182
+ }
183
+ return null;
184
+ }
185
+ export async function isPickWorkday(iso) {
186
+ try {
187
+ const { data, error } = await pickDb.rpc("logistics_is_pick_workday", { p_date: iso });
188
+ if (error || typeof data !== "boolean")
189
+ return null;
190
+ return data;
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ }
196
+ export const WORKDAYS_UNKNOWN = "Werkdagen konden niet worden gelezen";
197
+ /* ---------- Printfouten ---------- */
198
+ const PRINT_ERROR_TEXT = {
199
+ GEEN_PRINTER: "Printen mislukt: er is geen printer voor dit document. Meld het bij kantoor.",
200
+ PRINTER_OFFLINE: "Printen mislukt: de printer is niet bereikbaar. Controleer of de printer aan staat en klik op ‘Opnieuw printen’.",
201
+ GEEN_LAYOUT: "Printen mislukt: er is geen layout voor dit document. Meld het bij kantoor.",
202
+ GEEN_PRINTPLEK: "Printen mislukt: deze werkplek heeft geen printplek. Meld het bij kantoor.",
203
+ };
204
+ /** Vertaalt "CODE: tekst" naar een leesbare melding; de ruwe tekst blijft detail. */
205
+ export function printErrorText(raw) {
206
+ if (!raw)
207
+ return null;
208
+ const match = /^\s*([A-Z][A-Z0-9_]{2,})\s*[:\-]/.exec(raw);
209
+ if (!match)
210
+ return null;
211
+ const known = PRINT_ERROR_TEXT[match[1]];
212
+ return {
213
+ message: known ?? "Printen mislukt. Klik op ‘Opnieuw printen’ of meld het bij kantoor.",
214
+ detail: raw,
215
+ };
216
+ }
217
+ /* ---------- Printstatus in drie standen ---------- */
218
+ export const PRINT_SENT = "Naar printer gestuurd";
219
+ export const PRINT_ARRIVED = "Bij printer aangekomen";
220
+ export const PRINT_FAILED = "Niet geprint";
221
+ export const PRINT_FAILED_HINT = "Klik op ‘Opnieuw printen’ of meld het bij kantoor.";
222
+ const PRINTNODE_CONFIRMED = new Set(["done", "delivered", "completed", "printed"]);
223
+ export function printStage(job) {
224
+ const status = job?.status ?? null;
225
+ if (status === "mislukt" || status === "geannuleerd")
226
+ return "failed";
227
+ const pn = (job?.printnode_status ?? "").toLowerCase();
228
+ if (PRINTNODE_CONFIRMED.has(pn))
229
+ return "arrived";
230
+ return "sent";
231
+ }
232
+ export function printStageLabel(job) {
233
+ const stage = printStage(job);
234
+ return stage === "failed" ? PRINT_FAILED : stage === "arrived" ? PRINT_ARRIVED : PRINT_SENT;
235
+ }
@@ -0,0 +1,31 @@
1
+ import type { PickQueueItem } from "./pickTypes";
2
+ export interface RowWait {
3
+ /** false = de Engine laat deze kar (nog) niet printen. */
4
+ printable: boolean;
5
+ until: string | null;
6
+ reason: string | null;
7
+ }
8
+ /** Leest printbaar/wachtTot/wachtReden uit een payload of de karplanroot. */
9
+ export declare function rowWaitOf(source: unknown): RowWait;
10
+ /** Afgesloten regel (gescand/afgemeld of vervallen). */
11
+ export declare function isRowClosed(item: Pick<PickQueueItem, "cancelled_at"> & {
12
+ completed_at?: string | null;
13
+ }): boolean;
14
+ /** Mag deze regel geclaimd/geprint worden? Nooit bij printbaar = false of afgesloten. */
15
+ export declare function isRowPrintable(item: PickQueueItem): boolean;
16
+ export declare const WAIT_ROW_GENERIC = "Deelkar wacht op mogelijke aanvulling";
17
+ /** Grijze regeltekst voor een wachtende deelkar. */
18
+ export declare function rowWaitMessage(wait: RowWait, timeZone: string | null): string;
19
+ /** Melding als een printactie lokaal al geweigerd wordt; null = mag. */
20
+ export declare function printBlockMessage(item: PickQueueItem, timeZone: string | null): string | null;
21
+ export declare const CLOSED_ROW_MESSAGE = "Deze kar is al gescand en afgemeld.";
22
+ export declare function waitRefusalMessage(until: string | null, timeZone: string | null): string;
23
+ /** Door het scherm gezet zodra de tijdzone van de vestiging bekend is. */
24
+ export declare function setKnownSiteZone(tz: string | null): void;
25
+ /** PICK_DEELKAR_WACHT / PICK_REGEL_AFGESLOTEN → gewone zin; anders null. */
26
+ export declare function pickRefusalText(raw: string | null | undefined, timeZone?: string | null): string | null;
27
+ export declare function pickModeValue(raw: unknown): string | null;
28
+ /** "ma 19 okt" voor een pickdag (YYYY-MM-DD). */
29
+ export declare function pickDayShortLabel(iso: string | null | undefined): string;
30
+ export declare function pickDayOf(item: PickQueueItem): string | null;
31
+ //# sourceMappingURL=pick143.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,93 @@
1
+ // Pickschermen 1.0.43: wachtende deelkar (printbaar/wachtTot op regel- en
2
+ // karplanniveau), afgesloten regels, vaste foutcodes van de printfuncties en
3
+ // geprinte, nog niet gescande karren van eerdere pickdagen.
4
+ import { formatSiteTime } from "./pick142";
5
+ function recordOf(value) {
6
+ return value && typeof value === "object" && !Array.isArray(value)
7
+ ? value
8
+ : null;
9
+ }
10
+ function textOf(value) {
11
+ return typeof value === "string" && value.trim() ? value : null;
12
+ }
13
+ /** Leest printbaar/wachtTot/wachtReden uit een payload of de karplanroot. */
14
+ export function rowWaitOf(source) {
15
+ const r = recordOf(source) ?? {};
16
+ const raw = r["printbaar"];
17
+ const until = textOf(r["wachtTot"] ?? r["wacht_tot"]);
18
+ return {
19
+ printable: !(raw === false || raw === "false"),
20
+ until: until && !Number.isNaN(new Date(until).getTime()) ? until : null,
21
+ reason: textOf(r["wachtReden"] ?? r["wacht_reden"]),
22
+ };
23
+ }
24
+ /** Afgesloten regel (gescand/afgemeld of vervallen). */
25
+ export function isRowClosed(item) {
26
+ return !!item.cancelled_at || !!item.completed_at;
27
+ }
28
+ /** Mag deze regel geclaimd/geprint worden? Nooit bij printbaar = false of afgesloten. */
29
+ export function isRowPrintable(item) {
30
+ if (isRowClosed(item))
31
+ return false;
32
+ return rowWaitOf(item.payload).printable;
33
+ }
34
+ export const WAIT_ROW_GENERIC = "Deelkar wacht op mogelijke aanvulling";
35
+ /** Grijze regeltekst voor een wachtende deelkar. */
36
+ export function rowWaitMessage(wait, timeZone) {
37
+ return wait.until
38
+ ? `Deelkar wacht tot ${formatSiteTime(wait.until, timeZone)} op mogelijke aanvulling`
39
+ : WAIT_ROW_GENERIC;
40
+ }
41
+ /** Melding als een printactie lokaal al geweigerd wordt; null = mag. */
42
+ export function printBlockMessage(item, timeZone) {
43
+ if (item.completed_at)
44
+ return CLOSED_ROW_MESSAGE;
45
+ const wait = rowWaitOf(item.payload);
46
+ if (!wait.printable)
47
+ return waitRefusalMessage(wait.until, timeZone);
48
+ return null;
49
+ }
50
+ /* ---------- Vaste foutcodes van de databasefuncties ---------- */
51
+ export const CLOSED_ROW_MESSAGE = "Deze kar is al gescand en afgemeld.";
52
+ export function waitRefusalMessage(until, timeZone) {
53
+ return until
54
+ ? `Deze kar wacht nog tot ${formatSiteTime(until, timeZone)} op mogelijke aanvulling en kan nog niet geprint worden.`
55
+ : "Deze kar wacht nog op mogelijke aanvulling en kan nog niet geprint worden.";
56
+ }
57
+ let knownZone = null;
58
+ /** Door het scherm gezet zodra de tijdzone van de vestiging bekend is. */
59
+ export function setKnownSiteZone(tz) {
60
+ knownZone = tz;
61
+ }
62
+ /** PICK_DEELKAR_WACHT / PICK_REGEL_AFGESLOTEN → gewone zin; anders null. */
63
+ export function pickRefusalText(raw, timeZone = knownZone) {
64
+ if (!raw)
65
+ return null;
66
+ if (raw.includes("PICK_REGEL_AFGESLOTEN"))
67
+ return CLOSED_ROW_MESSAGE;
68
+ const m = /PICK_DEELKAR_WACHT:\s*(\S+)/.exec(raw);
69
+ if (m || raw.includes("PICK_DEELKAR_WACHT")) {
70
+ const iso = m && m[1] !== "-" && !Number.isNaN(new Date(m[1]).getTime()) ? m[1] : null;
71
+ return waitRefusalMessage(iso, timeZone);
72
+ }
73
+ return null;
74
+ }
75
+ /* ---------- pickMode is nu een object ---------- */
76
+ export function pickModeValue(raw) {
77
+ if (typeof raw === "string")
78
+ return raw.trim() ? raw : null;
79
+ const r = recordOf(raw);
80
+ return r ? textOf(r["pickMode"] ?? r["pick_mode"]) : null;
81
+ }
82
+ /* ---------- Eerdere pickdagen ---------- */
83
+ /** "ma 19 okt" voor een pickdag (YYYY-MM-DD). */
84
+ export function pickDayShortLabel(iso) {
85
+ if (!iso || !/^\d{4}-\d{2}-\d{2}$/.test(iso))
86
+ return "onbekende dag";
87
+ const d = new Date(`${iso}T12:00:00Z`);
88
+ const s = d.toLocaleDateString("nl-NL", { weekday: "short", day: "numeric", month: "short", timeZone: "UTC" });
89
+ return s.replace(/\./g, "");
90
+ }
91
+ export function pickDayOf(item) {
92
+ return textOf(recordOf(item.payload)?.["pickDate"]);
93
+ }
@@ -1,5 +1,6 @@
1
1
  import { supabase } from "@flowselections/core";
2
2
  import type { PickCartPlan, PickCountry, PickDashboardRow, PickDocumentType, PickLock, PickActivePrinter, PickPrintJob, PickPrintPlek, PickStationPrintPlek, PickStationPrintPlekRow, PickPrinter, PickQueueItem, PickScreen, PickSortRule, PickStation, PickStationType, PickStatus, PickTask } from "./pickTypes";
3
+ import { type CartPlanMismatch } from "./pickTypes";
3
4
  type PickDbClient = {
4
5
  from: (t: string) => any;
5
6
  rpc: (fn: string, args?: Record<string, unknown>) => Promise<{
@@ -17,6 +18,8 @@ export { db as pickDb };
17
18
  export interface VerifiedRow {
18
19
  id: string;
19
20
  plan: PickCartPlan | null;
21
+ /** Karren met een totaal dat niet bij het plan past; leeg = in orde. */
22
+ mismatches?: CartPlanMismatch[];
20
23
  status: {
21
24
  ready: boolean;
22
25
  released: boolean;
@@ -140,6 +143,11 @@ export declare const pickApi: {
140
143
  }>;
141
144
  /** Zoekt één wachtrijregel op barcode, documentnummer of ordernummer (voor de scanner). */
142
145
  findByCode(code: string, stationId?: string): Promise<PickQueueItem | null>;
146
+ /** Geprint, nog niet gescand, van een pickdag vóór de gekozen dag (Engine 1.0.152). */
147
+ unscannedEarlier(args: {
148
+ stationId?: string;
149
+ beforeDay: string;
150
+ }): Promise<PickQueueItem[]>;
143
151
  claimNext(args: {
144
152
  stationId: string | null;
145
153
  screenId: string | null;
@@ -210,6 +218,11 @@ export declare const pickApi: {
210
218
  ref: string | null;
211
219
  }[]): Promise<VerifiedRow[]>;
212
220
  queueCartPlan(queueItemId: string): Promise<PickCartPlan | null>;
221
+ /** Karplan plus de karren waarvan de nummers niet kloppen (alleen vaststellen). */
222
+ queueCartPlanChecked(queueItemId: string): Promise<{
223
+ plan: PickCartPlan | null;
224
+ mismatches: CartPlanMismatch[];
225
+ }>;
213
226
  /** Zet één kar in de printopdracht en rondt alleen deze kar af. */
214
227
  completePrintCart(itemId: string, sessionId: string, cartId: string): Promise<PickQueueItem>;
215
228
  /** Zet alle gekozen karren transactioneel en in één netwerkronde in de printwachtrij. */