@flowselections/floriday-afhandeling-module 1.0.39 → 1.0.41

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 (40) hide show
  1. package/dist-lib/components/afhandeling/ControleLijstPrint.js +54 -54
  2. package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -1
  3. package/dist-lib/components/afhandeling/ControlePage.js +36 -2
  4. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  5. package/dist-lib/components/afhandeling/DagDetailDialog.js +3 -2
  6. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  7. package/dist-lib/components/afhandeling/WeekAgendaView.js +38 -45
  8. package/dist-lib/components/pickstation/PakbonTemplate.js +70 -70
  9. package/dist-lib/hooks/useCartIndex.d.ts +11 -0
  10. package/dist-lib/hooks/useCartIndex.d.ts.map +1 -0
  11. package/dist-lib/hooks/useCartIndex.js +56 -0
  12. package/dist-lib/hooks/useConsistencyCheck.d.ts +8 -0
  13. package/dist-lib/hooks/useConsistencyCheck.d.ts.map +1 -0
  14. package/dist-lib/hooks/useConsistencyCheck.js +22 -0
  15. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  16. package/dist-lib/hooks/useOrderPlanning.js +6 -2
  17. package/dist-lib/hooks/usePickAgenda.d.ts +32 -0
  18. package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -0
  19. package/dist-lib/hooks/usePickAgenda.js +75 -0
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts +527 -1
  21. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  22. package/dist-lib/integrations/supabase/client.server.d.ts +527 -1
  23. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  24. package/dist-lib/integrations/supabase/moduleClient.d.ts +527 -1
  25. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  26. package/dist-lib/integrations/supabase/types.d.ts +530 -1
  27. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  28. package/dist-lib/lib/afhandelingSettings.functions.d.ts +1056 -4
  29. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/carrierSignupMail.server.js +26 -26
  31. package/dist-lib/lib/carriers.functions.d.ts +2635 -5
  32. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/cartAssignments.functions.d.ts +2635 -5
  34. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/cartControl.functions.d.ts +5330 -81
  36. package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/cartControl.functions.js +92 -127
  38. package/dist-lib/lib/floriday.functions.d.ts +528 -2
  39. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Eenmalige controle bij het laden van de agenda. Deze module corrigeert niets
3
+ * zelf: bij een afwijking tonen we alleen een discrete melding.
4
+ */
5
+ export declare function useConsistencyCheck(): {
6
+ misaligned: boolean;
7
+ };
8
+ //# sourceMappingURL=useConsistencyCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConsistencyCheck.d.ts","sourceRoot":"","sources":["../../src/hooks/useConsistencyCheck.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,mBAAmB;;EAelC"}
@@ -0,0 +1,22 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { supabase } from "../integrations/supabase/moduleClient";
3
+ /**
4
+ * Eenmalige controle bij het laden van de agenda. Deze module corrigeert niets
5
+ * zelf: bij een afwijking tonen we alleen een discrete melding.
6
+ */
7
+ export function useConsistencyCheck() {
8
+ const query = useQuery({
9
+ queryKey: ["logistics-consistency-check"],
10
+ staleTime: Infinity,
11
+ retry: false,
12
+ refetchOnWindowFocus: false,
13
+ queryFn: async () => {
14
+ const { data, error } = await supabase.rpc("logistics_consistency_check");
15
+ if (error)
16
+ return true; // Geen melding tonen als de controle zelf faalt.
17
+ const rows = Array.isArray(data) ? data : [];
18
+ return rows.every((r) => r.ok !== false);
19
+ },
20
+ });
21
+ return { misaligned: query.data === false };
22
+ }
@@ -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;AAEzB,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,CAiTxF"}
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"}
@@ -7,6 +7,7 @@ import { safeServerCall } from "../lib/serverFnError";
7
7
  import { normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget } from "../lib/carrierPlanning";
8
8
  import { calculateOrderPlanning, DEFAULT_PICKUP_MOMENT, } from "../lib/planning";
9
9
  import { useEngineTasks } from "./useEngineTasks";
10
+ import { useCartIndex } from "./useCartIndex";
10
11
  import { emitEngineEvent, listComposeTaskRefs } from "../lib/logisticsEngine/engine";
11
12
  import { orderRefsFor } from "../lib/orderRefs";
12
13
  import { MAX_ATTEMPTS, emitQueueStatus, markInFlight, markResult, resetEmitQueue, selectEmitBatch, } from "../lib/logisticsEngine/emitQueue";
@@ -102,6 +103,8 @@ export function useOrderPlanning(range) {
102
103
  refetchOnWindowFocus: true,
103
104
  });
104
105
  const composeExists = composeExistsQuery.data;
106
+ // Karrentelling komt uit de gedeelde karindex van de Engine.
107
+ const { cartsForOrder } = useCartIndex(from, to);
105
108
  const planned = useMemo(() => {
106
109
  const orders = orderList;
107
110
  const carriers = carriersQuery.data?.carriers ?? [];
@@ -169,7 +172,8 @@ export function useOrderPlanning(range) {
169
172
  // Order zonder bruikbare leverdatum: taak bestaat, planning niet.
170
173
  return fallback("task_without_start");
171
174
  }
172
- const carrierCount = order.cartCount ?? task.payload?.loadCarriers?.length ?? 1;
175
+ // Karren komen uitsluitend uit de gedeelde karindex van de Engine.
176
+ const carrierCount = cartsForOrder(order.orderNumber, order.id) ?? 0;
173
177
  const planning = {
174
178
  ...base,
175
179
  pickStartDate: start,
@@ -187,7 +191,7 @@ export function useOrderPlanning(range) {
187
191
  };
188
192
  return { order, planning, engineTask: task, awaitingEngine: false, state: "planned", hasComposeTask: true };
189
193
  });
190
- }, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists]);
194
+ }, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists, cartsForOrder]);
191
195
  // Orders zonder taak melden we bij de Engine; zelf indelen mag niet.
192
196
  // De meldlus is begrensd: max MAX_PER_ROUND orders per ronde, pogingenteller
193
197
  // met backoff per order, en na MAX_ATTEMPTS definitief opgeven met melding.
@@ -0,0 +1,32 @@
1
+ /** Eén order op een pickdag volgens de Engine. */
2
+ export interface PickAgendaOrder {
3
+ taskId: string;
4
+ orderRef: string;
5
+ status: string;
6
+ carts: number;
7
+ plants: number;
8
+ shifted: boolean;
9
+ }
10
+ /** Eén dagregel uit `logistics_pick_agenda`. */
11
+ export interface PickAgendaDay {
12
+ pickDate: string;
13
+ orderCount: number;
14
+ cartCount: number;
15
+ plantCount: number;
16
+ inPreparation: number;
17
+ ready: number;
18
+ shiftedCount: number;
19
+ orders: PickAgendaOrder[];
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
+ export declare function usePickAgenda(from: string | null, to: string | null): {
27
+ days: NoInfer<PickAgendaDay[]>;
28
+ byDate: Map<string, PickAgendaDay>;
29
+ isLoading: boolean;
30
+ error: string | null;
31
+ };
32
+ //# sourceMappingURL=usePickAgenda.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,75 @@
1
+ import { useEffect } from "react";
2
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { supabase } from "../integrations/supabase/moduleClient";
4
+ function toOrders(value) {
5
+ if (!Array.isArray(value))
6
+ return [];
7
+ return value.map((o) => {
8
+ const r = (o ?? {});
9
+ return {
10
+ taskId: String(r.taskId ?? ""),
11
+ orderRef: String(r.orderRef ?? ""),
12
+ status: String(r.status ?? ""),
13
+ carts: Number(r.carts ?? 0),
14
+ plants: Number(r.plants ?? 0),
15
+ shifted: Boolean(r.shifted),
16
+ };
17
+ });
18
+ }
19
+ /**
20
+ * Pickagenda van de Logistics Engine. De RPC is de enige bron: deze module
21
+ * berekent zelf geen pickdagen meer en doet geen datum- of tijdzonelogica.
22
+ * Dagen zonder rij tonen simpelweg nullen.
23
+ */
24
+ export function usePickAgenda(from, to) {
25
+ const queryClient = useQueryClient();
26
+ const queryKey = ["logistics-pick-agenda", from, to];
27
+ const query = useQuery({
28
+ queryKey,
29
+ enabled: !!from && !!to,
30
+ staleTime: 30000,
31
+ retry: false,
32
+ refetchInterval: 60000,
33
+ refetchOnWindowFocus: true,
34
+ queryFn: async () => {
35
+ const { data, error } = await supabase.rpc("logistics_pick_agenda", {
36
+ p_from: from,
37
+ p_to: to,
38
+ });
39
+ if (error)
40
+ throw new Error(error.message);
41
+ const dagen = Array.isArray(data) ? data : [];
42
+ return dagen.map((d) => ({
43
+ pickDate: d.pick_date,
44
+ orderCount: Number(d.order_count ?? 0),
45
+ cartCount: Number(d.cart_count ?? 0),
46
+ plantCount: Number(d.plant_count ?? 0),
47
+ inPreparation: Number(d.in_preparation ?? 0),
48
+ ready: Number(d.ready ?? 0),
49
+ shiftedCount: Number(d.shifted_count ?? 0),
50
+ orders: toOrders(d.orders),
51
+ }));
52
+ },
53
+ });
54
+ // Ververs zodra de Engine taken wijzigt.
55
+ useEffect(() => {
56
+ const channel = supabase
57
+ .channel("pick-agenda-logistics-tasks")
58
+ .on("postgres_changes", { event: "*", schema: "public", table: "logistics_tasks" }, () => {
59
+ queryClient.invalidateQueries({ queryKey: ["logistics-pick-agenda"] });
60
+ })
61
+ .subscribe();
62
+ return () => {
63
+ supabase.removeChannel(channel);
64
+ };
65
+ }, [queryClient]);
66
+ const byDate = new Map();
67
+ for (const d of query.data ?? [])
68
+ byDate.set(d.pickDate, d);
69
+ return {
70
+ days: query.data ?? [],
71
+ byDate,
72
+ isLoading: query.isLoading,
73
+ error: query.error instanceof Error ? query.error.message : null,
74
+ };
75
+ }