@flowselections/floriday-afhandeling-module 1.0.12 → 1.0.14
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/AutoProcessStatus.d.ts +12 -0
- package/dist-lib/components/afhandeling/AutoProcessStatus.d.ts.map +1 -0
- package/dist-lib/components/afhandeling/AutoProcessStatus.js +103 -0
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +3 -1
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/ControleLijstPrint.js +56 -17
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +96 -4
- package/dist-lib/components/afhandeling/LeveringenPage.js +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.js +2 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +3 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +58 -17
- package/dist-lib/components/pickstation/KioskControle.d.ts +2 -0
- package/dist-lib/components/pickstation/KioskControle.d.ts.map +1 -0
- package/dist-lib/components/pickstation/KioskControle.js +7 -0
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts +2 -1
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
- package/dist-lib/components/pickstation/PakbonTemplate.js +20 -17
- package/dist-lib/components/pickstation/PickstationPage.d.ts +2 -0
- package/dist-lib/components/pickstation/PickstationPage.d.ts.map +1 -0
- package/dist-lib/components/pickstation/PickstationPage.js +266 -0
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +14 -2
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +28 -11
- package/dist-lib/index.d.ts +4 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +4 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1243 -63
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +1243 -63
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1243 -63
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +1264 -56
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +2483 -111
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.js +28 -1
- package/dist-lib/lib/carrierPlanning.d.ts +25 -0
- package/dist-lib/lib/carrierPlanning.d.ts.map +1 -0
- package/dist-lib/lib/carrierPlanning.js +65 -0
- package/dist-lib/lib/carrierSignupMail.server.d.ts +0 -2
- package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -1
- package/dist-lib/lib/carrierSignupMail.server.js +53 -216
- package/dist-lib/lib/carriers.functions.d.ts +5920 -20
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.js +5 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts +5920 -20
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +11843 -40
- package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.js +4 -1
- package/dist-lib/lib/cartRescheduling.d.ts.map +1 -1
- package/dist-lib/lib/cartRescheduling.js +8 -6
- package/dist-lib/lib/countries.d.ts +2 -0
- package/dist-lib/lib/countries.d.ts.map +1 -1
- package/dist-lib/lib/countries.js +51 -0
- package/dist-lib/lib/deliveryNotePrint.d.ts +26 -0
- package/dist-lib/lib/deliveryNotePrint.d.ts.map +1 -0
- package/dist-lib/lib/deliveryNotePrint.js +172 -0
- package/dist-lib/lib/floriday.functions.d.ts +1251 -63
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +126 -8
- package/dist-lib/lib/floridayAutoProcess.d.ts +30 -0
- package/dist-lib/lib/floridayAutoProcess.d.ts.map +1 -0
- package/dist-lib/lib/floridayAutoProcess.js +70 -0
- package/dist-lib/lib/pickstationI18n.d.ts +46 -0
- package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
- package/dist-lib/lib/pickstationI18n.js +251 -0
- package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
- package/dist-lib/lib/pickstationOrders.server.js +56 -19
- package/dist-lib/lib/pickstationTypes.d.ts +2 -0
- package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
- package/dist-lib/lib/planning.d.ts +34 -0
- package/dist-lib/lib/planning.d.ts.map +1 -1
- package/dist-lib/lib/planning.js +84 -0
- package/package.json +15 -1
|
@@ -217,3 +217,254 @@ const uk = {
|
|
|
217
217
|
runControl: 'Виконати перевірку',
|
|
218
218
|
};
|
|
219
219
|
export const PICKSTATION_DICT = { nl, pl, ro, bg, uk, en };
|
|
220
|
+
/** Locale codes used voor `toLocaleDateString` / `toLocaleString` in geprinte documenten. */
|
|
221
|
+
export const PICKSTATION_LOCALE = {
|
|
222
|
+
nl: "nl-NL",
|
|
223
|
+
en: "en-GB",
|
|
224
|
+
pl: "pl-PL",
|
|
225
|
+
ro: "ro-RO",
|
|
226
|
+
bg: "bg-BG",
|
|
227
|
+
uk: "uk-UA",
|
|
228
|
+
};
|
|
229
|
+
const printNl = {
|
|
230
|
+
packingSlip: "Pakbon",
|
|
231
|
+
order: "Order",
|
|
232
|
+
cart: "Kar",
|
|
233
|
+
cartOf: (i, t) => `Kar ${i} / ${t}`,
|
|
234
|
+
cartNumber: "Karnummer",
|
|
235
|
+
customer: "Klant",
|
|
236
|
+
country: "Land",
|
|
237
|
+
deliveryDate: "Leverdatum",
|
|
238
|
+
pickDate: "Pickdatum",
|
|
239
|
+
cratesOnThisCart: "Fusten op deze kar",
|
|
240
|
+
description: "Omschrijving",
|
|
241
|
+
crates: "Fusten",
|
|
242
|
+
unit: "Eenheid",
|
|
243
|
+
noLines: "Geen regels",
|
|
244
|
+
printedVia: "Geprint via Pickstation",
|
|
245
|
+
checklistTitle: "Controlelijst karren",
|
|
246
|
+
checklistPrintView: "Controlelijst — printweergave",
|
|
247
|
+
reprint: "Opnieuw printen",
|
|
248
|
+
close: "Sluiten",
|
|
249
|
+
totalCarts: "Totaal karren",
|
|
250
|
+
colKarnr: "KARNR",
|
|
251
|
+
colFusten: "FUSTEN",
|
|
252
|
+
colLand: "LAND",
|
|
253
|
+
colKlaarzetten: "KLAARZETTEN",
|
|
254
|
+
colStatus: "STATUS",
|
|
255
|
+
noCartsToday: "Geen karren om vandaag te controleren.",
|
|
256
|
+
checkedBy: "Gecontroleerd door",
|
|
257
|
+
dateTime: "Datum / tijd",
|
|
258
|
+
signature: "Handtekening",
|
|
259
|
+
statusNotPrinted: "Nog niet geprint",
|
|
260
|
+
statusPrinted: (n) => `✓ Geprint${n > 1 ? ` (${n}×)` : ""}`,
|
|
261
|
+
statusChecked: "✓ Gecontroleerd",
|
|
262
|
+
statusReady: "Gereed voor transport",
|
|
263
|
+
statusShipped: "Onderweg",
|
|
264
|
+
statusDelivered: "✓ Afgeleverd",
|
|
265
|
+
};
|
|
266
|
+
const printEn = {
|
|
267
|
+
packingSlip: "Packing slip",
|
|
268
|
+
order: "Order",
|
|
269
|
+
cart: "Cart",
|
|
270
|
+
cartOf: (i, t) => `Cart ${i} / ${t}`,
|
|
271
|
+
cartNumber: "Cart number",
|
|
272
|
+
customer: "Customer",
|
|
273
|
+
country: "Country",
|
|
274
|
+
deliveryDate: "Delivery date",
|
|
275
|
+
pickDate: "Pick date",
|
|
276
|
+
cratesOnThisCart: "Crates on this cart",
|
|
277
|
+
description: "Description",
|
|
278
|
+
crates: "Crates",
|
|
279
|
+
unit: "Unit",
|
|
280
|
+
noLines: "No lines",
|
|
281
|
+
printedVia: "Printed via Pickstation",
|
|
282
|
+
checklistTitle: "Cart checklist",
|
|
283
|
+
checklistPrintView: "Checklist — print view",
|
|
284
|
+
reprint: "Reprint",
|
|
285
|
+
close: "Close",
|
|
286
|
+
totalCarts: "Total carts",
|
|
287
|
+
colKarnr: "CART NR",
|
|
288
|
+
colFusten: "CRATES",
|
|
289
|
+
colLand: "COUNTRY",
|
|
290
|
+
colKlaarzetten: "READY BY",
|
|
291
|
+
colStatus: "STATUS",
|
|
292
|
+
noCartsToday: "No carts to check today.",
|
|
293
|
+
checkedBy: "Checked by",
|
|
294
|
+
dateTime: "Date / time",
|
|
295
|
+
signature: "Signature",
|
|
296
|
+
statusNotPrinted: "Not printed",
|
|
297
|
+
statusPrinted: (n) => `✓ Printed${n > 1 ? ` (${n}×)` : ""}`,
|
|
298
|
+
statusChecked: "✓ Checked",
|
|
299
|
+
statusReady: "Ready for transport",
|
|
300
|
+
statusShipped: "In transit",
|
|
301
|
+
statusDelivered: "✓ Delivered",
|
|
302
|
+
};
|
|
303
|
+
const printPl = {
|
|
304
|
+
packingSlip: "List przewozowy",
|
|
305
|
+
order: "Zamówienie",
|
|
306
|
+
cart: "Wózek",
|
|
307
|
+
cartOf: (i, t) => `Wózek ${i} / ${t}`,
|
|
308
|
+
cartNumber: "Numer wózka",
|
|
309
|
+
customer: "Klient",
|
|
310
|
+
country: "Kraj",
|
|
311
|
+
deliveryDate: "Data dostawy",
|
|
312
|
+
pickDate: "Data kompletacji",
|
|
313
|
+
cratesOnThisCart: "Skrzynki na tym wózku",
|
|
314
|
+
description: "Opis",
|
|
315
|
+
crates: "Skrzynki",
|
|
316
|
+
unit: "Jednostka",
|
|
317
|
+
noLines: "Brak pozycji",
|
|
318
|
+
printedVia: "Wydrukowano ze Stacji kompletacji",
|
|
319
|
+
checklistTitle: "Lista kontrolna wózków",
|
|
320
|
+
checklistPrintView: "Lista kontrolna — podgląd wydruku",
|
|
321
|
+
reprint: "Drukuj ponownie",
|
|
322
|
+
close: "Zamknij",
|
|
323
|
+
totalCarts: "Łącznie wózków",
|
|
324
|
+
colKarnr: "NR WÓZKA",
|
|
325
|
+
colFusten: "SKRZYNKI",
|
|
326
|
+
colLand: "KRAJ",
|
|
327
|
+
colKlaarzetten: "GOTOWE DO",
|
|
328
|
+
colStatus: "STATUS",
|
|
329
|
+
noCartsToday: "Dziś brak wózków do kontroli.",
|
|
330
|
+
checkedBy: "Sprawdził",
|
|
331
|
+
dateTime: "Data / godzina",
|
|
332
|
+
signature: "Podpis",
|
|
333
|
+
statusNotPrinted: "Niewydrukowane",
|
|
334
|
+
statusPrinted: (n) => `✓ Wydrukowane${n > 1 ? ` (${n}×)` : ""}`,
|
|
335
|
+
statusChecked: "✓ Sprawdzone",
|
|
336
|
+
statusReady: "Gotowe do transportu",
|
|
337
|
+
statusShipped: "W drodze",
|
|
338
|
+
statusDelivered: "✓ Dostarczone",
|
|
339
|
+
};
|
|
340
|
+
const printRo = {
|
|
341
|
+
packingSlip: "Aviz de însoțire",
|
|
342
|
+
order: "Comanda",
|
|
343
|
+
cart: "Cărucior",
|
|
344
|
+
cartOf: (i, t) => `Cărucior ${i} / ${t}`,
|
|
345
|
+
cartNumber: "Număr cărucior",
|
|
346
|
+
customer: "Client",
|
|
347
|
+
country: "Țară",
|
|
348
|
+
deliveryDate: "Data livrării",
|
|
349
|
+
pickDate: "Data pregătirii",
|
|
350
|
+
cratesOnThisCart: "Lăzi pe acest cărucior",
|
|
351
|
+
description: "Descriere",
|
|
352
|
+
crates: "Lăzi",
|
|
353
|
+
unit: "Unitate",
|
|
354
|
+
noLines: "Fără poziții",
|
|
355
|
+
printedVia: "Tipărit prin Stația de pregătire",
|
|
356
|
+
checklistTitle: "Listă de control cărucioare",
|
|
357
|
+
checklistPrintView: "Listă de control — previzualizare",
|
|
358
|
+
reprint: "Tipărește din nou",
|
|
359
|
+
close: "Închide",
|
|
360
|
+
totalCarts: "Total cărucioare",
|
|
361
|
+
colKarnr: "NR CĂRUCIOR",
|
|
362
|
+
colFusten: "LĂZI",
|
|
363
|
+
colLand: "ȚARĂ",
|
|
364
|
+
colKlaarzetten: "GATA LA",
|
|
365
|
+
colStatus: "STARE",
|
|
366
|
+
noCartsToday: "Astăzi nu sunt cărucioare de verificat.",
|
|
367
|
+
checkedBy: "Verificat de",
|
|
368
|
+
dateTime: "Dată / oră",
|
|
369
|
+
signature: "Semnătură",
|
|
370
|
+
statusNotPrinted: "Netipărit",
|
|
371
|
+
statusPrinted: (n) => `✓ Tipărit${n > 1 ? ` (${n}×)` : ""}`,
|
|
372
|
+
statusChecked: "✓ Verificat",
|
|
373
|
+
statusReady: "Pregătit pentru transport",
|
|
374
|
+
statusShipped: "În tranzit",
|
|
375
|
+
statusDelivered: "✓ Livrat",
|
|
376
|
+
};
|
|
377
|
+
const printBg = {
|
|
378
|
+
packingSlip: "Товарителница",
|
|
379
|
+
order: "Поръчка",
|
|
380
|
+
cart: "Количка",
|
|
381
|
+
cartOf: (i, t) => `Количка ${i} / ${t}`,
|
|
382
|
+
cartNumber: "Номер на количка",
|
|
383
|
+
customer: "Клиент",
|
|
384
|
+
country: "Държава",
|
|
385
|
+
deliveryDate: "Дата на доставка",
|
|
386
|
+
pickDate: "Дата на пикване",
|
|
387
|
+
cratesOnThisCart: "Каси на тази количка",
|
|
388
|
+
description: "Описание",
|
|
389
|
+
crates: "Каси",
|
|
390
|
+
unit: "Единица",
|
|
391
|
+
noLines: "Няма редове",
|
|
392
|
+
printedVia: "Отпечатано чрез Пик станция",
|
|
393
|
+
checklistTitle: "Контролен списък на колички",
|
|
394
|
+
checklistPrintView: "Контролен списък — преглед за печат",
|
|
395
|
+
reprint: "Отпечатай отново",
|
|
396
|
+
close: "Затвори",
|
|
397
|
+
totalCarts: "Общо колички",
|
|
398
|
+
colKarnr: "НОМЕР",
|
|
399
|
+
colFusten: "КАСИ",
|
|
400
|
+
colLand: "ДЪРЖАВА",
|
|
401
|
+
colKlaarzetten: "ГОТОВО ДО",
|
|
402
|
+
colStatus: "СТАТУС",
|
|
403
|
+
noCartsToday: "Днес няма колички за проверка.",
|
|
404
|
+
checkedBy: "Проверил",
|
|
405
|
+
dateTime: "Дата / час",
|
|
406
|
+
signature: "Подпис",
|
|
407
|
+
statusNotPrinted: "Неотпечатано",
|
|
408
|
+
statusPrinted: (n) => `✓ Отпечатано${n > 1 ? ` (${n}×)` : ""}`,
|
|
409
|
+
statusChecked: "✓ Проверено",
|
|
410
|
+
statusReady: "Готово за транспорт",
|
|
411
|
+
statusShipped: "В транспорт",
|
|
412
|
+
statusDelivered: "✓ Доставено",
|
|
413
|
+
};
|
|
414
|
+
const printUk = {
|
|
415
|
+
packingSlip: "Накладна",
|
|
416
|
+
order: "Замовлення",
|
|
417
|
+
cart: "Візок",
|
|
418
|
+
cartOf: (i, t) => `Візок ${i} / ${t}`,
|
|
419
|
+
cartNumber: "Номер візка",
|
|
420
|
+
customer: "Клієнт",
|
|
421
|
+
country: "Країна",
|
|
422
|
+
deliveryDate: "Дата доставки",
|
|
423
|
+
pickDate: "Дата пікінгу",
|
|
424
|
+
cratesOnThisCart: "Ящики на цьому візку",
|
|
425
|
+
description: "Опис",
|
|
426
|
+
crates: "Ящики",
|
|
427
|
+
unit: "Одиниця",
|
|
428
|
+
noLines: "Немає рядків",
|
|
429
|
+
printedVia: "Надруковано через Пік-станцію",
|
|
430
|
+
checklistTitle: "Контрольний список візків",
|
|
431
|
+
checklistPrintView: "Контрольний список — попередній перегляд",
|
|
432
|
+
reprint: "Надрукувати знову",
|
|
433
|
+
close: "Закрити",
|
|
434
|
+
totalCarts: "Всього візків",
|
|
435
|
+
colKarnr: "НОМЕР",
|
|
436
|
+
colFusten: "ЯЩИКИ",
|
|
437
|
+
colLand: "КРАЇНА",
|
|
438
|
+
colKlaarzetten: "ГОТОВО ДО",
|
|
439
|
+
colStatus: "СТАТУС",
|
|
440
|
+
noCartsToday: "Сьогодні немає візків для перевірки.",
|
|
441
|
+
checkedBy: "Перевірив",
|
|
442
|
+
dateTime: "Дата / час",
|
|
443
|
+
signature: "Підпис",
|
|
444
|
+
statusNotPrinted: "Не надруковано",
|
|
445
|
+
statusPrinted: (n) => `✓ Надруковано${n > 1 ? ` (${n}×)` : ""}`,
|
|
446
|
+
statusChecked: "✓ Перевірено",
|
|
447
|
+
statusReady: "Готово до транспортування",
|
|
448
|
+
statusShipped: "У дорозі",
|
|
449
|
+
statusDelivered: "✓ Доставлено",
|
|
450
|
+
};
|
|
451
|
+
export const PICKSTATION_PRINT_DICT = {
|
|
452
|
+
nl: printNl,
|
|
453
|
+
en: printEn,
|
|
454
|
+
pl: printPl,
|
|
455
|
+
ro: printRo,
|
|
456
|
+
bg: printBg,
|
|
457
|
+
uk: printUk,
|
|
458
|
+
};
|
|
459
|
+
/**
|
|
460
|
+
* Resolve een printvertaling met fallback naar Nederlands. Wanneer een specifieke taalset
|
|
461
|
+
* ontbreekt of leeg is voor een veld, wordt dit gelogd zodat vertalingen kunnen worden aangevuld.
|
|
462
|
+
*/
|
|
463
|
+
export function getPrintDict(lang) {
|
|
464
|
+
const resolved = lang && PICKSTATION_PRINT_DICT[lang] ? lang : "nl";
|
|
465
|
+
if (lang && !PICKSTATION_PRINT_DICT[lang]) {
|
|
466
|
+
// eslint-disable-next-line no-console
|
|
467
|
+
console.warn(`[pickstation-i18n] Ontbrekende printvertaling voor taal '${lang}', fallback naar 'nl'.`);
|
|
468
|
+
}
|
|
469
|
+
return PICKSTATION_PRINT_DICT[resolved];
|
|
470
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickstationOrders.server.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationOrders.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pickstationOrders.server.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationOrders.server.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA8P5E,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyU/E;AAED,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,CAER;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,UAAU,GAAG,QAAQ,EAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAChE,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// public Pickstation works without a service-role key.
|
|
4
4
|
import { createClient } from "@supabase/supabase-js";
|
|
5
5
|
import { calculateOrderPlanning, distributePickDates, DEFAULT_PICKUP_MOMENT, } from "./planning";
|
|
6
|
+
import { normalizePickupMoments, normalizePlanningCarriers, sanitizeWeekdays, selectCarrierForTarget, } from "./carrierPlanning";
|
|
6
7
|
const LOG_SCOPE = "[pickstation]";
|
|
7
8
|
function debug(action, details) {
|
|
8
9
|
console.info(`${LOG_SCOPE} ${action}`, {
|
|
@@ -61,6 +62,24 @@ function pickCountry(raw) {
|
|
|
61
62
|
pickStr(raw, "deliveryCountry", "countryCode") ??
|
|
62
63
|
null);
|
|
63
64
|
}
|
|
65
|
+
function pickProvince(raw) {
|
|
66
|
+
const buyer = raw.buyer;
|
|
67
|
+
const customer = raw.customer;
|
|
68
|
+
const addr = raw.deliveryAddress ??
|
|
69
|
+
raw.shipTo ??
|
|
70
|
+
buyer?.address ??
|
|
71
|
+
customer?.address;
|
|
72
|
+
return pickStr(addr ?? {}, "province", "state", "region");
|
|
73
|
+
}
|
|
74
|
+
function pickCity(raw) {
|
|
75
|
+
const buyer = raw.buyer;
|
|
76
|
+
const customer = raw.customer;
|
|
77
|
+
const addr = raw.deliveryAddress ??
|
|
78
|
+
raw.shipTo ??
|
|
79
|
+
buyer?.address ??
|
|
80
|
+
customer?.address;
|
|
81
|
+
return pickStr(addr ?? {}, "city", "locality");
|
|
82
|
+
}
|
|
64
83
|
function pickDeliveryDate(raw) {
|
|
65
84
|
const candidates = [
|
|
66
85
|
raw.deliveryDate,
|
|
@@ -140,10 +159,10 @@ export async function loadTodaysPickstationOrders() {
|
|
|
140
159
|
const startedAt = Date.now();
|
|
141
160
|
const supabase = getPublicClient();
|
|
142
161
|
debug("load orders started", {
|
|
143
|
-
query: "rpc
|
|
162
|
+
query: "rpc pickstation_get_planning_context + pickstation_get_orders_raw",
|
|
144
163
|
});
|
|
145
164
|
const [settingsRes, ordersRes] = await Promise.all([
|
|
146
|
-
supabase.rpc("
|
|
165
|
+
supabase.rpc("pickstation_get_planning_context"),
|
|
147
166
|
supabase.rpc("pickstation_get_orders_raw"),
|
|
148
167
|
]);
|
|
149
168
|
if (settingsRes.error) {
|
|
@@ -151,9 +170,9 @@ export async function loadTodaysPickstationOrders() {
|
|
|
151
170
|
code: settingsRes.error.code,
|
|
152
171
|
details: settingsRes.error.details,
|
|
153
172
|
hint: settingsRes.error.hint,
|
|
154
|
-
query: "rpc
|
|
173
|
+
query: "rpc pickstation_get_planning_context",
|
|
155
174
|
});
|
|
156
|
-
throw new Error(`Pickstation-
|
|
175
|
+
throw new Error(`Pickstation-planningscontext: ${settingsRes.error.message}`);
|
|
157
176
|
}
|
|
158
177
|
if (ordersRes.error) {
|
|
159
178
|
errorLog("orders rpc failed", new Error(ordersRes.error.message), {
|
|
@@ -170,18 +189,11 @@ export async function loadTodaysPickstationOrders() {
|
|
|
170
189
|
const maxEarlier = typeof settingsRaw.max_workdays_earlier_pick === "number"
|
|
171
190
|
? settingsRaw.max_workdays_earlier_pick
|
|
172
191
|
: 2;
|
|
173
|
-
const pickupMoments = Array.isArray(settingsRaw.pickup_moments) && settingsRaw.pickup_moments.length > 0
|
|
174
|
-
? settingsRaw.pickup_moments
|
|
175
|
-
: [DEFAULT_PICKUP_MOMENT];
|
|
176
192
|
const pickWeekdays = Array.isArray(settingsRaw.pick_weekdays) && settingsRaw.pick_weekdays.length > 0
|
|
177
193
|
? settingsRaw.pick_weekdays
|
|
178
194
|
: [1, 2, 3, 4, 5];
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
: [1, 2, 3, 4, 5];
|
|
182
|
-
const carrierDeliveryWeekdays = Array.isArray(settingsRaw.carrier_delivery_weekdays) && settingsRaw.carrier_delivery_weekdays.length > 0
|
|
183
|
-
? settingsRaw.carrier_delivery_weekdays
|
|
184
|
-
: [1, 2, 3, 4, 5];
|
|
195
|
+
const carriers = normalizePlanningCarriers(Array.isArray(settingsRaw.carriers) ? settingsRaw.carriers : []);
|
|
196
|
+
const manualTargets = settingsRaw.manual_targets ?? {};
|
|
185
197
|
const payload = (ordersRes.data ?? {
|
|
186
198
|
floriday: [],
|
|
187
199
|
manual: [],
|
|
@@ -196,7 +208,7 @@ export async function loadTodaysPickstationOrders() {
|
|
|
196
208
|
pickDays,
|
|
197
209
|
distributionEnabled,
|
|
198
210
|
maxEarlier,
|
|
199
|
-
|
|
211
|
+
carriers: carriers.length,
|
|
200
212
|
});
|
|
201
213
|
const items = [];
|
|
202
214
|
const skippedWithoutPlanning = [];
|
|
@@ -219,6 +231,12 @@ export async function loadTodaysPickstationOrders() {
|
|
|
219
231
|
for (const row of payload.floriday ?? []) {
|
|
220
232
|
const data = (row.data ?? {});
|
|
221
233
|
const deliveryDate = pickDeliveryDate(data);
|
|
234
|
+
const carrier = selectCarrierForTarget(carriers, {
|
|
235
|
+
country: pickCountry(data),
|
|
236
|
+
province: pickProvince(data),
|
|
237
|
+
city: pickCity(data),
|
|
238
|
+
});
|
|
239
|
+
const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [DEFAULT_PICKUP_MOMENT];
|
|
222
240
|
const planning = calculateOrderPlanning(deliveryDate, {
|
|
223
241
|
pickupMoments,
|
|
224
242
|
pickDurationWorkdays: pickDays,
|
|
@@ -227,9 +245,14 @@ export async function loadTodaysPickstationOrders() {
|
|
|
227
245
|
data.orderDateTime ??
|
|
228
246
|
null,
|
|
229
247
|
pickWeekdays,
|
|
230
|
-
carrierPickupWeekdays,
|
|
231
|
-
carrierDeliveryWeekdays,
|
|
248
|
+
carrierPickupWeekdays: sanitizeWeekdays(carrier?.pickup_weekdays),
|
|
249
|
+
carrierDeliveryWeekdays: sanitizeWeekdays(carrier?.delivery_weekdays),
|
|
250
|
+
carrierId: carrier?.id ?? null,
|
|
251
|
+
carrierName: carrier?.name ?? null,
|
|
252
|
+
orderId: row.id,
|
|
232
253
|
});
|
|
254
|
+
if (planning && carrier)
|
|
255
|
+
planning.carrierName = carrier.name;
|
|
233
256
|
const id = row.id ?? data.salesOrderId ?? crypto.randomUUID();
|
|
234
257
|
if (!planning) {
|
|
235
258
|
skippedWithoutPlanning.push({
|
|
@@ -256,14 +279,27 @@ export async function loadTodaysPickstationOrders() {
|
|
|
256
279
|
});
|
|
257
280
|
}
|
|
258
281
|
for (const row of payload.manual ?? []) {
|
|
282
|
+
const target = manualTargets[row.id] ?? {};
|
|
283
|
+
const carrier = selectCarrierForTarget(carriers, {
|
|
284
|
+
carrierId: target.carrier_id,
|
|
285
|
+
country: target.country ?? row.country,
|
|
286
|
+
province: target.province,
|
|
287
|
+
city: target.city,
|
|
288
|
+
});
|
|
289
|
+
const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [DEFAULT_PICKUP_MOMENT];
|
|
259
290
|
const planning = calculateOrderPlanning(row.delivery_date, {
|
|
260
291
|
pickupMoments,
|
|
261
292
|
pickDurationWorkdays: pickDays,
|
|
262
293
|
orderCreatedAt: row.created_at,
|
|
263
294
|
pickWeekdays,
|
|
264
|
-
carrierPickupWeekdays,
|
|
265
|
-
carrierDeliveryWeekdays,
|
|
295
|
+
carrierPickupWeekdays: sanitizeWeekdays(carrier?.pickup_weekdays),
|
|
296
|
+
carrierDeliveryWeekdays: sanitizeWeekdays(carrier?.delivery_weekdays),
|
|
297
|
+
carrierId: carrier?.id ?? null,
|
|
298
|
+
carrierName: carrier?.name ?? null,
|
|
299
|
+
orderId: row.id,
|
|
266
300
|
});
|
|
301
|
+
if (planning && carrier)
|
|
302
|
+
planning.carrierName = carrier.name;
|
|
267
303
|
if (!planning) {
|
|
268
304
|
skippedWithoutPlanning.push({
|
|
269
305
|
source: "manual",
|
|
@@ -278,7 +314,7 @@ export async function loadTodaysPickstationOrders() {
|
|
|
278
314
|
id: row.id,
|
|
279
315
|
orderNumber: row.order_number ?? "—",
|
|
280
316
|
customerName: row.customer_name ?? "—",
|
|
281
|
-
country: null,
|
|
317
|
+
country: target.country ?? row.country ?? null,
|
|
282
318
|
deliveryDate: row.delivery_date,
|
|
283
319
|
},
|
|
284
320
|
carts,
|
|
@@ -370,6 +406,7 @@ export async function loadTodaysPickstationOrders() {
|
|
|
370
406
|
country: it.meta.country,
|
|
371
407
|
deliveryDate: it.meta.deliveryDate,
|
|
372
408
|
pickupDate: it.planning?.pickupDate ? toIsoDay(it.planning.pickupDate) : null,
|
|
409
|
+
pickupTime: it.planning?.selectedMoment?.pickup_time ?? null,
|
|
373
410
|
carrierName: it.planning?.carrierName ?? null,
|
|
374
411
|
pickDate: todayIso,
|
|
375
412
|
cartIndex: idx + 1,
|
|
@@ -18,6 +18,8 @@ export interface PickstationOrder {
|
|
|
18
18
|
country: string | null;
|
|
19
19
|
deliveryDate: string | null;
|
|
20
20
|
pickupDate: string | null;
|
|
21
|
+
/** Ophaaltijd ("HH:MM") volgens het geselecteerde ophaalmoment, indien bekend. */
|
|
22
|
+
pickupTime: string | null;
|
|
21
23
|
carrierName: string | null;
|
|
22
24
|
pickDate: string;
|
|
23
25
|
/** 1-based volgnummer van de kar binnen de order. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickstationTypes.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationTypes.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,UAAU,GAAG,QAAQ,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oFAAoF;IACpF,MAAM,EAAE,UAAU,CAAC;IACnB,gFAAgF;IAChF,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC"}
|
|
1
|
+
{"version":3,"file":"pickstationTypes.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationTypes.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,UAAU,GAAG,QAAQ,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kFAAkF;IAClF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oFAAoF;IACpF,MAAM,EAAE,UAAU,CAAC;IACnB,gFAAgF;IAChF,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC"}
|
|
@@ -35,6 +35,10 @@ export interface PlanningRules {
|
|
|
35
35
|
carrierPickupWeekdays?: number[];
|
|
36
36
|
/** ISO-dagnummers waarop de vervoerder bij de klant bezorgt. */
|
|
37
37
|
carrierDeliveryWeekdays?: number[];
|
|
38
|
+
/** Debug/context voor logging van leverdatumberekeningen. */
|
|
39
|
+
carrierId?: string | null;
|
|
40
|
+
carrierName?: string | null;
|
|
41
|
+
orderId?: string | null;
|
|
38
42
|
}
|
|
39
43
|
export interface PickAssignment {
|
|
40
44
|
date: Date;
|
|
@@ -59,6 +63,20 @@ export interface OrderPlanning {
|
|
|
59
63
|
reason?: string;
|
|
60
64
|
/** Naam van de gekozen vervoerder (indien bekend). */
|
|
61
65
|
carrierName?: string;
|
|
66
|
+
/** Vroegst haalbare leverdatum volgens dezelfde actuele regels. */
|
|
67
|
+
earliestDeliveryDate?: Date;
|
|
68
|
+
}
|
|
69
|
+
export interface EarliestDeliveryRules {
|
|
70
|
+
pickupMoments: PickupMoment[];
|
|
71
|
+
/** Werkdagen orderpicktijd vóór transport. */
|
|
72
|
+
pickDurationWorkdays: number;
|
|
73
|
+
orderCreatedAt?: string | Date | null;
|
|
74
|
+
holidays?: Date[];
|
|
75
|
+
/** ISO-dagnummers waarop de vervoerder bij de klant bezorgt. */
|
|
76
|
+
carrierDeliveryWeekdays?: number[];
|
|
77
|
+
carrierId?: string | null;
|
|
78
|
+
carrierName?: string | null;
|
|
79
|
+
orderId?: string | null;
|
|
62
80
|
}
|
|
63
81
|
/** ISO-dagnummer 1=ma … 7=zo van een Date. */
|
|
64
82
|
export declare function isoWeekday(d: Date): number;
|
|
@@ -72,6 +90,21 @@ export declare function snapToAllowedDay(date: Date, allowedWeekdays: number[] |
|
|
|
72
90
|
export declare function isWorkday(d: Date, holidays?: Date[]): boolean;
|
|
73
91
|
export declare function subtractWorkdays(date: Date, n: number, holidays?: Date[]): Date;
|
|
74
92
|
export declare function addWorkdays(date: Date, n: number, holidays?: Date[]): Date;
|
|
93
|
+
/**
|
|
94
|
+
* Bepaalt de datum waarop een Sales Order automatisch verwerkt mag worden
|
|
95
|
+
* (acknowledge → delivery order → fulfillment order → afleverbrief).
|
|
96
|
+
*
|
|
97
|
+
* Formule:
|
|
98
|
+
* targetDate = leverdatum − (maxWorkdaysEarlierPick + eventueel stickers) werkdagen
|
|
99
|
+
* Ligt targetDate niet op een pickWeekday? → schuif terug naar de vorige geldige pickdag.
|
|
100
|
+
*/
|
|
101
|
+
export declare function computeAutoProcessDate(deliveryDate: Date, opts: {
|
|
102
|
+
maxWorkdaysEarlierPick: number;
|
|
103
|
+
extraPickDaysWithStickers?: number;
|
|
104
|
+
hasStickers?: boolean;
|
|
105
|
+
pickWeekdays?: number[];
|
|
106
|
+
holidays?: Date[];
|
|
107
|
+
}): Date;
|
|
75
108
|
/**
|
|
76
109
|
* Bepaal de aanmelddeadline van een moment voor een gegeven bezorgdag.
|
|
77
110
|
*/
|
|
@@ -83,6 +116,7 @@ export declare function getSignupDeadline(deliveryDate: Date, moment: PickupMome
|
|
|
83
116
|
* - Als alle deadlines verstreken zijn → laatste moment (best effort).
|
|
84
117
|
*/
|
|
85
118
|
export declare function selectPickupMoment(deliveryDate: Date, orderCreatedAt: Date | null | undefined, moments: PickupMoment[], holidays?: Date[]): PickupMoment;
|
|
119
|
+
export declare function calculateEarliestDeliveryDate(rules: EarliestDeliveryRules): Date;
|
|
86
120
|
export declare function calculateOrderPlanning(deliveryDate: string | Date | null | undefined, rules: PlanningRules): OrderPlanning | null;
|
|
87
121
|
export interface PickDistributionOptions<T = unknown> {
|
|
88
122
|
enabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAOnC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,wDAAwD;IACxD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,gEAAgE;IAChE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/planning.js
CHANGED
|
@@ -84,6 +84,34 @@ export function addWorkdays(date, n, holidays) {
|
|
|
84
84
|
}
|
|
85
85
|
return out;
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Bepaalt de datum waarop een Sales Order automatisch verwerkt mag worden
|
|
89
|
+
* (acknowledge → delivery order → fulfillment order → afleverbrief).
|
|
90
|
+
*
|
|
91
|
+
* Formule:
|
|
92
|
+
* targetDate = leverdatum − (maxWorkdaysEarlierPick + eventueel stickers) werkdagen
|
|
93
|
+
* Ligt targetDate niet op een pickWeekday? → schuif terug naar de vorige geldige pickdag.
|
|
94
|
+
*/
|
|
95
|
+
export function computeAutoProcessDate(deliveryDate, opts) {
|
|
96
|
+
const extra = opts.hasStickers ? (opts.extraPickDaysWithStickers ?? 0) : 0;
|
|
97
|
+
const daysBefore = Math.max(0, Math.floor(opts.maxWorkdaysEarlierPick) + extra);
|
|
98
|
+
let target = subtractWorkdays(deliveryDate, daysBefore, opts.holidays);
|
|
99
|
+
const allowed = new Set((opts.pickWeekdays ?? [1, 2, 3, 4, 5]).filter((n) => n >= 1 && n <= 7));
|
|
100
|
+
if (allowed.size === 0)
|
|
101
|
+
return target;
|
|
102
|
+
// ISO: ma=1..zo=7. JS: zo=0..za=6.
|
|
103
|
+
const iso = (d) => {
|
|
104
|
+
const g = d.getDay();
|
|
105
|
+
return g === 0 ? 7 : g;
|
|
106
|
+
};
|
|
107
|
+
// Schuif max 14 dagen terug om een geldige pickdag te vinden.
|
|
108
|
+
let guard = 14;
|
|
109
|
+
while (!allowed.has(iso(target)) && guard-- > 0) {
|
|
110
|
+
target = new Date(target);
|
|
111
|
+
target.setDate(target.getDate() - 1);
|
|
112
|
+
}
|
|
113
|
+
return target;
|
|
114
|
+
}
|
|
87
115
|
function parseHHMM(time) {
|
|
88
116
|
const [h = "0", m = "0"] = (time ?? "").split(":");
|
|
89
117
|
return { h: Number(h) || 0, m: Number(m) || 0 };
|
|
@@ -125,6 +153,32 @@ export function selectPickupMoment(deliveryDate, orderCreatedAt, moments, holida
|
|
|
125
153
|
}
|
|
126
154
|
return sorted[sorted.length - 1];
|
|
127
155
|
}
|
|
156
|
+
export function calculateEarliestDeliveryDate(rules) {
|
|
157
|
+
const orderCreated = rules.orderCreatedAt == null
|
|
158
|
+
? new Date()
|
|
159
|
+
: rules.orderCreatedAt instanceof Date
|
|
160
|
+
? rules.orderCreatedAt
|
|
161
|
+
: new Date(rules.orderCreatedAt);
|
|
162
|
+
const base = Number.isNaN(orderCreated.getTime()) ? new Date() : orderCreated;
|
|
163
|
+
const moments = rules.pickupMoments.length > 0 ? rules.pickupMoments : [DEFAULT_PICKUP_MOMENT];
|
|
164
|
+
const leadDays = moments.reduce((max, moment) => Math.max(max, moment.signup_days, moment.pickup_days, moment.delivery_days), 0);
|
|
165
|
+
const workdaysToAdd = Math.max(0, Math.floor(rules.pickDurationWorkdays)) + leadDays;
|
|
166
|
+
const raw = addWorkdays(base, workdaysToAdd, rules.holidays);
|
|
167
|
+
const earliest = snapToAllowedDay(raw, rules.carrierDeliveryWeekdays, "forward", rules.holidays);
|
|
168
|
+
console.info("[delivery-planning] earliest delivery calculated", {
|
|
169
|
+
at: new Date().toISOString(),
|
|
170
|
+
orderId: rules.orderId ?? null,
|
|
171
|
+
carrierId: rules.carrierId ?? null,
|
|
172
|
+
carrierName: rules.carrierName ?? null,
|
|
173
|
+
carrierLeadDays: leadDays,
|
|
174
|
+
orderPickWorkdays: rules.pickDurationWorkdays,
|
|
175
|
+
orderCreatedAt: base.toISOString(),
|
|
176
|
+
rawEarliestDeliveryDate: raw.toISOString().slice(0, 10),
|
|
177
|
+
finalEarliestDeliveryDate: earliest.toISOString().slice(0, 10),
|
|
178
|
+
carrierDeliveryWeekdays: normalizeWeekdays(rules.carrierDeliveryWeekdays),
|
|
179
|
+
});
|
|
180
|
+
return earliest;
|
|
181
|
+
}
|
|
128
182
|
export function calculateOrderPlanning(deliveryDate, rules) {
|
|
129
183
|
if (!deliveryDate)
|
|
130
184
|
return null;
|
|
@@ -139,12 +193,23 @@ export function calculateOrderPlanning(deliveryDate, rules) {
|
|
|
139
193
|
? rules.orderCreatedAt
|
|
140
194
|
: new Date(rules.orderCreatedAt);
|
|
141
195
|
const reasons = [];
|
|
196
|
+
const earliestDeliveryDate = calculateEarliestDeliveryDate({
|
|
197
|
+
pickupMoments: moments,
|
|
198
|
+
pickDurationWorkdays: rules.pickDurationWorkdays,
|
|
199
|
+
orderCreatedAt: orderCreated,
|
|
200
|
+
holidays: rules.holidays,
|
|
201
|
+
carrierDeliveryWeekdays: rules.carrierDeliveryWeekdays,
|
|
202
|
+
carrierId: rules.carrierId,
|
|
203
|
+
carrierName: rules.carrierName,
|
|
204
|
+
orderId: rules.orderId,
|
|
205
|
+
});
|
|
142
206
|
// 1) Snap bezorgdatum vooruit naar een dag waarop de vervoerder bezorgt.
|
|
143
207
|
const delivery = snapToAllowedDay(requested, rules.carrierDeliveryWeekdays, "forward", rules.holidays);
|
|
144
208
|
if (!sameDay(delivery, requested)) {
|
|
145
209
|
reasons.push(`Bezorgdatum verschoven naar ${delivery.toLocaleDateString("nl-NL")} omdat de vervoerder niet bezorgt op de gevraagde dag.`);
|
|
146
210
|
}
|
|
147
211
|
const moment = selectPickupMoment(delivery, orderCreated, moments, rules.holidays);
|
|
212
|
+
const carrierLeadDays = Math.max(moment.signup_days, moment.pickup_days, moment.delivery_days);
|
|
148
213
|
// 2) Ophaaldatum: terugtellen op werkdagen, daarna snappen op ophaaldagen vervoerder.
|
|
149
214
|
const pickupRaw = subtractWorkdays(delivery, moment.pickup_days, rules.holidays);
|
|
150
215
|
const pickup = snapToAllowedDay(pickupRaw, rules.carrierPickupWeekdays, "backward", rules.holidays);
|
|
@@ -161,6 +226,24 @@ export function calculateOrderPlanning(deliveryDate, rules) {
|
|
|
161
226
|
if (reasons.length === 0) {
|
|
162
227
|
reasons.push(`Planning gebaseerd op ophaalmoment ${moment.pickup_time ?? "standaard"}.`);
|
|
163
228
|
}
|
|
229
|
+
console.info("[delivery-planning] calculated", {
|
|
230
|
+
at: new Date().toISOString(),
|
|
231
|
+
orderId: rules.orderId ?? null,
|
|
232
|
+
carrierId: rules.carrierId ?? null,
|
|
233
|
+
carrierName: rules.carrierName ?? null,
|
|
234
|
+
carrierLeadDays,
|
|
235
|
+
orderPickWorkdays: rules.pickDurationWorkdays,
|
|
236
|
+
earliestDeliveryDate: earliestDeliveryDate.toISOString().slice(0, 10),
|
|
237
|
+
requestedDeliveryDate: requested.toISOString().slice(0, 10),
|
|
238
|
+
finalDeliveryDate: delivery.toISOString().slice(0, 10),
|
|
239
|
+
pickupDate: pickup.toISOString().slice(0, 10),
|
|
240
|
+
pickStartDate: pickStart.toISOString().slice(0, 10),
|
|
241
|
+
pickupMoment: moment,
|
|
242
|
+
pickWeekdays: normalizeWeekdays(rules.pickWeekdays),
|
|
243
|
+
carrierPickupWeekdays: normalizeWeekdays(rules.carrierPickupWeekdays),
|
|
244
|
+
carrierDeliveryWeekdays: normalizeWeekdays(rules.carrierDeliveryWeekdays),
|
|
245
|
+
reason: reasons.join(" "),
|
|
246
|
+
});
|
|
164
247
|
return {
|
|
165
248
|
deliveryDate: delivery,
|
|
166
249
|
requestedDeliveryDate: requested,
|
|
@@ -172,6 +255,7 @@ export function calculateOrderPlanning(deliveryDate, rules) {
|
|
|
172
255
|
movedEarlier: false,
|
|
173
256
|
selectedMoment: moment,
|
|
174
257
|
reason: reasons.join(" "),
|
|
258
|
+
earliestDeliveryDate,
|
|
175
259
|
};
|
|
176
260
|
}
|
|
177
261
|
export function distributePickDates(items, options) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/floriday-afhandeling-module",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -88,6 +88,20 @@
|
|
|
88
88
|
"export": "ControlePage",
|
|
89
89
|
"route": "afhandeling/controle",
|
|
90
90
|
"title": "Controle Karren"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"export": "PickstationPage",
|
|
94
|
+
"route": "pickstation",
|
|
95
|
+
"title": "Pickstation",
|
|
96
|
+
"nav": false,
|
|
97
|
+
"public": true
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"export": "KioskControle",
|
|
101
|
+
"route": "controle",
|
|
102
|
+
"title": "KioskControle",
|
|
103
|
+
"nav": false,
|
|
104
|
+
"public": true
|
|
91
105
|
}
|
|
92
106
|
]
|
|
93
107
|
}
|