Compare commits

...

272 Commits

Author SHA1 Message Date
a09058d151 merged develop 2025-05-21 13:04:51 +02:00
17d10c158c OVPAY-1784 - Fixed timestamps. 2025-05-21 10:28:05 +02:00
3d68dfb7eb Merge pull request 'updated customer v1' (#42) from feature/1700-part-2-update-V1 into develop
Reviewed-on: #42
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-05-19 11:30:24 +00:00
a6491041cb dinges 2025-05-19 13:25:06 +02:00
9c9c96453f shenanigens updated and created financials 2025-05-19 13:21:29 +02:00
920246f499 removed is preferred example 2025-05-19 12:42:35 +02:00
ec6edd3636 updated customer v1 2025-05-19 12:28:15 +02:00
18c507195d Merge pull request 'updated customer CRUD' (#41) from feature/OVPAY-1700-customer-address into develop
Reviewed-on: #41
2025-05-19 07:18:29 +00:00
d8d2e31e52 fix 2025-05-19 09:17:25 +02:00
e5867aa605 updated customer CRUD 2025-05-16 13:54:04 +02:00
6b0fe72901 OVPAY-1564 - ENdpoints /transfer and /replace now only support XTAT for target token. 2025-05-15 10:52:51 +02:00
4702ddae4a OVPAY-1564 - Adjusted POST /payments request and response body. 2025-05-14 12:07:49 +02:00
bec2e990fb OVPAY-1742 - Stasjo. 2025-05-13 17:06:53 +02:00
6dffa72825 OVPAY-1742 - Added more examples for development. 2025-05-13 10:03:41 +02:00
2df187ac59 OVPAY-1742 - xTAT casing. 2025-05-13 09:18:52 +02:00
343d49a9c8 OVPAY-1742 - Removed incorrect 404 response example from /transfer. 2025-05-12 18:35:17 +02:00
8da955c5cf OVPAY-1742 - Improved examples for /transfer. 2025-05-12 18:34:07 +02:00
a58971d1c9 OVPAY-1742 - Added X-HTM headers to /compare and /transfer. 2025-05-12 17:15:37 +02:00
a34fd67268 OVPAY-1742 - Added examples for development. 2025-05-12 17:05:53 +02:00
ea5a3aee69 OVPAY-1742 - Split /transfer into old and new endpoint. 2025-05-12 17:01:00 +02:00
db844e2c39 OVPAY-1784 - CRUD for NFC card reader. 2025-05-12 13:54:19 +02:00
937962401b OVPAY-1438 - Added cardreader YAML. 2025-05-12 12:19:22 +02:00
7c76658884 OVPAY-1742 - Fixed typo. 2025-05-12 11:08:37 +02:00
7361d5fca3 Merge pull request 'feature/OVPAY-1742' (#40) from feature/OVPAY-1742 into develop
Reviewed-on: #40
2025-05-12 08:00:44 +00:00
e58ce0feca Merge branch 'develop' into feature/OVPAY-1742 2025-05-12 08:00:12 +00:00
d280bfbad5 OVPAY-1742 - Fixed typo. 2025-05-12 09:59:02 +02:00
Max Martens
b7ff9055e5 Finish /transfer spec, add schema for request body for /compare and /transfer 2025-05-09 17:19:18 +02:00
Max Martens
aba341d14b Add two more examples (non transferable products and unsupported token type combination) 2025-05-09 17:01:03 +02:00
Max Martens
35edfa4c4f WIP 2 2025-05-09 16:56:33 +02:00
Max Martens
8cced0cbd0 WIP 2025-05-09 16:52:44 +02:00
Max Martens
345a12fa90 Add 1211 to PADP Swagger; token compare/replace is added to SE-customers in OVPAY-1742 feature branch and PR 2025-05-08 19:04:38 +02:00
Max Martens
3819ee006f Update binary 2025-05-08 13:29:54 +02:00
Max Martens
9fd0a14e91 Fix PUTGenerator 2025-05-07 11:31:04 +02:00
faa4ea6877 always validation keys in response 2025-05-06 16:12:32 +02:00
797a7d488f ensured consistent versioning in spec 2025-05-06 16:05:19 +02:00
499442b3d9 OVPAY-1742 - Added examples for transferring existing tokens without PAD. 2025-05-06 15:02:22 +02:00
c692718fbb OVPAY-1742 - Added PAD OTP and PAD email address to transfer request body. 2025-05-06 14:28:40 +02:00
d8f9706d76 OVPAY-1742 - Added replace by XTAT example. 2025-05-02 15:08:06 +02:00
946ba3f898 OVPAY-1742 - Added examples for unhappy transfer flow. 2025-05-02 14:57:11 +02:00
079c16763e OVPAY-1742 - Added examples for unhappy flow. 2025-04-30 17:04:34 +02:00
59db7d7323 OVPAY-1742 - Added endpoint for transfer. 2025-04-30 16:02:20 +02:00
14228a5d66 OVPAY-1742 - Updated description for /compare endpoint. 2025-04-30 15:42:00 +02:00
6c3a15134e OVPAY-1742 - Added /compare endpoint. 2025-04-30 15:39:36 +02:00
8e5dcacff5 Merge pull request 'TP PAD Swagger with only final endpoints incouded' (#39) from feature/TP-PAD into develop
Reviewed-on: #39
2025-04-30 11:02:13 +00:00
Max Martens
38b7e2240c Niceness 2025-04-30 12:38:01 +02:00
Max Martens
4c8032a4e0 TP PAD Swagger with only final endpoints incouded 2025-04-30 12:32:31 +02:00
323f1c195c review commentaar 2025-04-28 10:38:30 +02:00
52d4d21871 correct verif code token 2025-04-25 09:15:46 +02:00
17feb74889 prioritering in API's 2025-04-24 17:46:48 +02:00
d0b999236f token options 2025-04-24 17:06:18 +02:00
4b70e09458 description 2025-04-24 13:37:41 +02:00
dd5874c893 orderline patch for a later release 2025-04-24 13:33:37 +02:00
f2688e1f73 added personalaccountdata endpoints to SE orders 2025-04-22 11:58:27 +02:00
bacdab0575 fix 2025-04-18 13:46:24 +02:00
a2d42774cb GET order with validation, extend orderLine patch, post and delete customerToken 2025-04-18 13:42:22 +02:00
038427ffc1 OVPAY-12 74Added FIKO example XML. 2025-04-18 11:08:22 +02:00
Max Martens
fef35cc8f6 Fix timezone from "+0:00" to "+00:00" 2025-04-17 12:52:14 +02:00
Max Martens
67bb707553 Fixed gboAgeProfile naming mistakes 2025-04-17 11:15:06 +02:00
Max Martens
ecd695b198 Add new fields to tool for generating request bodies for new products model 2025-04-15 19:06:57 +02:00
8b8f114cfd camelcase touchPointId 2025-04-15 15:57:56 +02:00
e1bc8db6ba Merge pull request 'removed addressId linked to customerprofile and lowercase birthdate' (#35) from feature/OVPAY1700-orders into develop
Reviewed-on: #35
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-04-15 10:56:02 +00:00
8c94204251 removed addressId linked to customerprofile and lowercase birthdate 2025-04-15 11:40:50 +02:00
b905164abc Merge pull request 'OVPAY-1697 - Updated to Order model v2.1.' (#33) from feature/OVPAY-1697 into develop
Reviewed-on: #33
2025-04-14 11:55:08 +00:00
1b2d562da7 Merge branch 'develop' into feature/OVPAY-1697 2025-04-14 11:54:44 +00:00
17812e423e Merge pull request 'added xTat to get tokens' (#34) from features/OVPAY1643-SE-Tokens into develop
Reviewed-on: #34
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-04-13 20:29:16 +00:00
4b666b082c added xTat to get tokens 2025-04-11 15:48:47 +02:00
3aadfd65a3 OVPAY-1697 - Updated to Order model v2.1. 2025-04-11 14:58:56 +02:00
34ba110b1a Merge pull request 'OVPAY-1634 endpoint for touchpoints to get GBO age profile that is valid for the given input' (#27) from feature/OVPAY-1634-gboAgeProfile-endpoint into develop
Reviewed-on: #27
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-04-07 10:18:22 +00:00
f6a7838ae4 Merge pull request 'Update ABTProducts' (#28) from feature/OVPAY-1623-ABTProducts into develop
Reviewed-on: #28
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-04-07 10:17:43 +00:00
Max Martens
024af73bce lowercase p 2025-04-07 12:17:08 +02:00
Max Martens
5bb8694b25 Fixed number and taxId type in examples 2025-04-07 12:07:12 +02:00
Max Martens
74347acf9d Fix productOwners PUT/DELETE 2025-04-03 12:54:30 +02:00
Max Martens
6a74d553ff Fix POST examples, add mandatoryCustomerDataItems shippingAddress and billingAddress 2025-04-03 12:47:25 +02:00
46f5103c73 Merge pull request 'Swag (er for APIM endpoint 1211)' (#32) from feature/OVPAY-1588 into develop
Reviewed-on: #32
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-04-01 15:22:01 +00:00
Max Martens
f5ba36449e Add partially filled PAD example 2025-04-01 17:20:15 +02:00
Max Martens
3c711c091a Add valid examples for 400/404/500 2025-04-01 17:13:08 +02:00
17cc462a8e Merge branch 'develop' into feature/OVPAY-1634-gboAgeProfile-endpoint 2025-04-01 11:00:28 +00:00
Max Martens
204d347456 Swag 2025-04-01 12:53:14 +02:00
Max Martens
c0f83f4b40 Add gitignore for .NET 2025-04-01 12:46:03 +02:00
7debf77c5d OVPAY-1564 - Added "validContents" to order. 2025-03-31 13:58:47 +02:00
ef9ea011d3 OVPAY-1564 - "terms" is now "orderLineTerms". 2025-03-31 13:18:35 +02:00
9f86b15ca5 Merge pull request 'feature/OVPAY-1645-token-refactor' (#31) from feature/OVPAY-1645-token-refactor into develop
Reviewed-on: #31
2025-03-31 11:16:50 +00:00
c9fa532d44 Merge pull request 'features/OVPAY-1675-Order-crud' (#30) from features/OVPAY-1675-Order-crud into develop
Reviewed-on: #30
2025-03-31 11:16:35 +00:00
6a4a571da7 ovpasnumber 2025-03-31 13:15:59 +02:00
acaa9861aa final quote 2025-03-31 13:08:38 +02:00
5231675d7f OVPAY-1564 - Bugfix on MandateInput (two occurences). 2025-03-31 13:01:43 +02:00
24c06c52b1 Merge branch 'develop' into feature/OVPAY-1623-ABTProducts 2025-03-31 09:54:48 +00:00
Max Martens
62c1f3a8e6 Finish SE and TP Swaggers 2025-03-31 11:48:36 +02:00
be6676a00f 1 px base64 2025-03-31 11:45:21 +02:00
af52cf93cd fixes 2025-03-31 11:31:39 +02:00
afb46f8f84 Added examples needed for stub. 2025-03-28 19:10:02 +01:00
68464bbb78 fixed typos 2025-03-28 16:54:11 +01:00
1a8497ae70 updated touchpoint id in response to nested object 2025-03-28 16:35:49 +01:00
b33c8308b7 added base64 for photo and added more fields in de patch for PAD to show full range 2025-03-28 16:30:20 +01:00
88ec45425d removed schema from hateoas link example 2025-03-28 15:49:32 +01:00
f3474dc10f updated crud customers with token status update 2025-03-28 12:33:54 +01:00
c0df05301b added tokenStatus updates 2025-03-28 12:27:31 +01:00
73b982d35f Merge pull request 'feature/OVPAY-1564' (#29) from feature/OVPAY-1564 into develop
Reviewed-on: #29
2025-03-28 11:25:27 +00:00
bd08005a46 OVPAY-1564 - Processed review remarks. 2025-03-28 12:21:47 +01:00
976e24775e cleaned op hateoas linksv 2025-03-28 10:42:44 +01:00
f6766f9225 all token endpoints added in swagger 2025-03-28 10:32:24 +01:00
07f69e089b example for pesonalization hateoas link 2025-03-27 17:01:48 +01:00
5138662556 first version 2025-03-27 16:14:55 +01:00
b9cd76e484 stuff 2025-03-26 15:39:30 +01:00
0c38563121 fout in body call 2025-03-26 15:35:46 +01:00
d8f9845ab4 fikoArticleNumber 2025-03-26 15:31:31 +01:00
b6e9a1f2f4 fixed uppercase 2025-03-26 12:57:16 +01:00
62e2dbc78d added pad changes to order crud 2025-03-26 12:06:56 +01:00
2726ddb332 updated tax fields in orders 2025-03-26 11:45:55 +01:00
6518d83c1b OVPAY-1564 - Improvements in validation objects, part 5. 2025-03-25 16:44:49 +01:00
985fdce7bb OVPAY-1564 - Improvements in validation objects, part 4. 2025-03-25 16:39:07 +01:00
Max Martens
acf2cf57e9 SE products WIP 2025-03-25 16:16:14 +01:00
8ac15a7b09 OVPAY-1564 - Improvements in validation objects, part 3. 2025-03-25 16:02:05 +01:00
ceb0137aca OVPAY-1564 - Improvements in validation objects, part 2. 2025-03-24 15:35:30 +01:00
Max Martens
6e01f688d8 Remove old v2.2 CRUD YAML, add ProducReference CRUD YAML (Based on WSO2 export) with added GboAGeProfiles 2025-03-24 13:59:41 +01:00
b7d8eff312 Add ovPasNumber and verificationCode, make birthDate optional, change type of amount to integer 2025-03-24 11:28:03 +00:00
Max Martens
5de1c15062 Update ABTProducts CRUD 2025-03-24 11:19:43 +01:00
5ec911727b Fix typo in filename 2025-03-24 08:59:40 +00:00
20a50aa501 Rename minAge and maxAge to ageFromInclusive and ageUntilInclusive 2025-03-24 08:59:04 +00:00
Max Martens
3e4760f6c4 Add 404 error when no PAD present for OVpay token 2025-03-21 17:57:18 +01:00
Max Martens
665ca2aae1 Add OpenAPI spec for retrieving GboAgeProfile 2025-03-21 17:40:55 +01:00
Max Martens
8831de0ba9 Add gitignore for local padp poc files 2025-03-21 17:39:35 +01:00
53b36f29a8 Merge pull request 'OVPAY-1637 - Add "ovPayTokenId" to GET response bodies.' (#21) from feature/OVPAY-1637 into develop
Reviewed-on: #21
Reviewed-by: ovpay <j.beek@htm.nl>
2025-03-21 14:10:01 +00:00
8ce82875ed Merge branch 'develop' into feature/OVPAY-1637 2025-03-21 14:09:45 +00:00
ffb320eaf0 OVPAY-1637 - Added "ovPayTokenId" to response body (AGAIN!!). 2025-03-21 10:44:58 +01:00
a6005c6f2f OVPAY-1564 - Improvements in validation objects, part 1. 2025-03-20 17:12:01 +01:00
067f510d50 OVPAY-1518 - taxPercentageAmount should be number. 2025-03-18 17:25:58 +01:00
57e37d5736 OVPAY-1518 - Updated examples to Odata. 2025-03-18 16:48:09 +01:00
f43626dcc7 OVPAY-1518 - Added security schemas. 2025-03-18 15:15:07 +01:00
5724c0c3cf OVPAY-1518 - And I "quote" ... 2025-03-18 15:09:22 +01:00
93a0099943 OVPAY-1518 - Updated schemas of Odata GET requests. 2025-03-18 15:07:34 +01:00
25cbf6dc10 OVPAY-1518 - Updated endpoints so they correspond to WSO2. 2025-03-18 13:51:31 +01:00
6b2d1788f4 Merge pull request 'Simple Java tool to generate ABTProducts PUT request body from GET response body' (#25) from feature/Java-products-PUT-generator into develop
Reviewed-on: #25
Reviewed-by: Bas Boterman <b.boterman@htm.nl>
2025-03-17 15:19:26 +00:00
79dbbe14ff OVPAY-1564 - Added token information to POST orders. 2025-03-17 13:37:45 +01:00
1d2d767f31 Merge pull request 'feature/OVPAY-1293' (#10) from feature/OVPAY-1293 into develop
Reviewed-on: #10
2025-03-17 09:58:53 +00:00
efb62a6abd OVPAY-1293 - Processed review remarks myself. 2025-03-17 10:57:15 +01:00
Max Martens
d1a9cb4cd0 Tweak logging and readme 2025-03-17 10:00:46 +01:00
Max Martens
35f9cccc05 Add project files, ready to use standalone jar, readme, example input+output 2025-03-17 08:52:38 +01:00
383ea04bcc OVPAY-1564 - Changes in POST /orders. 2025-03-14 18:01:05 +01:00
387bf909ad OVPAY-1564 - Typo in examples. 2025-03-14 09:30:01 +01:00
d9bfbe4c3d OVPAY-1637 - "ovPayTokenId" is a query param, not a path param. 2025-03-12 16:39:51 +01:00
bd67e51713 OVPAY-1637 - Moved "ovPayTokenId" to HATEOAS links. 2025-03-12 16:29:46 +01:00
df4500b643 OVPAY-1637 - Add "ovPayTokenId" to GET response bodies. 2025-03-12 11:41:29 +01:00
ae5ab74672 Merge pull request 'OVPAY-1352 - Added InvoiceAccountingStatus.' (#12) from feature/OVPAY-1352 into develop
Reviewed-on: #12
2025-03-12 10:13:58 +00:00
Max Martens
cd71fb3785 Merge branch 'feature/OVPAY-613-SE-productdetails' into develop 2025-03-11 13:11:26 +01:00
Max Martens
dc0435bb50 Change sellableTouchpointIds to lowercase P 2025-03-11 13:10:35 +01:00
Max Martens
b9c0408240 Merge remote-tracking branch 'origin/feature/OVPAY-612-SE-products-list' into develop 2025-03-07 11:36:21 +01:00
Max Martens
dcfdbeec34 Remove TP3 sellingPeriod that is not allowed to be seen by TP4 from examples 2025-03-06 15:29:20 +01:00
4f2543f57b Merge pull request 'features/correct-info-STUB-products-touchpoint=4' (#20) from features/correct-info-STUB-products-touchpoint=4 into feature/OVPAY-613-SE-productdetails
Reviewed-on: #20
2025-03-06 11:15:09 +00:00
Max Martens
0860a79267 Also persist changes in SE products yaml 2025-03-06 09:58:30 +01:00
Max Martens
11462b1608 Merge branch 'feature/OVPAY-613-SE-productdetails' into features/correct-info-STUB-products-touchpoint=4 2025-03-06 08:39:27 +01:00
Max Martens
3c4e567176 Merge branch 'develop' into feature/OVPAY-613-SE-productdetails 2025-03-06 08:13:59 +01:00
Max Martens
40d00ae61b Merge branch 'feature/OVPAY-613-SE-productdetails' into features/correct-info-STUB-products-touchpoint=4 2025-03-06 08:12:55 +01:00
Max Martens
712564001c Tweak examples to return empty arrays as [] instead of null 2025-03-06 08:05:09 +01:00
43ace0543c small fix for consistency 2025-03-05 14:35:40 +01:00
5864d43b0f added extra scenario 2025-03-05 14:31:39 +01:00
c712184e9f created correct example in the product list for touchpoint 4 (infoplaza) 2025-03-05 14:23:01 +01:00
dfb48bbcd1 Merge branch 'feature/OVPAY-613-SE-productdetails' of https://git.integratielaag.nl/HTM/ovpay into features/correct-info-STUB-products-touchpoint=4 2025-03-05 14:16:33 +01:00
c8368ab003 OVPAY-1518 - Changed GET query params to OData. 2025-03-05 14:08:57 +01:00
8eb6ebc29d Merge pull request 'features/OVPAY-1566' (#17) from features/OVPAY-1566 into develop
Reviewed-on: #17
2025-03-05 10:56:23 +00:00
6e5a903331 merged develop 2025-03-05 11:55:33 +01:00
3867478718 fixed my search&replace errors 2025-03-05 11:42:50 +01:00
e2c768804a fixed semantic error CRUD order 2025-03-05 10:48:09 +01:00
151a23c39a OVPAY-1518 - Added priority to endpoints. 2025-03-05 10:23:49 +01:00
bed4dddf3b OVPAY-1518 - Replaced asterisk by query param. 2025-03-04 12:42:01 +01:00
976293e617 OVPAY-1563 - Added query param contractInvoiceId. 2025-03-04 10:55:20 +01:00
dc4674202a OVPAY-1562 - Added query param resourceNameId. 2025-03-04 10:16:51 +01:00
2350b40e9b OVPAY-1518 - Added sort, limit, offset query params to GET operations. 2025-03-03 16:20:40 +01:00
18ffc699c7 OVPAY-1518 - Obfuscate names. 2025-03-03 14:23:23 +01:00
cd828981c5 OVPAY-1518 - Fixed bug in SourceMetadataPostRequestBody. 2025-03-03 14:14:24 +01:00
2b754dfb75 OVPAY-1518 - TaxPercentageAmount is a number. 2025-03-03 14:10:28 +01:00
d39a4ba51d OVPAY-1518 - No more seagulls. 2025-03-03 12:34:26 +01:00
Max Martens
cc7da9d69e Split up Swagger in two separate files with SE and TP URI, to accommodate two separate stubs 2025-02-27 16:33:52 +01:00
bd3f3e68a6 Addede delete address to CRUD 2025-02-26 16:17:17 +01:00
8461b117bd added delete on order address 2025-02-26 16:11:39 +01:00
2bf79f1fa0 versionering and additional remarks 2025-02-26 15:53:12 +01:00
Max Martens
c21f8f9e34 Add example showing how to handle null attributes 2025-02-26 09:41:47 +01:00
Max Martens
9b00a42d5d Fix URI 2025-02-24 16:49:14 +01:00
8c470c790c small fix 2025-02-24 15:54:37 +01:00
f190a007b8 mandate create in crud 2025-02-24 14:23:16 +01:00
76c5fd1804 v3.0 orders 2025-02-24 13:59:28 +01:00
caf927cae5 creating orderv2.3 2025-02-24 12:16:41 +01:00
db12ae5f62 added sort query param 2025-02-21 16:53:17 +01:00
c9b445b54b removed duplicate bic 2025-02-21 14:57:42 +01:00
12126253ac changed swift to bic inline with orders 2025-02-21 14:29:32 +01:00
67109e7217 pagination examples 2025-02-21 12:43:12 +01:00
298f089d6c added billing information CRUD en some tidying 2025-02-21 11:33:54 +01:00
030f4a2087 OVPAY-1518 - Minor documentation improvements. 2025-02-20 13:20:14 +01:00
40795f380a OVPAY-1518 - Added POST and PATCH examples for Processing Failure v2. 2025-02-20 13:11:36 +01:00
d496370cbe OVPAY-1518 - Added POST and PATCH examples for Metadata v2. 2025-02-20 11:48:14 +01:00
d0f2335acb OVPAY-1518 - Added POST and PATCH exampels for Booking Processes v2. 2025-02-20 11:26:50 +01:00
5fc879d685 OVPAY-1518 - Added final GET examples. 2025-02-20 10:38:01 +01:00
4a123f11ee OVPAY-1518 - Added GET /transactionitems/responsestatus/* 2025-02-20 10:05:40 +01:00
972219271e OVPAY-1518 - Added examples for GET Booking Processes v2. 2025-02-19 18:04:11 +01:00
7b2cf2f579 OVPAY-1518 - Added examples for Audit Trail v2. 2025-02-19 15:30:17 +01:00
71ab5176b5 OVPAY-1518 - Added examples for GET Metadata v2. 2025-02-19 13:39:49 +01:00
8e77c34615 OVPAY-1518 - Added examples for Transactions v2. 2025-02-19 11:18:03 +01:00
9106b99988 Merge pull request 'feature/OVPAY-1518' (#16) from feature/OVPAY-1518 into develop
Reviewed-on: #16
2025-02-18 15:39:00 +00:00
19afac017d OVPAY-1518 - Swapped concessionId. 2025-02-18 14:58:45 +01:00
36a2ccb03c OVPAY-1518 - Processed review remarks from data architect. 2025-02-18 14:51:44 +01:00
8b41cbd7c8 OVPAY-1518 - Bugfix. 2025-02-18 13:32:10 +01:00
3c25c250c2 OVPAY-1518 - Added endpoints for booking processes. 2025-02-18 13:28:44 +01:00
aa813cdabe OVPAY-1518 - Metadata audit trails are deprecated in favor of Elastik. 2025-02-18 11:28:50 +01:00
fd2ae8fa65 OVPAY-1518 - Removed legacy metadata 2. 2025-02-18 11:27:19 +01:00
7a50655408 OVPAY-1518 - Removed legacy metadata. 2025-02-18 11:15:41 +01:00
b115c0aed8 OVPAY-1518 - Updated /transactionitems. 2025-02-18 10:55:21 +01:00
683b12f6eb started on mandates 2025-02-17 17:44:50 +01:00
8f8a044fde tokens 2025-02-17 14:26:37 +01:00
028f970130 tokens 2025-02-17 14:22:39 +01:00
8463961f60 phones 2025-02-17 12:43:19 +01:00
b3d8d0d053 phones 2025-02-17 12:38:13 +01:00
c6b53d46ac phones 2025-02-17 12:37:13 +01:00
6c229b48b3 phone 2025-02-17 12:35:20 +01:00
dcb7d1b564 address 2025-02-17 12:04:17 +01:00
0ea5d1532a address 2025-02-17 11:55:32 +01:00
96f77d8f2f customerStatus 2025-02-17 11:16:55 +01:00
Max Martens
bfb62d7822 Fix parentProducId, remove customerSegments 2025-02-12 17:27:34 +01:00
5ebc012ceb updated existing CRUD with valid examples for stub 2025-02-10 17:46:17 +01:00
Max Martens
d87b3bb381 Fix productGroupMetadata in examples 2025-02-10 17:12:54 +01:00
Max Martens
5fab4e8dcc Process feedback
Remove 403 error description, add 404 example in correct RFC9457 format, refactor example labels, remove non-occurring errors
2025-02-10 17:05:40 +01:00
Max Martens
5ef6777aad Merge branch 'develop' into feature/OVPAY-613-SE-productdetails 2025-02-10 15:05:18 +01:00
b0e4a73d9a Merge pull request 'OVPAY-1433 - Added order fulfillment and order creation v2.2.' (#14) from feature/OVPAY-1433 into develop
Reviewed-on: #14
2025-02-10 12:50:44 +00:00
2bb61cbe98 Merge branch 'develop' into feature/OVPAY-1433 2025-02-10 12:49:08 +00:00
90e493fb07 OVPAY-1518 - Update TransactionAuditTrails. 2025-02-06 12:48:13 +01:00
7a5a6685b5 OVPAY-1518 - Update ProcessingFailures. 2025-02-06 12:11:14 +01:00
0d61d06198 OVPAY-1518 - Update TransactionItems data mode. 2025-02-06 10:49:44 +01:00
Max Martens
30bf97ba7a Add examples for productdetails tree with one and two-layer depth 2025-02-05 14:17:03 +01:00
Max Martens
024e14f31c Remove some remaining pagination stuff, add Regio Vrij details example, add more explanation and example descriptions 2025-02-05 13:48:50 +01:00
158cac33ed Merge pull request 'feature/OVPAY-612-SE-products-list' (#13) from feature/OVPAY-612-SE-products-list into develop
Reviewed-on: #13
2025-02-05 09:36:28 +00:00
3f4001ed4d OVPAY-1433 - Fulfillment now accepts externalOrderId and externalOrderLineId. 2025-02-03 14:56:01 +01:00
c6a5a456dd OVPAY-1433 - Removed touchPointId from v2.2. 2025-02-03 13:46:43 +01:00
2a1641cd4a OVPAY-1433 - Removed customerProfileId from v2.2. 2025-02-03 13:28:00 +01:00
1b0a6ba208 OVPAY-879 - Update FIKO bulk endpoint. 2025-01-28 13:48:44 +01:00
093b826f2b OVPAY-1433 - Added order fulfillment and order creation v2.2. 2025-01-28 11:00:09 +01:00
023bcf8aa5 Merge pull request 'feature/OVPAY-1210' (#9) from feature/OVPAY-1210 into develop
Reviewed-on: #9
2025-01-27 14:57:37 +00:00
2c9fcfef59 Merge branch 'develop' into feature/OVPAY-1210 2025-01-27 14:56:38 +00:00
Max Martens
2c07cc192b SE Products List endpoint spec 2025-01-24 13:39:50 +01:00
Max Martens
843256cb13 Merge branch 'feature/OVPAY-1210' into feature/OVPAY-612-SE-products-list 2025-01-24 13:13:09 +01:00
997d3e1d0e OVPAY-1352 - Added InvoiceAccountingStatus. 2025-01-20 11:09:26 +01:00
8f8edfacb0 OVPAY-526 - Add single transaction is deprecated. 2025-01-16 13:08:06 +01:00
04d251a3e2 Typo in serviceReferenceId example 2025-01-16 11:25:01 +01:00
b869b712a2 OVPAY-526 - Added external endpoints. 2025-01-16 10:44:36 +01:00
89fb3c8e1d Merge branch 'develop' of https://git.integratielaag.nl/HTM/ovpay into develop 2025-01-14 17:07:11 +01:00
5fb74ece06 Added refunds endpoint to ClaimsAPI. 2025-01-14 17:07:01 +01:00
8af1bed739 Merge pull request 'feature/OVPAY-96' (#8) from feature/OVPAY-96 into develop
Reviewed-on: #8
2025-01-09 16:30:24 +00:00
19ecad4a1d Merge branch 'develop' into feature/OVPAY-96 2025-01-09 16:29:51 +00:00
f44cb89138 billing alias example updated 2025-01-06 16:50:16 +01:00
8a5aba4bf5 added additional query params 2025-01-06 15:46:35 +01:00
3994e0ea90 semantic errors 2025-01-06 15:19:00 +01:00
fcc0740130 query params 2025-01-06 15:16:27 +01:00
42dce39642 first fixes 2025-01-06 12:41:45 +01:00
27351f1101 more stuff 2024-12-19 11:58:36 +01:00
dad9ece546 stuff 2024-12-19 11:55:25 +01:00
c5fa6746a2 hoofdentiteit volgens specs 2024-12-19 11:49:39 +01:00
cb0c79f68c removed to much 2024-12-19 11:47:23 +01:00
0c6c93a507 removed unnecessary schema's 2024-12-19 09:56:15 +01:00
10a4147869 fixed semantic error 2024-12-19 09:48:48 +01:00
6526db8a1d updated get customer list + get customer to include all query params and correct ref objects in response 2024-12-18 21:28:12 +01:00
1f04619ff7 added current state of customers CRUD as on WSO2 atm 2024-12-18 16:04:37 +01:00
Max Martens
ae387e822c Update description 2024-12-16 17:26:38 +01:00
Max Martens
53aa8cc62c Typo 2024-12-16 17:25:09 +01:00
Max Martens
d0acf2b465 Add optional parentProductId query parameter 2024-12-16 17:23:41 +01:00
Max Martens
3d415ab5ab Merge branch 'develop' into feature/OVPAY-96 2024-12-05 15:48:10 +01:00
Max Martens
ee8cdfc660 Remove _templates, add self under _links, add some new links and attributes 2024-12-05 15:23:37 +01:00
Max Martens
53adc797a1 Merge branch 'develop' into feature/OVPAY-96 2024-12-05 14:52:29 +01:00
Max Martens
7c666aa351 RC1 2024-12-04 17:40:58 +01:00
Max Martens
a6878b9a34 WIP 3 2024-12-04 16:03:10 +01:00
Max Martens
c04530e616 Process comments 2024-12-03 15:40:40 +01:00
Max Martens
33eef638d2 WIP update 2024-12-03 09:43:43 +01:00
Max Martens
feaaec2a53 WIP GET customers, GET OvPayTokens with HATEOAS 2024-12-03 09:00:49 +01:00
3eb98b0d23 Update src/openapi/customers/SE-customers.yaml
Added Get Customer V2- first draft
2024-12-02 14:59:28 +00:00
Max Martens
eab79163cf First commit, still WIP 2024-11-25 17:03:28 +01:00
37 changed files with 25178 additions and 3480 deletions

View File

@ -0,0 +1,307 @@
########################
## ##
## 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

@ -0,0 +1,38 @@
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

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

View File

@ -0,0 +1,7 @@
<?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

@ -0,0 +1,14 @@
<?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

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

View File

@ -0,0 +1,12 @@
# 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

@ -0,0 +1,160 @@
{
"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

@ -0,0 +1,59 @@
{
"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

@ -0,0 +1,58 @@
{
"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

@ -0,0 +1,67 @@
<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

@ -0,0 +1,313 @@
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

@ -0,0 +1,202 @@
{
"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

@ -0,0 +1,17 @@
<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

@ -0,0 +1,482 @@
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

@ -0,0 +1,477 @@
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

@ -0,0 +1,268 @@
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,6 +213,19 @@ paths:
"updated": "2024-06-02 15:01:00.000",
"state": "invoice_created",
"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",
@ -222,6 +235,19 @@ paths:
"updated": "2024-07-02 15:01:00.000",
"state": "invoice_created",
"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":
@ -271,6 +297,19 @@ paths:
"updated": "2024-06-02 15:01:00.000",
"state": "invoice_created",
"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",
@ -280,6 +319,19 @@ paths:
"updated": "2024-07-02 15:01:00.000",
"state": "invoice_created",
"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":
@ -400,6 +452,16 @@ paths:
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "32785417-1fb8-42c7-bda1-533f5868809f",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
},
],
},
@ -459,7 +521,7 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/ContractVersion"
$ref: "#/components/schemas/InvoiceAccountingStatus"
example:
{
"contractVersion":
@ -567,6 +629,16 @@ paths:
"state": "invoice_sent",
"data": "{json}",
"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",
@ -577,6 +649,16 @@ paths:
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "84af0f01-0416-4860-851a-a0d4b3cf674a",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-06-02 15:01:00.000",
"description": null,
},
],
},
],
}
@ -601,6 +683,15 @@ paths:
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": 1,
"createdOn",
"2024-07-02 15:01:00.000",
"description": null,
},
],
},
}
responses:
@ -624,6 +715,14 @@ paths:
tags:
- ContractInvoice
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
name: contractId
schema:
@ -713,6 +812,16 @@ paths:
"state": "invoice_created",
"data": "{json}",
"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",
@ -724,6 +833,16 @@ paths:
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
"invoiceAccountingStatuses":
[
{
"invoiceAccountingStatusId": "84af0f01-0416-4860-851a-a0d4b3cf674a",
"accountingStatus":
{ "accountingStatusId": 1, "name": "open" },
"createdOn": "2024-08-02 15:01:00.000",
"description": null,
},
],
},
],
}
@ -770,6 +889,43 @@ paths:
"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:
parameters:
- in: path
@ -1060,6 +1216,37 @@ components:
isCredit:
type: boolean
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:
type: object
properties:
@ -1068,7 +1255,16 @@ components:
example: 2
name:
type: string
enum: [new, active, suspended, cancelled, terminated, pending cancellation, pending termination]
enum:
[
new,
active,
suspended,
cancelled,
terminated,
pending cancellation,
pending termination,
]
example: active
ActionType:
type: object

View File

@ -4,7 +4,7 @@ info:
version: "1.0"
description: Service Engine APIs for ABT Contracts v2. These are NOT the CRUD APIs to the data hub.
servers:
- url: https://api.integratielaag.nl/v1
- url: https://api.integratielaag.nl/abt/touchpoint/1.0
paths:
/customers/contracts:
parameters:
@ -27,40 +27,65 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
[
{
"contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000",
},
{
"contractId": "f07253e6-c364-474c-a342-a10a4a7cf305",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "945d43e6-516e-425b-8847-9aba41289acd",
"orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8",
"touchpointId": 2,
"contractStatus": { "contractStatusId": 1, "name": "new" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"created": "2024-08-01 15:01:00.000",
},
]
examples:
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",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"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",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "945d43e6-516e-425b-8847-9aba41289acd",
"orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 1, "name": "new" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"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}:
parameters:
- in: header
@ -112,75 +137,93 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"contractId": "5a3876a1-e9a1-4278-8983-4679a8d583c2",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus": { "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"contractVersions":
[
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"termAmountExclTax": 1200,
"taxCode": "V21",
"taxAmount": 108,
"termAmountInclTax": 1308,
"start": "2024-07-04 15:01:00.000",
"end": "2024-12-31 15:01:00.000",
},
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"termAmountExclTax": 1300,
"taxCode": "V21",
"taxAmount": 117,
"termAmountInclTax": 1417,
"start": "2025-01-01 15:01:00.000",
},
],
"contractActions":
[
{
"contractActionId": "67687851-59dd-4bbc-aa74-0f7abd26c883",
"actionType": { "actionTypeId": 1, "name": "create" },
"user": "subid123456",
"timestamp": "2024-07-02 15:01:00.000",
"details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
},
{
"contractActionId": "ea9ad287-9cd3-4e76-bcb9-d71db551cf55",
"actionType": { "actionTypeId": 2, "name": "change" },
"user": "subid123456",
"timestamp": "2024-07-03 15:01:00.000",
"details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
},
],
"contractInvoices":
[
{
"contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f",
"externalReference": "F2024-0001",
"term": 1,
"created": "2024-07-02 15:01:00.000",
"updated": "2024-07-02 15:01:00.000",
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
},
],
}
examples:
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",
"contractNumber": "D123456",
"customerProfileId": 42,
"orderId": "eb3d08f7-7feb-4f31-9f5b-daa634e51f48",
"orderLineId": "52efbbfc-8c28-4016-9ece-dc3ef9a70bd8",
"touchpointId": 2,
"contractStatus":
{ "contractStatusId": 2, "name": "active" },
"productId": 1,
"productName": "HTM Maand 20% korting",
"termDuration": "P0Y1M0D",
"billingDay": 15,
"highestInvoiceTerm": 1,
"ovPayTokenId": 1337,
"contractVersions":
[
{
"contractVersionId": 1,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"termAmountExclTax": 1200,
"taxCode": "V21",
"taxAmount": 108,
"termAmountInclTax": 1308,
"start": "2024-07-04 15:01:00.000",
"end": "2024-12-31 15:01:00.000",
},
{
"contractVersionId": 2,
"termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/",
"termAmountExclTax": 1300,
"taxCode": "V21",
"taxAmount": 117,
"termAmountInclTax": 1417,
"start": "2025-01-01 15:01:00.000",
},
],
"contractActions":
[
{
"contractActionId": "67687851-59dd-4bbc-aa74-0f7abd26c883",
"actionType":
{ "actionTypeId": 1, "name": "create" },
"user": "subid123456",
"timestamp": "2024-07-02 15:01:00.000",
"details": "Contract created",
"correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee",
},
{
"contractActionId": "ea9ad287-9cd3-4e76-bcb9-d71db551cf55",
"actionType":
{ "actionTypeId": 2, "name": "change" },
"user": "subid123456",
"timestamp": "2024-07-03 15:01:00.000",
"details": "Contract changed",
"correlationId": "e2462347-6749-4841-b42a-cf8de19ec727",
},
],
"contractInvoices":
[
{
"contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f",
"externalReference": "F2024-0001",
"term": 1,
"created": "2024-07-02 15:01:00.000",
"updated": "2024-07-02 15:01:00.000",
"state": "invoice_created",
"data": "{json}",
"isCredit": false,
},
],
"_links":
{
"get_token":
{
"href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPayTokenId=1337",
"method": "GET",
},
},
}
/customers/contracts/{contractId}/invoices:
parameters:
- in: header
@ -210,31 +253,37 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
[
{
"contractInvoiceId": "8699d72a-cf4d-4e6b-9e9c-549d837ca51f",
"contractId": "9e224750-3065-471d-af57-85b9cffa7c89",
"externalReference": "F2024-0001",
"term": 1,
"created": "2024-07-02 15:01:34.000",
"updated": "2024-07-04 00:04:56.000",
"state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0001",
"isCredit": false,
},
{
"contractInvoiceId": "0e729101-2c84-44db-8b18-d8f759e968e0",
"contractId": "9e224750-3065-471d-af57-85b9cffa7c89",
"externalReference": "F2024-0002",
"term": 2,
"created": "2024-08-02 15:01:34.000",
"updated": "2024-08-04 00:04:56.000",
"state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0002",
"isCredit": false,
},
]
examples:
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",
"contractId": "9e224750-3065-471d-af57-85b9cffa7c89",
"externalReference": "F2024-0001",
"term": 1,
"created": "2024-07-02 15:01:34.000",
"updated": "2024-07-04 00:04:56.000",
"state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0001",
"isCredit": false,
},
{
"contractInvoiceId": "0e729101-2c84-44db-8b18-d8f759e968e0",
"contractId": "9e224750-3065-471d-af57-85b9cffa7c89",
"externalReference": "F2024-0002",
"term": 2,
"created": "2024-08-02 15:01:34.000",
"updated": "2024-08-04 00:04:56.000",
"state": "invoice_created",
"public_link": "http://mijnfactuurinzien.nl/F2024-0002",
"isCredit": false,
},
]
/contracts/{contractId}/cancellationmoments:
parameters:
- in: header
@ -264,14 +313,19 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"cancellationMoment": "termBound",
"termDuration": "P1M",
"billingDay": 18,
"cancellationFrom": "2024-08-10T00:00:00",
"cancellationUntil": "2026-08-10T00:00:00"
}
examples:
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",
"termDuration": "P1M",
"billingDay": 18,
"cancellationFrom": "2024-08-10T00:00:00",
"cancellationUntil": "2026-08-10T00:00:00",
}
/contracts/{contractId}/cancellationvalidation:
parameters:
- in: header
@ -300,10 +354,12 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"end": "2024-08-10T00:00:00"
}
examples:
Validate a cancellation of a given end date:
summary: Validate a cancellation of a given end date
description: |
Validate a cancellation of a given end date.
value: { "end": "2024-08-10T00:00:00" }
responses:
"200":
description: OK
@ -311,14 +367,32 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"validationResult": "true",
"validationMessage": "",
"end": "2024-08-10T03:59:59",
"refundAmount": "2489",
"refundMethods": [ "creditInvoice", "iDeal" ]
}
examples:
Successfully validated cancellation:
summary: Successfully validated cancellation
description: |
Successfully validated a cancellation. The response contains
the refund amount and refund methods.
value:
{
"validationResult": true,
"validationMessage": "",
"end": "2024-08-10T03:59:59",
"refundAmount": 2489,
"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:
parameters:
- in: header
@ -343,15 +417,17 @@ paths:
- SE Contract Cancellation v2
requestBody:
required: true
content:
content:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"end": "2024-08-10T00:00:00",
"refundMethod": "creditInvoice"
}
examples:
Cancellation request for credit invoice:
summary: Cancellation request for credit invoice
description: |
Cancellation request for credit invoice.
value:
{ "end": "2024-08-10T00:00:00", "refundMethod": "creditInvoice" }
responses:
"200":
description: OK
@ -359,12 +435,18 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/unavailable"
example:
{
"end": "2024-08-10T03:59:59",
"refundAmount": "2489",
"refundMethod": "creditInvoice"
}
examples:
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",
"refundAmount": 2489,
"refundMethod": "creditInvoice",
}
components:
securitySchemes:
bearerToken:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -294,164 +294,6 @@ paths:
- default: []
x-auth-type: Application & Application User
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:
get:
tags:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,206 @@
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

@ -0,0 +1,180 @@
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,6 +52,13 @@ paths:
example: 2024-10-04T12:34:56.000
required: false
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
name: resourceName
schema:

View File

@ -0,0 +1,159 @@
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

@ -0,0 +1,65 @@
<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

@ -0,0 +1,77 @@
<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>