# Externe klanttaak

**Auteur**: Jan Brekelmans | **Status**: Review

## Inleiding

Hiermee kunnen inwoners direct zelf zaken regelen bij de gemeente. Deze service laat acties zien die nog door een inwoner moeten worden uitgevoerd. Inwoners kunnen hier bijvoorbeeld extra gegevens aanleveren voor een lopende zaak of een betaling doen.

[![Screenshot Omnichannel MijnTaken](https://vng.nl/sites/default/files/styles/wysiwyg/public/2024-02/afbeelding_screenshot_omnichannel_5_20240221.png.webp?itok=77QfTgEU)](https://vng.nl/sites/default/files/2024-02/afbeelding_screenshot_omnichannel_5_20240221.png)[![Screenshot Omnichannel MijnTaken](https://vng.nl/sites/default/files/styles/wysiwyg/public/2024-02/afbeelding_screenshot_omnichannel_6_20240221.png.webp?itok=Fbaio-Ha)](https://vng.nl/sites/default/files/2024-02/afbeelding_screenshot_omnichannel_6_20240221.png)

Van betrokkenen bij een ZAAK (?) kan tijdens het proces "iets" worden gevraagd dat uitgevoerd moet worden. Als de Taak niet wordt uitgevoerd vervalt een recht, moet een aanvraag opnieuw worden ingediend of zijn er andere gevolgen.

## TODO

* Betere notificatie filtering -> <https://github.com/maykinmedia/objects-api/issues/405&#x20>;

## Taken patroon

Een ZAC kan taken uit zetten bij een portaal.

Scope: ZAC zet taak uit in de Objecten API die door het klantportaal word opgepakt&#x20;

Deze pagina beschrijft het (Technisch) design en structuur van het taken patroon. Met de opzet van deze taken beschrijving is als uitgangspunt gebruikt het toekomstig kunnen uitbreiden van de standaard. Zo moet het makkelijk zijn om een nieuw taak sub-type toe te kunnen voegen zonder dat dit backwards-compatibility problemen opleveren. Een taak bestaat daarom uit een generiek deel en een sub-type specifiek deel. Dat laatste kan makkelijk uitgebreid worden met andere sub-typen. Bijv. een nieuwe betaaltaak soort voor een andere payment provider.

Momenteel zijn de volgende taak sub-types gedefinieerd

<table><thead><tr><th width="169">Type</th><th>Uitleg</th></tr></thead><tbody><tr><td>url</td><td>Een link naar een externe resource. Als hier op deze taak geklikt word, word de gebruiker doorgestuurd naar deze link.</td></tr><tr><td>formtaak</td><td>Een taak die uitgevoerd kan worden binnen het desbetreffende portaal.</td></tr><tr><td>ogonebetaling</td><td>Een betaling die via het portaal met Ogone / Ingenico wordt voldaan</td></tr></tbody></table>

### Generieke sequence

Onderstaande sequence beschrijft het verloop van een taak, ongeacht wat voor taak soort het is. Verdere detail uitwerking per taak soort is verderop in dit document te lezen.&#x20;

{% @mermaid/diagram content="sequenceDiagram

actor klant AS Klant
participant kp AS Portaal
participant object AS Taak<br/>(Objecten API)
participant zac AS ZAC

zac ->>+ object: Zet taak klaar
alt Geautomatiseerde berichtgeving
object ->>- klant: Klantnotificatie via notificatie API,<br/>OMC & Notify over voorkeurskanaal
end

activate klant
klant ->>+ kp: Logt in
kp ->> object: Haal taken op
kp -->> klant: Weergave UI
deactivate kp
opt Klant klikt op taak op overzicht pagina
klant ->> kp: Wordt verwezen<br/>naar product of zaak<br/>(Context pagina)
end
klant ->>+ kp: klikt op taak
deactivate klant
note over klant, kp: Verwerking van de taak<br/>(Taak-soort afhankelijk)
kp -->> klant: Resultaat (popup) wordt getoond
%%deactivate kp

kp -->>+ object: Update Taak<br/>Incl. nieuwe status
deactivate kp
object ->>+ zac: Notificatie geupdate taak
deactivate object
zac -->> zac: Verwerking taak
zac ->> object: Verwijderen taak
deactivate zac
" %}

### Vaststellingen

* Een taak is een archief waardig object. In principe moet een taak bewaard blijven zodat later altijd inzage is in de communicatie tussen de klant en de gemeente.
  * Het opschonen van taken zal daarom door een Archief Beheer Component moeten worden gedaan als de bewaartijd is overschreden.
  * Let op dat een taak dus (waar mogelijk) altijd aan een zaak of ander items is gekoppeld waardoor deze meegenomen kunnen worden in opschoonacties.
* Een taak heeft een verloopdatum. Een portaal is alleen verantwoordelijk voor het weergeven van een taak, niet voor het opschonen van een taak. De applicatie die de taak klaar zet moet zelf verlopen taken in acht nemen en deze opschonen.

## Taakbeschrijvingen

### Generieke taak data

Een taak moet altijd de volgende data bevatten:

<table><thead><tr><th width="182">Veld</th><th>Omschrijving</th></tr></thead><tbody><tr><td>Titel</td><td>Weergave naam van de taak. Max 1 zin.</td></tr><tr><td>Status</td><td>Status van de taak.<br>Opties: open, afgerond, verwerkt, gesloten.</td></tr><tr><td>Soort</td><td>Zie tabel hierboven.</td></tr><tr><td>Identificatie</td><td>KVK of BSN waaraan de taak gericht is. Kan mogelijk uitgebreid worden met andere types</td></tr><tr><td>Verloopdatum</td><td>Optioneel: Verloopdatum van de taak.</td></tr><tr><td>Koppeling</td><td>Optioneel: Zaak of Product UUID waaraan de taak verbonden is.</td></tr><tr><td>Verwerker taak id</td><td>Een UUID waarmee een ZAC een link kan leggen tussen de taak en zijn eigen administratie</td></tr><tr><td>eigenaar</td><td>Een identificatie van de eigenaar / aanmaker van de taak. Gebruikt voor filtering ed.</td></tr></tbody></table>

### URL Taak

Bevat een URL waarna de gebruiker wordt doorgestuurd. Verdere afhandeling van de taak en eventuele terugkoppeling naar het portaal zijn in handen van het externe systeem waarna de gebruiker gerefereerd word.

### Form Taak

Formulier taak die binnen het portaal wordt afgehandeld. Een gebruiker krijgt na het klikken op de taak een formulier voor zich dat middels FormIO is opgesteld wat ingevuld kan worden. Het resultaat van het ingevulde formulier wordt in het object opgeslagen.

### Ogone betaal taak

Het integreren van een betaalverzoek direct in een klanttaak, waarbij het betaalverzoek de enige actie is die van de gebruiker wordt gevraagd.

*Rol van het ZAC*

Het ZAC maakt gebruik van een 'betaling' element binnen een klanttaak, zonder dat er een externe payment provider integratie nodig is vanuit de procesapplicatie. Het opnemen van betalingsvariabelen is voldoende. Deze variabelen kunnen door de behandelaar worden ingevoerd in een taakscherm.

*Rol van het portaal*

Het portaal is verantwoordelijk voor het renderen van het betaalformulier, het aanmaken van de transactie bij de payment provider, en voor het correct verwerken van de output van deze provider, die trigger is om het formulierobject bij te werken.

*Informeren initiator*

* Via outputmanagementcomponent (trigger is update van zaakstatus door ZAC?)
* Via mail door ZAC

#### Sequence Ogone betaling

{% @mermaid/diagram content="sequenceDiagram
actor klant AS Klant
participant kp AS Portaal
participant object AS Taak<br/>(Objecten API)
participant ingenico AS Ingenico

note over klant, ingenico: Voor initiatie, zie generiek patroon

activate klant
klant ->>+ kp: klikt op taak
kp ->> kp: Call naar backend<br/>om hash te berekenen<br/>op basis van taak properties
kp -->> kp: Properties terug naar frontend<br/>voor form POST incl callback URL
kp -->> klant: Form Post naar Ingenico
deactivate kp
klant ->>+ ingenico: Betaalt via Ingenico systeem
ingenico -->> klant: Redirect terug naar klantportaal
deactivate ingenico
klant ->>+ kp: Naar context pagina waar<br/>resultaat popup getoond wordt
deactivate klant
kp ->> kp: FE call naar BE<br/>betaaltaak status<br/>naar 'betaling gedaan'<br/>(Race condition?)
note over kp, object: Let op, race condition<br/>Zowel de frontend als backend callback kan<br/>de taak op status 'afgerond' zetten<br/>ZAC moet controleren op eenmalige verwerking
kp ->> object: Update betaalTaak met status 'afgerond'<br/>in geval nog niet gezet door BE
deactivate kp

ingenico ->>+ kp: Resultaat callback<br/>naar backend
kp ->> kp: Valideer callback
kp ->> object: Update betaalTaak met status 'afgerond'<br/>in geval nog niet gezet door FE
deactivate kp" %}

#### Betaaltaak structuur & variabelen

De betaaltaak bevat:

1. Title (Voor Ingenico weergave, zelfde als taak titel)
2. Bedrag
3. Betaalkenmerk - Aanleverende partij is verantwoordelijk voor het uniek zijn van dit betaalkenmerk
4. PSPID
5. Vervaldatum - tot welke datum de betaaltaak actief moet zijn; null = oneindig (Zelfde als taak verloopdatum)

<details>

<summary>Technische notities over ogone &#x26; callback</summary>

* Frontend moet SHA checken om geknoei met frontend callback te voorkomen
* Gebruik SHA-512 voor de hash
* Voor status mapping: <https://support-uat.direct.ingenico.com/get-started/transaction-management/transaction-statuses>
* Momenteel support het klantportaal alleen ideal betalingen, geen credit card ed.
* Portaal zet bij een succesvolle betaling de status op 'afgerond'. Verder informatie wordt niet terug te geven aan het ZAC behalve de informatie die al in de taak stond bij aanmaken
* Voorbeeld van ogone frontend callback naar portaal
  * <http://localhost:8090/api/payment/ogone/postsale?orderID=17021072517-2\\&currency=EUR\\&amount=100.25\\&PM=iDEAL\\&ACCEPTANCE=0000000000\\&STATUS=9\\&CARDNO=NL85TEST0000000004\\&ED=\\&CN=Buyer+Name\\&TRXDATE=04%2F17%2F24\\&PAYID=4079345236\\&PAYIDSUB=0\\&NCERROR=0\\&BRAND=iDEAL\\&IPCTY=NL\\&CCCTY=NL\\&ECI=5\\&CVCCheck=\\&AAVCheck=\\&VC=\\&DCC\\_INDICATOR=0\\&DCC\\_EXCHRATE=\\&DCC\\_EXCHRATETS=\\&DCC\\_CONVCCY=\\&DCC\\_CONVAMOUNT=\\&DCC\\_VALIDHOURS=\\&DCC\\_EXCHRATESOURCE=\\&DCC\\_MARGINPERCENTAGE=\\&DCC\\_COMMPERCENTAGE=\\&AAVADDRESS=NO\\&IP=193.173.25.1\\&SHASIGN=3404E706A6E60823EFFBA331C91AEE748703BF07>
  * **orderID**=17021072517-2
  * currency=EUR
  * **amount**=100.25
  * PM=iDEAL
  * ACCEPTANCE=0000000000
  * **STATUS**=9
  * CARDNO=NL85TEST0000000004
  * ED=
  * **CN**=Buyer+Name
  * TRXDATE=04%2F17%2F24
  * **PAYID**=4079345236
  * PAYIDSUB=0
  * NCERROR=0
  * BRAND=iDEAL
  * IPCTY=NL
  * CCCTY=NL
  * ECI=5
  * CVCCheck=
  * AAVCheck=
  * VC=
  * DCC\_INDICATOR=0
  * DCC\_EXCHRATE=
  * DCC\_EXCHRATETS=
  * DCC\_CONVCCY=
  * DCC\_CONVAMOUNT=
  * DCC\_VALIDHOURS=
  * DCC\_EXCHRATESOURCE=
  * DCC\_MARGINPERCENTAGE=
  * DCC\_COMMPERCENTAGE=
  * AAVADDRESS=NO
  * IP=193.173.25.1
  * **SHASIGN**=3404E706A6E60823EFFBA331C91AEE748703BF07

</details>

***

## JSONSchema taak (Object Type)

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

### Versie opmerkingen

1.1.0 -> 1.1.1

* Betere schema validatie met additionalproperties op false voor identificatie

1.0.0 -> 1.1.0

* Description toegevoegd met schema versie (Nu 1.1.0)
* Identificatie & koppeling aangepast zodat ze ook andere soorten toelaten maar nogsteeds validatie doet op bsn, kvk, zaak en product values. Non breaking change


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dienstverleningsplatform.gitbook.io/platform-generieke-dienstverlening-public/patronen/taken/externe-klanttaak.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
