@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.
- package/dist-lib/components/afhandeling/ControleLijstPrint.js +54 -54
- package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/ControlePage.js +36 -2
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +3 -2
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +38 -45
- package/dist-lib/components/pickstation/PakbonTemplate.js +70 -70
- package/dist-lib/hooks/useCartIndex.d.ts +11 -0
- package/dist-lib/hooks/useCartIndex.d.ts.map +1 -0
- package/dist-lib/hooks/useCartIndex.js +56 -0
- package/dist-lib/hooks/useConsistencyCheck.d.ts +8 -0
- package/dist-lib/hooks/useConsistencyCheck.d.ts.map +1 -0
- package/dist-lib/hooks/useConsistencyCheck.js +22 -0
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +6 -2
- package/dist-lib/hooks/usePickAgenda.d.ts +32 -0
- package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -0
- package/dist-lib/hooks/usePickAgenda.js +75 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +527 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +527 -1
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +527 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +530 -1
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +1056 -4
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/carrierSignupMail.server.js +26 -26
- package/dist-lib/lib/carriers.functions.d.ts +2635 -5
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.d.ts +2635 -5
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +5330 -81
- package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.js +92 -127
- package/dist-lib/lib/floriday.functions.d.ts +528 -2
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- 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;
|
|
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
|
-
|
|
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
|
+
}
|