# Berichten

**Auteur**: Jan Brekelmans | **Status**: TODO

Biedt de mogelijkheid om informatieve berichten of meldingen te versturen aan inwoners. Bijvoorbeeld over een genomen besluit of andere bekendmakingen. Dit werkt hetzelfde als de berichtenbox van MijnOverheid.

[![Screenshot van de MijnBerichten applicatie](https://vng.nl/sites/default/files/styles/wysiwyg/public/2024-02/afbeelding_screenshot_omnichannel_2_20240221.png.webp?itok=kBaBNx0q)](https://vng.nl/sites/default/files/2024-02/afbeelding_screenshot_omnichannel_2_20240221.png)

Deze service is overgenomen vanuit MijnOverheid en heeft dezelfde functie. Dit leidt tot gelijke informatie in eigen MijnOmgeving van de overheidsinstelling als in MijnOverheid. Voor dit bericht geldt dus dezelfde definitie als voor MijnOverheid.&#x20;

## Vaststellingen

* Bericht = bekendmaking (Van bijvoorbeeld een besluit)
* Bericht moet optionele relatie naar zaak hebben
* Vooralsnog is berichten alleen voor burger/DigiD
* Bericht (zoals in vooronderzoek van Paul) heeft een BSN
* Bericht moet altijd een link naar document (informatieobject) hebben (Link naar DRC)
* 'geopend' vlag is puur UI
* Document kan aan meerdere berichten gekoppeld worden (Dus many - many)
* Besluit, leidt (meestal?) tot bericht
  * Bericht kan ook alleenstaand gemaakt worden (Dus zonder besluit, etc.)
  * OMC kan een bericht genereren in het geval dat een systeemnotificatie tot een bericht moet leiden. Dit is nu geïmplementeerd voor besluiten.
  * Een ZAC kan zelf ook een bericht genereren
* In geval van post, nog steeds digitaal schaduwen (Dus altijd digitaal!)
  * Maar dan geen notificatie nodig
  * Aangeven in bericht dat bijlage ook per post is verstuurd
  * En mag digitaal nooit aangepast of verwijderd worden i.v.m. wetgeving
* Informeren moet gerespecteerd worden (Bij gemeente vastgelegd of notificatie wil ontvangen)
  * Dit moet nog wel een plek krijgen ergens in een systeem. Momenteel geen veld in KlantInteracties API
* Een bericht is voor de burger pas zichtbaar na het verstrijken van de publicatiedatum van het bericht
* Een contactmoment dat een bericht is geplaatst in de Berichtenbox is voor de burger pas zichtbaar na het verstrijken van de publicatiedatum van het bericht
  * Toevoegen aan contactmomenten API Spec…
* Als een bericht per post of naar MBB (dus dubbel) wordt verstuurd, pas je het bericht altijd aan met een algemeen bericht dat de bijlage in MB en de dubbele locatie is verstuurd bijv. ‘U heeft deze bijlage ontvangen via post en MB’
* Bericht flow zoals hier onder beschreven wordt alleen afgetrapt op het moment dat een nieuw ‘Bericht’ object wordt aangemaakt. Een aangepast bericht is namelijk een nieuw bericht.
  * Hierdoor is er geen idempotentie probleem
  * Er is wel een edit actie in het geval dat het bericht wordt aangevuld met een notitie over het versturen van het bericht over meerdere kanalen. Als gevolg van deze edit actie wordt automatisch een systeemnotificatie verstuurd (zoals het ZGW platform werkt) maar hier wordt niks mee gedaan.
  * In het geval van besluiten e.d. waar een publicatiedatum is gevuld, is deze leidend, anders plaatsingsdatum
* Volgens logius: Bericht tekst mag wel urls bevatten maar geen andere opmaak. Een newline is \r\n
  * <https://www.logius.nl/domeinen/interactie/mijnoverheid/documentatie/technische-aansluithandleiding-mijnoverheid-berichtenbox>

### MVP scope

* Voorkeurskanaal; Waarde uit klantsysteem. Daarna onderzoeken hoe machtigingen en andere speciale gevallen te supporten…

## Samenhang

{% @mermaid/diagram content="flowchart TD;
zac(Zaakafhandelsysteem)
documenten(Documenten API)
bericht("Berichten object (API)")
notificatie("Notificatie API")
omc("Output management component")
notify(Klantnotificatie component)
berichtenbox("Berichtenbox")
burger("Burger")
portaal\["Portaal"]

zac --Zet bericht uit--> bericht
zac --Slaat documenten op--> documenten
bericht --Trigger 'bericht Create'--> notificatie
notificatie --Systeem notificatie--> omc
documenten --"(Alt 2 & 3) Haalt pdf op"--> omc
omc --"(Alt 1) Notificatie voor bericht maken"--> notify
omc --"(Alt 2) Brief naar burger"-->burger
omc --"(Alt 3) Bericht bij Berichtenbox aanbieden"-->berichtenbox
notify --"(Alt 1) Notificatie"--> burger
berichtenbox --"(Alt 3) Notificatie"--> burger
burger --"(Alt 3) Bekijkt"--> berichtenbox

burger --"(Alt 1) Bekijkt"-->portaal
bericht --Wordt opgehaald-->portaal
documenten --Wordt opgehaald-->portaal" %}

## Flowchart aanvullen bericht

Wordt alleen uitgevoerd bij bericht - CREATE actie

MO BB = Mijn Overheid BerichtenBox

MB = Mijn Berichten (Gemeentelijk)

{% @mermaid/diagram content="flowchart TD
subgraph Output Management Component
start\["Ontvangen trigger:<br/>Bericht aangemaakt"]

```
digitaal{"(MO BB)<br/>Digitale post?"}
afdrukken("Printstraat")
mobb("Mijn Overheid</br>BerichtenBox")
notificeren{"(Gemeente)<br/>Notificeren?"}
notificatie("Notificatie")
contactmoment("Contactmoment aanmaken")
aanpassing_mobb("Bericht aanpassen:</br>zowel MO BB als MB")
aanpassing_post("Bericht aanpassen:</br>zowel post als MB")
```

end
mb("Berichtenregistratie<br/>component")

```
klaar["Klaar"]

mb -->|Aanmaken trigger| start

digitaal -->|"Ja & MB type<br/>(Alt 1)"| notificeren
notificeren -->|Ja| notificatie
notificeren -->|Nee| klaar
start --> digitaal

digitaal -->|"Ja & MO BB type<br/>(Alt 3)"| aanpassing_mobb --> mobb
aanpassing_post --> afdrukken

digitaal -->|"Nee<br/>(Alt 2)"| aanpassing_post 

contactmoment --> klaar
notificatie & mobb & afdrukken --> contactmoment" %}
```

Zo lang de integratie met MijnOverheid Berichtenbox nog niet is gebouwd halen we de voorkeur voor digitale post alleen uit de gemeentelijke registratie (Klanten API)&#x20;

TODO: Wellicht zal optie 'Gemeente notificeren' -> Nee, alsnog resulteren in het versturen van een fysieke brief (Printstraat flow) en zal er alsnog een contactmoment worden aangemaakt.

## Sequences

### Generiek

{% @mermaid/diagram content="sequenceDiagram
participant bericht AS Berichtregistratie<br/>component
participant notificatie AS Notificatieroutering<br/>component
participant klanten AS (Logius) Klantregistratie<br/>component
participant omc AS Output<br/>management<br/>component

bericht ->> notificatie: Publish op topic<br/>'create bericht'
activate notificatie
notificatie ->> omc: Systeemnotificatie
deactivate notificatie
activate omc
omc ->> klanten: Opvragen Digitale post (J/N)
deactivate omc
activate klanten
klanten -->> omc: Digitale post J/N
deactivate klanten
activate omc
alt Digitale post=J
note right of omc: Sequence diagram Afleveren digitale post
else Digitale post=N
note right of omc: Sequence diagram Afleveren per post
end
deactivate omc" %}

### Afleveren digitale post

{% @mermaid/diagram content="sequenceDiagram
participant omc AS Output<br/>management<br/>component
participant bericht AS Bericht<br/>registratie<br/>component

```
omc ->> bericht: Ophalen berichttype
activate bericht
    bericht -->> omc: Berichttype
deactivate bericht

alt Berichtenbox
    note right of omc: Sequence diagram Afleveren MO BB
else MijnBerichten
    note right of omc: Sequence diagram Notificeren
end" %}
```

### Afleveren MO BB

{% @mermaid/diagram content="sequenceDiagram
participant omc AS Output<br/>management<br/>component
participant bericht AS Bericht<br/>registratie<br/>Component
participant documenten AS Document<br/>registratie<br/>Component
participant berichtenbox AS MijnOverheid<br/>BerichtenBox
participant contact AS Contactmomentenregistratie<br/>component
participant klanten AS Klantregistratie<br/>component

```
omc ->> bericht: Bericht aanvullen met<br/>"zowel MijnBerichten als MOBB"
omc ->> bericht: Bericht ophalen
activate bericht
    bericht -->> omc: Bericht
deactivate bericht
omc ->> documenten: Ophalen document(en)
activate documenten
    documenten -->> omc: Document(en)
deactivate documenten
omc ->> omc: Samenstellen XML-bericht
omc ->> berichtenbox: Plaatsen bericht
activate berichtenbox
    berichtenbox ->> omc: Verwerkingsresultaat
deactivate berichtenbox
activate omc
omc ->> contact: Registreren BerichtenBox als contactmoment
opt Relateren aan klant
    omc ->> klanten: Contactmoment relateren aan klant
end" %}
```

### Notificeren

{% @mermaid/diagram content="sequenceDiagram
participant omc AS Output<br/>management<br/>component
participant klanten AS Klantenregistratie<br/>component
participant contact AS Contactmomenten<br/>registratie<br/>component
participant notify AS Klantnotificatie<br/>component
actor burger AS Burger

```
omc ->> klanten: Ophalen notificeren
activate klanten
    klanten -->> omc: Notificeren J/N
deactivate klanten
alt Notificeren=J
    omc ->> klanten: Ophalen kanaalvoorkeur
    activate klanten
        klanten -->> omc: Kanaalvoorkeur
    deactivate klanten
    activate omc
        omc ->> klanten: Ophalen contactgegevens
    deactivate omc
    activate klanten
        klanten -->> omc: Contactgegevens
    deactivate klanten
    activate omc
        omc ->> omc: Ophalen template
        omc ->> omc: Samenstellen JSON-bericht
        omc ->> notify: Versturen notificatie
    deactivate omc
    activate notify
        notify ->> burger: Versturen klantnotificatie
        notify -->> omc: Resultaat klantnotificatie
    deactivate notify
    activate omc
        omc ->> contact: Registreren notificatie als contactmoment
    deactivate omc
    opt Relateren aan klant
	        omc ->> klanten: Contactmoment relateren aan klant
	    end  
end" %}
```

### Afleveren per post

{% @mermaid/diagram content="sequenceDiagram
participant omc AS Output<br/>management<br/>component
participant bericht AS Bericht<br/>registratie<br/>Component
participant documenten AS Document<br/>registratie<br/>Component
participant contact AS Contactmomentenregistratie<br/>component
participant klanten AS Klantregistratie<br/>component
participant printer AS Printer

```
  omc ->> bericht: Bericht aanvullen "ook via MijnBerichten"
  opt Beleid per organisatie
    omc ->> bericht: Ophalen bericht
		activate bericht
		  bericht -->> omc: Bericht
		deactivate bericht
		omc ->> printer: Afdrukken bericht
	end
  omc ->> documenten: Ophalen document(en)
activate documenten
    documenten -->> omc: Document(en)
deactivate documenten
omc ->> printer: Afdrukken document(en)
omc ->> contact: Registreren post als contactmoment
opt Relateren aan klant
    omc ->> klanten: Contactmoment relateren aan klant
end  " %}
```

### Weergave portaal

{% @mermaid/diagram content="sequenceDiagram
actor klant AS Klant
participant portaal AS Portaal
participant documenten AS Documenten API
participant bericht AS Bericht<br/>(Objecten API)
participant notify AS Notify API

alt Notificatie (Kan ook via post waar bericht al bij zit)
notify ->> klant: Klantnotificatie
end
klant ->>+ portaal: Opent portaal<br/>(mijn berichten)
portaal ->>+ bericht: Haalt berichtObjecten op<br/>Op basis van bsn/kvk/vestiging
bericht -->> portaal: Berichten
deactivate bericht
portaal -->> klant: Laat berichten zien
deactivate portaal
klant ->>+ portaal: Opent bericht
portaal ->> documenten: Haalt documenten op
portaal ->> bericht: Indien Zet bericht op gelezen
portaal -->> klant: Weergeven bericht
deactivate portaal" %}

### Besluit

{% @mermaid/diagram content="sequenceDiagram
participant gzac AS ZAC
participant documenten AS Documenten API
participant bericht AS Bericht<br/>(Objecten API)
participant besluiten AS Besluiten API
%%participant zaken AS Zaken API
participant notificatie AS Notificatie API
%%participant klanten AS Klanten API
%%participant contact AS Contactomementen API
participant omc AS Output Management Component<br/>(+bnp)
participant notify AS Notify API
%%actor burger AS Burger

activate gzac
gzac ->> besluiten: Maak besluit aan bij zaak
gzac ->> documenten: Sla besluit document op
gzac ->>+ besluiten: Maak besluit informatieobject aan
deactivate gzac
besluiten ->>+ notificatie: Trigger event
deactivate besluiten
notificatie ->>+ omc: Trigger
deactivate notificatie
omc ->> besluiten: Haal besluit, besluitType, zaak en zaaktype op<br/>Voor vullen bericht
omc ->> notify: Haal besluit template op
omc ->> omc: Vul data in template
omc ->>+ bericht: Plaats bericht incl. bijlage link
deactivate omc

note over bericht: Vanaf hier, Sequence diagram 'Generiek'" %}

* **Trigger** op besluitinformatieobject, Wat als er meerdere documenten worden gekoppeld?
  * Of pas als eindresultaat gezet wordt?
  * Kijken naar koppeling aan / naar zaak of publicatie datum
* Ophaalflow: BesluitInformatieObject → Besluit → Zaak → Resultaat?

Van Vincent:

Aanpassing 1 betreft altijd 1 document bij besluit. Dus 1 bericht is 1 document. (MVP) OMC haalt juiste Bodytekst template op vanuit OMC of Notify obv zaaktype en Besluittype OMC haalt juiste prefill gegevens op die nodig zijn om template te vullen (titel Besluit, Zaaktype, data..., basisset voorbereiden, rekening houden dat deze uitgebreid wordt waarschijnlijk OMC voegt template en prefill data samen, incl relatie naar Besluit OMC schrijft Bericht incl bijlage link weg in Objects API

BesluitInformatieObjecten moeten aan de Logius BB aansluitvoorwaarden voldoen (PDF grootte onder (500?)kb.

## Bericht opmaak

### Bericht structuur

<table><thead><tr><th>Element</th><th width="134">BB Verplicht?</th><th>Toelichting</th></tr></thead><tbody><tr><td>PublicatieDatum</td><td>Ja</td><td>Tijdstip van verwerken van het bericht of de PublicatieDatum indien deze is ingevuld</td></tr><tr><td>Onderwerp</td><td>Ja</td><td>Onderwerp van het bericht</td></tr><tr><td>Berichttekst</td><td>Ja</td><td>Tekst van het bericht. Mag URL bevatten en /r/n voor newline. Geen verdere opmaak mogelijk (logius standaard)</td></tr><tr><td>Referentie (optioneel)</td><td>Ja</td><td>Berichtreferentie</td></tr><tr><td>HandelingsPerspectief</td><td>Ja</td><td>Benodigde reactie van de geadresseerde (bijv: betalen, informatie verstrekken)</td></tr><tr><td>EindDatumHandelingsTermijn</td><td>Ja</td><td>Termijn waarbinnen de geadresseerde moet reageren</td></tr><tr><td>Geopend</td><td>Nee</td><td>Het bericht is door de geadresseerde geopend of nog niet geopend</td></tr><tr><td>BerichtType</td><td>Ja</td><td>Type bericht. 7 vanuit logius berichtenbox. 5 vanuit de gemeente(?)</td></tr></tbody></table>

Voorbeeld tekst in bericht toevoegen:

> Geautomatiseerde toevoeging aan bericht: ‘Dit bericht is zowel in {gemeente} berichten als in de berichtenbox geplaatst’&#x20;
>
> \[Of]
>
> Geautomatiseerde toevoeging aan bericht: 'Dit bericht is zowel in {gemeente} berichten geplaatst als per post verzonden'
>
> Beste {inwoner},
>
> {We hebben een aanslag voor u. Zie bijlages…}
>
> fijne dag…

## TODO

Generiek:

1. Paul & Jan B; Sequence voor afwegingen die gemaakt moeten worden om naar de berichtenbox te gaan
   1. (Paul) Zijn er situaties waarbij (kanaal) override nodig is? (Moet bijv. altijd per (aangetekende?) post verstuurd worden) —> Dat bepaalt de uitvoeringsorganisatie. Is niet wettelijk verplicht, is lokaal beleid. Aangetekende post kent MO niet. Er zijn ook Betekende Berichten. D.w\.z. dat aan de verzendende organisatie aangegeven wordt of het bericht geopend is. Dat kan alleen als het wettelijke geregeld is voor een organisatie.
      1. Default / fallback kanaal per berichttype of vergelijkbaar?
      2. Bij jurist navragen of voorkeur ‘per post versturen’ uberhaubt genegeerd mag worden in specifieke gevallen
2. Hoe gaan we om met documenten die bij de MO BB vast in de template staan die je wellicht ook in je gemeentelijk bericht er bij wil hebben staan?

### Doorontwikkeling / Techniek

1. Hoe berichtenbox issues handelen? Wat doe je als berichtenbox niet bereikbaar is
   1. Bij OpenWebConcepts hebben ze een ‘interne’ queue
   2. (Paul) Is het een eis van Logius dat je een bericht opnieuw moet kunnen aanleveren? Wordt ondervangen door ebMS. 8x proberen per 3 uur max 1 dag.
      1. Info verzamelen en volgende keer over debateren…
2. (Paul) Vinger aan de pols houden bij het toepassen van een profielservices. Voorkom meerdere profielen. → Bij IA Jop beleggen
3. (Paul) ebMS kan 1x per 24 uur worden bevraagd, kan in geheel (BSN volledige lijst) maar kan ook met delta (BSN mutatie) en BSN validatie (1..1mio en dan als resultaat alleen geldige BSN). WUS beperkt tot 250 BSN’s per vraagbericht (validatie). 1000 bevragingen per dag over alle aangesloten partijen
4. MVP pakken we standaard waarde uit klantsysteem. Daarna onderzoeken hoe machtigingen en andere speciale gevallen

## Verdere vragen

* Wat voor extra info moet er beschikbaar zijn?
* Override kanaal - Soms **moet** het een brief zijn...
* Additionele info per bericht type…?
* Contactmomenten registreren; Wordt altijd een contactmoment aan een klant gehangen of alleen als er geen zaak is
  * Bij OpenWebConcepts; Hangt altijd contactmoment aan klant dmv zaak→rol relatie
* Meerdere documenten/bijlagen bij besluit en/of bericht
  * Bij MOBB; gesplitst tussen
    * max 3 standaard bijlagen van gezamenlijk max grootte van 2Mb die gekoppeld is aan het berichttype (bijv info-folder)
    * max 2 gepersonaliseerde bijlage (gezamenlijke grootte max 500k —> base64). Dus gezamenlijk mogen ze niet meer zijn dan ca. **375Kb omdat base64 30% meer wordt.**
  * Besluit; Welke bijlage moet bij een bericht horen? Door medewerker geïdentificeerd? Hoe wordt dit vastgelegd?
  * Gemeentelijk bericht ook rechttrekken met MOBB requirements? (max bijlagen?)
* Hoe om te gaan met printer configuratie? (Gewaarmerkt papier, papiergrootte, etc)
  * Evt extra printconfiguratie meegeven?
  * VNG kan niet specificeren wat de printstraat opties kunnen zijn…
  * Voor notify sturen we al een template id mee… Misschien ook voor printstraat (config)?
* Hoe contactmomenten registreren als niet afgeleverd kan worden? Kan uit het verwerkingsverslag worden gehaald!
  * Contactmoment vastleggen voor bevestiging (Geen hard bounce) of erna?
  * Complete historie is wel handig; Dus contactmoment dat verstuurd is, daarna extra contactmoment in geval van hard bounce
  * (Paul) Hoe hard/soft bounce handelen na aflevering bij Logius
* Burgeronderzoek; Is het duidelijk bij een post contactmoment dat het nog even duurt voordat de post daadwerkelijk aankomt? -> publicatiedatum!
  * Bij MOBB kan het ook tot 24u duren voordat een bericht verwerkt is (beschikbaar is voor de burger (uitgaande van geen publicatiedatum)

## \[Concept] JSON structuur

<https://www.jsonschemavalidator.net/s/rqR7CW2X>
