From 06a25c4e1b2d051ddd66822168ce2dfebc94c3db Mon Sep 17 00:00:00 2001 From: harshrsys <67738151+harshrsys@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:00:36 +0530 Subject: [PATCH] feat: support payone iDeal payment method (#974) Co-authored-by: Silke --- src/app/core/core.module.ts | 2 + .../payment-payone.interceptor.ts | 60 +++++++++++++++++++ .../payment-method/payment-method.mapper.ts | 5 +- src/assets/i18n/de_DE.json | 1 + src/assets/i18n/en_US.json | 1 + src/assets/i18n/fr_FR.json | 1 + 6 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/app/core/interceptors/payment-payone.interceptor.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7e1a8f5c4b..e2d61dd53e 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -11,6 +11,7 @@ import { IdentityProviderModule } from './identity-provider.module'; import { ICMErrorMapperInterceptor } from './interceptors/icm-error-mapper.interceptor'; import { IdentityProviderInterceptor } from './interceptors/identity-provider.interceptor'; import { MockInterceptor } from './interceptors/mock.interceptor'; +import { PaymentPayoneInterceptor } from './interceptors/payment-payone.interceptor'; import { InternationalizationModule } from './internationalization.module'; import { StateManagementModule } from './state-management.module'; import { DefaultErrorHandler } from './utils/default-error-handler'; @@ -33,6 +34,7 @@ import { DefaultErrorHandler } from './utils/default-error-handler'; useClass: IdentityProviderInterceptor, multi: true, }, + { provide: HTTP_INTERCEPTORS, useClass: PaymentPayoneInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: MockInterceptor, multi: true }, { provide: ErrorHandler, useClass: DefaultErrorHandler }, { diff --git a/src/app/core/interceptors/payment-payone.interceptor.ts b/src/app/core/interceptors/payment-payone.interceptor.ts new file mode 100644 index 0000000000..10508f5296 --- /dev/null +++ b/src/app/core/interceptors/payment-payone.interceptor.ts @@ -0,0 +1,60 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable, map } from 'rxjs'; + +import { PaymentMethodBaseData, PaymentMethodData } from 'ish-core/models/payment-method/payment-method.interface'; + +@Injectable() +export class PaymentPayoneInterceptor implements HttpInterceptor { + /** + * Map eligible payment method data for specified payone payment methods + * + * @param body : The response body + * @returns The mapped response body + */ + private mapEligiblePaymentMethods(body: PaymentMethodData): PaymentMethodData { + if (body.data?.length) { + return { + ...body, + data: body.data.map(paymentMethod => + paymentMethod.serviceID === 'Payone_IDeal' ? this.mapPayoneIDealParameters(paymentMethod) : paymentMethod + ), + }; + } + + return body; + } + + /** + * Map Payone Ideal Bank group options, provide an error message key for the required validator + * This workaround will be obsolete if the REST api comply with the correct data format + * + * @param paymentMethod The iDeal payment method data + * @returns The mapped payment method data + */ + private mapPayoneIDealParameters(paymentMethod: PaymentMethodBaseData): PaymentMethodBaseData { + const options = paymentMethod.hostedPaymentPageParameters?.map(param => { + return { displayName: param.value, id: param.name }; + }); + + const parameterDefinitions = paymentMethod.parameterDefinitions?.map(data => { + const constraints = data.constraints.required + ? { ...data.constraints, required: { message: 'checkout.bankGroup.error.required' } } + : data.constraints; + return data.name === 'bankGroupCode' ? { ...data, constraints, options } : data; + }); + + return { ...paymentMethod, parameterDefinitions }; + } + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + return next.handle(req).pipe( + map(event => { + if (event instanceof HttpResponse && event.url.includes('/eligible-payment-methods')) { + return event.clone({ body: this.mapEligiblePaymentMethods(event.body) }); + } + return event; + }) + ); + } +} diff --git a/src/app/core/models/payment-method/payment-method.mapper.ts b/src/app/core/models/payment-method/payment-method.mapper.ts index 9ef791bbcc..b573651efb 100644 --- a/src/app/core/models/payment-method/payment-method.mapper.ts +++ b/src/app/core/models/payment-method/payment-method.mapper.ts @@ -39,7 +39,7 @@ export class PaymentMethodMapper { included?.paymentInstruments && data.paymentInstruments ? data.paymentInstruments.map(id => included.paymentInstruments[id]) : undefined, - parameters: data.parameterDefinitions ? PaymentMethodMapper.mapParameter(data.parameterDefinitions) : undefined, + parameters: PaymentMethodMapper.mapParameter(data.parameterDefinitions), hostedPaymentPageParameters: data.serviceID === 'Concardis_DirectDebit' ? PaymentMethodMapper.mapSEPAMandateInformation(data.hostedPaymentPageParameters) @@ -160,6 +160,9 @@ export class PaymentMethodMapper { * maps form parameter if there are some (like credit card or direct debit) */ private static mapParameter(parametersData: PaymentMethodParameterType[]): FormlyFieldConfig[] { + if (!parametersData) { + return; + } return parametersData.map(p => { const param: FormlyFieldConfig = { key: p.name, diff --git a/src/assets/i18n/de_DE.json b/src/assets/i18n/de_DE.json index 66f4666de8..28799bb878 100644 --- a/src/assets/i18n/de_DE.json +++ b/src/assets/i18n/de_DE.json @@ -613,6 +613,7 @@ "checkout.addresses.shipping_address.heading": "Lieferadresse", "checkout.addresses.shipping_address.option1.text": "An Rechnungsadresse liefern", "checkout.addresses.shipping_address.option2.text": "An abweichende Adresse liefern", + "checkout.bankGroup.error.required": "Bitte wählen Sie eine Bankgruppe aus.", "checkout.button.label": "Bestellvorgang fortsetzen", "checkout.cancel.button.label": "Abbrechen", "checkout.cart.estimated_shipping_handling.label": "Versand (voraussichtlich)", diff --git a/src/assets/i18n/en_US.json b/src/assets/i18n/en_US.json index c78ca54139..31c5fd1c03 100644 --- a/src/assets/i18n/en_US.json +++ b/src/assets/i18n/en_US.json @@ -613,6 +613,7 @@ "checkout.addresses.shipping_address.heading": "Shipping Address", "checkout.addresses.shipping_address.option1.text": "Ship to the above invoice address", "checkout.addresses.shipping_address.option2.text": "Ship to a different address", + "checkout.bankGroup.error.required": "Please select a bank group.", "checkout.button.label": "Continue Checkout", "checkout.cancel.button.label": "Cancel", "checkout.cart.estimated_shipping_handling.label": "Estimated Shipping", diff --git a/src/assets/i18n/fr_FR.json b/src/assets/i18n/fr_FR.json index f604f0f977..7492c974a3 100644 --- a/src/assets/i18n/fr_FR.json +++ b/src/assets/i18n/fr_FR.json @@ -613,6 +613,7 @@ "checkout.addresses.shipping_address.heading": "Adresse de livraison", "checkout.addresses.shipping_address.option1.text": "Livraison à l’adresse de facturation indiquée ci-dessus", "checkout.addresses.shipping_address.option2.text": "Livraison à une adresse différente", + "checkout.bankGroup.error.required": "Veuillez sélectionner un Groupe bancaire.", "checkout.button.label": "Poursuivre le paiement", "checkout.cancel.button.label": "Annuler", "checkout.cart.estimated_shipping_handling.label": "Estimation des frais d’expédition",