@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.
- package/dist-lib/components/CustomerAvatar.js +1 -1
- package/dist-lib/components/klanten/ImportKlanten.d.ts.map +1 -1
- package/dist-lib/components/klanten/ImportKlanten.js +44 -12
- package/dist-lib/components/klanten/NetwerkPagina.d.ts.map +1 -1
- package/dist-lib/components/klanten/NetwerkPagina.js +38 -9
- package/dist-lib/lib/customer-schemas.d.ts +46 -46
- package/dist-lib/lib/customer-schemas.d.ts.map +1 -1
- package/dist-lib/lib/customer-schemas.js +45 -3
- package/dist-lib/lib/customers.functions.d.ts +47 -30
- package/dist-lib/lib/customers.functions.d.ts.map +1 -1
- package/dist-lib/lib/customers.functions.js +55 -7
- package/package.json +2 -2
|
@@ -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-
|
|
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":"
|
|
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
|
-
|
|
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"
|
|
16
|
-
{ key: "street", label: "Straat"
|
|
17
|
-
{ key: "house_number", label: "Huisnummer"
|
|
18
|
-
{ key: "country", label: "Land"
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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":"
|
|
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(
|
|
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
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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:
|
|
68487
|
-
organization_id:
|
|
68488
|
-
organization_name: string
|
|
68489
|
-
|
|
68490
|
-
|
|
68491
|
-
city:
|
|
68492
|
-
|
|
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
|
-
|
|
91182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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<{
|