diff --git a/addons/pos_adyen/static/src/js/PaymentScreen.js b/addons/pos_adyen/static/src/js/PaymentScreen.js new file mode 100644 index 00000000000..8666cea23d3 --- /dev/null +++ b/addons/pos_adyen/static/src/js/PaymentScreen.js @@ -0,0 +1,36 @@ +odoo.define('pos_adyen.PaymentScreen', function(require) { + "use strict"; + + const PaymentScreen = require('point_of_sale.PaymentScreen'); + const Registries = require('point_of_sale.Registries'); + const { onMounted } = owl; + + const PosAdyenPaymentScreen = PaymentScreen => class extends PaymentScreen { + setup() { + super.setup(); + onMounted(() => { + const pendingPaymentLine = this.currentOrder.paymentlines.find( + paymentLine => paymentLine.payment_method.use_payment_terminal === 'adyen' && + (!paymentLine.is_done() && paymentLine.get_payment_status() !== 'pending') + ); + if (pendingPaymentLine) { + const paymentTerminal = pendingPaymentLine.payment_method.payment_terminal; + paymentTerminal.set_most_recent_service_id(pendingPaymentLine.terminalServiceId); + pendingPaymentLine.set_payment_status('waiting'); + paymentTerminal.start_get_status_polling().then(isPaymentSuccessful => { + if (isPaymentSuccessful) { + pendingPaymentLine.set_payment_status('done'); + pendingPaymentLine.can_be_reversed = paymentTerminal.supports_reversals; + } else { + pendingPaymentLine.set_payment_status('retry'); + } + }); + } + }); + } + }; + + Registries.Component.extend(PaymentScreen, PosAdyenPaymentScreen); + + return PaymentScreen; +}); diff --git a/addons/pos_adyen/static/src/js/models.js b/addons/pos_adyen/static/src/js/models.js index 12960e65863..802fd2b0bae 100644 --- a/addons/pos_adyen/static/src/js/models.js +++ b/addons/pos_adyen/static/src/js/models.js @@ -1,6 +1,29 @@ odoo.define('pos_adyen.models', function (require) { -var models = require('point_of_sale.models'); -var PaymentAdyen = require('pos_adyen.payment'); +const { register_payment_method, Payment } = require('point_of_sale.models'); +const PaymentAdyen = require('pos_adyen.payment'); +const Registries = require('point_of_sale.Registries'); -models.register_payment_method('adyen', PaymentAdyen); +register_payment_method('adyen', PaymentAdyen); + +const PosAdyenPayment = (Payment) => class PosAdyenPayment extends Payment { + constructor(obj, options) { + super(...arguments); + this.terminalServiceId = this.terminalServiceId || null; + } + //@override + export_as_JSON() { + const json = super.export_as_JSON(...arguments); + json.terminal_service_id = this.terminalServiceId; + return json; + } + //@override + init_from_JSON(json) { + super.init_from_JSON(...arguments); + this.terminalServiceId = json.terminal_service_id; + } + setTerminalServiceId(id) { + this.terminalServiceId = id; + } +} +Registries.Model.extend(Payment, PosAdyenPayment); }); diff --git a/addons/pos_adyen/static/src/js/payment_adyen.js b/addons/pos_adyen/static/src/js/payment_adyen.js index 2d5e62e431f..ee3ccc92046 100644 --- a/addons/pos_adyen/static/src/js/payment_adyen.js +++ b/addons/pos_adyen/static/src/js/payment_adyen.js @@ -12,7 +12,7 @@ var PaymentAdyen = PaymentInterface.extend({ send_payment_request: function (cid) { this._super.apply(this, arguments); this._reset_state(); - return this._adyen_pay(); + return this._adyen_pay(cid); }, send_payment_cancel: function (order, cid) { this._super.apply(this, arguments); @@ -24,6 +24,10 @@ var PaymentAdyen = PaymentInterface.extend({ this._super.apply(this, arguments); }, + set_most_recent_service_id(id) { + this.most_recent_service_id = id; + }, + // private methods _reset_state: function () { this.was_cancelled = false; @@ -110,7 +114,7 @@ var PaymentAdyen = PaymentInterface.extend({ return data; }, - _adyen_pay: function () { + _adyen_pay: function (cid) { var self = this; var order = this.pos.get_order(); @@ -125,7 +129,8 @@ var PaymentAdyen = PaymentInterface.extend({ } var data = this._adyen_pay_data(); - + var line = order.paymentlines.find(paymentLine => paymentLine.cid === cid); + line.setTerminalServiceId(this.most_recent_service_id); return this._call_adyen(data).then(function (data) { return self._adyen_handle_response(data); }); @@ -265,6 +270,8 @@ var PaymentAdyen = PaymentInterface.extend({ self._show_error(_t('The connection to your payment terminal failed. Please check if it is still connected to the internet.')); self._adyen_cancel(); resolve(false); + } else { + line.set_payment_status('waitingCard') } }); }, @@ -296,27 +303,30 @@ var PaymentAdyen = PaymentInterface.extend({ return Promise.resolve(); } else { line.set_payment_status('waitingCard'); - - var self = this; - var res = new Promise(function (resolve, reject) { - // clear previous intervals just in case, otherwise - // it'll run forever - clearTimeout(self.polling); - - self.polling = setInterval(function () { - self._poll_for_response(resolve, reject); - }, 5500); - }); - - // make sure to stop polling when we're done - res.finally(function () { - self._reset_state(); - }); - - return res; + return this.start_get_status_polling() } }, + start_get_status_polling() { + var self = this; + var res = new Promise(function (resolve, reject) { + // clear previous intervals just in case, otherwise + // it'll run forever + clearTimeout(self.polling); + self._poll_for_response(resolve, reject); + self.polling = setInterval(function () { + self._poll_for_response(resolve, reject); + }, 5500); + }); + + // make sure to stop polling when we're done + res.finally(function () { + self._reset_state(); + }); + + return res; + }, + _show_error: function (msg, title) { if (!title) { title = _t('Adyen Error');