6.4 StUF-berichten ontwerpen

Kan StUF-berichten ontwerpen waarmee gegevens uitgewisseld worden.

Berichtontwerp-principes

Het ontwerpen van effectieve StUF-berichten vereist aandacht voor zowel functionele als technische aspecten. Een goed ontworpen bericht faciliteert betrouwbare gegevensuitwisseling en ondersteunt business-processen optimaal.

Ontwerpoverwegingen

Functionele aspecten:

  • Doel: Wat wil je bereiken met het bericht?
  • Context: In welk business-proces wordt het gebruikt?
  • Stakeholders: Wie zijn zender en ontvanger?
  • Gegevens: Welke informatie moet worden uitgewisseld?
  • Timing: Wanneer wordt het bericht verstuurd?

Technische aspecten:

  • Berichttype: Vraag/antwoord, kennisgeving, of synchronisatie?
  • Entiteiten: Welke objecten zijn betrokken?
  • Cardinaliteit: Eén object of meerdere objecten?
  • Filtering: Welke selectiecriteria zijn nodig?
  • Validatie: Welke controles zijn vereist?

Berichtontwerp-workflow

flowchart TD
    A[Business requirement] --> B[Analyse use case]
    B --> C[Identificeer entiteiten]
    C --> D[Bepaal berichtpatroon]
    D --> E[Ontwerp berichtstructuur]
    E --> F[Definieer validatieregels]
    F --> G[Maak voorbeeldberichten]
    G --> H[Test en valideer]
    H --> I[Documenteer specificatie]
    
    B --> B1[Stakeholder analyse]
    B --> B2[Process mapping]
    B --> B3[Data requirements]
    
    D --> D1[Request/Response]
    D --> D2[Notification]
    D --> D3[Synchronization]
    
    F --> F1[Business rules]
    F --> F2[Technical constraints]
    F --> F3[Security requirements]

Berichtpatronen

1. Vraag/Antwoord-patroon (Request/Response)

Use case: Zaaksysteem vraagt persoonsgegevens op

Ontwerp-beslissingen:

pattern: "Request/Response"
request_message: "Lv01"
response_message: "La01"
entity_type: "NPS"
business_goal: "Persoon verificatie voor zaakbehandeling"
security_level: "Hoog - persoonsgegevens"
performance: "Synchroon - real-time response vereist"

Request-ontwerp (Lv01):

<StUF:Lv01Bericht 
    xmlns:StUF="http://www.stufstandaarden.nl/koppelvlak/stuf"
    xmlns:BG="http://www.stufstandaarden.nl/onderlaag/bg">
    
    <StUF:stuurgegevens>
        <StUF:berichtcode>Lv01</StUF:berichtcode>
        <StUF:zender>
            <StUF:organisatie>0518</StUF:organisatie>
            <StUF:applicatie>ZaakDMS-Pro</StUF:applicatie>
            <StUF:administratie>ZAAK</StUF:administratie>
            <StUF:gebruiker>zaakbehandelaar_001</StUF:gebruiker>
        </StUF:zender>
        <StUF:ontvanger>
            <StUF:organisatie>0363</StUF:organisatie>
            <StUF:applicatie>BRP-Gateway</StUF:applicatie>
        </StUF:ontvanger>
        <StUF:referentienummer>ZAAK-2024-REQ-001234</StUF:referentienummer>
        <StUF:tijdstempel>20240305143000</StUF:tijdstempel>
        <StUF:entiteittype>NPS</StUF:entiteittype>
    </StUF:stuurgegevens>
    
    <!-- Parameters voor response-filtering -->
    <StUF:parameters>
        <StUF:indicatorVervolgvraag>false</StUF:indicatorVervolgvraag>
        <StUF:indicatorAfnemingsbepaling>true</StUF:indicatorAfnemingsbepaling>
    </StUF:parameters>
    
    <!-- Primaire zoekcriteria -->
    <StUF:gelijk>
        <BG:object StUF:entiteittype="NPS">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
        </BG:object>
    </StUF:gelijk>
    
    <!-- Scope: welke gegevens gewenst? -->
    <StUF:scope>
        <BG:object StUF:entiteittype="NPS">
            <BG:burgerservicenummer />
            <BG:geslachtsnaam />
            <BG:voornamen />
            <BG:geboortedatum />
            <BG:adresAanduidingGegeven>
                <BG:woonplaatsWoongebied />
                <BG:straatnaam />
                <BG:huisnummer />
                <BG:postcode />
            </BG:adresAanduidingGegeven>
        </BG:object>
    </StUF:scope>
</StUF:Lv01Bericht>

Response-ontwerp (La01):

<StUF:La01Bericht 
    xmlns:StUF="http://www.stufstandaarden.nl/koppelvlak/stuf"
    xmlns:BG="http://www.stufstandaarden.nl/onderlaag/bg">
    
    <StUF:stuurgegevens>
        <StUF:berichtcode>La01</StUF:berichtcode>
        <StUF:zender>
            <StUF:organisatie>0363</StUF:organisatie>
            <StUF:applicatie>BRP-Gateway</StUF:applicatie>
        </StUF:zender>
        <StUF:ontvanger>
            <StUF:organisatie>0518</StUF:organisatie>
            <StUF:applicatie>ZaakDMS-Pro</StUF:applicatie>
            <StUF:gebruiker>zaakbehandelaar_001</StUF:gebruiker>
        </StUF:ontvanger>
        <StUF:referentienummer>BRP-2024-RESP-001234</StUF:referentienummer>
        <StUF:crossRefnummer>ZAAK-2024-REQ-001234</StUF:crossRefnummer>
        <StUF:tijdstempel>20240305143005</StUF:tijdstempel>
        <StUF:entiteittype>NPS</StUF:entiteittype>
    </StUF:stuurgegevens>
    
    <!-- Persoon-gegevens conform scope -->
    <StUF:antwoord>
        <BG:object StUF:entiteittype="NPS" StUF:verwerkingssoort="I">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
            
            <!-- Authentiek-markering -->
            <BG:authenticatiegegevenNP>
                <BG:authentiek>J</BG:authentiek>
            </BG:authenticatiegegevenNP>
            
            <!-- Naam-gegevens -->
            <BG:geslachtsnaam>
                <BG:voorvoegselGeslachtsnaam>van der</BG:voorvoegselGeslachtsnaam>
                <BG:geslachtsnaam>Berg</BG:geslachtsnaam>
            </BG:geslachtsnaam>
            <BG:voornamen>Jan Peter</BG:voornamen>
            <BG:geboortedatum>19850315</BG:geboortedatum>
            
            <!-- Adres-gegevens -->
            <BG:adresAanduidingGegeven>
                <BG:authentiek>J</BG:authentiek>
                <BG:woonplaatsWoongebied>Amsterdam</BG:woonplaatsWoongebied>
                <BG:straatnaam>Hoofdstraat</BG:straatnaam>
                <BG:huisnummer>42</BG:huisnummer>
                <BG:postcode>1012AB</BG:postcode>
                
                <!-- Geldigheids-periode -->
                <BG:tijdvakGeldigheid>
                    <StUF:beginGeldigheid>20240101000000</StUF:beginGeldigheid>
                    <StUF:eindGeldigheid StUF:noValue="geenWaarde"/>
                </BG:tijdvakGeldigheid>
            </BG:adresAanduidingGegeven>
        </BG:object>
    </StUF:antwoord>
</StUF:La01Bericht>

2. Kennisgeving-patroon (Notification)

Use case: BRP meldt adreswijziging aan geabonneerde systemen

Ontwerp-beslissingen:

pattern: "Notification"
message_type: "Lk01"
trigger: "Address change in BRP"
delivery: "Asynchroon naar geabonneerde systemen"  
processing: "Fire-and-forget met optional acknowledgment"
subscription_based: true

Kennisgeving-ontwerp (Lk01):

<StUF:Lk01Bericht 
    xmlns:StUF="http://www.stufstandaarden.nl/koppelvlak/stuf"
    xmlns:BG="http://www.stufstandaarden.nl/onderlaag/bg">
    
    <StUF:stuurgegevens>
        <StUF:berichtcode>Lk01</StUF:berichtcode>
        <StUF:zender>
            <StUF:organisatie>0363</StUF:organisatie>
            <StUF:applicatie>BRP-Publisher</StUF:applicatie>
            <StUF:administratie>BRP</StUF:administratie>
        </StUF:zender>
        <StUF:ontvanger>
            <StUF:organisatie>0518</StUF:organisatie>
            <StUF:applicatie>ZaakDMS-Pro</StUF:applicatie>
        </StUF:ontvanger>
        <StUF:referentienummer>BRP-NOTIF-20240305-001</StUF:referentienummer>
        <StUF:tijdstempel>20240305143000</StUF:tijdstempel>
        <StUF:entiteittype>NPS</StUF:entiteittype>
        <StUF:functie>kennisgeving</StUF:functie>
    </StUF:stuurgegevens>
    
    <!-- Object wijziging -->
    <StUF:body>
        <BG:object StUF:entiteittype="NPS" StUF:verwerkingssoort="W">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
            
            <!-- Nieuw adres-gegeven -->
            <BG:adresAanduidingGegeven StUF:verwerkingssoort="W">
                <BG:authentiek>J</BG:authentiek>
                <BG:woonplaatsWoongebied>Utrecht</BG:woonplaatsWoongebied>
                <BG:straatnaam>Domstraat</BG:straatnaam>
                <BG:huisnummer>15</BG:huisnummer>
                <BG:huisnummertoevoeging>A</BG:huisnummertoevoeging>
                <BG:postcode>3512AB</BG:postcode>
                
                <!-- Nieuwe geldigheids-periode -->
                <BG:tijdvakGeldigheid>
                    <StUF:beginGeldigheid>20240305000000</StUF:beginGeldigheid>
                    <StUF:eindGeldigheid StUF:noValue="geenWaarde"/>
                </BG:tijdvakGeldigheid>
                
                <!-- Registratie-tijdstempel -->
                <BG:tijdstipRegistratie>20240305143000</BG:tijdstipRegistratie>
            </BG:adresAanduidingGegeven>
        </BG:object>
    </StUF:body>
</StUF:Lk01Bericht>

3. Synchronisatie-patroon

Use case: Nightly sync van gewijzigde personen tussen systemen

Ontwerp-beslissingen:

pattern: "Synchronization"
request_message: "Sv01"
response_message: "Sa01"
batch_processing: true
time_based_filtering: true
incremental_sync: true
large_datasets: true

Synchronisatie-vraag (Sv01):

<StUF:Sv01Bericht 
    xmlns:StUF="http://www.stufstandaarden.nl/koppelvlak/stuf"
    xmlns:BG="http://www.stufstandaarden.nl/onderlaag/bg">
    
    <StUF:stuurgegevens>
        <StUF:berichtcode>Sv01</StUF:berichtcode>
        <StUF:zender>
            <StUF:organisatie>0518</StUF:organisatie>
            <StUF:applicatie>Nightly-Sync-Job</StUF:applicatie>
            <StUF:administratie>BATCH</StUF:administratie>
        </StUF:zender>
        <StUF:ontvanger>
            <StUF:organisatie>0363</StUF:organisatie>
            <StUF:applicatie>BRP-Gateway</StUF:applicatie>
        </StUF:ontvanger>
        <StUF:referentienummer>SYNC-20240305-NIGHTLY</StUF:referentienummer>
        <StUF:tijdstempel>20240305020000</StUF:tijdstempel>
        <StUF:entiteittype>NPS</StUF:entiteittype>
    </StUF:stuurgegevens>
    
    <!-- Synchronisatie-parameters -->
    <StUF:parameters>
        <StUF:mutatiesoort>W</StUF:mutatiesoort>  <!-- Alleen wijzigingen -->
        <StUF:indicatorVervolgvraag>false</StUF:indicatorVervolgvraag>
    </StUF:parameters>
    
    <!-- Tijd-gebaseerde filtering -->
    <StUF:scope>
        <BG:object StUF:entiteittype="NPS">
            <!-- Wijzigingen van afgelopen 24 uur -->            
            <BG:tijdstipRegistratie>
                <StUF:min>20240304020000</StUF:min>
                <StUF:max>20240305015959</StUF:max>
            </BG:tijdstipRegistratie>
        </BG:object>
    </StUF:scope>
</StUF:Sv01Bericht>

Complexe berichtontwerpen

Multi-entiteit berichten

Use case: Zaak met alle gerelateerde personen en documenten

<StUF:La01Bericht>
    <StUF:stuurgegevens>
        <!-- ... -->
        <StUF:entiteittype>ZAK</StUF:entiteittype>
    </StUF:stuurgegevens>
    
    <StUF:antwoord>
        <!-- Hoofd-object: Zaak -->
        <ZKN:object StUF:entiteittype="ZAK" StUF:verwerkingssoort="I">
            <ZKN:identificatie>ZAAK-2024-001234</ZKN:identificatie>
            <ZKN:omschrijving>Kapvergunning eikenboom</ZKN:omschrijving>
            <ZKN:startdatum>20240301</ZKN:startdatum>
            
            <!-- Nested entities: Betrokkenen -->
            <ZKN:heeftBetrokkene>
                <ZKN:gerelateerde>
                    <BG:object StUF:entiteittype="NPS" StUF:verwerkingssoort="I">
                        <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
                        <BG:geslachtsnaam>
                            <BG:geslachtsnaam>Berg</BG:geslachtsnaam>
                        </BG:geslachtsnaam>
                        <BG:voornamen>Jan</BG:voornamen>
                    </BG:object>
                </ZKN:gerelateerde>
                <ZKN:rol>Aanvrager</ZKN:rol>
            </ZKN:heeftBetrokkene>
            
            <!-- Nested entities: Documenten -->
            <ZKN:heeftDocument>
                <ZKN:gerelateerde>
                    <ZKN:object StUF:entiteittype="EDC" StUF:verwerkingssoort="I">
                        <ZKN:identificatie>DOC-2024-001234-001</ZKN:identificatie>
                        <ZKN:titel>Aanvraagformulier kapvergunning</ZKN:titel>
                        <ZKN:documentType>Formulier</ZKN:documentType>
                        <ZKN:creatiedatum>20240301</ZKN:creatiedatum>
                    </ZKN:object>
                </ZKN:gerelateerde>
            </ZKN:heeftDocument>
        </ZKN:object>
    </StUF:antwoord>
</StUF:La01Bericht>

Historische gegevens

Use case: Historie van adreswijzigingen opvragen

<StUF:Sh01Bericht>
    <StUF:stuurgegevens>
        <StUF:berichtcode>Sh01</StUF:berichtcode>
        <!-- ... -->
    </StUF:stuurgegevens>
    
    <!-- Filter op historische tijdspanne -->
    <StUF:scope>
        <BG:object StUF:entiteittype="NPS">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
            <BG:adresAanduidingGegeven>
                <BG:tijdvakGeldigheid>
                    <StUF:beginGeldigheid>
                        <StUF:min>20200101000000</StUF:min>
                    </StUF:beginGeldigheid>
                    <StUF:eindGeldigheid>
                        <StUF:max>20241231235959</StUF:max>
                    </StUF:eindGeldigheid>
                </BG:tijdvakGeldigheid>
            </BG:adresAanduidingGegeven>
        </BG:object>
    </StUF:scope>
</StUF:Sh01Bericht>

Validatie en foutafhandeling ontwerpen

Business-validatie in berichten

<!-- Request met custom validatie-context -->
<StUF:Lv01Bericht>
    <StUF:stuurgegevens>
        <!-- ... -->
    </StUF:stuurgegevens>
    
    <!-- Validatie-context meesturen -->
    <StUF:parameters>
        <StUF:indicatorVervolgvraag>false</StUF:indicatorVervolgvraag>
        <StUF:verwerkingscontext>
            <StUF:eigenschap naam="doel">zaakbehandeling</StUF:eigenschap>
            <StUF:eigenschap naam="urgentie">hoog</StUF:eigenschap>
            <StUF:eigenschap naam="autorisatieniveau">bevraag_volledige_persoon</StUF:eigenschap>
        </StUF:verwerkingscontext>
    </StUF:parameters>
    
    <StUF:gelijk>
        <!-- ... -->
    </StUF:gelijk>
</StUF:Lv01Bericht>

Structured error responses

<!-- Enhanced foutbericht met business-context -->
<StUF:Fo01Bericht>
    <StUF:stuurgegevens>
        <StUF:berichtcode>Fo01</StUF:berichtcode>
        <!-- ... -->
    </StUF:stuurgegevens>
    
    <StUF:body>
        <StUF:code>StUF013</StUF:code>
        <StUF:plek>BRP-Gateway.gemeente.amsterdam.nl</StUF:plek>
        <StUF:omschrijving>Onvoldoende autorisatie voor opgevraagde gegevens</StUF:omschrijving>
        
        <!-- Gestructureerde fout-details -->
        <StUF:details>
            <StUF:foutDetail>
                <StUF:veld>BG:geboortedatum</StUF:veld>
                <StUF:reden>Geen autorisatie voor gevoelige persoonsgegevens</StUF:reden>
                <StUF:vereiste>AUTORISATIE_NIVEAU_2_OF_HOGER</StUF:vereiste>
                <StUF:helpUrl>https://api.gemeente.nl/help/autorisatie</StUF:helpUrl>
            </StUF:foutDetail>
            <StUF:foutDetail>
                <StUF:veld>BG:burgerlijkeStaat</StUF:veld>
                <StUF:reden>Geen autorisatie voor privacygevoelige gegevens</StUF:reden>
                <StUF:vereiste>PRIVACY_CLEARANCE_REQUIRED</StUF:vereiste>
            </StUF:foutDetail>
        </StUF:details>
    </StUF:body>
</StUF:Fo01Bericht>

Performance-geoptimaliseerd ontwerp

Batch-processing ontwerp

<!-- Bulk-request voor efficiency -->
<StUF:Lv01Bericht>
    <StUF:stuurgegevens>
        <!-- ... -->
    </StUF:stuurgegevens>
    
    <!-- Multiple queries in een bericht -->
    <StUF:vraag>
        <BG:object StUF:entiteittype="NPS" StUF:sleutelVerzendend="persoon_001">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
        </BG:object>
        <BG:object StUF:entiteittype="NPS" StUF:sleutelVerzendend="persoon_002">
            <BG:burgerservicenummer>234567891</BG:burgerservicenummer>
        </BG:object> 
        <BG:object StUF:entiteittype="NPS" StUF:sleutelVerzendend="persoon_003">
            <BG:burgerservicenummer>345678912</BG:burgerservicenummer>
        </BG:object>
    </StUF:vraag>
</StUF:Lv01Bericht>

Partial-response ontwerp

<!-- Scope beperken voor performance -->
<StUF:Lv01Bericht>
    <StUF:stuurgegevens>
        <!-- ... -->
    </StUF:stuurgegevens>
    
    <StUF:gelijk>
        <BG:object StUF:entiteittype="NPS">
            <BG:burgerservicenummer>123456789</BG:burgerservicenummer>
        </BG:object>
    </StUF:gelijk>
    
    <!-- Expliciete scope: alleen basis-gegevens -->
    <StUF:scope>
        <BG:object StUF:entiteittype="NPS">
            <BG:burgerservicenummer />
            <BG:geslachtsnaam />
            <BG:voornamen />
            <!-- Geen adres, geen historie, geen gerelateerden -->
        </BG:object>
    </StUF:scope>
</StUF:Lv01Bericht>

Het ontwerpen van StUF-berichten is een vaardigheid die business-begrip combineert met technische kennis. Goede berichtontwerpen faciliteren efficiënte processen, minimaliseren fouten, en ondersteunen schaalbaarheid van overheidsservices.

Resources: