@flowselections/floriday-afhandeling-module 1.0.50 → 1.0.54

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 (47) hide show
  1. package/dist-lib/components/afhandeling/ControlePage.js +1 -1
  2. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  3. package/dist-lib/components/afhandeling/DagDetailDialog.js +255 -89
  4. package/dist-lib/components/afhandeling/NuVersturenButton.d.ts +2 -2
  5. package/dist-lib/components/afhandeling/NuVersturenButton.d.ts.map +1 -1
  6. package/dist-lib/components/afhandeling/NuVersturenButton.js +22 -4
  7. package/dist-lib/components/afhandeling/ScanControleView.js +1 -1
  8. package/dist-lib/components/afhandeling/VervoerdersPage.js +1 -1
  9. package/dist-lib/components/afhandeling/VerzetOrderDialog.js +1 -1
  10. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  11. package/dist-lib/components/afhandeling/WeekAgendaView.js +4 -3
  12. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
  13. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +28 -28
  14. package/dist-lib/components/ui/responsive-dialog.js +1 -1
  15. package/dist-lib/hooks/useKnownOrders.d.ts +1 -0
  16. package/dist-lib/hooks/useKnownOrders.d.ts.map +1 -1
  17. package/dist-lib/hooks/useKnownOrders.js +20 -1
  18. package/dist-lib/hooks/useOrderBuffers.d.ts +6 -0
  19. package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
  20. package/dist-lib/hooks/useOrderBuffers.js +21 -0
  21. package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -1
  22. package/dist-lib/hooks/usePickAgenda.js +7 -3
  23. package/dist-lib/hooks/usePickMode.d.ts +1 -1
  24. package/dist-lib/index.d.ts +0 -2
  25. package/dist-lib/index.d.ts.map +1 -1
  26. package/dist-lib/index.js +0 -2
  27. package/dist-lib/integrations/supabase/client.server.js +1 -1
  28. package/dist-lib/integrations/supabase/types.d.ts +14 -0
  29. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  30. package/dist-lib/lib/authGateway.server.d.ts.map +1 -1
  31. package/dist-lib/lib/authGateway.server.js +3 -2
  32. package/dist-lib/lib/cartAssignments.functions.d.ts +48 -0
  33. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/cartAssignments.functions.js +111 -0
  35. package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
  36. package/dist-lib/lib/deliveryNotePrint.js +219 -219
  37. package/dist-lib/lib/floridayFulfillmentSend.server.d.ts +6 -1
  38. package/dist-lib/lib/floridayFulfillmentSend.server.d.ts.map +1 -1
  39. package/dist-lib/lib/floridayFulfillmentSend.server.js +23 -6
  40. package/dist-lib/lib/floridayLoading.functions.d.ts +2 -0
  41. package/dist-lib/lib/floridayLoading.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/floridayLoading.functions.js +52 -24
  43. package/dist-lib/lib/logisticsEngine/capacity.js +1 -1
  44. package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
  45. package/dist-lib/lib/orderFulfilment.functions.d.ts.map +1 -1
  46. package/dist-lib/lib/orderFulfilment.functions.js +17 -0
  47. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"authGateway.server.d.ts","sourceRoot":"","sources":["../../src/lib/authGateway.server.ts"],"names":[],"mappings":"AA6BA,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAqB9D;AA2BD,iFAAiF;AACjF,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CA6BhC;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/F;AA4BD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyElD"}
1
+ {"version":3,"file":"authGateway.server.d.ts","sourceRoot":"","sources":["../../src/lib/authGateway.server.ts"],"names":[],"mappings":"AA6BA,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAqB9D;AA2BD,iFAAiF;AACjF,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CA6BhC;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/F;AA4BD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0ElD"}
@@ -6,7 +6,7 @@
6
6
  // message = `${timestamp}.${JSON.stringify(body)}`
7
7
  // signature = hex(HMAC-SHA256(AUTH_GATEWAY_HMAC_SECRET, message))
8
8
  // headers = { "X-Signature": signature, "X-Timestamp": timestamp }
9
- // Timestamp = ISO 8601 UTC, ±5 min venster.
9
+ // Timestamp = epoch-milliseconden als tekst (String(Date.now())), ±5 min venster.
10
10
  // Web Crypto (browser/Node 15+/Workers) — geen node:crypto, want dist-lib
11
11
  // wordt ook in de client-bundle van consumer-shells opgenomen.
12
12
  import { createClient } from "@supabase/supabase-js";
@@ -161,7 +161,8 @@ export async function fetchDeliveryNotePdf(salesOrderId) {
161
161
  deliveryOrderId: deliveryOrderIds[0],
162
162
  };
163
163
  const bodyStr = JSON.stringify(payload);
164
- const timestamp = new Date().toISOString();
164
+ // De gateway verwacht epoch-milliseconden; we tekenen over precies deze waarde.
165
+ const timestamp = String(Date.now());
165
166
  const signature = await signBody(secret, timestamp, bodyStr);
166
167
  try {
167
168
  const base = await resolveGatewayBaseServer();
@@ -77,6 +77,8 @@ export declare const getOrderLines: import("@tanstack/start-client-core").Requir
77
77
  }>>;
78
78
  export interface DayCartContent {
79
79
  orderRef: string;
80
+ /** Engine-kar-id; leeg als de Engine geen kar-id gaf. */
81
+ cartId: string | null;
80
82
  cartNumber: number;
81
83
  layersUsed: number | null;
82
84
  maxLayers: number | null;
@@ -96,6 +98,10 @@ export interface DayOrderCoverage {
96
98
  label: string | null;
97
99
  pickStatus: CoveragePickStatus | null;
98
100
  pickedAt: string | null;
101
+ /** Alle karren goedgekeurd op de Scan-controle (logistics_control_scan.approved_at). */
102
+ approvedAll: boolean;
103
+ /** Floriday heeft de belading geaccepteerd (created / already_fulfilled). */
104
+ floridaySent: boolean;
99
105
  }
100
106
  /**
101
107
  * Karindeling per order via de Engine-leesfunctie `logistics_order_plan_coverage`.
@@ -114,4 +120,46 @@ export declare const getDayCartContents: import("@tanstack/start-client-core").R
114
120
  carts: DayCartContent[];
115
121
  orders: DayOrderCoverage[];
116
122
  }>>;
123
+ /** Echte Engine-karren van één order (voor pakbonnen per kar). */
124
+ export declare const getOrderCartIds: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
125
+ supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
126
+ userId: string;
127
+ claims: import("@supabase/auth-js").JwtPayload;
128
+ }, undefined, undefined, undefined>], (d: {
129
+ orderId: string;
130
+ }) => {
131
+ orderId: string;
132
+ }, Promise<{
133
+ carts: {
134
+ cartId: string;
135
+ cartNumber: number;
136
+ }[];
137
+ }>>;
138
+ export interface PakbonCartInfo {
139
+ cartId: string;
140
+ /** Vaste LC-code van de kar (logistics_ensure_cart_barcode), dezelfde als op het pickstation. */
141
+ barcode: string;
142
+ /** Bestaande pakbon voor deze kar (documenttype pakbon, niet mislukt/geannuleerd), zoals Pickschermen controleert. */
143
+ bestaand: {
144
+ herkomst: string;
145
+ printer: string | null;
146
+ tijd: string;
147
+ status: string;
148
+ } | null;
149
+ }
150
+ /**
151
+ * Per Engine-kar de vaste kar-barcode en de bestaande pakbon in de Printwachtrij.
152
+ * Match uitsluitend op cart_id; verzendbrieven tellen niet mee.
153
+ */
154
+ export declare const getPakbonCartInfo: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
155
+ supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
156
+ userId: string;
157
+ claims: import("@supabase/auth-js").JwtPayload;
158
+ }, undefined, undefined, undefined>], (d: {
159
+ cartIds: string[];
160
+ }) => {
161
+ cartIds: string[];
162
+ }, Promise<{
163
+ carts: PakbonCartInfo[];
164
+ }>>;
117
165
  //# sourceMappingURL=cartAssignments.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartAssignments.functions.d.ts","sourceRoot":"","sources":["../../src/lib/cartAssignments.functions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cartAssignments.functions.d.ts","sourceRoot":"","sources":["../../src/lib/cartAssignments.functions.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,WAAW,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAUD,eAAO,MAAM,iBAAiB;;;;;eAEuB,YAAY,EAAE;GAQ/D,CAAC;AAEL,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACjC;AAED,eAAO,MAAM,QAAQ;;;;0CAEC,aAAa;QACiB,IAAI;cAAY,YAAY;GAqB5E,CAAC;AAEL,eAAO,MAAM,iBAAiB;;;;0CAER;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;aAArD,MAAM;iBAAe,WAAW;eAAa,MAAM;;QAChC,IAAI;GAUpD,CAAC;AAEL,eAAO,MAAM,qBAAqB;;;;;QAEY,IAAI;aAAW,MAAM;GAQ/D,CAAC;AAEL,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa;;;;0CAEJ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE;aAAlC,MAAM;iBAAe,WAAW;;WACV,SAAS,EAAE;GA0D9D,CAAC;AAEL,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,OAAO,GAAG,eAAe,GAAG,aAAa,CAAC;AACpF,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wFAAwF;IACxF,WAAW,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,YAAY,EAAE,OAAO,CAAC;CACvB;AAKD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;0CAET;IAAE,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE;;;WAMI,cAAc,EAAE;YAAgB,gBAAgB,EAAE;GAsF/F,CAAC;AAGL,kEAAkE;AAClE,eAAO,MAAM,eAAe;;;;0CAEN;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;WACc;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE;GAQ3F,CAAC;AAEL,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,EAAE,MAAM,CAAC;IAChB,sHAAsH;IACtH,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7F;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;0CAER;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;;;WAGY,cAAc,EAAE;GA+CnE,CAAC"}
@@ -165,6 +165,7 @@ export const getDayCartContents = createServerFn({ method: "POST" })
165
165
  }
166
166
  const carts = [];
167
167
  const orders = [];
168
+ const cartIdsByRef = new Map();
168
169
  for (const part of chunk([...orderRefById.keys()], 6)) {
169
170
  await Promise.all(part.map(async (oid) => {
170
171
  const orderRef = orderRefById.get(oid);
@@ -181,7 +182,10 @@ export const getDayCartContents = createServerFn({ method: "POST" })
181
182
  label: typeof c.label === "string" ? c.label : null,
182
183
  pickStatus: c.pickStatus ?? null,
183
184
  pickedAt: typeof c.pickedAt === "string" ? c.pickedAt : null,
185
+ approvedAll: false,
186
+ floridaySent: false,
184
187
  });
188
+ cartIdsByRef.set(orderRef, arr(c.carts).map((k) => k?.cartId).filter((x) => typeof x === "string"));
185
189
  // Lagen/bezetting alleen als de Engine ze in het karbriefplan levert; anders onbekend.
186
190
  const slipByCart = new Map();
187
191
  if (!slip.error)
@@ -193,6 +197,7 @@ export const getDayCartContents = createServerFn({ method: "POST" })
193
197
  const lines = arr(k?.lines);
194
198
  carts.push({
195
199
  orderRef,
200
+ cartId: typeof k?.cartId === "string" && k.cartId ? k.cartId : null,
196
201
  cartNumber: num(k?.cartNumber) ?? idx + 1,
197
202
  layersUsed: num(s.layersUsed ?? s.totalLayersUsed),
198
203
  maxLayers: num(s.maxLayers),
@@ -205,6 +210,112 @@ export const getDayCartContents = createServerFn({ method: "POST" })
205
210
  });
206
211
  }));
207
212
  }
213
+ // Scanstatus en Floriday-acceptatie per order.
214
+ const allCarts = [...new Set([...cartIdsByRef.values()].flat())];
215
+ const approved = new Set();
216
+ for (const part of chunk(allCarts, 300)) {
217
+ const { data: sc, error } = await supabase
218
+ .from("logistics_control_scan").select("cart_id").in("cart_id", part).not("approved_at", "is", null);
219
+ if (error)
220
+ throw new Error(error.message);
221
+ for (const r of sc ?? [])
222
+ approved.add(r.cart_id);
223
+ }
224
+ const sentRefs = new Set();
225
+ const allRefs = orders.map((o) => o.orderRef);
226
+ for (const part of chunk(allRefs, 200)) {
227
+ const { data: at, error } = await supabase
228
+ .from("floriday_loading_attempts").select("order_refs")
229
+ .overlaps("order_refs", part).in("code", ["created", "already_fulfilled"]);
230
+ if (error)
231
+ throw new Error(error.message);
232
+ for (const a of at ?? [])
233
+ for (const r of arr(a.order_refs))
234
+ sentRefs.add(String(r));
235
+ }
236
+ for (const o of orders) {
237
+ const ids = cartIdsByRef.get(o.orderRef) ?? [];
238
+ o.approvedAll = ids.length > 0 && ids.every((id) => approved.has(id));
239
+ o.floridaySent = sentRefs.has(o.orderRef);
240
+ }
208
241
  carts.sort((a, b) => a.orderRef.localeCompare(b.orderRef) || a.cartNumber - b.cartNumber);
209
242
  return { carts, orders };
210
243
  });
244
+ /** Echte Engine-karren van één order (voor pakbonnen per kar). */
245
+ export const getOrderCartIds = createServerFn({ method: "POST" })
246
+ .middleware([requireSupabaseAuth])
247
+ .inputValidator((d) => ({ orderId: String(d?.orderId ?? "").trim() }))
248
+ .handler(async ({ data, context }) => {
249
+ if (!data.orderId)
250
+ throw new Error("Geen order opgegeven.");
251
+ const { data: cov, error } = await context.supabase.rpc("logistics_order_plan_coverage", { p_order_id: data.orderId });
252
+ if (error)
253
+ throw new Error(error.message);
254
+ const carts = arr(cov?.carts)
255
+ .map((k, i) => ({ cartId: typeof k?.cartId === "string" ? k.cartId : "", cartNumber: num(k?.cartNumber) ?? i + 1 }))
256
+ .filter((k) => k.cartId);
257
+ return { carts };
258
+ });
259
+ /**
260
+ * Per Engine-kar de vaste kar-barcode en de bestaande pakbon in de Printwachtrij.
261
+ * Match uitsluitend op cart_id; verzendbrieven tellen niet mee.
262
+ */
263
+ export const getPakbonCartInfo = createServerFn({ method: "POST" })
264
+ .middleware([requireSupabaseAuth])
265
+ .inputValidator((d) => ({
266
+ cartIds: Array.from(new Set((d?.cartIds ?? []).map((x) => String(x).trim()).filter(Boolean))).slice(0, 200),
267
+ }))
268
+ .handler(async ({ data, context }) => {
269
+ const supabase = context.supabase;
270
+ if (data.cartIds.length === 0)
271
+ return { carts: [] };
272
+ const barcodes = new Map();
273
+ await Promise.all(data.cartIds.map(async (id) => {
274
+ const { data: bc, error } = await supabase.rpc("logistics_ensure_cart_barcode", { _cart_id: id });
275
+ if (error)
276
+ throw new Error(`Kar-barcode niet opgehaald: ${error.message}`);
277
+ if (typeof bc !== "string" || !bc)
278
+ throw new Error("De Engine gaf geen kar-barcode terug.");
279
+ barcodes.set(id, bc);
280
+ }));
281
+ const { data: jobs, error } = await supabase
282
+ .from("print_jobs")
283
+ .select("payload, herkomst, gebruiker_naam, created_at, status, printer_id")
284
+ .eq("documenttype", "pakbon")
285
+ .not("status", "in", "(mislukt,geannuleerd)")
286
+ .in("payload->>cart_id", data.cartIds)
287
+ .order("created_at", { ascending: true });
288
+ if (error)
289
+ throw new Error(`Printwachtrij niet gelezen: ${error.message}`);
290
+ const printerIds = [...new Set((jobs ?? []).map((j) => j.printer_id).filter(Boolean))];
291
+ const printerNaam = new Map();
292
+ if (printerIds.length) {
293
+ const { data: pr } = await supabase.from("printers").select("id, naam").in("id", printerIds);
294
+ for (const p of pr ?? [])
295
+ printerNaam.set(p.id, p.naam);
296
+ }
297
+ const eerste = new Map();
298
+ for (const j of jobs ?? []) {
299
+ const cid = j?.payload?.cart_id;
300
+ if (typeof cid === "string" && !eerste.has(cid))
301
+ eerste.set(cid, j);
302
+ }
303
+ return {
304
+ carts: data.cartIds.map((id) => {
305
+ const j = eerste.get(id);
306
+ const bron = j ? (j.payload?.source ?? j.herkomst ?? j.gebruiker_naam ?? "onbekend") : null;
307
+ return {
308
+ cartId: id,
309
+ barcode: barcodes.get(id),
310
+ bestaand: j
311
+ ? {
312
+ herkomst: String(bron) === "afhandeling" ? "Afhandeling" : String(bron).includes("pick") ? "het pickstation" : String(bron),
313
+ printer: j.printer_id ? printerNaam.get(j.printer_id) ?? null : null,
314
+ tijd: j.created_at,
315
+ status: j.status,
316
+ }
317
+ : null,
318
+ };
319
+ }),
320
+ };
321
+ });
@@ -1,34 +1,34 @@
1
- export interface DeliveryNoteItem {
2
- id: string;
3
- salesOrderId?: string | null;
4
- deliveryOrderId?: string | null;
5
- fulfillmentOrderId?: string | null;
6
- }
7
- /** Haalt de signed URL van een enkele afleverbrief op. */
8
- export declare function fetchDeliveryNoteUrl(salesOrderId: string): Promise<string>;
9
- /** Print een PDF vanaf een (signed) URL via de printwachtrij. */
10
- export declare function printPdfFromUrl(url: string, opties: {
11
- documentnaam: string;
12
- isHerprint?: boolean;
13
- }): Promise<void>;
14
- /** Haal en print één afleverbrief. */
15
- export declare function printDeliveryNote(salesOrderId: string, opties?: {
16
- documentnaam?: string;
17
- isHerprint?: boolean;
18
- }): Promise<void>;
19
- export interface BulkPrintResult {
20
- total: number;
21
- success: number;
22
- failed: Array<{
23
- id: string;
24
- error: string;
25
- }>;
26
- }
27
- /**
28
- * Print meerdere afleverbrieven als samengevoegde PDF's van maximaal 25 stuks.
29
- * Te grote opdrachten worden automatisch verder opgeknipt.
30
- */
31
- export declare function printDeliveryNotesMerged(items: DeliveryNoteItem[], opties?: {
32
- isHerprint?: boolean;
33
- }): Promise<BulkPrintResult>;
1
+ export interface DeliveryNoteItem {
2
+ id: string;
3
+ salesOrderId?: string | null;
4
+ deliveryOrderId?: string | null;
5
+ fulfillmentOrderId?: string | null;
6
+ }
7
+ /** Haalt de signed URL van een enkele afleverbrief op. */
8
+ export declare function fetchDeliveryNoteUrl(salesOrderId: string): Promise<string>;
9
+ /** Print een PDF vanaf een (signed) URL via de printwachtrij. */
10
+ export declare function printPdfFromUrl(url: string, opties: {
11
+ documentnaam: string;
12
+ isHerprint?: boolean;
13
+ }): Promise<void>;
14
+ /** Haal en print één afleverbrief. */
15
+ export declare function printDeliveryNote(salesOrderId: string, opties?: {
16
+ documentnaam?: string;
17
+ isHerprint?: boolean;
18
+ }): Promise<void>;
19
+ export interface BulkPrintResult {
20
+ total: number;
21
+ success: number;
22
+ failed: Array<{
23
+ id: string;
24
+ error: string;
25
+ }>;
26
+ }
27
+ /**
28
+ * Print meerdere afleverbrieven als samengevoegde PDF's van maximaal 25 stuks.
29
+ * Te grote opdrachten worden automatisch verder opgeknipt.
30
+ */
31
+ export declare function printDeliveryNotesMerged(items: DeliveryNoteItem[], opties?: {
32
+ isHerprint?: boolean;
33
+ }): Promise<BulkPrintResult>;
34
34
  //# sourceMappingURL=deliveryNotePrint.d.ts.map