@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.
Files changed (57) hide show
  1. package/dist-lib/components/verkoop/CreateOrderPage.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/CreateOrderPage.js +6 -4
  3. package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts +6 -0
  4. package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts.map +1 -0
  5. package/dist-lib/components/verkoop/EditLocalOrderDialog.js +102 -0
  6. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  7. package/dist-lib/components/verkoop/OrderKarindelingCard.js +26 -28
  8. package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts +5 -0
  9. package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts.map +1 -0
  10. package/dist-lib/components/verkoop/OrderShipmentsCard.js +137 -0
  11. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
  12. package/dist-lib/components/verkoop/SalesOrderDetailPage.js +8 -2
  13. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  14. package/dist-lib/components/verkoop/SalesOrderDetailView.js +2 -1
  15. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts +4 -1
  16. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  17. package/dist-lib/components/verkoop/SalesOrdersTable.js +2 -2
  18. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  19. package/dist-lib/components/verkoop/VerkoopOrdersPage.js +43 -1
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts +381 -150
  21. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  22. package/dist-lib/integrations/supabase/client.d.ts +381 -150
  23. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  24. package/dist-lib/integrations/supabase/client.server.d.ts +381 -150
  25. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  26. package/dist-lib/integrations/supabase/types.d.ts +397 -154
  27. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  28. package/dist-lib/lib/cart-lock.functions.d.ts +381 -150
  29. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/cart-replan.functions.d.ts +789 -327
  31. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/create-order.functions.d.ts +38897 -1457
  33. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/create-order.functions.js +792 -52
  35. package/dist-lib/lib/expand-group-order-items.d.ts +13 -0
  36. package/dist-lib/lib/expand-group-order-items.d.ts.map +1 -0
  37. package/dist-lib/lib/expand-group-order-items.js +216 -0
  38. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +1174 -481
  39. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +381 -150
  41. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/floriday-public.functions.d.ts +2701 -1084
  43. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/floriday-writes.functions.d.ts +1939 -784
  45. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  46. package/dist-lib/lib/order-shipments.functions.d.ts +47158 -0
  47. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -0
  48. package/dist-lib/lib/order-shipments.functions.js +178 -0
  49. package/dist-lib/lib/salesorders-mapping.d.ts +1 -0
  50. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  51. package/dist-lib/lib/salesorders.functions.d.ts +1174 -481
  52. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/tradeitems.functions.d.ts +381 -150
  54. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  55. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  56. package/dist-lib/lib/useSalesOrdersQuery.js +39 -2
  57. 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
+ }