@flowselections/pick-schermen-kwekers 1.0.64 → 1.0.68

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pick167.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pickStickerBundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickStickerBundle.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickStickerBundle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseCartStickerBundle } from "../pickStickerBundle.js";
3
+ describe("1.0.65 stickerstand in één aanroep", () => {
4
+ it("eigen kar: stand, uitwijk en job-ids", () => {
5
+ const r = parseCartStickerBundle({ toegang: true, karren: [{
6
+ cart_id: "c1", toegang: true, order_id: "o1",
7
+ stand: { toegang: true, stand: { totaal: 2, regels: [{ status: "geprint", kopieen: 2, printJobId: "j1" }] } },
8
+ controle: { toegang: true, controle: [] },
9
+ meldingen: { toegang: true, meldingen: [] },
10
+ uitwijk: [{ id: "j1", uitwijk: { uitwijkroute: "a4_vel", printerNaam: "Kantoor" } }],
11
+ }] });
12
+ expect(r[0].stand?.totaal).toBe(2);
13
+ expect(r[0].jobIds).toEqual(["j1"]);
14
+ expect(r[0].uitwijk.get("j1")?.route).toBe("a4_vel");
15
+ expect(r[0].orderId).toBe("o1");
16
+ });
17
+ it("kar van ander station: melding, geen stand", () => {
18
+ const r = parseCartStickerBundle({ toegang: true, karren: [{ cart_id: "c2", toegang: false, melding: "Hoort niet bij dit station" }] });
19
+ expect(r[0].toegang).toBe(false);
20
+ expect(r[0].melding).toBe("Hoort niet bij dit station");
21
+ expect(r[0].stand).toBeNull();
22
+ });
23
+ it("onleesbaar antwoord: lege lijst", () => {
24
+ expect(parseCartStickerBundle(null)).toEqual([]);
25
+ expect(parseCartStickerBundle({ toegang: false })).toEqual([]);
26
+ });
27
+ });
@@ -95,7 +95,7 @@ export const KEYED_RPCS = new Set([
95
95
  "pickstation_auto_send_status", "pickstation_cart_sticker_state", "pickstation_document_for_order",
96
96
  "pickstation_get_orders_raw", "pickstation_get_planning_context", "pickstation_get_settings", "pickstation_log_print",
97
97
  "pickstation_order_sticker_meldingen", "pickstation_resolve_delivery_orders", "pickstation_sticker_past_controle",
98
- "pickstation_sticker_reprint", "pickstation_print_status",
98
+ "pickstation_sticker_reprint", "pickstation_print_status", "pickstation_cart_sticker_states",
99
99
  "pick_read_station", "pick_read_locks", "pick_read_queue", "pick_read_country_counts", "pick_read_by_code",
100
100
  "pick_read_unscanned_earlier", "pick_resolve_scan_code", "pick_read_print_job_uitwijk", "pick_read_vroege_sticker_waarschuwing",
101
101
  ]);
@@ -24,4 +24,19 @@ 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
+ /** 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): string;
27
42
  //# 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,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"}
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;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,CAO7E;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,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,GACrB,MAAM,CAOR"}
@@ -84,3 +84,54 @@ export function stickerLine(s, uitwijk) {
84
84
  })
85
85
  .join(" · ");
86
86
  }
87
+ export function parseStickerOpdrachten(raw) {
88
+ if (!Array.isArray(raw))
89
+ return null;
90
+ return raw.flatMap((x) => {
91
+ if (!x || typeof x !== "object")
92
+ return [];
93
+ const o = x;
94
+ return [{ id: str(o["id"]), status: str(o["status"]), fase: str(o["fase"]), voltooidOp: str(o["voltooid_op"]), geplandOp: str(o["gepland_op"]), reden: str(o["reden"]) }];
95
+ });
96
+ }
97
+ /** HH:MM in de vestigingstijdzone; zonder bekende tijdzone geen tijd (geen UTC-terugval). */
98
+ export function clockText(iso, tz) {
99
+ if (!iso || !tz)
100
+ return null;
101
+ const d = new Date(iso);
102
+ if (Number.isNaN(d.getTime()))
103
+ return null;
104
+ try {
105
+ return new Intl.DateTimeFormat("nl-NL", { hour: "2-digit", minute: "2-digit", timeZone: tz }).format(d);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ const FAILED = new Set(["mislukt", "geweigerd", "fout", "geannuleerd"]);
112
+ export function stickerOpdrachtText(o, tz, now = new Date()) {
113
+ if (o.status === "voltooid") {
114
+ const t = clockText(o.voltooidOp, tz);
115
+ return t ? `Sticker geprint ${t}` : "Sticker geprint";
116
+ }
117
+ if (o.status === "geannuleerd" && o.fase === "niet_nodig")
118
+ return "Sticker niet nodig – de koper wil geen sticker";
119
+ if (o.status && FAILED.has(o.status))
120
+ return `Sticker geweigerd: ${o.reden ?? "reden onbekend, meld dit bij kantoor"}`;
121
+ const plan = o.geplandOp ? new Date(o.geplandOp) : null;
122
+ if (plan && !Number.isNaN(plan.getTime()) && plan.getTime() > now.getTime()) {
123
+ const t = clockText(o.geplandOp, tz);
124
+ if (t)
125
+ return `Sticker volgt om ${t}`;
126
+ }
127
+ return "Sticker wordt geprint";
128
+ }
129
+ /** Regel per kar: printopdrachten gaan voor; "Geen stickers nodig" alleen zonder opdracht. */
130
+ export function stickerLineWithJobs(s, opdrachten, tz, uitwijk, now = new Date()) {
131
+ const list = Array.isArray(opdrachten) ? opdrachten : [];
132
+ if (list.length > 0) {
133
+ const seen = new Set();
134
+ return list.map((o) => stickerOpdrachtText(o, tz, now)).filter((t) => (seen.has(t) ? false : (seen.add(t), true))).join(" · ");
135
+ }
136
+ return stickerLine(s, uitwijk);
137
+ }
@@ -0,0 +1,20 @@
1
+ import { type CartStickerState, type StickerMelding } from "./pickStickers.js";
2
+ import { type StickerFit } from "./pick150.js";
3
+ import { type Uitwijk } from "./pickUitwijk.js";
4
+ import { type StickerOpdracht } from "./pick161.js";
5
+ export interface CartStickerBundleItem {
6
+ cartId: string;
7
+ toegang: boolean;
8
+ melding: string | null;
9
+ orderId: string | null;
10
+ stand: CartStickerState | null;
11
+ controle: StickerFit[] | null;
12
+ meldingen: StickerMelding[] | null;
13
+ uitwijk: Map<string, Uitwijk>;
14
+ jobIds: string[];
15
+ /** null = niet geleverd (oudere functie). */
16
+ opdrachten: StickerOpdracht[] | null;
17
+ tijdzone: string | null;
18
+ }
19
+ export declare function parseCartStickerBundle(raw: unknown): CartStickerBundleItem[];
20
+ //# sourceMappingURL=pickStickerBundle.d.ts.map
@@ -0,0 +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;CACzB;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,EAAE,CA6B5E"}
@@ -0,0 +1,40 @@
1
+ // Pickschermen 1.0.65: antwoord van pickstation_cart_sticker_states (alle
2
+ // karren in één aanroep). Per kar dezelfde vorm als de losse functies.
3
+ import { parsePickstationCartSticker, parsePickstationMeldingen } from "./pickStickers.js";
4
+ import { parseStickerFit } from "./pick150.js";
5
+ import { parseUitwijkList } from "./pickUitwijk.js";
6
+ import { parseStickerOpdrachten } from "./pick161.js";
7
+ const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
8
+ const txt = (v) => (typeof v === "string" && v.trim() ? v.trim() : null);
9
+ export function parseCartStickerBundle(raw) {
10
+ const r = rec(raw);
11
+ if (!r || r["toegang"] !== true || !Array.isArray(r["karren"]))
12
+ return [];
13
+ const tijdzone = txt(r["tijdzone"]);
14
+ return r["karren"].flatMap((x) => {
15
+ const k = rec(x);
16
+ const cartId = txt(k?.["cart_id"]);
17
+ if (!k || !cartId)
18
+ return [];
19
+ if (k["toegang"] !== true) {
20
+ return [{ cartId, toegang: false, melding: txt(k["melding"]), orderId: null, stand: null, controle: null, meldingen: null, uitwijk: new Map(), jobIds: [], opdrachten: null, tijdzone }];
21
+ }
22
+ const stand = parsePickstationCartSticker(k["stand"]);
23
+ const jobIds = Array.isArray(stand?.regels)
24
+ ? stand.regels.map((l) => l.printJobId).filter((v) => !!v).sort()
25
+ : [];
26
+ return [{
27
+ cartId,
28
+ toegang: true,
29
+ melding: null,
30
+ orderId: txt(k["order_id"]),
31
+ stand,
32
+ controle: k["controle"] == null ? null : parseStickerFit(k["controle"]),
33
+ meldingen: k["meldingen"] == null ? null : parsePickstationMeldingen(k["meldingen"]),
34
+ uitwijk: parseUitwijkList(k["uitwijk"]),
35
+ jobIds,
36
+ opdrachten: parseStickerOpdrachten(k["opdrachten"]),
37
+ tijdzone,
38
+ }];
39
+ });
40
+ }
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@flowselections/pick-schermen-kwekers",
3
- "version": "1.0.64",
3
+ "version": "1.0.68",
4
4
  "flowselections": {
5
5
  "moduleId": "pick-schermen",
6
+ "schema": {
7
+ "file": "schema/pickschermen.sql",
8
+ "order": 70
9
+ },
6
10
  "pages": [
7
11
  {
8
12
  "export": "PickstationsPage",
@@ -32,7 +36,8 @@
32
36
  },
33
37
  "files": [
34
38
  "dist-lib",
35
- "public"
39
+ "public",
40
+ "schema"
36
41
  ],
37
42
  "publishConfig": {
38
43
  "access": "public"