@flowselections/floriday-voorraad 1.0.30 → 1.0.31

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 (47) hide show
  1. package/dist-lib/components/voorraad/StockSyncStatus.d.ts.map +1 -1
  2. package/dist-lib/components/voorraad/StockSyncStatus.js +20 -3
  3. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  4. package/dist-lib/components/voorraad/VoorraadPage.js +1 -4
  5. package/dist-lib/hooks/useStockSyncHealth.d.ts.map +1 -1
  6. package/dist-lib/hooks/useStockSyncHealth.js +7 -1
  7. package/dist-lib/integrations/supabase/auth-middleware.d.ts +9404 -6816
  8. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/client.d.ts +9404 -6816
  10. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  11. package/dist-lib/integrations/supabase/client.server.d.ts +9404 -6816
  12. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  13. package/dist-lib/integrations/supabase/types.d.ts +9658 -7030
  14. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  15. package/dist-lib/lib/floricode-required-features.functions.d.ts +9404 -6816
  16. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/floriday-customer-offer.functions.d.ts +9404 -6816
  18. package/dist-lib/lib/floriday-customer-offer.functions.d.ts.map +1 -1
  19. package/dist-lib/lib/floriday-env.functions.d.ts +5819 -643
  20. package/dist-lib/lib/floriday-env.functions.d.ts.map +1 -1
  21. package/dist-lib/lib/floriday-gateway.functions.d.ts +17319 -1791
  22. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
  23. package/dist-lib/lib/floriday-stock-supply.server.d.ts +53 -0
  24. package/dist-lib/lib/floriday-stock-supply.server.d.ts.map +1 -0
  25. package/dist-lib/lib/floriday-stock-supply.server.js +151 -0
  26. package/dist-lib/lib/floriday-vbn-required.functions.d.ts +5819 -643
  27. package/dist-lib/lib/floriday-vbn-required.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/floriday-warehouse.functions.d.ts +8694 -930
  29. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/floriday-writes.functions.d.ts +5819 -643
  31. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/logistics-tasks.server.d.ts +17 -0
  33. package/dist-lib/lib/logistics-tasks.server.d.ts.map +1 -0
  34. package/dist-lib/lib/logistics-tasks.server.js +303 -0
  35. package/dist-lib/lib/module-runtime-config.functions.d.ts +1 -13
  36. package/dist-lib/lib/module-runtime-config.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/module-runtime-config.functions.js +17 -93
  38. package/dist-lib/lib/module-runtime.server.d.ts +33 -0
  39. package/dist-lib/lib/module-runtime.server.d.ts.map +1 -0
  40. package/dist-lib/lib/module-runtime.server.js +184 -0
  41. package/dist-lib/lib/stock-sync.functions.d.ts +20445 -0
  42. package/dist-lib/lib/stock-sync.functions.d.ts.map +1 -0
  43. package/dist-lib/lib/stock-sync.functions.js +30 -0
  44. package/dist-lib/lib/supabase-admin.server.d.ts +15 -0
  45. package/dist-lib/lib/supabase-admin.server.d.ts.map +1 -0
  46. package/dist-lib/lib/supabase-admin.server.js +35 -0
  47. package/package.json +2 -2
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Server-side voorraadpush naar Floriday.
3
+ *
4
+ * Eén wachtrijregel = de laatst bekende voorraadstand van één trade item.
5
+ * Per regel worden twee dingen doorgezet, in vaste volgorde:
6
+ * 1. het werkelijke aantal stuks → `PUT /trade-items/{id}/base-supply/{jaar}/{week}`
7
+ * 2. de beschikbaarheidsschakelaar → `PUT /trade-items/{id}/continuous-stock`
8
+ *
9
+ * Deze module bevat geen HTTP-route en geen wachtrijbeheer; hij wordt
10
+ * aangeroepen door de verwerker (dit project als terugvalweg, en de
11
+ * Floriday-Authenticatie-module als vaste verwerker).
12
+ */
13
+ export type StockQueueRow = {
14
+ id: string;
15
+ connection_id: string;
16
+ trade_item_id: string;
17
+ number_of_pieces: number | null;
18
+ desired_available: boolean | null;
19
+ attempts: number | null;
20
+ };
21
+ export type StockPushOutcome = {
22
+ ok: boolean;
23
+ /** Fout die niet vanzelf overgaat: niet opnieuw proberen. */
24
+ permanent?: boolean;
25
+ error?: string;
26
+ attemptId?: string;
27
+ /** Aantal is niet meegestuurd (bijv. geen prijs bekend). */
28
+ quantitySkipped?: string;
29
+ };
30
+ /** ISO-weeknummer van vandaag (of van een gegeven datum). */
31
+ export declare function isoWeekParts(input?: string | Date): {
32
+ year: number;
33
+ week: number;
34
+ };
35
+ /**
36
+ * Bepaalt of een fout tijdelijk is (netwerk, snelheidslimiet, 5xx) of
37
+ * definitief (fout in de gegevens zelf). Alleen tijdelijke fouten worden
38
+ * opnieuw geprobeerd — anders blijft een kapotte regel eindeloos rondgaan.
39
+ */
40
+ export declare function isPermanentError(message: string): boolean;
41
+ /** Snelheidslimiet-signaal: verwerker moet de ronde afbreken. */
42
+ export declare function isRateLimited(message: string): boolean;
43
+ /**
44
+ * Zet één wachtrijregel door naar Floriday. Gooit nooit: het resultaat
45
+ * beschrijft altijd wat er gebeurd is, zodat de verwerker het netjes kan
46
+ * terugschrijven.
47
+ */
48
+ export declare function pushStockRow(params: {
49
+ supabaseAdmin: any;
50
+ environment: string;
51
+ row: StockQueueRow;
52
+ }): Promise<StockPushOutcome>;
53
+ //# sourceMappingURL=floriday-stock-supply.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floriday-stock-supply.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-stock-supply.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYlF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASzD;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAmCD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,aAAa,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2F5B"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Server-side voorraadpush naar Floriday.
3
+ *
4
+ * Eén wachtrijregel = de laatst bekende voorraadstand van één trade item.
5
+ * Per regel worden twee dingen doorgezet, in vaste volgorde:
6
+ * 1. het werkelijke aantal stuks → `PUT /trade-items/{id}/base-supply/{jaar}/{week}`
7
+ * 2. de beschikbaarheidsschakelaar → `PUT /trade-items/{id}/continuous-stock`
8
+ *
9
+ * Deze module bevat geen HTTP-route en geen wachtrijbeheer; hij wordt
10
+ * aangeroepen door de verwerker (dit project als terugvalweg, en de
11
+ * Floriday-Authenticatie-module als vaste verwerker).
12
+ */
13
+ /** ISO-weeknummer van vandaag (of van een gegeven datum). */
14
+ export function isoWeekParts(input) {
15
+ const parsed = input ? new Date(input) : new Date();
16
+ const source = Number.isNaN(parsed.getTime()) ? new Date() : parsed;
17
+ const date = new Date(Date.UTC(source.getUTCFullYear(), source.getUTCMonth(), source.getUTCDate()));
18
+ const day = date.getUTCDay() || 7;
19
+ date.setUTCDate(date.getUTCDate() + 4 - day);
20
+ const year = date.getUTCFullYear();
21
+ const yearStart = new Date(Date.UTC(year, 0, 1));
22
+ const week = Math.ceil(((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
23
+ return { year, week };
24
+ }
25
+ /**
26
+ * Bepaalt of een fout tijdelijk is (netwerk, snelheidslimiet, 5xx) of
27
+ * definitief (fout in de gegevens zelf). Alleen tijdelijke fouten worden
28
+ * opnieuw geprobeerd — anders blijft een kapotte regel eindeloos rondgaan.
29
+ */
30
+ export function isPermanentError(message) {
31
+ const m = message.toLowerCase();
32
+ if (/\b(429|500|502|503|504)\b/.test(m))
33
+ return false;
34
+ if (/timeout|timed out|network|fetch failed|econn|socket|rate limit|too many requests/.test(m)) {
35
+ return false;
36
+ }
37
+ if (/\b(400|401|403|404|409|422)\b/.test(m))
38
+ return true;
39
+ if (/unauthorized|forbidden|not found|validation|invalid/.test(m))
40
+ return true;
41
+ return false;
42
+ }
43
+ /** Snelheidslimiet-signaal: verwerker moet de ronde afbreken. */
44
+ export function isRateLimited(message) {
45
+ return /\b429\b|rate limit|too many requests/i.test(message);
46
+ }
47
+ async function resolveWarehouseId(supabaseAdmin, connectionId, tradeItemId, cachedItem) {
48
+ const { data: pref } = await supabaseAdmin
49
+ .from("trade_item_warehouse_preferences")
50
+ .select("warehouse_id")
51
+ .eq("connection_id", connectionId)
52
+ .eq("trade_item_id", tradeItemId)
53
+ .maybeSingle();
54
+ const direct = pref?.warehouse_id ?? cachedItem?.warehouseId ?? cachedItem?.warehouse?.warehouseId;
55
+ if (direct)
56
+ return direct;
57
+ const { data: whs } = await supabaseAdmin
58
+ .from("floriday_warehouses_cache")
59
+ .select("floriday_id, data")
60
+ .eq("connection_id", connectionId)
61
+ .limit(200);
62
+ const own = (whs ?? []).filter((w) => w?.data?.isDeleted !== true &&
63
+ w?.data?.isExternal !== true &&
64
+ w?.data?.hasAccess !== false);
65
+ const chosen = own.find((w) => w?.data?.isDefault === true) ?? own[0];
66
+ return chosen?.floriday_id ?? chosen?.data?.warehouseId;
67
+ }
68
+ /**
69
+ * Zet één wachtrijregel door naar Floriday. Gooit nooit: het resultaat
70
+ * beschrijft altijd wat er gebeurd is, zodat de verwerker het netjes kan
71
+ * terugschrijven.
72
+ */
73
+ export async function pushStockRow(params) {
74
+ const { supabaseAdmin, environment, row } = params;
75
+ const pieces = Math.max(0, Number(row.number_of_pieces ?? 0) || 0);
76
+ const available = row.desired_available ?? pieces > 0;
77
+ try {
78
+ const { gatewayWrite } = await import("./floriday-gateway.server");
79
+ const { data: cached } = await supabaseAdmin
80
+ .from("floriday_trade_items_cache")
81
+ .select("data")
82
+ .eq("connection_id", row.connection_id)
83
+ .eq("floriday_id", row.trade_item_id)
84
+ .maybeSingle();
85
+ if (!cached) {
86
+ return {
87
+ ok: false,
88
+ permanent: true,
89
+ error: "Dit artikel staat nog niet in de lokale Floriday-cache. Synchroniseer de artikelen en probeer opnieuw.",
90
+ };
91
+ }
92
+ const item = cached.data ?? {};
93
+ const warehouseId = await resolveWarehouseId(supabaseAdmin, row.connection_id, row.trade_item_id, item);
94
+ // 1. Werkelijk aantal stuks via het weekaanbod van de lopende week.
95
+ // Zonder bekende prijs kan Floriday geen basisaanbod aannemen; dan
96
+ // zetten we alleen de beschikbaarheid en melden we dat rustig.
97
+ const { year, week } = isoWeekParts();
98
+ const { data: supply } = await supabaseAdmin
99
+ .from("trade_item_supply_lines")
100
+ .select("price_per_piece, currency")
101
+ .eq("connection_id", row.connection_id)
102
+ .eq("trade_item_id", row.trade_item_id)
103
+ .order("updated_at", { ascending: false })
104
+ .limit(1)
105
+ .maybeSingle();
106
+ const pricePerPiece = Number(supply?.price_per_piece ?? NaN);
107
+ let quantitySkipped;
108
+ if (Number.isFinite(pricePerPiece) && pricePerPiece > 0) {
109
+ await gatewayWrite({
110
+ environment: environment,
111
+ module: "inventory",
112
+ action: "edit-weekly-base-supply",
113
+ method: "PUT",
114
+ path: `/suppliers-api-2026v1/trade-items/${row.trade_item_id}/base-supply/${year}/${week}`,
115
+ referenceId: row.trade_item_id,
116
+ // Stabiele sleutel: dezelfde stand levert nooit een dubbele mutatie op.
117
+ idempotencyKey: `inventory:weekly-base-supply:${row.trade_item_id}:${year}:${week}:${pieces}`,
118
+ body: {
119
+ basePricePerPiece: {
120
+ currency: supply?.currency ?? "EUR",
121
+ value: pricePerPiece,
122
+ },
123
+ numberOfPieces: pieces,
124
+ },
125
+ });
126
+ }
127
+ else {
128
+ quantitySkipped =
129
+ "Aantal niet doorgezet: er is nog geen prijs bekend voor dit artikel.";
130
+ }
131
+ // 2. Beschikbaarheidsschakelaar.
132
+ const body = { available };
133
+ if (warehouseId)
134
+ body.warehouseId = warehouseId;
135
+ const res = await gatewayWrite({
136
+ environment: environment,
137
+ module: "inventory",
138
+ action: "publish-continuous-stock",
139
+ method: "PUT",
140
+ path: `/suppliers-api-2026v1/trade-items/${row.trade_item_id}/continuous-stock`,
141
+ referenceId: row.trade_item_id,
142
+ idempotencyKey: `inventory:continuous-stock:${row.trade_item_id}:${available}:${pieces}`,
143
+ body,
144
+ });
145
+ return { ok: true, attemptId: res?.attemptId, quantitySkipped };
146
+ }
147
+ catch (e) {
148
+ const message = e instanceof Error ? e.message : String(e);
149
+ return { ok: false, permanent: isPermanentError(message), error: message };
150
+ }
151
+ }