From 5b3264d9cd8dd41d075640357b15add5b924e176 Mon Sep 17 00:00:00 2001 From: Herald Date: Tue, 28 Jul 2026 14:15:18 +0200 Subject: [PATCH 01/11] added authorize endpoint and get securitystatus endpoint --- src/openapi/customers/SE-tat-security.yaml | 297 +++++++++++++++++++-- trip2.json | 151 +++++++++++ 2 files changed, 433 insertions(+), 15 deletions(-) create mode 100644 trip2.json diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index 3c635f0..c9d08a2 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -10,6 +10,150 @@ servers: tags: - name: TAT Security paths: + /tokens/status: + 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: integer + example: 323 + required: false + description: The id of the customer Profile + - 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: xTat + in: query + schema: + type: string + format : uuid + example: 5c4cba83-1ecd-46a4-b712-a8de0dcb7bbf + required: false + description: The xtat of the customerToken + - name: ovPayTokenId + in: query + schema: + type: integer + example: 1 + required: false + description: The ovpay token id of a specific customer token + - name: serviceReferenceId + in: query + schema: + type: string + example: NLOV1234567ABCDEFG + required: false + description: The serviceReferencId found on the bankstatement for a given trip with a bankcard, required for an unknown EMV card + - name: amount + in: query + schema: + type: integer + example: 0 + required: false + description: The amount of the value of the bankstatement in cents, required for an unknown EMV card + - name: ovpasNumber + in: query + schema: + type: string + example: OV34567 + required: false + description: The number of the ovpas, required for an unknown Ovpas card + - name: verificationCode + in: query + schema: + type: string + example: HL78 + required: false + description: The 4 digit verificationCode found on the backside of the Ovpas, required for an unknown Ovpas card + get: + tags: + - TAT Security + summary: Check the status of the security and authorization status of the given token + description: Check the status of the security and authorization status of the given token, check anonymous tokenDB if no customer headers are supplied otherwise check customer tokenDB + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/TokenStatusResponse" + example: + isSecured: true + isAuthorized: false + xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27 + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Missing Parameters: + value: + status: 400 + title: Missing Mandatory Parameter + detail: Required parameter {0} is missing. + Invalid Parameters: + value: + status: 400 + title: Invalid Parameter + detail: Required parameter {0} is invalid. + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Unauthorized: + value: + status: 401 + title: Unauthorized + detail: Invalid Access Token + "404": + description: Not found + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + TAT not found: + value: + status: 404 + title: Not Found + detail: TAT Account Not Found + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + TAT Already Secured: + value: + status: 409 + title: Conflict + detail: TAT Already Secured + "500": + description: Internal server error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + example: + error: An unknown error has occurred + /tokens/securetoken: parameters: - name: X-HTM-JWT-AUTH-HEADER @@ -60,9 +204,7 @@ paths: schema: $ref: "#/components/schemas/EmailNotPreApprovedResponse" example: - uid: 7594f3ee-cd3d-40a3-8e82-73b90d16c481 recipient: xxxxxx.user@gmail.com - key: 123456789123456789123456789abcde description: OTP Sent "400": description: Bad Request @@ -125,6 +267,105 @@ paths: $ref: "#/components/schemas/ErrorResponse" example: error: An unknown error has occurred + /tokens/authorizetoken: + 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: integer + example: 323 + required: false + description: The id of the customer Profile + - 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 + post: + tags: + - TAT Authorization + summary: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous. + description: Request authorization for HTM to access the data secured by additional OV-pas security for a token either in profile or anonymous. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AuthorizeTokenRequest" + examples: + With customer account: + value: + ovPayTokenId: 42 + Without customer account: + value: + xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/EmailNotPreApprovedResponse" + example: + recipient: xxxxxx.user@gmail.com + description: OTP Sent + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Missing Parameters: + value: + status: 400 + title: Missing Mandatory Parameter + detail: Required parameter {0} is missing. + Invalid Parameters: + value: + status: 400 + title: Invalid Parameter + detail: Required parameter {0} is invalid. + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Unauthorized: + value: + status: 401 + title: Unauthorized + detail: Invalid Access Token + "404": + description: Not found + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + TAT not found: + value: + status: 404 + title: Not Found + detail: TAT Account Not Found + "500": + description: Internal server error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + example: + error: An unknown error has occurred /tokens/verifyotp: parameters: - name: X-HTM-JWT-AUTH-HEADER @@ -150,7 +391,7 @@ paths: description: The role of the HTM employee in the case of the SMP post: tags: - - TAT Security + - TAT Verification summary: Submit an OTP for a triggered OTP flow. description: | Submit an OTP for a triggered OTP flow. This can either be result of an AGO activation, or @@ -257,22 +498,12 @@ components: EmailNotPreApprovedResponse IS AN object THAT represents the response of email pre-approval check. properties: - uid: - type: string - description: A uid IS A unique identifier THAT is associated with the user. - example: 7594f3ee-cd3d-40a3-8e82-73b90d16c481 recipient: type: string description: >- A recipient IS A unique identifier THAT is associated with the TAT owner. example: xxxxxx.user@gmail.com - key: - type: string - description: >- - A key IS a 32 character string THAT uniquely identifies the OTP - session. - example: 123456789123456789123456789abcde description: type: string description: >- @@ -294,7 +525,17 @@ components: format: email example: stasjo@htm.nl required: - - ovPayTokenId + - emailAddress + AuthorizeTokenRequest: + type: object + properties: + ovPayTokenId: + type: integer + example: 42 + xtat: + type: string + format: uuid + example: 6134db53-9ae5-41d1-a343-36656b60b510 VerifyOtpRequest: type: object properties: @@ -338,4 +579,30 @@ components: description: A title IS A string that provides a brief summary of the error. detail: type: string - description: A detail IS A string that provides more details about the error. \ No newline at end of file + description: A detail IS A string that provides more details about the error. + TokenStatusResponse: + type: object + description: >- + TokenStatusResponse IS AN object THAT represents the current state of the token in relation to the AGO security and authorization status of HTM. + required: + - isSecured + - isAuthorized + - xTat + properties: + isSecured: + type: boolean + description: >- + Is the token secured in the national database (GBO) + example: false + isAuthorized: + type: boolean + description: >- + Does HTM have the authorization to access the secured data for this token, only applicable when isSecured equals True. + example: false + xTat: + type: string + format: uuid + description: >- + The xtat of the customerToken + example: 883674e5-54c7-47d6-a3e3-8781f0d3ffea + \ No newline at end of file diff --git a/trip2.json b/trip2.json new file mode 100644 index 0000000..0b9678f --- /dev/null +++ b/trip2.json @@ -0,0 +1,151 @@ +{ "tripId": 796727186, "tripVersion": 1, "tripStatus": "COMPLETE", "organisationIcon": "/icons/organisations/3.svg", "organisationId": "3", "organisationName": "HTM", "supersededByTripIds": [], "supersedesTripIds": [], "products": [ { + "productTemplateId": "30901", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "HTM 90% Korting" }, + { + "key": "en-US", "value": "HTM 90% Discount" } + ] + }, + "productIcon": "001.jpg", "purchaseDateTime": "2026-04-02T12:38:28+02:00", "organisationName": "ProductRetailer HTM", "appliedValue": -125, "organisationId": "3", "category": "SALES", "typesOfFareProduct": [ { + "privateCode": "discount" } + ], + "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1" }, + { + "productTemplateId": "N/A", "purchaseDateTime": "2025-07-09T12:39:27+02:00", "appliedValue": 139, "category": "SALES", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8" }, + { + "productTemplateId": "1:2000", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "Basis Bus Tram Metro" }, + { + "key": "en-US", "value": "BTM full fare" } + ] + }, + "validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 116, "appliedMetric": "FARE", "appliedValue": 116, "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" }, + { + "productTemplateId": "2:2000", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "Basis Bus Tram Metro" }, + { + "key": "en-US", "value": "BTM full fare" } + ] + }, + "validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 23, "appliedMetric": "FARE", "appliedValue": 23, "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" }, + { + "productTemplateId": "3:30901", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "HTM 90% Korting" }, + { + "key": "en-US", "value": "HTM 90% Discount" }, + { + "key": "nl-NL", "value": "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis een week lang met korting!" }, + { + "key": "en-US", "value": "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" } + ] + }, + "validFrom": "2026-04-03T04:00:00+02:00", "validUntil": "2031-04-03T04:00:00+02:00", "organisationName": "Product Owner HTM", "weight": -125, "appliedMetric": "DISCOUNT", "appliedValue": -125, "organisationId": "3", "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "discount" } + ], + "productCatalogVersionId": "PC-HTM:70", "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1", "xpit": "1848597c-5ba9-4dab-8d9f-3948948706a1" } + ], + "checkinTransactionTimestamp": "2026-04-20T16:59:48+02:00", "checkoutTransactionTimestamp": "2026-04-20T17:04:50+02:00", "checkinTransactionReference": "00310F92;29023;emvClt", "checkoutTransactionReference": "0030DBC1;30528;emvClt", "checkinLocation": { "stopId": 2721, "stopName": { "items": [ { + "key": "nl-NL", "value": "Station Hollands Spoor" }, + { + "key": "en-US", "value": "Station Hollands Spoor" } + ] + }, + "stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 }, + "checkoutLocation": { "stopId": 2862, "stopName": { "items": [ { + "key": "nl-NL", "value": "Kalvermarkt-Stadhuis" }, + { + "key": "en-US", "value": "Kalvermarkt-Stadhuis" } + ] + }, + "stopDesc": "Stop point2862", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 }, + "tokenType": "EMV-CLT", "transportType": "TRAM", "lineId": "17", "lineName": "Tram17", "networkId": "1", "networkName": "HTM netwerk", "currency": "EUR", "transportIcon": "/icons/transportTypes/tram.svg", "legs": [ { + "legId": 1614950977, "checkinTransactionTimestamp": "2026-04-20T16:59:48+02:00", "checkoutTransactionTimestamp": "2026-04-20T17:04:50+02:00", "checkinLocation": { "stopId": 2721, "stopName": { "items": [ { + "key": "nl-NL", "value": "Station Hollands Spoor" }, + { + "key": "en-US", "value": "Station Hollands Spoor" } + ] + }, + "stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 }, + "checkoutLocation": { "stopId": 2862, "stopName": { "items": [ { + "key": "nl-NL", "value": "Kalvermarkt-Stadhuis" }, + { + "key": "en-US", "value": "Kalvermarkt-Stadhuis" } + ] + }, + "stopDesc": "Stop point2862", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 }, + "baseRate": 139, "lineId": "17", "lineName": "Tram17", "networkId": "1", "networkName": "HTM netwerk", "fare": 14, "fareState": "CALCULATED", "currency": "EUR", "products": [ { + "productTemplateId": "30901", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "HTM 90% Korting" }, + { + "key": "en-US", "value": "HTM 90% Discount" } + ] + }, + "productIcon": "001.jpg", "purchaseDateTime": "2026-04-02T12:38:28+02:00", "organisationName": "ProductRetailer HTM", "appliedValue": -125, "organisationId": "3", "category": "SALES", "typesOfFareProduct": [ { + "privateCode": "discount" } + ], + "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1" }, + { + "productTemplateId": "N/A", "purchaseDateTime": "2025-07-09T12:39:27+02:00", "appliedValue": 139, "category": "SALES", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8" }, + { + "productTemplateId": "1:2000", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "Basis Bus Tram Metro" }, + { + "key": "en-US", "value": "BTM full fare" } + ] + }, + "validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 116, "appliedMetric": "FARE", "appliedValue": 116, "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" }, + { + "productTemplateId": "2:2000", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "Basis Bus Tram Metro" }, + { + "key": "en-US", "value": "BTM full fare" } + ] + }, + "validFrom": "2000-01-01T01:00:00+01:00", "validUntil": "2100-01-01T00:59:59+01:00", "weight": 23, "appliedMetric": "FARE", "appliedValue": 23, "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "payg" } + ], + "xspit": "7618337f-c986-4bef-990d-f5a6b47292b8", "xpit": "f4256df6-b767-460f-9880-f7597bd7f3f2" }, + { + "productTemplateId": "3:30901", "productCommercialName": { "items": [ { + "key": "nl-NL", "value": "HTM 90% Korting" }, + { + "key": "en-US", "value": "HTM 90% Discount" }, + { + "key": "nl-NL", "value": "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis een week lang met korting!" }, + { + "key": "en-US", "value": "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" } + ] + }, + "validFrom": "2026-04-03T04:00:00+02:00", "validUntil": "2031-04-03T04:00:00+02:00", "organisationName": "Product Owner HTM", "weight": -125, "appliedMetric": "DISCOUNT", "appliedValue": -125, "organisationId": "3", "category": "INTERNAL", "typesOfFareProduct": [ { + "privateCode": "discount" } + ], + "discountPercentage": 90, "productCatalogVersionId": "PC-HTM:70", "xspit": "821ddb0d-4ea7-4a0d-84aa-bb7facce15d1", "xpit": "1848597c-5ba9-4dab-8d9f-3948948706a1" } + ], + "appliedTimePeriods": [], "tariffJourneyStart": true, "topoDistance": 1161, "concessionId": "1", "appliedZones": [] } + ], + "lastUpdatedTripDateTime": "2026-04-20T17:04:50+02:00", "fare": 14, "loyaltyOrDiscount": true, "supportCode": "pWM8Km6J8aHg5n", "tripVersionReason": "STRUCTURE", "checkinTransactionId": "00310F92-29023-emvClt-1776697188000", "checkoutTransactionId": "0030DBC1-30528-emvClt-1776697490000", "tariffVersionId": "HTM-CF1:278", "correlationId": "4bc7a040-71bf-4084-a61e-b2dd72092079", "createdAt": "2026-04-20T17:05:01.473+02:00", "entryTariffLocation": { "stopId": 2721, "stopName": { "items": [ { + "key": "nl-NL", "value": "Station Hollands Spoor" }, + { + "key": "en-US", "value": "Station Hollands Spoor" } + ] + }, + "stopDesc": "Stop point2721", "stopUrl": "/icons/stops/stop.svg", "locationType": 0 }, + "traveledLines": [ { + "lineId": "17", "lineName": "Tram17" } + ], + "tripFareNature": "FIXED", "paymentMethodId": "229a01ff-7bd9-4740-9b19-00637146a6ca", "paymentMethodMode": "PREPAID", "paymentMethodName": "EPURSE", "paymentProviderName": "TPURSE", "paymentProviderBusinessEntityId": "600027", "registryFragmentVersionId": "REG:27", "vehicleId": 5063, "xbot": "c85e34d6-f9c1-49c2-8574-59b37e0f3b8e" } + \ No newline at end of file From f1022c0d8d73edabb227b50f875532c9147fec30 Mon Sep 17 00:00:00 2001 From: Herald Date: Tue, 28 Jul 2026 14:29:14 +0200 Subject: [PATCH 02/11] added href links --- src/openapi/customers/SE-tat-security.yaml | 49 ++++++++++------------ 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index c9d08a2..b1aacd7 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -92,6 +92,16 @@ paths: isSecured: true isAuthorized: false xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27 + _links: { + "secure": { + "href": "/tokens/securetoken", + "method": "POST" + }, + "authorize": { + "href": "/tokens/authorizetoken", + "method": "POST" + } + } "400": description: Bad Request content: @@ -109,18 +119,6 @@ paths: status: 400 title: Invalid Parameter detail: Required parameter {0} is invalid. - "401": - description: Unauthorized - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorResponse" - examples: - Unauthorized: - value: - status: 401 - title: Unauthorized - detail: Invalid Access Token "404": description: Not found content: @@ -132,19 +130,7 @@ paths: value: status: 404 title: Not Found - detail: TAT Account Not Found - "409": - description: Conflict - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - examples: - TAT Already Secured: - value: - status: 409 - title: Conflict - detail: TAT Already Secured + detail: XTAT Account Not Found "500": description: Internal server error content: @@ -153,7 +139,6 @@ paths: $ref: "#/components/schemas/ErrorResponse" example: error: An unknown error has occurred - /tokens/securetoken: parameters: - name: X-HTM-JWT-AUTH-HEADER @@ -206,6 +191,12 @@ paths: example: recipient: xxxxxx.user@gmail.com description: OTP Sent + _links: { + "verifyotp": { + "href": "/tokens/verifyotp", + "method": "POST" + } + } "400": description: Bad Request content: @@ -317,6 +308,12 @@ paths: example: recipient: xxxxxx.user@gmail.com description: OTP Sent + _links: { + "verifyotp": { + "href": "/tokens/verifyotp", + "method": "POST" + } + } "400": description: Bad Request content: From 96fd6341b069abd184a07dd65fc246d7a5f6e83d Mon Sep 17 00:00:00 2001 From: Herald Date: Tue, 28 Jul 2026 14:35:10 +0200 Subject: [PATCH 03/11] removed required for xTat in response --- src/openapi/customers/SE-tat-security.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index b1aacd7..68d851b 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -584,7 +584,6 @@ components: required: - isSecured - isAuthorized - - xTat properties: isSecured: type: boolean @@ -600,6 +599,6 @@ components: type: string format: uuid description: >- - The xtat of the customerToken + The xtat of the customerToken given when token is unknown for the customer example: 883674e5-54c7-47d6-a3e3-8781f0d3ffea \ No newline at end of file From a49369402113a56433d3be70ff500092cebd50c4 Mon Sep 17 00:00:00 2001 From: Herald Date: Tue, 28 Jul 2026 15:38:12 +0200 Subject: [PATCH 04/11] rebased changes --- src/openapi/customers/SE-tat-security.yaml | 41 ++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index 68d851b..65798b8 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -88,20 +88,33 @@ paths: application/json: schema: $ref: "#/components/schemas/TokenStatusResponse" - example: - isSecured: true - isAuthorized: false - xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27 - _links: { - "secure": { - "href": "/tokens/securetoken", - "method": "POST" - }, - "authorize": { - "href": "/tokens/authorizetoken", - "method": "POST" - } - } + examples: + isSecuredandnotAuthorized: + summary: Token is secured but HTM is not authorized + description: Token is secured but HTM is not authorized + value: + isSecured: true + isAuthorized: false + xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27 + _links: { + "authorize": { + "href": "/tokens/authorizetoken", + "method": "POST" + } + } + notSecuredandnotAuthorized: + summary: Token is secured but HTM is not authorized + description: Token is secured but HTM is not authorized + value: + isSecured: false + isAuthorized: false + xTat: 12da8f2a-6390-408a-94eb-a6701b5daf27 + _links: { + "secure": { + "href": "/tokens/securetoken", + "method": "POST" + } + } "400": description: Bad Request content: From c2a6b1c9c22c0595caea154af2d6c319295a7a35 Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Wed, 29 Jul 2026 09:14:09 +0200 Subject: [PATCH 05/11] fixed description response --- src/openapi/customers/SE-tat-security.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index 65798b8..7ad4fb0 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -103,8 +103,8 @@ paths: } } notSecuredandnotAuthorized: - summary: Token is secured but HTM is not authorized - description: Token is secured but HTM is not authorized + summary: Token is not secured but HTM is not authorized + description: Token is not secured but HTM is not authorized value: isSecured: false isAuthorized: false From ee0147b9639c0ddd87d42875371c9ad63a6040c8 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Tue, 14 Jul 2026 15:50:57 +0200 Subject: [PATCH 06/11] Fix JSON schema errors --- src/openapi/orders/service_engine_orders.yaml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/openapi/orders/service_engine_orders.yaml b/src/openapi/orders/service_engine_orders.yaml index 48cc497..c48b7f4 100644 --- a/src/openapi/orders/service_engine_orders.yaml +++ b/src/openapi/orders/service_engine_orders.yaml @@ -6878,7 +6878,6 @@ components: example: 11 PostOrder: type: object - required: properties: externalOrderId: type: string @@ -6919,7 +6918,8 @@ components: Amount of the products to be delivered, in case of saldo quantity is used to define the amount of saldo to be charged in eurocents. If multiple GBO products are added, the same amount of customerTokens will be required. example: 1 createdOn: - type: datetime + type: string + format: date-time description: |- Current datetime, moment client added orderLine to the order example: "2024-03-22T09:00:00" @@ -6929,12 +6929,14 @@ components: The orderLineId as known in an external sales system, used for reconcilliation example: "MyOrderLine123" validFrom: - type: datetime + type: string + format: date-time description: |- The moment the chosen product should be activated example: "2024-03-30T09:00:00" validUntil: - type: datetime + type: string + format: date-time description: |- Only required when a product does not have a fixed duration, otherwise it is calculated by the back end system example: null @@ -6946,7 +6948,6 @@ components: $ref: "#/components/schemas/PostVoucher" PatchOrderLine: type: object - required: properties: productId: type: integer @@ -6955,10 +6956,12 @@ components: type: integer example: 1 validFrom: - type: datetime + type: string + format: date-time example: "2024-03-30T09:00:00" validUntil: - type: datetime + type: string + format: date-time example: null PostVoucher: type: object From e2f70a78af6232a1193f885c6f61160641d81124 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Tue, 14 Jul 2026 17:31:52 +0200 Subject: [PATCH 07/11] Updated SE-vouchers-supplier spec after review --- .../products/SE-vouchers-supplier.yaml | 98 +++++++++++++------ 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/src/openapi/products/SE-vouchers-supplier.yaml b/src/openapi/products/SE-vouchers-supplier.yaml index 1840357..1edc212 100644 --- a/src/openapi/products/SE-vouchers-supplier.yaml +++ b/src/openapi/products/SE-vouchers-supplier.yaml @@ -1,7 +1,7 @@ openapi: 3.0.1 info: title: Service Engine APIs for HTM voucher suppliers - description: Service Engine APIs for HTM voucher suppliers, this means all instances responsible for supplying vouchers. These are NOT the CRUD APIs to the data hub. These are ALSO NOT the api's for sales touchpoints. + description: Service Engine APIs for HTM voucher suppliers, this means all instances responsible for supplying vouchers. These are NOT the CRUD APIs to the data hub. These are ALSO NOT the APIs for sales touchpoints. version: "1.0" servers: - url: https://services.acc.api.htm.nl/abt/abtvouchers/1.0 @@ -24,15 +24,6 @@ paths: When a requiredProduct is configured, all attributes of the requiredProduct are also prerequisites for redeeming the voucher; thus they do not need to also be configured for the voucher definition. The requiredProduct itself is the single source of truth for this; and voucher definitions do not need to be updated if the requirements of the requiredProduct change. For example, if the requiredProduct requires an OVpay token, an OVpay token is automatically required to redeem issued vouchers. parameters: - - name: touchpointId - in: query - required: false - description: | - Filter the voucher definitions on a specific touchpointId. This means that only voucher definitions with active selling periods for the specified touchpoint are returned. - This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which voucher definitions are returned. This query parameter can be used to retrieve voucher definitions for other touchpoints within the same retailer, for example to retrieve voucher definitions for a specific sales touchpoint that is different from the calling touchpoint. - schema: - type: integer - example: 12 - name: productId in: query required: false @@ -206,18 +197,15 @@ paths: /issuedvouchers: get: summary: Get a list of issued vouchers that were issued for a specific touch point - description: - Retrieve all issued vouchers for a specific touchpoint. This means that only vouchers that were issued by a touchpoint within the same retailer as the calling touchpoint are returned. + description: |- + Retrieve all issued vouchers that match the given query parameters. \ + At least on of the following query parameters should be provided: + - `issuedVoucherId` (internal and globally unique ID); + - `voucherCode` (code that the customer uses for redeeming the voucher, can be reissued as long as only one instance is active at the same time); + - `productId` (the productId of the voucher definition). + + When a voucher code has been issued multiple times, all issuedvouchers with the same voucher code will be returned, together with their statuses. parameters: - - name: touchpointId - in: query - required: false - description: |- - Filter the issued vouchers on a specific touchpointId. This means that only vouchers that were issued by the specified touchpoint are returned. - This query parameter is only intended for administrative purposes, since the touchpoint associated with the access token used in the request is used to determine which issued vouchers are returned. This query parameter can be used to retrieve issued vouchers for other touchpoints within the same retailer, for example to retrieve issued vouchers for a specific sales touchpoint that is different from the calling touchpoint. - schema: - type: integer - example: 12 - name: issuedVoucherId in: query required: false @@ -416,6 +404,22 @@ paths: } ] } + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: "#/components/schemas/rfc9457" + examples: + Missing required query parameters: + summary: Missing required query parameters + value: + { + "type": "https://example.com/probs/bad-request", + "title": "Missing required query parameters", + "detail": "At least one of the following query parameters should be provided: issuedVoucherId, voucherCode, or productId.", + "instance": "/issuedvouchers" + } "403": description: Forbidden content: @@ -466,10 +470,20 @@ paths: } post: summary: Issue a voucher for a specific voucher definition - description: | - Issue a voucher for a specific voucher definition. Vouchers can only be issued on a one-by-one basis, so that it is always clear what voucher code has been issued for specific voucher claims (which by itself my not uniquely identify the voucher; however the voucher code is guaranteed to be unique). The voucher can only be issued if the calling touchpoint (recognized by the access token) has an active selling period for the voucher definition (recognized by the productId).\ - The \"fromInclusive\" and \"untilInclusive\" fields specify the date-time range in which the voucher can be redeemed by the customer. This has nothing to do with the allowed start date of a requiredProduct (for this, the existing order flow logic is applied).\ - If the voucher definition contains mandatoryCustomerDataItems, a value (to be checked against customer input when redeeming the voucher) has to be provided for each of these items. + description: |- + Issue a voucher for a specific voucher definition. Vouchers can only be issued on a one-by-one basis, so that it is always clear what voucher code has been issued for specific voucher claims (which by itself may not uniquely identify the voucher; however the voucher code is guaranteed to be unique).\ + The voucher can only be issued if the calling touchpoint (recognized by the access token) has an active selling period for the voucher definition (recognized by the productId). + + When providing a voucher code, the supplier is allowed to re-use a voucher code that has already been issued, but only if the previously issued voucher is not active anymore.\ + This means that a voucher code can only be re-used once the previous instance has a `voucherStatus` of "revoked" or "expired".\ + Redeemed is NOT a valid end-state, as this voucher might still refer to an active travel product (which can be revoked by revoking the voucher). + + The `fromInclusive` and `untilInclusive` fields specify the date-time range in which the voucher can be redeemed by the customer.\ + This has nothing to do with the allowed start date of a requiredProduct (for this, the existing order flow logic is applied). + + If the voucher definition contains mandatoryCustomerDataItems, a value (to be checked against customer input when redeeming the voucher) has to be provided for each of these items. + + A newly issued voucher will always receive the status "new". Vouchers can only be redeemed after they have been explicitly set to the status "issued" (via `PATCH /issuedvouchers/{issuedVoucherId}`), for example when the customer receives the actual voucher code. tags: - Vouchers requestBody: @@ -481,7 +495,9 @@ paths: examples: Issue a voucher and supply own voucher code: summary: Issue a voucher and supply own voucher code - description: This allows the voucher supplier to supply its own voucher code, which can be useful if the supplier already has its own (internal or external) source for voucher codes. The supplied voucher code must be unique - if this code is already in use, the request will fail. + description: |- + This allows the voucher supplier to supply its own voucher code, which can be useful if the supplier already has its own (internal or external) source for voucher codes.\ + The supplied voucher code must be unique (or a previous instance must be revoked/expired, see main endpoint description). value: { "voucherCode": "HTM-A7J-128-PYT", @@ -498,12 +514,21 @@ paths: } Issue a voucher and receive a voucher code (generated by ABT backend) in response: summary: Issue a voucher and receive a voucher code (generated by ABT backend) in response - description: If the supplier is not able to generate its own unique voucher codes, it can issue a voucher without supplying any voucher code - the ABT backend will then receive a unique voucher code and return it in response. + description: |- + If the supplier is not able to generate its own unique voucher codes, it can issue a voucher without supplying any voucher code.\ + The ABT backend will then generate a unique voucher code and return it in response. value: { "fromInclusive": "2026-01-01T00:00:00.000+00:00", "untilInclusive": "2030-12-31T23:59:59.000+00:00", - "productId": 264 + "productId": 264, + "voucherClaims": + [ + { + "mandatoryCustomerDataItemId": 8, + "value": "1980-06-31", + } + ], } responses: "201": @@ -521,7 +546,7 @@ paths: "voucherCode": "HTM-A7J-128-PYT", "fromInclusive": "2024-10-04T00:00:00.000", "untilInclusive": "2024-11-04T00:00:00.000", - "voucherStatus": { "voucherStatusId": 2, "name": "issued" }, + "voucherStatus": { "voucherStatusId": 1, "name": "new" }, "product": { "productId": 263, @@ -573,12 +598,12 @@ paths: $ref: "#/components/schemas/rfc9457" examples: Voucher code already in use: - summary: Voucher code already in use + summary: Another active voucher instance already exists for this voucher code value: { "type": "https://example.com/probs/bad-request", "title": "Invalid voucher code", - "detail": "This voucher code is already in use.", + "detail": "Another active voucher instance already exists for this voucher code.", "instance": "/issuedvouchers" } Missing mandatory voucher claims: @@ -614,6 +639,9 @@ paths: summary: Update the status of an issued voucher description: |- Update the status of an issued voucher. Not every state change is allowed; an error will be returned if an invalid state change is attempted.\ + If a redeemed voucher is revoked using this endpoint, it may also impact any active travel products that have been acquired using this voucher.\ + This depends on specific business rules that are agreed upon with HTM. + Possible voucher statuses are: - 1 = new - 2 = issued @@ -630,8 +658,16 @@ paths: schema: $ref: "#/components/schemas/supplierTouchpointUpdateIssuedVoucherRequest" examples: + Mark a voucher as issued: + summary: Mark a voucher as issued + description: Mark a voucher as issued. Only vouchers with a status of "issued" can actually be redeemed. + value: + { + "voucherStatusId": 2 + } Mark a voucher as revoked: summary: Mark a voucher as revoked + description: Mark a voucher as revoked. This may also impact any active travel products that have been acquired using this voucher. This depends on specific business rules that are agreed upon with HTM. value: { "voucherStatusId": 4 From 5e255b7bac9ebddaf8de56f57fcf4ffe24204b48 Mon Sep 17 00:00:00 2001 From: Max Martens Date: Wed, 15 Jul 2026 14:37:20 +0200 Subject: [PATCH 08/11] Added contractVersions in SE contracts list response, fixed some example formatting --- src/openapi/contracts/contracts-se.yaml | 119 +++++++++++++++++------- 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/src/openapi/contracts/contracts-se.yaml b/src/openapi/contracts/contracts-se.yaml index e765cb5..638afc2 100644 --- a/src/openapi/contracts/contracts-se.yaml +++ b/src/openapi/contracts/contracts-se.yaml @@ -45,12 +45,36 @@ paths: "contractStatus": { "contractStatusId": 2, "name": "active" }, "productId": 1, - "productName": "HTM Maand 20% korting", - "termDuration": "P0Y1M0D", + "productName": "HTM Maand 20% korting doorlopend", + "termDuration": "P1M", "billingDay": 15, "highestInvoiceTerm": 1, - "created": "2024-08-01 15:01:00.000", + "created": "2024-08-01T15:01:00.000Z", "ovPayTokenId": 1337, + "contractVersions": [ + { + "contractVersionId": 1, + "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", + "productId": 1, + "productName": "HTM Maand 20% korting doorlopend", + "taxCode": "V9", + "taxPercentage": 9, + "termAmountInclTax": 400, + "start": "2024-08-01T15:01:00.000Z", + "end": "2025-01-01T03:00:00.000Z" + }, + { + "contractVersionId": 2, + "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", + "productId": 1, + "productName": "HTM Maand 20% korting doorlopend", + "taxCode": "V9", + "taxPercentage": 9, + "termAmountInclTax": 500, + "start": "2025-01-01T03:00:00.000Z", + "end": null + } + ], "_links": { "get_token": @@ -68,14 +92,38 @@ paths: "orderLineId": "42f68042-908f-41f4-9d9b-4cab843ff0e8", "touchpointId": 2, "contractStatus": - { "contractStatusId": 1, "name": "new" }, + { "contractStatusId": 6, "name": "pending cancellation" }, "productId": 1, - "productName": "HTM Maand 20% korting", - "termDuration": "P0Y1M0D", + "productName": "HTM 20% Korting doorlopend", + "termDuration": "P1M", "billingDay": 15, "highestInvoiceTerm": 1, - "created": "2024-08-01 15:01:00.000", + "created": "2024-08-01T15:01:00.000Z", "ovPayTokenId": 1338, + "contractVersions": [ + { + "contractVersionId": 1, + "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", + "productId": 1, + "productName": "HTM 20% Korting doorlopend", + "taxCode": "V9", + "taxPercentage": 9, + "termAmountInclTax": 400, + "start": "2024-08-01T15:01:00.000Z", + "end": "2025-01-01T03:00:00.000Z" + }, + { + "contractVersionId": 2, + "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", + "productId": 1, + "productName": "HTM 20% Korting doorlopend", + "taxCode": "V9", + "taxPercentage": 9, + "termAmountInclTax": 500, + "start": "2025-01-01T03:00:00.000Z", + "end": "2025-02-01T03:00:00.000Z" + } + ], "_links": { "get_token": @@ -154,8 +202,8 @@ paths: "contractStatus": { "contractStatusId": 2, "name": "active" }, "productId": 1, - "productName": "HTM Maand 20% korting", - "termDuration": "P0Y1M0D", + "productName": "HTM 20% Korting doorlopend", + "termDuration": "P1M", "billingDay": 15, "highestInvoiceTerm": 1, "ovPayTokenId": 1337, @@ -165,22 +213,22 @@ paths: "contractVersionId": 1, "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", "productId": 1, - "productName": "HTM Maand 20% korting", + "productName": "HTM 20% Korting doorlopend", "taxCode": "V9", "taxPercentage": 9.0, "termAmountInclTax": 400, - "start": "2024-07-04 15:01:00.000", - "end": "2024-12-31 15:01:00.000", + "start": "2024-08-01T15:01:00.000Z", + "end": "2025-01-01T03:00:00.000Z", }, { "contractVersionId": 2, "termsAndConditions": "https://www.htm.nl/reisproducten/productvoorwaarden/htm-maandkorting/", "productId": 1, - "productName": "HTM Maand 20% korting", + "productName": "HTM 20% Korting doorlopend", "taxCode": "V9", "taxPercentage": 9.0, "termAmountInclTax": 400, - "start": "2025-01-01 15:01:00.000", + "start": "2025-01-01T03:00:00.000Z", }, ], "contractActions": @@ -190,7 +238,7 @@ paths: "actionType": { "actionTypeId": 1, "name": "create" }, "user": "subid123456", - "timestamp": "2024-07-02 15:01:00.000", + "timestamp": "2024-07-02T15:01:00.000Z", "details": "Contract created", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", }, @@ -199,7 +247,7 @@ paths: "actionType": { "actionTypeId": 2, "name": "change" }, "user": "subid123456", - "timestamp": "2024-07-03 15:01:00.000", + "timestamp": "2024-07-03T15:01:00.000Z", "details": "Contract changed", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", }, @@ -211,8 +259,8 @@ paths: "externalReference": "F2024-0001", "term": 1, "invoiceDate": "2024-07-02", - "created": "2024-07-02 15:01:00.000", - "updated": "2024-07-02 15:01:00.000", + "created": "2024-07-02T15:01:00.000Z", + "updated": "2024-07-02T15:01:00.000Z", "state": "invoice_created", "data": "{json}", "isCredit": false, @@ -270,8 +318,8 @@ paths: "externalReference": "F2024-0001", "term": 1, "invoiceDate": "2024-07-02", - "created": "2024-07-02 15:01:34.000", - "updated": "2024-07-04 00:04:56.000", + "created": "2024-07-02T15:01:34.000Z", + "updated": "2024-07-04T00:04:56.000Z", "state": "invoice_created", "public_link": "http://mijnfactuurinzien.nl/F2024-0001", "isCredit": false, @@ -282,8 +330,8 @@ paths: "externalReference": "F2024-0002", "term": 2, "invoiceDate": "2024-08-02", - "created": "2024-08-02 15:01:34.000", - "updated": "2024-08-04 00:04:56.000", + "created": "2024-08-02T15:01:34.000Z", + "updated": "2024-08-04T00:04:56.000Z", "state": "invoice_created", "public_link": "http://mijnfactuurinzien.nl/F2024-0002", "isCredit": false, @@ -328,8 +376,8 @@ paths: "cancellationMoment": "termBound", "termDuration": "P1M", "billingDay": 18, - "cancellationFrom": "2024-08-10T00:00:00", - "cancellationUntil": "2026-08-10T00:00:00", + "cancellationFrom": "2024-08-10T00:00:00Z", + "cancellationUntil": "2026-08-10T00:00:00Z", } /contracts/{contractId}/cancellationvalidation: parameters: @@ -382,7 +430,7 @@ paths: { "validationResult": true, "validationMessage": "", - "end": "2024-08-10T03:59:59", + "end": "2024-08-10T03:59:59Z", "refundAmount": 2489, "refundMethods": ["creditInvoice", "iDeal"], } @@ -451,7 +499,7 @@ paths: the refund amount and refund method. value: { - "end": "2024-08-10T03:59:59", + "end": "2024-08-10T03:59:59Z", "refundAmount": 2489, "refundMethod": "creditInvoice", } @@ -516,8 +564,8 @@ paths: "taxCode": "V9", "taxPercentage": 9.0, "termAmountInclTax": 400, - "start": "2024-07-04 15:01:00.000", - "end": "2024-12-31 15:01:00.000", + "start": "2024-07-04T15:01:00.000Z", + "end": "2024-12-31T15:01:00.000Z", }, { "contractVersionId": 2, @@ -527,7 +575,8 @@ paths: "taxCode": "V9", "taxPercentage": 9.0, "termAmountInclTax": 400, - "start": "2025-01-01 15:01:00.000", + "start": "2025-01-01T15:01:00.000Z", + "end": null }, ], "contractActions": @@ -537,7 +586,7 @@ paths: "actionType": { "actionTypeId": 1, "name": "create" }, "user": "subid123456", - "timestamp": "2024-07-02 15:01:00.000", + "timestamp": "2024-07-02T15:01:00.000Z", "details": "Contract created", "correlationId": "976e7a4c-bf24-43d2-b444-55817556e7ee", }, @@ -546,7 +595,7 @@ paths: "actionType": { "actionTypeId": 2, "name": "change" }, "user": "subid123456", - "timestamp": "2024-07-03 15:01:00.000", + "timestamp": "2024-07-03T15:01:00.000Z", "details": "Contract changed", "correlationId": "e2462347-6749-4841-b42a-cf8de19ec727", }, @@ -558,8 +607,8 @@ paths: "externalReference": "F2024-0001", "term": 1, "invoiceDate": "2024-07-02", - "created": "2024-07-02 15:01:00.000", - "updated": "2024-07-02 15:01:00.000", + "created": "2024-07-02T15:01:00.000Z", + "updated": "2024-07-02T15:01:00.000Z", "state": "invoice_created", "data": "{json}", "isCredit": false, @@ -682,7 +731,7 @@ paths: "termDuration": "P0Y1M0D", "billingDay": 15, "highestInvoiceTerm": 1, - "created": "2024-08-01 15:01:00.000", + "created": "2024-08-01T15:01:00.000Z", "ovPayTokenId": 1337, "contractVersions": [ @@ -781,7 +830,7 @@ paths: "termDuration": "P0Y1M0D", "billingDay": 15, "highestInvoiceTerm": 1, - "created": "2024-08-01 15:01:00.000", + "created": "2024-08-01T15:01:00.000Z", "ovPayTokenId": 1337, "contractVersions": [ From 8eed2a9dd69d343720e06a9b8634f15b8cf8d03e Mon Sep 17 00:00:00 2001 From: Max Martens Date: Tue, 28 Jul 2026 20:58:22 +0200 Subject: [PATCH 09/11] Fix null paymentMomentId --- .../bin/ABTProductsPUTGenerator.jar | Bin 4557157 -> 4557189 bytes .../ovpay/abt/ABTProductsPUTGenerator.java | 9 +++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar b/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar index 2cb678fdbd8f847b0d29cd50f4287fb6ef82e9dc..1e25365096ae2c7dda743f042281f0784c912bda 100644 GIT binary patch delta 60944 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 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 2e53f85..8c87731 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 @@ -215,8 +215,13 @@ public class ABTProductsPUTGenerator { } case "paymentMoment" -> { LOGGER.info("Rewriting paymentMoment to paymentMomentId..."); - Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong(); - ((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId); + if (jsonField.getValue().get("paymentMomentId").isNull()) { + LOGGER.info("Rewriting null paymentMomentId..."); + ((ObjectNode)newJsonNode).putRawValue("paymentMomentId", null); + } else { + Long paymentMomentId = jsonField.getValue().get("paymentMomentId").asLong(); + ((ObjectNode)newJsonNode).put("paymentMomentId", paymentMomentId); + } } case "requiredCustomerLevel" -> { LOGGER.info("Rewriting requiredCustomerLevel to requiredCustomerLevelId..."); From 1d4fbf50043b72553b41538a9a93f06eb3d1d61d Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 10 Aug 2026 14:00:41 +0200 Subject: [PATCH 10/11] Links in se endpoints for TAT --- src/openapi/customers/SE-customers-v2.yaml | 73 +++++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/src/openapi/customers/SE-customers-v2.yaml b/src/openapi/customers/SE-customers-v2.yaml index 29fd300..5b22c16 100644 --- a/src/openapi/customers/SE-customers-v2.yaml +++ b/src/openapi/customers/SE-customers-v2.yaml @@ -1170,7 +1170,7 @@ paths: "gboAgeProfile": null, "tatSecurity": { "isSecured": false, - "isAuthorized": null, + "isAuthorized": false, }, "_links": { @@ -1209,6 +1209,10 @@ paths: "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/51compare", "method": "POST", }, + "secure": { + "href": "/tokens/securetoken", + "method": "POST" + } }, }, ], @@ -1597,6 +1601,22 @@ paths: "birthdate": null, "photo": null, }, + "tatSecurity": { + "isSecured": true, + "isAuthorized": false, + }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + "authorize": + { + "href": "/tokens/authorizetoken", + "method": "POST" + } + } }, { "customerProfileId": 1, @@ -1623,6 +1643,13 @@ paths: "isSecured": true, "isAuthorized": true, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + } }, { "customerProfileId": 18, @@ -1649,6 +1676,13 @@ paths: "isSecured": true, "isAuthorized": true, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + } }, { "customerProfileId": 132, @@ -1675,6 +1709,13 @@ paths: "isSecured": true, "isAuthorized": true, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + } }, { "customerProfileId": 166, @@ -1701,9 +1742,21 @@ paths: }, "gboAgeProfile": null, "tatSecurity": { - "isSecured": true, - "isAuthorized": true, + "isSecured": false, + "isAuthorized": false, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + "secure": + { + "href": "/tokens/securetoken", + "method": "POST" + } + } }, { "customerProfileId": 166, @@ -1730,6 +1783,13 @@ paths: "isSecured": true, "isAuthorized": true, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + } }, { "customerProfileId": 1, @@ -1756,6 +1816,13 @@ paths: "isSecured": true, "isAuthorized": true, }, + "_links":{ + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovPaytokenId=1", + "method": "GET", + }, + } }, ], _links: From c6b395a05b58d3bf9b56638369406fbbc06f7083 Mon Sep 17 00:00:00 2001 From: Mirjam Herald Date: Mon, 10 Aug 2026 14:06:35 +0200 Subject: [PATCH 11/11] fix xtat -> xTat --- src/openapi/customers/SE-customers-v2.yaml | 14 ++++++++++++-- src/openapi/customers/SE-tat-security.yaml | 12 ++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/openapi/customers/SE-customers-v2.yaml b/src/openapi/customers/SE-customers-v2.yaml index 5b22c16..7f97998 100644 --- a/src/openapi/customers/SE-customers-v2.yaml +++ b/src/openapi/customers/SE-customers-v2.yaml @@ -2007,7 +2007,7 @@ paths: "gboAgeProfile": null, "tatSecurity": { "isSecured": true, - "isAuthorized": true, + "isAuthorized": false, }, "_links": { @@ -2046,6 +2046,12 @@ paths: "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", "method": "POST", }, + "authorize":{ + { + "href": "/tokens/authorizetoken", + "method": "POST" + } + } }, }, "_links": @@ -2141,7 +2147,11 @@ paths: "autoReloadRegistration": null, "ePurse": null, "personalAccountData": - { "name": null, "birthdate": null, "photo": null }, + { "name": null, "birthdate": null, "photo": null },gi + "tatSecurity": { + "isSecured": true, + "isAuthorized": true, + }, "_links": { "self": diff --git a/src/openapi/customers/SE-tat-security.yaml b/src/openapi/customers/SE-tat-security.yaml index 7ad4fb0..4191628 100644 --- a/src/openapi/customers/SE-tat-security.yaml +++ b/src/openapi/customers/SE-tat-security.yaml @@ -192,7 +192,7 @@ paths: emailAddress: stasjo@htm.nl Without customer account: value: - xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d + xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d emailAddress: stasjo@htm.nl responses: "200": @@ -310,7 +310,7 @@ paths: ovPayTokenId: 42 Without customer account: value: - xtat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d + xTat: 62914b49-2c7f-437f-b4b0-2ad61a9f902d responses: "200": description: OK @@ -420,7 +420,7 @@ paths: action: secure OTP verification for TAT security authorization for anonymous token: value: - xtat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0 + xTat: 0f0defe8-828c-48e5-97e5-26d1d0179ef0 otp: 123456 action: authorize responses: @@ -526,7 +526,7 @@ components: ovPayTokenId: type: integer example: 42 - xtat: + xTat: type: string format: uuid example: 6134db53-9ae5-41d1-a343-36656b60b510 @@ -542,7 +542,7 @@ components: ovPayTokenId: type: integer example: 42 - xtat: + xTat: type: string format: uuid example: 6134db53-9ae5-41d1-a343-36656b60b510 @@ -552,7 +552,7 @@ components: ovPayTokenId: type: integer example: 42 - xtat: + xTat: type: string format: uuid example: f3474452-e1d4-428c-b366-e5ad5965eb8c