Skip to content

New Subsidy Form

wolfderechter edited this page Nov 15, 2023 · 10 revisions

Description

This page will explain you how to add a new subsidy in the Subsidy Module of loket. This subsidy will appear in the list of Beschikbare Subsidiemaatregelen in de subsidy module. If something is not working and you are sure you followed the guide by the dot. Please feel free to throw it in the group chat. In the case that you found the fix yourself, it would be very much appreciated if you could update the guide immediately :)

image

Relevant services

Relevant addons

Subsidy Structure

subsidie-structure

A subsidy form can exist of multiple steps (orange). In the app these steps are visible on the left side of a subsidy form. A form always requires at least one step. if we zoom in on a step we will see that it can have multiple versions (green). In theory you would never edit an existing step that already has been deployed (some exceptions apply e.g. typo's). You should always create a new version whenever the change is more then a typo, you can find instructions below in the #How-To section. Each version has a form.json & form.ttl file where the actual structure/fields of the form are defined.

Guide

We will be creating a simple form called practice that has 1 subsidy step Proposal and 1 version for that step. We will keep the form simple. OCMW's and Gemeenten will be able to view the form and enter contact details and banking information.

Folder and Files

Open the app-digitaal-loket repo and create the necessary folder and files for our new practice subsidie. Subsidie forms are created under /config/subsidie-application-management/forms/. You should normally already see a couple of folders inside there. This is where our new subsidie form will exist.

image

Form folder template:

/config/subsidie-application-management-service/forms/${FORM-NAME}/${STEP-NAME}/versions/${VERSION-DATE}/

Lets create the folder structure following the template above and create 2 files in it: form.json & form.ttl

FORM-NAME: Is the name of the form, in our case practice.

STEP-NAME: Is the name of a step of our form. As previously mentioned we will create a proposal step.

VERSION-DATE: This date will be used by the application-management-service to determine the latest version that will be used. You can generate a date by entering the following command in your terminal: date +%Y%m%d%H%M%S. Use the output of this command as the folder name

Your folder structure should now look like this:

config/
└── subsidie-application-management/
    └── forms/
        ├── climate
        ├── GZG
        ├── ...
        └── practice/
            └── proposal/
                └── versions/
                    └── 20220518120527/
                        ├── form.ttl
                        └── form.json

form.ttl

Now that we have our folder structure and files prepared, lets insert some fields into the form.ttl file. These fields are what the user will see and can interact with. For this guide we will be copy-pasting the code as explaining the form.ttl structure is out of the scope of this guide.

Subsidy forms, a lot of the time, have repeating fields (e.g. contact information). You can mostly copy these repeating parts from already existing forms and reuse them. You can also use our beginner friendly form builder for a custom structure https://poc-form-builder.relance.s.redpencil.io/.

Copy the following code into your form.ttl file

@prefix lblodSubsidie:  <http://lblod.data.gift/vocabularies/subsidie/>.
@prefix rdf:            <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix nie:            <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#>.
@prefix form:           <http://lblod.data.gift/vocabularies/forms/> .
@prefix sh:             <http://www.w3.org/ns/shacl#>.
@prefix mu:             <http://mu.semte.ch/vocabularies/core/> .
@prefix displayTypes:   <http://lblod.data.gift/display-types/> .
@prefix ext:            <http://mu.semte.ch/vocabularies/ext/> .
@prefix rdfs:           <http://www.w3.org/2000/01/rdf-schema#>.
@prefix skos:	        <http://www.w3.org/2004/02/skos/core#> .
@prefix mu:	        <http://mu.semte.ch/vocabularies/core/> .
@prefix cpsv:	        <http://purl.org/vocab/cpsv#> .
@prefix dct:	        <http://purl.org/dc/terms/> .
@prefix xkos:	        <http://rdf-vocabulary.ddialliance.org/xkos#> .
@prefix m8g:	        <http://data.europa.eu/m8g/> .
@prefix dcat:	        <http://www.w3.org/ns/dcat#> .
@prefix lang:	        <http://publications.europa.eu/resource/authority/language/> .
@prefix belgif:	        <http://vocab.belgif.be/ns/publicservice#> .
@prefix foaf:           <http://xmlns.com/foaf/0.1/>.
@prefix schema:         <http://schema.org/>.
##########################################################
# form
##########################################################
ext:form a form:Form, form:TopLevelForm ;
    form:includes ext:firstNameF;
    form:includes ext:lastNameF;
    form:includes ext:telephoneF;
    form:includes ext:mailF;
    form:includes ext:bankAccountF;
    form:includes ext:paymentFileF;
    form:includes ext:hiddenPaymentFileF.

##########################################################
#  property-group: contact
##########################################################
ext:contactPg a form:PropertyGroup;
    sh:name "Contactgegevens contactpersoon" ;
    form:help "Dit is de persoon die gecontacteerd wordt bij de opvolging van dit dossier.";
    sh:order 1 .

##########################################################
#  field: first name
##########################################################
ext:firstNameF a form:Field ;
    sh:order 1 ;
    sh:name "Voornaam contactpersoon";
    sh:path ( schema:contactPoint foaf:firstName ) ;
    form:validations
    [ a form:RequiredConstraint ;
        form:grouping form:Bag ;
        sh:path ( schema:contactPoint foaf:firstName ) ;
        sh:resultMessage "Dit veld is verplicht."@nl
    ] ;
    form:displayType displayTypes:defaultInput;
    sh:group ext:contactPg .


##########################################################
#  field: last name
##########################################################
ext:lastNameF a form:Field ;
    sh:order 2 ;
    sh:name "Familienaam contactpersoon";
    sh:path ( schema:contactPoint foaf:familyName ) ;
    form:validations
    [ a form:RequiredConstraint ;
        form:grouping form:Bag ;
        sh:path ( schema:contactPoint foaf:familyName ) ;
        sh:resultMessage "Dit veld is verplicht."@nl
    ] ;
    form:displayType displayTypes:defaultInput ;
    sh:group ext:contactPg .


##########################################################
#  field: telephone
##########################################################
ext:telephoneF a form:Field ;
    sh:order 3 ;
    sh:name "Telefoonnummer";
    sh:path ( schema:contactPoint schema:telephone ) ;
    form:validations
    [ a form:RequiredConstraint ;
        form:grouping form:Bag ;
        sh:path ( schema:contactPoint schema:telephone ) ;
        sh:resultMessage "Dit veld is verplicht."@nl
    ] ,
    [ a form:ValidPhoneNumber ;
        form:grouping form:MatchEvery ;
        form:defaultCountry "BE" ;
        sh:path ( schema:contactPoint schema:telephone ) ;
        sh:resultMessage "Geef een geldig telefoonnummer in."@nl
    ] ;
    form:displayType displayTypes:defaultInput ;
    sh:group ext:contactPg .


##########################################################
#  field: email
##########################################################
ext:mailF a form:Field ;
    sh:order 4 ;
    sh:name "Mailadres";
    sh:path ( schema:contactPoint schema:email ) ;
    form:validations
    [ a form:RequiredConstraint ;
        form:grouping form:Bag ;
        sh:path ( schema:contactPoint schema:email ) ;
        sh:resultMessage "Dit veld is verplicht."@nl
    ] ,
    [ a form:ValidEmail ;
        form:grouping form:MatchEvery ;
        sh:path ( schema:contactPoint schema:email ) ;
        sh:resultMessage "Geef een geldig e-mailadres op."@nl
    ] ;
    form:displayType displayTypes:defaultInput ;
    sh:group ext:contactPg .



##########################################################
#  property-group: Payment
##########################################################
ext:paymentPg a form:PropertyGroup;
    sh:name "Betaling" ;
    sh:order 2 .

##########################################################
#  field: Bank account
##########################################################
ext:bankAccountF
    a form:Field;
    sh:name "Rekingnummer uitbetaling";
    form:displayType displayTypes:defaultInput;
    form:help "IBAN: BE00 0000 0000 0000";
    form:validations
    [ a form:ValidIBAN;
        form:grouping form:MatchEvery;
        sh:order 2;
        sh:path ( schema:bankAccount schema:identifier );
        sh:resultMessage "Geef een geldig IBAN op."@nl
    ] ,
    [ a form:RequiredConstraint ;
      form:grouping form:Bag ;
      sh:path ( schema:bankAccount schema:identifier ) ;
      sh:resultMessage "Dit veld is verplicht."@nl
    ];
    sh:order 1;
    sh:group ext:paymentPg .


##########################################################
#  field: attachments
##########################################################
ext:paymentFileF a form:Field ;
    sh:order 2 ;
    sh:name "Voeg een bevestingsbrief toe dat dit rekeningnummer gebruikt mag worden, ondertekend door de burgemeester en medeondertekend door de financieel directeur." ;
    form:help "Deze brief moet enkel toegevoegd worden als dit niet het rekeningnummer is waarop het aandeel van het gemeentefonds wordt gestort." ;
    sh:path ( schema:bankAccount dct:hasPart ) ;
    form:displayType displayTypes:files ;
    sh:group ext:paymentPg .

    
##########################################################
# Hidden field required for all variations of URL or FILE
# input field which require validation.
# It makes sure there is a type attached to hasPart object.
# This enables correct validation in both front and backend.
##########################################################
ext:hiddenPaymentFileF a form:Field ;
    sh:order 3 ;
    sh:name "Type RemoteDataObject or FileDataObject [hidden input]" ;
    sh:path ( schema:bankAccount dct:hasPart rdf:type );
    sh:group ext:paymentPg .

form.json

The form.json is responsible for loading the field values of an already existing form. If you leave this file empty, you will notice that whenever you fill in you form, send it and reload the page, all the data will be "gone" as all fields would appear empty. This is because the subsidie-application-management-service does not know which fields you want it to return for filled in forms.

Paste the following code into your form.json file

{
  "source": {
    "prefixes": [
      "PREFIX mu: <http://mu.semte.ch/vocabularies/core/>",
      "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>",
      "PREFIX dct: <http://purl.org/dc/terms/>",
      "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>",
      "PREFIX subsidie: <http://data.vlaanderen.be/ns/subsidie#>",
      "PREFIX lblodSubsidie: <http://lblod.data.gift/vocabularies/subsidie/>",
      "PREFIX pav: <http://purl.org/pav/>",
      "PREFIX schema: <http://schema.org/>",
      "PREFIX foaf: <http://xmlns.com/foaf/0.1/>",
      "PREFIX gleif: <https://www.gleif.org/ontology/Base/>",
      "PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>",
      "PREFIX adms: <http://www.w3.org/ns/adms#>",
      "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#>"
    ],
    "properties": [
      {
        "s-prefix": "schema:contactPoint",
        "properties": [
          "foaf:firstName",
          "foaf:familyName",
          "schema:telephone",
          "schema:email"
        ]
      },
      {
        "s-prefix": "schema:bankAccount",
        "properties": [
          "schema:identifier",
          {
            "s-prefix": "dct:hasPart",
            "properties": [
              "rdf:type"
            ]
          }
        ]
      }
    ]
  }
}

Migration file

Now to tie everything together we need to create a migration file. You can use the following template to do so.

PREFIX mobiliteit: <https://data.vlaanderen.be/ns/mobiliteit#>
PREFIX lblodSubsidie: <http://lblod.data.gift/vocabularies/subsidie/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX subsidie: <http://data.vlaanderen.be/ns/subsidie#>
PREFIX gleif: <https://www.gleif.org/ontology/Base/>
PREFIX mu: <http://mu.semte.ch/vocabularies/core/>
PREFIX cpsv: <http://purl.org/vocab/cpsv#>
PREFIX common: <http://www.w3.org/2007/uwa/context/common.owl#>
PREFIX xkos: <http://rdf-vocabulary.ddialliance.org/xkos#>
PREFIX qb: <http://purl.org/linked-data/cube#>

INSERT DATA {
  GRAPH <http://mu.semte.ch/graphs/public>{
    <http://lblod.data.info/id/subsidy-measure-offers/${FORM-UUID}>
      a <http://data.vlaanderen.be/ns/subsidie#SubsidiemaatregelAanbod>;
      mu:uuid "${FORM-UUID}";
      dct:title """${VISIBLE-FORM-TITLE}""";
      skos:prefLabel """${FORM-TITLE}""";
      skos:related <${INFO-URL}>;
      cpsv:follows <http://data.lblod.info/id/subsidy-procedural-steps/${FORM-STEP-UUID}>;
      lblodSubsidie:heeftReeks <http://lblod.data.info/id/subsidy-measure-offer-series/${FORM-SERIES-UUID}>.

    <http://data.lblod.info/id/subsidy-procedural-steps/${FORM-STEP-UUID}> a subsidie:Subsidieprocedurestap;
      mu:uuid "${FORM-STEP-UUID}";
      dct:description """${FORM-STEP-NAME}""";
      mobiliteit:periode <http://data.lblod.info/id/periodes/${FORM-STEP-PERIODE-UUID}>.

    <http://lblod.data.info/id/subsidy-measure-offer-series/${FORM-SERIES-UUID}> a lblodSubsidie:SubsidiemaatregelAanbodReeks;
      mu:uuid "${FORM-SERIES-UUID}";
      dct:title "${FORM-SERIES-NAME}"@nl;
      dct:description "${FORM-SERIES-DATE-DESCRIPTION}"@nl ;
      common:active <http://lblod.data.info/id/subsidie-application-flows/${FORM-FLOW-UUID}> ;
      mobiliteit:periode <http://data.lblod.info/id/periodes/${FORM-FLOW-PERIODE-UUID}> ;
      lblodSubsidie:heeftSubsidieprocedurestap <http://data.lblod.info/id/subsidy-procedural-steps/${FORM-STEP-UUID}>.

    <http://lblod.data.info/id/subsidie-application-flows/${FORM-FLOW-UUID}> a lblodSubsidie:ApplicationFlow;
      mu:uuid "${FORM-FLOW-UUID}";
      xkos:belongsTo <http://lblod.data.info/id/subsidy-measure-offer-series/${FORM-SERIES-UUID}>;
      xkos:next <http://lblod.data.info/id/subsidie-application-flow-steps/${FORM-APPLICATION-STEP-UUID}>.

    <http://lblod.data.info/id/subsidie-application-flow-steps/${FORM-APPLICATION-STEP-UUID}> a lblodSubsidie:ApplicationStep;
      mu:uuid "${FORM-APPLICATION-STEP-UUID}";
      qb:order 0;
      dct:references <http://data.lblod.info/id/subsidy-procedural-steps/${FORM-STEP-UUID}>;
      dct:isPartOf <http://lblod.data.info/id/subsidie-application-flows/${FORM-FLOW-UUID}>;
      dct:source <${FORM-FILE-LOCATION}>.

    <http://data.lblod.info/id/periodes/${FORM-FLOW-PERIODE-UUID}> a <http://data.europa.eu/m8g/PeriodOfTime>;
      mu:uuid "${FORM-FLOW-PERIODE-UUID}";
      <http://data.europa.eu/m8g/startTime> "${FORM-FLOW-START-DATE}"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
      <http://data.europa.eu/m8g/endTime> "${FORM-FLOW-END-DATE}"^^<http://www.w3.org/2001/XMLSchema#dateTime>.

    <http://data.lblod.info/id/periodes/${FORM-STEP-PERIODE-UUID}> a <http://data.europa.eu/m8g/PeriodOfTime>;
      mu:uuid "${FORM-STEP-PERIODE-UUID}";
      <http://data.europa.eu/m8g/startTime> "${FORM-STEP-START-DATE}"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
      <http://data.europa.eu/m8g/endTime> "${FORM-STEP-END-DATE}"^^<http://www.w3.org/2001/XMLSchema#dateTime>.
  }
}

FORM-UUID: The uuid for this form. Make sure that all FORM-UUID share the exact same UUID

!All variables ending with UUID need to be unique from each other. But the same for everywhere. (e.g. FORM-UUID != FORM-STEP-UUID but FORM-UUID === FORM-UUID)

VISIBLE-FORM-TITLE: The title of the form that will be displayed in the app.

FORM-TITLE: The titel of the form. Not visible in the frontend. (often the same as VISIBLE-FORM-TITLE)

INFO-URL: This is a URL pointing to a site with more information about this specific subsidy.

FORM-STEP-NAME: The name of the step in your form. This will be visible to the user. (e.g. proposal)

FORM-SERIES-NAME: A subsidie can have multiple series. (e.g. Oproep 1)

FORM-SERIES-DATE-DESCRIPTION: By convention this is a human readable form of the start-date & end-date of the series (e.g. 01/07/2022 — 30/06/2023)

FORM-FILE-LOCATION: The path to the form.ttl for this form (e.g. config://forms/ukraine/proposal/versions/20220509100012/form.ttl)

FORM-FLOW-START-DATE: ISO start date for this form. Users will be able to see the form from this date on. (e.g. 2022-03-14T03:00:00Z)

FORM-FLOW-END-DATE: ISO end date for this form

FORM-STEP-START-DATE: ISO start date for this form step. If this date starts later then FORM-FLOW-START-DATE, then users will be able to see and open the form, but not submit the form step until the FORM-PERIODE-START-DATE.

FORM-STEP-END-DATE: ISO end date of the step. Users wont be able to submit the step after this date.

Group 6

For our practice subsidie, this is how the migration looks like

PREFIX mobiliteit: <https://data.vlaanderen.be/ns/mobiliteit#>
PREFIX lblodSubsidie: <http://lblod.data.gift/vocabularies/subsidie/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX subsidie: <http://data.vlaanderen.be/ns/subsidie#>
PREFIX gleif: <https://www.gleif.org/ontology/Base/>
PREFIX mu: <http://mu.semte.ch/vocabularies/core/>
PREFIX cpsv: <http://purl.org/vocab/cpsv#>
PREFIX common: <http://www.w3.org/2007/uwa/context/common.owl#>
PREFIX xkos: <http://rdf-vocabulary.ddialliance.org/xkos#>
PREFIX qb: <http://purl.org/linked-data/cube#>

INSERT DATA {
  GRAPH <http://mu.semte.ch/graphs/public>{
    <http://lblod.data.info/id/subsidy-measure-offers/1b10f15b-2c8f-4cc6-98bd-cefaa556fdcf>
      a <http://data.vlaanderen.be/ns/subsidie#SubsidiemaatregelAanbod>;
      mu:uuid "1b10f15b-2c8f-4cc6-98bd-cefaa556fdcf";
      dct:title """Practice form for the guide""";
      skos:prefLabel """Practice""";
      skos:related <http://example.com/>;
      cpsv:follows <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021>;
      lblodSubsidie:heeftReeks <http://lblod.data.info/id/subsidy-measure-offer-series/8671ba90-c33f-4457-9f4d-c0ac21f2bc18>.

    <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021> a subsidie:Subsidieprocedurestap;
      mu:uuid "a2b4dcea-4333-4086-93ff-e36d4707b021";
      dct:description """Proposal""";
      mobiliteit:periode <http://data.lblod.info/id/periodes/4fc59969-9db7-4a74-83e0-e36e88801b02>.

    <http://lblod.data.info/id/subsidy-measure-offer-series/8671ba90-c33f-4457-9f4d-c0ac21f2bc18> a lblodSubsidie:SubsidiemaatregelAanbodReeks;
      mu:uuid "8671ba90-c33f-4457-9f4d-c0ac21f2bc18";
      dct:title "Oproep 1"@nl;
      dct:description "14/03/2022 — 31/12/2022"@nl;
      common:active <http://lblod.data.info/id/subsidie-application-flows/7cfef301-2a0d-4091-833d-99d7909ee40a> ;
      mobiliteit:periode <http://data.lblod.info/id/periodes/0cda3c40-3615-4909-9936-3bed54358d5f>;
      lblodSubsidie:heeftSubsidieprocedurestap <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021>.

    <http://lblod.data.info/id/subsidie-application-flows/7cfef301-2a0d-4091-833d-99d7909ee40a> a lblodSubsidie:ApplicationFlow;
      mu:uuid "7cfef301-2a0d-4091-833d-99d7909ee40a";
      xkos:belongsTo <http://lblod.data.info/id/subsidy-measure-offer-series/8671ba90-c33f-4457-9f4d-c0ac21f2bc18>;
      xkos:next <http://lblod.data.info/id/subsidie-application-flow-steps/89570d7e-1d96-451f-996f-0b87d7ce2b65>.

    <http://lblod.data.info/id/subsidie-application-flow-steps/89570d7e-1d96-451f-996f-0b87d7ce2b65> a lblodSubsidie:ApplicationStep;
      mu:uuid "89570d7e-1d96-451f-996f-0b87d7ce2b65";
      qb:order 0;
      dct:references <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021>;
      dct:isPartOf <http://lblod.data.info/id/subsidie-application-flows/7cfef301-2a0d-4091-833d-99d7909ee40a>;
      dct:source <config://forms/practice/proposal/versions/20220518120527/form.ttl>.

    <http://data.lblod.info/id/periodes/0cda3c40-3615-4909-9936-3bed54358d5f> a <http://data.europa.eu/m8g/PeriodOfTime>;
      mu:uuid "0cda3c40-3615-4909-9936-3bed54358d5f";
      <http://data.europa.eu/m8g/startTime> "2022-03-14T03:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
      <http://data.europa.eu/m8g/endTime> "2022-12-31T21:59:59Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>.

    <http://data.lblod.info/id/periodes/4fc59969-9db7-4a74-83e0-e36e88801b02> a <http://data.europa.eu/m8g/PeriodOfTime>;
      mu:uuid "4fc59969-9db7-4a74-83e0-e36e88801b02";
      <http://data.europa.eu/m8g/startTime> "2022-03-14T03:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
      <http://data.europa.eu/m8g/endTime> "2022-12-31T21:59:59Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>.
  }
}

Access Criteria

Finally to make the form visible to groups/bestuurseenheden we need to add the correct access criteria. Lets make the form visible for OCMW's en Gemeenten by adding the following criteria triples

INSERT DATA {

  GRAPH <http://mu.semte.ch/graphs/public> {
    <http://lblod.data.info/id/subsidy-measure-offers/1b10f15b-2c8f-4cc6-98bd-cefaa556fdcf> <http://data.europa.eu/m8g/hasCriterion>
      <http://data.lblod.info/id/criterions/8c32faa4-1167-4fee-932f-3d453e59b09a>, # ocmw
      <http://data.lblod.info/id/criterions/f5ea0615-0b0a-47db-a38c-6097ff80815d>. # gemeente
  }
}

List of additional criteria options: https://github.com/lblod/app-digitaal-loket/blob/3c166da358f1b6665e081e2c3472b0116aae227c/config/migrations/2022/20220315111947-update-model-to-filter-subsidies/20220315165410-criteria-for-type-of-bestuur.sparql

When you visit the app as either an OCMW or Gemeente. You should now see our practice subsidie in the list of beschikbare subsidies. When opening the subsidie form, you will see a Proposal step and the fields from the form.ttl. Thanks for following along and good luck!

How to

Create a new subsidy step

To create a new subsidy you will need to first create the new form.ttl & form.json for the step in the right directory. We will use the practice subsidy from he guide above as example. Next to to already existing proposal step we create an additonal step called newStep.

config/
└── subsidie-application-management/
    └── forms/
        ├── climate
        ├── GZG
        ├── ...
        └── practice/
            ├── proposal/
            │   └── versions/
            │       └── 20220518120527/
            │           ├── form.ttl
            │           └── form.json
            └── newStep/
                └── version/
                    └── 20220519161140/
                        ├── form.ttl
                        └── form.json

Next, we write a new migration so the step becomes visible in the frontend.

    <http://lblod.data.info/id/subsidie-application-flow-steps/89570d7e-1d96-451f-996f-0b87d7ce2b65> a lblodSubsidie:ApplicationStep;
      mu:uuid "89570d7e-1d96-451f-996f-0b87d7ce2b65";
      qb:order 0;
      dct:references <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021>;
      dct:isPartOf <http://lblod.data.info/id/subsidie-application-flows/7cfef301-2a0d-4091-833d-99d7909ee40a>;
      dct:source <config://forms/practice/proposal/versions/20220518120527/form.ttl>.

    <http://data.lblod.info/id/subsidy-procedural-steps/a2b4dcea-4333-4086-93ff-e36d4707b021> a subsidie:Subsidieprocedurestap;
      mu:uuid "a2b4dcea-4333-4086-93ff-e36d4707b021";
      dct:description """${NEW-STEP-VISIBLE-NAME}""";
      mobiliteit:periode <http://data.lblod.info/id/periodes/4fc59969-9db7-4a74-83e0-e36e88801b02>.

    <http://data.lblod.info/id/periodes/4fc59969-9db7-4a74-83e0-e36e88801b02> a <http://data.europa.eu/m8g/PeriodOfTime>;
      mu:uuid "4fc59969-9db7-4a74-83e0-e36e88801b02";
      <http://data.europa.eu/m8g/startTime> "2022-03-14T03:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
      <http://data.europa.eu/m8g/endTime> "2022-12-31T21:59:58Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>.