Skip to content

Commit 94d8784

Browse files
authored
Merge pull request #930 from maykinmedia/feature/1957-klant-resources-for-companies
✨ [#1957] Implement remaining Klant resource usage for companies
2 parents b3fa2d0 + 3f52158 commit 94d8784

File tree

8 files changed

+275
-31
lines changed

8 files changed

+275
-31
lines changed

src/open_inwoner/accounts/signals.py

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def log_user_login(sender, user, request, *args, **kwargs):
4747
if brp_config.service:
4848
update_brp_data_in_db(user, initial=False)
4949

50+
if user.login_type in [LoginTypeChoices.digid, LoginTypeChoices.eherkenning]:
5051
if oc_config.klanten_service:
5152
update_user_from_klant(user)
5253

src/open_inwoner/accounts/tests/test_profile_views.py

+55-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from open_inwoner.accounts.choices import StatusChoices
1919
from open_inwoner.cms.profile.cms_appconfig import ProfileConfig
2020
from open_inwoner.haalcentraal.tests.mixins import HaalCentraalMixin
21+
from open_inwoner.openklant.models import OpenKlantConfig
2122
from open_inwoner.pdc.tests.factories import CategoryFactory
2223
from open_inwoner.plans.tests.factories import PlanFactory
2324
from open_inwoner.utils.logentry import LOG_ACTIONS
@@ -281,7 +282,9 @@ def test_messages_enabled_disabled(self):
281282
self.assertEqual(link_text(), _("Stuur een bericht"))
282283

283284

284-
@override_settings(ROOT_URLCONF="open_inwoner.cms.tests.urls")
285+
@override_settings(
286+
ROOT_URLCONF="open_inwoner.cms.tests.urls", MIDDLEWARE=PATCHED_MIDDLEWARE
287+
)
285288
class EditProfileTests(AssertTimelineLogMixin, WebTest):
286289
def setUp(self):
287290
self.url = reverse("profile:edit")
@@ -530,11 +533,59 @@ def test_modify_phone_and_email_updates_klant_api(self, m):
530533
"telefoonnummer": "0612345678",
531534
},
532535
)
533-
self.assertTimelineLog("retrieved klant for BSN-user")
536+
self.assertTimelineLog("retrieved klant for user")
534537
self.assertTimelineLog(
535538
"patched klant from user profile edit with fields: emailadres, telefoonnummer"
536539
)
537540

541+
@requests_mock.Mocker()
542+
def test_eherkenning_user_updates_klant_api(self, m):
543+
MockAPIReadPatchData.setUpServices()
544+
545+
for use_rsin_for_innNnpId_query_parameter in [True, False]:
546+
with self.subTest(
547+
use_rsin_for_innNnpId_query_parameter=use_rsin_for_innNnpId_query_parameter
548+
):
549+
# NOTE Explicitly creating a new Mocker object here, because for some reason
550+
# `m` is overridden somewhere, which causes issues when `MockAPIReadPatchData.install_mocks`
551+
# is run for the second time
552+
with requests_mock.Mocker() as m:
553+
data = MockAPIReadPatchData().install_mocks_eherkenning(
554+
m, use_rsin=use_rsin_for_innNnpId_query_parameter
555+
)
556+
557+
config = OpenKlantConfig.get_solo()
558+
config.use_rsin_for_innNnpId_query_parameter = (
559+
use_rsin_for_innNnpId_query_parameter
560+
)
561+
config.save()
562+
563+
response = self.app.get(self.url, user=data.eherkenning_user)
564+
565+
# reset noise from signals
566+
m.reset_mock()
567+
self.clearTimelineLogs()
568+
569+
form = response.forms["profile-edit"]
570+
form["email"] = "[email protected]"
571+
form["phonenumber"] = "0612345678"
572+
form.submit()
573+
574+
# user data tested in other cases
575+
self.assertTrue(data.matchers[0].called)
576+
klant_patch_data = data.matchers[1].request_history[0].json()
577+
self.assertEqual(
578+
klant_patch_data,
579+
{
580+
"emailadres": "[email protected]",
581+
"telefoonnummer": "0612345678",
582+
},
583+
)
584+
self.assertTimelineLog("retrieved klant for user")
585+
self.assertTimelineLog(
586+
"patched klant from user profile edit with fields: emailadres, telefoonnummer"
587+
)
588+
538589
@requests_mock.Mocker()
539590
def test_modify_phone_updates_klant_api_but_skips_unchanged(self, m):
540591
MockAPIReadPatchData.setUpServices()
@@ -579,7 +630,7 @@ def test_modify_phone_updates_klant_api_but_skip_unchanged_email(self, m):
579630
"telefoonnummer": "0612345678",
580631
},
581632
)
582-
self.assertTimelineLog("retrieved klant for BSN-user")
633+
self.assertTimelineLog("retrieved klant for user")
583634
self.assertTimelineLog(
584635
"patched klant from user profile edit with fields: telefoonnummer"
585636
)
@@ -609,7 +660,7 @@ def test_modify_phone_updates_klant_api_but_skip_unchanged_phone(self, m):
609660
"emailadres": "[email protected]",
610661
},
611662
)
612-
self.assertTimelineLog("retrieved klant for BSN-user")
663+
self.assertTimelineLog("retrieved klant for user")
613664
self.assertTimelineLog(
614665
"patched klant from user profile edit with fields: emailadres"
615666
)

src/open_inwoner/accounts/views/profile.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
inbox_page_is_published,
2828
)
2929
from open_inwoner.haalcentraal.utils import fetch_brp
30+
from open_inwoner.openklant.wrap import get_fetch_parameters
3031
from open_inwoner.plans.models import Plan
3132
from open_inwoner.questionnaire.models import QuestionnaireStep
3233
from open_inwoner.utils.mixins import ExportMixin
@@ -188,8 +189,9 @@ def form_valid(self, form):
188189

189190
def update_klant_api(self, user_form_data: dict):
190191
user: User = self.request.user
191-
if not user.bsn or user.login_type != LoginTypeChoices.digid:
192+
if not user.bsn and not user.kvk:
192193
return
194+
193195
field_mapping = {
194196
"emailadres": "email",
195197
"telefoonnummer": "phonenumber",
@@ -200,10 +202,11 @@ def update_klant_api(self, user_form_data: dict):
200202
if user_form_data.get(local_name)
201203
}
202204
if update_data:
203-
klant = fetch_klant(user_bsn=user.bsn)
205+
klant = fetch_klant(**get_fetch_parameters(user))
206+
204207
if klant:
205208
self.log_system_action(
206-
"retrieved klant for BSN-user", user=self.request.user
209+
"retrieved klant for user", user=self.request.user
207210
)
208211
klant = patch_klant(klant, update_data)
209212
if klant:

src/open_inwoner/cms/cases/tests/test_contactform.py

+113-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.conf import settings
12
from django.core import mail
23
from django.test import override_settings
34
from django.urls import reverse
@@ -13,7 +14,10 @@
1314
from zgw_consumers.constants import APITypes
1415
from zgw_consumers.test import generate_oas_component, mock_service_oas_get
1516

16-
from open_inwoner.accounts.tests.factories import DigidUserFactory
17+
from open_inwoner.accounts.tests.factories import (
18+
DigidUserFactory,
19+
eHerkenningUserFactory,
20+
)
1721
from open_inwoner.openklant.constants import Status
1822
from open_inwoner.openklant.models import OpenKlantConfig
1923
from open_inwoner.openklant.tests.data import (
@@ -31,9 +35,17 @@
3135
from open_inwoner.utils.test import ClearCachesMixin, paginated_response
3236
from open_inwoner.utils.tests.helpers import AssertMockMatchersMixin
3337

38+
PATCHED_MIDDLEWARE = [
39+
m
40+
for m in settings.MIDDLEWARE
41+
if m != "open_inwoner.kvk.middleware.KvKLoginMiddleware"
42+
]
43+
3444

3545
@requests_mock.Mocker()
36-
@override_settings(ROOT_URLCONF="open_inwoner.cms.tests.urls")
46+
@override_settings(
47+
ROOT_URLCONF="open_inwoner.cms.tests.urls", MIDDLEWARE=PATCHED_MIDDLEWARE
48+
)
3749
class CasesContactFormTestCase(AssertMockMatchersMixin, ClearCachesMixin, WebTest):
3850
def setUp(self):
3951
super().setUp()
@@ -102,6 +114,32 @@ def setUp(self):
102114
"geslachtsnaam": "Bazz",
103115
},
104116
)
117+
self.eherkenning_user_role = generate_oas_component(
118+
"zrc",
119+
"schemas/Rol",
120+
url=f"{ZAKEN_ROOT}rollen/3ff7686f-db35-4181-8e48-57521220f887",
121+
omschrijvingGeneriek=RolOmschrijving.initiator,
122+
betrokkeneType=RolTypes.niet_natuurlijk_persoon,
123+
betrokkeneIdentificatie={
124+
"innNnpId": "000000000",
125+
"voornamen": "Foo Bar",
126+
"voorvoegselGeslachtsnaam": "van der",
127+
"geslachtsnaam": "Bazz",
128+
},
129+
)
130+
self.eherkenning_user_role_kvk = generate_oas_component(
131+
"zrc",
132+
"schemas/Rol",
133+
url=f"{ZAKEN_ROOT}rollen/5885531e-9b7f-46af-947e-f2278a2e72a8",
134+
omschrijvingGeneriek=RolOmschrijving.initiator,
135+
betrokkeneType=RolTypes.niet_natuurlijk_persoon,
136+
betrokkeneIdentificatie={
137+
"innNnpId": "12345678",
138+
"voornamen": "Foo Bar",
139+
"voorvoegselGeslachtsnaam": "van der",
140+
"geslachtsnaam": "Bazz",
141+
},
142+
)
105143
self.zaaktype = generate_oas_component(
106144
"ztc",
107145
"schemas/ZaakType",
@@ -221,18 +259,10 @@ def _setUpMocks(self, m):
221259
self.zaaktype,
222260
self.status_finish,
223261
self.status_type_finish,
224-
]:
225-
self.matchers.append(m.get(resource["url"], json=resource))
226-
227-
for resource in [
228-
self.zaak,
229-
self.result,
230-
self.zaaktype,
231262
self.status_type_new,
232263
self.status_type_in_behandeling,
233-
self.status_type_finish,
234264
]:
235-
m.get(resource["url"], json=resource)
265+
self.matchers.append(m.get(resource["url"], json=resource))
236266

237267
# mock `fetch_status_types_no_cache`
238268
m.get(
@@ -243,7 +273,13 @@ def _setUpMocks(self, m):
243273
self.matchers += [
244274
m.get(
245275
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
246-
json=paginated_response([self.user_role]),
276+
json=paginated_response(
277+
[
278+
self.user_role,
279+
self.eherkenning_user_role,
280+
self.eherkenning_user_role_kvk,
281+
]
282+
),
247283
),
248284
m.get(
249285
f"{ZAKEN_ROOT}zaakinformatieobjecten?zaak={self.zaak['url']}",
@@ -407,6 +443,71 @@ def test_form_success_with_api(self, m):
407443
},
408444
)
409445

446+
def test_form_success_with_api_eherkenning_user(self, m):
447+
self._setUpMocks(m)
448+
self._setUpExtraMocks(m)
449+
450+
for use_rsin_for_innNnpId_query_parameter in [True, False]:
451+
with self.subTest(
452+
use_rsin_for_innNnpId_query_parameter=use_rsin_for_innNnpId_query_parameter
453+
):
454+
eherkenning_user = eHerkenningUserFactory(
455+
kvk="12345678", rsin="000000000"
456+
)
457+
458+
config = OpenKlantConfig.get_solo()
459+
config.use_rsin_for_innNnpId_query_parameter = (
460+
use_rsin_for_innNnpId_query_parameter
461+
)
462+
config.save()
463+
464+
identifier = (
465+
eherkenning_user.rsin
466+
if use_rsin_for_innNnpId_query_parameter
467+
else eherkenning_user.kvk
468+
)
469+
m.get(
470+
f"{KLANTEN_ROOT}klanten?subjectNietNatuurlijkPersoon__innNnpId={identifier}",
471+
json=paginated_response([self.klant]),
472+
),
473+
474+
response = self.app.get(self.case_detail_url, user=eherkenning_user)
475+
476+
form = response.forms["contact-form"]
477+
form.action = reverse(
478+
"cases:case_detail_contact_form",
479+
kwargs={"object_id": self.zaak["uuid"]},
480+
)
481+
form["question"] = "Sample text"
482+
response = form.submit()
483+
484+
self.assertEqual(
485+
response.headers["HX-Redirect"],
486+
reverse(
487+
"cases:case_detail",
488+
kwargs={"object_id": str(self.zaak["uuid"])},
489+
),
490+
)
491+
492+
redirect = self.app.get(response.headers["HX-Redirect"])
493+
redirect_messages = list(redirect.context["messages"])
494+
495+
self.assertEqual(redirect_messages[0].message, _("Vraag verstuurd!"))
496+
self.assertMockMatchersCalled(self.extra_matchers)
497+
498+
payload = self.matcher_create_contactmoment.request_history[0].json()
499+
self.assertEqual(
500+
payload,
501+
{
502+
"bronorganisatie": "123456788",
503+
"kanaal": "Internet",
504+
"medewerkerIdentificatie": {"identificatie": "FooVonBar"},
505+
"onderwerp": "afdeling-x",
506+
"tekst": "Sample text",
507+
"type": "Melding",
508+
},
509+
)
510+
410511
def test_form_success_with_email(self, m):
411512
self._setUpMocks(m)
412513
self._setUpExtraMocks(m)

src/open_inwoner/cms/cases/views/status.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@
2121
from zgw_consumers.api_models.constants import RolOmschrijving
2222

2323
from open_inwoner.openklant.models import OpenKlantConfig
24-
from open_inwoner.openklant.wrap import create_contactmoment, create_klant, fetch_klant
24+
from open_inwoner.openklant.wrap import (
25+
create_contactmoment,
26+
create_klant,
27+
fetch_klant,
28+
get_fetch_parameters,
29+
)
2530
from open_inwoner.openzaak.api_models import Status, StatusType, Zaak
2631
from open_inwoner.openzaak.cases import (
2732
connect_case_with_document,
@@ -741,14 +746,12 @@ def register_by_api(self, form, config: OpenKlantConfig):
741746
except ObjectDoesNotExist:
742747
ztc = None
743748

744-
klant = fetch_klant(user_bsn=self.request.user.bsn)
749+
klant = fetch_klant(**get_fetch_parameters(self.request.user))
745750
if klant:
746-
self.log_system_action(
747-
"retrieved klant for BSN-user", user=self.request.user
748-
)
751+
self.log_system_action("retrieved klant for user", user=self.request.user)
749752
else:
750753
self.log_system_action(
751-
"could not retrieve klant for BSN-user", user=self.request.user
754+
"could not retrieve klant for user", user=self.request.user
752755
)
753756
data = {
754757
"bronorganisatie": config.register_bronorganisatie_rsin,
@@ -767,7 +770,7 @@ def register_by_api(self, form, config: OpenKlantConfig):
767770
)
768771
else:
769772
self.log_system_action(
770-
"could not create klant for BSN-user", user=self.request.user
773+
"could not create klant for user", user=self.request.user
771774
)
772775

773776
# create contact moment

src/open_inwoner/openklant/services.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from open_inwoner.openklant.wrap import fetch_klant
33
from open_inwoner.utils.logentry import system_action
44

5+
from .wrap import get_fetch_parameters
6+
57

68
def update_user_from_klant(user: User):
7-
klant = fetch_klant(user_bsn=user.bsn)
9+
klant = fetch_klant(**get_fetch_parameters(user))
810
if not klant:
911
return
1012

11-
system_action("retrieved klant for BSN-user", content_object=user)
13+
system_action("retrieved klant for user", content_object=user)
1214

1315
update_data = {}
1416

0 commit comments

Comments
 (0)