@flowselections/floriday-verkoop-module 1.0.54 → 1.0.55

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 (66) hide show
  1. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/OrderKarindelingCard.js +6 -3
  3. package/dist-lib/integrations/supabase/auth-middleware.d.ts +42 -0
  4. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  5. package/dist-lib/integrations/supabase/client.d.ts +42 -0
  6. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  7. package/dist-lib/integrations/supabase/client.server.d.ts +42 -0
  8. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/types.d.ts +42 -0
  10. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  11. package/dist-lib/lib/cart-lock.functions.d.ts +42 -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 +462 -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 +128 -26
  16. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-replan.functions.js +55 -32
  18. package/dist-lib/lib/create-order.functions.d.ts +714 -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 +126 -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 +42 -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 +42 -0
  25. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floriday-public.functions.d.ts +294 -0
  27. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/floriday-writes.functions.d.ts +210 -0
  29. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/invoice-timing.functions.d.ts +168 -0
  31. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/invoice-timing.functions.js +12 -6
  33. package/dist-lib/lib/load-carriers.functions.d.ts +42 -0
  34. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/logistics-engine.functions.d.ts +210 -0
  36. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/logistics-engine.functions.js +10 -5
  38. package/dist-lib/lib/logistics-stock.functions.d.ts +84 -0
  39. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/order-addresses.functions.d.ts +42 -0
  41. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/order-addresses.functions.js +15 -9
  43. package/dist-lib/lib/order-buffers.functions.d.ts +126 -0
  44. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/order-buffers.functions.js +10 -10
  46. package/dist-lib/lib/order-carrier.functions.d.ts +84 -0
  47. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  48. package/dist-lib/lib/order-carrier.functions.js +20 -11
  49. package/dist-lib/lib/order-pickup.functions.d.ts +84 -0
  50. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/order-pickup.functions.js +20 -11
  52. package/dist-lib/lib/order-row.server.d.ts +24 -0
  53. package/dist-lib/lib/order-row.server.d.ts.map +1 -0
  54. package/dist-lib/lib/order-row.server.js +58 -0
  55. package/dist-lib/lib/order-shipments.functions.d.ts +168 -0
  56. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/order-shipments.functions.js +11 -6
  58. package/dist-lib/lib/salesorders-list.functions.d.ts +42 -0
  59. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  60. package/dist-lib/lib/salesorders.functions.d.ts +210 -0
  61. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +84 -0
  63. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  64. package/dist-lib/lib/tradeitems.functions.d.ts +42 -0
  65. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  66. package/package.json +1 -1
@@ -6,6 +6,7 @@
6
6
  import { createServerFn } from "@tanstack/react-start";
7
7
  import { z } from "zod";
8
8
  import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
9
+ import { resolveOrderRow } from "./order-row.server";
9
10
  import { CART_PLANNER_VERSION, planCarts, } from "./cart-planner";
10
11
  import { resolveBufferForOrderInternal } from "./order-buffers.functions";
11
12
  export async function replanBufferInternal(bufferId) {
@@ -360,8 +361,12 @@ export async function replanOrderCartsFromCron(orderId) {
360
361
  }
361
362
  export const replanOrderCarts = createServerFn({ method: "POST" })
362
363
  .middleware([requireSupabaseAuth])
363
- .inputValidator((input) => z.object({ orderId: z.string().uuid() }).parse(input))
364
- .handler(async ({ data }) => replanOrderInternal(data.orderId));
364
+ .inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
365
+ .handler(async ({ data, context }) => {
366
+ // DTO-id kan een Floriday salesOrderId zijn.
367
+ const order = await resolveOrderRow(context.supabase, data.orderId);
368
+ return replanOrderInternal(order.id);
369
+ });
365
370
  // ─── Queue drain (aangeroepen door pg_cron elke minuut) ─────────────────────
366
371
  export async function drainCartReplanQueue(limit = 50) {
367
372
  const { supabaseAdmin } = await import("../integrations/supabase/client.server");
@@ -406,65 +411,79 @@ export async function drainCartReplanQueue(limit = 50) {
406
411
  // logistics_plan_queue). De UI berekent NIETS zelf: hij toont wat er staat.
407
412
  export const listOrderCarts = createServerFn({ method: "GET" })
408
413
  .middleware([requireSupabaseAuth])
409
- .inputValidator((input) => z.object({ orderId: z.string().uuid() }).parse(input))
414
+ .inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
410
415
  .handler(async ({ data, context }) => {
411
- const { data: order } = await context.supabase
416
+ // Elke query faalt HARD. "Geen karren" en "kon niet laden" zijn twee
417
+ // verschillende dingen; stilzwijgend een lege array teruggeven verbergt
418
+ // fouten (RLS, kolomnaam, embed) als "nog geen karindeling".
419
+ const fail = (what, error) => {
420
+ throw new Error(`Karindeling laden mislukt (${what}): ${error?.message ?? "onbekende fout"}`);
421
+ };
422
+ // De DTO-id is voor Floriday-orders het salesOrderId, niet orders.id.
423
+ // resolveOrderRow doet de twee-staps-lookup + botsingswaarschuwing.
424
+ const orderRow = await resolveOrderRow(context.supabase, data.orderId);
425
+ const dbOrderId = orderRow.id;
426
+ const bufferId = orderRow.buffer_id;
427
+ const lockRes = await context.supabase
412
428
  .from("orders")
413
- .select("buffer_id, plan_locked_at")
414
- .eq("id", data.orderId)
429
+ .select("plan_locked_at")
430
+ .eq("id", dbOrderId)
415
431
  .maybeSingle();
416
- const bufferId = order?.buffer_id;
417
- const planLockedAt = order?.plan_locked_at ?? null;
432
+ if (lockRes.error)
433
+ fail("plan-lock lezen", lockRes.error);
434
+ const planLockedAt = lockRes.data?.plan_locked_at ?? null;
418
435
  const select = "id, order_id, buffer_id, cart_number, source, is_complete, occupancy_pct, total_layers_used, algorithm_version, carrier_type, max_layers, notes, order_cart_items(id, order_item_id, product_id, product_name, crates, plants_per_crate, crates_per_layer, layers_per_cart, layer_fraction, layer_share_pct)";
419
436
  const base = context.supabase.from("order_carts").select(select);
420
- const { data: carts } = await (bufferId
437
+ const cartsRes = await (bufferId
421
438
  ? base.eq("buffer_id", bufferId)
422
- : base.eq("order_id", data.orderId)).order("cart_number");
439
+ : base.eq("order_id", dbOrderId)).order("cart_number");
440
+ if (cartsRes.error)
441
+ fail("karren lezen", cartsRes.error);
442
+ const carts = (cartsRes.data ?? []);
423
443
  // Orders in de scope + ordernummer per orderregel (voor de badges).
424
444
  let orders = [];
425
445
  if (bufferId) {
426
- const { data: sibs } = await context.supabase
446
+ const sibs = await context.supabase
427
447
  .from("orders")
428
448
  .select("id, order_number")
429
449
  .eq("buffer_id", bufferId)
430
450
  .is("deleted_at", null);
431
- orders = (sibs ?? []).map((o) => ({
451
+ if (sibs.error)
452
+ fail("orders in buffer lezen", sibs.error);
453
+ orders = (sibs.data ?? []).map((o) => ({
432
454
  id: o.id,
433
455
  order_number: o.order_number ?? null,
434
456
  }));
435
457
  }
436
458
  if (orders.length === 0) {
437
- const { data: own } = await context.supabase
438
- .from("orders")
439
- .select("id, order_number")
440
- .eq("id", data.orderId)
441
- .maybeSingle();
442
- if (own) {
443
- orders = [{ id: own.id, order_number: own.order_number ?? null }];
444
- }
459
+ orders = [{ id: dbOrderId, order_number: orderRow.order_number ?? null }];
445
460
  }
446
461
  const orderIds = orders.map((o) => o.id);
447
462
  let itemOrders = [];
448
463
  if (orderIds.length > 0) {
449
- const { data: its } = await context.supabase
464
+ const its = await context.supabase
450
465
  .from("order_items")
451
466
  .select("id, order_id")
452
467
  .in("order_id", orderIds);
453
- itemOrders = (its ?? []).map((i) => ({
468
+ if (its.error)
469
+ fail("orderregels lezen", its.error);
470
+ itemOrders = (its.data ?? []).map((i) => ({
454
471
  id: i.id,
455
472
  order_id: i.order_id,
456
473
  }));
457
474
  }
458
475
  // Blokkadereden alleen ophalen als er niets gepland staat.
459
476
  let blocked = null;
460
- if ((carts ?? []).length === 0 && orderIds.length > 0) {
461
- const { data: dec } = await context.supabase
477
+ if (carts.length === 0 && orderIds.length > 0) {
478
+ const dec = await context.supabase
462
479
  .from("logistics_decisions")
463
480
  .select("subject_id, slot, explanation, result, created_at")
464
481
  .in("subject_id", orderIds)
465
482
  .order("created_at", { ascending: false })
466
483
  .limit(1);
467
- const d = (dec ?? [])[0];
484
+ if (dec.error)
485
+ fail("blokkadereden lezen", dec.error);
486
+ const d = (dec.data ?? [])[0];
468
487
  if (d) {
469
488
  blocked = {
470
489
  reason: d.result?.reason ?? d.slot ?? null,
@@ -473,13 +492,15 @@ export const listOrderCarts = createServerFn({ method: "GET" })
473
492
  };
474
493
  }
475
494
  if (!blocked) {
476
- const { data: q } = await context.supabase
495
+ const q = await context.supabase
477
496
  .from("logistics_plan_queue")
478
497
  .select("order_id, status, reason, error, updated_at")
479
498
  .in("order_id", orderIds)
480
499
  .order("updated_at", { ascending: false })
481
500
  .limit(1);
482
- const r = (q ?? [])[0];
501
+ if (q.error)
502
+ fail("planqueue lezen", q.error);
503
+ const r = (q.data ?? [])[0];
483
504
  if (r && (r.error || r.reason)) {
484
505
  blocked = {
485
506
  reason: r.reason ?? null,
@@ -489,12 +510,14 @@ export const listOrderCarts = createServerFn({ method: "GET" })
489
510
  }
490
511
  }
491
512
  }
492
- return { carts: carts ?? [], bufferId, planLockedAt, orders, itemOrders, blocked };
513
+ return { carts, bufferId, orderId: dbOrderId, planLockedAt, orders, itemOrders, blocked };
493
514
  });
494
515
  export const replanBufferForOrder = createServerFn({ method: "POST" })
495
516
  .middleware([requireSupabaseAuth])
496
- .inputValidator((input) => z.object({ orderId: z.string().uuid() }).parse(input))
497
- .handler(async ({ data }) => {
498
- const bufferId = await resolveBufferForOrderInternal(data.orderId);
499
- return replanScopeInternal({ bufferId, orderId: data.orderId });
517
+ .inputValidator((input) => z.object({ orderId: z.string().min(1) }).parse(input))
518
+ .handler(async ({ data, context }) => {
519
+ // DTO-id kan een Floriday salesOrderId zijn.
520
+ const order = await resolveOrderRow(context.supabase, data.orderId);
521
+ const bufferId = await resolveBufferForOrderInternal(order.id);
522
+ return replanScopeInternal({ bufferId, orderId: order.id });
500
523
  });