@flowselections/pick-schermen-kwekers 1.0.66 → 1.0.70
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 +3 -1
- package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
- package/dist-lib/components/pick/PickScherm.js +14 -8
- package/dist-lib/components/pick/StickerState.d.ts.map +1 -1
- package/dist-lib/components/pick/StickerState.js +17 -6
- package/dist-lib/hooks/useCartStickerStates.d.ts.map +1 -1
- package/dist-lib/hooks/useCartStickerStates.js +1 -0
- package/dist-lib/integrations/supabase/types.d.ts +534 -120
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/pick167.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick167.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick167.test.js +25 -0
- package/dist-lib/lib/__tests__/pick167b.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick167b.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick167b.test.js +33 -0
- package/dist-lib/lib/pick161.d.ts +19 -1
- package/dist-lib/lib/pick161.d.ts.map +1 -1
- package/dist-lib/lib/pick161.js +70 -0
- package/dist-lib/lib/pickStickerBundle.d.ts +6 -0
- package/dist-lib/lib/pickStickerBundle.d.ts.map +1 -1
- package/dist-lib/lib/pickStickerBundle.js +6 -1
- package/dist-lib/lib/pickStickers.d.ts +4 -0
- package/dist-lib/lib/pickStickers.d.ts.map +1 -1
- package/dist-lib/lib/pickStickers.js +3 -0
- package/package.json +1 -1
- package/schema/pickschermen.sql +51 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick167.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick167.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { stickerLineWithJobs, stickerOpdrachtText } from "../pick161.js";
|
|
3
|
+
import { parseCartStickerBundle } from "../pickStickerBundle.js";
|
|
4
|
+
const tz = "Europe/Amsterdam";
|
|
5
|
+
const now = new Date("2026-10-26T20:50:00Z");
|
|
6
|
+
describe("1.0.67 stickerstatus uit printopdrachten", () => {
|
|
7
|
+
it("eigen sticker voltooid: nooit 'Geen stickers nodig'", () => {
|
|
8
|
+
const line = stickerLineWithJobs({ cartId: "c", totaal: 0, inPrintwachtrij: 0, wachtend: 0, geblokkeerd: 0, regels: [] }, [{ id: "j", status: "voltooid", fase: "afleveren", voltooidOp: "2026-10-26T20:45:26Z", geplandOp: null, reden: null }], tz, undefined, now);
|
|
9
|
+
expect(line).toBe("Sticker geprint 21:45");
|
|
10
|
+
});
|
|
11
|
+
it("wacht tot later: Sticker volgt om", () => {
|
|
12
|
+
expect(stickerOpdrachtText({ id: null, status: "wachtend", fase: null, voltooidOp: null, geplandOp: "2026-10-27T10:15:00Z", reden: null }, tz, now)).toBe("Sticker volgt om 11:15");
|
|
13
|
+
});
|
|
14
|
+
it("mislukt: Sticker geweigerd met reden", () => {
|
|
15
|
+
expect(stickerOpdrachtText({ id: null, status: "mislukt", fase: null, voltooidOp: null, geplandOp: null, reden: "Printer offline" }, tz, now)).toBe("Sticker geweigerd: Printer offline");
|
|
16
|
+
});
|
|
17
|
+
it("zonder opdrachten en totaal 0: Geen stickers nodig", () => {
|
|
18
|
+
expect(stickerLineWithJobs({ cartId: "c", totaal: 0, inPrintwachtrij: 0, wachtend: 0, geblokkeerd: 0, regels: [] }, [], tz)).toBe("Geen stickers nodig voor deze kar");
|
|
19
|
+
});
|
|
20
|
+
it("bundel levert opdrachten en tijdzone", () => {
|
|
21
|
+
const r = parseCartStickerBundle({ toegang: true, tijdzone: tz, karren: [{ cart_id: "c1", toegang: true, stand: { toegang: true, stand: { totaal: 0, regels: [] } }, opdrachten: [{ id: "j1", status: "voltooid" }] }] });
|
|
22
|
+
expect(r[0].opdrachten?.[0].id).toBe("j1");
|
|
23
|
+
expect(r[0].tijdzone).toBe(tz);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick167b.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick167b.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { stickerLineWithJobs } from "../pick161.js";
|
|
3
|
+
import { parseCartStickerBundle } from "../pickStickerBundle.js";
|
|
4
|
+
import { parseCartStickerState } from "../pickStickers.js";
|
|
5
|
+
const tz = "Europe/Amsterdam";
|
|
6
|
+
const leeg = { cartId: "c", totaal: 0, inPrintwachtrij: 0, wachtend: 0, geblokkeerd: 0, regels: [] };
|
|
7
|
+
describe("1.0.67 stickervraag (needs_sticker)", () => {
|
|
8
|
+
it("gevraagd zonder opdracht", () => {
|
|
9
|
+
expect(stickerLineWithJobs(leeg, [], tz, undefined, new Date(), true)).toBe("Sticker gevraagd, nog niet naar de printer gestuurd");
|
|
10
|
+
});
|
|
11
|
+
it("opdracht gaat voor, ook zonder vinkje", () => {
|
|
12
|
+
expect(stickerLineWithJobs(leeg, [{ id: "j", status: "voltooid", fase: null, voltooidOp: null, geplandOp: null, reden: null }], tz, undefined, new Date(), false)).toBe("Sticker geprint");
|
|
13
|
+
});
|
|
14
|
+
it("geen vraag en geen opdracht: Geen stickers nodig", () => {
|
|
15
|
+
expect(stickerLineWithJobs(leeg, [], tz, undefined, new Date(), false)).toBe("Geen stickers nodig voor deze kar");
|
|
16
|
+
});
|
|
17
|
+
it("onleesbare vraag: Stickerstand onbekend", () => {
|
|
18
|
+
expect(stickerLineWithJobs(leeg, [], tz, undefined, new Date(), null)).toBe("Stickerstand onbekend");
|
|
19
|
+
});
|
|
20
|
+
it("bundel leest sticker_gevraagd", () => {
|
|
21
|
+
const r = parseCartStickerBundle({ toegang: true, karren: [{ cart_id: "c1", toegang: true, stand: { toegang: true, stand: { totaal: 0, regels: [] } }, opdrachten: [], sticker_gevraagd: true }] });
|
|
22
|
+
expect(r[0].gevraagd).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("ingelogd: Engine 1.0.201-velden", () => {
|
|
25
|
+
const s = parseCartStickerState({ totaal: 0, regels: [], stickerGevraagd: true, printopdrachten: [{ printJobId: "p1", status: "mislukt", foutmelding: "Printer offline" }] });
|
|
26
|
+
expect(s?.stickerGevraagd).toBe(true);
|
|
27
|
+
expect(s?.printopdrachten?.[0]).toMatchObject({ id: "p1", reden: "Printer offline" });
|
|
28
|
+
});
|
|
29
|
+
it("ingelogd: oudere Engine zonder velden blijft oud gedrag", () => {
|
|
30
|
+
const s = parseCartStickerState({ totaal: 0, regels: [] });
|
|
31
|
+
expect(s && "stickerGevraagd" in s).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CartStickerState } from "./pickStickers.js";
|
|
2
2
|
import { type Uitwijk } from "./pickUitwijk.js";
|
|
3
3
|
export declare const SCAN_UNKNOWN = "Scan de barcode onderaan de pakbon";
|
|
4
4
|
/** PB-<order>-K<n>: pakbonnummer, moet eerst naar de kar-barcode. */
|
|
@@ -24,4 +24,22 @@ export interface StickerPlace {
|
|
|
24
24
|
export declare function stickerPlaces(s: CartStickerState, uitwijk?: Map<string, Uitwijk>): StickerPlace[];
|
|
25
25
|
/** "6 stickers naar de printer gestuurd op A4-vel (Kantoorprinter)" of "Geen stickers nodig: <reden>". */
|
|
26
26
|
export declare function stickerLine(s: CartStickerState | null, uitwijk?: Map<string, Uitwijk>): string;
|
|
27
|
+
/** 1.0.67: stickerprintopdracht van de kar (ook eigen sticker), uit print_jobs. */
|
|
28
|
+
export interface StickerOpdracht {
|
|
29
|
+
id: string | null;
|
|
30
|
+
status: string | null;
|
|
31
|
+
fase: string | null;
|
|
32
|
+
voltooidOp: string | null;
|
|
33
|
+
geplandOp: string | null;
|
|
34
|
+
reden: string | null;
|
|
35
|
+
}
|
|
36
|
+
export declare function parseStickerOpdrachten(raw: unknown): StickerOpdracht[] | null;
|
|
37
|
+
/** HH:MM in de vestigingstijdzone; zonder bekende tijdzone geen tijd (geen UTC-terugval). */
|
|
38
|
+
export declare function clockText(iso: string | null, tz: string | null): string | null;
|
|
39
|
+
export declare function stickerOpdrachtText(o: StickerOpdracht, tz: string | null, now?: Date): string;
|
|
40
|
+
export declare const STICKER_GEVRAAGD = "Sticker gevraagd, nog niet naar de printer gestuurd";
|
|
41
|
+
/** Regel per kar: printopdrachten gaan voor; "Geen stickers nodig" alleen zonder opdracht. */
|
|
42
|
+
export declare function stickerLineWithJobs(s: CartStickerState | null, opdrachten: StickerOpdracht[] | null | undefined, tz: string | null, uitwijk?: Map<string, Uitwijk>, now?: Date,
|
|
43
|
+
/** true = minstens één orderregel vraagt sticker; null = onleesbaar; undefined = niet geleverd (oud gedrag). */
|
|
44
|
+
gevraagd?: boolean | null): string;
|
|
27
45
|
//# sourceMappingURL=pick161.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick161.d.ts","sourceRoot":"","sources":["../../src/lib/pick161.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pick161.d.ts","sourceRoot":"","sources":["../../src/lib/pick161.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,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;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,GAAG,IAAI,CAe7E;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAS9E;AAID,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAazG;AAED,eAAO,MAAM,gBAAgB,wDAAwD,CAAC;AAEtF,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAC1B,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,GAAG,SAAS,EAChD,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,GAAE,IAAiB;AACtB,gHAAgH;AAChH,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,GACxB,MAAM,CAUR"}
|
package/dist-lib/lib/pick161.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Pickschermen 1.0.61: scannen op pakbonnummer, gewone taal voor ruwe waarden
|
|
2
|
+
// en de stickerregel per kar (aantal, waar geprint, of waarom niet nodig).
|
|
3
|
+
import { STICKER_UNKNOWN } from "./pickStickers.js";
|
|
1
4
|
import { uitwijkRouteText } from "./pickUitwijk.js";
|
|
2
5
|
export const SCAN_UNKNOWN = "Scan de barcode onderaan de pakbon";
|
|
3
6
|
/** PB-<order>-K<n>: pakbonnummer, moet eerst naar de kar-barcode. */
|
|
@@ -84,3 +87,70 @@ export function stickerLine(s, uitwijk) {
|
|
|
84
87
|
})
|
|
85
88
|
.join(" · ");
|
|
86
89
|
}
|
|
90
|
+
export function parseStickerOpdrachten(raw) {
|
|
91
|
+
if (!Array.isArray(raw))
|
|
92
|
+
return null;
|
|
93
|
+
return raw.flatMap((x) => {
|
|
94
|
+
if (!x || typeof x !== "object")
|
|
95
|
+
return [];
|
|
96
|
+
const o = x;
|
|
97
|
+
// Bundel (snake_case) of Engine 1.0.201 logistics_cart_sticker_state.printopdrachten (camelCase).
|
|
98
|
+
return [{
|
|
99
|
+
id: str(o["id"] ?? o["printJobId"]),
|
|
100
|
+
status: str(o["status"]),
|
|
101
|
+
fase: str(o["fase"] ?? o["verwerkingsfase"]),
|
|
102
|
+
voltooidOp: str(o["voltooid_op"] ?? o["voltooidOp"]),
|
|
103
|
+
geplandOp: str(o["gepland_op"] ?? o["geplandOp"]),
|
|
104
|
+
reden: str(o["reden"] ?? o["foutmelding"]),
|
|
105
|
+
}];
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** HH:MM in de vestigingstijdzone; zonder bekende tijdzone geen tijd (geen UTC-terugval). */
|
|
109
|
+
export function clockText(iso, tz) {
|
|
110
|
+
if (!iso || !tz)
|
|
111
|
+
return null;
|
|
112
|
+
const d = new Date(iso);
|
|
113
|
+
if (Number.isNaN(d.getTime()))
|
|
114
|
+
return null;
|
|
115
|
+
try {
|
|
116
|
+
return new Intl.DateTimeFormat("nl-NL", { hour: "2-digit", minute: "2-digit", timeZone: tz }).format(d);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const FAILED = new Set(["mislukt", "geweigerd", "fout", "geannuleerd"]);
|
|
123
|
+
export function stickerOpdrachtText(o, tz, now = new Date()) {
|
|
124
|
+
if (o.status === "voltooid") {
|
|
125
|
+
const t = clockText(o.voltooidOp, tz);
|
|
126
|
+
return t ? `Sticker geprint ${t}` : "Sticker geprint";
|
|
127
|
+
}
|
|
128
|
+
if (o.status === "geannuleerd" && o.fase === "niet_nodig")
|
|
129
|
+
return "Sticker niet nodig – de koper wil geen sticker";
|
|
130
|
+
if (o.status && FAILED.has(o.status))
|
|
131
|
+
return `Sticker geweigerd: ${o.reden ?? "reden onbekend, meld dit bij kantoor"}`;
|
|
132
|
+
const plan = o.geplandOp ? new Date(o.geplandOp) : null;
|
|
133
|
+
if (plan && !Number.isNaN(plan.getTime()) && plan.getTime() > now.getTime()) {
|
|
134
|
+
const t = clockText(o.geplandOp, tz);
|
|
135
|
+
if (t)
|
|
136
|
+
return `Sticker volgt om ${t}`;
|
|
137
|
+
}
|
|
138
|
+
return "Sticker wordt geprint";
|
|
139
|
+
}
|
|
140
|
+
export const STICKER_GEVRAAGD = "Sticker gevraagd, nog niet naar de printer gestuurd";
|
|
141
|
+
/** Regel per kar: printopdrachten gaan voor; "Geen stickers nodig" alleen zonder opdracht. */
|
|
142
|
+
export function stickerLineWithJobs(s, opdrachten, tz, uitwijk, now = new Date(),
|
|
143
|
+
/** true = minstens één orderregel vraagt sticker; null = onleesbaar; undefined = niet geleverd (oud gedrag). */
|
|
144
|
+
gevraagd) {
|
|
145
|
+
const list = Array.isArray(opdrachten) ? opdrachten : [];
|
|
146
|
+
if (list.length > 0) {
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
return list.map((o) => stickerOpdrachtText(o, tz, now)).filter((t) => (seen.has(t) ? false : (seen.add(t), true))).join(" · ");
|
|
149
|
+
}
|
|
150
|
+
const zonderStand = !s || s.totaal === 0;
|
|
151
|
+
if (zonderStand && gevraagd === true)
|
|
152
|
+
return STICKER_GEVRAAGD;
|
|
153
|
+
if (zonderStand && gevraagd === null)
|
|
154
|
+
return STICKER_UNKNOWN;
|
|
155
|
+
return stickerLine(s, uitwijk);
|
|
156
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CartStickerState, type StickerMelding } from "./pickStickers.js";
|
|
2
2
|
import { type StickerFit } from "./pick150.js";
|
|
3
3
|
import { type Uitwijk } from "./pickUitwijk.js";
|
|
4
|
+
import { type StickerOpdracht } from "./pick161.js";
|
|
4
5
|
export interface CartStickerBundleItem {
|
|
5
6
|
cartId: string;
|
|
6
7
|
toegang: boolean;
|
|
@@ -11,6 +12,11 @@ export interface CartStickerBundleItem {
|
|
|
11
12
|
meldingen: StickerMelding[] | null;
|
|
12
13
|
uitwijk: Map<string, Uitwijk>;
|
|
13
14
|
jobIds: string[];
|
|
15
|
+
/** null = niet geleverd (oudere functie). */
|
|
16
|
+
opdrachten: StickerOpdracht[] | null;
|
|
17
|
+
tijdzone: string | null;
|
|
18
|
+
/** true/false = stickervraag orderregels; null = onleesbaar; undefined = niet geleverd. */
|
|
19
|
+
gevraagd?: boolean | null;
|
|
14
20
|
}
|
|
15
21
|
export declare function parseCartStickerBundle(raw: unknown): CartStickerBundleItem[];
|
|
16
22
|
//# sourceMappingURL=pickStickerBundle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickStickerBundle.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickerBundle.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"pickStickerBundle.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickerBundle.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,EAAE,CA8B5E"}
|
|
@@ -3,19 +3,21 @@
|
|
|
3
3
|
import { parsePickstationCartSticker, parsePickstationMeldingen } from "./pickStickers.js";
|
|
4
4
|
import { parseStickerFit } from "./pick150.js";
|
|
5
5
|
import { parseUitwijkList } from "./pickUitwijk.js";
|
|
6
|
+
import { parseStickerOpdrachten } from "./pick161.js";
|
|
6
7
|
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
7
8
|
const txt = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
|
|
8
9
|
export function parseCartStickerBundle(raw) {
|
|
9
10
|
const r = rec(raw);
|
|
10
11
|
if (!r || r["toegang"] !== true || !Array.isArray(r["karren"]))
|
|
11
12
|
return [];
|
|
13
|
+
const tijdzone = txt(r["tijdzone"]);
|
|
12
14
|
return r["karren"].flatMap((x) => {
|
|
13
15
|
const k = rec(x);
|
|
14
16
|
const cartId = txt(k?.["cart_id"]);
|
|
15
17
|
if (!k || !cartId)
|
|
16
18
|
return [];
|
|
17
19
|
if (k["toegang"] !== true) {
|
|
18
|
-
return [{ cartId, toegang: false, melding: txt(k["melding"]), orderId: null, stand: null, controle: null, meldingen: null, uitwijk: new Map(), jobIds: [] }];
|
|
20
|
+
return [{ cartId, toegang: false, melding: txt(k["melding"]), orderId: null, stand: null, controle: null, meldingen: null, uitwijk: new Map(), jobIds: [], opdrachten: null, tijdzone }];
|
|
19
21
|
}
|
|
20
22
|
const stand = parsePickstationCartSticker(k["stand"]);
|
|
21
23
|
const jobIds = Array.isArray(stand?.regels)
|
|
@@ -31,6 +33,9 @@ export function parseCartStickerBundle(raw) {
|
|
|
31
33
|
meldingen: k["meldingen"] == null ? null : parsePickstationMeldingen(k["meldingen"]),
|
|
32
34
|
uitwijk: parseUitwijkList(k["uitwijk"]),
|
|
33
35
|
jobIds,
|
|
36
|
+
opdrachten: parseStickerOpdrachten(k["opdrachten"]),
|
|
37
|
+
tijdzone,
|
|
38
|
+
...("sticker_gevraagd" in k ? { gevraagd: typeof k["sticker_gevraagd"] === "boolean" ? k["sticker_gevraagd"] : null } : {}),
|
|
34
39
|
}];
|
|
35
40
|
});
|
|
36
41
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type StickerOpdracht } from "./pick161.js";
|
|
1
2
|
export declare const STICKER_UNKNOWN = "Stickerstand onbekend";
|
|
2
3
|
export interface StickerLine {
|
|
3
4
|
soort: string | null;
|
|
@@ -21,6 +22,9 @@ export interface CartStickerState {
|
|
|
21
22
|
regels: StickerLine[];
|
|
22
23
|
/** Reden van de Engine waarom er geen stickers nodig zijn. */
|
|
23
24
|
geenStickersReden?: string | null;
|
|
25
|
+
/** Engine 1.0.201: undefined = niet geleverd (oudere Engine). */
|
|
26
|
+
stickerGevraagd?: boolean | null;
|
|
27
|
+
printopdrachten?: StickerOpdracht[] | null;
|
|
24
28
|
}
|
|
25
29
|
export interface StickerMelding {
|
|
26
30
|
id: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAKzE,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;IAClC,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CAC5C;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,CA0B3E;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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// voert zelf nooit print.sticker/print.traysticker uit en haalt geen PDF op.
|
|
3
3
|
import { supabase } from "@flowselections/core";
|
|
4
4
|
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
import { parseStickerOpdrachten } from "./pick161.js";
|
|
5
6
|
const db = keyedRpc(supabase);
|
|
6
7
|
export const STICKER_UNKNOWN = "Stickerstand onbekend";
|
|
7
8
|
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
@@ -36,6 +37,8 @@ export function parseCartStickerState(raw) {
|
|
|
36
37
|
wachtend: num(r["wachtend"]),
|
|
37
38
|
geblokkeerd: num(r["geblokkeerd"]),
|
|
38
39
|
geenStickersReden: txt(r["geenStickersReden"] ?? r["geen_stickers_reden"] ?? r["reden"]),
|
|
40
|
+
...("stickerGevraagd" in r ? { stickerGevraagd: typeof r["stickerGevraagd"] === "boolean" ? r["stickerGevraagd"] : null } : {}),
|
|
41
|
+
...("printopdrachten" in r ? { printopdrachten: parseStickerOpdrachten(r["printopdrachten"]) } : {}),
|
|
39
42
|
regels: r["regels"].flatMap((x) => {
|
|
40
43
|
const l = rec(x);
|
|
41
44
|
if (!l)
|
package/package.json
CHANGED
package/schema/pickschermen.sql
CHANGED
|
@@ -3919,6 +3919,18 @@ BEGIN
|
|
|
3919
3919
|
v := v || jsonb_build_object('niveau','fout','tekst','Functie zonder interne controle: '||t);
|
|
3920
3920
|
END IF;
|
|
3921
3921
|
END LOOP;
|
|
3922
|
+
-- 1.0.67: stickerbundel levert printopdrachten en stickervraag.
|
|
3923
|
+
v_oid := to_regprocedure('public.pickstation_cart_sticker_states(text,uuid[])');
|
|
3924
|
+
IF v_oid IS NULL THEN
|
|
3925
|
+
v := v || jsonb_build_object('niveau','fout','tekst','Pickschermen: stickerbundel ontbreekt (pickstation_cart_sticker_states).');
|
|
3926
|
+
ELSIF position('''opdrachten''' IN pg_get_functiondef(v_oid)) = 0 THEN
|
|
3927
|
+
v := v || jsonb_build_object('niveau','fout','tekst','Pickschermen: stickerbundel levert geen printopdrachten.');
|
|
3928
|
+
ELSE
|
|
3929
|
+
v := v || jsonb_build_object('niveau','info','tekst','Pickschermen: stickerbundel levert printopdrachten.');
|
|
3930
|
+
END IF;
|
|
3931
|
+
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='order_items' AND column_name='needs_sticker') THEN
|
|
3932
|
+
v := v || jsonb_build_object('niveau','waarschuwing','tekst','Pickschermen: stickervraag per orderregel niet leesbaar (order_items.needs_sticker ontbreekt, Verkoop).');
|
|
3933
|
+
END IF;
|
|
3922
3934
|
SELECT true, device_key_required INTO v_rij, v_req FROM public.pick_settings WHERE id;
|
|
3923
3935
|
IF v_rij IS NULL THEN v := v || jsonb_build_object('niveau','waarschuwing','tekst','Instellingenrij ontbreekt; voer pick_ensure_settings() uit. Apparaatsleutel nog niet verplicht.');
|
|
3924
3936
|
ELSIF NOT v_req THEN v := v || jsonb_build_object('niveau','waarschuwing','tekst','Apparaatsleutel nog niet verplicht.'); END IF;
|
|
@@ -4063,13 +4075,10 @@ BEGIN
|
|
|
4063
4075
|
END $function$;
|
|
4064
4076
|
|
|
4065
4077
|
CREATE OR REPLACE FUNCTION public.pickstation_cart_sticker_states(p_slug text, p_cart_ids uuid[])
|
|
4066
|
-
|
|
4067
|
-
LANGUAGE plpgsql
|
|
4068
|
-
SECURITY DEFINER
|
|
4069
|
-
SET search_path TO 'public'
|
|
4070
|
-
AS $function$
|
|
4078
|
+
RETURNS jsonb LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path = public AS $$
|
|
4071
4079
|
DECLARE v_station uuid; c uuid; v_stand jsonb; v_fit jsonb; v_meld jsonb; v_order uuid;
|
|
4072
4080
|
v_jobs uuid[]; v_uitwijk jsonb; out jsonb := '[]'::jsonb; v_has_uitwijk boolean;
|
|
4081
|
+
v_opdr jsonb; v_tz text; v_has_ns boolean; v_gevr boolean;
|
|
4073
4082
|
BEGIN
|
|
4074
4083
|
IF p_slug IS NOT NULL AND btrim(p_slug) <> '' THEN
|
|
4075
4084
|
SELECT s.id INTO v_station FROM public.pick_stations s WHERE s.slug = p_slug AND s.active IS TRUE LIMIT 1;
|
|
@@ -4077,11 +4086,17 @@ BEGIN
|
|
|
4077
4086
|
IF v_station IS NULL THEN
|
|
4078
4087
|
RAISE EXCEPTION 'Dit pickstation is onbekend of niet actief.' USING ERRCODE = '42501';
|
|
4079
4088
|
END IF;
|
|
4089
|
+
IF to_regprocedure('public.logistics_opening_timezone()') IS NOT NULL THEN
|
|
4090
|
+
BEGIN EXECUTE 'SELECT public.logistics_opening_timezone()::text' INTO v_tz;
|
|
4091
|
+
EXCEPTION WHEN OTHERS THEN v_tz := NULL; END;
|
|
4092
|
+
END IF;
|
|
4080
4093
|
IF p_cart_ids IS NULL OR cardinality(p_cart_ids) = 0 THEN
|
|
4081
|
-
RETURN jsonb_build_object('toegang', true, 'karren', '[]'::jsonb);
|
|
4094
|
+
RETURN jsonb_build_object('toegang', true, 'tijdzone', v_tz, 'karren', '[]'::jsonb);
|
|
4082
4095
|
END IF;
|
|
4083
4096
|
v_has_uitwijk := EXISTS (SELECT 1 FROM information_schema.columns
|
|
4084
4097
|
WHERE table_schema='public' AND table_name='print_jobs' AND column_name='uitwijk');
|
|
4098
|
+
v_has_ns := EXISTS (SELECT 1 FROM information_schema.columns
|
|
4099
|
+
WHERE table_schema='public' AND table_name='order_items' AND column_name='needs_sticker');
|
|
4085
4100
|
FOREACH c IN ARRAY (SELECT array_agg(DISTINCT x) FROM unnest(p_cart_ids[1:200]) x WHERE x IS NOT NULL) LOOP
|
|
4086
4101
|
BEGIN
|
|
4087
4102
|
v_stand := public.pickstation_cart_sticker_state(p_slug => p_slug, p_cart_id => c);
|
|
@@ -4104,12 +4119,36 @@ BEGIN
|
|
|
4104
4119
|
v_meld := public.pickstation_order_sticker_meldingen(p_slug => p_slug, p_order_id => v_order);
|
|
4105
4120
|
END IF;
|
|
4106
4121
|
EXCEPTION WHEN OTHERS THEN v_meld := NULL; END;
|
|
4122
|
+
-- Stickerprintopdrachten van deze kar (ook eigen stickers), gekoppeld op cart_id.
|
|
4123
|
+
v_opdr := NULL;
|
|
4124
|
+
BEGIN
|
|
4125
|
+
SELECT coalesce(jsonb_agg(jsonb_build_object(
|
|
4126
|
+
'id', pj.id, 'documenttype', pj.documenttype, 'status', pj.status,
|
|
4127
|
+
'fase', pj.verwerkingsfase, 'voltooid_op', pj.voltooid_op,
|
|
4128
|
+
'gepland_op', coalesce(pj.payload->>'print_op', pj.payload->>'wacht_tot', pj.volgende_poging::text),
|
|
4129
|
+
'reden', coalesce(pj.foutmelding, pj.printnode_bericht),
|
|
4130
|
+
'kopieen', pj.kopieen) ORDER BY pj.created_at), '[]'::jsonb)
|
|
4131
|
+
INTO v_opdr
|
|
4132
|
+
FROM public.print_jobs pj
|
|
4133
|
+
WHERE pj.payload->>'cart_id' = c::text
|
|
4134
|
+
AND pj.documenttype ILIKE '%sticker%';
|
|
4135
|
+
EXCEPTION WHEN OTHERS THEN v_opdr := NULL; END;
|
|
4136
|
+
-- Stickervraag: minstens één orderregel op de kar met needs_sticker (Verkoop). null = onleesbaar.
|
|
4137
|
+
v_gevr := NULL;
|
|
4138
|
+
IF v_has_ns THEN
|
|
4139
|
+
BEGIN
|
|
4140
|
+
EXECUTE 'SELECT EXISTS (SELECT 1 FROM public.order_cart_items oci JOIN public.order_items oi ON oi.id = oci.order_item_id
|
|
4141
|
+
WHERE oci.cart_id = $1 AND oi.needs_sticker IS TRUE)' INTO v_gevr USING c;
|
|
4142
|
+
EXCEPTION WHEN OTHERS THEN v_gevr := NULL; END;
|
|
4143
|
+
END IF;
|
|
4107
4144
|
v_uitwijk := '[]'::jsonb;
|
|
4108
4145
|
IF v_has_uitwijk THEN
|
|
4109
4146
|
BEGIN
|
|
4110
|
-
SELECT array_agg(DISTINCT
|
|
4111
|
-
|
|
4112
|
-
|
|
4147
|
+
SELECT array_agg(DISTINCT j) INTO v_jobs FROM (
|
|
4148
|
+
SELECT (r->>'printJobId')::uuid j
|
|
4149
|
+
FROM jsonb_array_elements(coalesce(v_stand->'stand'->'regels', '[]'::jsonb)) r
|
|
4150
|
+
WHERE coalesce(r->>'printJobId', '') ~ '^[0-9a-fA-F-]{36}$'
|
|
4151
|
+
UNION SELECT (o->>'id')::uuid FROM jsonb_array_elements(coalesce(v_opdr, '[]'::jsonb)) o) q;
|
|
4113
4152
|
IF v_jobs IS NOT NULL THEN
|
|
4114
4153
|
EXECUTE 'SELECT coalesce(jsonb_agg(jsonb_build_object(''id'', id, ''uitwijk'', uitwijk)), ''[]''::jsonb)
|
|
4115
4154
|
FROM public.print_jobs WHERE id = ANY($1) AND uitwijk IS NOT NULL'
|
|
@@ -4118,10 +4157,10 @@ BEGIN
|
|
|
4118
4157
|
EXCEPTION WHEN OTHERS THEN v_uitwijk := '[]'::jsonb; END;
|
|
4119
4158
|
END IF;
|
|
4120
4159
|
out := out || jsonb_build_array(jsonb_build_object('cart_id', c, 'toegang', true, 'order_id', v_order,
|
|
4121
|
-
'stand', v_stand, 'controle', v_fit, 'meldingen', v_meld, 'uitwijk', v_uitwijk));
|
|
4160
|
+
'stand', v_stand, 'controle', v_fit, 'meldingen', v_meld, 'uitwijk', v_uitwijk, 'opdrachten', v_opdr, 'sticker_gevraagd', v_gevr));
|
|
4122
4161
|
END LOOP;
|
|
4123
|
-
RETURN jsonb_build_object('toegang', true, 'karren', out);
|
|
4124
|
-
END
|
|
4162
|
+
RETURN jsonb_build_object('toegang', true, 'tijdzone', v_tz, 'karren', out);
|
|
4163
|
+
END $$;
|
|
4125
4164
|
|
|
4126
4165
|
CREATE OR REPLACE FUNCTION public.pickstation_device_status(p_slug text, p_device_key text)
|
|
4127
4166
|
RETURNS jsonb
|