@flowselections/floriday-verkoop-module 1.0.48 → 1.0.50
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.
- package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
- package/dist-lib/components/verkoop/OrderKarindelingCard.js +5 -1
- package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrderDetailView.js +6 -4
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +63 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +63 -1
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +63 -1
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +66 -1
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cart-lock.functions.d.ts +63 -1
- package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-planner.d.ts +15 -4
- package/dist-lib/lib/cart-planner.d.ts.map +1 -1
- package/dist-lib/lib/cart-planner.js +44 -12
- package/dist-lib/lib/cart-planning-settings.functions.d.ts +693 -11
- package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +201 -3
- package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.js +49 -3
- package/dist-lib/lib/create-order.functions.d.ts +1076 -17
- package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
- package/dist-lib/lib/create-order.functions.js +48 -4
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +189 -3
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +63 -1
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts +63 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.js +11 -0
- package/dist-lib/lib/floriday-public.functions.d.ts +441 -7
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +315 -5
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.functions.d.ts +252 -4
- package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
- package/dist-lib/lib/load-carrier-labels.d.ts +13 -0
- package/dist-lib/lib/load-carrier-labels.d.ts.map +1 -1
- package/dist-lib/lib/load-carrier-labels.js +20 -0
- package/dist-lib/lib/load-carriers.functions.d.ts +63 -1
- package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-engine.functions.d.ts +315 -5
- package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-stock.functions.d.ts +126 -2
- package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-addresses.functions.d.ts +63 -1
- package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-buffers.functions.d.ts +189 -3
- package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-carrier.functions.d.ts +126 -2
- package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-pickup.functions.d.ts +126 -2
- package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-shipments.functions.d.ts +252 -4
- package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.functions.d.ts +63 -1
- package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.js +70 -4
- package/dist-lib/lib/salesorders-mapping.d.ts +17 -0
- package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-mapping.js +64 -13
- package/dist-lib/lib/salesorders.functions.d.ts +315 -5
- package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders.functions.js +19 -3
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +126 -2
- package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +63 -1
- package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
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";
|
|
@@ -397,8 +397,16 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
397
397
|
}
|
|
398
398
|
// 9) Floriday-orders → DTO (zonder zware raw-payload richting browser).
|
|
399
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);
|
|
400
407
|
const enriched = {
|
|
401
408
|
...r.data,
|
|
409
|
+
...(mirroredPacking ? { packingConfiguration: mirroredPacking } : {}),
|
|
402
410
|
...(orderNumberByFoId.get(String(r.floriday_id))
|
|
403
411
|
? { orderNumber: orderNumberByFoId.get(String(r.floriday_id)) }
|
|
404
412
|
: {}),
|
|
@@ -427,15 +435,51 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
427
435
|
return dto;
|
|
428
436
|
});
|
|
429
437
|
// 10) Lokale orders → DTO.
|
|
438
|
+
// Leesvolgorde van de belading van een lokale orderregel:
|
|
439
|
+
// a. order_items.plants_per_crate/crates_per_layer/layers_per_cart → "orderregel"
|
|
440
|
+
// b. groeps-/productrecord (products.*) → "product"
|
|
441
|
+
// c. niets → geen packing (de orderkop toont "—", geen 1×1×1)
|
|
442
|
+
// De orderregel wint van het product, net zoals de order wint van het
|
|
443
|
+
// trade item in de Floriday-tak (resolvePacking, 26-08).
|
|
430
444
|
const resolveLinePacking = (item) => {
|
|
445
|
+
const ppc = Number(item?.plants_per_crate ?? 0);
|
|
446
|
+
const cpl = Number(item?.crates_per_layer ?? 0);
|
|
447
|
+
const lpc = Number(item?.layers_per_cart ?? 0);
|
|
448
|
+
if (ppc > 0 || cpl > 0 || lpc > 0) {
|
|
449
|
+
return {
|
|
450
|
+
plants_per_crate: ppc || null,
|
|
451
|
+
crates_per_layer: cpl || null,
|
|
452
|
+
layers_per_cart: lpc || null,
|
|
453
|
+
__source: "orderregel",
|
|
454
|
+
};
|
|
455
|
+
}
|
|
431
456
|
const name = String(item?.product_name ?? "");
|
|
432
457
|
if (name.startsWith("[Groep] ")) {
|
|
433
458
|
const gname = name.slice("[Groep] ".length).trim().toLowerCase();
|
|
434
459
|
const gp = groupPacking.get(gname);
|
|
435
460
|
if (gp)
|
|
436
|
-
return gp;
|
|
461
|
+
return { ...gp, __source: "product" };
|
|
437
462
|
}
|
|
438
|
-
|
|
463
|
+
const prod = item?.products ?? null;
|
|
464
|
+
return prod ? { ...prod, __source: "product" } : null;
|
|
465
|
+
};
|
|
466
|
+
/** Floriday-vormige packingConfiguration uit een lokale regel-packing. */
|
|
467
|
+
const localPackingConfiguration = (packing, cfg, loadCarrierCode) => {
|
|
468
|
+
const pieces = Number(packing?.plants_per_crate ?? 0);
|
|
469
|
+
const perLayer = Number(packing?.crates_per_layer ?? 0);
|
|
470
|
+
const layers = Number(packing?.layers_per_cart ?? 0);
|
|
471
|
+
if (pieces <= 0 && perLayer <= 0 && layers <= 0)
|
|
472
|
+
return null;
|
|
473
|
+
const vbn = cfg?.package?.vbnPackageCode ?? null;
|
|
474
|
+
const custom = cfg?.package?.customPackageId ?? null;
|
|
475
|
+
return {
|
|
476
|
+
piecesPerPackage: pieces || null,
|
|
477
|
+
packagesPerLayer: perLayer || null,
|
|
478
|
+
layersPerLoadCarrier: layers || null,
|
|
479
|
+
// Geen fustcode-fallback: ontbreekt de vbn-code, dan blijft package null.
|
|
480
|
+
package: vbn != null || custom != null ? { vbnPackageCode: vbn, customPackageId: custom } : null,
|
|
481
|
+
loadCarrier: loadCarrierCode ?? null,
|
|
482
|
+
};
|
|
439
483
|
};
|
|
440
484
|
const localOrders = [];
|
|
441
485
|
const includedOrderIds = new Set();
|
|
@@ -455,6 +499,11 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
455
499
|
let karTotalRaw = 0;
|
|
456
500
|
const crateNames = [];
|
|
457
501
|
const cartNames = [];
|
|
502
|
+
// Belading van de eerste regel: die bepaalt de notatie in de orderkop.
|
|
503
|
+
// Bij gemengde regels tonen we bewust die eerste configuratie; het
|
|
504
|
+
// "Gemengd"-signaal komt uit mergeTypeNames (crate-/cartTypeName).
|
|
505
|
+
let headPacking = null;
|
|
506
|
+
let headCfg = null;
|
|
458
507
|
for (const item of lineItems) {
|
|
459
508
|
const pieces = toNumber(item?.quantity) || 0;
|
|
460
509
|
if (pieces <= 0)
|
|
@@ -478,6 +527,10 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
478
527
|
return Array.isArray(payload) ? payload : [];
|
|
479
528
|
})();
|
|
480
529
|
const cfg = pickPackingConfigForLine(configs, packing);
|
|
530
|
+
if (headPacking === null && packing) {
|
|
531
|
+
headPacking = packing;
|
|
532
|
+
headCfg = cfg;
|
|
533
|
+
}
|
|
481
534
|
crateNames.push(cratePackageName(cfg?.package?.vbnPackageCode ?? cfg?.package?.customPackageId ?? null, crateDescriptions));
|
|
482
535
|
cartNames.push(loadCarrierName(cfg?.loadCarrier ?? null));
|
|
483
536
|
}
|
|
@@ -502,6 +555,10 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
502
555
|
const firstProduct = pickString(firstLine?.product_name);
|
|
503
556
|
const firstPacking = firstLine ? resolveLinePacking(firstLine) : null;
|
|
504
557
|
const firstPlantsPerCrate = Math.max(1, Number(firstPacking?.plants_per_crate ?? 1));
|
|
558
|
+
const localPacking = localPackingConfiguration(headPacking ?? firstPacking, headCfg, normalizeLoadCarrierCode(cf.load_carrier_type) ?? null);
|
|
559
|
+
const localPackingSource = localPacking
|
|
560
|
+
? ((headPacking ?? firstPacking)?.__source ?? "product")
|
|
561
|
+
: undefined;
|
|
505
562
|
localOrders.push({
|
|
506
563
|
id: `local:${r.id}`,
|
|
507
564
|
orderNumber: centralOrderNumber(r.order_number),
|
|
@@ -548,7 +605,16 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
548
605
|
...(r.customer_id || r.customer_name ? [] : ["geen klant gekoppeld"]),
|
|
549
606
|
...(r.delivery_date ? [] : ["geen leverdatum"]),
|
|
550
607
|
],
|
|
551
|
-
|
|
608
|
+
packingSource: localPackingSource,
|
|
609
|
+
raw: {
|
|
610
|
+
order: {
|
|
611
|
+
status: r.status ?? null,
|
|
612
|
+
numberOfPieces: totalQuantity,
|
|
613
|
+
...(localPacking ? { packingConfiguration: localPacking } : {}),
|
|
614
|
+
},
|
|
615
|
+
customer: null,
|
|
616
|
+
tradeItem: null,
|
|
617
|
+
},
|
|
552
618
|
bufferId: bufferByLocalId.get(String(r.id)) ?? null,
|
|
553
619
|
});
|
|
554
620
|
}
|
|
@@ -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;
|
|
@@ -81,6 +83,21 @@ export interface TradeItemLookupEntry {
|
|
|
81
83
|
raw?: any;
|
|
82
84
|
}
|
|
83
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;
|
|
84
101
|
export declare function isCentralOrderNumber(value: unknown): value is string;
|
|
85
102
|
export declare function centralOrderNumber(value: unknown): string;
|
|
86
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
64
|
-
const orderWithLivePacking =
|
|
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",
|