@flowselections/floriday-klanten-module 1.0.14 → 1.0.15

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.
@@ -12,7 +12,7 @@ function initials(name) {
12
12
  }
13
13
  export function CustomerAvatar({ logoUrl, name, size = "md", className, }) {
14
14
  const sizeClass = size === "sm" ? "h-8 w-8 text-xs" : size === "lg" ? "h-16 w-16 text-lg" : "h-10 w-10 text-sm";
15
- return (_jsx("div", { className: cn("relative shrink-0 overflow-hidden rounded-full bg-muted flex items-center justify-center font-medium text-muted-foreground border border-border", sizeClass, className), children: logoUrl ? (_jsx("img", { src: logoUrl, alt: name ?? "", className: "h-full w-full object-cover", onError: (e) => {
15
+ return (_jsx("div", { className: cn("relative shrink-0 overflow-hidden rounded-md bg-white flex items-center justify-center font-medium text-muted-foreground border border-border", sizeClass, className), children: logoUrl ? (_jsx("img", { src: logoUrl, alt: name ?? "", className: "h-full w-full object-contain p-1", onError: (e) => {
16
16
  e.currentTarget.style.display = "none";
17
17
  } })) : (_jsx("span", { children: initials(name) })) }));
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ImportKlanten.d.ts","sourceRoot":"","sources":["../../../src/components/klanten/ImportKlanten.tsx"],"names":[],"mappings":"AAgMA,wBAAgB,aAAa,gCAuZ5B"}
1
+ {"version":3,"file":"ImportKlanten.d.ts","sourceRoot":"","sources":["../../../src/components/klanten/ImportKlanten.tsx"],"names":[],"mappings":"AA4MA,wBAAgB,aAAa,gCAmc5B"}
@@ -8,14 +8,24 @@ import { ArrowLeft, Upload, Download, FileText, CheckCircle2, AlertTriangle, XCi
8
8
  import * as XLSX from "xlsx";
9
9
  import { bulkImportCustomers } from "../../lib/customers.functions";
10
10
  import { customerImportRowSchema } from "../../lib/customer-schemas";
11
- const REQUIRED = ["company_name", "email", "street", "house_number", "country"];
11
+ // Alleen `company_name` is écht verplicht om te kunnen importeren. Overige
12
+ // velden mogen leeg zijn — ontbrekende gegevens worden na de import getoond
13
+ // als waarschuwing zodat je ze later kunt aanvullen.
14
+ const REQUIRED = ["company_name"];
15
+ const RECOMMENDED_FIELDS = [
16
+ { key: "email", label: "E-mailadres" },
17
+ { key: "street", label: "Straat" },
18
+ { key: "house_number", label: "Huisnummer" },
19
+ { key: "country", label: "Land" },
20
+ ];
21
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
12
22
  // Alle interne doelvelden die de importer ondersteunt (voor handmatige mapping)
13
23
  const TARGET_FIELDS = [
14
24
  { key: "company_name", label: "Bedrijfsnaam", required: true },
15
- { key: "email", label: "E-mailadres", required: true },
16
- { key: "street", label: "Straat", required: true },
17
- { key: "house_number", label: "Huisnummer", required: true },
18
- { key: "country", label: "Land", required: true },
25
+ { key: "email", label: "E-mailadres" },
26
+ { key: "street", label: "Straat" },
27
+ { key: "house_number", label: "Huisnummer" },
28
+ { key: "country", label: "Land" },
19
29
  { key: "customer_number", label: "Klantnummer" },
20
30
  { key: "language", label: "Taal" },
21
31
  { key: "website", label: "Website" },
@@ -273,13 +283,18 @@ export function ImportKlanten() {
273
283
  if (val !== undefined && val !== "")
274
284
  r[target] = val;
275
285
  }
276
- // Fallback: als street/house_number ontbreken maar adresregel 1 is
277
- // gevuld, gebruik dan die als straat (verplicht veld).
286
+ // Fallback: als straat ontbreekt maar adresregel 1 is gevuld, gebruik die.
278
287
  const street = r.street || r.address_line1 || "";
279
- const houseNumber = r.house_number || "-";
288
+ const houseNumber = r.house_number || "";
289
+ // E-mail sanitair: alleen doorlaten als het qua vorm lijkt op een
290
+ // e-mailadres. Ongeldige waarden worden weggelaten en als
291
+ // waarschuwing gerapporteerd.
292
+ const rawEmail = (r.email || "").trim();
293
+ const emailValid = rawEmail !== "" && EMAIL_RE.test(rawEmail);
294
+ const email = emailValid ? rawEmail : "";
280
295
  const candidate = {
281
296
  company_name: r.company_name ?? "",
282
- email: r.email ?? "",
297
+ email,
283
298
  street,
284
299
  house_number: houseNumber,
285
300
  country: r.country ?? "",
@@ -320,13 +335,24 @@ export function ImportKlanten() {
320
335
  payment_term_days: r.payment_term_days ?? "",
321
336
  vat_display: r.vat_display ?? "",
322
337
  };
338
+ const warnings = [];
339
+ for (const f of RECOMMENDED_FIELDS) {
340
+ const v = candidate[f.key];
341
+ if (v === undefined || v === null || v === "") {
342
+ warnings.push(`${f.label} ontbreekt`);
343
+ }
344
+ }
345
+ if (rawEmail !== "" && !emailValid) {
346
+ warnings.push("E-mailadres ongeldig — leeg gelaten");
347
+ }
323
348
  const res = customerImportRowSchema.safeParse(candidate);
324
349
  if (res.success)
325
- return { raw: r, data: res.data, errors: [] };
350
+ return { raw: r, data: res.data, errors: [], warnings };
326
351
  return {
327
352
  raw: r,
328
353
  data: null,
329
354
  errors: res.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`),
355
+ warnings,
330
356
  };
331
357
  });
332
358
  };
@@ -384,7 +410,7 @@ export function ImportKlanten() {
384
410
  }
385
411
  mut.mutate(valid);
386
412
  };
387
- return (_jsxs("main", { className: "p-6 max-w-5xl mx-auto space-y-4", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate({ to: "/klanten" }), children: [_jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }), " Terug"] }), _jsxs("div", { className: "flex items-start justify-between gap-4 flex-wrap", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Klanten importeren" }), _jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: ["Upload een CSV om meerdere klanten tegelijk toe te voegen. Verplichte kolommen: ", REQUIRED.join(", "), "."] })] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { variant: "outline", onClick: downloadTemplateXlsx, children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), " Template (.xlsx)"] }), _jsxs(Button, { variant: "outline", onClick: downloadTemplateCsv, children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), " Template (.csv)"] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: "1. Bestand kiezen" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsx(Label, { htmlFor: "csvfile", className: "sr-only", children: "Excel- of CSV-bestand" }), _jsx(Input, { id: "csvfile", type: "file", accept: ".csv,.xlsx,.xls,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel", onChange: (e) => { const f = e.target.files?.[0]; if (f)
413
+ return (_jsxs("main", { className: "p-6 max-w-5xl mx-auto space-y-4", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate({ to: "/klanten" }), children: [_jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }), " Terug"] }), _jsxs("div", { className: "flex items-start justify-between gap-4 flex-wrap", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Klanten importeren" }), _jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: ["Upload een CSV of Excel om meerdere klanten tegelijk toe te voegen. Alleen ", _jsx("strong", { children: "bedrijfsnaam" }), " is verplicht \u2014 ontbrekende gegevens zoals e-mail, adres of land worden na de import als waarschuwing getoond zodat je ze later kunt aanvullen."] })] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { variant: "outline", onClick: downloadTemplateXlsx, children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), " Template (.xlsx)"] }), _jsxs(Button, { variant: "outline", onClick: downloadTemplateCsv, children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), " Template (.csv)"] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: "1. Bestand kiezen" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsx(Label, { htmlFor: "csvfile", className: "sr-only", children: "Excel- of CSV-bestand" }), _jsx(Input, { id: "csvfile", type: "file", accept: ".csv,.xlsx,.xls,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel", onChange: (e) => { const f = e.target.files?.[0]; if (f)
388
414
  handleFile(f); }, className: "max-w-sm" }), fileName && (_jsxs("span", { className: "inline-flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(FileText, { className: "h-4 w-4" }), " ", fileName] }))] }), _jsxs("label", { className: "inline-flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: skipDuplicates, onCheckedChange: (v) => setSkipDuplicates(v === true) }), "Duplicaten overslaan (op e-mail, BTW of vergelijkbare bedrijfsnaam)"] })] })] }), sourceHeaders.length > 0 && (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs(CardTitle, { className: "text-base", children: ["2. Velden koppelen (", sourceHeaders.length, " kolommen)"] }), _jsx("div", { className: "text-xs text-muted-foreground", children: "Kies per bronkolom naar welk klantveld deze moet worden ge\u00EFmporteerd." })] }), _jsx(CardContent, { className: "p-0", children: _jsx("div", { className: "max-h-[420px] overflow-auto", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Bronkolom (uit bestand)" }), _jsx(TableHead, { children: "Voorbeeldwaarde" }), _jsx(TableHead, { className: "w-[280px]", children: "Koppelen aan klantveld" })] }) }), _jsx(TableBody, { children: sourceHeaders.map((h) => {
389
415
  const sample = sourceRows.find((r) => r[h])?.[h] ?? "";
390
416
  return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-sm font-medium", children: h || _jsx("span", { className: "text-muted-foreground italic", children: "(zonder naam)" }) }), _jsx(TableCell, { className: "text-xs text-muted-foreground truncate max-w-[280px]", children: sample }), _jsx(TableCell, { children: _jsxs("select", { className: "w-full h-9 rounded-md border border-input bg-background px-2 text-sm", value: mapping[h] ?? "", onChange: (e) => setMapping((m) => ({ ...m, [h]: e.target.value })), children: [_jsx("option", { value: "", children: "\u2014 Negeren \u2014" }), TARGET_FIELDS.map((f) => (_jsxs("option", { value: f.key, children: [f.label, f.required ? " *" : ""] }, f.key)))] }) })] }, h));
@@ -395,7 +421,13 @@ export function ImportKlanten() {
395
421
  setRows([]);
396
422
  setFileName("");
397
423
  setResult(null);
398
- }, children: "Wissen" })] })] })), rows.length > 0 && (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs(CardTitle, { className: "text-base", children: ["3. Voorbeeld (", rows.length, " rijen)"] }), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsxs(Badge, { variant: "secondary", className: "bg-success/10 text-success", children: [_jsx(CheckCircle2, { className: "h-3 w-3 mr-1" }), " ", validCount, " geldig"] }), invalidCount > 0 && (_jsxs(Badge, { variant: "secondary", className: "bg-destructive/10 text-destructive", children: [_jsx(XCircle, { className: "h-3 w-3 mr-1" }), " ", invalidCount, " ongeldig"] }))] })] }), _jsx(CardContent, { className: "p-0", children: _jsx("div", { className: "max-h-[420px] overflow-auto", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-10", children: "#" }), _jsx(TableHead, { children: "Bedrijf" }), _jsx(TableHead, { children: "E-mail" }), _jsx(TableHead, { children: "Plaats" }), _jsx(TableHead, { children: "Land" }), _jsx(TableHead, { children: "Status" })] }) }), _jsx(TableBody, { children: rows.map((r, i) => (_jsxs(TableRow, { className: r.errors.length > 0 ? "bg-destructive/5" : "", children: [_jsx(TableCell, { className: "text-xs text-muted-foreground", children: i + 1 }), _jsx(TableCell, { className: "text-sm", children: r.raw.company_name || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.email || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.city || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.country || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { children: r.errors.length === 0 ? (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-success", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5" }), " OK"] })) : (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-destructive", title: r.errors.join("\n"), children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", r.errors[0]] })) })] }, i))) })] }) }) }), _jsxs("div", { className: "flex justify-end gap-2 p-4 border-t", children: [_jsx(Button, { variant: "outline", onClick: () => {
424
+ }, children: "Wissen" })] })] })), rows.length > 0 && (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs(CardTitle, { className: "text-base", children: ["3. Voorbeeld (", rows.length, " rijen)"] }), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsxs(Badge, { variant: "secondary", className: "bg-success/10 text-success", children: [_jsx(CheckCircle2, { className: "h-3 w-3 mr-1" }), " ", validCount, " geldig"] }), rows.filter((r) => r.errors.length === 0 && r.warnings.length > 0).length > 0 && (_jsxs(Badge, { variant: "secondary", className: "bg-warning/10 text-warning", children: [_jsx(AlertTriangle, { className: "h-3 w-3 mr-1" }), rows.filter((r) => r.errors.length === 0 && r.warnings.length > 0).length, " met waarschuwingen"] })), invalidCount > 0 && (_jsxs(Badge, { variant: "secondary", className: "bg-destructive/10 text-destructive", children: [_jsx(XCircle, { className: "h-3 w-3 mr-1" }), " ", invalidCount, " ongeldig"] }))] })] }), _jsx(CardContent, { className: "p-0", children: _jsx("div", { className: "max-h-[420px] overflow-auto", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-10", children: "#" }), _jsx(TableHead, { children: "Bedrijf" }), _jsx(TableHead, { children: "E-mail" }), _jsx(TableHead, { children: "Plaats" }), _jsx(TableHead, { children: "Land" }), _jsx(TableHead, { children: "Status" })] }) }), _jsx(TableBody, { children: rows.map((r, i) => (_jsxs(TableRow, { className: r.errors.length > 0
425
+ ? "bg-destructive/5"
426
+ : r.warnings.length > 0
427
+ ? "bg-warning/5"
428
+ : "", children: [_jsx(TableCell, { className: "text-xs text-muted-foreground", children: i + 1 }), _jsx(TableCell, { className: "text-sm", children: r.raw.company_name || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.email || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.city || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { className: "text-sm", children: r.raw.country || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { children: r.errors.length > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-destructive", title: r.errors.join("\n"), children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", r.errors[0]] })) : r.warnings.length > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-warning", title: r.warnings.join("\n"), children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), r.warnings.length === 1
429
+ ? r.warnings[0]
430
+ : `${r.warnings.length} waarschuwingen`] })) : (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-success", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5" }), " OK"] })) })] }, i))) })] }) }) }), _jsxs("div", { className: "flex justify-end gap-2 p-4 border-t", children: [_jsx(Button, { variant: "outline", onClick: () => {
399
431
  setRows([]);
400
432
  setFileName("");
401
433
  setResult(null);
@@ -1 +1 @@
1
- {"version":3,"file":"NetwerkPagina.d.ts","sourceRoot":"","sources":["../../../src/components/klanten/NetwerkPagina.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,aAAa,gCAyH5B"}
1
+ {"version":3,"file":"NetwerkPagina.d.ts","sourceRoot":"","sources":["../../../src/components/klanten/NetwerkPagina.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,aAAa,gCAwO5B"}
@@ -1,23 +1,52 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Link } from "@tanstack/react-router";
3
3
  import { useQuery } from "@tanstack/react-query";
4
4
  import { useServerFn } from "@tanstack/react-start";
5
5
  import { useState } from "react";
6
6
  import { Input, Card, CardContent, Badge, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Switch, Label, } from "@flowselections/core";
7
- import { ArrowLeft, Search } from "lucide-react";
7
+ import { ArrowLeft, Search, MapPin, Globe } from "lucide-react";
8
8
  import { listFloridayNetwork } from "../../lib/customers.functions";
9
+ import { CustomerAvatar } from "../CustomerAvatar";
10
+ const TYPE_OPTIONS = [
11
+ { value: "CUSTOMER", label: "Klant" },
12
+ { value: "AGENT", label: "Agent" },
13
+ { value: "SUPPLIER", label: "Leverancier" },
14
+ { value: "CARRIER", label: "Vervoerder" },
15
+ { value: "OTHER", label: "Overig" },
16
+ ];
9
17
  export function NetwerkPagina() {
10
18
  const [search, setSearch] = useState("");
11
- const [hideUnknown, setHideUnknown] = useState(true);
19
+ const [hideUnknown, setHideUnknown] = useState(false);
20
+ const [types, setTypes] = useState(["CUSTOMER", "AGENT"]);
21
+ const [includeExpired, setIncludeExpired] = useState(false);
12
22
  const list = useServerFn(listFloridayNetwork);
13
23
  const { data, isLoading } = useQuery({
14
- queryKey: ["floriday-network", search],
15
- queryFn: () => list({ data: { search } }),
24
+ queryKey: ["floriday-network", search, types, includeExpired],
25
+ queryFn: () => list({ data: { search, types, includeExpired, limit: 1000 } }),
16
26
  });
17
27
  const all = data?.organizations ?? [];
18
- const orgs = hideUnknown
19
- ? all.filter((o) => o.organization_name && o.organization_name.trim() !== "")
20
- : all;
28
+ const named = all.filter((o) => o.organization_name && o.organization_name.trim() !== "");
29
+ const orgs = hideUnknown ? named : all;
21
30
  const hiddenCount = all.length - orgs.length;
22
- return (_jsxs("main", { className: "p-6 space-y-4", children: [_jsx("div", { className: "flex items-center justify-between gap-4", children: _jsxs("div", { children: [_jsxs(Link, { to: "/klanten", className: "text-sm text-muted-foreground hover:text-foreground inline-flex items-center gap-1", children: [_jsx(ArrowLeft, { className: "h-3 w-3" }), " Terug naar klanten"] }), _jsx("h1", { className: "text-2xl font-semibold mt-1", children: "Klanten toevoegen uit netwerk" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Doorzoek alle organisaties die via het netwerk beschikbaar zijn." })] }) }), _jsxs("div", { className: "relative max-w-md", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }), _jsx(Input, { placeholder: "Zoek op organisatienaam of GLN...", value: search, onChange: (e) => setSearch(e.target.value), className: "pl-9" })] }), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Switch, { id: "hide-unknown", checked: hideUnknown, onCheckedChange: setHideUnknown }), _jsx(Label, { htmlFor: "hide-unknown", className: "cursor-pointer", children: "Verberg organisaties zonder naam" }), hideUnknown && hiddenCount > 0 ? (_jsxs("span", { className: "text-muted-foreground", children: ["(", hiddenCount, " verborgen)"] })) : null] }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Organisatie" }), _jsx(TableHead, { children: "GLN" }), _jsx(TableHead, { children: "Plaats" }), _jsx(TableHead, { children: "Land" }), _jsx(TableHead, { children: "Bijgewerkt" })] }) }), _jsx(TableBody, { children: isLoading ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 5, className: "text-center py-8 text-muted-foreground", children: "Laden..." }) })) : orgs.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 5, className: "text-center py-8 text-muted-foreground", children: "Geen organisaties gevonden." }) })) : (orgs.map((o) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: o.organization_name && o.organization_name.trim() !== "" ? (o.organization_name) : (_jsx("span", { className: "italic text-muted-foreground", children: "Onbekende organisatie" })) }), _jsx(TableCell, { children: o.gln ? (_jsx(Badge, { variant: "outline", children: o.gln })) : ("—") }), _jsx(TableCell, { children: o.city ?? "—" }), _jsx(TableCell, { children: o.country ?? "—" }), _jsx(TableCell, { className: "text-muted-foreground text-sm", children: new Date(o.fetched_at).toLocaleDateString("nl-NL") })] }, `${o.connection_id}-${o.organization_id}`)))) })] }) }) })] }));
31
+ const totalMatching = data?.total ?? all.length;
32
+ const truncated = !!data?.truncated;
33
+ const toggleType = (value) => {
34
+ setTypes((prev) => prev.includes(value) ? prev.filter((t) => t !== value) : [...prev, value]);
35
+ };
36
+ return (_jsxs("main", { className: "p-6 space-y-4", children: [_jsx("div", { className: "flex items-center justify-between gap-4", children: _jsxs("div", { children: [_jsxs(Link, { to: "/klanten", className: "text-sm text-muted-foreground hover:text-foreground inline-flex items-center gap-1", children: [_jsx(ArrowLeft, { className: "h-3 w-3" }), " Terug naar klanten"] }), _jsx("h1", { className: "text-2xl font-semibold mt-1", children: "Klanten toevoegen uit netwerk" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Doorzoek alle organisaties die via het netwerk beschikbaar zijn." })] }) }), _jsxs("div", { className: "relative max-w-md", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }), _jsx(Input, { placeholder: "Zoek op organisatienaam of GLN...", value: search, onChange: (e) => setSearch(e.target.value), className: "pl-9" })] }), _jsx("div", { className: "flex items-center gap-2 flex-wrap", children: TYPE_OPTIONS.map((opt) => {
37
+ const active = types.includes(opt.value);
38
+ return (_jsx("button", { type: "button", onClick: () => toggleType(opt.value), className: "inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs transition-colors " +
39
+ (active
40
+ ? "bg-primary text-primary-foreground border-primary"
41
+ : "bg-card text-muted-foreground border-border hover:bg-muted"), children: opt.label }, opt.value));
42
+ }) }), _jsxs("div", { className: "flex items-center gap-6 flex-wrap text-sm", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { id: "include-expired", checked: includeExpired, onCheckedChange: setIncludeExpired }), _jsx(Label, { htmlFor: "include-expired", className: "cursor-pointer", children: "Toon be\u00EBindigde relaties" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { id: "hide-unknown", checked: hideUnknown, onCheckedChange: setHideUnknown }), _jsx(Label, { htmlFor: "hide-unknown", className: "cursor-pointer", children: "Verberg organisaties zonder naam" }), hideUnknown && hiddenCount > 0 ? (_jsxs("span", { className: "text-muted-foreground", children: ["(", hiddenCount, " verborgen)"] })) : null] })] }), _jsx("div", { className: "text-xs text-muted-foreground", children: isLoading ? ("Laden…") : (_jsxs(_Fragment, { children: [_jsx("span", { className: "font-medium text-foreground", children: orgs.length.toLocaleString("nl-NL") }), " ", "weergegeven van", " ", _jsx("span", { className: "font-medium text-foreground", children: totalMatching.toLocaleString("nl-NL") }), " ", "organisaties \u00B7 bron: Floriday", truncated && (_jsx("span", { className: "ml-1 text-warning", children: "(verfijn de zoekopdracht om alles te zien)" }))] })) }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Organisatie" }), _jsx(TableHead, { children: "GLN" }), _jsx(TableHead, { children: "Adres" }), _jsx(TableHead, { children: "Land" }), _jsx(TableHead, { children: "Type" }), _jsx(TableHead, { children: "Bijgewerkt" })] }) }), _jsx(TableBody, { children: isLoading ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "text-center py-8 text-muted-foreground", children: "Laden..." }) })) : orgs.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "text-center py-8 text-muted-foreground", children: "Geen organisaties gevonden." }) })) : (orgs.map((o) => {
43
+ const displayName = o.organization_name && o.organization_name.trim() !== ""
44
+ ? o.organization_name
45
+ : null;
46
+ const addressBits = [
47
+ o.address_line,
48
+ [o.postal_code, o.city].filter(Boolean).join(" "),
49
+ ].filter((x) => x && String(x).trim() !== "");
50
+ return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "py-3", children: _jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [_jsx(CustomerAvatar, { logoUrl: o.logo_url, name: displayName ?? "?", size: "sm" }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "font-medium truncate flex items-center gap-2", children: [displayName ? (_jsx("span", { className: "truncate", children: displayName })) : (_jsx("span", { className: "italic text-muted-foreground", children: "Onbekende organisatie" })), o.is_expired && (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase tracking-wide", children: "be\u00EBindigd" }))] }), o.commercial_name && (_jsx("div", { className: "text-xs text-muted-foreground truncate", children: o.commercial_name })), o.website && (_jsxs("a", { href: o.website.startsWith("http") ? o.website : `https://${o.website}`, target: "_blank", rel: "noreferrer", className: "text-xs text-muted-foreground inline-flex items-center gap-1 hover:underline", children: [_jsx(Globe, { className: "h-3 w-3" }), " ", o.website] }))] })] }) }), _jsx(TableCell, { children: o.gln ? _jsx(Badge, { variant: "outline", children: o.gln }) : "—" }), _jsx(TableCell, { className: "text-sm", children: addressBits.length ? (_jsx("div", { className: "min-w-0", children: _jsxs("div", { className: "inline-flex items-start gap-1 text-muted-foreground", children: [_jsx(MapPin, { className: "h-3 w-3 mt-0.5 shrink-0" }), _jsx("span", { className: "truncate", children: addressBits.join(", ") })] }) })) : ("—") }), _jsx(TableCell, { children: o.country ?? "—" }), _jsx(TableCell, { className: "text-xs text-muted-foreground uppercase tracking-wide", children: o.organization_type ?? "—" }), _jsx(TableCell, { className: "text-muted-foreground text-sm", children: new Date(o.fetched_at).toLocaleDateString("nl-NL") })] }, `${o.connection_id}-${o.organization_id}`));
51
+ })) })] }) }) })] }));
23
52
  }
@@ -91,91 +91,91 @@ export declare const customerUpdateSchema: z.ZodObject<{
91
91
  }, z.core.$strip>;
92
92
  export type CustomerUpdateInput = z.infer<typeof customerUpdateSchema>;
93
93
  export declare const customerImportRowSchema: z.ZodObject<{
94
- customer_class: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
95
- email: z.ZodString;
96
- notes: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
97
94
  company_name: z.ZodString;
95
+ email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
96
+ street: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
97
+ house_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
98
+ country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
99
+ vat_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
98
100
  contact_person: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
99
101
  phone: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
100
- city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
101
- country: z.ZodString;
102
- house_number: z.ZodString;
103
102
  postal_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
104
- street: z.ZodString;
103
+ city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
104
+ customer_class: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
105
+ notes: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
106
+ customer_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
107
+ language: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
108
+ website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
109
+ billing_email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
110
+ address_type: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
105
111
  address_line1: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
106
112
  address_line2: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
107
- address_type: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
113
+ icp_country_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
108
114
  attention_to: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
115
+ fax: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
116
+ coc_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
117
+ bank_name: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
109
118
  bank_account_holder: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
110
119
  bank_account_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
120
+ bank_iban: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
121
+ bank_bic: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
122
+ bank_national_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
111
123
  bank_address_line1: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
112
124
  bank_address_line2: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
113
- bank_bic: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
114
- bank_city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
115
- bank_country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
116
125
  bank_house_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
117
- bank_iban: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
118
- bank_name: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
119
- bank_national_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
120
126
  bank_postal_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
127
+ bank_city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
121
128
  bank_state: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
122
- billing_email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
123
- coc_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
124
- customer_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
125
- discount_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
129
+ bank_country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
126
130
  discount_percentage: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
127
- fax: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
128
- icp_country_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
129
- language: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
131
+ discount_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
130
132
  payment_term_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
131
133
  vat_display: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
132
- vat_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
133
- website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
134
134
  is_active: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
135
135
  }, z.core.$strip>;
136
136
  export type CustomerImportRow = z.infer<typeof customerImportRowSchema>;
137
137
  export declare const customerImportSchema: z.ZodObject<{
138
138
  rows: z.ZodArray<z.ZodObject<{
139
- customer_class: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
140
- email: z.ZodString;
141
- notes: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
142
139
  company_name: z.ZodString;
140
+ email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
141
+ street: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
142
+ house_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
143
+ country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
144
+ vat_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
143
145
  contact_person: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
144
146
  phone: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
145
- city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
146
- country: z.ZodString;
147
- house_number: z.ZodString;
148
147
  postal_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
149
- street: z.ZodString;
148
+ city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
149
+ customer_class: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
150
+ notes: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
151
+ customer_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
152
+ language: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
153
+ website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
154
+ billing_email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
155
+ address_type: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
150
156
  address_line1: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
151
157
  address_line2: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
152
- address_type: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
158
+ icp_country_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
153
159
  attention_to: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
160
+ fax: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
161
+ coc_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
162
+ bank_name: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
154
163
  bank_account_holder: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
155
164
  bank_account_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
165
+ bank_iban: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
166
+ bank_bic: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
167
+ bank_national_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
156
168
  bank_address_line1: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
157
169
  bank_address_line2: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
158
- bank_bic: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
159
- bank_city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
160
- bank_country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
161
170
  bank_house_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
162
- bank_iban: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
163
- bank_name: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
164
- bank_national_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
165
171
  bank_postal_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
172
+ bank_city: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
166
173
  bank_state: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
167
- billing_email: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
168
- coc_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
169
- customer_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
170
- discount_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
174
+ bank_country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
171
175
  discount_percentage: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
172
- fax: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
173
- icp_country_code: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
174
- language: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
176
+ discount_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
175
177
  payment_term_days: z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>, z.ZodTransform<number | undefined, string | number | undefined>>;
176
178
  vat_display: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
177
- vat_number: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
178
- website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
179
179
  is_active: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
180
180
  }, z.core.$strip>>;
181
181
  skipDuplicates: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -1 +1 @@
1
- {"version":3,"file":"customer-schemas.d.ts","sourceRoot":"","sources":["../../src/lib/customer-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgD/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAEG,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIhC,CAAC;AAEL,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAM5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"customer-schemas.d.ts","sourceRoot":"","sources":["../../src/lib/customer-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgD/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAEG,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAKvE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2ChC,CAAC;AAEL,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAM5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -70,9 +70,51 @@ export const customerCreateSchema = z.object({
70
70
  export const customerUpdateSchema = customerCreateSchema
71
71
  .partial()
72
72
  .extend({ id: z.string().uuid() });
73
- export const customerImportRowSchema = customerCreateSchema
74
- .omit({ force: true })
75
- .extend({
73
+ // Import is bewust erg lenient: alleen `company_name` is verplicht. Alle
74
+ // andere velden mogen leeg zijn — ontbrekende gegevens worden na de import
75
+ // als waarschuwing getoond zodat de gebruiker ze later kan aanvullen.
76
+ export const customerImportRowSchema = z
77
+ .object({
78
+ company_name: z.string().trim().min(1, "Bedrijfsnaam is verplicht").max(255),
79
+ email: optStr(255),
80
+ street: optStr(255),
81
+ house_number: optStr(32),
82
+ country: optStr(64),
83
+ vat_number: optStr(64),
84
+ contact_person: optStr(255),
85
+ phone: optStr(64),
86
+ postal_code: optStr(32),
87
+ city: optStr(128),
88
+ customer_class: optStr(64),
89
+ notes: optStr(5000),
90
+ customer_number: optStr(64),
91
+ language: optStr(16),
92
+ website: optStr(255),
93
+ billing_email: optStr(255),
94
+ address_type: optStr(64),
95
+ address_line1: optStr(255),
96
+ address_line2: optStr(255),
97
+ icp_country_code: optStr(8),
98
+ attention_to: optStr(255),
99
+ fax: optStr(64),
100
+ coc_number: optStr(64),
101
+ bank_name: optStr(128),
102
+ bank_account_holder: optStr(255),
103
+ bank_account_number: optStr(64),
104
+ bank_iban: optStr(64),
105
+ bank_bic: optStr(32),
106
+ bank_national_code: optStr(32),
107
+ bank_address_line1: optStr(255),
108
+ bank_address_line2: optStr(255),
109
+ bank_house_number: optStr(32),
110
+ bank_postal_code: optStr(32),
111
+ bank_city: optStr(128),
112
+ bank_state: optStr(128),
113
+ bank_country: optStr(64),
114
+ discount_percentage: optNum(),
115
+ discount_days: optInt(),
116
+ payment_term_days: optInt(),
117
+ vat_display: optStr(32),
76
118
  is_active: z.boolean().optional().default(true),
77
119
  });
78
120
  export const customerImportSchema = z.object({
@@ -68479,18 +68479,35 @@ export declare const listFloridayNetwork: import("@tanstack/start-client-core").
68479
68479
  claims: import("@supabase/auth-js").JwtPayload;
68480
68480
  }, undefined, undefined, undefined>], (input: {
68481
68481
  search?: string;
68482
+ types?: string[];
68483
+ includeExpired?: boolean;
68484
+ limit?: number;
68482
68485
  }) => {
68483
68486
  search: string;
68487
+ types: string[];
68488
+ includeExpired: boolean;
68489
+ limit: number;
68484
68490
  }, Promise<{
68485
68491
  organizations: {
68486
- connection_id: string;
68487
- organization_id: string;
68488
- organization_name: string | null;
68489
- gln: string | null;
68490
- country: string | null;
68491
- city: string | null;
68492
- fetched_at: string;
68492
+ connection_id: any;
68493
+ organization_id: any;
68494
+ organization_name: string;
68495
+ commercial_name: string | null;
68496
+ gln: any;
68497
+ city: any;
68498
+ country: any;
68499
+ postal_code: any;
68500
+ address_line: any;
68501
+ organization_type: string | null;
68502
+ logo_url: string | null;
68503
+ website: string | null;
68504
+ end_date: string | null;
68505
+ is_expired: boolean;
68506
+ fetched_at: any;
68493
68507
  }[];
68508
+ total: number;
68509
+ limit: number;
68510
+ truncated: boolean;
68494
68511
  }>>;
68495
68512
  export declare const listCustomerClasses: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
68496
68513
  supabase: import("@supabase/supabase-js").SupabaseClient<import("../integrations/supabase/types").Database, "public", "public", {
@@ -91169,47 +91186,47 @@ export declare const bulkImportCustomers: import("@tanstack/start-client-core").
91169
91186
  claims: import("@supabase/auth-js").JwtPayload;
91170
91187
  }, undefined, undefined, undefined>], (input: CustomerImportInput) => {
91171
91188
  rows: {
91172
- email: string;
91173
91189
  company_name: string;
91174
- country: string;
91175
- house_number: string;
91176
- street: string;
91177
- discount_days: number | undefined;
91178
91190
  discount_percentage: number | undefined;
91191
+ discount_days: number | undefined;
91179
91192
  payment_term_days: number | undefined;
91180
91193
  is_active: boolean;
91181
- customer_class?: string | undefined;
91182
- notes?: string | undefined;
91194
+ email?: string | undefined;
91195
+ street?: string | undefined;
91196
+ house_number?: string | undefined;
91197
+ country?: string | undefined;
91198
+ vat_number?: string | undefined;
91183
91199
  contact_person?: string | undefined;
91184
91200
  phone?: string | undefined;
91185
- city?: string | undefined;
91186
91201
  postal_code?: string | undefined;
91202
+ city?: string | undefined;
91203
+ customer_class?: string | undefined;
91204
+ notes?: string | undefined;
91205
+ customer_number?: string | undefined;
91206
+ language?: string | undefined;
91207
+ website?: string | undefined;
91208
+ billing_email?: string | undefined;
91209
+ address_type?: string | undefined;
91187
91210
  address_line1?: string | undefined;
91188
91211
  address_line2?: string | undefined;
91189
- address_type?: string | undefined;
91212
+ icp_country_code?: string | undefined;
91190
91213
  attention_to?: string | undefined;
91214
+ fax?: string | undefined;
91215
+ coc_number?: string | undefined;
91216
+ bank_name?: string | undefined;
91191
91217
  bank_account_holder?: string | undefined;
91192
91218
  bank_account_number?: string | undefined;
91219
+ bank_iban?: string | undefined;
91220
+ bank_bic?: string | undefined;
91221
+ bank_national_code?: string | undefined;
91193
91222
  bank_address_line1?: string | undefined;
91194
91223
  bank_address_line2?: string | undefined;
91195
- bank_bic?: string | undefined;
91196
- bank_city?: string | undefined;
91197
- bank_country?: string | undefined;
91198
91224
  bank_house_number?: string | undefined;
91199
- bank_iban?: string | undefined;
91200
- bank_name?: string | undefined;
91201
- bank_national_code?: string | undefined;
91202
91225
  bank_postal_code?: string | undefined;
91226
+ bank_city?: string | undefined;
91203
91227
  bank_state?: string | undefined;
91204
- billing_email?: string | undefined;
91205
- coc_number?: string | undefined;
91206
- customer_number?: string | undefined;
91207
- fax?: string | undefined;
91208
- icp_country_code?: string | undefined;
91209
- language?: string | undefined;
91228
+ bank_country?: string | undefined;
91210
91229
  vat_display?: string | undefined;
91211
- vat_number?: string | undefined;
91212
- website?: string | undefined;
91213
91230
  }[];
91214
91231
  skipDuplicates: boolean;
91215
91232
  }, Promise<{