@flowselections/floriday-verkoop-module 1.0.40 → 1.0.41
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/EngineBufferCard.d.ts.map +1 -1
- package/dist-lib/components/verkoop/EngineBufferCard.js +2 -2
- package/dist-lib/components/verkoop/InvoiceTimingSettings.d.ts +3 -0
- package/dist-lib/components/verkoop/InvoiceTimingSettings.d.ts.map +1 -0
- package/dist-lib/components/verkoop/InvoiceTimingSettings.js +54 -0
- package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
- package/dist-lib/components/verkoop/SalesOrdersTable.js +44 -91
- package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
- package/dist-lib/components/verkoop/VerkoopOrdersPage.js +9 -8
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +3 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +577 -4
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +577 -4
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +577 -4
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +578 -5
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +12 -1
- package/dist-lib/lib/cart-lock.functions.d.ts +577 -4
- package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-planning-settings.functions.d.ts +6347 -44
- package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
- package/dist-lib/lib/cart-replan.functions.d.ts +1731 -12
- package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
- package/dist-lib/lib/create-order.functions.d.ts +8655 -60
- package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
- package/dist-lib/lib/cron/index.d.ts +1 -0
- package/dist-lib/lib/cron/index.d.ts.map +1 -1
- package/dist-lib/lib/cron/index.js +1 -0
- package/dist-lib/lib/cron/invoice-due.d.ts +4 -0
- package/dist-lib/lib/cron/invoice-due.d.ts.map +1 -0
- package/dist-lib/lib/cron/invoice-due.js +21 -0
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +1731 -12
- package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-fulfillment-status.server.d.ts +28 -0
- package/dist-lib/lib/floriday-fulfillment-status.server.d.ts.map +1 -0
- package/dist-lib/lib/floriday-fulfillment-status.server.js +91 -0
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +577 -4
- package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.d.ts +577 -4
- package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-mirror.functions.js +27 -4
- package/dist-lib/lib/floriday-public.functions.d.ts +4039 -28
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +2885 -20
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/invoice-timing.d.ts +38 -0
- package/dist-lib/lib/invoice-timing.d.ts.map +1 -0
- package/dist-lib/lib/invoice-timing.functions.d.ts +83845 -0
- package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -0
- package/dist-lib/lib/invoice-timing.functions.js +88 -0
- package/dist-lib/lib/invoice-timing.js +139 -0
- package/dist-lib/lib/invoice-timing.server.d.ts +22 -0
- package/dist-lib/lib/invoice-timing.server.d.ts.map +1 -0
- package/dist-lib/lib/invoice-timing.server.js +154 -0
- package/dist-lib/lib/load-carriers.functions.d.ts +577 -4
- package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-engine.functions.d.ts +2887 -22
- package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
- package/dist-lib/lib/logistics-stock.functions.d.ts +1154 -8
- package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-addresses.functions.d.ts +577 -4
- package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-buffers.functions.d.ts +1731 -12
- package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-carrier.functions.d.ts +1154 -8
- package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-pickup.functions.d.ts +1154 -8
- package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-shipments.functions.d.ts +2308 -16
- package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
- package/dist-lib/lib/order-status.d.ts +33 -0
- package/dist-lib/lib/order-status.d.ts.map +1 -0
- package/dist-lib/lib/order-status.js +77 -0
- package/dist-lib/lib/salesorders-list.functions.d.ts +578 -5
- package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.functions.js +1 -1
- package/dist-lib/lib/salesorders-list.server.d.ts +2 -1
- package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-list.server.js +145 -58
- package/dist-lib/lib/salesorders-mapping.d.ts +13 -0
- package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
- package/dist-lib/lib/salesorders-mapping.js +2 -7
- package/dist-lib/lib/salesorders.functions.d.ts +2885 -20
- package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
- package/dist-lib/lib/tradeitems.functions.d.ts +577 -4
- package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
- package/dist-lib/lib/useSalesOrdersQuery.d.ts +2 -1
- package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
- package/package.json +10 -2
|
@@ -4,6 +4,8 @@ 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
|
+
import { mergeStages, resolveOrderStage } from "./order-status";
|
|
8
|
+
import { expectedPackagesFromSalesOrder, isFullyFulfilled, loadFloridayFulfillmentStates, } from "./floriday-fulfillment-status.server";
|
|
7
9
|
const FO_CAP = 20000;
|
|
8
10
|
const LOCAL_CAP = 5000;
|
|
9
11
|
const PROPOSAL_CAP = 2000;
|
|
@@ -182,7 +184,7 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
// 3) Lokale orders binnen hetzelfde venster.
|
|
185
|
-
const localOrderSelect = "id, order_number, customer_name, customer_id, order_date, delivery_date, status, total, custom_fields, order_source, created_at, is_reservation, buffer_id, floriday_sales_order_id, order_items(id, product_id, product_name, quantity, unit, unit_price, products(plants_per_crate, crates_per_layer, layers_per_cart, floriday_trade_item_id, custom_fields))";
|
|
187
|
+
const localOrderSelect = "id, order_number, customer_name, customer_id, order_date, delivery_date, status, total, custom_fields, order_source, created_at, is_reservation, plan_locked_at, buffer_id, floriday_sales_order_id, order_items(id, product_id, product_name, quantity, unit, unit_price, products(plants_per_crate, crates_per_layer, layers_per_cart, floriday_trade_item_id, custom_fields))";
|
|
186
188
|
let localQ = supabase
|
|
187
189
|
.from("orders")
|
|
188
190
|
.select(localOrderSelect)
|
|
@@ -203,6 +205,39 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
203
205
|
if (localRes.error)
|
|
204
206
|
throw new Error(`Lokale orders lezen faalde: ${localRes.error.message}`);
|
|
205
207
|
const localOrderRows = (localRes.data ?? []);
|
|
208
|
+
// 3b) Vervoerders + verzendmomenten (best-effort, alleen voor deze orders).
|
|
209
|
+
const carrierNameById = new Map();
|
|
210
|
+
const shipmentStateByOrder = new Map();
|
|
211
|
+
try {
|
|
212
|
+
const { data: carrierRows } = await supabase.from("carriers").select("id, name").limit(2000);
|
|
213
|
+
for (const c of (carrierRows ?? []))
|
|
214
|
+
carrierNameById.set(String(c.id), String(c.name ?? ""));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
/* vervoerdernamen zijn optioneel */
|
|
218
|
+
}
|
|
219
|
+
const localIds = localOrderRows.map((r) => String(r.id));
|
|
220
|
+
if (localIds.length) {
|
|
221
|
+
try {
|
|
222
|
+
const { data: shipRows } = await supabase
|
|
223
|
+
.from("order_shipments")
|
|
224
|
+
.select("order_id, status, shipped_at")
|
|
225
|
+
.in("order_id", localIds.slice(0, 1000));
|
|
226
|
+
for (const s of (shipRows ?? [])) {
|
|
227
|
+
const key = String(s.order_id);
|
|
228
|
+
const prev = shipmentStateByOrder.get(key) ?? { shipped: false, picked: false };
|
|
229
|
+
const st = String(s.status ?? "").toLowerCase();
|
|
230
|
+
if (s.shipped_at || st === "verzonden" || st === "shipped")
|
|
231
|
+
prev.shipped = true;
|
|
232
|
+
if (st === "gepickt" || st === "picked" || st === "gecontroleerd")
|
|
233
|
+
prev.picked = true;
|
|
234
|
+
shipmentStateByOrder.set(key, prev);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
warnings.push(`Verzendmomenten niet geladen: ${e.message}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
206
241
|
// 4) Mailbox-voorstellen (best-effort).
|
|
207
242
|
let proposalRows = [];
|
|
208
243
|
try {
|
|
@@ -375,6 +410,16 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
375
410
|
else
|
|
376
411
|
bufferByLocalId.set(String(r.id), bid);
|
|
377
412
|
}
|
|
413
|
+
// 8b) Afhandeling die in Floriday zelf is gedaan (afleverbrieven).
|
|
414
|
+
let fulfillmentStates = new Map();
|
|
415
|
+
if (foRows.length > 0) {
|
|
416
|
+
try {
|
|
417
|
+
fulfillmentStates = await loadFloridayFulfillmentStates(supabase, foRows.map((r) => String(r.floriday_id)));
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
warnings.push(`Floriday-afhandelingen niet geladen: ${e.message}`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
378
423
|
// 9) Floriday-orders → DTO (zonder zware raw-payload richting browser).
|
|
379
424
|
const floridayOrders = foRows.map((r) => {
|
|
380
425
|
const enriched = {
|
|
@@ -389,6 +434,22 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
389
434
|
const bid = bufferByFoId.get(dto.id) ?? null;
|
|
390
435
|
if (bid)
|
|
391
436
|
dto.bufferId = bid;
|
|
437
|
+
const ff = fulfillmentStates.get(String(r.floriday_id));
|
|
438
|
+
dto.stage = resolveOrderStage({
|
|
439
|
+
status: r.data?.status,
|
|
440
|
+
controlledAt: r.controlled_at ?? null,
|
|
441
|
+
floridayFulfillment: ff
|
|
442
|
+
? {
|
|
443
|
+
fulfilled: ff.fulfilled,
|
|
444
|
+
fullyFulfilled: isFullyFulfilled(ff, expectedPackagesFromSalesOrder(r.data)),
|
|
445
|
+
received: ff.received,
|
|
446
|
+
}
|
|
447
|
+
: null,
|
|
448
|
+
});
|
|
449
|
+
dto.incomplete = [
|
|
450
|
+
...(dto.customer.name && dto.customer.name !== "Onbekende klant" ? [] : ["geen klant gekoppeld"]),
|
|
451
|
+
...(dto.deliveryAt ? [] : ["geen leverdatum"]),
|
|
452
|
+
];
|
|
392
453
|
return dto;
|
|
393
454
|
});
|
|
394
455
|
// 10) Lokale orders → DTO.
|
|
@@ -502,6 +563,17 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
502
563
|
logoUrl: null,
|
|
503
564
|
},
|
|
504
565
|
status: statusFlags(r.status),
|
|
566
|
+
stage: resolveOrderStage({
|
|
567
|
+
status: r.status,
|
|
568
|
+
shipped: shipmentStateByOrder.get(String(r.id))?.shipped,
|
|
569
|
+
controlledAt: shipmentStateByOrder.get(String(r.id))?.picked ? "picked" : null,
|
|
570
|
+
isReservation: !!r.is_reservation,
|
|
571
|
+
}),
|
|
572
|
+
carrierName: cf.carrier ? (carrierNameById.get(String(cf.carrier)) ?? null) : null,
|
|
573
|
+
incomplete: [
|
|
574
|
+
...(r.customer_id || r.customer_name ? [] : ["geen klant gekoppeld"]),
|
|
575
|
+
...(r.delivery_date ? [] : ["geen leverdatum"]),
|
|
576
|
+
],
|
|
505
577
|
raw: { order: { status: r.status ?? null }, customer: null, tradeItem: null },
|
|
506
578
|
bufferId: bufferByLocalId.get(String(r.id)) ?? null,
|
|
507
579
|
});
|
|
@@ -538,6 +610,11 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
538
610
|
logoUrl: null,
|
|
539
611
|
},
|
|
540
612
|
status: statusFlags(p.status),
|
|
613
|
+
stage: "incoming",
|
|
614
|
+
incomplete: [
|
|
615
|
+
...(matchedCustomer ? [] : ["geen klant gekoppeld"]),
|
|
616
|
+
...(p.delivery_date ? [] : ["geen leverdatum"]),
|
|
617
|
+
],
|
|
541
618
|
raw: { order: { status: p.status ?? null }, customer: null, tradeItem: null },
|
|
542
619
|
});
|
|
543
620
|
}
|
|
@@ -551,79 +628,86 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
551
628
|
for (const o of all)
|
|
552
629
|
if (o.bufferId)
|
|
553
630
|
o.bufferSize = sizeByBuffer.get(o.bufferId) ?? 1;
|
|
554
|
-
//
|
|
631
|
+
// 12b) Buffers samenvouwen tot één rij per buffer, vóór tellen en pagineren.
|
|
632
|
+
const groups = [];
|
|
633
|
+
const groupIndex = new Map();
|
|
634
|
+
for (const o of all) {
|
|
635
|
+
const key = o.bufferId && (o.bufferSize ?? 1) > 1 ? `buf:${o.bufferId}` : `one:${o.id}`;
|
|
636
|
+
const idx = groupIndex.get(key);
|
|
637
|
+
if (idx === undefined) {
|
|
638
|
+
groupIndex.set(key, groups.length);
|
|
639
|
+
groups.push([o]);
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
groups[idx].push(o);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
const mergeGroup = (members) => {
|
|
646
|
+
const head = members[0];
|
|
647
|
+
if (members.length === 1)
|
|
648
|
+
return head;
|
|
649
|
+
const revenue = members.reduce((s, m) => s + (m.revenue ?? 0), 0);
|
|
650
|
+
const fustCount = members.reduce((s, m) => s + (m.fustCount ?? 0), 0);
|
|
651
|
+
const karCount = members.reduce((s, m) => s + (m.karCount ?? 0), 0);
|
|
652
|
+
const totalPieces = members.reduce((s, m) => s + (m.totalPieces ?? 0), 0);
|
|
653
|
+
const incomplete = Array.from(new Set(members.flatMap((m) => m.incomplete ?? [])));
|
|
654
|
+
return {
|
|
655
|
+
...head,
|
|
656
|
+
revenue,
|
|
657
|
+
fustCount,
|
|
658
|
+
karCount,
|
|
659
|
+
totalPieces,
|
|
660
|
+
bufferSize: members.length,
|
|
661
|
+
bufferOrderNumbers: members.map((m) => m.orderNumber).filter(Boolean),
|
|
662
|
+
bufferOrderIds: members.map((m) => m.id),
|
|
663
|
+
reservationCount: members.filter((m) => m.isReservation).length,
|
|
664
|
+
stage: mergeStages(members.map((m) => m.stage ?? "incoming")),
|
|
665
|
+
crateTypeName: mergeTypeNames(members.map((m) => m.crateTypeName ?? "")),
|
|
666
|
+
cartTypeName: mergeTypeNames(members.map((m) => m.cartTypeName ?? "")),
|
|
667
|
+
carrierName: head.carrierName ?? members.find((m) => m.carrierName)?.carrierName ?? null,
|
|
668
|
+
incomplete,
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
// 13) Filteren (zoek + status), tellen, pagineren — op samengevouwen rijen.
|
|
555
672
|
const search = (params.search ?? "").trim().toLowerCase();
|
|
556
|
-
const matchesSearch = (
|
|
557
|
-
`${o.productName} ${o.sku} ${o.orderNumber} ${o.customer.name}`.toLowerCase().includes(search);
|
|
558
|
-
const
|
|
673
|
+
const matchesSearch = (members) => !search ||
|
|
674
|
+
members.some((o) => `${o.productName} ${o.sku} ${o.orderNumber} ${o.customer.name}`.toLowerCase().includes(search));
|
|
675
|
+
const stageOf = (members) => mergeStages(members.map((m) => m.stage ?? "incoming"));
|
|
676
|
+
const matchesStatusFilter = (members) => {
|
|
677
|
+
const stage = stageOf(members);
|
|
559
678
|
switch (params.status) {
|
|
560
679
|
case "cancelled":
|
|
561
|
-
return
|
|
680
|
+
return stage === "cancelled";
|
|
562
681
|
case "shipped":
|
|
563
|
-
return
|
|
564
|
-
case "invoiced":
|
|
565
|
-
return o.status.isInvoiced;
|
|
566
|
-
case "open":
|
|
567
|
-
return !o.status.isCancelled && !o.status.isShipped;
|
|
568
|
-
default:
|
|
569
|
-
return true;
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
const matchesTab = (o) => {
|
|
573
|
-
switch (params.tab) {
|
|
682
|
+
return stage === "shipped";
|
|
574
683
|
case "open":
|
|
575
|
-
return
|
|
576
|
-
case "shipped":
|
|
577
|
-
return o.status.isShipped && !o.status.isCancelled;
|
|
578
|
-
case "invoiced":
|
|
579
|
-
return o.status.isInvoiced;
|
|
580
|
-
case "cancelled":
|
|
581
|
-
return o.status.isCancelled;
|
|
684
|
+
return stage !== "cancelled" && stage !== "shipped";
|
|
582
685
|
default:
|
|
583
686
|
return true;
|
|
584
687
|
}
|
|
585
688
|
};
|
|
586
|
-
const
|
|
587
|
-
const
|
|
588
|
-
const
|
|
589
|
-
const seen = new Set();
|
|
590
|
-
const out = [];
|
|
591
|
-
for (const o of rows) {
|
|
592
|
-
const key = o.bufferId && (o.bufferSize ?? 1) > 1 ? `buf:${o.bufferId}` : `one:${o.id}`;
|
|
593
|
-
if (seen.has(key))
|
|
594
|
-
continue;
|
|
595
|
-
seen.add(key);
|
|
596
|
-
out.push(o);
|
|
597
|
-
}
|
|
598
|
-
return out;
|
|
599
|
-
};
|
|
600
|
-
const collapsedAll = collapse(withoutTab);
|
|
689
|
+
const matchesTab = (members) => params.tab === "all" || stageOf(members) === params.tab;
|
|
690
|
+
const withoutTab = groups.filter((g) => matchesSearch(g) && matchesStatusFilter(g));
|
|
691
|
+
const filteredGroups = withoutTab.filter(matchesTab);
|
|
601
692
|
const statusCounts = {
|
|
602
|
-
all:
|
|
603
|
-
|
|
693
|
+
all: withoutTab.length,
|
|
694
|
+
incoming: 0,
|
|
695
|
+
topick: 0,
|
|
696
|
+
picked: 0,
|
|
604
697
|
shipped: 0,
|
|
605
|
-
invoiced: 0,
|
|
606
698
|
cancelled: 0,
|
|
607
699
|
};
|
|
608
|
-
for (const
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
statusCounts.open++;
|
|
615
|
-
if (o.status.isInvoiced)
|
|
616
|
-
statusCounts.invoiced++;
|
|
617
|
-
}
|
|
618
|
-
const totals = computeTotals(collapse(filtered));
|
|
619
|
-
const totalCount = filtered.length;
|
|
620
|
-
const rows = params.all
|
|
621
|
-
? filtered.slice(0, EXPORT_CAP)
|
|
622
|
-
: filtered.slice((page - 1) * pageSize, page * pageSize);
|
|
700
|
+
for (const g of withoutTab)
|
|
701
|
+
statusCounts[stageOf(g)]++;
|
|
702
|
+
const totalCount = filteredGroups.length;
|
|
703
|
+
const pageGroups = params.all
|
|
704
|
+
? filteredGroups.slice(0, EXPORT_CAP)
|
|
705
|
+
: filteredGroups.slice((page - 1) * pageSize, page * pageSize);
|
|
623
706
|
// 14) Karindeling alleen voor de zichtbare rijen (begrensd werk).
|
|
624
707
|
if (!params.all) {
|
|
625
708
|
const localById = new Map(localOrderRows.map((r) => [String(r.id), r]));
|
|
626
|
-
await Promise.all(
|
|
709
|
+
await Promise.all(pageGroups
|
|
710
|
+
.flat()
|
|
627
711
|
.filter((o) => o.id.startsWith("local:"))
|
|
628
712
|
.map(async (o) => {
|
|
629
713
|
const r = localById.get(o.id.slice("local:".length));
|
|
@@ -655,6 +739,9 @@ export async function buildSalesOrdersList(supabase, params) {
|
|
|
655
739
|
}
|
|
656
740
|
}));
|
|
657
741
|
}
|
|
742
|
+
const rows = pageGroups.map(mergeGroup);
|
|
743
|
+
// Totalen over de volledige gefilterde set (alle orders in elke buffer).
|
|
744
|
+
const totals = computeTotals(filteredGroups.map(mergeGroup));
|
|
658
745
|
return {
|
|
659
746
|
rows,
|
|
660
747
|
totalCount,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type OrderStage } from "./order-status";
|
|
1
2
|
export interface SalesOrderDTO {
|
|
2
3
|
id: string;
|
|
3
4
|
orderNumber: string;
|
|
@@ -26,6 +27,18 @@ export interface SalesOrderDTO {
|
|
|
26
27
|
bufferId?: string | null;
|
|
27
28
|
bufferSize?: number;
|
|
28
29
|
bufferKey?: string | null;
|
|
30
|
+
/** Ordernummers van alle orders in dezelfde buffer (samengevouwen rij). */
|
|
31
|
+
bufferOrderNumbers?: string[];
|
|
32
|
+
/** Interne ids van alle orders in dezelfde buffer. */
|
|
33
|
+
bufferOrderIds?: string[];
|
|
34
|
+
/** Aantal reserveringen binnen de buffer. */
|
|
35
|
+
reservationCount?: number;
|
|
36
|
+
/** Vertaalde weergavestatus (zie order-status.ts). */
|
|
37
|
+
stage?: OrderStage;
|
|
38
|
+
/** Vervoerder van de order (indien bekend). */
|
|
39
|
+
carrierName?: string | null;
|
|
40
|
+
/** Concrete ontbrekende gegevens, bv. "geen klant gekoppeld". */
|
|
41
|
+
incomplete?: string[];
|
|
29
42
|
customer: {
|
|
30
43
|
name: string;
|
|
31
44
|
postalCode: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Client-safe mapping: jsonb cache row -> SalesOrderDTO used by the UI.
|
|
2
2
|
import { cratePackageName, loadCarrierName } from "./load-carrier-labels";
|
|
3
|
+
import { orderStageLabel } from "./order-status";
|
|
3
4
|
function toNum(v, d = 0) {
|
|
4
5
|
if (typeof v === "number")
|
|
5
6
|
return v;
|
|
@@ -238,13 +239,7 @@ export function ordersToCsv(orders) {
|
|
|
238
239
|
o.customer.postalCode,
|
|
239
240
|
o.customer.city,
|
|
240
241
|
o.deliveryAt,
|
|
241
|
-
o.
|
|
242
|
-
? "Geannuleerd"
|
|
243
|
-
: o.status.isShipped
|
|
244
|
-
? "Verzonden"
|
|
245
|
-
: o.status.isInvoiced
|
|
246
|
-
? "Gefactureerd"
|
|
247
|
-
: "Open",
|
|
242
|
+
orderStageLabel(o.stage ?? "incoming"),
|
|
248
243
|
]);
|
|
249
244
|
const escape = (v) => `"${String(v).replace(/"/g, '""')}"`;
|
|
250
245
|
const csv = [header, ...rows].map((r) => r.map(escape).join(";")).join("\n");
|