Compare commits

..

No commits in common. "a09058d15151efcf0e9e2e3bf6e8f166c54833b6" and "520362ae4de5058771921a76872224dc390b7e0b" have entirely different histories.

37 changed files with 3459 additions and 25157 deletions

View File

@ -1,307 +0,0 @@
########################
## ##
## CUSTOM IGNORE LIST ##
## ##
########################
# Ignore appsettings.json as it contains credentials - only the template should be shared!
appsettings.json
# Also ignore pfx and pem files for the same reason
*.pfx
*.pem
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# VS Code
.vscode/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Typescript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

View File

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

View File

@ -1,12 +0,0 @@
# ABTProducts PUT request body generator
Simple tool to quickly edit HTM products via ABTProducts REST API.
- Requires JRE 21
- Run via: `java -jar ABTProductsPUTGenerator.jar`
- Specify custom input/output path via: `java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>`
- Takes a ABTProducts GET response body in JSON format (product details)
- Generates the equivalent PUT request body - send via either:
- Postman WSO2 ABTProducts collection
- `curl -X PUT -H 'Content-Type: application/json' {baseUrl}/abt/abtproducts/1.0/38 --data @output.json`
- Default input path: /input.json
- Default output path: /output.json (output is overwritten if it exists)

View File

@ -1,160 +0,0 @@
{
"productId": 151,
"fikoArticleNumber": null,
"parentProductId": 114,
"gboPackageTemplateId": "33629",
"tapConnectProductCode": null,
"productName": "HTM Regio Vrij - Voltarief - Losse Maand - HL62",
"productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in gebied HL62",
"validityPeriod": {
"validityPeriodId": 262,
"fromInclusive": "2024-09-30T23:00:00.000+00:00",
"toInclusive": "2099-12-30T23:00:00.000+00:00"
},
"productTranslations": [
{
"language": "en",
"name": "HTM Regio Free - Full Fare - 1 Month - HL62",
"description": "For a fixed amount unlimited travel with EBS, HTM and RET in region HL62"
}
],
"productOwner": {
"productOwnerId": 19,
"name": "MRDH",
"organization": "MRDH"
},
"marketSegments": null,
"customerSegments": null,
"allowedGboAgeProfiles": [
{
"gboAgeProfileId": 1,
"name": "Baby/peuter (0 t/m 3 jaar)",
"ageFromInclusive": 0,
"ageToInclusive": 3
},
{
"gboAgeProfileId": 4,
"name": "Volwassene (19 t/m 64 jaar)",
"ageFromInclusive": 19,
"ageToInclusive": 64
},
{
"gboAgeProfileId": 5,
"name": "Oudere (65 jaar of ouder)",
"ageFromInclusive": 65,
"ageToInclusive": 999
}
],
"productCategory": {
"productCategoryId": 3,
"isTravelProduct": true,
"name": "Afgekocht reisrecht"
},
"requiredCustomerLevel": {
"requiredCustomerLevelId": 3,
"name": "profile"
},
"requiredProducts": null,
"incompatibleProducts": null,
"mandatoryCustomerDataItems": [
{
"mandatoryCustomerDataItemId": 1,
"customerDataItem": "birthname"
},
{
"mandatoryCustomerDataItemId": 2,
"customerDataItem": "surname"
},
{
"mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress"
},
{
"mandatoryCustomerDataItemId": 8,
"customerDataItem": "padBirthDate"
}
],
"requiredGboPersonalAttributes": [
{
"requiredGboPersonalAttributeId": 1,
"name": "NAME"
},
{
"requiredGboPersonalAttributeId": 2,
"name": "BIRTHDATE"
},
{
"requiredGboPersonalAttributeId": 3,
"name": "PHOTO"
}
],
"tokenTypes": [
{
"tokenTypeId": 1,
"name": "EMV"
}
],
"paymentMoment": {
"paymentMomentId": 1,
"name": "prepaid"
},
"serviceOptions": null,
"validityDuration": "P1M",
"maxStartInFutureDuration": "P6W",
"isRenewable": false,
"sendInvoice": false,
"imageReference": "https://web.acc.cloud.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"productPageUrl": "https://web.acc.cloud.htm.nl/webshop/htm-regio-vrij",
"termsUrl": "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-regio-vrij/",
"isSellableAtHtm": true,
"needsSolvencyCheckConsumer": false,
"needsSolvencyCheckBusiness": false,
"sellingPeriods": [
{
"sellingPeriodId": 214,
"fromInclusive": "2024-10-30T23:00:00.000+00:00",
"toInclusive": "2029-12-30T23:00:00.000+00:00",
"salesTouchpoint": {
"salesTouchpointId": 3,
"name": "Website (Perplex)",
"isActive": true,
"retailer": {
"retailerId": 1001,
"name": "HTM externe touchpoints",
"street": "Koningin Julianaplein",
"number": 10,
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002",
"taxId": 572309345923,
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg"
}
},
"forbiddenPaymentMethods": null,
"sellingPrices": [
{
"sellingPriceId": 195,
"taxCode": "V09",
"taxPercentage": 9.0000,
"amountExclTax": 13486,
"amountInclTax": 14700,
"fromInclusive": "2024-10-30T23:00:00.000+00:00",
"toInclusive": "2029-12-01T23:00:00.000+00:00",
"internalPrice": 0.0000
}
]
}
],
"purchasePrices": null,
"auditTrail": [
{
"auditTrailId": 475,
"action": "insert",
"user": "api",
"timestamp": "2025-05-07T14:05:43.213+00:00"
}
]
}

View File

@ -1,59 +0,0 @@
{
"fikoArticleNumber" : null,
"parentProductId" : 114,
"gboPackageTemplateId" : "33629",
"tapConnectProductCode" : null,
"productName" : "HTM Regio Vrij - Voltarief - Losse Maand - HL62",
"productDescription" : "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in gebied HL62",
"validityPeriod" : {
"validityPeriodId" : 262,
"fromInclusive" : "2024-09-30T23:00:00.000+00:00",
"toInclusive" : "2099-12-30T23:00:00.000+00:00"
},
"productTranslations" : [ {
"language" : "en",
"name" : "HTM Regio Free - Full Fare - 1 Month - HL62",
"description" : "For a fixed amount unlimited travel with EBS, HTM and RET in region HL62"
} ],
"productOwnerId" : 19,
"marketSegmentIds" : null,
"customerSegmentIds" : null,
"allowedGboAgeProfileIds" : [ 1, 4, 5 ],
"productCategoryId" : 3,
"requiredCustomerLevelId" : 3,
"requiredProducts" : null,
"incompatibleProducts" : null,
"mandatoryCustomerDataItemIds" : [ 1, 2, 4, 8 ],
"requiredGboPersonalAttributeIds" : [ 1, 2, 3 ],
"tokenTypeIds" : [ 1 ],
"paymentMomentId" : 1,
"serviceOptionIds" : null,
"validityDuration" : "P1M",
"maxStartInFutureDuration" : "P6W",
"isRenewable" : false,
"sendInvoice" : false,
"imageReference" : "https://web.acc.cloud.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"productPageUrl" : "https://web.acc.cloud.htm.nl/webshop/htm-regio-vrij",
"termsUrl" : "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-regio-vrij/",
"isSellableAtHtm" : true,
"needsSolvencyCheckConsumer" : false,
"needsSolvencyCheckBusiness" : false,
"sellingPeriods" : [ {
"sellingPeriodId" : 214,
"fromInclusive" : "2024-10-30T23:00:00.000+00:00",
"toInclusive" : "2029-12-30T23:00:00.000+00:00",
"salesTouchpointId" : 3,
"forbiddenPaymentMethodIds" : null,
"sellingPrices" : [ {
"sellingPriceId" : 195,
"taxCode" : "V09",
"taxPercentage" : 9.0,
"amountExclTax" : 13486,
"amountInclTax" : 14700,
"fromInclusive" : "2024-10-30T23:00:00.000+00:00",
"toInclusive" : "2029-12-01T23:00:00.000+00:00",
"internalPrice" : 0.0
} ]
} ],
"purchasePrices" : null
}

View File

@ -1,58 +0,0 @@
{
"parentProductId" : null,
"productCode" : "30901-WA",
"gboPackageTemplateId" : "30901",
"tapConnectProductCode" : null,
"productGroupMetadata" : null,
"productName" : "HTM P1W Prolongatie-Test 90% Korting",
"productDescription" : "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis met korting!",
"validityPeriod" : {
"validityPeriodId" : 148,
"fromInclusive" : "2023-12-31T23:00:00.000+00:00",
"toInclusive" : "2029-12-08T04:00:00.000+00:00"
},
"productTranslations" : [ {
"language" : "en",
"name" : "HTM Prolongation-Test 90% Discount",
"description" : "Are you a regular traveler? Activate HTM 90% discount on your EMV card!"
} ],
"productOwnerId" : 17,
"marketSegmentIds" : [ 1 ],
"customerSegmentIds" : [ 2, 3, 4, 5 ],
"productCategoryId" : 1,
"requiredCustomerLevelId" : 3,
"requiredProducts" : null,
"incompatibleProducts" : null,
"mandatoryCustomerDataItemIds" : [ 1, 2, 4, 5 ],
"requiredGboPersonalAttributes" : null,
"tokenTypeIds" : [ 1 ],
"paymentMomentId" : 1,
"serviceOptions" : null,
"validityDuration" : "P1W",
"maxStartInFutureDuration" : "P6W",
"isRenewable" : true,
"sendInvoice" : true,
"imageReference" : "https://web.acc.cloud.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"productPageUrl" : "https://web.acc.cloud.htm.nl/webshop/htm-90-korting/",
"termsUrl" : "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-90-korting/",
"isSellableAtHtm" : true,
"needsSolvencyCheckConsumer" : false,
"needsSolvencyCheckBusiness" : false,
"sellingPeriods" : [ {
"sellingPeriodId" : 89,
"fromInclusive" : "2024-09-30T23:00:00.000+00:00",
"toInclusive" : "2029-12-01T23:00:00.000+00:00",
"salesTouchpointId" : 3,
"forbiddenPaymentMethodIds" : null,
"sellingPrices" : [ {
"sellingPriceId" : 82,
"amountExclTax" : 92,
"amountInclTax" : 100,
"fromInclusive" : "2024-09-30T23:00:00.000+00:00",
"toInclusive" : "2029-12-01T23:00:00.000+00:00",
"internalPrice" : 0.0,
"taxMetadataId" : "47C8972E-A730-4032-9BDA-AF0A5BCB2C85"
} ]
} ],
"purchasePrices" : null
}

View File

@ -1,67 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nl.htm.ovpay.abt</groupId>
<artifactId>ABTProductsPUTGenerator</artifactId>
<version>1.0-SNAPSHOT</version>
<name>ABTProductsPUTGenerator</name>
<description>Generate an ABTProducts PUT request body from a given ABTProducts GET response body</description>
<dependencies>
<!-- Log4j Slf4j Logging -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.23.1</version>
</dependency>
<!-- JSON parsing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>nl.htm.ovpay.abt.ABTProductsPUTGenerator</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,313 +0,0 @@
package nl.htm.ovpay.abt;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class ABTProductsPUTGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(ABTProductsPUTGenerator.class);
public static void main(String[] args) throws Exception {
if (args.length != 2) {
LOGGER.info("To modify input/output path, use: java -jar ABTProductsPUTGenerator.jar <inputPath> <outputPath>");
}
var inputFile = args.length > 0 ? args[0] : "input.json";
var outputFile = args.length > 1 ? args[1] : "output.json";
try (InputStream is = getInputStream(inputFile)) {
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(is);
Long productId = jsonNode.get("productId").asLong();
LOGGER.info("Successfully parsed product with productId {} from JSON:\n{}\n", productId, jsonNode.toPrettyString());
JsonNode putJsonNode = processJsonNode(jsonNode);
writeToFile(putJsonNode, outputFile);
LOGGER.info("DONE! Modify the output JSON as desired and send it as ABTProducts PUT request body:");
LOGGER.info("curl -X PUT -H 'Content-Type: application/json' {baseUrl}/abt/abtproducts/1.0/products/{} --data @{}", productId, outputFile);
}
}
private static InputStream getInputStream(String filePath) throws IOException {
var externalResource = new File(filePath);
if (externalResource.exists()) {
LOGGER.info("Loading ABTProducts details JSON from external file {}...", externalResource.getAbsolutePath());
return externalResource.toURI().toURL().openStream();
} else {
LOGGER.info("External file {} not found, using internal resource /input.json...", filePath);
return ABTProductsPUTGenerator.class.getResourceAsStream("/input.json");
}
}
private static void writeToFile(JsonNode jsonNode, String filePath) throws IOException {
ObjectMapper mapper = new ObjectMapper();
var outputFile = new File(filePath);
if (outputFile.exists()) {
LOGGER.info("Deleting existing output file {}...", filePath);
outputFile.delete();
}
mapper.writerWithDefaultPrettyPrinter().writeValue(outputFile, jsonNode);
LOGGER.info("Successfully wrote JSON to file {}!", outputFile.getAbsolutePath(), jsonNode.toPrettyString());
}
private static JsonNode processJsonNode(JsonNode jsonNode) {
var newJsonNode = new ObjectNode(new JsonNodeFactory(true));
jsonNode.fields().forEachRemaining(jsonField -> {
if (!List.of(JsonNodeType.ARRAY, JsonNodeType.OBJECT).contains(jsonField.getValue().getNodeType())) {
if (jsonField.getValue().isNull()) {
checkRewriteNullFields(jsonField, newJsonNode);
} else if (!jsonField.getKey().equals("productId") && !jsonField.getKey().equals("auditTrail")) {
LOGGER.info("Keeping {} as-is...", jsonField.getKey());
newJsonNode.put(jsonField.getKey(), jsonField.getValue());
}
} else {
if (List.of("validityPeriod", "productTranslations").contains(jsonField.getKey())) {
LOGGER.info("Keeping {} as-is...", jsonField.getKey());
newJsonNode.set(jsonField.getKey(), jsonField.getValue());
} else {
rewriteObjectFields(jsonField, newJsonNode);
rewriteArrayFields(jsonField, newJsonNode);
}
}
});
LOGGER.info("Successfully rewritten into PUT JSON:\n{}\n", newJsonNode.toPrettyString());
return newJsonNode;
}
private static void checkRewriteNullFields(Map.Entry<String, JsonNode> jsonField, JsonNode newJsonNode) {
switch (jsonField.getKey()) {
case "marketSegments" -> {
LOGGER.info("Rewriting null marketSegments to marketSegmentIds...");
((ObjectNode)newJsonNode).putRawValue("marketSegmentIds", null);
}
case "customerSegments" -> {
LOGGER.info("Rewriting null customerSegments to customerSegmentIds...");
((ObjectNode)newJsonNode).putRawValue("customerSegmentIds", null);
}
case "allowedGboAgeProfiles" -> {
LOGGER.info("Rewriting null allowedGboAgeProfiles to allowedGboAgeProfileIds...");
((ObjectNode)newJsonNode).putRawValue("allowedGboAgeProfileIds", null);
}
case "mandatoryCustomerDataItems" -> {
LOGGER.info("Rewriting null mandatoryCustomerDataItems to mandatoryCustomerDataItemIds...");
((ObjectNode)newJsonNode).putRawValue("mandatoryCustomerDataItemIds", null);
}
case "requiredGboPersonalAttributes" -> {
LOGGER.info("Rewriting null requiredGboPersonalAttributes to requiredGboPersonalAttributeIds...");
((ObjectNode)newJsonNode).putRawValue("requiredGboPersonalAttributeIds", null);
}
case "tokenTypes" -> {
LOGGER.info("Rewriting null tokenTypes to tokenTypeIds...");
((ObjectNode)newJsonNode).putRawValue("tokenTypeIds", null);
}
case "serviceOptions" -> {
LOGGER.info("Rewriting null serviceOptions to serviceOptionIds...");
((ObjectNode)newJsonNode).putRawValue("serviceOptionIds", null);
}
default -> {
LOGGER.info("Keeping {} as-is...", jsonField.getKey());
((ObjectNode)newJsonNode).put(jsonField.getKey(), jsonField.getValue());
}
}
}
private static void rewriteObjectFields(Map.Entry<String, JsonNode> jsonField, JsonNode newJsonNode) {
switch (jsonField.getKey()) {
case "productOwner" -> {
LOGGER.info("Rewriting productOwner to productOwnerId...");
Long productOwnerId = jsonField.getValue().get("productOwnerId").asLong();
((ObjectNode)newJsonNode).put("productOwnerId", productOwnerId);
}
case "productCategory" -> {
LOGGER.info("Rewriting productCategory to productCategoryId...");
Long productCategoryId = jsonField.getValue().get("productCategoryId").asLong();
((ObjectNode)newJsonNode).put("productCategoryId", productCategoryId);
}
case "paymentMoment" -> {
LOGGER.info("Rewriting paymentMoment to paymentMomentId...");
Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong();
((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId);
}
case "requiredCustomerLevel" -> {
LOGGER.info("Rewriting requiredCustomerLevel to requiredCustomerLevelId...");
Long requiredCustomerLevelId = jsonField.getValue().get("requiredCustomerLevelId").asLong();
((ObjectNode)newJsonNode).put("requiredCustomerLevelId", requiredCustomerLevelId);
}
}
}
private static void rewriteArrayFields(Map.Entry<String, JsonNode> jsonField, JsonNode newJsonNode) {
switch (jsonField.getKey()) {
case "marketSegments" -> {
LOGGER.info("Rewriting marketSegments to marketSegmentIds...");
if (jsonField.getValue() != null) {
ArrayNode marketSegmentIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(marketSegment -> {
marketSegmentIds.add(marketSegment.get("marketSegmentId").asLong());
});
((ObjectNode)newJsonNode).putArray("marketSegmentIds").addAll(marketSegmentIds);
} else {
((ObjectNode)newJsonNode).putRawValue("marketSegmentIds", null);
}
}
case "customerSegments" -> {
LOGGER.info("Rewriting customerSegments to customerSegmentIds...");
if (jsonField.getValue() != null) {
ArrayNode customerSegmentIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(customerSegment -> {
customerSegmentIds.add(customerSegment.get("customerSegmentId").asLong());
});
((ObjectNode)newJsonNode).putArray("customerSegmentIds").addAll(customerSegmentIds);
} else {
((ObjectNode)newJsonNode).putRawValue("customerSegmentIds", null);
}
}
case "allowedGboAgeProfiles" -> {
LOGGER.info("Rewriting allowedGboAgeProfiles to allowedGboAgeProfileIds...");
if (jsonField.getValue() != null) {
ArrayNode allowedGboAgeProfileIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(allowedGboAgeProfile -> {
allowedGboAgeProfileIds.add(allowedGboAgeProfile.get("gboAgeProfileId").asLong());
});
((ObjectNode)newJsonNode).putArray("allowedGboAgeProfileIds").addAll(allowedGboAgeProfileIds);
} else {
((ObjectNode)newJsonNode).putRawValue("allowedGboAgeProfileIds", null);
}
}
case "tokenTypes" -> {
LOGGER.info("Rewriting tokenTypes to tokenTypeIds...");
if (jsonField.getValue() != null) {
ArrayNode tokenTypeIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(tokenType -> {
tokenTypeIds.add(tokenType.get("tokenTypeId").asLong());
});
((ObjectNode)newJsonNode).putArray("tokenTypeIds").addAll(tokenTypeIds);
} else {
((ObjectNode)newJsonNode).putRawValue("tokenTypeIds", null);
}
}
case "mandatoryCustomerDataItems" -> {
LOGGER.info("Rewriting mandatoryCustomerDataItems to mandatoryCustomerDataItemIds...");
if (jsonField.getValue() != null) {
ArrayNode mandatoryCustomerDataItemIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(mandatoryCustomerDataItem -> {
mandatoryCustomerDataItemIds.add(mandatoryCustomerDataItem.get("mandatoryCustomerDataItemId").asLong());
});
((ObjectNode)newJsonNode).putArray("mandatoryCustomerDataItemIds").addAll(mandatoryCustomerDataItemIds);
} else {
((ObjectNode)newJsonNode).putRawValue("mandatoryCustomerDataItemIds", null);
}
}
case "requiredGboPersonalAttributes" -> {
LOGGER.info("Rewriting requiredGboPersonalAttributes to requiredGboPersonalAttributeIds...");
if (jsonField.getValue() != null) {
ArrayNode requiredGboPersonalAttributeIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(requiredGboPersonalAttribute -> {
requiredGboPersonalAttributeIds.add(
requiredGboPersonalAttribute.get("requiredGboPersonalAttributeId").asLong());
});
((ObjectNode)newJsonNode).putArray("requiredGboPersonalAttributeIds").addAll(requiredGboPersonalAttributeIds);
} else {
((ObjectNode)newJsonNode).putRawValue("requiredGboPersonalAttributeIds", null);
}
}
case "serviceOptions" -> {
LOGGER.info("Rewriting serviceOptions to serviceOptionIds...");
if (jsonField.getValue() != null) {
ArrayNode serviceOptionIds = new ArrayNode(new JsonNodeFactory(true));
((ArrayNode)jsonField.getValue()).elements().forEachRemaining(serviceOption -> {
serviceOptionIds.add(serviceOption.get("serviceOptionId").asLong());
});
((ObjectNode)newJsonNode).putArray("serviceOptionIds").addAll(serviceOptionIds);
} else {
((ObjectNode)newJsonNode).putRawValue("serviceOptionIds", null);
}
}
case "incompatibleProducts" -> {
LOGGER.info("Rewriting incompatibleProducts to remove product names...");
if (jsonField.getValue() != null) {
ArrayNode incompatibleProducts = ((ArrayNode)jsonField.getValue()).deepCopy();
incompatibleProducts.elements().forEachRemaining(incompatibleProduct -> {
((ObjectNode)incompatibleProduct).remove("productName");
});
((ObjectNode)newJsonNode).putArray("incompatibleProducts").addAll(incompatibleProducts);
} else {
((ObjectNode)newJsonNode).putRawValue("incompatibleProducts", null);
}
}
case "requiredProducts" -> {
LOGGER.info("Rewriting requiredProducts to remove product names...");
if (jsonField.getValue() != null) {
ArrayNode requiredProducts = ((ArrayNode)jsonField.getValue()).deepCopy();
requiredProducts.elements().forEachRemaining(requiredProduct -> {
((ObjectNode)requiredProduct).remove("productName");
});
((ObjectNode)newJsonNode).putArray("requiredProducts").addAll(requiredProducts);
} else {
((ObjectNode)newJsonNode).putRawValue("requiredProducts", null);
}
}
case "sellingPeriods" -> {
if (jsonField.getValue() != null) {
LOGGER.info("Rewriting salesTouchpoint in sellingPeriods to salesTouchpointId...");
ArrayNode sellingPeriods = ((ArrayNode)jsonField.getValue()).deepCopy();
sellingPeriods.elements().forEachRemaining(sellingPeriod -> {
Long salesTouchpointId = sellingPeriod.get("salesTouchpoint").get("salesTouchpointId").asLong();
((ObjectNode)sellingPeriod).put("salesTouchpointId", salesTouchpointId);
((ObjectNode)sellingPeriod).remove("salesTouchpoint");
if (sellingPeriod.get("forbiddenPaymentMethods") != null) {
LOGGER.info("Rewriting forbiddenPaymentMethods to forbiddenPaymentMethodIds...");
ArrayNode forbiddenPaymentMethodIds = new ArrayNode(new JsonNodeFactory(true));
sellingPeriod.get("forbiddenPaymentMethods").elements().forEachRemaining(forbiddenPaymentMethod -> {
forbiddenPaymentMethodIds.add(forbiddenPaymentMethod.get("forbiddenPaymentMethodId").asLong());
});
((ObjectNode)sellingPeriod).remove("forbiddenPaymentMethods");
if (!forbiddenPaymentMethodIds.isEmpty()) {
((ObjectNode)sellingPeriod).putArray("forbiddenPaymentMethodIds").addAll(forbiddenPaymentMethodIds);
} else {
((ObjectNode)sellingPeriod).putRawValue("forbiddenPaymentMethodIds", null);
}
}
if (!sellingPeriod.get("sellingPrices").isNull()) {
LOGGER.info("Deep-copying sellingPrices...");
ArrayNode sellingPrices = ((ArrayNode)sellingPeriod.get("sellingPrices")).deepCopy();
((ObjectNode)sellingPeriod).remove("sellingPrices");
if (!sellingPrices.isEmpty()) {
((ObjectNode)sellingPeriod).putArray("sellingPrices").addAll(sellingPrices);
} else {
((ObjectNode)sellingPeriod).putRawValue("sellingPrices", null);
}
}
});
((ObjectNode)newJsonNode).putArray("sellingPeriods").addAll(sellingPeriods);
} else {
((ObjectNode)newJsonNode).putRawValue("sellingPeriods", null);
}
}
case "purchasePrices" -> {
LOGGER.info("Deep-copying purchasePrices...");
if (!jsonField.getValue().isNull()) {
ArrayNode purchasePrices = ((ArrayNode)jsonField.getValue()).deepCopy();
((ObjectNode)newJsonNode).putArray("purchasePrices").addAll(purchasePrices);
} else {
((ObjectNode)newJsonNode).putRawValue("purchasePrices", null);
}
}
}
}
}

View File

@ -1,202 +0,0 @@
{
"productId": 251,
"fikoArticleNumber": null,
"parentProductId": null,
"gboPackageTemplateId": "30901",
"tapConnectProductCode": null,
"productName": "MaxTestPOST-21-okt-test-1 edited PUT",
"productDescription": "21-okt-test-1 edited PUT - reis met 90% korting gedurende de eerste F&F pilot!",
"validityPeriod": null,
"productTranslations": null,
"productOwner": {
"productOwnerId": 1,
"name": "Corneel Verstoep",
"organization": "HTM"
},
"marketSegments": null,
"customerSegments": null,
"allowedGboAgeProfiles": null,
"productCategory": {
"productCategoryId": 9,
"isTravelProduct": true,
"name": "Kortingsabonnement"
},
"requiredCustomerLevel": {
"requiredCustomerLevelId": 1,
"name": "guest"
},
"requiredProducts": null,
"incompatibleProducts": null,
"mandatoryCustomerDataItems": [
{
"mandatoryCustomerDataItemId": 4,
"customerDataItem": "emailAddress"
},
{
"mandatoryCustomerDataItemId": 5,
"customerDataItem": "address"
}
],
"requiredGboPersonalAttributes": [
{
"requiredGboPersonalAttributeId": 1,
"name": "NAME"
},
{
"requiredGboPersonalAttributeId": 2,
"name": "BIRTHDATE"
},
{
"requiredGboPersonalAttributeId": 3,
"name": "PHOTO"
}
],
"tokenTypes": [
{
"tokenTypeId": 1,
"name": "EMV"
}
],
"paymentMoment": {
"paymentMomentId": 1,
"name": "prepaid"
},
"serviceOptions": null,
"validityDuration": "P7D",
"maxStartInFutureDuration": "P6W",
"isRenewable": false,
"sendInvoice": false,
"imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg",
"productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina",
"termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina",
"isSellableAtHtm": true,
"needsSolvencyCheckConsumer": false,
"needsSolvencyCheckBusiness": false,
"sellingPeriods": [
{
"sellingPeriodId": 240,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"salesTouchpoint": {
"salesTouchpointId": 6,
"name": "Service-engine",
"isActive": true,
"retailer": {
"retailerId": 1000,
"name": "HTM intern beheer",
"street": "Koningin Julianaplein",
"number": 10,
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002",
"taxId": null,
"imageReference": "https://www.htm.nl/typo3conf/ext/htm_template/Resources/Public/img/logo.svg"
}
},
"forbiddenPaymentMethods": null,
"sellingPrices": [
{
"sellingPriceId": 318,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 94,
"amountInclTax": 100,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-18T23:59:59.000+00:00",
"internalPrice": 92.0000
},
{
"sellingPriceId": 319,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 98,
"amountInclTax": 102,
"fromInclusive": "2024-12-19T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"internalPrice": 0.0000
}
]
},
{
"sellingPeriodId": 241,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"salesTouchpoint": {
"salesTouchpointId": 5,
"name": "Servicewinkel (Team Incident Masters)",
"isActive": true,
"retailer": {
"retailerId": 1001,
"name": "HTM externe touchpoints",
"street": "Koningin Julianaplein",
"number": 10,
"numberAddition": null,
"postalCode": "2595 AA",
"city": "Den Haag",
"country": "Nederland",
"emailAddress": "info@htm.nl",
"phoneNumber": "070 374 9002",
"taxId": null,
"imageReference": "https://www.htm.nl/typo3conf/ext/htm_template/Resources/Public/img/logo.svg"
}
},
"forbiddenPaymentMethods": [
{
"forbiddenPaymentMethodId": 2,
"name": "creditcard",
"issuer": "Visa"
}
],
"sellingPrices": [
{
"sellingPriceId": 320,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 94,
"amountInclTax": 100,
"fromInclusive": "2024-09-06T00:00:00.000+00:00",
"toInclusive": "2024-12-18T23:59:59.000+00:00",
"internalPrice": 92.0000
},
{
"sellingPriceId": 321,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 98,
"amountInclTax": 102,
"fromInclusive": "2024-12-19T00:00:00.000+00:00",
"toInclusive": "2024-12-29T23:59:59.000+00:00",
"internalPrice": 0.0000
}
]
}
],
"purchasePrices": [
{
"purchasePriceId": 184,
"taxCode": "V21",
"taxPercentage": 21.0000,
"amountExclTax": 0,
"amountInclTax": 0,
"fromInclusive": "2024-09-01T00:00:00.000+00:00",
"toInclusive": "2024-12-31T23:59:59.000+00:00"
}
],
"auditTrail": [
{
"auditTrailId": 228,
"action": "update",
"user": "api",
"timestamp": "2024-10-21T09:00:30.410+00:00"
},
{
"auditTrailId": 227,
"action": "insert",
"user": "api",
"timestamp": "2024-10-21T08:58:39.237+00:00"
}
]
}

View File

@ -1,17 +0,0 @@
<Configuration status="INFO">
<Appenders>
<Console name="STDOUT-COLOR">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} | %highlight{%-5level} | %cyan{%-28c{1}} - %msg %blue{[%t]}%n"
disableAnsi="false"/>
</Console>
<Console name="STDOUT-NOCOLOR">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %-28c{1} - %msg [%t]%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="STDOUT-NOCOLOR"/>
</Root>
</Loggers>
</Configuration>

View File

@ -1,482 +0,0 @@
openapi: 3.0.1
info:
title: Personal Account Data (PAD) APIs for touchpoints and Service Engine
description: |-
APIs for touchpoints and Service Engine to manage Personal Account Data (PAD) on OVpay tokens (xTATs).\
These APIs connect directly to the PADP APIs in GBO APIM and are implemented in Logic Apps
in the Integration Layer.
version: '1.0'
servers:
- url: https://api.integratielaag.nl/abt/touchpoint/1.0
tags:
- name: Personal Data APIs for touchpoints
description: Personal Data APIs for touchpoints, no Service Engine in between!
- name: Personal Data APIs for Service Engine
description: Personal Data APIs for Service Engine, not to be exposed to touchpoints!
paths:
/personal-data/{xtat}:
post:
tags:
- Personal Data APIs for touchpoints
summary: Add the supplied Personal Data to the given xTAT (that should not contain any Personal Data yet).
description: |-
- The given xTAT should not contain any Personal Data yet (the PATCH endpoint should be used in that case) - if the given xTAT already contains Personal Data, an error is thrown;
- The given e-mail address will be used for future OTP challenges to manage the Personal Data in the future - this e-mail adress should therefore be validated;
- If the e-mail address is not yet validated by other means (e.g. the e-mail address is used for login, or is entered twice to prevent typos), an OTP challenge for the e-mail address should be triggered and supplied to this endpoint;
- xTAT and e-mail address are always required, for the Personal Data it is allowed to supply any subset, or all three data attributes;
- Each of the three data attributes is validated - for the requirements per attribute, see the descriptions in the request details below;
- If any attribute fails validation, none of the attributes will be added to the xTAT.
operationId: CreatePersonalData
parameters:
- name: xtat
in: path
required: true
example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d'
schema:
type: string
format: uuid
requestBody:
content:
multipart/form-data:
schema:
type: object
required:
- email
properties:
email:
type: string
format: email
description: Email address to be used for OTP challenges to prove ownership and manage the Personal Data in the future
example: 8Z9dG@example.com
otp:
type: string
pattern: ^[0-9]{6}$
description: OTP is optional, should be supplied if the e-mail address is not yet validated by other means (e.g. the e-mail address is used for login, or is entered twice to prevent typo's)
example: "053395"
name:
type: string
description: Should consist of at least two words (first name and last name)
example: John Doe
birthDate:
type: string
format: date
description: Should be a date between 1900-01-01 and today, in the format `YYYY-MM-DD`
example: 2000-01-01
photo:
type: string
description: Should be a JPG image, with a filesize of max. 512KB and resolution between 520x520 and 720x720 pixels
format: binary
encoding:
photo:
contentType: image/jpeg
responses:
'201':
description: Created
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
get:
tags:
- Personal Data APIs for touchpoints
summary: Retrieve the decrypted Personal Data for the given xTAT, using the OTP for verification of ownership.
description: OTP challenge is required to retrieve the Personal Data.
operationId: GetDecryptedPersonalData
parameters:
- name: xtat
in: path
required: true
schema:
type: string
format: uuid
example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d'
- name: otp
in: query
required: true
description: OTP challenge code that the token owner received in their e-mail inbox. OTP is always required for managing existing Personal Data.
schema:
type: string
pattern: ^[0-9]{6}$
example: "053395"
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/DecryptedPersonalData'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
patch:
tags:
- Personal Data APIs for touchpoints
summary: Update the supplied personal data for the given xTAT, using the OTP for verification of ownership.
description: This is a PATCH call, so only the personal data that the user desires to change need to be supplied. Integration layer supplements with any other existing personal data to be able to call GBO (PUT call).
operationId: UpdatePersonalData
parameters:
- name: xtat
in: path
required: true
schema:
type: string
format: uuid
example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d'
requestBody:
content:
multipart/form-data:
schema:
type: object
required:
- otp
properties:
otp:
type: string
pattern: ^[0-9]{6}$
description: OTP challenge code that the token owner received in their e-mail inbox. OTP is always required for managing existing Personal Data.
example: "053395"
name:
type: string
description: Should consist of at least two words (first name and last name)
example: John Doe
birthDate:
type: string
format: date
description: Should be a date between 1900-01-01 and today, in the format `YYYY-MM-DD`
example: 2000-01-01
photo:
type: string
description: Should be a JPG image, with a filesize of max. 512KB and resolution between 520x520 and 720x720 pixels
format: binary
encoding:
photo:
contentType: image/jpeg
responses:
'200':
description: OK
/personal-data/generate-otp:
get:
tags:
- Personal Data APIs for touchpoints
summary: Trigger OTP email for the given xTAT or e-mail address, to prove ownership
operationId: GenerateOtp
description: |-
Generate an OTP challenge e-mail to prove ownership of the given e-mail address or xTAT.\
Only one type of parameter can be supplied, either xtat or email. When both are supplied, an error is thrown.
parameters:
- name: xtat
in: query
required: false
schema:
type: string
format: uuid
example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d'
- name: email
in: query
required: false
schema:
type: string
format: email
example: 'sV4yj@example.com'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/OtpResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/personal-data/{xtat}/administrative-data:
get:
tags:
- Personal Data APIs for Service Engine
summary: API 1211 - Get Administrative Data
description: Integration Layer utilizes PAD management V2 in GBO APIM (`/pad-management/v2/..`)
operationId: GetAdministrativeData
parameters:
- name: xtat
description: xTAT to get administrative data for
in: path
required: true
schema:
type: string
format: uuid
example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d'
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/AdministrativeData"
examples:
Valid and complete PAD:
summary: Valid and complete PAD
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Partially filled PAD (no photo):
summary: Partially filled PAD (no photo)
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo: null
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Flagged PAD:
summary: Flagged PAD
value:
name:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid name"
inaccuracyFlagCounter: 1
changeCounter: 1
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid photo"
inaccuracyFlagCounter: 1
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid birthdate"
inaccuracyFlagCounter: 1
changeCounter: 2
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Invalid UUID:
summary: Invalid UUID
value:
errors:
code: "0x03000103"
data: [
"geen-uuid"
]
message: "The provided scTat is not a valid UUID"
exceptionClassName: "PadpConstraintViolationException"
exceptionStackTrace: "not available because debug mode is turned off"
"404":
description: Not Found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
No PAD found for xTAT:
summary: No PAD found for xTAT
value:
errors:
code: "0x03000105"
data: []
message: "Transit account not found"
exceptionClassName: "PadpEntityNotFoundException"
exceptionStackTrace: "not available because debug mode is turned off"
"500":
description: Internal Server Error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unknown xTAT:
summary: Unknown xTAT
value:
errors:
code: "0x00000001"
data: null
message: "400 : \"{\"errorMessage\":{\"referenceId\":\"076f0de4-df33-42a3-add0-def971ab6679\",\"message\":\"Unknown external transit account token.\"},\"businessExceptions\":[{\"code\":\"TM0207\",\"message\":\"Unknown external transit account token.\"}]}\""
exceptionClassName: "BadRequest"
exceptionStackTrace: "not available because debug mode is turned off"
components:
schemas:
AdministrativeData:
type: object
properties:
name:
$ref: '#/components/schemas/AdministrativeDataElement'
photo:
$ref: '#/components/schemas/AdministrativeDataElement'
birthdate:
$ref: '#/components/schemas/AdministrativeDataElement'
additionalProperties: false
AdministrativeDataElement:
type: object
properties:
inaccuracyFlag:
type: boolean
inaccuracyFlagReason:
type: string
nullable: true
inaccuracyFlagCounter:
type: integer
format: int32
changeCounter:
type: integer
format: int32
maxUpdatesVerificationCount:
type: integer
format: int32
lastChangeDate:
type: string
format: date-time
isValidated:
type: boolean
additionalProperties: false
DecryptedData:
type: object
properties:
name:
type: string
nullable: true
birthdate:
type: string
nullable: true
photo:
type: string
description: Base64 encoded photo
format: byte
nullable: true
additionalProperties: false
DecryptedPersonalData:
type: object
properties:
decryptedData:
$ref: '#/components/schemas/DecryptedData'
additionalProperties: false
Error:
type: object
properties:
code:
type: string
nullable: true
data:
type: array
items:
type: string
nullable: true
message:
type: string
nullable: true
additionalProperties: false
ErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/Error'
nullable: true
exceptionClassName:
type: string
nullable: true
exceptionStackTrace:
type: string
nullable: true
additionalProperties: false
Metadata:
type: object
properties:
encryptedEphemeralKey:
type: string
nullable: true
additionalProperties: false
OtpResponse:
type: object
properties:
maskedEmailAddress:
type: string
nullable: true
additionalProperties: false

View File

@ -1,477 +0,0 @@
openapi: 3.0.3
info:
title: ABT GBO APIM APIs
description: APIs for calling GBO APIM - internal use only, these are NOT the functional APIs to be used by touchpoints!
version: "1.0"
servers:
- url: https://api.integratielaag.nl/abt/gboapim/1.0
paths:
/pad-management/v2/personal-data/{xtat}/administrative-data:
servers:
- url: https://api.integratielaag.nl/abt/serviceengine
description: APIPRODUCT ABT Service Engine Portal
- url: https://api.integratielaag.nl/abt/gboapim/1.0
description: API ABT GBO APIM
get:
tags:
- API WSO2 - GBO APIM
summary: API 1211 - Get Administrative Data
operationId: ABTPAD-GetAdministrativeData
parameters:
- name: xtat
description: xTAT to get administrative data for
in: path
required: true
schema:
type: string
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/AdministrativeData"
examples:
Valid and complete PAD:
summary: Valid and complete PAD
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Partially filled PAD (no photo):
summary: Partially filled PAD (no photo)
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo: null
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Flagged PAD:
summary: Flagged PAD
value:
name:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid name"
inaccuracyFlagCounter: 1
changeCounter: 1
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid photo"
inaccuracyFlagCounter: 1
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid birthdate"
inaccuracyFlagCounter: 1
changeCounter: 2
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Invalid UUID:
summary: Invalid UUID
value:
errors:
code: "0x03000103"
data: [
"geen-uuid"
]
message: "The provided scTat is not a valid UUID"
exceptionClassName: "PadpConstraintViolationException"
exceptionStackTrace: "not available because debug mode is turned off"
"404":
description: Not Found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
No PAD found for xTAT:
summary: No PAD found for xTAT
value:
errors:
code: "0x03000105"
data: []
message: "Transit account not found"
exceptionClassName: "PadpEntityNotFoundException"
exceptionStackTrace: "not available because debug mode is turned off"
"500":
description: Internal Server Error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unknown xTAT:
summary: Unknown xTAT
value:
errors:
code: "0x00000001"
data: null
message: "400 : \"{\"errorMessage\":{\"referenceId\":\"076f0de4-df33-42a3-add0-def971ab6679\",\"message\":\"Unknown external transit account token.\"},\"businessExceptions\":[{\"code\":\"TM0207\",\"message\":\"Unknown external transit account token.\"}]}\""
exceptionClassName: "BadRequest"
exceptionStackTrace: "not available because debug mode is turned off"
/internal/b2b-client-authentication/v1/token/idp/b2b-access-token:
servers:
- url: https://only-for-internal-use.com
get:
tags:
- Internal DHIL use only - Raw GBO APIM
summary: API 1020 - Get B2B Access Token
description: Returns a client access token, needed for most other PADP APIs.
operationId: GetB2bAccessToken
parameters:
- name: APIKey
description: B2B IDP APIM Product API Key
in: header
required: true
schema:
type: string
- name: grant_type
description: A grant_type IS A string THAT defines the method which is used by client to request Access Token. grant_type = client_credentials - is used for M2M communication
in: query
required: true
example: client_credentials
schema:
type: string
- name: client_id
description: A client_id IS A string THAT is a unique identifier of the client application
in: query
required: true
schema:
type: string
- name: client_secret
description: A client_secret IS A unique identifier THAT is issued by IDP server on client registertraion and known only to Client and IDP server
in: query
required: true
schema:
type: string
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/B2bAccessToken"
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"404":
description: Not Found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"500":
description: Internal Server Error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/internal/pad-management/v2/personal-data/{xtat}/administrative-data:
servers:
- url: https://only-for-internal-use.com
get:
tags:
- Internal DHIL use only - Raw GBO APIM
summary: API 1211 - Get Administrative Data
operationId: InternalGBOAPIM-GetAdministrativeData
parameters:
- name: xtat
description: xTAT to get administrative data for
in: path
required: true
schema:
type: string
- name: APIKey
description: PADP APIM Product API Key
in: header
required: true
schema:
type: string
- name: Authorization
description: B2B Client Access Token, without the 'Bearer ' prefix
in: header
required: true
schema:
type: string
- name: requestId
description: A unique identifier for the request
in: header
required: true
schema:
type: string
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/AdministrativeData"
examples:
Valid and complete PAD:
summary: Valid and complete PAD
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Partially filled PAD (no photo):
summary: Partially filled PAD (no photo)
value:
name:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo: null
birthdate:
inaccuracyFlag: false
inaccuracyFlagReason: null
inaccuracyFlagCounter: 0
changeCounter: 0
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
Flagged PAD:
summary: Flagged PAD
value:
name:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid name"
inaccuracyFlagCounter: 1
changeCounter: 1
maxUpdatesVerificationCount: 1
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
photo:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid photo"
inaccuracyFlagCounter: 1
changeCounter: 0
maxUpdatesVerificationCount: 5
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
birthdate:
inaccuracyFlag: true
inaccuracyFlagReason: "Invalid birthdate"
inaccuracyFlagCounter: 1
changeCounter: 2
maxUpdatesVerificationCount: 3
lastChangeDate: "2025-03-26T10:18:42.947"
isValidated: false
"400":
description: Bad Request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Invalid UUID:
summary: Invalid UUID
value:
errors:
code: "0x03000103"
data: [
"geen-uuid"
]
message: "The provided scTat is not a valid UUID"
exceptionClassName: "PadpConstraintViolationException"
exceptionStackTrace: "not available because debug mode is turned off"
"404":
description: Not Found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
No PAD found for xTAT:
summary: No PAD found for xTAT
value:
errors:
code: "0x03000105"
data: []
message: "Transit account not found"
exceptionClassName: "PadpEntityNotFoundException"
exceptionStackTrace: "not available because debug mode is turned off"
"500":
description: Internal Server Error
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
Unknown xTAT:
summary: Unknown xTAT
value:
errors:
code: "0x00000001"
data: null
message: "400 : \"{\"errorMessage\":{\"referenceId\":\"076f0de4-df33-42a3-add0-def971ab6679\",\"message\":\"Unknown external transit account token.\"},\"businessExceptions\":[{\"code\":\"TM0207\",\"message\":\"Unknown external transit account token.\"}]}\""
exceptionClassName: "BadRequest"
exceptionStackTrace: "not available because debug mode is turned off"
components:
schemas:
AdministrativeData:
type: object
properties:
name:
$ref: "#/components/schemas/AdministrativeData_AdministrativeDataElement"
photo:
$ref: "#/components/schemas/AdministrativeData_AdministrativeDataElement"
birthdate:
$ref: "#/components/schemas/AdministrativeData_AdministrativeDataElement"
additionalProperties: false
AdministrativeData_AdministrativeDataElement:
type: object
properties:
inaccuracyFlag:
type: boolean
inaccuracyFlagReason:
type: string
nullable: true
inaccuracyFlagCounter:
type: integer
format: int32
changeCounter:
type: integer
format: int32
maxUpdatesVerificationCount:
type: integer
format: int32
lastChangeDate:
type: string
format: date-time
isValidated:
type: boolean
additionalProperties: false
B2bAccessToken:
type: object
properties:
access_token:
type: string
nullable: true
expires_in:
type: integer
format: int32
refresh_expires_in:
type: integer
format: int32
refresh_token:
type: string
nullable: true
token_type:
type: string
nullable: true
not-before-policy:
type: integer
format: int32
scope:
type: string
nullable: true
BE_ID:
type: string
nullable: true
additionalProperties: false
ErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: "#/components/schemas/ErrorResponse_Error"
nullable: true
exceptionClassName:
type: string
nullable: true
exceptionStackTrace:
type: string
nullable: true
additionalProperties: false
ErrorResponse_Error:
type: object
properties:
code:
type: string
nullable: true
data:
type: array
items:
type: string
nullable: true
message:
type: string
nullable: true
additionalProperties: false

View File

@ -1,268 +0,0 @@
openapi: 3.0.1
info:
title: ClaimsAPI
version: '1.0'
servers:
- url: https://services.acc.api.htm.nl/chipkaart/1.0
- url: http://services.acc.api.htm.nl/chipkaart/1.0
security:
- default: []
tags:
- name: Claims
paths:
/claims:
post:
tags:
- Claims
summary: Create a claim
description: >
Create a claim by sending a JSON as specified in the schema. By
specifying the chipcardnumber under 'chipkaart',
a claim for OV chipcard will be send to the OVC API. If no
chipcardnumber is specified under 'chipkaart', a claim for EMV is send
to mendix.
parameters: []
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/claimsEntity'
examples:
OVCK:
value:
aankomsthalte: '1'
instapdatum: '2024-03-06T15:20:44.549Z'
instaptijd: '2024-03-06T15:20:44.549Z'
ingecheckt: true
uitgecheckt: true
chipkaart: '1234123412341234'
afgeschrevenbedrag: 0
vertrekhalte: string
korting: true
iban: '1234123412341234'
naam: string
emailadres: user@example.com
uitstaptijd: '2024-03-06T15:20:44.549Z'
verwachtbedrag: 0
toelichting: string
lijn: '1'
vervoertype: '1'
serviceRefId: '1'
Totaalbedrag: 0
EMV:
value:
aankomsthalte: '1'
instapdatum: '2024-03-06T15:20:44.549Z'
instaptijd: '2024-03-06T15:20:44.549Z'
ingecheckt: true
uitgecheckt: true
afgeschrevenbedrag: 0
vertrekhalte: string
korting: true
iban: '1234123412341234'
naam: string
emailadres: user@example.com
uitstaptijd: '2024-03-06T15:20:44.549Z'
verwachtbedrag: 0
toelichting: string
lijn: '1'
vervoertype: '1'
serviceRefId: '1'
Totaalbedrag: 0
responses:
'200':
description: ok
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/500Response'
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/refunds:
post:
tags:
- Claims
summary: Create a refund request
description: Create a refund request by sending a JSON as specified in the schema. Either a serviceReferenceId or ovPasNumber should be present in order to fulfill the refund request.
parameters: []
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/refundsEntity'
examples:
EMV:
value:
emailAddress: 'j.beek@htm.nl'
orderNumber: 'ORD1000046'
serviceReferenceId: 'NLOVA5BCD124H3Z21X'
amount: 2305
iban: 'NL98INGB0003856625'
orderDate: '2025-01-13'
productName: 'HTM 20% korting'
OVpas:
value:
emailAddress: 'j.beek@htm.nl'
orderNumber: 'ORD1000046'
ovpasNumber: '63AW974'
iban: 'NL98INGB0003856625'
orderDate: '2025-01-13'
productName: 'HTM 20% korting'
responses:
'201':
description: Created
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/500Response'
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
components:
schemas:
claimsEntity:
required:
- Totaalbedrag
- aankomsthalte
- afgeschrevenbedrag
- emailadres
- instapdatum
- instaptijd
- korting
- lijn
- serviceRefId
- toelichting
- uitgecheckt
- vertrekhalte
- vervoertype
- verwachtbedrag
type: object
properties:
aankomsthalte:
type: string
instapdatum:
type: string
format: date-time
instaptijd:
type: string
format: date-time
ingecheckt:
type: boolean
uitgecheckt:
type: boolean
chipkaart:
type: string
afgeschrevenbedrag:
type: number
format: float
vertrekhalte:
type: string
korting:
type: boolean
iban:
type: string
description: String of length between 15 en 32 characters
example: '1234123412341234'
naam:
type: string
emailadres:
type: string
format: email
uitstaptijd:
type: string
format: date-time
verwachtbedrag:
type: number
format: float
toelichting:
type: string
lijn:
type: string
vervoertype:
type: string
serviceRefId:
type: string
Totaalbedrag:
type: number
format: float
refundsEntity:
required:
- emailAddress
- iban
type: object
properties:
emailAddress:
type: string
format: email
example: j.beek@htm.nl
orderNumber:
type: string
example: ORD1000046
serviceReferenceId:
type: string
example: NLOVA5BCD124H3Z21X
amount:
type: integer
example: 12305
ovpasNumber:
type: string
example: 63AW974
iban:
type: string
example: NL00RABO000001337
orderDate:
type: string
format: date
example: 2025-01-13
productName:
type: string
example: HTM 20% korting
401Response:
type: object
properties:
code:
type: string
example: '900901'
type:
type: string
message:
type: string
example: Invalid Credentials
description:
type: string
example: >-
Invalid Credentials. Make sure you have provided the correct
security credentials
500Response:
type: object
properties:
error:
type: string
example: error while connecting to backend
securitySchemes:
default:
type: oauth2
flows:
implicit:
authorizationUrl: https://services.acc.api.htm.nl/authorize
scopes: {}

View File

@ -213,19 +213,6 @@ paths:
"updated": "2024-06-02 15:01:00.000", "updated": "2024-06-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{
"accountingStatusId": 1,
"name": "open",
},
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
{ {
"contractInvoiceId": "1c345237-4d84-47f0-93c2-7b94338e3355", "contractInvoiceId": "1c345237-4d84-47f0-93c2-7b94338e3355",
@ -235,19 +222,6 @@ paths:
"updated": "2024-07-02 15:01:00.000", "updated": "2024-07-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "1e95b854-0094-42a4-9268-c16353fb72a8",
"accountingStatus":
{
"accountingStatusId": 1,
"name": "open",
},
"createdOn": "2024-07-02 15:01:00.000",
"description": null,
},
],
}, },
], ],
"contractVersions": "contractVersions":
@ -297,19 +271,6 @@ paths:
"updated": "2024-06-02 15:01:00.000", "updated": "2024-06-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{
"accountingStatusId": 1,
"name": "open",
},
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
{ {
"contractInvoiceId": "1c345237-4d84-47f0-93c2-7b94338e3355", "contractInvoiceId": "1c345237-4d84-47f0-93c2-7b94338e3355",
@ -319,19 +280,6 @@ paths:
"updated": "2024-07-02 15:01:00.000", "updated": "2024-07-02 15:01:00.000",
"state": "invoice_created", "state": "invoice_created",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "1e95b854-0094-42a4-9268-c16353fb72a8",
"accountingStatus":
{
"accountingStatusId": 1,
"name": "open",
},
"createdOn": "2024-07-02 15:01:00.000",
"description": null,
},
],
}, },
], ],
"contractVersions": "contractVersions":
@ -452,16 +400,6 @@ paths:
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
], ],
}, },
@ -521,7 +459,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/InvoiceAccountingStatus" $ref: "#/components/schemas/ContractVersion"
example: example:
{ {
"contractVersion": "contractVersion":
@ -629,16 +567,6 @@ paths:
"state": "invoice_sent", "state": "invoice_sent",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
{ {
"contractInvoiceId": "dadff658-4ff5-4eb8-b516-492f1f6c6245", "contractInvoiceId": "dadff658-4ff5-4eb8-b516-492f1f6c6245",
@ -649,16 +577,6 @@ paths:
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "84af0f01-0416-4860-851a-a0d4b3cf674a",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
], ],
} }
@ -683,15 +601,6 @@ paths:
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": 1,
"createdOn",
"2024-07-02 15:01:00.000",
"description": null,
},
],
}, },
} }
responses: responses:
@ -715,14 +624,6 @@ paths:
tags: tags:
- ContractInvoice - ContractInvoice
parameters: parameters:
- in: query
name: contractInvoiceId
schema:
type: string
format: uuid
example: 8699d72a-cf4d-4e6b-9e9c-549d837ca51f
required: false
description: Id of the contract invoice to fetch.
- in: query - in: query
name: contractId name: contractId
schema: schema:
@ -812,16 +713,6 @@ paths:
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
}, },
{ {
"contractId": "a7452e22-3894-40cc-87d6-869370a92277", "contractId": "a7452e22-3894-40cc-87d6-869370a92277",
@ -833,16 +724,6 @@ paths:
"state": "invoice_created", "state": "invoice_created",
"data": "{json}", "data": "{json}",
"isCredit": false, "isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "84af0f01-0416-4860-851a-a0d4b3cf674a",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-08-02 15:01:00.000",
"description": null,
},
],
}, },
], ],
} }
@ -889,43 +770,6 @@ paths:
"contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f", "contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f",
}, },
} }
/contractinvoices/{contractInvoiceId}/invoiceaccountingstatuses:
parameters:
- in: path
name: contractInvoiceId
schema:
type: string
format: uuid
example: d1dd439b-6072-4b97-89c9-724268865b93
required: true
description: The id of the ContractInvoice, formatted as UUID.
post:
summary: Add a new invoice accounting status to a contract invoice.
description: Add a new invoice accounting status to a contract invoice.
tags:
- ContractInvoice
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ContractInvoice"
example:
{
"accountingStatusId": 1,
"createdOn": "2024-07-02 15:01:00.000",
"description": null,
}
responses:
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/ContractInvoice"
example:
{
"invoiceAccountingStatusId": "a6836364-4812-4960-9226-69deb2e2b903",
}
/contracts/{contractId}/contractactions: /contracts/{contractId}/contractactions:
parameters: parameters:
- in: path - in: path
@ -1216,37 +1060,6 @@ components:
isCredit: isCredit:
type: boolean type: boolean
example: false example: false
InvoiceAccountingStatus:
type: object
properties:
invoiceAccountingStatusId:
type: string
format: uuid
example: 6b6f0f5e-5d3f-4a6d-8e7d-6a7d0f9e6c5b
contractInvoiceId:
type: string
format: uuid
example: 8699d72a-cf4d-4e6b-9e9c-549d837ca51f
accountingStatus:
type: object
$ref: "#/components/schemas/AccountingStatus"
createdOn:
type: string
format: date-time
example: 2024-07-02 15:01:00.000
description:
type: string
example: Open
AccountingStatus:
type: object
properties:
accountingStatusId:
type: integer
example: 1
name:
type: string
enum: [open, sent, received, rejected]
example: open
ContractStatus: ContractStatus:
type: object type: object
properties: properties:
@ -1255,16 +1068,7 @@ components:
example: 2 example: 2
name: name:
type: string type: string
enum: enum: [new, active, suspended, cancelled, terminated, pending cancellation, pending termination]
[
new,
active,
suspended,
cancelled,
terminated,
pending cancellation,
pending termination,
]
example: active example: active
ActionType: ActionType:
type: object type: object

View File

@ -4,7 +4,7 @@ info:
version: "1.0" version: "1.0"
description: Service Engine APIs for ABT Contracts v2. These are NOT the CRUD APIs to the data hub. description: Service Engine APIs for ABT Contracts v2. These are NOT the CRUD APIs to the data hub.
servers: servers:
- url: https://api.integratielaag.nl/abt/touchpoint/1.0 - url: https://api.integratielaag.nl/v1
paths: paths:
/customers/contracts: /customers/contracts:
parameters: parameters:
@ -27,13 +27,7 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
List all contracts for a single customer profile:
summary: List all contracts for a single customer profile
description: |
List all contracts for single customer profile with customer
number 'D123456'.
value:
[ [
{ {
"contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2", "contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2",
@ -50,15 +44,6 @@ paths:
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01 15:01:00.000",
"ovPayTokenId": 1337,
"_links":
{
"get_token":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPayTokenId=1337",
"method": "GET",
},
},
}, },
{ {
"contractId": "f07253e6-c364-474c-a342-a10a4a7cf305", "contractId": "f07253e6-c364-474c-a342-a10a4a7cf305",
@ -67,23 +52,13 @@ paths:
"orderId": "945d43e6-516e-425b-8847-9aba41289acd", "orderId": "945d43e6-516e-425b-8847-9aba41289acd",
"orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8", "orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8",
"touchpointId": 2, "touchpointId": 2,
"contractStatus": "contractStatus": { "contractStatusId": 1, "name": "new" },
{ "contractStatusId": 1, "name": "new" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000", "created": "2024-08-01 15:01:00.000",
"ovPayTokenId": 1338,
"_links":
{
"get_token":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPayTokenId=1338",
"method": "GET",
},
},
}, },
] ]
/customers/contracts/{contractId}: /customers/contracts/{contractId}:
@ -137,13 +112,7 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Full contract details of a single contract:
summary: Full contract details of a single contract
description: |
Full contract details of a single contract with contract
number 'D123456'.
value:
{ {
"contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2", "contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2",
"contractNumber": "D123456", "contractNumber": "D123456",
@ -151,14 +120,12 @@ paths:
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48", "orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8", "orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2, "touchpointId": 2,
"contractStatus": "contractStatus": { "contractStatusId": 2, "name": "active" },
{ "contractStatusId": 2, "name": "active" },
"productId": 1, "productId": 1,
"productName": "HTM Maand 20% korting", "productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D", "termDuration": "P0Y1M0D",
"billingDay": 15, "billingDay": 15,
"highestInvoiceTerm": 1, "highestInvoiceTerm": 1,
"ovPayTokenId": 1337,
"contractVersions": "contractVersions":
[ [
{ {
@ -185,8 +152,7 @@ paths:
[ [
{ {
"contractActionId": "67687851-59dd-4bbc-aa74-0f7abd26c883", "contractActionId": "67687851-59dd-4bbc-aa74-0f7abd26c883",
"actionType": "actionType": { "actionTypeId": 1, "name": "create" },
{ "actionTypeId": 1, "name": "create" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-02 15:01:00.000", "timestamp": "2024-07-02 15:01:00.000",
"details": "Contract created", "details": "Contract created",
@ -194,8 +160,7 @@ paths:
}, },
{ {
"contractActionId": "ea9ad287-9cd3-4e76-bcb9-d71db551cf55", "contractActionId": "ea9ad287-9cd3-4e76-bcb9-d71db551cf55",
"actionType": "actionType": { "actionTypeId": 2, "name": "change" },
{ "actionTypeId": 2, "name": "change" },
"user": "subid123456", "user": "subid123456",
"timestamp": "2024-07-03 15:01:00.000", "timestamp": "2024-07-03 15:01:00.000",
"details": "Contract changed", "details": "Contract changed",
@ -215,14 +180,6 @@ paths:
"isCredit": false, "isCredit": false,
}, },
], ],
"_links":
{
"get_token":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPayTokenId=1337",
"method": "GET",
},
},
} }
/customers/contracts/{contractId}/invoices: /customers/contracts/{contractId}/invoices:
parameters: parameters:
@ -253,13 +210,7 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Get all invoices of a single contract:
summary: Get all invoices of a single contract
description: |
Get all invoices of a single contract with contract number
'D123456'.
value:
[ [
{ {
"contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f", "contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f",
@ -313,18 +264,13 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
All cancellation moments of a term bound contract:
summary: All cancellation moments of a term bound contract
description: |
All cancellation moments of a term bound contract.
value:
{ {
"cancellationMoment": "termBound", "cancellationMoment": "termBound",
"termDuration": "P1M", "termDuration": "P1M",
"billingDay": 18, "billingDay": 18,
"cancellationFrom": "2024-08-10T00:00:00", "cancellationFrom": "2024-08-10T00:00:00",
"cancellationUntil": "2026-08-10T00:00:00", "cancellationUntil": "2026-08-10T00:00:00"
} }
/contracts/{contractId}/cancellationvalidation: /contracts/{contractId}/cancellationvalidation:
parameters: parameters:
@ -354,12 +300,10 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Validate a cancellation of a given end date: {
summary: Validate a cancellation of a given end date "end": "2024-08-10T00:00:00"
description: | }
Validate a cancellation of a given end date.
value: { "end": "2024-08-10T00:00:00" }
responses: responses:
"200": "200":
description: OK description: OK
@ -367,31 +311,13 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Successfully validated cancellation:
summary: Successfully validated cancellation
description: |
Successfully validated a cancellation. The response contains
the refund amount and refund methods.
value:
{ {
"validationResult": true, "validationResult": "true",
"validationMessage": "", "validationMessage": "",
"end": "2024-08-10T03:59:59", "end": "2024-08-10T03:59:59",
"refundAmount": 2489, "refundAmount": "2489",
"refundMethods": ["creditInvoice", "iDeal"], "refundMethods": [ "creditInvoice", "iDeal" ]
}
Unsuccesful validation:
summary: Unsuccesful validation
description: |
Unsuccesful validation. The response contains the error message.
value:
{
"validationResult": false,
"validationMessage": "Cancellation end date not allowed",
"end": null,
"refundAmount": null,
"refundMethods": [],
} }
/contracts/{contractId}/cancellation: /contracts/{contractId}/cancellation:
parameters: parameters:
@ -421,13 +347,11 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Cancellation request for credit invoice: {
summary: Cancellation request for credit invoice "end": "2024-08-10T00:00:00",
description: | "refundMethod": "creditInvoice"
Cancellation request for credit invoice. }
value:
{ "end": "2024-08-10T00:00:00", "refundMethod": "creditInvoice" }
responses: responses:
"200": "200":
description: OK description: OK
@ -435,17 +359,11 @@ paths:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/unavailable" $ref: "#/components/schemas/unavailable"
examples: example:
Successfully cancelled contract:
summary: Successfully cancelled contract
description: |
Successfully cancelled a contract. The response contains
the refund amount and refund method.
value:
{ {
"end": "2024-08-10T03:59:59", "end": "2024-08-10T03:59:59",
"refundAmount": 2489, "refundAmount": "2489",
"refundMethod": "creditInvoice", "refundMethod": "creditInvoice"
} }
components: components:
securitySchemes: securitySchemes:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -45,6 +45,7 @@ paths:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: SIGNED mandateState: SIGNED
updateDirectDebitMandateType: updateDirectDebitMandateType:
@ -55,6 +56,10 @@ paths:
value: value:
directDebitMandate: directDebitMandate:
billingInformationId: 2 billingInformationId: 2
updateMandateAddressId:
value:
directDebitMandate:
mandateAddressId: 3
updateMandateReference: updateMandateReference:
value: value:
directDebitMandate: directDebitMandate:
@ -124,10 +129,17 @@ paths:
updateFullBillingInformation: updateFullBillingInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2
updateIssuerCountry:
value:
billingInformation:
issuerCountry: DE
updateIban: updateIban:
value: value:
billingInformation: billingInformation:
@ -136,6 +148,10 @@ paths:
value: value:
billingInformation: billingInformation:
bic: DEUT bic: DEUT
updateSwift:
value:
billingInformation:
swift: UpdatedSwift
updateAscription: updateAscription:
value: value:
billingInformation: billingInformation:
@ -144,6 +160,10 @@ paths:
value: value:
billingInformation: billingInformation:
alias: Updated Alias alias: Updated Alias
updateBillingAddressId:
value:
billingInformation:
billingAddressId: 3
required: true required: true
responses: responses:
'201': '201':
@ -198,16 +218,21 @@ paths:
fullFinancialInformation: fullFinancialInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2
minimumBillingInformation: minimumBillingInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2
required: true required: true
responses: responses:
'201': '201':
@ -264,12 +289,16 @@ paths:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
minimumdirectDebitMandate: minimumdirectDebitMandate:
value: value:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
required: true required: true
responses: responses:
@ -329,32 +358,38 @@ paths:
customerNumber: 1000003 customerNumber: 1000003
billingInformation: billingInformation:
- billingInformationId: 1 - billingInformationId: 1
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 2
- billingInformationId: 2 - billingInformationId: 2
issuerCountry: BE
iban: '0987654321' iban: '0987654321'
bic: null bic: null
swift: null
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 3
directDebitMandate: directDebitMandate:
- directDebitMandateId: 1 - directDebitMandateId: 1
directDebitMandateTypeName: PIN Transaction directDebitMandateTypeName: PIN Transaction
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: SIGNED mandateState: SIGNED
updateTimestamp: '2024-01-01T00:00:00.000' updateTimestamp: '2024-01-01T00:00:00.00'
- directDebitMandateId: 2 - directDebitMandateId: 2
directDebitMandateTypeName: Paper Contract directDebitMandateTypeName: Paper Contract
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: CANCELLED mandateState: CANCELLED
updateTimestamp: '2024-01-01T00:00:00.000' updateTimestamp: '2024-01-01T00:00:00.00'
missingBillingInformation: missingBillingInformation:
value: value:
customerNumber: 1000003 customerNumber: 1000003
@ -363,31 +398,35 @@ paths:
- directDebitMandateId: 1 - directDebitMandateId: 1
directDebitMandateTypeName: PIN transaction directDebitMandateTypeName: PIN transaction
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
updateTimestamp: '1900-01-01T00:00:00.000'
- directDebitMandateId: 2 - directDebitMandateId: 2
directDebitMandateTypeName: Paper Contract directDebitMandateTypeName: Paper Contract
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
updateTimestamp: '1900-01-01T00:00:00.000'
missingDebitMandateInformation: missingDebitMandateInformation:
value: value:
customerNumber: 1000003 customerNumber: 1000003
billingInformation: billingInformation:
- billingInformationId: 1 - billingInformationId: 1
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 2
- billingInformationId: 2 - billingInformationId: 2
issuerCountry: BE
iban: '0987654321' iban: '0987654321'
bic: null bic: null
swift: null
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 3
directDebitMandate: [] directDebitMandate: []
minimumFinancialInformation: minimumFinancialInformation:
value: value:
@ -461,6 +500,7 @@ paths:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: SIGNED mandateState: SIGNED
updateDirectDebitMandateType: updateDirectDebitMandateType:
@ -471,6 +511,10 @@ paths:
value: value:
directDebitMandate: directDebitMandate:
billingInformationId: 2 billingInformationId: 2
updateMandateAddressId:
value:
directDebitMandate:
mandateAddressId: 3
updateMandateReference: updateMandateReference:
value: value:
directDebitMandate: directDebitMandate:
@ -547,10 +591,17 @@ paths:
updateFullBillingInformation: updateFullBillingInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2
updateIssuerCountry:
value:
billingInformation:
issuerCountry: DE
updateIban: updateIban:
value: value:
billingInformation: billingInformation:
@ -559,6 +610,10 @@ paths:
value: value:
billingInformation: billingInformation:
bic: DEUT bic: DEUT
updateSwift:
value:
billingInformation:
swift: UpdatedSwift
updateAscription: updateAscription:
value: value:
billingInformation: billingInformation:
@ -632,14 +687,17 @@ paths:
fullFinancialInformation: fullFinancialInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2 billingAddressId: 2
minimumBillingInformation: minimumBillingInformation:
value: value:
billingInformation: billingInformation:
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
@ -707,12 +765,16 @@ paths:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
minimumdirectDebitMandate: minimumdirectDebitMandate:
value: value:
directDebitMandate: directDebitMandate:
directDebitMandateTypeId: 1 directDebitMandateTypeId: 1
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
required: true required: true
responses: responses:
@ -779,34 +841,38 @@ paths:
customerNumber: 1000003 customerNumber: 1000003
billingInformation: billingInformation:
- billingInformationId: 1 - billingInformationId: 1
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 2 billingAddressId: 2
created: '2024-01-01T00:00:00.000' updateTimestamp: '2024-01-01T00:00:00.00'
- billingInformationId: 2 - billingInformationId: 2
issuerCountry: BE
iban: '0987654321' iban: '0987654321'
bic: null bic: null
swift: null
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
billingAddressId: 3 billingAddressId: 3
created: '2024-01-01T00:00:00.000' updateTimestamp: '2024-01-01T00:00:00.00'
directDebitMandate: directDebitMandate:
- directDebitMandateId: 1 - directDebitMandateId: 1
directDebitMandateTypeName: PIN transaction directDebitMandateTypeName: PIN transaction
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: SIGNED mandateState: SIGNED
updateTimestamp: '2024-01-01T00:00:00.000'
- directDebitMandateId: 2 - directDebitMandateId: 2
directDebitMandateTypeName: Paper Contract directDebitMandateTypeName: Paper Contract
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
mandateState: CANCELLED mandateState: CANCELLED
updateTimestamp: '2024-01-01T00:00:00.000'
missingBillingInformation: missingBillingInformation:
value: value:
customerNumber: 1000003 customerNumber: 1000003
@ -815,31 +881,35 @@ paths:
- directDebitMandateId: 1 - directDebitMandateId: 1
directDebitMandateTypeName: PIN transaction directDebitMandateTypeName: PIN transaction
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
updateTimestamp: '1900-01-01T00:00:00.000'
- directDebitMandateId: 2 - directDebitMandateId: 2
directDebitMandateTypeName: Paper Contract directDebitMandateTypeName: Paper Contract
billingInformationId: 1 billingInformationId: 1
mandateAddressId: 2
created: '1900-01-01T00:00:00.000' created: '1900-01-01T00:00:00.000'
mandateReference: Dit is een test Reference mandateReference: Dit is een test Reference
updateTimestamp: '1900-01-01T00:00:00.000'
missingDebitMandateInformation: missingDebitMandateInformation:
value: value:
customerNumber: 1000003 customerNumber: 1000003
billingInformation: billingInformation:
- billingInformationId: 1 - billingInformationId: 1
issuerCountry: NL
iban: '1234567890' iban: '1234567890'
bic: ING bic: ING
swift: Swift
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 2
- billingInformationId: 2 - billingInformationId: 2
issuerCountry: BE
iban: '0987654321' iban: '0987654321'
bic: null bic: null
swift: null
ascription: Dit is een Test ascription: Dit is een Test
alias: Alias Test alias: Alias Test
created: "2024-06-02T15:03:460" billingAddressId: 3
directDebitMandate: [] directDebitMandate: []
minimumFinancialInformation: minimumFinancialInformation:
value: value:
@ -1042,7 +1112,8 @@ paths:
postalCode: 0000AA postalCode: 0000AA
city: Den Haag city: Den Haag
country: NL country: NL
addressType: Billing isPreferred: true
addressType: Office
- addressId: 2 - addressId: 2
street: mystreet 33 street: mystreet 33
houseNumber: 1 houseNumber: 1
@ -1050,7 +1121,8 @@ paths:
postalCode: 4455CA postalCode: 4455CA
city: Den BOSCH city: Den BOSCH
country: NL country: NL
addressType: Shipping isPreferred: true
addressType: Office
phone: phone:
- phoneId: 1 - phoneId: 1
number: '3112345678' number: '3112345678'
@ -1127,7 +1199,8 @@ paths:
postalCode: 0000AA postalCode: 0000AA
city: Den Haag city: Den Haag
country: NL country: NL
addressType: Billing isPreferred: true
addressType: Office
- addressId: 2 - addressId: 2
street: mystreet 33 street: mystreet 33
houseNumber: 1 houseNumber: 1
@ -1135,7 +1208,8 @@ paths:
postalCode: 4455CA postalCode: 4455CA
city: Den BOSCH city: Den BOSCH
country: NL country: NL
addressType: Shipping isPreferred: true
addressType: Office
phone: phone:
- phoneId: 1 - phoneId: 1
number: '3112345678' number: '3112345678'
@ -1463,7 +1537,8 @@ paths:
postalCode: 0000AA postalCode: 0000AA
city: Den Haag city: Den Haag
country: NL country: NL
addressType: Billing isPreferred: true
addressType: Office
- addressId: 2 - addressId: 2
street: mystreet 33 street: mystreet 33
houseNumber: 1 houseNumber: 1
@ -1471,7 +1546,8 @@ paths:
postalCode: 4455CA postalCode: 4455CA
city: Den BOSCH city: Den BOSCH
country: NL country: NL
addressType: Shipping isPreferred: true
addressType: Office
phone: phone:
- phoneId: 1 - phoneId: 1
number: '3112345678' number: '3112345678'
@ -1677,6 +1753,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
- street: Beeklaan - street: Beeklaan
houseNumber: 30 houseNumber: 30
@ -1684,6 +1761,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: false
addressTypeId: 2 addressTypeId: 2
phones: phones:
- number: '6123456789' - number: '6123456789'
@ -2526,6 +2604,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
addMinimumAddress: addMinimumAddress:
value: value:
@ -2535,6 +2614,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
responses: responses:
'201': '201':
@ -2746,6 +2826,7 @@ paths:
city: Den Haag city: Den Haag
country: NL country: NL
addressTypeId: 2 addressTypeId: 2
isPreferred: true
updateStreet: updateStreet:
value: value:
address: address:
@ -2773,7 +2854,11 @@ paths:
updateAddressTypeId: updateAddressTypeId:
value: value:
address: address:
addressTypeId: 1 addressTypeId: 3
updateIsPreferred:
value:
address:
isPreferred: false
responses: responses:
'202': '202':
description: Successful updated the customer profile description: Successful updated the customer profile
@ -3026,7 +3111,8 @@ paths:
postalCode: 0000AA postalCode: 0000AA
city: Den Haag city: Den Haag
country: NL country: NL
addressType: Billing isPreferred: true
addressType: Office
- addressId: 2 - addressId: 2
street: mystreet 33 street: mystreet 33
houseNumber: 1 houseNumber: 1
@ -3034,7 +3120,8 @@ paths:
postalCode: 4455CA postalCode: 4455CA
city: Den BOSCH city: Den BOSCH
country: NL country: NL
addressType: Shipping isPreferred: true
addressType: Office
phone: phone:
- phoneId: 1 - phoneId: 1
number: '3112345678' number: '3112345678'
@ -3241,6 +3328,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
- street: Beeklaan - street: Beeklaan
houseNumber: 30 houseNumber: 30
@ -3248,6 +3336,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: false
addressTypeId: 2 addressTypeId: 2
phones: phones:
- number: '6123456789' - number: '6123456789'
@ -4025,6 +4114,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
addMinimumAddress: addMinimumAddress:
value: value:
@ -4034,6 +4124,7 @@ paths:
postalCode: 2500AA postalCode: 2500AA
city: Den Haag city: Den Haag
country: NL country: NL
isPreferred: true
addressTypeId: 1 addressTypeId: 1
responses: responses:
'201': '201':
@ -4259,6 +4350,7 @@ paths:
city: Den Haag city: Den Haag
country: NL country: NL
addressTypeId: 2 addressTypeId: 2
isPreferred: true
updateStreet: updateStreet:
value: value:
address: address:
@ -4286,7 +4378,7 @@ paths:
updateAddressTypeId: updateAddressTypeId:
value: value:
address: address:
addressTypeId: 1 addressTypeId: 3
updateIsPreferred: updateIsPreferred:
value: value:
address: address:
@ -4604,6 +4696,8 @@ components:
type: string type: string
country: country:
type: string type: string
isPreferred:
type: boolean
addressType: addressType:
type: string type: string
getPhone: getPhone:
@ -4667,6 +4761,7 @@ components:
- billingInformationId - billingInformationId
- created - created
- directDebitMandateTypeName - directDebitMandateTypeName
- mandateAddressId
- mandateReference - mandateReference
type: object type: object
properties: properties:
@ -4674,6 +4769,10 @@ components:
type: string type: string
billingInformationId: billingInformationId:
type: integer type: integer
mandateAddressId:
type: integer
created:
type: string
mandateReference: mandateReference:
type: string type: string
directDebitMandatePost: directDebitMandatePost:
@ -4688,6 +4787,8 @@ components:
type: string type: string
billingInformationId: billingInformationId:
type: integer type: integer
mandateAddressId:
type: integer
mandateReference: mandateReference:
type: string type: string
mandateState: mandateState:
@ -4710,6 +4811,8 @@ components:
type: integer type: integer
billingInformationId: billingInformationId:
type: integer type: integer
mandateAddressId:
type: integer
created: created:
type: string type: string
mandateReference: mandateReference:
@ -4723,41 +4826,52 @@ components:
- alias - alias
- ascription - ascription
- bic - bic
- billingAddressId
- billingInformationId - billingInformationId
- iban - iban
- created - issuerCountry
- swift
type: object type: object
properties: properties:
billingInformationId: billingInformationId:
type: integer type: integer
issuerCountry:
type: string
iban: iban:
type: string type: string
bic: bic:
type: string type: string
swift:
type: string
ascription: ascription:
type: string type: string
alias: alias:
type: string type: string
created: billingAddressId:
type: string type: integer
billingInformationPostEntity: billingInformationPostEntity:
required: required:
- alias - alias
- ascription - ascription
- billingAddressId - billingAddressId
- iban - iban
- issuerCountry
type: object type: object
properties: properties:
issuerCountry:
type: string
iban: iban:
type: string type: string
bic: bic:
type: string type: string
swift:
type: string
ascription: ascription:
type: string type: string
alias: alias:
type: string type: string
created: billingAddressId:
type: string type: integer
billingInformationPost: billingInformationPost:
type: object type: object
properties: properties:
@ -4766,14 +4880,20 @@ components:
billingInformationPatchEntity: billingInformationPatchEntity:
type: object type: object
properties: properties:
issuerCountry:
type: string
iban: iban:
type: string type: string
bic: bic:
type: string type: string
swift:
type: string
ascription: ascription:
type: string type: string
alias: alias:
type: string type: string
billingAddressId:
type: integer
billingInformationPatch: billingInformationPatch:
type: object type: object
properties: properties:
@ -4975,6 +5095,8 @@ components:
type: string type: string
country: country:
type: string type: string
isPreferred:
type: boolean
addressTypeId: addressTypeId:
type: integer type: integer
addressPatchEntity: addressPatchEntity:
@ -4994,6 +5116,8 @@ components:
type: string type: string
addressTypeId: addressTypeId:
type: integer type: integer
isPreferred:
type: boolean
phonePostEntity: phonePostEntity:
required: required:
- countryCode - countryCode

View File

@ -294,6 +294,164 @@ paths:
- default: [] - default: []
x-auth-type: Application & Application User x-auth-type: Application & Application User
x-throttling-tier: Unlimited x-throttling-tier: Unlimited
post:
tags:
- ABTCustomerReference
summary: Create a address type
description: Create a address type with a specific value
parameters: []
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/addressType'
required: true
responses:
'201':
description: Successful created a new address type
content:
application/json:
schema:
type: object
properties:
id:
type: integer
example: 1
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/400Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/404Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/500Response'
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/addresstype/{addressTypeId}:
put:
tags:
- ABTCustomerReference
summary: Update a address type
description: Update an existing address type with a specific value
parameters:
- name: addressTypeId
in: path
required: true
style: simple
explode: false
schema:
type: integer
format: integer
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/addressType'
required: true
responses:
'202':
description: Successful updated an existing a address type
content:
application/json:
schema:
type: object
properties:
id:
type: integer
example: 1
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/400Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/404Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/500Response'
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
delete:
tags:
- ABTCustomerReference
summary: Remove a address type
description: Remove an existing address type with a specific value
parameters:
- name: addressTypeId
in: path
required: true
style: simple
explode: false
schema:
type: integer
format: integer
responses:
'202':
description: Successful removed a address type
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/400Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401Response'
'404':
description: Not Found
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/404ResponseId'
- $ref: '#/components/schemas/404Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/500Response'
security:
- default: []
x-auth-type: Application & Application User
x-throttling-tier: Unlimited
/customerstatus: /customerstatus:
get: get:
tags: tags:

File diff suppressed because it is too large Load Diff

View File

@ -1,206 +0,0 @@
openapi: 3.0.3
info:
title: Service Desk Card Reader API
version: 0.9.0
description: |-
This API enables that external systems (such as SOS) can operate on information from service desk card readers.
### 0.9.0
- First draft version
servers:
- url: /v1
paths:
/card-reader/token:
post:
tags:
- CardReader
summary: Register a token from the card
operationId: registerToken
description: |
Register a token from the card to the external system.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/TokenRegisterRequest"
responses:
"202":
description: Accepted
"400":
description: |-
Bad Request. Occurs when the readerId is unknown to the external system. A call to `/card-reader/registrations`,
followed by a `/card-reader/register` is needed in order to restore reader registrations.
/card-reader/register:
post:
tags:
- CardReader
summary: Register a reader that is connected to the Card Reader Interface
operationId: registerReader
description: |
Register a reader to the external system to receive a newly generated readerID.
**N.B.**: After the last reader has been registered, an initial `/card-reader/registrations` call must be sent.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ReaderRegisterRequest"
responses:
"200":
description: Registration was successful
content:
application/json:
schema:
$ref: "#/components/schemas/ReaderRegisterResponse"
"400":
description: Bad Request
/card-reader/unregister:
post:
tags:
- CardReader
summary: Unregister a reader from the external system
operationId: unregisterReader
description: |
Unregister a reader from the external system.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ReaderUnregisterRequest"
responses:
"204":
description: Unregistration was successful
"400":
description: Bad Request
/card-reader/registrations:
post:
tags:
- CardReader
summary: Send a list of readers that should currently be registered
operationId: sendReaderRegistrations
description: |
Send a list of readers of which the Card Reader Interface believes are registered. This must be done periodically.
The period is determined by the timeout duration in the response.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RegistrationsRequest"
responses:
"200":
description: Reader registrations successfully received
content:
application/json:
schema:
$ref: "#/components/schemas/RegistrationsResponse"
components:
schemas:
TokenRegisterRequest:
description: Request containing token information read using the card reader
type: object
properties:
readerId:
$ref: "#/components/schemas/ReaderId"
xBot:
type: string
format: uuid
description: The unique identifier of the token.
required:
- readerId
- xBot
ReaderRegisterRequest:
description: Request containing card reader information for one or more readers to be be registered
type: object
properties:
readerIdQuantity:
type: integer
default: 1
minimum: 1
cardReaderInterfaceId:
$ref: "#/components/schemas/cardReaderInterfaceId"
locationName:
$ref: "#/components/schemas/LocationName"
required:
- cardReaderInterfaceId
- locationName
- readerIdQuantity
ReaderRegisterResponse:
description: Response containing one or more readerIds for the registered reader(s)
type: object
properties:
readerIds:
type: array
items:
$ref: "#/components/schemas/ReaderId"
required:
- readerIds
ReaderUnregisterRequest:
description: Request containing the readerId to unregister
type: object
properties:
cardReaderInterfaceId:
$ref: "#/components/schemas/cardReaderInterfaceId"
locationName:
$ref: "#/components/schemas/LocationName"
readerId:
$ref: "#/components/schemas/ReaderId"
required:
- readerId
RegistrationsRequest:
description: Request containing a list of readerId of which the Card Reader Interface believes are registered.
type: object
properties:
cardReaderInterfaceId:
$ref: "#/components/schemas/cardReaderInterfaceId"
locationName:
$ref: "#/components/schemas/LocationName"
readerIds:
type: array
items:
$ref: "#/components/schemas/ReaderId"
required:
- cardReaderInterfaceId
- locationName
- readerIds
RegistrationsResponse:
description: Response with actionable information for the Card Reader Interface.
type: object
properties:
nextCallTimeout:
type: integer
description: |
Timeout duration in seconds BEFORE which the next `/card-reader/registrations` call should happen.
Failure to send a call before this timeout will result in automatic unregistration of all readers associated to this Card Read Interface.
The external systems must maintain a grace period on reception of the next call.
The Card Read Interface must start sending the next call on or before the timeout (grace period not needed).
readerIds:
type: array
items:
$ref: "#/components/schemas/ReaderId"
description: |
A list of readerIds that are registered to the external system. This mean all readerIds that readers with
readerIds missing from this list must be reregistered using `/card-reader/register`.
required:
- nextCallTimeout
- readerIds
cardReaderInterfaceId:
type: string
description: Each Card Reader Interface has a unique cardReaderInterfaceId. Identifier for the Card Reader Interface to which one or more readers are connected.
LocationName:
type: string
description: Name of the location of the reader. A location can have one ore more Card Reader Interfaces (cardReaderInterfaceIds)
ReaderId:
type: string
description: Unique identifier generated by the external system. Should be displayed on the screen of the reader.

View File

@ -1,180 +0,0 @@
openapi: 3.0.1
info:
title: ABT Service Engine Order APIs
version: "1.0"
description: Order APIs available in the Service Engine for order validation and fulfillment.
servers:
- url: https://api.integratielaag.nl/abt/abtserviceengine/1.0
paths:
/orders/validation/gboAgeProfile:
get:
tags:
- ServiceEngine Order validation
summary: Get GBO age profile that is valid for the given input
description: |-
Only one age profile can be valid at any one time, so only one profile is returned.
parameters:
- name: productStartDate
in: query
required: true
description: Start date of product validity
schema:
type: string
format: date
example: 2025-03-20
- name: birthDate
in: query
required: false
description: Birthdate of the OVpay-token holder
schema:
type: string
format: date
example: 2000-01-01
- name: ovPayTokenId
in: query
required: false
description: ovPayTokenId of the customer's selected token
schema:
type: integer
example: 1
- name: customerTokenId
in: query
required: false
description: customerTokenId of the customer's selected token
schema:
type: string
format: uuid
example: "4a2d2c9c-1e5d-4d8a-9c0a-6c0a6c0a6c0a"
- name: serviceReferenceId
in: query
required: false
description: serviceReferenceId of the customer's selected token
schema:
type: string
example: "NLOV1234567ABCDEFG"
- name: amount
in: query
required: false
description: amount belonging to the serviceReferenceId
schema:
type: integer
example: 100
- name: ovpasNumber
in: query
required: false
description: OVpas number of the customer's selected token
schema:
type: string
example: "63AW974"
- name: verificationCode
in: query
required: false
description: verification code belonging to the OVpas number
schema:
type: string
example: 1A3C7D
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/GboAgeProfileResponse"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/rfc9457Response"
examples:
Missing parameter(s):
summary: Missing parameter(s)
value:
{
"type": "https://www.htm.nl/api/v1/400Error",
"title": "Missing parameter(s)",
"detail": "At least one of the following parameters must be present: birthDate, ovPayTokenId, customerTokenId, (serviceReferenceId and amount), (ovpasNumber and verificationCode)",
"instance": "urn:uuid:13c8416f-7632-4c8b-8a16-2132197be60c",
"apiErrorCode": "htm.api.err.400.2",
}
Invalid date format:
summary: Invalid date format
value:
{
"type": "https://www.htm.nl/api/v1/400Error",
"title": "Invalid input",
"detail": "The given birthDate is not a valid Date format",
"instance": "urn:uuid:13c8416f-7632-4c8b-8a16-2132197be60c",
"apiErrorCode": "htm.api.err.400.3",
}
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/rfc9457Response"
examples:
No birthdate present in PAD of OVpay token:
summary: No birthdate present in PAD of OVpay token
value:
{
"type": "https://www.htm.nl/api/v1/404Error",
"title": "Missing birthdate in PAD",
"detail": "There is no birthdate present in the PAD of the OVpay token, or there is no PAD present at all",
"instance": "urn:uuid:13c8416f-7632-4c8b-8a16-2132197be60c",
"apiErrorCode": "htm.api.err.404.1",
}
components:
schemas:
GboAgeProfileResponse:
type: object
required:
- gboAgeProfileId
- name
- ageFromInclusive
- ageToInclusive
properties:
gboAgeProfileId:
type: integer
example: 1
name:
type: string
example: Kind (4 t/m 11 jaar)
ageFromInclusive:
type: integer
example: 4
ageToInclusive:
type: integer
example: 11
rfc9457Response:
type: object
properties:
type:
type: string
format: url
example: "https://www.htm.nl/api/v1/rfc9457Error"
title:
type: string
description: "Short summary of the error."
example: "The request is not valid."
detail:
type: string
description: "More detailed descriptionof the error."
example: "Some required parameters are missing."
instance:
type: string
description: "Unique identifier to correlate this specific error with logging in other applications."
example: "urn:uuid:13c8416f-7632-4c8b-8a16-2132197be60c"
additionalProperty1:
type: string
description: "Example of an additional property value to be used for error reporting."
example: "additionalValue1"
additionalProperty2:
type: array
description: "Example of an additional property array to be used for error reporting."
items:
type: string
example:
- "additionalValue2-1"
- "additionalValue2-2"

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -52,13 +52,6 @@ paths:
example: 2024-10-04T12:34:56.000 example: 2024-10-04T12:34:56.000
required: false required: false
description: The purchased product should be last updated after this timestamp. description: The purchased product should be last updated after this timestamp.
- in: query
name: resourceNameId
schema:
type: integer
example: 2
required: false
description: The id of the resource.
- in: query - in: query
name: resourceName name: resourceName
schema: schema:

View File

@ -1,159 +0,0 @@
openapi: "3.0.3"
info:
title: ABT Service CRUD APIs
version: "1.0"
description: CRUD APIs for ABT Service processes.
servers:
- url: https://api.integratielaag.nl/v1/service
paths:
/tokenregisterrequests:
get:
summary: Get all token register requests.
description: Get all token register requests.
tags:
- NFC Reader
parameters:
- in: query
name: readerId
schema:
type: string
example: b14b0320-2b72-48bb-990b-b97a2d67f9df
explode: false
required: false
description: Filter on possible NFC reader ids.
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/TokenRegisterRequestsGetResponse"
examples:
Single TokenRegisterRequest:
summary: Single TokenRegisterRequest
value:
{
"tokenRegisterRequests":
[
{
"readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df",
"xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115",
"updated": "2025-07-02T15:01:00.000+00:00",
},
],
}
Multiple TokenRegisterRequests:
summary: Multiple TokenRegisterRequests
value:
{
"tokenRegisterRequests":
[
{
"readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df",
"xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115",
"updated": "22025-07-02T15:01:00.000+00:00",
},
{
"readerId": "b4d8e43c-be21-472c-955b-a0c7c11b4bfb",
"xBot": "625bc66b-a5de-42fc-ba9e-fb02ada4a4ee",
"updated": "2025-07-02T13:37:07.000+00:00",
},
],
}
/tokenregisterrequests/{readerId}:
parameters:
- in: path
name: readerId
required: true
description: The NFC reader id.
schema:
type: string
example: b14b0320-2b72-48bb-990b-b97a2d67f9df
put:
summary: Insert or update token register request.
description: Insert or update token register request.
tags:
- NFC Reader
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/TokenRegisterRequestPutRequest"
example: { "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115" }
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/TokenRegisterRequestPutResponse"
example:
{
"readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df",
"xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115",
"updated": "2025-07-02T15:01:00.000+00:00",
}
"201":
description: Created
content:
application/json:
schema:
$ref: "#/components/schemas/TokenRegisterRequestPutResponse"
example:
{
"readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df",
"xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115",
"updated": "2025-07-02T15:01:00.000+00:00",
}
components:
securitySchemes:
bearerToken:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
TokenRegisterRequestsGetResponse:
type: object
properties:
tokenRegisterRequests:
type: array
items:
$ref: "#/components/schemas/TokenRegisterRequest"
TokenRegisterRequestPutRequest:
type: object
properties:
xBot:
type: string
format: uuid
example: 4bfaede2-a6c9-45dd-8a80-1f83a075a115
nullable: false
description: The xBOT id.
required:
- xBot
TokenRegisterRequestPutResponse:
$ref: "#/components/schemas/TokenRegisterRequest"
TokenRegisterRequest:
type: object
properties:
readerId:
type: string
example: b14b0320-2b72-48bb-990b-b97a2d67f9df
nullable: false
description: The NFC reader id.
xBot:
type: string
format: uuid
example: 4bfaede2-a6c9-45dd-8a80-1f83a075a115
nullable: false
description: The xBOT id.
updated:
type: string
format: date-time
example: "2025-07-02T15:01:00+00:00"
nullable: false
description: The date and time when the token register request was updated.
required:
- readerId
- xBot
- updated

View File

@ -1,65 +0,0 @@
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://www.coda.com/efinance/schemas/inputext/input-14.0/webservice"
xmlns:tran="http://www.coda.com/efinance/schemas/transaction"
xmlns:flex="http://www.coda.com/common/schemas/flexifield"
xmlns:att="http://www.coda.com/common/schemas/attachment"
xmlns:inp="http://www.coda.com/efinance/schemas/inputext"
xmlns:mat="http://www.coda.com/efinance/schemas/matching"
xmlns:ass="http://www.coda.com/efinance/schemas/association">
<soapenv:Body>
<web:PostToBooksRequest>
<web:Transaction>
<tran:Header
xmlns:tran="http://www.coda.com/efinance/schemas/transaction">
<tran:Key>
<tran:CmpCode>1HTM</tran:CmpCode>
<tran:Code>OPBR-FIKO</tran:Code>
</tran:Key>
<tran:TimeStamp>0</tran:TimeStamp>
<tran:InputDate>2024-11-25T00:00:00.000Z</tran:InputDate>
<tran:Period>2024/7</tran:Period>
<tran:CurCode>EUR</tran:CurCode>
<tran:Date>2024-07-25T00:00:00.000Z</tran:Date>
<tran:OriginalCompany>1HTM</tran:OriginalCompany>
<tran:OriginalCode>OPBR-FIKO</tran:OriginalCode>
<tran:CompletionWorkflow>
<tran:CompletionStatus>wfl_no_completion</tran:CompletionStatus>
</tran:CompletionWorkflow>
<tran:SalesInvoiceStatus>salesinv_notyetinv</tran:SalesInvoiceStatus>
</tran:Header>
<tran:Lines
xmlns:tran="http://www.coda.com/efinance/schemas/transaction">
<tran:Line>
<tran:Number>1</tran:Number>
<tran:AccountCode>100.12400.D150000001</tran:AccountCode>
<tran:DocValue>100.00</tran:DocValue>
<tran:LineType>summary</tran:LineType>
<tran:LineSense>debit</tran:LineSense>
<tran:LineOrigin>dl_orig_defined</tran:LineOrigin>
<tran:Description>test</tran:Description>
<tran:ExtRef1>987654</tran:ExtRef1>
<tran:ExtRef2>test987654</tran:ExtRef2>
<tran:SEPAPaymentCategoryPurposeCode>none</tran:SEPAPaymentCategoryPurposeCode>
<tran:SEPAPaymentPurposeCode>none</tran:SEPAPaymentPurposeCode>
</tran:Line>
<tran:Line>
<tran:Number>2</tran:Number>
<tran:AccountCode>642.41236.609311</tran:AccountCode>
<tran:DocValue>100.00</tran:DocValue>
<tran:UserStatus/>
<tran:LineType>analysis</tran:LineType>
<tran:LineSense>credit</tran:LineSense>
<tran:LineOrigin>dl_orig_defined</tran:LineOrigin>
<tran:SEPAPaymentCategoryPurposeCode>none</tran:SEPAPaymentCategoryPurposeCode>
<tran:SEPAPaymentPurposeCode>none</tran:SEPAPaymentPurposeCode>
</tran:Line>
</tran:Lines>
</web:Transaction>
<web:PostData>
<web:Template>OPBR-FIKO</web:Template>
<web:DocumentWideData/>
</web:PostData>
</web:PostToBooksRequest>
</soapenv:Body>
</soapenv:Envelope>

View File

@ -1,77 +0,0 @@
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.coda.com/efinance/schemas/inputext/input-14.0/webservice" xmlns:tran="http://www.coda.com/efinance/schemas/transaction" xmlns:flex="http://www.coda.com/common/schemas/flexifield" xmlns:att="http://www.coda.com/common/schemas/attachment" xmlns:inp="http://www.coda.com/efinance/schemas/inputext" xmlns:mat="http://www.coda.com/efinance/schemas/matching" xmlns:ass="http://www.coda.com/efinance/schemas/association">
<soapenv:Header>
<web:Options/>
</soapenv:Header>
<soapenv:Body>
<web:PostRequest>
<web:PostOptions postto="intray" reportallerrors="1"/> <!-- postto staat nu naar het register (intray). Dit zou ik een live situatie moeten/kunnen worden aangepast naar de boeken (books) -->
<web:Transaction>
<tran:Header>
<tran:Key>
<tran:CmpCode>1HTM</tran:CmpCode> <!-- Unit4 Financials bedrijf -->
<tran:Code>VERK_FACTUUR</tran:Code> <!-- Documentcode -->
</tran:Key>
<tran:TimeStamp>0</tran:TimeStamp> <!-- Timestamp bij nieuwe transacties altijd 0 -->
<tran:Period>2024/5</tran:Period> <!-- Jaar en periode van boeken -->
<tran:CurCode>EUR</tran:CurCode> <!-- Valutacode -->
<tran:Date>2024-06-05T00:00:00.000Z</tran:Date> <!-- Documentdatum> -->
<tran:Description>DW12345</tran:Description> <!-- Omschrijving document -->
</tran:Header>
<tran:Lines>
<tran:Line>
<tran:Number>1</tran:Number> <!-- Regelnummer - 1 Debiteurenregel -->
<tran:AccountCode>1200.D001</tran:AccountCode> <!-- Boeken op elementcode, in dit geval alleen elementen op niveau 1 en 2 (gescheiden door een punt) -->
<tran:DocValue>121.00</tran:DocValue> <!-- Totaalbedrag debiteurenregel -->
<tran:LineType>summary</tran:LineType> <!-- Type regel, in het geval van een debiteurenregel is dit summary -->
<tran:LineSense>credit</tran:LineSense> <!-- Debet of Credit -->
<tran:LineOrigin>dl_orig_defined</tran:LineOrigin> <!-- Aangezien hier gebruik wordt gemaakt van het invoersjabloon FACTUUR_VER (zie regel 72) is dit een vooraf gedefinieerde regel ( dl_orig_defined) -->
<tran:Description>Nov 2020 Huur</tran:Description> <!-- Regelomschrijving -->
<tran:ExtRef1>DW12345</tran:ExtRef1> <!-- Externe referentie 1 -->
<tran:ExtRef2/> <!-- Externe referentie 2, nu niet gevuld -->
<tran:ExtRef3/> <!-- Externe referentie 3, nu niet gevuld, hieronder kunnen ook nog andere referenties worden opgenomen -->
<tran:DocSumTax>21.00</tran:DocSumTax> <!-- BTW-bedrag behorende bij debiteurenregel -->
<tran:TaxInclusive>false</tran:TaxInclusive> <!-- Inclusief of exclusief BTW -->
</tran:Line>
<tran:Line>
<tran:Number>2</tran:Number> <!-- Regelnummer - 1 Omzetregel -->
<tran:AccountCode>4300</tran:AccountCode> <!-- Boeken op elementcode, in dit geval alleen element op niveau 1 -->
<tran:DocValue>100.00</tran:DocValue> <!-- Totaalbedrag omzetregel -->
<tran:LineType>analysis</tran:LineType> <!-- Type regel, in het geval van een omzetregel is dit analyses (analyse) -->
<tran:LineSense>debit</tran:LineSense> <!-- Debet of Credit -->
<tran:LineOrigin>dl_orig_defined</tran:LineOrigin> <!-- Aangezien hier gebruik wordt gemaakt van het invoersjabloon FACTUUR_VER (zie regel 72) is dit een vooraf gedefinieerde regel ( dl_orig_defined) -->
<tran:Description>Voorschot Q1.</tran:Description> <!-- Regelomschrijving -->
<tran:ExtRef1>Ref. DW12345</tran:ExtRef1> <!-- Externe referentie 1 -->
<tran:ExtRef2/> <!-- Externe referentie 2, nu niet gevuld -->
<tran:ExtRef3/> <!-- Externe referentie 3, nu niet gevuld, hieronder kunnen ook nog andere referenties worden opgenomen -->
<tran:TaxInclusive>false</tran:TaxInclusive> <!-- Inclusief of exclusief BTW -->
<tran:Taxes>
<tran:Tax>
<tran:Code>21%</tran:Code> <!-- BTW-code -->
<tran:ShortName>21% BTW</tran:ShortName> <!-- Verkorte omschrijving BTW -->
<tran:Value>21.00</tran:Value> <!-- BTW-bedrag analyse regel -->
</tran:Tax>
</tran:Taxes>
</tran:Line>
<tran:Line>
<tran:Number>3</tran:Number> <!-- Regelnummer - 3 BTW-regel -->
<tran:AccountCode>1400</tran:AccountCode> <!-- Boeken op elementcode, in dit geval alleen element op niveau 1 -->
<tran:DocValue>21.00</tran:DocValue> <!-- BTW-bedrag -->
<tran:LineType>tax</tran:LineType> <!-- Type regel, in het geval van een BTW-regel is dit tax (BTW) -->
<tran:LineSense>debit</tran:LineSense> <!-- Debet of Credit -->
<tran:LineOrigin>dl_orig_gentax</tran:LineOrigin> <!-- Aangezien hier gebruik wordt gemaakt van het invoersjabloon FACTUUR_VER (zie regel 72) is dit een vooraf gedefinieerde regel ( dl_orig_gentax) -->
<tran:Description>Test DW</tran:Description> <!-- Regelomschrijving -->
<tran:ExtRef1/>
<tran:ExtRef2/>
<tran:ExtRef3/>
<tran:TaxLineCode>21%</tran:TaxLineCode> <!-- BTW-code -->
<tran:DocTaxTurnover>100.00</tran:DocTaxTurnover> <!-- Bedrag waar BTW over berekend -->
</tran:Line>
</tran:Lines>
</web:Transaction>
<web:PostData>
<inp:Template>FACTUUR_VER</inp:Template> <!-- Te gebruiken invoersjabloon -->
<inp:DocumentWideData/>
</web:PostData>
</web:PostRequest>
</soapenv:Body>
</soapenv:Envelope>