diff --git a/CHANGELOG.md b/CHANGELOG.md index db0ded3f..e020e664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ before starting to add changes. Use example [placed in the end of the page](#exa ## [Unreleased] +## [3.15.3] 2024-06-25 + +- [OS-74] Replacing DAWA matrikula select with Datafordeler select + ## [3.15.2] 2024-05-27 - [#108](https://github.com/OS2Forms/os2forms/pull/108) diff --git a/modules/os2forms_dawa/src/Element/DawaElementAddressMatrikula.php b/modules/os2forms_dawa/src/Element/DawaElementAddressMatrikula.php index fcaf3c51..2e75805f 100644 --- a/modules/os2forms_dawa/src/Element/DawaElementAddressMatrikula.php +++ b/modules/os2forms_dawa/src/Element/DawaElementAddressMatrikula.php @@ -94,9 +94,14 @@ public static function getCompositeElements(array $element) { * Array of matrikula options key and the values are identical. */ private static function getMatrikulaOptions($addressValue, array $element) { + $options = []; + /** @var \Drupal\os2forms_dawa\Service\DawaService $dawaService */ $dawaService = \Drupal::service('os2forms_dawa.service'); + /** @var \Drupal\os2forms_dawa\Plugin\os2web\DataLookup\DatafordelerDataLookupInterface $datafordelerLookup */ + $datafordelerLookup = \Drupal::service('plugin.manager.os2web_datalookup')->createInstance('datafordeler_data_lookup'); + // Getting address. $addressParams = new ParameterBag(); $addressParams->set('q', $addressValue); @@ -106,29 +111,30 @@ private static function getMatrikulaOptions($addressValue, array $element) { $address = $dawaService->getSingleAddress($addressParams); if ($address) { - // Getting matrikula options. - $matrikulaParams = new ParameterBag(); - // Getting municipality code from address. - if ($municipality_code = $address->getMunicipalityCode()) { - $matrikulaParams->set('limit_by_municipality', $municipality_code); - } - // Getting property nr from address. - if ($property_nr = $address->getPropertyNumber()) { - $matrikulaParams->set('limit_by_property', $property_nr); - } - // If the matrikula option must not have the code. - if (isset($element['#remove_code'])) { - $matrikulaParams->set('remove_code', $element['#remove_code']); - } + $addressAccessId = $address->getAccessAddressId(); - // Get the options. - $matrikulaOptions = $dawaService->getMatrikulaMatches($matrikulaParams); + // Find matrikula list from the houseid (husnummer): + $matrikulaIdList = $datafordelerLookup->getMatrikulaIds($addressAccessId); - // Use values as keys. - return array_combine($matrikulaOptions, $matrikulaOptions); + // Find Matrikula entry from matrikulas ID. + if (!empty($matrikulaIdList)) { + foreach ($matrikulaIdList as $matrikulaId) { + $matrikula = $datafordelerLookup->getMatrikulaEntry($matrikulaId); + + if ($matrikula) { + $matrikulaOption = $matrikula->getMatrikulaNumber() . ' ' . $matrikula->getOwnershipName(); + + if (isset($element['#remove_code']) && !$element['#remove_code']) { + $matrikulaOption .= ' (' . $matrikula->getOwnerLicenseCode() . ')'; + } + + $options[$matrikulaOption] = $matrikulaOption; + } + } + } } - return []; + return $options; } /** diff --git a/modules/os2forms_dawa/src/Entity/DatafordelerMatrikula.php b/modules/os2forms_dawa/src/Entity/DatafordelerMatrikula.php new file mode 100644 index 00000000..0e05a272 --- /dev/null +++ b/modules/os2forms_dawa/src/Entity/DatafordelerMatrikula.php @@ -0,0 +1,83 @@ +ownerLicenseCode = $jordstykke['properties']['ejerlavskode']; + $this->ownershipName = $jordstykke['properties']['ejerlavsnavn']; + $this->matrikulaNumber = $jordstykke['properties']['matrikelnummer']; + } + } + + /** + * Returns owner licence code. + * + * @return string + * Owners licence code. + */ + public function getOwnerLicenseCode(): string { + return $this->ownerLicenseCode; + } + + /** + * Returns ownership name. + * + * @return string + * ownership name. + */ + public function getOwnershipName(): string { + return $this->ownershipName; + } + + /** + * Returns makrikula number. + * + * @return string + * Matrikula number + */ + public function getMatrikulaNumber(): string { + return $this->matrikulaNumber; + } + +} diff --git a/modules/os2forms_dawa/src/Entity/DawaAddress.php b/modules/os2forms_dawa/src/Entity/DawaAddress.php index 723dde3e..89fe92a7 100644 --- a/modules/os2forms_dawa/src/Entity/DawaAddress.php +++ b/modules/os2forms_dawa/src/Entity/DawaAddress.php @@ -45,6 +45,13 @@ class DawaAddress { */ protected $longitude; + /** + * Address access ID. + * + * @var string + */ + protected $accessAddressId; + /** * DawaAddress constructor. * @@ -61,6 +68,7 @@ public function __construct(array $json) { $this->propertyNumber = $json['adgangsadresse']['esrejendomsnr']; $this->longitude = $json['adgangsadresse']['adgangspunkt']['koordinater'][0]; $this->latitude = $json['adgangsadresse']['adgangspunkt']['koordinater'][1]; + $this->accessAddressId = $json['adgangsadresse']['id']; } } @@ -114,4 +122,14 @@ public function getLongitude() { return $this->longitude; } + /** + * Gets Address access ID. + * + * @return string + * Address access ID. + */ + public function getAccessAddressId() { + return $this->accessAddressId; + } + } diff --git a/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookup.php b/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookup.php new file mode 100644 index 00000000..a702e2d9 --- /dev/null +++ b/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookup.php @@ -0,0 +1,138 @@ +httpClient = $httpClient; + parent::__construct($configuration, $plugin_id, $plugin_definition); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('http_client'), + ); + } + + /** + * {@inheritdoc} + */ + public function getMatrikulaIds(string $addressAccessId) : array { + $url = "https://services.datafordeler.dk/BBR/BBRPublic/1/rest/grund"; + + $configuration = $this->getConfiguration(); + $json = $this->httpClient->request('GET', $url, [ + 'query' => [ + 'husnummer' => $addressAccessId, + 'status' => 7, + 'username' => $configuration['username'], + 'password' => $configuration['password'], + ], + ])->getBody(); + + $jsonDecoded = json_decode($json, TRUE); + if (is_array($jsonDecoded)) { + return $jsonDecoded[0]['jordstykkeList']; + } + + return []; + } + + /** + * {@inheritdoc} + */ + public function getMatrikulaEntry(string $matrikulaId) : ?DatafordelerMatrikula { + $url = "https://services.datafordeler.dk/Matriklen2/Matrikel/2.0.0/rest/SamletFastEjendom"; + + $configuration = $this->getConfiguration(); + $json = $this->httpClient->request('GET', $url, [ + 'query' => [ + 'jordstykkeid' => $matrikulaId, + 'username' => $configuration['username'], + 'password' => $configuration['password'], + ], + ])->getBody(); + + $jsonDecoded = json_decode($json, TRUE); + if (is_array($jsonDecoded)) { + return new DatafordelerMatrikula($jsonDecoded); + } + + return NULL; + } + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return [ + 'username' => '', + 'password' => '', + ] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $form['username'] = [ + '#type' => 'textfield', + '#title' => $this->t('Username for service calls'), + '#default_value' => $this->configuration['username'], + '#required' => TRUE, + '#description' => $this->t('Username required for performing API requests'), + ]; + $form['password'] = [ + '#type' => 'textfield', + '#title' => $this->t('Password for service calls'), + '#default_value' => $this->configuration['password'], + '#required' => TRUE, + '#description' => $this->t('Password required for performing API requests'), + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $configuration = $this->getConfiguration(); + $configuration['username'] = $form_state->getValue('username'); + $configuration['password'] = $form_state->getValue('password'); + $this->setConfiguration($configuration); + } + +} diff --git a/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookupInterface.php b/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookupInterface.php new file mode 100644 index 00000000..4dd71a3c --- /dev/null +++ b/modules/os2forms_dawa/src/Plugin/os2web/DataLookup/DatafordelerDataLookupInterface.php @@ -0,0 +1,39 @@ +