os2forms/os2forms_fordelingskomponent

Fordelingskomponent integration for OS2Forms

Maintainers

Package info

github.com/itk-dev/os2forms_fordelingskomponent

Type:drupal-module

pkg:composer/os2forms/os2forms_fordelingskomponent

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0-rc.1 2026-08-28 07:37 UTC

This package is auto-updated.

Last update: 2026-08-28 07:40:56 UTC


README

Installation

  1. Create two keys (on /admin/config/system/keys)

    Key Type Provider
    SF2900 Certificate Certificate File
    SF2900 SFTP private key Authentication File

    Note: The "SFTP private key" key must be passwordless[^1].

    You can use ssh-keygen to remove the password from a certificate:

    cp cert/sf2900-sftp cert/sf2900-sftp-nopass
    ssh-keygen -p -N "" -f cert/sf2900-sftp-nopass
  2. Go to /admin/os2forms_fordelingskomponent/settings and configure the Fordelingskomponent module.

[^1] It takes a very long time to read a key with a password (reference?)

Drush commands

A number of Drush commands may come in handy during development and testing. Run

drush os2forms-fordelingskomponent

to see the list of Drush commands provided by the module.

Generatings submissions

For testing and development, it may be useful to generate a number/lot of submissions on a webform. The Webform and Devel modules can help us do this:

drush pm:install webform_devel devel_generate
drush webform:generate --help
drush config:set --input-format=yaml key.key.sf2900_certificate '?' - <<'EOF'
langcode: da
status: true
dependencies:
  module:
    - os2web_key
id: sf2900_certificate
label: 'SF2900 Certificate'
description: ''
key_type: os2web_key_certificate
key_type_settings:
  passphrase: …
  input_format: pfx
  output_format: pem
key_provider: file
key_provider_settings:
  file_location: /app/cert/OS2Forms_FordelingUdvikling.p12
  strip_line_breaks: false
key_input: none
key_input_settings: {  }
EOF
drush config:set --input-format=yaml key.key.sf2900_sftp_private_key '?' - <<'EOF'
langcode: da
status: true
dependencies: {  }
id: sf2900_sftp_private_key
label: 'SF2900 SFTP private key'
description: ''
key_type: authentication
key_type_settings: {  }
key_provider: file
key_provider_settings:
  file_location: /app/cert/OS2Forms_FordelingUdvikling-sftp-nopass
  strip_line_breaks: false
key_input: none
key_input_settings: {  }

Development

task composer:install

Composer install hacks

# Create a temporary composer file to install https://github.com/mglaman/composer-drupal-lenient before the real install needs it.
docker compose run --rm --env COMPOSER=composer.lenient.json phpfpm composer init --no-interaction
docker compose run --rm --env COMPOSER=composer.lenient.json phpfpm composer config --no-plugins allow-plugins.mglaman/composer-drupal-lenient true
docker compose run --rm --env COMPOSER=composer.lenient.json phpfpm composer require mglaman/composer-drupal-lenient
docker compose run --rm --env COMPOSER=composer.lenient.json phpfpm rm composer.lenient.*

# Now we can install what we actually need.
docker compose run --rm phpfpm composer install

Kvittering

Kom godt i gang - Fordelingskomponenten, side 27

# curl --verbose --insecure --location «base url»/os2forms-fordelingskomponent/sf2900/2.4/FordelingskvitteringModtag --head

curl --verbose --insecure --location «base url»/os2forms-fordelingskomponent/sf2900/2.4/FordelingskvitteringModtag --header 'content-type: application/soap+xml' --data @- <<'XML'
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <FordelingskvitteringModtagAnvenderRequest xmlns="http://serviceplatformen.dk/xml/wsdl/soap11/DistributionService/2/types" xmlns:ns2="http://serviceplatformen.dk/xml/schemas/CallContext/1/" xmlns:ns3="http://serviceplatformen.dk/xml/schemas/AuthorityContext/1/">
      <Forretningskvittering>
        <ForretningsValideringsKode>ACCEPTERET</ForretningsValideringsKode>
        <Kvitteringstype>Forretning</Kvitteringstype>
      </Forretningskvittering>
      <DistributionContext>
        <AnvenderTransaktionsID>752bc93a-37cb-46db-9fb1-d5f4f7e3964e</AnvenderTransaktionsID>
        <DistributionTransktionsID>d8101c99-0262-4a97-ac75-5685a6c6494a</DistributionTransktionsID>
        <!-- ... -->
      </DistributionContext>
    </FordelingskvitteringModtagAnvenderRequest>
  </soap:Body>
</soap:Envelope>
XML

References

KP-formularer

Debugging

# Latest receipts
drush sql:query "
SELECT k.anvender_transaktions_id, FROM_UNIXTIME(k.created_at) AS created_at
FROM os2forms_fordelingskomponent_anvender_kvittering AS k
ORDER BY k.created_at DESC
LIMIT 10
"

# Latest receipts with submission IDs
drush sql:query "
SELECT k.anvender_transaktions_id, FROM_UNIXTIME(k.created_at) AS created_at, f.webform_id, f.webform_submission_id,
CONCAT('/admin/structure/webform/manage/', f.webform_id, '/submission/', f.webform_submission_id,'/os2forms-fordelingskomponent-debug-forsendelse') AS path
FROM os2forms_fordelingskomponent_anvender_kvittering AS k JOIN os2forms_fordelingskomponent_anvender_forsendelse AS f ON f.anvender_transaktions_id = k.anvender_transaktions_id
ORDER BY k.created_at DESC
LIMIT 10
"

# "Forsendelser" with number of receipts
drush sql:query "
SELECT f.anvender_transaktions_id, FROM_UNIXTIME(f.created_at) AS created_at,
(SELECT COUNT(*) FROM os2forms_fordelingskomponent_anvender_kvittering AS k WHERE k.anvender_transaktions_id = f.anvender_transaktions_id) AS '#receipts',
CONCAT('/admin/structure/webform/manage/', f.webform_id, '/submission/', f.webform_submission_id,'/os2forms-fordelingskomponent-debug-forsendelse') AS path
FROM os2forms_fordelingskomponent_anvender_forsendelse AS f
ORDER BY created_at DESC
"

drush sql:query "
SELECT
    (SELECT COUNT(*) FROM os2forms_fordelingskomponent_anvender_forsendelse) AS os2forms_fordelingskomponent_anvender_forsendelse,
    (SELECT COUNT(*) FROM os2forms_fordelingskomponent_anvender_kvittering) AS os2forms_fordelingskomponent_anvender_kvittering
"

# Forsendelser
drush sql:query "
SELECT webform_id, webform_submission_id, anvender_transaktions_id, distribution_transaktions_id
FROM os2forms_fordelingskomponent_anvender_forsendelse
"

# Kvitteringer
drush sql:query "
SELECT anvender_transaktions_id, distribution_transaktions_id
FROM os2forms_fordelingskomponent_anvender_kvittering
"

# Forsendelser med kvitteringer
drush sql:query "
SELECT webform_id, webform_submission_id, anvender_transaktions_id, distribution_transaktions_id
FROM os2forms_fordelingskomponent_anvender_forsendelse
WHERE anvender_transaktions_id IN (SELECT anvender_transaktions_id FROM os2forms_fordelingskomponent_anvender_kvittering)
"