Skip to content

Commit

Permalink
Merge pull request #908 from Klantinteractie-Servicesysteem/feature/p…
Browse files Browse the repository at this point in the history
…c-414-Featureswitch

pc-414 featureswitch
  • Loading branch information
mstokericatt authored Oct 18, 2024
2 parents 2613307 + 73b3c97 commit 0bd8ed5
Show file tree
Hide file tree
Showing 32 changed files with 1,222 additions and 572 deletions.
3 changes: 1 addition & 2 deletions src/features/bedrijf/bedrijf-zoeken/BedrijvenOverzicht.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@
<script lang="ts" setup>
import type { Bedrijf } from "@/services/kvk";
import BedrijvenOverzichtRow from "./BedrijvenOverzichtRow.vue";
import type { Klant } from "@/services/klanten";
defineProps<{
records: Array<Bedrijf | Klant>;
records: Array<Bedrijf>;
navigateOnSingleResult?: boolean;
}>();
</script>
108 changes: 60 additions & 48 deletions src/features/bedrijf/bedrijf-zoeken/BedrijvenOverzichtRow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@
</template>
</th>
<td>
{{ bedrijf.data?.kvkNummer || klant.data?.kvkNummer }}
{{ bedrijf.data?.kvkNummer }}
</td>
<td>
<div class="skeleton" v-if="bedrijf.loading" />
<template v-if="bedrijf.success">
{{ bedrijf.data?.vestigingsnummer }}
</template>
</td>

<td>
<div class="skeleton" v-if="bedrijf.loading" />
<template v-if="bedrijf.success">
Expand All @@ -26,27 +27,29 @@
</template>
</td>
<td class="wrap">
<div class="skeleton" v-if="klant.loading" />
<template v-if="klant.success">
<div class="skeleton" v-if="matchingKlant.loading" />
<template v-if="matchingKlant.success">
{{
klant.data?.emailadressen?.join(", ")
matchingKlant.data?.emailadressen?.join(", ")
}}
</template>
</td>
<td class="wrap">
<div class="skeleton" v-if="klant.loading" />
<template v-if="klant.success">
<div class="skeleton" v-if="matchingKlant.loading" />
<template v-if="matchingKlant.success">
{{
klant.data?.telefoonnummers.join(", ")
matchingKlant.data?.telefoonnummers.join(", ")
}}
</template>
</td>
<td>
<div class="skeleton" v-if="klant.loading || bedrijf.loading" />
<router-link v-if="klant.data"
:title="`Details ${naam}`"
:to="getKlantUrl(klant.data)"
@click="setCache(klant.data, bedrijf.data)" />
<div class="skeleton" v-if="matchingKlant.loading || bedrijf.loading" />

<template v-if="matchingKlant.success && matchingKlant.data">
<router-link :title="`Details ${naam}`"
:to="getKlantUrl(matchingKlant.data)"
@click="setCache(matchingKlant.data, bedrijf.data)" />
</template>
<button v-else-if="bedrijf.data && bedrijfIdentifier"
type="button"
title="Aanmaken"
Expand All @@ -56,72 +59,78 @@
</template>
<script lang="ts" setup>
import { computed, watchEffect } from "vue";
import type { Klant } from "@/services/klanten";
import { useBedrijfByIdentifier } from "../use-bedrijf-by-identifier";

import { useKlantByBedrijfIdentifier } from "./use-klant-by-bedrijf-identifier";
import type { Bedrijf, BedrijfIdentifier } from "@/services/kvk";
import { useRouter } from "vue-router";
import { mutate } from "swrv";
import { ensureKlantForBedrijfIdentifier } from "./ensure-klant-for-bedrijf-identifier";
import type { Klant } from "@/services/openklant/types";

const props = defineProps<{ item: Bedrijf | Klant; autoNavigate?: boolean }>();
const props = defineProps<{
item: Bedrijf | Klant;
autoNavigate?: boolean;
}>();

const matchingBedrijf = useBedrijfByIdentifier(() => {
// we hebben al een bedrijf, we hoeven die niet meer op te zoeken
if (props.item._typeOfKlant === "bedrijf") return undefined;
const { vestigingsnummer, rsin } = props.item;
if (vestigingsnummer)
return {
vestigingsnummer,
};
if (rsin)
return {
rsin,
};
});
// const matchingBedrijf = useBedrijfByIdentifier(() => {
// wordt niet meer gebruikt, alleen relevant als we een klant hebben en kvkv gegevens erbij willen zoeken/
// maar dat was alleen relevant toen een klant ook uit openklant gevonden kon worden adhv telefoonnumer en email, maar dat is momenteel niet meer mogelijk
// if (props.item._typeOfKlant === "bedrijf") return undefined;
// const { vestigingsnummer, rsin } = props.item;
// if (vestigingsnummer)
// return {
// vestigingsnummer,
// };
// if (rsin)
// return {
// rsin,
// };
// });

const matchingKlant = useKlantByBedrijfIdentifier(() => {
// we hebben al een klant, we hoeven die niet meer op te zoeken
if (props.item._typeOfKlant === "klant") return undefined;
const { vestigingsnummer, rsin } = props.item;

const { vestigingsnummer, kvkNummer } = props.item;

if (vestigingsnummer)
return {
vestigingsnummer,
};
if (rsin)
// if (rsin)
// return {
// rsin, //openklant1 gebruikte rsin. esuite kvknummer.
// };
if (kvkNummer)
return {
rsin,
kvkNummer, //openklant1 gebruikte rsin. esuite kvknummer.
};
});

const bedrijf = computed(() =>
props.item._typeOfKlant === "bedrijf"
? { data: props.item, success: true, loading: false, error: false }
: { ...matchingBedrijf },
: { success: false, loading: false },
);

const klant = computed(() =>
props.item._typeOfKlant === "klant"
? { data: props.item, success: true, loading: false, error: false }
: { ...matchingKlant },
);

const naam = computed(
() =>
bedrijf.value.data?.bedrijfsnaam || klant.value.data?.bedrijfsnaam || "",
);
const naam = computed(() => bedrijf.value.data?.bedrijfsnaam || "");

const bedrijfIdentifier = computed<BedrijfIdentifier | undefined>(() => {
const { rsin, kvkNummer, vestigingsnummer } = bedrijf.value.data ?? {};
if (vestigingsnummer)
return {
vestigingsnummer,
};

if (rsin)
return {
rsin,
kvkNummer,
};

if (kvkNummer)
return {
kvkNummer,
};
return undefined;
});

Expand All @@ -132,23 +141,26 @@ const getKlantUrl = (klant: Klant) => `/bedrijven/${klant.id}`;
const setCache = (klant: Klant, bedrijf?: Bedrijf | null) => {
mutate(klant.id, klant);
const bedrijfId = bedrijf?.vestigingsnummer || bedrijf?.rsin;

if (bedrijfId) {
mutate("bedrijf" + bedrijfId, bedrijf);
}
};

async function navigate(bedrijf: Bedrijf, identifier: BedrijfIdentifier) {
const newKlant =
klant.value.data || (await ensureKlantForBedrijfIdentifier(identifier));
setCache(newKlant, bedrijf);
const url = getKlantUrl(newKlant);
const bedrijfsnaam = bedrijf.bedrijfsnaam;
const klant = await ensureKlantForBedrijfIdentifier(identifier, bedrijfsnaam);

setCache(klant, bedrijf);

const url = getKlantUrl(klant);
await router.push(url);
}

watchEffect(() => {
if (
props.autoNavigate &&
klant.value.success &&
matchingKlant.success &&
bedrijf.value.data &&
bedrijfIdentifier.value
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,35 @@
import type { BedrijfIdentifier } from "@/services/kvk";
import { findKlantByIdentifier, createKlant } from "@/services/klanten";
import {
findKlantByIdentifier,
createKlant,
type KlantBedrijfIdentifier,
} from "@/services/openklant2";
import { ensureKlantForBedrijfIdentifier as ensureKlantForBedrijfIdentifierOk1 } from "@/services/openklant1/service";
import { useOpenKlant2 } from "@/services/openklant2/service";
import { mapBedrijfsIdentifier } from "@/services/openklant1/service";
import { useOrganisatieIds } from "@/stores/user";

//maak een klant aan in het klanten register als die nog niet bestaat
//bijvoorbeeld om een contactmoment voor een in de kvk opgezocht bedrijf op te kunnen slaan
export const ensureKlantForBedrijfIdentifier = async (
identifier: BedrijfIdentifier,
) =>
(await findKlantByIdentifier(identifier)) ?? (await createKlant(identifier));
identifier: KlantBedrijfIdentifier,
bedrijfsnaam: string,
) => {
const isOpenKlant2 = await useOpenKlant2();

if (isOpenKlant2) {
// Gebruik openklant2 implementatie
const klant = await findKlantByIdentifier(identifier);
return klant ?? (await createKlant(identifier));
} else {
// Gebruik openklant1 implementatie
const mappedIdentifier = mapBedrijfsIdentifier(identifier);
const organisatieIds = useOrganisatieIds();
const organisatieId = organisatieIds.value[0] || "";

return await ensureKlantForBedrijfIdentifierOk1(
{
bedrijfsnaam,
identifier: mappedIdentifier,
},
organisatieId,
);
}
};
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
import { ServiceResult } from "@/services";
import {
mapBedrijfsIdentifier,
useKlantByIdentifier,
} from "@/services/openklant1/service";
import {
findKlantByIdentifier,
type KlantBedrijfIdentifier,
} from "@/services/klanten";
useOpenKlant2,
} from "@/services/openklant2";

export const useKlantByBedrijfIdentifier = (
getId: () => KlantBedrijfIdentifier | undefined,
) => {
const getCacheKey = () => {
const id = getId();
if (!id) return "";
return "klant" + JSON.stringify(getId());
return "klant" + JSON.stringify(id);
};
const findKlant = () => {

const findKlant = async () => {
const id = getId();
if (!id) {
throw new Error();
throw new Error("Geen valide KlantBedrijfIdentifier");
}

const isOpenKlant2 = await useOpenKlant2();

if (isOpenKlant2) {
return findKlantByIdentifier(id);
} else {
const mappedId = mapBedrijfsIdentifier(id);
return useKlantByIdentifier(() => mappedId);
}
return findKlantByIdentifier(id);
};
return ServiceResult.fromFetcher("", findKlant, {

return ServiceResult.fromFetcher(getCacheKey(), findKlant, {
getUniqueId: getCacheKey,
});
};
25 changes: 7 additions & 18 deletions src/features/bedrijf/bedrijf-zoeken/use-search-bedrijven.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import { ServiceResult, type Paginated } from "@/services";

import {
PartijTypes,
searchKlantenByDigitaalAdres,
type Klant,
} from "@/services/klanten";
import {
searchBedrijvenInHandelsRegister,
type Bedrijf,
Expand Down Expand Up @@ -35,20 +29,15 @@ export function useSearchBedrijven(
throw new Error("query wordt hierboven al gecheckt");
}

const { page, query } = args;
const { page, query} = args;

if ("email" in query || "telefoonnummer" in query)
return searchKlantenByDigitaalAdres({
...query,
partijType: PartijTypes.organisatie,
}).then((r) => ({
page: r,
}));
if ("email" in query || "telefoonnummer" in query) {
throw new Error("Invalid query for searchBedrijvenInHandelsRegister");
}

// Voer een zoekopdracht uit voor bedrijven via het Handelsregister
return searchBedrijvenInHandelsRegister(query, page);
};
return ServiceResult.fromFetcher<{ page: Klant[] } | Paginated<Bedrijf>>(
getCacheKey,
fetcher,
);

return ServiceResult.fromFetcher<Paginated<Bedrijf>>(getCacheKey, fetcher);
}
12 changes: 10 additions & 2 deletions src/features/bedrijf/use-bedrijf-by-identifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,16 @@ export const useBedrijfByIdentifier = (
) => {
const getCacheKey = () => {
const id = getId();

if (!id) return "";
const identfier = "vestigingsnummer" in id ? id.vestigingsnummer : id.rsin;
return "bedrijf" + identfier;

//disable cache for now
return "" + Date.now();

// const identfier =
// "vestigingsnummer" in id ? id.vestigingsnummer : id.kvkNummer;

// return "bedrijf" + identfier;
};

const fetcher = () => {
Expand All @@ -21,6 +28,7 @@ export const useBedrijfByIdentifier = (
"Dit scenario kan niet voorkomen, wordt al afgehandeld door getCacheKey",
);
}

return searchBedrijvenInHandelsRegister(id).then(enforceOneOrZero);
};

Expand Down
Loading

0 comments on commit 0bd8ed5

Please sign in to comment.