@flowselections/logistiek-engine 1.0.90 → 1.0.98

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 (53) hide show
  1. package/dist-lib/components/FlowOrders.js +1 -1
  2. package/dist-lib/components/MisluktVerzendbrievenCard.d.ts +2 -0
  3. package/dist-lib/components/MisluktVerzendbrievenCard.d.ts.map +1 -0
  4. package/dist-lib/components/MisluktVerzendbrievenCard.js +50 -0
  5. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  6. package/dist-lib/components/RegiePage.js +2 -1
  7. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
  8. package/dist-lib/components/RuleEnginePage.js +3 -1
  9. package/dist-lib/hooks/useShippingNoteStatus.d.ts +2 -0
  10. package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -1
  11. package/dist-lib/hooks/useShippingNoteStatus.js +13 -1
  12. package/dist-lib/hooks/useShippingNoteStatus.test.d.ts +2 -0
  13. package/dist-lib/hooks/useShippingNoteStatus.test.d.ts.map +1 -0
  14. package/dist-lib/hooks/useShippingNoteStatus.test.js +20 -0
  15. package/dist-lib/integrations/supabase/auth-middleware.d.ts +415 -0
  16. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  17. package/dist-lib/integrations/supabase/client.server.d.ts +415 -0
  18. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  19. package/dist-lib/integrations/supabase/moduleClient.d.ts +415 -0
  20. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/types.d.ts +423 -0
  22. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  23. package/dist-lib/lib/cartCoverage.functions.d.ts +415 -0
  24. package/dist-lib/lib/cartCoverage.functions.d.ts.map +1 -1
  25. package/dist-lib/lib/controlScan.server.d.ts +2 -0
  26. package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
  27. package/dist-lib/lib/controlScan.server.js +59 -53
  28. package/dist-lib/lib/floridayDocuments.functions.d.ts +1245 -0
  29. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/floridayPush.functions.d.ts +415 -0
  31. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/layoutPrint.server.d.ts +27 -0
  33. package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -0
  34. package/dist-lib/lib/layoutPrint.server.js +48 -0
  35. package/dist-lib/lib/layoutPrint.test.d.ts +2 -0
  36. package/dist-lib/lib/layoutPrint.test.d.ts.map +1 -0
  37. package/dist-lib/lib/layoutPrint.test.js +47 -0
  38. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +2075 -0
  39. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  41. package/dist-lib/lib/loadCarrierPlanning.server.js +52 -8
  42. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +830 -0
  43. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +415 -0
  45. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  46. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  47. package/dist-lib/lib/modulePrompts.js +54 -0
  48. package/dist-lib/lib/plannerDiff.functions.d.ts +415 -0
  49. package/dist-lib/lib/plannerDiff.functions.d.ts.map +1 -1
  50. package/dist-lib/lib/ruleEngineSchema.js +2 -2
  51. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  52. package/dist-lib/lib/shippingNoteQueue.server.js +40 -49
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}
@@ -146,6 +146,8 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
146
146
  let groupSet = new Set();
147
147
  // Groepsregels dragen niet altijd een product_id. Zonder koppeling wordt de
148
148
  // groep op naam opgezocht, zodat de leden en hun afmetingen alsnog meetellen.
149
+ // Een regel die aan een echt artikel gekoppeld is, blijft altijd dat artikel,
150
+ // ook als er toevallig een productgroep met dezelfde naam bestaat.
149
151
  const groupByName = new Map();
150
152
  {
151
153
  const { data: allGroups } = await sb.from("product_groups").select("id, name");
@@ -154,9 +156,12 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
154
156
  groupByName.set(String(g.name).trim().toLowerCase(), String(g.id));
155
157
  }
156
158
  }
159
+ let realProductIds = new Set();
157
160
  if (groupIds.length > 0) {
158
161
  const { data: groups } = await sb.from("product_groups").select("id").in("id", groupIds);
159
162
  groupSet = new Set((groups ?? []).map((g) => g.id));
163
+ const { data: realProds } = await sb.from("products").select("id").in("id", groupIds);
164
+ realProductIds = new Set((Array.isArray(realProds) ? realProds : []).map((p) => String(p.id)));
160
165
  }
161
166
  for (const row of rows) {
162
167
  const orderKey = row.order_id ? String(row.order_id) : null;
@@ -169,14 +174,18 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
169
174
  : null;
170
175
  const { belading: base, source } = resolveBelading(row, packing, linePacking);
171
176
  const plants = Math.max(0, Number(row.quantity ?? 0));
177
+ const explicitGroupPrefix = /^\[Groep\]/i.test(String(row.product_name ?? ""));
172
178
  const groupNameKey = String(row.product_name ?? "")
173
179
  .replace(/^\[Groep\]\s*/i, "")
174
180
  .trim()
175
181
  .toLowerCase();
182
+ const linkedToRealProduct = typeof row.product_id === "string" && realProductIds.has(row.product_id) && !groupSet.has(row.product_id);
176
183
  const groupId = row.product_id && groupSet.has(row.product_id)
177
184
  ? String(row.product_id)
178
- : groupByName.get(groupNameKey) ?? null;
179
- const isGroup = groupId != null || String(row.product_name ?? "").startsWith("[Groep]");
185
+ : !linkedToRealProduct || explicitGroupPrefix
186
+ ? groupByName.get(groupNameKey) ?? null
187
+ : null;
188
+ const isGroup = groupId != null || (explicitGroupPrefix && !linkedToRealProduct);
180
189
  if (!isGroup) {
181
190
  options.sources?.set(String(row.id), source);
182
191
  out.push({
@@ -219,7 +228,9 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
219
228
  const { data: prods } = await sb
220
229
  .from("products")
221
230
  .select("id, product, plants_per_crate, crates_per_layer, layers_per_cart, weight, floriday_trade_item_id")
222
- .or(tradeIds.map((t) => `floriday_trade_item_id.eq.${t}`).join(","));
231
+ .or(tradeIds
232
+ .flatMap((t) => UUID_RE.test(t) ? [`floriday_trade_item_id.eq.${t}`, `id.eq.${t}`] : [`floriday_trade_item_id.eq.${t}`])
233
+ .join(","));
223
234
  const prodByTrade = new Map();
224
235
  for (const p of prods ?? []) {
225
236
  if (p.floriday_trade_item_id)
@@ -228,6 +239,9 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
228
239
  }
229
240
  const resolved = memberList.map((m) => {
230
241
  const p = prodByTrade.get(String(m.trade_item_id));
242
+ // Onbekend groepslid: niet gokken en geen kale id als artikelnaam.
243
+ if (!p)
244
+ return { m, p, belading: { ...base }, source: "geen" };
231
245
  // Een handmatig vastgezette regel blijft leidend voor de hele groep.
232
246
  if (source === "handmatig") {
233
247
  return { m, p, belading: { ...base }, source };
@@ -283,7 +297,7 @@ export async function expandOrderItemsForPlanner(sb, rows, options = {}) {
283
297
  order_id: row.order_id ?? null,
284
298
  customer_id: row.customer_id ?? null,
285
299
  product_id: r.p?.id ?? null,
286
- product_name: `${row.product_name ?? "Groep"} — ${r.p?.product ?? r.m.trade_item_id}`,
300
+ product_name: `${row.product_name ?? "Groep"} — ${r.p?.product ?? "onbekend groepslid"}`,
287
301
  plants: shares[idx],
288
302
  ...r.belading,
289
303
  packing_authoritative: isAuthoritative(r.source),
@@ -551,8 +565,12 @@ export function dimensionCartsToPlannedUnits(carts) {
551
565
  // ---------------------------------------------------------------------------
552
566
  // Herplannen van een buffer
553
567
  // ---------------------------------------------------------------------------
554
- /** Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. */
555
- const MAX_CARTS_PER_BUFFER = 500;
568
+ /**
569
+ * Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. De grootste
570
+ * echte buffers kwamen op 725–867 karren; 1.000 houdt een vangnet tegen
571
+ * opgeblazen aantallen zonder echte grote orders te blokkeren.
572
+ */
573
+ const MAX_CARTS_PER_BUFFER = 1000;
556
574
  /** Statussen waarbij een order niet meer ingedeeld hoeft te worden. */
557
575
  const TERMINALE_STATUSSEN = new Set([
558
576
  "verzonden",
@@ -1217,9 +1235,11 @@ async function replanBufferUnlocked(sb, bufferId, options = {}) {
1217
1235
  // omzeild kan worden.
1218
1236
  const totalCartsAfterPlan = plannedCarts.length + frozenCartCount;
1219
1237
  if (totalCartsAfterPlan > MAX_CARTS_PER_BUFFER) {
1220
- const reason = `Deze orderbuffer komt uit op ${totalCartsAfterPlan} ladingdragers ` +
1238
+ const reason = `Orderbuffer met order(s) ${orderRefs.join(", ")} komt uit op ${totalCartsAfterPlan} ladingdragers ` +
1221
1239
  `(${frozenCartCount} al vastgelegd + ${plannedCarts.length} nieuw), meer dan de grens van ` +
1222
- `${MAX_CARTS_PER_BUFFER}. Er is niets ingedeeld; controleer de aantallen of de belading van de producten.`;
1240
+ `${MAX_CARTS_PER_BUFFER}. Alleen deze buffer is niet ingedeeld. Wat te doen: controleer de ` +
1241
+ `aantallen in de order (dubbele regels?) en de belading per ladingdrager van de producten; ` +
1242
+ `daarna opnieuw berekenen.`;
1223
1243
  console.error(`[logistiek-engine] buffer ${bufferId} geblokkeerd: ${reason}`);
1224
1244
  if (!options.dryRun) {
1225
1245
  const { error: blockError } = await sb.rpc("logistics_plan_block", {
@@ -1264,6 +1284,30 @@ async function replanBufferUnlocked(sb, bufferId, options = {}) {
1264
1284
  carts: plannedCarts,
1265
1285
  };
1266
1286
  }
1287
+ // Tussen lezen en schrijven kan de buffer zijn afgesloten (bijv. door het
1288
+ // losmaken van late orders). Dan niets meer schrijven.
1289
+ {
1290
+ const { data: bufRow, error: bufError } = await sb
1291
+ .from("order_buffers")
1292
+ .select("closed_at")
1293
+ .eq("id", bufferId)
1294
+ .maybeSingle();
1295
+ if (bufError || bufRow?.closed_at) {
1296
+ const reason = bufError
1297
+ ? `Status van de buffer kon niet worden gelezen: ${bufError.message}`
1298
+ : "De buffer is inmiddels afgesloten; er is niets weggeschreven.";
1299
+ return {
1300
+ ok: true,
1301
+ bufferId,
1302
+ orderIds,
1303
+ cartsCreated: 0,
1304
+ replacedManualCount,
1305
+ usedFloridayPacking,
1306
+ warnings: [...warnings, reason],
1307
+ skipped: "locked",
1308
+ };
1309
+ }
1310
+ }
1267
1311
  const persistentIdentities = assignPersistentCartIdentities(plannedCarts, itemToOrder, {
1268
1312
  shared: isBufferOrder || isSupplement,
1269
1313
  startNumber: cartNumberStart,