@flowselections/floriday-verkoop-module 1.0.50 → 1.0.52
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/SalesOrderDetailPage.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailPage.js +10 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +233 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +233 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +233 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +236 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cart-lock.functions.d.ts +233 -0
- package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-planning-settings.functions.d.ts +2563 -0
- package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +699 -0
- package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.js +65 -47
- package/dist-lib/lib/create-order.functions.d.ts +3961 -0
- package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +699 -0
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +233 -0
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts +233 -0
- package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.js +28 -1
- package/dist-lib/lib/floriday-public.functions.d.ts +1631 -0
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +1165 -0
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.functions.d.ts +932 -0
- package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
- package/dist-lib/lib/load-carriers.functions.d.ts +233 -0
- package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-engine.functions.d.ts +1165 -0
- package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-stock.functions.d.ts +466 -0
- package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-addresses.functions.d.ts +233 -0
- package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-buffers.functions.d.ts +699 -0
- package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-carrier.functions.d.ts +466 -0
- package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-numbers.server.d.ts +10 -0
- package/dist-lib/lib/order-numbers.server.d.ts.map +1 -0
- package/dist-lib/lib/order-numbers.server.js +30 -0
- package/dist-lib/lib/order-pickup.functions.d.ts +466 -0
- package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-shipments.functions.d.ts +932 -0
- package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.functions.d.ts +233 -0
- package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.js +3 -13
- package/dist-lib/lib/salesorders.functions.d.ts +1165 -0
- package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders.functions.js +9 -9
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +466 -0
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +233 -0
- package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -23,7 +23,7 @@ export async function replanScopeInternal(scope) {
|
|
|
23
23
|
throw new Error("replanScopeInternal: geen scope");
|
|
24
24
|
let ordersQuery = supabaseAdmin
|
|
25
25
|
.from("orders")
|
|
26
|
-
.select("id, custom_fields, plan_locked_at")
|
|
26
|
+
.select("id, order_number, custom_fields, plan_locked_at")
|
|
27
27
|
.is("deleted_at", null);
|
|
28
28
|
ordersQuery = bufferId
|
|
29
29
|
? ordersQuery.eq("buffer_id", bufferId)
|
|
@@ -31,6 +31,11 @@ export async function replanScopeInternal(scope) {
|
|
|
31
31
|
const { data: orders } = await ordersQuery;
|
|
32
32
|
const orderRows = (orders ?? []);
|
|
33
33
|
const orderIds = orderRows.map((o) => o.id);
|
|
34
|
+
const orderNumberById = new Map();
|
|
35
|
+
for (const o of orderRows) {
|
|
36
|
+
if (o.order_number)
|
|
37
|
+
orderNumberById.set(o.id, String(o.order_number));
|
|
38
|
+
}
|
|
34
39
|
if (orderRows.some((o) => o.plan_locked_at)) {
|
|
35
40
|
return {
|
|
36
41
|
ok: true,
|
|
@@ -53,26 +58,51 @@ export async function replanScopeInternal(scope) {
|
|
|
53
58
|
throw new Error(itErr.message);
|
|
54
59
|
// Onbekend blijft onbekend: geen ?? 1. De planner blokkeert regels
|
|
55
60
|
// zonder (volledige) belading in plaats van 1×1×1 te plannen.
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const pos = (v) => {
|
|
62
|
+
if (v === null || v === undefined)
|
|
63
|
+
return null;
|
|
64
|
+
const n = Number(v);
|
|
65
|
+
return Number.isFinite(n) && n > 0 ? Math.round(n) : null;
|
|
66
|
+
};
|
|
67
|
+
/** Een bron telt alleen als álle drie de velden gevuld zijn (> 0). */
|
|
68
|
+
const completeSource = (plants_per_crate, crates_per_layer, layers_per_cart) => {
|
|
69
|
+
const a = pos(plants_per_crate);
|
|
70
|
+
const b = pos(crates_per_layer);
|
|
71
|
+
const c = pos(layers_per_cart);
|
|
72
|
+
return a && b && c ? { plants_per_crate: a, crates_per_layer: b, layers_per_cart: c } : null;
|
|
65
73
|
};
|
|
74
|
+
// Beladingbron per order: custom_fields.floriday_packing bevat de belading
|
|
75
|
+
// zoals die in Floriday op de order staat. Dat zijn de packing-VELDEN
|
|
76
|
+
// (pieces_per_package / packages_per_layer / layers_per_load_carrier) —
|
|
77
|
+
// géén voorgekauwde karrenlijst; de karindeling rekenen we zelf.
|
|
78
|
+
const floridayByOrder = new Map();
|
|
79
|
+
for (const o of orderRows) {
|
|
80
|
+
const fp = (o.custom_fields ?? {})?.floriday_packing ?? null;
|
|
81
|
+
if (!fp)
|
|
82
|
+
continue;
|
|
83
|
+
const bel = completeSource(fp.pieces_per_package, fp.packages_per_layer, fp.layers_per_load_carrier);
|
|
84
|
+
if (bel)
|
|
85
|
+
floridayByOrder.set(o.id, bel);
|
|
86
|
+
}
|
|
87
|
+
let usedFloridayPacking = false;
|
|
66
88
|
const inputs = (items ?? []).map((it) => {
|
|
67
89
|
const prod = it.products ?? {};
|
|
90
|
+
// Volgorde: floriday_packing → orderregel → product. Niet coalescen per
|
|
91
|
+
// veld: een half-Floriday/half-orderregel-belading is geen belading.
|
|
92
|
+
const fromFloriday = floridayByOrder.get(it.order_id) ?? null;
|
|
93
|
+
const bel = fromFloriday ??
|
|
94
|
+
completeSource(it.plants_per_crate, it.crates_per_layer, it.layers_per_cart) ??
|
|
95
|
+
completeSource(prod.plants_per_crate, prod.crates_per_layer, prod.layers_per_cart);
|
|
96
|
+
if (bel && fromFloriday)
|
|
97
|
+
usedFloridayPacking = true;
|
|
68
98
|
return {
|
|
69
99
|
order_item_id: it.id,
|
|
70
100
|
product_id: it.product_id,
|
|
71
101
|
product_name: it.product_name,
|
|
72
102
|
plants: Math.max(0, Number(it.quantity ?? 0)),
|
|
73
|
-
plants_per_crate:
|
|
74
|
-
crates_per_layer:
|
|
75
|
-
layers_per_cart:
|
|
103
|
+
plants_per_crate: bel?.plants_per_crate ?? null,
|
|
104
|
+
crates_per_layer: bel?.crates_per_layer ?? null,
|
|
105
|
+
layers_per_cart: bel?.layers_per_cart ?? null,
|
|
76
106
|
};
|
|
77
107
|
});
|
|
78
108
|
// Item → order-map voor het toewijzen van cart.order_id bij homogene karren.
|
|
@@ -87,42 +117,14 @@ export async function replanScopeInternal(scope) {
|
|
|
87
117
|
const { error: delErr } = await cartScope(supabaseAdmin.from("order_carts").delete());
|
|
88
118
|
if (delErr)
|
|
89
119
|
throw new Error(delErr.message);
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
|
|
120
|
+
// De karindeling wordt hier altijd zelf gerekend. custom_fields.floriday_packing
|
|
121
|
+
// levert alleen de belading-VELDEN (pieces_per_package / packages_per_layer /
|
|
122
|
+
// layers_per_load_carrier) — de mirror schrijft nooit een voorgekauwde
|
|
123
|
+
// carts-array, dus die tak bestaat bewust niet meer.
|
|
93
124
|
let plannedCarts = [];
|
|
94
125
|
const warnings = [];
|
|
95
126
|
let blockedItems = [];
|
|
96
|
-
|
|
97
|
-
const soloCustom = solo?.custom_fields ?? {};
|
|
98
|
-
const floridayPacking = soloCustom?.floriday_packing ?? null;
|
|
99
|
-
const isFo = solo && (soloCustom?.source === "floriday" || floridayPacking?.pieces_per_package);
|
|
100
|
-
if (isFo && floridayPacking && Array.isArray(floridayPacking.carts)) {
|
|
101
|
-
usedFloridayPacking = true;
|
|
102
|
-
plannedCarts = floridayPacking.carts.map((c, idx) => {
|
|
103
|
-
const cItems = (c.items ?? []).map((i) => ({
|
|
104
|
-
order_item_id: i.order_item_id,
|
|
105
|
-
product_id: i.product_id ?? null,
|
|
106
|
-
product_name: i.product_name ?? "—",
|
|
107
|
-
crates: Number(i.crates ?? 0),
|
|
108
|
-
plants: Number(i.plants ?? Number(i.crates ?? 0) * Number(i.plants_per_crate ?? 1)),
|
|
109
|
-
plants_per_crate: Math.max(1, Number(i.plants_per_crate ?? 1)),
|
|
110
|
-
crates_per_layer: Math.max(1, Number(i.crates_per_layer ?? 1)),
|
|
111
|
-
layers_per_cart: Math.max(1, Number(i.layers_per_cart ?? 1)),
|
|
112
|
-
layer_fraction: Number(i.layer_fraction ?? 1),
|
|
113
|
-
layer_share_pct: Number(i.layer_share_pct ?? 100),
|
|
114
|
-
}));
|
|
115
|
-
return {
|
|
116
|
-
cart_number: idx + 1,
|
|
117
|
-
source: "auto",
|
|
118
|
-
is_complete: !!c.is_complete,
|
|
119
|
-
occupancy_pct: Number(c.occupancy_pct ?? 100),
|
|
120
|
-
total_layers_used: Number(c.total_layers_used ?? 1),
|
|
121
|
-
items: cItems,
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
127
|
+
{
|
|
126
128
|
const [{ data: settings }, { data: overrides }] = await Promise.all([
|
|
127
129
|
supabaseAdmin.from("cart_planning_settings").select("*").eq("id", 1).maybeSingle(),
|
|
128
130
|
supabaseAdmin.from("cart_planning_product_overrides").select("product_id, never_mix"),
|
|
@@ -154,9 +156,25 @@ export async function replanScopeInternal(scope) {
|
|
|
154
156
|
missing: b.missing,
|
|
155
157
|
}));
|
|
156
158
|
if (blockedOrderIds.length > 0) {
|
|
159
|
+
const FIELD_LABELS = {
|
|
160
|
+
plants_per_crate: "planten per fust",
|
|
161
|
+
crates_per_layer: "fusten per laag",
|
|
162
|
+
layers_per_cart: "lagen per kar",
|
|
163
|
+
};
|
|
164
|
+
const nummers = blockedOrderIds
|
|
165
|
+
.map((id) => orderNumberById.get(id) ?? id.slice(0, 8))
|
|
166
|
+
.join(", ");
|
|
167
|
+
const velden = [
|
|
168
|
+
...new Set(blockedItems.flatMap((b) => b.missing)),
|
|
169
|
+
]
|
|
170
|
+
.map((f) => FIELD_LABELS[f] ?? f)
|
|
171
|
+
.join(", ");
|
|
172
|
+
const reason = `Karindeling geblokkeerd voor order(s) ${nummers}: ` +
|
|
173
|
+
`${blockedItems.length} orderregel(s) zonder volledige belading` +
|
|
174
|
+
(velden ? ` (ontbreekt: ${velden})` : "") + ".";
|
|
157
175
|
const { error: blockErr } = await supabaseAdmin.rpc("logistics_plan_block", {
|
|
158
176
|
p_order_ids: blockedOrderIds,
|
|
159
|
-
p_reason:
|
|
177
|
+
p_reason: reason,
|
|
160
178
|
p_details: { source: "floriday-verkoop-module/cart-replan", items: blockedItems },
|
|
161
179
|
});
|
|
162
180
|
if (blockErr) {
|