@flowselections/floriday-verkoop-module 1.0.87 → 1.0.93
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/verkoop/CreateOrderPage.d.ts.map +1 -1
- package/dist-lib/components/verkoop/CreateOrderPage.js +2 -2
- package/dist-lib/components/verkoop/DiagnoseConnectionDialog.js +1 -1
- package/dist-lib/components/verkoop/EditLocalOrderDialog.js +3 -3
- package/dist-lib/components/verkoop/OrderControlStatusCard.js +1 -1
- package/dist-lib/components/verkoop/OrderKarindelingCard.js +2 -2
- package/dist-lib/components/verkoop/OrderLinePackingCard.js +1 -1
- package/dist-lib/components/verkoop/OrderPickupMomentPicker.d.ts +2 -2
- package/dist-lib/components/verkoop/OrderPickupMomentPicker.d.ts.map +1 -1
- package/dist-lib/components/verkoop/OrderPickupMomentPicker.js +10 -23
- package/dist-lib/components/verkoop/OrderShipmentsCard.js +1 -1
- package/dist-lib/components/verkoop/ProductDimensionsSettings.js +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailView.js +12 -12
- package/dist-lib/components/verkoop/SalesOrdersFilterPanel.d.ts +1 -1
- package/dist-lib/components/verkoop/SalesOrdersFilters.js +1 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.d.ts +1 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.js +2 -2
- package/dist-lib/components/verkoop/StockConsumptionAlertsBanner.js +1 -1
- package/dist-lib/components/verkoop/VerkoopOrdersPage.js +15 -15
- package/dist-lib/index.d.ts +4 -5
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +5 -6
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +162 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/belading.server.js +1 -1
- package/dist-lib/lib/buffer-events.functions.d.ts +1 -1
- package/dist-lib/lib/buffer-events.functions.js +1 -1
- package/dist-lib/lib/cart-layers.functions.d.ts +4 -4
- package/dist-lib/lib/cart-layers.functions.js +2 -2
- package/dist-lib/lib/cart-lock.functions.d.ts +1 -1
- package/dist-lib/lib/cart-lock.functions.js +2 -2
- package/dist-lib/lib/cart-planning-settings.functions.d.ts +11 -11
- package/dist-lib/lib/cart-planning-settings.functions.js +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +4 -4
- package/dist-lib/lib/cart-replan.functions.js +9 -9
- package/dist-lib/lib/create-order.functions.d.ts +18 -18
- package/dist-lib/lib/create-order.functions.js +15 -15
- package/dist-lib/lib/cron/index.d.ts +3 -3
- package/dist-lib/lib/cron/index.js +3 -3
- package/dist-lib/lib/cron/invoice-due.js +1 -1
- package/dist-lib/lib/cron/sync-salesorders.js +2 -2
- package/dist-lib/lib/cron/sync-tradeitems.js +1 -1
- package/dist-lib/lib/engine-block-alerts.server.js +4 -4
- package/dist-lib/lib/expand-group-order-items.d.ts +1 -1
- package/dist-lib/lib/floriday-change-diff.check.js +2 -2
- package/dist-lib/lib/floriday-gateway.server.d.ts +1 -1
- package/dist-lib/lib/floriday-gateway.server.js +2 -2
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +2 -2
- package/dist-lib/lib/floriday-logistic-labels.functions.js +5 -5
- package/dist-lib/lib/floriday-mirror.functions.d.ts +1 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.js +19 -12
- package/dist-lib/lib/floriday-public.functions.d.ts +7 -7
- package/dist-lib/lib/floriday-public.functions.js +2 -2
- package/dist-lib/lib/floriday-status.d.ts +1 -1
- package/dist-lib/lib/floriday-status.server.d.ts +1 -1
- package/dist-lib/lib/floriday-status.server.js +2 -2
- package/dist-lib/lib/floriday-sync.js +1 -1
- package/dist-lib/lib/floriday-unlinked-products.js +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +3 -3
- package/dist-lib/lib/floriday-writes.functions.js +3 -3
- package/dist-lib/lib/invoice-timing.check.d.ts +2 -0
- package/dist-lib/lib/invoice-timing.check.d.ts.map +1 -0
- package/dist-lib/lib/invoice-timing.check.js +19 -0
- package/dist-lib/lib/invoice-timing.d.ts +2 -0
- package/dist-lib/lib/invoice-timing.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.functions.d.ts +5 -5
- package/dist-lib/lib/invoice-timing.functions.js +8 -8
- package/dist-lib/lib/invoice-timing.js +22 -4
- package/dist-lib/lib/invoice-timing.server.d.ts +8 -3
- package/dist-lib/lib/invoice-timing.server.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.server.js +70 -34
- package/dist-lib/lib/load-carriers.functions.d.ts +2 -2
- package/dist-lib/lib/load-carriers.functions.js +2 -2
- package/dist-lib/lib/load-carriers.server.d.ts +1 -1
- package/dist-lib/lib/load-carriers.server.js +1 -1
- package/dist-lib/lib/logistics-buffer.server.js +1 -1
- package/dist-lib/lib/logistics-engine.functions.d.ts +8 -8
- package/dist-lib/lib/logistics-engine.functions.js +6 -6
- package/dist-lib/lib/logistics-engine.server.d.ts +1 -1
- package/dist-lib/lib/logistics-engine.server.js +4 -4
- package/dist-lib/lib/logistics-stock.functions.d.ts +3 -3
- package/dist-lib/lib/logistics-stock.functions.js +3 -3
- package/dist-lib/lib/order-addresses.functions.d.ts +1 -1
- package/dist-lib/lib/order-addresses.functions.js +2 -2
- package/dist-lib/lib/order-block-mail.server.js +3 -3
- package/dist-lib/lib/order-buffers.functions.d.ts +3 -3
- package/dist-lib/lib/order-buffers.functions.js +3 -3
- package/dist-lib/lib/order-cancel.server.js +6 -6
- package/dist-lib/lib/order-carrier.functions.d.ts +2 -2
- package/dist-lib/lib/order-carrier.functions.js +2 -2
- package/dist-lib/lib/order-departure.check.d.ts +2 -0
- package/dist-lib/lib/order-departure.check.d.ts.map +1 -0
- package/dist-lib/lib/order-departure.check.js +25 -0
- package/dist-lib/lib/order-departure.d.ts +25 -0
- package/dist-lib/lib/order-departure.d.ts.map +1 -0
- package/dist-lib/lib/order-departure.js +54 -0
- package/dist-lib/lib/order-departure.server.d.ts +4 -0
- package/dist-lib/lib/order-departure.server.d.ts.map +1 -0
- package/dist-lib/lib/order-departure.server.js +62 -0
- package/dist-lib/lib/order-fulfill.functions.d.ts +1 -1
- package/dist-lib/lib/order-fulfill.functions.js +3 -3
- package/dist-lib/lib/order-item-packing.functions.d.ts +3 -3
- package/dist-lib/lib/order-item-packing.functions.js +3 -3
- package/dist-lib/lib/order-patch.check.d.ts +2 -0
- package/dist-lib/lib/order-patch.check.d.ts.map +1 -0
- package/dist-lib/lib/order-patch.check.js +40 -0
- package/dist-lib/lib/order-patch.d.ts +18 -0
- package/dist-lib/lib/order-patch.d.ts.map +1 -0
- package/dist-lib/lib/order-patch.js +105 -0
- package/dist-lib/lib/order-pickup.functions.d.ts +10 -15
- package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-pickup.functions.js +51 -78
- package/dist-lib/lib/order-shipments.functions.d.ts +4 -4
- package/dist-lib/lib/order-shipments.functions.js +6 -6
- package/dist-lib/lib/plan-coverage.check.js +1 -1
- package/dist-lib/lib/plan-coverage.server.d.ts +1 -1
- package/dist-lib/lib/plan-coverage.server.js +1 -1
- package/dist-lib/lib/product-dimensions.functions.d.ts +2 -2
- package/dist-lib/lib/product-dimensions.functions.js +1 -1
- package/dist-lib/lib/salesorders-list.functions.d.ts +5 -5
- package/dist-lib/lib/salesorders-list.functions.js +4 -4
- package/dist-lib/lib/salesorders-list.server.d.ts +2 -2
- package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.js +39 -53
- package/dist-lib/lib/salesorders-mapping.d.ts +3 -3
- package/dist-lib/lib/salesorders-mapping.js +2 -2
- package/dist-lib/lib/salesorders.functions.d.ts +7 -7
- package/dist-lib/lib/salesorders.functions.js +20 -20
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +2 -2
- package/dist-lib/lib/stock-consumption-alerts.functions.js +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +1068 -1068
- package/dist-lib/lib/tradeitems.functions.js +3 -3
- package/dist-lib/lib/useAllowedLoadCarriers.d.ts +1 -1
- package/dist-lib/lib/useAllowedLoadCarriers.js +1 -1
- package/dist-lib/lib/useBufferEvents.d.ts +1 -1
- package/dist-lib/lib/useBufferEvents.js +2 -2
- package/dist-lib/lib/useLocalSalesOrderDetailQuery.d.ts +2 -2
- package/dist-lib/lib/useLocalSalesOrderDetailQuery.js +2 -2
- package/dist-lib/lib/useSalesOrderDetailQuery.d.ts +1 -1
- package/dist-lib/lib/useSalesOrderDetailQuery.js +2 -2
- package/dist-lib/lib/useSalesOrdersQuery.d.ts +2 -2
- package/dist-lib/lib/useSalesOrdersQuery.js +3 -3
- package/package.json +2 -2
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Ophaal- en aanmeldmoment van een order, zoals de Logistiek Engine het
|
|
2
|
+
// berekent (logistics_order_departure). Deze module rekent zelf niets uit:
|
|
3
|
+
// alleen normaliseren en weergeven.
|
|
4
|
+
const TIME_ZONE = "Europe/Amsterdam";
|
|
5
|
+
function str(v) {
|
|
6
|
+
return typeof v === "string" && v.trim() !== "" ? v : null;
|
|
7
|
+
}
|
|
8
|
+
/** Engine-antwoord veilig omzetten; ontbrekende velden worden null. */
|
|
9
|
+
export function normalizeDeparture(raw) {
|
|
10
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
11
|
+
return null;
|
|
12
|
+
const r = raw;
|
|
13
|
+
return {
|
|
14
|
+
ok: r.ok === true,
|
|
15
|
+
reason: str(r.reason),
|
|
16
|
+
carrierId: str(r.carrierId),
|
|
17
|
+
momentKey: str(r.momentKey),
|
|
18
|
+
departureAt: str(r.departureAt),
|
|
19
|
+
signupDeadline: str(r.signupDeadline),
|
|
20
|
+
lateSignup: r.lateSignup === true,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** "di 20 okt 15:00" in Nederlandse tijd. */
|
|
24
|
+
export function formatMoment(iso) {
|
|
25
|
+
if (!iso)
|
|
26
|
+
return null;
|
|
27
|
+
const d = new Date(iso);
|
|
28
|
+
if (Number.isNaN(d.getTime()))
|
|
29
|
+
return null;
|
|
30
|
+
const date = d
|
|
31
|
+
.toLocaleDateString("nl-NL", { timeZone: TIME_ZONE, weekday: "short", day: "numeric", month: "short" })
|
|
32
|
+
.replace(/\./g, "");
|
|
33
|
+
const time = d.toLocaleTimeString("nl-NL", { timeZone: TIME_ZONE, hour: "2-digit", minute: "2-digit", hour12: false });
|
|
34
|
+
return `${date} ${time}`;
|
|
35
|
+
}
|
|
36
|
+
export const DEPARTURE_UNKNOWN = "Ophaalmoment nu niet bekend. Ververs over een minuut.";
|
|
37
|
+
export function departureView(dep) {
|
|
38
|
+
if (!dep)
|
|
39
|
+
return { text: null, short: null, lateSignup: false, reason: DEPARTURE_UNKNOWN };
|
|
40
|
+
const pickup = dep.ok ? formatMoment(dep.departureAt) : null;
|
|
41
|
+
if (!pickup) {
|
|
42
|
+
return {
|
|
43
|
+
text: null,
|
|
44
|
+
short: null,
|
|
45
|
+
lateSignup: false,
|
|
46
|
+
reason: dep.reason ?? "Er is geen ophaalmoment bekend voor deze order.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const signup = formatMoment(dep.signupDeadline);
|
|
50
|
+
const parts = [`${pickup} ophalen`];
|
|
51
|
+
if (signup)
|
|
52
|
+
parts.push(`aanmelden ${signup}`);
|
|
53
|
+
return { text: parts.join(" · "), short: pickup, lateSignup: dep.lateSignup, reason: dep.ok ? null : dep.reason };
|
|
54
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OrderDeparture } from "./order-departure.js";
|
|
2
|
+
export declare function loadOrderDepartures(supabase: any, orderIds: string[]): Promise<Map<string, OrderDeparture>>;
|
|
3
|
+
export declare function forgetOrderDeparture(orderId: string): void;
|
|
4
|
+
//# sourceMappingURL=order-departure.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-departure.server.d.ts","sourceRoot":"","sources":["../../src/lib/order-departure.server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAM5E,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAiDtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,QAEnD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Leest ophaal-/aanmeldmomenten bij de Engine. Gebruikt de lijstversie
|
|
2
|
+
// (logistics_order_departure_list) als die bestaat, anders één aanroep per
|
|
3
|
+
// order (maximaal 12 tegelijk). Fout => order ontbreekt in het resultaat.
|
|
4
|
+
import { normalizeDeparture } from "./order-departure.js";
|
|
5
|
+
const PARALLEL = 12;
|
|
6
|
+
const CACHE_MS = 30000;
|
|
7
|
+
const cache = new Map();
|
|
8
|
+
export async function loadOrderDepartures(supabase, orderIds) {
|
|
9
|
+
const out = new Map();
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const todo = [];
|
|
12
|
+
for (const id of Array.from(new Set(orderIds))) {
|
|
13
|
+
const hit = cache.get(id);
|
|
14
|
+
if (hit && now - hit.at < CACHE_MS)
|
|
15
|
+
out.set(id, hit.dep);
|
|
16
|
+
else
|
|
17
|
+
todo.push(id);
|
|
18
|
+
}
|
|
19
|
+
if (todo.length === 0)
|
|
20
|
+
return out;
|
|
21
|
+
// Lijstversie (Engine 1.0.162+): één aanroep.
|
|
22
|
+
try {
|
|
23
|
+
const { data, error } = await supabase.rpc("logistics_order_departure_list", { p_order_ids: todo });
|
|
24
|
+
if (!error) {
|
|
25
|
+
const rows = Array.isArray(data) ? data : [];
|
|
26
|
+
for (const row of rows) {
|
|
27
|
+
const r = (row && typeof row === "object" && "departure" in row ? row.departure : row);
|
|
28
|
+
const id = String(row?.order_id ?? row?.orderId ?? r?.orderId ?? "");
|
|
29
|
+
const dep = normalizeDeparture(r);
|
|
30
|
+
if (id && dep) {
|
|
31
|
+
out.set(id, dep);
|
|
32
|
+
cache.set(id, { at: now, dep });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* lijstversie niet beschikbaar: per order */
|
|
40
|
+
}
|
|
41
|
+
for (let i = 0; i < todo.length; i += PARALLEL) {
|
|
42
|
+
await Promise.all(todo.slice(i, i + PARALLEL).map(async (id) => {
|
|
43
|
+
try {
|
|
44
|
+
const { data, error } = await supabase.rpc("logistics_order_departure", { p_order_id: id });
|
|
45
|
+
if (error)
|
|
46
|
+
return;
|
|
47
|
+
const dep = normalizeDeparture(data);
|
|
48
|
+
if (dep) {
|
|
49
|
+
out.set(id, dep);
|
|
50
|
+
cache.set(id, { at: now, dep });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* fail closed: onbekend */
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
export function forgetOrderDeparture(orderId) {
|
|
61
|
+
cache.delete(orderId);
|
|
62
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const markOrdersShipped: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
2
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
2
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
3
3
|
userId: string;
|
|
4
4
|
claims: import("@supabase/auth-js").User;
|
|
5
5
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// vereist bewijs van vertrek (alle karren verzonden of dekkende zendingen).
|
|
4
4
|
import { createServerFn } from "@tanstack/react-start";
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
|
|
7
|
-
import { resolveOrderRow } from "./order-row.server";
|
|
6
|
+
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
|
|
7
|
+
import { resolveOrderRow } from "./order-row.server.js";
|
|
8
8
|
const Input = z.object({
|
|
9
9
|
orderIds: z.array(z.string().min(1)).min(1).max(200),
|
|
10
10
|
});
|
|
@@ -12,7 +12,7 @@ export const markOrdersShipped = createServerFn({ method: "POST" })
|
|
|
12
12
|
.middleware([requireSupabaseAuth])
|
|
13
13
|
.inputValidator((input) => Input.parse(input))
|
|
14
14
|
.handler(async ({ data, context }) => {
|
|
15
|
-
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
15
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
|
|
16
16
|
const results = [];
|
|
17
17
|
for (const raw of data.orderIds) {
|
|
18
18
|
try {
|
|
@@ -14,7 +14,7 @@ export interface OrderItemPackingRow {
|
|
|
14
14
|
* Floriday sales-order-id zijn (resolveOrderRow vertaalt dat).
|
|
15
15
|
*/
|
|
16
16
|
export declare const listOrderItemPacking: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
17
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
17
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
18
18
|
userId: string;
|
|
19
19
|
claims: import("@supabase/auth-js").User;
|
|
20
20
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -24,7 +24,7 @@ export declare const listOrderItemPacking: import("@tanstack/start-client-core")
|
|
|
24
24
|
}>>;
|
|
25
25
|
/** Zet de belading van één orderregel handmatig vast. */
|
|
26
26
|
export declare const setOrderItemPacking: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
27
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
27
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
28
28
|
userId: string;
|
|
29
29
|
claims: import("@supabase/auth-js").User;
|
|
30
30
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -38,7 +38,7 @@ export declare const setOrderItemPacking: import("@tanstack/start-client-core").
|
|
|
38
38
|
}>>;
|
|
39
39
|
/** Haal de handmatige markering weg; de regel volgt weer de standaardbelading. */
|
|
40
40
|
export declare const clearOrderItemPackingLock: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
41
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
41
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
42
42
|
userId: string;
|
|
43
43
|
claims: import("@supabase/auth-js").User;
|
|
44
44
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
// De correctie is strikt lokaal: hij wordt NOOIT teruggestuurd als wijziging
|
|
10
10
|
// van het Floriday-artikel zelf — dat loopt uitsluitend via de voorraad-module.
|
|
11
11
|
import { createServerFn } from "@tanstack/react-start";
|
|
12
|
-
import { productNameForStorage } from "./product-name";
|
|
12
|
+
import { productNameForStorage } from "./product-name.js";
|
|
13
13
|
import { z } from "zod";
|
|
14
|
-
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
|
|
15
|
-
import { resolveOrderRow } from "./order-row.server";
|
|
14
|
+
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
|
|
15
|
+
import { resolveOrderRow } from "./order-row.server.js";
|
|
16
16
|
/**
|
|
17
17
|
* Belading per bestelregel van één order, inclusief de handmatige
|
|
18
18
|
* "vastgezet"-markering. `orderId` mag een lokale orders.id of een
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-patch.check.d.ts","sourceRoot":"","sources":["../../src/lib/order-patch.check.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Controle zonder testomgeving: `bun src/lib/order-patch.check.ts`.
|
|
2
|
+
import { diffPatch, distinctFilter } from "./order-patch.js";
|
|
3
|
+
let failed = 0;
|
|
4
|
+
const eq = (name, got, want) => {
|
|
5
|
+
const ok = JSON.stringify(got) === JSON.stringify(want);
|
|
6
|
+
if (!ok)
|
|
7
|
+
failed++;
|
|
8
|
+
console.log(`${ok ? "OK " : "FOUT"} ${name}${ok ? "" : ` — kreeg ${JSON.stringify(got)}`}`);
|
|
9
|
+
};
|
|
10
|
+
const row = {
|
|
11
|
+
status: "Nog te picken",
|
|
12
|
+
delivery_date: "2026-10-16",
|
|
13
|
+
invoice_due_at: "2026-10-16T16:00:00+00:00",
|
|
14
|
+
total: "12.50",
|
|
15
|
+
custom_fields: { a: 1, b: { c: 2 } },
|
|
16
|
+
};
|
|
17
|
+
// Niets veranderd → niets opslaan
|
|
18
|
+
eq("alles gelijk → leeg", diffPatch(row, { ...row }), {});
|
|
19
|
+
eq("zelfde moment, andere notatie", diffPatch(row, { invoice_due_at: "2026-10-16T16:00:00.000Z" }), {});
|
|
20
|
+
eq("jsonb andere volgorde", diffPatch(row, { custom_fields: { b: { c: 2 }, a: 1 } }), {});
|
|
21
|
+
eq("bedrag 12.5 = 12.50", diffPatch(row, { total: "12.5" }), {});
|
|
22
|
+
eq("leeg blijft leeg", diffPatch({ invoice_due_at: null }, { invoice_due_at: null }), {});
|
|
23
|
+
// Echte wijziging → wél opslaan
|
|
24
|
+
eq("nieuwe status uit Floriday", diffPatch(row, { status: "geannuleerd" }), { status: "geannuleerd" });
|
|
25
|
+
eq("nieuwe leverdatum", diffPatch(row, { delivery_date: "2026-10-17" }), { delivery_date: "2026-10-17" });
|
|
26
|
+
eq("gewijzigd factuurmoment", diffPatch(row, { invoice_due_at: "2026-10-17T16:00:00.000Z" }), { invoice_due_at: "2026-10-17T16:00:00.000Z" });
|
|
27
|
+
eq("gewijzigde extra gegevens", Object.keys(diffPatch(row, { custom_fields: { a: 2, b: { c: 2 } } })), ["custom_fields"]);
|
|
28
|
+
eq("leeg → gevuld", diffPatch({ invoice_due_at: null }, { invoice_due_at: "2026-10-17T16:00:00.000Z" }), { invoice_due_at: "2026-10-17T16:00:00.000Z" });
|
|
29
|
+
eq("gevuld → leeg", diffPatch(row, { invoice_due_at: null }), { invoice_due_at: null });
|
|
30
|
+
eq("alleen gewijzigd veld mee", Object.keys(diffPatch(row, { status: row.status, total: "13" })), ["total"]);
|
|
31
|
+
// Voorwaarde in de database
|
|
32
|
+
eq("filter naar leeg", distinctFilter({ invoice_due_at: null }), "invoice_due_at.not.is.null");
|
|
33
|
+
eq("filter met waarde", distinctFilter({ status: "Gereed voor facturatie" }), 'status.is.null,status.neq."Gereed voor facturatie"');
|
|
34
|
+
eq("filter jsonb", distinctFilter({ custom_fields: { a: "x,y" } }), 'custom_fields.is.null,custom_fields.neq."{\\"a\\":\\"x,y\\"}"');
|
|
35
|
+
eq("lege patch → geen filter", distinctFilter({}), null);
|
|
36
|
+
if (failed) {
|
|
37
|
+
console.log(`${failed} controle(s) mislukt`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
console.log("Alle controles geslaagd");
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function sameJson(a: unknown, b: unknown): boolean;
|
|
2
|
+
export declare function sameValue(key: string, prev: unknown, next: unknown): boolean;
|
|
3
|
+
/** Alleen de velden die echt anders zijn dan de huidige rij. */
|
|
4
|
+
export declare function diffPatch<T extends Record<string, unknown>>(current: Record<string, unknown> | null | undefined, patch: T): Partial<T>;
|
|
5
|
+
/**
|
|
6
|
+
* PostgREST `or`-filter: de rij wordt alleen geraakt als minstens één veld uit
|
|
7
|
+
* de patch in de database anders is (IS DISTINCT FROM). Leeg → null.
|
|
8
|
+
*/
|
|
9
|
+
export declare function distinctFilter(patch: Record<string, unknown>): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Slaat alleen gewijzigde velden op, met de "alleen als anders"-voorwaarde ook
|
|
12
|
+
* in de database. Geeft het aantal echt bijgewerkte rijen (0 of 1).
|
|
13
|
+
*/
|
|
14
|
+
export declare function updateOrderIfChanged(supabase: any, orderId: string, current: Record<string, unknown> | null | undefined, patch: Record<string, unknown>): Promise<{
|
|
15
|
+
written: number;
|
|
16
|
+
changed: string[];
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=order-patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-patch.d.ts","sourceRoot":"","sources":["../../src/lib/order-patch.ts"],"names":[],"mappings":"AAwBA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAExD;AAQD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAe5E;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACnD,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,CAAC,CAAC,CAQZ;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAY5E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACnD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAYjD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Alleen opslaan wat echt verandert. Elke opslag op `orders` laat triggers van
|
|
2
|
+
// andere modules afgaan (planning, factuurkoppelingen, updated_at), dus een
|
|
3
|
+
// gelijke waarde terugschrijven mag nooit.
|
|
4
|
+
//
|
|
5
|
+
// 1) diffPatch: vergelijking vooraf (jsonb op inhoud, tijdstippen als moment).
|
|
6
|
+
// 2) distinctFilter: dezelfde voorwaarde ook in de database (IS DISTINCT FROM),
|
|
7
|
+
// zodat twee rondes tegelijk niet allebei schrijven.
|
|
8
|
+
const DATE_KEYS = new Set(["delivery_date", "order_date"]);
|
|
9
|
+
const NUMERIC_KEYS = new Set(["total"]);
|
|
10
|
+
function canon(v) {
|
|
11
|
+
if (Array.isArray(v))
|
|
12
|
+
return v.map(canon);
|
|
13
|
+
if (v && typeof v === "object") {
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const k of Object.keys(v).sort()) {
|
|
16
|
+
const x = v[k];
|
|
17
|
+
if (x !== undefined)
|
|
18
|
+
out[k] = canon(x);
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
return v;
|
|
23
|
+
}
|
|
24
|
+
export function sameJson(a, b) {
|
|
25
|
+
return JSON.stringify(canon(a ?? null)) === JSON.stringify(canon(b ?? null));
|
|
26
|
+
}
|
|
27
|
+
function asInstant(v) {
|
|
28
|
+
if (v === null || v === undefined || v === "")
|
|
29
|
+
return null;
|
|
30
|
+
const t = new Date(String(v)).getTime();
|
|
31
|
+
return Number.isNaN(t) ? null : t;
|
|
32
|
+
}
|
|
33
|
+
export function sameValue(key, prev, next) {
|
|
34
|
+
const pNull = prev === null || prev === undefined;
|
|
35
|
+
const nNull = next === null || next === undefined;
|
|
36
|
+
if (pNull || nNull)
|
|
37
|
+
return pNull && nNull;
|
|
38
|
+
if (typeof next === "object" || typeof prev === "object")
|
|
39
|
+
return sameJson(prev, next);
|
|
40
|
+
if (NUMERIC_KEYS.has(key))
|
|
41
|
+
return Number(prev) === Number(next);
|
|
42
|
+
if (DATE_KEYS.has(key))
|
|
43
|
+
return String(prev).slice(0, 10) === String(next).slice(0, 10);
|
|
44
|
+
const ps = String(prev);
|
|
45
|
+
const ns = String(next);
|
|
46
|
+
if (ps === ns)
|
|
47
|
+
return true;
|
|
48
|
+
// Tijdstippen in een andere notatie/tijdzone: zelfde moment = gelijk.
|
|
49
|
+
if (/^\d{4}-\d{2}-\d{2}T/.test(ps) && /^\d{4}-\d{2}-\d{2}T/.test(ns)) {
|
|
50
|
+
return asInstant(ps) === asInstant(ns);
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/** Alleen de velden die echt anders zijn dan de huidige rij. */
|
|
55
|
+
export function diffPatch(current, patch) {
|
|
56
|
+
const out = {};
|
|
57
|
+
for (const k of Object.keys(patch)) {
|
|
58
|
+
const next = patch[k];
|
|
59
|
+
if (next === undefined)
|
|
60
|
+
continue;
|
|
61
|
+
if (!sameValue(k, current?.[k], next))
|
|
62
|
+
out[k] = next;
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
function quote(v) {
|
|
67
|
+
return `"${v.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* PostgREST `or`-filter: de rij wordt alleen geraakt als minstens één veld uit
|
|
71
|
+
* de patch in de database anders is (IS DISTINCT FROM). Leeg → null.
|
|
72
|
+
*/
|
|
73
|
+
export function distinctFilter(patch) {
|
|
74
|
+
const parts = [];
|
|
75
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
76
|
+
if (v === undefined)
|
|
77
|
+
continue;
|
|
78
|
+
if (v === null) {
|
|
79
|
+
parts.push(`${k}.not.is.null`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const lit = typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
83
|
+
parts.push(`${k}.is.null`, `${k}.neq.${quote(lit)}`);
|
|
84
|
+
}
|
|
85
|
+
return parts.length ? parts.join(",") : null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Slaat alleen gewijzigde velden op, met de "alleen als anders"-voorwaarde ook
|
|
89
|
+
* in de database. Geeft het aantal echt bijgewerkte rijen (0 of 1).
|
|
90
|
+
*/
|
|
91
|
+
export async function updateOrderIfChanged(supabase, orderId, current, patch) {
|
|
92
|
+
const diff = diffPatch(current, patch);
|
|
93
|
+
const changed = Object.keys(diff);
|
|
94
|
+
if (changed.length === 0)
|
|
95
|
+
return { written: 0, changed };
|
|
96
|
+
const filter = distinctFilter(diff);
|
|
97
|
+
const { data, error } = await supabase.from("orders")
|
|
98
|
+
.update(diff)
|
|
99
|
+
.eq("id", orderId)
|
|
100
|
+
.or(filter)
|
|
101
|
+
.select("id");
|
|
102
|
+
if (error)
|
|
103
|
+
throw new Error(error.message);
|
|
104
|
+
return { written: (data ?? []).length, changed };
|
|
105
|
+
}
|
|
@@ -1,33 +1,28 @@
|
|
|
1
|
+
import { type DepartureView, type OrderDeparture } from "./order-departure.js";
|
|
1
2
|
export interface PickupMomentOption {
|
|
2
|
-
/**
|
|
3
|
+
/** Sleutel in Engine-formaat: "dagen@ophaaltijd|dagen@aanmeldtijd". */
|
|
3
4
|
key: string;
|
|
4
|
-
pickupDate: string;
|
|
5
|
-
pickupTime: string | null;
|
|
6
|
-
signupDate: string | null;
|
|
7
|
-
signupTime: string | null;
|
|
8
5
|
deliveryTime: string | null;
|
|
9
6
|
label: string;
|
|
10
7
|
}
|
|
11
|
-
|
|
8
|
+
/** Keuzes uit de vervoerdersmomenten — alleen tijden en dagen, geen datum. */
|
|
9
|
+
export declare function carrierMomentOptions(carrier: any | null): PickupMomentOption[];
|
|
12
10
|
export declare const getOrderPickupMoment: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
13
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
11
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
14
12
|
userId: string;
|
|
15
13
|
claims: import("@supabase/auth-js").User;
|
|
16
14
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
17
15
|
orderId: string;
|
|
18
16
|
}, Promise<{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
hasCarrier?: undefined;
|
|
23
|
-
} | {
|
|
24
|
-
selectedKey: string;
|
|
25
|
-
selected: PickupMomentOption;
|
|
17
|
+
view: DepartureView;
|
|
18
|
+
departure: OrderDeparture | null;
|
|
19
|
+
selectedKey: string | null;
|
|
26
20
|
options: PickupMomentOption[];
|
|
27
21
|
hasCarrier: boolean;
|
|
22
|
+
deliveryTime: string | null;
|
|
28
23
|
}>>;
|
|
29
24
|
export declare const setOrderPickupMoment: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
30
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
25
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
31
26
|
userId: string;
|
|
32
27
|
claims: import("@supabase/auth-js").User;
|
|
33
28
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-pickup.functions.d.ts","sourceRoot":"","sources":["../../src/lib/order-pickup.functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"order-pickup.functions.d.ts","sourceRoot":"","sources":["../../src/lib/order-pickup.functions.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3F,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,kBAAkB,EAAE,CAoB9E;AAaD,eAAO,MAAM,oBAAoB;;;;8CAEP,OAAO;;;;;;;;;GAyC7B,CAAC;AAEL,eAAO,MAAM,oBAAoB;;;;8CAEP,OAAO;;;;;GAoB7B,CAAC"}
|
|
@@ -1,75 +1,47 @@
|
|
|
1
|
-
// Ophaalmoment
|
|
1
|
+
// Ophaalmoment van een order: tonen uit de Logistiek Engine, kiezen uit de
|
|
2
|
+
// momenten van de vervoerder. Deze module rekent zelf geen datum uit.
|
|
2
3
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
4
|
import { z } from "zod";
|
|
4
|
-
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
|
|
5
|
-
import { normalizeTime } from "./carrier-availability";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return `${
|
|
5
|
+
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
|
|
6
|
+
import { normalizeTime } from "./carrier-availability.js";
|
|
7
|
+
import { departureView } from "./order-departure.js";
|
|
8
|
+
import { assertRowsAffected, resolveOrderRow } from "./order-row.server.js";
|
|
9
|
+
function daysText(n, what) {
|
|
10
|
+
if (n <= 0)
|
|
11
|
+
return `${what} op de leverdag`;
|
|
12
|
+
return `${what} ${n} werkdag${n === 1 ? "" : "en"} vóór levering`;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
if (Number.isNaN(dt.getTime()))
|
|
17
|
-
return iso;
|
|
18
|
-
return dt.toLocaleDateString("nl-NL", { weekday: "short", day: "numeric", month: "short" });
|
|
19
|
-
}
|
|
20
|
-
export function buildPickupOptions(carrier, deliveryISO) {
|
|
21
|
-
if (!carrier || !deliveryISO)
|
|
22
|
-
return [];
|
|
23
|
-
const raw = Array.isArray(carrier.pickup_moments) ? carrier.pickup_moments : [];
|
|
24
|
-
const moments = raw.length > 0
|
|
25
|
-
? raw
|
|
26
|
-
: [carrier.signup_time_1, carrier.signup_time_2]
|
|
27
|
-
.filter(Boolean)
|
|
28
|
-
.map((t) => ({
|
|
29
|
-
signup_time: t,
|
|
30
|
-
signup_days: carrier.signup_days_before_delivery ?? 0,
|
|
31
|
-
delivery_days: carrier.delivery_days ?? 0,
|
|
32
|
-
}));
|
|
14
|
+
/** Keuzes uit de vervoerdersmomenten — alleen tijden en dagen, geen datum. */
|
|
15
|
+
export function carrierMomentOptions(carrier) {
|
|
16
|
+
const raw = Array.isArray(carrier?.pickup_moments) ? carrier.pickup_moments : [];
|
|
33
17
|
const seen = new Set();
|
|
34
18
|
const out = [];
|
|
35
|
-
for (const m of
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const key = `${pickupDate}|${signupTime ?? ""}|${deliveryTime ?? ""}`;
|
|
19
|
+
for (const m of raw) {
|
|
20
|
+
const pt = normalizeTime(m.pickup_time);
|
|
21
|
+
if (!pt)
|
|
22
|
+
continue;
|
|
23
|
+
const pd = Math.max(0, Number(m.pickup_days ?? 0) || 0);
|
|
24
|
+
const st = normalizeTime(m.signup_time);
|
|
25
|
+
const sd = Math.max(0, Number(m.signup_days ?? pd) || 0);
|
|
26
|
+
const key = `${pd}@${pt}${st ? `|${sd}@${st}` : ""}`;
|
|
44
27
|
if (seen.has(key))
|
|
45
28
|
continue;
|
|
46
29
|
seen.add(key);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
pickupDate,
|
|
55
|
-
pickupTime,
|
|
56
|
-
signupDate,
|
|
57
|
-
signupTime,
|
|
58
|
-
deliveryTime,
|
|
59
|
-
label: parts.join(" · "),
|
|
60
|
-
});
|
|
30
|
+
const dt = normalizeTime(m.delivery_time);
|
|
31
|
+
const parts = [`${daysText(pd, "ophalen")} ${pt}`];
|
|
32
|
+
if (st)
|
|
33
|
+
parts.push(`aanmelden ${st}`);
|
|
34
|
+
if (dt)
|
|
35
|
+
parts.push(`aanlevering ${dt}`);
|
|
36
|
+
out.push({ key, deliveryTime: dt, label: parts.join(" · ") });
|
|
61
37
|
}
|
|
62
|
-
out.sort((a, b) => a.pickupDate === b.pickupDate
|
|
63
|
-
? (a.deliveryTime ?? "99:99").localeCompare(b.deliveryTime ?? "99:99")
|
|
64
|
-
: a.pickupDate.localeCompare(b.pickupDate));
|
|
65
38
|
return out;
|
|
66
39
|
}
|
|
67
40
|
async function findOrder(supabase, orderId) {
|
|
68
|
-
// DTO-id kan een Floriday salesOrderId zijn; resolveOrderRow vertaalt dat.
|
|
69
41
|
const row = await resolveOrderRow(supabase, orderId);
|
|
70
42
|
const { data, error } = await supabase
|
|
71
43
|
.from("orders")
|
|
72
|
-
.select("id,
|
|
44
|
+
.select("id, custom_fields")
|
|
73
45
|
.eq("id", row.id)
|
|
74
46
|
.maybeSingle();
|
|
75
47
|
if (error)
|
|
@@ -89,48 +61,47 @@ export const getOrderPickupMoment = createServerFn({ method: "GET" })
|
|
|
89
61
|
order = null;
|
|
90
62
|
}
|
|
91
63
|
if (!order) {
|
|
92
|
-
return {
|
|
64
|
+
return {
|
|
65
|
+
view: departureView(null),
|
|
66
|
+
departure: null,
|
|
67
|
+
selectedKey: null,
|
|
68
|
+
options: [],
|
|
69
|
+
hasCarrier: false,
|
|
70
|
+
deliveryTime: null,
|
|
71
|
+
};
|
|
93
72
|
}
|
|
94
73
|
const cf = (order.custom_fields ?? {});
|
|
95
74
|
const carrierId = cf.carrier ? String(cf.carrier) : null;
|
|
96
75
|
let carrier = null;
|
|
97
76
|
if (carrierId) {
|
|
98
|
-
const { data: c } = await supabase
|
|
99
|
-
.from("carriers")
|
|
100
|
-
.select("delivery_days, signup_time_1, signup_time_2, signup_days_before_delivery, pickup_weekdays, delivery_weekdays, pickup_moments")
|
|
101
|
-
.eq("id", carrierId)
|
|
102
|
-
.maybeSingle();
|
|
77
|
+
const { data: c } = await supabase.from("carriers").select("pickup_moments").eq("id", carrierId).maybeSingle();
|
|
103
78
|
carrier = c ?? null;
|
|
104
79
|
}
|
|
105
|
-
const
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const t = normalizeTime(cf.delivery_time);
|
|
110
|
-
selected = options.find((o) => o.deliveryTime === t) ?? null;
|
|
111
|
-
}
|
|
112
|
-
if (!selected)
|
|
113
|
-
selected = options[0] ?? null;
|
|
80
|
+
const { loadOrderDepartures } = await import("./order-departure.server.js");
|
|
81
|
+
const departure = (await loadOrderDepartures(supabase, [order.id])).get(order.id) ?? null;
|
|
82
|
+
const options = carrierMomentOptions(carrier);
|
|
83
|
+
const selectedKey = departure?.momentKey ?? (cf.pickup_moment ? String(cf.pickup_moment) : null);
|
|
114
84
|
return {
|
|
115
|
-
|
|
116
|
-
|
|
85
|
+
view: departureView(departure),
|
|
86
|
+
departure,
|
|
87
|
+
selectedKey: options.some((o) => o.key === selectedKey) ? selectedKey : null,
|
|
117
88
|
options,
|
|
118
89
|
hasCarrier: !!carrier,
|
|
90
|
+
deliveryTime: normalizeTime(cf.delivery_time),
|
|
119
91
|
};
|
|
120
92
|
});
|
|
121
93
|
export const setOrderPickupMoment = createServerFn({ method: "POST" })
|
|
122
94
|
.middleware([requireSupabaseAuth])
|
|
123
|
-
.inputValidator((input) => z.object({ orderId: z.string().min(1), key: z.string().min(1) }).parse(input))
|
|
95
|
+
.inputValidator((input) => z.object({ orderId: z.string().min(1), key: z.string().min(1).max(64) }).parse(input))
|
|
124
96
|
.handler(async ({ data, context }) => {
|
|
125
97
|
const supabase = context.supabase;
|
|
126
98
|
const order = await findOrder(supabase, data.orderId);
|
|
127
99
|
if (!order)
|
|
128
100
|
throw new Error("Order niet gevonden");
|
|
129
|
-
const deliveryTime = data.key.split("|")[2] || null;
|
|
130
101
|
const cf = { ...(order.custom_fields ?? {}) };
|
|
102
|
+
if (cf.pickup_moment === data.key)
|
|
103
|
+
return { ok: true };
|
|
131
104
|
cf.pickup_moment = data.key;
|
|
132
|
-
if (deliveryTime)
|
|
133
|
-
cf.delivery_time = deliveryTime;
|
|
134
105
|
const { data: updated, error } = await supabase.from("orders")
|
|
135
106
|
.update({ custom_fields: cf })
|
|
136
107
|
.eq("id", order.id)
|
|
@@ -138,5 +109,7 @@ export const setOrderPickupMoment = createServerFn({ method: "POST" })
|
|
|
138
109
|
if (error)
|
|
139
110
|
throw new Error(error.message);
|
|
140
111
|
assertRowsAffected(updated, "Ophaalmoment opslaan");
|
|
112
|
+
const { forgetOrderDeparture } = await import("./order-departure.server.js");
|
|
113
|
+
forgetOrderDeparture(order.id);
|
|
141
114
|
return { ok: true };
|
|
142
115
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const listOrderShipments: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
2
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
2
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
3
3
|
userId: string;
|
|
4
4
|
claims: import("@supabase/auth-js").User;
|
|
5
5
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -40,7 +40,7 @@ export declare const listOrderShipments: import("@tanstack/start-client-core").O
|
|
|
40
40
|
}[];
|
|
41
41
|
}>>;
|
|
42
42
|
export declare const createShipment: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
43
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
43
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
44
44
|
userId: string;
|
|
45
45
|
claims: import("@supabase/auth-js").User;
|
|
46
46
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -60,7 +60,7 @@ export declare const createShipment: import("@tanstack/start-client-core").Optio
|
|
|
60
60
|
shipmentId: string;
|
|
61
61
|
}>>;
|
|
62
62
|
export declare const markShipmentShipped: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
63
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
63
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
64
64
|
userId: string;
|
|
65
65
|
claims: import("@supabase/auth-js").User;
|
|
66
66
|
}, undefined, undefined, undefined>], (input: unknown) => {
|
|
@@ -69,7 +69,7 @@ export declare const markShipmentShipped: import("@tanstack/start-client-core").
|
|
|
69
69
|
ok: true;
|
|
70
70
|
}>>;
|
|
71
71
|
export declare const cancelShipment: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
72
|
-
supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
|
|
72
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
73
73
|
userId: string;
|
|
74
74
|
claims: import("@supabase/auth-js").User;
|
|
75
75
|
}, undefined, undefined, undefined>], (input: unknown) => {
|