@flowselections/floriday-afhandeling-module 1.0.50 → 1.0.52
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/afhandeling/ControlePage.js +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +165 -37
- package/dist-lib/components/afhandeling/NuVersturenButton.d.ts +2 -2
- package/dist-lib/components/afhandeling/NuVersturenButton.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/NuVersturenButton.js +9 -3
- package/dist-lib/components/afhandeling/ScanControleView.js +1 -1
- package/dist-lib/components/afhandeling/VervoerdersPage.js +1 -1
- package/dist-lib/components/afhandeling/VerzetOrderDialog.js +1 -1
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +28 -28
- package/dist-lib/components/ui/responsive-dialog.js +1 -1
- package/dist-lib/hooks/useOrderBuffers.d.ts +6 -0
- package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderBuffers.js +21 -0
- package/dist-lib/hooks/usePickMode.d.ts +1 -1
- package/dist-lib/index.d.ts +0 -2
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +0 -2
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +14 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.d.ts +19 -0
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.js +47 -0
- package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
- package/dist-lib/lib/deliveryNotePrint.js +219 -219
- package/dist-lib/lib/floridayFulfillmentSend.server.d.ts +1 -1
- package/dist-lib/lib/floridayFulfillmentSend.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayFulfillmentSend.server.js +11 -3
- package/dist-lib/lib/floridayLoading.functions.d.ts +2 -0
- package/dist-lib/lib/floridayLoading.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayLoading.functions.js +51 -23
- package/dist-lib/lib/logisticsEngine/capacity.js +1 -1
- package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
- package/dist-lib/lib/orderFulfilment.functions.d.ts.map +1 -1
- package/dist-lib/lib/orderFulfilment.functions.js +17 -0
- package/package.json +1 -1
|
@@ -35,13 +35,21 @@ const str = (v) => (typeof v === "string" && v ? v : null);
|
|
|
35
35
|
* fulfillmentRequests[] { fulfillmentRequestId, deliveryOrderId, fulfillmentOrderIds },
|
|
36
36
|
* fulfillmentOrders[] { fulfillmentOrderId, status, deliveryNoteReady }.
|
|
37
37
|
*/
|
|
38
|
-
export async function fetchFulfillmentStatus(salesOrderIds) {
|
|
38
|
+
export async function fetchFulfillmentStatus(salesOrderIds, fulfillmentOrderIds = []) {
|
|
39
39
|
const out = new Map();
|
|
40
40
|
const ids = [...new Set(salesOrderIds.filter(Boolean))];
|
|
41
|
+
const foIds = [...new Set(fulfillmentOrderIds.filter(Boolean))];
|
|
41
42
|
for (let i = 0; i < ids.length; i += 100) {
|
|
42
|
-
|
|
43
|
+
// Vaste kenmerken van Afhandeling meesturen: oudere gateway-versies weigeren het
|
|
44
|
+
// statusoverzicht zonder fulfillmentOrderId (HTTP 400).
|
|
45
|
+
const r = await signedPost("fulfillment-order/status", {
|
|
46
|
+
salesOrderIds: ids.slice(i, i + 100),
|
|
47
|
+
...(foIds.length ? { fulfillmentOrderIds: foIds, fulfillmentOrderId: foIds[0] } : {}),
|
|
48
|
+
});
|
|
43
49
|
if (r.httpStatus >= 400 || !r.body) {
|
|
44
|
-
|
|
50
|
+
const detail = [r.body?.code, r.body?.message, ...arr(r.body?.errors).map((e) => (typeof e === "string" ? e : e?.message))]
|
|
51
|
+
.filter((x) => typeof x === "string" && x).join(" — ");
|
|
52
|
+
throw new Error(`Statusoverzicht van Floriday-authenticatie mislukt (HTTP ${r.httpStatus}${detail ? `: ${detail}` : ""}).`);
|
|
45
53
|
}
|
|
46
54
|
const rows = Array.isArray(r.body) ? r.body : r.body.orders;
|
|
47
55
|
if (!Array.isArray(rows))
|
|
@@ -11,6 +11,8 @@ export interface LoadingCarrier {
|
|
|
11
11
|
cartLabel: string;
|
|
12
12
|
sortIndex: number;
|
|
13
13
|
shared: boolean;
|
|
14
|
+
/** Extra lagen volgens de Engine; null = onbekend (niet meegestuurd). */
|
|
15
|
+
additionalLayers: number | null;
|
|
14
16
|
items: LoadingItem[];
|
|
15
17
|
}
|
|
16
18
|
export interface OrderCheck {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floridayLoading.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floridayLoading.functions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3H;
|
|
1
|
+
{"version":3,"file":"floridayLoading.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floridayLoading.functions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3H;AA0PD,sEAAsE;AACtE,eAAO,MAAM,sBAAsB;;;;0CAEb;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE;;2BAC4E,CAAC;AAEvH;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;;;0CAEV;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE;;uBA0DtC,CAAC"}
|
|
@@ -40,18 +40,17 @@ async function buildLoading(supabase, orderRef) {
|
|
|
40
40
|
throw new Error("Geen order opgegeven.");
|
|
41
41
|
const blockers = [];
|
|
42
42
|
const loadOrder = async (ref) => {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.or(`order_number.eq."${ref.replace(/"/g, "")}"${/^[0-9a-f-]{36}$/i.test(ref) ? `,id.eq.${ref}` : ""}`)
|
|
47
|
-
.maybeSingle();
|
|
43
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(ref);
|
|
44
|
+
const q = supabase.from("orders").select("id, order_number, order_source, custom_fields, buffer_id").is("deleted_at", null);
|
|
45
|
+
const { data: row, error } = await (isUuid ? q.eq("id", ref) : q.eq("order_number", ref)).maybeSingle();
|
|
48
46
|
if (error)
|
|
49
47
|
throw new Error(error.message);
|
|
50
48
|
return row;
|
|
51
49
|
};
|
|
52
50
|
const coverage = new Map();
|
|
53
51
|
const queue = [orderRef];
|
|
54
|
-
|
|
52
|
+
const bufferIds = new Set();
|
|
53
|
+
while (queue.length && coverage.size < 200) {
|
|
55
54
|
const ref = queue.shift();
|
|
56
55
|
const o = await loadOrder(ref);
|
|
57
56
|
if (!o) {
|
|
@@ -66,13 +65,28 @@ async function buildLoading(supabase, orderRef) {
|
|
|
66
65
|
const cf = o.custom_fields ?? {};
|
|
67
66
|
const soId = typeof cf.floriday_sales_order_id === "string" ? cf.floriday_sales_order_id
|
|
68
67
|
: typeof cf.salesOrderId === "string" ? cf.salesOrderId : null;
|
|
69
|
-
coverage.set(o.id, { ref: o.order_number ?? o.id, source: o.order_source, salesOrderId: soId, cov: cov ?? {} });
|
|
70
|
-
|
|
68
|
+
coverage.set(o.id, { ref: o.order_number ?? o.id, source: o.order_source, salesOrderId: soId, cov: cov ?? {}, bufferId: o.buffer_id });
|
|
69
|
+
// Andere orders op dezelfde (gedeelde) kar.
|
|
70
|
+
for (const k of arr(cov?.carts)) {
|
|
71
|
+
for (const id of arr(k?.orderIds))
|
|
72
|
+
if (typeof id === "string" && !coverage.has(id))
|
|
73
|
+
queue.push(id);
|
|
71
74
|
for (const r of arr(k?.orderRefs)) {
|
|
72
75
|
const s2 = String(r);
|
|
73
76
|
if (![...coverage.values()].some((c) => c.ref === s2))
|
|
74
77
|
queue.push(s2);
|
|
75
78
|
}
|
|
79
|
+
}
|
|
80
|
+
// Alle orders van dezelfde buffer (koppeling op buffer-id van de Engine).
|
|
81
|
+
if (o.buffer_id && !bufferIds.has(o.buffer_id)) {
|
|
82
|
+
bufferIds.add(o.buffer_id);
|
|
83
|
+
const { data: sib, error: sErr } = await supabase.from("orders").select("id").eq("buffer_id", o.buffer_id).is("deleted_at", null);
|
|
84
|
+
if (sErr)
|
|
85
|
+
throw new Error(sErr.message);
|
|
86
|
+
for (const s of sib ?? [])
|
|
87
|
+
if (!coverage.has(s.id))
|
|
88
|
+
queue.push(s.id);
|
|
89
|
+
}
|
|
76
90
|
}
|
|
77
91
|
// Gecontroleerd = elke kar van de order is bij de controlebalie afgemeld (scan of "Controle uitvoeren").
|
|
78
92
|
const orderIds = [...coverage.keys()].sort();
|
|
@@ -88,14 +102,21 @@ async function buildLoading(supabase, orderRef) {
|
|
|
88
102
|
for (const r of sc ?? [])
|
|
89
103
|
approvedCarts.add(r.cart_id);
|
|
90
104
|
}
|
|
105
|
+
// Vaste sleutel voor de opdracht: één buffer → buffer-id, anders de gesorteerde order-id's.
|
|
106
|
+
// Deterministisch: dubbele klik of herhaling geeft dezelfde fulfillmentOrderId.
|
|
107
|
+
const bufs = [...new Set([...coverage.values()].map((c) => c.bufferId))];
|
|
108
|
+
const foKey = bufs.length === 1 && bufs[0] ? `buffer:${bufs[0]}` : orderIds.join("|");
|
|
109
|
+
const baseFo = orderIds.length ? (await ensureIds(supabase, "fulfillment_order", [foKey])).get(foKey) : null;
|
|
91
110
|
// Statusoverzicht van Floriday-authenticatie: fulfillmentRequestId + deliveryOrderId per order.
|
|
92
111
|
const soIds = [...coverage.values()].map((c) => c.salesOrderId).filter((x) => !!x);
|
|
93
112
|
let status = new Map();
|
|
113
|
+
let statusFailed = false;
|
|
94
114
|
try {
|
|
95
115
|
const { fetchFulfillmentStatus } = await import("./floridayFulfillmentSend.server");
|
|
96
|
-
status = await fetchFulfillmentStatus(soIds);
|
|
116
|
+
status = await fetchFulfillmentStatus(soIds, baseFo ? [baseFo] : []);
|
|
97
117
|
}
|
|
98
118
|
catch (e) {
|
|
119
|
+
statusFailed = true;
|
|
99
120
|
blockers.push(e instanceof Error ? e.message : "Statusoverzicht ophalen mislukt.");
|
|
100
121
|
}
|
|
101
122
|
// Oude auto-verwerking: laatste logregel per order.
|
|
@@ -126,20 +147,22 @@ async function buildLoading(supabase, orderRef) {
|
|
|
126
147
|
});
|
|
127
148
|
if (!salesOrderId)
|
|
128
149
|
blockers.push(`Order ${ref} heeft geen Floriday-verkooporder.`);
|
|
129
|
-
|
|
130
|
-
blockers.push(`Order ${ref} is nog niet gepickt.`);
|
|
150
|
+
// "Gepickt" = alle karren goedgekeurd op de Scan-controle (logistics_control_scan.approved_at).
|
|
131
151
|
if (!cartsTotal)
|
|
132
152
|
blockers.push(`Order ${ref} heeft geen karindeling.`);
|
|
133
153
|
else if (!controlled)
|
|
134
154
|
blockers.push(`Order ${ref}: ${done} van ${cartsTotal} karren goedgekeurd op de Scan-controle.`);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
155
|
+
// Bij een mislukt statusoverzicht geen gevolgfouten per order tonen.
|
|
156
|
+
if (!statusFailed) {
|
|
157
|
+
if (salesOrderId && !st)
|
|
158
|
+
blockers.push(`Order ${ref} staat niet in het statusoverzicht van Floriday.`);
|
|
159
|
+
if (st && !st.found)
|
|
160
|
+
blockers.push(`Order ${ref} is niet gevonden in Floriday.`);
|
|
161
|
+
if (st && st.found && fr.length !== 1)
|
|
162
|
+
blockers.push(`Order ${ref}: ${fr.length === 0 ? "geen" : "meerdere"} fulfillmentRequest in het statusoverzicht.`);
|
|
163
|
+
if (fr.length === 1 && !fr[0].deliveryOrderId)
|
|
164
|
+
blockers.push(`Order ${ref}: nog geen levering (deliveryOrderId) in het statusoverzicht.`);
|
|
165
|
+
}
|
|
143
166
|
if (auto && (AUTO_ALREADY_SENT.has(auto.status) || auto.fo))
|
|
144
167
|
blockers.push(`Order ${ref} is al via de oude auto-verwerking verstuurd (${auto.status}); niet nogmaals versturen.`);
|
|
145
168
|
}
|
|
@@ -170,8 +193,7 @@ async function buildLoading(supabase, orderRef) {
|
|
|
170
193
|
if (new Set(c.lines.map((l) => l.dl ?? "")).size > 1)
|
|
171
194
|
blockers.push(`Kar ${c.label} bevat orders van verschillende leveringen; één kar kan maar in één opdracht.`);
|
|
172
195
|
}
|
|
173
|
-
// Opdrachten per levering. Eén levering → sleutel
|
|
174
|
-
const foKey = orderIds.join("|");
|
|
196
|
+
// Opdrachten per levering. Eén levering → de vaste sleutel van de order of buffer.
|
|
175
197
|
const deliveries = [...new Set(orders.map((o) => o.deliveryOrderId ?? ""))];
|
|
176
198
|
const shipKey = (dl) => (deliveries.length <= 1 ? foKey : `${foKey}|${dl}`);
|
|
177
199
|
const [foIds, lcIds, itemIds] = await Promise.all([
|
|
@@ -183,6 +205,7 @@ async function buildLoading(supabase, orderRef) {
|
|
|
183
205
|
loadCarrierReference: lcIds.get(ck),
|
|
184
206
|
cartLabel: c.label,
|
|
185
207
|
sortIndex: i + 1,
|
|
208
|
+
additionalLayers: c.layers,
|
|
186
209
|
shared: c.shared || new Set(c.lines.map((l) => l.orderId)).size > 1,
|
|
187
210
|
items: c.lines.map((l, j) => ({
|
|
188
211
|
loadCarrierItemId: itemIds.get(`${ck}|${l.orderId}|${l.key}`),
|
|
@@ -210,8 +233,11 @@ async function buildLoading(supabase, orderRef) {
|
|
|
210
233
|
})(),
|
|
211
234
|
};
|
|
212
235
|
}) : [];
|
|
213
|
-
if (
|
|
214
|
-
|
|
236
|
+
if (!statusFailed) {
|
|
237
|
+
for (const ref of new Set(allLines.filter((l) => !l.frId).map((l) => l.ref))) {
|
|
238
|
+
blockers.push(`Order ${ref}: nog geen fulfillmentRequestId van Floriday.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
215
241
|
let lastAttempts = [];
|
|
216
242
|
if (shipments.length) {
|
|
217
243
|
const { data: at } = await supabase.from("floriday_loading_attempts")
|
|
@@ -273,6 +299,8 @@ export const sendFloridayLoading = createServerFn({ method: "POST" })
|
|
|
273
299
|
loadCarriers: s.carriers.map((c) => ({
|
|
274
300
|
loadCarrierReference: c.loadCarrierReference,
|
|
275
301
|
sortIndex: c.sortIndex,
|
|
302
|
+
// Floriday 2026v1 AddLoadCarrierConfiguration: alleen meesturen als de Engine het kent.
|
|
303
|
+
...(c.additionalLayers != null ? { numberOfAdditionalLayers: c.additionalLayers } : {}),
|
|
276
304
|
items: c.items.map((it) => ({
|
|
277
305
|
fulfillmentRequestId: it.fulfillmentRequestId,
|
|
278
306
|
loadCarrierItemId: it.loadCarrierItemId,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { supabase } from "../../integrations/supabase/moduleClient";
|
|
1
|
+
import { supabase } from "../../integrations/supabase/moduleClient.js";
|
|
2
2
|
function num(v) {
|
|
3
3
|
const n = typeof v === "string" ? Number(v) : typeof v === "number" ? v : NaN;
|
|
4
4
|
return Number.isFinite(n) ? n : 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { supabase } from "../../integrations/supabase/moduleClient";
|
|
1
|
+
import { supabase } from "../../integrations/supabase/moduleClient.js";
|
|
2
2
|
import { SOURCE_MODULE } from "./engine";
|
|
3
3
|
export function toDateKey(d) {
|
|
4
4
|
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderFulfilment.functions.d.ts","sourceRoot":"","sources":["../../src/lib/orderFulfilment.functions.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;8CAEH,qBAAqB;;
|
|
1
|
+
{"version":3,"file":"orderFulfilment.functions.d.ts","sourceRoot":"","sources":["../../src/lib/orderFulfilment.functions.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;8CAEH,qBAAqB;;mCAoC3C,CAAC"}
|
|
@@ -17,6 +17,23 @@ export const markOrderShipped = createServerFn({ method: "POST" })
|
|
|
17
17
|
})
|
|
18
18
|
.handler(async ({ data, context }) => {
|
|
19
19
|
const { supabase } = context;
|
|
20
|
+
// Floriday-orders: "Verzonden" pas nadat Floriday de belading heeft geaccepteerd.
|
|
21
|
+
const { data: ord, error: oErr } = await supabase
|
|
22
|
+
.from("orders").select("id, order_source").eq("order_number", data.orderRef).is("deleted_at", null).maybeSingle();
|
|
23
|
+
if (oErr)
|
|
24
|
+
throw new Error(oErr.message);
|
|
25
|
+
if (!ord)
|
|
26
|
+
throw new Error(`Bestelling ${data.orderRef} niet gevonden in de orderadministratie.`);
|
|
27
|
+
if (ord.order_source === "floriday") {
|
|
28
|
+
const { data: acc, error: aErr } = await supabase
|
|
29
|
+
.from("floriday_loading_attempts").select("id")
|
|
30
|
+
.contains("order_refs", [data.orderRef]).in("code", ["created", "already_fulfilled"]).limit(1);
|
|
31
|
+
if (aErr)
|
|
32
|
+
throw new Error(aErr.message);
|
|
33
|
+
if (!acc?.length) {
|
|
34
|
+
throw new Error(`${data.orderRef}: nog niet door Floriday geaccepteerd. Verstuur eerst de belading met "Nu versturen".`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
20
37
|
const { data: rows, error } = await supabase
|
|
21
38
|
.from("orders")
|
|
22
39
|
.update({
|