' . Yaml::dump(json_decode(json_encode($value), TRUE),
+ inline: PHP_INT_MAX) . '';
+ }
+
+}
diff --git a/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugForsendelseController.php b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugForsendelseController.php
new file mode 100644
index 0000000..edaba65
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugForsendelseController.php
@@ -0,0 +1,152 @@
+query->get('anvender_transaktions_id')) {
+ if ($item = $this->repository->loadByAnvenderTransaktionsId($anvenderTransaktionsId)) {
+ return $this->itemDetails($item);
+ }
+
+ throw new NotFoundHttpException();
+ }
+ $items = $this->repository->loadBySubmission($webform_submission);
+
+ // https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Table.php/class/Table/10
+ $header = [
+ 'anvenderTransaktionsId' => $this->t('anvenderTransaktionsId'),
+ 'distributionTransaktionsId' => $this->t('distributionTransaktionsId'),
+ 'receipts' => $this->t('Receipts'),
+ 'webform handlers' => $this->t('Webform handlers'),
+ 'createdAt' => $this->t('Created at'),
+ 'updatedAt' => $this->t('Updated at'),
+ 'deliveredAt' => $this->t('Delivered at'),
+ ];
+ $rows = [];
+ foreach ($items as $item) {
+ $rows[] = [
+ 'anvenderTransaktionsId' => [
+ 'data' => [
+ // https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Link.php/class/Link/10
+ '#title' => $item->anvenderTransaktionsId,
+ '#type' => 'link',
+ '#url' => Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_forsendelse', [
+ 'webform' => $webform->id(),
+ 'webform_submission' => $webform_submission->id(),
+ 'anvender_transaktions_id' => $item->anvenderTransaktionsId,
+ ]),
+ ],
+ ],
+ 'distributionTransaktionsId' => [
+ 'data' => [
+ '#markup' => $item->distributionTransaktionsId,
+ ],
+ ],
+ 'receipts' => [
+ 'data' => [
+ '#title' => $this->t('Receipts'),
+ '#type' => 'link',
+ '#url' => Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_kvittering', [
+ 'webform' => $webform->id(),
+ 'webform_submission' => $webform_submission->id(),
+ 'anvender_transaktions_id' => $item->anvenderTransaktionsId,
+ ]),
+ ],
+ ],
+ 'webform handlers' => [
+ 'data' => [
+ '#title' => $this->t('Webform handlers'),
+ '#type' => 'link',
+ '#url' => Url::fromRoute('entity.webform.handlers', [
+ 'webform' => $item->webformId,
+ ]),
+ ],
+ ],
+ 'createdAt' => [
+ 'data' => [
+ '#markup' => $this->formatDatetime($item->createdAt),
+ ],
+ ],
+ 'updatedAt' => [
+ 'data' => [
+ '#markup' => $this->formatDatetime($item->updatedAt),
+ ],
+ ],
+ 'deliveredAt' => [
+ 'data' => [
+ '#markup' => $this->formatDatetime($item->deliveredAt),
+ ],
+ ],
+ ];
+ }
+
+ return [
+ '#type' => 'table',
+ '#header' => $header,
+ '#rows' => $rows,
+ '#empty' => $this->t('No entries available.'),
+ ];
+ }
+
+ /**
+ * Build item details.
+ */
+ private function itemDetails(AnvenderForsendelse $item) {
+ return [
+ [
+ '#type' => 'item',
+ '#title' => $this->t('anvenderTransaktionsId'),
+ '#markup' => $item->anvenderTransaktionsId,
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('distributionTransaktionsId'),
+ '#markup' => $item->distributionTransaktionsId,
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Created at'),
+ '#markup' => $this->formatDatetime($item->createdAt),
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Updated at'),
+ '#markup' => $this->formatDatetime($item->updatedAt),
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Request'),
+ '#markup' => $this->renderYaml($item->request),
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Response'),
+ '#markup' => $this->renderYaml($item->response),
+ ],
+ ];
+ }
+
+}
diff --git a/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugKvitteringController.php b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugKvitteringController.php
new file mode 100644
index 0000000..ebb0463
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugKvitteringController.php
@@ -0,0 +1,134 @@
+query->get('id')) {
+ if ($item = $this->repository->load($id)) {
+ return $this->itemDetails($item);
+ }
+
+ throw new NotFoundHttpException();
+ }
+
+ $items = $this->repository->loadByAnvenderTransaktionsId($anvender_transaktions_id);
+
+ // https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Table.php/class/Table/10
+ $header = [
+ 'id' => $this->t('ID'),
+ 'anvenderTransaktionsId' => $this->t('anvenderTransaktionsId'),
+ 'distributionTransaktionsId' => $this->t('distributionTransaktionsId'),
+ 'createdAt' => $this->t('Created at'),
+ 'updatedAt' => $this->t('Updated at'),
+ ];
+ $rows = [];
+ foreach ($items as $item) {
+ $rows[] = [
+ 'id' => [
+ 'data' => [
+ '#title' => $item->id,
+ '#type' => 'link',
+ '#url' => Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_kvittering',
+ [
+ 'webform' => $webform->id(),
+ 'webform_submission' => $webform_submission->id(),
+ 'anvender_transaktions_id' => $item->anvenderTransaktionsId,
+ 'id' => $item->id,
+ ]),
+ ],
+ ],
+ 'anvenderTransaktionsId' => [
+ 'data' => [
+ '#title' => $item->anvenderTransaktionsId,
+ '#type' => 'link',
+ '#url' => Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_forsendelse',
+ [
+ 'webform' => $webform->id(),
+ 'webform_submission' => $webform_submission->id(),
+ 'anvender_transaktions_id' => $item->anvenderTransaktionsId,
+ ]),
+ ],
+ ],
+ 'distributionTransaktionsId' => [
+ 'data' => [
+ '#markup' => $item->distributionTransaktionsId,
+ ],
+ ],
+ 'createdAt' => [
+ 'data' => [
+ '#markup' => $this->formatDatetime($item->createdAt),
+ ],
+ ],
+ 'updatedAt' => [
+ 'data' => [
+ '#markup' => $this->formatDatetime($item->updatedAt),
+ ],
+ ],
+ ];
+ }
+
+ return [
+ '#type' => 'table',
+ '#header' => $header,
+ '#rows' => $rows,
+ '#empty' => $this->t('No entries available.'),
+ ];
+ }
+
+ /**
+ * Build item details.
+ */
+ private function itemDetails(AnvenderKvittering $item) {
+ return [
+ [
+ '#type' => 'item',
+ '#title' => $this->t('anvenderTransaktionsId'),
+ '#markup' => $item->anvenderTransaktionsId,
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('distributionTransaktionsId'),
+ '#markup' => $item->distributionTransaktionsId,
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Created at'),
+ '#markup' => $this->formatDatetime($item->createdAt),
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Updated at'),
+ '#markup' => $this->formatDatetime($item->updatedAt),
+ ],
+ [
+ '#type' => 'item',
+ '#title' => $this->t('Request'),
+ '#markup' => $this->renderYaml($item->request),
+ ],
+ ];
+ }
+
+}
diff --git a/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugSftpController.php b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugSftpController.php
new file mode 100644
index 0000000..83cb46e
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_debug/src/Controller/Os2formsFordelingskomponentDebugSftpController.php
@@ -0,0 +1,90 @@
+helper->sf2900()->sftp();
+
+ if (NULL !== $filename && preg_match('/\.[^.]+$/', $filename)) {
+ $content = $sftp->getContents($filename, $dir);
+
+ $contentType = match(pathinfo($filename, PATHINFO_EXTENSION)) {
+ 'sftpreceipt', 'trigger' => $this->mimeTypeGuesser->guessMimeType('name.xml'),
+ default => $this->mimeTypeGuesser->guessMimeType($filename)
+ };
+
+ return new Response($content, Response::HTTP_OK, [
+ 'Content-Type' => $contentType,
+ ]);
+ }
+ else {
+ $files = $sftp->getFiles($dir ?? '.', recursive: TRUE, raw: TRUE);
+
+ // Filter out . and ..
+ $files = array_filter($files, static fn (string $name) => !preg_match('/^\.+$/', $name), ARRAY_FILTER_USE_KEY);
+
+ if ($filter = ($request->query->all()['filter'] ?? NULL)) {
+ $files = array_filter($files, static fn (string $filename) => array_all($filter, fn (string $value) => str_contains($filename, $value)), ARRAY_FILTER_USE_KEY);
+ }
+
+ $header = [
+ 'filepath' => $this->t('Path'),
+ 'atime' => $this->t('Last accessed at'),
+ 'mtime' => $this->t('Last modified at'),
+ ];
+ $rows = [];
+ foreach ($files as $stat) {
+ $rows[] = [
+ 'filepath' => [
+ 'data' => [
+ '#title' => '/' . ($dir ? $dir . '/' : '') . $stat->filename,
+ '#type' => 'link',
+ '#url' => $dir
+ ? Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_sftp_filename', [
+ 'dir' => $dir,
+ 'filename' => $stat->filename,
+ ])
+ : Url::fromRoute('os2forms_fordelingskomponent_debug.os2forms_fordelingskomponent_debug_sftp', [
+ 'dir' => $stat->filename,
+ ]),
+ ],
+ ],
+ 'atime' => $this->formatDatetime($stat->atime ?? NULL),
+ 'mtime' => $this->formatDatetime($stat->mtime ?? NULL),
+ ];
+ }
+
+ return [
+ '#type' => 'table',
+ '#header' => $header,
+ '#rows' => $rows,
+ '#empty' => $this->t('No entries available.'),
+ ];
+ }
+ }
+
+}
diff --git a/modules/os2forms_fordelingskomponent_examples/README.md b/modules/os2forms_fordelingskomponent_examples/README.md
new file mode 100644
index 0000000..5f29176
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_examples/README.md
@@ -0,0 +1,49 @@
+# OS2Forms Fordelingskomponent examples
+
+Example forms for OS2Forms Fordelingskomponent
+
+## Installation
+
+``` shell
+drush pm:enable os2forms_fordelingskomponent_examples
+```
+
+Go to `/admin/structure/webform?category=Fordelingskomponent` to see the example forms.
+
+## Updating the examples
+
+All example webforms have IDs that match the regular expressions `/^os2forms_fdk_/` or `/^o2f_fdk_/`, i.e. if you want
+to create a new example webform it must be have an ID like `os2forms_fdk_my_example`, say.
+
+Run
+
+``` shell
+drush os2forms-fordelingskomponent:examples:export
+```
+
+to export all example webforms.
+
+Test the newly exported config by reinstalling the `os2forms_fordelingskomponent_examples` module
+
+``` shell
+drush pm:uninstall os2forms_fordelingskomponent_examples
+drush pm:install os2forms_fordelingskomponent_examples
+```
+
+Alternatively, import all examples:
+
+``` shell
+drush config:import --partial --source module://os2forms_fordelingskomponent_examples/config/install
+```
+
+Or a single webform, e.g.
+
+``` shell
+drush config:set --input-format=yaml webform.webform.os2forms_fdk_kp_anmoding '?' - < config/install/webform.webform.os2forms_fdk_kp_anmoding.yml
+# drush config:get webform.webform.os2forms_fdk_kp_anmoding
+```
+
+## Testing
+
+Fill out an example webform with test data and pre-populate some fields:
+`/webform/os2forms_fdk_kp_sp241/test?ansoeger_personnummer=1234567890&ansoeger_telefonnummer=12345678&fuldmagt_fuldmagthaverspersonnummer=0987654321`
diff --git a/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_dokument.yml b/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_dokument.yml
new file mode 100644
index 0000000..1dc56a1
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_dokument.yml
@@ -0,0 +1,304 @@
+langcode: da
+status: open
+dependencies:
+ module:
+ - os2forms
+ - os2forms_fordelingskomponent
+ - webform_encrypt
+ - webform_entity_print
+ - webform_revisions
+ enforced:
+ module:
+ - os2forms_fordelingskomponent_examples
+third_party_settings:
+ webform_encrypt:
+ element:
+ message:
+ encrypt: true
+ encrypt_profile: webform
+ attachment:
+ encrypt: true
+ encrypt_profile: webform
+ os2forms:
+ os2forms_email_handler:
+ enabled: 0
+ email_recipients: ""
+ os2forms_nemid:
+ session_type: ""
+ webform_type: ""
+ nemlogin_auto_redirect: 0
+ os2forms_nemlogin_openid_connect:
+ authentication_settings:
+ user_claim: ""
+ element_key: ""
+ error_message: ""
+ os2forms_nemid_address_protection:
+ nemlogin_hide_form: os2forms_nemlogin_address_protection_default_behaviour
+ nemlogin_hide_message: ""
+ os2forms_rest_api:
+ allowed_users: null
+ os2forms_sync:
+ publish: 0
+ os2forms_webform_submission_log:
+ emails: ""
+ webform_entity_print:
+ template:
+ header: ""
+ footer: ""
+ css: ""
+ os2form_header: ""
+ os2form_colophon: ""
+ os2form_footer: ""
+ export_types:
+ pdf:
+ enabled: true
+ link_text: ""
+ link_attributes: {}
+ word_docx:
+ enabled: false
+ link_text: ""
+ link_attributes: {}
+weight: 0
+open: null
+close: null
+uid: 1
+template: false
+archive: false
+id: os2forms_fdk_dokument
+title: 'OS2Forms Fordelingskomponent example with "dokument"'
+description: ""
+categories: {}
+elements: |-
+ message:
+ '#type': textarea
+ '#title': Message
+ '#required': true
+ '#default_value': |-
+ [current-date:long]
+
+ [random:hash:sha512]
+ attachment:
+ '#type': os2forms_attachment
+ '#title': attachment
+ '#export_type': pdf
+ '#digital_signature': 0
+ '#excluded_elements': { }
+ '#exclude_empty': 0
+ '#exclude_empty_checkbox': 0
+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: ""
+ wizard_page_type: container
+ wizard_page_title_tag: h2
+ 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:
+ os2forms_fordelingskomponent_sf2900:
+ id: os2forms_fordelingskomponent_sf2900
+ handler_id: os2forms_fordelingskomponent_sf2900
+ label: "Fordelingskomponent (sf2900)"
+ notes: ""
+ status: true
+ conditions: {}
+ weight: 0
+ settings:
+ sf2900:
+ kle_emne: 01.01.01
+ handling_facet: ""
+ brugervendt_noegle: "What is “Brugervendt nøgle”?"
+ titel: "Your document"
+ beskrivelse: "This is a very important document"
+ distribution_type: JOURNALPOST
+ attachment_element: afsend_content_pdf
+ xml_template: ""
+ xsd_url: ""
+ journalpost_message: "Dette er et fordelingsobjekt fra [site:base-url]."
+ distribution_context:
+ kle_emne: 01.01.01
+ handling_facet: ""
+ brugervendt_noegle: "Brugervendt nøgle"
+ titel: Titel
+ beskrivelse: Beskrivelse
+ distribution_object:
+ distribution_type: DOKUMENT
+ journalpost_message: ""
+ attachment_element: attachment
+ xml_template: ""
+ xsd_url: ""
+variants: {}
diff --git a/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_formular.yml b/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_formular.yml
new file mode 100644
index 0000000..dc71d33
--- /dev/null
+++ b/modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_formular.yml
@@ -0,0 +1,305 @@
+langcode: da
+status: open
+dependencies:
+ module:
+ - os2forms
+ - os2forms_fordelingskomponent
+ - webform_encrypt
+ - webform_entity_print
+ - webform_revisions
+ enforced:
+ module:
+ - os2forms_fordelingskomponent_examples
+third_party_settings:
+ webform_encrypt:
+ element:
+ message:
+ encrypt: true
+ encrypt_profile: webform
+ attachment:
+ encrypt: true
+ encrypt_profile: webform
+ os2forms:
+ os2forms_email_handler:
+ enabled: 0
+ email_recipients: ""
+ os2forms_nemid:
+ session_type: ""
+ webform_type: ""
+ nemlogin_auto_redirect: 0
+ os2forms_nemlogin_openid_connect:
+ authentication_settings:
+ user_claim: ""
+ element_key: ""
+ error_message: ""
+ os2forms_nemid_address_protection:
+ nemlogin_hide_form: os2forms_nemlogin_address_protection_default_behaviour
+ nemlogin_hide_message: ""
+ os2forms_rest_api:
+ allowed_users: null
+ os2forms_sync:
+ publish: 0
+ os2forms_webform_submission_log:
+ emails: ""
+ webform_entity_print:
+ template:
+ header: ""
+ footer: ""
+ css: ""
+ os2form_header: ""
+ os2form_colophon: ""
+ os2form_footer: ""
+ export_types:
+ pdf:
+ enabled: true
+ link_text: ""
+ link_attributes: {}
+ word_docx:
+ enabled: false
+ link_text: ""
+ link_attributes: {}
+weight: 0
+open: null
+close: null
+uid: 1
+template: false
+archive: false
+id: os2forms_fdk_formular
+title: 'OS2Forms Fordelingskomponent example with "formular"'
+description: ""
+categories: {}
+elements: |-
+ message:
+ '#type': textarea
+ '#title': Message
+ '#required': true
+ '#default_value': |-
+ [current-date:long]
+
+ [random:hash:sha512]
+ attachment:
+ '#type': os2forms_attachment
+ '#title': attachment
+ '#export_type': pdf
+ '#digital_signature': 0
+ '#excluded_elements': { }
+ '#exclude_empty': 0
+ '#exclude_empty_checkbox': 0
+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: ""
+ wizard_page_type: container
+ wizard_page_title_tag: h2
+ 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:
+ os2forms_fordelingskomponent_sf2900:
+ id: os2forms_fordelingskomponent_sf2900
+ handler_id: os2forms_fordelingskomponent_sf2900
+ label: "Fordelingskomponent (sf2900)"
+ notes: ""
+ status: true
+ conditions: {}
+ weight: 0
+ settings:
+ sf2900:
+ kle_emne: 01.01.01
+ handling_facet: ""
+ brugervendt_noegle: "What is “Brugervendt nøgle”?"
+ titel: "Your document"
+ beskrivelse: "This is a very important document"
+ distribution_type: JOURNALPOST
+ attachment_element: afsend_content_pdf
+ xml_template: ""
+ xsd_url: ""
+ journalpost_message: "Dette er et fordelingsobjekt fra [site:base-url]."
+ distribution_context:
+ kle_emne: 01.01.01
+ handling_facet: ""
+ brugervendt_noegle: "Brugervendt nøgle"
+ titel: Titel
+ beskrivelse: Beskrivelse
+ distribution_object:
+ distribution_type: FORMULAR
+ journalpost_message: ""
+ attachment_element: attachment
+ formular_type: Hest
+ xml_template: "\r\n/webform/os2forms_fdk_kp_sp241/test?ansoeger_personnummer=1234567890&ansoeger_telefonnummer=12345678
" +categories: + - Eksempel + - KP + - SP +elements: |- + ansoeger_fornavn: + '#type': textfield + '#title': Fornavn + '#required': true + '#prepopulate': true + ansoeger_mellemnavn: + '#type': textfield + '#title': Mellemnavn + '#prepopulate': true + ansoeger_efternavn: + '#type': textfield + '#title': Efternavn + '#required': true + '#prepopulate': true + ansoeger_personnummer: + '#type': textfield + '#title': Personnummer + '#required': true + '#pattern': '\d{10}' + '#prepopulate': true + ansoeger_telefonnummer: + '#type': textfield + '#title': Telefonnummer + '#pattern': \d+ + '#prepopulate': true + sygeforsikring: + '#type': checkbox + '#title': Sygeforsikring + '#prepopulate': true + sygeforsikring_gruppe: + '#type': select + '#title': Gruppe + '#options': + GRUPPE_1: 'Gruppe 1' + GRUPPE_2: 'Gruppe 2' + GRUPPE_5: 'Gruppe 5' + GRUPPE_E: 'Gruppe E' + GRUPPE_N: 'Gruppe N' + GRUPPE_S: 'Gruppe S' + GRUPPE_BASIS: Basis + '#prepopulate': true + '#states': + _visible: + ':input[name="sygeforsikring"]': + checked: true + required: + ':input[name="sygeforsikring"]': + checked: true + erklaering: + '#type': checkbox + '#title': Erklæring + '#required': true + '#prepopulate': true + underskriftsoplysninger_underskriftsdato: + '#type': date + '#title': Underskriftsdato + '#disabled': true + '#default_value': today + fuldmagt: + '#type': checkbox + '#title': Fuldmagt + '#prepopulate': true + fuldmagt_fuldmagtdokumentnavn: + '#type': textfield + '#title': Navn + '#prepopulate': true + '#states': + _visible: + ':input[name="fuldmagt"]': + checked: true + required: + ':input[name="fuldmagt"]': + checked: true + fuldmagt_fuldmagthaverspersonnummer: + '#type': textfield + '#title': Personnummer + '#pattern': '\d{10}' + '#prepopulate': true + '#states': + _visible: + ':input[name="fuldmagt"]': + checked: true + required: + ':input[name="fuldmagt"]': + checked: true + dokumenter_overslag: + '#type': webform_document_file + '#title': Overslag + dokumenter_faktura: + '#type': webform_document_file + '#title': Faktura + dokumenter_bilag: + '#type': webform_document_file + '#title': Bilag + kvittering: + '#type': os2forms_attachment + '#title': kvittering + '#export_type': pdf + '#digital_signature': 0 + '#excluded_elements': { } + '#exclude_empty': 0 + '#exclude_empty_checkbox': 0 +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: "" + wizard_page_type: container + wizard_page_title_tag: h2 + 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: page + 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: + fordelingskomponent_sf2900: + id: os2forms_fordelingskomponent_sf2900 + handler_id: fordelingskomponent_sf2900 + label: "Fordelingskomponent (sf2900)" + notes: "" + status: true + conditions: {} + weight: 0 + settings: + distribution_context: + routing_modtager_aktoer: "" + kle_emne: 32.03.12 + handling_facet: G01 + brugervendt_noegle: "@todo Skal skjules for “formular“" + titel: "@todo Titel SP241" + beskrivelse: "@todo Beskrivelse\r\n\r\nSe https://rimi-itk.github.io/digitaliseringskataloget.dk/digitaliseringskataloget.dk/sf1415/0.6/Integrationsbeskrivelse_SF1415.pdf#page=14 for at finde formulartype mm." + distribution_object: + distribution_type: FORMULAR + journalpost_message: "" + attachment_element: kvittering + formular_type: HelbredstillægAnsøgningFormular_1 + files: + filspecifikation: HelbredstillægAnsøgningBilag_1 + recipient_it_system_look_up: 1 + recipient_it_system: "" + recipient_authority: "55133018" + xml_template: "\r\ndrush advancedqueue:queue:process @queue (in a cron job).",
+ [
+ '@queue' => $settings->queue,
+ ':queue_url' => '/admin/config/system/queues/jobs/' . urlencode((string) $settings->queue),
+ ]);
+ $section[GeneralSettings::QUEUE] = [
+ '#type' => 'select',
+ '#title' => $this->t('Queue'),
+ '#options' => array_map(
+ static fn(EntityInterface $queue) => $queue->label(),
+ $this->queueStorage->loadMultiple()
+ ),
+ '#empty_option' => $this->t('No queue'),
+ '#default_value' => $settings->queue,
+ '#description' => $description,
+ ];
+
+ $section[GeneralSettings::TEST_MODE] = [
+ '#type' => 'checkbox',
+ '#title' => $this->t('Test mode'),
+ '#default_value' => $settings->testMode,
+ ];
+
+ return $section;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ #[\Override]
+ public function validateForm(array &$form, FormStateInterface $form_state): void {
+ $setError = static fn (string|array $path, TranslatableMarkup $message) => $form_state->setErrorByName(implode('][', (array) $path), $message);
+
+ $value = $form_state->getValue(SenderSettings::NAME)[SenderSettings::SENDER_ID] ?? '';
+ if (!FordelingskomponentHelper::isValidCvr($value)) {
+ $setError([SenderSettings::NAME, SenderSettings::SENDER_ID], $this->t('The sender ID is not a valid CVR.'));
+ }
+
+ $value = $form_state->getValue(SenderSettings::NAME)[SenderSettings::ROUTING_MYNDIGHED] ?? '';
+ if (!empty($value) && !FordelingskomponentHelper::isValidCvr($value)) {
+ $setError([SenderSettings::NAME, SenderSettings::ROUTING_MYNDIGHED], $this->t('The routing myndighed is not a valid CVR.'));
+ }
+
+ $value = $form_state->getValue(SenderSettings::NAME)[SenderSettings::REGISTRERING_IT_SYSTEM] ?? '';
+ if (!empty($value) && !FordelingskomponentHelper::isValidUuid($value)) {
+ $setError([SenderSettings::NAME, SenderSettings::REGISTRERING_IT_SYSTEM], $this->t('The registrering it system is not a valid UUID.'));
+ }
+
+ parent::validateForm($form, $form_state);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ #[\Override]
+ public function submitForm(array &$form, FormStateInterface $form_state): void {
+ $config = $this->config(Settings::CONFIG_NAME);
+ foreach ([
+ SenderSettings::NAME,
+ GeneralSettings::NAME,
+ ] as $name) {
+ $config->set($name, $form_state->getValue($name));
+ }
+ $config->save();
+
+ parent::submitForm($form, $form_state);
+ }
+
+}
diff --git a/src/Helper/FordelingskomponentHelper.php b/src/Helper/FordelingskomponentHelper.php
new file mode 100644
index 0000000..6483277
--- /dev/null
+++ b/src/Helper/FordelingskomponentHelper.php
@@ -0,0 +1,808 @@
+fileStorage = $entityTypeManager->getStorage('file');
+ }
+
+ /**
+ * Get routing info.
+ */
+ public function getRoutingInfo(HandlerSettings $handlerSettings): ?FordelingsmodtagerListResponseType {
+ return $this->sf2900()->getModtagerList(
+ routingMyndighed: (string) $handlerSettings->sender->routingMyndighed,
+ routingKLEEmne: (string) $handlerSettings->distributionContext->kleEmne,
+ routingHandlingFacet: $handlerSettings->distributionContext->handlingFacet,
+ );
+ }
+
+ /**
+ * Build distribution object.
+ */
+ public function buildDistributionObject(
+ WebformSubmissionInterface $submission,
+ HandlerSettings $handlerSettings,
+ ?Attachment $attachment,
+ ): DistributionFormularType|DistributionDokumentType|DistributionJournalPostType {
+ $virkning = $this->buildVirkning($handlerSettings);
+
+ $id = Serializer::createUuid();
+ $fraTidsPunkt = new \DateTime();
+ $brevDato = new \DateTime();
+
+ $type = $handlerSettings->distributionObject->distributionType;
+ $distributionObject = match ($type) {
+ DistributionObjectSettings::DISTRIBUTION_TYPE_JOURNALPOST => $this->buildDistributionJournalPostType(
+ id: $id,
+ fraTidsPunkt: $fraTidsPunkt,
+ virkning: $virkning,
+ handlerSettings: $handlerSettings,
+ ),
+ DistributionObjectSettings::DISTRIBUTION_TYPE_DOKUMENT => $this->buildDistributionDokumentType(
+ id: $id,
+ fraTidsPunkt: $fraTidsPunkt,
+ brevDato: $brevDato,
+ virkning: $virkning,
+ submission: $submission,
+ handlerSettings: $handlerSettings,
+ ),
+ DistributionObjectSettings::DISTRIBUTION_TYPE_FORMULAR => $this->buildDistributionFormularType(
+ id: $id,
+ submission: $submission,
+ handlerSettings: $handlerSettings,
+ attachment: $attachment,
+ ),
+ default => throw new Exception(sprintf('Invalid distribution type: %s', $type)),
+ };
+
+ return $distributionObject;
+ }
+
+ /**
+ * Build distribution object for "Journalnotat".
+ */
+ private function buildDistributionJournalPostType(
+ string $id,
+ \DateTimeInterface $fraTidsPunkt,
+ VirkningType $virkning,
+ HandlerSettings $handlerSettings,
+ ): DistributionJournalPostType {
+ // @todo DO we need a specific “titel" property?
+ $titel = $handlerSettings->distributionContext->titel;
+ $notat = $handlerSettings->distributionObject->journalpostMessage;
+
+ return new DistributionJournalPostType(
+ iD: $id,
+ kLEEmneForslag: $handlerSettings->distributionContext->kleEmne,
+ registrering: new JournalPostRegistreringType(
+ fraTidsPunkt: SF2900::formatDateTime($fraTidsPunkt),
+ livscyklusKode: LivscyklusKodeType::VALUE_OPRETTET,
+ registreringItSystem: new UUID_URN($handlerSettings->sender->registreringItSystem),
+ relationListe: new JournalPostRelationsListeType([
+ new JournalPostType(
+ virkning: $virkning,
+ rolle: JournalPostRolleType::VALUE_JOURNALPOST,
+ // @todo What is "indeks"?
+ indeks: '1',
+ journalnotatAttributter: new JournalNotatEgenskaberType(
+ notat: $notat,
+ titel: $titel,
+ )
+ ),
+ ])
+ )
+ );
+ }
+
+ /**
+ * Build distribution object for "Dokument".
+ */
+ private function buildDistributionDokumentType(
+ string $id,
+ \DateTimeInterface $fraTidsPunkt,
+ \DateTimeInterface $brevDato,
+ VirkningType $virkning,
+ WebformSubmissionInterface $submission,
+ HandlerSettings $handlerSettings,
+ ): DistributionDokumentType {
+ return new DistributionDokumentType(
+ iD: $id,
+ kLEEmneForslag: $handlerSettings->distributionContext->kleEmne,
+ registrering: new DokumentRegistreringType(
+ fraTidsPunkt: SF2900::formatDateTime($fraTidsPunkt),
+ livscyklusKode: LivscyklusKodeType::VALUE_OPRETTET,
+ registreringItSystem: new UUID_URN($handlerSettings->sender->registreringItSystem),
+ relationListe: new RelationsListe(
+ variantListe: new VariantListeType([
+ new VariantType(
+ // If we don't clone the “virking", the XML serializer adds an
+ // ID and references which SF2900 does not handle.
+ virkning: $this->cloneVirkning($virkning),
+ rolle: VariantRolleType::VALUE_VARIANT,
+ indeks: '1',
+ variantAttributter: new VariantAttributterType(
+ // @todo What to use here?
+ variantType: Attachment::FORMAT_NAME_PDF,
+ ),
+ delAttributter: new DelAttributterType(
+ // @todo What to use here?
+ delTekst: 'Hele dokumentet',
+ ),
+ ),
+ ]),
+ ),
+ tilstandsListe: [
+ new TilstandListeType(
+ tilstand: [
+ new TilstandType(
+ // @todo Hvad er fremdrift?
+ fremdrift: FremdriftType::VALUE_ENDELIGT,
+ virkning: $this->cloneVirkning($virkning),
+ ),
+ ]
+ ),
+ ],
+ attributListe: new AttributterListeType([
+ new AttributterType(
+ brugervendtNoegleTekst: $handlerSettings->distributionContext->brugervendtNoegle,
+ titelTekst: $handlerSettings->distributionContext->titel,
+ beskrivelseTekst: $handlerSettings->distributionContext->beskrivelse,
+ // @todo What to use here?
+ dokumenttype: DokumenttypeType::VALUE_ANDEN,
+ retning: RetningType::VALUE_UDGAAENDE,
+ brevdato: SF2900::formatDate($brevDato),
+ virkning: $this->cloneVirkning($virkning),
+ ),
+ ]),
+ // importTidspunkt: null,
+ // brugerRef: null,.
+ ),
+ handlingFacetForslag: $handlerSettings->distributionContext->handlingFacet
+ );
+ }
+
+ /**
+ * Build distribution object for "Formular".
+ */
+ private function buildDistributionFormularType(
+ string $id,
+ WebformSubmissionInterface $submission,
+ HandlerSettings $handlerSettings,
+ Attachment $attachment,
+ ): DistributionFormular {
+ $files = $this->buildFileGroups($handlerSettings, $submission);
+ $renderResult = $this->renderXml($handlerSettings, $submission, $files);
+ if ($renderResult->exception) {
+ throw $renderResult->exception;
+ }
+
+ $xml = (string) $renderResult->rendered;
+ $xsdUrl = $handlerSettings->distributionObject->xsdUrl;
+
+ $this->xmlHelper->validateXml($xml);
+ if (!empty($xsdUrl)) {
+ $this->xmlHelper->validateXml($xml, $xsdUrl, loadXsdContent: TRUE);
+ }
+
+ // The attachment must be a PDF.
+ $titelTekst = basename($attachment->filename);
+ $formatNavn = pathinfo($attachment->filename, PATHINFO_EXTENSION);
+ $formularIndhold = base64_encode($attachment->contents);
+
+ // The XML will be embedded in an SOAP:Envelope element, so we have to
+ // make sure that the XML declaration is not included when embedding.
+ // Passing a DOMDocument to FormularXMLType takes care of this.
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+ $formularXML = new FormularXMLType($dom);
+
+ $meddelelse = new MeddelelseType(
+ formularType: $handlerSettings->distributionObject->formularType,
+ formular: new FormularType(
+ titelTekst: $titelTekst,
+ formatNavn: $formatNavn,
+ formularIndhold: $formularIndhold,
+ formularXML: $formularXML,
+ ),
+ );
+
+ return (new DistributionFormular(
+ iD: $id,
+ kLEEmneForslag: $handlerSettings->distributionContext->kleEmne,
+ meddelelse: $meddelelse,
+ handlingFacetForslag: $handlerSettings->distributionContext->handlingFacet,
+ ))
+ ->setFileGroups($files);
+ }
+
+ /**
+ * Render XML.
+ */
+ public function renderXml(
+ HandlerSettings $handlerSettings,
+ WebformSubmissionInterface $submission,
+ ?array $files,
+ bool $validateXml = TRUE,
+ ): XmlRenderResult {
+ $template = $handlerSettings->distributionObject->xmlTemplate;
+ if (empty(trim((string) $template))) {
+ throw new RuntimeException('Missing XML template');
+ }
+
+ $context = $this->xmlHelper->getRenderContext($handlerSettings, $submission, $files);
+
+ $rendered = NULL;
+ $exception = NULL;
+ try {
+ $rendered = $this->xmlHelper->render($template, $context, validateXml: $validateXml);
+ }
+ catch (\Exception $e) {
+ $exception = $e;
+ }
+
+ return new XmlRenderResult(
+ template: $template,
+ context: $context,
+ rendered: $rendered,
+ exception: $exception,
+ );
+ }
+
+ private const FILE_ELEMENT_TYPES = [
+ 'managed_file',
+ 'webform_document_file',
+ 'webform_image_file',
+ ];
+
+ /**
+ * Build files for a distribution object.
+ *
+ * @return array
+ * $listProperties = [
+ * 'items' => SomeNestedSettings::class,
+ * ];
+ *
+ *
+ * @var array