diff --git a/src/openapi/products/SE-products.yaml b/src/openapi/products/SE-products.yaml new file mode 100644 index 0000000..c76fc51 --- /dev/null +++ b/src/openapi/products/SE-products.yaml @@ -0,0 +1,1676 @@ +openapi: 3.0.1 +info: + title: Service Engine APIs for Products + description: |- + Service Engine APIs for HTM products. These are NOT the CRUD APIs to access raw data in the database. + To be used by touchpoints to get information about HTM products they are allowed to see and/or sell. + version: '1.0' +servers: + - url: https://api.integratielaag.nl/abt/servcieengine/x.x +tags: + - name: ServiceEngine Products + description: |- + To be used by touchpoints to get information about HTM products they are allowed to see and/or sell. +paths: + /products: + get: + tags: + - ServiceEngine Products + summary: Get a list of all HTM products that a touchpoint is allowed to see and/or sell + description: |- + Get a list of all HTM products that refers to a given parentProductId (or without parent, if not specified), + and that the calling touchpoint is allowed to see and/or sell. \ + Only a few details are returned per product - use the `GET /products/{productId}` endpoint + to get more details. \ + In the examples, it can be seen that only products that have active sellingPeriods for touchpoints within the same + retailer as the calling touchpoint are returned. \ + Touchpoint 1 and 2 belong to retailer 1; touchpoint 3 and 4 belong to retailer 2. + parameters: + - name: parentProductId + in: query + required: false + description: |- + Only return products that refer to the given parentProductId. \ + Returns parent-products (i.e. products with parentProductId = null) if left empty. + schema: + type: integer + example: 1 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ProductPayloadListResponse' + examples: + getListNoProducts: + summary: No products / Empty list + description: No products + value: + { + "Entries": [], + "href": null + } + getListOneProductTouchpointId3: + summary: List containing one product with 4 currently active SellingPeriods (called by touchpointId 3) + description: Only products that have active sellingPeriods for touchpoint 3 are returned + value: + { + "Entries": [ + { + "productId": 2, + "productCode": "312AB-WL", + "productName": "HTM dagkaart", + "productDescription": "Reis een dag met het openbaar vervoer bij HTM", + "productCategory": { + "productCategoryId": 6, + "isTravelProduct": false, + "name": "Barcode" + }, + "tokenTypes": null, + "sellableTouchPointIds": [ + 3, + 4 + ], + "amountInclTax": 300, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "_links": { + "get_details": { + "href": "https://services.acc.api.htm.nl/abt/serviceengine/x.x/products/2", + "method": "GET" + } + } + } + ] + } + getListMultipleProductsWithPaginationTuchpointId1: + summary: List containing multiple products with pagination (called by touchpointId 3) + description: Only products that have active SellingPeriods for touchpoint 3 are returned + value: + { + "Entries": [ + { + "productId": 2, + "productCode": "312AB-WL", + "productName": "HTM dagkaart", + "productDescription": "Reis een dag met het openbaar vervoer bij HTM", + "productCategory": { + "productCategoryId": 6, + "isTravelProduct": false, + "name": "Barcode" + }, + "tokenTypes": null, + "sellableTouchPointIds": [ + 3, + 4 + ], + "amountInclTax": 300, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "_links": { + "get_details": { + "href": "https://services.acc.api.htm.nl/abt/serviceengine/x.x/products/2", + "method": "GET" + } + } + }, + { + "productId": 4, + "productCode": "30002-ML", + "productName": "HTM 40% korting", + "productDescription": "Reis een maand lang met 40% korting!", + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "sellableTouchPointIds": [ + 3, + 4 + ], + "amountInclTax": 800, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "_links": { + "get_details": { + "href": "https://services.acc.api.htm.nl/abt/serviceengine/x.x/products/4", + "method": "GET" + } + } + } + ] + } + '400': + description: '400' + content: + application/json: + schema: + $ref: '#/components/schemas/400Response' + '401': + description: '401' + content: + application/json: + schema: + $ref: '#/components/schemas/401Response' + '404': + description: '404' + content: + application/json: + schema: + $ref: '#/components/schemas/404Response' + '500': + description: '500' + content: + application/json: + schema: + $ref: '#/components/schemas/500Response' + /products/{productId}: + get: + tags: + - ServiceEngine Products + summary: Get full details of a single HTM product (including all child products), specified by the productId + description: |- + Get full details of a single HTM product (including all child products), specified by the productId. \ + Touchpoints only receive information that is allowed to be seen by the touchpointId of the \ + consumer; i.e. only currently active selling periods and prices for the calling touchpoint are returned. + parameters: + - name: productId + in: path + required: true + style: simple + description: Id of the product to get details for + schema: + type: integer + example: 1 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ProductPayloadResponse' + examples: + WIP touchpoint-filtered response: + summary: WIP touchpoint-filtered response + value: + { + "WIP": null + } +components: + schemas: + TaxMetadataResponse: + type: object + required: + - taxMetadataId + - taxCode + - taxPercentageAmount + properties: + taxMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + taxCode: + type: string + example: V09 + taxPercentageAmount: + type: integer + example: 21 + description: + type: string + example: BTW VERKOOP LAAG 9% + ProductTranslationResponse: + type: object + required: + - language + properties: + language: + type: string + example: en + name: + type: string + example: HTM F&F 90% korting + description: + type: string + example: >- + Travel with 90% discount for a week during the first HTM F&F OVpay + pilot! + SellingPriceResponse: + type: object + required: + - sellingPriceId + - amountExclTax + - taxMetadata + - amountInclTax + - fromInclusive + - toInclusive + - internalPrice + properties: + sellingPriceId: + type: integer + example: 1 + amountExclTax: + type: integer + example: 750 + taxMetadata: + $ref: '#/components/schemas/TaxMetadataResponse' + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time-offset + example: '2022-03-01T00:00:00.000+00:00' + toInclusive: + type: string + format: date-time-offset + example: '2022-06-01T00:00:00.000+00:00' + internalPrice: + type: number + example: 908.1234 + PurchasePriceResponse: + type: object + required: + - purchasePriceId + - amountExclTax + - taxMetadata + - amountInclTax + - fromInclusive + - toInclusive + properties: + purchasePriceId: + type: integer + example: 1 + amountExclTax: + type: integer + example: 750 + taxMetadata: + $ref: '#/components/schemas/TaxMetadataResponse' + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time-offset + example: '2022-03-01T00:00:00.000+00:00' + toInclusive: + type: string + format: date-time-offset + example: '2022-06-01T00:00:00.000+00:00' + SalesTouchpointResponse: + type: object + required: + - salesTouchpointId + - name + - isActive + - retailer + properties: + salesTouchpointId: + type: integer + example: 1 + name: + type: string + example: HTM App + isActive: + type: boolean + example: true + retailer: + type: object + required: + - retailerId + - name + properties: + retailerId: + type: integer + example: 1001 + name: + type: string + example: HTM + street: + type: string + example: Kon. Julianaplein + number: + type: string + example: '10' + numberAddition: + type: string + example: a + postalCode: + type: string + example: 2595 AA + city: + type: string + example: Den Haag + country: + type: string + example: Nederland + emailAddress: + type: string + format: email + example: info@htm.nl + phoneNumber: + type: string + example: '09004864636' + taxId: + type: string + example: '09004864636' + imageReference: + type: string + example: https://htm.azure.net/abt/retailers/htm.svg + ProductPayloadListResponse: + type: object + required: + - Entries + properties: + Entries: + type: array + items: + type: object + required: + - productId + properties: + productId: + type: integer + example: 1 + productCode: + type: string + example: 30901-WL + productName: + type: string + example: HTM pilot 90% korting + productDescription: + type: string + example: Reis met 90% korting gedurende de eerste F&F pilot! + productCategory: + type: object + required: + - productCategoryId + - isTravelProduct + - name + properties: + productCategoryId: + type: integer + example: 1 + isTravelProduct: + type: boolean + example: true + name: + type: string + example: Kortingsabonnement + tokenTypes: + type: array + items: + type: object + required: + - tokenTypeId + - name + properties: + tokenTypeId: + type: integer + example: 1 + name: + type: string + example: EMV + sellableTouchPointIds: + type: array + items: + type: integer + example: 3 + amountInclTax: + type: number + example: 100 + imageReference: + type: string + example: https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg + productPageUrl: + type: string + format: uri + example: https://www.htm.nl/nog-onbekende-product-pagina + _links: + type: object + properties: + get_details: + type: object + properties: + href: + type: string + example: https://api.integratielaag.nl/abt/serviceengine/x.x/products/1 + method: + type: string + example: GET + + ProductPayloadResponse: + type: object + required: + - productId + - productOwner + - isRenewable + - isSellableAtHtm + - needsSolvencyCheckConsumer + - needsSolvencyCheckBusiness + properties: + productId: + type: integer + example: 1 + parentProductId: + type: integer + example: 1 + productCode: + type: string + example: 30901-WL + gboPackageTemplateId: + type: string + example: '30901' + tapConnectProductCode: + type: string + example: 1234AB + productGroupMetadata: + type: object + required: + - productGroupMetadataId + - productGroupCode + - department + - costCenter + - costType + - description + - documentCode + - user + - timestampUpdated + - validFrom + properties: + productGroupMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + productGroupCode: + type: string + example: TBD + department: + type: string + example: TBD + costCenter: + type: string + example: TBD + costType: + type: string + example: TBD + description: + type: string + example: TBD + documentCode: + type: string + example: TBD + user: + type: string + example: TBD + timestampUpdated: + type: string + format: date-time-offset + example: '2024-09-03T10:01:34.000+00:00' + validFrom: + type: string + format: date-time-offset + example: '2024-09-03T10:01:34.000+00:00' + validUntil: + type: string + format: date-time-offset + example: '2024-09-03T10:01:34.000+00:00' + productName: + type: string + example: HTM pilot 90% korting + productDescription: + type: string + example: Reis met 90% korting gedurende de eerste F&F pilot! + validityPeriod: + type: object + required: + - validityPeriodId + - fromInclusive + - toInclusive + properties: + validityPeriodId: + type: integer + example: 1 + fromInclusive: + type: string + format: date-time-offset + example: '2024-09-03T10:01:34.000+00:00' + toInclusive: + type: string + format: date-time-offset + example: '2024-09-03T23:59:59.999+00:00' + productTranslations: + type: array + items: + $ref: '#/components/schemas/ProductTranslationResponse' + productOwner: + type: object + required: + - productOwnerId + - name + properties: + productOwnerId: + type: integer + example: 1 + name: + type: string + example: John Doe + organization: + type: string + example: HTM + marketSegmentse: + type: array + items: + type: object + required: + - marketSegmentId + - name + properties: + marketSegmentId: + type: integer + example: 1 + name: + type: string + example: B2C + customerSegments: + type: array + items: + type: object + required: + - customerSegmentId + - name + properties: + customerSegmentId: + type: integer + example: 1 + name: + type: string + example: Kind (4-11) + productCategory: + type: object + required: + - productCategoryId + - name + - isTravelProduct + properties: + productCategoryId: + type: integer + example: 1 + name: + type: string + example: Kortingsabonnement + isTravelProduct: + type: boolean + example: true + requiredCustomerLevel: + type: object + required: + - requiredCustomerLevelId + - name + properties: + requiredCustomerLevelId: + type: integer + example: 1 + name: + type: string + example: anonymous + requiredProducts: + type: array + items: + type: object + required: + - requiredProductId + - productName + properties: + requiredProductId: + type: integer + example: 2 + productName: + type: string + example: Product name + description: + type: string + description: Reason why the product is required + example: Description + incompatibleProducts: + type: array + items: + type: object + required: + - incompatibleProductId + - productName + properties: + incompatibleProductId: + type: integer + example: 4 + productName: + type: string + example: Product name + description: + type: string + description: >- + Reason why the product is incompatible with the selected + product + example: Description + mandatoryCustomerDataItems: + type: array + items: + type: object + required: + - mandatoryCustomerDataItemId + - customerDataItem + properties: + mandatoryCustomerDataItemId: + type: integer + example: 3 + customerDataItem: + type: string + example: dateOfBirth + requiredGboPersonalAttributes: + type: array + description: >- + List of required GBO personal attributes (PAD) - should not be + user-editable, but automatically populated by PMT backend, based on + the selected gboPackageTemplateId (if any) + items: + type: object + required: + - requiredGboPersonalAttributeId + - name + properties: + requiredGboPersonalAttributeId: + type: integer + example: 2 + name: + type: string + example: BIRTHDATE + tokenTypes: + type: array + items: + type: object + required: + - tokenTypeId + - name + properties: + tokenTypeId: + type: integer + example: 1 + name: + type: string + example: EMV + paymentMoment: + type: object + required: + - paymentMomentId + - name + properties: + paymentMomentId: + type: integer + example: 1 + name: + type: string + example: prepaid + serviceOptions: + type: array + items: + type: object + required: + - serviceOptionId + - action + properties: + serviceOptionId: + type: integer + example: 1 + action: + type: string + example: cancellableTermAhead + description: + type: string + example: Per termijn vooruit opzegbaar + validityDuration: + type: string + format: duration + example: P1M + maxStartInFutureDuration: + type: string + format: duration + example: P6W + isRenewable: + type: boolean + example: true + sendInvoice: + type: boolean + example: false + imageReference: + type: string + format: uri + example: https://htm.azure.net/abt/products/product_1.svg + productPageUrl: + type: string + format: uri + example: https://www.htm.nl/nog-onbekende-product-pagina + termsUrl: + type: string + format: uri + example: https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina + isSellableAtHtm: + type: boolean + example: true + needsSolvencyCheckConsumer: + type: boolean + example: false + needsSolvencyCheckBusiness: + type: boolean + example: false + sellingPeriods: + type: array + items: + type: object + required: + - sellingPeriodId + - fromInclusive + - toInclusive + - salesTouchpoint + properties: + sellingPeriodId: + type: integer + example: 1 + fromInclusive: + type: string + format: date-time-offset + example: '2022-03-01T00:00:00.000+00:00' + toInclusive: + type: string + format: date-time-offset + example: '2022-06-01T00:00:00.000+00:00' + salesTouchpoint: + $ref: '#/components/schemas/SalesTouchpointResponse' + forbiddenPaymentMethods: + type: array + items: + type: object + required: + - forbiddenPaymentMethodId + - name + properties: + forbiddenPaymentMethodId: + type: integer + example: 1 + name: + type: string + example: Credit Card + issuer: + type: string + example: American Express + sellingPrices: + type: array + items: + $ref: '#/components/schemas/SellingPriceResponse' + purchasePrices: + type: array + items: + $ref: '#/components/schemas/PurchasePriceResponse' + auditTrail: + type: array + items: + type: object + required: + - auditTrailId + - action + - user + - timestamp + properties: + auditTrailId: + type: integer + example: 1 + action: + type: string + example: insert + user: + type: string + example: username + timestamp: + type: string + format: date-time-offset + example: '2024-09-03T10:01:34.000+00:00' + CreateProductRequest: + required: + - productOwnerId + - isRenewable + - isSellableAtHtm + - needsSolvencyCheckConsumer + - needsSolvencyCheckBusiness + type: object + properties: + parentProductId: + type: integer + description: The ID of the parent product (if any) + example: 1 + productCode: + type: string + description: The HTM-internal product code + example: 30901-WL + gboPackageTemplateId: + type: string + description: >- + The ID of the GBO SalesPackage that should be instantiated after + buying this product + example: '30901' + tapConnectProductCode: + type: string + description: >- + The productCode of the TapConnect product that should be issued + after buying this product + example: 1234AB + productGroupMetadataId: + type: string + format: uuid + description: The ID of the productGroupMetadata for administration in U4F + example: 501B17EF-36C4-4039-B92C-6517969B464E + productName: + type: string + description: The name of the product + example: Test product name + productDescription: + type: string + description: The description of the product + example: Test product description + validityPeriod: + required: + - fromInclusive + - toInclusive + type: object + description: The validity period of the product + properties: + fromInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The start of the validity + period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The end of the validity period + example: '2022-06-01T00:00:00.000' + productTranslations: + type: array + description: Translations of the product name and description + items: + type: object + required: + - language + - name + - description + properties: + language: + type: string + example: en + name: + type: string + example: HTM F&F 90% korting + description: + type: string + example: >- + Travel with 90% discount for a week during the first HTM F&F + OVpay pilot! + productOwnerId: + type: integer + description: The ID of the owner of the product + example: 1 + marketSegmentIds: + type: array + description: The IDs of the market segments that the product is targeted towards + items: + type: integer + example: 1 + customerSegmentIds: + type: array + description: >- + The IDs of the customer segments that the product is targeted + towards + items: + type: integer + example: 1 + productCategoryId: + type: integer + description: The ID of the category the product belongs to + example: 1 + requiredCustomerLevelId: + type: integer + description: >- + The ID of the required customer level to be allowed to purchase the + product + requiredProducts: + type: array + required: + - requiredProductId + description: >- + The IDs of products that should already be owned by the customer + (for travel products, the validity of the given productIds should + fully overlap on the customer's travel medium) + items: + type: object + properties: + requiredProductId: + type: integer + example: 1 + description: + type: string + description: Description of why the product is required + example: Benodigd basisproduct + incompatibleProducts: + type: array + required: + - incompatibleProductId + description: >- + The IDs of products that can not be active at the same time as this + product (for travel products, none of the listed productIds should + have overlapping validity with this product on the customer's travel + medium) + items: + type: object + properties: + incompatibleProductId: + type: integer + example: 1 + description: + type: string + description: Description of why the product is incompatible + example: Kan niet combineren met zichzelf + mandatoryCustomerDataItemIds: + type: array + description: >- + The IDs of the customer data items that should be filled in by the + customer + items: + type: integer + example: 1 + requiredGboPersonalAttributeIds: + type: array + description: >- + GBO specific; the IDs of the GBO Personal Attribute Data (PAD) + elements that should be present (or filled during the order flow) on + the customer's chosen travel medium. This attribute should not be + user-editable, but only be filled by PMT, based on the chosen + gboPackageTemplateId! + items: + type: integer + example: 1 + tokenTypeIds: + type: array + description: The IDs of the token types that the product can be instantiated on + items: + type: integer + example: 1 + paymentMomentId: + type: integer + description: The ID of the payment moment for the product + example: 1 + serviceOptionIds: + type: array + description: The IDs of the service options that are available for this product + items: + type: integer + example: 1 + validityDuration: + type: string + format: duration + description: >- + The validity duration of the product. Should only contain one single + unit of duration (D, W, M, Y) + example: P7D + maxStartInFutureDuration: + type: string + format: duration + description: >- + The maximum amount of time in the future allowed for the start of + the product validity. Should only contain one single unit of + duration (D, W, M, Y) + example: P6W + isRenewable: + type: boolean + description: Indicates if the product is renewable + example: false + sendInvoice: + type: boolean + description: >- + Indicates if an invoice should be sent to the customer after + ordering this product + example: false + imageReference: + type: string + format: uri + description: A reference/URL to the image of the product + example: https://www.htm.nl/nog-onbekende-productafbeelding + productPageUrl: + type: string + format: uri + description: >- + The URL of the product page, to be used by touchpoints which are not + allowed to sell the product, to redirect the customer. If the + product is sold via multiple touchpoints, this URL should point to + the preferred touchpoint for sales + example: https://www.htm.nl/nog-onbekende-productpagina + termsUrl: + type: string + format: uri + description: >- + The URL for the webpage or document containing terms for this + product + example: https://www.htm.nl/nog-onbekende-productvoorwaarden + isSellableAtHtm: + type: boolean + description: >- + Indicates if the product is sellable at HTM. If false, no + sellingPrices/Periods should be defined - this product may only be + used for tracking/reporting purposed, or internal use + needsSolvencyCheckConsumer: + type: boolean + description: >- + Indicates if a solvency check is required for consumers purchasing + the product + needsSolvencyCheckBusiness: + type: boolean + description: >- + Indicates if a solvency check is required for businesses purchasing + the product + sellingPeriods: + type: array + description: >- + The sellingPeriods of the product. Can contain multiple periods for + the same or different touchpoints, as long as there is no overlap + for the same touchpoint + items: + type: object + required: + - fromInclusive + - toInclusive + - salesTouchpointId + properties: + fromInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The start date of the period + example: '2020-01-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The end date of the period + example: '2020-01-01T00:00:00.000' + salesTouchpointId: + type: integer + description: The ID of the touchpoint this period applies to + example: 1 + forbiddenPaymentMethodIds: + type: array + description: >- + The IDs of the payment methods that are not allowed to be used + for this touchpoint and period + items: + type: integer + example: 1 + sellingPrices: + type: array + description: >- + The sellingPrices of this product for the touchpoint defined + in this sellingPeriod. Can contain multiple prices, as long as + there is no overlap in validity + items: + type: object + required: + - amountExclTax + - taxMetadataId + - amountInclTax + - fromInclusive + - toInclusive + - internalPrice + properties: + amountExclTax: + type: integer + example: 750 + taxMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The start date of the + price period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The end date of the + price period + example: '2022-06-01T00:00:00.000' + internalPrice: + type: number + example: 908.1234 + purchasePrices: + type: array + description: >- + The purchasePrices of the product. Can contain multiple prices, as + long as there is no overlap in validity + items: + type: object + required: + - amountExclTax + - taxMetadataId + - amountInclTax + - fromInclusive + - toInclusive + properties: + amountExclTax: + type: integer + example: 750 + taxMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The start date of the price + period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The end date of the price + period + example: '2022-06-01T00:00:00.000' + UpdateProductRequest: + required: + - productOwnerId + - isRenewable + - isSellableAtHtm + - needsSolvencyCheckConsumer + - needsSolvencyCheckBusiness + type: object + properties: + parentProductId: + type: integer + description: The ID of the parent product (if any) + example: 1 + productCode: + type: string + description: The HTM-internal product code + example: 30901-WL + gboPackageTemplateId: + type: string + description: >- + The ID of the GBO SalesPackage that should be instantiated after + buying this product + example: '30901' + tapConnectProductCode: + type: string + description: >- + The productCode of the TapConnect product that should be issued + after buying this product + example: 1234AB + productGroupMetadataId: + type: string + format: uuid + description: The ID of the productGroupMetadata for administration in U4F + example: 501B17EF-36C4-4039-B92C-6517969B464E + productName: + type: string + description: The name of the product + example: Test product name + productDescription: + type: string + description: The description of the product + example: Test product description + validityPeriod: + required: + - fromInclusive + - toInclusive + type: object + description: The validity period of the product + properties: + validityPeriodId: + type: integer + description: >- + Including a validityPeriodId will update the existing + validityPeriod for this product - if omitted, a new + validityPeriod will be created + example: 1 + fromInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The start of the validity + period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The end of the validity period + example: '2022-06-01T00:00:00.000' + productTranslations: + type: array + description: Translations of the product name and description + items: + type: object + required: + - language + - name + - description + properties: + language: + type: string + example: en + name: + type: string + example: HTM F&F 90% korting + description: + type: string + example: >- + Travel with 90% discount for a week during the first HTM F&F + OVpay pilot! + productOwnerId: + type: integer + description: The ID of the owner of the product + example: 1 + marketSegmentIds: + type: array + description: The IDs of the market segments that the product is targeted towards + items: + type: integer + example: 1 + customerSegmentIds: + type: array + description: >- + The IDs of the customer segments that the product is targeted + towards + items: + type: integer + example: 1 + productCategoryId: + type: integer + description: The ID of the category the product belongs to + example: 1 + requiredCustomerLevelId: + type: integer + description: >- + The ID of the required customer level to be allowed to purchase the + product + requiredProducts: + type: array + required: + - requiredProductId + description: >- + The IDs of products that should already be owned by the customer + (for travel products, the validity of the given productIds should + fully overlap on the customer's travel medium) + items: + type: object + properties: + requiredProductId: + type: integer + example: 1 + description: + type: string + description: Description of why the product is required + example: Benodigd basisproduct + incompatibleProducts: + type: array + required: + - incompatibleProductId + description: >- + The IDs of products that can not be active at the same time as this + product (for travel products, none of the listed productIds should + have overlapping validity with this product on the customer's travel + medium) + items: + type: object + properties: + incompatibleProductId: + type: integer + example: 1 + description: + type: string + description: Description of why the product is incompatible + example: Kan niet combineren met zichzelf + mandatoryCustomerDataItemIds: + type: array + description: >- + The IDs of the customer data items that should be filled in by the + customer + items: + type: integer + example: 1 + requiredGboPersonalAttributeIds: + type: array + description: >- + GBO specific; the IDs of the GBO Personal Attribute Data (PAD) + elements that should be present (or filled during the order flow) on + the customer's chosen travel medium. This attribute should not be + user-editable, but only be filled by PMT, based on the chosen + gboPackageTemplateId! + items: + type: integer + example: 1 + tokenTypeIds: + type: array + description: The IDs of the token types that the product can be instantiated on + items: + type: integer + example: 1 + paymentMomentId: + type: integer + description: The ID of the payment moment for the product + example: 1 + serviceOptionIds: + type: array + description: The IDs of the service options that are available for this product + items: + type: integer + example: 1 + validityDuration: + type: string + format: duration + description: >- + The validity duration of the product. Should only contain one single + unit of duration (D, W, M, Y) + example: P7D + maxStartInFutureDuration: + type: string + format: duration + description: >- + The maximum amount of time in the future allowed for the start of + the product validity. Should only contain one single unit of + duration (D, W, M, Y) + example: P6W + isRenewable: + type: boolean + description: Indicates if the product is renewable + example: false + sendInvoice: + type: boolean + description: >- + Indicates if an invoice should be sent to the customer after + ordering this product + example: false + imageReference: + type: string + format: uri + description: A reference/URL to the image of the product + example: https://www.htm.nl/nog-onbekende-productafbeelding + productPageUrl: + type: string + format: uri + description: >- + The URL of the product page, to be used by touchpoints which are not + allowed to sell the product, to redirect the customer. If the + product is sold via multiple touchpoints, this URL should point to + the preferred touchpoint for sales + example: https://www.htm.nl/nog-onbekende-productpagina + termsUrl: + type: string + format: uri + description: >- + The URL for the webpage or document containing terms for this + product + example: https://www.htm.nl/nog-onbekende-productvoorwaarden + isSellableAtHtm: + type: boolean + description: >- + Indicates if the product is sellable at HTM. If false, no + sellingPrices/Periods should be defined - this product may only be + used for tracking/reporting purposed, or internal use + needsSolvencyCheckConsumer: + type: boolean + description: >- + Indicates if a solvency check is required for consumers purchasing + the product + needsSolvencyCheckBusiness: + type: boolean + description: >- + Indicates if a solvency check is required for businesses purchasing + the product + sellingPeriods: + type: array + description: >- + The sellingPeriods of the product. Can contain multiple periods for + the same or different touchpoints, as long as there is no overlap + for the same touchpoint + items: + type: object + required: + - fromInclusive + - toInclusive + - salesTouchpointId + properties: + sellingPeriodId: + type: integer + description: >- + Including a sellingPeriodId will update an existing + sellingPeriod for this product - if omitted, a new + sellingPeriod will be created + example: 1 + fromInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The start date of the period + example: '2020-01-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The end date of the period + example: '2020-01-01T00:00:00.000' + salesTouchpointId: + type: integer + description: The ID of the touchpoint this period applies to + example: 1 + forbiddenPaymentMethodIds: + type: array + description: >- + The IDs of the payment methods that are not allowed to be used + for this touchpoint and period + items: + type: integer + example: 1 + sellingPrices: + type: array + description: >- + The sellingPrices of this product for the touchpoint defined + in this sellingPeriod. Can contain multiple prices, as long as + there is no overlap in validity + items: + type: object + required: + - amountExclTax + - taxMetadataId + - amountInclTax + - fromInclusive + - toInclusive + - internalPrice + properties: + sellingPeriodId: + type: integer + description: >- + Including a sellingPriceId will update an existing + sellingPrice for this product - if omitted, a new + sellingPrice will be created + example: 1 + amountExclTax: + type: integer + example: 750 + taxMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The start date of the + period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: >- + LocalDateTime (without offset) - The end date of the + period + example: '2022-06-01T00:00:00.000' + internalPrice: + type: number + example: 908.1234 + purchasePrices: + type: array + description: >- + The purchasePrices of the product. Can contain multiple prices, as + long as there is no overlap in validity + items: + type: object + required: + - amountExclTax + - taxMetadataId + - amountInclTax + - fromInclusive + - toInclusive + properties: + purchasePriceId: + type: integer + description: >- + Including a purchasePriceId will update an existing + purchasePrice for this product - if omitted, a new + purchasePrice will be created + example: 1 + amountExclTax: + type: integer + example: 750 + taxMetadataId: + type: string + format: uuid + example: 501B17EF-36C4-4039-B92C-6517969B464E + amountInclTax: + type: integer + example: 908 + fromInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The start date of the period + example: '2022-03-01T00:00:00.000' + toInclusive: + type: string + format: date-time + description: LocalDateTime (without offset) - The end date of the period + example: '2022-06-01T00:00:00.000' + CreateOrUpdateProductResponse: + type: object + properties: + productId: + type: integer + example: 22 + 400Response: + type: object + properties: + code: + type: string + example: '400' + type: + type: string + message: + type: string + example: Bad Request + description: + type: string + example: '''2023-02-01 00:00:00'' is not a valid Datetime' + apiErrorCode: + type: string + example: htm.api.err.40xxx + 401Response: + type: object + properties: + code: + type: string + example: '900901' + type: + type: string + message: + type: string + example: Invalid Credentials + description: + type: string + example: >- + Invalid Credentials. Make sure you have provided the correct + security credentials + apiErrorCode: + type: string + example: htm.api.err.40xxx + 403Response: + type: object + properties: + code: + type: string + example: '900901' + type: + type: string + message: + type: string + example: Retailer not authorized + description: + type: string + example: The retailer is not allowed to access resource for requested + apiErrorCode: + type: string + example: htm.api.err.40xxx touchpoint + 404Response: + type: object + properties: + code: + type: string + example: '404' + type: + type: string + example: Status report + message: + type: string + example: Not Found + description: + type: string + example: The requested resource is not available. + apiErrorCode: + type: string + example: htm.api.err.40xxx + 500Response: + type: object + properties: + code: + type: string + example: '500' + type: + type: string + message: + type: string + example: Internal Server Error + description: + type: string + apiErrorCode: + type: string + example: htm.api.err.40xxx