@flowselections/floriday-verkoop-module 1.0.55 → 1.0.56

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 (59) hide show
  1. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/OrderKarindelingCard.js +2 -1
  3. package/dist-lib/integrations/supabase/auth-middleware.d.ts +11 -8
  4. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  5. package/dist-lib/integrations/supabase/client.d.ts +11 -8
  6. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  7. package/dist-lib/integrations/supabase/client.server.d.ts +11 -8
  8. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/types.d.ts +11 -8
  10. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  11. package/dist-lib/lib/cart-lock.functions.d.ts +11 -8
  12. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  13. package/dist-lib/lib/cart-planning-settings.functions.d.ts +121 -88
  14. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
  15. package/dist-lib/lib/cart-replan.functions.d.ts +33 -24
  16. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-replan.functions.js +38 -31
  18. package/dist-lib/lib/create-order.functions.d.ts +187 -136
  19. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  20. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +33 -24
  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 +11 -8
  23. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/floriday-mirror.functions.d.ts +11 -8
  25. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floriday-public.functions.d.ts +77 -56
  27. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/floriday-writes.functions.d.ts +55 -40
  29. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/invoice-timing.functions.d.ts +44 -32
  31. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/load-carriers.functions.d.ts +11 -8
  33. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/logistics-engine.functions.d.ts +55 -40
  35. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/logistics-stock.functions.d.ts +22 -16
  37. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  38. package/dist-lib/lib/order-addresses.functions.d.ts +11 -8
  39. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/order-buffers.functions.d.ts +33 -24
  41. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/order-carrier.functions.d.ts +22 -16
  43. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/order-pickup.functions.d.ts +22 -16
  45. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  46. package/dist-lib/lib/order-shipments.functions.d.ts +44 -32
  47. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  48. package/dist-lib/lib/product-name.d.ts +3 -0
  49. package/dist-lib/lib/product-name.d.ts.map +1 -0
  50. package/dist-lib/lib/product-name.js +43 -0
  51. package/dist-lib/lib/salesorders-list.functions.d.ts +11 -8
  52. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/salesorders.functions.d.ts +55 -40
  54. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  55. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +22 -16
  56. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/tradeitems.functions.d.ts +11 -8
  58. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -160,18 +160,14 @@ export async function replanScopeInternal(scope) {
160
160
  for (const it of items ?? []) {
161
161
  itemToOrder.set(it.id, it.order_id);
162
162
  }
163
- // Bestaande karren in de scope tellen (voor waarschuwing) en wissen.
164
163
  // Nummering én delete-scope liggen altijd op bufferniveau als de order een
165
- // buffer heeft; order-scope is uitsluitend terugval.
164
+ // buffer heeft; order-scope is uitsluitend terugval. Wissen én wegschrijven
165
+ // gebeuren verderop in ÉÉN transactie via public.replace_order_carts, zodat
166
+ // een mislukte replan de bestaande indeling laat staan.
166
167
  if (!bufferId) {
167
168
  console.warn("[cart-replan] geen buffer voor order %s — nummering en delete vallen terug op order-scope", soloOrderId);
168
169
  }
169
- const cartScope = (q) => bufferId ? q.eq("buffer_id", bufferId) : q.eq("order_id", soloOrderId);
170
- const { data: existingCarts } = await cartScope(supabaseAdmin.from("order_carts").select("id, source"));
171
- const replacedManualCount = (existingCarts ?? []).filter((c) => c.source === "manual").length;
172
- const { error: delErr } = await cartScope(supabaseAdmin.from("order_carts").delete());
173
- if (delErr)
174
- throw new Error(delErr.message);
170
+ let replacedManualCount = 0;
175
171
  // De karindeling wordt hier altijd zelf gerekend. custom_fields.floriday_packing
176
172
  // levert alleen de belading-VELDEN (pieces_per_package / packages_per_layer /
177
173
  // layers_per_load_carrier) — de mirror schrijft nooit een voorgekauwde
@@ -278,8 +274,10 @@ export async function replanScopeInternal(scope) {
278
274
  }
279
275
  }
280
276
  }
281
- let cartsCreated = 0;
282
- for (const { cart, profile } of plannedCarts) {
277
+ // Payload voor public.replace_order_carts. LET OP: de sleutels hieronder
278
+ // moeten gelijk lopen met de sleutellijsten in die SQL-functie; ontbreekt er
279
+ // één, dan gooit de database een fout in plaats van stil NULL te schrijven.
280
+ const cartPayload = plannedCarts.map(({ cart, profile }) => {
283
281
  // Bepaal cart.order_id: null bij mix van orders, anders die ene order.
284
282
  const orderIdsOnCart = new Set();
285
283
  for (const i of cart.items) {
@@ -288,9 +286,7 @@ export async function replanScopeInternal(scope) {
288
286
  orderIdsOnCart.add(oid);
289
287
  }
290
288
  const singleOrderId = orderIdsOnCart.size === 1 ? [...orderIdsOnCart][0] : null;
291
- const { data: inserted, error: cErr } = await supabaseAdmin
292
- .from("order_carts")
293
- .insert({
289
+ return {
294
290
  order_id: singleOrderId,
295
291
  buffer_id: bufferId,
296
292
  cart_number: cart.cart_number,
@@ -304,14 +300,7 @@ export async function replanScopeInternal(scope) {
304
300
  carrier_type_id: profile.id,
305
301
  max_layers: profile.layers_per_carrier ?? null,
306
302
  algorithm_version: CART_PLANNER_VERSION,
307
- })
308
- .select("id")
309
- .single();
310
- if (cErr)
311
- throw new Error(cErr.message);
312
- if (cart.items.length > 0) {
313
- const rows = cart.items.map((i) => ({
314
- cart_id: inserted.id,
303
+ items: cart.items.map((i) => ({
315
304
  order_item_id: i.order_item_id,
316
305
  product_id: i.product_id,
317
306
  product_name: i.product_name,
@@ -321,14 +310,28 @@ export async function replanScopeInternal(scope) {
321
310
  layers_per_cart: i.layers_per_cart,
322
311
  layer_fraction: i.layer_fraction,
323
312
  layer_share_pct: i.layer_share_pct,
324
- }));
325
- const { error: iErr } = await supabaseAdmin
326
- .from("order_cart_items")
327
- .insert(rows);
328
- if (iErr)
329
- throw new Error(iErr.message);
330
- }
331
- cartsCreated++;
313
+ })),
314
+ };
315
+ });
316
+ // Delete + inserts in één transactie: faalt er iets, dan blijft de oude
317
+ // karindeling staan in plaats van een lege buffer achter te laten.
318
+ const { data: replaceRes, error: replaceErr } = await supabaseAdmin.rpc("replace_order_carts", {
319
+ p_buffer_id: bufferId,
320
+ p_order_id: bufferId ? null : soloOrderId,
321
+ p_carts: cartPayload,
322
+ });
323
+ if (replaceErr)
324
+ throw new Error(replaceErr.message);
325
+ const cartsCreated = Number(replaceRes?.carts_written ?? 0);
326
+ const itemsWritten = Number(replaceRes?.items_written ?? 0);
327
+ replacedManualCount = Number(replaceRes?.replaced_manual_count ?? 0);
328
+ // Controleer dat de database daadwerkelijk heeft weggeschreven wat de
329
+ // planner opleverde. Nul karren mag, maar alleen als de planner er ook nul
330
+ // opleverde — niet als gevolg van een fout.
331
+ const expectedItems = cartPayload.reduce((n, c) => n + c.items.length, 0);
332
+ if (cartsCreated !== cartPayload.length || itemsWritten !== expectedItems) {
333
+ throw new Error(`Karindeling niet volledig weggeschreven: ${cartsCreated}/${cartPayload.length} karren, ` +
334
+ `${itemsWritten}/${expectedItems} artikelen.`);
332
335
  }
333
336
  return {
334
337
  ok: true,
@@ -502,9 +505,13 @@ export const listOrderCarts = createServerFn({ method: "GET" })
502
505
  fail("planqueue lezen", q.error);
503
506
  const r = (q.data ?? [])[0];
504
507
  if (r && (r.error || r.reason)) {
508
+ // `reason` in logistics_plan_queue is vaak een sleutel/veldnaam
509
+ // ("items"), geen leesbare reden. De echte fout staat in `error`.
510
+ const err = r.error ?? null;
511
+ const rawReason = r.reason ?? null;
505
512
  blocked = {
506
- reason: r.reason ?? null,
507
- explanation: r.error ?? null,
513
+ reason: rawReason,
514
+ explanation: err ?? (rawReason ? `Planning geblokkeerd (${rawReason})` : null),
508
515
  at: r.updated_at ?? null,
509
516
  };
510
517
  }