@flowselections/floriday-afhandeling-module 1.0.43 → 1.0.44
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/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +24 -1
- package/dist-lib/hooks/useEngineBufferEvents.d.ts +7 -0
- package/dist-lib/hooks/useEngineBufferEvents.d.ts.map +1 -0
- package/dist-lib/hooks/useEngineBufferEvents.js +47 -0
- package/dist-lib/hooks/useKnownOrders.d.ts +1 -0
- package/dist-lib/hooks/useKnownOrders.d.ts.map +1 -1
- package/dist-lib/hooks/useKnownOrders.js +26 -1
- package/dist-lib/hooks/usePickAgenda.d.ts +4 -0
- package/dist-lib/hooks/usePickAgenda.d.ts.map +1 -1
- package/dist-lib/hooks/usePickAgenda.js +6 -3
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +173 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +173 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +173 -0
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +173 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +346 -0
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.d.ts +865 -0
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.d.ts +865 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +1903 -0
- package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
- package/dist-lib/lib/deliveryNote.functions.d.ts +173 -0
- package/dist-lib/lib/deliveryNote.functions.d.ts.map +1 -1
- package/dist-lib/lib/engineLayouts.functions.d.ts +173 -0
- package/dist-lib/lib/engineLayouts.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.d.ts +348 -0
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +1 -0
- package/dist-lib/lib/orderFulfilment.functions.d.ts +173 -0
- package/dist-lib/lib/orderFulfilment.functions.d.ts.map +1 -1
- package/dist-lib/lib/pickDates.functions.d.ts +173 -0
- package/dist-lib/lib/pickDates.functions.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WeekAgendaView.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/WeekAgendaView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,oBAAoB,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IACxD,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"WeekAgendaView.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/WeekAgendaView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,oBAAoB,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IACxD,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAgFD,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,KAAK,EACL,YAAY,EACZ,UAAU,GACX,EAAE,mBAAmB,+BAwKrB"}
|
|
@@ -14,6 +14,23 @@ function isOrderReady(o) {
|
|
|
14
14
|
const s = (o.status ?? "").toLowerCase();
|
|
15
15
|
return s.includes("ready") || s.includes("verzendklaar") || s.includes("completed") || s.includes("delivered") || s.includes("afgerond");
|
|
16
16
|
}
|
|
17
|
+
/** Volledig afgehandeld: de order hoeft niets meer te doen op deze dag. */
|
|
18
|
+
function isDoneStatus(status) {
|
|
19
|
+
const s = (status ?? "").toLowerCase();
|
|
20
|
+
if (!s)
|
|
21
|
+
return false;
|
|
22
|
+
return [
|
|
23
|
+
"done",
|
|
24
|
+
"completed",
|
|
25
|
+
"afgerond",
|
|
26
|
+
"afgehandeld",
|
|
27
|
+
"shipped",
|
|
28
|
+
"verzonden",
|
|
29
|
+
"delivered",
|
|
30
|
+
"geleverd",
|
|
31
|
+
"afgeleverd",
|
|
32
|
+
].some((k) => s.includes(k));
|
|
33
|
+
}
|
|
17
34
|
function getISOWeek(d) {
|
|
18
35
|
const date = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
|
|
19
36
|
const dayNum = date.getUTCDay() || 7;
|
|
@@ -85,6 +102,9 @@ export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, onDayCl
|
|
|
85
102
|
planten: row?.plantCount ?? 0,
|
|
86
103
|
verzendklaar: row?.ready ?? 0,
|
|
87
104
|
voorbereiding: row?.inPreparation ?? 0,
|
|
105
|
+
afgehandeld: row
|
|
106
|
+
? Math.max(row.doneCount, row.orders.filter((o) => o.fulfilled || isDoneStatus(o.status)).length)
|
|
107
|
+
: 0,
|
|
88
108
|
};
|
|
89
109
|
}
|
|
90
110
|
const entries = [];
|
|
@@ -116,6 +136,7 @@ export function WeekAgendaView({ planned, mode, isLoading, onOrderClick, onDayCl
|
|
|
116
136
|
planten,
|
|
117
137
|
verzendklaar,
|
|
118
138
|
voorbereiding,
|
|
139
|
+
afgehandeld: entries.filter((e) => isDoneStatus(e.order.status)).length,
|
|
119
140
|
};
|
|
120
141
|
});
|
|
121
142
|
}, [planned, weekStart, mode, pickAgenda.byDate]);
|
|
@@ -147,7 +168,9 @@ function DayRow({ day, onOrderClick, onDayClick, capacity, }) {
|
|
|
147
168
|
const today = new Date();
|
|
148
169
|
today.setHours(0, 0, 0, 0);
|
|
149
170
|
const isToday = isSameDay(day.date, today);
|
|
150
|
-
|
|
171
|
+
// Alles van deze dag is afgehandeld: toon een groene bevestiging.
|
|
172
|
+
const dagAfgesloten = day.bestellingen > 0 && day.afgehandeld >= day.bestellingen;
|
|
173
|
+
return (_jsxs("div", { className: `rounded-lg border bg-card ${isToday ? "ring-1 ring-primary" : ""}`, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-6 px-4 py-4 sm:px-6", children: [_jsxs("div", { className: "w-20 shrink-0", children: [_jsx("div", { className: "text-xs font-medium tracking-wider text-muted-foreground", children: WEEKDAY_LABELS[weekdayIdx] }), _jsx("div", { className: "mt-1 text-3xl font-bold leading-none", children: day.date.getDate() }), _jsxs("div", { className: "text-sm text-muted-foreground", children: [MONTHS_NL_SHORT[day.date.getMonth()], "."] })] }), _jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-6", children: [_jsx(Stat, { icon: _jsx(Package, { className: "h-4 w-4 text-slate-500" }), bg: "bg-slate-100", value: day.bestellingen, label: "bestellingen" }), _jsx(Stat, { icon: _jsx(Truck, { className: "h-4 w-4 text-amber-600" }), bg: "bg-amber-100", value: day.karren, label: "karren" }), _jsx(Stat, { icon: _jsx(Sprout, { className: "h-4 w-4 text-green-600" }), bg: "bg-green-100", value: day.planten, label: "planten" })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [dagAfgesloten && (_jsxs("div", { className: "flex items-center gap-2 rounded-md border border-green-600/30 bg-green-500/15 px-3 py-1.5 text-sm font-medium text-green-700", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), "Dag is afgesloten"] })), day.shiftedCount > 0 && (_jsxs(Badge, { className: "bg-purple-500/10 text-purple-700 hover:bg-purple-500/10", variant: "secondary", title: "Aantal orders dat te laat is aangemeld en door de Engine is verschoven.", children: [_jsx(Scale, { className: "mr-1 h-3.5 w-3.5" }), day.shiftedCount, " te laat aangemeld"] })), day.verzendklaar > 0 && (_jsxs(Badge, { className: "bg-green-500/15 text-green-700 hover:bg-green-500/15", variant: "secondary", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), day.verzendklaar, " verzendklaar"] })), day.voorbereiding > 0 && (_jsxs(Badge, { className: "bg-blue-500/10 text-blue-700 hover:bg-blue-500/10", variant: "secondary", children: [_jsx(Clock, { className: "mr-1 h-3.5 w-3.5" }), day.voorbereiding, " in voorbereiding"] })), onDayClick && day.bestellingen > 0 && (_jsx(Button, { size: "sm", variant: "outline", onClick: () => onDayClick(day.date), children: "Dagdetails" }))] })] }), _jsx(CapacityWarning, { day: capacity, className: "mx-4 mb-4 sm:mx-6" })] }));
|
|
151
174
|
}
|
|
152
175
|
function Stat({ icon, bg, value, label, }) {
|
|
153
176
|
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: `grid h-8 w-8 place-items-center rounded-full ${bg}`, children: icon }), _jsxs("div", { children: [_jsx("div", { className: "text-lg font-bold leading-none", children: value }), _jsx("div", { className: "text-xs text-muted-foreground", children: label })] })] }));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Luistert naar `public.logistics_events` en ververst de agenda's, de
|
|
3
|
+
* karrencontrole en alle karrentellingen zodra de Engine meldt dat een buffer
|
|
4
|
+
* is gesloten of dat een order is losgekoppeld.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useEngineBufferEvents(): void;
|
|
7
|
+
//# sourceMappingURL=useEngineBufferEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEngineBufferEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useEngineBufferEvents.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAsB5C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { supabase } from "../integrations/supabase/moduleClient";
|
|
4
|
+
/** Seintjes van de Engine die de indeling van buffers en karren wijzigen. */
|
|
5
|
+
const BUFFER_EVENTS = new Set(["buffer.closed", "buffer.order_detached"]);
|
|
6
|
+
/**
|
|
7
|
+
* Querykeys die volledig opnieuw bij de Engine opgehaald moeten worden zodra
|
|
8
|
+
* een buffer sluit of een order wordt losgekoppeld. Alles komt van de Engine
|
|
9
|
+
* (logistics_pick_agenda, logistics_delivery_agenda, control_get_todays_carts,
|
|
10
|
+
* logistics_cart_units); deze module telt of cachet niets zelf.
|
|
11
|
+
*/
|
|
12
|
+
const KEYS = [
|
|
13
|
+
["logistics-pick-agenda"],
|
|
14
|
+
["logistics-delivery-agenda"],
|
|
15
|
+
["logistics-cart-index"],
|
|
16
|
+
["control"],
|
|
17
|
+
["order-buffers"],
|
|
18
|
+
["order-pick-dates"],
|
|
19
|
+
["engine"],
|
|
20
|
+
["orders"],
|
|
21
|
+
["known-orders"],
|
|
22
|
+
["floriday"],
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Luistert naar `public.logistics_events` en ververst de agenda's, de
|
|
26
|
+
* karrencontrole en alle karrentellingen zodra de Engine meldt dat een buffer
|
|
27
|
+
* is gesloten of dat een order is losgekoppeld.
|
|
28
|
+
*/
|
|
29
|
+
export function useEngineBufferEvents() {
|
|
30
|
+
const qc = useQueryClient();
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const channel = supabase
|
|
33
|
+
.channel(`engine-buffer-events-${Math.random().toString(36).slice(2)}`)
|
|
34
|
+
.on("postgres_changes", { event: "*", schema: "public", table: "logistics_events" }, (payload) => {
|
|
35
|
+
const row = (payload.new ?? {});
|
|
36
|
+
if (!row.event_type || !BUFFER_EVENTS.has(row.event_type))
|
|
37
|
+
return;
|
|
38
|
+
for (const key of KEYS)
|
|
39
|
+
qc.invalidateQueries({ queryKey: key });
|
|
40
|
+
void qc.refetchQueries({ type: "active" });
|
|
41
|
+
})
|
|
42
|
+
.subscribe();
|
|
43
|
+
return () => {
|
|
44
|
+
supabase.removeChannel(channel);
|
|
45
|
+
};
|
|
46
|
+
}, [qc]);
|
|
47
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKnownOrders.d.ts","sourceRoot":"","sources":["../../src/hooks/useKnownOrders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useKnownOrders.d.ts","sourceRoot":"","sources":["../../src/hooks/useKnownOrders.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,cAAc;;gCAyCV,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAAG,OAAO;oCAavC,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAAG,OAAO;;;EAW1D"}
|
|
@@ -3,6 +3,7 @@ import { useQuery } from "@tanstack/react-query";
|
|
|
3
3
|
import { useServerFn } from "@tanstack/react-start";
|
|
4
4
|
import { listKnownOrders } from "../lib/floriday.functions";
|
|
5
5
|
import { normalizeOrderNumber } from "../lib/orderRefs";
|
|
6
|
+
import { isFulfilledOrderStatus } from "../lib/orderStatus";
|
|
6
7
|
function keyOf(value) {
|
|
7
8
|
if (!value)
|
|
8
9
|
return null;
|
|
@@ -37,6 +38,21 @@ export function useKnownOrders() {
|
|
|
37
38
|
}
|
|
38
39
|
return set;
|
|
39
40
|
}, [query.data]);
|
|
41
|
+
/** Referenties waarvan de Verkoop-module zegt dat ze afgehandeld zijn. */
|
|
42
|
+
const fulfilledRefs = useMemo(() => {
|
|
43
|
+
const set = new Set();
|
|
44
|
+
for (const o of query.data?.orders ?? []) {
|
|
45
|
+
if (!isFulfilledOrderStatus(o.status))
|
|
46
|
+
continue;
|
|
47
|
+
const id = keyOf(o.id);
|
|
48
|
+
const num = keyOf(o.orderNumber);
|
|
49
|
+
if (id)
|
|
50
|
+
set.add(id);
|
|
51
|
+
if (num)
|
|
52
|
+
set.add(num);
|
|
53
|
+
}
|
|
54
|
+
return set;
|
|
55
|
+
}, [query.data]);
|
|
40
56
|
// Zodra de lijst geladen is filteren we, ook als er niets open staat.
|
|
41
57
|
const isReady = !query.isLoading && !!query.data && !query.data.error;
|
|
42
58
|
/** Onbekende referentie? Dan niet tonen. Zolang de lijst laadt: niets filteren. */
|
|
@@ -50,5 +66,14 @@ export function useKnownOrders() {
|
|
|
50
66
|
}
|
|
51
67
|
return false;
|
|
52
68
|
}, [refs, isReady]);
|
|
53
|
-
|
|
69
|
+
/** Waar = deze order staat in de Verkoop-module als afgehandeld. */
|
|
70
|
+
const isFulfilledRef = useCallback((...candidates) => {
|
|
71
|
+
for (const c of candidates) {
|
|
72
|
+
const k = keyOf(c);
|
|
73
|
+
if (k && fulfilledRefs.has(k))
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}, [fulfilledRefs]);
|
|
78
|
+
return { refs, isKnownRef, isFulfilledRef, isReady, isLoading: query.isLoading };
|
|
54
79
|
}
|
|
@@ -6,6 +6,8 @@ export interface PickAgendaOrder {
|
|
|
6
6
|
carts: number;
|
|
7
7
|
plants: number;
|
|
8
8
|
shifted: boolean;
|
|
9
|
+
/** Verkoop-module zegt: deze order is afgehandeld (verzonden/geleverd). */
|
|
10
|
+
fulfilled?: boolean;
|
|
9
11
|
}
|
|
10
12
|
/** Eén dagregel uit `logistics_pick_agenda`. */
|
|
11
13
|
export interface PickAgendaDay {
|
|
@@ -16,6 +18,8 @@ export interface PickAgendaDay {
|
|
|
16
18
|
inPreparation: number;
|
|
17
19
|
ready: number;
|
|
18
20
|
shiftedCount: number;
|
|
21
|
+
/** Aantal orders van deze dag dat al is afgehandeld. */
|
|
22
|
+
doneCount: number;
|
|
19
23
|
orders: PickAgendaOrder[];
|
|
20
24
|
}
|
|
21
25
|
export declare function usePickAgenda(from: string | null, to: string | null): {
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;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,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAwCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;;;;;EA8GnE"}
|
|
@@ -58,6 +58,7 @@ export function usePickAgenda(from, to) {
|
|
|
58
58
|
inPreparation: Number(d.in_preparation ?? 0),
|
|
59
59
|
ready: Number(d.ready ?? 0),
|
|
60
60
|
shiftedCount: Number(d.shifted_count ?? 0),
|
|
61
|
+
doneCount: 0,
|
|
61
62
|
orders: toOrders(d.orders),
|
|
62
63
|
}));
|
|
63
64
|
},
|
|
@@ -79,7 +80,7 @@ export function usePickAgenda(from, to) {
|
|
|
79
80
|
// Orders die de Verkoop-module niet kent horen hier niet te staan, en orders
|
|
80
81
|
// die de Engine ná hun leverdatum plant gaan terug naar hun eigen dag. De
|
|
81
82
|
// dagtotalen worden opnieuw opgeteld uit wat overblijft.
|
|
82
|
-
const { isKnownRef } = useKnownOrders();
|
|
83
|
+
const { isKnownRef, isFulfilledRef } = useKnownOrders();
|
|
83
84
|
const { correctPickDate } = useOrderPickDates();
|
|
84
85
|
const days = useMemo(() => {
|
|
85
86
|
const perDay = new Map();
|
|
@@ -91,7 +92,7 @@ export function usePickAgenda(from, to) {
|
|
|
91
92
|
continue;
|
|
92
93
|
const dag = correctPickDate(o.orderRef, d.pickDate);
|
|
93
94
|
const list = perDay.get(dag) ?? [];
|
|
94
|
-
list.push(o);
|
|
95
|
+
list.push({ ...o, fulfilled: isFulfilledRef(o.orderRef) });
|
|
95
96
|
perDay.set(dag, list);
|
|
96
97
|
}
|
|
97
98
|
}
|
|
@@ -101,6 +102,7 @@ export function usePickAgenda(from, to) {
|
|
|
101
102
|
continue;
|
|
102
103
|
if (to && pickDate > to)
|
|
103
104
|
continue;
|
|
105
|
+
const doneCount = orders.filter((o) => o.fulfilled || o.status === "done" || o.status === "completed").length;
|
|
104
106
|
const ready = orders.filter((o) => o.status === "ready" || o.status === "done").length;
|
|
105
107
|
out.push({
|
|
106
108
|
pickDate,
|
|
@@ -111,11 +113,12 @@ export function usePickAgenda(from, to) {
|
|
|
111
113
|
ready,
|
|
112
114
|
inPreparation: Math.max(0, orders.length - ready),
|
|
113
115
|
shiftedCount: orders.filter((o) => o.shifted).length,
|
|
116
|
+
doneCount,
|
|
114
117
|
});
|
|
115
118
|
}
|
|
116
119
|
out.sort((a, b) => a.pickDate.localeCompare(b.pickDate));
|
|
117
120
|
return out;
|
|
118
|
-
}, [query.data, isKnownRef, correctPickDate, from, to]);
|
|
121
|
+
}, [query.data, isKnownRef, isFulfilledRef, correctPickDate, from, to]);
|
|
119
122
|
const byDate = new Map();
|
|
120
123
|
for (const d of days)
|
|
121
124
|
byDate.set(d.pickDate, d);
|
|
@@ -2155,6 +2155,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2155
2155
|
created_at: string;
|
|
2156
2156
|
currency: string;
|
|
2157
2157
|
distribute_over: string | null;
|
|
2158
|
+
external_id: string | null;
|
|
2159
|
+
external_synced_at: string | null;
|
|
2158
2160
|
group_type: string;
|
|
2159
2161
|
handling_fee: number | null;
|
|
2160
2162
|
id: string;
|
|
@@ -2167,6 +2169,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2167
2169
|
rounding: string;
|
|
2168
2170
|
rounding_step: number;
|
|
2169
2171
|
sort_order: number;
|
|
2172
|
+
source: string;
|
|
2170
2173
|
unit: string;
|
|
2171
2174
|
updated_at: string;
|
|
2172
2175
|
};
|
|
@@ -2177,6 +2180,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2177
2180
|
created_at?: string;
|
|
2178
2181
|
currency?: string;
|
|
2179
2182
|
distribute_over?: string | null;
|
|
2183
|
+
external_id?: string | null;
|
|
2184
|
+
external_synced_at?: string | null;
|
|
2180
2185
|
group_type?: string;
|
|
2181
2186
|
handling_fee?: number | null;
|
|
2182
2187
|
id?: string;
|
|
@@ -2189,6 +2194,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2189
2194
|
rounding?: string;
|
|
2190
2195
|
rounding_step?: number;
|
|
2191
2196
|
sort_order?: number;
|
|
2197
|
+
source?: string;
|
|
2192
2198
|
unit?: string;
|
|
2193
2199
|
updated_at?: string;
|
|
2194
2200
|
};
|
|
@@ -2199,6 +2205,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2199
2205
|
created_at?: string;
|
|
2200
2206
|
currency?: string;
|
|
2201
2207
|
distribute_over?: string | null;
|
|
2208
|
+
external_id?: string | null;
|
|
2209
|
+
external_synced_at?: string | null;
|
|
2202
2210
|
group_type?: string;
|
|
2203
2211
|
handling_fee?: number | null;
|
|
2204
2212
|
id?: string;
|
|
@@ -2211,6 +2219,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
2211
2219
|
rounding?: string;
|
|
2212
2220
|
rounding_step?: number;
|
|
2213
2221
|
sort_order?: number;
|
|
2222
|
+
source?: string;
|
|
2214
2223
|
unit?: string;
|
|
2215
2224
|
updated_at?: string;
|
|
2216
2225
|
};
|
|
@@ -9074,6 +9083,30 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
9074
9083
|
referencedColumns: ["id"];
|
|
9075
9084
|
}];
|
|
9076
9085
|
};
|
|
9086
|
+
job_locks: {
|
|
9087
|
+
Row: {
|
|
9088
|
+
created_at: string;
|
|
9089
|
+
lock_key: string;
|
|
9090
|
+
locked_until: string;
|
|
9091
|
+
owner: string | null;
|
|
9092
|
+
updated_at: string;
|
|
9093
|
+
};
|
|
9094
|
+
Insert: {
|
|
9095
|
+
created_at?: string;
|
|
9096
|
+
lock_key: string;
|
|
9097
|
+
locked_until: string;
|
|
9098
|
+
owner?: string | null;
|
|
9099
|
+
updated_at?: string;
|
|
9100
|
+
};
|
|
9101
|
+
Update: {
|
|
9102
|
+
created_at?: string;
|
|
9103
|
+
lock_key?: string;
|
|
9104
|
+
locked_until?: string;
|
|
9105
|
+
owner?: string | null;
|
|
9106
|
+
updated_at?: string;
|
|
9107
|
+
};
|
|
9108
|
+
Relationships: [];
|
|
9109
|
+
};
|
|
9077
9110
|
layout_logos: {
|
|
9078
9111
|
Row: {
|
|
9079
9112
|
bestand_url: string;
|
|
@@ -10236,6 +10269,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
10236
10269
|
next_attempt_at: string;
|
|
10237
10270
|
order_id: string;
|
|
10238
10271
|
reason: string;
|
|
10272
|
+
reason_code: string | null;
|
|
10239
10273
|
status: string;
|
|
10240
10274
|
updated_at: string;
|
|
10241
10275
|
};
|
|
@@ -10248,6 +10282,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
10248
10282
|
next_attempt_at?: string;
|
|
10249
10283
|
order_id: string;
|
|
10250
10284
|
reason?: string;
|
|
10285
|
+
reason_code?: string | null;
|
|
10251
10286
|
status?: string;
|
|
10252
10287
|
updated_at?: string;
|
|
10253
10288
|
};
|
|
@@ -10260,6 +10295,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
10260
10295
|
next_attempt_at?: string;
|
|
10261
10296
|
order_id?: string;
|
|
10262
10297
|
reason?: string;
|
|
10298
|
+
reason_code?: string | null;
|
|
10263
10299
|
status?: string;
|
|
10264
10300
|
updated_at?: string;
|
|
10265
10301
|
};
|
|
@@ -10964,6 +11000,21 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
10964
11000
|
referencedColumns: ["id"];
|
|
10965
11001
|
}];
|
|
10966
11002
|
};
|
|
11003
|
+
logistics_tick_heartbeat: {
|
|
11004
|
+
Row: {
|
|
11005
|
+
id: boolean;
|
|
11006
|
+
last_tick_at: string;
|
|
11007
|
+
};
|
|
11008
|
+
Insert: {
|
|
11009
|
+
id?: boolean;
|
|
11010
|
+
last_tick_at?: string;
|
|
11011
|
+
};
|
|
11012
|
+
Update: {
|
|
11013
|
+
id?: boolean;
|
|
11014
|
+
last_tick_at?: string;
|
|
11015
|
+
};
|
|
11016
|
+
Relationships: [];
|
|
11017
|
+
};
|
|
10967
11018
|
logistics_variables: {
|
|
10968
11019
|
Row: {
|
|
10969
11020
|
created_at: string;
|
|
@@ -22846,6 +22897,30 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
22846
22897
|
};
|
|
22847
22898
|
Returns: import("./types").Json;
|
|
22848
22899
|
};
|
|
22900
|
+
logistics_block_reason_code: {
|
|
22901
|
+
Args: {
|
|
22902
|
+
p_details?: import("./types").Json;
|
|
22903
|
+
p_reason: string;
|
|
22904
|
+
};
|
|
22905
|
+
Returns: string;
|
|
22906
|
+
};
|
|
22907
|
+
logistics_blocked_orders: {
|
|
22908
|
+
Args: never;
|
|
22909
|
+
Returns: {
|
|
22910
|
+
attempts: number;
|
|
22911
|
+
blocked_since: string;
|
|
22912
|
+
delivery_date: string;
|
|
22913
|
+
order_id: string;
|
|
22914
|
+
order_ref: string;
|
|
22915
|
+
queue_id: string;
|
|
22916
|
+
reason: string;
|
|
22917
|
+
reason_code: string;
|
|
22918
|
+
}[];
|
|
22919
|
+
};
|
|
22920
|
+
logistics_blocked_overview: {
|
|
22921
|
+
Args: never;
|
|
22922
|
+
Returns: import("./types").Json;
|
|
22923
|
+
};
|
|
22849
22924
|
logistics_buffer_criteria: {
|
|
22850
22925
|
Args: {
|
|
22851
22926
|
p_settings: import("./types").Json;
|
|
@@ -22860,6 +22935,39 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
22860
22935
|
};
|
|
22861
22936
|
Returns: import("./types").Json;
|
|
22862
22937
|
};
|
|
22938
|
+
logistics_buffer_detach_late_orders: {
|
|
22939
|
+
Args: {
|
|
22940
|
+
p_buffer?: string;
|
|
22941
|
+
};
|
|
22942
|
+
Returns: import("./types").Json;
|
|
22943
|
+
};
|
|
22944
|
+
logistics_buffer_frozen_order: {
|
|
22945
|
+
Args: {
|
|
22946
|
+
p_order_id: string;
|
|
22947
|
+
};
|
|
22948
|
+
Returns: boolean;
|
|
22949
|
+
};
|
|
22950
|
+
logistics_buffer_handled: {
|
|
22951
|
+
Args: {
|
|
22952
|
+
p_buffer: string;
|
|
22953
|
+
};
|
|
22954
|
+
Returns: boolean;
|
|
22955
|
+
};
|
|
22956
|
+
logistics_buffer_notify: {
|
|
22957
|
+
Args: {
|
|
22958
|
+
p_event_type: string;
|
|
22959
|
+
p_idempotency_key: string;
|
|
22960
|
+
p_order_ref: string;
|
|
22961
|
+
p_payload: import("./types").Json;
|
|
22962
|
+
};
|
|
22963
|
+
Returns: string;
|
|
22964
|
+
};
|
|
22965
|
+
logistics_buffer_open_key: {
|
|
22966
|
+
Args: {
|
|
22967
|
+
p_base_key: string;
|
|
22968
|
+
};
|
|
22969
|
+
Returns: string;
|
|
22970
|
+
};
|
|
22863
22971
|
logistics_buffer_simulate: {
|
|
22864
22972
|
Args: {
|
|
22865
22973
|
p_orders?: import("./types").Json;
|
|
@@ -22949,6 +23057,25 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
22949
23057
|
Args: never;
|
|
22950
23058
|
Returns: import("./types").Json;
|
|
22951
23059
|
};
|
|
23060
|
+
logistics_cart_plan_overview: {
|
|
23061
|
+
Args: {
|
|
23062
|
+
p_days?: number;
|
|
23063
|
+
};
|
|
23064
|
+
Returns: {
|
|
23065
|
+
cart_total: number;
|
|
23066
|
+
delivery_date: string;
|
|
23067
|
+
order_ref: string;
|
|
23068
|
+
plan_ready: boolean;
|
|
23069
|
+
reason: string;
|
|
23070
|
+
released: boolean;
|
|
23071
|
+
}[];
|
|
23072
|
+
};
|
|
23073
|
+
logistics_cart_plan_status: {
|
|
23074
|
+
Args: {
|
|
23075
|
+
p_ref: string;
|
|
23076
|
+
};
|
|
23077
|
+
Returns: import("./types").Json;
|
|
23078
|
+
};
|
|
22952
23079
|
logistics_cart_seq: {
|
|
22953
23080
|
Args: {
|
|
22954
23081
|
p_order_uuid?: string;
|
|
@@ -23482,6 +23609,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
23482
23609
|
};
|
|
23483
23610
|
Returns: boolean;
|
|
23484
23611
|
};
|
|
23612
|
+
logistics_link_order_items: {
|
|
23613
|
+
Args: {
|
|
23614
|
+
p_order?: string;
|
|
23615
|
+
};
|
|
23616
|
+
Returns: import("./types").Json;
|
|
23617
|
+
};
|
|
23485
23618
|
logistics_live_carriers: {
|
|
23486
23619
|
Args: {
|
|
23487
23620
|
p_order_ref: string;
|
|
@@ -23508,6 +23641,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
23508
23641
|
};
|
|
23509
23642
|
Returns: string;
|
|
23510
23643
|
};
|
|
23644
|
+
logistics_normalize_product_label: {
|
|
23645
|
+
Args: {
|
|
23646
|
+
p_label: string;
|
|
23647
|
+
};
|
|
23648
|
+
Returns: string;
|
|
23649
|
+
};
|
|
23511
23650
|
logistics_not_past: {
|
|
23512
23651
|
Args: {
|
|
23513
23652
|
p_ts: string;
|
|
@@ -23696,6 +23835,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
23696
23835
|
Args: never;
|
|
23697
23836
|
Returns: number;
|
|
23698
23837
|
};
|
|
23838
|
+
logistics_plan_retry: {
|
|
23839
|
+
Args: {
|
|
23840
|
+
p_order_ids: string[];
|
|
23841
|
+
};
|
|
23842
|
+
Returns: number;
|
|
23843
|
+
};
|
|
23699
23844
|
logistics_plan_setting: {
|
|
23700
23845
|
Args: {
|
|
23701
23846
|
p_default: number;
|
|
@@ -23802,6 +23947,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
23802
23947
|
};
|
|
23803
23948
|
Returns: import("./types").Json;
|
|
23804
23949
|
};
|
|
23950
|
+
logistics_resolve_product_id: {
|
|
23951
|
+
Args: {
|
|
23952
|
+
p_label: string;
|
|
23953
|
+
};
|
|
23954
|
+
Returns: string;
|
|
23955
|
+
};
|
|
23805
23956
|
logistics_resolve_settings: {
|
|
23806
23957
|
Args: {
|
|
23807
23958
|
p_config_id: string;
|
|
@@ -23931,6 +24082,10 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
23931
24082
|
};
|
|
23932
24083
|
Returns: number;
|
|
23933
24084
|
};
|
|
24085
|
+
logistics_tick_ping: {
|
|
24086
|
+
Args: never;
|
|
24087
|
+
Returns: string;
|
|
24088
|
+
};
|
|
23934
24089
|
logistics_upsert_task: {
|
|
23935
24090
|
Args: {
|
|
23936
24091
|
p_buffer_ref: string;
|
|
@@ -24498,6 +24653,10 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
24498
24653
|
};
|
|
24499
24654
|
Returns: undefined;
|
|
24500
24655
|
};
|
|
24656
|
+
pick_report_missing_cart_plan: {
|
|
24657
|
+
Args: never;
|
|
24658
|
+
Returns: import("./types").Json;
|
|
24659
|
+
};
|
|
24501
24660
|
pick_reprint_cart: {
|
|
24502
24661
|
Args: {
|
|
24503
24662
|
_cart_id: string;
|
|
@@ -25038,6 +25197,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
25038
25197
|
};
|
|
25039
25198
|
Returns: boolean;
|
|
25040
25199
|
};
|
|
25200
|
+
release_job_lock: {
|
|
25201
|
+
Args: {
|
|
25202
|
+
_key: string;
|
|
25203
|
+
};
|
|
25204
|
+
Returns: undefined;
|
|
25205
|
+
};
|
|
25041
25206
|
release_local_pdf_job: {
|
|
25042
25207
|
Args: {
|
|
25043
25208
|
_job_id: string;
|
|
@@ -25726,6 +25891,14 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
25726
25891
|
row_count: number;
|
|
25727
25892
|
}[];
|
|
25728
25893
|
};
|
|
25894
|
+
try_acquire_job_lock: {
|
|
25895
|
+
Args: {
|
|
25896
|
+
_key: string;
|
|
25897
|
+
_owner?: string;
|
|
25898
|
+
_seconds?: number;
|
|
25899
|
+
};
|
|
25900
|
+
Returns: boolean;
|
|
25901
|
+
};
|
|
25729
25902
|
try_debtor_lock: {
|
|
25730
25903
|
Args: {
|
|
25731
25904
|
_group_key: string;
|