@flowselections/logistiek-engine 1.0.2 → 1.0.4

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 (39) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/integrations/supabase/auth-middleware.d.ts +516 -0
  3. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  4. package/dist-lib/integrations/supabase/client.d.ts +516 -0
  5. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  6. package/dist-lib/integrations/supabase/client.server.d.ts +516 -0
  7. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  8. package/dist-lib/integrations/supabase/types.d.ts +518 -0
  9. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  10. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts +4 -3
  11. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts.map +1 -1
  12. package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +13 -15
  13. package/dist-lib/lib/floridayDocuments.functions.d.ts +1548 -0
  14. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  15. package/dist-lib/lib/handlers/index.d.ts +2 -0
  16. package/dist-lib/lib/handlers/index.d.ts.map +1 -0
  17. package/dist-lib/lib/handlers/index.js +4 -0
  18. package/dist-lib/lib/handlers/logistics-tick.server.d.ts +3 -0
  19. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -0
  20. package/dist-lib/lib/handlers/logistics-tick.server.js +54 -0
  21. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +2615 -50
  22. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  23. package/dist-lib/lib/loadCarrierPlanning.functions.js +13 -8
  24. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +7 -6
  25. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  26. package/dist-lib/lib/loadCarrierPlanning.server.js +31 -33
  27. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts +2 -1
  28. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts.map +1 -1
  29. package/dist-lib/lib/loadCarrierTaskSync.server.js +4 -6
  30. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +1032 -0
  31. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -2
  33. package/dist-lib/lib/logisticsRecalcJob.server.d.ts +6 -5
  34. package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
  35. package/dist-lib/lib/logisticsRecalcJob.server.js +17 -19
  36. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +516 -0
  37. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  38. package/dist-lib/lib/modulePrompts.js +911 -911
  39. package/package.json +18 -3
@@ -12,14 +12,15 @@ export const replanOrderLoadCarriers = createServerFn({ method: "POST" })
12
12
  return data;
13
13
  })
14
14
  .handler(async ({ data }) => {
15
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
15
16
  const { replanOrderInternal } = await import("./loadCarrierPlanning.server");
16
17
  const { attachIndelingToTasks } = await import("./loadCarrierTaskSync.server");
17
- const result = await replanOrderInternal(data.orderId, {
18
+ const result = await replanOrderInternal(supabaseAdmin, data.orderId, {
18
19
  dryRun: data.dryRun,
19
20
  carrierType: data.carrierType ?? null,
20
21
  });
21
22
  if (result && !data.dryRun)
22
- await attachIndelingToTasks(result);
23
+ await attachIndelingToTasks(supabaseAdmin, result);
23
24
  return result;
24
25
  });
25
26
  export const replanBufferLoadCarriers = createServerFn({ method: "POST" })
@@ -31,14 +32,15 @@ export const replanBufferLoadCarriers = createServerFn({ method: "POST" })
31
32
  return data;
32
33
  })
33
34
  .handler(async ({ data }) => {
35
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
34
36
  const { replanBufferInternal } = await import("./loadCarrierPlanning.server");
35
37
  const { attachIndelingToTasks } = await import("./loadCarrierTaskSync.server");
36
- const result = await replanBufferInternal(data.bufferId, {
38
+ const result = await replanBufferInternal(supabaseAdmin, data.bufferId, {
37
39
  dryRun: data.dryRun,
38
40
  carrierType: data.carrierType ?? null,
39
41
  });
40
42
  if (!data.dryRun)
41
- await attachIndelingToTasks(result);
43
+ await attachIndelingToTasks(supabaseAdmin, result);
42
44
  return result;
43
45
  });
44
46
  /**
@@ -49,12 +51,13 @@ export const planAllLoadCarriers = createServerFn({ method: "POST" })
49
51
  .middleware([requireSupabaseAuth])
50
52
  .inputValidator((data) => data ?? {})
51
53
  .handler(async ({ data }) => {
54
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
52
55
  const { planBuffersBatch, planLooseOrdersBatch } = await import("./bulkLoadCarrierPlanning.server");
53
56
  const limit = Math.min(Math.max(Number(data.limit ?? 20), 1), 50);
54
57
  const cursor = data.cursor ?? null;
55
58
  if (data.phase === "orders")
56
- return planLooseOrdersBatch(cursor, limit);
57
- return planBuffersBatch(cursor, limit);
59
+ return planLooseOrdersBatch(supabaseAdmin, cursor, limit);
60
+ return planBuffersBatch(supabaseAdmin, cursor, limit);
58
61
  });
59
62
  /**
60
63
  * Zet voor orders zonder takenketen alsnog een melding klaar, zodat de Engine
@@ -64,9 +67,10 @@ export const ensureLogisticsTasks = createServerFn({ method: "POST" })
64
67
  .middleware([requireSupabaseAuth])
65
68
  .inputValidator((data) => data ?? {})
66
69
  .handler(async ({ data, context }) => {
70
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
67
71
  const { findOrdersWithoutTasks } = await import("./bulkLoadCarrierPlanning.server");
68
72
  const limit = Math.min(Math.max(Number(data.limit ?? 50), 1), 200);
69
- const orders = await findOrdersWithoutTasks(limit);
73
+ const orders = await findOrdersWithoutTasks(supabaseAdmin, limit);
70
74
  let created = 0;
71
75
  const errors = [];
72
76
  for (const order of orders) {
@@ -101,6 +105,7 @@ export const previewLoadCarrierPlan = createServerFn({ method: "POST" })
101
105
  return data;
102
106
  })
103
107
  .handler(async ({ data }) => {
108
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
104
109
  const { replanOrderInternal } = await import("./loadCarrierPlanning.server");
105
- return replanOrderInternal(data.orderId, { dryRun: true, carrierType: data.carrierType ?? null });
110
+ return replanOrderInternal(supabaseAdmin, data.orderId, { dryRun: true, carrierType: data.carrierType ?? null });
106
111
  });
@@ -1,3 +1,4 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
1
2
  import { type CarrierProfile, type PlannedLoadUnit, type PlannerInputItem } from "./loadCarrierPlanner";
2
3
  import { type LoadCarrierTypeRow } from "./loadCarrierTypes";
3
4
  export declare function buildBufferKey(order: {
@@ -10,9 +11,9 @@ export declare function buildBufferKey(order: {
10
11
  pickupDate: string;
11
12
  location: string;
12
13
  };
13
- export declare function resolveBufferForOrderInternal(orderId: string): Promise<string | null>;
14
- export declare function expandOrderItemsForPlanner(rows: Array<Record<string, any>>): Promise<PlannerInputItem[]>;
15
- export declare function loadCarrierProfiles(): Promise<LoadCarrierTypeRow[]>;
14
+ export declare function resolveBufferForOrderInternal(sb: SupabaseClient, orderId: string): Promise<string | null>;
15
+ export declare function expandOrderItemsForPlanner(sb: SupabaseClient, rows: Array<Record<string, any>>): Promise<PlannerInputItem[]>;
16
+ export declare function loadCarrierProfiles(sb: SupabaseClient): Promise<LoadCarrierTypeRow[]>;
16
17
  export interface BeladingRules {
17
18
  maxOrders: number | null;
18
19
  maxCustomers: number | null;
@@ -21,7 +22,7 @@ export interface BeladingRules {
21
22
  optimalFill: boolean;
22
23
  }
23
24
  /** Leest de actieve werkwijze en vertaalt "2. Beladingindeling" naar plannergrenzen. */
24
- export declare function loadBeladingRules(): Promise<BeladingRules | null>;
25
+ export declare function loadBeladingRules(sb: SupabaseClient): Promise<BeladingRules | null>;
25
26
  /** Past de grenzen uit de werkwijze toe op het capaciteitsprofiel van een ladingdrager. */
26
27
  export declare function applyRulesToProfile(profile: CarrierProfile, rules: BeladingRules | null): CarrierProfile;
27
28
  export interface ReplanResult {
@@ -41,6 +42,6 @@ export interface ReplanOptions {
41
42
  /** Overschrijf het ladingdragertype dat de Rule Engine zou kiezen. */
42
43
  carrierType?: string | null;
43
44
  }
44
- export declare function replanBufferInternal(bufferId: string, options?: ReplanOptions): Promise<ReplanResult>;
45
- export declare function replanOrderInternal(orderId: string, options?: ReplanOptions): Promise<ReplanResult | null>;
45
+ export declare function replanBufferInternal(sb: SupabaseClient, bufferId: string, options?: ReplanOptions): Promise<ReplanResult>;
46
+ export declare function replanOrderInternal(sb: SupabaseClient, orderId: string, options?: ReplanOptions): Promise<ReplanResult | null>;
46
47
  //# sourceMappingURL=loadCarrierPlanning.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAkCrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,GAAG,CAAA;CAAE,EACtG,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqCvD;AAID,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmE3F;AAgBD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0H7B;AAMD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAOzE;AAUD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAOD,wFAAwF;AACxF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsBvE;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,cAAc,CAaxG;AAWD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0OvB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAI9B"}
1
+ {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAiCrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,GAAG,CAAA;CAAE,EACtG,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqCvD;AAID,wBAAsB,6BAA6B,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmE/G;AAgBD,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC/B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0H7B;AAMD,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAO3F;AAUD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAOD,wFAAwF;AACxF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsBzF;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,cAAc,CAaxG;AAWD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0OvB;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAI9B"}
@@ -5,10 +5,8 @@
5
5
  // draait de pure planner per ladingdragertype en schrijft het resultaat weg
6
6
  // naar order_carts / order_cart_items.
7
7
  // ============================================================================
8
- import { supabaseAdmin } from "../integrations/supabase/client.server";
9
8
  import { planLoadUnits, LOAD_CARRIER_PLANNER_VERSION, } from "./loadCarrierPlanner";
10
9
  import { fallbackCarrierProfile } from "./loadCarrierTypes";
11
- const db = () => supabaseAdmin;
12
10
  // ---------------------------------------------------------------------------
13
11
  // Buffer
14
12
  // ---------------------------------------------------------------------------
@@ -63,15 +61,15 @@ export function buildBufferKey(order, mode) {
63
61
  return { key, pickupDate, location };
64
62
  }
65
63
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
66
- export async function resolveBufferForOrderInternal(orderId) {
67
- const { data: order } = await db()
64
+ export async function resolveBufferForOrderInternal(sb, orderId) {
65
+ const { data: order } = await sb
68
66
  .from("orders")
69
67
  .select("id, customer_id, delivery_date, custom_fields, buffer_id")
70
68
  .eq("id", orderId)
71
69
  .maybeSingle();
72
70
  if (!order)
73
71
  return null;
74
- const { data: settings } = await db()
72
+ const { data: settings } = await sb
75
73
  .from("cart_planning_settings")
76
74
  .select("buffer_grouping_mode")
77
75
  .eq("id", 1)
@@ -80,7 +78,7 @@ export async function resolveBufferForOrderInternal(orderId) {
80
78
  const cf = { ...(order.custom_fields ?? {}) };
81
79
  const locId = cf.delivery_location_id;
82
80
  if (typeof locId === "string" && UUID_RE.test(locId) && !cf.delivery_location_gln) {
83
- const { data: loc } = await db()
81
+ const { data: loc } = await sb
84
82
  .from("customer_delivery_locations")
85
83
  .select("gln, name")
86
84
  .eq("id", locId)
@@ -92,7 +90,7 @@ export async function resolveBufferForOrderInternal(orderId) {
92
90
  }
93
91
  const { key, pickupDate, location } = buildBufferKey({ ...order, custom_fields: cf }, mode);
94
92
  let bufferId = null;
95
- const { data: existing } = await db()
93
+ const { data: existing } = await sb
96
94
  .from("order_buffers")
97
95
  .select("id")
98
96
  .eq("buffer_key", key)
@@ -101,7 +99,7 @@ export async function resolveBufferForOrderInternal(orderId) {
101
99
  bufferId = existing.id;
102
100
  }
103
101
  else {
104
- const { data: inserted, error } = await db()
102
+ const { data: inserted, error } = await sb
105
103
  .from("order_buffers")
106
104
  .insert({
107
105
  buffer_key: key,
@@ -114,7 +112,7 @@ export async function resolveBufferForOrderInternal(orderId) {
114
112
  .single();
115
113
  if (error) {
116
114
  // Race: iemand anders maakte dezelfde buffer aan.
117
- const { data: retry } = await db()
115
+ const { data: retry } = await sb
118
116
  .from("order_buffers")
119
117
  .select("id")
120
118
  .eq("buffer_key", key)
@@ -126,21 +124,21 @@ export async function resolveBufferForOrderInternal(orderId) {
126
124
  }
127
125
  }
128
126
  if (bufferId && order.buffer_id !== bufferId) {
129
- await db().from("orders").update({ buffer_id: bufferId }).eq("id", orderId);
127
+ await sb.from("orders").update({ buffer_id: bufferId }).eq("id", orderId);
130
128
  }
131
129
  return bufferId;
132
130
  }
133
131
  function isDefaultBelading(b) {
134
132
  return b.plants_per_crate === 1 && b.crates_per_layer === 1 && b.layers_per_cart === 1;
135
133
  }
136
- export async function expandOrderItemsForPlanner(rows) {
134
+ export async function expandOrderItemsForPlanner(sb, rows) {
137
135
  const out = [];
138
136
  const groupIds = rows
139
137
  .map((r) => r.product_id)
140
138
  .filter((id) => typeof id === "string" && UUID_RE.test(id));
141
139
  let groupSet = new Set();
142
140
  if (groupIds.length > 0) {
143
- const { data: groups } = await db().from("product_groups").select("id").in("id", groupIds);
141
+ const { data: groups } = await sb.from("product_groups").select("id").in("id", groupIds);
144
142
  groupSet = new Set((groups ?? []).map((g) => g.id));
145
143
  }
146
144
  for (const row of rows) {
@@ -165,7 +163,7 @@ export async function expandOrderItemsForPlanner(rows) {
165
163
  });
166
164
  continue;
167
165
  }
168
- const { data: members } = await db()
166
+ const { data: members } = await sb
169
167
  .from("product_group_items")
170
168
  .select("trade_item_id, quantity, sort_order")
171
169
  .eq("product_group_id", row.product_id)
@@ -185,7 +183,7 @@ export async function expandOrderItemsForPlanner(rows) {
185
183
  continue;
186
184
  }
187
185
  const tradeIds = memberList.map((m) => String(m.trade_item_id));
188
- const { data: prods } = await db()
186
+ const { data: prods } = await sb
189
187
  .from("products")
190
188
  .select("id, product, plants_per_crate, crates_per_layer, layers_per_cart, weight, floriday_trade_item_id")
191
189
  .or(tradeIds.map((t) => `floriday_trade_item_id.eq.${t}`).join(","));
@@ -248,8 +246,8 @@ export async function expandOrderItemsForPlanner(rows) {
248
246
  // ---------------------------------------------------------------------------
249
247
  // Ladingdragertypen
250
248
  // ---------------------------------------------------------------------------
251
- export async function loadCarrierProfiles() {
252
- const { data } = await db()
249
+ export async function loadCarrierProfiles(sb) {
250
+ const { data } = await sb
253
251
  .from("load_carrier_types")
254
252
  .select("*")
255
253
  .eq("is_active", true)
@@ -264,8 +262,8 @@ const numOrNull = (v) => {
264
262
  return Number.isFinite(n) && n > 0 ? Math.round(n) : null;
265
263
  };
266
264
  /** Leest de actieve werkwijze en vertaalt "2. Beladingindeling" naar plannergrenzen. */
267
- export async function loadBeladingRules() {
268
- const { data } = await db()
265
+ export async function loadBeladingRules(sb) {
266
+ const { data } = await sb
269
267
  .from("logistics_rule_configs")
270
268
  .select("settings")
271
269
  .eq("is_active", true)
@@ -305,9 +303,9 @@ export function applyRulesToProfile(profile, rules) {
305
303
  // ---------------------------------------------------------------------------
306
304
  /** Maximaal aantal ladingdragers dat één orderbuffer mag opleveren. */
307
305
  const MAX_CARTS_PER_BUFFER = 500;
308
- export async function replanBufferInternal(bufferId, options = {}) {
306
+ export async function replanBufferInternal(sb, bufferId, options = {}) {
309
307
  const warnings = [];
310
- const { data: orders } = await db()
308
+ const { data: orders } = await sb
311
309
  .from("orders")
312
310
  .select("id, customer_id, custom_fields, plan_locked_at")
313
311
  .eq("buffer_id", bufferId)
@@ -327,7 +325,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
327
325
  };
328
326
  }
329
327
  const idList = orderIds.length > 0 ? orderIds : ["00000000-0000-0000-0000-000000000000"];
330
- const { data: items } = await db()
328
+ const { data: items } = await sb
331
329
  .from("order_items")
332
330
  .select("id, order_id, product_id, product_name, quantity, plants_per_crate, crates_per_layer, layers_per_cart, " +
333
331
  "products(plants_per_crate, crates_per_layer, layers_per_cart, weight)")
@@ -337,25 +335,25 @@ export async function replanBufferInternal(bufferId, options = {}) {
337
335
  ...it,
338
336
  customer_id: customerByOrder.get(it.order_id) ?? null,
339
337
  }));
340
- const inputs = await expandOrderItemsForPlanner(rawRows);
338
+ const inputs = await expandOrderItemsForPlanner(sb, rawRows);
341
339
  const itemToOrder = new Map();
342
340
  for (const i of inputs)
343
341
  if (i.order_id)
344
342
  itemToOrder.set(i.order_item_id, i.order_id);
345
343
  // Bestaande beladingen tellen en wissen.
346
- const { data: existingCarts } = await db()
344
+ const { data: existingCarts } = await sb
347
345
  .from("order_carts")
348
346
  .select("id, source")
349
347
  .eq("buffer_id", bufferId);
350
348
  const replacedManualCount = (existingCarts ?? []).filter((c) => c.source === "manual").length;
351
349
  // Instellingen + never-mix.
352
- const { data: settings } = await db().from("cart_planning_settings").select("*").eq("id", 1).maybeSingle();
353
- const { data: overrides } = await db()
350
+ const { data: settings } = await sb.from("cart_planning_settings").select("*").eq("id", 1).maybeSingle();
351
+ const { data: overrides } = await sb
354
352
  .from("cart_planning_product_overrides")
355
353
  .select("product_id, never_mix");
356
354
  const neverMix = new Set((overrides ?? []).filter((o) => o.never_mix && o.product_id).map((o) => String(o.product_id)));
357
- const profiles = await loadCarrierProfiles();
358
- const rules = await loadBeladingRules();
355
+ const profiles = await loadCarrierProfiles(sb);
356
+ const rules = await loadBeladingRules(sb);
359
357
  const defaultProfile = profiles.find((p) => p.is_default) ?? profileFor(profiles, "trolley");
360
358
  let plannedCarts = [];
361
359
  let usedFloridayPacking = false;
@@ -427,7 +425,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
427
425
  carts: plannedCarts,
428
426
  };
429
427
  }
430
- await db().from("order_carts").delete().eq("buffer_id", bufferId);
428
+ await sb.from("order_carts").delete().eq("buffer_id", bufferId);
431
429
  // In blokken wegschrijven: per ladingdrager een aparte insert is bij grote
432
430
  // orders veel te traag.
433
431
  let created = 0;
@@ -457,7 +455,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
457
455
  algorithm_version: LOAD_CARRIER_PLANNER_VERSION,
458
456
  };
459
457
  });
460
- const { data: insertedCarts, error } = await db()
458
+ const { data: insertedCarts, error } = await sb
461
459
  .from("order_carts")
462
460
  .insert(cartRows)
463
461
  .select("id, cart_number");
@@ -493,7 +491,7 @@ export async function replanBufferInternal(bufferId, options = {}) {
493
491
  for (let s = 0; s < itemRows.length; s += 500) {
494
492
  const slice = itemRows.slice(s, s + 500);
495
493
  if (slice.length > 0)
496
- await db().from("order_cart_items").insert(slice);
494
+ await sb.from("order_cart_items").insert(slice);
497
495
  }
498
496
  }
499
497
  return {
@@ -507,9 +505,9 @@ export async function replanBufferInternal(bufferId, options = {}) {
507
505
  carts: plannedCarts,
508
506
  };
509
507
  }
510
- export async function replanOrderInternal(orderId, options = {}) {
511
- const bufferId = await resolveBufferForOrderInternal(orderId);
508
+ export async function replanOrderInternal(sb, orderId, options = {}) {
509
+ const bufferId = await resolveBufferForOrderInternal(sb, orderId);
512
510
  if (!bufferId)
513
511
  return null;
514
- return replanBufferInternal(bufferId, options);
512
+ return replanBufferInternal(sb, bufferId, options);
515
513
  }
@@ -1,3 +1,4 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
1
2
  import type { ReplanResult } from "./loadCarrierPlanning.server";
2
- export declare function attachIndelingToTasks(result: ReplanResult | null): Promise<number>;
3
+ export declare function attachIndelingToTasks(sb: SupabaseClient, result: ReplanResult | null): Promise<number>;
3
4
  //# sourceMappingURL=loadCarrierTaskSync.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadCarrierTaskSync.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierTaskSync.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAKjE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CxF"}
1
+ {"version":3,"file":"loadCarrierTaskSync.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierTaskSync.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,YAAY,GAAG,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
@@ -4,23 +4,21 @@
4
4
  // Zet het indelingsresultaat in de payload van de openstaande load.compose
5
5
  // taken, zodat de Afhandeling-module niets meer zelf hoeft te berekenen.
6
6
  // ============================================================================
7
- import { supabaseAdmin } from "../integrations/supabase/client.server";
8
- const db = () => supabaseAdmin;
9
7
  const OPEN_STATUSES = ["planned", "ready", "in_progress"];
10
- export async function attachIndelingToTasks(result) {
8
+ export async function attachIndelingToTasks(sb, result) {
11
9
  if (!result || result.skipped === "locked")
12
10
  return 0;
13
11
  const carts = Array.isArray(result.carts) ? result.carts : [];
14
12
  if (result.orderIds.length === 0)
15
13
  return 0;
16
- const { data: orders } = await db()
14
+ const { data: orders } = await sb
17
15
  .from("orders")
18
16
  .select("id, order_number")
19
17
  .in("id", result.orderIds);
20
18
  const refs = (orders ?? []).map((o) => o.order_number).filter(Boolean);
21
19
  if (refs.length === 0)
22
20
  return 0;
23
- const { data: tasks } = await db()
21
+ const { data: tasks } = await sb
24
22
  .from("logistics_tasks")
25
23
  .select("id, payload, order_ref")
26
24
  .eq("task_type", "load.compose")
@@ -48,7 +46,7 @@ export async function attachIndelingToTasks(result) {
48
46
  }));
49
47
  payload.indelingWarnings = result.warnings;
50
48
  payload.indelingSource = "logistics-engine";
51
- const { error } = await db().from("logistics_tasks").update({ payload }).eq("id", task.id);
49
+ const { error } = await sb.from("logistics_tasks").update({ payload }).eq("id", task.id);
52
50
  if (!error)
53
51
  updated++;
54
52
  }