Skip to content

Commit 7264a44

Browse files
committed
feat: filter eHerkenning zaken by both KVK and vestigingsnummer
Zaken for eHerkenning users logged in as vestiging are now filtered by KVK as well as vestigingsnummer. The filtering is done client-side as the eSuite does not have a query parameter for this purpose. For contactmomenten/questions, this filtering only works for OpenKlant but not for eSuite as the latter does not support scoping of identifiers (i.e. looking for a vestigingsnummer that's related to a KVK). Refs: https://taiga.maykinmedia.nl/project/open-inwoner/us/3457
1 parent 8801d21 commit 7264a44

File tree

4 files changed

+161
-20
lines changed

4 files changed

+161
-20
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ Deployment aandachtspunten
1111
Nieuwe features
1212
---------------
1313

14-
* ...
14+
* [:taiga-us:`3457`: :pr:`1936`]: Zaken voor eHerkenning-gebruikers worden nu gefilterd
15+
op zowel KVK als vestigingsnummer
1516

1617
Bugfixes
1718
--------

src/open_inwoner/cms/products/tests/test_plugin_categories.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,17 @@ def test_categories_based_on_cases_for_eherkenning_user_with_vestigingsnummer(
677677
.url,
678678
json=paginated_response([self.zaak, self.zaak3]),
679679
)
680+
m.get(
681+
furl(f"{ZAKEN_ROOT}zaken")
682+
.add(
683+
{
684+
"rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__innNnpId": identifier,
685+
"maximaleVertrouwelijkheidaanduiding": VertrouwelijkheidsAanduidingen.beperkt_openbaar,
686+
}
687+
)
688+
.url,
689+
json=paginated_response([self.zaak, self.zaak3]),
690+
)
680691

681692
for fetch_eherkenning_zaken_with_rsin in [True, False]:
682693
with self.subTest(

src/open_inwoner/openzaak/clients.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ def fetch_cases(
8080
"either `user_bsn` or `user_kvk`/`user_risin` (+ optionally `vestigingsnummer`) "
8181
"should be supplied, not both"
8282
)
83+
if not (user_bsn or user_kvk or user_rsin or vestigingsnummer):
84+
raise ValueError(
85+
"You must supply either a bsn or kvk/rsin/vestigingsnummer"
86+
)
8387

8488
if user_bsn:
8589
return self.fetch_cases_by_bsn(
@@ -91,17 +95,26 @@ def fetch_cases(
9195
max_requests=max_requests,
9296
zaak_identificatie=identificatie,
9397
)
98+
99+
user_kvk_or_rsin = user_rsin if user_rsin else user_kvk
100+
kvk_cases = fetch_cases_for_company(
101+
kvk_or_rsin=user_kvk_or_rsin,
102+
)
103+
94104
if vestigingsnummer:
95-
return fetch_cases_for_company(
105+
vestiging_cases = fetch_cases_for_company(
96106
vestigingsnummer=vestigingsnummer,
97107
)
98-
if user_kvk or user_rsin:
99-
user_kvk_or_rsin = user_rsin if user_rsin else user_kvk
100-
return fetch_cases_for_company(
101-
kvk_or_rsin=user_kvk_or_rsin,
102-
)
103108

104-
raise ValueError("You must supply either a bsn or kvk/rsin/vestigingsnummer")
109+
# return intesection of zaken for kvk and zaken for vestiging
110+
kvk_case_urls = {case.url for case in kvk_cases}
111+
filtered_cases = [
112+
case for case in vestiging_cases if case.url in kvk_case_urls
113+
]
114+
115+
return filtered_cases
116+
117+
return kvk_cases
105118

106119
@cache_result(
107120
"{self.base_url}:cases:{user_bsn}:{max_requests}:{identificatie}",

src/open_inwoner/openzaak/tests/test_cases.py

Lines changed: 128 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -852,15 +852,36 @@ def test_use_openzaak_120_params_flag_varies_query_params_for_eherkenning_users(
852852
for group in self.api_groups:
853853
zrc_root = group.zrc_service.api_root.rstrip("/")
854854
if user.vestiging:
855+
# Mock for vestigingsnummer request
855856
m.get(
856857
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__vestigingsNummer={user.vestiging}",
857858
json={"results": []},
858859
)
860+
# Mock for KVK/RSIN request
861+
m.get(
862+
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__kvkNummer={user.kvk}",
863+
json={"results": []},
864+
)
859865
else:
860866
m.get(
861867
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__kvkNummer={user.kvk}",
862868
json={"results": []},
863869
)
870+
else:
871+
# For legacy parameters
872+
for group in self.api_groups:
873+
zrc_root = group.zrc_service.api_root.rstrip("/")
874+
if user.vestiging:
875+
# Mock for vestigingsnummer request
876+
m.get(
877+
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__vestiging__vestigingsNummer={user.vestiging}",
878+
json={"results": []},
879+
)
880+
# Mock for KVK/RSIN request
881+
m.get(
882+
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__innNnpId={user.kvk}",
883+
json={"results": []},
884+
)
864885

865886
m.reset_mock()
866887

@@ -882,24 +903,29 @@ def test_use_openzaak_120_params_flag_varies_query_params_for_eherkenning_users(
882903
zrc_root = group.zrc_service.api_root.rstrip("/")
883904

884905
if use_openzaak_120_params:
906+
# Two requests when vestigingsnummer is provided
885907
if user.vestiging:
886908
# OpenZaak 1.20+ vestiging parameter
887909
expected_urls.add(
888910
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__vestigingsNummer={user.vestiging}"
889911
)
912+
# OpenZaak 1.20+ KVK parameter
913+
expected_urls.add(
914+
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__kvkNummer={user.kvk}"
915+
)
890916
else:
891-
# OpenZaak 1.20+ KvK parameter
892917
expected_urls.add(
893918
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__kvkNummer={user.kvk}"
894919
)
895920
else:
896921
if user.vestiging:
897-
# Legacy vestiging parameter
898922
expected_urls.add(
899923
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__vestiging__vestigingsNummer={user.vestiging}"
900924
)
925+
expected_urls.add(
926+
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__innNnpId={user.kvk}"
927+
)
901928
else:
902-
# Legacy KvK/RSIN parameter
903929
expected_urls.add(
904930
f"{zrc_root}/zaken?maximaleVertrouwelijkheidaanduiding=beperkt_openbaar&rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__innNnpId={user.kvk}"
905931
)
@@ -944,15 +970,47 @@ def test_list_cases_for_kvk_user_with_vestigingsnummer(self, m):
944970

945971
# check zaken request query parameters
946972
for zaken_root in ("zaken.nl", "andere-zaken.nl"):
947-
list_zaken_req = [
973+
zaken_requests = [
948974
req
949975
for req in m.request_history
950976
if req.hostname == zaken_root and req.path == "/api/v1/zaken"
951-
][0]
977+
]
978+
979+
# we should have two requests, one for KVK + one for vestiging
980+
self.assertEqual(len(zaken_requests), 2)
981+
982+
kvk_request = None
983+
vestigingsnummer_request = None
984+
for req in zaken_requests:
985+
if (
986+
"rol__betrokkeneidentificatie__vestiging__vestigingsnummer"
987+
in req.qs
988+
):
989+
vestigingsnummer_request = req
990+
if (
991+
"rol__betrokkeneidentificatie__nietnatuurlijkpersoon__innnnpid"
992+
in req.qs
993+
):
994+
kvk_request = req
995+
996+
self.assertIsNotNone(
997+
vestigingsnummer_request, "No zaken request for vestigingsnummer found"
998+
)
999+
self.assertIsNotNone(kvk_request, "No zaken request for kvk found")
9521000

953-
self.assertEqual(len(list_zaken_req.qs), 2)
9541001
self.assertEqual(
955-
list_zaken_req.qs,
1002+
kvk_request.qs,
1003+
{
1004+
"maximalevertrouwelijkheidaanduiding": [
1005+
VertrouwelijkheidsAanduidingen.beperkt_openbaar
1006+
],
1007+
"rol__betrokkeneidentificatie__nietnatuurlijkpersoon__innnnpid": [
1008+
self.eherkenning_user_vestiging.kvk
1009+
],
1010+
},
1011+
)
1012+
self.assertEqual(
1013+
vestigingsnummer_request.qs,
9561014
{
9571015
"maximalevertrouwelijkheidaanduiding": [
9581016
VertrouwelijkheidsAanduidingen.beperkt_openbaar
@@ -967,12 +1025,38 @@ def test_list_cases_for_rsin_user_with_vestigingsnummer(self, m):
9671025
for mock in self.mocks:
9681026
mock._setUpMocks(m)
9691027

1028+
for zaken_root in ("zaken.nl", "andere-zaken.nl"):
1029+
m.get(
1030+
furl(f"{zaken_root}/api/vi/zaken")
1031+
.add(
1032+
{
1033+
"maximaleVertrouwelijkheidaanduiding": VertrouwelijkheidsAanduidingen.openbaar,
1034+
"rol__betrokkeneIdentificatie__nietNatuurlijkPersoon__innNnpId": self.eherkenning_user_vestiging.rsin,
1035+
}
1036+
)
1037+
.url,
1038+
json=paginated_response(
1039+
[
1040+
mock.zaak_eherkenning1,
1041+
mock.zaak_eherkenning2,
1042+
]
1043+
)
1044+
if zaken_root == "zaken.nl"
1045+
else paginated_response([mock.zaak_eherkenning1]),
1046+
)
1047+
1048+
for group in self.api_groups:
1049+
group.fetch_eherkenning_zaken_with_rsin = True
1050+
group.save()
1051+
9701052
self.client.force_login(user=self.eherkenning_user_vestiging)
9711053

9721054
m.reset_mock()
9731055

9741056
response = self.client.get(self.inner_url, HTTP_HX_REQUEST="true")
9751057

1058+
# We expect only zaak_eherkenning1 in the results since it's the only one
1059+
# present in both the RSIN and vestigingsnummer responses
9761060
expected_cases = [
9771061
{
9781062
"uuid": mock.zaak_eherkenning1["uuid"],
@@ -999,18 +1083,50 @@ def test_list_cases_for_rsin_user_with_vestigingsnummer(self, m):
9991083
# don't show internal cases
10001084
self.assertNotContains(response, mock.zaak_intern["omschrijving"])
10011085
self.assertNotContains(response, mock.zaak_intern["identificatie"])
1086+
# verify zaak_eherkenning2 is not included
1087+
self.assertNotContains(response, mock.zaak_eherkenning2["identificatie"])
10021088

1003-
# check zaken request query parameters
1089+
# check requests
10041090
for zaken_root in ("zaken.nl", "andere-zaken.nl"):
1005-
list_zaken_req = [
1091+
zaken_requests = [
10061092
req
10071093
for req in m.request_history
10081094
if req.hostname == zaken_root and req.path == "/api/v1/zaken"
1009-
][0]
1095+
]
10101096

1011-
self.assertEqual(len(list_zaken_req.qs), 2)
1097+
self.assertEqual(len(zaken_requests), 2)
1098+
1099+
rsin_request = None
1100+
vestigingsnummer_request = None
1101+
1102+
for req in zaken_requests:
1103+
query_string = req.qs
1104+
if any("vestigingsnummer" in key.lower() for key in query_string):
1105+
vestigingsnummer_request = req
1106+
elif any(
1107+
"nietnatuurlijkpersoon" in key.lower() for key in query_string
1108+
):
1109+
rsin_request = req
1110+
1111+
self.assertIsNotNone(
1112+
vestigingsnummer_request, "No request for vestigingsnummer found"
1113+
)
1114+
self.assertIsNotNone(rsin_request, "No request for rsin found")
1115+
1116+
# Verify request params
10121117
self.assertEqual(
1013-
list_zaken_req.qs,
1118+
rsin_request.qs,
1119+
{
1120+
"maximalevertrouwelijkheidaanduiding": [
1121+
VertrouwelijkheidsAanduidingen.beperkt_openbaar
1122+
],
1123+
"rol__betrokkeneidentificatie__nietnatuurlijkpersoon__innnnpid": [
1124+
self.eherkenning_user_vestiging.rsin
1125+
],
1126+
},
1127+
)
1128+
self.assertEqual(
1129+
vestigingsnummer_request.qs,
10141130
{
10151131
"maximalevertrouwelijkheidaanduiding": [
10161132
VertrouwelijkheidsAanduidingen.beperkt_openbaar

0 commit comments

Comments
 (0)