@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.
Files changed (63) hide show
  1. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/SalesOrderDetailPage.js +10 -1
  3. package/dist-lib/integrations/supabase/auth-middleware.d.ts +233 -0
  4. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  5. package/dist-lib/integrations/supabase/client.d.ts +233 -0
  6. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  7. package/dist-lib/integrations/supabase/client.server.d.ts +233 -0
  8. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/types.d.ts +236 -0
  10. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  11. package/dist-lib/lib/cart-lock.functions.d.ts +233 -0
  12. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  13. package/dist-lib/lib/cart-planning-settings.functions.d.ts +2563 -0
  14. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
  15. package/dist-lib/lib/cart-replan.functions.d.ts +699 -0
  16. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-replan.functions.js +65 -47
  18. package/dist-lib/lib/create-order.functions.d.ts +3961 -0
  19. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  20. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +699 -0
  21. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  22. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +233 -0
  23. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/floriday-mirror.functions.d.ts +233 -0
  25. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floriday-mirror.functions.js +28 -1
  27. package/dist-lib/lib/floriday-public.functions.d.ts +1631 -0
  28. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  29. package/dist-lib/lib/floriday-writes.functions.d.ts +1165 -0
  30. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  31. package/dist-lib/lib/invoice-timing.functions.d.ts +932 -0
  32. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/load-carriers.functions.d.ts +233 -0
  34. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/logistics-engine.functions.d.ts +1165 -0
  36. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/logistics-stock.functions.d.ts +466 -0
  38. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  39. package/dist-lib/lib/order-addresses.functions.d.ts +233 -0
  40. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/order-buffers.functions.d.ts +699 -0
  42. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  43. package/dist-lib/lib/order-carrier.functions.d.ts +466 -0
  44. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/order-numbers.server.d.ts +10 -0
  46. package/dist-lib/lib/order-numbers.server.d.ts.map +1 -0
  47. package/dist-lib/lib/order-numbers.server.js +30 -0
  48. package/dist-lib/lib/order-pickup.functions.d.ts +466 -0
  49. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  50. package/dist-lib/lib/order-shipments.functions.d.ts +932 -0
  51. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  52. package/dist-lib/lib/salesorders-list.functions.d.ts +233 -0
  53. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
  55. package/dist-lib/lib/salesorders-list.server.js +3 -13
  56. package/dist-lib/lib/salesorders.functions.d.ts +1165 -0
  57. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  58. package/dist-lib/lib/salesorders.functions.js +9 -9
  59. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +466 -0
  60. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  61. package/dist-lib/lib/tradeitems.functions.d.ts +233 -0
  62. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  63. 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 pick = (a, b) => {
57
- for (const v of [a, b]) {
58
- if (v === null || v === undefined)
59
- continue;
60
- const n = Number(v);
61
- if (Number.isFinite(n) && n > 0)
62
- return Math.round(n);
63
- }
64
- return null;
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: pick(it.plants_per_crate, prod.plants_per_crate),
74
- crates_per_layer: pick(it.crates_per_layer, prod.crates_per_layer),
75
- layers_per_cart: pick(it.layers_per_cart, prod.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
- // Floriday-packingConfiguration-fallback: alleen als de buffer precies één
91
- // order bevat én die order een volledig Floriday-packingConfiguration heeft.
92
- let usedFloridayPacking = false;
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
- const solo = orderRows.length === 1 ? orderRows[0] : null;
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: "belading_onbekend",
177
+ p_reason: reason,
160
178
  p_details: { source: "floriday-verkoop-module/cart-replan", items: blockedItems },
161
179
  });
162
180
  if (blockErr) {