@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.
- package/dist-lib/components/afhandeling/ControlePage.js +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +255 -89
- package/dist-lib/components/afhandeling/NuVersturenButton.d.ts +2 -2
- package/dist-lib/components/afhandeling/NuVersturenButton.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/NuVersturenButton.js +22 -4
- package/dist-lib/components/afhandeling/ScanControleView.js +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.js +1 -1
- package/dist-lib/components/afhandeling/VerzetOrderDialog.js +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +4 -3
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +28 -28
- package/dist-lib/components/ui/responsive-dialog.js +1 -1
- package/dist-lib/hooks/useKnownOrders.d.ts +1 -0
- package/dist-lib/hooks/useKnownOrders.d.ts.map +1 -1
- package/dist-lib/hooks/useKnownOrders.js +20 -1
- package/dist-lib/hooks/useOrderBuffers.d.ts +6 -0
- package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderBuffers.js +21 -0
- package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -1
- package/dist-lib/hooks/usePickAgenda.js +7 -3
- package/dist-lib/hooks/usePickMode.d.ts +1 -1
- package/dist-lib/index.d.ts +0 -2
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +0 -2
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +14 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/authGateway.server.d.ts.map +1 -1
- package/dist-lib/lib/authGateway.server.js +3 -2
- package/dist-lib/lib/cartAssignments.functions.d.ts +48 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.js +111 -0
- package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
- package/dist-lib/lib/deliveryNotePrint.js +219 -219
- package/dist-lib/lib/floridayFulfillmentSend.server.d.ts +6 -1
- package/dist-lib/lib/floridayFulfillmentSend.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayFulfillmentSend.server.js +23 -6
- package/dist-lib/lib/floridayLoading.functions.d.ts +2 -0
- package/dist-lib/lib/floridayLoading.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayLoading.functions.js +52 -24
- package/dist-lib/lib/logisticsEngine/capacity.js +1 -1
- package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
- package/dist-lib/lib/orderFulfilment.functions.d.ts.map +1 -1
- package/dist-lib/lib/orderFulfilment.functions.js +17 -0
- 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,
|
|
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 =
|
|
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
|
-
|
|
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":"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,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;
|
|
1
|
+
{"version":3,"file":"cartAssignments.functions.d.ts","sourceRoot":"","sources":["../../src/lib/cartAssignments.functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|