@flowselections/floriday-verkoop-module 1.0.16 → 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 (60) hide show
  1. package/dist-lib/components/verkoop/CreateOrderPage.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/CreateOrderPage.js +12 -12
  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/SalesOrdersFilters.d.ts.map +1 -1
  16. package/dist-lib/components/verkoop/SalesOrdersFilters.js +2 -8
  17. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts +4 -1
  18. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  19. package/dist-lib/components/verkoop/SalesOrdersTable.js +2 -2
  20. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  21. package/dist-lib/components/verkoop/VerkoopOrdersPage.js +43 -1
  22. package/dist-lib/index.js +2 -2
  23. package/dist-lib/integrations/supabase/auth-middleware.d.ts +607 -169
  24. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/client.d.ts +607 -169
  26. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  27. package/dist-lib/integrations/supabase/client.server.d.ts +607 -169
  28. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  29. package/dist-lib/integrations/supabase/types.d.ts +623 -164
  30. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  31. package/dist-lib/lib/cart-lock.functions.d.ts +607 -169
  32. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/cart-replan.functions.d.ts +1221 -345
  34. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/create-order.functions.d.ts +40700 -1397
  36. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/create-order.functions.js +792 -52
  38. package/dist-lib/lib/expand-group-order-items.d.ts +13 -0
  39. package/dist-lib/lib/expand-group-order-items.d.ts.map +1 -0
  40. package/dist-lib/lib/expand-group-order-items.js +216 -0
  41. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +1767 -453
  42. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  43. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +607 -169
  44. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/floriday-public.functions.d.ts +4123 -1057
  46. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/floriday-writes.functions.d.ts +2945 -755
  48. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/order-shipments.functions.d.ts +47158 -0
  50. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -0
  51. package/dist-lib/lib/order-shipments.functions.js +178 -0
  52. package/dist-lib/lib/salesorders-mapping.d.ts +1 -0
  53. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  54. package/dist-lib/lib/salesorders.functions.d.ts +1767 -453
  55. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  56. package/dist-lib/lib/tradeitems.functions.d.ts +607 -169
  57. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  58. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  59. package/dist-lib/lib/useSalesOrdersQuery.js +39 -2
  60. 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
+ }