@flowselections/floriday-afhandeling-module 1.0.36 → 1.0.37

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 (31) hide show
  1. package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
  2. package/dist-lib/components/afhandeling/PickAgendaView.js +20 -9
  3. package/dist-lib/hooks/useOrderPlanning.d.ts +20 -3
  4. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  5. package/dist-lib/hooks/useOrderPlanning.js +80 -15
  6. package/dist-lib/integrations/supabase/auth-middleware.d.ts +214 -1
  7. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  8. package/dist-lib/integrations/supabase/client.server.d.ts +214 -1
  9. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  10. package/dist-lib/integrations/supabase/moduleClient.d.ts +214 -1
  11. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/types.d.ts +218 -1
  13. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  14. package/dist-lib/lib/afhandelingSettings.functions.d.ts +428 -2
  15. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  16. package/dist-lib/lib/carriers.functions.d.ts +1070 -5
  17. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  18. package/dist-lib/lib/cartAssignments.functions.d.ts +1070 -5
  19. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  20. package/dist-lib/lib/cartControl.functions.d.ts +2140 -10
  21. package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
  22. package/dist-lib/lib/floriday.functions.d.ts +223 -2
  23. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/floriday.functions.js +41 -9
  25. package/dist-lib/lib/logisticsEngine/engine.d.ts +21 -1
  26. package/dist-lib/lib/logisticsEngine/engine.d.ts.map +1 -1
  27. package/dist-lib/lib/logisticsEngine/engine.js +81 -19
  28. package/dist-lib/lib/orderRefs.d.ts +18 -0
  29. package/dist-lib/lib/orderRefs.d.ts.map +1 -0
  30. package/dist-lib/lib/orderRefs.js +30 -0
  31. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
3
+ import { normalizeOrderNumber } from "./orderRefs";
3
4
  function pickStr(r, ...keys) {
4
5
  if (!r)
5
6
  return null;
@@ -398,20 +399,51 @@ export const getFloridayOrders = createServerFn({ method: "GET" })
398
399
  city: deliveryLocation?.city ?? null,
399
400
  };
400
401
  });
401
- // Verkoop-module schrijft Floriday-orders óók in public.orders (met
402
- // custom_fields.floriday_sales_order_id). Zonder dedup verschijnt elke
403
- // order dubbel: één keer vanuit de cache, één keer vanuit orders.
404
- // Manual/orders-versie heeft het juiste FO-nummer en klantnaam, dus die
405
- // wint. Cache-rijen zonder pendant blijven staan.
406
- const manualFloridayIds = new Set();
402
+ // Verkoop-module schrijft Floriday-orders óók in public.orders. Zonder dedup
403
+ // verschijnt elke order dubbel: één keer vanuit de cache, één keer vanuit
404
+ // orders. De orders-versie wint (juist FO-nummer, juiste klantnaam).
405
+ //
406
+ // Dedup op DRIE sleutels, want custom_fields.floriday_sales_order_id is niet
407
+ // gegarandeerd gevuld: (1) floriday_sales_order_id, (2) genormaliseerd
408
+ // ordernummer, (3) orders.id gelijk aan het cache-id. Cache-rijen zonder
409
+ // pendant blijven staan en worden gemarkeerd als niet-gemirrord.
410
+ const manualIdByFloridayId = new Map();
411
+ const manualIdByNumber = new Map();
412
+ const manualIds = new Set();
407
413
  for (const row of manualRows ?? []) {
408
414
  const fields = (row.custom_fields ?? {});
409
415
  const fid = fields.floriday_sales_order_id;
416
+ const rowId = row.id;
417
+ manualIds.add(rowId);
410
418
  if (typeof fid === "string" && fid)
411
- manualFloridayIds.add(fid);
419
+ manualIdByFloridayId.set(fid, rowId);
420
+ const num = normalizeOrderNumber(row.order_number);
421
+ if (num && !manualIdByNumber.has(num))
422
+ manualIdByNumber.set(num, rowId);
423
+ }
424
+ const dedupedFloriday = [];
425
+ for (const o of orders) {
426
+ const mirroredId = manualIdByFloridayId.get(o.id) ??
427
+ manualIdByNumber.get(normalizeOrderNumber(o.orderNumber) ?? "\u0000") ??
428
+ (manualIds.has(o.id) ? o.id : null) ??
429
+ null;
430
+ if (mirroredId)
431
+ continue; // pendant in public.orders bestaat al
432
+ dedupedFloriday.push({ ...o, mirrored: false, mirroredOrderId: null });
433
+ }
434
+ // Laatste net: nooit twee items met dezelfde ref-sleutel.
435
+ const seenRefs = new Set();
436
+ const combined = [];
437
+ for (const o of [
438
+ ...manualOrders.map((m) => ({ ...m, mirrored: true, mirroredOrderId: m.id })),
439
+ ...dedupedFloriday,
440
+ ]) {
441
+ const key = normalizeOrderNumber(o.orderNumber) ?? o.id;
442
+ if (seenRefs.has(key))
443
+ continue;
444
+ seenRefs.add(key);
445
+ combined.push(o);
412
446
  }
413
- const dedupedFloriday = orders.filter((o) => !manualFloridayIds.has(o.id));
414
- const combined = [...manualOrders, ...dedupedFloriday];
415
447
  const nearestDeliveryDate = combined.length === 0 ? await findNearestDeliveryDate(supabase, connectionId, range) : null;
416
448
  console.info("[planning-orders] load completed", {
417
449
  floridayOrders: orders.length,
@@ -90,7 +90,13 @@ export declare function emitEngineEvent(params: {
90
90
  }): Promise<EngineEmitResult>;
91
91
  /** Modules waarvan deze agenda taken toont (pick.execute staat op pickschermen). */
92
92
  export declare const OWNER_MODULES: string[];
93
- /** Haal de taken op die deze module moet uitvoeren. */
93
+ /**
94
+ * Haal de taken op die deze module moet uitvoeren.
95
+ *
96
+ * Gepagineerd: een vaste `limit()` sneed bij veel open taken stil de laatste
97
+ * rijen weg (sorteer op planned_start → latere leverdata verloren hun taak en
98
+ * leken "wachtend"). We lezen door tot een pagina niet meer vol is.
99
+ */
94
100
  export declare function listEngineTasks(options?: {
95
101
  taskTypes?: string[];
96
102
  statuses?: string[];
@@ -102,6 +108,20 @@ export declare function listEngineTasks(options?: {
102
108
  includePayload?: boolean;
103
109
  limit?: number;
104
110
  }): Promise<EngineTask[]>;
111
+ export interface ComposeTaskRef {
112
+ order_ref: string;
113
+ planned_start: string | null;
114
+ status: EngineTaskStatus;
115
+ }
116
+ /**
117
+ * Bestaat er een load.compose-taak voor deze refs? Bewust ZONDER datumvenster:
118
+ * of een order een indeling heeft, mag niet afhangen van waar planned_start
119
+ * valt. Anders lijkt een order die buiten de zichtbare week is ingedeeld
120
+ * "wachtend op de Engine" terwijl zijn taak gewoon bestaat.
121
+ */
122
+ export declare function listComposeTaskRefs(refs: string[], options?: {
123
+ statuses?: string[];
124
+ }): Promise<Map<string, ComposeTaskRef>>;
105
125
  export declare function claimEngineTask(taskId: string, worker?: string): Promise<boolean>;
106
126
  /** Rond af op de rule_version van de taak — nooit op een nieuwere versie. */
107
127
  export declare function completeEngineTask(task: Pick<EngineTask, "id" | "rule_version">, result?: Record<string, unknown>): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/lib/logisticsEngine/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/lib/logisticsEngine/engine.ts"],"names":[],"mappings":"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"}
@@ -49,28 +49,90 @@ export const OWNER_MODULES = ["afhandeling", "pickschermen"];
49
49
  /** Lichte kolomset: payload/result zijn tot ~100 kB per rij en niet nodig in lijsten. */
50
50
  const TASK_LIST_COLUMNS = "id, task_type, status, order_ref, buffer_ref, owner_module, planned_start, planned_end, due_at, priority, sequence, rule_version, shadow, error, claimed_by, claimed_at, started_at, completed_at, created_at, updated_at";
51
51
  const TASK_COLUMNS = `${TASK_LIST_COLUMNS}, payload, result`;
52
- /** Haal de taken op die deze module moet uitvoeren. */
52
+ /** Paginagrootte voor de takenquery. Een harde limit truncateert stil. */
53
+ const TASK_PAGE_SIZE = 1000;
54
+ /** Bovengrens tegen weglopen; ruim boven het aantal open taken per venster. */
55
+ const TASK_MAX_ROWS = 20000;
56
+ /**
57
+ * Haal de taken op die deze module moet uitvoeren.
58
+ *
59
+ * Gepagineerd: een vaste `limit()` sneed bij veel open taken stil de laatste
60
+ * rijen weg (sorteer op planned_start → latere leverdata verloren hun taak en
61
+ * leken "wachtend"). We lezen door tot een pagina niet meer vol is.
62
+ */
53
63
  export async function listEngineTasks(options) {
54
- let query = supabase
55
- .from("logistics_tasks")
56
- .select(options?.includePayload ? TASK_COLUMNS : TASK_LIST_COLUMNS)
57
- .in("owner_module", options?.ownerModules ?? OWNER_MODULES)
58
- .order("planned_start", { ascending: true, nullsFirst: false })
59
- .order("sequence", { ascending: true })
60
- .limit(options?.limit ?? 2000);
61
- if (options?.taskTypes?.length)
62
- query = query.in("task_type", options.taskTypes);
63
- if (options?.statuses?.length)
64
- query = query.in("status", options.statuses);
65
- if (options?.plannedFrom && options?.plannedTo) {
66
- query = query.or(`planned_start.is.null,and(planned_start.gte.${options.plannedFrom}T00:00:00Z,planned_start.lte.${options.plannedTo}T23:59:59Z)`);
64
+ const max = options?.limit ?? TASK_MAX_ROWS;
65
+ const all = [];
66
+ for (let offset = 0; offset < max; offset += TASK_PAGE_SIZE) {
67
+ const pageSize = Math.min(TASK_PAGE_SIZE, max - offset);
68
+ let query = supabase
69
+ .from("logistics_tasks")
70
+ .select(options?.includePayload ? TASK_COLUMNS : TASK_LIST_COLUMNS)
71
+ .in("owner_module", options?.ownerModules ?? OWNER_MODULES)
72
+ .order("planned_start", { ascending: true, nullsFirst: false })
73
+ .order("sequence", { ascending: true })
74
+ .order("id", { ascending: true })
75
+ .range(offset, offset + pageSize - 1);
76
+ if (options?.taskTypes?.length)
77
+ query = query.in("task_type", options.taskTypes);
78
+ if (options?.statuses?.length)
79
+ query = query.in("status", options.statuses);
80
+ if (options?.plannedFrom && options?.plannedTo) {
81
+ query = query.or(`planned_start.is.null,and(planned_start.gte.${options.plannedFrom}T00:00:00Z,planned_start.lte.${options.plannedTo}T23:59:59Z)`);
82
+ }
83
+ const { data, error } = await query;
84
+ if (error) {
85
+ console.error("[engine] list tasks failed", { message: error.message, offset });
86
+ return all;
87
+ }
88
+ const rows = (data ?? []);
89
+ all.push(...rows);
90
+ if (rows.length < pageSize)
91
+ break;
67
92
  }
68
- const { data, error } = await query;
69
- if (error) {
70
- console.error("[engine] list tasks failed", { message: error.message });
71
- return [];
93
+ return all;
94
+ }
95
+ /** Refs per `.in()`-aanroep. Meer geeft te lange URL's (~1000 orders = 2 chunks). */
96
+ const REF_CHUNK_SIZE = 500;
97
+ /**
98
+ * Bestaat er een load.compose-taak voor deze refs? Bewust ZONDER datumvenster:
99
+ * of een order een indeling heeft, mag niet afhangen van waar planned_start
100
+ * valt. Anders lijkt een order die buiten de zichtbare week is ingedeeld
101
+ * "wachtend op de Engine" terwijl zijn taak gewoon bestaat.
102
+ */
103
+ export async function listComposeTaskRefs(refs, options) {
104
+ const found = new Map();
105
+ const unique = [...new Set(refs.filter(Boolean))];
106
+ if (!unique.length)
107
+ return found;
108
+ for (let i = 0; i < unique.length; i += REF_CHUNK_SIZE) {
109
+ const chunk = unique.slice(i, i + REF_CHUNK_SIZE);
110
+ let query = supabase
111
+ .from("logistics_tasks")
112
+ .select("order_ref, planned_start, status")
113
+ .eq("task_type", "load.compose")
114
+ .in("order_ref", chunk);
115
+ if (options?.statuses?.length)
116
+ query = query.in("status", options.statuses);
117
+ const { data, error } = await query;
118
+ if (error) {
119
+ console.error("[engine] compose task existence check failed", {
120
+ message: error.message,
121
+ chunkSize: chunk.length,
122
+ });
123
+ // Fail-closed op deze chunk: liever geen valse "wachtend" dan verzonnen
124
+ // indelingen. De caller ziet dit als "onbekend" (geen entry).
125
+ continue;
126
+ }
127
+ for (const row of (data ?? [])) {
128
+ const existing = found.get(row.order_ref);
129
+ // Een taak MET starttijd wint van een taak zonder.
130
+ if (!existing || (!existing.planned_start && row.planned_start)) {
131
+ found.set(row.order_ref, row);
132
+ }
133
+ }
72
134
  }
73
- return (data ?? []);
135
+ return found;
74
136
  }
75
137
  export async function claimEngineTask(taskId, worker) {
76
138
  const { error } = await supabase.rpc("logistics_claim_task", { p_task_id: taskId, p_worker: worker ?? OWNER_MODULE });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Eén bron van waarheid voor de refs waarmee een order aan een Engine-taak
3
+ * gekoppeld wordt. De Engine schrijft `order_ref` als `orders.order_number` of
4
+ * als `orders.id::text`; deze module ziet orders uit twee bronnen
5
+ * (floriday_salesorders_cache en public.orders) met verschillende id's.
6
+ */
7
+ export interface RefLikeOrder {
8
+ id: string;
9
+ orderNumber?: string | null;
10
+ /** Id van de gemirrorde rij in public.orders, indien bekend. */
11
+ mirroredOrderId?: string | null;
12
+ salesOrderId?: string | null;
13
+ }
14
+ /** Normalisatie voor vergelijking van ordernummers (dedup, niet voor lookup). */
15
+ export declare function normalizeOrderNumber(value: string | null | undefined): string | null;
16
+ /** Alle kandidaat-refs voor deze order, in volgorde van betrouwbaarheid. */
17
+ export declare function orderRefsFor(order: RefLikeOrder): string[];
18
+ //# sourceMappingURL=orderRefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderRefs.d.ts","sourceRoot":"","sources":["../../src/lib/orderRefs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKpF;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CAU1D"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Eén bron van waarheid voor de refs waarmee een order aan een Engine-taak
3
+ * gekoppeld wordt. De Engine schrijft `order_ref` als `orders.order_number` of
4
+ * als `orders.id::text`; deze module ziet orders uit twee bronnen
5
+ * (floriday_salesorders_cache en public.orders) met verschillende id's.
6
+ */
7
+ /** Normalisatie voor vergelijking van ordernummers (dedup, niet voor lookup). */
8
+ export function normalizeOrderNumber(value) {
9
+ if (!value)
10
+ return null;
11
+ const trimmed = value.trim().toUpperCase();
12
+ if (!trimmed || trimmed === "—" || trimmed === "-")
13
+ return null;
14
+ return trimmed.replace(/\s+/g, "");
15
+ }
16
+ /** Alle kandidaat-refs voor deze order, in volgorde van betrouwbaarheid. */
17
+ export function orderRefsFor(order) {
18
+ const candidates = [order.orderNumber, order.mirroredOrderId, order.id, order.salesOrderId];
19
+ const out = [];
20
+ for (const c of candidates) {
21
+ if (typeof c !== "string")
22
+ continue;
23
+ const v = c.trim();
24
+ if (!v || v === "—" || v === "-")
25
+ continue;
26
+ if (!out.includes(v))
27
+ out.push(v);
28
+ }
29
+ return out;
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-afhandeling-module",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",