@flowselections/pick-schermen-kwekers 1.0.66 → 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
+ });
@@ -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
+ }
@@ -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,9 @@ 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;
14
18
  }
15
19
  export declare function parseCartStickerBundle(raw: unknown): CartStickerBundleItem[];
16
20
  //# 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;AAE/D,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;CAClB;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,EAAE,CA0B5E"}
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"}
@@ -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,8 @@ 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,
34
38
  }];
35
39
  });
36
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/pick-schermen-kwekers",
3
- "version": "1.0.66",
3
+ "version": "1.0.68",
4
4
  "flowselections": {
5
5
  "moduleId": "pick-schermen",
6
6
  "schema": {
@@ -4063,13 +4063,10 @@ BEGIN
4063
4063
  END $function$;
4064
4064
 
4065
4065
  CREATE OR REPLACE FUNCTION public.pickstation_cart_sticker_states(p_slug text, p_cart_ids uuid[])
4066
- RETURNS jsonb
4067
- LANGUAGE plpgsql
4068
- SECURITY DEFINER
4069
- SET search_path TO 'public'
4070
- AS $function$
4066
+ RETURNS jsonb LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path = public AS $$
4071
4067
  DECLARE v_station uuid; c uuid; v_stand jsonb; v_fit jsonb; v_meld jsonb; v_order uuid;
4072
4068
  v_jobs uuid[]; v_uitwijk jsonb; out jsonb := '[]'::jsonb; v_has_uitwijk boolean;
4069
+ v_opdr jsonb; v_tz text;
4073
4070
  BEGIN
4074
4071
  IF p_slug IS NOT NULL AND btrim(p_slug) <> '' THEN
4075
4072
  SELECT s.id INTO v_station FROM public.pick_stations s WHERE s.slug = p_slug AND s.active IS TRUE LIMIT 1;
@@ -4077,8 +4074,12 @@ BEGIN
4077
4074
  IF v_station IS NULL THEN
4078
4075
  RAISE EXCEPTION 'Dit pickstation is onbekend of niet actief.' USING ERRCODE = '42501';
4079
4076
  END IF;
4077
+ IF to_regprocedure('public.logistics_opening_timezone()') IS NOT NULL THEN
4078
+ BEGIN EXECUTE 'SELECT public.logistics_opening_timezone()::text' INTO v_tz;
4079
+ EXCEPTION WHEN OTHERS THEN v_tz := NULL; END;
4080
+ END IF;
4080
4081
  IF p_cart_ids IS NULL OR cardinality(p_cart_ids) = 0 THEN
4081
- RETURN jsonb_build_object('toegang', true, 'karren', '[]'::jsonb);
4082
+ RETURN jsonb_build_object('toegang', true, 'tijdzone', v_tz, 'karren', '[]'::jsonb);
4082
4083
  END IF;
4083
4084
  v_has_uitwijk := EXISTS (SELECT 1 FROM information_schema.columns
4084
4085
  WHERE table_schema='public' AND table_name='print_jobs' AND column_name='uitwijk');
@@ -4104,12 +4105,28 @@ BEGIN
4104
4105
  v_meld := public.pickstation_order_sticker_meldingen(p_slug => p_slug, p_order_id => v_order);
4105
4106
  END IF;
4106
4107
  EXCEPTION WHEN OTHERS THEN v_meld := NULL; END;
4108
+ -- Stickerprintopdrachten van deze kar (ook eigen stickers), gekoppeld op cart_id.
4109
+ v_opdr := NULL;
4110
+ BEGIN
4111
+ SELECT coalesce(jsonb_agg(jsonb_build_object(
4112
+ 'id', pj.id, 'documenttype', pj.documenttype, 'status', pj.status,
4113
+ 'fase', pj.verwerkingsfase, 'voltooid_op', pj.voltooid_op,
4114
+ 'gepland_op', coalesce(pj.payload->>'print_op', pj.payload->>'wacht_tot', pj.volgende_poging::text),
4115
+ 'reden', coalesce(pj.foutmelding, pj.printnode_bericht),
4116
+ 'kopieen', pj.kopieen) ORDER BY pj.created_at), '[]'::jsonb)
4117
+ INTO v_opdr
4118
+ FROM public.print_jobs pj
4119
+ WHERE pj.payload->>'cart_id' = c::text
4120
+ AND pj.documenttype ILIKE '%sticker%';
4121
+ EXCEPTION WHEN OTHERS THEN v_opdr := NULL; END;
4107
4122
  v_uitwijk := '[]'::jsonb;
4108
4123
  IF v_has_uitwijk THEN
4109
4124
  BEGIN
4110
- SELECT array_agg(DISTINCT (r->>'printJobId')::uuid) INTO v_jobs
4111
- FROM jsonb_array_elements(coalesce(v_stand->'stand'->'regels', '[]'::jsonb)) r
4112
- WHERE coalesce(r->>'printJobId', '') ~ '^[0-9a-fA-F-]{36}$';
4125
+ SELECT array_agg(DISTINCT j) INTO v_jobs FROM (
4126
+ SELECT (r->>'printJobId')::uuid j
4127
+ FROM jsonb_array_elements(coalesce(v_stand->'stand'->'regels', '[]'::jsonb)) r
4128
+ WHERE coalesce(r->>'printJobId', '') ~ '^[0-9a-fA-F-]{36}$'
4129
+ UNION SELECT (o->>'id')::uuid FROM jsonb_array_elements(coalesce(v_opdr, '[]'::jsonb)) o) q;
4113
4130
  IF v_jobs IS NOT NULL THEN
4114
4131
  EXECUTE 'SELECT coalesce(jsonb_agg(jsonb_build_object(''id'', id, ''uitwijk'', uitwijk)), ''[]''::jsonb)
4115
4132
  FROM public.print_jobs WHERE id = ANY($1) AND uitwijk IS NOT NULL'
@@ -4118,10 +4135,10 @@ BEGIN
4118
4135
  EXCEPTION WHEN OTHERS THEN v_uitwijk := '[]'::jsonb; END;
4119
4136
  END IF;
4120
4137
  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));
4138
+ 'stand', v_stand, 'controle', v_fit, 'meldingen', v_meld, 'uitwijk', v_uitwijk, 'opdrachten', v_opdr));
4122
4139
  END LOOP;
4123
- RETURN jsonb_build_object('toegang', true, 'karren', out);
4124
- END $function$;
4140
+ RETURN jsonb_build_object('toegang', true, 'tijdzone', v_tz, 'karren', out);
4141
+ END $$;
4125
4142
 
4126
4143
  CREATE OR REPLACE FUNCTION public.pickstation_device_status(p_slug text, p_device_key text)
4127
4144
  RETURNS jsonb