@flowselections/logistiek-engine 1.0.3 → 1.0.4
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/lib/bulkLoadCarrierPlanning.server.d.ts +4 -3
- package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts.map +1 -1
- package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +13 -15
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts +2 -1
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.js +3 -2
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +30 -5
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.functions.js +13 -8
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts +7 -6
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.server.js +31 -33
- package/dist-lib/lib/loadCarrierTaskSync.server.d.ts +2 -1
- package/dist-lib/lib/loadCarrierTaskSync.server.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierTaskSync.server.js +4 -6
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -2
- package/dist-lib/lib/logisticsRecalcJob.server.d.ts +6 -5
- package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.server.js +17 -19
- package/package.json +1 -1
|
@@ -12,14 +12,15 @@ export const replanOrderLoadCarriers = createServerFn({ method: "POST" })
|
|
|
12
12
|
return data;
|
|
13
13
|
})
|
|
14
14
|
.handler(async ({ data }) => {
|
|
15
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
15
16
|
const { replanOrderInternal } = await import("./loadCarrierPlanning.server");
|
|
16
17
|
const { attachIndelingToTasks } = await import("./loadCarrierTaskSync.server");
|
|
17
|
-
const result = await replanOrderInternal(data.orderId, {
|
|
18
|
+
const result = await replanOrderInternal(supabaseAdmin, data.orderId, {
|
|
18
19
|
dryRun: data.dryRun,
|
|
19
20
|
carrierType: data.carrierType ?? null,
|
|
20
21
|
});
|
|
21
22
|
if (result && !data.dryRun)
|
|
22
|
-
await attachIndelingToTasks(result);
|
|
23
|
+
await attachIndelingToTasks(supabaseAdmin, result);
|
|
23
24
|
return result;
|
|
24
25
|
});
|
|
25
26
|
export const replanBufferLoadCarriers = createServerFn({ method: "POST" })
|
|
@@ -31,14 +32,15 @@ export const replanBufferLoadCarriers = createServerFn({ method: "POST" })
|
|
|
31
32
|
return data;
|
|
32
33
|
})
|
|
33
34
|
.handler(async ({ data }) => {
|
|
35
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
34
36
|
const { replanBufferInternal } = await import("./loadCarrierPlanning.server");
|
|
35
37
|
const { attachIndelingToTasks } = await import("./loadCarrierTaskSync.server");
|
|
36
|
-
const result = await replanBufferInternal(data.bufferId, {
|
|
38
|
+
const result = await replanBufferInternal(supabaseAdmin, data.bufferId, {
|
|
37
39
|
dryRun: data.dryRun,
|
|
38
40
|
carrierType: data.carrierType ?? null,
|
|
39
41
|
});
|
|
40
42
|
if (!data.dryRun)
|
|
41
|
-
await attachIndelingToTasks(result);
|
|
43
|
+
await attachIndelingToTasks(supabaseAdmin, result);
|
|
42
44
|
return result;
|
|
43
45
|
});
|
|
44
46
|
/**
|
|
@@ -49,12 +51,13 @@ export const planAllLoadCarriers = createServerFn({ method: "POST" })
|
|
|
49
51
|
.middleware([requireSupabaseAuth])
|
|
50
52
|
.inputValidator((data) => data ?? {})
|
|
51
53
|
.handler(async ({ data }) => {
|
|
54
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
52
55
|
const { planBuffersBatch, planLooseOrdersBatch } = await import("./bulkLoadCarrierPlanning.server");
|
|
53
56
|
const limit = Math.min(Math.max(Number(data.limit ?? 20), 1), 50);
|
|
54
57
|
const cursor = data.cursor ?? null;
|
|
55
58
|
if (data.phase === "orders")
|
|
56
|
-
return planLooseOrdersBatch(cursor, limit);
|
|
57
|
-
return planBuffersBatch(cursor, limit);
|
|
59
|
+
return planLooseOrdersBatch(supabaseAdmin, cursor, limit);
|
|
60
|
+
return planBuffersBatch(supabaseAdmin, cursor, limit);
|
|
58
61
|
});
|
|
59
62
|
/**
|
|
60
63
|
* Zet voor orders zonder takenketen alsnog een melding klaar, zodat de Engine
|
|
@@ -64,9 +67,10 @@ export const ensureLogisticsTasks = createServerFn({ method: "POST" })
|
|
|
64
67
|
.middleware([requireSupabaseAuth])
|
|
65
68
|
.inputValidator((data) => data ?? {})
|
|
66
69
|
.handler(async ({ data, context }) => {
|
|
70
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
67
71
|
const { findOrdersWithoutTasks } = await import("./bulkLoadCarrierPlanning.server");
|
|
68
72
|
const limit = Math.min(Math.max(Number(data.limit ?? 50), 1), 200);
|
|
69
|
-
const orders = await findOrdersWithoutTasks(limit);
|
|
73
|
+
const orders = await findOrdersWithoutTasks(supabaseAdmin, limit);
|
|
70
74
|
let created = 0;
|
|
71
75
|
const errors = [];
|
|
72
76
|
for (const order of orders) {
|
|
@@ -101,6 +105,7 @@ export const previewLoadCarrierPlan = createServerFn({ method: "POST" })
|
|
|
101
105
|
return data;
|
|
102
106
|
})
|
|
103
107
|
.handler(async ({ data }) => {
|
|
108
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server");
|
|
104
109
|
const { replanOrderInternal } = await import("./loadCarrierPlanning.server");
|
|
105
|
-
return replanOrderInternal(data.orderId, { dryRun: true, carrierType: data.carrierType ?? null });
|
|
110
|
+
return replanOrderInternal(supabaseAdmin, data.orderId, { dryRun: true, carrierType: data.carrierType ?? null });
|
|
106
111
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
1
2
|
import { type CarrierProfile, type PlannedLoadUnit, type PlannerInputItem } from "./loadCarrierPlanner";
|
|
2
3
|
import { type LoadCarrierTypeRow } from "./loadCarrierTypes";
|
|
3
4
|
export declare function buildBufferKey(order: {
|
|
@@ -10,9 +11,9 @@ export declare function buildBufferKey(order: {
|
|
|
10
11
|
pickupDate: string;
|
|
11
12
|
location: string;
|
|
12
13
|
};
|
|
13
|
-
export declare function resolveBufferForOrderInternal(orderId: string): Promise<string | null>;
|
|
14
|
-
export declare function expandOrderItemsForPlanner(rows: Array<Record<string, any>>): Promise<PlannerInputItem[]>;
|
|
15
|
-
export declare function loadCarrierProfiles(): Promise<LoadCarrierTypeRow[]>;
|
|
14
|
+
export declare function resolveBufferForOrderInternal(sb: SupabaseClient, orderId: string): Promise<string | null>;
|
|
15
|
+
export declare function expandOrderItemsForPlanner(sb: SupabaseClient, rows: Array<Record<string, any>>): Promise<PlannerInputItem[]>;
|
|
16
|
+
export declare function loadCarrierProfiles(sb: SupabaseClient): Promise<LoadCarrierTypeRow[]>;
|
|
16
17
|
export interface BeladingRules {
|
|
17
18
|
maxOrders: number | null;
|
|
18
19
|
maxCustomers: number | null;
|
|
@@ -21,7 +22,7 @@ export interface BeladingRules {
|
|
|
21
22
|
optimalFill: boolean;
|
|
22
23
|
}
|
|
23
24
|
/** Leest de actieve werkwijze en vertaalt "2. Beladingindeling" naar plannergrenzen. */
|
|
24
|
-
export declare function loadBeladingRules(): Promise<BeladingRules | null>;
|
|
25
|
+
export declare function loadBeladingRules(sb: SupabaseClient): Promise<BeladingRules | null>;
|
|
25
26
|
/** Past de grenzen uit de werkwijze toe op het capaciteitsprofiel van een ladingdrager. */
|
|
26
27
|
export declare function applyRulesToProfile(profile: CarrierProfile, rules: BeladingRules | null): CarrierProfile;
|
|
27
28
|
export interface ReplanResult {
|
|
@@ -41,6 +42,6 @@ export interface ReplanOptions {
|
|
|
41
42
|
/** Overschrijf het ladingdragertype dat de Rule Engine zou kiezen. */
|
|
42
43
|
carrierType?: string | null;
|
|
43
44
|
}
|
|
44
|
-
export declare function replanBufferInternal(bufferId: string, options?: ReplanOptions): Promise<ReplanResult>;
|
|
45
|
-
export declare function replanOrderInternal(orderId: string, options?: ReplanOptions): Promise<ReplanResult | null>;
|
|
45
|
+
export declare function replanBufferInternal(sb: SupabaseClient, bufferId: string, options?: ReplanOptions): Promise<ReplanResult>;
|
|
46
|
+
export declare function replanOrderInternal(sb: SupabaseClient, orderId: string, options?: ReplanOptions): Promise<ReplanResult | null>;
|
|
46
47
|
//# sourceMappingURL=loadCarrierPlanning.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAiCrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,GAAG,CAAA;CAAE,EACtG,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqCvD;AAID,wBAAsB,6BAA6B,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmE/G;AAgBD,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0H7B;AAMD,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAO3F;AAUD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAOD,wFAAwF;AACxF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsBzF;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,cAAc,CAaxG;AAWD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0OvB;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAI9B"}
|
|
@@ -5,10 +5,8 @@
|
|
|
5
5
|
// draait de pure planner per ladingdragertype en schrijft het resultaat weg
|
|
6
6
|
// naar order_carts / order_cart_items.
|
|
7
7
|
// ============================================================================
|
|
8
|
-
import { supabaseAdmin } from "../integrations/supabase/client.server";
|
|
9
8
|
import { planLoadUnits, LOAD_CARRIER_PLANNER_VERSION, } from "./loadCarrierPlanner";
|
|
10
9
|
import { fallbackCarrierProfile } from "./loadCarrierTypes";
|
|
11
|
-
const db = () => supabaseAdmin;
|
|
12
10
|
// ---------------------------------------------------------------------------
|
|
13
11
|
// Buffer
|
|
14
12
|
// ---------------------------------------------------------------------------
|
|
@@ -63,15 +61,15 @@ export function buildBufferKey(order, mode) {
|
|
|
63
61
|
return { key, pickupDate, location };
|
|
64
62
|
}
|
|
65
63
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
66
|
-
export async function resolveBufferForOrderInternal(orderId) {
|
|
67
|
-
const { data: order } = await
|
|
64
|
+
export async function resolveBufferForOrderInternal(sb, orderId) {
|
|
65
|
+
const { data: order } = await sb
|
|
68
66
|
.from("orders")
|
|
69
67
|
.select("id, customer_id, delivery_date, custom_fields, buffer_id")
|
|
70
68
|
.eq("id", orderId)
|
|
71
69
|
.maybeSingle();
|
|
72
70
|
if (!order)
|
|
73
71
|
return null;
|
|
74
|
-
const { data: settings } = await
|
|
72
|
+
const { data: settings } = await sb
|
|
75
73
|
.from("cart_planning_settings")
|
|
76
74
|
.select("buffer_grouping_mode")
|
|
77
75
|
.eq("id", 1)
|
|
@@ -80,7 +78,7 @@ export async function resolveBufferForOrderInternal(orderId) {
|
|
|
80
78
|
const cf = { ...(order.custom_fields ?? {}) };
|
|
81
79
|
const locId = cf.delivery_location_id;
|
|
82
80
|
if (typeof locId === "string" && UUID_RE.test(locId) && !cf.delivery_location_gln) {
|
|
83
|
-
const { data: loc } = await
|
|
81
|
+
const { data: loc } = await sb
|
|
84
82
|
.from("customer_delivery_locations")
|
|
85
83
|
.select("gln, name")
|
|
86
84
|
.eq("id", locId)
|
|
@@ -92,7 +90,7 @@ export async function resolveBufferForOrderInternal(orderId) {
|
|
|
92
90
|
}
|
|
93
91
|
const { key, pickupDate, location } = buildBufferKey({ ...order, custom_fields: cf }, mode);
|
|
94
92
|
let bufferId = null;
|
|
95
|
-
const { data: existing } = await
|
|
93
|
+
const { data: existing } = await sb
|
|
96
94
|
.from("order_buffers")
|
|
97
95
|
.select("id")
|
|
98
96
|
.eq("buffer_key", key)
|
|
@@ -101,7 +99,7 @@ export async function resolveBufferForOrderInternal(orderId) {
|
|
|
101
99
|
bufferId = existing.id;
|
|
102
100
|
}
|
|
103
101
|
else {
|
|
104
|
-
const { data: inserted, error } = await
|
|
102
|
+
const { data: inserted, error } = await sb
|
|
105
103
|
.from("order_buffers")
|
|
106
104
|
.insert({
|
|
107
105
|
buffer_key: key,
|
|
@@ -114,7 +112,7 @@ export async function resolveBufferForOrderInternal(orderId) {
|
|
|
114
112
|
.single();
|
|
115
113
|
if (error) {
|
|
116
114
|
// Race: iemand anders maakte dezelfde buffer aan.
|
|
117
|
-
const { data: retry } = await
|
|
115
|
+
const { data: retry } = await sb
|
|
118
116
|
.from("order_buffers")
|
|
119
117
|
.select("id")
|
|
120
118
|
.eq("buffer_key", key)
|
|
@@ -126,21 +124,21 @@ export async function resolveBufferForOrderInternal(orderId) {
|
|
|
126
124
|
}
|
|
127
125
|
}
|
|
128
126
|
if (bufferId && order.buffer_id !== bufferId) {
|
|
129
|
-
await
|
|
127
|
+
await sb.from("orders").update({ buffer_id: bufferId }).eq("id", orderId);
|
|
130
128
|
}
|
|
131
129
|
return bufferId;
|
|
132
130
|
}
|
|
133
131
|
function isDefaultBelading(b) {
|
|
134
132
|
return b.plants_per_crate === 1 && b.crates_per_layer === 1 && b.layers_per_cart === 1;
|
|
135
133
|
}
|
|
136
|
-
export async function expandOrderItemsForPlanner(rows) {
|
|
134
|
+
export async function expandOrderItemsForPlanner(sb, rows) {
|
|
137
135
|
const out = [];
|
|
138
136
|
const groupIds = rows
|
|
139
137
|
.map((r) => r.product_id)
|
|
140
138
|
.filter((id) => typeof id === "string" && UUID_RE.test(id));
|
|
141
139
|
let groupSet = new Set();
|
|
142
140
|
if (groupIds.length > 0) {
|
|
143
|
-
const { data: groups } = await
|
|
141
|
+
const { data: groups } = await sb.from("product_groups").select("id").in("id", groupIds);
|
|
144
142
|
groupSet = new Set((groups ?? []).map((g) => g.id));
|
|
145
143
|
}
|
|
146
144
|
for (const row of rows) {
|
|
@@ -165,7 +163,7 @@ export async function expandOrderItemsForPlanner(rows) {
|
|
|
165
163
|
});
|
|
166
164
|
continue;
|
|
167
165
|
}
|
|
168
|
-
const { data: members } = await
|
|
166
|
+
const { data: members } = await sb
|
|
169
167
|
.from("product_group_items")
|
|
170
168
|
.select("trade_item_id, quantity, sort_order")
|
|
171
169
|
.eq("product_group_id", row.product_id)
|
|
@@ -185,7 +183,7 @@ export async function expandOrderItemsForPlanner(rows) {
|
|
|
185
183
|
continue;
|
|
186
184
|
}
|
|
187
185
|
const tradeIds = memberList.map((m) => String(m.trade_item_id));
|
|
188
|
-
const { data: prods } = await
|
|
186
|
+
const { data: prods } = await sb
|
|
189
187
|
.from("products")
|
|
190
188
|
.select("id, product, plants_per_crate, crates_per_layer, layers_per_cart, weight, floriday_trade_item_id")
|
|
191
189
|
.or(tradeIds.map((t) => `floriday_trade_item_id.eq.${t}`).join(","));
|
|
@@ -248,8 +246,8 @@ export async function expandOrderItemsForPlanner(rows) {
|
|
|
248
246
|
// ---------------------------------------------------------------------------
|
|
249
247
|
// Ladingdragertypen
|
|
250
248
|
// ---------------------------------------------------------------------------
|
|
251
|
-
export async function loadCarrierProfiles() {
|
|
252
|
-
const { data } = await
|
|
249
|
+
export async function loadCarrierProfiles(sb) {
|
|
250
|
+
const { data } = await sb
|
|
253
251
|
.from("load_carrier_types")
|
|
254
252
|
.select("*")
|
|
255
253
|
.eq("is_active", true)
|
|
@@ -264,8 +262,8 @@ const numOrNull = (v) => {
|
|
|
264
262
|
return Number.isFinite(n) && n > 0 ? Math.round(n) : null;
|
|
265
263
|
};
|
|
266
264
|
/** Leest de actieve werkwijze en vertaalt "2. Beladingindeling" naar plannergrenzen. */
|
|
267
|
-
export async function loadBeladingRules() {
|
|
268
|
-
const { data } = await
|
|
265
|
+
export async function loadBeladingRules(sb) {
|
|
266
|
+
const { data } = await sb
|
|
269
267
|
.from("logistics_rule_configs")
|
|
270
268
|
.select("settings")
|
|
271
269
|
.eq("is_active", true)
|
|
@@ -305,9 +303,9 @@ export function applyRulesToProfile(profile, rules) {
|
|
|
305
303
|
// ---------------------------------------------------------------------------
|
|
306
304
|
/** Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. */
|
|
307
305
|
const MAX_CARTS_PER_BUFFER = 500;
|
|
308
|
-
export async function replanBufferInternal(bufferId, options = {}) {
|
|
306
|
+
export async function replanBufferInternal(sb, bufferId, options = {}) {
|
|
309
307
|
const warnings = [];
|
|
310
|
-
const { data: orders } = await
|
|
308
|
+
const { data: orders } = await sb
|
|
311
309
|
.from("orders")
|
|
312
310
|
.select("id, customer_id, custom_fields, plan_locked_at")
|
|
313
311
|
.eq("buffer_id", bufferId)
|
|
@@ -327,7 +325,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
327
325
|
};
|
|
328
326
|
}
|
|
329
327
|
const idList = orderIds.length > 0 ? orderIds : ["00000000-0000-0000-0000-000000000000"];
|
|
330
|
-
const { data: items } = await
|
|
328
|
+
const { data: items } = await sb
|
|
331
329
|
.from("order_items")
|
|
332
330
|
.select("id, order_id, product_id, product_name, quantity, plants_per_crate, crates_per_layer, layers_per_cart, " +
|
|
333
331
|
"products(plants_per_crate, crates_per_layer, layers_per_cart, weight)")
|
|
@@ -337,25 +335,25 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
337
335
|
...it,
|
|
338
336
|
customer_id: customerByOrder.get(it.order_id) ?? null,
|
|
339
337
|
}));
|
|
340
|
-
const inputs = await expandOrderItemsForPlanner(rawRows);
|
|
338
|
+
const inputs = await expandOrderItemsForPlanner(sb, rawRows);
|
|
341
339
|
const itemToOrder = new Map();
|
|
342
340
|
for (const i of inputs)
|
|
343
341
|
if (i.order_id)
|
|
344
342
|
itemToOrder.set(i.order_item_id, i.order_id);
|
|
345
343
|
// Bestaande beladingen tellen en wissen.
|
|
346
|
-
const { data: existingCarts } = await
|
|
344
|
+
const { data: existingCarts } = await sb
|
|
347
345
|
.from("order_carts")
|
|
348
346
|
.select("id, source")
|
|
349
347
|
.eq("buffer_id", bufferId);
|
|
350
348
|
const replacedManualCount = (existingCarts ?? []).filter((c) => c.source === "manual").length;
|
|
351
349
|
// Instellingen + never-mix.
|
|
352
|
-
const { data: settings } = await
|
|
353
|
-
const { data: overrides } = await
|
|
350
|
+
const { data: settings } = await sb.from("cart_planning_settings").select("*").eq("id", 1).maybeSingle();
|
|
351
|
+
const { data: overrides } = await sb
|
|
354
352
|
.from("cart_planning_product_overrides")
|
|
355
353
|
.select("product_id, never_mix");
|
|
356
354
|
const neverMix = new Set((overrides ?? []).filter((o) => o.never_mix && o.product_id).map((o) => String(o.product_id)));
|
|
357
|
-
const profiles = await loadCarrierProfiles();
|
|
358
|
-
const rules = await loadBeladingRules();
|
|
355
|
+
const profiles = await loadCarrierProfiles(sb);
|
|
356
|
+
const rules = await loadBeladingRules(sb);
|
|
359
357
|
const defaultProfile = profiles.find((p) => p.is_default) ?? profileFor(profiles, "trolley");
|
|
360
358
|
let plannedCarts = [];
|
|
361
359
|
let usedFloridayPacking = false;
|
|
@@ -427,7 +425,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
427
425
|
carts: plannedCarts,
|
|
428
426
|
};
|
|
429
427
|
}
|
|
430
|
-
await
|
|
428
|
+
await sb.from("order_carts").delete().eq("buffer_id", bufferId);
|
|
431
429
|
// In blokken wegschrijven: per ladingdrager een aparte insert is bij grote
|
|
432
430
|
// orders veel te traag.
|
|
433
431
|
let created = 0;
|
|
@@ -457,7 +455,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
457
455
|
algorithm_version: LOAD_CARRIER_PLANNER_VERSION,
|
|
458
456
|
};
|
|
459
457
|
});
|
|
460
|
-
const { data: insertedCarts, error } = await
|
|
458
|
+
const { data: insertedCarts, error } = await sb
|
|
461
459
|
.from("order_carts")
|
|
462
460
|
.insert(cartRows)
|
|
463
461
|
.select("id, cart_number");
|
|
@@ -493,7 +491,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
493
491
|
for (let s = 0; s < itemRows.length; s += 500) {
|
|
494
492
|
const slice = itemRows.slice(s, s + 500);
|
|
495
493
|
if (slice.length > 0)
|
|
496
|
-
await
|
|
494
|
+
await sb.from("order_cart_items").insert(slice);
|
|
497
495
|
}
|
|
498
496
|
}
|
|
499
497
|
return {
|
|
@@ -507,9 +505,9 @@ export async function replanBufferInternal(bufferId, options = {}) {
|
|
|
507
505
|
carts: plannedCarts,
|
|
508
506
|
};
|
|
509
507
|
}
|
|
510
|
-
export async function replanOrderInternal(orderId, options = {}) {
|
|
511
|
-
const bufferId = await resolveBufferForOrderInternal(orderId);
|
|
508
|
+
export async function replanOrderInternal(sb, orderId, options = {}) {
|
|
509
|
+
const bufferId = await resolveBufferForOrderInternal(sb, orderId);
|
|
512
510
|
if (!bufferId)
|
|
513
511
|
return null;
|
|
514
|
-
return replanBufferInternal(bufferId, options);
|
|
512
|
+
return replanBufferInternal(sb, bufferId, options);
|
|
515
513
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
1
2
|
import type { ReplanResult } from "./loadCarrierPlanning.server";
|
|
2
|
-
export declare function attachIndelingToTasks(result: ReplanResult | null): Promise<number>;
|
|
3
|
+
export declare function attachIndelingToTasks(sb: SupabaseClient, result: ReplanResult | null): Promise<number>;
|
|
3
4
|
//# sourceMappingURL=loadCarrierTaskSync.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadCarrierTaskSync.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierTaskSync.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loadCarrierTaskSync.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierTaskSync.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,YAAY,GAAG,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
|
@@ -4,23 +4,21 @@
|
|
|
4
4
|
// Zet het indelingsresultaat in de payload van de openstaande load.compose
|
|
5
5
|
// taken, zodat de Afhandeling-module niets meer zelf hoeft te berekenen.
|
|
6
6
|
// ============================================================================
|
|
7
|
-
import { supabaseAdmin } from "../integrations/supabase/client.server";
|
|
8
|
-
const db = () => supabaseAdmin;
|
|
9
7
|
const OPEN_STATUSES = ["planned", "ready", "in_progress"];
|
|
10
|
-
export async function attachIndelingToTasks(result) {
|
|
8
|
+
export async function attachIndelingToTasks(sb, result) {
|
|
11
9
|
if (!result || result.skipped === "locked")
|
|
12
10
|
return 0;
|
|
13
11
|
const carts = Array.isArray(result.carts) ? result.carts : [];
|
|
14
12
|
if (result.orderIds.length === 0)
|
|
15
13
|
return 0;
|
|
16
|
-
const { data: orders } = await
|
|
14
|
+
const { data: orders } = await sb
|
|
17
15
|
.from("orders")
|
|
18
16
|
.select("id, order_number")
|
|
19
17
|
.in("id", result.orderIds);
|
|
20
18
|
const refs = (orders ?? []).map((o) => o.order_number).filter(Boolean);
|
|
21
19
|
if (refs.length === 0)
|
|
22
20
|
return 0;
|
|
23
|
-
const { data: tasks } = await
|
|
21
|
+
const { data: tasks } = await sb
|
|
24
22
|
.from("logistics_tasks")
|
|
25
23
|
.select("id, payload, order_ref")
|
|
26
24
|
.eq("task_type", "load.compose")
|
|
@@ -48,7 +46,7 @@ export async function attachIndelingToTasks(result) {
|
|
|
48
46
|
}));
|
|
49
47
|
payload.indelingWarnings = result.warnings;
|
|
50
48
|
payload.indelingSource = "logistics-engine";
|
|
51
|
-
const { error } = await
|
|
49
|
+
const { error } = await sb.from("logistics_tasks").update({ payload }).eq("id", task.id);
|
|
52
50
|
if (!error)
|
|
53
51
|
updated++;
|
|
54
52
|
}
|