@flowselections/floriday-verkoop-module 1.0.20 → 1.0.24

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 (89) hide show
  1. package/dist-lib/components/karindeling/AfmetingenTab.d.ts +6 -0
  2. package/dist-lib/components/karindeling/AfmetingenTab.d.ts.map +1 -0
  3. package/dist-lib/components/karindeling/AfmetingenTab.js +128 -0
  4. package/dist-lib/components/karindeling/KarindelingPage.d.ts +2 -0
  5. package/dist-lib/components/karindeling/KarindelingPage.d.ts.map +1 -0
  6. package/dist-lib/components/karindeling/KarindelingPage.js +102 -0
  7. package/dist-lib/components/verkoop/OrderControlStatusCard.d.ts +6 -0
  8. package/dist-lib/components/verkoop/OrderControlStatusCard.d.ts.map +1 -0
  9. package/dist-lib/components/verkoop/OrderControlStatusCard.js +41 -0
  10. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  11. package/dist-lib/components/verkoop/OrderKarindelingCard.js +83 -37
  12. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
  13. package/dist-lib/components/verkoop/SalesOrderDetailPage.js +74 -8
  14. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts +2 -1
  15. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  16. package/dist-lib/components/verkoop/SalesOrderDetailView.js +3 -2
  17. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  18. package/dist-lib/components/verkoop/SalesOrdersTable.js +40 -5
  19. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  20. package/dist-lib/components/verkoop/VerkoopOrdersPage.js +19 -3
  21. package/dist-lib/index.d.ts +1 -0
  22. package/dist-lib/index.d.ts.map +1 -1
  23. package/dist-lib/index.js +12 -1
  24. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1536 -581
  25. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  26. package/dist-lib/integrations/supabase/client.d.ts +1536 -581
  27. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/client.js +24 -9
  29. package/dist-lib/integrations/supabase/client.server.d.ts +1536 -581
  30. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  31. package/dist-lib/integrations/supabase/types.d.ts +1543 -562
  32. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  33. package/dist-lib/integrations/supabase/types.js +3 -9
  34. package/dist-lib/lib/cart-lock.functions.d.ts +1536 -581
  35. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/cart-planner.d.ts +9 -1
  37. package/dist-lib/lib/cart-planner.d.ts.map +1 -1
  38. package/dist-lib/lib/cart-planner.js +21 -4
  39. package/dist-lib/lib/cart-planning-settings.functions.d.ts +140842 -0
  40. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -0
  41. package/dist-lib/lib/cart-planning-settings.functions.js +375 -0
  42. package/dist-lib/lib/cart-replan.functions.d.ts +15811 -1082
  43. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/cart-replan.functions.js +85 -27
  45. package/dist-lib/lib/create-order.functions.d.ts +19021 -7561
  46. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +4558 -1693
  48. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/floriday-auto-fulfillment.server.js +1 -1
  50. package/dist-lib/lib/floriday-central-token.server.d.ts +12 -0
  51. package/dist-lib/lib/floriday-central-token.server.d.ts.map +1 -0
  52. package/dist-lib/lib/floriday-central-token.server.js +58 -0
  53. package/dist-lib/lib/floriday-gateway.server.d.ts +2 -2
  54. package/dist-lib/lib/floriday-gateway.server.d.ts.map +1 -1
  55. package/dist-lib/lib/floriday-gateway.server.js +10 -37
  56. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +1536 -581
  57. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  58. package/dist-lib/lib/floriday-logistic-labels.functions.js +14 -4
  59. package/dist-lib/lib/floriday-mirror.functions.d.ts +12806 -0
  60. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -0
  61. package/dist-lib/lib/floriday-mirror.functions.js +278 -0
  62. package/dist-lib/lib/floriday-public.functions.d.ts +10989 -4301
  63. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  64. package/dist-lib/lib/floriday-public.functions.js +114 -38
  65. package/dist-lib/lib/floriday-sync.d.ts +0 -1
  66. package/dist-lib/lib/floriday-sync.d.ts.map +1 -1
  67. package/dist-lib/lib/floriday-sync.js +1 -1
  68. package/dist-lib/lib/floriday-writes.functions.d.ts +7772 -2997
  69. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  70. package/dist-lib/lib/order-buffers.functions.d.ts +38420 -0
  71. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -0
  72. package/dist-lib/lib/order-buffers.functions.js +244 -0
  73. package/dist-lib/lib/order-shipments.functions.d.ts +6165 -2345
  74. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  75. package/dist-lib/lib/salesorders-mapping.d.ts +5 -0
  76. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  77. package/dist-lib/lib/salesorders-mapping.js +8 -1
  78. package/dist-lib/lib/salesorders.functions.d.ts +30443 -1979
  79. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  80. package/dist-lib/lib/salesorders.functions.js +307 -0
  81. package/dist-lib/lib/tradeitems.functions.d.ts +1536 -581
  82. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  83. package/dist-lib/lib/useSalesOrderDetailQuery.d.ts +2 -0
  84. package/dist-lib/lib/useSalesOrderDetailQuery.d.ts.map +1 -0
  85. package/dist-lib/lib/useSalesOrderDetailQuery.js +50 -0
  86. package/dist-lib/lib/useSalesOrdersQuery.d.ts +2 -2
  87. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  88. package/dist-lib/lib/useSalesOrdersQuery.js +139 -10
  89. package/package.json +5 -5
@@ -33,8 +33,107 @@ const ENTITY_TABLE = {
33
33
  const CachedListSchema = z.object({
34
34
  environment: EnvSchema,
35
35
  entity: z.string().min(1),
36
- limit: z.number().int().positive().max(5000).optional(),
36
+ limit: z.number().int().positive().max(20000).optional(),
37
+ // Optioneel — alleen benut voor entity "sales-orders".
38
+ since: z.string().optional(),
39
+ until: z.string().optional(),
40
+ dateField: z.enum(["ordered", "delivery"]).optional(),
37
41
  });
42
+ // Sales-orders lezen we via een aparte, geoptimaliseerde tak: scope op de
43
+ // actieve connectie, sorteer op sequence_number DESC, pagineer met .range(),
44
+ // en filter serverside op de opgegeven periode. Zo blijft dit toekomstbestendig
45
+ // bij tienduizenden orders in de cache.
46
+ async function readSalesOrdersCache(supabase, args) {
47
+ // 1) Actieve connection_id voor de gekozen omgeving.
48
+ const dbEnv = args.environment === "live" ? "live" : "staging";
49
+ const { data: connRows, error: connErr } = await supabase
50
+ .from("floriday_connections")
51
+ .select("id")
52
+ .eq("is_active", true)
53
+ .eq("environment", dbEnv)
54
+ .limit(1);
55
+ if (connErr)
56
+ throw new Error(`floriday_connections lezen faalde: ${connErr.message}`);
57
+ const connectionId = (connRows ?? [])[0]?.id;
58
+ if (!connectionId)
59
+ return [];
60
+ // 2) Kolom in `data`-JSON die correspondeert met het gekozen dateField.
61
+ // Postgrest ondersteunt filters op JSON via ->>.
62
+ const dateColumn = args.dateField === "delivery"
63
+ ? "data->delivery->>latestDeliveryDateTime"
64
+ : "data->>orderDateTime";
65
+ // 3) Gepagineerd lezen tot `limit` of tot de dataset uitgeput is.
66
+ const pageSize = 1000;
67
+ const collected = [];
68
+ for (let from = 0; from < args.limit; from += pageSize) {
69
+ const to = Math.min(from + pageSize - 1, args.limit - 1);
70
+ let q = supabase
71
+ .from("floriday_salesorders_cache")
72
+ .select("*")
73
+ .eq("connection_id", connectionId)
74
+ .eq("is_deleted", false)
75
+ .order("sequence_number", { ascending: false })
76
+ .range(from, to);
77
+ if (args.since)
78
+ q = q.gte(dateColumn, args.since);
79
+ if (args.until)
80
+ q = q.lt(dateColumn, args.until);
81
+ const { data: rows, error } = await q;
82
+ if (error)
83
+ throw new Error(`floriday_salesorders_cache lezen faalde: ${error.message}`);
84
+ const batch = rows ?? [];
85
+ collected.push(...batch);
86
+ if (batch.length < pageSize)
87
+ break;
88
+ }
89
+ return collected;
90
+ }
91
+ async function joinOrderNumbers(supabase, rows) {
92
+ const ids = Array.from(new Set(rows
93
+ .map((r) => String(r?.floriday_id ?? r?.data?.salesOrderId ?? ""))
94
+ .filter((id) => id.length > 0)));
95
+ if (ids.length === 0)
96
+ return rows;
97
+ const orderNumbers = new Map();
98
+ const chunkSize = 500;
99
+ const maxAttempts = 3;
100
+ for (let i = 0; i < ids.length; i += chunkSize) {
101
+ const chunk = ids.slice(i, i + chunkSize);
102
+ let lastErr = null;
103
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
104
+ try {
105
+ const { data: mapRows, error: mapErr } = await supabase
106
+ .from("floriday_order_number_map")
107
+ .select("floriday_id, order_number")
108
+ .in("floriday_id", chunk);
109
+ if (mapErr)
110
+ throw new Error(mapErr.message);
111
+ for (const m of mapRows ?? []) {
112
+ orderNumbers.set(String(m.floriday_id), String(m.order_number ?? ""));
113
+ }
114
+ lastErr = null;
115
+ break;
116
+ }
117
+ catch (e) {
118
+ lastErr = e;
119
+ if (attempt < maxAttempts) {
120
+ await new Promise((r) => setTimeout(r, 250 * attempt));
121
+ }
122
+ }
123
+ }
124
+ if (lastErr) {
125
+ // Non-fatal: log en ga door zonder order_number verrijking voor deze chunk.
126
+ console.warn(`[floriday-public] joinOrderNumbers chunk ${i / chunkSize} faalde na ${maxAttempts} pogingen:`, lastErr instanceof Error ? lastErr.message : lastErr);
127
+ }
128
+ }
129
+ return rows.map((r) => {
130
+ const floridayId = String(r?.floriday_id ?? r?.data?.salesOrderId ?? "");
131
+ const orderNumber = orderNumbers.get(floridayId);
132
+ return orderNumber
133
+ ? { ...r, order_number: orderNumber, data: { ...(r.data ?? {}), orderNumber } }
134
+ : r;
135
+ });
136
+ }
38
137
  export const getFlorydayCachedList = createServerFn({ method: "POST" })
39
138
  .middleware([requireSupabaseAuth])
40
139
  .inputValidator((d) => CachedListSchema.parse(d))
@@ -43,50 +142,27 @@ export const getFlorydayCachedList = createServerFn({ method: "POST" })
43
142
  if (!table) {
44
143
  throw new Error(`Onbekende entity "${data.entity}" — toegestane waarden: ${Object.keys(ENTITY_TABLE).join(", ")}`);
45
144
  }
145
+ // Sales-orders: aparte, geoptimaliseerde leestak.
146
+ if (data.entity === "sales-orders") {
147
+ const rows = await readSalesOrdersCache(context.supabase, {
148
+ environment: data.environment,
149
+ limit: data.limit ?? 20000,
150
+ since: data.since,
151
+ until: data.until,
152
+ dateField: data.dateField ?? "ordered",
153
+ });
154
+ const withNumbers = await joinOrderNumbers(context.supabase, rows);
155
+ return { entity: data.entity, rows: withNumbers };
156
+ }
157
+ // Overige entities: onveranderd gedrag.
46
158
  const limit = data.limit ?? 1000;
47
159
  let q = context.supabase.from(table).select("*").limit(limit);
48
- // Most cache-tables have an is_deleted column; filter when present.
49
- const hasIsDeleted = [
50
- "floriday_salesorders_cache",
51
- "floriday_trade_items_cache",
52
- ].includes(table);
160
+ const hasIsDeleted = table === "floriday_trade_items_cache";
53
161
  if (hasIsDeleted)
54
162
  q = q.eq("is_deleted", false);
55
163
  const { data: rows, error } = await q;
56
164
  if (error)
57
165
  throw new Error(`${table} lezen faalde: ${error.message}`);
58
- if (table === "floriday_salesorders_cache") {
59
- const ids = (rows ?? [])
60
- .map((r) => String(r?.floriday_id ?? r?.data?.salesOrderId ?? ""))
61
- .filter((id) => id.length > 0);
62
- if (ids.length > 0) {
63
- const mapped = [];
64
- const idSet = new Set(ids);
65
- for (let from = 0; from < 10000; from += 1000) {
66
- const { data: chunkRows, error: mapError } = await context.supabase
67
- .from("floriday_order_number_map")
68
- .select("floriday_id, order_number")
69
- .range(from, from + 999);
70
- if (mapError)
71
- throw new Error(`floriday_order_number_map lezen faalde: ${mapError.message}`);
72
- const batch = chunkRows ?? [];
73
- mapped.push(...batch.filter((m) => idSet.has(String(m.floriday_id))));
74
- if (batch.length < 1000)
75
- break;
76
- }
77
- const orderNumbers = new Map((mapped ?? []).map((m) => [String(m.floriday_id), String(m.order_number ?? "")]));
78
- return {
79
- entity: data.entity,
80
- rows: (rows ?? []).map((r) => {
81
- const floridayId = String(r?.floriday_id ?? r?.data?.salesOrderId ?? "");
82
- const orderNumber = orderNumbers.get(floridayId) ?? null;
83
- return orderNumber
84
- ? { ...r, order_number: orderNumber, data: { ...(r.data ?? {}), orderNumber } }
85
- : r;
86
- }),
87
- };
88
- }
89
- }
90
166
  return { entity: data.entity, rows: rows ?? [] };
91
167
  });
92
168
  const CodeListSchema = z.object({
@@ -6,7 +6,6 @@ export declare const FLORIDAY_API_BASES: {
6
6
  export interface FloridayConnectionRow {
7
7
  id: string;
8
8
  environment: string | null;
9
- access_token: string | null;
10
9
  api_key: string | null;
11
10
  is_active: boolean | null;
12
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-sync.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW,CAAC,IAAI;IAC/B,UAAU,EAAE,qBAAqB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAsB,cAAc,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnE,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,CA+FrB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAOlC"}
1
+ {"version":3,"file":"floriday-sync.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW,CAAC,IAAI;IAC/B,UAAU,EAAE,qBAAqB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAsB,cAAc,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnE,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,CA+FrB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAOlC"}
@@ -108,7 +108,7 @@ export async function syncBySequence(supabase, opts) {
108
108
  export async function loadActiveConnections(supabase) {
109
109
  const { data, error } = await supabase
110
110
  .from("floriday_connections")
111
- .select("id, environment, access_token, api_key, is_active")
111
+ .select("id, environment, api_key, is_active")
112
112
  .eq("is_active", true);
113
113
  if (error)
114
114
  throw new Error(`floriday_connections lezen faalde: ${error.message}`);