Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Added handling of CVR recipients.

## [1.1.2]

- Updated logging.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
langcode: da
status: open
dependencies:
enforced:
module:
- os2forms_digital_post_examples
module:
- os2forms_digital_post_examples
third_party_settings:
webform_revisions:
contentEntity_id: null
weight: 0
open: null
close: null
uid: 1
template: false
archive: false
id: os2forms_digital_post_cvr
title: 'OS2Forms Digital post example (CVR)'
description: 'Simple example form with a digital post handler'
category: Example
elements: |-
message:
'#type': textarea
'#title': Message
'#required': true
'#default_value': |-
[current-date:long]

[random:hash:sha512]
recipient_cvr:
'#type': textfield
'#title': 'Recipient CVR'
'#required': true
'#default_value': '43486829'
digital_post_content_pdf:
'#type': 'webform_entity_print_attachment:pdf'
'#title': 'Digital post (PDF)'
'#display_on': view
'#filename': hat-og-briller.pdf
css: ''
javascript: ''
settings:
ajax: false
ajax_scroll_top: form
ajax_progress_type: ''
ajax_effect: ''
ajax_speed: null
page: true
page_submit_path: ''
page_confirm_path: ''
page_theme_name: ''
form_title: both
form_submit_once: false
form_open_message: ''
form_close_message: ''
form_exception_message: ''
form_previous_submissions: true
form_confidential: false
form_confidential_message: ''
form_disable_remote_addr: false
form_convert_anonymous: false
form_prepopulate: false
form_prepopulate_source_entity: false
form_prepopulate_source_entity_required: false
form_prepopulate_source_entity_type: ''
form_unsaved: false
form_disable_back: false
form_submit_back: false
form_disable_autocomplete: false
form_novalidate: false
form_disable_inline_errors: false
form_required: false
form_autofocus: false
form_details_toggle: false
form_reset: false
form_access_denied: default
form_access_denied_title: ''
form_access_denied_message: ''
form_access_denied_attributes: { }
form_file_limit: ''
form_attributes: { }
form_method: ''
form_action: ''
share: false
share_node: false
share_theme_name: ''
share_title: true
share_page_body_attributes: { }
submission_label: ''
submission_exception_message: ''
submission_locked_message: ''
submission_log: false
submission_excluded_elements: { }
submission_exclude_empty: false
submission_exclude_empty_checkbox: false
submission_views: { }
submission_views_replace: { }
submission_user_columns: { }
submission_user_duplicate: false
submission_access_denied: default
submission_access_denied_title: ''
submission_access_denied_message: ''
submission_access_denied_attributes: { }
previous_submission_message: ''
previous_submissions_message: ''
autofill: false
autofill_message: ''
autofill_excluded_elements: { }
wizard_progress_bar: true
wizard_progress_pages: false
wizard_progress_percentage: false
wizard_progress_link: false
wizard_progress_states: false
wizard_start_label: ''
wizard_preview_link: false
wizard_confirmation: true
wizard_confirmation_label: ''
wizard_auto_forward: true
wizard_auto_forward_hide_next_button: false
wizard_keyboard: true
wizard_track: ''
wizard_prev_button_label: ''
wizard_next_button_label: ''
wizard_toggle: false
wizard_toggle_show_label: ''
wizard_toggle_hide_label: ''
preview: 0
preview_label: ''
preview_title: ''
preview_message: ''
preview_attributes: { }
preview_excluded_elements: { }
preview_exclude_empty: true
preview_exclude_empty_checkbox: false
draft: none
draft_multiple: false
draft_auto_save: false
draft_saved_message: ''
draft_loaded_message: ''
draft_pending_single_message: ''
draft_pending_multiple_message: ''
confirmation_type: message
confirmation_url: ''
confirmation_title: ''
confirmation_message: ''
confirmation_attributes: { }
confirmation_back: true
confirmation_back_label: ''
confirmation_back_attributes: { }
confirmation_exclude_query: false
confirmation_exclude_token: false
confirmation_update: false
limit_total: null
limit_total_interval: null
limit_total_message: ''
limit_total_unique: false
limit_user: null
limit_user_interval: null
limit_user_message: ''
limit_user_unique: false
entity_limit_total: null
entity_limit_total_interval: null
entity_limit_user: null
entity_limit_user_interval: null
purge: all
purge_days: 30
results_disabled: false
results_disabled_ignore: false
results_customize: false
token_view: false
token_update: false
token_delete: false
serial_disabled: false
access:
create:
roles:
- anonymous
- authenticated
users: { }
permissions: { }
view_any:
roles: { }
users: { }
permissions: { }
update_any:
roles: { }
users: { }
permissions: { }
delete_any:
roles: { }
users: { }
permissions: { }
purge_any:
roles: { }
users: { }
permissions: { }
view_own:
roles: { }
users: { }
permissions: { }
update_own:
roles: { }
users: { }
permissions: { }
delete_own:
roles: { }
users: { }
permissions: { }
administer:
roles: { }
users: { }
permissions: { }
test:
roles: { }
users: { }
permissions: { }
configuration:
roles: { }
users: { }
permissions: { }
handlers:
digital_post_sf1601:
id: digital_post_sf1601
handler_id: digital_post_sf1601
label: 'Digital post (sf1601)'
notes: ''
status: true
conditions: { }
weight: 0
settings:
debug: false
memo_message:
type: 'Automatisk Valg'
recipient_element: recipient_cvr
attachment_element: digital_post_content_pdf
sender_label: 'Hilsen fra [site:url-brief]'
message_header_label: SF1601
memo_actions: { }
variants: { }
2 changes: 2 additions & 0 deletions os2forms_digital_post.info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@ core_version_requirement: ^8 || ^9
dependencies:
- 'webform:webform'
- 'webform:webform_submission_log'
- 'os2forms_cpr_lookup:os2forms_cpr_lookup'
- 'os2forms_cvr_lookup:os2forms_cvr_lookup'

configure: os2forms_digital_post.admin.settings
1 change: 1 addition & 0 deletions os2forms_digital_post.services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ services:
- "@Drupal\\os2forms_digital_post\\Helper\\CertificateLocatorHelper"
- "@entity_type.manager"
- "@os2forms_cpr_lookup.service"
- "@os2forms_cvr_lookup.service"
- "@Drupal\\os2forms_digital_post\\Helper\\MeMoHelper"
- "@logger.factory"

Expand Down
10 changes: 10 additions & 0 deletions src/Exception/InvalidRecipientDataException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Drupal\os2forms_digital_post\Exception;

/**
* Invalid recipient identifier element exception.
*/
class InvalidRecipientDataException extends RuntimeException {

}
90 changes: 63 additions & 27 deletions src/Helper/MeMoHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
use DigitalPost\MeMo\Sender;
use Drupal\Core\Render\ElementInfoManagerInterface;
use Drupal\os2forms_cpr_lookup\CPR\CprServiceResult;
use Drupal\os2forms_cvr_lookup\CVR\CvrServiceResult;
use Drupal\os2forms_digital_post\Exception\InvalidAttachmentElementException;
use Drupal\os2forms_digital_post\Exception\InvalidRecipientDataException;
use Drupal\os2forms_digital_post\Form\SettingsForm;
use Drupal\os2forms_digital_post\Plugin\WebformHandler\WebformHandlerSF1601;
use Drupal\webform\WebformSubmissionInterface;
Expand Down Expand Up @@ -62,7 +64,7 @@ public function __construct(ElementInfoManagerInterface $elementInfoManager, Web
/**
* Build MeMo message.
*/
public function buildMessage(WebformSubmissionInterface $submission, array $options, array $handlerSettings, array $submissionData = [], CprServiceResult $cprServiceResult = NULL): Message {
public function buildMessage(WebformSubmissionInterface $submission, array $options, array $handlerSettings, array $submissionData = [], $recipientData = NULL): Message {
$messageUUID = Serializer::createUuid();
$messageID = Serializer::createUuid();

Expand All @@ -78,32 +80,7 @@ public function buildMessage(WebformSubmissionInterface $submission, array $opti
->setIdType($options[WebformHelperSF1601::RECIPIENT_IDENTIFIER_TYPE])
->setRecipientID($options[WebformHelperSF1601::RECIPIENT_IDENTIFIER]);

if (NULL !== $cprServiceResult) {
$name = implode(' ', array_filter([
$cprServiceResult->getFirstName(),
$cprServiceResult->getMiddleName(),
$cprServiceResult->getLastName(),
]));

$recipient->setLabel($name);
$address = (new Address())
->setCo('')
->setAddressLabel($cprServiceResult->getStreetName() ?: '')
->setHouseNumber($cprServiceResult->getHouseNumber() ?: '')
->setFloor($cprServiceResult->getFloor() ?: '')
->setDoor($cprServiceResult->getSide() ?: '')
->setZipCode($cprServiceResult->getPostalCode() ?: '')
->setCity($cprServiceResult->getCity() ?: '')
->setCountry('DA');
$attentionData = (new AttentionData())
->setAttentionPerson((new AttentionPerson())
->setLabel($recipient->getLabel())
->setPersonID($recipient->getRecipientID())
)
->setAddress($address);

$recipient->setAttentionData($attentionData);
}
$this->enrichRecipient($recipient, $recipientData);

$label = $this->replaceTokens($options[WebformHandlerSF1601::MESSAGE_HEADER_LABEL], $submission);
$messageHeader = (new MessageHeader())
Expand Down Expand Up @@ -159,6 +136,65 @@ public function buildMessage(WebformSubmissionInterface $submission, array $opti
return $message;
}

/**
* Enrich recipient with additional data from a lookup.
*/
private function enrichRecipient(Recipient $recipient, $recipientData = NULL): Recipient {
if ($recipientData instanceof CprServiceResult) {
$name = implode(' ', array_filter([
$recipientData->getFirstName(),
$recipientData->getMiddleName(),
$recipientData->getLastName(),
]));

$recipient->setLabel($name);
$address = (new Address())
->setCo('')
->setAddressLabel($recipientData->getStreetName() ?: '')
->setHouseNumber($recipientData->getHouseNumber() ?: '')
->setFloor($recipientData->getFloor() ?: '')
->setDoor($recipientData->getSide() ?: '')
->setZipCode($recipientData->getPostalCode() ?: '')
->setCity($recipientData->getCity() ?: '')
->setCountry('DA');
$attentionData = (new AttentionData())
->setAttentionPerson((new AttentionPerson())
->setLabel($recipient->getLabel())
->setPersonID($recipient->getRecipientID())
)
->setAddress($address);

$recipient->setAttentionData($attentionData);
}
elseif ($recipientData instanceof CvrServiceResult) {
$name = $recipientData->getName();

$recipient->setLabel($name);
$address = (new Address())
->setCo('')
->setAddressLabel($recipientData->getStreetName() ?: '')
->setHouseNumber($recipientData->getHouseNumber() ?: '')
->setFloor($recipientData->getFloor() ?: '')
->setDoor($recipientData->getSide() ?: '')
->setZipCode($recipientData->getPostalCode() ?: '')
->setCity($recipientData->getCity() ?: '')
->setCountry('DA');
$attentionData = (new AttentionData())
->setAttentionPerson((new AttentionPerson())
->setLabel($recipient->getLabel())
->setPersonID($recipient->getRecipientID())
)
->setAddress($address);

$recipient->setAttentionData($attentionData);
}
elseif (NULL !== $recipientData) {
throw new InvalidRecipientDataException(sprintf('Cannot handle recipient data of type %s', is_scalar($recipientData) ? gettype($recipientData) : get_class($recipientData)));
}

return $recipient;
}

/**
* Convert MeMo message to DOM document.
*/
Expand Down
Loading