Skip to content

Commit

Permalink
OS-74 - Replacing DAWA matrikula select with Datafordeler select
Browse files Browse the repository at this point in the history
  • Loading branch information
stankut committed Jun 19, 2024
1 parent 3a03d70 commit 83d72a4
Show file tree
Hide file tree
Showing 7 changed files with 334 additions and 21 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ before starting to add changes. Use example [placed in the end of the page](#exa

## [Unreleased]

- [OS-74] Replacing DAWA matrikula select with Datafordeler select

## [3.15.2] 2024-05-27

- [#108](https://github.com/OS2Forms/os2forms/pull/108)
Expand Down
47 changes: 28 additions & 19 deletions modules/os2forms_dawa/src/Element/DawaElementAddressMatrikula.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Drupal\os2forms_dawa\Element;

use Drupal\Core\Form\FormStateInterface;
use Drupal\os2forms_dawa\Plugin\os2web\DataLookup\DatafordelerDataLookupInterface;
use Drupal\webform\Element\WebformCompositeBase;
use Symfony\Component\HttpFoundation\ParameterBag;

Expand Down Expand Up @@ -94,9 +95,16 @@ 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\Service\DatafordelerService $datafordelerService */

/** @var DatafordelerDataLookupInterface $datafordelerLookup */
$datafordelerLookup = \Drupal::service('plugin.manager.os2web_datalookup')->createInstance('datafordeler_data_lookup');

// Getting address.
$addressParams = new ParameterBag();
$addressParams->set('q', $addressValue);
Expand All @@ -106,29 +114,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;
}

/**
Expand Down
64 changes: 64 additions & 0 deletions modules/os2forms_dawa/src/Entity/DatafordelerMatrikula.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Drupal\os2forms_dawa\Entity;

/**
* Class DatafordelerMatrikula.
*
* Wrapper class for Datafordeler matrikula object that easies the matrikula property
* access.
*/
class DatafordelerMatrikula {

/**
* Owner licence code / ejerlavskode.
* @var string
*/
protected string $ownerLicenseCode;

/**
* Ownership name / ejerlavsnavn.
* @var string
*/
protected string $ownershipName;


/**
* Matrikula number / matrikelnummer.
* @var string
*/
protected string $matrikulaNumber;

/**
* DawaAddress constructor.
*
* Fills the property from the provided JSON metadata.
*
* @param array $json
* Address properties as JSON metadata.
*/
public function __construct(array $json) {
if (isset($json['features']) && is_array($json['features'])) {
$jordstykke = $json['features'][0]['properties']['jordstykke'][0];

$this->ownerLicenseCode = $jordstykke['properties']['ejerlavskode'];
$this->ownershipName = $jordstykke['properties']['ejerlavsnavn'];
$this->matrikulaNumber = $jordstykke['properties']['matrikelnummer'];
}
}

public function getOwnerLicenseCode(): string {
return $this->ownerLicenseCode;
}

public function getOwnershipName(): string {
return $this->ownershipName;
}

public function getMatrikulaNumber(): string {
return $this->matrikulaNumber;
}



}
18 changes: 18 additions & 0 deletions modules/os2forms_dawa/src/Entity/DawaAddress.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ class DawaAddress {
*/
protected $longitude;

/**
* Address access ID.
*
* @var string
*/
protected $accessAddressId;

/**
* DawaAddress constructor.
*
Expand All @@ -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'];
}
}

Expand Down Expand Up @@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
<?php

namespace Drupal\os2forms_dawa\Plugin\os2web\DataLookup;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\os2forms_dawa\Entity\DatafordelerMatrikula;
use Drupal\os2web_datalookup\Plugin\os2web\DataLookup\DataLookupBase;
use GuzzleHttp\ClientInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpClient\HttpClient;

/**
* Defines a plugin for Datafordeler Data.
*
* @DataLookup(
* id = "datafordeler_data_lookup",
* label = @Translation("Datafordeler Address Lookup"),
* )
*/
class DatafordelerDataLookup extends DataLookupBase implements DatafordelerDataLookupInterface, ContainerFactoryPluginInterface {

/**
* The HTTP client to fetch the feed data with.
*
* @var ClientInterface
*/
protected $httpClient;

/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ClientInterface $httpClient) {
$this->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 validateConfigurationForm(array &$form, FormStateInterface $form_state) {
parent::validateConfigurationForm($form, $form_state);

// // Validating 'address_autocomplete_path', 'block_autocomplete_path',
// // 'matrikula_autocomplete_path'.
// $elementsToValidate = [
// 'address_autocomplete_path',
// 'block_autocomplete_path',
// 'matrikula_autocomplete_path',
// ];
// foreach ($elementsToValidate as $elementKey) {
// $autocomplete_path = $form_state->getValue($elementKey);
// $json = file_get_contents($autocomplete_path);
// $jsonDecoded = json_decode($json, TRUE);
// if (empty($jsonDecoded)) {
// $form_state->setErrorByName($elementKey, $this->t('URL is not valid or it does not provide the result in the required format'));
// }
// else {
// $entry = reset($jsonDecoded);
// if (!array_key_exists('tekst', $entry)) {
// $form_state->setErrorByName($elementKey, $this->t('URL is not valid or it does not provide the result in the required format'));
// }
// }
// }
//
// // Validating address_api_path.
// $autocomplete_path = $form_state->getValue('address_api_path');
// // Limiting the output.
// $json = file_get_contents($autocomplete_path . '?per_side=1');
// $jsonDecoded = json_decode($json, TRUE);
// if (empty($jsonDecoded)) {
// $form_state->setErrorByName('address_api_path', $this->t('URL is not valid or it does not provide the result in the required format'));
// }
// else {
// $entry = reset($jsonDecoded);
// if (!array_key_exists('id', $entry)) {
// $form_state->setErrorByName('address_api_path', $this->t('URL is not valid or it does not provide the result in the required format'));
// }
// }
}

/**
* {@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);
}
}
Loading

0 comments on commit 83d72a4

Please sign in to comment.