@flowselections/pick-schermen-kwekers 1.0.36 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
  2. package/dist-lib/components/pick/PickScherm.js +3 -2
  3. package/dist-lib/components/pick/ShippingNoteScan.js +1 -1
  4. package/dist-lib/components/pick/StickerState.d.ts +11 -0
  5. package/dist-lib/components/pick/StickerState.d.ts.map +1 -0
  6. package/dist-lib/components/pick/StickerState.js +45 -0
  7. package/dist-lib/index.d.ts +2 -0
  8. package/dist-lib/index.d.ts.map +1 -1
  9. package/dist-lib/index.js +2 -0
  10. package/dist-lib/integrations/supabase/types.d.ts +1024 -2
  11. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/types.js +1 -0
  13. package/dist-lib/lib/__tests__/pickPreview140.test.d.ts +2 -0
  14. package/dist-lib/lib/__tests__/pickPreview140.test.d.ts.map +1 -0
  15. package/dist-lib/lib/__tests__/pickPreview140.test.js +21 -0
  16. package/dist-lib/lib/__tests__/pickStickers.test.d.ts +2 -0
  17. package/dist-lib/lib/__tests__/pickStickers.test.d.ts.map +1 -0
  18. package/dist-lib/lib/__tests__/pickStickers.test.js +25 -0
  19. package/dist-lib/lib/__tests__/pickStickers138.test.d.ts +2 -0
  20. package/dist-lib/lib/__tests__/pickStickers138.test.d.ts.map +1 -0
  21. package/dist-lib/lib/__tests__/pickStickers138.test.js +32 -0
  22. package/dist-lib/lib/pickPreview.d.ts +2 -0
  23. package/dist-lib/lib/pickPreview.d.ts.map +1 -1
  24. package/dist-lib/lib/pickPreview.js +3 -1
  25. package/dist-lib/lib/pickRowState.d.ts +1 -1
  26. package/dist-lib/lib/pickRowState.d.ts.map +1 -1
  27. package/dist-lib/lib/pickRowState.js +1 -1
  28. package/dist-lib/lib/pickStickers.d.ts +41 -0
  29. package/dist-lib/lib/pickStickers.d.ts.map +1 -0
  30. package/dist-lib/lib/pickStickers.js +111 -0
  31. package/dist-lib/lib/pickTypes.js +2 -2
  32. package/package.json +5 -5
@@ -39,6 +39,7 @@ export const Constants = {
39
39
  "veilingbon",
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
+ "traysticker",
42
43
  ],
43
44
  doc_orientation: ["portrait", "landscape"],
44
45
  exact_env: ["staging", "live"],
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pickPreview140.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickPreview140.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickPreview140.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ const rpc = vi.fn();
3
+ vi.mock("../../integrations/supabase/client", () => ({ supabase: { rpc: (...a) => rpc(...a) } }));
4
+ import { fetchPickPreview, PREVIEW_LAYOUT_ONLY_MESSAGE, PREVIEW_UNAVAILABLE_MESSAGE } from "../pickPreview";
5
+ const run = () => fetchPickPreview({ stationSlug: "s", queueItemId: "q" });
6
+ describe("voorbeeld 1.0.40", () => {
7
+ it("layout zonder inhoud: voorbeeld niet beschikbaar", async () => {
8
+ rpc.mockResolvedValueOnce({ data: { layout_id: "abc" }, error: null });
9
+ await expect(run()).rejects.toMatchObject({ message: PREVIEW_LAYOUT_ONLY_MESSAGE, code: "voorbeeld_niet_beschikbaar" });
10
+ });
11
+ it("geen layout en geen inhoud", async () => {
12
+ rpc.mockResolvedValueOnce({ data: {}, error: null });
13
+ const e = await run().catch((x) => x);
14
+ expect(e.message).toBe(PREVIEW_UNAVAILABLE_MESSAGE);
15
+ expect(e.message).not.toMatch(/printen zou/);
16
+ });
17
+ it("foutmelding Engine letterlijk", async () => {
18
+ rpc.mockResolvedValueOnce({ data: { foutmelding: "Engine zegt nee" }, error: null });
19
+ await expect(run()).rejects.toMatchObject({ message: "Engine zegt nee" });
20
+ });
21
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pickStickers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickStickers.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickStickers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ vi.mock("@flowselections/core", () => ({ supabase: {} }));
3
+ import { parseCartStickerState, parseStickerMeldingen, stickerStatusLabel } from "../pickStickers";
4
+ import { parsePickCartPlan } from "../pickTypes";
5
+ describe("stickers (alleen lezen)", () => {
6
+ it("regels geen lijst: stand onbekend", () => {
7
+ expect(parseCartStickerState({ regels: "x" })).toBeNull();
8
+ expect(parseCartStickerState(null)).toBeNull();
9
+ });
10
+ it("stand per sticker letterlijk", () => {
11
+ const s = parseCartStickerState({ cartId: "c", totaal: 1, regels: [{ soort: "tray", status: "in_printwachtrij", reden: "r" }] });
12
+ expect(s.regels[0].reden).toBe("r");
13
+ expect(stickerStatusLabel("in_printwachtrij")).toMatch(/niet fysiek/);
14
+ expect(stickerStatusLabel("nieuw")).toBe("nieuw");
15
+ });
16
+ it("meldingen letterlijk, gesloten weg, onleesbaar = null", () => {
17
+ expect(parseStickerMeldingen([{ melding: "Let op X" }, { melding: "oud", status: "gesloten" }])).toEqual([{ id: null, tekst: "Let op X" }]);
18
+ expect(parseStickerMeldingen({ meldingen: [] })).toEqual([]);
19
+ expect(parseStickerMeldingen("x")).toBeNull();
20
+ });
21
+ it("cartSeq bepaalt Kar X", () => {
22
+ const p = parsePickCartPlan({ orderId: "o", cartTotal: 2, carts: [{ cartId: "a", cartSeq: 2, cartTotal: 2, items: [] }, { cartId: "b", cartSeq: 1, cartTotal: 2, items: [] }] });
23
+ expect(p.carts.map((c) => c.cartIndex).sort()).toEqual([1, 2]);
24
+ });
25
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pickStickers138.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickStickers138.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickStickers138.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, expect, it, vi, beforeEach } from "vitest";
2
+ const rpc = vi.fn();
3
+ vi.mock("@flowselections/core", () => ({ supabase: { rpc: (...a) => rpc(...a) } }));
4
+ import { fetchCartStickerState, fetchOrderStickerMeldingen, parsePickstationCartSticker, parsePickstationMeldingen, stickerSummary, stickerStatusLabel } from "../pickStickers";
5
+ const stand = (o) => ({ cartId: "c", totaal: 2, inPrintwachtrij: 0, wachtend: 0, geblokkeerd: 0, regels: [], ...o });
6
+ describe("1.0.38 omhulsel", () => {
7
+ beforeEach(() => rpc.mockReset());
8
+ it("herkent omhulsel, anders onbekend", () => {
9
+ expect(parsePickstationCartSticker({ toegang: true, stand: stand({}) })?.totaal).toBe(2);
10
+ expect(parsePickstationCartSticker({ toegang: false, reden: "niet_in_wachtrij_station" })).toBeNull();
11
+ expect(parsePickstationCartSticker({ stand: stand({}) })).toBeNull();
12
+ expect(parsePickstationCartSticker(stand({}))).toBeNull();
13
+ expect(parsePickstationMeldingen({ toegang: false })).toBeNull();
14
+ expect(parsePickstationMeldingen({ toegang: true, meldingen: [] })).toEqual([]);
15
+ });
16
+ it("totaal 0 en nooit klaar", () => {
17
+ expect(stickerSummary(stand({ totaal: 0 }))).toBe("Geen stickers nodig voor deze kar");
18
+ expect(stickerSummary(stand({ inPrintwachtrij: 2 }))).toBe("Alle stickers naar de printer gestuurd");
19
+ expect(stickerStatusLabel("klaar")).toBe("klaar om te printen");
20
+ });
21
+ it("met slug geen terugval naar logistics_*", async () => {
22
+ rpc.mockResolvedValue({ data: null, error: { message: "x" } });
23
+ await expect(fetchCartStickerState("c", "s")).rejects.toThrow();
24
+ await expect(fetchOrderStickerMeldingen("o", "s")).rejects.toThrow();
25
+ expect(rpc.mock.calls.map((c) => c[0])).toEqual(["pickstation_cart_sticker_state", "pickstation_order_sticker_meldingen"]);
26
+ });
27
+ it("zonder slug logistics_*", async () => {
28
+ rpc.mockResolvedValue({ data: stand({ totaal: 0 }), error: null });
29
+ expect((await fetchCartStickerState("c", null))?.totaal).toBe(0);
30
+ expect(rpc.mock.calls[0][0]).toBe("logistics_cart_sticker_state");
31
+ });
32
+ });
@@ -10,6 +10,8 @@ export interface PickPreviewResult {
10
10
  bron: string | null;
11
11
  layoutId: string | null;
12
12
  }
13
+ export declare const PREVIEW_UNAVAILABLE_MESSAGE = "Voorbeeld niet beschikbaar.";
14
+ export declare const PREVIEW_LAYOUT_ONLY_MESSAGE = "Voorbeeld niet beschikbaar. Het document wordt bij het printen opgemaakt met de ingestelde layout.";
13
15
  export declare class PickPreviewError extends Error {
14
16
  code: string;
15
17
  retryAfterSeconds: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,qFAAqF;IACrF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;CAMnF;AAcD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C7B"}
1
+ {"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,qFAAqF;IACrF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,2BAA2B,uGAC8D,CAAC;AAEvG,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;CAMnF;AAcD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C7B"}
@@ -2,6 +2,8 @@
2
2
  // RPC: pick_preview_job(_station_slug, _queue_item_id) -> jsonb
3
3
  // Deze module print hier nooit mee; de RPC raakt print_jobs niet aan.
4
4
  import { supabase } from "../integrations/supabase/client";
5
+ export const PREVIEW_UNAVAILABLE_MESSAGE = "Voorbeeld niet beschikbaar.";
6
+ export const PREVIEW_LAYOUT_ONLY_MESSAGE = "Voorbeeld niet beschikbaar. Het document wordt bij het printen opgemaakt met de ingestelde layout.";
5
7
  export class PickPreviewError extends Error {
6
8
  constructor(message, code, retryAfterSeconds = null) {
7
9
  super(message);
@@ -53,5 +55,5 @@ export async function fetchPickPreview(args) {
53
55
  if (html) {
54
56
  return { kind: "html", url: null, html, isObjectUrl: false, bron, layoutId };
55
57
  }
56
- throw new PickPreviewError("Er is geen actieve layout of inhoud voor dit documenttype; printen zou ook niet werken.", "layout_ontbreekt");
58
+ throw new PickPreviewError(layoutId ? PREVIEW_LAYOUT_ONLY_MESSAGE : PREVIEW_UNAVAILABLE_MESSAGE, layoutId ? "voorbeeld_niet_beschikbaar" : "layout_ontbreekt");
57
59
  }
@@ -1,5 +1,5 @@
1
1
  import type { PickPrintJob, PickQueueItem } from "./pickTypes";
2
- export declare const ROW_GONE_MESSAGE = "Deze pickrij is vervangen, ververs de wachtrij";
2
+ export declare const ROW_GONE_MESSAGE = "Deze pickrij bestaat niet meer (vervangen of afgehandeld); ververs de pickwachtrij.";
3
3
  export declare const RELEASE_PENDING_MESSAGE = "Het pickvenster voor deze order is nog niet begonnen; de pakbon kan nog niet worden opgebouwd of geprint.";
4
4
  export declare const NO_ROW_IN_FILTER_MESSAGE = "Geen rij in het filter om te printen.";
5
5
  /** Fout die betekent: deze rij of zijn kar bestaat niet meer (vervangen). */
@@ -1 +1 @@
1
- {"version":3,"file":"pickRowState.d.ts","sourceRoot":"","sources":["../../src/lib/pickRowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,gBAAgB,mDAAmD,CAAC;AACjF,eAAO,MAAM,uBAAuB,8GACyE,CAAC;AAC9G,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQlD;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAGxG;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAQ3F;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"pickRowState.d.ts","sourceRoot":"","sources":["../../src/lib/pickRowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,gBAAgB,wFAAwF,CAAC;AACtH,eAAO,MAAM,uBAAuB,8GACyE,CAAC;AAC9G,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQlD;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAGxG;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAQ3F;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -1,4 +1,4 @@
1
- export const ROW_GONE_MESSAGE = "Deze pickrij is vervangen, ververs de wachtrij";
1
+ export const ROW_GONE_MESSAGE = "Deze pickrij bestaat niet meer (vervangen of afgehandeld); ververs de pickwachtrij.";
2
2
  export const RELEASE_PENDING_MESSAGE = "Het pickvenster voor deze order is nog niet begonnen; de pakbon kan nog niet worden opgebouwd of geprint.";
3
3
  export const NO_ROW_IN_FILTER_MESSAGE = "Geen rij in het filter om te printen.";
4
4
  /** Fout die betekent: deze rij of zijn kar bestaat niet meer (vervangen). */
@@ -0,0 +1,41 @@
1
+ export declare const STICKER_UNKNOWN = "Stickerstand onbekend";
2
+ export interface StickerLine {
3
+ soort: string | null;
4
+ stickerId: string | null;
5
+ kopieen: number | null;
6
+ status: string | null;
7
+ reden: string | null;
8
+ printJobId: string | null;
9
+ breedteMm: number | null;
10
+ hoogteMm: number | null;
11
+ }
12
+ export interface CartStickerState {
13
+ cartId: string | null;
14
+ totaal: number | null;
15
+ inPrintwachtrij: number | null;
16
+ wachtend: number | null;
17
+ geblokkeerd: number | null;
18
+ regels: StickerLine[];
19
+ }
20
+ export interface StickerMelding {
21
+ id: string | null;
22
+ tekst: string;
23
+ }
24
+ export declare const STICKER_STATUS_LABEL: Record<string, string>;
25
+ export declare function stickerStatusLabel(s: string | null): string;
26
+ /** null = onleesbaar antwoord (stand onbekend). Leest de kale stand. */
27
+ export declare function parseCartStickerState(raw: unknown): CartStickerState | null;
28
+ /** Pickstation-omhulsel: alleen toegang === true met een geldige stand telt. */
29
+ export declare function parsePickstationCartSticker(raw: unknown): CartStickerState | null;
30
+ /** Meldingen letterlijk; null = onleesbaar. Gesloten meldingen tellen niet. */
31
+ export declare function parseStickerMeldingen(raw: unknown): StickerMelding[] | null;
32
+ export declare function parsePickstationMeldingen(raw: unknown): StickerMelding[] | null;
33
+ /** Samenvattende regel; nooit "Klaar" (de Engine heeft geen veld voor echt geprint). */
34
+ export declare function stickerSummary(s: CartStickerState): string | null;
35
+ /**
36
+ * Met slug (openbaar pickstation): alleen pickstation_cart_sticker_state, geen terugval.
37
+ * Zonder slug (ingelogd scherm): logistics_cart_sticker_state. Fout of onbekende vorm: null.
38
+ */
39
+ export declare function fetchCartStickerState(cartId: string, slug: string | null): Promise<CartStickerState | null>;
40
+ export declare function fetchOrderStickerMeldingen(orderId: string, slug: string | null): Promise<StickerMelding[] | null>;
41
+ //# sourceMappingURL=pickStickers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"AAOA,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;CACzB;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;CACvB;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,CAqB3E;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"}
@@ -0,0 +1,111 @@
1
+ // Stickerstand en stickermeldingen: alleen lezen uit de Engine. Deze module
2
+ // voert zelf nooit print.sticker/print.traysticker uit en haalt geen PDF op.
3
+ import { supabase } from "@flowselections/core";
4
+ const db = supabase;
5
+ export const STICKER_UNKNOWN = "Stickerstand onbekend";
6
+ const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
7
+ const txt = (v) => (typeof v === "string" && v.trim() ? v : typeof v === "number" ? String(v) : null);
8
+ const num = (v) => (typeof v === "number" && Number.isFinite(v) ? v : null);
9
+ export const STICKER_STATUS_LABEL = {
10
+ wacht_op_moment: "wacht op moment",
11
+ klaar: "klaar om te printen",
12
+ in_printwachtrij: "in de printwachtrij (nog niet fysiek geprint)",
13
+ geblokkeerd: "geblokkeerd",
14
+ mislukt: "mislukt",
15
+ afgemeld: "afgemeld bij de printer (nog niet bevestigd geprint)",
16
+ niet_printen: "niet printen",
17
+ };
18
+ export function stickerStatusLabel(s) {
19
+ if (!s)
20
+ return "onbekend";
21
+ return STICKER_STATUS_LABEL[s] ?? s;
22
+ }
23
+ /** null = onleesbaar antwoord (stand onbekend). Leest de kale stand. */
24
+ export function parseCartStickerState(raw) {
25
+ const r = rec(raw);
26
+ if (!r || !Array.isArray(r["regels"]))
27
+ return null;
28
+ const totaal = num(r["totaal"]);
29
+ if (totaal == null)
30
+ return null;
31
+ return {
32
+ cartId: txt(r["cartId"]),
33
+ totaal,
34
+ inPrintwachtrij: num(r["inPrintwachtrij"]),
35
+ wachtend: num(r["wachtend"]),
36
+ geblokkeerd: num(r["geblokkeerd"]),
37
+ regels: r["regels"].flatMap((x) => {
38
+ const l = rec(x);
39
+ if (!l)
40
+ return [];
41
+ return [{
42
+ soort: txt(l["soort"]), stickerId: txt(l["stickerId"]), kopieen: num(l["kopieen"]),
43
+ status: txt(l["status"]), reden: txt(l["reden"]), printJobId: txt(l["printJobId"]),
44
+ breedteMm: num(l["breedteMm"]), hoogteMm: num(l["hoogteMm"]),
45
+ }];
46
+ }),
47
+ };
48
+ }
49
+ /** Pickstation-omhulsel: alleen toegang === true met een geldige stand telt. */
50
+ export function parsePickstationCartSticker(raw) {
51
+ const r = rec(raw);
52
+ if (!r || r["toegang"] !== true)
53
+ return null;
54
+ return parseCartStickerState(r["stand"]);
55
+ }
56
+ /** Meldingen letterlijk; null = onleesbaar. Gesloten meldingen tellen niet. */
57
+ export function parseStickerMeldingen(raw) {
58
+ const r = rec(raw);
59
+ const list = Array.isArray(raw) ? raw : Array.isArray(r?.["meldingen"]) ? r["meldingen"] : null;
60
+ if (!list)
61
+ return null;
62
+ return list.flatMap((x) => {
63
+ if (typeof x === "string")
64
+ return x.trim() ? [{ id: null, tekst: x }] : [];
65
+ const m = rec(x);
66
+ if (!m)
67
+ return [];
68
+ const status = txt(m["status"]);
69
+ if (m["gesloten"] === true || m["closed"] === true || status === "gesloten" || status === "closed")
70
+ return [];
71
+ const basis = txt(m["melding"] ?? m["tekst"] ?? m["message"]);
72
+ if (!basis)
73
+ return [];
74
+ const extra = [txt(m["plek"]), txt(m["sinds"])].filter(Boolean).join(" · ");
75
+ return [{ id: txt(m["id"]) ?? txt(m["stickerId"]), tekst: extra ? `${basis} (${extra})` : basis }];
76
+ });
77
+ }
78
+ export function parsePickstationMeldingen(raw) {
79
+ const r = rec(raw);
80
+ if (!r || r["toegang"] !== true || !Array.isArray(r["meldingen"]))
81
+ return null;
82
+ return parseStickerMeldingen(r["meldingen"]);
83
+ }
84
+ /** Samenvattende regel; nooit "Klaar" (de Engine heeft geen veld voor echt geprint). */
85
+ export function stickerSummary(s) {
86
+ if (s.totaal === 0)
87
+ return "Geen stickers nodig voor deze kar";
88
+ if (s.wachtend === 0 && s.geblokkeerd === 0 && (s.inPrintwachtrij ?? 0) > 0)
89
+ return "Alle stickers naar de printer gestuurd";
90
+ return null;
91
+ }
92
+ async function call(fn, args) {
93
+ const { data, error } = await db.rpc(fn, args);
94
+ if (error)
95
+ throw new Error(error.message);
96
+ return data;
97
+ }
98
+ /**
99
+ * Met slug (openbaar pickstation): alleen pickstation_cart_sticker_state, geen terugval.
100
+ * Zonder slug (ingelogd scherm): logistics_cart_sticker_state. Fout of onbekende vorm: null.
101
+ */
102
+ export async function fetchCartStickerState(cartId, slug) {
103
+ if (slug)
104
+ return parsePickstationCartSticker(await call("pickstation_cart_sticker_state", { p_slug: slug, p_cart_id: cartId }));
105
+ return parseCartStickerState(await call("logistics_cart_sticker_state", { p_cart_id: cartId }));
106
+ }
107
+ export async function fetchOrderStickerMeldingen(orderId, slug) {
108
+ if (slug)
109
+ return parsePickstationMeldingen(await call("pickstation_order_sticker_meldingen", { p_slug: slug, p_order_id: orderId }));
110
+ return parseStickerMeldingen(await call("logistics_order_sticker_meldingen", { p_order_id: orderId }));
111
+ }
@@ -58,7 +58,7 @@ export function parsePickCartPlan(value) {
58
58
  const carts = rawCarts.flatMap((rawCart) => {
59
59
  const cart = recordOf(rawCart);
60
60
  const cartId = textOf(cart?.["cartId"] ?? cart?.["cart_id"]);
61
- const cartNumber = numberOf(cart?.["cartNumber"] ?? cart?.["cart_number"]);
61
+ const cartNumber = numberOf(cart?.["cartSeq"] ?? cart?.["cart_seq"] ?? cart?.["cartNumber"] ?? cart?.["cart_number"]);
62
62
  const cartTotal = numberOf(cart?.["cartTotal"] ?? cart?.["cart_total"]);
63
63
  const isShared = cart?.["isShared"] === true;
64
64
  if (!cartId
@@ -194,7 +194,7 @@ export function cartRowOf(item) {
194
194
  return null;
195
195
  return {
196
196
  cartId: textOf(p["cartId"] ?? p["cart_id"]),
197
- cartIndex: numberOf(p["cartNumber"] ?? p["cart_number"] ?? p["cartIndex"]),
197
+ cartIndex: numberOf(p["cartSeq"] ?? p["cart_seq"] ?? p["cartNumber"] ?? p["cart_number"] ?? p["cartIndex"]),
198
198
  cartTotal: numberOf(p["cartTotal"] ?? p["cart_total"]),
199
199
  };
200
200
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/pick-schermen-kwekers",
3
- "version": "1.0.36",
3
+ "version": "1.0.41",
4
4
  "flowselections": {
5
5
  "moduleId": "pick-schermen",
6
6
  "pages": [
@@ -65,13 +65,13 @@
65
65
  "@cloudflare/vite-plugin": "^1.25.5",
66
66
  "@eslint/js": "^9.32.0",
67
67
  "@flowselections/core": "1.0.29",
68
- "@lovable.dev/vite-tanstack-config": "2.25.3",
68
+ "@lovable.dev/vite-tanstack-config": "2.26.5",
69
69
  "@rsbuild/core": "^1.0.0",
70
70
  "@tailwindcss/vite": "^4.2.1",
71
71
  "@tanstack/react-query": "^5.83.0",
72
- "@tanstack/react-router": "^1.168.0",
73
- "@tanstack/react-start": "^1.167.14",
74
- "@tanstack/router-plugin": "^1.167.10",
72
+ "@tanstack/react-router": "1.169.1",
73
+ "@tanstack/react-start": "1.167.63",
74
+ "@tanstack/router-plugin": "1.167.33",
75
75
  "@types/node": "^22.16.5",
76
76
  "@types/react": "^19.2.0",
77
77
  "@types/react-dom": "^19.2.0",