From 427c64902722515b5b60ffec570e3d01f205e962 Mon Sep 17 00:00:00 2001 From: Felix Cornelissen Date: Wed, 13 Mar 2024 13:48:34 +0100 Subject: [PATCH 1/2] REFACTOR use kvk zoeken v2 --- .env.local.example | 2 +- README.md | 2 +- package-lock.json | 12 ++++---- src/features/klant/bedrijf/service.ts | 43 ++++++++++++++++----------- 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/.env.local.example b/.env.local.example index cc4dce059..ee79e2514 100644 --- a/.env.local.example +++ b/.env.local.example @@ -1,7 +1,7 @@ OIDC_CLIENT_SECRET= OIDC_CLIENT_ID= OIDC_AUTHORITY= -KVK_BASE_URL= +KVK_BASE_URL=https://api.kvk.nl/test/api KVK_API_KEY= HAAL_CENTRAAL_BASE_URL= HAAL_CENTRAAL_API_KEY= diff --git a/README.md b/README.md index a717f870e..008f6922b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 1. Make a copy of .env.local.example, rename it .env.local and fill in the required secrets. This is a subset, a complete overview can be found at https://kiss-klantinteractie-servicesysteem.readthedocs.io/en/latest/INSTALLATION/: - `OIDC_CLIENT_SECRET`, `OIDC_CLIENT_ID`, `OIDC_AUTHORITY`: use any OIDC provider. Users have access if they have a claim of either type `role` or type `roles` and a value that corresponds to the environment variable `OIDC_KLANTCONTACTMEDEWERKER_ROLE` (`Klantcontactmedewerker` by default). If you're using Azure AD, this can be done by [creating an application role and assigning it to either groups or individual users](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps). Do the same with `OIDC_KLANTCONTACTMEDEWERKER_ROLE` (`Redacteur` by default) to enable a user to manage content in KISS. - `OIDC_MEDEWERKER_IDENTIFICATIE_CLAIM` and `OIDC_MEDEWERKER_IDENTIFICATIE_TRUNCATE`: the current ZGW standards limit the medewerker identificatie to a maximum of 24 characters. If you are using KISS with OpenKlant / OpenZaak, this means you either need to configure a claim in `OIDC_MEDEWERKER_IDENTIFICATIE_CLAIM` that will never exceed this limit, or configure for it to be truncated by setting `OIDC_MEDEWERKER_IDENTIFICATIE_TRUNCATE` to 24. If you are using KISS with the eSuite, make sure you configure a claim in `OIDC_MEDEWERKER_IDENTIFICATIE_CLAIM` that contains te username known in the eSuite. - - `KVK_BASE_URL`: for the KvK test environment, use `https://api.kvk.nl/test/api/v1` + - `KVK_BASE_URL`: for the KvK test environment, use `https://api.kvk.nl/test/api` - `KVK_API_KEY`: for the KvK test environment, look for the API key on [the KvK website](https://developers.kvk.nl/documentation/testing) 2. Download the Root and intermediate certificates from [the KvK website](https://developers.kvk.nl/documentation/install-tls-certificate#download-certificates) and place them in a `certificates` folder in the root of the repo Now, you can either run the application from Visual Studio or with docker-compose diff --git a/package-lock.json b/package-lock.json index 7b68a3336..e2ba44128 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2572,9 +2572,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -9302,9 +9302,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true }, "chai": { diff --git a/src/features/klant/bedrijf/service.ts b/src/features/klant/bedrijf/service.ts index d46e1592f..dc9e03521 100644 --- a/src/features/klant/bedrijf/service.ts +++ b/src/features/klant/bedrijf/service.ts @@ -17,30 +17,31 @@ import type { } from "./types"; export const bedrijfQuery = ( - query: BedrijfQuery + query: BedrijfQuery, ) => query; type KvkPagination = { pagina: number; - aantal: number; + resultatenPerPagina: number; totaal: number; resultaten: any[]; }; const parseKvkPagination = async ({ pagina, - aantal, + resultatenPerPagina, totaal, resultaten, }: KvkPagination): Promise> => ({ page: await Promise.all(resultaten.map(mapHandelsRegister)), pageNumber: pagina, totalRecords: totaal, - pageSize: aantal, - totalPages: totaal === 0 ? 0 : Math.ceil(totaal / aantal), + pageSize: resultatenPerPagina, + totalPages: totaal === 0 ? 0 : Math.ceil(totaal / resultatenPerPagina), }); const handelsRegisterBaseUrl = "/api/kvk"; +const zoekenUrl = `${handelsRegisterBaseUrl}/v2/zoeken`; const bedrijfQueryDictionary: BedrijfQueryDictionary = { postcodeHuisnummer: ({ postcode, huisnummer }) => [ @@ -48,7 +49,7 @@ const bedrijfQueryDictionary: BedrijfQueryDictionary = { ["huisnummer", huisnummer], ], kvkNummer: (search) => [["kvkNummer", search]], - handelsnaam: (search) => [["handelsnaam", search]], + handelsnaam: (search) => [["naam", search]], }; const getSearchBedrijvenUrl = ({ @@ -61,7 +62,8 @@ const getSearchBedrijvenUrl = ({ // TODO: think about how to search in both klantregister and handelsregister for phone / email params.set("pagina", page?.toString() ?? "1"); - params.set("type", "hoofdvestiging,nevenvestiging"); + params.set("type", "hoofdvestiging"); + params.append("type", "nevenvestiging"); const searchParams = bedrijfQueryDictionary[query.field](query.value); @@ -69,12 +71,17 @@ const getSearchBedrijvenUrl = ({ params.set(...tuple); }); - return `${handelsRegisterBaseUrl}/zoeken?${params}`; + return `${zoekenUrl}?${params}`; }; async function mapHandelsRegister(json: any): Promise { - const { vestigingsnummer, kvkNummer, handelsnaam, straatnaam, plaats } = - json ?? {}; + const { vestigingsnummer, kvkNummer, naam, adres } = json ?? {}; + + const { binnenlandsAdres, buitenlandsAdres } = adres ?? {}; + + const { straatnaam, plaats } = binnenlandsAdres ?? {}; + + const { straatHuisnummer, postcodeWoonplaats } = buitenlandsAdres ?? {}; let vestiging: KvkVestiging | undefined; @@ -90,9 +97,9 @@ async function mapHandelsRegister(json: any): Promise { _typeOfKlant: "bedrijf", kvkNummer, vestigingsnummer, - bedrijfsnaam: handelsnaam, - straatnaam, - woonplaats: plaats, + bedrijfsnaam: naam, + straatnaam: straatnaam || straatHuisnummer, + woonplaats: plaats || postcodeWoonplaats, ...(vestiging ?? {}), }; } @@ -162,31 +169,31 @@ type SearchBedrijfArguments = { }; export function useSearchBedrijven( - getArgs: () => SearchBedrijfArguments + getArgs: () => SearchBedrijfArguments, ) { return ServiceResult.fromFetcher( () => getSearchBedrijvenUrl(getArgs()), - searchBedrijvenInHandelsRegister + searchBedrijvenInHandelsRegister, ); } const getVestingUrl = (vestigingsnummer?: string) => { if (!vestigingsnummer) return ""; - return handelsRegisterBaseUrl + "/vestigingsprofielen/" + vestigingsnummer; + return handelsRegisterBaseUrl + "/v1/vestigingsprofielen/" + vestigingsnummer; }; const fetchVestiging = (url: string) => fetchLoggedIn(url).then(throwIfNotOk).then(parseJson).then(mapVestiging); export const useBedrijfByVestigingsnummer = ( - getVestigingsnummer: () => string | undefined + getVestigingsnummer: () => string | undefined, ) => { const getUrl = () => { const vestigingsnummer = getVestigingsnummer(); if (!vestigingsnummer) return ""; const searchParams = new URLSearchParams(); searchParams.set("vestigingsnummer", vestigingsnummer); - return `${handelsRegisterBaseUrl}/zoeken?${searchParams}`; + return `${zoekenUrl}?${searchParams}`; }; const getUniqueId = () => { From c1397ca0b63665cf92abfbe6e38a7126a03b4a18 Mon Sep 17 00:00:00 2001 From: mark stoker Date: Tue, 19 Mar 2024 09:17:11 +0100 Subject: [PATCH 2/2] refactoring bedrijf service --- src/features/klant/bedrijf/BedrijfZoeker.vue | 6 +- .../bedrijf/enricher/bedrijf-enricher.ts | 2 +- src/features/klant/bedrijf/service.ts | 210 ------------------ .../klant/bedrijf/service/BedrijfsQuery.ts | 5 + .../bedrijf/service/UseGetOndernememing.ts | 30 +++ .../bedrijf/service/UseSearchBedrijven.ts | 53 +++++ .../klant/bedrijf/service/shared/shared.ts | 130 +++++++++++ src/features/klant/index.ts | 2 +- 8 files changed, 224 insertions(+), 214 deletions(-) create mode 100644 src/features/klant/bedrijf/service/BedrijfsQuery.ts create mode 100644 src/features/klant/bedrijf/service/UseGetOndernememing.ts create mode 100644 src/features/klant/bedrijf/service/UseSearchBedrijven.ts create mode 100644 src/features/klant/bedrijf/service/shared/shared.ts diff --git a/src/features/klant/bedrijf/BedrijfZoeker.vue b/src/features/klant/bedrijf/BedrijfZoeker.vue index f35ecbb3d..ac5865c64 100644 --- a/src/features/klant/bedrijf/BedrijfZoeker.vue +++ b/src/features/klant/bedrijf/BedrijfZoeker.vue @@ -70,7 +70,8 @@ import { parseKvkNummer, parsePostcodeHuisnummer } from "@/helpers/validation"; import { ensureState } from "@/stores/create-store"; import { computed, ref, watch } from "vue"; -import { bedrijfQuery, useSearchBedrijven } from "./service"; +import { useSearchBedrijven } from "./service/UseSearchBedrijven"; + import SimpleSpinner from "@/components/SimpleSpinner.vue"; import Pagination from "@/nl-design-system/components/Pagination.vue"; import ApplicationMessage from "@/components/ApplicationMessage.vue"; @@ -86,6 +87,7 @@ import { import { KlantType } from "../types"; import { useRouter } from "vue-router"; import { FriendlyError } from "@/services"; +import { bedrijfQuery } from "./service/BedrijfsQuery"; type SearchFields = KlantSearchField | SearchCategories; const labels: { [key in SearchFields]: string } = { handelsnaam: "Bedrijfsnaam", @@ -159,7 +161,7 @@ watch( if (!(input instanceof HTMLInputElement)) return; input.setCustomValidity(query instanceof Error ? query.message : ""); }, - { immediate: true } + { immediate: true }, ); const klanten = useSearchKlanten({ diff --git a/src/features/klant/bedrijf/enricher/bedrijf-enricher.ts b/src/features/klant/bedrijf/enricher/bedrijf-enricher.ts index 97d9eaf08..cd0a12487 100644 --- a/src/features/klant/bedrijf/enricher/bedrijf-enricher.ts +++ b/src/features/klant/bedrijf/enricher/bedrijf-enricher.ts @@ -1,7 +1,7 @@ import type { Klant } from "../../types"; import { useKlantByVestigingsnummer } from "../../service"; import { combineEnrichers } from "@/services"; -import { useBedrijfByVestigingsnummer } from "../service"; +import { useBedrijfByVestigingsnummer } from "../service/UseGetOndernememing"; import type { Bedrijf } from "../types"; const isKlant = (klantOfBedrijf: Klant | Bedrijf): klantOfBedrijf is Klant => { diff --git a/src/features/klant/bedrijf/service.ts b/src/features/klant/bedrijf/service.ts index dc9e03521..e69de29bb 100644 --- a/src/features/klant/bedrijf/service.ts +++ b/src/features/klant/bedrijf/service.ts @@ -1,210 +0,0 @@ -import { - fetchLoggedIn, - parseJson, - ServiceResult, - throwIfNotOk, - type Paginated, - enforceOneOrZero, - defaultPagination, - FriendlyError, -} from "@/services"; - -import type { - SearchCategories, - BedrijfQuery, - BedrijfQueryDictionary, - Bedrijf, -} from "./types"; - -export const bedrijfQuery = ( - query: BedrijfQuery, -) => query; - -type KvkPagination = { - pagina: number; - resultatenPerPagina: number; - totaal: number; - resultaten: any[]; -}; - -const parseKvkPagination = async ({ - pagina, - resultatenPerPagina, - totaal, - resultaten, -}: KvkPagination): Promise> => ({ - page: await Promise.all(resultaten.map(mapHandelsRegister)), - pageNumber: pagina, - totalRecords: totaal, - pageSize: resultatenPerPagina, - totalPages: totaal === 0 ? 0 : Math.ceil(totaal / resultatenPerPagina), -}); - -const handelsRegisterBaseUrl = "/api/kvk"; -const zoekenUrl = `${handelsRegisterBaseUrl}/v2/zoeken`; - -const bedrijfQueryDictionary: BedrijfQueryDictionary = { - postcodeHuisnummer: ({ postcode, huisnummer }) => [ - ["postcode", postcode.numbers + postcode.digits], - ["huisnummer", huisnummer], - ], - kvkNummer: (search) => [["kvkNummer", search]], - handelsnaam: (search) => [["naam", search]], -}; - -const getSearchBedrijvenUrl = ({ - query, - page, -}: SearchBedrijfArguments) => { - if (!query?.value) return ""; - - const params = new URLSearchParams(); - // TODO: think about how to search in both klantregister and handelsregister for phone / email - - params.set("pagina", page?.toString() ?? "1"); - params.set("type", "hoofdvestiging"); - params.append("type", "nevenvestiging"); - - const searchParams = bedrijfQueryDictionary[query.field](query.value); - - searchParams.forEach((tuple) => { - params.set(...tuple); - }); - - return `${zoekenUrl}?${params}`; -}; - -async function mapHandelsRegister(json: any): Promise { - const { vestigingsnummer, kvkNummer, naam, adres } = json ?? {}; - - const { binnenlandsAdres, buitenlandsAdres } = adres ?? {}; - - const { straatnaam, plaats } = binnenlandsAdres ?? {}; - - const { straatHuisnummer, postcodeWoonplaats } = buitenlandsAdres ?? {}; - - let vestiging: KvkVestiging | undefined; - - if (vestigingsnummer) { - try { - vestiging = await fetchVestiging(getVestingUrl(vestigingsnummer)); - } catch (e) { - console.error(e); - } - } - - return { - _typeOfKlant: "bedrijf", - kvkNummer, - vestigingsnummer, - bedrijfsnaam: naam, - straatnaam: straatnaam || straatHuisnummer, - woonplaats: plaats || postcodeWoonplaats, - ...(vestiging ?? {}), - }; -} - -type KvkVestiging = { - vestigingsnummer: string; - kvkNummer: string; - handelsnaam: string; - postcode: string; - huisnummer: string; - huisletter: string; - huisnummertoevoeging: string; -}; - -const mapVestiging = ({ - vestigingsnummer, - kvkNummer, - eersteHandelsnaam, - adressen, -}: any): KvkVestiging => { - const { huisnummerToevoeging, postcode, huisnummer, huisletter } = - adressen?.find((x: any) => x?.type === "bezoekadres") ?? - adressen?.[0] ?? - {}; - - return { - vestigingsnummer, - kvkNummer, - handelsnaam: eersteHandelsnaam, - huisnummertoevoeging: huisnummerToevoeging, - postcode, - huisnummer, - huisletter, - }; -}; - -const hasFoutCode = (body: unknown, code: string) => { - if ( - body && - typeof body === "object" && - "fout" in body && - Array.isArray(body.fout) - ) { - return body.fout.some((x) => x?.code === code); - } - return false; -}; - -function searchBedrijvenInHandelsRegister(url: string) { - return fetchLoggedIn(url).then(async (r) => { - if (r.status === 404) { - const body = await r.json(); - if (hasFoutCode(body, "IPD5200")) return defaultPagination([]); - } - if (r.status === 400) { - throw new FriendlyError("Invalide zoekopdracht"); - } - throwIfNotOk(r); - const body = await r.json(); - return parseKvkPagination(body); - }); -} - -type SearchBedrijfArguments = { - query: BedrijfQuery | undefined; - page: number | undefined; -}; - -export function useSearchBedrijven( - getArgs: () => SearchBedrijfArguments, -) { - return ServiceResult.fromFetcher( - () => getSearchBedrijvenUrl(getArgs()), - searchBedrijvenInHandelsRegister, - ); -} - -const getVestingUrl = (vestigingsnummer?: string) => { - if (!vestigingsnummer) return ""; - return handelsRegisterBaseUrl + "/v1/vestigingsprofielen/" + vestigingsnummer; -}; - -const fetchVestiging = (url: string) => - fetchLoggedIn(url).then(throwIfNotOk).then(parseJson).then(mapVestiging); - -export const useBedrijfByVestigingsnummer = ( - getVestigingsnummer: () => string | undefined, -) => { - const getUrl = () => { - const vestigingsnummer = getVestigingsnummer(); - if (!vestigingsnummer) return ""; - const searchParams = new URLSearchParams(); - searchParams.set("vestigingsnummer", vestigingsnummer); - return `${zoekenUrl}?${searchParams}`; - }; - - const getUniqueId = () => { - const url = getUrl(); - return url && url + "_single"; - }; - - const fetcher = (url: string) => - searchBedrijvenInHandelsRegister(url).then(enforceOneOrZero); - - return ServiceResult.fromFetcher(getUrl, fetcher, { - getUniqueId, - }); -}; diff --git a/src/features/klant/bedrijf/service/BedrijfsQuery.ts b/src/features/klant/bedrijf/service/BedrijfsQuery.ts new file mode 100644 index 000000000..32dd459e0 --- /dev/null +++ b/src/features/klant/bedrijf/service/BedrijfsQuery.ts @@ -0,0 +1,5 @@ +import type { BedrijfQuery, SearchCategories } from "../types"; + +export const bedrijfQuery = ( + query: BedrijfQuery, +) => query; diff --git a/src/features/klant/bedrijf/service/UseGetOndernememing.ts b/src/features/klant/bedrijf/service/UseGetOndernememing.ts new file mode 100644 index 000000000..d6c8e13ee --- /dev/null +++ b/src/features/klant/bedrijf/service/UseGetOndernememing.ts @@ -0,0 +1,30 @@ +import { ServiceResult, enforceOneOrZero } from "@/services"; +import { searchBedrijvenInHandelsRegister } from "./shared/shared"; + +const zoekenUrl = "/api/kvk/v2/zoeken"; + +export const useBedrijfByVestigingsnummer = ( + getVestigingsnummer: () => string | undefined, +) => { + const getUrl = () => { + const vestigingsnummer = getVestigingsnummer(); + if (!vestigingsnummer) return ""; + const searchParams = new URLSearchParams(); + searchParams.set("vestigingsnummer", vestigingsnummer); + return `${zoekenUrl}?${searchParams}`; + }; + + // useBedrijfByVestigingsnummer private ////////////////////////// + + const getUniqueId = () => { + const url = getUrl(); + return url && url + "_single"; + }; + + const fetcher = (url: string) => + searchBedrijvenInHandelsRegister(url).then(enforceOneOrZero); + + return ServiceResult.fromFetcher(getUrl, fetcher, { + getUniqueId, + }); +}; diff --git a/src/features/klant/bedrijf/service/UseSearchBedrijven.ts b/src/features/klant/bedrijf/service/UseSearchBedrijven.ts new file mode 100644 index 000000000..525712e08 --- /dev/null +++ b/src/features/klant/bedrijf/service/UseSearchBedrijven.ts @@ -0,0 +1,53 @@ +import { ServiceResult } from "@/services"; + +import type { + SearchCategories, + BedrijfQuery, + BedrijfQueryDictionary, +} from "../types"; +import { searchBedrijvenInHandelsRegister, zoekenUrl } from "./shared/shared"; + +export function useSearchBedrijven( + getArgs: () => SearchBedrijfArguments, +) { + return ServiceResult.fromFetcher( + () => getSearchBedrijvenUrl(getArgs()), + searchBedrijvenInHandelsRegister, + ); +} + +// useSearchBedrijven private /////////////////////////////////////////// + +const getSearchBedrijvenUrl = ({ + query, + page, +}: SearchBedrijfArguments) => { + if (!query?.value) return ""; + + const params = new URLSearchParams(); + params.set("pagina", page?.toString() ?? "1"); + params.set("type", "hoofdvestiging"); + params.append("type", "nevenvestiging"); + + const searchParams = bedrijfQueryDictionary[query.field](query.value); + + searchParams.forEach((tuple) => { + params.set(...tuple); + }); + + return `${zoekenUrl}?${params}`; +}; + +type SearchBedrijfArguments = { + query: BedrijfQuery | undefined; + page: number | undefined; +}; + +const bedrijfQueryDictionary: BedrijfQueryDictionary = { + postcodeHuisnummer: ({ postcode, huisnummer }) => [ + ["postcode", postcode.numbers + postcode.digits], + ["huisnummer", huisnummer], + ], + kvkNummer: (search) => [["kvkNummer", search]], + handelsnaam: (search) => [["naam", search]], +}; diff --git a/src/features/klant/bedrijf/service/shared/shared.ts b/src/features/klant/bedrijf/service/shared/shared.ts new file mode 100644 index 000000000..5ff23870c --- /dev/null +++ b/src/features/klant/bedrijf/service/shared/shared.ts @@ -0,0 +1,130 @@ +import { + fetchLoggedIn, + parseJson, + throwIfNotOk, + type Paginated, + defaultPagination, + FriendlyError, +} from "@/services"; + +import type { Bedrijf } from "../../types"; + +export const zoekenUrl = "/api/kvk/v2/zoeken"; +const vestigingsprofielenUrl = "/api/kvk/v1/vestigingsprofielen/"; + +type KvkVestiging = { + vestigingsnummer: string; + kvkNummer: string; + handelsnaam: string; + postcode: string; + huisnummer: string; + huisletter: string; + huisnummertoevoeging: string; +}; + +export function searchBedrijvenInHandelsRegister(url: string) { + return fetchLoggedIn(url).then(async (r) => { + if (r.status === 404) { + const body = await r.json(); + if (hasFoutCode(body, "IPD5200")) return defaultPagination([]); + } + if (r.status === 400) { + throw new FriendlyError("Invalide zoekopdracht"); + } + throwIfNotOk(r); + const body = await r.json(); + return parseKvkPagination(body); + }); +} + +const parseKvkPagination = async ({ + pagina, + resultatenPerPagina, + totaal, + resultaten, +}: KvkPagination): Promise> => ({ + page: await Promise.all(resultaten.map(mapHandelsRegister)), + pageNumber: pagina, + totalRecords: totaal, + pageSize: resultatenPerPagina, + totalPages: totaal === 0 ? 0 : Math.ceil(totaal / resultatenPerPagina), +}); + +type KvkPagination = { + pagina: number; + resultatenPerPagina: number; + totaal: number; + resultaten: any[]; +}; + +async function mapHandelsRegister(json: any): Promise { + const { vestigingsnummer, kvkNummer, naam, adres } = json ?? {}; + + const { binnenlandsAdres, buitenlandsAdres } = adres ?? {}; + + const { straatnaam, plaats } = binnenlandsAdres ?? {}; + + const { straatHuisnummer, postcodeWoonplaats } = buitenlandsAdres ?? {}; + + let vestiging: KvkVestiging | undefined; + + if (vestigingsnummer) { + try { + vestiging = await fetchVestiging(getVestingUrl(vestigingsnummer)); + } catch (e) { + console.error(e); + } + } + + return { + _typeOfKlant: "bedrijf", + kvkNummer, + vestigingsnummer, + bedrijfsnaam: naam, + straatnaam: straatnaam || straatHuisnummer, + woonplaats: plaats || postcodeWoonplaats, + ...(vestiging ?? {}), + }; +} + +const fetchVestiging = (url: string) => + fetchLoggedIn(url).then(throwIfNotOk).then(parseJson).then(mapVestiging); + +const getVestingUrl = (vestigingsnummer?: string) => { + if (!vestigingsnummer) return ""; + return vestigingsprofielenUrl + vestigingsnummer; +}; + +const mapVestiging = ({ + vestigingsnummer, + kvkNummer, + eersteHandelsnaam, + adressen, +}: any): KvkVestiging => { + const { huisnummerToevoeging, postcode, huisnummer, huisletter } = + adressen?.find((x: any) => x?.type === "bezoekadres") ?? + adressen?.[0] ?? + {}; + + return { + vestigingsnummer, + kvkNummer, + handelsnaam: eersteHandelsnaam, + huisnummertoevoeging: huisnummerToevoeging, + postcode, + huisnummer, + huisletter, + }; +}; + +const hasFoutCode = (body: unknown, code: string) => { + if ( + body && + typeof body === "object" && + "fout" in body && + Array.isArray(body.fout) + ) { + return body.fout.some((x) => x?.code === code); + } + return false; +}; diff --git a/src/features/klant/index.ts b/src/features/klant/index.ts index a19bcc904..07206ba75 100644 --- a/src/features/klant/index.ts +++ b/src/features/klant/index.ts @@ -9,5 +9,5 @@ export { default as HandelsregisterGegevens } from "./bedrijf/HandelsregisterGeg export { default as KlantDetails } from "./KlantDetails.vue"; export { usePersoonByBsn } from "./persoon/service"; -export { useBedrijfByVestigingsnummer } from "./bedrijf/service"; +export { useBedrijfByVestigingsnummer } from "./bedrijf/service/UseGetOndernememing"; export { useKlantById } from "./service";