Working version v32.1.X v32.0.X v29.1.X
Working version v32.1.X v32.0.X v29.1.X Dutch

Fluvius

Inleiding

Deze connector laat toe om te communiceren met Fluvius.

Fluvius

Distributienetbeheerder in alle gemeenten van het Vlaams Gewest. Ontstaan uit de fusie van Eandis en Infrax op 1 juli 2018. Fluvius is verantwoordelijk voor elektriciteit, aardgas, riolering, openbare verlichting, en in sommige gemeenten warmtenetten. Sinds 1 januari 2023 is Fluvius verantwoordelijk voor de plaatsing en uitrol van digitale meters voor alle Vlaamse huishoudens. Fluvius zorgt ook voor aansluitingen, meteropnames, beheer van groenestroom, laadpalen, enzovoort.

Benopass

In Vlaanderen is de Benopass (of “Totaalrenovatiebonus”-pass) een digitaal dossier beheerd door netbeheerder Fluvius. Het volgt alle energiebesparende renovatiewerken in je woning van 2017–2020 bij. Wie binnen vijf jaar minstens drie van deze werken uitvoerde, ontving hiervoor een extra bonus. Via de connector kan je een renovatiedossier doorsturen naar Benopass.

Use cases

  • Aansluitingsgegevens van een klant ophalen op basis van een EAN-code (bv. adres, tariefstructuur, aanwezige lokale productie-installaties zoals zonnepanelen) om te gebruiken binnen een dossier.

  • EPC-informatie van een aansluiting raadplegen.

  • Een renovatiedossier (premie) en de bijhorende bewijsstukken doorsturen naar Benopass, in het kader van de Totaalrenovatiebonus.

Setup

Onboardingprocedure

De authenticatie met de Fluvius Assets API gebeurt via client assertion: een JWT die je zelf ondertekent met een privésleutel, in plaats van via een gedeeld secret. Dit vereist een certificaatstraject vóór je effectief kan configureren:

  1. Certificaat aanvragen bij GlobalSign: maak lokaal een certificate signing request (CSR) en private key aan. GlobalSign verifieert domeineigenaarschap via een DNS TXT-record dat je in de hosted zone moet plaatsen. Na verificatie stuurt GlobalSign het certificaat naar Skryv.

  2. Certificaat laten whitelisten bij Fluvius: stuur het certificaat naar Fluvius, zodat zij het toevoegen aan de firewall van hun Assets API.

  3. JWK genereren uit het certificaat:

    • Bundel certificaat + private key in een PKCS12-bestand, en zet dit om naar JWK-formaat.

    • Verwijder de velden use, alg en x5c uit de gegenereerde JWK.

    • Pas het x5t-veld aan: Fluvius vereist de base64url-encoding van de hex-geïnterpreteerde kid-waarde (niet de kid als string). Gebruik hiervoor het door Fluvius aangeleverde Java-hulpprogramma.

    • Het resultaat is een JWK-bestand met enkel kid, kty, n, e, dp, dq, qi, p, q, d, x5t.

Van Fluvius ontvang je: de subscription key, de API-URL, en het app-number. Het certificaat/private key/JWK maak je zelf aan.

Dependency toevoegen aan pom.xml bestand

Om de connector te kunnen gebruiken, voeg je deze eerst als maven dependency toe aan het pom.xml bestand van je applicatie. Deze haalt de code voor de connector op bij het maken van de build voor je app.

<dependency>
   <groupId>com.skryv.connectors</groupId>
   <artifactId>fluvius</artifactId>
   <version>${skryv.version}</version>
</dependency>

Applicatie eigenschappen

Volgende applicatie eigenschappen kunnen ingesteld worden bij de technische setup van de Fluvius-connector.

Eigenschap

Default

Beschrijving

FluviusTechnicalConnector

com.skryv.connectors.fluvius.host

http://localhost:1081

Basis-URL van de Fluvius Assets API. In een echte omgeving stel je hier de effectieve Fluvius-host in, bv. https://apihub-a.fluvius.be/woning-vlaanderen (preprod) of https://apihub.fluvius.be/woning-vlaanderen (productie). De default is enkel een lokale placeholder voor ontwikkeling.

com.skryv.connectors.fluvius.subscription-key

none

Subscription key voor de Fluvius Assets API, die achter Azure API Management draait. Deze waarde wordt best als secret aangeleverd (bv. via AWS SSM Parameter Store), nooit als platte tekst in application.properties.

com.skryv.connectors.fluvius.skip-authentication

false

Indien true, wordt de client-assertion-authenticatie overgeslagen bij elke aanroep. Enkel bedoeld voor lokaal testen tegen een gemockte Fluvius-API. Nooit op true zetten in een echte omgeving.

com.skryv.connectors.fluvius.upload-attachment-read-timeout

180000

Leestimeout (in ms) specifiek voor de bijlage-upload naar Benopass (sendBijlageToBenopass). Hoger dan de algemene default, omdat een bestandsupload langer kan duren dan een gewone opvraging.

com.skryv.connectors.fluvius.upload-attachment-connection-timeout

60000

Connectietimeout (in ms) voor de bijlage-upload naar Benopass.

com.skryv.connectors.fluvius.default-read-timeout

180000

Leestimeout (in ms) voor de overige Fluvius-aanroepen (getConnectionInformation, getEpcInformation, sendToBenopass).

com.skryv.connectors.fluvius.default-connection-timeout

60000

Connectietimeout (in ms) voor de overige Fluvius-aanroepen.

FluviusAuthenticationProperties 

skryv.connectors.fluvius.scope

-

GeoSecure OAuth scope, doorgaans in de vorm {appnumber}/.default.

skryv.connectors.fluvius.request-path

-

GeoSecure token request path: het Microsoft Entra ID-tokenendpoint (https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token) waar de JWT ingewisseld wordt voor een access token.

skryv.connectors.fluvius.app-number

-

GeoSecure app number: het door Fluvius toegekende identificatienummer van je applicatie, gebruikt als iss/sub in de zelf-gesigneerde JWT.

skryv.connectors.fluvius.audience

-

GeoSecure audience: de Microsoft Entra ID-tenant-URL (https://login.microsoftonline.com/{tenant-id}/v2.0) waarvoor de JWT bedoeld is.

skryv.connectors.fluvius.keypath

-

GeoSecure keypath: lokaal bestandspad naar de JWK (het certificaat/private-key-bestand na conversie, zie Onboardingprocedure).

skryv.connectors.fluvius.seed-enabled

false

Bepaalt of de JWK bij het opstarten van de applicatie automatisch uit AWS Secrets Manager gehaald en naar keypath geschreven wordt, in plaats van een lokaal aanwezig bestand te verwachten.

skryv.connectors.fluvius.aws-keypath

-

AWS keypath: naam van het secret in AWS Secrets Manager waar de JWK staat. Enkel relevant wanneer seed-enabled=true.

Services en functies

Overzicht

Functie

Retourtype

Info

getConnectionInformation

ConnectionInformationResponseDto

Haalt aansluitingsinformatie op voor een EAN-code, optioneel voor een specifieke refertedatum.

getEpcInformation

EpcInformationResponseDto

Haalt EPC-informatie op voor een EAN-code.

sendToBenopass

void

Verstuurt een renovatiedossier (premie) naar Benopass.

sendBijlageToBenopass

void

Verstuurt een extra bijlage naar een bestaand Benopass-dossier.

Deze functies zijn, naast de workflow expressie, ook rechtstreeks aanroepbaar vanuit Java-code door FluviusCamundaConnector (bean fluvius) te injecteren in je klasse:

Java
@RequiredArgsConstructor
public class MyOwnService {
    private final FluviusCamundaConnector fluvius;
}

getConnectionInformation

Workflow expressie 1

${fluvius.getConnectionInformation(String ean)}

Workflow expressie 2 (met refertedatum)

${fluvius.getConnectionInformation(String ean, LocalDate date)}

Java-code

java

ConnectionInformationResponseDto response = fluvius.getConnectionInformation(ean);
// of, met refertedatum:
ConnectionInformationResponseDto response = fluvius.getConnectionInformation(ean, date);

Input

Inputparameters

Data type

Voorbeeld

Uitleg

ean

String

'5414488200123456'

Aansluitingsnummer (EAN-code, 18 cijfers, begint met 54) waarvoor je aansluitingsinformatie opvraagt.

date (enkel variant 2)

LocalDate

2024-01-01

Refertedatum: de aansluitingsinformatie wordt opgevraagd zoals ze gold op deze datum.

Output

Je krijgt een ConnectionInformationResponseDto-object terug met twee velden: status (ResultStatus) en result (ResultInformation, enkel ingevuld bij SUCCESS).

ResultStatus kan volgende waarden aannemen: WaardeBetekenisSUCCESSAansluiting gevonden, result is ingevuld.EAN_NOT_ELECTRICITYDe opgegeven EAN is geen elektriciteitsaansluiting.EAN_OUTSIDE_FLANDERSDe aansluiting valt buiten het Vlaamse Gewest.EAN_NOT_FOUNDEAN-code niet gevonden.TECHNICAL_ERRORTechnisch probleem bij Fluvius.

ResultInformation bevat: ean, address (straat, huisnummer, busnummer, postcode, plaatsnaam, landcode), rate (tariefstructuur: SINGLE, SINGLE_EXCLUSIVE_NIGHT, DOUBLE, DOUBLE_EXCLUSIVE_NIGHT, EXCLUSIVE_NIGHT), digitalMeterPlacementDate, connectionDateUtc, isEanActive, dnb (distributienetbeheerder), localProductions (lijst van lokale productie-installaties zoals zonnepanelen, elk met type — PV, BIOM, FOSM, PCSM, WIND, WATR, ONBE — en vermogen), accesspointsAmount, isExclusiveNightMeter, aansluitObjectId, superAansluitObjectId.

Error-handling

Deze functie gooit geen exceptie bij een probleem. Controleer altijd zelf het status-veld vóór je result gebruikt:

ConnectionInformationResponseDto response = fluvius.getConnectionInformation(ean);
if (response.getStatus() != ResultStatus.SUCCESS) {
    // result is niet ingevuld -- behandel de specifieke status
}

getEpcInformation

getEpcInformation

Workflow expressie

${fluvius.getEpcInformation(String ean)}

Java-code

java

EpcInformationResponseDto response = fluvius.getEpcInformation(ean);

Input

Inputparameters

Data type

Voorbeeld

Uitleg

ean

String

'5414488200123456'

Aansluitingsnummer (EAN-code) waarvoor je EPC-informatie opvraagt.

Output

Je krijgt een EpcInformationResponseDto-object terug met: ean, epclabelVoor/epclabelNa (EPC-label vóór/na renovatie), epcDatumVoor, epcDatumVervallen, dossiernummer, activatiedatum, vervaldatum, en drie velden lapAanw, laaAanw, benoAanw.

Error-handling

In tegenstelling tot getConnectionInformation bevat dit DTO geen status-veld. Op basis van de code (een rechtstreekse RestTemplate-aanroep zonder foutafhandeling) resulteert elk technisch probleem of een niet-gevonden EAN in een niet-opvangbare exceptie en dus een Camunda-incident, niet in een status binnen het antwoordobject zelf.

sendToBenopass

Workflow expressie

${fluvius.sendToBenopass(Premie premie)}

Java-code

java

fluvius.sendToBenopass(premie);

Input

Inputparameters

Data type

Uitleg

premie

Premie

Samengesteld object met alle gegevens van het renovatiedossier.

Het Premie-object bevat algemene gegevens (leverpunten, opdrachtgever, contactPersoon, bedragen, facturen, woningType, investeringsType, beschermdeKlant, aantalAppartementen, referentieWoningVlaanderen, rekeningNummer) plus een lijst types (CategorieenType-codes: DAK, MUUR, GLAS, ZONNEBOILER, VLOER, WARMTEPOMP) die aangeeft welke van de volgende secties je invult: glas, kelder, dak, spouwmuur, buitenmuurBinnenkant/buitenmuurBuitenkant, vloer, warmtepomp, zonneboiler. Vul enkel de sectie(s) in die overeenkomen met de opgegeven types. de overige secties laat je leeg.

Let op: te lange tekstvelden (bv. voornaam >40 tekens, huisnummer/postcode/busnummer >10 tekens, diverse merk/type-velden >60 tekens) worden door de connector stilzwijgend afgekapt vóór verzending. Je krijgt hierover geen foutmelding. BTW-nummers worden gevalideerd voor BE/NL/FR/DE-structuren; een niet-valideerbaar of buitenlands nummer wordt vervangen door een dummy-waarde (BE0000000097).

Output

Geen output (void).

Error-handling

Situatie

Gedrag

HTTP 409 CONFLICT

Geen fout, de premie werd al eerder verstuurd, de functie keert gewoon terug.

HTTP 403 FORBIDDEN / 429 TOO_MANY_REQUESTS

BpmnError("sendToBenopass-failed", ...), opvangbaar via een error boundary event.

overige 4xx

IllegalStateException, niet opvangbaar, resulteert in een Camunda-incident.

5xx

IllegalStateException, idem, incident.

sendBijlageToBenopass

Workflow expressie

${fluvius.sendBijlageToBenopass(String dossierId, BijlageInfo bijlageInfo)}

Java-code

fluvius.sendBijlageToBenopass(dossierId, bijlageInfo);

Input

Inputparameters

Data type

Uitleg

dossierId

String

Id van het Skryv-dossier. Wordt gebruikt om het dossierlabel en de bijlage-inhoud op te halen.

bijlageInfo

BijlageInfo

Object met guid (id van de bijlage in Skryv), bestandsnaam, voorPremies (lijst van CategorieenType-codes) en types (lijst van BijlageType-codes — 32 mogelijke waarden, o.a. FACTUUR, FOTO, GRONDPLAN, EPC_CERTIFICAAT, ...).

Output

Geen output (void). Een succesvolle upload resulteert intern in HTTP 202 Accepted (asynchrone verwerking aan Fluvius' kant).

Error-handling

Situatie

Gedrag

HTTP 409 CONFLICT

Geen fout, bijlage werd al eerder geüpload, functie keert terug.

HTTP 403 / 429

BpmnError("sendBijlageToBenopass-failed", ...) opvangbaar.

HTTP 400 BAD_REQUEST

BijlageUploadException (niet opvangbare RuntimeException) bevat foutdetails en een trace-id uit de responsbody, nuttig bij het opvolgen met Fluvius.

HTTP 500

GenericBijlageUploadException, niet opvangbaar.

overige status ≠ 202

GenericBijlageUploadException, niet opvangbaar.

I/O-fout bij het openen van de HTTP-client

CouldNotOpenHttpClientException, niet opvangbaar.