@flowselections/floriday-verkoop-module 1.0.17 → 1.0.18
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 +6 -4
- package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts +6 -0
- package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts.map +1 -0
- package/dist-lib/components/verkoop/EditLocalOrderDialog.js +102 -0
- package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
- package/dist-lib/components/verkoop/OrderKarindelingCard.js +26 -28
- package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts +5 -0
- package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts.map +1 -0
- package/dist-lib/components/verkoop/OrderShipmentsCard.js +137 -0
- package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailPage.js +8 -2
- package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailView.js +2 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.d.ts +4 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.js +2 -2
- package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
- package/dist-lib/components/verkoop/VerkoopOrdersPage.js +43 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +381 -150
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +381 -150
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +381 -150
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +397 -154
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cart-lock.functions.d.ts +381 -150
- package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +789 -327
- package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
- package/dist-lib/lib/create-order.functions.d.ts +38897 -1457
- package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
- package/dist-lib/lib/create-order.functions.js +792 -52
- package/dist-lib/lib/expand-group-order-items.d.ts +13 -0
- package/dist-lib/lib/expand-group-order-items.d.ts.map +1 -0
- package/dist-lib/lib/expand-group-order-items.js +216 -0
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +1174 -481
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +381 -150
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-public.functions.d.ts +2701 -1084
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +1939 -784
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-shipments.functions.d.ts +47158 -0
- package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -0
- package/dist-lib/lib/order-shipments.functions.js +178 -0
- package/dist-lib/lib/salesorders-mapping.d.ts +1 -0
- package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
- package/dist-lib/lib/salesorders.functions.d.ts +1174 -481
- package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +381 -150
- package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
- package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
- package/dist-lib/lib/useSalesOrdersQuery.js +39 -2
- package/package.json +2 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
import type { PlannerInputItem } from "./cart-planner";
|
|
3
|
+
export interface RawOrderItem {
|
|
4
|
+
id: string;
|
|
5
|
+
product_id: string | null;
|
|
6
|
+
product_name: string;
|
|
7
|
+
quantity: number;
|
|
8
|
+
plants_per_crate: number;
|
|
9
|
+
crates_per_layer: number;
|
|
10
|
+
layers_per_cart: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function expandOrderItemsForPlanner(supabase: SupabaseClient, rows: RawOrderItem[]): Promise<PlannerInputItem[]>;
|
|
13
|
+
//# sourceMappingURL=expand-group-order-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-group-order-items.d.ts","sourceRoot":"","sources":["../../src/lib/expand-group-order-items.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAmCD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,YAAY,EAAE,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6M7B"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
function num(v, min = 1) {
|
|
2
|
+
const n = Number(v);
|
|
3
|
+
return Number.isFinite(n) && n >= min ? n : min;
|
|
4
|
+
}
|
|
5
|
+
function beladingFromDraft(data) {
|
|
6
|
+
const cfg = Array.isArray(data?.packingConfigurations)
|
|
7
|
+
? data.packingConfigurations.find((c) => c?.isPrimary) ?? data.packingConfigurations[0]
|
|
8
|
+
: null;
|
|
9
|
+
if (!cfg)
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
plants_per_crate: num(cfg.unitsPerPackage ?? cfg.piecesPerPackage),
|
|
13
|
+
crates_per_layer: num(cfg.packagesPerLayer),
|
|
14
|
+
layers_per_cart: num(cfg.layersPerLoadCarrier),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function beladingFromTradeItem(data) {
|
|
18
|
+
const cfg = data?.packingConfiguration;
|
|
19
|
+
if (!cfg)
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
plants_per_crate: num(cfg.piecesPerPackage ?? cfg.unitsPerPackage),
|
|
23
|
+
crates_per_layer: num(cfg.packagesPerLayer),
|
|
24
|
+
layers_per_cart: num(cfg.layersPerLoadCarrier),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export async function expandOrderItemsForPlanner(supabase, rows) {
|
|
28
|
+
if (!rows.length)
|
|
29
|
+
return [];
|
|
30
|
+
// Welke product_ids zijn eigenlijk groep-ids? En resolve groepen op naam
|
|
31
|
+
// ("[Groep] <naam>") voor rijen zonder product_id.
|
|
32
|
+
const candidateIds = rows.map((r) => r.product_id).filter((v) => !!v);
|
|
33
|
+
const GROUP_PREFIX = /^\s*\[Groep\]\s*/i;
|
|
34
|
+
const nameCandidates = Array.from(new Set(rows
|
|
35
|
+
.filter((r) => !r.product_id && GROUP_PREFIX.test(r.product_name ?? ""))
|
|
36
|
+
.map((r) => (r.product_name ?? "").replace(GROUP_PREFIX, "").trim())
|
|
37
|
+
.filter(Boolean)));
|
|
38
|
+
const groupIds = new Set();
|
|
39
|
+
const groupIdByName = new Map();
|
|
40
|
+
const memberMap = new Map();
|
|
41
|
+
if (candidateIds.length || nameCandidates.length) {
|
|
42
|
+
const [byId, byName] = await Promise.all([
|
|
43
|
+
candidateIds.length
|
|
44
|
+
? supabase.from("product_groups").select("id, name").in("id", candidateIds)
|
|
45
|
+
: Promise.resolve({ data: [] }),
|
|
46
|
+
nameCandidates.length
|
|
47
|
+
? supabase.from("product_groups").select("id, name").in("name", nameCandidates)
|
|
48
|
+
: Promise.resolve({ data: [] }),
|
|
49
|
+
]);
|
|
50
|
+
for (const g of byId.data ?? [])
|
|
51
|
+
groupIds.add(g.id);
|
|
52
|
+
for (const g of byName.data ?? []) {
|
|
53
|
+
groupIds.add(g.id);
|
|
54
|
+
groupIdByName.set(g.name.trim().toLowerCase(), g.id);
|
|
55
|
+
}
|
|
56
|
+
if (groupIds.size) {
|
|
57
|
+
const { data: gis } = await supabase
|
|
58
|
+
.from("product_group_items")
|
|
59
|
+
.select("product_group_id, trade_item_id, quantity, sort_order")
|
|
60
|
+
.in("product_group_id", Array.from(groupIds));
|
|
61
|
+
for (const gi of gis ?? []) {
|
|
62
|
+
const gid = gi.product_group_id;
|
|
63
|
+
const arr = memberMap.get(gid) ?? [];
|
|
64
|
+
arr.push({
|
|
65
|
+
trade_item_id: gi.trade_item_id,
|
|
66
|
+
quantity: num(gi.quantity, 1),
|
|
67
|
+
sort_order: Number(gi.sort_order ?? 0),
|
|
68
|
+
});
|
|
69
|
+
memberMap.set(gid, arr);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const resolveGroupId = (row) => {
|
|
74
|
+
if (row.product_id && groupIds.has(row.product_id))
|
|
75
|
+
return row.product_id;
|
|
76
|
+
if (!row.product_id && GROUP_PREFIX.test(row.product_name ?? "")) {
|
|
77
|
+
const key = (row.product_name ?? "").replace(GROUP_PREFIX, "").trim().toLowerCase();
|
|
78
|
+
return groupIdByName.get(key) ?? null;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
};
|
|
82
|
+
// Verzamel unieke member trade_item_ids voor bulk-lookup van belading + naam.
|
|
83
|
+
const memberIds = new Set();
|
|
84
|
+
for (const arr of memberMap.values())
|
|
85
|
+
for (const m of arr)
|
|
86
|
+
memberIds.add(m.trade_item_id);
|
|
87
|
+
const productsByKey = new Map();
|
|
88
|
+
const draftsById = new Map();
|
|
89
|
+
const tradeItemsById = new Map();
|
|
90
|
+
if (memberIds.size) {
|
|
91
|
+
const ids = Array.from(memberIds);
|
|
92
|
+
const [prodRes, draftRes, tradeRes] = await Promise.all([
|
|
93
|
+
supabase.from("products").select("id, product, plants_per_crate, crates_per_layer, layers_per_cart, custom_fields").or(`id.in.(${ids.join(",")}),custom_fields->>floriday_id.in.(${ids.join(",")})`),
|
|
94
|
+
supabase.from("trade_item_drafts").select("id, data").in("id", ids),
|
|
95
|
+
supabase.from("floriday_trade_items_cache").select("floriday_id, data").in("floriday_id", ids),
|
|
96
|
+
]);
|
|
97
|
+
for (const p of prodRes.data ?? []) {
|
|
98
|
+
const bel = {
|
|
99
|
+
plants_per_crate: num(p.plants_per_crate),
|
|
100
|
+
crates_per_layer: num(p.crates_per_layer),
|
|
101
|
+
layers_per_cart: num(p.layers_per_cart),
|
|
102
|
+
};
|
|
103
|
+
const name = p.product ?? "(zonder naam)";
|
|
104
|
+
productsByKey.set(p.id, { name, belading: bel });
|
|
105
|
+
const fid = p.custom_fields?.floriday_id ?? null;
|
|
106
|
+
if (fid && !productsByKey.has(fid))
|
|
107
|
+
productsByKey.set(fid, { name, belading: bel });
|
|
108
|
+
}
|
|
109
|
+
for (const d of draftRes.data ?? []) {
|
|
110
|
+
draftsById.set(d.id, {
|
|
111
|
+
name: (d.data?.name ?? "").trim() || "(zonder naam)",
|
|
112
|
+
belading: beladingFromDraft(d.data),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
for (const t of tradeRes.data ?? []) {
|
|
116
|
+
tradeItemsById.set(t.floriday_id, {
|
|
117
|
+
name: (t.data?.tradeItemName ?? "").trim() || "(zonder naam)",
|
|
118
|
+
belading: beladingFromTradeItem(t.data),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const row of rows) {
|
|
124
|
+
const plants = Math.max(0, Math.round(Number(row.quantity ?? 0)));
|
|
125
|
+
if (plants <= 0)
|
|
126
|
+
continue;
|
|
127
|
+
const resolvedGroupId = resolveGroupId(row);
|
|
128
|
+
if (!resolvedGroupId) {
|
|
129
|
+
out.push({
|
|
130
|
+
order_item_id: row.id,
|
|
131
|
+
product_id: row.product_id,
|
|
132
|
+
product_name: row.product_name,
|
|
133
|
+
plants,
|
|
134
|
+
plants_per_crate: num(row.plants_per_crate),
|
|
135
|
+
crates_per_layer: num(row.crates_per_layer),
|
|
136
|
+
layers_per_cart: num(row.layers_per_cart),
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const members = (memberMap.get(resolvedGroupId) ?? []).slice().sort((a, b) => a.sort_order - b.sort_order);
|
|
141
|
+
// Resolveer eerst per member; als er geen belading is, val terug op de
|
|
142
|
+
// eerste beschikbare belading van een sibling (voorkomt 1x1x1 fallback
|
|
143
|
+
// voor members zonder eigen packingConfiguration).
|
|
144
|
+
const preResolved = members.map((m, idx) => {
|
|
145
|
+
const prod = productsByKey.get(m.trade_item_id);
|
|
146
|
+
const draft = draftsById.get(m.trade_item_id);
|
|
147
|
+
const trade = tradeItemsById.get(m.trade_item_id);
|
|
148
|
+
const name = prod?.name ?? draft?.name ?? trade?.name ?? `Member ${idx + 1}`;
|
|
149
|
+
const belading = prod?.belading ?? draft?.belading ?? trade?.belading ?? null;
|
|
150
|
+
return { m, name, belading };
|
|
151
|
+
});
|
|
152
|
+
const rowBelading = {
|
|
153
|
+
plants_per_crate: num(row.plants_per_crate),
|
|
154
|
+
crates_per_layer: num(row.crates_per_layer),
|
|
155
|
+
layers_per_cart: num(row.layers_per_cart),
|
|
156
|
+
};
|
|
157
|
+
const siblingBelading = preResolved.find((r) => r.belading)?.belading ?? null;
|
|
158
|
+
const fallbackBelading = siblingBelading ??
|
|
159
|
+
(rowBelading.plants_per_crate > 1 || rowBelading.crates_per_layer > 1 || rowBelading.layers_per_cart > 1
|
|
160
|
+
? rowBelading
|
|
161
|
+
: { plants_per_crate: 1, crates_per_layer: 1, layers_per_cart: 1 });
|
|
162
|
+
const groupBelading = fallbackBelading;
|
|
163
|
+
const resolved = preResolved.map((r) => ({ ...r, belading: r.belading ?? fallbackBelading }));
|
|
164
|
+
if (resolved.length === 0) {
|
|
165
|
+
out.push({
|
|
166
|
+
order_item_id: row.id,
|
|
167
|
+
product_id: row.product_id,
|
|
168
|
+
product_name: row.product_name,
|
|
169
|
+
plants,
|
|
170
|
+
plants_per_crate: groupBelading.plants_per_crate,
|
|
171
|
+
crates_per_layer: groupBelading.crates_per_layer,
|
|
172
|
+
layers_per_cart: groupBelading.layers_per_cart,
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
// Verdeel planten proportioneel over members op basis van pgi.quantity,
|
|
177
|
+
// afgerond op hele fusten van dat member. Restant naar het eerste member.
|
|
178
|
+
const weightSum = resolved.reduce((s, r) => s + r.m.quantity, 0) || resolved.length;
|
|
179
|
+
let assigned = 0;
|
|
180
|
+
const shares = [];
|
|
181
|
+
for (let i = 0; i < resolved.length; i++) {
|
|
182
|
+
const r = resolved[i];
|
|
183
|
+
const raw = (plants * r.m.quantity) / weightSum;
|
|
184
|
+
const ppc = r.belading.plants_per_crate;
|
|
185
|
+
// afronden naar dichtstbijzijnde hele fust
|
|
186
|
+
const crates = Math.max(0, Math.round(raw / ppc));
|
|
187
|
+
const share = crates * ppc;
|
|
188
|
+
shares.push(share);
|
|
189
|
+
assigned += share;
|
|
190
|
+
}
|
|
191
|
+
// Corrigeer verschil op eerste member (in stappen van dat member's fust)
|
|
192
|
+
if (assigned !== plants && shares.length) {
|
|
193
|
+
const firstPpc = resolved[0].belading.plants_per_crate;
|
|
194
|
+
const delta = plants - assigned;
|
|
195
|
+
// rond delta naar dichtstbijzijnde fust
|
|
196
|
+
const deltaCrates = Math.round(delta / firstPpc);
|
|
197
|
+
shares[0] = Math.max(0, shares[0] + deltaCrates * firstPpc);
|
|
198
|
+
}
|
|
199
|
+
for (let i = 0; i < resolved.length; i++) {
|
|
200
|
+
const share = shares[i];
|
|
201
|
+
if (share <= 0)
|
|
202
|
+
continue;
|
|
203
|
+
const r = resolved[i];
|
|
204
|
+
out.push({
|
|
205
|
+
order_item_id: `${row.id}::${r.m.trade_item_id}`,
|
|
206
|
+
product_id: r.m.trade_item_id,
|
|
207
|
+
product_name: `${row.product_name} — ${r.name}`,
|
|
208
|
+
plants: share,
|
|
209
|
+
plants_per_crate: r.belading.plants_per_crate,
|
|
210
|
+
crates_per_layer: r.belading.crates_per_layer,
|
|
211
|
+
layers_per_cart: r.belading.layers_per_cart,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|