@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.
Files changed (80) hide show
  1. package/dist-lib/components/afhandeling/AutoProcessStatus.d.ts +12 -0
  2. package/dist-lib/components/afhandeling/AutoProcessStatus.d.ts.map +1 -0
  3. package/dist-lib/components/afhandeling/AutoProcessStatus.js +103 -0
  4. package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +3 -1
  5. package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts.map +1 -1
  6. package/dist-lib/components/afhandeling/ControleLijstPrint.js +56 -17
  7. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  8. package/dist-lib/components/afhandeling/DagDetailDialog.js +96 -4
  9. package/dist-lib/components/afhandeling/LeveringenPage.js +1 -1
  10. package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
  11. package/dist-lib/components/afhandeling/VervoerdersPage.js +2 -1
  12. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +3 -1
  13. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  14. package/dist-lib/components/afhandeling/WeekAgendaView.js +58 -17
  15. package/dist-lib/components/pickstation/KioskControle.d.ts +2 -0
  16. package/dist-lib/components/pickstation/KioskControle.d.ts.map +1 -0
  17. package/dist-lib/components/pickstation/KioskControle.js +7 -0
  18. package/dist-lib/components/pickstation/PakbonTemplate.d.ts +2 -1
  19. package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
  20. package/dist-lib/components/pickstation/PakbonTemplate.js +20 -17
  21. package/dist-lib/components/pickstation/PickstationPage.d.ts +2 -0
  22. package/dist-lib/components/pickstation/PickstationPage.d.ts.map +1 -0
  23. package/dist-lib/components/pickstation/PickstationPage.js +266 -0
  24. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
  25. package/dist-lib/components/settings/AfhandelingSettingsCard.js +14 -2
  26. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  27. package/dist-lib/hooks/useOrderPlanning.js +28 -11
  28. package/dist-lib/index.d.ts +4 -0
  29. package/dist-lib/index.d.ts.map +1 -1
  30. package/dist-lib/index.js +4 -0
  31. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1243 -63
  32. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  33. package/dist-lib/integrations/supabase/client.d.ts +1243 -63
  34. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  35. package/dist-lib/integrations/supabase/client.server.d.ts +1243 -63
  36. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  37. package/dist-lib/integrations/supabase/types.d.ts +1264 -56
  38. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  39. package/dist-lib/lib/afhandelingSettings.functions.d.ts +2483 -111
  40. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/afhandelingSettings.functions.js +28 -1
  42. package/dist-lib/lib/carrierPlanning.d.ts +25 -0
  43. package/dist-lib/lib/carrierPlanning.d.ts.map +1 -0
  44. package/dist-lib/lib/carrierPlanning.js +65 -0
  45. package/dist-lib/lib/carrierSignupMail.server.d.ts +0 -2
  46. package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -1
  47. package/dist-lib/lib/carrierSignupMail.server.js +53 -216
  48. package/dist-lib/lib/carriers.functions.d.ts +5920 -20
  49. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  50. package/dist-lib/lib/carriers.functions.js +5 -0
  51. package/dist-lib/lib/cartAssignments.functions.d.ts +5920 -20
  52. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/cartControl.functions.d.ts +11843 -40
  54. package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
  55. package/dist-lib/lib/cartControl.functions.js +4 -1
  56. package/dist-lib/lib/cartRescheduling.d.ts.map +1 -1
  57. package/dist-lib/lib/cartRescheduling.js +8 -6
  58. package/dist-lib/lib/countries.d.ts +2 -0
  59. package/dist-lib/lib/countries.d.ts.map +1 -1
  60. package/dist-lib/lib/countries.js +51 -0
  61. package/dist-lib/lib/deliveryNotePrint.d.ts +26 -0
  62. package/dist-lib/lib/deliveryNotePrint.d.ts.map +1 -0
  63. package/dist-lib/lib/deliveryNotePrint.js +172 -0
  64. package/dist-lib/lib/floriday.functions.d.ts +1251 -63
  65. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  66. package/dist-lib/lib/floriday.functions.js +126 -8
  67. package/dist-lib/lib/floridayAutoProcess.d.ts +30 -0
  68. package/dist-lib/lib/floridayAutoProcess.d.ts.map +1 -0
  69. package/dist-lib/lib/floridayAutoProcess.js +70 -0
  70. package/dist-lib/lib/pickstationI18n.d.ts +46 -0
  71. package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
  72. package/dist-lib/lib/pickstationI18n.js +251 -0
  73. package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
  74. package/dist-lib/lib/pickstationOrders.server.js +56 -19
  75. package/dist-lib/lib/pickstationTypes.d.ts +2 -0
  76. package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
  77. package/dist-lib/lib/planning.d.ts +34 -0
  78. package/dist-lib/lib/planning.d.ts.map +1 -1
  79. package/dist-lib/lib/planning.js +84 -0
  80. 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":"AAaA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAmO5E,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0T/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"}
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 pickstation_get_settings + pickstation_get_orders_raw",
162
+ query: "rpc pickstation_get_planning_context + pickstation_get_orders_raw",
144
163
  });
145
164
  const [settingsRes, ordersRes] = await Promise.all([
146
- supabase.rpc("pickstation_get_settings"),
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 pickstation_get_settings",
173
+ query: "rpc pickstation_get_planning_context",
155
174
  });
156
- throw new Error(`Pickstation-instellingen: ${settingsRes.error.message}`);
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 carrierPickupWeekdays = Array.isArray(settingsRaw.carrier_pickup_weekdays) && settingsRaw.carrier_pickup_weekdays.length > 0
180
- ? settingsRaw.carrier_pickup_weekdays
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
- pickupMoments: pickupMoments.length,
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":"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"}
1
+ {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"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"}
@@ -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.12",
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
  }