diff --git a/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar b/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar index 2a3b03c..eb23d37 100644 Binary files a/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar and b/src/java/ABTProductsPUTGenerator/bin/ABTProductsPUTGenerator.jar differ diff --git a/src/java/ABTProductsPUTGenerator/bin/input.json b/src/java/ABTProductsPUTGenerator/bin/input.json index 2873379..051b8a0 100644 --- a/src/java/ABTProductsPUTGenerator/bin/input.json +++ b/src/java/ABTProductsPUTGenerator/bin/input.json @@ -1,57 +1,54 @@ { - "productId": 38, - "parentProductId": null, - "productCode": "30901-WA", - "gboPackageTemplateId": "30901", + "productId": 151, + "fikoArticleNumber": null, + "parentProductId": 114, + "gboPackageTemplateId": "33629", "tapConnectProductCode": null, - "productGroupMetadata": null, - "productName": "HTM P1W Prolongatie-Test 90% Korting", - "productDescription": "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis met korting!", + "productName": "HTM Regio Vrij - Voltarief - Losse Maand - HL62", + "productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in gebied HL62", "validityPeriod": { - "validityPeriodId": 148, - "fromInclusive": "2023-12-31T23:00:00.000+00:00", - "toInclusive": "2029-12-08T04:00:00.000+00:00" + "validityPeriodId": 262, + "fromInclusive": "2024-09-30T23:00:00.000+00:00", + "toInclusive": "2099-12-30T23:00:00.000+00:00" }, "productTranslations": [ { "language": "en", - "name": "HTM Prolongation-Test 90% Discount", - "description": "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" + "name": "HTM Regio Free - Full Fare - 1 Month - HL62", + "description": "For a fixed amount unlimited travel with EBS, HTM and RET in region HL62" } ], "productOwner": { - "productOwnerId": 17, - "name": "Corneel Verstoep", - "organization": "HTM" + "productOwnerId": 19, + "name": "MRDH", + "organization": "MRDH" }, - "marketSegments": [ + "marketSegments": null, + "customerSegments": null, + "allowedGboAgeProfiles": [ { - "marketSegmentId": 1, - "name": "B2C" - } - ], - "customerSegments": [ - { - "customerSegmentId": 2, - "name": "Kind (4-11)" + "gboAgeProfileId": 1, + "name": "Baby/peuter (0 t/m 3 jaar)", + "ageFromInclusive": 0, + "ageToInclusive": 3 }, { - "customerSegmentId": 3, - "name": "Jongere (12-18)" + "gboAgeProfileId": 4, + "name": "Volwassene (19 t/m 64 jaar)", + "ageFromInclusive": 19, + "ageToInclusive": 64 }, { - "customerSegmentId": 4, - "name": "Volwassene (19-64)" - }, - { - "customerSegmentId": 5, - "name": "Oudere (65+)" + "gboAgeProfileId": 5, + "name": "Oudere (65 jaar of ouder)", + "ageFromInclusive": 65, + "ageToInclusive": 999 } ], "productCategory": { - "productCategoryId": 1, + "productCategoryId": 3, "isTravelProduct": true, - "name": "Kortingsabonnement" + "name": "Afgekocht reisrecht" }, "requiredCustomerLevel": { "requiredCustomerLevelId": 3, @@ -73,11 +70,24 @@ "customerDataItem": "emailAddress" }, { - "mandatoryCustomerDataItemId": 5, - "customerDataItem": "address" + "mandatoryCustomerDataItemId": 8, + "customerDataItem": "padBirthDate" + } + ], + "requiredGboPersonalAttributes": [ + { + "requiredGboPersonalAttributeId": 1, + "name": "NAME" + }, + { + "requiredGboPersonalAttributeId": 2, + "name": "BIRTHDATE" + }, + { + "requiredGboPersonalAttributeId": 3, + "name": "PHOTO" } ], - "requiredGboPersonalAttributes": null, "tokenTypes": [ { "tokenTypeId": 1, @@ -89,21 +99,21 @@ "name": "prepaid" }, "serviceOptions": null, - "validityDuration": "P1W", + "validityDuration": "P1M", "maxStartInFutureDuration": "P6W", - "isRenewable": true, - "sendInvoice": true, + "isRenewable": false, + "sendInvoice": false, "imageReference": "https://web.acc.cloud.htm.nl/media/leif2leu/htm-logo-mobile.svg", - "productPageUrl": "https://web.acc.cloud.htm.nl/webshop/htm-90-korting/", - "termsUrl": "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-90-korting/", + "productPageUrl": "https://web.acc.cloud.htm.nl/webshop/htm-regio-vrij", + "termsUrl": "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-regio-vrij/", "isSellableAtHtm": true, "needsSolvencyCheckConsumer": false, "needsSolvencyCheckBusiness": false, "sellingPeriods": [ { - "sellingPeriodId": 89, - "fromInclusive": "2024-09-30T23:00:00.000+00:00", - "toInclusive": "2029-12-01T23:00:00.000+00:00", + "sellingPeriodId": 214, + "fromInclusive": "2024-10-30T23:00:00.000+00:00", + "toInclusive": "2029-12-30T23:00:00.000+00:00", "salesTouchpoint": { "salesTouchpointId": 3, "name": "Website (Perplex)", @@ -126,18 +136,14 @@ "forbiddenPaymentMethods": null, "sellingPrices": [ { - "sellingPriceId": 82, - "amountExclTax": 92, - "amountInclTax": 100, - "fromInclusive": "2024-09-30T23:00:00.000+00:00", + "sellingPriceId": 195, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountExclTax": 13486, + "amountInclTax": 14700, + "fromInclusive": "2024-10-30T23:00:00.000+00:00", "toInclusive": "2029-12-01T23:00:00.000+00:00", - "internalPrice": 0.0000, - "taxMetadata": { - "taxMetadataId": "47C8972E-A730-4032-9BDA-AF0A5BCB2C85", - "taxCode": "V09", - "taxPercentageAmount": 9, - "description": "BTW VERKOOP LAAG 9%" - } + "internalPrice": 0.0000 } ] } @@ -145,10 +151,10 @@ "purchasePrices": null, "auditTrail": [ { - "auditTrailId": 162, + "auditTrailId": 475, "action": "insert", "user": "api", - "timestamp": "2024-11-25T08:39:36.793+00:00" + "timestamp": "2025-05-07T14:05:43.213+00:00" } ] } \ No newline at end of file diff --git a/src/java/ABTProductsPUTGenerator/bin/output.json b/src/java/ABTProductsPUTGenerator/bin/output.json index 070aba6..df4e037 100644 --- a/src/java/ABTProductsPUTGenerator/bin/output.json +++ b/src/java/ABTProductsPUTGenerator/bin/output.json @@ -1,57 +1,58 @@ { - "parentProductId" : null, - "productCode" : "30901-WA", - "gboPackageTemplateId" : "30901", + "fikoArticleNumber" : null, + "parentProductId" : 114, + "gboPackageTemplateId" : "33629", "tapConnectProductCode" : null, - "productGroupMetadata" : null, - "productName" : "HTM P1W Prolongatie-Test 90% Korting", - "productDescription" : "Reis je regelmatig met HTM? Activeer dan HTM 90% Korting op je betaalpas of credit card en reis met korting!", + "productName" : "HTM Regio Vrij - Voltarief - Losse Maand - HL62", + "productDescription" : "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in gebied HL62", "validityPeriod" : { - "validityPeriodId" : 148, - "fromInclusive" : "2023-12-31T23:00:00.000+00:00", - "toInclusive" : "2029-12-08T04:00:00.000+00:00" + "validityPeriodId" : 262, + "fromInclusive" : "2024-09-30T23:00:00.000+00:00", + "toInclusive" : "2099-12-30T23:00:00.000+00:00" }, "productTranslations" : [ { "language" : "en", - "name" : "HTM Prolongation-Test 90% Discount", - "description" : "Are you a regular traveler? Activate HTM 90% discount on your EMV card!" + "name" : "HTM Regio Free - Full Fare - 1 Month - HL62", + "description" : "For a fixed amount unlimited travel with EBS, HTM and RET in region HL62" } ], - "productOwnerId" : 17, - "marketSegmentIds" : [ 1 ], - "customerSegmentIds" : [ 2, 3, 4, 5 ], - "productCategoryId" : 1, + "productOwnerId" : 19, + "marketSegmentIds" : null, + "customerSegmentIds" : null, + "allowedGboAgeProfileIds" : [ 1, 4, 5 ], + "productCategoryId" : 3, "requiredCustomerLevelId" : 3, "requiredProducts" : null, "incompatibleProducts" : null, - "mandatoryCustomerDataItemIds" : [ 1, 2, 4, 5 ], - "requiredGboPersonalAttributes" : null, + "mandatoryCustomerDataItemIds" : [ 1, 2, 4, 8 ], + "requiredGboPersonalAttributeIds" : [ 1, 2, 3 ], "tokenTypeIds" : [ 1 ], "paymentMomentId" : 1, - "serviceOptions" : null, - "validityDuration" : "P1W", + "serviceOptionIds" : null, + "validityDuration" : "P1M", "maxStartInFutureDuration" : "P6W", - "isRenewable" : true, - "sendInvoice" : true, + "isRenewable" : false, + "sendInvoice" : false, "imageReference" : "https://web.acc.cloud.htm.nl/media/leif2leu/htm-logo-mobile.svg", - "productPageUrl" : "https://web.acc.cloud.htm.nl/webshop/htm-90-korting/", - "termsUrl" : "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-90-korting/", + "productPageUrl" : "https://web.acc.cloud.htm.nl/webshop/htm-regio-vrij", + "termsUrl" : "https://web.acc.cloud.htm.nl/reisproducten/productvoorwaarden/htm-regio-vrij/", "isSellableAtHtm" : true, "needsSolvencyCheckConsumer" : false, "needsSolvencyCheckBusiness" : false, "sellingPeriods" : [ { - "sellingPeriodId" : 89, - "fromInclusive" : "2024-09-30T23:00:00.000+00:00", - "toInclusive" : "2029-12-01T23:00:00.000+00:00", + "sellingPeriodId" : 214, + "fromInclusive" : "2024-10-30T23:00:00.000+00:00", + "toInclusive" : "2029-12-30T23:00:00.000+00:00", "salesTouchpointId" : 3, "forbiddenPaymentMethodIds" : null, "sellingPrices" : [ { - "sellingPriceId" : 82, - "amountExclTax" : 92, - "amountInclTax" : 100, - "fromInclusive" : "2024-09-30T23:00:00.000+00:00", + "sellingPriceId" : 195, + "taxCode" : "V09", + "taxPercentage" : 9.0, + "amountExclTax" : 13486, + "amountInclTax" : 14700, + "fromInclusive" : "2024-10-30T23:00:00.000+00:00", "toInclusive" : "2029-12-01T23:00:00.000+00:00", - "internalPrice" : 0.0, - "taxMetadataId" : "47C8972E-A730-4032-9BDA-AF0A5BCB2C85" + "internalPrice" : 0.0 } ] } ], "purchasePrices" : null 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 { diff --git a/src/openapi/apim/TP-PAD.yaml b/src/openapi/apim/TP-PAD.yaml new file mode 100644 index 0000000..5c522d7 --- /dev/null +++ b/src/openapi/apim/TP-PAD.yaml @@ -0,0 +1,482 @@ +openapi: 3.0.1 +info: + title: Personal Account Data (PAD) APIs for touchpoints and Service Engine + description: |- + APIs for touchpoints and Service Engine to manage Personal Account Data (PAD) on OVpay tokens (xTATs).\ + These APIs connect directly to the PADP APIs in GBO APIM and are implemented in Logic Apps + in the Integration Layer. + version: '1.0' +servers: + - url: https://api.integratielaag.nl/abt/touchpoint/1.0 +tags: + - name: Personal Data APIs for touchpoints + description: Personal Data APIs for touchpoints, no Service Engine in between! + - name: Personal Data APIs for Service Engine + description: Personal Data APIs for Service Engine, not to be exposed to touchpoints! +paths: + /personal-data/{xtat}: + post: + tags: + - Personal Data APIs for touchpoints + summary: Add the supplied Personal Data to the given xTAT (that should not contain any Personal Data yet). + description: |- + - The given xTAT should not contain any Personal Data yet (the PATCH endpoint should be used in that case) - if the given xTAT already contains Personal Data, an error is thrown; + - The given e-mail address will be used for future OTP challenges to manage the Personal Data in the future - this e-mail adress should therefore be validated; + - If the e-mail address is not yet validated by other means (e.g. the e-mail address is used for login, or is entered twice to prevent typos), an OTP challenge for the e-mail address should be triggered and supplied to this endpoint; + - xTAT and e-mail address are always required, for the Personal Data it is allowed to supply any subset, or all three data attributes; + - Each of the three data attributes is validated - for the requirements per attribute, see the descriptions in the request details below; + - If any attribute fails validation, none of the attributes will be added to the xTAT. + operationId: CreatePersonalData + parameters: + - name: xtat + in: path + required: true + example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d' + schema: + type: string + format: uuid + requestBody: + content: + multipart/form-data: + schema: + type: object + required: + - email + properties: + email: + type: string + format: email + description: Email address to be used for OTP challenges to prove ownership and manage the Personal Data in the future + example: 8Z9dG@example.com + otp: + type: string + pattern: ^[0-9]{6}$ + description: OTP is optional, should be supplied if the e-mail address is not yet validated by other means (e.g. the e-mail address is used for login, or is entered twice to prevent typo's) + example: "053395" + name: + type: string + description: Should consist of at least two words (first name and last name) + example: John Doe + birthDate: + type: string + format: date + description: Should be a date between 1900-01-01 and today, in the format `YYYY-MM-DD` + example: 2000-01-01 + photo: + type: string + description: Should be a JPG image, with a filesize of max. 512KB and resolution between 520x520 and 720x720 pixels + format: binary + encoding: + photo: + contentType: image/jpeg + responses: + '201': + description: Created + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + get: + tags: + - Personal Data APIs for touchpoints + summary: Retrieve the decrypted Personal Data for the given xTAT, using the OTP for verification of ownership. + description: OTP challenge is required to retrieve the Personal Data. + operationId: GetDecryptedPersonalData + parameters: + - name: xtat + in: path + required: true + schema: + type: string + format: uuid + example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d' + - name: otp + in: query + required: true + description: OTP challenge code that the token owner received in their e-mail inbox. OTP is always required for managing existing Personal Data. + schema: + type: string + pattern: ^[0-9]{6}$ + example: "053395" + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DecryptedPersonalData' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + patch: + tags: + - Personal Data APIs for touchpoints + summary: Update the supplied personal data for the given xTAT, using the OTP for verification of ownership. + description: This is a PATCH call, so only the personal data that the user desires to change need to be supplied. Integration layer supplements with any other existing personal data to be able to call GBO (PUT call). + operationId: UpdatePersonalData + parameters: + - name: xtat + in: path + required: true + schema: + type: string + format: uuid + example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d' + requestBody: + content: + multipart/form-data: + schema: + type: object + required: + - otp + properties: + otp: + type: string + pattern: ^[0-9]{6}$ + description: OTP challenge code that the token owner received in their e-mail inbox. OTP is always required for managing existing Personal Data. + example: "053395" + name: + type: string + description: Should consist of at least two words (first name and last name) + example: John Doe + birthDate: + type: string + format: date + description: Should be a date between 1900-01-01 and today, in the format `YYYY-MM-DD` + example: 2000-01-01 + photo: + type: string + description: Should be a JPG image, with a filesize of max. 512KB and resolution between 520x520 and 720x720 pixels + format: binary + encoding: + photo: + contentType: image/jpeg + responses: + '200': + description: OK + /personal-data/generate-otp: + get: + tags: + - Personal Data APIs for touchpoints + summary: Trigger OTP email for the given xTAT or e-mail address, to prove ownership + operationId: GenerateOtp + description: |- + Generate an OTP challenge e-mail to prove ownership of the given e-mail address or xTAT.\ + Only one type of parameter can be supplied, either xtat or email. When both are supplied, an error is thrown. + parameters: + - name: xtat + in: query + required: false + schema: + type: string + format: uuid + example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d' + - name: email + in: query + required: false + schema: + type: string + format: email + example: 'sV4yj@example.com' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OtpResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /personal-data/{xtat}/administrative-data: + get: + tags: + - Personal Data APIs for Service Engine + summary: API 1211 - Get Administrative Data + description: Integration Layer utilizes PAD management V2 in GBO APIM (`/pad-management/v2/..`) + operationId: GetAdministrativeData + parameters: + - name: xtat + description: xTAT to get administrative data for + in: path + required: true + schema: + type: string + format: uuid + example: 'c3a6c0f2-3b6a-4b9a-9c5d-5d9c6b3a4c5d' + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/AdministrativeData" + examples: + Valid and complete PAD: + summary: Valid and complete PAD + value: + name: + inaccuracyFlag: false + inaccuracyFlagReason: null + inaccuracyFlagCounter: 0 + changeCounter: 0 + maxUpdatesVerificationCount: 1 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + photo: + inaccuracyFlag: false + inaccuracyFlagReason: null + inaccuracyFlagCounter: 0 + changeCounter: 0 + maxUpdatesVerificationCount: 5 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + birthdate: + inaccuracyFlag: false + inaccuracyFlagReason: null + inaccuracyFlagCounter: 0 + changeCounter: 0 + maxUpdatesVerificationCount: 3 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + Partially filled PAD (no photo): + summary: Partially filled PAD (no photo) + value: + name: + inaccuracyFlag: false + inaccuracyFlagReason: null + inaccuracyFlagCounter: 0 + changeCounter: 0 + maxUpdatesVerificationCount: 1 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + photo: null + birthdate: + inaccuracyFlag: false + inaccuracyFlagReason: null + inaccuracyFlagCounter: 0 + changeCounter: 0 + maxUpdatesVerificationCount: 3 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + Flagged PAD: + summary: Flagged PAD + value: + name: + inaccuracyFlag: true + inaccuracyFlagReason: "Invalid name" + inaccuracyFlagCounter: 1 + changeCounter: 1 + maxUpdatesVerificationCount: 1 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + photo: + inaccuracyFlag: true + inaccuracyFlagReason: "Invalid photo" + inaccuracyFlagCounter: 1 + changeCounter: 0 + maxUpdatesVerificationCount: 5 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + birthdate: + inaccuracyFlag: true + inaccuracyFlagReason: "Invalid birthdate" + inaccuracyFlagCounter: 1 + changeCounter: 2 + maxUpdatesVerificationCount: 3 + lastChangeDate: "2025-03-26T10:18:42.947" + isValidated: false + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Invalid UUID: + summary: Invalid UUID + value: + errors: + code: "0x03000103" + data: [ + "geen-uuid" + ] + message: "The provided scTat is not a valid UUID" + exceptionClassName: "PadpConstraintViolationException" + exceptionStackTrace: "not available because debug mode is turned off" + "404": + description: Not Found + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + No PAD found for xTAT: + summary: No PAD found for xTAT + value: + errors: + code: "0x03000105" + data: [] + message: "Transit account not found" + exceptionClassName: "PadpEntityNotFoundException" + exceptionStackTrace: "not available because debug mode is turned off" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + examples: + Unknown xTAT: + summary: Unknown xTAT + value: + errors: + code: "0x00000001" + data: null + message: "400 : \"{\"errorMessage\":{\"referenceId\":\"076f0de4-df33-42a3-add0-def971ab6679\",\"message\":\"Unknown external transit account token.\"},\"businessExceptions\":[{\"code\":\"TM0207\",\"message\":\"Unknown external transit account token.\"}]}\"" + exceptionClassName: "BadRequest" + exceptionStackTrace: "not available because debug mode is turned off" +components: + schemas: + AdministrativeData: + type: object + properties: + name: + $ref: '#/components/schemas/AdministrativeDataElement' + photo: + $ref: '#/components/schemas/AdministrativeDataElement' + birthdate: + $ref: '#/components/schemas/AdministrativeDataElement' + additionalProperties: false + AdministrativeDataElement: + type: object + properties: + inaccuracyFlag: + type: boolean + inaccuracyFlagReason: + type: string + nullable: true + inaccuracyFlagCounter: + type: integer + format: int32 + changeCounter: + type: integer + format: int32 + maxUpdatesVerificationCount: + type: integer + format: int32 + lastChangeDate: + type: string + format: date-time + isValidated: + type: boolean + additionalProperties: false + DecryptedData: + type: object + properties: + name: + type: string + nullable: true + birthdate: + type: string + nullable: true + photo: + type: string + description: Base64 encoded photo + format: byte + nullable: true + additionalProperties: false + DecryptedPersonalData: + type: object + properties: + decryptedData: + $ref: '#/components/schemas/DecryptedData' + additionalProperties: false + Error: + type: object + properties: + code: + type: string + nullable: true + data: + type: array + items: + type: string + nullable: true + message: + type: string + nullable: true + additionalProperties: false + ErrorResponse: + type: object + properties: + errors: + type: array + items: + $ref: '#/components/schemas/Error' + nullable: true + exceptionClassName: + type: string + nullable: true + exceptionStackTrace: + type: string + nullable: true + additionalProperties: false + Metadata: + type: object + properties: + encryptedEphemeralKey: + type: string + nullable: true + additionalProperties: false + OtpResponse: + type: object + properties: + maskedEmailAddress: + type: string + nullable: true + additionalProperties: false \ No newline at end of file diff --git a/src/openapi/customers/SE-customers.yaml b/src/openapi/customers/SE-customers.yaml index d814fc5..c21ea8d 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: @@ -18,10 +18,12 @@ 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 + in: query schema: type: integer example: 1 @@ -44,7 +46,7 @@ paths: in: query schema: type: integer - example: 1 + example: 1 - name: birthname in: query schema: @@ -71,138 +73,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/touchpoint/1.0/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/touchpoint/1.0/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 +208,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 +263,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 +275,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/touchpoint/1.0/customers/tokens", + "method": "GET", + }, + }, } EMV without PAD: summary: EMV without PAD description: EMV without PAD value: { - "ovPayTokens": [ + "ovPayTokens": + [ + { + "customerProfileId": 1, + "ovPayTokenId": 1, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "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, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/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", + }, + }, + }, + ], + _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/touchpoint/1.0/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": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/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/51compare", + "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/touchpoint/1.0/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": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", + "method": "GET", + }, + "update_personal-data": + { + "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", + }, }, - "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/touchpoint/1.0/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": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", + "method": "GET", + }, + "update_personal-data": + { + "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", + }, }, - "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/touchpoint/1.0/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": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": + { "tokenTypeId": 2, "name": "OV-pas physical" }, + "alias": "MyToken", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, + "expirationDate": "2028-02-01", + "replacedByTokenId": null, + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", + "method": "GET", + }, + "update_personal-data": + { + "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", + }, + }, + }, + ], + _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/touchpoint/1.0/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": null, + "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": null, + "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": null, + "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": null, + "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": null, + "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": null, + "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/touchpoint/1.0/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,217 +979,224 @@ 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" - }, + "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" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/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/1/compare", + "method": "POST", + }, + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/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" - }, + "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" - }, + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 00 + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", + "method": "GET", + }, + "add_personal-data": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/personal-data/32089cc8-d187-47ff-a3a9-5c2558def811", + "method": "POST", }, - "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" + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/compare", + "method": "POST", + }, + }, + }, + "_links": + { + "self": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/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" - } - } } /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 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) - 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: schema: $ref: "#/components/schemas/unavailable" examples: - Replace with new EMV token: - summary: Replace with new token - description: Replace with new token - value: + 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": { - "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: - summary: Replace with existing token - description: Replace with existing token - value: - { - "ovPayToken": { - "newTokenId": 10 - } - } - Replace with new OV pas 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 - value: + description: Replace with new OV pas token by OV-pas number. + 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 +1206,138 @@ 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" - }, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "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, + "replacedByTokenId": null, "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/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", + }, }, - "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" - }, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "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, + "replacedByTokenId": null, "autoReloadRegistration": null, - "ePurse": { - "e-PurseBalance": { - "currency": "EUR", - "amount": 350 + "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", }, - "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" + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", + "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" - } - } - } + }, } - "200": + "200": description: Ok content: application/json: @@ -1307,89 +1347,91 @@ 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" - }, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "tokenType": { "tokenTypeId": 1, "name": "EMV" }, "lastDigits": null, "ovpasNumber": null, - "alias": "Mijn bestaandetoken", - "tokenStatus": { - "tokenStatusId": 2, - "name": "Active" - }, + "alias": "Mijn bestaande token", + "tokenStatus": + { "tokenStatusId": 2, "name": "Active" }, "expirationDate": "2028-08-31T23:59:00+02:00", - "replacedByTokenId": 0, + "replacedByTokenId": null, "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/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", + }, }, - "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 +1444,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 +1468,218 @@ 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" - }, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "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, + "replacedByTokenId": null, "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/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", + }, }, - "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" - }, + "ovPayTokenId": 5, + "xTat": "32089cc8-d187-47ff-a3a9-5c2558def811", + "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, + "replacedByTokenId": null, "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/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", + }, }, - "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" - }, + "ovPayTokenId": 5, + "xTat": "e35977b2-52bb-48ef-aca8-297b2c1d5058", + "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, + "replacedByTokenId": null, "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/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/e35977b2-52bb-48ef-aca8-297b2c1d5058", + "method": "POST", + }, + "compare_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/5/compare", + "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 @@ -1653,6 +1689,271 @@ 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 new token by XTAT: + summary: 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": + { + "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: @@ -1672,12 +1973,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,42 +1988,990 @@ 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/touchpoint/1.0/customers/tokens/1/productinstances/1", + "method": "GET", + }, + "get_order": + { + "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/touchpoint/1.0/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" + ], + } + /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 + 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. 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 + - Token status (only if target token is known in the customer profile) + - Expiry date + - Instantiated GBO products + - Auto reload registration + - E-purse + - PAD (name, birthdate, photo) + - Age profile + tags: + - Customers + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CompareRequest" + examples: + Compare with an existing OVpay token: + value: { "ovPayTokenId": 1 } + 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 request body (for development only): + value: + { + "ovPayTokenId": 1, + "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: + 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": 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 }, + }, + "isTransferable": true, + "transferableObjects": + { + "tokenType": true, + "tokenStatus": true, + "expirationDate": true, + "productInstances": 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", }, - "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" + }, + } + 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 }, + }, + "isTransferable": 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 }, + }, + "isTransferable": 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: + { + "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": + { + "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": "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 }, + }, + "isTransferable": 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 + } + }, + "isTransferable": false, + "transferableObjects": + { + "tokenType": true, + "tokenStatus": true, + "expirationDate": true, + "productInstances": true, + "autoReloadRegistration": true, + "ePurse": false, + "personalAccountData": + { + "name": true, + "birthdate": 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: + 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": 1, + }, + ], + } + 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": 2, + }, + ], + } + 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: 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 from which data will be transferred. + schema: + type: integer + example: 1 + post: + summary: "**INTEGRATIELAAG** Transfer old OVpay token to new OVpay token." + description: |- + **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: + - Customers + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TransferRequest" + examples: + 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 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": {}, + "newOvPayToken": + { + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", + }, + } + 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 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" }, + "newOvPayToken": + { + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", + "padEmailAddress": "jandevries@outlook.com", + "padOtp": "678901", + }, + } + 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" }, + "newOvPayToken": + { + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", + "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": + { + "xTat": "e7fa3392-646b-40e2-95a6-c417dc0b0969", + "alias": "My new token", + "padEmailAddress": "jandevries@outlook.com", + "padOtp": "678901", + }, + } + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/unavailable" + examples: + New token as a result of a successful transfer: + value: + { + "customerProfileId": 1, + "ovPayTokenId": 2, + "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": + { + "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/touchpoint/1.0/customers/tokens?ovpaytokenId=1", + "method": "GET", + }, + "partial_edit": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "PATCH", + }, + "delete_token": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1", + "method": "DELETE", + }, + "get_productinstances": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/productinstances", + "method": "GET", + }, + "get_trips": + { + "href": "https://api.integratielaag.nl/abt/touchpoint/1.0/customers/tokens/1/trips", + "method": "GET", + }, + "update_personal-data": + { + "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": + 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": 1, + }, + ], + } + 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": 2, + }, + ], + } + 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", + }, + ], + } + "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", + "expirationDate": "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: 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: @@ -1771,7 +3020,7 @@ components: dateOfBirth: type: string format: date - example: '2023-02-01' + example: "2023-02-01" emailAddress: type: string format: email @@ -1784,9 +3033,6 @@ components: addressId: type: integer example: 1 - isPreferred: - type: boolean - example: true addressType: type: object properties: @@ -1795,7 +3041,7 @@ components: example: 1 name: type: string - example: Home + example: Shipping street: type: string example: Appelstraat @@ -1813,7 +3059,7 @@ components: example: Den Haag country: type: string - example: Nederland + example: NL _links: type: object properties: @@ -1822,7 +3068,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 @@ -1831,7 +3077,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 @@ -1850,7 +3096,7 @@ components: type: object properties: phoneTypeId: - type: integer + type: integer example: 1 name: type: string @@ -1869,7 +3115,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 @@ -1878,7 +3124,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 @@ -1890,17 +3136,17 @@ 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 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 - 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 @@ -1909,7 +3155,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 @@ -1918,7 +3164,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 @@ -1927,10 +3173,10 @@ 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 + example: POST OvPayTokensResponse: type: object required: @@ -1944,7 +3190,7 @@ components: ovPayTokenId: type: integer example: 1 - tokenType: + tokenType: type: object properties: tokenTypeId: @@ -1968,7 +3214,7 @@ components: expirationDate: type: string format: date - example: '2023-02-01' + example: "2023-02-01" replacedByTokenId: type: integer example: 1 @@ -1980,17 +3226,17 @@ 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 + example: GET partial_edit: type: object description: External touchpoints are only allowed to change alias - SMP can also change tokenStatus 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 @@ -1999,7 +3245,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 @@ -2008,7 +3254,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 @@ -2017,7 +3263,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 @@ -2026,7 +3272,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 @@ -2041,12 +3287,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 +3306,7 @@ components: example: 1 name: type: string - example: Kortingsabonnement + example: Kortingsabonnement fromInclusive: type: string format: date-time-offset @@ -2068,7 +3314,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: @@ -2092,7 +3338,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 @@ -2102,7 +3348,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 @@ -2112,12 +3358,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 - - - - - 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.yaml b/src/openapi/customers/customers.yaml index 65a9763..472250a 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,10 @@ paths: updateFullBillingInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 - updateIssuerCountry: - value: - billingInformation: - issuerCountry: DE + alias: Alias Test updateIban: value: billingInformation: @@ -148,10 +136,6 @@ paths: value: billingInformation: bic: DEUT - updateSwift: - value: - billingInformation: - swift: UpdatedSwift updateAscription: value: billingInformation: @@ -160,10 +144,6 @@ paths: value: billingInformation: alias: Updated Alias - updateBillingAddressId: - value: - billingInformation: - billingAddressId: 3 required: true responses: '201': @@ -218,21 +198,16 @@ paths: fullFinancialInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test minimumBillingInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test required: true responses: '201': @@ -289,16 +264,12 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 - created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference minimumdirectDebitMandate: value: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 - created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference required: true responses: @@ -358,38 +329,32 @@ paths: customerNumber: 1000003 billingInformation: - billingInformationId: 1 - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test + created: "2024-06-02T15:03:460" - billingInformationId: 2 - issuerCountry: BE iban: '0987654321' bic: null - swift: null ascription: Dit is een Test - alias: Alias Test - billingAddressId: 3 + alias: Alias Test + created: "2024-06-02T15:03:460" directDebitMandate: - directDebitMandateId: 1 directDebitMandateTypeName: PIN Transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference mandateState: SIGNED - updateTimestamp: '2024-01-01T00:00:00.00' + updateTimestamp: '2024-01-01T00:00:00.000' - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference mandateState: CANCELLED - updateTimestamp: '2024-01-01T00:00:00.00' + updateTimestamp: '2024-01-01T00:00:00.000' missingBillingInformation: value: customerNumber: 1000003 @@ -398,35 +363,31 @@ paths: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference + updateTimestamp: '1900-01-01T00:00:00.000' - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference + updateTimestamp: '1900-01-01T00:00:00.000' missingDebitMandateInformation: value: customerNumber: 1000003 billingInformation: - billingInformationId: 1 - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test + created: "2024-06-02T15:03:460" - billingInformationId: 2 - issuerCountry: BE iban: '0987654321' - bic: null - swift: null + bic: null ascription: Dit is een Test - alias: Alias Test - billingAddressId: 3 + alias: Alias Test + created: "2024-06-02T15:03:460" directDebitMandate: [] minimumFinancialInformation: value: @@ -500,21 +461,16 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 mandateReference: Dit is een test Reference mandateState: SIGNED updateDirectDebitMandateType: value: directDebitMandate: - directDebitMandateTypeId: 1 + directDebitMandateTypeId: 1 updateBillingInformationId: value: directDebitMandate: billingInformationId: 2 - updateMandateAddressId: - value: - directDebitMandate: - mandateAddressId: 3 updateMandateReference: value: directDebitMandate: @@ -591,17 +547,10 @@ paths: updateFullBillingInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 - updateIssuerCountry: - value: - billingInformation: - issuerCountry: DE + alias: Alias Test updateIban: value: billingInformation: @@ -610,10 +559,6 @@ paths: value: billingInformation: bic: DEUT - updateSwift: - value: - billingInformation: - swift: UpdatedSwift updateAscription: value: billingInformation: @@ -687,17 +632,14 @@ paths: fullFinancialInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test alias: Alias Test billingAddressId: 2 minimumBillingInformation: value: billingInformation: - issuerCountry: NL iban: '1234567890' ascription: Dit is een Test alias: Alias Test @@ -765,17 +707,13 @@ paths: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 - created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference minimumdirectDebitMandate: value: directDebitMandate: directDebitMandateTypeId: 1 billingInformationId: 1 - mandateAddressId: 2 - created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference required: true responses: '201': @@ -841,38 +779,34 @@ paths: customerNumber: 1000003 billingInformation: - billingInformationId: 1 - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test alias: Alias Test billingAddressId: 2 - updateTimestamp: '2024-01-01T00:00:00.00' + created: '2024-01-01T00:00:00.000' - billingInformationId: 2 - issuerCountry: BE iban: '0987654321' bic: null - swift: null ascription: Dit is een Test alias: Alias Test billingAddressId: 3 - updateTimestamp: '2024-01-01T00:00:00.00' + created: '2024-01-01T00:00:00.000' directDebitMandate: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference mandateState: SIGNED + updateTimestamp: '2024-01-01T00:00:00.000' - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' mandateReference: Dit is een test Reference mandateState: CANCELLED + updateTimestamp: '2024-01-01T00:00:00.000' missingBillingInformation: value: customerNumber: 1000003 @@ -881,35 +815,31 @@ paths: - directDebitMandateId: 1 directDebitMandateTypeName: PIN transaction billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference + updateTimestamp: '1900-01-01T00:00:00.000' - directDebitMandateId: 2 directDebitMandateTypeName: Paper Contract billingInformationId: 1 - mandateAddressId: 2 created: '1900-01-01T00:00:00.000' - mandateReference: Dit is een test Reference + mandateReference: Dit is een test Reference + updateTimestamp: '1900-01-01T00:00:00.000' missingDebitMandateInformation: value: customerNumber: 1000003 billingInformation: - billingInformationId: 1 - issuerCountry: NL iban: '1234567890' bic: ING - swift: Swift ascription: Dit is een Test - alias: Alias Test - billingAddressId: 2 + alias: Alias Test + created: "2024-06-02T15:03:460" - billingInformationId: 2 - issuerCountry: BE iban: '0987654321' bic: null - swift: null ascription: Dit is een Test alias: Alias Test - billingAddressId: 3 + created: "2024-06-02T15:03:460" directDebitMandate: [] minimumFinancialInformation: value: @@ -1112,8 +1042,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1121,8 +1050,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1199,8 +1127,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1208,8 +1135,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1537,8 +1463,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -1546,8 +1471,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -1753,7 +1677,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 - street: Beeklaan houseNumber: 30 @@ -1761,7 +1684,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: false addressTypeId: 2 phones: - number: '6123456789' @@ -2604,7 +2526,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 addMinimumAddress: value: @@ -2614,7 +2535,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 responses: '201': @@ -2826,7 +2746,6 @@ paths: city: Den Haag country: NL addressTypeId: 2 - isPreferred: true updateStreet: value: address: @@ -2854,11 +2773,7 @@ paths: updateAddressTypeId: value: address: - addressTypeId: 3 - updateIsPreferred: - value: - address: - isPreferred: false + addressTypeId: 1 responses: '202': description: Successful updated the customer profile @@ -3111,8 +3026,7 @@ paths: postalCode: 0000AA city: Den Haag country: NL - isPreferred: true - addressType: Office + addressType: Billing - addressId: 2 street: mystreet 33 houseNumber: 1 @@ -3120,8 +3034,7 @@ paths: postalCode: 4455CA city: Den BOSCH country: NL - isPreferred: true - addressType: Office + addressType: Shipping phone: - phoneId: 1 number: '3112345678' @@ -3328,7 +3241,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 - street: Beeklaan houseNumber: 30 @@ -3336,7 +3248,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: false addressTypeId: 2 phones: - number: '6123456789' @@ -4114,7 +4025,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 addMinimumAddress: value: @@ -4124,7 +4034,6 @@ paths: postalCode: 2500AA city: Den Haag country: NL - isPreferred: true addressTypeId: 1 responses: '201': @@ -4350,7 +4259,6 @@ paths: city: Den Haag country: NL addressTypeId: 2 - isPreferred: true updateStreet: value: address: @@ -4378,7 +4286,7 @@ paths: updateAddressTypeId: value: address: - addressTypeId: 3 + addressTypeId: 1 updateIsPreferred: value: address: @@ -4696,8 +4604,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressType: type: string getPhone: @@ -4761,7 +4667,6 @@ components: - billingInformationId - created - directDebitMandateTypeName - - mandateAddressId - mandateReference type: object properties: @@ -4769,10 +4674,6 @@ components: type: string billingInformationId: type: integer - mandateAddressId: - type: integer - created: - type: string mandateReference: type: string directDebitMandatePost: @@ -4787,8 +4688,6 @@ components: type: string billingInformationId: type: integer - mandateAddressId: - type: integer mandateReference: type: string mandateState: @@ -4811,8 +4710,6 @@ components: type: integer billingInformationId: type: integer - mandateAddressId: - type: integer created: type: string mandateReference: @@ -4826,52 +4723,41 @@ components: - alias - ascription - bic - - billingAddressId - billingInformationId - iban - - issuerCountry - - swift + - created type: object properties: billingInformationId: type: integer - issuerCountry: - type: string iban: type: string bic: type: string - swift: - type: string ascription: type: string alias: type: string - billingAddressId: - type: integer + created: + type: string billingInformationPostEntity: required: - alias - ascription - billingAddressId - iban - - issuerCountry type: object properties: - issuerCountry: - type: string iban: type: string bic: type: string - swift: - type: string ascription: type: string alias: type: string - billingAddressId: - type: integer + created: + type: string billingInformationPost: type: object properties: @@ -4880,20 +4766,14 @@ components: billingInformationPatchEntity: type: object properties: - issuerCountry: - type: string iban: type: string bic: type: string - swift: - type: string ascription: type: string alias: type: string - billingAddressId: - type: integer billingInformationPatch: type: object properties: @@ -5095,8 +4975,6 @@ components: type: string country: type: string - isPreferred: - type: boolean addressTypeId: type: integer addressPatchEntity: @@ -5116,8 +4994,6 @@ components: type: string addressTypeId: type: integer - isPreferred: - type: boolean phonePostEntity: required: - countryCode 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: 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. diff --git a/src/openapi/orders/service_engine_orders.yaml b/src/openapi/orders/service_engine_orders.yaml index 65cb057..78c4bb9 100644 --- a/src/openapi/orders/service_engine_orders.yaml +++ b/src/openapi/orders/service_engine_orders.yaml @@ -3358,7 +3358,9 @@ paths: examples: v2.2: summary: Add a payment v2.2 - description: Add a payment v2.2 + 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", @@ -3366,9 +3368,6 @@ paths: "paymentMethodId": 1, "isRefund": false, "htmPaymentReference": "HTM-1234", - "pspPaymentReference": null, - "paymentStatuses": [], - "mandateInput": null, } v1.2: summary: Order creation v1.2 @@ -3585,17 +3584,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, }, ], diff --git a/src/openapi/service/service-crud.yaml b/src/openapi/service/service-crud.yaml new file mode 100644 index 0000000..228d76d --- /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-02T15:01:00.000+00:00", + }, + ], + } + Multiple TokenRegisterRequests: + summary: Multiple TokenRegisterRequests + value: + { + "tokenRegisterRequests": + [ + { + "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", + "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", + "updated": "22025-07-02T15:01:00.000+00:00", + }, + { + "readerId": "b4d8e43c-be21-472c-955b-a0c7c11b4bfb", + "xBot": "625bc66b-a5de-42fc-ba9e-fb02ada4a4ee", + "updated": "2025-07-02T13:37:07.000+00:00", + }, + ], + } + /tokenregisterrequests/{readerId}: + parameters: + - in: path + name: readerId + required: true + description: The NFC reader id. + schema: + type: string + example: b14b0320-2b72-48bb-990b-b97a2d67f9df + put: + summary: Insert or update token register request. + description: Insert or update token register request. + tags: + - NFC Reader + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/TokenRegisterRequestPutRequest" + example: { "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115" } + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/TokenRegisterRequestPutResponse" + example: + { + "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", + "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", + "updated": "2025-07-02T15:01:00.000+00:00", + } + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/TokenRegisterRequestPutResponse" + example: + { + "readerId": "b14b0320-2b72-48bb-990b-b97a2d67f9df", + "xBot": "4bfaede2-a6c9-45dd-8a80-1f83a075a115", + "updated": "2025-07-02T15:01:00.000+00:00", + } +components: + securitySchemes: + bearerToken: + type: http + scheme: bearer + bearerFormat: JWT + schemas: + TokenRegisterRequestsGetResponse: + type: object + properties: + tokenRegisterRequests: + type: array + items: + $ref: "#/components/schemas/TokenRegisterRequest" + TokenRegisterRequestPutRequest: + type: object + properties: + xBot: + type: string + format: uuid + example: 4bfaede2-a6c9-45dd-8a80-1f83a075a115 + nullable: false + description: The xBOT id. + required: + - xBot + TokenRegisterRequestPutResponse: + $ref: "#/components/schemas/TokenRegisterRequest" + TokenRegisterRequest: + type: object + properties: + readerId: + type: string + example: b14b0320-2b72-48bb-990b-b97a2d67f9df + nullable: false + description: The NFC reader id. + xBot: + type: string + format: uuid + example: 4bfaede2-a6c9-45dd-8a80-1f83a075a115 + nullable: false + description: The xBOT id. + updated: + type: string + format: date-time + example: "2025-07-02T15:01:00+00:00" + nullable: false + description: The date and time when the token register request was updated. + required: + - readerId + - xBot + - updated 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