From 61db32c819df0fb38d1a427ecb87c9182511d99a Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 6 Jun 2025 15:12:45 +0200 Subject: [PATCH 01/79] Implement base and cards payment with v2 versions --- etc/csp_whitelist.xml | 4 +- .../js/view/payment/method-renderer/basev2.js | 178 ++++++++++++++++++ .../js/view/payment/method-renderer/cards.js | 56 +----- view/frontend/web/template/payment/cards.html | 54 ++---- 4 files changed, 192 insertions(+), 100 deletions(-) create mode 100644 view/frontend/web/js/view/payment/method-renderer/basev2.js diff --git a/etc/csp_whitelist.xml b/etc/csp_whitelist.xml index bad29b1..177cdfe 100644 --- a/etc/csp_whitelist.xml +++ b/etc/csp_whitelist.xml @@ -21,7 +21,7 @@ https://api.heidelpay.com https://sbx-api.heidelpay.com https://sbx-api.unzer.com - + https://payment.unzer.com https://payment.heidelpay.com @@ -78,4 +78,4 @@ - \ No newline at end of file + diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js new file mode 100644 index 0000000..59aceeb --- /dev/null +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -0,0 +1,178 @@ +define( + [ + 'jquery', + 'ko', + 'mage/storage', + 'mage/translate', + 'mage/url', + 'Unzer_PAPI/js/model/checkout/customer-loader', + 'Unzer_PAPI/js/model/checkout/terms-checked', + 'Magento_Checkout/js/action/place-order', + 'Magento_Checkout/js/model/full-screen-loader', + 'Magento_Checkout/js/view/payment/default', + 'Magento_Ui/js/model/messageList', + 'Magento_Ui/js/lib/view/utils/dom-observer' + ], + function ( + $, + ko, + storage, + $t, + url, + customerLoader, + termsChecked, + placeOrderAction, + fullScreenLoader, + Component, + globalMessageList + ) { + 'use strict'; + + return Component.extend({ + redirectAfterPlaceOrder: false, + redirectUrl: 'unzer/payment/redirect', + allTermsChecked: termsChecked.allTermsChecked, + isThreatMetrixNeeded: false, + + defaults: { + config: null, + customer: null, + customerProvider: null, + customerSubscription: null, + customerType: 'b2c', + customerValid: null, + resourceId: null, + resourceProvider: null, + template: null + }, + + initialize: function () { + this._super(); + import('//static-v2.unzer.com/v2/ui-components/index.js') + .then(module => { + }) + .catch(error => { + console.error('Failed to load Unzer scripts: ' + error) + }); + + return this; + }, + + _getMethodConfig: function (configFieldName) { + if (!window.checkoutConfig.payment[this.item.method]) { + return false; + } + if (!window.checkoutConfig.payment[this.item.method].hasOwnProperty(configFieldName)) { + return false; + } + return window.checkoutConfig.payment[this.item.method][configFieldName]; + }, + + _getMethodOverrideApiKey: function () { + return this._getMethodConfig('publicKey'); + }, + + initializeCustomerForm: function (fieldId, errorFieldId) { + let self = this; + + if (this.customer() !== null) { + self._initializeCustomerForm(fieldId, errorFieldId); + } + + // if the customer changes, e.g. the billing address is changed, + // we need to reinitialize the Unzer Customer form fields + self.customerSubscription = this.customer.subscribe(function (customer) { + if (customer === null) { + return; + } + + self._initializeCustomerForm(fieldId, errorFieldId); + }); + }, + + selectPaymentMethod: function () { + let retVal = this._super(); + + termsChecked.init(this); + + return retVal; + }, + + initializeForm: function () { + const unzerPaymentElement = document.querySelector('unzer-payment'); + + if (unzerPaymentElement) { + // Inject or update the publicKey and locale attributes + unzerPaymentElement.setAttribute('publicKey', window.checkoutConfig.payment.unzer.publicKey); + unzerPaymentElement.setAttribute('locale', window.checkoutConfig.payment.unzer.locale); + } else { + console.error('Unzer payment element not found in the DOM.'); + } + + const unzerPayButton = document.getElementById('unzer-pay-button'); + + if (unzerPayButton) { + unzerPayButton.classList.add('disabled'); + } + + }, + + afterPlaceOrder: function () { + fullScreenLoader.startLoader(); + window.location.replace(url.build(this.redirectUrl)); + }, + + getData: function () { + let data = { + 'method': this.item.method, + 'po_number': null, + 'additional_data': { + 'customer_id': this.customer !== null && this.customer() !== null ? this.customer().id : null, + 'resource_id': this.resourceId + } + }; + + if (this.isThreatMetrixNeeded) { + data['additional_data']['threat_metrix_id'] = this.customer !== null && this.customer() !== null + ? this.customer().threat_metrix_id : null + } + + return data; + }, + + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + promises, + self = this; + + Promise.all([customElements.whenDefined('unzer-payment'), customElements.whenDefined('unzer-card')]).then(() => { + const unzerPaymentElement = document.getElementById('unzer-payment'); + const unzerCheckout = document.getElementById('unzer-checkout'); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.status === 'SUCCESS') { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + deferred.reject(request.responseJSON.message); + }); + } else { + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } + }); + } +); diff --git a/view/frontend/web/js/view/payment/method-renderer/cards.js b/view/frontend/web/js/view/payment/method-renderer/cards.js index f9d11a0..da1caf6 100644 --- a/view/frontend/web/js/view/payment/method-renderer/cards.js +++ b/view/frontend/web/js/view/payment/method-renderer/cards.js @@ -1,7 +1,7 @@ define( [ 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2', 'Magento_Vault/js/view/payment/vault-enabler' ], function (ko, Component, VaultEnabler) { @@ -10,12 +10,6 @@ define( return Component.extend({ defaults: { isActivePaymentTokenEnabler: false, - fields: { - cvc: {valid: null}, - expiry: {valid: null}, - number: {valid: null}, - holder: {valid: null}, - }, template: 'Unzer_PAPI/payment/cards' }, @@ -29,54 +23,6 @@ define( return this; }, - initializeForm: function () { - const self = this; - - this.resourceProvider = this.sdk.Card(); - this.resourceProvider.create('number', { - containerId: 'unzer-card-element-id-number', - onlyIframe: false - }); - this.resourceProvider.create('expiry', { - containerId: 'unzer-card-element-id-expiry', - onlyIframe: false - }); - this.resourceProvider.create('cvc', { - containerId: 'unzer-card-element-id-cvc', - onlyIframe: false - }); - this.resourceProvider.create('holder', { - containerId: 'unzer-card-element-id-holder', - onlyIframe: false - }); - - this.fields.cvc.valid = ko.observable(false); - this.fields.expiry.valid = ko.observable(false); - this.fields.number.valid = ko.observable(false); - this.fields.holder.valid = ko.observable(false); - - this.resourceProvider.addEventListener('change', function (event) { - if ("type" in event) { - self.fields[event.type].valid("success" in event && event.success); - } - }); - }, - - allInputsValid: function () { - const self = this; - - return ko.computed(function () { - return self.fields.cvc.valid() && - self.fields.expiry.valid() && - self.fields.number.valid() && - self.fields.holder.valid(); - })(); - }, - - validate: function () { - return this.allInputsValid(); - }, - /** * @returns {Boolean} */ diff --git a/view/frontend/web/template/payment/cards.html b/view/frontend/web/template/payment/cards.html index 86f753e..56a2cb8 100644 --- a/view/frontend/web/template/payment/cards.html +++ b/view/frontend/web/template/payment/cards.html @@ -16,52 +16,20 @@ -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- - -
-
- -
- -
-
- -
- - - -
+ type="submit"> + + + From c9e608a852775524a11494927ed393dba77f78f5 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Thu, 12 Jun 2025 15:19:20 +0200 Subject: [PATCH 02/79] Implement Unzer direct debit for v2 components ISSUE: UM2MTVCP-6 --- etc/csp_whitelist.xml | 22 ++- .../js/view/payment/method-renderer/basev2.js | 148 ++++++++++-------- .../js/view/payment/method-renderer/cards.js | 55 ++++++- .../payment/method-renderer/direct_debit.js | 89 ++++++----- view/frontend/web/template/payment/cards.html | 22 +-- .../web/template/payment/direct_debit.html | 19 +-- 6 files changed, 206 insertions(+), 149 deletions(-) diff --git a/etc/csp_whitelist.xml b/etc/csp_whitelist.xml index 177cdfe..ab9b605 100644 --- a/etc/csp_whitelist.xml +++ b/etc/csp_whitelist.xml @@ -1,7 +1,6 @@ - https://static.unzer.com @@ -13,47 +12,48 @@ - - https://api.unzer.com https://api.heidelpay.com https://sbx-api.heidelpay.com https://sbx-api.unzer.com - https://payment.unzer.com https://payment.heidelpay.com https://sbx-payment.heidelpay.com https://sbx-payment.unzer.com - https://h.online-metrix.net https://h64.online-metrix.net - https://google.com/pay https://www.google.com/pay https://pay.google.com https://test-heidelpay.hpcgw.net/ https://sbx-api.heidelpay.com/ + + https://static-cc.test.unzer.com + + + + + + https://sandbox.src.mastercard.com - - https://payment.unzer.com https://payment.heidelpay.com https://sbx-payment.heidelpay.com https://sbx-payment.unzer.com - + https://static-cc.test.unzer.com + https://h.online-metrix.net - https://google.com/pay https://pay.google.com/ https://test-heidelpay.hpcgw.net/ @@ -61,7 +61,6 @@ - https://static.unzer.com @@ -69,7 +68,6 @@ - https://static.unzer.com diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index 59aceeb..8eb70db 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -11,7 +11,7 @@ define( 'Magento_Checkout/js/model/full-screen-loader', 'Magento_Checkout/js/view/payment/default', 'Magento_Ui/js/model/messageList', - 'Magento_Ui/js/lib/view/utils/dom-observer' + 'Magento_Checkout/js/model/quote' ], function ( $, @@ -24,7 +24,8 @@ define( placeOrderAction, fullScreenLoader, Component, - globalMessageList + globalMessageList, + quote ) { 'use strict'; @@ -55,9 +56,84 @@ define( console.error('Failed to load Unzer scripts: ' + error) }); + let self = this; + // Subscribe to the selected payment method observable + quote.paymentMethod.subscribe(function (newPaymentMethod) { + if (!newPaymentMethod || newPaymentMethod.method !== self.getCode()) { + self.onUnselected(); + } + }); + return this; }, + selectPaymentMethod: function () { + let retVal = this._super(); + + termsChecked.init(this); + + const componentContainer = $('#unzer-component-' + this.getCode()); + componentContainer.empty(); + const unzerPayment = this.createUnzerPaymentElement(); + const specificPaymentElement = this.createSpecificPaymentElement(); + unzerPayment.append(specificPaymentElement); + const unzerCheckout = this.createUnzerCheckoutPaymentElement(); + + componentContainer.append(unzerPayment); + componentContainer.append(unzerCheckout); + + return retVal; + }, + + createUnzerPaymentElement: function () { + const unzerPaymentElementId = 'unzer-payment-' + this.getCode(); + + return $('') + .attr('id', unzerPaymentElementId) + .attr('publicKey', window.checkoutConfig.payment.unzer.publicKey) + .attr('locale', window.checkoutConfig.payment.unzer.locale) + .attr('disableCTP', true); + }, + + createSpecificPaymentElement: function () { + return ''; + }, + + createUnzerCheckoutPaymentElement: function () { + const unzerCheckoutId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = $('') + .attr('id', unzerCheckoutId); + + const unzerPayButtonId = 'unzer-pay-button-' + this.getCode(); + const payButton = $(' - +
+ +
+ + + +
diff --git a/view/frontend/web/template/payment/direct_debit.html b/view/frontend/web/template/payment/direct_debit.html index 3060f22..7641688 100644 --- a/view/frontend/web/template/payment/direct_debit.html +++ b/view/frontend/web/template/payment/direct_debit.html @@ -16,24 +16,7 @@ -
-
-
- -
-
-

-
-
+
From ce06d8634cfcfc153529eb13ad4cf62a85343c9c Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Thu, 12 Jun 2025 16:57:40 +0200 Subject: [PATCH 03/79] Implement Direct Bank transfer for v2 components ISSUE: UM2MTVCP-7 --- .../payment/method-renderer/direct_debit.js | 15 +++-- .../payment/method-renderer/open_banking.js | 67 +++++++++++++++++-- .../web/template/payment/open_banking.html | 16 +---- 3 files changed, 70 insertions(+), 28 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/direct_debit.js b/view/frontend/web/js/view/payment/method-renderer/direct_debit.js index 4ce8656..3a1789a 100644 --- a/view/frontend/web/js/view/payment/method-renderer/direct_debit.js +++ b/view/frontend/web/js/view/payment/method-renderer/direct_debit.js @@ -7,12 +7,13 @@ define( 'Magento_Ui/js/model/messageList', 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function ($, - ko, - $t, - placeOrderAction, - globalMessageList, - Component + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component ) { 'use strict'; @@ -34,7 +35,7 @@ define( ]).then(() => { const unzerCheckout = document.getElementById('unzer-checkout-unzer_direct_debit'); unzerCheckout.onPaymentSubmit = response => { - if (response.submitResponse) { + if (response.submitResponse && response.submitResponse.success) { this.resourceId = response.submitResponse.data.id; placeOrderAction(self.getData(), self.messageContainer) .done(function () { diff --git a/view/frontend/web/js/view/payment/method-renderer/open_banking.js b/view/frontend/web/js/view/payment/method-renderer/open_banking.js index bf5ab1e..5b7f32e 100644 --- a/view/frontend/web/js/view/payment/method-renderer/open_banking.js +++ b/view/frontend/web/js/view/payment/method-renderer/open_banking.js @@ -1,20 +1,73 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Magento_Checkout/js/model/quote' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component, quote) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ defaults: { - template: 'Unzer_PAPI/payment/open_banking', - quote: quote, + template: 'Unzer_PAPI/payment/open_banking' }, - initializeForm: function () { - this.resourceProvider = this.sdk.OpenBanking(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-open-banking') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/open_banking.html b/view/frontend/web/template/payment/open_banking.html index 1378c8c..bf171ce 100644 --- a/view/frontend/web/template/payment/open_banking.html +++ b/view/frontend/web/template/payment/open_banking.html @@ -15,20 +15,8 @@
-
-
- -
-
+ +
From 89204c0b032dbd1db80d336d1146ff02a034959f Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 13 Jun 2025 09:44:22 +0200 Subject: [PATCH 04/79] Implement iDEAL for v2 components ISSUE: UM2MTVCP-7 --- .../js/view/payment/method-renderer/ideal.js | 75 ++++++++++++++----- view/frontend/web/template/payment/ideal.html | 17 +---- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/ideal.js b/view/frontend/web/js/view/payment/method-renderer/ideal.js index 325c121..5635ac6 100644 --- a/view/frontend/web/js/view/payment/method-renderer/ideal.js +++ b/view/frontend/web/js/view/payment/method-renderer/ideal.js @@ -1,9 +1,20 @@ define( [ + 'jquery', 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (ko, Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -12,28 +23,52 @@ define( template: 'Unzer_PAPI/payment/ideal' }, - initializeForm: function () { - const self = this; - - this.resourceProvider = this.sdk.Ideal(); - this.resourceProvider.create('ideal', { - containerId: 'unzer-ideal-field' - }); + createSpecificPaymentElement: function () { + return $(''); + }, - this.field.valid = ko.observable(false); + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; - this.resourceProvider.addEventListener('change', function (event) { - self.field.valid(!!event.value); + Promise.all([ + customElements.whenDefined('unzer-ideal') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); }); - }, - allInputsValid: function () { - return this.field.valid(); - }, - - validate: function () { - return this.allInputsValid(); - }, + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/ideal.html b/view/frontend/web/template/payment/ideal.html index 1d2b668..98d628d 100644 --- a/view/frontend/web/template/payment/ideal.html +++ b/view/frontend/web/template/payment/ideal.html @@ -16,21 +16,8 @@
-
-
-
- -
-
+
+
From 312169f05203be48dae7015173d59a0af31f93d4 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 13 Jun 2025 13:58:06 +0200 Subject: [PATCH 05/79] Implement Unzer Invoice B2C for v2 components ISSUE: UM2MTVCP-9 --- .../js/view/payment/method-renderer/basev2.js | 18 +++- .../method-renderer/paylater_invoice.js | 100 +++++++++--------- .../template/payment/paylater_invoice.html | 18 +--- 3 files changed, 69 insertions(+), 67 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index 8eb70db..ddd6571 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -44,7 +44,8 @@ define( customerValid: null, resourceId: null, resourceProvider: null, - template: null + template: null, + customersBirthDay: null, }, initialize: function () { @@ -90,7 +91,7 @@ define( return $('') .attr('id', unzerPaymentElementId) - .attr('publicKey', window.checkoutConfig.payment.unzer.publicKey) + .attr('publicKey', this.getPublicKey()) .attr('locale', window.checkoutConfig.payment.unzer.locale) .attr('disableCTP', true); }, @@ -124,6 +125,16 @@ define( return unzerCheckout; }, + getPublicKey: function () { + let overridePublicKey = this._getMethodOverrideApiKey(); + + if (overridePublicKey) { + return overridePublicKey; + } + + return window.checkoutConfig.payment.unzer.publicKey; + }, + /** * Triggered when this payment method is unselected */ @@ -177,7 +188,8 @@ define( 'po_number': null, 'additional_data': { 'customer_id': this.customer, - 'resource_id': this.resourceId + 'resource_id': this.resourceId, + 'birthDate': this.customersBirthDay } }; diff --git a/view/frontend/web/js/view/payment/method-renderer/paylater_invoice.js b/view/frontend/web/js/view/payment/method-renderer/paylater_invoice.js index db82f86..5bbcb11 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paylater_invoice.js +++ b/view/frontend/web/js/view/payment/method-renderer/paylater_invoice.js @@ -2,11 +2,19 @@ define( [ 'jquery', 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Unzer_PAPI/js/model/checkout/threat-metrix', - 'Unzer_PAPI/js/model/checkout/address-updater' + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function ($, ko, Component, threatMetrix, addressUpdater) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -14,58 +22,54 @@ define( defaults: { template: 'Unzer_PAPI/payment/paylater_invoice', - fieldId: 'unzer-paylater-invoice-customer', - errorFieldId: 'unzer-paylater-invoice-customer-error' }, - initializeForm: function () { - this.resourceProvider = this.sdk.PaylaterInvoice(); - this.initializeCustomerForm( - this.fieldId, - this.errorFieldId - ); - - addressUpdater.registerSubscribers(this); + createSpecificPaymentElement: function () { + return $(''); }, - _initializeCustomerFormForB2cCustomer: function (fieldId, errorFieldId, customer) { - threatMetrix.init(customer.threat_metrix_id, this); + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; - this.resourceProvider.create({ - containerId: fieldId + '-optin', - customerType: 'B2C', - errorHolderId: errorFieldId, + Promise.all([ + customElements.whenDefined('unzer-paylater-invoice') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + this.customersBirthDay = document.querySelector('unzer-paylater-invoice').shadowRoot?.querySelector('uds-input-date[name="birthDate"]').value; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); }); - this.customerProvider = this.sdk.Customer(); - this.customerProvider.initFormFields(customer); - this.customerProvider.create({ - containerId: fieldId, - errorHolderId: errorFieldId, - showHeader: false, - paymentTypeName: 'paylater-invoice' + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); }); - - this.hideFormFields(fieldId); - }, - - hideFormFields: function (fieldId) { - this._super(fieldId); - - const field = $('#' + fieldId); - field.find('.field').filter('.checkbox-billingAddress, .email').hide(); - field.find('.field').filter('.billing-name, .billing-street, .billing-zip, .billing-city, :has(.billing-country)').hide(); - - field.find('.unzerUI.form>.checkboxLabel').hide(); - field.find('.unzerUI.form>.salutation-unzer-paylater-invoice-customer').hide(); - }, - - allInputsValid: function () { - return this.customerValid(); - }, - - validate: function () { - return this.allInputsValid(); } }); } diff --git a/view/frontend/web/template/payment/paylater_invoice.html b/view/frontend/web/template/payment/paylater_invoice.html index 9f1788a..525d823 100644 --- a/view/frontend/web/template/payment/paylater_invoice.html +++ b/view/frontend/web/template/payment/paylater_invoice.html @@ -16,22 +16,8 @@
-
-
-
-
- -
-
+
+
From 89bc618b23e88b643fb02b97a78c85a4fb3895b0 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 13 Jun 2025 15:12:24 +0200 Subject: [PATCH 06/79] Implement Unzer Installment for v2 components ISSUE: UM2MTVCP-10 --- .../method-renderer/paylater_installment.js | 134 +++++++----------- .../payment/paylater_installment.html | 19 +-- 2 files changed, 55 insertions(+), 98 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js b/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js index d081653..c57bdcf 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js +++ b/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js @@ -2,101 +2,73 @@ define( [ 'jquery', 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Unzer_PAPI/js/model/checkout/threat-metrix', - 'Unzer_PAPI/js/model/checkout/address-updater', - 'Magento_Checkout/js/model/quote' + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function ($, ko, Component, threatMetrix, addressUpdater, quote) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ isThreatMetrixNeeded: true, defaults: { - template: 'Unzer_PAPI/payment/paylater_installment', - quote: quote, - paymentDataValid: ko.observable(false), - fieldId: 'unzer-paylater-installment-customer', - errorFieldId: 'unzer-paylater-installment-customer-error' + template: 'Unzer_PAPI/payment/paylater_installment' }, - initializeForm: function () { - - let self = this; - - this.resourceProvider = this.sdk.PaylaterInstallment(); - this.initializeCustomerForm(this.fieldId, this.errorFieldId); - - addressUpdater.registerSubscribers(this); - - this.quote.totals.subscribe(this._updatePlans.bind(this)); - - this.resourceProvider.addEventListener('paylaterInstallmentEvent', function (event) { - self.paymentDataValid(false); - if (event.action === 'validate') { - self.paymentDataValid('success' in event && event.success); - } - }); + createSpecificPaymentElement: function () { + return $(''); }, - _initializeCustomerFormForB2cCustomer: function (fieldId, errorFieldId, customer) { - threatMetrix.init(customer.threat_metrix_id, this); - - this.resourceProvider.create({ - country: this.quote.billingAddress().countryId, - containerId: fieldId + '-plan', - customerType: 'B2C', - amount: (this.quote.totals() ? this.quote.totals() : this.quote)['grand_total'], - currency: (this.quote.totals() ? this.quote.totals() : this.quote)['quote_currency_code'], - errorHolderId: errorFieldId + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-paylater-installment') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); }); - this.customerProvider = this.sdk.Customer(); - this.customerProvider.initFormFields(customer); - this.customerProvider.create({ - containerId: fieldId, - errorHolderId: errorFieldId, - showHeader: false, - paymentTypeName: 'paylater-installment' + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); }); - - this.hideFormFields(fieldId); - }, - - _updatePlans: function () { - if (document.getElementById(this.fieldId + '-plan') && document.getElementById(this.fieldId + '-plan').hasChildNodes()) { - let params = { - country: this.quote.billingAddress()['countryId'], - customerType: 'B2C', - amount: this.quote.totals()['grand_total'], - currency: this.quote.totals()['quote_currency_code'] - }; - - this.resourceProvider.fetchPlans(params); - } - }, - - hideFormFields: function (fieldId) { - this._super(fieldId); - - let field = $('#' + fieldId); - - field.find('.field').filter('.checkbox-billingAddress, .email').hide(); - field.find('.field').filter( - '.billing-name, .billing-street, .billing-zip, .billing-city, :has(.billing-country)' - ).hide(); - - field.find('.unzerUI.form>.checkboxLabel').hide(); - field.find('.unzerUI.form>.salutation-unzer-paylater-installment-customer').hide(); - }, - - allInputsValid: function () { - return this.customerValid() && this.paymentDataValid(); - }, - - validate: function () { - return this.allInputsValid(); } }); } diff --git a/view/frontend/web/template/payment/paylater_installment.html b/view/frontend/web/template/payment/paylater_installment.html index 22fec12..06f5232 100644 --- a/view/frontend/web/template/payment/paylater_installment.html +++ b/view/frontend/web/template/payment/paylater_installment.html @@ -16,23 +16,8 @@
-
-
-
-
-
- -
-
+
+
From 009e5b605823f8741fa7ad21aff1617116b08ab2 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 13 Jun 2025 15:53:29 +0200 Subject: [PATCH 07/79] Implement Direct Debit Secured for v2 components ISSUE: UM2MTVCP-11 --- .../method-renderer/paylater_direct_debit.js | 117 ++++++++---------- .../payment/paylater_direct_debit.html | 18 +-- 2 files changed, 55 insertions(+), 80 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/paylater_direct_debit.js b/view/frontend/web/js/view/payment/method-renderer/paylater_direct_debit.js index 268888e..c74cfc2 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paylater_direct_debit.js +++ b/view/frontend/web/js/view/payment/method-renderer/paylater_direct_debit.js @@ -2,81 +2,72 @@ define( [ 'jquery', 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Unzer_PAPI/js/model/checkout/threat-metrix', - 'Unzer_PAPI/js/model/checkout/address-updater', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function ($, ko, Component, threatMetrix, addressUpdater) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ - isThreatMetrixNeeded: true, - defaults: { - isIbanHolderValid: ko.observable(false), - template: 'Unzer_PAPI/payment/paylater_direct_debit', - fieldId: 'unzer-paylater-direct-debit-customer', - errorFieldId: 'unzer-paylater-direct-debit-customer-error' + template: 'Unzer_PAPI/payment/paylater_direct_debit' }, - initializeForm: function () { - let self = this; - - this.resourceProvider = this.sdk.PaylaterDirectDebit(); - this.initializeCustomerForm( - this.fieldId, - this.errorFieldId - ); - - addressUpdater.registerSubscribers(this); - - self.isIbanHolderValid = ko.observable(false); - - this.resourceProvider.addEventListener('change', function (event) { - self.isIbanHolderValid("success" in event && event.success); - }); + createSpecificPaymentElement: function () { + return $(''); }, - _initializeCustomerFormForB2cCustomer: function (fieldId, errorFieldId, customer) { - threatMetrix.init(customer.threat_metrix_id, this); - - this.resourceProvider.create('paylater-direct-debit', { - containerId: fieldId + '-ibanholder', - resourceId: '' + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-paylater-direct-debit') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + this.customersBirthDay = document.querySelector('unzer-paylater-direct-debit').shadowRoot?.querySelector('uds-input-date[name="birthDate"]').value; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); }); - this.customerProvider = this.sdk.Customer(); - this.customerProvider.initFormFields(customer); - this.customerProvider.create({ - containerId: fieldId, - errorHolderId: errorFieldId, - showHeader: false, - paymentTypeName: 'paylater-direct-debit' + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); }); - - this.hideFormFields(fieldId); - }, - - hideFormFields: function (fieldId) { - this._super(fieldId); - - let field = $('#' + fieldId); - - field.find('.field').filter('.checkbox-billingAddress, .email').hide(); - field.find('.field').filter( - '.billing-name, .billing-street, .billing-zip, .billing-city, :has(.billing-country)' - ).hide(); - - field.find('.unzerUI.form>.checkboxLabel').hide(); - field.find('.unzerUI.form>.salutation-unzer-paylater-direct-debit-customer').hide(); - }, - - allInputsValid: function () { - return this.customerValid() && this.isIbanHolderValid(); - }, - - validate: function () { - return this.allInputsValid(); } }); } diff --git a/view/frontend/web/template/payment/paylater_direct_debit.html b/view/frontend/web/template/payment/paylater_direct_debit.html index ba7ff30..a28c0db 100644 --- a/view/frontend/web/template/payment/paylater_direct_debit.html +++ b/view/frontend/web/template/payment/paylater_direct_debit.html @@ -16,23 +16,7 @@
-
-
-
-
-
- -
-
+
From d63fa2fd1582650a7d9082d2c7e65abdbce7e777 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 13 Jun 2025 16:18:51 +0200 Subject: [PATCH 08/79] Implement PayPal for v2 components ISSUE: UM2MTVCP-12 --- .../js/view/payment/method-renderer/paypal.js | 90 +++++++++++-------- .../frontend/web/template/payment/paypal.html | 29 +----- 2 files changed, 57 insertions(+), 62 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/paypal.js b/view/frontend/web/js/view/payment/method-renderer/paypal.js index 089866a..7ac1d29 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paypal.js +++ b/view/frontend/web/js/view/payment/method-renderer/paypal.js @@ -1,9 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Magento_Vault/js/view/payment/vault-enabler' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component, VaultEnabler) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -12,42 +23,51 @@ define( template: 'Unzer_PAPI/payment/paypal' }, - initialize: function () { - this._super(); - - this.vaultEnabler = new VaultEnabler(); - this.vaultEnabler.isActivePaymentTokenEnabler(this.isActivePaymentTokenEnabler); - this.vaultEnabler.setPaymentCode(this.getVaultCode()); - - return this; - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.Paypal(); - }, - - /** - * @returns {Boolean} - */ - isVaultEnabled: function () { - return this.vaultEnabler.isVaultEnabled(); - }, - - /** - * Returns vault code. - * - * @returns {String} - */ - getVaultCode: function () { - return window.checkoutConfig.payment[this.getCode()].vault_code; + createSpecificPaymentElement: function () { + return $(''); }, - getData: function () { - var data = this._super(); + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; - this.vaultEnabler.visitAdditionalData(data); + Promise.all([ + customElements.whenDefined('unzer-paypal') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); - return data; + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); } }); } diff --git a/view/frontend/web/template/payment/paypal.html b/view/frontend/web/template/payment/paypal.html index 1d03504..d802ecb 100644 --- a/view/frontend/web/template/payment/paypal.html +++ b/view/frontend/web/template/payment/paypal.html @@ -16,33 +16,8 @@
-
- -
-
- - -
-
- -
- -
-
+
+
From 427f4a7b7ea41b15dffbdbfcf540692e1ebf84d7 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 10:41:43 +0200 Subject: [PATCH 09/79] Implement EPS for v2 components ISSUE: UM2MTVCP-13 --- .../js/view/payment/method-renderer/eps.js | 62 +++++++++++++++++-- view/frontend/web/template/payment/eps.html | 16 +---- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/eps.js b/view/frontend/web/js/view/payment/method-renderer/eps.js index ab896c5..ca62328 100644 --- a/view/frontend/web/js/view/payment/method-renderer/eps.js +++ b/view/frontend/web/js/view/payment/method-renderer/eps.js @@ -1,17 +1,71 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ defaults: { template: 'Unzer_PAPI/payment/eps' }, + createSpecificPaymentElement: function () { + return $(''); + }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-eps') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); - initializeForm: function () { - this.resourceProvider = this.sdk.EPS(); + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); } }); } diff --git a/view/frontend/web/template/payment/eps.html b/view/frontend/web/template/payment/eps.html index a3c9b72..8a50cc0 100644 --- a/view/frontend/web/template/payment/eps.html +++ b/view/frontend/web/template/payment/eps.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From 8b209d2d0c12df609d99ef9ba5eb7111066cfc8b Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 10:52:54 +0200 Subject: [PATCH 10/79] Implement AliPay for v2 components ISSUE: UM2MTVCP-14 --- .../js/view/payment/method-renderer/alipay.js | 63 +++++++++++++++++-- .../js/view/payment/method-renderer/eps.js | 1 + .../frontend/web/template/payment/alipay.html | 16 +---- 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/alipay.js b/view/frontend/web/js/view/payment/method-renderer/alipay.js index 1ba9eb2..0545ced 100644 --- a/view/frontend/web/js/view/payment/method-renderer/alipay.js +++ b/view/frontend/web/js/view/payment/method-renderer/alipay.js @@ -1,8 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -10,9 +22,52 @@ define( template: 'Unzer_PAPI/payment/alipay' }, - initializeForm: function () { - this.resourceProvider = this.sdk.Alipay(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-alipay') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/js/view/payment/method-renderer/eps.js b/view/frontend/web/js/view/payment/method-renderer/eps.js index ca62328..ff8c341 100644 --- a/view/frontend/web/js/view/payment/method-renderer/eps.js +++ b/view/frontend/web/js/view/payment/method-renderer/eps.js @@ -21,6 +21,7 @@ define( defaults: { template: 'Unzer_PAPI/payment/eps' }, + createSpecificPaymentElement: function () { return $(''); }, diff --git a/view/frontend/web/template/payment/alipay.html b/view/frontend/web/template/payment/alipay.html index a3c9b72..5746de8 100644 --- a/view/frontend/web/template/payment/alipay.html +++ b/view/frontend/web/template/payment/alipay.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From 0c146013e99d3ce98027310abf2fbfb467a39a25 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 10:59:12 +0200 Subject: [PATCH 11/79] Implement WechatPay for v2 components ISSUE: UM2MTVCP-15 --- .../view/payment/method-renderer/wechatpay.js | 64 +++++++++++++++++-- .../web/template/payment/wechatpay.html | 16 +---- 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/wechatpay.js b/view/frontend/web/js/view/payment/method-renderer/wechatpay.js index e77db9b..54e51d2 100644 --- a/view/frontend/web/js/view/payment/method-renderer/wechatpay.js +++ b/view/frontend/web/js/view/payment/method-renderer/wechatpay.js @@ -1,18 +1,72 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ defaults: { template: 'Unzer_PAPI/payment/wechatpay' }, - - initializeForm: function () { - this.resourceProvider = this.sdk.Wechatpay(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-wechatpay') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/wechatpay.html b/view/frontend/web/template/payment/wechatpay.html index a3c9b72..168cf5b 100644 --- a/view/frontend/web/template/payment/wechatpay.html +++ b/view/frontend/web/template/payment/wechatpay.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From 3924aadbac233950405de0fda868a5474721cc49 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 11:29:26 +0200 Subject: [PATCH 12/79] Implement Przelewy24 for v2 components ISSUE: UM2MTVCP-16 --- .../payment/method-renderer/przelewy24.js | 63 +++++++++++++++++-- .../web/template/payment/przelewy24.html | 16 +---- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/przelewy24.js b/view/frontend/web/js/view/payment/method-renderer/przelewy24.js index 8a84095..b89b6fb 100644 --- a/view/frontend/web/js/view/payment/method-renderer/przelewy24.js +++ b/view/frontend/web/js/view/payment/method-renderer/przelewy24.js @@ -1,8 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -10,9 +22,52 @@ define( template: 'Unzer_PAPI/payment/przelewy24' }, - initializeForm: function () { - this.resourceProvider = this.sdk.Przelewy24(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-przelewy24') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/przelewy24.html b/view/frontend/web/template/payment/przelewy24.html index a3c9b72..0cf276a 100644 --- a/view/frontend/web/template/payment/przelewy24.html +++ b/view/frontend/web/template/payment/przelewy24.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From 61d9b65a7b318076cf00b9972b8de4e3cd4d539f Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 11:44:26 +0200 Subject: [PATCH 13/79] Implement Bancontact for v2 components ISSUE: UM2MTVCP-17 --- .../payment/method-renderer/bancontact.js | 63 +++++++++++++++++-- .../web/template/payment/bancontact.html | 16 +---- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/bancontact.js b/view/frontend/web/js/view/payment/method-renderer/bancontact.js index 264f45b..c097187 100644 --- a/view/frontend/web/js/view/payment/method-renderer/bancontact.js +++ b/view/frontend/web/js/view/payment/method-renderer/bancontact.js @@ -1,8 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -10,9 +22,52 @@ define( template: 'Unzer_PAPI/payment/bancontact' }, - initializeForm: function () { - this.resourceProvider = this.sdk.Bancontact(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-bancontact') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/bancontact.html b/view/frontend/web/template/payment/bancontact.html index a3c9b72..a12f7f6 100644 --- a/view/frontend/web/template/payment/bancontact.html +++ b/view/frontend/web/template/payment/bancontact.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From 38a03277f1b7aaf05ab4b3fffb2c8514532e4da1 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 12:19:35 +0200 Subject: [PATCH 14/79] Implement Unzer prepayment for v2 components ISSUE: UM2MTVCP-18 --- .../payment/method-renderer/prepayment.js | 63 +++++++++++++++++-- .../web/template/payment/prepayment.html | 16 +---- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/prepayment.js b/view/frontend/web/js/view/payment/method-renderer/prepayment.js index dadfaf0..fe6d178 100644 --- a/view/frontend/web/js/view/payment/method-renderer/prepayment.js +++ b/view/frontend/web/js/view/payment/method-renderer/prepayment.js @@ -1,8 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -10,9 +22,52 @@ define( template: 'Unzer_PAPI/payment/prepayment' }, - initializeForm: function () { - this.resourceProvider = this.sdk.Prepayment(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-prepayment') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/prepayment.html b/view/frontend/web/template/payment/prepayment.html index a3c9b72..b0d213b 100644 --- a/view/frontend/web/template/payment/prepayment.html +++ b/view/frontend/web/template/payment/prepayment.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From cca47c1ad204b3972b581d417c53e311beea1499 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 12:29:58 +0200 Subject: [PATCH 15/79] Implement TWINT for v2 components ISSUE: UM2MTVCP-20 --- .../js/view/payment/method-renderer/twint.js | 63 +++++++++++++++++-- view/frontend/web/template/payment/twint.html | 16 +---- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/twint.js b/view/frontend/web/js/view/payment/method-renderer/twint.js index c985d9e..998a708 100644 --- a/view/frontend/web/js/view/payment/method-renderer/twint.js +++ b/view/frontend/web/js/view/payment/method-renderer/twint.js @@ -1,8 +1,20 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' + 'jquery', + 'ko', + 'mage/translate', + 'Magento_Checkout/js/action/place-order', + 'Magento_Ui/js/model/messageList', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function (Component) { + function ( + $, + ko, + $t, + placeOrderAction, + globalMessageList, + Component + ) { 'use strict'; return Component.extend({ @@ -10,9 +22,52 @@ define( template: 'Unzer_PAPI/payment/twint' }, - initializeForm: function () { - this.resourceProvider = this.sdk.Twint(); + createSpecificPaymentElement: function () { + return $(''); }, + + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; + + Promise.all([ + customElements.whenDefined('unzer-twint') + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); + + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); + } }); } ); diff --git a/view/frontend/web/template/payment/twint.html b/view/frontend/web/template/payment/twint.html index a3c9b72..8842b9f 100644 --- a/view/frontend/web/template/payment/twint.html +++ b/view/frontend/web/template/payment/twint.html @@ -16,20 +16,8 @@
-
-
- -
-
+
+
From ae9d97617bc9bcf8b76e430afce8c1808d2dc911 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 14:48:36 +0200 Subject: [PATCH 16/79] Implement GooglePay for v2 components ISSUE: UM2MTVCP-19 --- .../js/view/payment/method-renderer/basev2.js | 4 +- .../view/payment/method-renderer/googlepay.js | 127 +++++++++++------- .../web/template/payment/googlepay.html | 6 +- 3 files changed, 84 insertions(+), 53 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index ddd6571..712c2d5 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -34,6 +34,7 @@ define( redirectUrl: 'unzer/payment/redirect', allTermsChecked: termsChecked.allTermsChecked, isThreatMetrixNeeded: false, + buttonNeeded: true, defaults: { config: null, @@ -105,6 +106,7 @@ define( const unzerCheckout = $('') .attr('id', unzerCheckoutId); + if(this.buttonNeeded) { const unzerPayButtonId = 'unzer-pay-button-' + this.getCode(); const payButton = $('
-
-
-
-
+
+
From 7ea0ed0634f6839af0a43052d0fc4b0439862b3d Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Mon, 16 Jun 2025 15:53:44 +0200 Subject: [PATCH 17/79] Refactor and simplify code --- .../js/view/payment/method-renderer/alipay.js | 60 +------------- .../payment/method-renderer/bancontact.js | 60 +------------- .../js/view/payment/method-renderer/basev2.js | 80 ++++++++++++++++--- .../js/view/payment/method-renderer/cards.js | 7 +- .../payment/method-renderer/direct_debit.js | 59 +------------- .../js/view/payment/method-renderer/eps.js | 60 +------------- .../view/payment/method-renderer/googlepay.js | 56 +------------ .../js/view/payment/method-renderer/ideal.js | 61 +------------- .../payment/method-renderer/open_banking.js | 60 +------------- .../method-renderer/paylater_direct_debit.js | 62 +------------- .../method-renderer/paylater_installment.js | 60 +------------- .../method-renderer/paylater_invoice.js | 60 +------------- .../js/view/payment/method-renderer/paypal.js | 60 +------------- .../payment/method-renderer/prepayment.js | 55 +------------ .../payment/method-renderer/przelewy24.js | 60 +------------- .../js/view/payment/method-renderer/twint.js | 60 +------------- .../view/payment/method-renderer/wechatpay.js | 59 +------------- 17 files changed, 100 insertions(+), 879 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/alipay.js b/view/frontend/web/js/view/payment/method-renderer/alipay.js index 0545ced..2b6f7e4 100644 --- a/view/frontend/web/js/view/payment/method-renderer/alipay.js +++ b/view/frontend/web/js/view/payment/method-renderer/alipay.js @@ -1,72 +1,16 @@ define( [ - 'jquery', - 'ko', - 'mage/translate', - 'Magento_Checkout/js/action/place-order', - 'Magento_Ui/js/model/messageList', 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], function ( - $, - ko, - $t, - placeOrderAction, - globalMessageList, Component ) { 'use strict'; return Component.extend({ defaults: { - template: 'Unzer_PAPI/payment/alipay' - }, - - createSpecificPaymentElement: function () { - return $(''); - }, - - getPlaceOrderDeferredObject: function () { - let deferred = $.Deferred(), - self = this; - - Promise.all([ - customElements.whenDefined('unzer-alipay') - ]).then(() => { - const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); - const unzerCheckout = document.getElementById(unzerCheckoutElementId); - unzerCheckout.onPaymentSubmit = response => { - if (response.submitResponse && response.submitResponse.success) { - this.resourceId = response.submitResponse.data.id; - placeOrderAction(self.getData(), self.messageContainer) - .done(function () { - deferred.resolve.apply(deferred, arguments); - }) - .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); - }); - } else { - globalMessageList.addErrorMessage({ - message: 'There was an error placing your order. ' + response.submitResponse.message - }); - deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); - } - }; - }).catch(error => { - globalMessageList.addErrorMessage({ - message: 'There was an error placing your order. ' + error - }); - deferred.reject($t('There was an error placing your order. ' + error)); - }); - - return deferred.fail(function (error) { - globalMessageList.addErrorMessage({ - message: error - }); - }); + template: 'Unzer_PAPI/payment/alipay', + paymentCode: 'unzer-alipay', } }); } diff --git a/view/frontend/web/js/view/payment/method-renderer/bancontact.js b/view/frontend/web/js/view/payment/method-renderer/bancontact.js index c097187..cf113a2 100644 --- a/view/frontend/web/js/view/payment/method-renderer/bancontact.js +++ b/view/frontend/web/js/view/payment/method-renderer/bancontact.js @@ -1,72 +1,16 @@ define( [ - 'jquery', - 'ko', - 'mage/translate', - 'Magento_Checkout/js/action/place-order', - 'Magento_Ui/js/model/messageList', 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], function ( - $, - ko, - $t, - placeOrderAction, - globalMessageList, Component ) { 'use strict'; return Component.extend({ defaults: { - template: 'Unzer_PAPI/payment/bancontact' - }, - - createSpecificPaymentElement: function () { - return $(''); - }, - - getPlaceOrderDeferredObject: function () { - let deferred = $.Deferred(), - self = this; - - Promise.all([ - customElements.whenDefined('unzer-bancontact') - ]).then(() => { - const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); - const unzerCheckout = document.getElementById(unzerCheckoutElementId); - unzerCheckout.onPaymentSubmit = response => { - if (response.submitResponse && response.submitResponse.success) { - this.resourceId = response.submitResponse.data.id; - placeOrderAction(self.getData(), self.messageContainer) - .done(function () { - deferred.resolve.apply(deferred, arguments); - }) - .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); - }); - } else { - globalMessageList.addErrorMessage({ - message: 'There was an error placing your order. ' + response.submitResponse.message - }); - deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); - } - }; - }).catch(error => { - globalMessageList.addErrorMessage({ - message: 'There was an error placing your order. ' + error - }); - deferred.reject($t('There was an error placing your order. ' + error)); - }); - - return deferred.fail(function (error) { - globalMessageList.addErrorMessage({ - message: error - }); - }); + template: 'Unzer_PAPI/payment/bancontact', + paymentCode: 'unzer-bancontact', } }); } diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index 712c2d5..ba3dd15 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -35,6 +35,8 @@ define( allTermsChecked: termsChecked.allTermsChecked, isThreatMetrixNeeded: false, buttonNeeded: true, + paymentCode: null, + customersBirthDayNeeded: false, defaults: { config: null, @@ -98,7 +100,13 @@ define( }, createSpecificPaymentElement: function () { - return ''; + if (!this.paymentCode) { + console.error("Payment code is null or undefined"); + + return null; + } + + return $(`<${this.paymentCode}>`); }, createUnzerCheckoutPaymentElement: function () { @@ -106,22 +114,22 @@ define( const unzerCheckout = $('') .attr('id', unzerCheckoutId); - if(this.buttonNeeded) { - const unzerPayButtonId = 'unzer-pay-button-' + this.getCode(); - const payButton = $('
-
-
-
- - -
-
+
From 7e8c36ff3bdce7a3cdb6bb825f1e8b8f12c81b4d Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Wed, 18 Jun 2025 11:57:46 +0200 Subject: [PATCH 21/79] Fix ApplePay for v2 components ISSUE: UM2MTVCP-21 --- view/frontend/web/template/payment/applepayv2.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/view/frontend/web/template/payment/applepayv2.html b/view/frontend/web/template/payment/applepayv2.html index 6337e58..9285e70 100644 --- a/view/frontend/web/template/payment/applepayv2.html +++ b/view/frontend/web/template/payment/applepayv2.html @@ -15,7 +15,9 @@
-
+ +
+
From 9d4a3caf615f1b115a12a35a39deba3deb0befb7 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Wed, 18 Jun 2025 14:42:01 +0200 Subject: [PATCH 22/79] Add support for Klarna payment method ISSUE: UM2MTVCP-22 --- Model/Config.php | 1 + Model/Config/Provider.php | 1 + Model/Method/Klarna.php | 19 +++++++ etc/adminhtml/system.xml | 1 + etc/adminhtml/system/klarna.xml | 40 +++++++++++++++ etc/config.xml | 16 ++++++ etc/di.xml | 51 +++++++++++++++++++ etc/events.xml | 3 ++ i18n/de_DE.csv | 1 + i18n/en_US.csv | 1 + view/frontend/layout/checkout_index_index.xml | 3 ++ .../web/js/view/payment/method-renderer.js | 4 ++ .../js/view/payment/method-renderer/klarna.js | 17 +++++++ .../frontend/web/template/payment/klarna.html | 27 ++++++++++ 14 files changed, 185 insertions(+) create mode 100644 Model/Method/Klarna.php create mode 100644 etc/adminhtml/system/klarna.xml create mode 100644 view/frontend/web/js/view/payment/method-renderer/klarna.js create mode 100644 view/frontend/web/template/payment/klarna.html diff --git a/Model/Config.php b/Model/Config.php index db39d27..9e85ddd 100644 --- a/Model/Config.php +++ b/Model/Config.php @@ -60,6 +60,7 @@ class Config extends \Magento\Payment\Gateway\Config\Config public const METHOD_GOOGLEPAY = 'unzer_googlepay'; public const METHOD_TWINT = 'unzer_twint'; public const METHOD_OPEN_BANKING = 'unzer_open_banking'; + public const METHOD_KLARNA = 'unzer_klarna'; /** * @var DebugHandler diff --git a/Model/Config/Provider.php b/Model/Config/Provider.php index b6ca67b..a3a5639 100644 --- a/Model/Config/Provider.php +++ b/Model/Config/Provider.php @@ -48,6 +48,7 @@ class Provider implements ConfigProviderInterface Config::METHOD_GOOGLEPAY, Config::METHOD_TWINT, Config::METHOD_OPEN_BANKING, + Config::METHOD_KLARNA ]; /** diff --git a/Model/Method/Klarna.php b/Model/Method/Klarna.php new file mode 100644 index 0000000..8d32ad5 --- /dev/null +++ b/Model/Method/Klarna.php @@ -0,0 +1,19 @@ + + diff --git a/etc/adminhtml/system/klarna.xml b/etc/adminhtml/system/klarna.xml new file mode 100644 index 0000000..1d27873 --- /dev/null +++ b/etc/adminhtml/system/klarna.xml @@ -0,0 +1,40 @@ + + + + + + + Magento\Config\Model\Config\Source\Yesno + payment/unzer_klarna/active + + + + payment/unzer_klarna/title + + + + payment/unzer_klarna/order_payment_action + Unzer\PAPI\Model\System\Config\Source\PaymentAction + + + + payment/unzer_klarna/min_order_total + + + + payment/unzer_klarna/max_order_total + Insert 0 to disable limit. + + + + payment/unzer_klarna/sort_order + + + diff --git a/etc/config.xml b/etc/config.xml index 28ce7c0..73a02cc 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -475,6 +475,22 @@ 0 Unzer\PAPI\Model\Method\OpenBanking + + 0 + order + authorize + <![CDATA[Klarna]]> + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + Unzer\PAPI\Model\Method\Klarna + diff --git a/etc/di.xml b/etc/di.xml index 9b3f7a3..a167197 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1590,4 +1590,55 @@ UnzerCaptureCommandPool + + + + + Unzer\PAPI\Model\Config::METHOD_KLARNA + + + + + + UnzerKlarnaConfig + + + + + + + UnzerKlarnaConfigValueHandler + Unzer\PAPI\Model\Config\CanCancelHandler + Unzer\PAPI\Model\Config\CanRefundHandler + Unzer\PAPI\Model\Config\CanRefundHandler + + Unzer\PAPI\Model\Config\CanVoidHandler + + + + + + + UnzerKlarnaConfig + + + + + + + UnzerKlarnaValidatorCountry + + + + + + + Unzer\PAPI\Model\Config::METHOD_KLARNA + Magento\Payment\Block\Form + Magento\Payment\Block\Info + UnzerKlarnaValueHandlerPool + UnzerKlarnaValidatorPool + UnzerAuthorizeAndCaptureVaultCommandPool + + diff --git a/etc/events.xml b/etc/events.xml index 44c24de..7073194 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -78,4 +78,7 @@ + + + diff --git a/i18n/de_DE.csv b/i18n/de_DE.csv index 5813e91..9bb63e3 100644 --- a/i18n/de_DE.csv +++ b/i18n/de_DE.csv @@ -28,6 +28,7 @@ "UNZER_GOOGLEPAY","Google Pay" "UNZER_TWINT","TWINT" "UNZER_OPEN_BANKING","Unzer Direktüberweisung" +"UNZER_KLARNA","Klarna" "MODULE_VERSION_LABEL","Modul-Version:" "ABOUT_UNZER_LABEL","Über Unzer:" diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 3adacf2..5f389bf 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -28,6 +28,7 @@ "UNZER_GOOGLEPAY","Google Pay" "UNZER_TWINT","TWINT" "UNZER_OPEN_BANKING","Direct Bank Transfer" +"UNZER_KLARNA","Klarna" "MODULE_VERSION_LABEL","Module version:" "ABOUT_UNZER_LABEL","About Unzer:" diff --git a/view/frontend/layout/checkout_index_index.xml b/view/frontend/layout/checkout_index_index.xml index 047fdfb..60118cc 100644 --- a/view/frontend/layout/checkout_index_index.xml +++ b/view/frontend/layout/checkout_index_index.xml @@ -107,6 +107,9 @@ true + + true + diff --git a/view/frontend/web/js/view/payment/method-renderer.js b/view/frontend/web/js/view/payment/method-renderer.js index 6fea36f..21a904f 100644 --- a/view/frontend/web/js/view/payment/method-renderer.js +++ b/view/frontend/web/js/view/payment/method-renderer.js @@ -112,6 +112,10 @@ define( { type: 'unzer_open_banking', component: 'Unzer_PAPI/js/view/payment/method-renderer/open_banking' + }, + { + type: 'unzer_klarna', + component: 'Unzer_PAPI/js/view/payment/method-renderer/klarna' } ); return Component.extend({}); diff --git a/view/frontend/web/js/view/payment/method-renderer/klarna.js b/view/frontend/web/js/view/payment/method-renderer/klarna.js new file mode 100644 index 0000000..65f6bc5 --- /dev/null +++ b/view/frontend/web/js/view/payment/method-renderer/klarna.js @@ -0,0 +1,17 @@ +define( + [ + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' + ], + function ( + Component + ) { + 'use strict'; + + return Component.extend({ + defaults: { + template: 'Unzer_PAPI/payment/klarna', + paymentCode: 'unzer-klarna', + } + }); + } +); diff --git a/view/frontend/web/template/payment/klarna.html b/view/frontend/web/template/payment/klarna.html new file mode 100644 index 0000000..9b582a4 --- /dev/null +++ b/view/frontend/web/template/payment/klarna.html @@ -0,0 +1,27 @@ +
+
+ + +
+
+
+ + + +
+ +
+ +
+ + + +
+
+
From 33a66de1da4974e4bea975f9e8a54213f83d60c6 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Thu, 19 Jun 2025 16:16:01 +0200 Subject: [PATCH 23/79] Implement stored credit cards logic ISSUE: UM2MTVCP-23 --- .../js/view/payment/method-renderer/basev2.js | 2 +- .../js/view/payment/method-renderer/cards.js | 26 +++++++++++++++++++ view/frontend/web/template/payment/cards.html | 4 ++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index ba3dd15..b0e4dd1 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -122,7 +122,7 @@ define( .attr('type', 'submit') .attr('data-bind', ` click: placeOrder, - attr: {title: 'Place Order'}, // Reverting to $t directly (Magento's scope) + attr: {title: 'Place Order'}, css: {disabled: !isPlaceOrderActionAllowed() || !allTermsChecked()} `); diff --git a/view/frontend/web/js/view/payment/method-renderer/cards.js b/view/frontend/web/js/view/payment/method-renderer/cards.js index 77d7c4e..1f95bbe 100644 --- a/view/frontend/web/js/view/payment/method-renderer/cards.js +++ b/view/frontend/web/js/view/payment/method-renderer/cards.js @@ -35,6 +35,32 @@ define( return this; }, + selectPaymentMethod: function () { + let retVal = this._super(); + + if (this.isVaultEnabled()) { + const checkbox = document.getElementById('unzer-card-save-card-checkbox'); + const checkboxLabel = document.getElementById('unzer-card-save-card-typography'); + if (checkbox && checkboxLabel) { + checkbox.removeAttribute('hidden'); + checkbox.addEventListener('click', () => { + if (!this.isActivePaymentTokenEnabler) { + this.isActivePaymentTokenEnabler = true; + this.vaultEnabler.isActivePaymentTokenEnabler(true); + + return; + } + this.isActivePaymentTokenEnabler = false; + this.vaultEnabler.isActivePaymentTokenEnabler(false); + }) + + checkboxLabel.textContent = $t('Save for later use.'); + } + } + + return retVal; + }, + /** * @returns {Boolean} */ diff --git a/view/frontend/web/template/payment/cards.html b/view/frontend/web/template/payment/cards.html index c466fba..3278f60 100644 --- a/view/frontend/web/template/payment/cards.html +++ b/view/frontend/web/template/payment/cards.html @@ -17,7 +17,9 @@
- +
From f7c915af45c2d0240fdfd99f7ef9ee42028ebde0 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Thu, 19 Jun 2025 16:43:59 +0200 Subject: [PATCH 24/79] Implement stored PayPal logic ISSUE: UM2MTVCP-24 --- .../payment/method-renderer/applepayv2.js | 15 ++-- .../js/view/payment/method-renderer/basev2.js | 15 ++-- .../js/view/payment/method-renderer/cards.js | 15 ++-- .../view/payment/method-renderer/googlepay.js | 15 ++-- .../js/view/payment/method-renderer/paypal.js | 70 ++++++++++++++++++- .../frontend/web/template/payment/paypal.html | 4 +- 6 files changed, 115 insertions(+), 19 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/applepayv2.js b/view/frontend/web/js/view/payment/method-renderer/applepayv2.js index a958f43..07e99e5 100644 --- a/view/frontend/web/js/view/payment/method-renderer/applepayv2.js +++ b/view/frontend/web/js/view/payment/method-renderer/applepayv2.js @@ -86,10 +86,17 @@ define( deferred.resolve.apply(deferred, arguments); }) .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); + if (request.responseJSON && request.responseJSON.message) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + } else { + globalMessageList.addErrorMessage({ + message: 'An unknown error occurred. Please try again.' + }); + deferred.reject('An unknown error occurred.'); + } }); }).catch(error => { globalMessageList.addErrorMessage({ diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index b0e4dd1..3c2d2d8 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -240,10 +240,17 @@ define( deferred.resolve.apply(deferred, arguments); }) .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); + if (request.responseJSON && request.responseJSON.message) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + } else { + globalMessageList.addErrorMessage({ + message: 'An unknown error occurred. Please try again.' + }); + deferred.reject('An unknown error occurred.'); + } }); } else { globalMessageList.addErrorMessage({ diff --git a/view/frontend/web/js/view/payment/method-renderer/cards.js b/view/frontend/web/js/view/payment/method-renderer/cards.js index 1f95bbe..667584a 100644 --- a/view/frontend/web/js/view/payment/method-renderer/cards.js +++ b/view/frontend/web/js/view/payment/method-renderer/cards.js @@ -101,10 +101,17 @@ define( deferred.resolve.apply(deferred, arguments); }) .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); + if (request.responseJSON && request.responseJSON.message) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + } else { + globalMessageList.addErrorMessage({ + message: 'An unknown error occurred. Please try again.' + }); + deferred.reject('An unknown error occurred.'); + } }); } else { deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); diff --git a/view/frontend/web/js/view/payment/method-renderer/googlepay.js b/view/frontend/web/js/view/payment/method-renderer/googlepay.js index 7ca0971..5361ce2 100644 --- a/view/frontend/web/js/view/payment/method-renderer/googlepay.js +++ b/view/frontend/web/js/view/payment/method-renderer/googlepay.js @@ -91,10 +91,17 @@ define( deferred.resolve.apply(deferred, arguments); }) .fail(function (request) { - globalMessageList.addErrorMessage({ - message: request.responseJSON.message - }); - deferred.reject(request.responseJSON.message); + if (request.responseJSON && request.responseJSON.message) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + } else { + globalMessageList.addErrorMessage({ + message: 'An unknown error occurred. Please try again.' + }); + deferred.reject('An unknown error occurred.'); + } }); }).catch(error => { globalMessageList.addErrorMessage({ diff --git a/view/frontend/web/js/view/payment/method-renderer/paypal.js b/view/frontend/web/js/view/payment/method-renderer/paypal.js index 621d46b..d9b57f9 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paypal.js +++ b/view/frontend/web/js/view/payment/method-renderer/paypal.js @@ -1,9 +1,15 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/basev2' + 'jquery', + 'mage/translate', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2', + 'Magento_Vault/js/view/payment/vault-enabler', ], function ( - Component + $, + $t, + Component, + VaultEnabler ) { 'use strict'; @@ -12,6 +18,66 @@ define( isActivePaymentTokenEnabler: false, template: 'Unzer_PAPI/payment/paypal', paymentCode: 'unzer-paypal', + }, + + initialize: function () { + this._super(); + + this.vaultEnabler = new VaultEnabler(); + this.vaultEnabler.isActivePaymentTokenEnabler(this.isActivePaymentTokenEnabler); + this.vaultEnabler.setPaymentCode(this.getVaultCode()); + + return this; + }, + + selectPaymentMethod: function () { + let retVal = this._super(); + + if (this.isVaultEnabled()) { + const checkbox = document.getElementById('unzer-card-save-paypal-checkbox'); + const checkboxLabel = document.getElementById('unzer-card-save-paypal-typography'); + if (checkbox && checkboxLabel) { + checkbox.removeAttribute('hidden'); + checkbox.addEventListener('click', () => { + if (!this.isActivePaymentTokenEnabler) { + this.isActivePaymentTokenEnabler = true; + this.vaultEnabler.isActivePaymentTokenEnabler(true); + + return; + } + this.isActivePaymentTokenEnabler = false; + this.vaultEnabler.isActivePaymentTokenEnabler(false); + }) + + checkboxLabel.textContent = $t('Save for later use.'); + } + } + + return retVal; + }, + + /** + * @returns {Boolean} + */ + isVaultEnabled: function () { + return this.vaultEnabler.isVaultEnabled(); + }, + + /** + * Returns vault code. + * + * @returns {String} + */ + getVaultCode: function () { + return window.checkoutConfig.payment[this.getCode()].vault_code; + }, + + getData: function () { + var data = this._super(); + + this.vaultEnabler.visitAdditionalData(data); + + return data; } }); } diff --git a/view/frontend/web/template/payment/paypal.html b/view/frontend/web/template/payment/paypal.html index d802ecb..d03f52f 100644 --- a/view/frontend/web/template/payment/paypal.html +++ b/view/frontend/web/template/payment/paypal.html @@ -17,7 +17,9 @@
- +
From 5f97a30abb0aaadf588a92fc814c67f1e556dfb7 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 20 Jun 2025 12:15:02 +0200 Subject: [PATCH 25/79] Implement Klarna logic ISSUE: UM2MTVCP-22 --- Helper/Order.php | 32 ++++++++++++++++++++++++++++++-- etc/adminhtml/system/klarna.xml | 6 ------ etc/config.xml | 1 + etc/di.xml | 20 +++++++++++++++++++- 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/Helper/Order.php b/Helper/Order.php index 74a49e7..de2c9d3 100644 --- a/Helper/Order.php +++ b/Helper/Order.php @@ -7,6 +7,7 @@ use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\App\ProductMetadataInterface; use Magento\Framework\Exception\LocalizedException; +use Magento\Framework\Locale\ResolverInterface; use Magento\Framework\Module\ModuleListInterface; use Magento\Payment\Model\InfoInterface; use Magento\Payment\Model\MethodInterface; @@ -83,6 +84,11 @@ class Order */ private CreateThreatMetrixId $createThreatMetrixId; + /** + * @var ResolverInterface + */ + private ResolverInterface $localeResolver; + /** * Constructor * @@ -94,6 +100,7 @@ class Order * @param BasketItemFactory $basketItemFactory * @param BirthDateFactory $birthDateFactory * @param CreateThreatMetrixId $createThreatMetrixId + * @param ResolverInterface $localeResolver */ public function __construct( Config $moduleConfig, @@ -103,7 +110,8 @@ public function __construct( BasketFactory $basketFactory, BasketItemFactory $basketItemFactory, BirthDateFactory $birthDateFactory, - CreateThreatMetrixId $createThreatMetrixId + CreateThreatMetrixId $createThreatMetrixId, + ResolverInterface $localeResolver ) { $this->_moduleConfig = $moduleConfig; $this->_moduleList = $moduleList; @@ -113,6 +121,7 @@ public function __construct( $this->basketItemFactory = $basketItemFactory; $this->birthDateFactory = $birthDateFactory; $this->createThreatMetrixId = $createThreatMetrixId; + $this->localeResolver = $localeResolver; } /** @@ -175,6 +184,7 @@ public function createBasketForOrder(OrderModel $order): Basket * Create Basket * * @param OrderModel $order + * * @return Basket */ protected function createBasket(OrderModel $order): Basket @@ -191,6 +201,7 @@ protected function createBasket(OrderModel $order): Basket * Create Shipping Item * * @param OrderModel $order + * * @return BasketItem */ protected function createShippingItem(OrderModel $order): BasketItem @@ -208,6 +219,7 @@ protected function createShippingItem(OrderModel $order): BasketItem * Create Basket Item * * @param Item $orderItem + * * @return BasketItem */ protected function createBasketItem(Item $orderItem): BasketItem @@ -246,6 +258,7 @@ private function createRoundingItem(float $amount): BasketItem * * @param OrderModel $order * @param float $vatRate + * * @return BasketItem */ protected function createVoucherItem(OrderModel $order, float $vatRate): BasketItem @@ -266,7 +279,7 @@ protected function createVoucherItem(OrderModel $order, float $vatRate): BasketI ); if ($taxAfterDiscount && !$pricesIncludeTax) { - $discount *= (1 + $vatRate/100); + $discount *= (1 + $vatRate / 100); } $basketVoucherItemDiscountAmount = $this->basketItemFactory->create(); @@ -287,6 +300,7 @@ protected function createVoucherItem(OrderModel $order, float $vatRate): BasketI * Returns metadata for the given order. * * @param OrderModel $order + * * @return Metadata */ public function createMetadataForOrder(OrderModel $order): Metadata @@ -370,6 +384,11 @@ public function createCustomerFromOrder(OrderModel $order, string $email, bool $ $billingAddress = $order->getBillingAddress(); $customer = new Customer(); + $currentLocale = $this->localeResolver->getLocale(); + $languageCode = strtok($currentLocale, '_-'); + if($languageCode) { + $customer->setLanguage($languageCode); + } if ($billingAddress !== null) { $customer->setFirstname($billingAddress->getFirstname()) @@ -458,6 +477,7 @@ private function updateGatewayAddressFromMagento( * * @param $billingAddress * @param $shippingAddress + * * @return string */ public function getShippingType($billingAddress, $shippingAddress): string @@ -488,6 +508,7 @@ public function getShippingType($billingAddress, $shippingAddress): string * Convert Street Lines To String * * @param array $streetLines + * * @return string */ private function convertStreetLinesToString(array $streetLines): string @@ -502,6 +523,7 @@ private function convertStreetLinesToString(array $streetLines): string * * @param OrderModel $order * @param Customer $gatewayCustomer + * * @throws UnzerApiException|LocalizedException */ public function updateGatewayCustomerFromOrder(OrderModel $order, Customer $gatewayCustomer): void @@ -541,6 +563,7 @@ public function updateGatewayCustomerFromOrder(OrderModel $order, Customer $gate * * @param OrderModel $order * @param Customer $gatewayCustomer + * * @return bool */ public function validateGatewayCustomerAgainstOrder(OrderModel $order, Customer $gatewayCustomer): bool @@ -575,6 +598,7 @@ public function validateGatewayCustomerAgainstOrder(OrderModel $order, Customer * * @param Address $gatewayAddress * @param OrderAddressInterface $magentoAddress + * * @return bool */ private function validateGatewayAddressAgainstOrderAddress( @@ -596,6 +620,7 @@ private function validateGatewayAddressAgainstOrderAddress( * Default -> unknown * * @param Quote $quote + * * @return string */ protected function getSalutationFromQuote(Quote $quote): string @@ -607,6 +632,7 @@ protected function getSalutationFromQuote(Quote $quote): string * Get Salutation From Gender * * @param float|int $gender + * * @return string */ protected function getSalutationFromGender($gender): string @@ -628,6 +654,7 @@ protected function getSalutationFromGender($gender): string * Get Salutation From Payment * * @param InfoInterface $payment + * * @return string|null */ protected function getSalutationFromPayment(InfoInterface $payment): ?string @@ -639,6 +666,7 @@ protected function getSalutationFromPayment(InfoInterface $payment): ?string * Get Birthdate from Payment * * @param InfoInterface $payment + * * @return string|null */ protected function getBirthdateFromPayment(InfoInterface $payment): ?string diff --git a/etc/adminhtml/system/klarna.xml b/etc/adminhtml/system/klarna.xml index 1d27873..4dfdc5e 100644 --- a/etc/adminhtml/system/klarna.xml +++ b/etc/adminhtml/system/klarna.xml @@ -14,12 +14,6 @@ payment/unzer_klarna/title - - - payment/unzer_klarna/order_payment_action - Unzer\PAPI\Model\System\Config\Source\PaymentAction - diff --git a/etc/config.xml b/etc/config.xml index 73a02cc..bdabfd1 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -485,6 +485,7 @@ 0 1 1 + 1 1 1 1 diff --git a/etc/di.xml b/etc/di.xml index a167197..6cba240 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1631,6 +1631,24 @@ + + + + Unzer\PAPI\Model\Command\Authorize + Unzer\PAPI\Model\Command\CancelAuthorization + Unzer\PAPI\Model\Command\Capture + Unzer\PAPI\Model\Command\Order + Unzer\PAPI\Model\Command\RefundCharge + Unzer\PAPI\Model\Command\RefundCharge + Unzer\PAPI\Model\Command\CancelAuthorization + Unzer\PAPI\Model\Command\Authorize + Unzer\PAPI\Model\Command\Capture + Unzer\PAPI\Model\Command\Capture + + + + + Unzer\PAPI\Model\Config::METHOD_KLARNA @@ -1638,7 +1656,7 @@ Magento\Payment\Block\Info UnzerKlarnaValueHandlerPool UnzerKlarnaValidatorPool - UnzerAuthorizeAndCaptureVaultCommandPool + UnzerAuthorizeAndCaptureKlarnaCommandPool From 8ccc875c14e03f053161b726b767305ab8af9381 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Fri, 20 Jun 2025 15:13:30 +0200 Subject: [PATCH 26/79] Fix Installment logic --- .../method-renderer/paylater_installment.js | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js b/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js index d2e4d6b..183bfec 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js +++ b/view/frontend/web/js/view/payment/method-renderer/paylater_installment.js @@ -1,19 +1,47 @@ define( [ - 'Unzer_PAPI/js/view/payment/method-renderer/basev2' + 'Unzer_PAPI/js/view/payment/method-renderer/basev2', + 'Magento_Checkout/js/model/quote' ], function ( - Component + Component, + quote ) { 'use strict'; return Component.extend({ isThreatMetrixNeeded: true, - + customersBirthDayNeeded: true, defaults: { template: 'Unzer_PAPI/payment/paylater_installment', paymentCode: 'unzer-paylater-installment' }, + + selectPaymentMethod: function () { + let retVal = this._super(); + + this.waitForSetBasketData(); + + return retVal; + }, + + waitForSetBasketData: function (maxRetries = 10, interval = 500) { + const unzerCheckoutElementId = 'unzer-payment-' + this.getCode(); + const unzerPayment = document.getElementById(unzerCheckoutElementId); + + if (unzerPayment && typeof unzerPayment.setBasketData === 'function') { + unzerPayment.setBasketData({ + country: quote.billingAddress().countryId, + amount: (quote.totals() ? quote.totals() : quote)['grand_total'], + currencyType: (quote.totals() ? quote.totals() : quote)['quote_currency_code'] + }) + } else if (maxRetries > 0) { + console.log('Waiting for setBasketData function to be available...'); + setTimeout(() => this.waitForSetBasketData(maxRetries - 1, interval), interval); + } else { + console.error('setBasketData is not available after multiple retries.'); + } + }, }); } ); From 9d774d5e3c3f82c6c00e1067bcb580e24a07a640 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 20 Jun 2025 16:10:46 +0200 Subject: [PATCH 27/79] Fix issues for php 8.4 ISSUE: MAIN-2256 --- Block/Info/Invoice.php | 2 +- Block/Info/PaylaterDirectDebit.php | 2 +- Block/Info/PaylaterInstallment.php | 2 +- Model/Command/AbstractCommand.php | 2 +- Model/Command/Capture.php | 2 +- Model/Config.php | 8 +++---- Model/Method/Base.php | 24 +++++++++---------- Model/Method/Invoice.php | 18 +++++++------- .../Method/OverrideApiCredentialInterface.php | 6 ++--- Model/Method/Prepayment.php | 18 +++++++------- composer.json | 4 ++-- 11 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Block/Info/Invoice.php b/Block/Info/Invoice.php index 70911fd..ae6370c 100644 --- a/Block/Info/Invoice.php +++ b/Block/Info/Invoice.php @@ -193,7 +193,7 @@ public function getOrder(): Order * @return string * @throws NoSuchEntityException */ - public function getStoreCode(string $storeId = null): string + public function getStoreCode(?string $storeId = null): string { return $this->_storeManager->getStore($storeId)->getCode(); } diff --git a/Block/Info/PaylaterDirectDebit.php b/Block/Info/PaylaterDirectDebit.php index c3844ee..b9d9cfb 100644 --- a/Block/Info/PaylaterDirectDebit.php +++ b/Block/Info/PaylaterDirectDebit.php @@ -98,7 +98,7 @@ protected function _getPayment(): Payment * @return string * @throws NoSuchEntityException */ - public function getStoreCode(string $storeId = null): string + public function getStoreCode(?string $storeId = null): string { return $this->_storeManager->getStore($storeId)->getCode(); } diff --git a/Block/Info/PaylaterInstallment.php b/Block/Info/PaylaterInstallment.php index 8c3f611..87ea5a9 100644 --- a/Block/Info/PaylaterInstallment.php +++ b/Block/Info/PaylaterInstallment.php @@ -98,7 +98,7 @@ protected function _getPayment(): Payment * @return string * @throws NoSuchEntityException */ - public function getStoreCode(string $storeId = null): string + public function getStoreCode(?string $storeId = null): string { return $this->_storeManager->getStore($storeId)->getCode(); } diff --git a/Model/Command/AbstractCommand.php b/Model/Command/AbstractCommand.php index 17fc28a..c608d7b 100644 --- a/Model/Command/AbstractCommand.php +++ b/Model/Command/AbstractCommand.php @@ -107,7 +107,7 @@ protected function _getCallbackUrl(): string * @param MethodInterface|null $paymentMethodInstance * @return Unzer */ - protected function _getClient(string $storeCode = null, MethodInterface $paymentMethodInstance = null): Unzer + protected function _getClient(?string $storeCode = null, ?MethodInterface $paymentMethodInstance = null): Unzer { if ($this->_client === null) { $this->_client = $this->_config->getUnzerClient($storeCode, $paymentMethodInstance); diff --git a/Model/Command/Capture.php b/Model/Command/Capture.php index 17ac1d7..1f1fc61 100644 --- a/Model/Command/Capture.php +++ b/Model/Command/Capture.php @@ -132,7 +132,7 @@ public function execute(array $commandSubject): ?ResultInterface * @return Charge * @throws UnzerApiException|LocalizedException */ - protected function _chargeExisting(Order $order, string $paymentId, float $amount, string $storeId = null): Charge + protected function _chargeExisting(Order $order, string $paymentId, float $amount, ?string $storeId = null): Charge { $payment = $this->_getClient($storeId, $order->getPayment()->getMethodInstance()) ->fetchPayment($paymentId); diff --git a/Model/Config.php b/Model/Config.php index db39d27..5075198 100644 --- a/Model/Config.php +++ b/Model/Config.php @@ -121,7 +121,7 @@ public function __construct( * @param string|null $storeId * @return bool */ - private function isDebugMode(string $storeId = null): bool + private function isDebugMode(?string $storeId = null): bool { return $this->_scopeConfig->isSetFlag( self::BASE_CONFIGURATION_PATH . self::KEY_LOGGING, @@ -137,7 +137,7 @@ private function isDebugMode(string $storeId = null): bool * @param MethodInterface|null $paymentMethodInstance * @return string|null */ - public function getPublicKey(string $storeId = null, MethodInterface $paymentMethodInstance = null): ?string + public function getPublicKey(?string $storeId = null, ?MethodInterface $paymentMethodInstance = null): ?string { if ($paymentMethodInstance instanceof OverrideApiCredentialInterface && $paymentMethodInstance->hasMethodValidOverrideKeys($storeId) @@ -159,7 +159,7 @@ public function getPublicKey(string $storeId = null, MethodInterface $paymentMet * @param MethodInterface|null $paymentMethodInstance * @return string|null */ - public function getPrivateKey(string $storeId = null, MethodInterface $paymentMethodInstance = null): ?string + public function getPrivateKey(?string $storeId = null, ?MethodInterface $paymentMethodInstance = null): ?string { if ($paymentMethodInstance instanceof OverrideApiCredentialInterface && $paymentMethodInstance->hasMethodValidOverrideKeys($storeId) @@ -181,7 +181,7 @@ public function getPrivateKey(string $storeId = null, MethodInterface $paymentMe * @param MethodInterface|null $paymentMethodInstance * @return Unzer */ - public function getUnzerClient(string $storeId = null, MethodInterface $paymentMethodInstance = null): Unzer + public function getUnzerClient(?string $storeId = null, ?MethodInterface $paymentMethodInstance = null): Unzer { $client = new Unzer( $this->getPrivateKey($storeId, $paymentMethodInstance), diff --git a/Model/Method/Base.php b/Model/Method/Base.php index 52a4e10..64221c7 100644 --- a/Model/Method/Base.php +++ b/Model/Method/Base.php @@ -50,18 +50,18 @@ class Base extends Adapter * @param LoggerInterface|null $logger */ public function __construct( - ManagerInterface $eventManager, + ManagerInterface $eventManager, ValueHandlerPoolInterface $valueHandlerPool, - PaymentDataObjectFactory $paymentDataObjectFactory, + PaymentDataObjectFactory $paymentDataObjectFactory, $code, $formBlockType, $infoBlockType, - ScopeConfigInterface $scopeConfig, - Config $moduleConfig, - CommandPoolInterface $commandPool = null, - ValidatorPoolInterface $validatorPool = null, - CommandManagerInterface $commandExecutor = null, - LoggerInterface $logger = null + ScopeConfigInterface $scopeConfig, + Config $moduleConfig, + ?CommandPoolInterface $commandPool = null, + ?ValidatorPoolInterface $validatorPool = null, + ?CommandManagerInterface $commandExecutor = null, + ?LoggerInterface $logger = null ) { parent::__construct( $eventManager, @@ -120,7 +120,7 @@ public function hasRedirect(): bool /** * @inheritDoc */ - public function isAvailable(CartInterface $quote = null) + public function isAvailable(?CartInterface $quote = null) { $moduleConfig = $this->_moduleConfig; if ($quote === null) { @@ -201,7 +201,7 @@ public function hasRiskData(): bool * @param string|null $storeId * @return bool */ - public function hasMethodValidOverrideKeys(string $storeId = null): bool + public function hasMethodValidOverrideKeys(?string $storeId = null): bool { if (!$this->getConfigData(Config::OVERRIDE_API_KEYS, $storeId)) { return false; @@ -222,7 +222,7 @@ public function hasMethodValidOverrideKeys(string $storeId = null): bool * @param string|null $storeId * @return string */ - public function getMethodOverridePublicKey(string $storeId = null): string + public function getMethodOverridePublicKey(?string $storeId = null): string { return (string)$this->getConfigData(Config::KEY_PUBLIC_KEY, $storeId); } @@ -233,7 +233,7 @@ public function getMethodOverridePublicKey(string $storeId = null): string * @param string|null $storeId * @return string */ - public function getMethodOverridePrivateKey(string $storeId = null): string + public function getMethodOverridePrivateKey(?string $storeId = null): string { return (string)$this->getConfigData(Config::KEY_PRIVATE_KEY, $storeId); } diff --git a/Model/Method/Invoice.php b/Model/Method/Invoice.php index 49cc1fe..b92c496 100644 --- a/Model/Method/Invoice.php +++ b/Model/Method/Invoice.php @@ -52,19 +52,19 @@ class Invoice extends Base * @param LoggerInterface|null $logger */ public function __construct( - ManagerInterface $eventManager, + ManagerInterface $eventManager, ValueHandlerPoolInterface $valueHandlerPool, - PaymentDataObjectFactory $paymentDataObjectFactory, + PaymentDataObjectFactory $paymentDataObjectFactory, $code, $formBlockType, $infoBlockType, - ScopeConfigInterface $scopeConfig, - Config $moduleConfig, - PriceCurrencyInterface $priceCurrency, - CommandPoolInterface $commandPool = null, - ValidatorPoolInterface $validatorPool = null, - CommandManagerInterface $commandExecutor = null, - LoggerInterface $logger = null + ScopeConfigInterface $scopeConfig, + Config $moduleConfig, + PriceCurrencyInterface $priceCurrency, + ?CommandPoolInterface $commandPool = null, + ?ValidatorPoolInterface $validatorPool = null, + ?CommandManagerInterface $commandExecutor = null, + ?LoggerInterface $logger = null ) { parent::__construct( $eventManager, diff --git a/Model/Method/OverrideApiCredentialInterface.php b/Model/Method/OverrideApiCredentialInterface.php index 34df343..f505a6e 100644 --- a/Model/Method/OverrideApiCredentialInterface.php +++ b/Model/Method/OverrideApiCredentialInterface.php @@ -15,7 +15,7 @@ interface OverrideApiCredentialInterface * @param string|null $storeId * @return bool */ - public function hasMethodValidOverrideKeys(string $storeId = null): bool; + public function hasMethodValidOverrideKeys(?string $storeId = null): bool; /** * Get Method Override Public Key @@ -23,7 +23,7 @@ public function hasMethodValidOverrideKeys(string $storeId = null): bool; * @param string|null $storeId * @return string */ - public function getMethodOverridePublicKey(string $storeId = null): string; + public function getMethodOverridePublicKey(?string $storeId = null): string; /** * Get Method Override Private Key @@ -31,5 +31,5 @@ public function getMethodOverridePublicKey(string $storeId = null): string; * @param string|null $storeId * @return string */ - public function getMethodOverridePrivateKey(string $storeId = null): string; + public function getMethodOverridePrivateKey(?string $storeId = null): string; } diff --git a/Model/Method/Prepayment.php b/Model/Method/Prepayment.php index 7c60b4d..222bf4c 100644 --- a/Model/Method/Prepayment.php +++ b/Model/Method/Prepayment.php @@ -49,19 +49,19 @@ class Prepayment extends Base * @param LoggerInterface|null $logger */ public function __construct( - ManagerInterface $eventManager, + ManagerInterface $eventManager, ValueHandlerPoolInterface $valueHandlerPool, - PaymentDataObjectFactory $paymentDataObjectFactory, + PaymentDataObjectFactory $paymentDataObjectFactory, $code, $formBlockType, $infoBlockType, - ScopeConfigInterface $scopeConfig, - Config $moduleConfig, - PriceCurrencyInterface $priceCurrency, - CommandPoolInterface $commandPool = null, - ValidatorPoolInterface $validatorPool = null, - CommandManagerInterface $commandExecutor = null, - LoggerInterface $logger = null + ScopeConfigInterface $scopeConfig, + Config $moduleConfig, + PriceCurrencyInterface $priceCurrency, + ?CommandPoolInterface $commandPool = null, + ?ValidatorPoolInterface $validatorPool = null, + ?CommandManagerInterface $commandExecutor = null, + ?LoggerInterface $logger = null ) { parent::__construct( $eventManager, diff --git a/composer.json b/composer.json index 956ad7c..2e80afc 100644 --- a/composer.json +++ b/composer.json @@ -5,8 +5,8 @@ "version": "3.2.9", "license": "Apache-2.0", "require": { - "php": "~7.4.0|~8.1.0|~8.2.0|~8.3.0", - "unzerdev/php-sdk": "^3.11.0", + "php": "~7.4.0|~8.1.0|~8.2.0|~8.3.0|~8.4.0", + "unzerdev/php-sdk": "^3.12.0", "ext-json": "*", "magento/framework": "*", "magento/module-backend": "*", From 04f06ac70223e41b84e2d1e9a2c8ecb6ab203c82 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Tue, 1 Jul 2025 11:35:22 +0200 Subject: [PATCH 28/79] Implement Invoice B2B --- Helper/Order.php | 34 +++++- Model/Command/AbstractCommand.php | 14 ++- .../Observer/BaseDataAssignObserver.php | 4 + i18n/de_DE.csv | 7 ++ i18n/en_US.csv | 7 ++ .../js/view/payment/method-renderer/basev2.js | 4 +- .../method-renderer/paylater_invoice_b2b.js | 112 +++++++++++------- .../payment/paylater_invoice_b2b.html | 28 ++--- 8 files changed, 142 insertions(+), 68 deletions(-) diff --git a/Helper/Order.php b/Helper/Order.php index de2c9d3..72c1ed8 100644 --- a/Helper/Order.php +++ b/Helper/Order.php @@ -31,6 +31,8 @@ use UnzerSDK\Resources\EmbeddedResources\Address; use UnzerSDK\Resources\EmbeddedResources\BasketItem; use UnzerSDK\Resources\EmbeddedResources\BasketItemFactory; +use UnzerSDK\Resources\EmbeddedResources\CompanyInfo; +use UnzerSDK\Resources\EmbeddedResources\CompanyOwner; use UnzerSDK\Resources\Metadata; use UnzerSDK\Resources\PaymentTypes\BasePaymentType; @@ -371,12 +373,20 @@ public function createCustomerFromQuote(Quote $quote, string $email, bool $creat * @param OrderModel $order * @param string $email * @param bool $createResource + * @param string|null $customerType * * @return Customer|null - * @throws UnzerApiException|LocalizedException + * + * @throws LocalizedException + * @throws UnzerApiException */ - public function createCustomerFromOrder(OrderModel $order, string $email, bool $createResource = false): ?Customer - { + public function createCustomerFromOrder( + OrderModel $order, + string $email, + bool $createResource = false, + ?string $customerType = null + ): + ?Customer { $client = $this->_moduleConfig->getUnzerClient( $order->getStore()->getCode(), $order->getPayment()->getMethodInstance() @@ -384,9 +394,11 @@ public function createCustomerFromOrder(OrderModel $order, string $email, bool $ $billingAddress = $order->getBillingAddress(); $customer = new Customer(); + $birthDate = null; + $currentLocale = $this->localeResolver->getLocale(); $languageCode = strtok($currentLocale, '_-'); - if($languageCode) { + if ($languageCode) { $customer->setLanguage($languageCode); } @@ -422,6 +434,20 @@ public function createCustomerFromOrder(OrderModel $order, string $email, bool $ $this->updateGatewayAddressFromMagento($customer->getShippingAddress(), $shippingAddress, $shippingType); } + if ($customerType) { + $companyInfo = new CompanyInfo(); + $companyInfo->setCompanyType($customerType); + $companyInfo->setRegistrationType('not_registered'); + $companyInfo->setFunction('OWNER'); + $owner = new CompanyOwner(); + $owner->setFirstname($customer->getFirstname()); + $owner->setLastname($customer->getLastname()); + $birthDate && $owner->setBirthdate($birthDate); + $companyInfo->setOwner($owner); + + $customer->setCompanyInfo($companyInfo); + } + return $createResource ? $client->createCustomer($customer) : $customer; } diff --git a/Model/Command/AbstractCommand.php b/Model/Command/AbstractCommand.php index 17fc28a..9698408 100644 --- a/Model/Command/AbstractCommand.php +++ b/Model/Command/AbstractCommand.php @@ -105,6 +105,7 @@ protected function _getCallbackUrl(): string * * @param string|null $storeCode * @param MethodInterface|null $paymentMethodInstance + * * @return Unzer */ protected function _getClient(string $storeCode = null, MethodInterface $paymentMethodInstance = null): Unzer @@ -129,6 +130,8 @@ protected function _getCustomerId(InfoInterface $payment, SalesOrder $order): ?s { /** @var string|null $customerId */ $customerId = (string)$payment->getAdditionalInformation(BaseDataAssignObserver::KEY_CUSTOMER_ID); + /** @var string|null $customerId */ + $customerType = (string)$payment->getAdditionalInformation(BaseDataAssignObserver::KEY_CUSTOMER_TYPE); $customer = $this->getCustomer( $customerId, @@ -138,7 +141,12 @@ protected function _getCustomerId(InfoInterface $payment, SalesOrder $order): ?s //customer not found on this account. create a new one... if ($customer === null) { - $customer = $this->_orderHelper->createCustomerFromOrder($order, $order->getCustomerEmail(), true); + $customer = $this->_orderHelper->createCustomerFromOrder( + $order, + $order->getCustomerEmail(), + true, + $customerType + ); $payment->setAdditionalInformation(BaseDataAssignObserver::KEY_CUSTOMER_ID, $customer->getId()); } @@ -156,6 +164,7 @@ protected function _getCustomerId(InfoInterface $payment, SalesOrder $order): ?s * @param string $customerId * @param string $storeCode * @param MethodInterface $paymentMethodInstance + * * @return Customer|null * @throws UnzerApiException */ @@ -187,6 +196,7 @@ protected function getCustomer( * * @param InfoInterface $payment * @param SalesOrder $order + * * @return string|null * @throws UnzerApiException|LocalizedException */ @@ -253,6 +263,7 @@ protected function addUnzerErrorToOrderHistory(SalesOrder $order, string $code, * Get Store Code * * @param int $storeId + * * @return string * @throws NoSuchEntityException */ @@ -265,6 +276,7 @@ public function getStoreCode(int $storeId): string * Is Vault Save Allowed * * @param MethodInterface $methodInstance + * * @return bool */ public function isVaultSaveAllowed(MethodInterface $methodInstance): bool diff --git a/Model/Method/Observer/BaseDataAssignObserver.php b/Model/Method/Observer/BaseDataAssignObserver.php index 606cfd4..1f10948 100644 --- a/Model/Method/Observer/BaseDataAssignObserver.php +++ b/Model/Method/Observer/BaseDataAssignObserver.php @@ -20,6 +20,8 @@ class BaseDataAssignObserver extends AbstractDataAssignObserver public const KEY_BIRTHDATE = 'birthDate'; public const KEY_SALUTATION = 'salutation'; + public const KEY_CUSTOMER_TYPE = 'customer_type'; + /** * @var array */ @@ -29,12 +31,14 @@ class BaseDataAssignObserver extends AbstractDataAssignObserver self::KEY_BIRTHDATE, self::KEY_SALUTATION, self::KEY_THREAT_METRIX_ID, + self::KEY_CUSTOMER_TYPE ]; /** * Execute * * @param Observer $observer + * * @return void */ public function execute(Observer $observer): void diff --git a/i18n/de_DE.csv b/i18n/de_DE.csv index 9bb63e3..d2785cb 100644 --- a/i18n/de_DE.csv +++ b/i18n/de_DE.csv @@ -102,3 +102,10 @@ "There will be no notification if the payment has been aborted.","Sollte die Zahlung abgebrochen worden sein, erfolgt keine weitere Mitteilung." "Please contact us for further information.","Bitte kontaktieren Sie uns für weitere Informationen." "Unknown Email Address","Unbekannte Email Adresse" + +"Company type","Art des Unternehmens" +"Other","Sonstige" +"Authority","Behörde" +"Association","Gesellschaft" +"Sole","Einzelunternehmen", +"Company","Firma" diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 5f389bf..d011067 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -102,3 +102,10 @@ "There will be no notification if the payment has been aborted. Please contact us for further information.","There will be no notification if the payment has been aborted." "Please contact us for further information.","Please contact us for further information." "Unknown Email Address","Unknown Email Address" + +"Company type","Company type" +"Other","Other" +"Authority","Authority" +"Association","Association" +"Sole","Sole", +"Company","Company" diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index 3c2d2d8..a41d31d 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -37,6 +37,7 @@ define( buttonNeeded: true, paymentCode: null, customersBirthDayNeeded: false, + customerType: null, defaults: { config: null, @@ -199,7 +200,8 @@ define( 'additional_data': { 'customer_id': this.customer, 'resource_id': this.resourceId, - 'birthDate': this.customersBirthDay + 'birthDate': this.customersBirthDay, + 'customer_type': this.customerType, } }; diff --git a/view/frontend/web/js/view/payment/method-renderer/paylater_invoice_b2b.js b/view/frontend/web/js/view/payment/method-renderer/paylater_invoice_b2b.js index ceebffd..7213a9c 100644 --- a/view/frontend/web/js/view/payment/method-renderer/paylater_invoice_b2b.js +++ b/view/frontend/web/js/view/payment/method-renderer/paylater_invoice_b2b.js @@ -2,10 +2,19 @@ define( [ 'jquery', 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Unzer_PAPI/js/model/checkout/threat-metrix' + 'mage/translate', + 'Magento_Ui/js/model/messageList', + 'Magento_Checkout/js/action/place-order', + 'Unzer_PAPI/js/view/payment/method-renderer/basev2' ], - function ($, ko, Component, threatMetrix) { + function ( + $, + ko, + $t, + globalMessageList, + placeOrderAction, + Component + ) { 'use strict'; return Component.extend({ @@ -13,56 +22,67 @@ define( defaults: { customerType: 'b2b', - template: 'Unzer_PAPI/payment/paylater_invoice_b2b' + template: 'Unzer_PAPI/payment/paylater_invoice_b2b', + paymentCode: 'unzer-paylater-invoice', + customersBirthDayNeeded: true, }, - initializeForm: function () { - this.resourceProvider = this.sdk.PaylaterInvoice(); - this.initializeCustomerForm( - 'unzer-paylater-invoice-b2b-customer', - 'unzer-paylater-invoice-b2b-customer-error' - ); - }, - - _initializeCustomerFormForB2bCustomer: function (fieldId, errorFieldId, customer) { - threatMetrix.init(customer.threat_metrix_id, this); - - this.resourceProvider.create({ - containerId: fieldId+'-optin', - customerType: 'B2B', - errorHolderId: errorFieldId, - }); - - this.customerProvider = this.sdk.B2BCustomer(); - this.customerProvider.initFormFields(customer); - this.customerProvider.create({ - containerId: fieldId, - errorHolderId: errorFieldId, - fields: ['companyInfo'], - showHeader: false, - paymentTypeName: 'paylater-invoice' - }); + getPlaceOrderDeferredObject: function () { + let deferred = $.Deferred(), + self = this; - this.hideFormFields(fieldId); - }, - - hideFormFields: function (fieldId) { - this._super(fieldId); + Promise.all([ + customElements.whenDefined(this.paymentCode) + ]).then(() => { + const unzerCheckoutElementId = 'unzer-checkout-' + this.getCode(); + const unzerCheckout = document.getElementById(unzerCheckoutElementId); - var field = $('#' + fieldId); - field.find('.field').filter('.checkbox-billingAddress, .email').hide(); - field.find('.field').filter('.billing-name, .billing-street, .billing-zip, .billing-city, :has(.billing-country)').hide(); + unzerCheckout.onPaymentSubmit = response => { + if (response.submitResponse && response.submitResponse.success) { + this.resourceId = response.submitResponse.data.id; + const dropdown = document.getElementById('unzer-dropdown-field'); + this.customerType = dropdown.value; - field.find('.unzerUI.form>.checkboxLabel').hide(); - field.find('.unzerUI.form>.salutation-unzer-paylater-invoice-b2b-customer').hide(); - }, + if (this.customersBirthDayNeeded) { + this.customersBirthDay = document.querySelector(this.paymentCode).shadowRoot?.querySelector('uds-input-date[name="birthDate"]').value; + } - allInputsValid: function () { - return this.customerValid(); - }, + placeOrderAction(self.getData(), self.messageContainer) + .done(function () { + deferred.resolve.apply(deferred, arguments); + }) + .fail(function (request) { + if (request.responseJSON && request.responseJSON.message) { + globalMessageList.addErrorMessage({ + message: request.responseJSON.message + }); + deferred.reject(request.responseJSON.message); + } else { + globalMessageList.addErrorMessage({ + message: 'An unknown error occurred. Please try again.' + }); + deferred.reject('An unknown error occurred.'); + } + }); + } else { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + response.submitResponse.message + }); + deferred.reject($t('There was an error placing your order. ' + response.submitResponse.message)); + } + }; + }).catch(error => { + globalMessageList.addErrorMessage({ + message: 'There was an error placing your order. ' + error + }); + deferred.reject($t('There was an error placing your order. ' + error)); + }); - validate: function () { - return this.allInputsValid(); + return deferred.fail(function (error) { + globalMessageList.addErrorMessage({ + message: error + }); + }); } }); } diff --git a/view/frontend/web/template/payment/paylater_invoice_b2b.html b/view/frontend/web/template/payment/paylater_invoice_b2b.html index 319ee7d..71ea997 100644 --- a/view/frontend/web/template/payment/paylater_invoice_b2b.html +++ b/view/frontend/web/template/payment/paylater_invoice_b2b.html @@ -15,23 +15,19 @@
+
+ + +
+ +
-
-
-
-
- -
-
From 48da2fb24cd898930c4d6c18c175872641beef86 Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Fri, 18 Jul 2025 15:06:12 +0200 Subject: [PATCH 29/79] Fix issues for php 8.4 ISSUE: MAIN-2256 --- Helper/Payment.php | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Helper/Payment.php b/Helper/Payment.php index 359c26e..336ec94 100644 --- a/Helper/Payment.php +++ b/Helper/Payment.php @@ -283,7 +283,7 @@ private function processCompletedState(OrderInterface $order, PaymentResource $p $this->_transactionRepository->save($paymentTransaction); $parentPaymentTransaction = $paymentTransaction->getParentTransaction(); - if ($parentPaymentTransaction !== null && + if (!empty($parentPaymentTransaction) && !$parentPaymentTransaction->getIsClosed() ) { $parentPaymentTransaction->setIsClosed(true); diff --git a/composer.json b/composer.json index 2e80afc..1038b39 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "license": "Apache-2.0", "require": { "php": "~7.4.0|~8.1.0|~8.2.0|~8.3.0|~8.4.0", - "unzerdev/php-sdk": "^3.12.0", + "unzerdev/php-sdk": "^3.13.0", "ext-json": "*", "magento/framework": "*", "magento/module-backend": "*", From 96b34fe9f40c32b078aa036c78ca23e1324e4cc4 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Thu, 24 Jul 2025 09:52:23 +0200 Subject: [PATCH 30/79] Fix B2C customer creation logic --- Helper/Order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Helper/Order.php b/Helper/Order.php index 72c1ed8..4439133 100644 --- a/Helper/Order.php +++ b/Helper/Order.php @@ -434,7 +434,7 @@ public function createCustomerFromOrder( $this->updateGatewayAddressFromMagento($customer->getShippingAddress(), $shippingAddress, $shippingType); } - if ($customerType) { + if ($customerType && $customerType !== 'b2c') { $companyInfo = new CompanyInfo(); $companyInfo->setCompanyType($customerType); $companyInfo->setRegistrationType('not_registered'); From 64ea6455342a10e12d2a39f3e1b324ab2d1f4992 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Tue, 12 Aug 2025 10:05:13 +0200 Subject: [PATCH 31/79] Fix error when there are not allowed cards configured for Google Pay ISSUE: UD-6 --- Model/Method/Googlepay.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Model/Method/Googlepay.php b/Model/Method/Googlepay.php index 40db07d..148915d 100644 --- a/Model/Method/Googlepay.php +++ b/Model/Method/Googlepay.php @@ -42,7 +42,8 @@ public function getFrontendConfig(): array $parentConfig['merchant_id'] = $this->getConfigData(self::CONFIG_MERCHANT_ID); $parentConfig['merchant_name'] = $this->getConfigData(self::CONFIG_MERCHANT_NAME); $parentConfig['country_code'] = $this->getConfigData(self::CONFIG_COUNTRY_CODE); - $parentConfig['allowed_card_networks'] = explode(',', $this->getConfigData(self::CONFIG_ALLOWED_CARD_NETWORKS)); + $parentConfig['allowed_card_networks'] = $this->getConfigData(self::CONFIG_ALLOWED_CARD_NETWORKS) ? + explode(',', $this->getConfigData(self::CONFIG_ALLOWED_CARD_NETWORKS)) : []; $parentConfig['allow_credit_cards'] = $this->getConfigData(self::CONFIG_ALLOW_CREDIT_CARDS); $parentConfig['allow_prepaid_cards'] = $this->getConfigData(self::CONFIG_ALLOW_PREPAID_CARDS); $parentConfig['button_color'] = $this->getConfigData(self::CONFIG_BUTTON_COLOR); From b4f71b1999656d91eaf09a0d19c4d7d01a3e1e8f Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Mon, 25 Aug 2025 13:43:34 +0200 Subject: [PATCH 32/79] Add currency restriction for the Direct Bank Transfer method ISSUE: UD-30 --- etc/config.xml | 1 + etc/di.xml | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index bdabfd1..8870cda 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -467,6 +467,7 @@ 0 0 AT,DE + EUR 0 1 1 diff --git a/etc/di.xml b/etc/di.xml index 6cba240..8e9a184 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1570,12 +1570,20 @@ UnzerOpenBankingConfig + + + + + + UnzerOpenBankingConfig + UnzerOpenBankingValidatorCountry + UnzerOpenBankingValidatorCurrency From cb39a80292f3b9269c108774260f6154cf3775f0 Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Mon, 25 Aug 2025 14:54:21 +0200 Subject: [PATCH 33/79] Add currency restriction for the EPS method ISSUE: UD-34 --- etc/config.xml | 1 + etc/di.xml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index 8870cda..a34de47 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -302,6 +302,7 @@ 1 0 AT + EUR Unzer\PAPI\Model\Method\EPS diff --git a/etc/di.xml b/etc/di.xml index 8e9a184..c653695 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1050,10 +1050,17 @@ + + + UnzerEPSConfig + + + UnzerEPSValidatorCountry + UnzerEPSValidatorCurrency From 43b1434e3791d78f480905449cd7315c113328cf Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Mon, 25 Aug 2025 15:16:37 +0200 Subject: [PATCH 34/79] Add currency restriction for the Prepayment method ISSUE: UD-34 --- etc/config.xml | 1 + etc/di.xml | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index a34de47..dcc6c2e 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -385,6 +385,7 @@ 1 0 1 + EUR Unzer\PAPI\Model\Method\Prepayment diff --git a/etc/di.xml b/etc/di.xml index c653695..fdf4c86 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1319,10 +1319,18 @@ + + + + UnzerEPSConfig + + + UnzerPrepaymentValidatorCountry + UnzerPrepaymentValidatorCurrency From 49c6c8d2d8a69251bb3205df9a52c519674ed625 Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Mon, 25 Aug 2025 16:32:27 +0200 Subject: [PATCH 35/79] Add currency restriction for the WeChat Pay method ISSUE: UD-38 --- etc/config.xml | 1 + etc/di.xml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index dcc6c2e..d9029cd 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -335,6 +335,7 @@ 1 0 AT,BE,DK,FI,FR,DE,ES,GB,GR,HU,IE,IS,IT,LI,LU,MT,NL,NO,PT,SE + CHF,CNY,EUR,GBP,USD Unzer\PAPI\Model\Method\Wechatpay diff --git a/etc/di.xml b/etc/di.xml index fdf4c86..73958c4 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1159,10 +1159,17 @@ + + + UnzerWechatpayConfig + + + UnzerWechatpayValidatorCountry + UnzerWechatpayValidatorCurrency From 7826b2bda5b2dedd53489097a691a5c2107ce922 Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Tue, 26 Aug 2025 11:02:20 +0200 Subject: [PATCH 36/79] Update country restriction for the Direct Bank Transfer method ISSUE: UD-30 --- etc/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/config.xml b/etc/config.xml index d9029cd..2dc1779 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -469,7 +469,7 @@ 0 0 0 - AT,DE + DE EUR 0 1 From 39f02f35ef7dfbe83392e89e5a80847835ca39ce Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Tue, 26 Aug 2025 11:57:48 +0200 Subject: [PATCH 37/79] Add currency restriction for the Bancontact method ISSUE: UD-39 --- etc/config.xml | 1 + etc/di.xml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index 2dc1779..04d356c 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -369,6 +369,7 @@ 1 0 BE + EUR Unzer\PAPI\Model\Method\Bancontact diff --git a/etc/di.xml b/etc/di.xml index 73958c4..6c64831 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1275,10 +1275,17 @@ + + + UnzerBancontactConfig + + + UnzerBancontactValidatorCountry + UnzerBancontactValidatorCurrency From 2737c2f46547aa62eb5001a828ac45d492a7f94f Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Tue, 26 Aug 2025 13:12:29 +0200 Subject: [PATCH 38/79] Add currency restriction for the iDEAL method ISSUE: UD-40 --- etc/config.xml | 1 + etc/di.xml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index 04d356c..1087ccf 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -96,6 +96,7 @@ 0 0 NL + EUR 0 1 1 diff --git a/etc/di.xml b/etc/di.xml index 6c64831..f7318e0 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -424,10 +424,17 @@ + + + UnzerIdealConfig + + + UnzerIdealValidatorCountry + UnzerIdealValidatorCurrency From 13cff09828ed0983eaa1255713a9d17277548163 Mon Sep 17 00:00:00 2001 From: Tamara Vukovic Date: Tue, 26 Aug 2025 13:31:46 +0200 Subject: [PATCH 39/79] Add currency restriction for the Alipay method ISSUE: UD-41 --- etc/config.xml | 1 + etc/di.xml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/etc/config.xml b/etc/config.xml index 1087ccf..fb0737a 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -320,6 +320,7 @@ 1 0 DE,AT,BE,IT,ES,NL + AUD,CAD,CHF,CNY,EUR,GBP,HKD,NZD,SGD,USD Unzer\PAPI\Model\Method\Alipay diff --git a/etc/di.xml b/etc/di.xml index f7318e0..a544dab 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -1115,10 +1115,17 @@ + + + UnzerAlipayConfig + + + UnzerAlipayValidatorCountry + UnzerAlipayValidatorCurrency From 07c74d0404b214117246c7085dd57439abc179bb Mon Sep 17 00:00:00 2001 From: Kristina Date: Tue, 26 Aug 2025 14:39:06 +0200 Subject: [PATCH 40/79] Add spacing to Place Order button --- view/frontend/web/css/unzer.css | 4 ++++ view/frontend/web/js/view/payment/method-renderer/basev2.js | 1 + 2 files changed, 5 insertions(+) diff --git a/view/frontend/web/css/unzer.css b/view/frontend/web/css/unzer.css index 9d589ca..142ffc2 100644 --- a/view/frontend/web/css/unzer.css +++ b/view/frontend/web/css/unzer.css @@ -5330,3 +5330,7 @@ i.h-iconideal-van-lanschot:before { .unzerChoices[data-type*=select-multiple] .unzerChoices__input.is-hidden, .unzerChoices[data-type*=select-one] .unzerChoices__input.is-hidden, .unzerChoices__input.is-hidden { display: none } + +.unzerPlaceOrderPadding { + margin: 12px; +} diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index a41d31d..009270a 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -120,6 +120,7 @@ define( const payButton = $('
- ]]> - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_applepay/active - - - - payment/unzer_applepay/title - - - - payment/unzer_applepay/order_payment_action - Unzer\PAPI\Model\System\Config\Source\PaymentAction - - - - payment/unzer_applepay/min_order_total - - - - payment/unzer_applepay/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_applepay/apple_pay_merchant_id - - - - payment/unzer_applepay/display_name - - - - payment/unzer_applepay/domain_name - - - - Unzer\PAPI\Model\System\Config\Backend\Upload - upload/applepay - - - - Unzer\PAPI\Model\System\Config\Backend\Upload - upload/applepay - - - - - Unzer\PAPI\Model\System\Config\Backend\Upload - upload/applepay_csr - - - - Unzer\PAPI\Model\System\Config\Backend\Upload - upload/applepay_csr - - - - - Unzer\PAPI\Block\System\Config\WebhooksApplepayButtons - - - - Unzer\PAPI\Model\Source\Applepay\SupportedNetworks - - - - payment/unzer_applepay/sort_order - - - diff --git a/etc/adminhtml/system/bank_transfer.xml b/etc/adminhtml/system/bank_transfer.xml deleted file mode 100644 index 4d5d8ba..0000000 --- a/etc/adminhtml/system/bank_transfer.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_bank_transfer/active - - - - payment/unzer_bank_transfer/title - - - - payment/unzer_bank_transfer/min_order_total - - - - payment/unzer_bank_transfer/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_bank_transfer/sort_order - - - diff --git a/etc/adminhtml/system/direct_debit_secured.xml b/etc/adminhtml/system/direct_debit_secured.xml deleted file mode 100644 index 2c26cb1..0000000 --- a/etc/adminhtml/system/direct_debit_secured.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_direct_debit_secured/active - - - - payment/unzer_direct_debit_secured/title - - - - Name of merchant for SEPA mandate. - payment/unzer_direct_debit_secured/merchant_name - required-entry - - 1 - - - - - payment/unzer_direct_debit_secured/min_order_total - - - - payment/unzer_direct_debit_secured/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_direct_debit_secured/sort_order - - - diff --git a/etc/adminhtml/system/giropay.xml b/etc/adminhtml/system/giropay.xml deleted file mode 100644 index 1b9bc58..0000000 --- a/etc/adminhtml/system/giropay.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_giropay/active - - - - payment/unzer_giropay/title - - - - payment/unzer_giropay/min_order_total - - - - payment/unzer_giropay/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_giropay/sort_order - - - diff --git a/etc/adminhtml/system/invoice.xml b/etc/adminhtml/system/invoice.xml deleted file mode 100644 index 5a08049..0000000 --- a/etc/adminhtml/system/invoice.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_invoice/active - - - - payment/unzer_invoice/title - - - - payment/unzer_invoice/min_order_total - - - - payment/unzer_invoice/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_invoice/sort_order - - - diff --git a/etc/adminhtml/system/invoice_secured.xml b/etc/adminhtml/system/invoice_secured.xml deleted file mode 100644 index 45cde8d..0000000 --- a/etc/adminhtml/system/invoice_secured.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_invoice_secured/active - - - - payment/unzer_invoice_secured/title - - - - payment/unzer_invoice_secured/min_order_total - - - - payment/unzer_invoice_secured/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_invoice_secured/sort_order - - - diff --git a/etc/adminhtml/system/invoice_secured_b2b.xml b/etc/adminhtml/system/invoice_secured_b2b.xml deleted file mode 100644 index 224221f..0000000 --- a/etc/adminhtml/system/invoice_secured_b2b.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_invoice_secured_b2b/active - - - - payment/unzer_invoice_secured_b2b/title - - - - payment/unzer_invoice_secured_b2b/min_order_total - - - - payment/unzer_invoice_secured_b2b/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_invoice_secured_b2b/sort_order - - - diff --git a/etc/adminhtml/system/sofort.xml b/etc/adminhtml/system/sofort.xml deleted file mode 100644 index 84de9f3..0000000 --- a/etc/adminhtml/system/sofort.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Magento\Config\Model\Config\Source\Yesno - payment/unzer_sofort/active - - - - payment/unzer_sofort/title - - - - payment/unzer_sofort/min_order_total - - - - payment/unzer_sofort/max_order_total - Insert 0 to disable limit. - - - - payment/unzer_sofort/sort_order - - - diff --git a/etc/config.xml b/etc/config.xml index fc32b98..891faad 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -55,39 +55,6 @@ EUR Unzer\PAPI\Model\Method\DirectDebit - - 0 - authorize_capture - authorize_capture - <![CDATA[(Deprecated) SEPA Direct Debit Secured]]> - 0 - 0 - 0 - AT,CH,DE - 0 - 1 - 0 - 1 - 0 - Unzer\PAPI\Model\Method\DirectDebitSecured - - - 0 - order - authorize_capture - <![CDATA[Unzer Bank Transfer]]> - 0 - 0 - 0 - AT,DE - 0 - 1 - 1 - 1 - 1 - 0 - Unzer\PAPI\Model\Method\BankTransfer - 0 order @@ -105,53 +72,6 @@ 0 Unzer\PAPI\Model\Method\Ideal - - 0 - authorize_capture - authorize_capture - <![CDATA[(Deprecated) Unzer Invoice]]> - 0 - 0 - 0 - 0 - 0 - 1 - 0 - processing - Unzer\PAPI\Model\Method\Invoice - - - 0 - authorize_capture - authorize_capture - <![CDATA[(Deprecated) Unzer Invoice Secured]]> - 0 - 0 - 0 - AT,DE - 0 - 0 - 1 - 1 - processing - Unzer\PAPI\Model\Method\InvoiceSecured - - - 0 - authorize_capture - authorize_capture - <![CDATA[(Deprecated) Unzer Invoice Secured B2B]]> - 0 - 0 - 0 - AT,DE - 0 - 0 - 1 - 0 - processing - Unzer\PAPI\Model\Method\InvoiceSecuredB2b - 0 order @@ -262,38 +182,6 @@ UnzerPaypalVault <![CDATA[Stored Paypal Account]]> - - 0 - order - authorize_capture - <![CDATA[Sofort]]> - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 0 - AT,BE,CH,DE,ES,GB,IT,NL,PL - Unzer\PAPI\Model\Method\Sofort - - - 0 - order - authorize_capture - <![CDATA[(Deprecated) Giropay]]> - 0 - 0 - 0 - 0 - 1 - 1 - 0 - 0 - DE - Unzer\PAPI\Model\Method\Giropay - 0 order @@ -397,22 +285,6 @@ EUR Unzer\PAPI\Model\Method\Prepayment - - 0 - order - authorize_capture - <![CDATA[Apple Pay]]> - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0 - Unzer\PAPI\Model\Method\Applepay - 0 order diff --git a/etc/di.xml b/etc/di.xml index 3683e60..3a156cf 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -296,110 +296,6 @@ - - - - Unzer\PAPI\Model\Config::METHOD_DIRECT_DEBIT_SECURED - - - - - - UnzerDirectDebitSecuredConfig - - - - - - - UnzerDirectDebitSecuredConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerDirectDebitSecuredConfig - - - - - - - UnzerDirectDebitSecuredValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_DIRECT_DEBIT_SECURED - Magento\Payment\Block\Form - Magento\Payment\Block\Info - UnzerDirectDebitSecuredValueHandlerPool - UnzerDirectDebitSecuredValidatorPool - UnzerCaptureCommandPool - - - - - - - Unzer\PAPI\Model\Config::METHOD_BANK_TRANSFER - - - - - - UnzerBankTransferConfig - - - - - - - UnzerBankTransferConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerBankTransferConfig - - - - - - - UnzerBankTransferValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_BANK_TRANSFER - Magento\Payment\Block\Form - Magento\Payment\Block\Info - UnzerBankTransferValueHandlerPool - UnzerBankTransferValidatorPool - UnzerCaptureCommandPool - - - @@ -458,165 +354,6 @@ - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE - - - - - - UnzerInvoiceConfig - - - - - - - UnzerInvoiceConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\InvoiceCaptureHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerInvoiceConfig - - - - - - - UnzerInvoiceValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE - Magento\Payment\Block\Form - Unzer\PAPI\Block\Info\Invoice - UnzerInvoiceValueHandlerPool - UnzerInvoiceValidatorPool - UnzerCaptureCommandPool - - - - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE_SECURED_B2B - - - - - - UnzerInvoiceSecuredB2bConfig - - - - - - - UnzerInvoiceSecuredB2bConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\InvoiceCaptureHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerInvoiceSecuredB2bConfig - - - - - - - UnzerInvoiceSecuredB2bValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE_SECURED_B2B - Magento\Payment\Block\Form - Unzer\PAPI\Block\Info\InvoiceSecuredB2b - UnzerInvoiceSecuredB2bValueHandlerPool - UnzerInvoiceSecuredB2bValidatorPool - UnzerCaptureCommandPool - - - - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE_SECURED - - - - - - UnzerInvoiceSecuredConfig - - - - - - - UnzerInvoiceSecuredConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\InvoiceCaptureHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerInvoiceSecuredConfig - - - - - - - UnzerInvoiceSecuredValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_INVOICE_SECURED - Unzer\PAPI\Block\Form\InvoiceSecured - Unzer\PAPI\Block\Info\InvoiceSecured - UnzerInvoiceSecuredValueHandlerPool - UnzerInvoiceSecuredValidatorPool - UnzerCaptureCommandPool - - - @@ -963,108 +700,6 @@ - - - - Unzer\PAPI\Model\Config::METHOD_SOFORT - - - - - - UnzerSofortConfig - - - - - - - UnzerSofortConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerSofortConfig - - - - - - - UnzerSofortValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_SOFORT - Magento\Payment\Block\Form - Magento\Payment\Block\Info - UnzerSofortValueHandlerPool - UnzerSofortValidatorPool - UnzerCaptureCommandPool - - - - - - - Unzer\PAPI\Model\Config::METHOD_GIROPAY - - - - - - UnzerGiropayConfig - - - - - - - UnzerGiropayConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerGiropayConfig - - - - - - - UnzerGiropayValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_GIROPAY - Magento\Payment\Block\Form - Magento\Payment\Block\Info - UnzerGiropayValueHandlerPool - UnzerGiropayValidatorPool - UnzerCaptureCommandPool - - - @@ -1413,56 +1048,6 @@ UnzerCaptureCommandPool - - - - Unzer\PAPI\Model\Config::METHOD_APPLEPAY - - - - - - UnzerApplepayConfig - - - - - - - UnzerApplepayConfigValueHandler - Unzer\PAPI\Model\Config\CanCancelHandler - Unzer\PAPI\Model\Config\CanRefundHandler - Unzer\PAPI\Model\Config\CanRefundHandler - - Unzer\PAPI\Model\Config\CanVoidHandler - - - - - - - UnzerApplepayConfig - - - - - - - UnzerApplepayValidatorCountry - - - - - - - Unzer\PAPI\Model\Config::METHOD_APPLEPAY - Magento\Payment\Block\Form - Magento\Payment\Block\Info - UnzerApplepayValueHandlerPool - UnzerApplepayValidatorPool - UnzerAuthorizeAndCaptureCommandPool - - diff --git a/etc/events.xml b/etc/events.xml index 7073194..1454606 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -6,24 +6,9 @@ - - - - - - - - - - - - - - - @@ -39,12 +24,6 @@ - - - - - - @@ -63,9 +42,6 @@ - - - diff --git a/i18n/de_DE.csv b/i18n/de_DE.csv index d2785cb..ad0180c 100644 --- a/i18n/de_DE.csv +++ b/i18n/de_DE.csv @@ -2,20 +2,13 @@ "UNZER_MAIN","Einstellungen" "UNZER_CARDS","Kreditkarte / Debitkarte" "UNZER_DIRECT_DEBIT","SEPA Lastschrift" -"UNZER_DIRECT_DEBIT_SECURED","(Veraltet) SEPA Lastschrift Gesichert" "UNZER_EPS","EPS" -"UNZER_GIROPAY","(Veraltet) Giropay" -"UNZER_BANK_TRANSFER","Unzer Direktüberweisung" "UNZER_IDEAL","iDEAL" -"UNZER_INVOICE","(Veraltet) Unzer Rechnungskauf" -"UNZER_INVOICE_SECURED","(Veraltet) Unzer Rechnungskauf Gesichert (B2C)" -"UNZER_INVOICE_SECURED_B2B","(Veraltet) Unzer Rechnungskauf Gesichert (B2B)" "UNZER_PAYLATER_INVOICE","Rechnungskauf (B2C)" "UNZER_PAYLATER_INVOICE_B2B","Rechnungskauf (B2B)" "UNZER_PAYLATER_INSTALLMENT","Ratenkauf" "UNZER_PAYLATER_DIRECT_DEBIT","Lastschrift" "UNZER_PAYPAL","PayPal" -"UNZER_SOFORT","Sofort" "UNZER_INFO_LABEL","Allgemeine Information" "UNZER_ALIPAY","Alipay" "UNZER_WECHATPAY","WeChat Pay" @@ -23,7 +16,6 @@ "UNZER_BANCONTACT","Bancontact" "UNZER_PREPAYMENT","Unzer Prepayment" "UNZER_ABOUT_US","Unzer ist eine innovative und modulare Plattform für den internationalen Zahlungsverkehr. Unternehmen aller Größen und Branchen vertrauen auf die datengetriebenen, sicheren und passgenauen Lösungen für mehr Wachstum – online, mobil oder am Point of Sale. Die einfach integrierbaren Module decken das gesamte Spektrum des Zahlungsmanagements ab: Von der Abwicklung verschiedener Zahlungsarten über automatisierte Analysen von Kundenverhalten und -bedürfnissen bis hin zum ganzheitlichen Risikomanagement.

Mehr Informationen finden Sie auf www.unzer.com" -"UNZER_APPLEPAY","(Deprecated) Apple Pay" "UNZER_APPLEPAYV2","Apple Pay" "UNZER_GOOGLEPAY","Google Pay" "UNZER_TWINT","TWINT" @@ -51,27 +43,19 @@ "Credit Card / Debit Card","Kreditkarte / Debitkarte" "Credit Card / Debit Card, ","Kreditkarte / Debitkarte, " "SEPA Direct Debit","SEPA Lastschrift" -"(Deprecated) SEPA Direct Debit Secured","(Veraltet) SEPA Lastschrift Gesichert" "EPS","EPS" -"(Deprecated) Giropay","(Veraltet) Giropay" "iDEAL","iDEAL" -"(Deprecated) Unzer Invoice Secured B2B","(Veraltet) Rechnungskauf Gesichert B2B" -"(Deprecated) Unzer Invoice Secured","(Veraltet) Rechnungskauf Gesichert" -"(Deprecated) Unzer Invoice","(Veraltet) Rechnungskauf" "Paylater Invoice","Rechnungskauf" "Paylater Invoice B2B","Rechnungskauf B2B" "Unzer Installment","Ratenkauf" "Direct Debit","Lastschrift" "PayPal","PayPal" "PayPal Account","PayPal Konto" -"Sofort","Sofort" -"Unzer Bank Transfer","Unzer Direktüberweisung" "Alipay","Alipay" "WeChat Pay","WeChat Pay" "Przelewy24","Przelewy24" "Bancontact","Bancontact" "Unzer Prepayment","Unzer Vorkasse" -"ApplePay","ApplePay" "GooglePay","GooglePay" "TWINT","TWINT" diff --git a/i18n/en_US.csv b/i18n/en_US.csv index d011067..30b4d4e 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -2,20 +2,13 @@ "UNZER_MAIN","Settings" "UNZER_CARDS","Credit Card / Debit Card" "UNZER_DIRECT_DEBIT","SEPA Direct Debit" -"UNZER_DIRECT_DEBIT_SECURED","(Deprecated) SEPA Direct Debit Secured" "UNZER_EPS","EPS" -"UNZER_GIROPAY","(Deprecated) Giropay" -"UNZER_BANK_TRANSFER","Unzer Bank Transfer" "UNZER_IDEAL","iDEAL" -"UNZER_INVOICE","(Deprecated) Unzer Invoice" -"UNZER_INVOICE_SECURED","(Deprecated) Unzer Invoice secured (B2C)" -"UNZER_INVOICE_SECURED_B2B","(Deprecated) Unzer Invoice secured (B2B)" "UNZER_PAYLATER_INVOICE","Invoice (B2C)" "UNZER_PAYLATER_INVOICE_B2B","Invoice (B2B)" "UNZER_PAYLATER_INSTALLMENT","Installment" "UNZER_PAYLATER_DIRECT_DEBIT","Direct Debit" "UNZER_PAYPAL","PayPal" -"UNZER_SOFORT","SOFORT" "UNZER_INFO_LABEL","General Information" "UNZER_ALIPAY","Alipay" "UNZER_WECHATPAY","WeChat Pay" @@ -23,7 +16,6 @@ "UNZER_BANCONTACT","Bancontact" "UNZER_PREPAYMENT","Unzer Prepayment" "UNZER_ABOUT_US","Unzer is an innovative and modular platform for international payment transactions. Companies of all sizes and from all sectors rely on the data-driven, secure and perfectly tailored solutions to help them drive growth – whether online, mobile or at the point of sale. The modules, which are easy to integrate, cover the entire spectrum of payment management: from processing of various payment types, through automated analytics of customer behaviour and requirements, all the way up to integrative risk management.

For more information please visit www.unzer.com" -"UNZER_APPLEPAY","(Deprecated) Apple Pay" "UNZER_APPLEPAYV2","Apple Pay" "UNZER_GOOGLEPAY","Google Pay" "UNZER_TWINT","TWINT" @@ -51,27 +43,19 @@ "Credit Card / Debit Card","Credit Card / Debit Card" "Credit Card / Debit Card, ","Credit Card / Debit Card, " "SEPA Direct Debit","SEPA Direct Debit" -"(Deprecated) SEPA Direct Debit Secured","(Deprecated) SEPA Direct Debit Secured" -"Unzer Bank Transfer","Unzer Bank Transfer" "iDEAL","iDEAL" -"(Deprecated) Unzer Invoice Secured B2B","(Deprecated) Invoice Secured B2B" -"(Deprecated) Unzer Invoice Secured","(Deprecated) Invoice Secured" -"(Deprecated) Unzer Invoice","(Deprecated) Invoice" "Paylater Invoice","Invoice" "Paylater Invoice B2B","Invoice B2B" "Unzer Installment","Installment" "Direct Debit","Direct Debit" "PayPal","PayPal" "PayPal Account","PayPal Account" -"Sofort","Sofort" -"(Deprecated) Giropay","(Veraltet) Giropay" "EPS","EPS" "Alipay","Alipay" "WeChat Pay","WeChat Pay" "Przelewy24","Przelewy24" "Bancontact","Bancontact" "Unzer Prepayment","Unzer Prepayment" -"ApplePay","ApplePay" "GooglePay","GooglePay" "TWINT","TWINT" diff --git a/view/frontend/layout/checkout_index_index.xml b/view/frontend/layout/checkout_index_index.xml index 60118cc..0bbb05b 100644 --- a/view/frontend/layout/checkout_index_index.xml +++ b/view/frontend/layout/checkout_index_index.xml @@ -32,24 +32,9 @@ true - - true - - - true - true - - true - - - true - - - true - true @@ -68,12 +53,6 @@ true - - true - - - true - true @@ -92,9 +71,6 @@ true - - true - true diff --git a/view/frontend/web/js/view/payment/method-renderer.js b/view/frontend/web/js/view/payment/method-renderer.js index 21a904f..4986f49 100644 --- a/view/frontend/web/js/view/payment/method-renderer.js +++ b/view/frontend/web/js/view/payment/method-renderer.js @@ -17,30 +17,10 @@ define( type: 'unzer_direct_debit', component: 'Unzer_PAPI/js/view/payment/method-renderer/direct_debit' }, - { - type: 'unzer_direct_debit_secured', - component: 'Unzer_PAPI/js/view/payment/method-renderer/direct_debit_secured' - }, - { - type: 'unzer_bank_transfer', - component: 'Unzer_PAPI/js/view/payment/method-renderer/bank_transfer' - }, { type: 'unzer_ideal', component: 'Unzer_PAPI/js/view/payment/method-renderer/ideal' }, - { - type: 'unzer_invoice', - component: 'Unzer_PAPI/js/view/payment/method-renderer/invoice' - }, - { - type: 'unzer_invoice_secured', - component: 'Unzer_PAPI/js/view/payment/method-renderer/invoice_secured' - }, - { - type: 'unzer_invoice_secured_b2b', - component: 'Unzer_PAPI/js/view/payment/method-renderer/invoice_secured_b2b' - }, { type: 'unzer_paylater_invoice', component: 'Unzer_PAPI/js/view/payment/method-renderer/paylater_invoice' @@ -61,14 +41,6 @@ define( type: 'unzer_paypal', component: 'Unzer_PAPI/js/view/payment/method-renderer/paypal' }, - { - type: 'unzer_sofort', - component: 'Unzer_PAPI/js/view/payment/method-renderer/sofort' - }, - { - type: 'unzer_giropay', - component: 'Unzer_PAPI/js/view/payment/method-renderer/giropay' - }, { type: 'unzer_eps', component: 'Unzer_PAPI/js/view/payment/method-renderer/eps' @@ -93,10 +65,6 @@ define( type: 'unzer_prepayment', component: 'Unzer_PAPI/js/view/payment/method-renderer/prepayment' }, - { - type: 'unzer_applepay', - component: 'Unzer_PAPI/js/view/payment/method-renderer/applepay' - }, { type: 'unzer_applepayv2', component: 'Unzer_PAPI/js/view/payment/method-renderer/applepayv2' diff --git a/view/frontend/web/js/view/payment/method-renderer/applepay.js b/view/frontend/web/js/view/payment/method-renderer/applepay.js deleted file mode 100644 index 5906181..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/applepay.js +++ /dev/null @@ -1,108 +0,0 @@ -define( - [ - 'jquery', - 'Unzer_PAPI/js/view/payment/method-renderer/base', - 'Magento_Checkout/js/model/quote', - '//applepay.cdn-apple.com/jsapi/v1/apple-pay-sdk.js' - ], - function ($, Component, quote) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/applepay' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.ApplePay(); - }, - setupApplePaySession() { - this.startApplePaySession(this.resourceProvider) - }, - - startApplePaySession: function (resourceProvider) { - var self = this; - //console.log(window.checkoutConfig.quoteData); - window.checkoutConfig.quoteData.trigger_reload = new Date().getTime(); - let applePayPaymentRequest = { - countryCode: quote.billingAddress().countryId, - currencyCode: window.checkoutConfig.quoteData.quote_currency_code, - totalLabel: window.checkoutConfig.payment.unzer_applepay.label, //display_name - totalAmount: Number(window.checkoutConfig.quoteData.base_grand_total).toFixed(2), - supportedNetworks: window.checkoutConfig.payment.unzer_applepay.supportedNetworks, - merchantCapabilities: window.checkoutConfig.payment.unzer_applepay.merchantCapabilities, - requiredShippingContactFields: [], - requiredBillingContactFields: [], - total: { - label: window.checkoutConfig.payment.unzer_applepay.label, - amount: Number(window.checkoutConfig.quoteData.base_grand_total).toFixed(2) - } - }; - - if (window.ApplePaySession && ApplePaySession.canMakePayments()) { - const session = new ApplePaySession(6, applePayPaymentRequest); - - session.onvalidatemerchant = function (event) { - self.merchantValidationCallback(session, event); - }; - - session.onpaymentauthorized = function (event) { - self.applePayAuthorizedCallback(resourceProvider, event, session); - }; - - session.onpaymentmethodselected = function (event) { - const update = { - "newTotal": { - "label": window.checkoutConfig.payment.unzer_applepay.label, - "type": "final", - "amount": Number(window.checkoutConfig.quoteData.base_grand_total).toFixed(2) - } - }; - session.completePaymentMethodSelection(update); - }; - - session.oncancel = function (event) { - - }; - - session.begin(); - - } else { - self.handleError("This device does not support Apple Pay!"); - } - }, - - handleError: function (message) { - jQuery('#unzer-applepay-error').html(message); - }, - - merchantValidationCallback: function (session, event) { - jQuery.post('/unzer/applepay/merchantvalidation', JSON.stringify({"merchantValidationUrl": event.validationURL,"storeId" : window.checkoutConfig.quoteData.store_id}), null, 'json') - .done(function (validationResponse) { - try { - session.completeMerchantValidation(validationResponse); - } catch (e) { - self.handleError(JSON.stringify(e.message)); - session.abort(); - } - - }) - .fail(function (error) { - self.handleError(JSON.stringify(error.statusText)); - session.abort(); - }); - }, - - applePayAuthorizedCallback: function (resourceProvider, event, session) { - var self = this; - // Get payment data from event. "event.payment" also contains contact information, if they were set via Apple Pay. - const paymentData = event.payment.token.paymentData; - session.completePayment({status: window.ApplePaySession.STATUS_SUCCESS}); - this.paymentData = paymentData; - - self.placeOrder(); - } - }); - }, -); - diff --git a/view/frontend/web/js/view/payment/method-renderer/bank_transfer.js b/view/frontend/web/js/view/payment/method-renderer/bank_transfer.js deleted file mode 100644 index 3704ce3..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/bank_transfer.js +++ /dev/null @@ -1,18 +0,0 @@ -define( - [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function (Component) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/bank_transfer' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.FlexiPayDirect(); - }, - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/direct_debit_secured.js b/view/frontend/web/js/view/payment/method-renderer/direct_debit_secured.js deleted file mode 100644 index 635b8fe..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/direct_debit_secured.js +++ /dev/null @@ -1,65 +0,0 @@ -define( - [ - 'jquery', - 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/direct_debit' - ], - function ($, ko, Component) { - 'use strict'; - - return Component.extend({ - defaults: { - ibanValid: false, - template: 'Unzer_PAPI/payment/direct_debit_secured' - }, - - initializeForm: function () { - const self = this; - - this.initializeCustomerForm( - 'unzer-sepa-direct-debit-secured-customer', - 'unzer-sepa-direct-debit-secured-customer-error' - ); - - this.resourceProvider = this.sdk.SepaDirectDebitSecured(); - this.resourceProvider.create('sepa-direct-debit-secured', { - containerId: 'unzer-sepa-direct-debit-secured-iban-field' - }); - - this.ibanValid = ko.observable(false); - - this.resourceProvider.addEventListener('change', function (event) { - self.ibanValid("success" in event && event.success); - }); - - const sepaMandateElement = document.querySelector('.sepa-direct-debit-secured-mandate'), - sepaMandateTexts = [ - $.mage.__('By signing this mandate form, you authorise %1 to send instructions to ' - + 'your bank to debit your account and your bank to debit your account in accordance with the ' - + 'instructions from %1.'), - $.mage.__('Note: As part of your rights, you are entitled to a refund from your ' - + 'bank under the terms and conditions of your agreement with your bank. A refund must be claimed ' - + 'within 8 weeks starting from the date on which your account was debited. Your rights regarding ' - + 'this SEPA mandate are explained in a statement that you can obtain from your bank.'), - $.mage.__('In case of refusal or rejection of direct debit payment I instruct my ' - + 'bank irrevocably to inform %1 or any third party upon request about my name, address and date ' - + 'of birth.'), - ]; - - sepaMandateTexts.forEach(function (text) { - const p = document.createElement("p"); - p.innerText = text.replace(/%1/g, window.checkoutConfig.payment.unzer_direct_debit_secured.merchantName); - sepaMandateElement.appendChild(p); - }); - }, - - allInputsValid: function () { - const self = this; - - return ko.computed(function () { - return self.customerValid() && self.ibanValid(); - }); - } - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/giropay.js b/view/frontend/web/js/view/payment/method-renderer/giropay.js deleted file mode 100644 index a855090..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/giropay.js +++ /dev/null @@ -1,18 +0,0 @@ -define( - [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function (Component) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/giropay' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.Giropay(); - }, - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/invoice.js b/view/frontend/web/js/view/payment/method-renderer/invoice.js deleted file mode 100644 index b14ffd4..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/invoice.js +++ /dev/null @@ -1,18 +0,0 @@ -define( - [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function (Component) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/invoice' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.Invoice(); - }, - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/invoice_secured.js b/view/frontend/web/js/view/payment/method-renderer/invoice_secured.js deleted file mode 100644 index 40b9b42..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/invoice_secured.js +++ /dev/null @@ -1,31 +0,0 @@ -define( - [ - 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function (ko, Component) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/invoice_secured' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.InvoiceSecured(); - this.initializeCustomerForm( - 'unzer-invoice-secured-customer', - 'unzer-invoice-secured-customer-error' - ); - }, - - allInputsValid: function () { - return this.customerValid(); - }, - - validate: function () { - return this.allInputsValid(); - }, - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/invoice_secured_b2b.js b/view/frontend/web/js/view/payment/method-renderer/invoice_secured_b2b.js deleted file mode 100644 index 09ab720..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/invoice_secured_b2b.js +++ /dev/null @@ -1,39 +0,0 @@ -define( - [ - 'jquery', - 'ko', - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function ($, ko, Component) { - 'use strict'; - - return Component.extend({ - defaults: { - customerType: 'b2b', - template: 'Unzer_PAPI/payment/invoice_secured_b2b' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.InvoiceSecured(); - this.initializeCustomerForm( - 'unzer-invoice-secured-b2b-customer', - 'unzer-invoice-secured-b2b-customer-error' - ); - }, - - hideFormFields: function (fieldId) { - const field = $('#' + fieldId); - field.find('.field').filter('.city, .company, :has(.country), .street, .zip').hide(); - field.find('.unzerUI.divider-horizontal:eq(0)').hide(); - }, - - allInputsValid: function () { - return this.customerValid(); - }, - - validate: function () { - return this.allInputsValid(); - }, - }); - } -); diff --git a/view/frontend/web/js/view/payment/method-renderer/sofort.js b/view/frontend/web/js/view/payment/method-renderer/sofort.js deleted file mode 100644 index 28cec68..0000000 --- a/view/frontend/web/js/view/payment/method-renderer/sofort.js +++ /dev/null @@ -1,18 +0,0 @@ -define( - [ - 'Unzer_PAPI/js/view/payment/method-renderer/base' - ], - function (Component) { - 'use strict'; - - return Component.extend({ - defaults: { - template: 'Unzer_PAPI/payment/sofort' - }, - - initializeForm: function () { - this.resourceProvider = this.sdk.Sofort(); - }, - }); - } -); diff --git a/view/frontend/web/template/payment/applepay.html b/view/frontend/web/template/payment/applepay.html deleted file mode 100644 index cccde29..0000000 --- a/view/frontend/web/template/payment/applepay.html +++ /dev/null @@ -1,88 +0,0 @@ -
-
- - -
-
-
- - - -
-
-
-
- - -
- -
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/bank_transfer.html b/view/frontend/web/template/payment/bank_transfer.html deleted file mode 100644 index a3c9b72..0000000 --- a/view/frontend/web/template/payment/bank_transfer.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
- -
-
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/direct_debit_secured.html b/view/frontend/web/template/payment/direct_debit_secured.html deleted file mode 100644 index ec3ab80..0000000 --- a/view/frontend/web/template/payment/direct_debit_secured.html +++ /dev/null @@ -1,45 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
-
-
-
- -
-
-

-
-
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/invoice.html b/view/frontend/web/template/payment/invoice.html deleted file mode 100644 index a3c9b72..0000000 --- a/view/frontend/web/template/payment/invoice.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
- -
-
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/invoice_secured.html b/view/frontend/web/template/payment/invoice_secured.html deleted file mode 100644 index d805e9d..0000000 --- a/view/frontend/web/template/payment/invoice_secured.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
-
-
- -
-
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/invoice_secured_b2b.html b/view/frontend/web/template/payment/invoice_secured_b2b.html deleted file mode 100644 index 7736e48..0000000 --- a/view/frontend/web/template/payment/invoice_secured_b2b.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
-
-
- -
-
-
- - - -
-
-
diff --git a/view/frontend/web/template/payment/sofort.html b/view/frontend/web/template/payment/sofort.html deleted file mode 100644 index a3c9b72..0000000 --- a/view/frontend/web/template/payment/sofort.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
- -
-
-
- - - -
-
-
From e9d4ccab7776be39020ee5ad0c3f0bfe7dd4dd4d Mon Sep 17 00:00:00 2001 From: Kristina Date: Wed, 3 Sep 2025 16:02:23 +0200 Subject: [PATCH 51/79] Remove deprecated payment methods ISSUE: MAGENTO-301 --- Model/Method/Invoice.php | 113 ++++++++++++++++++ .../web/template/payment/giropay.html | 39 ------ 2 files changed, 113 insertions(+), 39 deletions(-) create mode 100644 Model/Method/Invoice.php delete mode 100644 view/frontend/web/template/payment/giropay.html diff --git a/Model/Method/Invoice.php b/Model/Method/Invoice.php new file mode 100644 index 0000000..b92c496 --- /dev/null +++ b/Model/Method/Invoice.php @@ -0,0 +1,113 @@ +_priceCurrency = $priceCurrency; + } + + /** + * Calculate Remaining Amount + * + * @param Payment $payment + * @return float + * @throws UnzerApiException + */ + protected function calculateRemainingAmount(Payment $payment): float + { + $charges = $payment->getCharges(); + $initialTransaction = $payment->getInitialTransaction(); + + if ($initialTransaction instanceof Authorization && count($charges) === 0) { + return $initialTransaction->getAmount(); + } + + $chargedAmount = 0; + foreach ($charges as $charge) { + /** @var Charge $charge */ + if ($charge->isSuccess()) { + $chargedAmount += (float)$charge->getAmount(); + } + } + + return $payment->getAmount()->getTotal() - $charges[0]->getCancelledAmount() - $chargedAmount; + } +} diff --git a/view/frontend/web/template/payment/giropay.html b/view/frontend/web/template/payment/giropay.html deleted file mode 100644 index a3c9b72..0000000 --- a/view/frontend/web/template/payment/giropay.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- - -
-
-
- - - -
- -
-
- -
-
-
- - - -
-
-
From 2e24c34a5ccd20f6e15079a21e704a573a97b14f Mon Sep 17 00:00:00 2001 From: Kristina Date: Wed, 3 Sep 2025 17:01:19 +0200 Subject: [PATCH 52/79] Remove deprecated payment methods ISSUE: MAGENTO-301 --- Block/Form/InvoiceSecured.php | 90 -------------- Block/Info/InvoiceSecured.php | 53 -------- Block/Info/InvoiceSecuredB2b.php | 26 ---- .../layout/sales_order_create_index.xml | 2 - ...order_create_load_block_billing_method.xml | 2 - .../templates/form/invoice_secured.phtml | 115 ------------------ .../templates/info/invoice_secured.phtml | 54 -------- .../templates/info/invoice_secured_b2b.phtml | 54 -------- .../templates/info/pdf/invoice_secured.phtml | 31 ----- .../info/pdf/invoice_secured_b2b.phtml | 31 ----- .../templates/info/invoice_secured.phtml | 21 ---- .../templates/info/invoice_secured_b2b.phtml | 21 ---- 12 files changed, 500 deletions(-) delete mode 100644 Block/Form/InvoiceSecured.php delete mode 100644 Block/Info/InvoiceSecured.php delete mode 100644 Block/Info/InvoiceSecuredB2b.php delete mode 100644 view/adminhtml/templates/form/invoice_secured.phtml delete mode 100644 view/adminhtml/templates/info/invoice_secured.phtml delete mode 100644 view/adminhtml/templates/info/invoice_secured_b2b.phtml delete mode 100644 view/adminhtml/templates/info/pdf/invoice_secured.phtml delete mode 100644 view/adminhtml/templates/info/pdf/invoice_secured_b2b.phtml delete mode 100644 view/frontend/templates/info/invoice_secured.phtml delete mode 100644 view/frontend/templates/info/invoice_secured_b2b.phtml diff --git a/Block/Form/InvoiceSecured.php b/Block/Form/InvoiceSecured.php deleted file mode 100644 index 9ed8078..0000000 --- a/Block/Form/InvoiceSecured.php +++ /dev/null @@ -1,90 +0,0 @@ -salutation = $salutation; - $this->birthDateFactory = $birthDateFactory; - } - - /** - * Get Salutation Options - * - * @return array - */ - public function getSalutationOptions(): array - { - return $this->salutation->toOptionArray(); - } - - /** - * Get BirthDate - * - * @return BirthDate - * @throws LocalizedException - */ - public function getBirthDate(): BirthDate - { - if ($this->birthDate === null) { - $this->birthDate = $this->birthDateFactory->create(); - $this->birthDate->setDate($this->getInfoData('birthDate')); - } - return $this->birthDate; - } - - /** - * Get Info Data - * - * @param string $field - * @return mixed - * @throws LocalizedException - */ - public function getInfoData($field) - { - return $this->getMethod()->getInfoInstance()->getData($field); - } -} diff --git a/Block/Info/InvoiceSecured.php b/Block/Info/InvoiceSecured.php deleted file mode 100644 index 676ab9c..0000000 --- a/Block/Info/InvoiceSecured.php +++ /dev/null @@ -1,53 +0,0 @@ -setTemplate('Unzer_PAPI::info/pdf/invoice_secured.phtml'); - return $this->toHtml(); - } - - /** - * Get Customer Salutation - * - * @return string - * @throws LocalizedException - * @throws UnzerApiException - */ - public function getCustomerSalutation(): string - { - return $this->_getPayment()->getCustomer()->getSalutation(); - } - - /** - * Get Customer BirthDate - * - * @return string|null - * @throws LocalizedException - * @throws UnzerApiException - */ - public function getCustomerBirthdate(): ?string - { - return $this->_getPayment()->getCustomer()->getBirthDate(); - } -} diff --git a/Block/Info/InvoiceSecuredB2b.php b/Block/Info/InvoiceSecuredB2b.php deleted file mode 100644 index e401f7f..0000000 --- a/Block/Info/InvoiceSecuredB2b.php +++ /dev/null @@ -1,26 +0,0 @@ -setTemplate('Unzer_PAPI::info/pdf/invoice_secured_b2b.phtml'); - return $this->toHtml(); - } -} diff --git a/view/adminhtml/layout/sales_order_create_index.xml b/view/adminhtml/layout/sales_order_create_index.xml index 5e0c620..f0332a6 100644 --- a/view/adminhtml/layout/sales_order_create_index.xml +++ b/view/adminhtml/layout/sales_order_create_index.xml @@ -3,8 +3,6 @@ - unzer_invoice_secured - Unzer_PAPI::form/invoice_secured.phtml diff --git a/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml b/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml index 79f477d..d385fe4 100644 --- a/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml +++ b/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml @@ -3,8 +3,6 @@ - unzer_invoice_secured - Unzer_PAPI::form/invoice_secured.phtml diff --git a/view/adminhtml/templates/form/invoice_secured.phtml b/view/adminhtml/templates/form/invoice_secured.phtml deleted file mode 100644 index 9d18733..0000000 --- a/view/adminhtml/templates/form/invoice_secured.phtml +++ /dev/null @@ -1,115 +0,0 @@ -escapeHtml($block->getMethodCode()); -$birthDateDay = $block->getBirthDate()->getDay(); -$birthDateMonth = $block->getBirthDate()->getMonth(); -$birthDateYear = $block->getBirthDate()->getYear(); -$salutation = $block->getInfoData('salutation'); -?> -
-
- -
- -
-
- -
- -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-renderStyleAsTag( - "display:none", - 'fieldset#payment_form_' . /* @noEscape */ $code); -} -?> diff --git a/view/adminhtml/templates/info/invoice_secured.phtml b/view/adminhtml/templates/info/invoice_secured.phtml deleted file mode 100644 index 97d334a..0000000 --- a/view/adminhtml/templates/info/invoice_secured.phtml +++ /dev/null @@ -1,54 +0,0 @@ - -
- escapeHtml($block->getMethod()->getTitle()); ?> -
-hasAccountData()): ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - getCustomerBirthdate()): ?> - - - - - -
- escapeHtml(__('Unzer Payment Information')); ?> -
escapeHtml(__('Account Holder')); ?>:escapeHtml($block->getAccountHolder()); ?>
escapeHtml(__('IBAN')); ?>:escapeHtml($block->getAccountIban()); ?>
escapeHtml(__('BIC')); ?>:escapeHtml($block->getAccountBic()); ?>
escapeHtml(__('Reference')); ?>:escapeHtml($block->getReference()); ?>
- escapeHtml(__('Customer Information')); ?> -
escapeHtml(__('Salutation')); ?>:escapeHtml(__($block->getCustomerSalutation())); ?>
escapeHtml(__('Birthdate')); ?>:escapeHtml($block->getCustomerBirthdate()); ?>
- diff --git a/view/adminhtml/templates/info/invoice_secured_b2b.phtml b/view/adminhtml/templates/info/invoice_secured_b2b.phtml deleted file mode 100644 index 902b3de..0000000 --- a/view/adminhtml/templates/info/invoice_secured_b2b.phtml +++ /dev/null @@ -1,54 +0,0 @@ - -
- escapeHtml($block->getMethod()->getTitle()); ?> -
-hasAccountData()): ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - getCustomerBirthdate()): ?> - - - - - -
- escapeHtml(__('Unzer Payment Information')); ?> -
escapeHtml(__('Account Holder')); ?>:escapeHtml($block->getAccountHolder()); ?>
escapeHtml(__('IBAN')); ?>:escapeHtml($block->getAccountIban()); ?>
escapeHtml(__('BIC')); ?>:escapeHtml($block->getAccountBic()); ?>
escapeHtml(__('Reference')); ?>:escapeHtml($block->getReference()); ?>
- escapeHtml(__('Customer Information')); ?> -
escapeHtml(__('Salutation')); ?>:escapeHtml(__($block->getCustomerSalutation())); ?>
escapeHtml(__('Birthdate')); ?>:escapeHtml($block->getCustomerBirthdate()); ?>
- diff --git a/view/adminhtml/templates/info/pdf/invoice_secured.phtml b/view/adminhtml/templates/info/pdf/invoice_secured.phtml deleted file mode 100644 index 3a40305..0000000 --- a/view/adminhtml/templates/info/pdf/invoice_secured.phtml +++ /dev/null @@ -1,31 +0,0 @@ - -escapeHtml($block->getMethod()->getTitle()); ?> - -hasAccountData()): ?> - {{pdf_row_separator}} - escapeHtml(__('Account Holder')); ?> - - escapeHtml($block->getAccountHolder()) ?> - {{pdf_row_separator}} - escapeHtml(__('IBAN')); ?> - - escapeHtml($block->getAccountIban()) ?> - {{pdf_row_separator}} - escapeHtml(__('BIC')); ?> - - escapeHtml($block->getAccountBic()) ?> - {{pdf_row_separator}} - escapeHtml(__('Reference')); ?> - - escapeHtml($block->getReference()) ?> - diff --git a/view/adminhtml/templates/info/pdf/invoice_secured_b2b.phtml b/view/adminhtml/templates/info/pdf/invoice_secured_b2b.phtml deleted file mode 100644 index f93f5e1..0000000 --- a/view/adminhtml/templates/info/pdf/invoice_secured_b2b.phtml +++ /dev/null @@ -1,31 +0,0 @@ - -escapeHtml($block->getMethod()->getTitle()); ?> - -hasAccountData()): ?> - {{pdf_row_separator}} - escapeHtml(__('Account Holder')); ?> - - escapeHtml($block->getAccountHolder()) ?> - {{pdf_row_separator}} - escapeHtml(__('IBAN')); ?> - - escapeHtml($block->getAccountIban()) ?> - {{pdf_row_separator}} - escapeHtml(__('BIC')); ?> - - escapeHtml($block->getAccountBic()) ?> - {{pdf_row_separator}} - escapeHtml(__('Reference')); ?> - - escapeHtml($block->getReference()) ?> - diff --git a/view/frontend/templates/info/invoice_secured.phtml b/view/frontend/templates/info/invoice_secured.phtml deleted file mode 100644 index 70a326f..0000000 --- a/view/frontend/templates/info/invoice_secured.phtml +++ /dev/null @@ -1,21 +0,0 @@ - -
-
escapeHtml($block->getMethod()->getTitle()) ?>
- getMethod()->getAdditionalPaymentInformation($this->getOrder()); ?> - -
- escapeHtml(__('Payment information')) ?>
- -
- -
diff --git a/view/frontend/templates/info/invoice_secured_b2b.phtml b/view/frontend/templates/info/invoice_secured_b2b.phtml deleted file mode 100644 index 30e5703..0000000 --- a/view/frontend/templates/info/invoice_secured_b2b.phtml +++ /dev/null @@ -1,21 +0,0 @@ - -
-
escapeHtml($block->getMethod()->getTitle()) ?>
- getMethod()->getAdditionalPaymentInformation($this->getOrder()); ?> - -
- escapeHtml(__('Payment information')) ?>
- -
- -
From 1f44fae2df47e0705edd125b74c45aad2e10c7a2 Mon Sep 17 00:00:00 2001 From: Kristina Date: Thu, 4 Sep 2025 12:15:20 +0200 Subject: [PATCH 53/79] Fix order status in Magento after the refund and void action ISSUE: MAGENTO-311 --- Helper/Payment.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Helper/Payment.php b/Helper/Payment.php index f385df5..65ab77a 100644 --- a/Helper/Payment.php +++ b/Helper/Payment.php @@ -234,6 +234,12 @@ private function processCanceledState(OrderInterface $order, PaymentResource $pa $this->_orderRepository->save($order); } } + + if ($payment->getAmount()->getTotal() === $payment->getAmount()->getCanceled()) { + $order->setState(Order::STATE_CLOSED); + $order->setStatus($order->getConfig()->getStateDefaultStatus(Order::STATE_CLOSED)); + $this->_orderRepository->save($order); + } } /** @@ -278,7 +284,7 @@ private function processCompletedState(OrderInterface $order, PaymentResource $p /** @var Order\Invoice $invoice */ $invoice = $order->getInvoiceCollection()->getItemByColumnValue('transaction_id', $transactionId); - if ((int)$invoice->getState() === Order\Invoice::STATE_OPEN) { + if ($invoice !== null && (int)$invoice->getState() === Order\Invoice::STATE_OPEN) { $invoice->pay(); $order = $invoice->getOrder(); From 6af48a3150f7e4fd1d24f1d205468743aed3a5dd Mon Sep 17 00:00:00 2001 From: Kristina Date: Thu, 4 Sep 2025 15:38:18 +0200 Subject: [PATCH 54/79] Fix payment method name for Direct Debit UPL ISSUE: MAGENTO-317 --- etc/config.xml | 2 +- i18n/de_DE.csv | 4 ++-- i18n/en_US.csv | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/etc/config.xml b/etc/config.xml index 891faad..c81fea2 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -136,7 +136,7 @@ 0 order authorize - <![CDATA[Direct Debit]]> + <![CDATA[Direct Debit Secured]]> 0 0 0 diff --git a/i18n/de_DE.csv b/i18n/de_DE.csv index ad0180c..ec008b8 100644 --- a/i18n/de_DE.csv +++ b/i18n/de_DE.csv @@ -7,7 +7,7 @@ "UNZER_PAYLATER_INVOICE","Rechnungskauf (B2C)" "UNZER_PAYLATER_INVOICE_B2B","Rechnungskauf (B2B)" "UNZER_PAYLATER_INSTALLMENT","Ratenkauf" -"UNZER_PAYLATER_DIRECT_DEBIT","Lastschrift" +"UNZER_PAYLATER_DIRECT_DEBIT","Gesicherte Lastschrift" "UNZER_PAYPAL","PayPal" "UNZER_INFO_LABEL","Allgemeine Information" "UNZER_ALIPAY","Alipay" @@ -48,7 +48,7 @@ "Paylater Invoice","Rechnungskauf" "Paylater Invoice B2B","Rechnungskauf B2B" "Unzer Installment","Ratenkauf" -"Direct Debit","Lastschrift" +"Direct Debit Secured","Gesicherte Lastschrift" "PayPal","PayPal" "PayPal Account","PayPal Konto" "Alipay","Alipay" diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 30b4d4e..39f191a 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -7,7 +7,7 @@ "UNZER_PAYLATER_INVOICE","Invoice (B2C)" "UNZER_PAYLATER_INVOICE_B2B","Invoice (B2B)" "UNZER_PAYLATER_INSTALLMENT","Installment" -"UNZER_PAYLATER_DIRECT_DEBIT","Direct Debit" +"UNZER_PAYLATER_DIRECT_DEBIT","Direct Debit Secured" "UNZER_PAYPAL","PayPal" "UNZER_INFO_LABEL","General Information" "UNZER_ALIPAY","Alipay" @@ -47,7 +47,7 @@ "Paylater Invoice","Invoice" "Paylater Invoice B2B","Invoice B2B" "Unzer Installment","Installment" -"Direct Debit","Direct Debit" +"Direct Debit Secured","Direct Debit Secured" "PayPal","PayPal" "PayPal Account","PayPal Account" "EPS","EPS" From eba625af2bfc81f3d7c04f6e89cbfd09ff26a2ec Mon Sep 17 00:00:00 2001 From: Kristina Date: Fri, 5 Sep 2025 09:54:03 +0200 Subject: [PATCH 55/79] Fix order status in Magento after the void action ISSUE: MAGENTO-311 --- Helper/Payment.php | 11 +++++++---- Model/Command/TransactionSynchronizer.php | 4 ---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Helper/Payment.php b/Helper/Payment.php index 65ab77a..8804ce4 100644 --- a/Helper/Payment.php +++ b/Helper/Payment.php @@ -205,6 +205,7 @@ public function processState(OrderInterface $order, PaymentResource $payment): v * * @throws AlreadyExistsException * @throws InputException + * @throws LocalizedException * @throws NoSuchEntityException * @throws UnzerApiException */ @@ -235,11 +236,13 @@ private function processCanceledState(OrderInterface $order, PaymentResource $pa } } - if ($payment->getAmount()->getTotal() === $payment->getAmount()->getCanceled()) { - $order->setState(Order::STATE_CLOSED); - $order->setStatus($order->getConfig()->getStateDefaultStatus(Order::STATE_CLOSED)); - $this->_orderRepository->save($order); + if ($payment->getAmount()->getTotal() && $payment->getAmount()->getTotal() === $payment->getAmount()->getCanceled()) { + $this->setOrderState($order, Order::STATE_CLOSED, Order::STATE_CLOSED); + } else { + $this->setOrderState($order, Order::STATE_CANCELED, Order::STATE_CANCELED); } + + $this->_orderRepository->save($order); } /** diff --git a/Model/Command/TransactionSynchronizer.php b/Model/Command/TransactionSynchronizer.php index ff0245d..c4ad54f 100644 --- a/Model/Command/TransactionSynchronizer.php +++ b/Model/Command/TransactionSynchronizer.php @@ -121,11 +121,7 @@ public function applyCancellationOnMagento(OrderInterface $order, UnzerPayment $ $payment->registerVoidNotification($cancellation->getAmount()); $this->paymentRepository->save($payment); - - return; } - - return; } /** From b3814bc8e7657b01d39f427521dae8fd930abc27 Mon Sep 17 00:00:00 2001 From: Kristina Date: Fri, 5 Sep 2025 10:42:39 +0200 Subject: [PATCH 56/79] Fix order status in Magento after the void action ISSUE: MAGENTO-311 --- Helper/Payment.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Helper/Payment.php b/Helper/Payment.php index 8804ce4..b29d755 100644 --- a/Helper/Payment.php +++ b/Helper/Payment.php @@ -238,11 +238,8 @@ private function processCanceledState(OrderInterface $order, PaymentResource $pa if ($payment->getAmount()->getTotal() && $payment->getAmount()->getTotal() === $payment->getAmount()->getCanceled()) { $this->setOrderState($order, Order::STATE_CLOSED, Order::STATE_CLOSED); - } else { - $this->setOrderState($order, Order::STATE_CANCELED, Order::STATE_CANCELED); + $this->_orderRepository->save($order); } - - $this->_orderRepository->save($order); } /** From c310200abc1f1c29035cbae6089d31866d0f93b9 Mon Sep 17 00:00:00 2001 From: Kristina Date: Tue, 9 Sep 2025 14:50:54 +0200 Subject: [PATCH 57/79] Fix missing edit billing address option on checkout and amount discrepancy with Apple Pay ISSUE: MAGENTO-316,MAGENTO-321 --- .../web/js/view/payment/method-renderer/applepayv2.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/view/frontend/web/js/view/payment/method-renderer/applepayv2.js b/view/frontend/web/js/view/payment/method-renderer/applepayv2.js index 07e99e5..a862746 100644 --- a/view/frontend/web/js/view/payment/method-renderer/applepayv2.js +++ b/view/frontend/web/js/view/payment/method-renderer/applepayv2.js @@ -25,6 +25,10 @@ define( paymentCode: 'unzer-apple-pay' }, + isApplePayAvailable: function () { + return window.ApplePaySession && ApplePaySession.canMakePayments(); + }, + selectPaymentMethod: function () { let retVal = this._super(); @@ -52,18 +56,20 @@ define( if (unzerPaymentElement && typeof unzerPaymentElement.setApplePayData === 'function') { const supportedNetworks = window.checkoutConfig.payment.unzer_applepayv2.supportedNetworks.map((network) => network.toLowerCase()); + const totals = quote.totals() ? quote.totals() : window.checkoutConfig.quoteData; + unzerPaymentElement.setApplePayData({ countryCode: quote.billingAddress().countryId, currencyCode: window.checkoutConfig.quoteData.quote_currency_code, totalLabel: window.checkoutConfig.payment.unzer_applepayv2.label, - totalAmount: Number(window.checkoutConfig.quoteData.base_grand_total).toFixed(2), + totalAmount: Number(totals['grand_total']).toFixed(2), supportedNetworks: supportedNetworks, merchantCapabilities: window.checkoutConfig.payment.unzer_applepayv2.merchantCapabilities, requiredShippingContactFields: [], requiredBillingContactFields: [], total: { label: window.checkoutConfig.payment.unzer_applepayv2.label, - amount: Number(window.checkoutConfig.quoteData.base_grand_total).toFixed(2) + amount: Number(totals['grand_total']).toFixed(2), }, }); } else if (maxRetries > 0) { From 5bef491284e2eadeb410d4e82807d889e1857147 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Wed, 10 Sep 2025 15:23:33 +0200 Subject: [PATCH 58/79] Implement default value for birthday field ISSUE: MAGENTO-312 --- .../js/view/payment/method-renderer/basev2.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/view/frontend/web/js/view/payment/method-renderer/basev2.js b/view/frontend/web/js/view/payment/method-renderer/basev2.js index 009270a..d61e9ae 100644 --- a/view/frontend/web/js/view/payment/method-renderer/basev2.js +++ b/view/frontend/web/js/view/payment/method-renderer/basev2.js @@ -87,6 +87,10 @@ define( componentContainer.append(unzerPayment); componentContainer.append(unzerCheckout); + if (this.customersBirthDayNeeded && customerData.dob) { + this.observeBirthDateInput(); + } + return retVal; }, @@ -110,6 +114,58 @@ define( return $(`<${this.paymentCode}>`); }, + observeBirthDateInput: function (maxRetries = 20, interval = 300) { + const containerId = 'unzer-payment-' + this.getCode(); + const container = document.getElementById(containerId); + + if (!container) { + console.warn('Container for payment not found yet.'); + return; + } + + const attempt = () => { + const input = this.findInShadow(container, 'uds-input-date[name="birthDate"]'); + + if (input && customerData.dob) { + const parts = customerData.dob.split('-'); + if (parts.length === 3) { + const year = parts[0]; + const month = parts[1].padStart(2, '0'); + const day = parts[2].padStart(2, '0'); + + const formattedDob = `${month}/${day}/${year}`; + input.value = formattedDob; + } + } else if (maxRetries > 0) { + maxRetries--; + setTimeout(attempt, interval); + } else { + console.error('Birth date input not found after retries.'); + } + }; + + attempt(); + }, + + findInShadow(root, selector) { + if (!root) return null; + + let el = root.querySelector(selector); + if (el) return el; + + const children = root.children; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.shadowRoot) { + el = this.findInShadow(child.shadowRoot, selector); + if (el) return el; + } + } + + return null; + }, + + createUnzerCheckoutPaymentElement: function () { const unzerCheckoutId = 'unzer-checkout-' + this.getCode(); const unzerCheckout = $('') From 74f489bb2d7f48b7d9b3c37650e1da1f24ee4150 Mon Sep 17 00:00:00 2001 From: Boljanovic Date: Wed, 10 Sep 2025 16:32:21 +0200 Subject: [PATCH 59/79] Add space in paylater b2b components ISSUE: MAGENTO-318 --- view/frontend/web/css/unzer.css | 4 ++++ view/frontend/web/template/payment/paylater_invoice_b2b.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/view/frontend/web/css/unzer.css b/view/frontend/web/css/unzer.css index 142ffc2..152d3c7 100644 --- a/view/frontend/web/css/unzer.css +++ b/view/frontend/web/css/unzer.css @@ -5334,3 +5334,7 @@ i.h-iconideal-van-lanschot:before { .unzerPlaceOrderPadding { margin: 12px; } + +.unzerCompanyTypeSelect { + margin-bottom: 15px; +} diff --git a/view/frontend/web/template/payment/paylater_invoice_b2b.html b/view/frontend/web/template/payment/paylater_invoice_b2b.html index 71ea997..2177b0a 100644 --- a/view/frontend/web/template/payment/paylater_invoice_b2b.html +++ b/view/frontend/web/template/payment/paylater_invoice_b2b.html @@ -15,7 +15,7 @@ -
+