Skip to content

Commit 86007c0

Browse files
committed
Handled “Dokumenter”
1 parent da92bc6 commit 86007c0

6 files changed

Lines changed: 286 additions & 10 deletions

File tree

modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2forms_fdk_kp_anmoding.yml

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ third_party_settings:
4646
attachment:
4747
encrypt: true
4848
encrypt_profile: webform
49+
dokumenter_overslag:
50+
encrypt: true
51+
encrypt_profile: webform
52+
dokumenter_faktura:
53+
encrypt: true
54+
encrypt_profile: webform
55+
dokumenter_bilag:
56+
encrypt: true
57+
encrypt_profile: webform
4958
os2forms:
5059
os2forms_email_handler:
5160
enabled: 0
@@ -124,7 +133,7 @@ elements: |-
124133
'#title': Sagstype
125134
almindeligt_helbredstillaeg:
126135
'#type': select
127-
'#title': Almindeligt helbredstillaeg
136+
'#title': 'Almindeligt helbredstillaeg'
128137
'#options':
129138
Medicin: Medicin
130139
Tandbehandling: Tandbehandling
@@ -134,7 +143,7 @@ elements: |-
134143
Psykologhjaelp: Psykologhjaelp
135144
Hoereappartbehandling: Hoereapparatbehandling
136145
afsend_content_pdf:
137-
'#type': 'entity_print_attachment:pdf'
146+
'#type': 'webform_entity_print_attachment:pdf'
138147
'#title': 'Fordelingskomponent (PDF) hest'
139148
'#display_on': view
140149
'#filename': hat-og-briller.pdf
@@ -146,6 +155,18 @@ elements: |-
146155
'#excluded_elements': { }
147156
'#exclude_empty': 0
148157
'#exclude_empty_checkbox': 0
158+
dokumenter_overslag:
159+
'#type': webform_document_file
160+
'#title': Overslag
161+
'#multiple': 3
162+
dokumenter_faktura:
163+
'#type': webform_document_file
164+
'#title': Faktura
165+
'#multiple': 3
166+
dokumenter_bilag:
167+
'#type': webform_document_file
168+
'#title': Bilag
169+
'#multiple': 3
149170
css: ""
150171
javascript: ""
151172
settings:
@@ -350,7 +371,47 @@ handlers:
350371
journalpost_message: ""
351372
attachment_element: attachment
352373
formular_type: test
353-
xml_template: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<Anmodning xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n <Header>\r\n <Myndighed>urn:oio:cvr-nr:{{ handler.settings.sender.senderId }}</Myndighed>\r\n <ModtagetDato>{{ submission.completed.value|date(\"Y-m-d\") }}</ModtagetDato>\r\n <KLE>{{ handler.settings.distributionContext.kleEmne }}</KLE>\r\n </Header>\r\n <AnsoegerOplysninger>\r\n <Ansoeger>\r\n <Fornavn>{{ submission.data.fornavn }}</Fornavn>\r\n <Efternavn>{{ submission.data.efternavn }}</Efternavn>\r\n <Personnummer>urn:oio:cpr:0000000000</Personnummer>\r\n </Ansoeger>\r\n </AnsoegerOplysninger>\r\n <Sagstype>\r\n <AlmindeligtHelbredstillaeg>Medicin</AlmindeligtHelbredstillaeg>\r\n </Sagstype>\r\n <Underskriftsoplysninger>\r\n <Underskrift>Underskrift0</Underskrift>\r\n <Underskriftsdato>{{ submission.completed.value|date(\"Y-m-d\") }}</Underskriftsdato>\r\n </Underskriftsoplysninger>\r\n</Anmodning>\r\n"
374+
xml_template: |
375+
<?xml version="1.0" encoding="UTF-8"?>
376+
<Anmodning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
377+
<Header>
378+
<Myndighed>urn:oio:cvr-nr:{{ handler.settings.sender.senderId }}</Myndighed>
379+
<ModtagetDato>{{ submission.completed.value|date("Y-m-d") }}</ModtagetDato>
380+
<KLE>{{ handler.settings.distributionContext.kleEmne }}</KLE>
381+
{% for file in files.dokumenter_overslag|default([]) %}
382+
<Dokumenter>
383+
<Dokumentnavn>{{ file.sftp_filename }}</Dokumentnavn>
384+
<Dokumenttype>Overslag</Dokumenttype>
385+
</Dokumenter>
386+
{% endfor %}
387+
{% for file in files.dokumenter_faktura|default([]) %}
388+
<Dokumenter>
389+
<Dokumentnavn>{{ file.sftp_filename }}</Dokumentnavn>
390+
<Dokumenttype>Faktura</Dokumenttype>
391+
</Dokumenter>
392+
{% endfor %}
393+
{% for file in files.dokumenter_bilag|default([]) %}
394+
<Dokumenter>
395+
<Dokumentnavn>{{ file.sftp_filename }}</Dokumentnavn>
396+
<Dokumenttype>Bilag</Dokumenttype>
397+
</Dokumenter>
398+
{% endfor %}
399+
</Header>
400+
<AnsoegerOplysninger>
401+
<Ansoeger>
402+
<Fornavn>{{ submission.data.fornavn }}</Fornavn>
403+
<Efternavn>{{ submission.data.efternavn }}</Efternavn>
404+
<Personnummer>urn:oio:cpr:0000000000</Personnummer>
405+
</Ansoeger>
406+
</AnsoegerOplysninger>
407+
<Sagstype>
408+
<AlmindeligtHelbredstillaeg>Medicin</AlmindeligtHelbredstillaeg>
409+
</Sagstype>
410+
<Underskriftsoplysninger>
411+
<Underskrift>Underskrift0</Underskrift>
412+
<Underskriftsdato>{{ submission.completed.value|date("Y-m-d") }}</Underskriftsdato>
413+
</Underskriftsoplysninger>
414+
</Anmodning>
354415
xsd_url: "module://os2forms_fordelingskomponent/resources/SP/SF2900_XSD/Anmodning.xsd"
355416
fordelingskomponent_sf2900_malformed_xml:
356417
id: os2forms_fordelingskomponent_sf2900

src/Helper/FordelingskomponentHelper.php

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
namespace Drupal\os2forms_fordelingskomponent\Helper;
44

5+
use Drupal\Core\Entity\EntityTypeManagerInterface;
56
use Drupal\Core\Logger\LoggerChannelInterface;
7+
use Drupal\file\FileStorageInterface;
68
use Drupal\key\KeyRepositoryInterface;
79
use Drupal\os2forms_fordelingskomponent\Exception\Exception;
810
use Drupal\os2forms_fordelingskomponent\Exception\InvalidAttachmentElementException;
911
use Drupal\os2forms_fordelingskomponent\Exception\RuntimeException;
1012
use Drupal\os2forms_fordelingskomponent\Model\Attachment;
13+
use Drupal\os2forms_fordelingskomponent\Model\DistributionFormular;
14+
use Drupal\os2forms_fordelingskomponent\Model\DistributionObjectFiles;
1115
use Drupal\os2forms_fordelingskomponent\Model\Fordelingskomponent\AnvenderForsendelse;
1216
use Drupal\os2forms_fordelingskomponent\Model\TransactionContext;
1317
use Drupal\os2forms_fordelingskomponent\Model\XmlRenderResult;
@@ -67,6 +71,11 @@
6771
final class FordelingskomponentHelper implements LoggerInterface, EventSubscriberInterface {
6872
use LoggerTrait;
6973

74+
/**
75+
* The file storage.
76+
*/
77+
private FileStorageInterface $fileStorage;
78+
7079
/**
7180
* Constructor.
7281
*/
@@ -78,13 +87,15 @@ public function __construct(
7887
private readonly KeyRepositoryInterface $keyRepository,
7988
private readonly KeyHelper $keyHelper,
8089
private readonly AnvenderForsendelseRepository $anvenderForsendelseRepository,
90+
EntityTypeManagerInterface $entityTypeManager,
8191
#[Autowire(service: 'logger.channel.os2forms_fordelingskomponent')]
8292
private readonly LoggerChannelInterface $logger,
8393
#[Autowire(service: 'logger.channel.os2forms_fordelingskomponent_submission')]
8494
private readonly LoggerChannelInterface $submissionLogger,
8595
#[Autowire(service: 'os2web_audit.logger')]
8696
private readonly AuditLogger $auditLogger,
8797
) {
98+
$this->fileStorage = $entityTypeManager->getStorage('file');
8899
}
89100

90101
/**
@@ -251,8 +262,9 @@ private function buildDistributionFormularType(
251262
WebformSubmissionInterface $submission,
252263
HandlerSettings $handlerSettings,
253264
Attachment $attachment,
254-
): DistributionFormularType {
255-
$xml = $this->renderXml($handlerSettings, $submission)->rendered;
265+
): DistributionFormular {
266+
$files = $this->buildFiles($handlerSettings, $submission);
267+
$xml = $this->renderXml($handlerSettings, $submission, $files)->rendered;
256268
$xsdUrl = $handlerSettings->distributionObject->xsdUrl;
257269

258270
$this->xmlHelper->validateXml($xml);
@@ -282,12 +294,13 @@ private function buildDistributionFormularType(
282294
),
283295
);
284296

285-
return new DistributionFormularType(
297+
return (new DistributionFormular(
286298
iD: $id,
287299
kLEEmneForslag: $handlerSettings->distributionContext->kleEmne,
288300
meddelelse: $meddelelse,
289301
handlingFacetForslag: $handlerSettings->distributionContext->handlingFacet,
290-
);
302+
))
303+
->setFiles($files);
291304
}
292305

293306
/**
@@ -296,14 +309,15 @@ private function buildDistributionFormularType(
296309
public function renderXml(
297310
HandlerSettings $handlerSettings,
298311
WebformSubmissionInterface $submission,
312+
?DistributionObjectFiles $files,
299313
bool $validateXml = TRUE,
300314
): XmlRenderResult {
301315
$template = $handlerSettings->distributionObject->xmlTemplate;
302316
if (empty(trim((string) $template))) {
303317
throw new RuntimeException('Missing XML template');
304318
}
305319

306-
$context = $this->xmlHelper->getRenderContext($handlerSettings, $submission);
320+
$context = $this->xmlHelper->getRenderContext($handlerSettings, $submission, $files);
307321

308322
return new XmlRenderResult(
309323
rendered: $this->xmlHelper->render($template, $context, validateXml: $validateXml),
@@ -312,6 +326,44 @@ public function renderXml(
312326
);
313327
}
314328

329+
private const FILE_ELEMENT_TYPES = [
330+
'managed_file',
331+
'webform_document_file',
332+
'webform_image_file',
333+
];
334+
335+
/**
336+
* Build files for a districution object.
337+
*/
338+
public function buildFiles(HandlerSettings $handlerSettings, WebformSubmissionInterface $submission): DistributionObjectFiles {
339+
$files = new DistributionObjectFiles();
340+
$elements = $submission->getWebform()->getElementsDecodedAndFlattened();
341+
$fileElements = array_filter($elements,
342+
static fn(array $element) => in_array($element['#type'] ?? NULL, self::FILE_ELEMENT_TYPES));
343+
foreach ($fileElements as $type => $_) {
344+
$values = $submission->getData()[$type] ?? NULL;
345+
if ($values) {
346+
foreach ($values as $index => $id) {
347+
/** @var \Drupal\file\Entity\FileInterface $file */
348+
$file = $this->fileStorage->load($id);
349+
$sftpFilename = implode('_', [
350+
'os2forms_fordelingskomponent',
351+
$handlerSettings->handlerId,
352+
$submission->uuid(),
353+
$file->getFilename(),
354+
]);
355+
356+
$files->addFile($type,
357+
sftpFilename: $sftpFilename,
358+
file: $file
359+
);
360+
}
361+
}
362+
}
363+
364+
return $files;
365+
}
366+
315367
/**
316368
* Send dokument.
317369
*
@@ -336,6 +388,18 @@ public function sendDokument(
336388
$sftp = $sf2900->sftp();
337389
$dokumentFilNavn = $sftp->putContents($attachment->contents, $attachment->filename);
338390
}
391+
// Upload files if any.
392+
elseif ($dokument instanceof DistributionFormular) {
393+
$files = $dokument->getFiles();
394+
$sftp = $sf2900->sftp();
395+
foreach ($files as $items) {
396+
foreach ($items as $item) {
397+
/** @var \Drupal\file\Entity\File $file */
398+
$file = $item['file'];
399+
$sftp->putFile($file->getFileUri(), $file->getFilename(), $item['sftp_filename']);
400+
}
401+
}
402+
}
339403

340404
$transactionId = Serializer::createUuid();
341405

src/Helper/WebformHelperSF2900.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ public function buildDistributionObject(HandlerSettings $handlerSettings, Webfor
8989
* Render XML.
9090
*/
9191
public function renderXml(HandlerSettings $handlerSettings, WebformSubmissionInterface $submission, bool $validateXml = TRUE): XmlRenderResult {
92-
return $this->helper->renderXml($handlerSettings, $submission, validateXml: $validateXml);
92+
$files = $this->helper->buildFiles($handlerSettings, $submission);
93+
94+
return $this->helper->renderXml($handlerSettings, $submission, files: $files, validateXml: $validateXml);
9395
}
9496

9597
/**

src/Helper/XmlHelper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Drupal\os2forms_fordelingskomponent\Helper;
44

55
use Drupal\os2forms_fordelingskomponent\Exception\InvalidXmlTemplateException;
6+
use Drupal\os2forms_fordelingskomponent\Model\DistributionObjectFiles;
67
use Drupal\os2forms_fordelingskomponent\Settings\HandlerSettings;
78
use Drupal\webform\WebformSubmissionInterface;
89
use Symfony\Component\DependencyInjection\Attribute\Autowire;
@@ -68,11 +69,12 @@ public function render(string $template, array $context, bool $validateXml = TRU
6869
/**
6970
* Get render context.
7071
*/
71-
public function getRenderContext(HandlerSettings $handlerSettings, WebformSubmissionInterface $submission) {
72+
public function getRenderContext(HandlerSettings $handlerSettings, WebformSubmissionInterface $submission, DistributionObjectFiles $files) {
7273
return [
7374
'handler' => ['settings' => $handlerSettings],
7475
'submission' => $submission,
7576
'webform_submission' => $submission,
77+
'files' => $files,
7678
];
7779
}
7880

src/Model/DistributionFormular.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_fordelingskomponent\Model;
4+
5+
use ItkDev\Serviceplatformen\SF2900\StructType\DistributionFormularType;
6+
7+
/**
8+
* DistributionFormularType extended with files.
9+
*/
10+
final class DistributionFormular extends DistributionFormularType {
11+
/**
12+
* The files.
13+
*/
14+
protected DistributionObjectFiles $files;
15+
16+
/**
17+
* Get files.
18+
*/
19+
public function getFiles(): DistributionObjectFiles {
20+
return $this->files;
21+
}
22+
23+
/**
24+
* Set files.
25+
*/
26+
public function setFiles(DistributionObjectFiles $files): static {
27+
$this->files = $files;
28+
29+
return $this;
30+
}
31+
32+
}

0 commit comments

Comments
 (0)