@flowselections/floriday-verkoop-module 1.0.47 → 1.0.49

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 (72) hide show
  1. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/OrderKarindelingCard.js +5 -1
  3. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  4. package/dist-lib/components/verkoop/SalesOrderDetailView.js +10 -17
  5. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  6. package/dist-lib/components/verkoop/SalesOrdersTable.js +5 -1
  7. package/dist-lib/integrations/supabase/auth-middleware.d.ts +8 -0
  8. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/client.d.ts +8 -0
  10. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  11. package/dist-lib/integrations/supabase/client.server.d.ts +8 -0
  12. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  13. package/dist-lib/integrations/supabase/types.d.ts +8 -0
  14. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  15. package/dist-lib/lib/cart-lock.functions.d.ts +8 -0
  16. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-planning-settings.functions.d.ts +88 -0
  18. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
  19. package/dist-lib/lib/cart-replan.functions.d.ts +24 -0
  20. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  21. package/dist-lib/lib/create-order.functions.d.ts +136 -0
  22. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  23. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +24 -0
  24. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  25. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +8 -0
  26. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/floriday-mirror.functions.d.ts +8 -0
  28. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  29. package/dist-lib/lib/floriday-mirror.functions.js +11 -0
  30. package/dist-lib/lib/floriday-public.functions.d.ts +56 -0
  31. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/floriday-writes.functions.d.ts +40 -0
  33. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/invoice-timing.functions.d.ts +32 -0
  35. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/load-carrier-labels.d.ts +13 -0
  37. package/dist-lib/lib/load-carrier-labels.d.ts.map +1 -1
  38. package/dist-lib/lib/load-carrier-labels.js +20 -0
  39. package/dist-lib/lib/load-carriers.functions.d.ts +8 -0
  40. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/logistics-engine.functions.d.ts +40 -0
  42. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  43. package/dist-lib/lib/logistics-stock.functions.d.ts +16 -0
  44. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/order-addresses.functions.d.ts +8 -0
  46. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/order-buffers.functions.d.ts +24 -0
  48. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/order-carrier.functions.d.ts +16 -0
  50. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/order-pickup.functions.d.ts +16 -0
  52. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/order-shipments.functions.d.ts +32 -0
  54. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  55. package/dist-lib/lib/order-status.d.ts +7 -10
  56. package/dist-lib/lib/order-status.d.ts.map +1 -1
  57. package/dist-lib/lib/order-status.js +6 -3
  58. package/dist-lib/lib/salesorders-list.functions.d.ts +8 -0
  59. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  60. package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
  61. package/dist-lib/lib/salesorders-list.server.js +24 -23
  62. package/dist-lib/lib/salesorders-mapping.d.ts +24 -0
  63. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  64. package/dist-lib/lib/salesorders-mapping.js +64 -13
  65. package/dist-lib/lib/salesorders.functions.d.ts +40 -0
  66. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  67. package/dist-lib/lib/salesorders.functions.js +43 -9
  68. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +16 -0
  69. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  70. package/dist-lib/lib/tradeitems.functions.d.ts +8 -0
  71. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  72. package/package.json +1 -1
@@ -1,11 +1,10 @@
1
- import { centralOrderNumber, computeTotals, mapJsonbToSalesOrderDTO, } from "./salesorders-mapping";
1
+ import { centralOrderNumber, computeTotals, mapJsonbToSalesOrderDTO, packingConfigFromFloridayPacking, } from "./salesorders-mapping";
2
2
  import { cratePackageName, loadCarrierName, mergeTypeNames } from "./load-carrier-labels";
3
3
  import { normalizeLoadCarrierCode } from "./load-carriers";
4
4
  import { normalizeTime, resolveDeliveryTimeForDate } from "./carrier-availability";
5
5
  import { expandOrderItemsForPlanner } from "./expand-group-order-items";
6
6
  import { planCarts } from "./cart-planner";
7
7
  import { mergeStages, resolveOrderStage } from "./order-status";
8
- import { expectedPackagesFromSalesOrder, isFullyFulfilled, loadFloridayFulfillmentStates, } from "./floriday-fulfillment-status.server";
9
8
  const FO_CAP = 20000;
10
9
  const LOCAL_CAP = 5000;
11
10
  const PROPOSAL_CAP = 2000;
@@ -381,10 +380,13 @@ export async function buildSalesOrdersList(supabase, params) {
381
380
  raw: d,
382
381
  });
383
382
  }
384
- // 8) Buffers.
383
+ // 8) Buffers + lokale orderrij per Floriday-order.
385
384
  const bufferByFoId = new Map();
386
385
  const bufferByLocalId = new Map();
386
+ const localRowByFoId = new Map();
387
387
  for (const r of localOrderRows) {
388
+ if (r.floriday_sales_order_id)
389
+ localRowByFoId.set(String(r.floriday_sales_order_id), r);
388
390
  const bid = r.buffer_id;
389
391
  if (!bid)
390
392
  continue;
@@ -393,20 +395,18 @@ export async function buildSalesOrdersList(supabase, params) {
393
395
  else
394
396
  bufferByLocalId.set(String(r.id), bid);
395
397
  }
396
- // 8b) Afhandeling die in Floriday zelf is gedaan (afleverbrieven).
397
- let fulfillmentStates = new Map();
398
- if (foRows.length > 0) {
399
- try {
400
- fulfillmentStates = await loadFloridayFulfillmentStates(supabase, foRows.map((r) => String(r.floriday_id)));
401
- }
402
- catch (e) {
403
- warnings.push(`Floriday-afhandelingen niet geladen: ${e.message}`);
404
- }
405
- }
406
398
  // 9) Floriday-orders → DTO (zonder zware raw-payload richting browser).
407
399
  const floridayOrders = foRows.map((r) => {
400
+ const localRowForPacking = localRowByFoId.get(String(r.floriday_id)) ?? null;
401
+ // De order is leidend voor de belading. Heeft de cache-payload geen
402
+ // packingConfiguration, dan geldt de gespiegelde orderbelading uit
403
+ // custom_fields.floriday_packing; pas daarna het trade item (mapping).
404
+ const mirroredPacking = r.data?.packingConfiguration
405
+ ? null
406
+ : packingConfigFromFloridayPacking((localRowForPacking?.custom_fields ?? {})?.floriday_packing);
408
407
  const enriched = {
409
408
  ...r.data,
409
+ ...(mirroredPacking ? { packingConfiguration: mirroredPacking } : {}),
410
410
  ...(orderNumberByFoId.get(String(r.floriday_id))
411
411
  ? { orderNumber: orderNumberByFoId.get(String(r.floriday_id)) }
412
412
  : {}),
@@ -417,18 +417,17 @@ export async function buildSalesOrdersList(supabase, params) {
417
417
  const bid = bufferByFoId.get(dto.id) ?? null;
418
418
  if (bid)
419
419
  dto.bufferId = bid;
420
- const ff = fulfillmentStates.get(String(r.floriday_id));
420
+ // orders.status is de bron van waarheid; de Floriday-cachestatus is enkel
421
+ // een fallback zolang de order nog niet lokaal gespiegeld is.
422
+ const localRow = localRowByFoId.get(String(r.floriday_id)) ?? null;
423
+ const shipState = localRow ? shipmentStateByOrder.get(String(localRow.id)) : undefined;
421
424
  dto.stage = resolveOrderStage({
422
- status: r.data?.status,
423
- controlledAt: r.controlled_at ?? null,
424
- floridayFulfillment: ff
425
- ? {
426
- fulfilled: ff.fulfilled,
427
- fullyFulfilled: isFullyFulfilled(ff, expectedPackagesFromSalesOrder(r.data)),
428
- received: ff.received,
429
- }
430
- : null,
425
+ status: localRow ? localRow.status : r.data?.status,
426
+ shipped: shipState?.shipped,
427
+ controlledAt: r.controlled_at ?? (shipState?.picked ? "picked" : null),
428
+ isReservation: localRow ? !!localRow.is_reservation : false,
431
429
  });
430
+ dto.floridayFulfilled = Boolean((localRow?.custom_fields ?? {})?.floriday_fulfilled);
432
431
  dto.incomplete = [
433
432
  ...(dto.customer.name && dto.customer.name !== "Onbekende klant" ? [] : ["geen klant gekoppeld"]),
434
433
  ...(dto.deliveryAt ? [] : ["geen leverdatum"]),
@@ -605,6 +604,8 @@ export async function buildSalesOrdersList(supabase, params) {
605
604
  bufferOrderNumbers: members.map((m) => m.orderNumber).filter(Boolean),
606
605
  bufferOrderIds: members.map((m) => m.id),
607
606
  reservationCount: members.filter((m) => m.isReservation).length,
607
+ floridayFulfilled: members.some((m) => m.floridayFulfilled),
608
+ floridayFulfilledCount: members.filter((m) => m.floridayFulfilled).length,
608
609
  stage: mergeStages(members.map((m) => m.stage ?? "incoming")),
609
610
  crateTypeName: mergeTypeNames(members.map((m) => m.crateTypeName ?? "")),
610
611
  cartTypeName: mergeTypeNames(members.map((m) => m.cartTypeName ?? "")),
@@ -21,6 +21,8 @@ export interface SalesOrderDTO {
21
21
  cartTypeName?: string | null;
22
22
  /** Canonieke Engine-code van de ladingdrager (bijv. "trolley"). */
23
23
  loadCarrierType?: string | null;
24
+ /** Waar de getoonde belading vandaan komt (order | orderregel | product | trade-item). */
25
+ packingSource?: PackingSource;
24
26
  totalPieces: number;
25
27
  isLocal?: boolean;
26
28
  isReservation?: boolean;
@@ -35,6 +37,13 @@ export interface SalesOrderDTO {
35
37
  reservationCount?: number;
36
38
  /** Vertaalde weergavestatus (zie order-status.ts). */
37
39
  stage?: OrderStage;
40
+ /**
41
+ * Informatief: de afhandeling is doorgegeven aan Floriday (afleverbrief).
42
+ * Nooit sturend voor status, tabs, filters, facturatie of voorraadverbruik.
43
+ */
44
+ floridayFulfilled?: boolean;
45
+ /** Aantal orders binnen een buffer dat is doorgegeven aan Floriday. */
46
+ floridayFulfilledCount?: number;
38
47
  /** Vervoerder van de order (indien bekend). */
39
48
  carrierName?: string | null;
40
49
  /** Concrete ontbrekende gegevens, bv. "geen klant gekoppeld". */
@@ -74,6 +83,21 @@ export interface TradeItemLookupEntry {
74
83
  raw?: any;
75
84
  }
76
85
  export type TradeItemLookup = Map<string, TradeItemLookupEntry>;
86
+ /**
87
+ * Waar de belading van een rij vandaan komt. Expliciet, zodat in de code en
88
+ * in de DTO altijd zichtbaar is welke bron een getal heeft geleverd.
89
+ * - "order" : packingConfiguration van de sales order zelf (leidend)
90
+ * - "orderregel" : belading vastgelegd op de orderregel (lokale orders)
91
+ * - "product" : belading van het gekoppelde product (lokale orders)
92
+ * - "trade-item" : terugval op de standaardbelading van het artikel
93
+ */
94
+ export type PackingSource = "order" | "orderregel" | "product" | "trade-item";
95
+ /**
96
+ * Zet `orders.custom_fields.floriday_packing` (de gespiegelde belading van de
97
+ * ORDER) om naar een Floriday-vormige packingConfiguration. Alleen gebruiken
98
+ * als terugval wanneer de cache-payload er zelf geen heeft.
99
+ */
100
+ export declare function packingConfigFromFloridayPacking(fp: any): any | null;
77
101
  export declare function isCentralOrderNumber(value: unknown): value is string;
78
102
  export declare function centralOrderNumber(value: unknown): string;
79
103
  /** Rijtype + kale UUID uit een lijst-ID (`local:…`, `mailbox-proposal:…`, Floriday). */
@@ -1 +1 @@
1
- {"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"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"}
@@ -16,19 +16,69 @@ function pickPrimaryPacking(raw) {
16
16
  return null;
17
17
  return configs.find((c) => c?.primary === true || String(c?.primary).toLowerCase() === "true") ?? configs[0] ?? null;
18
18
  }
19
- function withLivePacking(order, packing) {
20
- if (!packing)
21
- return order;
19
+ /** Heeft de order zelf een bruikbare beladingconfiguratie? */
20
+ function hasOrderPacking(pc) {
21
+ if (!pc || typeof pc !== "object")
22
+ return false;
23
+ return (toNum(pc.piecesPerPackage, 0) > 0 ||
24
+ toNum(pc.packagesPerLayer, 0) > 0 ||
25
+ toNum(pc.layersPerLoadCarrier, 0) > 0 ||
26
+ pc.package != null ||
27
+ pc.loadCarrier != null);
28
+ }
29
+ /**
30
+ * Bepaalt de leidende beladingbron: de ORDER wint altijd. Het trade item is
31
+ * uitsluitend terugval wanneer de order geen packingConfiguration heeft.
32
+ * Het trade item blijft wél de bron voor naam/foto/sku (zie mapping onder).
33
+ */
34
+ function resolvePacking(order, tradeItemRaw) {
35
+ const orderPacking = order?.packingConfiguration;
36
+ if (hasOrderPacking(orderPacking)) {
37
+ return { order, source: "order" };
38
+ }
39
+ const fallback = pickPrimaryPacking(tradeItemRaw);
40
+ if (!fallback)
41
+ return { order, source: "trade-item" };
22
42
  return {
23
- ...order,
24
- packingConfiguration: {
25
- ...(order?.packingConfiguration ?? {}),
26
- piecesPerPackage: toNum(packing?.piecesPerPackage, toNum(order?.packingConfiguration?.piecesPerPackage, 1)),
27
- packagesPerLayer: toNum(packing?.packagesPerLayer, toNum(order?.packingConfiguration?.packagesPerLayer, 0)),
28
- layersPerLoadCarrier: toNum(packing?.layersPerLoadCarrier, toNum(order?.packingConfiguration?.layersPerLoadCarrier, 0)),
29
- package: packing?.package ?? order?.packingConfiguration?.package,
30
- loadCarrier: packing?.loadCarrier ?? order?.packingConfiguration?.loadCarrier,
43
+ order: {
44
+ ...order,
45
+ packingConfiguration: {
46
+ ...(orderPacking ?? {}),
47
+ piecesPerPackage: toNum(fallback?.piecesPerPackage, 1),
48
+ packagesPerLayer: toNum(fallback?.packagesPerLayer, 0),
49
+ layersPerLoadCarrier: toNum(fallback?.layersPerLoadCarrier, 0),
50
+ package: fallback?.package ?? orderPacking?.package ?? null,
51
+ loadCarrier: fallback?.loadCarrier ?? orderPacking?.loadCarrier ?? null,
52
+ },
31
53
  },
54
+ source: "trade-item",
55
+ };
56
+ }
57
+ /**
58
+ * Zet `orders.custom_fields.floriday_packing` (de gespiegelde belading van de
59
+ * ORDER) om naar een Floriday-vormige packingConfiguration. Alleen gebruiken
60
+ * als terugval wanneer de cache-payload er zelf geen heeft.
61
+ */
62
+ export function packingConfigFromFloridayPacking(fp) {
63
+ if (!fp || typeof fp !== "object")
64
+ return null;
65
+ if (String(fp.source ?? "order") !== "order")
66
+ return null;
67
+ const pieces = toNum(fp.pieces_per_package, 0);
68
+ const perLayer = toNum(fp.packages_per_layer, 0);
69
+ const layers = toNum(fp.layers_per_load_carrier, 0);
70
+ const vbn = fp.vbn_package_code ?? null;
71
+ const custom = fp.custom_package_id ?? null;
72
+ const carrier = fp.load_carrier ?? null;
73
+ if (pieces <= 0 && perLayer <= 0 && layers <= 0 && vbn == null && custom == null && carrier == null) {
74
+ return null;
75
+ }
76
+ return {
77
+ piecesPerPackage: pieces || 1,
78
+ packagesPerLayer: perLayer,
79
+ layersPerLoadCarrier: layers,
80
+ package: vbn != null || custom != null ? { vbnPackageCode: vbn, customPackageId: custom } : null,
81
+ loadCarrier: carrier,
32
82
  };
33
83
  }
34
84
  const CENTRAL_ORDER_NUMBER_RE = /^(FO|MO|AO|HO)-\d{7}$/;
@@ -60,8 +110,8 @@ export function mapJsonbToSalesOrderDTO(o, customerLookup, tradeItemLookup, crat
60
110
  // (geen salesOrderLines-array). Velden staan direct op het object.
61
111
  const tradeItemId = String(o?.tradeItemId ?? "");
62
112
  const tradeItem = tradeItemId ? tradeItemLookup?.get(tradeItemId) : undefined;
63
- const livePacking = pickPrimaryPacking(tradeItem?.raw);
64
- const orderWithLivePacking = withLivePacking(o, livePacking);
113
+ // De ORDER is leidend voor de belading; het trade item is enkel terugval.
114
+ const { order: orderWithLivePacking, source: packingSource } = resolvePacking(o, tradeItem?.raw);
65
115
  const numberOfPieces = toNum(orderWithLivePacking?.numberOfPieces, 0);
66
116
  const piecesPerPackage = Math.max(1, toNum(orderWithLivePacking?.packingConfiguration?.piecesPerPackage, 1));
67
117
  const numberOfPackages = piecesPerPackage > 0 ? Math.ceil(numberOfPieces / piecesPerPackage) : 0;
@@ -101,6 +151,7 @@ export function mapJsonbToSalesOrderDTO(o, customerLookup, tradeItemLookup, crat
101
151
  karCount,
102
152
  crateTypeName,
103
153
  cartTypeName,
154
+ packingSource,
104
155
  totalPieces: numberOfPieces,
105
156
  customer: {
106
157
  name: found?.name ?? "Onbekende klant",
@@ -21444,6 +21444,14 @@ export declare const runSalesOrdersSync: import("@tanstack/start-client-core").O
21444
21444
  };
21445
21445
  Returns: import("../integrations/supabase/types").Json;
21446
21446
  };
21447
+ logistics_plan_block: {
21448
+ Args: {
21449
+ p_details?: import("../integrations/supabase/types").Json;
21450
+ p_order_ids: string[];
21451
+ p_reason: string;
21452
+ };
21453
+ Returns: number;
21454
+ };
21447
21455
  logistics_plan_buffer_sql: {
21448
21456
  Args: {
21449
21457
  p_buffer_id: string;
@@ -44361,6 +44369,14 @@ export declare const createSalesOrder: import("@tanstack/start-client-core").Opt
44361
44369
  };
44362
44370
  Returns: import("../integrations/supabase/types").Json;
44363
44371
  };
44372
+ logistics_plan_block: {
44373
+ Args: {
44374
+ p_details?: import("../integrations/supabase/types").Json;
44375
+ p_order_ids: string[];
44376
+ p_reason: string;
44377
+ };
44378
+ Returns: number;
44379
+ };
44364
44380
  logistics_plan_buffer_sql: {
44365
44381
  Args: {
44366
44382
  p_buffer_id: string;
@@ -67288,6 +67304,14 @@ export declare const diagnoseFloridayConnection: import("@tanstack/start-client-
67288
67304
  };
67289
67305
  Returns: import("../integrations/supabase/types").Json;
67290
67306
  };
67307
+ logistics_plan_block: {
67308
+ Args: {
67309
+ p_details?: import("../integrations/supabase/types").Json;
67310
+ p_order_ids: string[];
67311
+ p_reason: string;
67312
+ };
67313
+ Returns: number;
67314
+ };
67291
67315
  logistics_plan_buffer_sql: {
67292
67316
  Args: {
67293
67317
  p_buffer_id: string;
@@ -90233,6 +90257,14 @@ export declare const getSalesOrderDetail: import("@tanstack/start-client-core").
90233
90257
  };
90234
90258
  Returns: import("../integrations/supabase/types").Json;
90235
90259
  };
90260
+ logistics_plan_block: {
90261
+ Args: {
90262
+ p_details?: import("../integrations/supabase/types").Json;
90263
+ p_order_ids: string[];
90264
+ p_reason: string;
90265
+ };
90266
+ Returns: number;
90267
+ };
90236
90268
  logistics_plan_buffer_sql: {
90237
90269
  Args: {
90238
90270
  p_buffer_id: string;
@@ -113149,6 +113181,14 @@ export declare const setSalesOrderControlled: import("@tanstack/start-client-cor
113149
113181
  };
113150
113182
  Returns: import("../integrations/supabase/types").Json;
113151
113183
  };
113184
+ logistics_plan_block: {
113185
+ Args: {
113186
+ p_details?: import("../integrations/supabase/types").Json;
113187
+ p_order_ids: string[];
113188
+ p_reason: string;
113189
+ };
113190
+ Returns: number;
113191
+ };
113152
113192
  logistics_plan_buffer_sql: {
113153
113193
  Args: {
113154
113194
  p_buffer_id: string;