@flowselections/pick-schermen-kwekers 1.0.68 → 1.0.72
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 +19 -4
- package/dist-lib/components/pick/StickerState.d.ts.map +1 -1
- package/dist-lib/components/pick/StickerState.js +4 -2
- package/dist-lib/hooks/useCartStickerStates.js +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +558 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- 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/__tests__/pickBackoff.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickBackoff.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickBackoff.test.js +10 -0
- package/dist-lib/lib/pick161.d.ts +5 -2
- package/dist-lib/lib/pick161.d.ts.map +1 -1
- package/dist-lib/lib/pick161.js +21 -2
- package/dist-lib/lib/pickBackoff.d.ts +12 -0
- package/dist-lib/lib/pickBackoff.d.ts.map +1 -0
- package/dist-lib/lib/pickBackoff.js +16 -0
- package/dist-lib/lib/pickStickerBundle.d.ts +2 -0
- package/dist-lib/lib/pickStickerBundle.d.ts.map +1 -1
- package/dist-lib/lib/pickStickerBundle.js +1 -0
- 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 +155 -12
|
@@ -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
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickBackoff.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickBackoff.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { verifyDelayMs } from "../pickBackoff.js";
|
|
3
|
+
describe("verifyDelayMs", () => {
|
|
4
|
+
it("wacht na mislukkingen 10, 20, 40, 80 s en daarna maximaal 2 min", () => {
|
|
5
|
+
expect([1, 2, 3, 4, 5, 9].map(verifyDelayMs)).toEqual([10000, 20000, 40000, 80000, 120000, 120000]);
|
|
6
|
+
});
|
|
7
|
+
it("zonder mislukking de gewone 15 s", () => {
|
|
8
|
+
expect(verifyDelayMs(0)).toBe(15000);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
@@ -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. */
|
|
@@ -37,6 +37,9 @@ export declare function parseStickerOpdrachten(raw: unknown): StickerOpdracht[]
|
|
|
37
37
|
/** HH:MM in de vestigingstijdzone; zonder bekende tijdzone geen tijd (geen UTC-terugval). */
|
|
38
38
|
export declare function clockText(iso: string | null, tz: string | null): string | null;
|
|
39
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";
|
|
40
41
|
/** Regel per kar: printopdrachten gaan voor; "Geen stickers nodig" alleen zonder opdracht. */
|
|
41
|
-
export declare function stickerLineWithJobs(s: CartStickerState | null, opdrachten: StickerOpdracht[] | null | undefined, tz: string | null, uitwijk?: Map<string, Uitwijk>, now?: Date
|
|
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;
|
|
42
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. */
|
|
@@ -91,7 +94,15 @@ export function parseStickerOpdrachten(raw) {
|
|
|
91
94
|
if (!x || typeof x !== "object")
|
|
92
95
|
return [];
|
|
93
96
|
const o = x;
|
|
94
|
-
|
|
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
|
+
}];
|
|
95
106
|
});
|
|
96
107
|
}
|
|
97
108
|
/** HH:MM in de vestigingstijdzone; zonder bekende tijdzone geen tijd (geen UTC-terugval). */
|
|
@@ -126,12 +137,20 @@ export function stickerOpdrachtText(o, tz, now = new Date()) {
|
|
|
126
137
|
}
|
|
127
138
|
return "Sticker wordt geprint";
|
|
128
139
|
}
|
|
140
|
+
export const STICKER_GEVRAAGD = "Sticker gevraagd, nog niet naar de printer gestuurd";
|
|
129
141
|
/** Regel per kar: printopdrachten gaan voor; "Geen stickers nodig" alleen zonder opdracht. */
|
|
130
|
-
export function stickerLineWithJobs(s, opdrachten, tz, uitwijk, now = new Date()
|
|
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) {
|
|
131
145
|
const list = Array.isArray(opdrachten) ? opdrachten : [];
|
|
132
146
|
if (list.length > 0) {
|
|
133
147
|
const seen = new Set();
|
|
134
148
|
return list.map((o) => stickerOpdrachtText(o, tz, now)).filter((t) => (seen.has(t) ? false : (seen.add(t), true))).join(" · ");
|
|
135
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;
|
|
136
155
|
return stickerLine(s, uitwijk);
|
|
137
156
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Wachttijd tussen controles van pickregels. */
|
|
2
|
+
export declare const VERIFY_INTERVAL_MS = 15000;
|
|
3
|
+
export declare const VERIFY_BACKOFF_START_MS = 10000;
|
|
4
|
+
export declare const VERIFY_BACKOFF_MAX_MS = 120000;
|
|
5
|
+
export declare const VERIFY_SLOW_MESSAGE = "Controle duurt te lang, we proberen het zo opnieuw";
|
|
6
|
+
export declare const VERIFY_SLOW_TOAST_ID = "pick-verify-slow";
|
|
7
|
+
/**
|
|
8
|
+
* Na `failures` mislukte controles op rij: 10 → 20 → 40 → 80 → 120 s (max 2 min).
|
|
9
|
+
* Zonder mislukking de gewone wachttijd.
|
|
10
|
+
*/
|
|
11
|
+
export declare function verifyDelayMs(failures: number): number;
|
|
12
|
+
//# sourceMappingURL=pickBackoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickBackoff.d.ts","sourceRoot":"","sources":["../../src/lib/pickBackoff.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C,eAAO,MAAM,mBAAmB,uDAAuD,CAAC;AACxF,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAItD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Wachttijd tussen controles van pickregels. */
|
|
2
|
+
export const VERIFY_INTERVAL_MS = 15000;
|
|
3
|
+
export const VERIFY_BACKOFF_START_MS = 10000;
|
|
4
|
+
export const VERIFY_BACKOFF_MAX_MS = 120000;
|
|
5
|
+
export const VERIFY_SLOW_MESSAGE = "Controle duurt te lang, we proberen het zo opnieuw";
|
|
6
|
+
export const VERIFY_SLOW_TOAST_ID = "pick-verify-slow";
|
|
7
|
+
/**
|
|
8
|
+
* Na `failures` mislukte controles op rij: 10 → 20 → 40 → 80 → 120 s (max 2 min).
|
|
9
|
+
* Zonder mislukking de gewone wachttijd.
|
|
10
|
+
*/
|
|
11
|
+
export function verifyDelayMs(failures) {
|
|
12
|
+
if (!Number.isFinite(failures) || failures <= 0)
|
|
13
|
+
return VERIFY_INTERVAL_MS;
|
|
14
|
+
const d = VERIFY_BACKOFF_START_MS * 2 ** (Math.floor(failures) - 1);
|
|
15
|
+
return Math.min(d, VERIFY_BACKOFF_MAX_MS);
|
|
16
|
+
}
|
|
@@ -15,6 +15,8 @@ export interface CartStickerBundleItem {
|
|
|
15
15
|
/** null = niet geleverd (oudere functie). */
|
|
16
16
|
opdrachten: StickerOpdracht[] | null;
|
|
17
17
|
tijdzone: string | null;
|
|
18
|
+
/** true/false = stickervraag orderregels; null = onleesbaar; undefined = niet geleverd. */
|
|
19
|
+
gevraagd?: boolean | null;
|
|
18
20
|
}
|
|
19
21
|
export declare function parseCartStickerBundle(raw: unknown): CartStickerBundleItem[];
|
|
20
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;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;
|
|
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"}
|
|
@@ -35,6 +35,7 @@ export function parseCartStickerBundle(raw) {
|
|
|
35
35
|
jobIds,
|
|
36
36
|
opdrachten: parseStickerOpdrachten(k["opdrachten"]),
|
|
37
37
|
tijdzone,
|
|
38
|
+
...("sticker_gevraagd" in k ? { gevraagd: typeof k["sticker_gevraagd"] === "boolean" ? k["sticker_gevraagd"] : null } : {}),
|
|
38
39
|
}];
|
|
39
40
|
});
|
|
40
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
|
@@ -3843,29 +3843,141 @@ CREATE OR REPLACE FUNCTION public.pick_touch_updated_at()
|
|
|
3843
3843
|
AS $function$
|
|
3844
3844
|
BEGIN NEW.updated_at = now(); RETURN NEW; END; $function$;
|
|
3845
3845
|
|
|
3846
|
+
CREATE OR REPLACE FUNCTION public.pick_queue_cart_plans(_queue_item_ids uuid[])
|
|
3847
|
+
RETURNS jsonb
|
|
3848
|
+
LANGUAGE plpgsql
|
|
3849
|
+
STABLE SECURITY DEFINER
|
|
3850
|
+
SET search_path TO 'public'
|
|
3851
|
+
AS $function$
|
|
3852
|
+
-- Set-based variant van pick_queue_cart_plan: het karplan wordt één keer per order
|
|
3853
|
+
-- opgebouwd en daarna per pickrij gesneden. Uitvoer: { "<queue-id>": {"plan":..} | {"error":..} }.
|
|
3854
|
+
DECLARE
|
|
3855
|
+
v_id uuid; item public.pick_queue; v_order_id uuid; v_key text; v_base jsonb; v_bases jsonb := '{}'::jsonb;
|
|
3856
|
+
v_orders uuid[]; v_oid uuid; v_plan jsonb; v_carts jsonb; v_seen jsonb; v_cart jsonb; v_onum text; v_ow jsonb;
|
|
3857
|
+
v_order_list jsonb; v_total integer; v_row_cart text; v_own jsonb; v_warnings jsonb; v_r jsonb;
|
|
3858
|
+
out jsonb := '{}'::jsonb;
|
|
3859
|
+
BEGIN
|
|
3860
|
+
IF _queue_item_ids IS NULL THEN RETURN out; END IF;
|
|
3861
|
+
IF cardinality(_queue_item_ids) > 200 THEN
|
|
3862
|
+
RAISE EXCEPTION 'pick_queue_cart_plans: maximaal 200 regels per aanroep';
|
|
3863
|
+
END IF;
|
|
3864
|
+
FOREACH v_id IN ARRAY _queue_item_ids LOOP
|
|
3865
|
+
BEGIN
|
|
3866
|
+
SELECT * INTO item FROM public.pick_queue WHERE id = v_id;
|
|
3867
|
+
IF NOT FOUND THEN RAISE EXCEPTION 'Deze pickrij bestaat niet meer (vervangen of afgehandeld); ververs de pickwachtrij.' USING ERRCODE = 'P0002'; END IF;
|
|
3868
|
+
BEGIN v_order_id := nullif(coalesce(item.payload->>'orderId', item.payload->>'order_id'), '')::uuid;
|
|
3869
|
+
EXCEPTION WHEN invalid_text_representation THEN v_order_id := NULL; END;
|
|
3870
|
+
IF v_order_id IS NULL THEN RAISE EXCEPTION 'Geen order-id beschikbaar voor het karplan.'; END IF;
|
|
3871
|
+
v_key := v_order_id::text;
|
|
3872
|
+
|
|
3873
|
+
IF NOT (v_bases ? v_key) THEN
|
|
3874
|
+
BEGIN
|
|
3875
|
+
v_orders := public.pick_buffer_order_ids(v_order_id);
|
|
3876
|
+
IF v_orders IS NULL OR cardinality(v_orders) = 0 THEN v_orders := ARRAY[v_order_id]; END IF;
|
|
3877
|
+
v_carts := '[]'::jsonb; v_seen := '{}'::jsonb; v_order_list := '[]'::jsonb;
|
|
3878
|
+
FOREACH v_oid IN ARRAY v_orders LOOP
|
|
3879
|
+
v_plan := public.logistics_cart_slip_plan(v_oid);
|
|
3880
|
+
SELECT o.order_number INTO v_onum FROM public.orders o WHERE o.id = v_oid;
|
|
3881
|
+
v_ow := CASE WHEN jsonb_typeof(v_plan->'warnings') = 'array' THEN v_plan->'warnings' ELSE '[]'::jsonb END;
|
|
3882
|
+
v_order_list := v_order_list || jsonb_build_array(jsonb_build_object('orderId', v_oid, 'orderNumber', v_onum, 'warnings', v_ow));
|
|
3883
|
+
FOR v_cart IN SELECT c FROM jsonb_array_elements(COALESCE(v_plan->'carts', '[]'::jsonb)) AS c LOOP
|
|
3884
|
+
IF NOT (v_seen ? coalesce(v_cart->>'cartId', '')) THEN
|
|
3885
|
+
v_seen := v_seen || jsonb_build_object(coalesce(v_cart->>'cartId', ''), true);
|
|
3886
|
+
v_carts := v_carts || jsonb_build_array(public.logistics_cart_json_fixed(v_cart || jsonb_build_object('orderId', v_oid, 'orderNumber', v_onum)));
|
|
3887
|
+
END IF;
|
|
3888
|
+
END LOOP;
|
|
3889
|
+
END LOOP;
|
|
3890
|
+
SELECT coalesce(max((e->>'cartTotal')::int), jsonb_array_length(v_carts)) INTO v_total FROM jsonb_array_elements(v_carts) e;
|
|
3891
|
+
SELECT COALESCE(jsonb_agg(DISTINCT w.value), '[]'::jsonb) INTO v_warnings
|
|
3892
|
+
FROM jsonb_array_elements(v_order_list) o CROSS JOIN LATERAL jsonb_array_elements(o->'warnings') w;
|
|
3893
|
+
v_base := jsonb_build_object('isBuffer', cardinality(v_orders) > 1, 'total', v_total,
|
|
3894
|
+
'carts', v_carts, 'orders', v_order_list, 'warnings', v_warnings);
|
|
3895
|
+
EXCEPTION WHEN others THEN
|
|
3896
|
+
v_base := jsonb_build_object('error', SQLERRM);
|
|
3897
|
+
END;
|
|
3898
|
+
v_bases := v_bases || jsonb_build_object(v_key, v_base);
|
|
3899
|
+
END IF;
|
|
3900
|
+
|
|
3901
|
+
v_base := v_bases->v_key;
|
|
3902
|
+
IF v_base ? 'error' THEN RAISE EXCEPTION '%', v_base->>'error'; END IF;
|
|
3903
|
+
|
|
3904
|
+
v_row_cart := nullif(btrim(coalesce(item.payload->>'cartId', '')), '');
|
|
3905
|
+
v_own := NULL;
|
|
3906
|
+
IF v_row_cart IS NOT NULL THEN
|
|
3907
|
+
SELECT e INTO v_own FROM jsonb_array_elements(v_base->'carts') AS e WHERE e->>'cartId' = v_row_cart LIMIT 1;
|
|
3908
|
+
IF v_own IS NULL THEN RAISE EXCEPTION 'De kar van deze rij bestaat niet meer in het karplan; ververs de pickwachtrij.'; END IF;
|
|
3909
|
+
v_total := coalesce((v_own->>'cartTotal')::int, (v_base->>'total')::int);
|
|
3910
|
+
v_r := jsonb_build_object('orderId', v_order_id, 'isBuffer', v_base->'isBuffer',
|
|
3911
|
+
'totalCarts', v_total, 'cartTotal', v_total, 'rowCartId', v_row_cart,
|
|
3912
|
+
'carts', jsonb_build_array(v_own), 'orders', v_base->'orders',
|
|
3913
|
+
'warnings', CASE WHEN coalesce((v_own->>'cartSeq')::int, 1) = 1 THEN v_base->'warnings' ELSE '[]'::jsonb END,
|
|
3914
|
+
'wachtTot', item.payload->'wachtTot', 'wachtReden', item.payload->'wachtReden',
|
|
3915
|
+
'printbaar', coalesce((item.payload->>'printbaar')::boolean, true));
|
|
3916
|
+
ELSE
|
|
3917
|
+
v_r := jsonb_build_object('orderId', v_order_id, 'isBuffer', v_base->'isBuffer',
|
|
3918
|
+
'totalCarts', (v_base->>'total')::int, 'cartTotal', (v_base->>'total')::int,
|
|
3919
|
+
'carts', v_base->'carts', 'orders', v_base->'orders', 'warnings', v_base->'warnings');
|
|
3920
|
+
END IF;
|
|
3921
|
+
-- Zelfde aanvulling als pick_queue_cart_plan(uuid)
|
|
3922
|
+
v_r := v_r || jsonb_build_object(
|
|
3923
|
+
'cartCrates', CASE WHEN v_own IS NOT NULL THEN v_own->'cartCrates' END,
|
|
3924
|
+
'bufferCrates', CASE WHEN v_own IS NOT NULL THEN v_own->'bufferCrates' END,
|
|
3925
|
+
'departureAt', CASE WHEN v_own IS NOT NULL THEN v_own->'departureAt' END,
|
|
3926
|
+
'pickStartsAt', CASE WHEN v_own IS NOT NULL THEN v_own->'pickStartsAt' END,
|
|
3927
|
+
'releaseAt', CASE WHEN v_own IS NOT NULL THEN v_own->'releaseAt' END,
|
|
3928
|
+
'releaseReason', CASE WHEN v_own IS NOT NULL THEN v_own->'releaseReason' END);
|
|
3929
|
+
out := out || jsonb_build_object(v_id::text, jsonb_build_object('plan', v_r));
|
|
3930
|
+
EXCEPTION WHEN others THEN
|
|
3931
|
+
out := out || jsonb_build_object(v_id::text, jsonb_build_object('error', SQLERRM));
|
|
3932
|
+
END;
|
|
3933
|
+
END LOOP;
|
|
3934
|
+
RETURN out;
|
|
3935
|
+
END $function$;
|
|
3936
|
+
|
|
3846
3937
|
CREATE OR REPLACE FUNCTION public.pick_verify_rows(_rows jsonb)
|
|
3847
3938
|
RETURNS jsonb
|
|
3848
3939
|
LANGUAGE plpgsql
|
|
3849
3940
|
STABLE
|
|
3850
3941
|
SET search_path TO 'public'
|
|
3851
3942
|
AS $function$
|
|
3852
|
-
|
|
3943
|
+
-- Set-based: karplan één keer per order (pick_queue_cart_plans), Engine-status één keer per ref.
|
|
3944
|
+
DECLARE r jsonb; out jsonb := '[]'::jsonb; v_ids uuid[] := '{}'; v_plans jsonb := '{}'::jsonb;
|
|
3945
|
+
v_status_cache jsonb := '{}'::jsonb; v_status jsonb; v_ref text; v_err text; v_p jsonb; v_id uuid;
|
|
3853
3946
|
BEGIN
|
|
3854
3947
|
IF jsonb_typeof(_rows) <> 'array' THEN RETURN out; END IF;
|
|
3855
3948
|
IF jsonb_array_length(_rows) > 200 THEN
|
|
3856
3949
|
RAISE EXCEPTION 'pick_verify_rows: maximaal 200 regels per aanroep';
|
|
3857
3950
|
END IF;
|
|
3858
3951
|
FOR r IN SELECT * FROM jsonb_array_elements(_rows) LOOP
|
|
3859
|
-
|
|
3952
|
+
BEGIN v_id := (r->>'id')::uuid; EXCEPTION WHEN others THEN v_id := NULL; END;
|
|
3953
|
+
IF v_id IS NOT NULL THEN v_ids := v_ids || v_id; END IF;
|
|
3954
|
+
END LOOP;
|
|
3955
|
+
BEGIN
|
|
3956
|
+
v_plans := public.pick_queue_cart_plans(v_ids);
|
|
3957
|
+
EXCEPTION WHEN others THEN v_err := SQLERRM;
|
|
3958
|
+
END;
|
|
3959
|
+
FOR r IN SELECT * FROM jsonb_array_elements(_rows) LOOP
|
|
3860
3960
|
v_ref := NULLIF(r->>'ref', '');
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3961
|
+
v_p := v_plans->(r->>'id');
|
|
3962
|
+
v_status := NULL;
|
|
3963
|
+
IF v_ref IS NOT NULL AND v_p IS NOT NULL AND NOT (v_p ? 'error') THEN
|
|
3964
|
+
IF v_status_cache ? v_ref THEN
|
|
3965
|
+
v_status := v_status_cache->v_ref;
|
|
3966
|
+
ELSE
|
|
3967
|
+
BEGIN
|
|
3968
|
+
v_status := to_jsonb(public.logistics_cart_plan_status(v_ref));
|
|
3969
|
+
EXCEPTION WHEN others THEN v_status := jsonb_build_object('__error', SQLERRM);
|
|
3970
|
+
END;
|
|
3971
|
+
v_status_cache := v_status_cache || jsonb_build_object(v_ref, coalesce(v_status, 'null'::jsonb));
|
|
3865
3972
|
END IF;
|
|
3866
|
-
|
|
3867
|
-
END;
|
|
3868
|
-
out := out || jsonb_build_array(jsonb_build_object(
|
|
3973
|
+
IF v_status = 'null'::jsonb THEN v_status := NULL; END IF;
|
|
3974
|
+
END IF;
|
|
3975
|
+
out := out || jsonb_build_array(jsonb_build_object(
|
|
3976
|
+
'id', r->>'id',
|
|
3977
|
+
'plan', CASE WHEN v_status ? '__error' THEN NULL ELSE v_p->'plan' END,
|
|
3978
|
+
'status', CASE WHEN v_status ? '__error' THEN NULL ELSE v_status END,
|
|
3979
|
+
'error', coalesce(v_err, v_p->>'error', v_status->>'__error',
|
|
3980
|
+
CASE WHEN v_p IS NULL THEN 'Deze pickrij bestaat niet meer (vervangen of afgehandeld); ververs de pickwachtrij.' END)));
|
|
3869
3981
|
END LOOP;
|
|
3870
3982
|
RETURN out;
|
|
3871
3983
|
END $function$;
|
|
@@ -3919,6 +4031,26 @@ BEGIN
|
|
|
3919
4031
|
v := v || jsonb_build_object('niveau','fout','tekst','Functie zonder interne controle: '||t);
|
|
3920
4032
|
END IF;
|
|
3921
4033
|
END LOOP;
|
|
4034
|
+
-- 1.0.67: stickerbundel levert printopdrachten en stickervraag.
|
|
4035
|
+
v_oid := to_regprocedure('public.pickstation_cart_sticker_states(text,uuid[])');
|
|
4036
|
+
IF v_oid IS NULL THEN
|
|
4037
|
+
v := v || jsonb_build_object('niveau','fout','tekst','Pickschermen: stickerbundel ontbreekt (pickstation_cart_sticker_states).');
|
|
4038
|
+
ELSIF position('''opdrachten''' IN pg_get_functiondef(v_oid)) = 0 THEN
|
|
4039
|
+
v := v || jsonb_build_object('niveau','fout','tekst','Pickschermen: stickerbundel levert geen printopdrachten.');
|
|
4040
|
+
ELSE
|
|
4041
|
+
v := v || jsonb_build_object('niveau','info','tekst','Pickschermen: stickerbundel levert printopdrachten.');
|
|
4042
|
+
END IF;
|
|
4043
|
+
-- 1.0.71: pickregels-controle set-based (één karplan per order).
|
|
4044
|
+
v_oid := to_regprocedure('public.pick_verify_rows(jsonb)');
|
|
4045
|
+
IF to_regprocedure('public.pick_queue_cart_plans(uuid[])') IS NULL OR v_oid IS NULL
|
|
4046
|
+
OR position('pick_queue_cart_plans' IN pg_get_functiondef(v_oid)) = 0 THEN
|
|
4047
|
+
v := v || jsonb_build_object('niveau','fout','tekst','Pickschermen: controle pickregels nog per kar; kan bij grote orders vastlopen (pick_queue_cart_plans ontbreekt).');
|
|
4048
|
+
ELSE
|
|
4049
|
+
v := v || jsonb_build_object('niveau','info','tekst','Pickschermen: controle pickregels set-based (één karplan per order).');
|
|
4050
|
+
END IF;
|
|
4051
|
+
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='order_items' AND column_name='needs_sticker') THEN
|
|
4052
|
+
v := v || jsonb_build_object('niveau','waarschuwing','tekst','Pickschermen: stickervraag per orderregel niet leesbaar (order_items.needs_sticker ontbreekt, Verkoop).');
|
|
4053
|
+
END IF;
|
|
3922
4054
|
SELECT true, device_key_required INTO v_rij, v_req FROM public.pick_settings WHERE id;
|
|
3923
4055
|
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
4056
|
ELSIF NOT v_req THEN v := v || jsonb_build_object('niveau','waarschuwing','tekst','Apparaatsleutel nog niet verplicht.'); END IF;
|
|
@@ -3970,7 +4102,7 @@ BEGIN
|
|
|
3970
4102
|
FOREACH t IN ARRAY ARRAY['pick_buffer_event_cursor','pick_countries','pick_document_statuses','pick_document_types','pick_queue','pick_queue_locks','pick_screen_document_types','pick_settings','pick_station_devices','pick_station_heartbeats','pick_station_history','pick_station_logs','pick_station_pair_codes','pick_station_permissions','pick_station_printers','pick_station_screens','pick_station_signals','pick_station_tasks','pick_station_types','pick_station_users','pick_stations','pick_sync_state','pick_taken','pick_task_document_types'] LOOP
|
|
3971
4103
|
IF to_regclass('public.'||t) IS NULL THEN v_mis := v_mis || ('tabel '||t); END IF;
|
|
3972
4104
|
END LOOP;
|
|
3973
|
-
FOREACH t IN ARRAY string_to_array('_pick_job_of_station(uuid,uuid);_pick_printstatus_via_engine();_pick_station_for_cart(uuid);_pick_sticker_ids_for_cart(uuid);pick_active_printers();pick_active_printers(text);pick_apply_buffer_events();pick_apply_buffer_events(text);pick_assert_printable(pick_queue);pick_assert_station(text);pick_available_pick_days(integer);pick_available_pick_days(text,integer);pick_buffer_order_ids(uuid);pick_build_key_variants();pick_cart_breakdown(uuid);pick_claim_document(text,uuid,uuid,uuid,text,integer);pick_claim_document(uuid,uuid,uuid,text,integer);pick_claim_next_document(text,uuid,uuid,text,text,integer,date);pick_claim_next_document(uuid,uuid,text,text,integer,date);pick_cleanup_maintenance(integer,integer);pick_complete_print(text,uuid,uuid,text);pick_complete_print(uuid,uuid,text);pick_complete_print_cart(text,uuid,uuid,text,text);pick_complete_print_cart(uuid,uuid,text,text);pick_complete_print_carts(text,uuid,text,text[]);pick_complete_print_carts(uuid,text,text[]);pick_create_pair_code(uuid);pick_current_pick_day();pick_current_pick_day(text);pick_day_counts(text,uuid,uuid,date);pick_day_counts(uuid,uuid,date);pick_device_check(text,uuid,uuid,text,text,text);pick_device_gate(text);pick_device_key_required();pick_document_layout_data(uuid);pick_enqueue_print_job(text,uuid,uuid,text,boolean);pick_enqueue_print_job(text,uuid,uuid,text,boolean,text);pick_enqueue_print_job(uuid,uuid,text,boolean);pick_enqueue_print_job(uuid,uuid,text,boolean,text);pick_enqueue_print_job_from_cart(uuid,uuid,text,boolean,text,jsonb);pick_ensure_settings();pick_find_sent_elsewhere(uuid,text);pick_has_station_role();pick_is_reference_admin();pick_is_server();pick_key_hash(text);pick_mark_printed(text,uuid,text,text);pick_mark_printed(uuid,text,text);pick_order_context(uuid,text);pick_preview_job(text,text,uuid);pick_preview_job(text,uuid);pick_print_job_status(text,uuid);pick_print_job_status(uuid);pick_print_jobs_status(text,uuid[]);pick_print_jobs_status(uuid[]);pick_print_plekken();pick_print_plekken(text);pick_protect_required_reference_rows();pick_queue_apply_cart_breakdown();pick_queue_audit();pick_queue_cart_plan(text,uuid);pick_queue_cart_plan(uuid);pick_queue_cart_plan_v152(uuid);pick_queue_enforce_routing();pick_read_by_code(text,text,uuid);pick_read_country_counts(text,uuid,uuid);pick_read_locks(text,uuid);pick_read_print_job_uitwijk(text,uuid[]);pick_read_queue(text,uuid,uuid,text,text,uuid,boolean,boolean,text,jsonb,integer,integer);pick_read_station(text,text);pick_read_unscanned_earlier(text,uuid,text);pick_read_vroege_sticker_waarschuwing(text,uuid);pick_reference_data_status();pick_reference_data_status(text);pick_release_expired_locks();pick_release_expired_locks(text);pick_release_lock(text,uuid);pick_release_lock(uuid);pick_report_missing_cart_plan();pick_report_missing_cart_plan(text);pick_reprint_cart(text,uuid,text,text,integer);pick_reprint_cart(uuid,text,text,integer);pick_reprint_document(text,uuid,text,integer);pick_reprint_document(uuid,text,integer);pick_reset_print(text,uuid,text);pick_reset_print(text,uuid,text,text);pick_reset_print(uuid,text);pick_reset_print(uuid,text,text);pick_reset_print_job(text,uuid,text,text,uuid);pick_reset_print_job(uuid,text,text,uuid);pick_reset_print_jobs(text,uuid,text,uuid[],text[]);pick_reset_print_jobs(uuid,text,uuid[],text[]);pick_resolve_scan_code(text,text);pick_restore_to_queue(text,uuid,text);pick_restore_to_queue(uuid,text);pick_revoke_device(uuid);pick_role_allowed(text);pick_seed_reference_data();pick_set_station_print_plek(text,uuid,uuid);pick_set_station_print_plek(uuid,uuid);pick_signal_station(uuid);pick_signal_trg();pick_station_cleanup_print_plek();pick_station_dashboard();pick_station_dashboard(text);pick_station_devices_list(uuid);pick_station_print_plek(text,uuid);pick_station_print_plek(uuid);pick_station_print_plekken();pick_station_print_plekken(text);pick_station_slugify(text,uuid);pick_stations_set_slug();pick_sticker_past_controle(uuid);pick_sync_pick_day(date);pick_sync_pick_day(text,date);pick_sync_queue_throttled(integer);pick_sync_queue_throttled(text,integer);pick_touch_updated_at();pick_verify_rows(jsonb);pick_verify_rows(text,jsonb);pickschermen_install_check();pickschermen_missing_objects();pickstation_auto_send_status(text,text,uuid);pickstation_auto_send_status(text,uuid);pickstation_cart_sticker_state(text,text,uuid);pickstation_cart_sticker_state(text,uuid);pickstation_cart_sticker_states(text,text,uuid[]);pickstation_cart_sticker_states(text,uuid[]);pickstation_device_status(text,text);pickstation_document_for_order(text,text,uuid);pickstation_document_for_order(text,uuid);pickstation_get_orders_raw();pickstation_get_orders_raw(text);pickstation_get_planning_context();pickstation_get_planning_context(text);pickstation_get_settings();pickstation_get_settings(text);pickstation_log_print(text,text,text,text,text[],text);pickstation_log_print(text,text,text,text[],text);pickstation_logistics_barcode_lookup(text,text);pickstation_logistics_cart_plan_status(text,text);pickstation_logistics_cart_slip_plan(text,uuid);pickstation_logistics_is_pick_workday(text,date);pickstation_logistics_order_released(text,text);pickstation_logistics_pick_mode(text);pickstation_logistics_shipping_note_from_barcode(text,text,boolean,uuid);pickstation_logistics_working_hours_status(text);pickstation_order_sticker_meldingen(text,text,uuid);pickstation_order_sticker_meldingen(text,uuid);pickstation_pair_device(text,text,text);pickstation_print_status(text,text,uuid[]);pickstation_print_status(text,uuid[]);pickstation_resolve_delivery_orders(text,text[]);pickstation_resolve_delivery_orders(text[]);pickstation_set_cart_status(text,text,integer,text);pickstation_sticker_past_controle(text,text,uuid);pickstation_sticker_past_controle(text,uuid);pickstation_sticker_reprint(text,text,uuid,text);pickstation_sticker_reprint(text,uuid,text);sync_order_cart_totals()', ';') LOOP
|
|
4105
|
+
FOREACH t IN ARRAY string_to_array('_pick_job_of_station(uuid,uuid);_pick_printstatus_via_engine();_pick_station_for_cart(uuid);_pick_sticker_ids_for_cart(uuid);pick_active_printers();pick_active_printers(text);pick_apply_buffer_events();pick_apply_buffer_events(text);pick_assert_printable(pick_queue);pick_assert_station(text);pick_available_pick_days(integer);pick_available_pick_days(text,integer);pick_buffer_order_ids(uuid);pick_build_key_variants();pick_cart_breakdown(uuid);pick_claim_document(text,uuid,uuid,uuid,text,integer);pick_claim_document(uuid,uuid,uuid,text,integer);pick_claim_next_document(text,uuid,uuid,text,text,integer,date);pick_claim_next_document(uuid,uuid,text,text,integer,date);pick_cleanup_maintenance(integer,integer);pick_complete_print(text,uuid,uuid,text);pick_complete_print(uuid,uuid,text);pick_complete_print_cart(text,uuid,uuid,text,text);pick_complete_print_cart(uuid,uuid,text,text);pick_complete_print_carts(text,uuid,text,text[]);pick_complete_print_carts(uuid,text,text[]);pick_create_pair_code(uuid);pick_current_pick_day();pick_current_pick_day(text);pick_day_counts(text,uuid,uuid,date);pick_day_counts(uuid,uuid,date);pick_device_check(text,uuid,uuid,text,text,text);pick_device_gate(text);pick_device_key_required();pick_document_layout_data(uuid);pick_enqueue_print_job(text,uuid,uuid,text,boolean);pick_enqueue_print_job(text,uuid,uuid,text,boolean,text);pick_enqueue_print_job(uuid,uuid,text,boolean);pick_enqueue_print_job(uuid,uuid,text,boolean,text);pick_enqueue_print_job_from_cart(uuid,uuid,text,boolean,text,jsonb);pick_ensure_settings();pick_find_sent_elsewhere(uuid,text);pick_has_station_role();pick_is_reference_admin();pick_is_server();pick_key_hash(text);pick_mark_printed(text,uuid,text,text);pick_mark_printed(uuid,text,text);pick_order_context(uuid,text);pick_preview_job(text,text,uuid);pick_preview_job(text,uuid);pick_print_job_status(text,uuid);pick_print_job_status(uuid);pick_print_jobs_status(text,uuid[]);pick_print_jobs_status(uuid[]);pick_print_plekken();pick_print_plekken(text);pick_protect_required_reference_rows();pick_queue_apply_cart_breakdown();pick_queue_audit();pick_queue_cart_plan(text,uuid);pick_queue_cart_plan(uuid);pick_queue_cart_plan_v152(uuid);pick_queue_cart_plans(uuid[]);pick_queue_enforce_routing();pick_read_by_code(text,text,uuid);pick_read_country_counts(text,uuid,uuid);pick_read_locks(text,uuid);pick_read_print_job_uitwijk(text,uuid[]);pick_read_queue(text,uuid,uuid,text,text,uuid,boolean,boolean,text,jsonb,integer,integer);pick_read_station(text,text);pick_read_unscanned_earlier(text,uuid,text);pick_read_vroege_sticker_waarschuwing(text,uuid);pick_reference_data_status();pick_reference_data_status(text);pick_release_expired_locks();pick_release_expired_locks(text);pick_release_lock(text,uuid);pick_release_lock(uuid);pick_report_missing_cart_plan();pick_report_missing_cart_plan(text);pick_reprint_cart(text,uuid,text,text,integer);pick_reprint_cart(uuid,text,text,integer);pick_reprint_document(text,uuid,text,integer);pick_reprint_document(uuid,text,integer);pick_reset_print(text,uuid,text);pick_reset_print(text,uuid,text,text);pick_reset_print(uuid,text);pick_reset_print(uuid,text,text);pick_reset_print_job(text,uuid,text,text,uuid);pick_reset_print_job(uuid,text,text,uuid);pick_reset_print_jobs(text,uuid,text,uuid[],text[]);pick_reset_print_jobs(uuid,text,uuid[],text[]);pick_resolve_scan_code(text,text);pick_restore_to_queue(text,uuid,text);pick_restore_to_queue(uuid,text);pick_revoke_device(uuid);pick_role_allowed(text);pick_seed_reference_data();pick_set_station_print_plek(text,uuid,uuid);pick_set_station_print_plek(uuid,uuid);pick_signal_station(uuid);pick_signal_trg();pick_station_cleanup_print_plek();pick_station_dashboard();pick_station_dashboard(text);pick_station_devices_list(uuid);pick_station_print_plek(text,uuid);pick_station_print_plek(uuid);pick_station_print_plekken();pick_station_print_plekken(text);pick_station_slugify(text,uuid);pick_stations_set_slug();pick_sticker_past_controle(uuid);pick_sync_pick_day(date);pick_sync_pick_day(text,date);pick_sync_queue_throttled(integer);pick_sync_queue_throttled(text,integer);pick_touch_updated_at();pick_verify_rows(jsonb);pick_verify_rows(text,jsonb);pickschermen_install_check();pickschermen_missing_objects();pickstation_auto_send_status(text,text,uuid);pickstation_auto_send_status(text,uuid);pickstation_cart_sticker_state(text,text,uuid);pickstation_cart_sticker_state(text,uuid);pickstation_cart_sticker_states(text,text,uuid[]);pickstation_cart_sticker_states(text,uuid[]);pickstation_device_status(text,text);pickstation_document_for_order(text,text,uuid);pickstation_document_for_order(text,uuid);pickstation_get_orders_raw();pickstation_get_orders_raw(text);pickstation_get_planning_context();pickstation_get_planning_context(text);pickstation_get_settings();pickstation_get_settings(text);pickstation_log_print(text,text,text,text,text[],text);pickstation_log_print(text,text,text,text[],text);pickstation_logistics_barcode_lookup(text,text);pickstation_logistics_cart_plan_status(text,text);pickstation_logistics_cart_slip_plan(text,uuid);pickstation_logistics_is_pick_workday(text,date);pickstation_logistics_order_released(text,text);pickstation_logistics_pick_mode(text);pickstation_logistics_shipping_note_from_barcode(text,text,boolean,uuid);pickstation_logistics_working_hours_status(text);pickstation_order_sticker_meldingen(text,text,uuid);pickstation_order_sticker_meldingen(text,uuid);pickstation_pair_device(text,text,text);pickstation_print_status(text,text,uuid[]);pickstation_print_status(text,uuid[]);pickstation_resolve_delivery_orders(text,text[]);pickstation_resolve_delivery_orders(text[]);pickstation_set_cart_status(text,text,integer,text);pickstation_sticker_past_controle(text,text,uuid);pickstation_sticker_past_controle(text,uuid);pickstation_sticker_reprint(text,text,uuid,text);pickstation_sticker_reprint(text,uuid,text);sync_order_cart_totals()', ';') LOOP
|
|
3974
4106
|
IF to_regprocedure('public.'||t) IS NULL THEN v_mis := v_mis || ('functie '||t); END IF;
|
|
3975
4107
|
END LOOP;
|
|
3976
4108
|
-- Alleen verwacht als de Engine-tabel logistics_tasks bestaat.
|
|
@@ -4066,7 +4198,7 @@ CREATE OR REPLACE FUNCTION public.pickstation_cart_sticker_states(p_slug text, p
|
|
|
4066
4198
|
RETURNS jsonb LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path = public AS $$
|
|
4067
4199
|
DECLARE v_station uuid; c uuid; v_stand jsonb; v_fit jsonb; v_meld jsonb; v_order uuid;
|
|
4068
4200
|
v_jobs uuid[]; v_uitwijk jsonb; out jsonb := '[]'::jsonb; v_has_uitwijk boolean;
|
|
4069
|
-
v_opdr jsonb; v_tz text;
|
|
4201
|
+
v_opdr jsonb; v_tz text; v_has_ns boolean; v_gevr boolean;
|
|
4070
4202
|
BEGIN
|
|
4071
4203
|
IF p_slug IS NOT NULL AND btrim(p_slug) <> '' THEN
|
|
4072
4204
|
SELECT s.id INTO v_station FROM public.pick_stations s WHERE s.slug = p_slug AND s.active IS TRUE LIMIT 1;
|
|
@@ -4083,6 +4215,8 @@ BEGIN
|
|
|
4083
4215
|
END IF;
|
|
4084
4216
|
v_has_uitwijk := EXISTS (SELECT 1 FROM information_schema.columns
|
|
4085
4217
|
WHERE table_schema='public' AND table_name='print_jobs' AND column_name='uitwijk');
|
|
4218
|
+
v_has_ns := EXISTS (SELECT 1 FROM information_schema.columns
|
|
4219
|
+
WHERE table_schema='public' AND table_name='order_items' AND column_name='needs_sticker');
|
|
4086
4220
|
FOREACH c IN ARRAY (SELECT array_agg(DISTINCT x) FROM unnest(p_cart_ids[1:200]) x WHERE x IS NOT NULL) LOOP
|
|
4087
4221
|
BEGIN
|
|
4088
4222
|
v_stand := public.pickstation_cart_sticker_state(p_slug => p_slug, p_cart_id => c);
|
|
@@ -4119,6 +4253,14 @@ BEGIN
|
|
|
4119
4253
|
WHERE pj.payload->>'cart_id' = c::text
|
|
4120
4254
|
AND pj.documenttype ILIKE '%sticker%';
|
|
4121
4255
|
EXCEPTION WHEN OTHERS THEN v_opdr := NULL; END;
|
|
4256
|
+
-- Stickervraag: minstens één orderregel op de kar met needs_sticker (Verkoop). null = onleesbaar.
|
|
4257
|
+
v_gevr := NULL;
|
|
4258
|
+
IF v_has_ns THEN
|
|
4259
|
+
BEGIN
|
|
4260
|
+
EXECUTE 'SELECT EXISTS (SELECT 1 FROM public.order_cart_items oci JOIN public.order_items oi ON oi.id = oci.order_item_id
|
|
4261
|
+
WHERE oci.cart_id = $1 AND oi.needs_sticker IS TRUE)' INTO v_gevr USING c;
|
|
4262
|
+
EXCEPTION WHEN OTHERS THEN v_gevr := NULL; END;
|
|
4263
|
+
END IF;
|
|
4122
4264
|
v_uitwijk := '[]'::jsonb;
|
|
4123
4265
|
IF v_has_uitwijk THEN
|
|
4124
4266
|
BEGIN
|
|
@@ -4135,7 +4277,7 @@ BEGIN
|
|
|
4135
4277
|
EXCEPTION WHEN OTHERS THEN v_uitwijk := '[]'::jsonb; END;
|
|
4136
4278
|
END IF;
|
|
4137
4279
|
out := out || jsonb_build_array(jsonb_build_object('cart_id', c, 'toegang', true, 'order_id', v_order,
|
|
4138
|
-
'stand', v_stand, 'controle', v_fit, 'meldingen', v_meld, 'uitwijk', v_uitwijk, 'opdrachten', v_opdr));
|
|
4280
|
+
'stand', v_stand, 'controle', v_fit, 'meldingen', v_meld, 'uitwijk', v_uitwijk, 'opdrachten', v_opdr, 'sticker_gevraagd', v_gevr));
|
|
4139
4281
|
END LOOP;
|
|
4140
4282
|
RETURN jsonb_build_object('toegang', true, 'tijdzone', v_tz, 'karren', out);
|
|
4141
4283
|
END $$;
|
|
@@ -5287,6 +5429,7 @@ DO $g$ BEGIN IF to_regprocedure('public.pick_sync_pick_day(text,date)') IS NOT N
|
|
|
5287
5429
|
DO $g$ BEGIN IF to_regprocedure('public.pick_sync_queue_throttled(integer)') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_sync_queue_throttled(integer) TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5288
5430
|
DO $g$ BEGIN IF to_regprocedure('public.pick_sync_queue_throttled(text,integer)') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_sync_queue_throttled(text,integer) TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5289
5431
|
DO $g$ BEGIN IF to_regprocedure('public.pick_touch_updated_at()') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_touch_updated_at() TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5432
|
+
DO $g$ BEGIN IF to_regprocedure('public.pick_queue_cart_plans(uuid[])') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_queue_cart_plans(uuid[]) TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5290
5433
|
DO $g$ BEGIN IF to_regprocedure('public.pick_verify_rows(jsonb)') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_verify_rows(jsonb) TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5291
5434
|
DO $g$ BEGIN IF to_regprocedure('public.pick_verify_rows(text,jsonb)') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pick_verify_rows(text,jsonb) TO anon, authenticated, service_role'; END IF; END $g$;
|
|
5292
5435
|
DO $g$ BEGIN IF to_regprocedure('public.pickschermen_install_check()') IS NOT NULL THEN EXECUTE 'GRANT EXECUTE ON FUNCTION public.pickschermen_install_check() TO authenticated, service_role'; END IF; END $g$;
|