@flowselections/floriday-authenticatie-module 1.0.13 → 1.0.14

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 (48) hide show
  1. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts +20 -0
  2. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts.map +1 -0
  3. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.js +35 -0
  4. package/dist-lib/components/settings/FlorydaySettingsCard.d.ts.map +1 -1
  5. package/dist-lib/components/settings/FlorydaySettingsCard.js +75 -53
  6. package/dist-lib/integrations/supabase/auth-middleware.d.ts +6121 -2360
  7. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  8. package/dist-lib/integrations/supabase/client.d.ts +6121 -2360
  9. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  10. package/dist-lib/integrations/supabase/client.server.d.ts +6121 -2360
  11. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/types.d.ts +6259 -2382
  13. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  14. package/dist-lib/integrations/supabase/types.js +10 -1
  15. package/dist-lib/lib/floricode-product-features.d.ts +50 -0
  16. package/dist-lib/lib/floricode-product-features.d.ts.map +1 -0
  17. package/dist-lib/lib/floricode-product-features.js +314 -0
  18. package/dist-lib/lib/floricode-regulatory-features.d.ts +41 -0
  19. package/dist-lib/lib/floricode-regulatory-features.d.ts.map +1 -0
  20. package/dist-lib/lib/floricode-regulatory-features.js +226 -0
  21. package/dist-lib/lib/floriday-auction-letters.functions.d.ts +9307 -0
  22. package/dist-lib/lib/floriday-auction-letters.functions.d.ts.map +1 -0
  23. package/dist-lib/lib/floriday-auction-letters.functions.js +129 -0
  24. package/dist-lib/lib/floriday-gateway-hmac.d.ts +29 -0
  25. package/dist-lib/lib/floriday-gateway-hmac.d.ts.map +1 -0
  26. package/dist-lib/lib/floriday-gateway-hmac.js +119 -0
  27. package/dist-lib/lib/floriday-labels.functions.d.ts +9312 -0
  28. package/dist-lib/lib/floriday-labels.functions.d.ts.map +1 -0
  29. package/dist-lib/lib/floriday-labels.functions.js +141 -0
  30. package/dist-lib/lib/floriday-public.functions.d.ts +55883 -0
  31. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -0
  32. package/dist-lib/lib/floriday-public.functions.js +241 -0
  33. package/dist-lib/lib/floriday-scopes.d.ts +20 -0
  34. package/dist-lib/lib/floriday-scopes.d.ts.map +1 -0
  35. package/dist-lib/lib/floriday-scopes.js +89 -0
  36. package/dist-lib/lib/floriday-stickers.functions.d.ts +9304 -0
  37. package/dist-lib/lib/floriday-stickers.functions.d.ts.map +1 -0
  38. package/dist-lib/lib/floriday-stickers.functions.js +128 -0
  39. package/dist-lib/lib/floriday-sync.functions.d.ts +240368 -1916
  40. package/dist-lib/lib/floriday-sync.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/floriday-sync.functions.js +836 -35
  42. package/dist-lib/lib/floriday-writes.functions.d.ts +55812 -0
  43. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -0
  44. package/dist-lib/lib/floriday-writes.functions.js +160 -0
  45. package/dist-lib/lib/floriday.functions.d.ts +125816 -46888
  46. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/floriday.functions.js +451 -58
  48. package/package.json +2 -2
@@ -0,0 +1,20 @@
1
+ import { type FlorydayEnvironment } from "../../lib/floriday.functions";
2
+ /**
3
+ * Herbruikbare waarschuwingsbanner voor andere modules.
4
+ *
5
+ * Toont een rode melding zodra een of meer Floriday-bronnen die door deze
6
+ * module gebruikt worden langer dan tweemaal hun verwachte sync-interval
7
+ * achterlopen. Toont niets als alles up-to-date is.
8
+ *
9
+ * Voorbeeld in de Verkoopmodule:
10
+ * <FlorydaySyncHealthBanner
11
+ * environment="live"
12
+ * watch={["sales-orders", "fulfillment-orders"]}
13
+ * />
14
+ */
15
+ export declare function FlorydaySyncHealthBanner({ environment, watch, className, }: {
16
+ environment: FlorydayEnvironment;
17
+ watch: string[];
18
+ className?: string;
19
+ }): import("react/jsx-runtime").JSX.Element | null;
20
+ //# sourceMappingURL=FlorydaySyncHealthBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlorydaySyncHealthBanner.d.ts","sourceRoot":"","sources":["../../../src/components/floriday/FlorydaySyncHealthBanner.tsx"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,WAAW,EACX,KAAK,EACL,SAAS,GACV,EAAE;IACD,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,kDAqCA"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useServerFn } from "@tanstack/react-start";
4
+ import { AlertTriangle } from "lucide-react";
5
+ import { getFlorydaySyncHealth, } from "../../lib/floriday.functions";
6
+ /**
7
+ * Herbruikbare waarschuwingsbanner voor andere modules.
8
+ *
9
+ * Toont een rode melding zodra een of meer Floriday-bronnen die door deze
10
+ * module gebruikt worden langer dan tweemaal hun verwachte sync-interval
11
+ * achterlopen. Toont niets als alles up-to-date is.
12
+ *
13
+ * Voorbeeld in de Verkoopmodule:
14
+ * <FlorydaySyncHealthBanner
15
+ * environment="live"
16
+ * watch={["sales-orders", "fulfillment-orders"]}
17
+ * />
18
+ */
19
+ export function FlorydaySyncHealthBanner({ environment, watch, className, }) {
20
+ const fn = useServerFn(getFlorydaySyncHealth);
21
+ const query = useQuery({
22
+ queryKey: ["floriday-sync-health", environment, watch.join(",")],
23
+ queryFn: () => fn({ data: { environment } }),
24
+ refetchInterval: 60000,
25
+ });
26
+ if (!query.data?.ok)
27
+ return null;
28
+ const stale = query.data.items.filter((i) => watch.includes(i.entity_type) && i.is_stale);
29
+ if (stale.length === 0)
30
+ return null;
31
+ return (_jsx("div", { role: "alert", className: "rounded-md border border-red-300 bg-red-50 px-3 py-2 text-sm text-red-800 " +
32
+ (className ?? ""), children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: "Floriday-gegevens lopen achter" }), _jsxs("p", { className: "text-[12px] mt-0.5", children: ["De volgende onderdelen zijn al langer dan verwacht niet bijgewerkt:", " ", stale
33
+ .map((s) => `${s.entity_type} (${s.minutes_behind} min)`)
34
+ .join(", "), ". Controleer de Floriday-koppeling in Instellingen."] })] })] }) }));
35
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"FlorydaySettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/FlorydaySettingsCard.tsx"],"names":[],"mappings":"AAuDA,wBAAgB,oBAAoB,4CAqHnC"}
1
+ {"version":3,"file":"FlorydaySettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/FlorydaySettingsCard.tsx"],"names":[],"mappings":"AAyEA,wBAAgB,oBAAoB,4CAqHnC"}
@@ -6,7 +6,7 @@ import { useServerFn } from "@tanstack/react-start";
6
6
  import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
7
7
  import { Card, Button, Input, Label, Badge, Tabs, TabsList, TabsTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, toast, } from "@flowselections/core";
8
8
  import { listFlorydayConnections, upsertFlorydayConnection, testFlorydayConnection, deleteFlorydayConnection, getFlorydaySettings, setFlorydayActiveEnvironment, listFlorydayWarehouses, updateFlorydayPublishingSettings, validateGln, syncFlorydayConnections, getFlorydaySyncStatus, } from "../../lib/floriday.functions";
9
- import { syncFlorydayTradeItems, syncFlorydaySalesOrders, syncFlorydayCustomerOrganizations, syncFlorydayCarriers, } from "../../lib/floriday-sync.functions";
9
+ import { syncFlorydayTradeItems, syncFlorydaySalesOrders, syncFlorydayCustomerOrganizations, syncFlorydayCarriers, syncFlorydayFulfillmentOrders, syncFlorydayCustomerStickers, syncFlorydayWarehouses, syncFlorydayPackings, syncFlorydayDeliveryLocations, syncFlorydayClockSupplies, syncFlorydayDeliveryOrders, syncFlorydayClockPresales, syncFlorydayContracts, syncFlorydayBlanketOrders, syncFlorydayAdditionalServices, syncFlorydayCommercialServiceTypes, syncFlorydayCollections, syncFlorydayPriceGroups, syncFlorydayDeliveryConditionSets, syncFlorydaySalesStrategies, syncFlorydayBaseItems, syncFlorydayContractTradeItemGroups, } from "../../lib/floriday-sync.functions";
10
10
  export function FlorydaySettingsCard() {
11
11
  const [open, setOpen] = useState(false);
12
12
  const qc = useQueryClient();
@@ -181,67 +181,89 @@ function formatRelative(iso) {
181
181
  return `${days} dag${days === 1 ? "" : "en"} geleden`;
182
182
  }
183
183
  const SYNC_RESOURCES = [
184
- {
185
- key: "connections",
186
- title: "Inkooprelaties",
187
- schedule: "Wordt twee keer per dag automatisch bijgewerkt (rond 08:00 en 20:00).",
188
- countLabel: "Aantal relaties",
189
- successLabel: "Inkooprelaties",
190
- },
191
- {
192
- key: "trade-items",
193
- title: "Producten",
194
- schedule: "Wordt elke 5 minuten automatisch bijgewerkt.",
195
- countLabel: "Aantal producten",
196
- successLabel: "Producten",
197
- },
198
- {
199
- key: "sales-orders",
200
- title: "Verkooporders",
201
- schedule: "Wordt elke 5 minuten automatisch bijgewerkt.",
202
- countLabel: "Aantal orders",
203
- successLabel: "Verkooporders",
204
- },
205
- {
206
- key: "customer-organizations",
207
- title: "Klantorganisaties",
208
- schedule: "Wordt twee keer per dag automatisch bijgewerkt (rond 08:00 en 20:00).",
209
- countLabel: "Aantal klanten",
210
- successLabel: "Klantorganisaties",
211
- },
212
- {
213
- key: "carriers",
214
- title: "Vervoerders",
215
- schedule: "Wordt twee keer per dag automatisch bijgewerkt (rond 08:00 en 20:00).",
216
- countLabel: "Aantal vervoerders",
217
- successLabel: "Vervoerders",
218
- },
184
+ { key: "connections", title: "Inkooprelaties", schedule: "Wordt twee keer per dag automatisch bijgewerkt (rond 08:00 en 20:00).", countLabel: "Aantal relaties", successLabel: "Inkooprelaties" },
185
+ { key: "trade-items", title: "Producten", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal producten", successLabel: "Producten" },
186
+ { key: "sales-orders", title: "Verkooporders", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal orders", successLabel: "Verkooporders" },
187
+ { key: "customer-organizations", title: "Klantorganisaties", schedule: "Wordt twee keer per dag automatisch bijgewerkt.", countLabel: "Aantal klanten", successLabel: "Klantorganisaties" },
188
+ { key: "carriers", title: "Vervoerders", schedule: "Wordt twee keer per dag automatisch bijgewerkt.", countLabel: "Aantal vervoerders", successLabel: "Vervoerders" },
189
+ { key: "fulfillment-orders", title: "Veilingbrieven", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal brieven", successLabel: "Veilingbrieven" },
190
+ { key: "customer-stickers", title: "Stickers van kopers", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal stickers", successLabel: "Stickers" },
191
+ { key: "warehouses", title: "Magazijnen", schedule: "Wordt twee keer per dag automatisch bijgewerkt.", countLabel: "Aantal magazijnen", successLabel: "Magazijnen" },
192
+ { key: "packings", title: "Verpakkingen", schedule: "Wordt dagelijks automatisch bijgewerkt.", countLabel: "Aantal verpakkingen", successLabel: "Verpakkingen" },
193
+ { key: "delivery-locations", title: "Afleveradressen", schedule: "Wordt twee keer per dag automatisch bijgewerkt.", countLabel: "Aantal adressen", successLabel: "Afleveradressen" },
194
+ { key: "clock-supplies", title: "Klokaanvoer", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal partijen", successLabel: "Klokaanvoer" },
195
+ { key: "delivery-orders", title: "Daghandel", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal leveropdrachten", successLabel: "Daghandel" },
196
+ { key: "clock-presales", title: "Klokvoorverkoop", schedule: "Wordt elke 5 minuten automatisch bijgewerkt.", countLabel: "Aantal voorverkopen", successLabel: "Klokvoorverkoop" },
197
+ { key: "contracts", title: "Contracten", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal contracten", successLabel: "Contracten" },
198
+ { key: "blanket-orders", title: "Contract-afroepen", schedule: "Wordt elke 15 minuten automatisch bijgewerkt.", countLabel: "Aantal afroepen", successLabel: "Contract-afroepen" },
199
+ // ── Stamdata voor productformulieren ───────────────────────────────────
200
+ { key: "additional-services", title: "Extra services", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal services", successLabel: "Extra services" },
201
+ { key: "commercial-service-types", title: "Servicetypes", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal types", successLabel: "Servicetypes" },
202
+ { key: "collections", title: "Collecties", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal collecties", successLabel: "Collecties" },
203
+ { key: "price-groups", title: "Prijsgroepen", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal prijsgroepen", successLabel: "Prijsgroepen" },
204
+ { key: "delivery-condition-sets", title: "Leveringsvoorwaarden", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal sets", successLabel: "Leveringsvoorwaarden" },
205
+ { key: "sales-strategies", title: "Verkoopstrategieën", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal strategieën", successLabel: "Verkoopstrategieën" },
206
+ { key: "base-items", title: "Basisproducten", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal basisproducten", successLabel: "Basisproducten" },
207
+ { key: "contract-trade-item-groups", title: "Contractgroepen", schedule: "Wordt elk uur automatisch bijgewerkt.", countLabel: "Aantal groepen", successLabel: "Contractgroepen" },
219
208
  ];
209
+ function formatSyncFailure(resource, error) {
210
+ const message = String(error ?? "onbekende fout");
211
+ const lower = message.toLowerCase();
212
+ const policyDenied = lower.includes("access_denied") ||
213
+ lower.includes("policy evaluation failed") ||
214
+ lower.includes("403") ||
215
+ lower.includes("forbidden");
216
+ if (resource === "sales-strategies" &&
217
+ (policyDenied ||
218
+ lower.includes("clock-supply") ||
219
+ lower.includes("verkoopstrategieën/klokaanvoer"))) {
220
+ return "Floriday heeft Verkoopstrategieën nog niet vrijgegeven voor deze koppeling. Laat dit in Floriday activeren en vernieuw daarna de verbinding.";
221
+ }
222
+ if ((resource === "contracts" ||
223
+ resource === "blanket-orders" ||
224
+ resource === "contract-trade-item-groups") &&
225
+ (policyDenied ||
226
+ lower.includes("contract:") ||
227
+ lower.includes("contracten-module"))) {
228
+ return "Floriday heeft de Contracten-module nog niet vrijgegeven voor deze koppeling. Laat dit in Floriday activeren en vernieuw daarna de verbinding.";
229
+ }
230
+ return message;
231
+ }
220
232
  function SyncStatusPanel({ env, connection, }) {
221
233
  const qc = useQueryClient();
222
234
  const getStatus = useServerFn(getFlorydaySyncStatus);
223
- const syncConnections = useServerFn(syncFlorydayConnections);
224
- const syncTrade = useServerFn(syncFlorydayTradeItems);
225
- const syncSales = useServerFn(syncFlorydaySalesOrders);
226
- const syncCustomers = useServerFn(syncFlorydayCustomerOrganizations);
227
- const syncCarriers = useServerFn(syncFlorydayCarriers);
235
+ const fns = {
236
+ "connections": useServerFn(syncFlorydayConnections),
237
+ "trade-items": useServerFn(syncFlorydayTradeItems),
238
+ "sales-orders": useServerFn(syncFlorydaySalesOrders),
239
+ "customer-organizations": useServerFn(syncFlorydayCustomerOrganizations),
240
+ "carriers": useServerFn(syncFlorydayCarriers),
241
+ "fulfillment-orders": useServerFn(syncFlorydayFulfillmentOrders),
242
+ "customer-stickers": useServerFn(syncFlorydayCustomerStickers),
243
+ "warehouses": useServerFn(syncFlorydayWarehouses),
244
+ "packings": useServerFn(syncFlorydayPackings),
245
+ "delivery-locations": useServerFn(syncFlorydayDeliveryLocations),
246
+ "clock-supplies": useServerFn(syncFlorydayClockSupplies),
247
+ "delivery-orders": useServerFn(syncFlorydayDeliveryOrders),
248
+ "clock-presales": useServerFn(syncFlorydayClockPresales),
249
+ "contracts": useServerFn(syncFlorydayContracts),
250
+ "blanket-orders": useServerFn(syncFlorydayBlanketOrders),
251
+ "additional-services": useServerFn(syncFlorydayAdditionalServices),
252
+ "commercial-service-types": useServerFn(syncFlorydayCommercialServiceTypes),
253
+ "collections": useServerFn(syncFlorydayCollections),
254
+ "price-groups": useServerFn(syncFlorydayPriceGroups),
255
+ "delivery-condition-sets": useServerFn(syncFlorydayDeliveryConditionSets),
256
+ "sales-strategies": useServerFn(syncFlorydaySalesStrategies),
257
+ "base-items": useServerFn(syncFlorydayBaseItems),
258
+ "contract-trade-item-groups": useServerFn(syncFlorydayContractTradeItemGroups),
259
+ };
228
260
  const statusQuery = useQuery({
229
261
  queryKey: ["floriday-sync-status", env],
230
262
  queryFn: () => getStatus({ data: { environment: env } }),
231
263
  enabled: Boolean(connection),
232
264
  refetchInterval: 30000,
233
265
  });
234
- const syncFor = (key) => {
235
- if (key === "connections")
236
- return () => syncConnections({ data: { environment: env } });
237
- if (key === "trade-items")
238
- return () => syncTrade({ data: { environment: env } });
239
- if (key === "sales-orders")
240
- return () => syncSales({ data: { environment: env } });
241
- if (key === "carriers")
242
- return () => syncCarriers({ data: { environment: env } });
243
- return () => syncCustomers({ data: { environment: env } });
244
- };
266
+ const syncFor = (key) => () => fns[key]({ data: { environment: env } });
245
267
  const syncMutation = useMutation({
246
268
  mutationFn: async (key) => {
247
269
  const res = await syncFor(key)();
@@ -256,7 +278,7 @@ function SyncStatusPanel({ env, connection, }) {
256
278
  : `${meta.successLabel}: alles is al up-to-date.`);
257
279
  }
258
280
  else {
259
- toast.error(`Bijwerken mislukt: ${res?.error ?? "onbekende fout"}`);
281
+ toast.error(`Bijwerken mislukt: ${formatSyncFailure(key, res?.error)}`);
260
282
  }
261
283
  qc.invalidateQueries({ queryKey: ["floriday-sync-status", env] });
262
284
  },