@flowselections/pick-schermen-kwekers 1.0.60 → 1.0.62
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.
- package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
- package/dist-lib/components/pick/PickScherm.js +11 -4
- package/dist-lib/components/pick/ShippingNoteScan.d.ts.map +1 -1
- package/dist-lib/components/pick/ShippingNoteScan.js +52 -13
- package/dist-lib/components/pick/StickerState.d.ts +4 -0
- package/dist-lib/components/pick/StickerState.d.ts.map +1 -1
- package/dist-lib/components/pick/StickerState.js +30 -4
- package/dist-lib/integrations/supabase/types.d.ts +428 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/pick161.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick161.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick161.test.js +29 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.js +36 -0
- package/dist-lib/lib/pick159.js +1 -1
- package/dist-lib/lib/pick161.d.ts +27 -0
- package/dist-lib/lib/pick161.d.ts.map +1 -0
- package/dist-lib/lib/pick161.js +86 -0
- package/dist-lib/lib/pickPreview.d.ts.map +1 -1
- package/dist-lib/lib/pickPreview.js +2 -1
- package/dist-lib/lib/pickStickers.d.ts +5 -0
- package/dist-lib/lib/pickStickers.d.ts.map +1 -1
- package/dist-lib/lib/pickStickers.js +3 -0
- package/dist-lib/lib/pickUitwijk.d.ts +25 -0
- package/dist-lib/lib/pickUitwijk.d.ts.map +1 -0
- package/dist-lib/lib/pickUitwijk.js +93 -0
- package/dist-lib/lib/shippingNote.d.ts +2 -0
- package/dist-lib/lib/shippingNote.d.ts.map +1 -1
- package/dist-lib/lib/shippingNote.js +2 -1
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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
|
+
});
|
package/dist-lib/lib/pick159.js
CHANGED
|
@@ -97,7 +97,7 @@ export const KEYED_RPCS = new Set([
|
|
|
97
97
|
"pickstation_order_sticker_meldingen", "pickstation_resolve_delivery_orders", "pickstation_sticker_past_controle",
|
|
98
98
|
"pickstation_sticker_reprint",
|
|
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
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"
|
|
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"]);
|
|
@@ -8,6 +8,9 @@ export interface StickerLine {
|
|
|
8
8
|
printJobId: string | null;
|
|
9
9
|
breedteMm: number | null;
|
|
10
10
|
hoogteMm: number | null;
|
|
11
|
+
/** Uitwijkroute van Layouts: passend / groter / a4 (indien geleverd). */
|
|
12
|
+
route?: string | null;
|
|
13
|
+
printerNaam?: string | null;
|
|
11
14
|
}
|
|
12
15
|
export interface CartStickerState {
|
|
13
16
|
cartId: string | null;
|
|
@@ -16,6 +19,8 @@ export interface CartStickerState {
|
|
|
16
19
|
wachtend: number | null;
|
|
17
20
|
geblokkeerd: number | null;
|
|
18
21
|
regels: StickerLine[];
|
|
22
|
+
/** Reden van de Engine waarom er geen stickers nodig zijn. */
|
|
23
|
+
geenStickersReden?: string | null;
|
|
19
24
|
}
|
|
20
25
|
export interface StickerMelding {
|
|
21
26
|
id: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AACD,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAOpE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQvD,CAAC;AACF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG3D;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAwB3E;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAIjF;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,IAAI,CAe3E;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,IAAI,CAI/E;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAIjE;AAQD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGjH;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAGvH"}
|
|
@@ -35,6 +35,7 @@ export function parseCartStickerState(raw) {
|
|
|
35
35
|
inPrintwachtrij: num(r["inPrintwachtrij"]),
|
|
36
36
|
wachtend: num(r["wachtend"]),
|
|
37
37
|
geblokkeerd: num(r["geblokkeerd"]),
|
|
38
|
+
geenStickersReden: txt(r["geenStickersReden"] ?? r["geen_stickers_reden"] ?? r["reden"]),
|
|
38
39
|
regels: r["regels"].flatMap((x) => {
|
|
39
40
|
const l = rec(x);
|
|
40
41
|
if (!l)
|
|
@@ -43,6 +44,8 @@ export function parseCartStickerState(raw) {
|
|
|
43
44
|
soort: txt(l["soort"]), stickerId: txt(l["stickerId"]), kopieen: num(l["kopieen"]),
|
|
44
45
|
status: txt(l["status"]), reden: txt(l["reden"]), printJobId: txt(l["printJobId"]),
|
|
45
46
|
breedteMm: num(l["breedteMm"]), hoogteMm: num(l["hoogteMm"]),
|
|
47
|
+
route: txt(l["uitwijkroute"] ?? l["printroute"] ?? l["route"]),
|
|
48
|
+
printerNaam: txt(l["printerNaam"] ?? l["printer_naam"]),
|
|
46
49
|
}];
|
|
47
50
|
}),
|
|
48
51
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Uitwijk {
|
|
2
|
+
route: string | null;
|
|
3
|
+
printerNaam: string | null;
|
|
4
|
+
schaal: number | null;
|
|
5
|
+
reden: string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function uitwijkRouteText(v: string | null | undefined): string | null;
|
|
8
|
+
export declare function parseUitwijk(raw: unknown): Uitwijk | null;
|
|
9
|
+
/** Map printJobId → uitwijk; onleesbaar antwoord = lege map. */
|
|
10
|
+
export declare function parseUitwijkList(raw: unknown): Map<string, Uitwijk>;
|
|
11
|
+
export declare function fetchUitwijk(jobIds: string[]): Promise<Map<string, Uitwijk>>;
|
|
12
|
+
export interface VroegeWaarschuwing {
|
|
13
|
+
dag: string | null;
|
|
14
|
+
printplek: string | null;
|
|
15
|
+
maat: string | null;
|
|
16
|
+
aantal: number | null;
|
|
17
|
+
route: string;
|
|
18
|
+
reden: string | null;
|
|
19
|
+
}
|
|
20
|
+
/** Alleen regels met route A4 of verkleind. null = functie (nog) niet beschikbaar. */
|
|
21
|
+
export declare function parseVroegeWaarschuwing(raw: unknown): VroegeWaarschuwing[] | null;
|
|
22
|
+
/** "Morgen: 12 stickers (25×89 mm) op A4 bij Expeditie – past niet op …". */
|
|
23
|
+
export declare function vroegeWaarschuwingText(w: VroegeWaarschuwing, today: string): string;
|
|
24
|
+
export declare function fetchVroegeWaarschuwing(stationId: string | null): Promise<VroegeWaarschuwing[] | null>;
|
|
25
|
+
//# sourceMappingURL=pickUitwijk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickUitwijk.d.ts","sourceRoot":"","sources":["../../src/lib/pickUitwijk.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,OAAO;IAAG,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAU1H,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CASzD;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAUnE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlF;AAED,MAAM,WAAW,kBAAkB;IAAG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAIrK,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAqBjF;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnF;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAI5G"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Uitwijkroute van Layouts (print_jobs.uitwijk) en de vroege stickerwaarschuwing.
|
|
2
|
+
// Alleen lezen, via eigen leesfuncties met sleutelcontrole.
|
|
3
|
+
import { supabase } from "@flowselections/core";
|
|
4
|
+
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
const db = keyedRpc(supabase);
|
|
6
|
+
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
7
|
+
const txt = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
|
|
8
|
+
const num = (v) => (typeof v === "number" && Number.isFinite(v) ? v : typeof v === "string" && v.trim() && Number.isFinite(Number(v)) ? Number(v) : null);
|
|
9
|
+
const ROUTE = {
|
|
10
|
+
precies: "passend etiket",
|
|
11
|
+
gedraaid: "gedraaid etiket",
|
|
12
|
+
groter_etiket: "groter etiket",
|
|
13
|
+
verkleind: "verkleind",
|
|
14
|
+
a4_vel: "A4",
|
|
15
|
+
a4_snijlijnen: "A4 met snijlijnen",
|
|
16
|
+
};
|
|
17
|
+
export function uitwijkRouteText(v) {
|
|
18
|
+
return v ? ROUTE[v.toLowerCase()] ?? null : null;
|
|
19
|
+
}
|
|
20
|
+
export function parseUitwijk(raw) {
|
|
21
|
+
const r = rec(raw);
|
|
22
|
+
if (!r)
|
|
23
|
+
return null;
|
|
24
|
+
return {
|
|
25
|
+
route: txt(r["uitwijkroute"] ?? r["route"]),
|
|
26
|
+
printerNaam: txt(r["printerNaam"] ?? r["printer_naam"]),
|
|
27
|
+
schaal: num(r["schaal"]),
|
|
28
|
+
reden: txt(r["reden"]),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Map printJobId → uitwijk; onleesbaar antwoord = lege map. */
|
|
32
|
+
export function parseUitwijkList(raw) {
|
|
33
|
+
const m = new Map();
|
|
34
|
+
if (!Array.isArray(raw))
|
|
35
|
+
return m;
|
|
36
|
+
for (const x of raw) {
|
|
37
|
+
const r = rec(x);
|
|
38
|
+
const id = txt(r?.["id"]);
|
|
39
|
+
const u = parseUitwijk(r?.["uitwijk"]);
|
|
40
|
+
if (id && u)
|
|
41
|
+
m.set(id, u);
|
|
42
|
+
}
|
|
43
|
+
return m;
|
|
44
|
+
}
|
|
45
|
+
export async function fetchUitwijk(jobIds) {
|
|
46
|
+
if (jobIds.length === 0)
|
|
47
|
+
return new Map();
|
|
48
|
+
const { data, error } = await db.rpc("pick_read_print_job_uitwijk", { p_job_ids: jobIds });
|
|
49
|
+
if (error)
|
|
50
|
+
throw new Error(error.message);
|
|
51
|
+
return parseUitwijkList(data);
|
|
52
|
+
}
|
|
53
|
+
const WAARSCHUW_ROUTES = new Set(["a4_vel", "a4_snijlijnen", "verkleind"]);
|
|
54
|
+
/** Alleen regels met route A4 of verkleind. null = functie (nog) niet beschikbaar. */
|
|
55
|
+
export function parseVroegeWaarschuwing(raw) {
|
|
56
|
+
// Nieuwe vorm: { regels: [...], reden }; oude vorm: lijst.
|
|
57
|
+
const obj = rec(raw);
|
|
58
|
+
if (obj && !Array.isArray(raw))
|
|
59
|
+
return Array.isArray(obj["regels"]) ? parseVroegeWaarschuwing(obj["regels"]) : [];
|
|
60
|
+
if (raw == null || !Array.isArray(raw))
|
|
61
|
+
return null;
|
|
62
|
+
const rows = raw.length === 1 && Array.isArray(raw[0]) ? raw[0] : raw;
|
|
63
|
+
return rows.flatMap((x) => {
|
|
64
|
+
const r = rec(x);
|
|
65
|
+
const route = txt(r?.["route"] ?? r?.["uitwijkroute"])?.toLowerCase();
|
|
66
|
+
if (!r || !route || !WAARSCHUW_ROUTES.has(route))
|
|
67
|
+
return [];
|
|
68
|
+
const b = num(r["breedte_mm"] ?? r["breedteMm"]);
|
|
69
|
+
const h = num(r["hoogte_mm"] ?? r["hoogteMm"]);
|
|
70
|
+
return [{
|
|
71
|
+
dag: txt(r["dag"] ?? r["datum"]),
|
|
72
|
+
printplek: txt(r["printplek"] ?? r["printplekNaam"] ?? r["print_plek_naam"]),
|
|
73
|
+
maat: txt(r["maat"]) ?? (b && h ? `${b}×${h} mm` : null),
|
|
74
|
+
aantal: num(r["aantal"]),
|
|
75
|
+
route,
|
|
76
|
+
reden: txt(r["reden"]),
|
|
77
|
+
}];
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** "Morgen: 12 stickers (25×89 mm) op A4 bij Expeditie – past niet op …". */
|
|
81
|
+
export function vroegeWaarschuwingText(w, today) {
|
|
82
|
+
const dag = w.dag ? (w.dag.slice(0, 10) === today ? "Vandaag" : "Morgen") : "Binnenkort";
|
|
83
|
+
const aantal = w.aantal != null ? `${w.aantal} ${w.aantal === 1 ? "sticker" : "stickers"}` : "Stickers";
|
|
84
|
+
const route = uitwijkRouteText(w.route) ?? w.route;
|
|
85
|
+
const wat = w.route === "verkleind" ? "verkleind geprint" : `op ${route} geprint`;
|
|
86
|
+
return `${dag}: ${aantal}${w.maat ? ` (${w.maat})` : ""} worden ${wat}${w.printplek ? ` bij ${w.printplek}` : ""}${w.reden ? ` – ${w.reden}` : ""}`;
|
|
87
|
+
}
|
|
88
|
+
export async function fetchVroegeWaarschuwing(stationId) {
|
|
89
|
+
const { data, error } = await db.rpc("pick_read_vroege_sticker_waarschuwing", { p_station_id: stationId });
|
|
90
|
+
if (error)
|
|
91
|
+
throw new Error(error.message);
|
|
92
|
+
return parseVroegeWaarschuwing(data);
|
|
93
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shippingNote.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNote.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"shippingNote.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNote.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAoCD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAcxE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CASxE;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAIhF;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ9B"}
|
|
@@ -27,7 +27,8 @@ function parseCart(raw) {
|
|
|
27
27
|
const i = obj(rawItem);
|
|
28
28
|
return {
|
|
29
29
|
productName: str(i["productName"] ?? i["product_name"] ?? i["name"]) ?? "Onbekend product",
|
|
30
|
-
quantity: num(i["quantity"] ?? i["
|
|
30
|
+
quantity: num(i["quantity"] ?? i["aantal"] ?? i["stuks"]),
|
|
31
|
+
crates: num(i["crates"] ?? i["fust"] ?? i["cartCrates"]),
|
|
31
32
|
};
|
|
32
33
|
}),
|
|
33
34
|
};
|