From 038427ffc16553e20292de687bbfd2f84b1b58c2 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Fri, 18 Apr 2025 11:08:22 +0200 Subject: [PATCH 01/39] OVPAY-12 74Added FIKO example XML. --- .../examples/codaSoapRequestPostToBook.xml | 65 ++++++++++++++++ src/u4f/examples/exampleBooking.xml | 77 +++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/u4f/examples/codaSoapRequestPostToBook.xml create mode 100644 src/u4f/examples/exampleBooking.xml diff --git a/src/u4f/examples/codaSoapRequestPostToBook.xml b/src/u4f/examples/codaSoapRequestPostToBook.xml new file mode 100644 index 0000000..8b05e6c --- /dev/null +++ b/src/u4f/examples/codaSoapRequestPostToBook.xml @@ -0,0 +1,65 @@ + + + + + + + 1HTM + OPBR-FIKO + + 0 + 2024-11-25T00:00:00.000Z + 2024/7 + EUR + 2024-07-25T00:00:00.000Z + 1HTM + OPBR-FIKO + + wfl_no_completion + + salesinv_notyetinv + + + + 1 + 100.12400.D150000001 + 100.00 + summary + debit + dl_orig_defined + test + 987654 + test987654 + none + none + + + 2 + 642.41236.609311 + 100.00 + + analysis + credit + dl_orig_defined + none + none + + + + + OPBR-FIKO + + + + + \ No newline at end of file diff --git a/src/u4f/examples/exampleBooking.xml b/src/u4f/examples/exampleBooking.xml new file mode 100644 index 0000000..b50049a --- /dev/null +++ b/src/u4f/examples/exampleBooking.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + 1HTM + VERK_FACTUUR + + 0 + 2024/5 + EUR + 2024-06-05T00:00:00.000Z + DW12345 + + + + 1 + 1200.D001 + 121.00 + summary + credit + dl_orig_defined + Nov 2020 Huur + DW12345 + + + 21.00 + false + + + 2 + 4300 + 100.00 + analysis + debit + dl_orig_defined + Voorschot Q1. + Ref. DW12345 + + + false + + + 21% + 21% BTW + 21.00 + + + + + 3 + 1400 + 21.00 + tax + debit + dl_orig_gentax + Test DW + + + + 21% + 100.00 + + + + + FACTUUR_VER + + + + + \ No newline at end of file From 4c8032a4e0d323d9d68a369ed8c8cd338b2875e0 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Wed, 30 Apr 2025 12:32:31 +0200 Subject: [PATCH 02/39] TP PAD Swagger with only final endpoints incouded --- src/openapi/apim/TP-PAD.yaml | 299 +++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 src/openapi/apim/TP-PAD.yaml diff --git a/src/openapi/apim/TP-PAD.yaml b/src/openapi/apim/TP-PAD.yaml new file mode 100644 index 0000000..2e70980 --- /dev/null +++ b/src/openapi/apim/TP-PAD.yaml @@ -0,0 +1,299 @@ +openapi: 3.0.1 +info: + title: Personal Account Data (PAD) APIs for TouchPoint + description: >- + 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 + description: API ABT GBO APIM +tags: + - name: Personal Data APIs for TouchPoint + description: Personal Data APIs for TouchPoint, no Service Engine in between! +paths: + /personal-data/{xtat}: + post: + tags: + - Personal Data APIs for TouchPoint + 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 TouchPoint + 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 TouchPoint + 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 TouchPoint + 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' +components: + schemas: + 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 \ No newline at end of file From 38b7e2240c98eb13d77f78b6011463e3d6c93f17 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Wed, 30 Apr 2025 12:38:01 +0200 Subject: [PATCH 03/39] Niceness --- src/openapi/apim/TP-PAD.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/openapi/apim/TP-PAD.yaml b/src/openapi/apim/TP-PAD.yaml index 2e70980..fe2ae98 100644 --- a/src/openapi/apim/TP-PAD.yaml +++ b/src/openapi/apim/TP-PAD.yaml @@ -1,21 +1,21 @@ openapi: 3.0.1 info: - title: Personal Account Data (PAD) APIs for TouchPoint - description: >- + title: Personal Account Data (PAD) APIs for touchpoints + description: |- + APIs for touchpoints 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 - description: API ABT GBO APIM tags: - - name: Personal Data APIs for TouchPoint - description: Personal Data APIs for TouchPoint, no Service Engine in between! + - name: Personal Data APIs for touchpoints + description: Personal Data APIs for touchpoints, no Service Engine in between! paths: /personal-data/{xtat}: post: tags: - - Personal Data APIs for TouchPoint + - 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; @@ -90,7 +90,7 @@ paths: $ref: '#/components/schemas/ErrorResponse' get: tags: - - Personal Data APIs for TouchPoint + - 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 @@ -137,7 +137,7 @@ paths: $ref: '#/components/schemas/ErrorResponse' patch: tags: - - Personal Data APIs for TouchPoint + - 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 @@ -184,7 +184,7 @@ paths: /personal-data/generate-otp: get: tags: - - Personal Data APIs for TouchPoint + - Personal Data APIs for touchpoints summary: Trigger OTP email for the given xTAT or e-mail address, to prove ownership operationId: GenerateOtp description: |- From 6c3a15134e3426b67e166356cfa25794976fef2e Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 30 Apr 2025 15:39:36 +0200 Subject: [PATCH 04/39] OVPAY-1742 - Added /compare endpoint. --- src/openapi/customers/SE-customers.yaml | 2559 ++++++++++++----------- 1 file changed, 1368 insertions(+), 1191 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index d814fc5..e181edb 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -4,7 +4,7 @@ info: description: >- Service Engine APIs for HTM Customers. These are NOT the CRUD APIs to access raw data in the database. To be used by touchpoints to get information about HTM customers. - version: '1.0' + version: "1.0" servers: - url: https://api.integratielaag.nl/v1/touchpoint tags: @@ -21,7 +21,7 @@ paths: description: Get a single customer profile based on search parameters. Only returns a profile if a single result matches the parameters; when multiple results are found, additional seach parameters are required to disambiguate. parameters: - name: customerProfileId - in: query + in: query schema: type: integer example: 1 @@ -44,7 +44,7 @@ paths: in: query schema: type: integer - example: 1 + example: 1 - name: birthname in: query schema: @@ -71,138 +71,134 @@ paths: in: query schema: type: string - example: Sesamestreet + example: Sesamestreet - name: addressHouseNumber in: query schema: type: integer - example: 1 + example: 1 - name: addressHouseNumberSuffix in: query schema: type: string - example: A + example: A - name: addressPostalCode in: query schema: type: string - example: 1234 AB + example: 1234 AB - name: addressCity in: query schema: type: string - example: The Hague + example: The Hague - name: addressCountry in: query schema: type: string - example: The Netherlands + example: The Netherlands - name: phoneNumber in: query schema: type: string - example: "0123456789" + example: "0123456789" - name: ovChipcardNumber in: query schema: type: integer - example: 0123456789 + example: 0123456789 - name: ovChipcardAlias in: query schema: type: string - example: My ovchipcard + example: My ovchipcard - name: ovPayTokenNumber in: query schema: type: integer - example: 0123456789 + example: 0123456789 - name: ovPayTokenAlias in: query schema: type: string - example: My Ov Pay Token + example: My Ov Pay Token - name: ovPayTokenXTat in: query schema: type: string - example: 180d04e0-a721-447e-a1d9-b416937b43bc + example: 180d04e0-a721-447e-a1d9-b416937b43bc - name: ovPayTokenXBot in: query schema: type: string example: e1307c73-676a-4d07-967b-6141276f7c7c responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/CustomersResponse' - '404': - description: No customer found - content: - application/json: - example: - { - "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", - "apiErrorCode": "400.1", - "title": "Niet gevonden", - "detail": "Klant niet gevonden", - "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7", - "errors": [ - { - "subApiErrorCode": "0017" - } - ] - } - '409': - description: Multiple customers found - content: - application/json: - example: - { - "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", - "apiErrorCode": "409.1", - "title": "Meer dan 1 klantprofiel gevonden", - "detail": "Meer dan 1 klantprofiel gevonden. Verfijn je zoekcriteria.", - "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7" - } + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/CustomersResponse" + "404": + description: No customer found + content: + application/json: + example: + { + "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", + "apiErrorCode": "400.1", + "title": "Niet gevonden", + "detail": "Klant niet gevonden", + "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7", + "errors": [{ "subApiErrorCode": "0017" }], + } + "409": + description: Multiple customers found + content: + application/json: + example: + { + "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", + "apiErrorCode": "409.1", + "title": "Meer dan 1 klantprofiel gevonden", + "detail": "Meer dan 1 klantprofiel gevonden. Verfijn je zoekcriteria.", + "instance": "555d00b5-bc3f-4591-949b-479e76d49ea7", + } /customers/tokens: get: - tags: + tags: - Customers parameters: - - name: X-HTM-JWT-AUTH-HEADER - in: header + - name: X-HTM-JWT-AUTH-HEADER + in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - in: header + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false - description: The customerProfileId of a customer in the case of the SMP - - name: X-HTM-ROLE-HEADER - in: header + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header schema: type: string example: Customer required: false description: The role of the HTM employee in the case of the SMP - - name: ovPayTokenId - in: query + - name: ovPayTokenId + in: query schema: type: integer example: 1 required: false description: The ovpay token id of a specific customer token - - name: tokenTypeId - in: query + - name: tokenTypeId + in: query schema: type: array items: @@ -210,53 +206,53 @@ paths: explode: false description: Filter on tokentype. 1 = EMV, 2 = OV-pas physical, 3 = OV-pas digital required: false - - name: xTat - in: query + - name: xTat + in: query schema: type: string example: 4c2d60e2-cd03-4c80-ae70-573a301f0bff required: false description: Filter on the xTat of a customer token - - name: xBot - in: query + - name: xBot + in: query schema: type: string example: 91641b54-056c-49ea-b598-ccde81d6c45a required: false description: Filter on the xBot of a customer token - - name: ovpasNumber - in: query + - name: ovpasNumber + in: query schema: type: string example: 56HYRTL required: false description: Filter on the OV pasNumber of a customer token of type OV Pas - - name: lastDigits - in: query + - name: lastDigits + in: query schema: type: string example: 1234 required: false description: Filter on the last digits of a customer token of type EMV - - name: tokenStatusId - in: query + - name: tokenStatusId + in: query schema: type: array items: type: integer explode: false description: Filter on token status. 1 = Retired, 2 = Active, 3 = Replaced (*), 4 = On Stock, 5 = Suspended, 6 = Removed by customer (*), 7 = Renewed Active - required: false - - name: expirationDate - in: query + required: false + - name: expirationDate + in: query schema: type: string format: date-time example: 2027-01-01T09:00:00Z required: false - description: Filter on the expirationDate of a customer token - - name: replacedByTokenId - in: query + description: Filter on the expirationDate of a customer token + - name: replacedByTokenId + in: query schema: type: integer example: 2 @@ -265,7 +261,7 @@ paths: summary: Get a list of all OvPayTokens for a certain customer. description: Get a list of all OvPayTokens for a certain customer, only returns the tokens for an identified customer through JWT or customerProfileId in the headers. responses: - '200': + "200": description: OK content: application/json: @@ -277,671 +273,702 @@ paths: description: Empty token list value: { - "ovPayTokens": [ - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } + "ovPayTokens": [], + _links: + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", + }, + }, } EMV without PAD: summary: EMV without PAD description: EMV without PAD value: { - "ovPayTokens": [ + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/tokenPersonalizations?ovpaytokenId=1", + "method": "POST", + }, + }, + }, + ], + _links: { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/tokenPersonalizations?ovpaytokenId=1", - "method": "POST" - } - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } + }, } OV pas without PAD: summary: OV pas without PAD description: OV pas without PAD value: { - "ovPayTokens": [ - { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", + }, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "POST", + }, }, - "status": "ACTIVE", - "originDate": "2019-07-16T11:00:00+02:00" }, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" + ], + _links: + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "POST" - } - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } - } + }, + } OV pas with PAD and autoReload: summary: OV pas with PAD and autoReload description: OV pas with PAD and autoReload value: { - "ovPayTokens": [ - { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": { - "autoReloadAmount": 500, - "retailerReferenceId": "abc", - "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa", - "autoReloadRegistrationStatus": "ACTIVE", - "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z" - }, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": + { + "autoReloadAmount": 500, + "retailerReferenceId": "abc", + "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa", + "autoReloadRegistrationStatus": "ACTIVE", + "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z", + }, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", + }, + "personalAccountData": + { + "name": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "birthdate": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "update_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "PUT", + }, }, - "status": "ACTIVE", - "originDate": "2019-07-16T11:00:00+02:00" }, - "personalAccountData":{ - "name": { - "inaccuracyFlag": false, - "inaccuracyFlagReason": null, - "inaccuracyFlagSetCounter": 0, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" + ], + _links: + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", }, - "birthdate": { - "inaccuracyFlag": false, - "inaccuracyFlagReason": null, - "inaccuracyFlagSetCounter": 0, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" - }, - "photo": { - "inaccuracyFlag": false, - "inaccuracyFlagReason": null, - "inaccuracyFlagSetCounter": 0, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" - } - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" - }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "update_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT" - } - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } - } + }, + } OV pas with partial PAD: summary: OV pas with partial PAD description: OV pas with partial PAD value: { - "ovPayTokens": [ - { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", + }, + "personalAccountData": + { + "name": null, + "birthdate": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": "Invalid birthdate", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": null, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "update_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "PUT", + }, }, - "status": "ACTIVE", - "originDate": "2019-07-16T11:00:00+02:00" }, - "personalAccountData":{ - "name": null, - "birthdate": { - "inaccuracyFlag": true, - "inaccuracyFlagReason": "Invalid birthdate", - "inaccuracyFlagSetCounter": 1, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" + ], + _links: + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", }, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" - }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "update_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT" - } - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } - } + }, + } OV pas with invalid PAD: summary: OV pas with invalid PAD description: OV pas with invalid PAD value: { - "ovPayTokens": [ + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", + }, + "personalAccountData": + { + "name": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "birthdate": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "update_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "PUT", + }, + }, + }, + ], + _links: { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 - }, - "status": "ACTIVE", - "originDate": "2019-07-16T11:00:00+02:00" - }, - "personalAccountData":{ - "name": { - "inaccuracyFlag": true, - "inaccuracyFlagReason": "T.B.D", - "inaccuracyFlagSetCounter": 1, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" - }, - "birthdate": { - "inaccuracyFlag": true, - "inaccuracyFlagReason": "T.B.D", - "inaccuracyFlagSetCounter": 1, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", }, - "photo": { - "inaccuracyFlag": true, - "inaccuracyFlagReason": null, - "inaccuracyFlagSetCounter": 1, - "isValidated": false, - "changeCounter": 0, - "maxUpdatesVerificationCount": 0, - "lastChangeDate": "2024-08-24T14:15:22Z" - } - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" - }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "update_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT" - } - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } - } - Token list with every status for tokenTypeId = 2, role = KlantenService : - summary: Token list with every status for tokenTypeId = 2, role = KlantenService + }, + } + ? Token list with every status for tokenTypeId = 2, role = KlantenService + : summary: Token list with every status for tokenTypeId = 2, role = KlantenService description: Token list with every status for tokenTypeId = 2, role = KlantenService value: { - "ovPayTokens": [ + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 0, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 1, + "ovPayTokenId": 6, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 3, "name": "Replaced (*)" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 18, + "ovPayTokenId": 13, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 4, "name": "On stock" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 132, + "ovPayTokenId": 21, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "Mijn OV Pas", + "tokenStatus": + { "tokenStatusId": 5, "name": "Suspended" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 0, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 166, + "ovPayTokenId": 28, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "Mijn OV Pas", + "tokenStatus": + { + "tokenStatusId": 6, + "name": "Removed by customer (*)", + }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 0, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 166, + "ovPayTokenId": 115, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "My retired token", + "tokenStatus": + { "tokenStatusId": 1, "name": "Retired" }, + "expirationDate": "2025-02-01", + "replacedByTokenId": 0, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + { + "customerProfileId": 1, + "ovPayTokenId": 118, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "My found token", + "tokenStatus": + { "tokenStatusId": 7, "name": "Renewed Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 0, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": null, + "photo": null, + }, + }, + ], + _links: { - "customerProfileId": 1, - "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 0, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null, - } + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "GET", + }, }, - { - "customerProfileId": 1, - "ovPayTokenId": 6, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 3, - "name": "Replaced (*)" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null - } - }, - { - "customerProfileId": 18, - "ovPayTokenId": 13, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "MyToken", - "tokenStatus": { - "tokenStatusId": 4, - "name": "On stock" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 2, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - } - }, - { - "customerProfileId": 132, - "ovPayTokenId": 21, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "Mijn OV Pas", - "tokenStatus": { - "tokenStatusId": 5, - "name": "Suspended" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 0, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null, - } - }, - { - "customerProfileId": 166, - "ovPayTokenId": 28, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "Mijn OV Pas", - "tokenStatus": { - "tokenStatusId": 6, - "name": "Removed by customer (*)" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 0, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null, - } - }, - { - "customerProfileId": 166, - "ovPayTokenId": 115, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "My retired token", - "tokenStatus": { - "tokenStatusId": 1, - "name": "Retired" - }, - "expirationDate": "2025-02-01", - "replacedByTokenId": 0, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null, - } - }, - { - "customerProfileId": 1, - "ovPayTokenId": 118, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, - "alias": "My found token", - "tokenStatus": { - "tokenStatusId": 7, - "name": "Renewed Active" - }, - "expirationDate": "2028-02-01", - "replacedByTokenId": 0, - "autoReloadRegistration": null, - "ePurse": null, - "personalAccountData": { - "name": null, - "birthdate": null, - "photo": null, - } - } - ], - _links: { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "GET" - } - } - } + } post: tags: - Customers - parameters: - - name: X-HTM-JWT-AUTH-HEADER - in: header + parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - in: header + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false - description: The customerProfileId of a customer in the case of the SMP - - name: X-HTM-ROLE-HEADER - in: header + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header schema: type: string example: Customer required: false summary: Create a new OV paytoken in the database for a given customer - description: Create a new OV paytoken for a customerProfile + description: Create a new OV paytoken for a customerProfile requestBody: content: application/json: schema: $ref: "#/components/schemas/unavailable" examples: - Add EMV token: + Add EMV token: summary: Add EMV token description: Add EMV token - value: + value: { - "ovPayToken": { - "tokenTypeId": 1, - "serviceReferenceId": "NLOV1234567ABCDEFG", - "amount": 200, - "alias": "Mijn token" - } - } - Add OV pas physical token: + "ovPayToken": + { + "tokenTypeId": 1, + "serviceReferenceId": "NLOV1234567ABCDEFG", + "amount": 200, + "alias": "Mijn token", + }, + } + Add OV pas physical token: summary: Add OV pas physical token description: Add OV pas physical token - value: + value: { - "ovPayToken": { - "tokenTypeId": 2, - "ovpasNumber": "OV34567", - "verificationCode": "211", - "alias": "Mijn token" - } - } + "ovPayToken": + { + "tokenTypeId": 2, + "ovpasNumber": "OV34567", + "verificationCode": "211", + "alias": "Mijn token", + }, + } responses: "201": description: Created @@ -950,172 +977,178 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Add EMV token: + Add EMV token: summary: Add EMV token description: Add EMV token - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 1, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovPpasNumber": null, "alias": "Mijn token", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "POST", + }, + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "POST", }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "POST" - } - } }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "POST" - } - } } - Add OV pas physical token: + Add OV pas physical token: summary: Add EMV token description: Add EMV token - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 1, - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, "ovpasNumber": "OV34567", "alias": "Mijn token", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 00 - }, - "status": "INACTIVE", - "originDate": "2019-07-16T11:00:00+02:00" - }, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", - "method": "GET" + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 00 }, + "status": "INACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "PATCH" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "POST", + }, + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "method": "POST", }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "POST" - } - } }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", - "method": "POST" - } - } } /customers/tokens/{ovpayTokenId}: post: tags: - Customers - parameters: - - name: X-HTM-JWT-AUTH-HEADER - in: header + parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - in: header + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false - description: The customerProfileId of a customer in the case of the SMP - - name: X-HTM-ROLE-HEADER - in: header + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header schema: type: string example: Customer - required: false + required: false - name: ovpayTokenId - in: path + in: path schema: type: integer example: 1 @@ -1128,39 +1161,36 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Replace with new EMV token: + Replace with new EMV token: summary: Replace with new token description: Replace with new token - value: + value: { - "ovPayToken": { - "newTokenId": null, - "tokenTypeId": 1, - "serviceReferenceId": "NLOV1234567ABCDEFG", - "amount": 230, - "alias": "Nieuw token" - } + "ovPayToken": + { + "newTokenId": null, + "tokenTypeId": 1, + "serviceReferenceId": "NLOV1234567ABCDEFG", + "amount": 230, + "alias": "Nieuw token", + }, } - Replace with existing EMV token: + Replace with existing EMV token: summary: Replace with existing token description: Replace with existing token - value: - { - "ovPayToken": { - "newTokenId": 10 - } - } - Replace with new OV pas token: + value: { "ovPayToken": { "newTokenId": 10 } } + Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas token - value: + value: { - "ovPayToken": { - "tokenTypeId": 2, - "ovpasNumber": "OV34567", - "verificationCode": "211", - "alias": "Mijn token" - } + "ovPayToken": + { + "tokenTypeId": 2, + "ovpasNumber": "OV34567", + "verificationCode": "211", + "alias": "Mijn token", + }, } responses: "201": @@ -1170,134 +1200,136 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Replace with new EMV token: + Replace with new EMV token: summary: Replace with new EMV token description: Replace with new EMV token - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 5, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn token", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "method": "POST", + }, }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", - "method": "POST" - } - } - } + }, } - Replace with new OV pas token: + Replace with new OV pas token: summary: Replace with new OV pas token description: Replace with new OV pas token - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 5, - "tokenType": { - "tokenTypeId": 2, - "name": "OV-pas physical" - }, + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, - "ovpasNumber":"OV34567", + "ovpasNumber": "OV34567", "alias": "Mijn token", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 - }, - "status": "ACTIVE", - "originDate": "2024-07-16T11:00:00+02:00" - }, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", - "method": "GET" + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2024-07-16T11:00:00+02:00", }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "PATCH" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "method": "POST", + }, }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", - "method": "POST" - } - } - } + }, } - "200": + "200": description: Ok content: application/json: @@ -1307,89 +1339,90 @@ paths: Replace with existing EMV token: summary: Replace with existing EMV token description: Replace with existing EMV token - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 10, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn bestaandetoken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=10", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=10", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=10", + "method": "POST", + }, }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=10", - "method": "POST" - } - } - } - } + }, + } patch: tags: - Customers - parameters: - - name: X-HTM-JWT-AUTH-HEADER - in: header + parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - in: header + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false - description: The customerProfileId of a customer in the case of the SMP - - name: X-HTM-ROLE-HEADER - in: header + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header schema: type: string example: Customer - required: false + required: false - name: ovpayTokenId - in: path + in: path schema: type: integer example: 1 @@ -1402,33 +1435,21 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Update an OV pay token status: - summary: Update an OV pay token status + Update an OV pay token status: + summary: Update an OV pay token status description: Update an OV pay token status - value: - { - "ovPayToken": { - "tokenStatusId": 5 - } - } - Update an OV pay token alias: - summary: Update an OV pay token alias + value: { "ovPayToken": { "tokenStatusId": 5 } } + Update an OV pay token alias: + summary: Update an OV pay token alias description: Update an OV pay token alias - value: - { - "ovPayToken": { - "alias": "Mijn nieuwe tokennaam" - } - } - Update an OV pay token full: - summary: Update an OV pay token full + value: { "ovPayToken": { "alias": "Mijn nieuwe tokennaam" } } + Update an OV pay token full: + summary: Update an OV pay token full description: Update an OV pay token full - value: + value: { - "ovPayToken": { - "tokenStatusId": 5, - "alias": "Mijn verloren pas" - } + "ovPayToken": + { "tokenStatusId": 5, "alias": "Mijn verloren pas" }, } responses: "200": @@ -1438,212 +1459,215 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Update an OV pay token status: + Update an OV pay token status: summary: Update an OV pay token status description: Update an OV pay token status - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 1, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn token", - "tokenStatus": { - "tokenStatusId": 5, - "name": "Suspended" - }, + "tokenStatus": + { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "method": "POST", + }, }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", - "method": "POST" - } - } - } - } - Update an OV pay token alias: + }, + } + Update an OV pay token alias: summary: Update an OV pay token alias description: Update an OV pay token alias - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 1, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn nieuwe tokennaam", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "method": "POST", + }, }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", - "method": "POST" - } - } - } + }, } - Update an OV pay token full: + Update an OV pay token full: summary: Update an OV pay token full description: Update an OV pay token full - value: + value: { - "ovPayToken": { + "ovPayToken": + { "customerProfileId": 1, "ovPayTokenId": 1, - "tokenType": { - "tokenTypeId": 1, - "name": "EMV" - }, + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, "alias": "Mijn verloren pas", - "tokenStatus": { - "tokenStatusId": 5, - "name": "Suspended" - }, + "tokenStatus": + { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", "replacedByTokenId": 0, "autoReloadRegistration": null, "ePurse": null, - "personalAccountData":{ - "name": null, - "birthdate": null, - "photo": null - }, - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", - "method": "GET" + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "method": "GET", + }, + "create_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "method": "POST", + }, }, - "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "PATCH" - }, - "replace_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST" - }, - "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "DELETE" - }, - "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", - "method": "GET" - }, - "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", - "method": "GET" - }, - "create_tokenPersonalization": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", - "method": "POST" - } - } - } + }, } delete: tags: - Customers - parameters: - - name: X-HTM-JWT-AUTH-HEADER - in: header + parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header schema: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c required: false description: The JWT of a customer in case of touchpoint were customer logs in themselves - - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER - in: header + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header schema: type: string example: feaaef83-a551-4283-8419-340b1ada3b55 required: false - description: The customerProfileId of a customer in the case of the SMP - - name: X-HTM-ROLE-HEADER - in: header + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header schema: type: string example: Customer - required: false + required: false - name: ovpayTokenId - in: path + in: path schema: type: integer example: 1 @@ -1672,12 +1696,12 @@ paths: type: integer example: 1 responses: - '200': + "200": description: OK content: application/json: schema: - $ref: '#/components/schemas/OvPayTokenProductInstancesResponse' + $ref: "#/components/schemas/OvPayTokenProductInstancesResponse" examples: getEmptyProductInstances: summary: No product-instances found on token @@ -1687,38 +1711,196 @@ paths: summary: One non-renewable product-instance value: { - "productInstances": [ - { - "productId": 1, - "name": "HTM 90% Korting", - "status": "Active", - "isRenewable": true, - "productCategory": { - "productCategoryId": 1, - "name": "Kortingsabonnement" + "productInstances": + [ + { + "productId": 1, + "name": "HTM 90% Korting", + "status": "Active", + "isRenewable": true, + "productCategory": + { + "productCategoryId": 1, + "name": "Kortingsabonnement", + }, + "fromInclusive": "2024-11-25T13:25:00+01:00", + "untilInclusive": "2024-12-25T03:59:59+01:00", + "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", + "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", + "contractId": "56B17EF-C436-9043-B76C-481797WEB464F", + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances/1", + "method": "GET", + }, + "get_order": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/orders/501B17EF-36C4-4039-B92C-6517969B464E", + "method": "GET", + }, + "get_contract": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", + "method": "GET", + }, + }, }, - "fromInclusive": "2024-11-25T13:25:00+01:00", - "untilInclusive": "2024-12-25T03:59:59+01:00", - "orderId": "501B17EF-36C4-4039-B92C-6517969B464E", - "orderLineId": "38B17EF-36C4-4039-B92C-4817969B464E", - "contractId": "56B17EF-C436-9043-B76C-481797WEB464F", - "_links": { - "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances/1", - "method": "GET" - }, - "get_order": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/orders/501B17EF-36C4-4039-B92C-6517969B464E", - "method": "GET" - }, - "get_contract": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", - "method": "GET" - } - } - } - ] + ], } + /customers/tokens/{ovPayTokenId}/compare: + parameters: + - name: ovPayTokenId + in: path + required: true + style: simple + description: Id of the OVpay token for the LHS of the comparison. + schema: + type: integer + example: 1 + post: + summary: Compare attributes of two OVpay tokens. + description: |- + Compare the attributes of an existing OVpay token in the customer profile with the + attributes of a new OVpay token. This operation compares the following attributes: + - todo + tags: + - Customers + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Compare with an existing OVpay token: + value: { "ovPayTokenId": 2 } + Compare with an XBOT: + value: { "xbot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } + Compare with an XTAT: + value: { "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } + Compare with SRID + amount: + value: + { "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230 } + Compare with OVpas number + verification code: + value: { "ovpasNumber": "OV34567", "verificationCode": "1234" } + Complete reqeuest body (for development only): + value: + { + "ovPayTokenId": 2, + "xbot": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "serviceReferenceId": "NLOV1234567ABCDEFG", + "amount": 230, + "ovpasNumber": "OV34567", + "verificationCode": "1234", + } + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Comparison result for transferable token: + value: + { + "oldOvPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "newOvPayToken": + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "expirationDate": "2028-02-01", + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "isTansferable": true, + "transferableObjects": + { + "tokenType": true, + "expirationDate": true, + "autoReloadRegistration": true, + "ePurse": true, + "personalAccountData": + { + "name": true, + "birthdate": true, + "photo": true, + }, + }, + "_links": + { + "transfer": + { + "href": "https://services.dev.api.htm.nl/abt/touchpoint/1.0/customers/tokens/1/transfer", + "method": "POST", + }, + }, + } + Comparison result for non-transferable token: + value: + { + "oldOvPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "newOvPayToken": + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "expirationDate": "2028-02-01", + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "isTansferable": false, + "transferableObjects": + { + "tokenType": true, + "expirationDate": true, + "autoReloadRegistration": true, + "ePurse": false, + "personalAccountData": + { + "name": false, + "birthdate": false, + "photo": false, + }, + }, + "_links": {}, + } + components: schemas: unavailable: @@ -1771,7 +1953,7 @@ components: dateOfBirth: type: string format: date - example: '2023-02-01' + example: "2023-02-01" emailAddress: type: string format: email @@ -1850,7 +2032,7 @@ components: type: object properties: phoneTypeId: - type: integer + type: integer example: 1 name: type: string @@ -1895,8 +2077,8 @@ components: type: string example: GET create_customer_status: - type: object - description: ONLY ALLOWED FOR SMP - Create a new customer status + type: object + description: ONLY ALLOWED FOR SMP - Create a new customer status properties: href: type: string @@ -1930,7 +2112,7 @@ components: example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens method: type: string - example: POST + example: POST OvPayTokensResponse: type: object required: @@ -1944,7 +2126,7 @@ components: ovPayTokenId: type: integer example: 1 - tokenType: + tokenType: type: object properties: tokenTypeId: @@ -1968,7 +2150,7 @@ components: expirationDate: type: string format: date - example: '2023-02-01' + example: "2023-02-01" replacedByTokenId: type: integer example: 1 @@ -1983,7 +2165,7 @@ components: example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1 method: type: string - example: GET + example: GET partial_edit: type: object description: External touchpoints are only allowed to change alias - SMP can also change tokenStatus @@ -2041,12 +2223,12 @@ components: productId: type: integer example: 1 - name: + name: type: string example: HTM 90% Korting status: type: string - enum: [ "Active", "Ended", "Refunded" ] + enum: ["Active", "Ended", "Refunded"] example: Active isRenewable: type: boolean @@ -2060,7 +2242,7 @@ components: example: 1 name: type: string - example: Kortingsabonnement + example: Kortingsabonnement fromInclusive: type: string format: date-time-offset @@ -2068,7 +2250,7 @@ components: untilInclusive: type: string format: date-time-offset - description: >- + description: >- If not present, this product-instance represents a subscription/contract without a real end date. If present, it can be either the natural end date or the refund timestamp. example: "2024-12-25T03:59:59+01:00" orderId: @@ -2116,8 +2298,3 @@ components: method: type: string example: GET - - - - - From 14228a5d66fd247e12a2d8ab3ff770d6d9e06466 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 30 Apr 2025 15:42:00 +0200 Subject: [PATCH 05/39] OVPAY-1742 - Updated description for /compare endpoint. --- src/openapi/customers/SE-customers.yaml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index e181edb..53b13a9 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1763,8 +1763,23 @@ paths: summary: Compare attributes of two OVpay tokens. description: |- Compare the attributes of an existing OVpay token in the customer profile with the - attributes of a new OVpay token. This operation compares the following attributes: - - todo + attributes of a new OVpay token. The new token can be passed using one of the following + methods: + + - Compare with an existing OVpay token + - Compare with an XBOT + - Compare with an XTAT + - Compare with SRID + amount + - Compare with OVpas number + verification code + + The comparison results are returned in the response body. Comparison is made on the following + attributes: + + - Token type + - Experation date + - Auto reload registration + - E-purse + - PAD (name, birthdate, photo) tags: - Customers requestBody: From 59db7d7323b042c2fb13d768b720c0e2e23d4899 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 30 Apr 2025 16:02:20 +0200 Subject: [PATCH 06/39] OVPAY-1742 - Added endpoint for transfer. --- src/openapi/customers/SE-customers.yaml | 164 +++++++++++++++++++++++- 1 file changed, 157 insertions(+), 7 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 53b13a9..7333668 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1776,7 +1776,9 @@ paths: attributes: - Token type + - Token status (only if target token is known in the customer profile) - Experation date + - Instantiated GBO products - Auto reload registration - E-purse - PAD (name, birthdate, photo) @@ -1839,9 +1841,14 @@ paths: }, "newOvPayToken": { + "customerProfileId": null, + "ovPayTokenId": null, "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": null, + "tokenStatus": null, "expirationDate": "2028-02-01", + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1851,15 +1858,13 @@ paths: "transferableObjects": { "tokenType": true, + "tokenStatus": true, "expirationDate": true, + "productInstances": true, "autoReloadRegistration": true, "ePurse": true, "personalAccountData": - { - "name": true, - "birthdate": true, - "photo": true, - }, + { "name": true, "birthdate": true, "photo": true }, }, "_links": { @@ -1891,19 +1896,26 @@ paths: }, "newOvPayToken": { + "customerProfileId": null, + "ovPayTokenId": null, "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": null, + "tokenStatus": null, "expirationDate": "2028-02-01", + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": false, + "isTansferable": true, "transferableObjects": { "tokenType": true, + "tokenStatus": true, "expirationDate": true, + "productInstances": true, "autoReloadRegistration": true, "ePurse": false, "personalAccountData": @@ -1915,7 +1927,145 @@ paths: }, "_links": {}, } - + /customers/tokens/{ovPayTokenId}/transfer: + parameters: + - name: ovPayTokenId + in: path + required: true + style: simple + description: Id of the OVpay token for the LHS of the comparison. + schema: + type: integer + example: 1 + post: + summary: Transfer old OVpay token to new OVpay token. + description: |- + Transfers all products, e-purse and personal account data of an existing OVpay token + to a new OVpay token. The new token will also be persisted in the profile as a replacement + of the old token. + tags: + - Customers + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Transfer to an existing OVpay token: + value: { "ovPayTokenId": 2 } + Transfer to a new token by XTAT: + value: + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "MyToken", + } + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + New token as a result of a succesful transfer: + value: + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": + { + "autoReloadAmount": 500, + "retailerReferenceId": "abc", + "arrit": "425f7fc2-1103-4822-9c79-7c4aaa2fb6aa", + "autoReloadRegistrationStatus": "ACTIVE", + "autoReloadRegistrationStartDateTime": "2024-06-02T15:03:46Z", + }, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2019-07-16T11:00:00+02:00", + }, + "personalAccountData": + { + "name": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "birthdate": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 0, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "PATCH", + }, + "replace_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", + "method": "POST", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "method": "GET", + }, + "update_tokenPersonalization": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "method": "PUT", + }, + }, + } components: schemas: unavailable: From 079c16763ef52f0d83098b49d6747ee64504c082 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 30 Apr 2025 17:04:34 +0200 Subject: [PATCH 07/39] OVPAY-1742 - Added examples for unhappy flow. --- src/openapi/customers/SE-customers.yaml | 106 ++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 7333668..59269f4 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -345,6 +345,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/tokenPersonalizations?ovpaytokenId=1", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, ], @@ -1035,6 +1040,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, "_links": @@ -1258,6 +1268,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, } @@ -1394,6 +1409,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=10", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, } @@ -1517,6 +1537,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, } @@ -1578,6 +1603,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, } @@ -1639,6 +1669,11 @@ paths: "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", "method": "POST", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "method": "POST", + }, }, }, } @@ -1927,6 +1962,77 @@ paths: }, "_links": {}, } + "404": + description: Not found + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Old token not found in profile: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The old token was not found in the customer profile.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The old token was not found in the customer profile.", + "pointer": "#/0/ovPayTokenId", + "ovPayTokenId": 123, + }, + ], + } + New token not found in profile: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in the customer profile.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The new token was not found in the customer profile.", + "pointer": "#/0/ovPayTokenId", + "ovPayTokenId": 123, + }, + ], + } + XTAT for new token not found in GBO: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in GBO:.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "XTAT for the new token was not found in GBO.", + "pointer": "#/0/xtat", + "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + }, + ], + } + SRID for new token not found in GBO: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in GBO:.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "Service Reference ID for the new token was not found in GBO.", + "pointer": "#/0/serviceReferenceId", + "serviceReferenceId": "NLOV1234567ABCDEFG", + }, + ], + } /customers/tokens/{ovPayTokenId}/transfer: parameters: - name: ovPayTokenId From 946ba3f898ce97ace591bd23cc0a637fa4511136 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Fri, 2 May 2025 14:57:11 +0200 Subject: [PATCH 08/39] OVPAY-1742 - Added examples for unhappy transfer flow. --- src/openapi/customers/SE-customers.yaml | 160 +++++++++++++++++++++++- 1 file changed, 159 insertions(+), 1 deletion(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 59269f4..24e3b5a 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2044,8 +2044,9 @@ paths: type: integer example: 1 post: - summary: Transfer old OVpay token to new OVpay token. + summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token." description: |- + **Note that this is an integratielaag endpoint, not a service eninge endpoint!** Transfers all products, e-purse and personal account data of an existing OVpay token to a new OVpay token. The new token will also be persisted in the profile as a replacement of the old token. @@ -2172,6 +2173,163 @@ paths: }, }, } + "404": + description: Not found + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Old token not found in profile: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The old token was not found in the customer profile.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The old token was not found in the customer profile.", + "pointer": "#/0/ovPayTokenId", + "ovPayTokenId": 123, + }, + ], + } + New token not found in profile: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in the customer profile.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The new token was not found in the customer profile.", + "pointer": "#/0/ovPayTokenId", + "ovPayTokenId": 123, + }, + ], + } + XTAT for new token not found in GBO: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in GBO:.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "XTAT for the new token was not found in GBO.", + "pointer": "#/0/xtat", + "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + }, + ], + } + SRID for new token not found in GBO: + value: + { + "type": "https://htm.nl/api/v1/probs/notfound", + "title": "The item you requested was not found.", + "detail": "The new token was not found in GBO:.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "Service Reference ID for the new token was not found in GBO.", + "pointer": "#/0/serviceReferenceId", + "serviceReferenceId": "NLOV1234567ABCDEFG", + }, + ], + } + "405": + description: Not allowed + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Old token is wrong token type: + value: + { + "type": "https://htm.nl/api/v1/probs/notallowed", + "title": "The transfer you requested was not allowed.", + "detail": "The old token has wrong token type.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The old token has token type OV-pas physical.", + "pointer": "#/0/ovPayToken/tokenTypeId", + "tokenTypeId": 2, + }, + ], + } + Old token has wrong token status: + value: + { + "type": "https://htm.nl/api/v1/probs/notallowed", + "title": "The transfer you requested was not allowed.", + "detail": "The old token has wrong token status.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The old token has token status replaced.", + "pointer": "#/0/ovPayToken/tokenStatusId", + "tokenStatusId": 4, + }, + ], + } + New token is expired: + value: + { + "type": "https://htm.nl/api/v1/probs/notallowed", + "title": "The transfer you requested was not allowed.", + "detail": "The new token is expired.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "The new token is expired.", + "pointer": "#/0/ovPayToken/expirationDate", + "experiationDate": 2022-01-01, + }, + ], + } + One or more GBO product instances not transferable: + value: + { + "type": "https://htm.nl/api/v1/probs/notallowed", + "title": "The transfer you requested was not allowed.", + "detail": "One or more GBO product instances are not transferable.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "One or more GBO product instances are not transferable", + "pointer": "#/0/ovPayToken/packageTemplateId", + "packageTemplateId": "33613", + }, + ], + } + One or more PAD attributes marked: + value: + { + "type": "https://htm.nl/api/v1/probs/notallowed", + "title": "The transfer you requested was not allowed.", + "detail": "One or more PAD attributes are not transferable.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "PAD attribute birthdate is marked on the old token", + "pointer": "#/0/ovPayToken/padAttributes/birthdate", + }, + ], + } components: schemas: unavailable: From d8f9706d7660f1d09aaf30944de8c4f5ac09aefe Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Fri, 2 May 2025 15:08:06 +0200 Subject: [PATCH 09/39] OVPAY-1742 - Added replace by XTAT example. --- src/openapi/customers/SE-customers.yaml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 24e3b5a..1b2b370 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1171,9 +1171,9 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Replace with new EMV token: - summary: Replace with new token - description: Replace with new token + Replace with new EMV token by SRID: + summary: Replace with new token by SRID + description: Replace with new token by service reference ID and amount. value: { "ovPayToken": @@ -1185,13 +1185,13 @@ paths: "alias": "Nieuw token", }, } - Replace with existing EMV token: - summary: Replace with existing token - description: Replace with existing token + Replace with existing EMV token from profile: + summary: Replace with existing token from profile + description: Replace with existing token from customer profile. value: { "ovPayToken": { "newTokenId": 10 } } Replace with new OV pas token: summary: Replace with new OV pas token - description: Replace with new OV pas token + description: Replace with new OV pas token by OV-pas number. value: { "ovPayToken": @@ -1202,6 +1202,17 @@ paths: "alias": "Mijn token", }, } + Replace with new token by XTAT: + summary: Replace with new token by XTAT + description: Replace with new token by XTAT. + value: + { + "ovPayToken": + { + "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "alias": "Mijn token", + }, + } responses: "201": description: Created From c692718fbb07dce6b08ac68778c0e8eb8726e6ac Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 6 May 2025 14:28:40 +0200 Subject: [PATCH 10/39] OVPAY-1742 - Added PAD OTP and PAD email address to transfer request body. --- src/openapi/customers/SE-customers.yaml | 40 +++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 1b2b370..00bb076 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2069,13 +2069,43 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Transfer to an existing OVpay token: - value: { "ovPayTokenId": 2 } - Transfer to a new token by XTAT: + Transfer to an existing OVpay token without existing PAD: value: { - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "alias": "MyToken", + "oldOvPayToken": { "padOtp": "123456" }, + "newOvPayToken": + { + "ovPayTokenId": 2, + "padEmailAddress": "jandevries@outlook.com", + }, + } + Transfer to an existing OVpay token with existing PAD: + value: + { + "oldOvPayToken": { "padOtp": "123456" }, + "newOvPayToken": { "ovPayTokenId": 2, "padOtp": "678901" }, + } + Transfer to a new token by XTAT without existing PAD: + value: + { + "oldOvPayToken": { "padOtp": "123456" }, + "newOvPayToken": + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "MyToken", + "padEmailAddress": "jandevries@outlook.com", + }, + } + Transfer to a new token by XTAT with existing PAD: + value: + { + "oldOvPayToken": { "padOtp": "123456" }, + "newOvPayToken": + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "MyToken", + "padOtp": "678901", + }, } responses: "200": From 499442b3d9b04200a38bdcd576d7464f9f8e2ab1 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 6 May 2025 15:02:22 +0200 Subject: [PATCH 11/39] OVPAY-1742 - Added examples for transferring existing tokens without PAD. --- src/openapi/customers/SE-customers.yaml | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 00bb076..d215081 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2069,7 +2069,23 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Transfer to an existing OVpay token without existing PAD: + Transfer of a token without PAD to an existing OVpay token: + value: + { + "oldOvPayToken": {}, + "newOvPayToken": { "ovPayTokenId": 2 }, + } + Transfer of a token without PAD to a new OVpay token by XTAT: + value: + { + "oldOvPayToken": {}, + "newOvPayToken": + { + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "MyToken", + }, + } + Transfer of a token with PAD to an existing OVpay token without existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2079,13 +2095,13 @@ paths: "padEmailAddress": "jandevries@outlook.com", }, } - Transfer to an existing OVpay token with existing PAD: + Transfer of a token with PAD to an existing OVpay token with existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { "ovPayTokenId": 2, "padOtp": "678901" }, } - Transfer to a new token by XTAT without existing PAD: + Transfer of a token with PAD to a new token by XTAT without existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2096,7 +2112,7 @@ paths: "padEmailAddress": "jandevries@outlook.com", }, } - Transfer to a new token by XTAT with existing PAD: + Transfer of a token with PAD to a new token by XTAT with existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, From 9fd0a14e91a34e023425af82a01d654b8e0b6aea Mon Sep 17 00:00:00 2001 From: Max Martens Date: Wed, 7 May 2025 11:31:04 +0200 Subject: [PATCH 12/39] Fix PUTGenerator --- .../nl/htm/ovpay/abt/ABTProductsPUTGenerator.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/java/ABTProductsPUTGenerator/src/main/java/nl/htm/ovpay/abt/ABTProductsPUTGenerator.java b/src/java/ABTProductsPUTGenerator/src/main/java/nl/htm/ovpay/abt/ABTProductsPUTGenerator.java index 3246d16..69426ac 100644 --- a/src/java/ABTProductsPUTGenerator/src/main/java/nl/htm/ovpay/abt/ABTProductsPUTGenerator.java +++ b/src/java/ABTProductsPUTGenerator/src/main/java/nl/htm/ovpay/abt/ABTProductsPUTGenerator.java @@ -100,8 +100,8 @@ public class ABTProductsPUTGenerator { ((ObjectNode)newJsonNode).putRawValue("customerSegmentIds", null); } case "allowedGboAgeProfiles" -> { - LOGGER.info("Rewriting null allowedGboAgeProfiles to allowedGboAgeProfilesIds..."); - ((ObjectNode)newJsonNode).putRawValue("allowedGboAgeProfilesIds", null); + LOGGER.info("Rewriting null allowedGboAgeProfiles to allowedGboAgeProfileIds..."); + ((ObjectNode)newJsonNode).putRawValue("allowedGboAgeProfileIds", null); } case "mandatoryCustomerDataItems" -> { LOGGER.info("Rewriting null mandatoryCustomerDataItems to mandatoryCustomerDataItemIds..."); @@ -283,7 +283,8 @@ public class ABTProductsPUTGenerator { ((ObjectNode)sellingPeriod).putRawValue("forbiddenPaymentMethodIds", null); } } - if (sellingPeriod.get("sellingPrices") != 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()) { @@ -299,8 +300,8 @@ public class ABTProductsPUTGenerator { } } case "purchasePrices" -> { - LOGGER.info("Rewriting taxMetadata in purchasePrices to taxMetadataId..."); - if (jsonField.getValue() != null) { + LOGGER.info("Deep-copying purchasePrices..."); + if (!jsonField.getValue().isNull()) { ArrayNode purchasePrices = ((ArrayNode)jsonField.getValue()).deepCopy(); ((ObjectNode)newJsonNode).putArray("purchasePrices").addAll(purchasePrices); } else { From 3819ee006f023900e0a35a485faa6f3171eee322 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Thu, 8 May 2025 13:29:54 +0200 Subject: [PATCH 13/39] Update binary --- .../bin/ABTProductsPUTGenerator.jar | Bin 4551198 -> 4551594 bytes .../ABTProductsPUTGenerator/bin/input.json | 122 +++++++++--------- .../ABTProductsPUTGenerator/bin/output.json | 65 +++++----- 3 files changed, 97 insertions(+), 90 deletions(-) diff --git a/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar b/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar index 2a3b03c3c728d703182a2fad1e7cbc65cc92b75b..eb23d377a3cced193a6daa9a28449688ed9e1d04 100644 GIT binary patch delta 9377 zcmZwN1xy`Xw=iJb-QC^YX>oTb916wV-RUWAJ-B1U|_ zb-+S$CkM{|Uk@or@?@uh{U>I!GyNL}+1X%)A?G*jqW{DY9*zhe4rmA%2v`U>2zUqt z2t)`Z2xJHp2vi6(2y_Sx2uuhp2y6%(2wVs}2z&?v2to)V2x15l2vP_#2yzGt2ucVl z2x&a!_tkEAD5xVWC@9EuL)kjHczSTyxjQ@M=qbDJ z2%vS{>$!L+mDI5-H`R}pO;#wjtBFNriF@2hDA$hj%a+qwinb@c8y#9IHf=j3jacA8 z!S%*HKwS)Rh63smCAYKMdqfytP2c%a*q4-IQ%pZZJkw={NaZL90jH9=KT(Z0bX9&F z=G!tH=8rF9UnCdKP01i4F;=4P;UqU4g(6vZzZ3^))p?3$#mggQ&`m`L z(vn}Xwf>0ih3WpNTot6kgb)4Z{p`C7@TAns4;(b>|EcgrT)7PC8cf)HP+l6KzkC#%BVO$T}Ay7wg~a+^ks5b zcp?RrzEE`QTBhF9OKivsfqdnpe z$Y%R%NUioS6N7;`IUekAy5RaqVmu<*#h#JyA9>`bM}Y(_6&~&h&hd}H!EWOd#DJwp zwvVVUCo^KgoiN}lm87AH6`apyQY=f}pTU_&URZKERXt*oM5cWweyLAU0z5GD#f8~p z=y1UCJt4U9D4Jrd<1C%v3^S~_F=j@L{*@*j=e@~BE+h}l+6QY=8VAa1Ys4mfP+~WD zSjR&wefr|BiP)6=RIM_b#Sa}$L`7YeUs!82Md`Vg!oV+cf^$SEJw_O@gw&NkyT?ak zb-x*Z`osJnXo?a%MlE%Tja|-B z!eo1E)$dhP`a=lXKkb+;XOx6-X&>d^jaex?%|7&+;6cN6U8@n>{zT+>tLqyG0(h3{r2| zt?N$#a?NG_-WRrWW(hcTwM5x}A0L2Jo!3|^%ue?kU!uk(3N&&hlRgmt>L)iGUwl#g+Nz5@iF`=QLOq-QjBv_zv z|5;CSEiIfLh@hY{#h{=#prFzoTx2p6!1Y=zCT11rw@Nlc6oYXDhUv7O^$7fWONV*ma!G zIj7rM=?j|1q1~Ot2!*K=hLg9|*QVgx72cXjz|7GgLD6j<5-IOL5efV<-?b0$oag{Q zDJ)SsN6DV(@p14;$qf*q$`gUx9k%+~5Q0}oV;ernhg8ij>iG9NI?7q3hD(OdgG|-s zmnd!iUcpJ_Tmn3WD0b3HW(n=HW==k}3hx?+J-)2Y$a+P;rf78OrY z91WURUsWNIv`<;aELCZchJ89$!(0|l{}q4^%P#BF!cSA8Uiv!5s;F>j5)9hitcPDc zgTI6ghmgM0q1o}8#mH!%IX#FVSuS%;6iBrES@1~3Ekwp=--zu0&MzIj`Eeu#41^kC^1)P0c=Z~nA-oNjc1%o( z`H~)7rlvB>O)g(|p>3WHbj&^p=xwR1OwllGYZ=cnnot%C=koXMC>o5EGuY`hA#~@! z;eVm9U(US^0<<$S!%l(g#i|lqBCId3ES0U>1akLqaI=1xGgw`2*0}@@L=Lu%?_q~0 zr`{SiY;L;-M>^>7{z4kevW?JJ8qI{;**`Ar6_cW#QfH&0zXHzyzbboCiTvg=mM16R zdR&x;;V$Ivpu*bS+P?v|obG#ysr$bDD)KZJS5^_kvKJIf#lYgMIW11AZDYejF4L(4s`8tSe`on} z*BRdsSU5>##d^U3!(~qkahq^?%;pXIZVY1bamhubkQh@PK7C&65O4EsT{(&r z!k)*L7V89(3VMf$f;6PW`<3h4EzwVqua9|lH<824a~E91b_orV*IrDM0{cr~szo@R>}RkhV5g7?ho(J;q{s@RPmSv%!k#toedXx2(&1hz}P zD}fQ5zZN3d1^wgT91G_)4#AvnKFK2&4lFP>DV!NN%K$pN zOjN(8&5T!PWSyF_#)K`BP}iNiz9Ab)%|%wCHV}=8gfX<7D)!wVFuQJPNmW9tKe2>a z7NxLV$rsuCN9!f)Q{P-Ol22_;o!&12h4~*A3nqzEdpdz`agtSpEtOc#o!NxVM-N=v%FtE&AZ*2qQo9kg`G}JKX+G zDWYXPTJ#!h5+3krlBwBJ7YUu*x;&A4q!-CLosJb+?shd1bB1zH*I-tAr$#?;MSLWC z(mNQ&g51*T;Zg!QzLL;UA#23!MD&?h)pqbxaV2$}`Fhu(_pm|%eC{bJi_2oE?XH^bn9s~kqVW|>Y+XAGXm$yul_*%csSxSIEXjI5d z)wW`TG>a4kv{1?eDgiWUkVMB&O=uK8PHDS0wl{)rHDS@SeGi1+Rdma)n_IY67;8>5`x= zA7y{*bXeciAjUO#Md)I|#I7myGzo)o#D&KWuRHdfFEivN!mPflISNKOslz)?RBg%4 z{-D&lkCPJfhcaIG;^8;8VToX8eT!a6jOP>gmp-Z8CH}_nqgM}3+j>InPL-0eL1KVCa)epH z)q!@t+(+Q_k`qx4OiFEoQ%!xoD_$zZMZoDyBDLd2SA_}QxW92v?3N=8&(ETA6goOpVkD52{GX2~R`_nxgY6^kp8Ur{HR-GMt^A9wR+Z_C3 zW&j}cmB7Nw_pQl=9?SKLOm>viA)m|+GG;@@zq?Ou=-aWX@xzLkC0|Y%?R~cT(4$UV zja0U!#9iyg*i^gEJZ31K2}3OfvR~rsJ~W<=z=~5}`h_9TDJH>;aY25ZMB8$m|ayiP1%f zO=ZI*N8Yrva_5_oP;CUiN}}Hu;g)gOJ|E8lb$OS#EeE0ln-0?3gp|crt@F%(W;^_l z$*YR9V!p#SzgfE^6?OA|IT~Jnk2NQkZ!%-htD`Rjf9pR6J{%a(!?i`u#E=DogWl%NGl|G{Z{)L2exd8@v5JzaKTs`Vh%ey zxDwgLZ?(%_@`4h1kDglua^;I0L930v8^z<^8rP4yofa7~ur|D+-BL-HRlY_niGJTK zQv7rULzc)`?_Fq%@4iLnEGwwiMM4|)t$XNbUUYgJit%%MT`_5nf$U(LoBr{_DruW5 zSoh31`pU(KP9sXpND7oz(}dT(SE-W^iD#EFO0!(Opm1Yv-l>%IQTx#}F)A zF^2o|Pipq1km9cS!#w~Ej7AooK{RE@Hs~sLE?fydAI?b2GFMKKDyB#%pYh?B+CsU{ z1uOX{yAIl2Ng@scjdMYxh8pPC6MVf~?$VKkeuCA2MpC_Mt>zu;l}l7k_3O;&FD;Ul zk5);?-B$3cR(59gGk`TWwcxI6ZUk2S{R#)I>ZbkAq1-n@;=S&kQ9G5)s(WY)?JO!8 z{Jx@F)D8v(*8FGjDXBO#Js^D=OOxIHaG_lbXCr4Z`fNk$(! zZN1Eg(EFeO0P_d(au4To@MMMSFY`%)%2JOFPIsdecU0Cj%+b|svdM{3kB@BbN$$dW znn!P);~;l8C!L~a?hMib*Xr7t*Ou`;g1t#%&#dg7>wO*i1D1!fy#u_j1urk@c@rn-SOvr>#mXWI0tOh^JKGv6A9aLQz$UYit?QsJ3(xR`ri$;x`Mt2Hc=5-!V zbRWwKUO+mJ8&y{#ns0GBkD|K1DNMjAo$xa2YSrU#+;_aFsI>>1BB~k| zqiP1dq#1LszBK3M?9C?j0?j_Gr|<3{?VDqG8?B>K2AWMD3{CMD+s3#Ec1pnPsS2&a+MxQ+xkIS~^zvqG3eTL_y*=l5V4mpx7~ zNg2wfBA1?p8|o^T!J(3#ov@579Zd9?whnYN zV?miB@{JQF9)2xs2muKw9Bjf4@SMCNUAl5NrZ;2+=y#4HFnKSak6b{B2 ziDW|sB;ZIkpyFbjIY>5ChvJ^#VK_PVt?{EGdfPz)3Su+c)+Pa7RIxj2Oqs-f90v}F z(Y;G!KaLG&LOh$2?YckuO2`;E@MtzB*~X?;(MnME zKEih@cc7QYRg7twe-2zNo?f37UgE{Xl2P`#qi}1@!zZdOMo!;9<;c8!q<^junYCGH zvd;g@&=F3D$G6QruZsi6&7ITg6>gbeJv6M2QH(b!6hq(fv-gz0H~}+2s9wgE-ghTh z=VoV=(Gi@0QK;UMZgbd= z(_M^ORd9J32p=ZG`3U5Mh#Bn5s!W<0@0SRJL%G$_zfBj4=YkEe&C~s-+Ic%kBhM{acjm0}`zv^i zXP*ooa(M98Mr|DQ%Il={BiEF0&$M;7z7EDArU-~t%3MVL!tU1N0QMG+vilge5~?$; zJ%n6wy_JeZm!w!w@#5~FsOFz~iog?zU*FkYeTHk&1} zY$DrjYz`W48Y=-u)WpnrPY1lta)RS;j}E4kVZ%>CXJKQTvkr_Zg75s;7=kl3{yMDg zFd)m}if%z+9vQ+!%pa&>q@pa0z+C)fLATAG=1^IK zwc08uk5g3m=U1NvwTajQ_8(oDqxBI&xI$63w!XCoBkVA_nR6gY-SUNoTx^lqP=bRz zkvR&m$s|DF2|fgGHaG_G3JO_+oRcFHUXc29xGBv`x zhQ%-&MfN#^@nA~>bDM^-SjhH)aQNdlS*zgr8?nEQYFR@Dh_3}#(Pmd!B*(=IDP`@H zY2Pm*3gW|;V-sZENaD-7k-WH%jd4d0`hU?lM|o(A*oVULV&gN!_InlnoJBRm{(ikJ z;d1fu15gK;8h$N^dQfy)fp*uX^no4!SBqmsvaWUYm8E@34V~u6-_jorrTdyMp9I1d zeNt<9o=$8JpA!#jJ|EUt=DAy+yMIm9%u|*Qq>p-P3v1&PwfpHkH$>#API7FZI48(9 zCs^&xsP>Rs;FwIu+-DfKq2``L*Ao$DG8s`+RdH ziKXX&((@Vr)OOKHslX=+ksXSsHw=*)nnr2kh9r(p4>t2wtfE_XyL!pz`K(Qwf1(HU zWmkRAIuHmMQKOHne_4cdAeJhu!6q|i=`3+VH<{RSzjmYxWZ+^|4gS_MAViLU%C{%V zmjI3*`(3(gkLIbScn^9K4Mq$qu?=_->?pBGkrM0}e!zD&i@UdH>!%gMjw^&#Hw{zu zP#?=;7*1YFR(anI7I{_n=^j`Wvmw)>JIfzZ;zhVx{e$r*fHT{S#G*ZdV_)%A+wKJR zDSpFRLNDBXS^kDQ(5&b~(Nxvko5isN&#j~B@}=wPAgn!f#-TQzRkNop%L(^ zgPe%k&^zIj1y8F?EdFTPDd*B1T-_%*FgCi|ikiUQB}VRU$wuHMmCo4(ttNUVD7y=% z8yFaI>Gt5zhv7VsmCX=mt#16{Mz=$}`2m8%?KS;kw-{Jsey1OWqbIZpKvuiuKpF;(f>C)UwC|55GvbMng9&P{ zm-(VG8mpyOtoA@z?-ZPVc#9O|DE2Z?MN5oL2u`+S)6>G_cQ&57O~&IN%VSwV@2?ZbXQKpe0T(8Kss_phg;B= zzlh%+40&tLv5jt22Z$iWcdv!NeF@Zo|2)XQg7Cf9EY&#}^3yAI5N^Ml0@UBvU;gCX z_~9=Z8n}8*JzhARqz-cgZ@0L{zOn9H=?oZkE42|r-XeRdfK6_RNajkfo$!g|PT8yB zqIHGae;Fm7#zEPicFRfRyz~cP619|M9gp!Sy?M7+83%6KMiN8rn%^{+d65yxvpx)0C)cG~>c_8_D)CXIVeqUE1no3zt8 z3BG@lX4-iPEWv-eXwn4GBsu;~tkEQS{!OycB!&J>7SSZd;2`&ZPW!PdL6XLeF3I&@ zr(bR)NFspfk`Pi5(hxGuKy=wdGxY!HKS}d&k!7X)j}1!5JM>RW%6}g}gGAE0Tx5wU z|BoHZ|E_`h8RVLF=OQak{m+yB=S_rk5qWF9#>fag6)C?uXDqXu delta 8956 zcmY+~WlS7lw*X+IxVt+P7I$|q?(SaP9kxhucc-|tOK~Z_6nA%bcZwD6_Pam6dnb8v zP9`Ul$z*2UXun-?0;2_{35FijC zkRXsDP#{nt&>+wuFd#4?upqD@a3F9Y@F4IZ2p|X{h#-g|NFYcd$RNleC?F^ys352z zXdq}I=pa5q&_ggl03aA4m>`%TSRnr0HyZ>y1P25s1Q!H11P=r+1Rn%HgaCvfgb;)< zgb0KvgjfqFt2k3Q&_Tt?fJS1Ds1*(h>Kzjb3i7z2K0CX5d9vDjxHy;TI;pP8W4@VG zy_-8!X?(YEJqtJMTFVwUT+zVX+v=;L;C)CstJ}Cgufb`Jc@J&~MryWncls%5-^lec zb~eVv_V#uIN2OA3l`?q1?S}rzwN|r09S&^7O-p?kSWzVgOh(#j!|^TRb9JGvNSm;| z2_5k9MAww(QbEIARBTchoN}c8`lYp5&D?3}@tajaen=4#PowHKlQIgusLJF}|5gMg zd8UO58mtfUO43w-vZ$hUR+bPbckr8KKWATQEmUR?_Y+D~sK6EO<>V*i2+9i=+88uL z7={!zbJd)0KxvzY71W?o;gXyoLu@AbEGiCdBw63}8OOjA)5tP|9&tlwZv>;Plt!Q;5*jx*7X@nABunxAEld23~jGb58QQVo~QF znNsKW0A0Xg9bQdUv7{w0hY|7RyMD0_c?ofaMShCrm#vorycg`6Huc?&AEGHk)$vKtsgwrZl55WuIMyMbF@# zAD1XyDpO9IV%pP2sQA8q7#|LJh`Ksl>OVvP6z_?E?Yz+;Ux=7mG#n_x=)6&D5oE@x zQ{pPUj+6Q+sQ}k(9q8@!N|<|B6>>+UBUZ9*?Yow2xM{1DEpwf8$k|D@v5EfE<6f*M zaW&#CcJ#ADLYT9WsQ#%f8KR58 zgxbLeJoKR2aM4sa5Q+7yunWOBjv-YE^XGc)FoSx+i3Wc}5kFJav0Wq33u_Imit^kG zlT^9@-laz>lila@MFS;M3q^hP(trl7=^yec{Tju`3j&I6YsO#}Z*=vjyssSDqHC*$ zy^fg!*Un?s1!t^EznC6PVuYaAcYBJTOwRaAMYCW<#Ts2TIlHejr#PD-+xtE2D*Ag6Fm`t8 zUXt&snOVh9r^4wa<37TDN;7*fR;m8u`%7v5@^WQ3i4uF?-vcyJrd`+fh0pdJ#?BSz z#~S1CVfhtpi=H2>_x(1^D(IY@9bFSq!4eJ&3HB8rP&^F#J}nMm;K!kgJT68C!BJ^B z!@c7lS9V+XNVUrK)trm{ojSv%K;E>)Lb5jo(qx8{t-+-aKkf+sTqLGVv|F?j;^VA6 zA@kq5IVcM= z5{8zFT>7Bk;;+IXq6=aaBzTnbaddj)1lq9h4GfA^c;{YZfHS{%$%gk8pprdf#{EId zri>=Zb?Qr&>aoa3pGh0bPmKgeN2XW%=?u5`GB67cHS;xqtso*3McIW06z?*tW3@7K zgW}6yKpJlO{yTmk2G`pP%FFL1e2X!<8+yjj z&n0Wxr-7m{iY7m-~N-Rn?$z1zLdl(VELM2n^a zFVAOY}|*XecOinE(CNx9GKs(?FyDTTc}>Vq;tg zprGveGo#zYxq%=9q(H6t`S(J;)UnY$Xmc2OJ%s)gknxTyGEpkaet<@xIILv`# zXi04)0D;ln$kk!!t1JU59Mj5pLd;dQN@u&I3oldk0r!F&_^k$?%b>f_tqY5j`WI0G zd)!awx7Qr_&_RNPMs4XZ(5$Z3BiPAF)+!>VD7=BBZzG{rY-;5kEnKjDEXFl+7{jH) zxjECn9at<|rpr8G*esdo`(mcadSElMc>2_|ypfF`b+$*1(Pw;RH#CTd&l5!S!IpB4 z_+uRN9o<~*@3;?=PFyiLT5;5^bly)fcKoFl+*FI;OjzfIaY8gpjs*6`adrY^jo|eu zAw-#Mc2JRcD|NJI1PTr!9m{q?jE;ysaWW5CFE9qre^lW>ZF^CFOwr5OJrnYh8eXu zY;YPhxc0VI60w2P-u#;b*4QX_T1n{or^IJ)5$|z&>{?dLXI4^>xnP3%KE1CVca64x zEpW8bfo_k0mGP!br6Fn%%ZByX{xe7M^g@kUZEg@NHqWbxq2uMrm*tE2)1G$k{1zVU ziz`+Gjh5D#PVam}=CcoI=~=yFyxT`8jwR*3hkio_GiKer4kNdHcTt;280P#4_}ro zx=E0s5!bMxLm70#`qj!O@yeC&a-G36#8I`@cS)NhJdaFfG25k{Tl;}q@q~w-MC!Av zqz^v2)q2ubEuJ!=8}*v|p35+oX(z5j+>$o>mOk{h_~@l(-(>h;J4~=fH9H(~?}3$d z+}K9+v&2Bh7dfW#3<_fw1`Hui`I3AsR>BK2^f}Gr%>Uo*yeSjU9(KnB1A$yiNXu zM*7qfZL^< z_}e!24|=5}DpLIcBf1hlJ{W^QyXRQ zSRhVr1+svdm_2-F4%&fO^m{w3Yv*7Q;*0(TJ&SbGR@odQ98MZiuVqqsdXn{H!}@b& z*0oHHcY~^tcqd=+zObY1U)9Em&ANvBO6Jp&c&h^GOF|OsCrOpRo6RdCj31lin+`pX zd+iK(h;EHky4pb^h8;$rTv-xB{eGIfySB88t^6up<}PjF5lo8ZXmyAaZaB#H$A;I_Hd^s0{MdsgIi@oY zpL4@w^C-&c8Lk8dgk-vb2ZGZ1QbZ55U!(ChisW>N53oy=+2gBy!-9VHe^iR=8WxyF z{mCs^tg!uNiexF+`he9tPu7<|`n(@?y7knJGcdR`;ex(Mg2nrV{0HZ<#drrF*RWWY z-(1uWIw z4KKZ)ulS=;X)haMEJDWLoyti0V8$+s`BD^0n8R-oKd((q;1Cj|X|#a3mZ~f6dg2qj z(xp*p7k_ktaAAQqC+~KivAMB|&KA3b6NVy}H3iHa`#3_)2U#)a6nPgd7 zE-iTn`T)Lhv~j128fATmO`W$|1FfnPy4i>pc?}#-#isvC_3Kf(0c@hCOKq^EcTAzxU;n`e3Z#`V;(3^Y+cb_6d4*B2;^gT-)w zRl0O0w^t_m#$`Gt5-SgRQs=m?)5!5U*e(TfXa}SpTe0e^iHWN-8dBiBB5*DzFvp~b zzrr1!{St_^uO{(0CXH!js80T5T<4&e?HCxCN6%o6zq5oo7>SC2Y$mgxL!udl;P>zk-bp%nr=4d>1Y})$AOlU?-vRr>va$^LXUNSz)>j za#-}cx6|)Ij*Is!lE)yxGU%3Bzhb!nXg@M> zabm|y9lt}Z{>D37jF5XLFMf9}QL#*JmK+-d`?pTc6>~7iO~lQ=yxk<>3;NS6T;?-u zyK#N+v6-2d%xiGK)t&1xW5EJHT2F*>#t6|V=Noj;DMgkO@37B>NW=Qy@O%xV6{uThtt#m`jBDG3M>VLYc7@4R#AnTyJxw= z94)sY)MYUNf-D2~>0U#x%{h8Z6^gTCPqom55u@3=_R3v>S@~yGnYbx z3S}SDMgMAec!|_>=TvTH0xLWumTl|iE_03c4}X8J3P|Cq)ItZ07|Dz z>JKqRDr5t!*bMKCh|lpD6cUcwc>IkfK08}San6;Y&ZY@l^KV~;--S#udZ!^5HWu-l zHV!Bxt|jbk%nma)m;&pyetj`cOSDW4+P)g8nLv%~?J`L#J8a2m)O&b$R=-@f7a=qP zqmS$B8xmT`CCj8?c>!paK$@uIk?r(2!1}D92-JmXqm?OvdY)0i-3^uY1-NfDDU3zbTjVsQ`bqwpt;9`BuUvDDW z>t^(~m`_7mIKNYlaHF&3O(t_S$bB8+cUUcEDxMyMclVy-!Fxqy5WeCX&eX) z?Ov)gznHHv_I%LMCmP_q=O63w)w-33?Xc_J)(aUv`t9S&O0lq5k~BTAqk{V>h^JP? zrbmu%dQx9(K1;FtTdw{-8b7?;3>y&;ZeW&0_`u@K`5B0}jvP5f?Nqe-C;%;1w0exb z;7`Q*O{lGG%2?PWEKk@c9c2|=a@S@086G~5^;d50O*h7#qX`O)w_S;?e-4CT&pQ(&a zcdeaSm!nC(j`11R1e1_#p^su4?)IJ}J78Z35#ZFNd37;=8pV4sxMffFk18Q`cKg`W zSQQ2Qe#DHvFXK2Ygp_Dz2;$7;@qW+O5I(XPCdek}?wc%MlVhU*PmU1fieix}5{URs zgIgW0EFJmP_bi8PvaE)Vet2s5yf;~qDn>yg zrkV6E8vlxMya$X*)Jroxdc84HZ znHmHo6>jFgy7pncu5odFFN!MUn{))8nb8j-qt{2jcI?f4c0pR=QxN(2$wi;-^#rUj zd0M~7@;btN|Em9>gWPQod9X4M6GI0ZRb>U;!zTH$0kH}qF2g42Bc0i01ufQ>N5T>Y zIwyX*-t>n^D@bJpf2@713Mk2SPM*}f8*bg1fnIBtFAnIygmgcg$E+s($wFX&zLV6` zY;WPZl2DwOEz07PZOZ9c|C#YpA@1ROjpsm~JrF|_;Ck`f*88_&%X2*fLbz>EgJW#T z7_oV-U@Kp8-R*EXOz=)o4}cy?xNr^0b6+4}C{&j``D%r7JF>h7LoxKSG1Af37>q$d z8yJlI8b$lK{g8zAQ~pssEF4IY4`Z72rQ+p`3Z)5HvC4eu5JyTSsBDK7{0(HwhA%|RMwV3vKn53t62%bX-@pUS0LnLIKB4RH+Yp?9&_l#Yhh^F)!B!3R3{&B z8fj=X_9O9OD%>XDR|Kw|4uN?iV_wLfe0w<1F$71Zb}M_)2Q|(-^J0wA#mK!I%@b)t zN7*^fe^>xeDDydEIb>ViRn* zPT@je6B6<57a;#BsCbprfQ^uc;x={Mw>V+_IN(Q|JWJV6L=B9*6?PW{DhW)C?|E;C zw@s|_JNEN>vT`r1;|9vK>$k6}$+s2vKQojHFC%+6lsbxxf;fu%XK-hvmsfgnUxn)L ziCZ>sSWHGg1X3Cvx}DNYW0NR5qU`Fd;D0={FkEu}M1 z+a1*Z?)|i2k@j^vZCs`+7EU+SzK;4i{zrd=B{vz(iLA|wT^tL+yM8_TbKY_R!?I4l z18S~^b~FRWkB8_`u2dbaX_LmGtE%Mf)Qm`br(*IP(_g?;{H1Bj5G|CX8FGVGA{r1D z1%g%;o@(D27Lgiiy`Hn&v7mxSbswPu_1iS;TBwA zjP4ahMhmB~J0_2g|;P+uXC&92aMiK}K5`?2U@aK3QC_ zF7k60|MM;HGfMVipw6a4SF*Z`f&>|n+~3alXA2vxPM0|*qWfyxxeopl3dgxj&XVT4 zcz+;LNsX$+czns*v}}+7SM@aCNn6}6ULx%aCj1j7-jnZlIr-%DE0wF4CCx9DmO@?` zztJs48toDCzh41P(^8h6q>bp$m*Nz6VV@dR67raC7vUCKg%t?~Kc`@JPd-(#7P3xM zC^GAW8nCya@54$xQqiCS02?Y|_@p+j(5g7BD{FJeP?9!1LWuiH@!xHI1<1BOho7osF=R`BB6Dm;TpnoX zu*!}b%yuVc=hw1V8X|Fxx=y$*%Vs`2urU(NETrHxoVsW97G%Awa=!FgXvvH%`tDeW zAn5RjR-$GvM?K72pYbkodL-*LB?*;R$!sX3hA@MXs^P_uvtRT<4)4~z;whwa-TC?f zeEqRY>|?jH%fSLWY$A%2xEimZm=tg*$H+c%Qyw`&@jAly2)7SM7f<#ERH< zgcy_$tx)#|6DW~1rcIOgE7%~afkDD#2lt05RUQCtkGU_6uz7{^93CI3KQh>^Sew`R z6ht~(aT=HS5wEJYtF+1|9rDD5&3DNf5U*PBcquaV-30u)us>HaFc6GE5V!=KWyKfZ z2)Fg@)^t5&-C;l50yL_Y-V1;wtfL3l%&PA?<<^RUxtp6sq|Eo@o#NIJmQxV`A(<=U zqmm35UF;)hsH1E%VE~Nvjdh%6<_D|#SkjL^mXN0@+65n zWU$P3>bfD|G;=@+&5@nJgkbpqbWt6WY%A- zzcmos8@w=k6mZ@v%yx0A*|4C<==0b0m6&)ZpjCzw`53XiKR%B)2UnK*RpI}9125g< z{Pzupbe}Ri=fzw9jdx`FE{JpgOIm&|h-32o8`Q`Iqe-y-C%HwF;QUX*fG)xRpTrVf zLioeK?o}qsfjDtyC%Odtzw?n-=n@c;5K<7*Em!C=u$E~5Z`dKjU4{u3(i6*Mb(bL# z;%XI#a&)ofw&!H^b#hcwgoeR|{ol6PzpMYZHwFd8`hVt5N<-}1#4{7x#Mv^@4<%74 u|KGO=8Cwzif3HV+vR7}~jiCqy%2JY Date: Thu, 8 May 2025 19:04:38 +0200 Subject: [PATCH 14/39] Add 1211 to PADP Swagger; token compare/replace is added to SE-customers in OVPAY-1742 feature branch and PR --- src/openapi/apim/TP-PAD.yaml | 187 ++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 2 deletions(-) diff --git a/src/openapi/apim/TP-PAD.yaml b/src/openapi/apim/TP-PAD.yaml index fe2ae98..5c522d7 100644 --- a/src/openapi/apim/TP-PAD.yaml +++ b/src/openapi/apim/TP-PAD.yaml @@ -1,8 +1,8 @@ openapi: 3.0.1 info: - title: Personal Account Data (PAD) APIs for touchpoints + title: Personal Account Data (PAD) APIs for touchpoints and Service Engine description: |- - APIs for touchpoints to manage Personal Account Data (PAD) on OVpay tokens (xTATs).\ + 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' @@ -11,6 +11,8 @@ servers: 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: @@ -230,8 +232,189 @@ paths: 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: From 8cced0cbd0ff5dffa982c4e99ece6aed69506a3d Mon Sep 17 00:00:00 2001 From: Max Martens Date: Fri, 9 May 2025 16:52:44 +0200 Subject: [PATCH 15/39] WIP --- src/openapi/customers/SE-customers.yaml | 632 ++++++++++++++---------- 1 file changed, 369 insertions(+), 263 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index d215081..d32e34f 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -145,7 +145,7 @@ paths: application/json: example: { - "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", + "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers", "apiErrorCode": "400.1", "title": "Niet gevonden", "detail": "Klant niet gevonden", @@ -158,7 +158,7 @@ paths: application/json: example: { - "type": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers", + "type": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers", "apiErrorCode": "409.1", "title": "Meer dan 1 klantprofiel gevonden", "detail": "Meer dan 1 klantprofiel gevonden. Verfijn je zoekcriteria.", @@ -278,7 +278,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -293,13 +293,13 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -312,42 +312,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/tokenPersonalizations?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -357,7 +352,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -372,14 +367,14 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { @@ -398,37 +393,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/51compare", "method": "POST", }, }, @@ -438,7 +433,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -453,14 +448,14 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": { "autoReloadAmount": 500, @@ -513,38 +508,38 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "update_tokenPersonalization": + "update_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "PATCH", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", + "method": "POST", }, }, }, @@ -553,7 +548,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -568,14 +563,14 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { @@ -603,38 +598,38 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "update_tokenPersonalization": + "update_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "PATCH", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", + "method": "POST", }, }, }, @@ -643,7 +638,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -658,14 +653,14 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, - "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { @@ -711,38 +706,38 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "update_tokenPersonalization": + "update_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "PATCH", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", + "method": "POST", }, }, }, @@ -751,7 +746,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -773,7 +768,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -813,7 +808,7 @@ paths: "tokenStatus": { "tokenStatusId": 4, "name": "On stock" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -833,7 +828,7 @@ paths: "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -856,7 +851,7 @@ paths: "name": "Removed by customer (*)", }, "expirationDate": "2028-02-01", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -876,7 +871,7 @@ paths: "tokenStatus": { "tokenStatusId": 1, "name": "Retired" }, "expirationDate": "2025-02-01", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -896,7 +891,7 @@ paths: "tokenStatus": { "tokenStatusId": 7, "name": "Renewed Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -911,7 +906,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "GET", }, }, @@ -991,6 +986,7 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovPpasNumber": null, @@ -998,7 +994,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1007,42 +1003,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, @@ -1051,7 +1042,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "POST", }, }, @@ -1065,6 +1056,7 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 1, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, @@ -1073,7 +1065,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { @@ -1088,37 +1080,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, }, @@ -1127,7 +1119,7 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens", "method": "POST", }, }, @@ -1230,6 +1222,7 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, @@ -1237,7 +1230,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1246,42 +1239,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", - }, + }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -1296,6 +1284,7 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, "lastDigits": null, @@ -1304,7 +1293,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": { @@ -1319,37 +1308,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -1371,6 +1360,7 @@ paths: { "customerProfileId": 1, "ovPayTokenId": 10, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, @@ -1378,7 +1368,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1387,42 +1377,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=10", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/10/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=10", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", - }, + }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare", "method": "POST", }, }, @@ -1498,7 +1483,8 @@ paths: "ovPayToken": { "customerProfileId": 1, - "ovPayTokenId": 1, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, @@ -1506,7 +1492,7 @@ paths: "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1515,42 +1501,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", - }, + }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -1564,7 +1545,8 @@ paths: "ovPayToken": { "customerProfileId": 1, - "ovPayTokenId": 1, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, @@ -1572,7 +1554,7 @@ paths: "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1581,42 +1563,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", "method": "POST", - }, + }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -1630,7 +1607,8 @@ paths: "ovPayToken": { "customerProfileId": 1, - "ovPayTokenId": 1, + "ovPayTokenId": 5, + "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, @@ -1638,7 +1616,7 @@ paths: "tokenStatus": { "tokenStatusId": 5, "name": "Suspended" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1647,42 +1625,37 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/5/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", "method": "GET", }, - "create_tokenPersonalization": + "add_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenId=5", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e35977b2-52bb-48ef-aca8-297b2c1d5058", "method": "POST", - }, + }, "compare_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/compare", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", "method": "POST", }, }, @@ -1778,17 +1751,17 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances/1", "method": "GET", }, "get_order": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/orders/501B17EF-36C4-4039-B92C-6517969B464E", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E", "method": "GET", }, "get_contract": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F", "method": "GET", }, }, @@ -1838,10 +1811,10 @@ paths: examples: Compare with an existing OVpay token: value: { "ovPayTokenId": 2 } - Compare with an XBOT: - value: { "xbot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } - Compare with an XTAT: - value: { "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } + Compare with an xBOT: + value: { "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } + Compare with an xTAT: + value: { "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } Compare with SRID + amount: value: { "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230 } @@ -1851,8 +1824,8 @@ paths: value: { "ovPayTokenId": 2, - "xbot": "e35977b2-52bb-48ef-aca8-297b2c1d5058", - "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230, "ovpasNumber": "OV34567", @@ -1866,20 +1839,20 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Comparison result for transferable token: + Transferable token: value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": null, "ePurse": null, "personalAccountData": @@ -1889,7 +1862,7 @@ paths: { "customerProfileId": null, "ovPayTokenId": null, - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, @@ -1921,14 +1894,14 @@ paths: }, }, } - Comparison result for non-transferable token: + Non-transferable token (marked PAD): value: { "oldOvPayToken": { "customerProfileId": 1, "ovPayTokenId": 1, - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": "MyToken", "tokenStatus": @@ -1938,13 +1911,44 @@ paths: "autoReloadRegistration": null, "ePurse": null, "personalAccountData": - { "name": null, "birthdate": null, "photo": null }, + { + "name": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "birthdate": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": + { + "inaccuracyFlag": true, + "inaccuracyFlagReason": null, + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + } }, "newOvPayToken": { "customerProfileId": null, "ovPayTokenId": null, - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "alias": null, "tokenStatus": null, @@ -1955,7 +1959,85 @@ paths: "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": true, + "isTansferable": false, + "transferableObjects": + { + "tokenType": true, + "tokenStatus": true, + "expirationDate": true, + "productInstances": true, + "autoReloadRegistration": true, + "ePurse": true, + "personalAccountData": + { + "name": false, + "birthdate": false, + "photo": false, + }, + }, + "_links": {}, + } + Non-transferable token (different age profile): + value: + { + "oldOvPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": 2, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": null + } + }, + "newOvPayToken": + { + "customerProfileId": null, + "ovPayTokenId": null, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": null, + "tokenStatus": null, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { + "name": null, + "birthdate": + { + "inaccuracyFlag": false, + "inaccuracyFlagReason": "T.B.D", + "inaccuracyFlagSetCounter": 1, + "isValidated": false, + "changeCounter": 0, + "maxUpdatesVerificationCount": 0, + "lastChangeDate": "2024-08-24T14:15:22Z", + }, + "photo": null + } + }, + "isTansferable": false, "transferableObjects": { "tokenType": true, @@ -1966,13 +2048,36 @@ paths: "ePurse": false, "personalAccountData": { - "name": false, + "name": true, "birthdate": false, - "photo": false, + "photo": true, }, }, "_links": {}, } + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + New token already present in other customer profile: + value: + { + "type": "https://htm.nl/api/v1/probs/badrequest", + "title": "Bad Request", + "detail": "New token already present in other customer profile.", + "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", + "errors": + [ + { + "detail": "New token already present in other customer profile.", + "pointer": "#/0/ovPayTokenId", + "ovPayTokenId": 2, + }, + ], + } "404": description: Not found content: @@ -1992,7 +2097,7 @@ paths: { "detail": "The old token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", - "ovPayTokenId": 123, + "ovPayTokenId": 1, }, ], } @@ -2008,7 +2113,7 @@ paths: { "detail": "The new token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", - "ovPayTokenId": 123, + "ovPayTokenId": 2, }, ], } @@ -2142,7 +2247,7 @@ paths: "alias": "MyToken", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-02-01", - "replacedByTokenId": 2, + "replacedByTokenId": null, "autoReloadRegistration": { "autoReloadAmount": 500, @@ -2195,39 +2300,40 @@ paths: { "self": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens?ovpaytokenId=1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", "method": "GET", }, "partial_edit": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "PATCH", }, - "replace_token": - { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace", - "method": "POST", - }, "delete_token": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", "method": "DELETE", }, "get_productinstances": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", "method": "GET", }, "get_trips": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", "method": "GET", }, - "update_tokenPersonalization": + "update_personal-data": { - "href": "https://api.integratielaag.nl/abt/1.0/touchpoint/pad?ovpaytokenid=1", - "method": "PUT", + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/e7fa3392-646b-40e2-95a6-c417dc0b0969", + "method": "PATCH", }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", + "method": "POST", + }, + }, } "404": @@ -2490,7 +2596,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/addresses/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/addresses/1 method: type: string example: GET @@ -2499,7 +2605,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/addresses/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/addresses/1 method: type: string example: DELETE @@ -2537,7 +2643,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/phones/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/phones/1 method: type: string example: GET @@ -2546,7 +2652,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/phones/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/phones/1 method: type: string example: DELETE @@ -2558,7 +2664,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers method: type: string example: GET @@ -2568,7 +2674,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/statuses + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/statuses method: type: string example: POST @@ -2577,7 +2683,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers method: type: string example: PATCH @@ -2586,7 +2692,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens method: type: string example: GET @@ -2595,7 +2701,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens method: type: string example: POST @@ -2648,7 +2754,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: GET @@ -2658,7 +2764,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: PATCH @@ -2667,7 +2773,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/replace + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/replace method: type: string example: POST @@ -2676,7 +2782,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1 + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1 method: type: string example: DELETE @@ -2685,7 +2791,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances method: type: string example: GET @@ -2694,7 +2800,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/trips + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips method: type: string example: GET @@ -2760,7 +2866,7 @@ components: properties: href: type: string - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/tokens/1/productinstances + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances method: type: string example: GET @@ -2770,7 +2876,7 @@ components: href: type: string description: Always present for any HTM product-instance - example: https://api.integratielaag.nl/abt/1.0/touchpoint/orders/501B17EF-36C4-4039-B92C-6517969B464E + example: https://api.integratielaag.nl/abt/touchpoint/1.0/orders/501B17EF-36C4-4039-B92C-6517969B464E method: type: string example: GET @@ -2780,7 +2886,7 @@ components: href: type: string description: Only present for subscriptions/contracts - example: https://api.integratielaag.nl/abt/1.0/touchpoint/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F + example: https://api.integratielaag.nl/abt/touchpoint/1.0/customers/contracts/56B17EF-C436-9043-B76C-481797WEB464F method: type: string example: GET From 35edfa4c4f74bebffc12189a44f982af5673991e Mon Sep 17 00:00:00 2001 From: Max Martens Date: Fri, 9 May 2025 16:56:33 +0200 Subject: [PATCH 16/39] WIP 2 --- src/openapi/customers/SE-customers.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index d32e34f..e1177f9 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1155,8 +1155,8 @@ paths: type: integer example: 1 required: true - summary: Replace an OV paytoken with another - description: Replace an OV paytoken in the database for a given customer with another token + summary: Replace an OVpay token with another (+ transfer products) + description: Transfer products from one OVpay token to antother, and replace the tokens in the database requestBody: content: application/json: @@ -1796,11 +1796,12 @@ paths: - Token type - Token status (only if target token is known in the customer profile) - - Experation date + - Expiry date - Instantiated GBO products - Auto reload registration - E-purse - PAD (name, birthdate, photo) + - Age profile tags: - Customers requestBody: From aba341d14bc21cdabf00aa7898d5394f3b3b10a1 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Fri, 9 May 2025 17:01:03 +0200 Subject: [PATCH 17/39] Add two more examples (non transferable products and unsupported token type combination) --- src/openapi/customers/SE-customers.yaml | 96 +++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index e1177f9..63a655e 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1895,6 +1895,102 @@ paths: }, }, } + Non-transferable token (products not compatible on new token): + value: + { + "oldOvPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "newOvPayToken": + { + "customerProfileId": null, + "ovPayTokenId": null, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": null, + "tokenStatus": null, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "isTansferable": false, + "transferableObjects": + { + "tokenType": true, + "tokenStatus": true, + "expirationDate": true, + "productInstances": false, + "autoReloadRegistration": true, + "ePurse": true, + "personalAccountData": + { "name": true, "birthdate": true, "photo": true }, + }, + "_links": {}, + } + Non-transferable token (unsupported token type combination): + value: + { + "oldOvPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "newOvPayToken": + { + "customerProfileId": null, + "ovPayTokenId": null, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "alias": null, + "tokenStatus": null, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + }, + "isTansferable": false, + "transferableObjects": + { + "tokenType": false, + "tokenStatus": true, + "expirationDate": true, + "productInstances": true, + "autoReloadRegistration": true, + "ePurse": true, + "personalAccountData": + { "name": true, "birthdate": true, "photo": true }, + }, + "_links": {}, + } Non-transferable token (marked PAD): value: { From b7ff9055e5e6687ecb261d05e4377069853a2395 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Fri, 9 May 2025 17:19:18 +0200 Subject: [PATCH 18/39] Finish /transfer spec, add schema for request body for /compare and /transfer --- src/openapi/customers/SE-customers.yaml | 119 +++++++++++++++++++++--- 1 file changed, 105 insertions(+), 14 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 63a655e..be828a7 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1808,7 +1808,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/unavailable" + $ref: "#/components/schemas/CompareRequest" examples: Compare with an existing OVpay token: value: { "ovPayTokenId": 2 } @@ -2259,8 +2259,8 @@ paths: post: summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token." description: |- - **Note that this is an integratielaag endpoint, not a service eninge endpoint!** - Transfers all products, e-purse and personal account data of an existing OVpay token + **Note that this is an integratielaag endpoint, not a Service Engine endpoint!** + First transfers all personal account data (if present), then all products, of an existing OVpay token to a new OVpay token. The new token will also be persisted in the profile as a replacement of the old token. tags: @@ -2269,21 +2269,25 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/unavailable" + $ref: "#/components/schemas/TransferRequest" examples: Transfer of a token without PAD to an existing OVpay token: value: { "oldOvPayToken": {}, - "newOvPayToken": { "ovPayTokenId": 2 }, + "newOvPayToken": + { + "ovPayTokenId": 2, + "alias": "MyToken" + } } - Transfer of a token without PAD to a new OVpay token by XTAT: + Transfer of a token without PAD to a new OVpay token by xTAT: value: { "oldOvPayToken": {}, "newOvPayToken": { - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "MyToken", }, } @@ -2295,15 +2299,21 @@ paths: { "ovPayTokenId": 2, "padEmailAddress": "jandevries@outlook.com", + "alias": "MyToken", }, } Transfer of a token with PAD to an existing OVpay token with existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, - "newOvPayToken": { "ovPayTokenId": 2, "padOtp": "678901" }, + "newOvPayToken": + { + "ovPayTokenId": 2, + "padOtp": "678901", + "alias": "MyToken" + }, } - Transfer of a token with PAD to a new token by XTAT without existing PAD: + Transfer of a token with PAD to a new token by xTAT without existing PAD with e-mail verification by OTP: value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2312,15 +2322,17 @@ paths: "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "MyToken", "padEmailAddress": "jandevries@outlook.com", + "padOtp": "678901", }, } - Transfer of a token with PAD to a new token by XTAT with existing PAD: + Transfer of a token with PAD to a new token by SRID and amount, with existing PAD: value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "serviceReferenceId": "NLOV1234567ABCDEFG", + "amount": 230, "alias": "MyToken", "padOtp": "678901", }, @@ -2452,7 +2464,7 @@ paths: { "detail": "The old token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", - "ovPayTokenId": 123, + "ovPayTokenId": 1, }, ], } @@ -2468,7 +2480,7 @@ paths: { "detail": "The new token was not found in the customer profile.", "pointer": "#/0/ovPayTokenId", - "ovPayTokenId": 123, + "ovPayTokenId": 2, }, ], } @@ -2555,7 +2567,7 @@ paths: { "detail": "The new token is expired.", "pointer": "#/0/ovPayToken/expirationDate", - "experiationDate": 2022-01-01, + "experiationDate": "2022-01-01", }, ], } @@ -2594,6 +2606,85 @@ components: schemas: unavailable: type: object + CompareRequest: + type: object + properties: + ovPayTokenId: + type: integer + example: 1 + description: When new token is already present in customer profile + xBOT: + type: string + format: uuid + example: "91641b54-056c-49ea-b598-ccde81d6c45a" + xTAT: + type: string + format: uuid + example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff" + serviceReferenceId: + type: string + example: "NLOV1234567ABCDEFG" + description: When provided, amount is also required + amount: + type: integer + example: 100 + description: When provided, serviceReferenceId is also required + ovpasNumber: + type: string + example: "OV34567" + description: When provided, verificationCode is also required + verificationCode: + type: string + example: "1234" + description: When provided, ovpasNumber is also required + TransferRequest: + type: object + required: + - oldOvPayToken + - newOvPayToken + properties: + oldOvPayToken: + type: object + properties: + padOtp: + type: string + pattern: ^[0-9]{6}$ + example: "023456" + newOvPayToken: + type: object + properties: + ovPayTokenId: + type: integer + example: 1 + description: When new token is already present in customer profile + xBOT: + type: string + format: uuid + example: "91641b54-056c-49ea-b598-ccde81d6c45a" + xTAT: + type: string + format: uuid + example: "4c2d60e2-cd03-4c80-ae70-573a301f0bff" + serviceReferenceId: + type: string + example: "NLOV1234567ABCDEFG" + description: When provided, amount is also required + amount: + type: integer + example: 100 + description: When provided, serviceReferenceId is also required + padOtp: + type: string + pattern: ^[0-9]{6}$ + example: "123456" + description: Can be xTAT-based OTP (for existing PAD), or email-based OTP (for new PAD). In the latter case, padEmailAddress should be the same address as used for the OTP! + padEmailAddress: + type: string + format: email + example: 8Z9dG@example.com + alias: + type: string + example: MyNewToken CustomersResponse: type: object properties: From d280bfbad573106844047121eea014a9584e5cfd Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 09:59:02 +0200 Subject: [PATCH 19/39] OVPAY-1742 - Fixed typo. --- src/openapi/customers/SE-customers.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index be828a7..df0854b 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2567,7 +2567,7 @@ paths: { "detail": "The new token is expired.", "pointer": "#/0/ovPayToken/expirationDate", - "experiationDate": "2022-01-01", + "expiriationDate": "2022-01-01", }, ], } From 7c7665888494676eb7cf823bbde1d1d99324148f Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 11:08:37 +0200 Subject: [PATCH 20/39] OVPAY-1742 - Fixed typo. --- src/openapi/customers/SE-customers.yaml | 26 +++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index df0854b..c556167 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -18,7 +18,9 @@ paths: tags: - Customers summary: Get a single customer profile based on search parameters - description: Get a single customer profile based on search parameters. Only returns a profile if a single result matches the parameters; when multiple results are found, additional seach parameters are required to disambiguate. + description: | + Get a single customer profile based on search parameters. Only returns a profile if a single result matches + the parameters; when multiple results are found, additional search parameters are required to disambiguate. parameters: - name: customerProfileId in: query @@ -989,7 +991,7 @@ paths: "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, - "ovPpasNumber": null, + "ovPasNumber": null, "alias": "Mijn token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, @@ -1156,7 +1158,7 @@ paths: example: 1 required: true summary: Replace an OVpay token with another (+ transfer products) - description: Transfer products from one OVpay token to antother, and replace the tokens in the database + description: Transfer products from one OVpay token to another, and replace the tokens in the database requestBody: content: application/json: @@ -1364,7 +1366,7 @@ paths: "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, - "alias": "Mijn bestaandetoken", + "alias": "Mijn bestaande token", "tokenStatus": { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", @@ -1821,7 +1823,7 @@ paths: { "serviceReferenceId": "NLOV1234567ABCDEFG", "amount": 230 } Compare with OVpas number + verification code: value: { "ovpasNumber": "OV34567", "verificationCode": "1234" } - Complete reqeuest body (for development only): + Complete request body (for development only): value: { "ovPayTokenId": 2, @@ -1874,7 +1876,7 @@ paths: "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": true, + "isTransferable": true, "transferableObjects": { "tokenType": true, @@ -1929,7 +1931,7 @@ paths: "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": false, + "isTransferable": false, "transferableObjects": { "tokenType": true, @@ -1977,7 +1979,7 @@ paths: "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": false, + "isTransferable": false, "transferableObjects": { "tokenType": false, @@ -2056,7 +2058,7 @@ paths: "personalAccountData": { "name": null, "birthdate": null, "photo": null }, }, - "isTansferable": false, + "isTransferable": false, "transferableObjects": { "tokenType": true, @@ -2134,7 +2136,7 @@ paths: "photo": null } }, - "isTansferable": false, + "isTransferable": false, "transferableObjects": { "tokenType": true, @@ -2345,7 +2347,7 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - New token as a result of a succesful transfer: + New token as a result of a successful transfer: value: { "customerProfileId": 1, @@ -2567,7 +2569,7 @@ paths: { "detail": "The new token is expired.", "pointer": "#/0/ovPayToken/expirationDate", - "expiriationDate": "2022-01-01", + "expirationDate": "2022-01-01", }, ], } From 937962401bd6aa287d38168872e35b28c487027a Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 12:19:22 +0200 Subject: [PATCH 21/39] OVPAY-1438 - Added cardreader YAML. --- .../nfc_reader/servicedeskcardreader-api.yaml | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 src/openapi/nfc_reader/servicedeskcardreader-api.yaml diff --git a/src/openapi/nfc_reader/servicedeskcardreader-api.yaml b/src/openapi/nfc_reader/servicedeskcardreader-api.yaml new file mode 100644 index 0000000..722bde1 --- /dev/null +++ b/src/openapi/nfc_reader/servicedeskcardreader-api.yaml @@ -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. From db844e2c3968e49664a1a63ea4769b1a2fd480ea Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 13:54:19 +0200 Subject: [PATCH 22/39] OVPAY-1784 - CRUD for NFC card reader. --- src/openapi/service/service-crud.yaml | 159 ++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 src/openapi/service/service-crud.yaml diff --git a/src/openapi/service/service-crud.yaml b/src/openapi/service/service-crud.yaml new file mode 100644 index 0000000..0458b75 --- /dev/null +++ b/src/openapi/service/service-crud.yaml @@ -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-02 15:01:00.000", + }, + ], + } + Multiple TokenRegisterRequests: + summary: Multiple TokenRegisterRequests + value: + { + "tokenRegisterRequests": + [ + { + "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", + "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", + "updated": "2025-07-02 15:01:00.000", + }, + { + "readerId": "b4d8e43c-be21-472c-955b-a0c7c11b4bfb", + "xBot": "625bc66b-a5de-42fc-ba9e-fb02ada4a4ee", + "updated": "2025-07-02 13:37:07.000", + }, + ], + } + /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-02 15:01:00.000", + } + "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-02 15:01:00.000", + } +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:00Z" + nullable: false + description: The date and time when the token register request was updated. + required: + - readerId + - xBot + - updated From ea5a3aee698217ec9f9d9860d51313ff40f8a6fc Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 17:01:00 +0200 Subject: [PATCH 23/39] OVPAY-1742 - Split /transfer into old and new endpoint. --- src/openapi/customers/SE-customers.yaml | 283 ++++++++++++++++++++++-- 1 file changed, 270 insertions(+), 13 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index c556167..70ffc85 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1157,8 +1157,10 @@ paths: type: integer example: 1 required: true - summary: Replace an OVpay token with another (+ transfer products) - description: Transfer products from one OVpay token to another, and replace the tokens in the database + summary: Replace an OVpay token with another (+ transfer products) - V1 (for touch point) + description: | + Transfer products from one OVpay token to another, and replace the tokens in the database. + This endpoint is for touch point usage and will be replaced by `/customers/tokens/{ovpayTokenId}/transfer`. requestBody: content: application/json: @@ -1196,17 +1198,6 @@ paths: "alias": "Mijn token", }, } - Replace with new token by XTAT: - summary: Replace with new token by XTAT - description: Replace with new token by XTAT. - value: - { - "ovPayToken": - { - "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", - "alias": "Mijn token", - }, - } responses: "201": description: Created @@ -1698,6 +1689,272 @@ paths: responses: "200": description: Ok + /customers/tokens/{ovpayTokenId}/replace: + post: + tags: + - Customers + parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header + schema: + type: string + example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + required: false + description: The JWT of a customer in case of touchpoint were customer logs in themselves + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header + schema: + type: string + example: feaaef83-a551-4283-8419-340b1ada3b55 + required: false + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header + schema: + type: string + example: Customer + required: false + - name: ovpayTokenId + in: path + schema: + type: integer + example: 1 + required: true + summary: Replace an OVpay token with another (+ transfer products) - V2 (for Integratielaag) + description: | + Transfer products from one OVpay token to another, and replace the tokens in the database. + This endpoint is for usage by integratielaag only. Touch points should use + `/customers/tokens/{ovpayTokenId}/transfer` instead. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Replace with existing token from profile: + summary: Replace with existing token from profile + description: Replace with existing token from customer profile. + value: { "ovPayToken": { "newTokenId": 10 } } + Replace with new token by XTAT: + summary: Replace with new token by XTAT + description: Replace with new token by XTAT. + value: + { + "ovPayToken": + { + "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "alias": "Mijn token", + }, + } + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Replace with new EMV token: + summary: Replace with new EMV token + description: Replace with new EMV token + value: + { + "ovPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "lastDigits": null, + "ovpasNumber": null, + "alias": "Mijn token", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-08-31T23:59:00+02:00", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", + "method": "GET", + }, + "add_personal-data": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", + "method": "POST", + }, + }, + }, + } + Replace with new OV pas token: + summary: Replace with new OV pas token + description: Replace with new OV pas token + value: + { + "ovPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "lastDigits": null, + "ovpasNumber": "OV34567", + "alias": "Mijn token", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-08-31T23:59:00+02:00", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": + { + "e-PurseBalance": + { "currency": "EUR", "amount": 350 }, + "status": "ACTIVE", + "originDate": "2024-07-16T11:00:00+02:00", + }, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=5", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/trips", + "method": "GET", + }, + "add_personal-data": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", + "method": "POST", + }, + }, + }, + } + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + Replace with existing EMV token: + summary: Replace with existing EMV token + description: Replace with existing EMV token + value: + { + "ovPayToken": + { + "customerProfileId": 1, + "ovPayTokenId": 10, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, + "lastDigits": null, + "ovpasNumber": null, + "alias": "Mijn bestaande token", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-08-31T23:59:00+02:00", + "replacedByTokenId": null, + "autoReloadRegistration": null, + "ePurse": null, + "personalAccountData": + { "name": null, "birthdate": null, "photo": null }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=10", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/trips", + "method": "GET", + }, + "add_personal-data": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/10/compare", + "method": "POST", + }, + }, + }, + } + /customers/tokens/{ovPayTokenId}/productinstances: get: tags: From a34fd67268fd86d57d006ca2a41b21e074ba6dc5 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 17:05:53 +0200 Subject: [PATCH 24/39] OVPAY-1742 - Added examples for development. --- src/openapi/customers/SE-customers.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 70ffc85..ec3f369 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1746,6 +1746,16 @@ paths: "alias": "Mijn token", }, } + Complete request body (for development only): + value: + { + "ovPayToken": + { + "newTokenId": 10, + "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "alias": "Mijn token", + }, + } responses: "201": description: Created From a58971d1c96fe9bb2d5084e9358933e9f766a243 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 17:11:40 +0200 Subject: [PATCH 25/39] OVPAY-1742 - Added X-HTM headers to /compare and /transfer. --- src/openapi/customers/SE-customers.yaml | 42 ++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index ec3f369..a0565f1 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2039,6 +2039,26 @@ paths: } /customers/tokens/{ovPayTokenId}/compare: parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header + schema: + type: string + example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + required: false + description: The JWT of a customer in case of touchpoint were customer logs in themselves + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header + schema: + type: string + example: feaaef83-a551-4283-8419-340b1ada3b55 + required: false + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header + schema: + type: string + example: Customer + required: false - name: ovPayTokenId in: path required: true @@ -2517,11 +2537,31 @@ paths: } /customers/tokens/{ovPayTokenId}/transfer: parameters: + - name: X-HTM-JWT-AUTH-HEADER + in: header + schema: + type: string + example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + required: false + description: The JWT of a customer in case of touchpoint were customer logs in themselves + - name: X-HTM-CUSTOMER-PROFILE-ID-HEADER + in: header + schema: + type: string + example: feaaef83-a551-4283-8419-340b1ada3b55 + required: false + description: The customerProfileId of a customer in the case of the SMP + - name: X-HTM-ROLE-HEADER + in: header + schema: + type: string + example: Customer + required: false - name: ovPayTokenId in: path required: true style: simple - description: Id of the OVpay token for the LHS of the comparison. + description: Id of the OVpay token from which data will be transferred. schema: type: integer example: 1 From 8da955c5cf06601286adb405998473f6fcface60 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 18:34:07 +0200 Subject: [PATCH 26/39] OVPAY-1742 - Improved examples for /transfer. --- src/openapi/customers/SE-customers.yaml | 41 +++++++++++++++++++------ 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index a0565f1..c897cc2 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2581,26 +2581,37 @@ paths: $ref: "#/components/schemas/TransferRequest" examples: Transfer of a token without PAD to an existing OVpay token: + summary: Transfer of a token without PAD to an existing OVpay token + description: | + Transfer of a token without PAD to an existing OVpay token. value: { "oldOvPayToken": {}, "newOvPayToken": { "ovPayTokenId": 2, - "alias": "MyToken" } } Transfer of a token without PAD to a new OVpay token by xTAT: + summary: Transfer of a token without PAD to a new OVpay token by xTAT + description: | + Transfer of a token without PAD to a new OVpay token by xTAT. value: { "oldOvPayToken": {}, "newOvPayToken": { "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "alias": "MyToken", + "alias": "My new token", }, } Transfer of a token with PAD to an existing OVpay token without existing PAD: + summary: Transfer of a token with PAD to an existing OVpay token without existing PAD + description: | + Transfer of a token with PAD to an existing OVpay token without existing PAD. + Note how this request is different, since it has an e-mail address on which the new + PAD should be created. This request may optionally provide an OTP for + verification of th provided email address. value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2608,10 +2619,13 @@ paths: { "ovPayTokenId": 2, "padEmailAddress": "jandevries@outlook.com", - "alias": "MyToken", + "padOtp": "678901", }, } Transfer of a token with PAD to an existing OVpay token with existing PAD: + summary: Transfer of a token with PAD to an existing OVpay token with existing PAD + description: | + Transfer of a token with PAD to an existing OVpay token with existing PAD. value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2619,30 +2633,37 @@ paths: { "ovPayTokenId": 2, "padOtp": "678901", - "alias": "MyToken" }, } - Transfer of a token with PAD to a new token by xTAT without existing PAD with e-mail verification by OTP: + Transfer of a token with PAD to a new token by xTAT without existing PAD: + summary: Transfer of a token with PAD to a new token by xTAT without existing PAD + description: | + Transfer of a token with PAD to a new token by xTAT without existing PAD. + Note how this request is different, since it has an e-mail address on which the new + PAD should be created. This request may optionally provide an OTP for + verification of th provided email address. value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", - "alias": "MyToken", + "alias": "My new token", "padEmailAddress": "jandevries@outlook.com", "padOtp": "678901", }, } - Transfer of a token with PAD to a new token by SRID and amount, with existing PAD: + Transfer of a token with PAD to a new token by xTAT with existing PAD: + summary: Transfer of a token with PAD to a new token by xTAT with existing PAD + description: | + Transfer of a token with PAD to a new token by xTAT with existing PAD. value: { "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { - "serviceReferenceId": "NLOV1234567ABCDEFG", - "amount": 230, - "alias": "MyToken", + "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", "padOtp": "678901", }, } From 343d49a9c83673e551b54af6598904b64c053d4c Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Mon, 12 May 2025 18:35:17 +0200 Subject: [PATCH 27/39] OVPAY-1742 - Removed incorrect 404 response example from /transfer. --- src/openapi/customers/SE-customers.yaml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index c897cc2..904fb54 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2830,22 +2830,6 @@ paths: }, ], } - SRID for new token not found in GBO: - value: - { - "type": "https://htm.nl/api/v1/probs/notfound", - "title": "The item you requested was not found.", - "detail": "The new token was not found in GBO:.", - "instance": "urn:uuid:4017fabc-1b28-11e8-accf-0ed5f89f718b", - "errors": - [ - { - "detail": "Service Reference ID for the new token was not found in GBO.", - "pointer": "#/0/serviceReferenceId", - "serviceReferenceId": "NLOV1234567ABCDEFG", - }, - ], - } "405": description: Not allowed content: From 2df187ac59e62cf093b35f442df2eff5d56b736a Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 13 May 2025 09:18:52 +0200 Subject: [PATCH 28/39] OVPAY-1742 - xTAT casing. --- src/openapi/customers/SE-customers.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 904fb54..65c0cd7 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1742,7 +1742,7 @@ paths: { "ovPayToken": { - "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "alias": "Mijn token", }, } @@ -1752,7 +1752,7 @@ paths: "ovPayToken": { "newTokenId": 10, - "xtat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", "alias": "Mijn token", }, } @@ -2514,8 +2514,8 @@ paths: [ { "detail": "XTAT for the new token was not found in GBO.", - "pointer": "#/0/xtat", - "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "pointer": "#/0/xTat", + "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", }, ], } @@ -2647,7 +2647,7 @@ paths: "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padEmailAddress": "jandevries@outlook.com", "padOtp": "678901", @@ -2662,7 +2662,7 @@ paths: "oldOvPayToken": { "padOtp": "123456" }, "newOvPayToken": { - "xtat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padOtp": "678901", }, @@ -2825,8 +2825,8 @@ paths: [ { "detail": "XTAT for the new token was not found in GBO.", - "pointer": "#/0/xtat", - "xtat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "pointer": "#/0/xTat", + "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", }, ], } From 6dffa7282504867e0a08b0a019c922dc0d76fc70 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 13 May 2025 10:03:41 +0200 Subject: [PATCH 29/39] OVPAY-1742 - Added more examples for development. --- src/openapi/customers/SE-customers.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 65c0cd7..3fa1d14 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2667,6 +2667,25 @@ paths: "padOtp": "678901", }, } + Complete request body (for development only): + summary: Complete request body (for development only) + description: | + Complete request body (for development only). + value: + { + "oldOvPayToken": + { + "padOtp": "123456", + }, + "newOvPayToken": + { + "ovPayTokenId": 2, + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", + "padEmailAddress": "jandevries@outlook.com", + "padOtp": "678901", + }, + } responses: "200": description: OK From bec2e990fb8482d17466c8ac363b224f450aa678 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 13 May 2025 17:06:53 +0200 Subject: [PATCH 30/39] OVPAY-1742 - Stasjo. --- src/openapi/customers/SE-customers.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 3fa1d14..61f1c92 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -2100,7 +2100,7 @@ paths: $ref: "#/components/schemas/CompareRequest" examples: Compare with an existing OVpay token: - value: { "ovPayTokenId": 2 } + value: { "ovPayTokenId": 1 } Compare with an xBOT: value: { "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058" } Compare with an xTAT: @@ -2113,7 +2113,7 @@ paths: Complete request body (for development only): value: { - "ovPayTokenId": 2, + "ovPayTokenId": 1, "xBot": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", "serviceReferenceId": "NLOV1234567ABCDEFG", @@ -2698,7 +2698,7 @@ paths: value: { "customerProfileId": 1, - "ovPayTokenId": 1, + "ovPayTokenId": 2, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "tokenType": { "tokenTypeId": 2, "name": "OV-pas physical" }, From 4702ddae4a232613cf10f16c4de02067e84fb452 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 14 May 2025 12:07:49 +0200 Subject: [PATCH 31/39] OVPAY-1564 - Adjusted POST /payments request and response body. --- src/openapi/orders/service_engine_orders.yaml | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/openapi/orders/service_engine_orders.yaml b/src/openapi/orders/service_engine_orders.yaml index 57ba8e1..7512eb0 100644 --- a/src/openapi/orders/service_engine_orders.yaml +++ b/src/openapi/orders/service_engine_orders.yaml @@ -1702,10 +1702,7 @@ paths: v2.1: summary: Order update v2.1 description: Order update v2.1 - value: - { - "languageId": 1, - } + value: { "languageId": 1 } v1.2: summary: Order update v1.2 description: Order update v1.2 @@ -2485,7 +2482,9 @@ paths: examples: v2.1: summary: Add a payment v2.1 - description: Add a payment v2.1 + description: | + Add a payment for a concept order. Note how it is not allowed to add a payment status or an external + payment reference when adding a payment to a concept order. value: { "createdOn": "2024-03-22T09:00:00", @@ -2493,9 +2492,6 @@ paths: "paymentMethodId": 1, "isRefund": false, "htmPaymentReference": "HTM-1234", - "pspPaymentReference": null, - "paymentStatuses": [], - "mandateInput": null, } v1.2: summary: Order creation v1.2 @@ -2712,17 +2708,7 @@ paths: "isRefund": false, "htmPaymentReference": "HTM-1234", "pspPaymentReference": null, - "paymentStatuses": - [ - { - "paymentStatusId": "42eee610-1a17-4f02-be14-7e25d69d35f3", - "createdOn": "2024-03-22T09:00:00", - "statusCode": "?", - "statusDescription": "Initiated", - "statusSubCode": "?", - "statusSubDescription": "PaymentInitiated", - }, - ], + "paymentStatuses": [], "mandateInput": null, }, ], From 6b0fe72901f530938e2f21f7d0afe1f2d6529328 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Thu, 15 May 2025 10:52:51 +0200 Subject: [PATCH 32/39] OVPAY-1564 - ENdpoints /transfer and /replace now only support XTAT for target token. --- src/openapi/customers/SE-customers.yaml | 92 +++++++------------------ 1 file changed, 23 insertions(+), 69 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index 61f1c92..f0a0692 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -1731,13 +1731,12 @@ paths: schema: $ref: "#/components/schemas/unavailable" examples: - Replace with existing token from profile: - summary: Replace with existing token from profile - description: Replace with existing token from customer profile. - value: { "ovPayToken": { "newTokenId": 10 } } Replace with new token by XTAT: summary: Replace with new token by XTAT - description: Replace with new token by XTAT. + description: | + Replace with new token by XTAT. Note however the consumer provides an XTAT to identify + the new token, this token could still be an existing token linked to the customer profile. This should + be checked beforehand. value: { "ovPayToken": @@ -1746,16 +1745,6 @@ paths: "alias": "Mijn token", }, } - Complete request body (for development only): - value: - { - "ovPayToken": - { - "newTokenId": 10, - "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", - "alias": "Mijn token", - }, - } responses: "201": description: Created @@ -2580,22 +2569,13 @@ paths: schema: $ref: "#/components/schemas/TransferRequest" examples: - Transfer of a token without PAD to an existing OVpay token: - summary: Transfer of a token without PAD to an existing OVpay token + Transfer from a token without PAD to a new token: + summary: Transfer from a token without PAD to a new token description: | - Transfer of a token without PAD to an existing OVpay token. - value: - { - "oldOvPayToken": {}, - "newOvPayToken": - { - "ovPayTokenId": 2, - } - } - Transfer of a token without PAD to a new OVpay token by xTAT: - summary: Transfer of a token without PAD to a new OVpay token by xTAT - description: | - Transfer of a token without PAD to a new OVpay token by xTAT. + Transfer of a token without PAD to a new OVpay token. Note the new token in the request is always + identified by xTAT, regardless if the new token already exists in the customer profile. If the new + token does not exist in the customer profile, the user needs to provide an alias for the new token, + and it will be created in the customer profile. value: { "oldOvPayToken": {}, @@ -2605,43 +2585,15 @@ paths: "alias": "My new token", }, } - Transfer of a token with PAD to an existing OVpay token without existing PAD: - summary: Transfer of a token with PAD to an existing OVpay token without existing PAD + Transfer from a token with PAD to a new token without existing PAD: + summary: Transfer from a token with PAD to a new token without existing PAD description: | - Transfer of a token with PAD to an existing OVpay token without existing PAD. - Note how this request is different, since it has an e-mail address on which the new - PAD should be created. This request may optionally provide an OTP for - verification of th provided email address. - value: - { - "oldOvPayToken": { "padOtp": "123456" }, - "newOvPayToken": - { - "ovPayTokenId": 2, - "padEmailAddress": "jandevries@outlook.com", - "padOtp": "678901", - }, - } - Transfer of a token with PAD to an existing OVpay token with existing PAD: - summary: Transfer of a token with PAD to an existing OVpay token with existing PAD - description: | - Transfer of a token with PAD to an existing OVpay token with existing PAD. - value: - { - "oldOvPayToken": { "padOtp": "123456" }, - "newOvPayToken": - { - "ovPayTokenId": 2, - "padOtp": "678901", - }, - } - Transfer of a token with PAD to a new token by xTAT without existing PAD: - summary: Transfer of a token with PAD to a new token by xTAT without existing PAD - description: | - Transfer of a token with PAD to a new token by xTAT without existing PAD. - Note how this request is different, since it has an e-mail address on which the new - PAD should be created. This request may optionally provide an OTP for - verification of th provided email address. + Transfer of a token with PAD to a new token by xTAT without existing PAD. Note how this request is + different, since it has an e-mail address on which the new PAD should be created. This request may + optionally provide an OTP for verification of th provided email address. + Also note the new token in the request is always identified by xTAT, regardless if the new token + already exists in the customer profile. If the new token does not exist in the customer profile, the + user needs to provide an alias for the new token, and it will be created in the customer profile. value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2653,10 +2605,13 @@ paths: "padOtp": "678901", }, } - Transfer of a token with PAD to a new token by xTAT with existing PAD: - summary: Transfer of a token with PAD to a new token by xTAT with existing PAD + Transfer from a token with PAD to a new token with existing PAD: + summary: Transfer from a token with PAD to a new token with existing PAD description: | Transfer of a token with PAD to a new token by xTAT with existing PAD. + Note that the new token in the request is always identified by xTAT, regardless if the new token + already exists in the customer profile. If the new token does not exist in the customer profile, the + user needs to provide an alias for the new token, and it will be created in the customer profile. value: { "oldOvPayToken": { "padOtp": "123456" }, @@ -2679,7 +2634,6 @@ paths: }, "newOvPayToken": { - "ovPayTokenId": 2, "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", "alias": "My new token", "padEmailAddress": "jandevries@outlook.com", From e5867aa60574b51ba034e534197975d2f4f1b89d Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Fri, 16 May 2025 13:54:04 +0200 Subject: [PATCH 33/39] updated customer CRUD --- src/openapi/customers/SE-customers.yaml | 7 +- src/openapi/customers/customers-crud-v2.yaml | 152 ++++------------- .../customers/customers_reference-crud.yaml | 158 ------------------ 3 files changed, 39 insertions(+), 278 deletions(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index f0a0692..febeeb7 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -3033,9 +3033,6 @@ components: addressId: type: integer example: 1 - isPreferred: - type: boolean - example: true addressType: type: object properties: @@ -3044,7 +3041,7 @@ components: example: 1 name: type: string - example: Home + example: Billing street: type: string example: Appelstraat @@ -3062,7 +3059,7 @@ components: example: Den Haag country: type: string - example: Nederland + example: NL _links: type: object properties: diff --git a/src/openapi/customers/customers-crud-v2.yaml b/src/openapi/customers/customers-crud-v2.yaml index e30fa2c..feb9f40 100644 --- a/src/openapi/customers/customers-crud-v2.yaml +++ b/src/openapi/customers/customers-crud-v2.yaml @@ -248,10 +248,9 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: false addressType: addressTypeId: 2 - name: Office + name: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -259,10 +258,9 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true addressType: - addressTypeId: 2 - name: Office + addressTypeId: 1 + name: Shipping phones: - phoneId: 1 number: "3112345678" @@ -375,10 +373,9 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: false addressType: addressTypeId: 2 - name: Office + name: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -388,8 +385,8 @@ paths: country: NL isPreferred: true addressType: - addressTypeId: 2 - name: Office + addressTypeId: 1 + name: Shipping phones: - phoneId: 1 number: "3112345678" @@ -516,10 +513,9 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: false addressType: addressTypeId: 2 - name: Office + name: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -527,10 +523,9 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true addressType: - addressTypeId: 2 - name: Office + addressTypeId: 1 + name: Shipping phones: - phoneId: 1 number: "3112345678" @@ -652,10 +647,9 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: false addressType: addressTypeId: 2 - name: Office + name: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -663,10 +657,9 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true addressType: - addressTypeId: 2 - name: Office + addressTypeId: 1 + name: Shipping phones: - phoneId: 1 number: "3112345678" @@ -811,7 +804,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 - street: Beeklaan houseNumber: 30 @@ -819,7 +811,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: false addressTypeId: 2 phones: - number: "6123456789" @@ -948,10 +939,10 @@ paths: parameters: - name: customerProfileId in: path - required: true schema: type: integer example: 1 + required: true requestBody: content: application/json: @@ -1040,7 +1031,6 @@ paths: postalCode: 1234 AB city: Den Haag country: NL - isPreferred: true required: true responses: 201: @@ -1588,11 +1578,6 @@ paths: schema: type: integer example: 1 - - name: issuerCountry - in: query - schema: - type: string - example: "NL" - name: iban in: query schema: @@ -1613,11 +1598,22 @@ paths: schema: type: string example: "John's billing details" - - name: billingAddressID - in: query + - in: query + name: createdBefore schema: - type: integer - example: 1 + type: string + format: date-time + example: 2020-12-31T23:59:59 + required: false + description: Filter on created before. + - in: query + name: createdAfter + schema: + type: string + format: date-time + example: 2020-12-31T23:59:59 + required: false + description: Filter on created after. - name: sort in: query schema: @@ -1650,21 +1646,19 @@ paths: { "billingInformationId": 1, "customerProfileId": 1, - "issuerCountry": "NL", "iban": "NL06RABO8902022560", "ascription": "J. Doe", "alias": null, - "billingAddressId": 3, + "created": "2023-10-20T17:05:52.000", }, { "billingInformationId": 2, "customerProfileId": 1, - "issuerCountry": "NL", "iban": "NL27ABNA4458972219", "bic": "GHJZIEJSKVM", "ascription": "J. Doe", - "alias": "John's billing details", - "billingAddressId": 4, + "alias": "John's billing details", + "created": "2024-10-20T17:05:52.000", }, ], } @@ -1679,50 +1673,10 @@ paths: { "billingInformationId": 1, "customerProfileId": 1, - "issuerCountry": "NL", "iban": "NL06RABO8902022560", "ascription": "J. Doe", - "alias": null, - "billingAddressId": 3, - }, - ], - } - getBillingInformationIssuerCountry: - summary: Get multiple billing information entities for a specific issuer country - description: >- - Found multiple billing informations matching the search parameters - value: - { - "billingInformations": - [ - { - "billingInformationId": 1, - "customerProfileId": 1, - "issuerCountry": "NL", - "iban": "NL06RABO8902022560", - "ascription": "J. Doe", - "alias": null, - "billingAddressId": 3, - }, - { - "billingInformationId": 2, - "customerProfileId": 5, - "issuerCountry": "NL", - "iban": "NL27ABNA4458972219", - "bic": "GHJZIEJSKVM", - "ascription": "J. Doe", - "alias": null, - "billingAddressId": 42, - }, - { - "billingInformationId": 11, - "customerProfileId": 9, - "issuerCountry": "NL", - "iban": "NL27ABNA4458972219", - "bic": "GHJZIEJSKVM", - "ascription": "J. Doe", - "alias": null, - "billingAddressId": 84, + "alias": null, + "created": "2024-10-20T17:05:52.000", }, ], } @@ -1749,19 +1703,15 @@ paths: customerBillinginformationMandatoryFields: value: billingInformation: - issuerCountry: "NL" iban: "NL73RABO2677424363" ascription: "J. Doe" - billingAddressId: 1 customerBillinginformationMandatoryFull: value: billingInformation: - issuerCountry: "NL" iban: "NL73RABO2677424363" bic: "GHJZIEJSKVM" ascription: "J. Doe" alias: "John's billing details" - billingAddressId: 1 required: true responses: 201: @@ -1798,15 +1748,11 @@ paths: value: billingInformation: alias: "Mijn rekening details" - updateBillingInformationAdressId: - value: - billingInformation: - billingAddressId: 4 updateBillingInformation: value: billingInformation: alias: "Mijn rekening details" - billingAddressId: 4 + iban: "NL06RABO8902022560" required: true responses: 200: @@ -1817,11 +1763,10 @@ paths: { "billingInformationId": 1, "customerProfileId": 1, - "issuerCountry": "NL", "iban": "NL06RABO8902022560", "ascription": "J. Doe", "alias": "Mijn rekening details", - "billingAddressId": 4, + "created": "2024-03-22T08:55:00", } security: - default: [] @@ -1865,13 +1810,6 @@ paths: explode: false required: false description: The id of the direct debit mandate type. 1 = Paper contract, 2 = PIN transaction, 3 = SEPA eMandate, 4 = Digital signature, 5 = iDEAL transaction. - - in: query - name: mandateAddressId - schema: - type: integer - example: 21 - required: false - description: The id of the address related to the mandate. - in: query name: createdBefore schema: @@ -1957,7 +1895,6 @@ paths: "name": "import", "description": "import", }, - "mandateAddressId": 21, "created": "2024-03-22T08:55:00", "mandateReference": "CORE01", "mandateState": "SINGED", @@ -1993,7 +1930,6 @@ paths: "name": "import", "description": "import", }, - "mandateAddressId": 21, "created": "2024-03-22T08:55:00", "mandateReference": "CORE01", "mandateState": "SINGED", @@ -2043,7 +1979,6 @@ paths: value: directDebitMandate: directDebitMandateTypeId: 1 - mandateAddressId: 1 mandateReference: HTM-mandate-001 mandateState: PREPARED required: true @@ -2099,7 +2034,6 @@ paths: "name": "import", "description": "import", }, - "mandateAddressId": 21, "created": "2024-03-22T08:55:00", "mandateReference": "CORE01", "mandateState": "CANCELLED", @@ -2268,8 +2202,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressType: $ref: "#/components/schemas/getAddressType" getAddressType: @@ -2375,8 +2307,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressTypeId: type: integer postPhoneEntity: @@ -2443,8 +2373,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressType: type: integer patchCustomerAddress: @@ -2462,8 +2390,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressType: type: integer postCustomerProfileResponse: @@ -2564,8 +2490,6 @@ components: properties: billingInformationId: type: integer - issuerCountry: - type: string iban: type: string bic: @@ -2574,8 +2498,8 @@ components: type: string alias: type: string - billingAddressId: - type: integer + created: + type: string mandateEntity: type: object properties: @@ -2583,8 +2507,6 @@ components: type: integer directDebitMandateTypeId: type: integer - mandateAddressId: - type: integer mandateReference: type: string mandateState: diff --git a/src/openapi/customers/customers_reference-crud.yaml b/src/openapi/customers/customers_reference-crud.yaml index ffb2500..748d98d 100644 --- a/src/openapi/customers/customers_reference-crud.yaml +++ b/src/openapi/customers/customers_reference-crud.yaml @@ -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: From d8d2e31e526610a1b7b3654e142e8f17f71a78d4 Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 19 May 2025 09:17:25 +0200 Subject: [PATCH 34/39] fix --- src/openapi/customers/SE-customers.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index febeeb7..c21ea8d 100644 --- a/src/openapi/customers/SE-customers.yaml +++ b/src/openapi/customers/SE-customers.yaml @@ -3041,7 +3041,7 @@ components: example: 1 name: type: string - example: Billing + example: Shipping street: type: string example: Appelstraat From ec6edd36362b7410c41e0f4eff10fdc2a8e8a32e Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 19 May 2025 12:28:15 +0200 Subject: [PATCH 35/39] updated customer v1 --- src/openapi/customers/customers.yaml | 192 ++++++--------------------- 1 file changed, 39 insertions(+), 153 deletions(-) diff --git a/src/openapi/customers/customers.yaml b/src/openapi/customers/customers.yaml index 65a9763..7eff027 100644 --- a/src/openapi/customers/customers.yaml +++ b/src/openapi/customers/customers.yaml @@ -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,11 @@ 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 + created: "2024-06-02T15:03:46Z" updateIban: value: billingInformation: @@ -148,10 +137,6 @@ paths: value: billingInformation: bic: DEUT - updateSwift: - value: - billingInformation: - swift: UpdatedSwift updateAscription: value: billingInformation: @@ -160,10 +145,6 @@ paths: value: billingInformation: alias: Updated Alias - updateBillingAddressId: - value: - billingInformation: - billingAddressId: 3 required: true responses: '201': @@ -218,21 +199,18 @@ 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 + created: "2024-06-02T15:03:46Z" minimumBillingInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test + created: "2024-06-02T15:03:46Z" required: true responses: '201': @@ -289,7 +267,6 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference minimumdirectDebitMandate: @@ -297,7 +274,6 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference required: true @@ -358,26 +334,21 @@ 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:46Z" - 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:46Z" 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 @@ -385,7 +356,6 @@ paths: - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference mandateState: CANCELLED @@ -398,13 +368,11 @@ paths: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference missingDebitMandateInformation: @@ -412,21 +380,17 @@ 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:46Z" - 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:46Z" directDebitMandate: [] minimumFinancialInformation: value: @@ -500,7 +464,6 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 mandateReference: Dit is een test Reference mandateState: SIGNED updateDirectDebitMandateType: @@ -511,10 +474,6 @@ paths: value: directDebitMandate: billingInformationId: 2 - updateMandateAddressId: - value: - directDebitMandate: - mandateAddressId: 3 updateMandateReference: value: directDebitMandate: @@ -591,17 +550,11 @@ 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 + created: "2024-06-02T15:03:46Z" updateIban: value: billingInformation: @@ -610,10 +563,6 @@ paths: value: billingInformation: bic: DEUT - updateSwift: - value: - billingInformation: - swift: UpdatedSwift updateAscription: value: billingInformation: @@ -687,17 +636,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,7 +711,6 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference minimumdirectDebitMandate: @@ -773,7 +718,6 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference required: true @@ -841,38 +785,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.00' - 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.00' 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' - 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' missingBillingInformation: value: customerNumber: 1000003 @@ -881,13 +821,11 @@ paths: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference missingDebitMandateInformation: @@ -895,21 +833,17 @@ 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:46Z" - 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:46Z" directDebitMandate: [] minimumFinancialInformation: value: @@ -1112,8 +1046,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1121,8 +1054,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1199,8 +1131,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1208,8 +1139,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1537,8 +1467,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1546,8 +1475,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1753,7 +1681,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 - street: Beeklaan houseNumber: 30 @@ -1761,7 +1688,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: false addressTypeId: 2 phones: - number: '6123456789' @@ -2604,7 +2530,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 addMinimumAddress: value: @@ -2614,7 +2539,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 responses: '201': @@ -2826,7 +2750,6 @@ paths: city: Den Haag country: NL addressTypeId: 2 - isPreferred: true updateStreet: value: address: @@ -2854,7 +2777,7 @@ paths: updateAddressTypeId: value: address: - addressTypeId: 3 + addressTypeId: 1 updateIsPreferred: value: address: @@ -3111,8 +3034,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -3120,8 +3042,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -3328,7 +3249,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 - street: Beeklaan houseNumber: 30 @@ -3336,7 +3256,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: false addressTypeId: 2 phones: - number: '6123456789' @@ -4114,7 +4033,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 addMinimumAddress: value: @@ -4124,7 +4042,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 responses: '201': @@ -4350,7 +4267,6 @@ paths: city: Den Haag country: NL addressTypeId: 2 - isPreferred: true updateStreet: value: address: @@ -4378,7 +4294,7 @@ paths: updateAddressTypeId: value: address: - addressTypeId: 3 + addressTypeId: 1 updateIsPreferred: value: address: @@ -4696,8 +4612,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressType: type: string getPhone: @@ -4761,7 +4675,6 @@ components: - billingInformationId - created - directDebitMandateTypeName - - mandateAddressId - mandateReference type: object properties: @@ -4769,8 +4682,6 @@ components: type: string billingInformationId: type: integer - mandateAddressId: - type: integer created: type: string mandateReference: @@ -4787,8 +4698,6 @@ components: type: string billingInformationId: type: integer - mandateAddressId: - type: integer mandateReference: type: string mandateState: @@ -4811,8 +4720,6 @@ components: type: integer billingInformationId: type: integer - mandateAddressId: - type: integer created: type: string mandateReference: @@ -4826,52 +4733,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 +4776,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 +4985,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressTypeId: type: integer addressPatchEntity: @@ -5116,8 +5004,6 @@ components: type: string addressTypeId: type: integer - isPreferred: - type: boolean phonePostEntity: required: - countryCode From 920246f499b1e120ba7fafce22e7758433a62371 Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 19 May 2025 12:42:35 +0200 Subject: [PATCH 36/39] removed is preferred example --- src/openapi/customers/customers.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/openapi/customers/customers.yaml b/src/openapi/customers/customers.yaml index 7eff027..8b42ccc 100644 --- a/src/openapi/customers/customers.yaml +++ b/src/openapi/customers/customers.yaml @@ -2778,10 +2778,6 @@ paths: value: address: addressTypeId: 1 - updateIsPreferred: - value: - address: - isPreferred: false responses: '202': description: Successful updated the customer profile From 9c9c96453fa2dc5a022d5020a57d4ded4b47f75d Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 19 May 2025 13:21:29 +0200 Subject: [PATCH 37/39] shenanigens updated and created financials --- src/openapi/customers/customers.yaml | 48 +++++++++++----------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/openapi/customers/customers.yaml b/src/openapi/customers/customers.yaml index 8b42ccc..3a8ab2e 100644 --- a/src/openapi/customers/customers.yaml +++ b/src/openapi/customers/customers.yaml @@ -127,8 +127,7 @@ paths: iban: '1234567890' bic: ING ascription: Dit is een Test - alias: Alias Test - created: "2024-06-02T15:03:46Z" + alias: Alias Test updateIban: value: billingInformation: @@ -202,15 +201,13 @@ paths: iban: '1234567890' bic: ING ascription: Dit is een Test - alias: Alias Test - created: "2024-06-02T15:03:46Z" + alias: Alias Test minimumBillingInformation: value: billingInformation: iban: '1234567890' ascription: Dit is een Test - alias: Alias Test - created: "2024-06-02T15:03:46Z" + alias: Alias Test required: true responses: '201': @@ -267,14 +264,12 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference minimumdirectDebitMandate: value: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference required: true responses: @@ -338,13 +333,13 @@ paths: bic: ING ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" - billingInformationId: 2 iban: '0987654321' bic: null ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" directDebitMandate: - directDebitMandateId: 1 directDebitMandateTypeName: PIN Transaction @@ -352,14 +347,14 @@ paths: 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 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 @@ -384,13 +379,13 @@ paths: bic: ING ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" - billingInformationId: 2 iban: '0987654321' bic: null ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" directDebitMandate: [] minimumFinancialInformation: value: @@ -469,7 +464,7 @@ paths: updateDirectDebitMandateType: value: directDebitMandate: - directDebitMandateTypeId: 1 + directDebitMandateTypeId: 1 updateBillingInformationId: value: directDebitMandate: @@ -553,8 +548,7 @@ paths: iban: '1234567890' bic: ING ascription: Dit is een Test - alias: Alias Test - created: "2024-06-02T15:03:46Z" + alias: Alias Test updateIban: value: billingInformation: @@ -711,15 +705,13 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - 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 - created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference required: true responses: '201': @@ -790,14 +782,14 @@ paths: ascription: Dit is een Test alias: Alias Test billingAddressId: 2 - created: '2024-01-01T00:00:00.00' + created: '2024-01-01T00:00:00.000' - billingInformationId: 2 iban: '0987654321' bic: null ascription: Dit is een Test alias: Alias Test billingAddressId: 3 - created: '2024-01-01T00:00:00.00' + created: '2024-01-01T00:00:00.000' directDebitMandate: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction @@ -805,14 +797,14 @@ paths: 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 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 @@ -837,13 +829,13 @@ paths: bic: ING ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" - billingInformationId: 2 iban: '0987654321' bic: null ascription: Dit is een Test alias: Alias Test - created: "2024-06-02T15:03:46Z" + created: "2024-06-02T15:03:460" directDebitMandate: [] minimumFinancialInformation: value: @@ -4678,8 +4670,6 @@ components: type: string billingInformationId: type: integer - created: - type: string mandateReference: type: string directDebitMandatePost: From a6491041cb79bf8ae7a5b272af59789add60c2e5 Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 19 May 2025 13:25:06 +0200 Subject: [PATCH 38/39] dinges --- src/openapi/customers/customers.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/openapi/customers/customers.yaml b/src/openapi/customers/customers.yaml index 3a8ab2e..472250a 100644 --- a/src/openapi/customers/customers.yaml +++ b/src/openapi/customers/customers.yaml @@ -364,12 +364,14 @@ paths: directDebitMandateTypeName: PIN transaction billingInformationId: 1 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 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 @@ -814,12 +816,14 @@ paths: directDebitMandateTypeName: PIN transaction billingInformationId: 1 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 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 From 17d10c158c8458902b15e88ba6f6d93039313d43 Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Wed, 21 May 2025 10:28:05 +0200 Subject: [PATCH 39/39] OVPAY-1784 - Fixed timestamps. --- src/openapi/service/service-crud.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/openapi/service/service-crud.yaml b/src/openapi/service/service-crud.yaml index 0458b75..228d76d 100644 --- a/src/openapi/service/service-crud.yaml +++ b/src/openapi/service/service-crud.yaml @@ -38,7 +38,7 @@ paths: { "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", - "updated": "2025-07-02 15:01:00.000", + "updated": "2025-07-02T15:01:00.000+00:00", }, ], } @@ -51,12 +51,12 @@ paths: { "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", - "updated": "2025-07-02 15:01:00.000", + "updated": "22025-07-02T15:01:00.000+00:00", }, { "readerId": "b4d8e43c-be21-472c-955b-a0c7c11b4bfb", "xBot": "625bc66b-a5de-42fc-ba9e-fb02ada4a4ee", - "updated": "2025-07-02 13:37:07.000", + "updated": "2025-07-02T13:37:07.000+00:00", }, ], } @@ -92,7 +92,7 @@ paths: { "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", - "updated": "2025-07-02 15:01:00.000", + "updated": "2025-07-02T15:01:00.000+00:00", } "201": description: Created @@ -104,7 +104,7 @@ paths: { "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", - "updated": "2025-07-02 15:01:00.000", + "updated": "2025-07-02T15:01:00.000+00:00", } components: securitySchemes: @@ -150,7 +150,7 @@ components: updated: type: string format: date-time - example: "2025-07-02T15:01:00Z" + example: "2025-07-02T15:01:00+00:00" nullable: false description: The date and time when the token register request was updated. required: