@flowselections/floriday-afhandeling-module 1.0.42 → 1.0.43

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 (92) hide show
  1. package/dist-lib/components/afhandeling/AutoProcessStatus.d.ts +3 -1
  2. package/dist-lib/components/afhandeling/AutoProcessStatus.d.ts.map +1 -1
  3. package/dist-lib/components/afhandeling/AutoProcessStatus.js +36 -3
  4. package/dist-lib/components/afhandeling/ControleLijstPrint.js +54 -54
  5. package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -1
  6. package/dist-lib/components/afhandeling/ControlePage.js +23 -25
  7. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +1 -1
  8. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  9. package/dist-lib/components/afhandeling/DagDetailDialog.js +410 -121
  10. package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
  11. package/dist-lib/components/afhandeling/PickAgendaView.js +4 -4
  12. package/dist-lib/components/afhandeling/PickingPage.d.ts.map +1 -1
  13. package/dist-lib/components/afhandeling/PickingPage.js +1 -1
  14. package/dist-lib/components/afhandeling/ScanControleView.d.ts +2 -0
  15. package/dist-lib/components/afhandeling/ScanControleView.d.ts.map +1 -0
  16. package/dist-lib/components/afhandeling/ScanControleView.js +158 -0
  17. package/dist-lib/components/afhandeling/VervoerdersPage.js +1 -1
  18. package/dist-lib/components/afhandeling/VerzetOrderDialog.js +1 -1
  19. package/dist-lib/components/afhandeling/WeekAgendaView.js +1 -1
  20. package/dist-lib/components/pickstation/PakbonTemplate.js +70 -70
  21. package/dist-lib/hooks/useCartIndex.d.ts.map +1 -1
  22. package/dist-lib/hooks/useCartIndex.js +6 -1
  23. package/dist-lib/hooks/useEngineTasks.js +1 -1
  24. package/dist-lib/hooks/useKnownOrders.d.ts +11 -0
  25. package/dist-lib/hooks/useKnownOrders.d.ts.map +1 -0
  26. package/dist-lib/hooks/useKnownOrders.js +54 -0
  27. package/dist-lib/hooks/useOrderBuffers.d.ts +17 -0
  28. package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -0
  29. package/dist-lib/hooks/useOrderBuffers.js +53 -0
  30. package/dist-lib/hooks/useOrderPickDates.d.ts +10 -0
  31. package/dist-lib/hooks/useOrderPickDates.d.ts.map +1 -0
  32. package/dist-lib/hooks/useOrderPickDates.js +62 -0
  33. package/dist-lib/hooks/useOrderPlanning.d.ts +1 -3
  34. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  35. package/dist-lib/hooks/useOrderPlanning.js +9 -13
  36. package/dist-lib/hooks/usePickAgenda.d.ts +0 -5
  37. package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -1
  38. package/dist-lib/hooks/usePickAgenda.js +62 -9
  39. package/dist-lib/hooks/usePickMode.d.ts +10 -0
  40. package/dist-lib/hooks/usePickMode.d.ts.map +1 -0
  41. package/dist-lib/hooks/usePickMode.js +31 -0
  42. package/dist-lib/index.d.ts +2 -0
  43. package/dist-lib/index.d.ts.map +1 -1
  44. package/dist-lib/index.js +19 -6
  45. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2027 -86
  46. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  47. package/dist-lib/integrations/supabase/client.server.d.ts +2027 -86
  48. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  49. package/dist-lib/integrations/supabase/client.server.js +1 -1
  50. package/dist-lib/integrations/supabase/moduleClient.d.ts +2027 -86
  51. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  52. package/dist-lib/integrations/supabase/types.d.ts +2097 -114
  53. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  54. package/dist-lib/integrations/supabase/types.js +1 -0
  55. package/dist-lib/lib/afhandelingSettings.functions.d.ts +4018 -140
  56. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/carrierSignupMail.server.js +26 -26
  58. package/dist-lib/lib/carriers.functions.d.ts +10072 -367
  59. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  60. package/dist-lib/lib/cartAssignments.functions.d.ts +10072 -367
  61. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/cartControl.functions.d.ts +45879 -579
  63. package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
  64. package/dist-lib/lib/cartControl.functions.js +134 -10
  65. package/dist-lib/lib/deliveryNote.functions.d.ts +25891 -0
  66. package/dist-lib/lib/deliveryNote.functions.d.ts.map +1 -0
  67. package/dist-lib/lib/deliveryNote.functions.js +32 -0
  68. package/dist-lib/lib/engineLayouts.functions.d.ts +25889 -0
  69. package/dist-lib/lib/engineLayouts.functions.d.ts.map +1 -0
  70. package/dist-lib/lib/engineLayouts.functions.js +42 -0
  71. package/dist-lib/lib/floriday.functions.d.ts +27885 -52
  72. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  73. package/dist-lib/lib/floriday.functions.js +118 -343
  74. package/dist-lib/lib/logisticsEngine/reschedule.d.ts +17 -0
  75. package/dist-lib/lib/logisticsEngine/reschedule.d.ts.map +1 -1
  76. package/dist-lib/lib/logisticsEngine/reschedule.js +63 -0
  77. package/dist-lib/lib/orderFulfilment.functions.d.ts +25891 -0
  78. package/dist-lib/lib/orderFulfilment.functions.d.ts.map +1 -0
  79. package/dist-lib/lib/orderFulfilment.functions.js +35 -0
  80. package/dist-lib/lib/orderStatus.d.ts +10 -0
  81. package/dist-lib/lib/orderStatus.d.ts.map +1 -0
  82. package/dist-lib/lib/orderStatus.js +81 -0
  83. package/dist-lib/lib/pickDates.functions.d.ts +25896 -0
  84. package/dist-lib/lib/pickDates.functions.d.ts.map +1 -0
  85. package/dist-lib/lib/pickDates.functions.js +56 -0
  86. package/dist-lib/lib/pickMode.d.ts +14 -0
  87. package/dist-lib/lib/pickMode.d.ts.map +1 -0
  88. package/dist-lib/lib/pickMode.js +103 -0
  89. package/dist-lib/lib/printing.d.ts +3 -1
  90. package/dist-lib/lib/printing.d.ts.map +1 -1
  91. package/dist-lib/lib/printing.js +1 -0
  92. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrderPickDates.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPickDates.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,wBAAgB,iBAAiB;gCA+BlB,MAAM,kBAAkB,MAAM,KAAG,MAAM;;EAerD"}
@@ -0,0 +1,62 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useServerFn } from "@tanstack/react-start";
4
+ import { listOrderPickDates } from "../lib/pickDates.functions";
5
+ import { normalizeOrderNumber } from "../lib/orderRefs";
6
+ function keyOf(value) {
7
+ if (!value)
8
+ return null;
9
+ const trimmed = value.trim();
10
+ if (!trimmed || trimmed === "—" || trimmed === "-")
11
+ return null;
12
+ return normalizeOrderNumber(trimmed) ?? trimmed.toUpperCase();
13
+ }
14
+ /**
15
+ * Corrigeert de pickdag die de Engine teruggeeft. De Engine schuift oude taken
16
+ * door naar vandaag; een order hoort te staan op de dag waarop hij ooit
17
+ * gepland is en nooit ná zijn leverdatum.
18
+ */
19
+ export function useOrderPickDates() {
20
+ const fetchDates = useServerFn(listOrderPickDates);
21
+ const query = useQuery({
22
+ queryKey: ["order-pick-dates"],
23
+ queryFn: () => fetchDates(),
24
+ staleTime: 60000,
25
+ retry: 1,
26
+ });
27
+ const map = useMemo(() => {
28
+ const m = new Map();
29
+ for (const it of query.data?.items ?? []) {
30
+ const existing = m.get(it.ref);
31
+ if (existing) {
32
+ // Zelfde order, meerdere refs: pak de vroegste bekende plandag.
33
+ if (it.firstPlannedDate &&
34
+ (!existing.firstPlannedDate || it.firstPlannedDate < existing.firstPlannedDate)) {
35
+ existing.firstPlannedDate = it.firstPlannedDate;
36
+ }
37
+ if (!existing.deliveryDate)
38
+ existing.deliveryDate = it.deliveryDate;
39
+ continue;
40
+ }
41
+ m.set(it.ref, { deliveryDate: it.deliveryDate, firstPlannedDate: it.firstPlannedDate });
42
+ }
43
+ return m;
44
+ }, [query.data]);
45
+ /** Dag waarop deze order getoond moet worden, gegeven de dag van de Engine. */
46
+ const correctPickDate = useCallback((orderRef, enginePickDate) => {
47
+ const k = keyOf(orderRef);
48
+ if (!k)
49
+ return enginePickDate;
50
+ const info = map.get(k);
51
+ if (!info?.deliveryDate)
52
+ return enginePickDate;
53
+ // Pas ingrijpen als de Engine de order ná de leverdatum plant.
54
+ if (enginePickDate <= info.deliveryDate)
55
+ return enginePickDate;
56
+ const first = info.firstPlannedDate;
57
+ if (first && first <= info.deliveryDate)
58
+ return first;
59
+ return info.deliveryDate;
60
+ }, [map]);
61
+ return { correctPickDate, isLoading: query.isLoading };
62
+ }
@@ -7,7 +7,7 @@ import { type EngineTask } from "../lib/logisticsEngine/engine";
7
7
  * "niet gemirrord" om actie in de Verkoop-module en "taak zonder starttijd" om
8
8
  * onderzoek aan de Engine-kant.
9
9
  */
10
- export type PlanningState = "planned" | "awaiting_engine" | "outside_window" | "not_mirrored" | "task_without_start";
10
+ export type PlanningState = "planned" | "awaiting_engine" | "outside_window" | "task_without_start";
11
11
  export interface PlannedOrder {
12
12
  order: FloridayOrder;
13
13
  /** Planning volgens de Logistics Engine. Null zolang er geen planning is. */
@@ -29,8 +29,6 @@ export interface UseOrderPlanningResult {
29
29
  awaiting: PlannedOrder[];
30
30
  /** Orders met een taak die buiten de zichtbare periode is ingedeeld. */
31
31
  outsideWindow: PlannedOrder[];
32
- /** Cache-orders die de Verkoop-module nog niet naar public.orders schreef. */
33
- notMirrored: PlannedOrder[];
34
32
  /** Orders met een taak zonder geldige planned_start. */
35
33
  tasksWithoutStart: PlannedOrder[];
36
34
  /** Foutmelding als het signaal naar de Engine niet verstuurd kon worden. */
@@ -1 +1 @@
1
- {"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAWtG;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,KAAK,EAAE,aAAa,CAAC;IACrB,uEAAuE;IACvE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,wEAAwE;IACxE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAGD,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAqTxF"}
1
+ {"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAYtG;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,KAAK,EAAE,aAAa,CAAC;IACrB,uEAAuE;IACvE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,wEAAwE;IACxE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,wDAAwD;IACxD,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAGD,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAkTxF"}
@@ -10,6 +10,7 @@ import { useEngineTasks } from "./useEngineTasks";
10
10
  import { useCartIndex } from "./useCartIndex";
11
11
  import { emitEngineEvent, listComposeTaskRefs } from "../lib/logisticsEngine/engine";
12
12
  import { orderRefsFor } from "../lib/orderRefs";
13
+ import { isOpenOrderStatus } from "../lib/orderStatus";
13
14
  import { MAX_ATTEMPTS, emitQueueStatus, markInFlight, markResult, resetEmitQueue, selectEmitBatch, } from "../lib/logisticsEngine/emitQueue";
14
15
  export function useOrderPlanning(range) {
15
16
  const from = range?.from ?? null;
@@ -152,11 +153,6 @@ export function useOrderPlanning(range) {
152
153
  hasComposeTask,
153
154
  });
154
155
  if (!hasComposeTask) {
155
- // Cache-order zonder rij in public.orders: de Engine kán er geen taak
156
- // voor hebben. Dat is geen wachten op indeling.
157
- if (order.source === "floriday" && order.mirrored === false) {
158
- return fallback("not_mirrored");
159
- }
160
156
  return fallback("awaiting_engine");
161
157
  }
162
158
  if (!task) {
@@ -192,6 +188,9 @@ export function useOrderPlanning(range) {
192
188
  return { order, planning, engineTask: task, awaitingEngine: false, state: "planned", hasComposeTask: true };
193
189
  });
194
190
  }, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists, cartsForOrder]);
191
+ // Alleen echt open orders mogen bij de Logistics Engine worden aangemeld;
192
+ // afgehandelde orders blijven wel zichtbaar maar krijgen geen melding meer.
193
+ const openPlanned = useMemo(() => planned.filter((p) => isOpenOrderStatus(p.order.status)), [planned]);
195
194
  // Orders zonder taak melden we bij de Engine; zelf indelen mag niet.
196
195
  // De meldlus is begrensd: max MAX_PER_ROUND orders per ronde, pogingenteller
197
196
  // met backoff per order, en na MAX_ATTEMPTS definitief opgeven met melding.
@@ -200,7 +199,7 @@ export function useOrderPlanning(range) {
200
199
  let cancelled = false;
201
200
  const byRef = new Map();
202
201
  const withTask = [];
203
- for (const item of planned) {
202
+ for (const item of openPlanned) {
204
203
  const ref = item.order.orderNumber || item.order.id;
205
204
  if (!ref)
206
205
  continue;
@@ -210,8 +209,6 @@ export function useOrderPlanning(range) {
210
209
  withTask.push(ref);
211
210
  continue;
212
211
  }
213
- // Cache-orders zonder rij in public.orders melden we niet: de Engine kan
214
- // er niets mee, dat is een mirror-probleem in de Verkoop-module.
215
212
  if (item.state !== "awaiting_engine")
216
213
  continue;
217
214
  if (!byRef.has(ref))
@@ -268,7 +265,7 @@ export function useOrderPlanning(range) {
268
265
  return () => {
269
266
  cancelled = true;
270
267
  };
271
- }, [planned]);
268
+ }, [openPlanned]);
272
269
  // Tijdstip van de laatste Engine-ronde: nieuwste taak die we kennen.
273
270
  const lastEngineRun = useMemo(() => {
274
271
  let latest = null;
@@ -282,10 +279,9 @@ export function useOrderPlanning(range) {
282
279
  return {
283
280
  planned,
284
281
  nearestDeliveryDate: ordersQuery.data?.nearestDeliveryDate ?? null,
285
- awaiting: planned.filter((p) => p.state === "awaiting_engine"),
286
- outsideWindow: planned.filter((p) => p.state === "outside_window"),
287
- notMirrored: planned.filter((p) => p.state === "not_mirrored"),
288
- tasksWithoutStart: planned.filter((p) => p.state === "task_without_start"),
282
+ awaiting: openPlanned.filter((p) => p.state === "awaiting_engine"),
283
+ outsideWindow: openPlanned.filter((p) => p.state === "outside_window"),
284
+ tasksWithoutStart: openPlanned.filter((p) => p.state === "task_without_start"),
289
285
  signalError,
290
286
  lastEngineRun,
291
287
  isLoading: ordersQuery.isLoading || carriersQuery.isLoading || tasksLoading,
@@ -18,11 +18,6 @@ export interface PickAgendaDay {
18
18
  shiftedCount: number;
19
19
  orders: PickAgendaOrder[];
20
20
  }
21
- /**
22
- * Pickagenda van de Logistics Engine. De RPC is de enige bron: deze module
23
- * berekent zelf geen pickdagen meer en doet geen datum- of tijdzonelogica.
24
- * Dagen zonder rij tonen simpelweg nullen.
25
- */
26
21
  export declare function usePickAgenda(from: string | null, to: string | null): {
27
22
  days: PickAgendaDay[];
28
23
  byDate: Map<string, PickAgendaDay>;
@@ -1 +1 @@
1
- {"version":3,"file":"usePickAgenda.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickAgenda.ts"],"names":[],"mappings":"AAIA,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA4BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;;;;;EAyDnE"}
1
+ {"version":3,"file":"usePickAgenda.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickAgenda.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAuCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;;;;;EAuGnE"}
@@ -1,6 +1,8 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useMemo } from "react";
2
2
  import { useQuery, useQueryClient } from "@tanstack/react-query";
3
3
  import { supabase } from "../integrations/supabase/moduleClient";
4
+ import { useKnownOrders } from "./useKnownOrders";
5
+ import { useOrderPickDates } from "./useOrderPickDates";
4
6
  function toOrders(value) {
5
7
  if (!Array.isArray(value))
6
8
  return [];
@@ -21,20 +23,29 @@ function toOrders(value) {
21
23
  * berekent zelf geen pickdagen meer en doet geen datum- of tijdzonelogica.
22
24
  * Dagen zonder rij tonen simpelweg nullen.
23
25
  */
26
+ function shiftDay(day, delta) {
27
+ const d = new Date(`${day}T12:00:00Z`);
28
+ d.setUTCDate(d.getUTCDate() + delta);
29
+ return d.toISOString().slice(0, 10);
30
+ }
24
31
  export function usePickAgenda(from, to) {
25
32
  const queryClient = useQueryClient();
26
- const queryKey = ["logistics-pick-agenda", from, to];
33
+ // Ruimer ophalen dan gevraagd: de Engine schuift oude taken naar vandaag, wij
34
+ // zetten ze terug op hun oorspronkelijke dag en dat kan buiten de week vallen.
35
+ const wideFrom = from ? shiftDay(from, -180) : null;
36
+ const wideTo = to ? shiftDay(to, 30) : null;
37
+ const queryKey = ["logistics-pick-agenda", wideFrom, wideTo];
27
38
  const query = useQuery({
28
39
  queryKey,
29
- enabled: !!from && !!to,
40
+ enabled: !!wideFrom && !!wideTo,
30
41
  staleTime: 30000,
31
42
  retry: false,
32
43
  refetchInterval: 60000,
33
44
  refetchOnWindowFocus: true,
34
45
  queryFn: async () => {
35
46
  const { data, error } = await supabase.rpc("logistics_pick_agenda", {
36
- p_from: from,
37
- p_to: to,
47
+ p_from: wideFrom,
48
+ p_to: wideTo,
38
49
  });
39
50
  if (error)
40
51
  throw new Error(error.message);
@@ -51,10 +62,12 @@ export function usePickAgenda(from, to) {
51
62
  }));
52
63
  },
53
64
  });
54
- // Ververs zodra de Engine taken wijzigt.
65
+ // Ververs zodra de Engine taken wijzigt. Elke hook-instantie krijgt een eigen
66
+ // kanaalnaam; hergebruik van dezelfde naam laat Supabase een al-geabonneerd
67
+ // kanaal terugvinden en gooit "cannot add postgres_changes after subscribe()".
55
68
  useEffect(() => {
56
69
  const channel = supabase
57
- .channel("pick-agenda-logistics-tasks")
70
+ .channel(`pick-agenda-logistics-tasks-${Math.random().toString(36).slice(2)}`)
58
71
  .on("postgres_changes", { event: "*", schema: "public", table: "logistics_tasks" }, () => {
59
72
  queryClient.invalidateQueries({ queryKey: ["logistics-pick-agenda"] });
60
73
  })
@@ -63,11 +76,51 @@ export function usePickAgenda(from, to) {
63
76
  supabase.removeChannel(channel);
64
77
  };
65
78
  }, [queryClient]);
79
+ // Orders die de Verkoop-module niet kent horen hier niet te staan, en orders
80
+ // die de Engine ná hun leverdatum plant gaan terug naar hun eigen dag. De
81
+ // dagtotalen worden opnieuw opgeteld uit wat overblijft.
82
+ const { isKnownRef } = useKnownOrders();
83
+ const { correctPickDate } = useOrderPickDates();
84
+ const days = useMemo(() => {
85
+ const perDay = new Map();
86
+ for (const d of query.data ?? []) {
87
+ if (!perDay.has(d.pickDate))
88
+ perDay.set(d.pickDate, []);
89
+ for (const o of d.orders) {
90
+ if (!isKnownRef(o.orderRef))
91
+ continue;
92
+ const dag = correctPickDate(o.orderRef, d.pickDate);
93
+ const list = perDay.get(dag) ?? [];
94
+ list.push(o);
95
+ perDay.set(dag, list);
96
+ }
97
+ }
98
+ const out = [];
99
+ for (const [pickDate, orders] of perDay) {
100
+ if (from && pickDate < from)
101
+ continue;
102
+ if (to && pickDate > to)
103
+ continue;
104
+ const ready = orders.filter((o) => o.status === "ready" || o.status === "done").length;
105
+ out.push({
106
+ pickDate,
107
+ orders,
108
+ orderCount: orders.length,
109
+ cartCount: orders.reduce((s, o) => s + (o.carts || 0), 0),
110
+ plantCount: orders.reduce((s, o) => s + (o.plants || 0), 0),
111
+ ready,
112
+ inPreparation: Math.max(0, orders.length - ready),
113
+ shiftedCount: orders.filter((o) => o.shifted).length,
114
+ });
115
+ }
116
+ out.sort((a, b) => a.pickDate.localeCompare(b.pickDate));
117
+ return out;
118
+ }, [query.data, isKnownRef, correctPickDate, from, to]);
66
119
  const byDate = new Map();
67
- for (const d of query.data ?? [])
120
+ for (const d of days)
68
121
  byDate.set(d.pickDate, d);
69
122
  return {
70
- days: query.data ?? [],
123
+ days,
71
124
  byDate,
72
125
  isLoading: query.isLoading,
73
126
  error: query.error instanceof Error ? query.error.message : null,
@@ -0,0 +1,10 @@
1
+ /**
2
+ * De Engine bepaalt de actieve pickmethode. Alleen bij "picken per kar"
3
+ * bestaat er een karcontrolestap. Zonder antwoord blijft die verborgen.
4
+ */
5
+ export declare function usePickMode(): {
6
+ pickMode: "order" | "buffer" | "cart" | "smallest" | null;
7
+ showCartControl: boolean;
8
+ isLoading: boolean;
9
+ };
10
+ //# sourceMappingURL=usePickMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePickMode.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickMode.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,WAAW;;;;EA0B1B"}
@@ -0,0 +1,31 @@
1
+ import { useEffect } from "react";
2
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { fetchPickMode, startPickModeWatch, subscribePickMode, } from "../lib/pickMode";
4
+ /**
5
+ * De Engine bepaalt de actieve pickmethode. Alleen bij "picken per kar"
6
+ * bestaat er een karcontrolestap. Zonder antwoord blijft die verborgen.
7
+ */
8
+ export function usePickMode() {
9
+ const queryClient = useQueryClient();
10
+ const query = useQuery({
11
+ queryKey: ["logistics-pick-mode"],
12
+ staleTime: 5000,
13
+ refetchInterval: 30000,
14
+ refetchOnWindowFocus: true,
15
+ refetchOnMount: "always",
16
+ retry: false,
17
+ queryFn: fetchPickMode,
18
+ });
19
+ // Live meelopen met wijzigingen in de instellingen van de Engine.
20
+ useEffect(() => {
21
+ startPickModeWatch();
22
+ return subscribePickMode(() => {
23
+ queryClient.invalidateQueries({ queryKey: ["logistics-pick-mode"] });
24
+ });
25
+ }, [queryClient]);
26
+ return {
27
+ pickMode: query.data?.pickMode ?? null,
28
+ showCartControl: query.data?.showCartControl === true,
29
+ isLoading: query.isLoading,
30
+ };
31
+ }
@@ -14,5 +14,7 @@ export { AfhandelingSettingsCard } from "./components/settings/AfhandelingSettin
14
14
  export { VervoerdersSettingsCard } from "./components/settings/VervoerdersSettingsCard";
15
15
  export { calculateEarliestDeliveryDate, calculateOrderPlanning, DEFAULT_PICKUP_MOMENT, type EarliestDeliveryRules, type OrderPlanning, type PickupMoment, } from "./lib/planning";
16
16
  export { carrierLeadDaysFromMoments, normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget, type CarrierOrderTarget, type CarrierPlanningInfo, } from "./lib/carrierPlanning";
17
+ export { ensurePickMode, fetchPickMode, getPickMode, refreshPickMode, startPickModeWatch, subscribePickMode, type PickMode, type PickModeInfo } from "./lib/pickMode";
18
+ export { usePickMode } from "./hooks/usePickMode";
17
19
  export declare const floridayAfhandelingModule: FlowModule;
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAK/B,eAAO,MAAM,yBAAyB,EAAE,UAkBvC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtK,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAalD,eAAO,MAAM,yBAAyB,EAAE,UAmBvC,CAAC"}
package/dist-lib/index.js CHANGED
@@ -16,19 +16,32 @@ export { calculateEarliestDeliveryDate, calculateOrderPlanning, DEFAULT_PICKUP_M
16
16
  export { carrierLeadDaysFromMoments, normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget, } from "./lib/carrierPlanning";
17
17
  import { AfhandelingSettingsCard } from "./components/settings/AfhandelingSettingsCard";
18
18
  import { VervoerdersSettingsCard } from "./components/settings/VervoerdersSettingsCard";
19
+ import { ensurePickMode, getPickMode } from "./lib/pickMode";
20
+ export { ensurePickMode, fetchPickMode, getPickMode, refreshPickMode, startPickModeWatch, subscribePickMode } from "./lib/pickMode";
21
+ export { usePickMode } from "./hooks/usePickMode";
22
+ const baseChildren = [
23
+ { label: "Pick Agenda", href: "/afhandeling/picking", icon: CalendarCheck },
24
+ { label: "Planning en leveringen", href: "/afhandeling/leveringen", icon: CalendarRange },
25
+ ];
26
+ const cartControlChild = {
27
+ label: "Controle karren",
28
+ href: "/afhandeling/controle",
29
+ icon: ClipboardCheck,
30
+ };
19
31
  export const floridayAfhandelingModule = {
20
32
  id: "afhandeling",
21
33
  name: "Afhandeling",
22
- version: "1.3.0",
34
+ version: "1.4.0",
23
35
  nav: {
24
36
  label: "Afhandeling",
25
37
  href: "/afhandeling/picking",
26
38
  icon: PackageCheck,
27
- children: [
28
- { label: "Pick Agenda", href: "/afhandeling/picking", icon: CalendarCheck },
29
- { label: "Planning en leveringen", href: "/afhandeling/leveringen", icon: CalendarRange },
30
- { label: "Controle karren", href: "/afhandeling/controle", icon: ClipboardCheck },
31
- ],
39
+ // De Engine beslist: karcontrole hoort alleen bij "picken per kar".
40
+ // Zonder antwoord blijft het item verborgen (fail closed).
41
+ get children() {
42
+ void ensurePickMode();
43
+ return getPickMode().showCartControl ? [...baseChildren, cartControlChild] : baseChildren;
44
+ },
32
45
  },
33
46
  settingsCards: [
34
47
  { component: VervoerdersSettingsCard, order: 80 },