@flowselections/floriday-verkoop-module 1.0.77 → 1.0.82

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 (90) hide show
  1. package/dist-lib/components/verkoop/CreateOrderPage.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/CreateOrderPage.js +33 -8
  3. package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts.map +1 -1
  4. package/dist-lib/components/verkoop/EditLocalOrderDialog.js +1 -1
  5. package/dist-lib/components/verkoop/FloridayStageLine.d.ts +15 -0
  6. package/dist-lib/components/verkoop/FloridayStageLine.d.ts.map +1 -0
  7. package/dist-lib/components/verkoop/FloridayStageLine.js +25 -0
  8. package/dist-lib/components/verkoop/PlanCoverageBadge.d.ts +1 -1
  9. package/dist-lib/components/verkoop/PlanCoverageBadge.d.ts.map +1 -1
  10. package/dist-lib/components/verkoop/PlanCoverageBadge.js +5 -2
  11. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
  12. package/dist-lib/components/verkoop/SalesOrderDetailPage.js +1 -1
  13. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  14. package/dist-lib/components/verkoop/SalesOrderDetailView.js +38 -6
  15. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  16. package/dist-lib/components/verkoop/SalesOrdersTable.js +4 -8
  17. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  18. package/dist-lib/components/verkoop/VerkoopOrdersPage.js +7 -1
  19. package/dist-lib/integrations/supabase/types.d.ts +1486 -2
  20. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/types.js +1 -0
  22. package/dist-lib/lib/belading.server.d.ts +0 -11
  23. package/dist-lib/lib/belading.server.d.ts.map +1 -1
  24. package/dist-lib/lib/belading.server.js +4 -41
  25. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/cart-replan.functions.js +3 -22
  27. package/dist-lib/lib/central-secrets.server.d.ts +5 -0
  28. package/dist-lib/lib/central-secrets.server.d.ts.map +1 -0
  29. package/dist-lib/lib/central-secrets.server.js +65 -0
  30. package/dist-lib/lib/create-order.functions.d.ts +15 -0
  31. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/create-order.functions.js +28 -13
  33. package/dist-lib/lib/customer-name.d.ts +8 -0
  34. package/dist-lib/lib/customer-name.d.ts.map +1 -0
  35. package/dist-lib/lib/customer-name.js +9 -0
  36. package/dist-lib/lib/engine-block-alerts.d.ts +22 -0
  37. package/dist-lib/lib/engine-block-alerts.d.ts.map +1 -0
  38. package/dist-lib/lib/engine-block-alerts.js +43 -0
  39. package/dist-lib/lib/engine-block-alerts.server.d.ts +7 -0
  40. package/dist-lib/lib/engine-block-alerts.server.d.ts.map +1 -0
  41. package/dist-lib/lib/engine-block-alerts.server.js +75 -0
  42. package/dist-lib/lib/floriday-change-diff.check.d.ts +2 -0
  43. package/dist-lib/lib/floriday-change-diff.check.d.ts.map +1 -0
  44. package/dist-lib/lib/floriday-change-diff.check.js +27 -0
  45. package/dist-lib/lib/floriday-change-diff.d.ts +7 -0
  46. package/dist-lib/lib/floriday-change-diff.d.ts.map +1 -0
  47. package/dist-lib/lib/floriday-change-diff.js +51 -0
  48. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/floriday-mirror.functions.js +38 -39
  50. package/dist-lib/lib/floriday-status.d.ts +48 -0
  51. package/dist-lib/lib/floriday-status.d.ts.map +1 -0
  52. package/dist-lib/lib/floriday-status.js +99 -0
  53. package/dist-lib/lib/floriday-status.server.d.ts +7 -0
  54. package/dist-lib/lib/floriday-status.server.d.ts.map +1 -0
  55. package/dist-lib/lib/floriday-status.server.js +74 -0
  56. package/dist-lib/lib/load-carriers.server.d.ts +1 -1
  57. package/dist-lib/lib/load-carriers.server.d.ts.map +1 -1
  58. package/dist-lib/lib/load-carriers.server.js +3 -6
  59. package/dist-lib/lib/logistics-engine.server.d.ts.map +1 -1
  60. package/dist-lib/lib/logistics-engine.server.js +2 -22
  61. package/dist-lib/lib/order-block-mail.server.d.ts.map +1 -1
  62. package/dist-lib/lib/order-block-mail.server.js +31 -15
  63. package/dist-lib/lib/order-cancel.server.d.ts +9 -0
  64. package/dist-lib/lib/order-cancel.server.d.ts.map +1 -1
  65. package/dist-lib/lib/order-cancel.server.js +90 -0
  66. package/dist-lib/lib/plan-coverage.check.d.ts +2 -0
  67. package/dist-lib/lib/plan-coverage.check.d.ts.map +1 -0
  68. package/dist-lib/lib/plan-coverage.check.js +17 -0
  69. package/dist-lib/lib/plan-coverage.d.ts +12 -0
  70. package/dist-lib/lib/plan-coverage.d.ts.map +1 -1
  71. package/dist-lib/lib/plan-coverage.js +27 -1
  72. package/dist-lib/lib/plan-coverage.server.d.ts.map +1 -1
  73. package/dist-lib/lib/plan-coverage.server.js +20 -13
  74. package/dist-lib/lib/review-dismissals.server.d.ts +3 -0
  75. package/dist-lib/lib/review-dismissals.server.d.ts.map +1 -0
  76. package/dist-lib/lib/review-dismissals.server.js +26 -0
  77. package/dist-lib/lib/salesorders-list.functions.d.ts +1 -1
  78. package/dist-lib/lib/salesorders-list.functions.js +1 -1
  79. package/dist-lib/lib/salesorders-list.server.d.ts +1 -1
  80. package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
  81. package/dist-lib/lib/salesorders-list.server.js +104 -3
  82. package/dist-lib/lib/salesorders-mapping.d.ts +17 -0
  83. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  84. package/dist-lib/lib/salesorders-mapping.js +1 -0
  85. package/dist-lib/lib/salesorders.functions.d.ts +1 -5
  86. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  87. package/dist-lib/lib/salesorders.functions.js +32 -2
  88. package/dist-lib/lib/useSalesOrdersQuery.d.ts +1 -1
  89. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  90. package/package.json +5 -5
@@ -128,3 +128,93 @@ export async function cancelLocalOrderInternal(input) {
128
128
  }
129
129
  return { ok: true, alreadyCancelled: false, reversedKeys };
130
130
  }
131
+ export const FLORIDAY_CANCEL_REASON = "Koper heeft geannuleerd in Floriday";
132
+ export const FLORIDAY_CANCEL_PICKED_MESSAGE = "Koper heeft geannuleerd in Floriday, order is al gepickt";
133
+ /**
134
+ * Annulering uit Floriday (op order-id). Nog niet gepickt/gescand → order
135
+ * annuleren (voorraad terug, uit herplanning en buffer, Engine melden).
136
+ * Al gepickt/gescand, of pickstand onbekend → niet annuleren, wel een duidelijke
137
+ * melding voor handmatige beoordeling. Schrijft nooit order_carts (Engine).
138
+ */
139
+ export async function handleFloridayCancellation(orderId) {
140
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
141
+ const { data: order, error } = await supabaseAdmin
142
+ .from("orders")
143
+ .select("id, status, plan_locked_at, custom_fields, order_source")
144
+ .eq("id", orderId)
145
+ .maybeSingle();
146
+ if (error)
147
+ throw new Error(error.message);
148
+ if (!order)
149
+ throw new Error("Bestelling niet gevonden");
150
+ const o = order;
151
+ const cf = (o.custom_fields ?? {});
152
+ const status = String(o.status ?? "").toLowerCase();
153
+ if (status === CANCELLED_STATUS)
154
+ return "already_cancelled";
155
+ // Pickstand alleen uit de Engine; fail closed.
156
+ let picked = null;
157
+ try {
158
+ const { loadPlanCoverage } = await import("./plan-coverage.server");
159
+ const cov = (await loadPlanCoverage(supabaseAdmin, [orderId], "detail")).get(orderId);
160
+ if (cov && cov.state !== "onbekend") {
161
+ picked =
162
+ cov.pickStatus === "bezig" ||
163
+ cov.pickStatus === "gepickt" ||
164
+ cov.pickRows.some((r) => !!r.printedAt || !!r.completedAt);
165
+ }
166
+ }
167
+ catch {
168
+ picked = null;
169
+ }
170
+ const lockedOrShipped = Boolean(o.plan_locked_at) || ["verzonden", "shipped", "geleverd", "delivered"].includes(status);
171
+ if (lockedOrShipped)
172
+ picked = true;
173
+ if (picked !== false) {
174
+ const reason = picked === true
175
+ ? FLORIDAY_CANCEL_PICKED_MESSAGE
176
+ : `${FLORIDAY_CANCEL_REASON}; pickstand onbekend bij de Logistiek Engine — niet geannuleerd`;
177
+ await supabaseAdmin.from("orders")
178
+ .update({
179
+ custom_fields: {
180
+ ...cf,
181
+ needs_manual_review: true,
182
+ manual_review_source: "floriday_cancel",
183
+ manual_review_reason: reason,
184
+ floriday_change_detected_at: new Date().toISOString(),
185
+ },
186
+ updated_at: new Date().toISOString(),
187
+ })
188
+ .eq("id", orderId);
189
+ return picked === true ? "already_picked" : "pick_unknown";
190
+ }
191
+ const src = String(cf?.source ?? o.order_source ?? "floriday").toLowerCase();
192
+ await reverseOrderStockMutations(orderId, { orderSource: src, reason: `Bestelling geannuleerd — ${FLORIDAY_CANCEL_REASON}` });
193
+ await supabaseAdmin.from("cart_replan_queue").delete().eq("order_id", orderId);
194
+ const { error: uErr } = await supabaseAdmin.from("orders")
195
+ .update({
196
+ status: CANCELLED_STATUS,
197
+ cancelled_at: new Date().toISOString(),
198
+ cancel_reason: FLORIDAY_CANCEL_REASON,
199
+ invoice_due_at: null,
200
+ buffer_id: null,
201
+ status_sync_token: globalThis.crypto.randomUUID(),
202
+ custom_fields: {
203
+ ...cf,
204
+ floriday_cancelled_at: new Date().toISOString(),
205
+ floriday_cancel_notice: FLORIDAY_CANCEL_REASON,
206
+ },
207
+ })
208
+ .eq("id", orderId);
209
+ if (uErr)
210
+ throw new Error(`Annuleren faalde: ${uErr.message}`);
211
+ try {
212
+ const { notifyEngineOrder } = await import("./logistics-engine.server");
213
+ await notifyEngineOrder(orderId, "order.changed");
214
+ }
215
+ catch (err) {
216
+ console.warn("[floriday-cancel] engine-event faalde:", err);
217
+ }
218
+ console.info(`[floriday-cancel] order ${orderId} geannuleerd: ${FLORIDAY_CANCEL_REASON}`);
219
+ return "cancelled";
220
+ }
@@ -0,0 +1,2 @@
1
+ export declare function runPlanCoverageChecks(): number;
2
+ //# sourceMappingURL=plan-coverage.check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-coverage.check.d.ts","sourceRoot":"","sources":["../../src/lib/plan-coverage.check.ts"],"names":[],"mappings":"AAQA,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C"}
@@ -0,0 +1,17 @@
1
+ // Test (draait mee in de typecontrole én als script: `bun src/lib/plan-coverage.check.ts`).
2
+ // Ontbrekende tellingen moeten "onbekend" tonen, nooit "0".
3
+ import { coverageDetailText, parsePlanCoverageListRow, summarize } from "./plan-coverage";
4
+ function eq(actual, expected, name) {
5
+ if (actual !== expected)
6
+ throw new Error(`${name}: verwacht "${expected}", kreeg "${actual}"`);
7
+ }
8
+ export function runPlanCoverageChecks() {
9
+ const base = { order_id: "x", state: "ingedeeld", label: "Ingedeeld" };
10
+ eq(coverageDetailText(summarize(parsePlanCoverageListRow(base))), "Karren: onbekend · Pickrijen: onbekend · Pickstand: onbekend", "afwezig");
11
+ eq(coverageDetailText(summarize(parsePlanCoverageListRow({ ...base, cart_count: null, pick_row_count: null, pick_status: null }))), "Karren: onbekend · Pickrijen: onbekend · Pickstand: onbekend", "null");
12
+ eq(coverageDetailText(summarize(parsePlanCoverageListRow({ ...base, cart_count: 0, pick_row_count: 2, pick_status: "open" }))), "Karren: 0 · Pickrijen: 2 · Pickstand: open", "echte waarden");
13
+ return 3;
14
+ }
15
+ if (typeof process !== "undefined" && process.argv?.[1]?.endsWith("plan-coverage.check.ts")) {
16
+ console.log(`plan-coverage: ${runPlanCoverageChecks()} tests geslaagd`);
17
+ }
@@ -34,6 +34,12 @@ export interface PlanCoverage {
34
34
  cartCount?: number | null;
35
35
  /** Alleen uit de lijstversie: order staat in een buffer (gedeelde kar). */
36
36
  shared?: boolean | null;
37
+ /** Alleen uit de lijstversie: aantal pickrijen volgens de Engine (null = onbekend). */
38
+ pickRowCount?: number | null;
39
+ /** Alleen uit de lijstversie: buffer-id van de Engine (ter informatie). */
40
+ bufferId?: string | null;
41
+ /** Alleen uit de lijstversie: ordernummer (ter informatie; match blijft op order_id). */
42
+ orderNumber?: string | null;
37
43
  /** Gezet als de Engine-vraag mislukte (fail closed: niets geschreven). */
38
44
  error?: string | null;
39
45
  }
@@ -50,7 +56,13 @@ export interface PlanCoverageSummary {
50
56
  progressPct: number | null;
51
57
  reason: string | null;
52
58
  shared: boolean;
59
+ /** null = onbekend (nooit als 0 tonen). */
60
+ cartCount?: number | null;
61
+ pickRowCount?: number | null;
62
+ pickStatus?: PlanCoverage["pickStatus"];
53
63
  }
54
64
  export declare function summarize(c: PlanCoverage): PlanCoverageSummary;
65
+ /** Tooltiptekst voor de badge; ontbrekende waarden worden "onbekend", nooit "0". */
66
+ export declare function coverageDetailText(c: Pick<PlanCoverageSummary, "cartCount" | "pickRowCount" | "pickStatus">): string;
55
67
  export declare function mergeSummaries(list: (PlanCoverageSummary | null | undefined)[]): PlanCoverageSummary | null;
56
68
  //# sourceMappingURL=plan-coverage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-coverage.d.ts","sourceRoot":"","sources":["../../src/lib/plan-coverage.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,OAAO,GAAG,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;AAErG,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,UAAU,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACjE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAYD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAa7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAY3D;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAsC5D;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAgB7D;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAUD,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAQ9D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,mBAAmB,GAAG,IAAI,CAK3G"}
1
+ {"version":3,"file":"plan-coverage.d.ts","sourceRoot":"","sources":["../../src/lib/plan-coverage.ts"],"names":[],"mappings":"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"}
@@ -91,6 +91,9 @@ export function parsePlanCoverageListRow(r) {
91
91
  pickStatus: PICK.includes(r.pick_status) ? r.pick_status : null,
92
92
  pickedAt: str(r.picked_at),
93
93
  cartCount: num(r.cart_count),
94
+ pickRowCount: num(r.pick_row_count),
95
+ bufferId: str(r.buffer_id),
96
+ orderNumber: str(r.order_number),
94
97
  shared: str(r.buffer_id) != null,
95
98
  error: state === "onbekend" ? "Onbekende indelingsstatus van de Engine" : null,
96
99
  };
@@ -109,12 +112,35 @@ export function summarize(c) {
109
112
  progressPct: c.progressPct,
110
113
  reason: c.reason ?? c.error ?? null,
111
114
  shared: Boolean(c.shared) || c.carts.some((k) => k.shared),
115
+ // Lijstversie geeft tellingen; details hebben de volledige karren/pickrijen.
116
+ cartCount: c.cartCount !== undefined ? c.cartCount : c.state === "onbekend" ? null : c.carts.length,
117
+ pickRowCount: c.pickRowCount !== undefined ? c.pickRowCount : c.state === "onbekend" ? null : c.pickRows.length,
118
+ pickStatus: c.pickStatus,
112
119
  };
113
120
  }
121
+ const PICK_LABEL = {
122
+ geen_pickrij: "geen pickrij",
123
+ open: "open",
124
+ bezig: "bezig",
125
+ gepickt: "gepickt",
126
+ };
127
+ /** Tooltiptekst voor de badge; ontbrekende waarden worden "onbekend", nooit "0". */
128
+ export function coverageDetailText(c) {
129
+ const n = (v) => (typeof v === "number" && Number.isFinite(v) ? String(v) : "onbekend");
130
+ const ps = c.pickStatus ? (PICK_LABEL[c.pickStatus] ?? "onbekend") : "onbekend";
131
+ return `Karren: ${n(c.cartCount)} · Pickrijen: ${n(c.pickRowCount)} · Pickstand: ${ps}`;
132
+ }
114
133
  export function mergeSummaries(list) {
115
134
  const xs = list.filter((x) => !!x);
116
135
  if (!xs.length)
117
136
  return null;
118
137
  const worst = [...xs].sort((a, b) => RANK[a.state] - RANK[b.state])[0];
119
- return { ...worst, shared: xs.some((x) => x.shared) };
138
+ const sumOrNull = (k) => xs.every((x) => typeof x[k] === "number") ? xs.reduce((a, x) => a + x[k], 0) : null;
139
+ return {
140
+ ...worst,
141
+ shared: xs.some((x) => x.shared),
142
+ cartCount: sumOrNull("cartCount"),
143
+ pickRowCount: sumOrNull("pickRowCount"),
144
+ pickStatus: xs.length === 1 ? xs[0].pickStatus : xs.every((x) => x.pickStatus === xs[0].pickStatus) ? xs[0].pickStatus : null,
145
+ };
120
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plan-coverage.server.d.ts","sourceRoot":"","sources":["../../src/lib/plan-coverage.server.ts"],"names":[],"mappings":"AASA,OAAO,EAAgE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAqClH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,MAAM,GAAG,QAAmB,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA6CpC"}
1
+ {"version":3,"file":"plan-coverage.server.d.ts","sourceRoot":"","sources":["../../src/lib/plan-coverage.server.ts"],"names":[],"mappings":"AASA,OAAO,EAAgE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA2ClH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE,MAAM,GAAG,QAAmB,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CA6CpC"}
@@ -12,6 +12,7 @@ const TTL_MS = 30000;
12
12
  const CONCURRENCY = 12;
13
13
  const cache = new Map(); // sleutel: mode:orderId
14
14
  let listFnMissingUntil = 0;
15
+ const LIST_CHUNK = 1000;
15
16
  const LIST_FN = "logistics_order_plan_coverage_list";
16
17
  const SINGLE_FN = "logistics_order_plan_coverage";
17
18
  function isMissingFunction(err) {
@@ -22,21 +23,27 @@ function isMissingFunction(err) {
22
23
  async function tryListVersion(supabase, ids) {
23
24
  if (Date.now() < listFnMissingUntil)
24
25
  return null;
25
- const { data, error } = await supabase.rpc(LIST_FN, { p_order_ids: ids });
26
- if (error) {
27
- if (isMissingFunction(error)) {
28
- listFnMissingUntil = Date.now() + 5 * 60000;
29
- return null;
30
- }
31
- throw new Error(error.message);
32
- }
33
26
  const out = new Map();
34
- const rows = Array.isArray(data) ? data : [];
35
- for (const r of rows) {
36
- const oid = r?.order_id ?? null;
37
- if (!oid)
27
+ // Maximaal LIST_CHUNK id's per aanroep; een mislukte portie raakt alleen die orders.
28
+ for (let i = 0; i < ids.length; i += LIST_CHUNK) {
29
+ const chunk = ids.slice(i, i + LIST_CHUNK);
30
+ const { data, error } = await supabase.rpc(LIST_FN, { p_order_ids: chunk });
31
+ if (error) {
32
+ if (isMissingFunction(error)) {
33
+ listFnMissingUntil = Date.now() + 5 * 60000;
34
+ return out.size ? out : null;
35
+ }
36
+ for (const id of chunk)
37
+ out.set(id, unknownCoverage(`Indeling niet beschikbaar: ${error.message}`));
38
38
  continue;
39
- out.set(String(oid), parsePlanCoverageListRow(r));
39
+ }
40
+ const rows = Array.isArray(data) ? data : [];
41
+ for (const r of rows) {
42
+ const oid = r?.order_id ?? null;
43
+ if (!oid)
44
+ continue;
45
+ out.set(String(oid), parsePlanCoverageListRow(r));
46
+ }
40
47
  }
41
48
  for (const id of ids)
42
49
  if (!out.has(id))
@@ -0,0 +1,3 @@
1
+ export declare function loadReviewDismissals(supabase: any, orderIds: string[]): Promise<Map<string, Set<string>>>;
2
+ export declare function isReviewDismissed(map: Map<string, Set<string>>, orderId: string, reason: string): boolean;
3
+ //# sourceMappingURL=review-dismissals.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-dismissals.server.d.ts","sourceRoot":"","sources":["../../src/lib/review-dismissals.server.ts"],"names":[],"mappings":"AAKA,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAgBnC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzG"}
@@ -0,0 +1,26 @@
1
+ // Weggehaalde beoordelingsmeldingen (order_review_dismissals). Alleen lezen.
2
+ // Een melding is alleen weg als de reden exact overeenkomt; een nieuwe, echte
3
+ // wijziging met een andere reden verschijnt dus gewoon weer.
4
+ // Fout bij lezen: melding blijft zichtbaar (fail closed).
5
+ export async function loadReviewDismissals(supabase, orderIds) {
6
+ const out = new Map();
7
+ const ids = Array.from(new Set(orderIds.filter(Boolean)));
8
+ for (let i = 0; i < ids.length; i += 300) {
9
+ const { data, error } = await supabase
10
+ .from("order_review_dismissals")
11
+ .select("order_id, review_reason")
12
+ .in("order_id", ids.slice(i, i + 300));
13
+ if (error || !Array.isArray(data))
14
+ continue;
15
+ for (const r of data) {
16
+ const k = String(r.order_id);
17
+ if (!out.has(k))
18
+ out.set(k, new Set());
19
+ out.get(k).add(String(r.review_reason ?? ""));
20
+ }
21
+ }
22
+ return out;
23
+ }
24
+ export function isReviewDismissed(map, orderId, reason) {
25
+ return map.get(orderId)?.has(reason) ?? false;
26
+ }
@@ -4,7 +4,7 @@ export declare const listSalesOrders: import("@tanstack/start-client-core").Opti
4
4
  claims: import("@supabase/auth-js").User;
5
5
  }, undefined, undefined, undefined>], (input: unknown) => {
6
6
  dateField: "ordered" | "delivery";
7
- tab: "incoming" | "topick" | "picked" | "shipped" | "cancelled" | "backlog" | "all";
7
+ tab: "incoming" | "topick" | "picked" | "shipped" | "cancelled" | "backlog" | "all" | "not_reported";
8
8
  page: number;
9
9
  pageSize: number;
10
10
  since?: string | undefined;
@@ -11,7 +11,7 @@ const listInput = z.object({
11
11
  search: z.string().optional(),
12
12
  status: z.string().optional(),
13
13
  tab: z
14
- .enum(["all", "incoming", "topick", "backlog", "picked", "shipped", "cancelled"])
14
+ .enum(["all", "incoming", "topick", "backlog", "picked", "shipped", "cancelled", "not_reported"])
15
15
  .default("all"),
16
16
  page: z.number().int().min(1).default(1),
17
17
  pageSize: z.number().int().min(1).max(200).default(20),
@@ -2,7 +2,7 @@ import type { SupabaseClient } from "@supabase/supabase-js";
2
2
  import { type SalesOrderDTO, type SalesOrdersTotals } from "./salesorders-mapping";
3
3
  import { type OrderStage } from "./order-status";
4
4
  /** "backlog" is géén status: het is een aparte weergave van "Te picken". */
5
- export type StatusTab = "all" | OrderStage | "backlog";
5
+ export type StatusTab = "all" | OrderStage | "backlog" | "not_reported";
6
6
  export interface ListParams {
7
7
  since?: string;
8
8
  until?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"salesorders-list.server.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-list.server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjF,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AA8ID,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,UAAU,EAClB,kBAAkB,GAAE,cAAyB,GAC5C,OAAO,CAAC,UAAU,CAAC,CAggCrB"}
1
+ {"version":3,"file":"salesorders-list.server.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-list.server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjF,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AA8ID,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,UAAU,EAClB,kBAAkB,GAAE,cAAyB,GAC5C,OAAO,CAAC,UAAU,CAAC,CA0lCrB"}
@@ -1,3 +1,6 @@
1
+ import { loadReviewDismissals, isReviewDismissed } from "./review-dismissals.server";
2
+ import { customerDisplayName } from "./customer-name";
3
+ import { isNotReportedLocally } from "./floriday-status";
1
4
  import { unlinkedFloridayProducts } from "./floriday-unlinked-products";
2
5
  import { resolveProductName } from "./product-name";
3
6
  import { centralOrderNumber, computeTotals, mapJsonbToSalesOrderDTO, packingConfigFromFloridayPacking, } from "./salesorders-mapping";
@@ -5,6 +8,7 @@ import { cratePackageName, loadCarrierName, mergeTypeNames } from "./load-carrie
5
8
  import { engineLoadCarrierLabel, normalizeLoadCarrierCode } from "./load-carriers";
6
9
  import { normalizeTime, resolveDeliveryTimeForDate } from "./carrier-availability";
7
10
  import { loadPlanCoverage } from "./plan-coverage.server";
11
+ import { combineStages } from "./floriday-status";
8
12
  import { mergeSummaries, summarize } from "./plan-coverage";
9
13
  import { resolveOrderNumbers } from "./order-numbers.server";
10
14
  import { mergeStages, resolveOrderStage } from "./order-status";
@@ -357,15 +361,18 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
357
361
  const lookup = new Map();
358
362
  const localCustomerLookup = new Map();
359
363
  for (const c of customerRows) {
364
+ const disp = customerDisplayName(c);
360
365
  localCustomerLookup.set(String(c.id), {
361
- name: c.company_name ?? "Onbekende klant",
366
+ name: disp.name,
367
+ legalName: disp.legalName,
362
368
  city: c.city ?? "",
363
369
  });
364
370
  const orgId = c.floriday_organization_id;
365
371
  if (!orgId)
366
372
  continue;
367
373
  lookup.set(String(orgId), {
368
- name: c.commercial_name ?? c.company_name ?? "Onbekende klant",
374
+ name: disp.name,
375
+ legalName: disp.legalName,
369
376
  postalCode: c.postal_code ?? "",
370
377
  city: c.city ?? "",
371
378
  logoUrl: c.logo_url ?? null,
@@ -512,6 +519,7 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
512
519
  isReservation: localRow ? !!localRow.is_reservation : false,
513
520
  });
514
521
  dto.floridayFulfilled = Boolean((localRow?.custom_fields ?? {})?.floriday_fulfilled);
522
+ dto.notReportedToFloriday = isNotReportedLocally(dto.stage, dto.floridayFulfilled);
515
523
  const reviewCf = (localRow?.custom_fields ?? {});
516
524
  dto.needsManualReview = reviewCf?.needs_manual_review
517
525
  ? {
@@ -695,7 +703,9 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
695
703
  isLocal: true,
696
704
  isReservation: !!r.is_reservation,
697
705
  customer: {
698
- name: r.customer_name ?? localCustomer?.name ?? "Onbekende klant",
706
+ // Gekoppelde klant (op id) gaat vóór de opgeslagen naam op de order.
707
+ name: localCustomer?.name ?? r.customer_name ?? "Onbekende klant",
708
+ legalName: localCustomer?.legalName ?? null,
699
709
  postalCode: "",
700
710
  city: localCustomer?.city ?? "",
701
711
  logoUrl: null,
@@ -715,6 +725,27 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
715
725
  ...(r.delivery_date ? [] : ["geen leverdatum"]),
716
726
  ],
717
727
  packingSource: localPackingSource,
728
+ floridayFulfilled: Boolean(cf.floriday_fulfilled),
729
+ notReportedToFloriday: (sourceRaw === "floriday" || !!r.floriday_sales_order_id) &&
730
+ isNotReportedLocally(resolveOrderStage({
731
+ status: r.status,
732
+ shipped: shipmentStateByOrder.get(String(r.id))?.shipped,
733
+ controlledAt: shipmentStateByOrder.get(String(r.id))?.picked ? "picked" : null,
734
+ isReservation: !!r.is_reservation,
735
+ }), Boolean(cf.floriday_fulfilled)),
736
+ priceLines: lineItems.map((it) => ({
737
+ pieces: toNumber(it?.quantity) || 0,
738
+ unitPrice: toNumber(it?.unit_price) || 0,
739
+ })),
740
+ missingPrice: sourceRaw !== "floriday" &&
741
+ !r.floriday_sales_order_id &&
742
+ lineItems.some((it) => !(toNumber(it?.unit_price) > 0)),
743
+ floridayIds: sourceRaw === "floriday" || r.floriday_sales_order_id
744
+ ? Array.from(new Set([
745
+ r.floriday_sales_order_id ? String(r.floriday_sales_order_id) : null,
746
+ ...lineItems.map((it) => (it?.source_line_key ? String(it.source_line_key) : null)),
747
+ ].filter((v) => !!v && /^[0-9a-f-]{36}$/i.test(v))))
748
+ : [],
718
749
  raw: {
719
750
  order: {
720
751
  status: r.status ?? null,
@@ -807,6 +838,27 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
807
838
  o.pickupLabel = shortPickup(selected.pickupDate, selected.pickupTime ?? selected.signupTime);
808
839
  }
809
840
  }
841
+ // 12a) Weggehaalde beoordelingsmeldingen (vals alarm) — los vastgelegd,
842
+ // zodat de order zelf niet gewijzigd hoeft te worden.
843
+ {
844
+ const reviewPairs = [];
845
+ for (const o of all) {
846
+ if (!o.needsManualReview)
847
+ continue;
848
+ const oid = o.id.startsWith("local:")
849
+ ? o.id.slice("local:".length)
850
+ : (() => { const row = localRowByFoId.get(o.id); return row ? String(row.id) : null; })();
851
+ if (oid)
852
+ reviewPairs.push({ oid, o });
853
+ }
854
+ if (reviewPairs.length > 0) {
855
+ const dismissed = await loadReviewDismissals(supabase, reviewPairs.map((p) => p.oid));
856
+ for (const p of reviewPairs) {
857
+ if (isReviewDismissed(dismissed, p.oid, p.o.needsManualReview.reason))
858
+ p.o.needsManualReview = null;
859
+ }
860
+ }
861
+ }
810
862
  const sizeByBuffer = new Map();
811
863
  for (const o of all) {
812
864
  if (o.bufferId)
@@ -854,6 +906,8 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
854
906
  reservationCount: members.filter((m) => m.isReservation).length,
855
907
  floridayFulfilled: members.some((m) => m.floridayFulfilled),
856
908
  floridayFulfilledCount: members.filter((m) => m.floridayFulfilled).length,
909
+ notReportedToFloriday: members.some((m) => m.notReportedToFloriday),
910
+ notReportedCount: members.filter((m) => m.notReportedToFloriday).length,
857
911
  stage: mergeStages(members.map((m) => m.stage ?? "incoming")),
858
912
  ...(() => {
859
913
  // De herkomst van de laatste statuswijziging binnen de buffer.
@@ -870,6 +924,8 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
870
924
  incomplete,
871
925
  engineCounts: members.some((m) => m.engineCounts),
872
926
  planCoverage: mergeSummaries(members.map((m) => m.planCoverage)),
927
+ missingPrice: members.some((m) => m.missingPrice),
928
+ floridayStatus: mergeFloridayStatus(members.map((m) => m.floridayStatus)),
873
929
  shifted: members.some((m) => m.shifted),
874
930
  printedAt: members.map((m) => m.printedAt).find((v) => !!v) ?? null,
875
931
  pickDate: members
@@ -962,11 +1018,15 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
962
1018
  };
963
1019
  // Achterstand is een weergave-categorie binnen "Te picken", geen eigen status.
964
1020
  const isBacklogGroup = (members) => stageOf(members) === "topick" && members.some((m) => m.backlog);
1021
+ // Verzonden in het ERP, nog niet afgemeld bij Floriday (eigen kenmerk).
1022
+ const isNotReportedGroup = (members) => members.some((m) => m.notReportedToFloriday);
965
1023
  const matchesTab = (members) => {
966
1024
  if (params.tab === "all")
967
1025
  return true;
968
1026
  if (params.tab === "backlog")
969
1027
  return isBacklogGroup(members);
1028
+ if (params.tab === "not_reported")
1029
+ return isNotReportedGroup(members);
970
1030
  if (stageOf(members) !== params.tab)
971
1031
  return false;
972
1032
  // Achterstandorders horen onder hun eigen tab, niet bij het gewone "Te picken".
@@ -984,8 +1044,11 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
984
1044
  picked: 0,
985
1045
  shipped: 0,
986
1046
  cancelled: 0,
1047
+ not_reported: 0,
987
1048
  };
988
1049
  for (const g of withoutTab) {
1050
+ if (isNotReportedGroup(g))
1051
+ statusCounts.not_reported++;
989
1052
  if (isBacklogGroup(g)) {
990
1053
  statusCounts.backlog++;
991
1054
  continue; // telt niet mee bij het gewone "Te picken"
@@ -1035,6 +1098,29 @@ export async function buildSalesOrdersList(supabase, params, connectionSupabase
1035
1098
  }
1036
1099
  }
1037
1100
  }
1101
+ // 15) Floriday-stand uit het statusoverzicht (alleen weergave), alleen voor de
1102
+ // zichtbare rijen, in één verzoek (max 100). Fail closed: "stand onbekend".
1103
+ if (!params.all) {
1104
+ const visible = pageGroups.flat();
1105
+ const idsOf = (o) => o.floridayIds && o.floridayIds.length
1106
+ ? o.floridayIds
1107
+ : !o.id.startsWith("local:") && !o.id.startsWith("mailbox-proposal:") && /^[0-9a-f-]{36}$/i.test(o.id) && !o.isLocal
1108
+ ? [o.id]
1109
+ : [];
1110
+ const allIds = Array.from(new Set(visible.flatMap(idsOf))).slice(0, 100);
1111
+ if (allIds.length) {
1112
+ const { loadFloridayStatuses } = await import("./floriday-status.server");
1113
+ const res = await loadFloridayStatuses(allIds);
1114
+ for (const o of visible) {
1115
+ const ids = idsOf(o);
1116
+ if (!ids.length)
1117
+ continue;
1118
+ o.floridayStatus = summarizeFloridayStatus(ids, res.entries, res.error);
1119
+ }
1120
+ if (res.error)
1121
+ warnings.push(`Floriday-stand niet beschikbaar (${res.error}).`);
1122
+ }
1123
+ }
1038
1124
  const rows = pageGroups.map(mergeGroup);
1039
1125
  // Totalen over de volledige gefilterde set (alle orders in elke buffer).
1040
1126
  const totals = computeTotals(filteredGroups.map(mergeGroup));
@@ -1094,3 +1180,18 @@ async function loadGroupPacking(supabase) {
1094
1180
  }
1095
1181
  return byName;
1096
1182
  }
1183
+ function summarizeFloridayStatus(ids, entries, error) {
1184
+ const found = ids.map((id) => entries.get(id)).filter((e) => !!e);
1185
+ if (found.length === 0)
1186
+ return { stage: "onbekend", error: error ?? "geen antwoord", entries: [] };
1187
+ return { stage: combineStages(found.map((e) => e.floridayStage)), error: null, entries: found };
1188
+ }
1189
+ function mergeFloridayStatus(list) {
1190
+ const present = list.filter((x) => !!x);
1191
+ if (present.length === 0)
1192
+ return null;
1193
+ const entries = present.flatMap((p) => p.entries);
1194
+ if (entries.length === 0)
1195
+ return present[0];
1196
+ return { stage: combineStages(entries.map((e) => e.floridayStage)), error: null, entries };
1197
+ }
@@ -48,6 +48,9 @@ export interface SalesOrderDTO {
48
48
  * Nooit sturend voor status, tabs, filters, facturatie of voorraadverbruik.
49
49
  */
50
50
  floridayFulfilled?: boolean;
51
+ /** Verzonden in het ERP, nog niet afgemeld bij Floriday (alleen weergave). */
52
+ notReportedToFloriday?: boolean;
53
+ notReportedCount?: number;
51
54
  /** Aantal orders binnen een buffer dat is doorgegeven aan Floriday. */
52
55
  floridayFulfilledCount?: number;
53
56
  /**
@@ -88,12 +91,25 @@ export interface SalesOrderDTO {
88
91
  backlogDays?: number | null;
89
92
  backlogLeverdatum?: string | null;
90
93
  backlogUnknown?: boolean;
94
+ /** Floriday salesOrderId's op deze order (voor het statusoverzicht). */
95
+ floridayIds?: string[];
96
+ /** Floriday-stand uit het statusoverzicht; alleen weergave. */
97
+ floridayStatus?: import("./floriday-status").FloridayStatusSummary | null;
98
+ /** Actieve orderregels: stuks en prijs per stuk (voor de totaalregel). */
99
+ priceLines?: {
100
+ pieces: number;
101
+ unitPrice: number;
102
+ }[];
103
+ /** Handmatige/Mailbox-order met minstens één regel zonder prijs. */
104
+ missingPrice?: boolean;
91
105
  /** Vervoerder van de order (indien bekend). */
92
106
  carrierName?: string | null;
93
107
  /** Concrete ontbrekende gegevens, bv. "geen klant gekoppeld". */
94
108
  incomplete?: string[];
95
109
  customer: {
96
110
  name: string;
111
+ /** Bedrijfsnaam (company_name) als die afwijkt van de getoonde handelsnaam. */
112
+ legalName?: string | null;
97
113
  postalCode: string;
98
114
  city: string;
99
115
  logoUrl: string | null;
@@ -114,6 +130,7 @@ export interface SalesOrderDTO {
114
130
  }
115
131
  export interface CustomerLookupEntry {
116
132
  name: string;
133
+ legalName?: string | null;
117
134
  postalCode: string;
118
135
  city: string;
119
136
  logoUrl: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"salesorders-mapping.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders-mapping.ts"],"names":[],"mappings":"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"}
@@ -155,6 +155,7 @@ export function mapJsonbToSalesOrderDTO(o, customerLookup, tradeItemLookup, crat
155
155
  totalPieces: numberOfPieces,
156
156
  customer: {
157
157
  name: found?.name ?? "Onbekende klant",
158
+ legalName: found?.legalName ?? null,
158
159
  postalCode: found?.postalCode ?? "",
159
160
  city: found?.city ?? "",
160
161
  logoUrl: found?.logoUrl ?? null,
@@ -1,9 +1,5 @@
1
1
  import { type SalesOrderDTO } from "./salesorders-mapping";
2
- export declare function runSalesOrdersSyncFromCron(): Promise<{
3
- ok: boolean;
4
- mirrorOk: boolean;
5
- mirrored: number;
6
- }>;
2
+ export declare function runSalesOrdersSyncFromCron(): Promise<any>;
7
3
  export declare const runSalesOrdersSync: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
8
4
  supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
9
5
  userId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"salesorders.functions.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders.functions.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAC;AAqD/B,wBAAsB,0BAA0B;QAlB1C,OAAO;cACD,OAAO;cACP,MAAM;GAkBjB;AAGD,eAAO,MAAM,kBAAkB;;;;;QAvBzB,OAAO;cACD,OAAO;cACP,MAAM;GAuB+B,CAAC;AA6BlD,eAAO,MAAM,gBAAgB;;;;6CAEJ,OAAO;;;;;;;;;;;;;GAmC5B,CAAC;AAGL,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDnC,CAAC;AASL,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;0CAEV,OAAO;;mCA2XzB,CAAC;AAQL,eAAO,MAAM,uBAAuB;;;;0CAEd,OAAO;;;;;GAQzB,CAAC;AAOL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAIF,eAAO,MAAM,qBAAqB;;;;6EA4E9B,CAAC"}
1
+ {"version":3,"file":"salesorders.functions.d.ts","sourceRoot":"","sources":["../../src/lib/salesorders.functions.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAC;AAqD/B,wBAAsB,0BAA0B,iBAM/C;AAGD,eAAO,MAAM,kBAAkB;;;;;QA3BzB,OAAO;cACD,OAAO;cACP,MAAM;GA2B+B,CAAC;AA6BlD,eAAO,MAAM,gBAAgB;;;;6CAEJ,OAAO;;;;;;;;;;;;;GAmC5B,CAAC;AAGL,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDnC,CAAC;AASL,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;0CAEV,OAAO;;mCA2ZzB,CAAC;AAQL,eAAO,MAAM,uBAAuB;;;;0CAEd,OAAO;;;;;GAQzB,CAAC;AAOL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAIF,eAAO,MAAM,qBAAqB;;;;6EA4E9B,CAAC"}