diff --git a/src/dotnet/padp-reference-web/PadpReferenceApi/.gitignore b/src/dotnet/padp-reference-web/PadpReferenceApi/.gitignore new file mode 100644 index 0000000..bfc4102 --- /dev/null +++ b/src/dotnet/padp-reference-web/PadpReferenceApi/.gitignore @@ -0,0 +1,307 @@ +######################## +## ## +## CUSTOM IGNORE LIST ## +## ## +######################## + +# Ignore appsettings.json as it contains credentials - only the template should be shared! +appsettings.json + +# Also ignore pfx and pem files for the same reason +*.pfx +*.pem + + + + + + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# VS Code +.vscode/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs \ No newline at end of file diff --git a/src/openapi/products/products-crud-v2.4.yaml b/src/openapi/products/products-crud-v2.4.yaml new file mode 100644 index 0000000..1d64415 --- /dev/null +++ b/src/openapi/products/products-crud-v2.4.yaml @@ -0,0 +1,3347 @@ +openapi: 3.0.1 +info: + title: ABTProducts + description: >- + CRUD APIs for HTM products (based on the new domainmodel v2.4). Internal use + only; external touchpoints can get read-only, filtered access via the HTM + Service Engine, using a different endpoint. + version: '1.0' +servers: + - url: https://api.integratielaag.nl/abt/products/1.0 +tags: + - name: ABTProducts CRUD + description: >- + Internal use only; external touchpoints can get read-only, filtered access + via the HTM Service Engine. +paths: + /products: + get: + tags: + - ABTProducts CRUD + summary: Get a list of all defined HTM products + description: |- + Get a list of all HTM products that refer to a given parentProductId (or without parent, if not specified), without any other filters. \ + 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 (when a touchpoint HTTP header is present) + only products that have active sellingPeriods for touchpoints within the same + retailer as the calling retailer 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": [] + } + getListOneProductNoSellingPeriodsNoTouchpointId: + summary: List containing one product without any SellingPeriods (no touchpointId in HTTP-headers) + description: All products are returned, even if they have no activesellingPeriods + value: + { + "Entries": [ + { + "productId": 1, + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "sellableTouchpointIds": null, + "amountInclTax": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + } + ] + } + getListOneProductNoTouchpointId: + summary: List containing one product with 4 currently active SellingPeriods (no touchpointId in HTTP-headers) + description: All products are returned, even if they have no active SellingPeriods + value: + { + "Entries": [ + { + "productId": 2, + "productName": "HTM dagkaart", + "productDescription": "Reis een dag met het openbaar vervoer bij HTM", + "productCategory": { + "productCategoryId": 6, + "isTravelProduct": false, + "name": "Barcode" + }, + "tokenTypes": null, + "sellableTouchpointIds": [ + 1, + 2, + 3, + 4 + ], + "amountInclTax": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + } + ] + } + getListOneProductTouchpointId3: + summary: List containing one product with 4 currently active SellingPeriods (touchpointId 3 in HTTP-headers) + description: Only products that have active sellingPeriods for touchpoint 3 and/or 4 (part of same retailer) are returned + value: + { + "Entries": [ + { + "productId": 2, + "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" + } + ] + } + getListMultipleProductsNoTouchpointId: + summary: List containing multiple products (no touchpointId in HTTP-headers) + description: All products are returned, even if they have no active SellingPeriods + value: + { + "Entries": [ + { + "productId": 1, + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "sellableTouchpointIds": null, + "amountInclTax": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + }, + { + "productId": 2, + "productName": "HTM dagkaart", + "productDescription": "Reis een dag met het openbaar vervoer bij HTM", + "productCategory": { + "productCategoryId": 6, + "isTravelProduct": false, + "name": "Barcode" + }, + "tokenTypes": null, + "sellableTouchpointIds": [ + 1, + 2, + 3, + 4 + ], + "amountInclTax": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + }, + { + "productId": 3, + "productName": "HTM 20% korting", + "productDescription": "Reis een maand lang met 20% korting!", + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "sellableTouchpointIds": [ + 1, + 2 + ], + "amountInclTax": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + }, + { + "productId": 4, + "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": null, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina" + } + ] + } + getListMultipleProductsTuchpointId1: + summary: List containing multiple products (touchpointId 3 in HTTP-headers) + description: Only products that have active SellingPeriods for touchpoint 3 and/or 4 (part of same retailer) are returned + value: + { + "Entries": [ + { + "productId": 2, + "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" + }, + { + "productId": 4, + "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" + } + ] + } + '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' + post: + tags: + - ABTProducts CRUD + summary: >- + Persist a new HTM product as defined in the request body, after + successful validation + description: >- + Persist a new HTM product as defined in the raw JSON request body, but + only after successful validation of the entire request body. When any + (subset of) validation fails, nothing is persisted in the underlying + database. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProductRequest' + examples: + postMinimalProduct: + summary: >- + Minimum request body (to be used as minimal parent-template + for hierarchical products) + value: + { + "productOwnerId": 1, + "isRenewable": false, + "isSellableAtHtm": false, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false + } + postGboProduct: + summary: Add new GBO product (non-renewable) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 1, + "requiredCustomerLevelId": 1, + "incompatibleProducts": [ + { + "incompatibleProductId": 1, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 4, + 5 + ], + "tokenTypeIds": [ + 1 + ], + "paymentMomentId": 1, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "salesTouchpointId": 3, + "sellingPrices": [ + { + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + } + ] + } + ], + "purchasePrices": [ + { + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + } + ] + } + postGboProductMultiplePeriods: + summary: >- + Add new GBO product (non-renewable, multiple + sellingPeriods/prices per period) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 1, + "requiredCustomerLevelId": 1, + "incompatibleProducts": [ + { + "incompatibleProductId": 2, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 4, + 5 + ], + "tokenTypeIds": [ + 1 + ], + "paymentMomentId": 1, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "salesTouchpointId": 3, + "sellingPrices": [ + { + "amountExclTax": 92, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", + "amountInclTax": 100, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + }, + { + "amountExclTax": 101, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", + "amountInclTax": 110, + "fromInclusive": "2025-01-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "internalPrice": 101.0000 + } + ] + }, + { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "salesTouchpointId": 2, + "sellingPrices": [ + { + "amountExclTax": 92, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", + "amountInclTax": 100, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + }, + { + "amountExclTax": 101, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", + "amountInclTax": 110, + "fromInclusive": "2025-01-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "internalPrice": 101.0000 + } + ] + } + ], + "purchasePrices": [ + { + "amountExclTax": 0, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", + "amountInclTax": 0, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999" + } + ] + } + postGboPadProduct: + summary: >- + Add new GBO product (PAD required, renewable, serviceOptions, + forbiddenPaymentMethods) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "35301", + "productName": "HTM Regio Vrij DH73", + "productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in het gekozen gebied in de regio Rotterdam Den Haag.", + "validityPeriod": { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM Regio Free DH73", + "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 3, + "requiredCustomerLevelId": 3, + "requiredProducts": [ + { + "requiredProductId": 1, + "description": "Basisproduct nodig" + } + ], + "incompatibleProducts": [ + { + "incompatibleProductId": 3, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 3, + 4, + 5, + 6 + ], + "requiredGboPersonalAttributeIds": [ + 1, + 2, + 3 + ], + "tokenTypeIds": [ + 1, + 2, + 3 + ], + "paymentMomentId": 1, + "serviceOptionIds": [ + 1, + 2 + ], + "validityDuration": "P1M", + "maxStartInFutureDuration": "P6W", + "isRenewable": true, + "sendInvoice": true, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "salesTouchpointId": 3, + "forbiddenPaymentMethodIds": [ + 1 + ], + "sellingPrices": [ + { + "amountExclTax": 5413, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464E", + "amountInclTax": 5900, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 5413.0000 + } + ] + } + ], + "purchasePrices": [ + { + "amountExclTax": 0, + "taxMetadataId": "501B17EF-36C4-4039-B92C-6517969B464F", + "amountInclTax": 0, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + } + ] + } + postGboProductSupplement: + summary: TODO - Add new GBO product (supplement with requirements) + value: + { + "productName": "TODO" + } + postTapConnectProduct: + summary: TODO - Add new TapConnect product + value: + { + "productName": "TODO" + } + postIbanMandate: + summary: TODO - Add new IBAN mandate (functional product) + value: + { + "productName": "TODO" + } + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CreateOrUpdateProductResponse' + '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: + - ABTProducts CRUD + summary: Get full details of a single HTM product, specified by the productId + description: >- + Get full details of a single HTM product, specified by the productId, + without any filtering. External consumers can get access to a filtered + view via the HTM Service Engine, only receiving the information that is + allowed to be seen by the touchpointId of the consumer. + 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: + getDetailsGboNonRenewable: + summary: GBO product (non-renewable) + value: + { + "productId": 1, + "parentProductId": null, + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "tapConnectProductCode": null, + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "validityPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwner": { + "productOwnerId": 1, + "name": "Corneel Verstoep", + "organization": "HTM" + }, + "marketSegments": [ + { + "marketSegmentId": 1, + "name": "B2C" + } + ], + "customerSegments": [ + { + "customerSegmentId": 6, + "name": "Student" + }, + { + "customerSegmentId": 7, + "name": "Ooievaarspas-gerechtigde" + } + ], + "allowedGboAgeProfiles": [ + { + "gboAgeProfileId": 2, + "name": "Kind (4 t/m 11 jaar)", + "ageFromInclusive": 4, + "ageUntilInclusive": 11 + }, + { + "gboAgeProfileId": 3, + "name": "Jongere (12 t/m 18 jaar)", + "ageFromInclusive": 12, + "ageUntilInclusive": 18 + } + ], + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "requiredCustomerLevel": { + "requiredCustomerLevelId": 1, + "name": "anonymous" + }, + "requiredProducts": null, + "incompatibleProducts": [ + { + "incompatibleProductId": 1, + "productName": "HTM pilot 90% korting", + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItems": [ + { + "mandatoryCustomerDataItemId": 4, + "customerDataItem": "emailAddress" + }, + { + "mandatoryCustomerDataItemId": 5, + "customerDataItem": "ovPayToken" + } + ], + "requiredGboPersonalAttributes": null, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "paymentMoment": { + "paymentMomentId": 1, + "name": "prepaid" + }, + "serviceOptions": null, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "salesTouchpoint": { + "salesTouchpointId": 3, + "name": "Website (Perplex)", + "isActive": true, + "retailer": { + "retailerId": 1001, + "name": "HTM externe touchpoints", + "street": "Koningin Julianaplein", + "number": "10", + "numberAddition": null, + "postalCode": "2595 AA", + "city": "Den Haag", + "country": "Nederland", + "emailAddress": "info@htm.nl", + "phoneNumber": "070 374 9002", + "taxId": "572309345923", + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg" + } + }, + "forbiddenPaymentMethods": null, + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "internalPrice": 92.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountInclTax": 0, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00" + } + ], + "auditTrail": [ + { + "auditTrailId": 2, + "action": "update", + "user": "api", + "timestamp": "2024-09-03T08:39:38.000+00:00" + }, + { + "auditTrailId": 1, + "action": "insert", + "user": "api", + "timestamp": "2024-09-03T08:38:24.000+00:00" + } + ] + } + getDetailsGboProductMultiplePeriods: + summary: GBO product (non-renewable, multiple sellingPeriods/prices per period) + value: + { + "productId": 2, + "parentProductId": null, + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "tapConnectProductCode": null, + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "validityPeriodId": 2, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwner": { + "productOwnerId": 1, + "name": "Corneel Verstoep", + "organization": "HTM" + }, + "marketSegments": [ + { + "marketSegmentId": 1, + "name": "B2C" + } + ], + "customerSegments": [ + { + "customerSegmentId": 6, + "name": "Student" + }, + { + "customerSegmentId": 7, + "name": "Ooievaarspas-gerechtigde" + } + ], + "allowedGboAgeProfiles": [ + { + "gboAgeProfileId": 2, + "name": "Kind (4 t/m 11 jaar)", + "ageFromInclusive": 4, + "ageUntilInclusive": 11 + }, + { + "gboAgeProfileId": 3, + "name": "Jongere (12 t/m 18 jaar)", + "ageFromInclusive": 12, + "ageUntilInclusive": 18 + } + ], + "productCategory": { + "productCategoryId": 1, + "isTravelProduct": true, + "name": "Kortingsabonnement" + }, + "requiredCustomerLevel": { + "requiredCustomerLevelId": 1, + "name": "anonymous" + }, + "requiredProducts": null, + "incompatibleProducts": [ + { + "incompatibleProductId": 2, + "productName": "HTM pilot 90% korting", + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItems": [ + { + "mandatoryCustomerDataItemId": 4, + "customerDataItem": "emailAddress" + }, + { + "mandatoryCustomerDataItemId": 5, + "customerDataItem": "ovPayToken" + } + ], + "requiredGboPersonalAttributes": null, + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + } + ], + "paymentMoment": { + "paymentMomentId": 1, + "name": "prepaid" + }, + "serviceOptions": null, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00", + "salesTouchpoint": { + "salesTouchpointId": 3, + "name": "Website (Perplex)", + "isActive": true, + "retailer": { + "retailerId": 1001, + "name": "HTM externe touchpoints", + "street": "Koningin Julianaplein", + "number": "10", + "numberAddition": null, + "postalCode": "2595 AA", + "city": "Den Haag", + "country": "Nederland", + "emailAddress": "info@htm.nl", + "phoneNumber": "070 374 9002", + "taxId": "572309345923", + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg" + } + }, + "forbiddenPaymentMethods": null, + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 92, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountInclTax": 100, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "internalPrice": 92.0000 + }, + { + "sellingPriceId": 2, + "amountExclTax": 101, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountInclTax": 110, + "fromInclusive": "2025-01-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00", + "internalPrice": 101.0000 + } + ] + }, + { + "sellingPeriodId": 2, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00", + "salesTouchpoint": { + "salesTouchpointId": 2, + "name": "SMP (Team Incident Masters)", + "isActive": false, + "retailer": { + "retailerId": 1000, + "name": "HTM interne touchpoints", + "street": "Koningin Julianaplein", + "number": "10", + "numberAddition": null, + "postalCode": "2595 AA", + "city": "Den Haag", + "country": "Nederland", + "emailAddress": "info@htm.nl", + "phoneNumber": "070 374 9002", + "taxId": "572309345923", + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg" + } + }, + "forbiddenPaymentMethods": null, + "sellingPrices": [ + { + "sellingPriceId": 3, + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "internalPrice": 92.0000 + }, + { + "sellingPriceId": 4, + "amountExclTax": 101, + "amountInclTax": 110, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2025-01-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00", + "internalPrice": 101.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2025-12-31T23:59:59.999+00:00" + } + ], + "auditTrail": [ + { + "auditTrailId": 2, + "action": "update", + "user": "api", + "timestamp": "2024-09-03T08:39:38.000+00:00" + }, + { + "auditTrailId": 1, + "action": "insert", + "user": "api", + "timestamp": "2024-09-03T08:38:24.000+00:00" + } + ] + } + getDetailsGboPadProduct: + summary: GBO product (PAD required, renewable, serviceOptions, forbiddenPaymentMethods) + value: + { + "productId": 3, + "parentProductId": null, + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "35301", + "tapConnectProductCode": null, + "productName": "HTM Regio Vrij DH73", + "productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in het gekozen gebied in de regio Rotterdam Den Haag.", + "validityPeriod": { + "validityPeriodId": 3, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM Regio Free DH73", + "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." + } + ], + "productOwner": { + "productOwnerId": 1, + "name": "Corneel Verstoep", + "organization": "HTM" + }, + "marketSegments": [ + { + "marketSegmentId": 1, + "name": "B2C" + } + ], + "customerSegments": [ + { + "customerSegmentId": 6, + "name": "Student" + }, + { + "customerSegmentId": 7, + "name": "Ooievaarspas-gerechtigde" + } + ], + "allowedGboAgeProfiles": [ + { + "gboAgeProfileId": 2, + "name": "Kind (4 t/m 11 jaar)", + "ageFromInclusive": 4, + "ageUntilInclusive": 11 + }, + { + "gboAgeProfileId": 3, + "name": "Jongere (12 t/m 18 jaar)", + "ageFromInclusive": 12, + "ageUntilInclusive": 18 + } + ], + "productCategory": { + "productCategoryId": 3, + "isTravelProduct": true, + "name": "Afgekocht reisrecht" + }, + "requiredCustomerLevel": { + "requiredCustomerLevelId": 3, + "name": "account" + }, + "requiredProducts": null, + "incompatibleProducts": [ + { + "incompatibleProductId": 3, + "productName": "HTM Regio Vrij DH73", + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItems": [ + { + "mandatoryCustomerDataItemId": 3, + "customerDataItem": "dateOfBirth" + }, + { + "mandatoryCustomerDataItemId": 4, + "customerDataItem": "emailAddress" + }, + { + "mandatoryCustomerDataItemId": 5, + "customerDataItem": "ovPayToken" + }, + { + "mandatoryCustomerDataItemId": 6, + "customerDataItem": "directDebitMandate" + } + ], + "requiredGboPersonalAttributes": [ + { + "requiredGboPersonalAttributeId": 1, + "name": "NAME" + }, + { + "requiredGboPersonalAttributeId": 2, + "name": "BIRTHDATE" + }, + { + "requiredGboPersonalAttributeId": 3, + "name": "PHOTO" + } + ], + "tokenTypes": [ + { + "tokenTypeId": 1, + "name": "EMV" + }, + { + "tokenTypeId": 2, + "name": "OVpas physical" + }, + { + "tokenTypeId": 3, + "name": "OVpas digital" + } + ], + "paymentMoment": { + "paymentMomentId": 1, + "name": "prepaid" + }, + "serviceOptions": [ + { + "serviceOptionId": 1, + "action": "cancellableTermAhead", + "description": "Per termijn vooruit opzegbaar" + }, + { + "serviceOptionId": 2, + "action": "cancellableWithin14Days", + "description": "Binnen 14 dagen na aanschaf opzegbaar, met restitutie en herberekening ritten met product" + } + ], + "validityDuration": "P1M", + "maxStartInFutureDuration": "P6W", + "isRenewable": true, + "sendInvoice": true, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 5, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "salesTouchpoint": { + "salesTouchpointId": 3, + "name": "Website (Perplex)", + "isActive": true, + "retailer": { + "retailerId": 1001, + "name": "HTM externe touchpoints", + "street": "Koningin Julianaplein", + "number": "10", + "numberAddition": null, + "postalCode": "2595 AA", + "city": "Den Haag", + "country": "Nederland", + "emailAddress": "info@htm.nl", + "phoneNumber": "070 374 9002", + "taxId": "572309345923", + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg" + } + }, + "forbiddenPaymentMethods": [ + { + "forbiddenPaymentMethodId": 1, + "name": "Credit Card", + "issuer": "American Express" + } + ], + "sellingPrices": [ + { + "sellingPriceId": 5, + "amountExclTax": 5413, + "amountInclTax": 5900, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00", + "internalPrice": 5413.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountInclTax": 0, + "fromInclusive": "2024-09-01T00:00:00.000+00:00", + "toInclusive": "2024-12-31T23:59:59.999+00:00" + } + ], + "auditTrail": [ + { + "auditTrailId": 2, + "action": "update", + "user": "api", + "timestamp": "2024-09-03T08:39:38.000+00:00" + }, + { + "auditTrailId": 1, + "action": "insert", + "user": "api", + "timestamp": "2024-09-03T08:38:24.000+00:00" + } + ] + } + getDetailsGboProductSupplement: + summary: TODO - GBO product (supplement with requirements) + value: + { + "productName": "TODO" + } + getDetailsTapConnectProduct: + summary: TODO - TapConnect product + value: + { + "productName": "TODO" + } + getDetailsIbanMandate: + summary: TODO - IBAN mandate (functional product) + value: + { + "productName": "TODO" + } + '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' + put: + tags: + - ABTProducts CRUD + summary: >- + Replace the entire product (as specified by the productId) with the + given raw JSON request body, after successful validation + description: >- + For nested JSON, including id's for reference tables indicates an update + of an existing reference - no id's indicates a new reference + parameters: + - name: productId + in: path + required: true + style: simple + description: The id of the product to replace/update + schema: + type: integer + example: 1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProductRequest' + examples: + updateMinimalProduct: + summary: >- + Minimum request body (to be used as minimal parent-template + for hierarchical products) + value: + { + "productOwnerId": 1, + "isRenewable": false, + "isSellableAtHtm": false, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false + } + updateGboProduct: + summary: Update existing GBO product (non-renewable) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "validityPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 1, + "requiredCustomerLevelId": 1, + "incompatibleProducts": [ + { + "incompatibleProductId": 1, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 4, + 5 + ], + "tokenTypeIds": [ + 1 + ], + "paymentMomentId": 1, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "salesTouchpointId": 3, + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + } + ] + } + advancedUpdateGboProduct: + summary: >- + Advanced update (remove mandatoryCustomerDataItem references, + add new second sellingPeriod) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "validityPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 1, + "requiredCustomerLevelId": 1, + "incompatibleProducts": [ + { + "incompatibleProductId": 1, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": null, + "tokenTypeIds": [ + 1 + ], + "paymentMomentId": 1, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "salesTouchpointId": 3, + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 92, + "taxCode": "V09", + "taxPercentage": 9.0000, + "amountInclTax": 100, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + } + ] + }, + { + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "salesTouchpointId": 2, + "sellingPrices": [ + { + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + }, + { + "amountExclTax": 101, + "amountInclTax": 110, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2025-01-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "internalPrice": 101.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + } + ] + } + updateGboProductMultiplePeriods: + summary: >- + Update existing GBO product (non-renewable, multiple + sellingPeriods/prices per period) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "30901", + "productName": "HTM pilot 90% korting", + "productDescription": "Reis met 90% korting gedurende de eerste F&F pilot!", + "validityPeriod": { + "validityPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM pilot 90% discount", + "description": "Travel with 90% discount during the first F&F pilot!" + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 1, + "requiredCustomerLevelId": 1, + "incompatibleProducts": [ + { + "incompatibleProductId": 2, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 4, + 5 + ], + "tokenTypeIds": [ + 1 + ], + "paymentMomentId": 1, + "validityDuration": "P7D", + "maxStartInFutureDuration": "P6W", + "isRenewable": false, + "sendInvoice": false, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "salesTouchpointId": 3, + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + }, + { + "sellingPriceId": 2, + "amountExclTax": 101, + "amountInclTax": 110, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2025-01-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "internalPrice": 101.0000 + } + ] + }, + { + "sellingPeriodId": 2, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "salesTouchpointId": 2, + "sellingPrices": [ + { + "sellingPriceId": 3, + "amountExclTax": 92, + "amountInclTax": 100, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 92.0000 + }, + { + "sellingPriceId": 4, + "amountExclTax": 101, + "amountInclTax": 110, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2025-01-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999", + "internalPrice": 101.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2025-12-31T23:59:59.999" + } + ] + } + updateGboPadProduct: + summary: >- + Update existing GBO product (PAD required, renewable, + serviceOptions, forbiddenPaymentMethods) + value: + { + "fikoArticleNumber": "1234", + "gboPackageTemplateId": "35301", + "productName": "HTM Regio Vrij DH73", + "productDescription": "Voor een vast bedrag onbeperkt reizen met EBS, HTM en RET in het gekozen gebied in de regio Rotterdam Den Haag.", + "validityPeriod": { + "validityPeriodId": 3, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + }, + "productTranslations": [ + { + "language": "en", + "name": "HTM Regio Free DH73", + "description": "For a fixed amount unlimited travel with EBS, HTM and RET in the chosen area in the Rotterdam The Hague region." + } + ], + "productOwnerId": 1, + "marketSegmentIds": [ + 1 + ], + "customerSegmentIds": [ + 6, + 7 + ], + "allowedGboAgeProfileIds": [ + 1, + 2 + ], + "productCategoryId": 3, + "requiredCustomerLevelId": 3, + "requiredProducts": [ + { + "requiredProductId": 1, + "description": "Basisproduct nodig" + } + ], + "incompatibleProducts": [ + { + "incompatibleProductId": 3, + "description": "Kan niet combineren met zichzelf" + } + ], + "mandatoryCustomerDataItemIds": [ + 3, + 4, + 5, + 6 + ], + "requiredGboPersonalAttributeIds": [ + 1, + 2, + 3 + ], + "tokenTypeIds": [ + 1, + 2, + 3 + ], + "paymentMomentId": 1, + "serviceOptionIds": [ + 1, + 2 + ], + "validityDuration": "P1M", + "maxStartInFutureDuration": "P6W", + "isRenewable": true, + "sendInvoice": true, + "imageReference": "https://www.htm.nl/media/leif2leu/htm-logo-mobile.svg", + "productPageUrl": "https://www.htm.nl/nog-onbekende-product-pagina", + "termsUrl": "https://www.htm.nl/nog-onbekende-productvoorwaarden-pagina", + "isSellableAtHtm": true, + "needsSolvencyCheckConsumer": false, + "needsSolvencyCheckBusiness": false, + "sellingPeriods": [ + { + "sellingPeriodId": 1, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "salesTouchpointId": 3, + "forbiddenPaymentMethodIds": [ + 1 + ], + "sellingPrices": [ + { + "sellingPriceId": 1, + "amountExclTax": 5413, + "amountInclTax": 5900, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999", + "internalPrice": 5413.0000 + } + ] + } + ], + "purchasePrices": [ + { + "purchasePriceId": 1, + "amountExclTax": 0, + "amountInclTax": 0, + "taxCode": "V09", + "taxPercentage": 9.0000, + "fromInclusive": "2024-09-01T00:00:00.000", + "toInclusive": "2024-12-31T23:59:59.999" + } + ] + } + updateGboProductSupplement: + summary: TODO - Update existing GBO product (supplement with requirements) + value: + { + "productName": "TODO" + } + updateTapConnectProduct: + summary: TODO - Update existing TapConnect product + value: + { + "productName": "TODO" + } + updateIbanMandate: + summary: TODO - Update existing IBAN mandate (functional product) + value: + { + "productName": "TODO" + } + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CreateOrUpdateProductResponse' + '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' +components: + schemas: + GboAgeProfileResponse: + type: object + required: + - gboAgeProfileId + - name + - ageFromInclusive + - ageUntilInclusive + properties: + gboAgeProfileId: + type: integer + example: 1 + name: + type: string + example: Kind (4 t/m 11 jaar) + ageFromInclusive: + type: integer + description: The minimum age that the GBO age profile applies to + example: 4 + ageUntilInclusive: + type: integer + description: The maximum age that the GBO age profile applies to + example: 11 + 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 + - taxCode + - taxPercentage + - amountInclTax + - fromInclusive + - toInclusive + - internalPrice + properties: + sellingPriceId: + type: integer + example: 1 + amountExclTax: + type: integer + example: 750 + taxCode: + type: string + example: 'V09' + taxPercentage: + type: number + example: 9.0000 + 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 + - amountInclTax + - fromInclusive + - toInclusive + properties: + purchasePriceId: + type: integer + example: 1 + amountExclTax: + type: integer + example: 750 + taxCode: + type: string + example: 'V09' + taxPercentage: + type: number + example: 9.0000 + 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 + 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 + ProductPayloadResponse: + type: object + required: + - productId + - productOwner + - isRenewable + - isSellableAtHtm + - needsSolvencyCheckConsumer + - needsSolvencyCheckBusiness + properties: + productId: + type: integer + example: 1 + parentProductId: + type: integer + example: 1 + fikoArticleNumber: + type: string + description: The article number of the product in FIKO + example: 1234 + gboPackageTemplateId: + type: string + example: '30901' + tapConnectProductCode: + type: string + example: 1234AB + 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) + allowedGboAgeProfiles: + type: array + items: + type: object + $ref: '#/components/schemas/GboAgeProfileResponse' + 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 + fikoArticleNumber: + type: string + description: The article number of the product in FIKO + example: 1234 + 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 + 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 + allowedGboAgeProfileIds: + type: array + description: The IDs of the allowed GBO age profiles + 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 + - taxCode + - taxPercentage + - amountInclTax + - fromInclusive + - toInclusive + - internalPrice + properties: + amountExclTax: + type: integer + example: 750 + taxCode: + type: string + example: 'V09' + taxPercentage: + type: number + example: 9.0000 + 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 + - taxCode + - taxPercentage + - amountInclTax + - fromInclusive + - toInclusive + properties: + amountExclTax: + type: integer + example: 750 + taxCode: + type: string + example: 'V09' + taxPercentage: + type: number + example: 9.0000 + 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 + fikoArticleNumber: + type: string + description: The article number of the product in FIKO + example: 1234 + 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 + 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 + allowedGboAgeProfileIds: + type: array + description: The IDs of the allowed GBO age profiles + 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 + - amountInclTax + - taxCode + - taxPercentage + - 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 + amountInclTax: + type: integer + example: 908 + taxCode: + type: string + example: V09 + taxPercentage: + type: number + example: 9.0000 + 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 + - amountInclTax + - taxCode + - taxPercentage + - 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 + amountInclTax: + type: integer + example: 908 + taxCode: + type: string + example: V09 + taxPercentage: + type: number + example: 9.0000 + 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