diff --git a/addons/payment/static/src/js/payment_form.js b/addons/payment/static/src/js/payment_form.js index ba4f0d1a7c8..a7197ad1306 100644 --- a/addons/payment/static/src/js/payment_form.js +++ b/addons/payment/static/src/js/payment_form.js @@ -18,7 +18,7 @@ odoo.define('payment.payment_form', function (require){ }, payEvent: function(ev) { - ev.stopPropagation(); + // ev.stopPropagation(); ev.preventDefault(); var form = this.el; var checked_radio = this.$('input[type="radio"]:checked'); @@ -106,6 +106,10 @@ odoo.define('payment.payment_form', function (require){ var form_save_token = false; var $tx_url = this.$el.find('input[name="prepare_tx_url"]'); + // if neither the dataset or the action url is defined, then we just stop the execution of the function + if(!ds || !ds.dataset.actionUrl) + return; + // if there's a prepare tx url set if($tx_url.length == 1) { diff --git a/addons/payment_stripe/models/payment.py b/addons/payment_stripe/models/payment.py index 55cd3d690bb..e53901b71b4 100644 --- a/addons/payment_stripe/models/payment.py +++ b/addons/payment_stripe/models/payment.py @@ -17,9 +17,9 @@ STRIPE_HEADERS = {'Stripe-Version': '2016-03-07'} # The following currencies are integer only, see https://stripe.com/docs/currencies#zero-decimal INT_CURRENCIES = [ - u'BIF', u'XAF', u'XPF', u'CLP', u'KMF', u'DJF', u'GNF', u'JPY', u'MGA', u'PYGí', u'RWF', u'KRW', + u'BIF', u'XAF', u'XPF', u'CLP', u'KMF', u'DJF', u'GNF', u'JPY', u'MGA', u'PYG', u'RWF', u'KRW', u'VUV', u'VND', u'XOF' -]; +] class PaymentAcquirerStripe(models.Model): diff --git a/addons/payment_stripe/static/src/js/stripe.js b/addons/payment_stripe/static/src/js/stripe.js index 93dcc606d38..d720a19f8b4 100644 --- a/addons/payment_stripe/static/src/js/stripe.js +++ b/addons/payment_stripe/static/src/js/stripe.js @@ -10,7 +10,7 @@ odoo.define('payment_stripe.stripe', function(require) { // The following currencies are integer only, see // https://stripe.com/docs/currencies#zero-decimal var int_currencies = [ - 'BIF', 'XAF', 'XPF', 'CLP', 'KMF', 'DJF', 'GNF', 'JPY', 'MGA', 'PYGí', + 'BIF', 'XAF', 'XPF', 'CLP', 'KMF', 'DJF', 'GNF', 'JPY', 'MGA', 'PYG', 'RWF', 'KRW', 'VUV', 'VND', 'XOF' ]; @@ -18,13 +18,6 @@ odoo.define('payment_stripe.stripe', function(require) { key: $("input[name='stripe_key']").val(), image: $("input[name='stripe_image']").val(), locale: 'auto', - closed: function() { - if (!handler.isTokenGenerate) { - $('#pay_stripe') - .removeAttr('disabled') - .find('i').remove(); - } - }, token: function(token, args) { handler.isTokenGenerate = true; ajax.jsonRpc("/payment/stripe/create_charge", 'call', { @@ -46,64 +39,79 @@ odoo.define('payment_stripe.stripe', function(require) { }, }); - $('#pay_stripe').on('click', function(e) { - // Open Checkout with further options - if(!$(this).find('i').length) - $(this).append(''); - $(this).attr('disabled','disabled'); - - var $form = $(e.currentTarget).parents('form'); - var acquirer_id = $(e.currentTarget).closest('div.o_payment_acquirer_button,div.oe_quote_acquirer_button,div.o_website_payment_new_payment'); - acquirer_id = acquirer_id.data('id') || acquirer_id.data('acquirer_id'); - if (! acquirer_id) { - return false; + $(document).ready(function (){ + if (!$('.o_payment_form').length) { + return $.Deferred().reject("DOM doesn't contain '.o_payment_form'"); } - var access_token = $("input[name='token']").val(); - var so_id = $("input[name='return_url']").val().match(/quote\/([0-9]+)/) || undefined; - if (so_id) { - so_id = parseInt(so_id[1]); - } + $('#o_payment_form_pay').on('click', function(ev){ + // we retrieve the payment form + var parent_form = ev.target.form; + // then the checked radio + var checked_radio = $('input[type="radio"]:checked', parent_form); + // check if there's one checked radio + if(checked_radio.length != 1) { + return; + } + // if there's a checked radio, we retrieve the usefull data + var acquirer_id = checked_radio.data('acquirerId'); + var provider = checked_radio.data('provider'); + var is_form_payment = checked_radio.data('form-payment') === "True"; + // now we check if the user has clicked on stripe radio button and wants to pay via the checkout form + if(provider != "stripe" || is_form_payment !== true) { + return; + } + // from here we retrieve the inputs that contains the data we need + var provider_form = $("#o_payment_form_acq_" + acquirer_id, parent_form); - e.preventDefault(); - if ($('.o_website_payment').length !== 0) { - var currency = $("input[name='currency']").val(); - var amount = parseFloat($("input[name='amount']").val() || '0.0'); - if (!_.contains(int_currencies, currency)) { - amount = amount*100; + var access_token = $('input[name="token"]', provider_form).val(); + var so_id = $("input[name='return_url']", provider_form).val().match(/quote\/([0-9]+)/) || undefined; + if (so_id) { + so_id = parseInt(so_id[1]); } - ajax.jsonRpc('/website_payment/transaction', 'call', { - reference: $("input[name='invoice_num']").val(), - amount: amount, - currency_id: currency, - acquirer_id: acquirer_id - }) - handler.open({ - name: $("input[name='merchant']").val(), - description: $("input[name='invoice_num']").val(), - currency: currency, - amount: amount, - }); - } else { - var currency = $("input[name='currency']").val(); - var amount = parseFloat($("input[name='amount']").val() || '0.0'); - if (!_.contains(int_currencies, currency)) { - amount = amount*100; - } + if ($('.o_website_payment').length !== 0) { + var currency = $("input[name='currency']", provider_form).val(); + var amount = parseFloat($("input[name='amount']", provider_form).val() || '0.0'); + if (!_.contains(int_currencies, currency)) { + amount = amount*100; + } - ajax.jsonRpc('/shop/payment/transaction/' + acquirer_id, 'call', { - so_id: so_id, - access_token: access_token - }, {'async': false}).then(function (data) { - $form.html(data); - handler.open({ - name: $("input[name='merchant']").val(), - description: $("input[name='invoice_num']").val(), - currency: currency, - amount: amount, + ajax.jsonRpc('/website_payment/transaction', 'call', { + reference: $("input[name='invoice_num']", provider_form).val(), + amount: amount, + currency_id: currency, + acquirer_id: acquirer_id + }) + handler.open({ + name: $("input[name='merchant']", provider_form).val(), + description: $("input[name='invoice_num']", provider_form).val(), + currency: currency, + amount: amount, + }); + } else { + var currency = $("input[name='currency']", provider_form).val(); + var amount = parseFloat($("input[name='amount']", provider_form).val() || '0.0'); + if (!_.contains(int_currencies, currency)) { + amount = amount*100; + } + + // TBE TODO: Pass 'so_id: so_id' and 'access_token: access_token' on the URL + ajax.jsonRpc('/shop/payment/transaction/', 'call', { + acquirer_id: acquirer_id + }, {'async': false}).then(function (data) { + try { + provider_form.html(data); + } + catch(err) { } // here it will catch an error saying that payment_stripe.stripe is already started + handler.open({ + name: $("input[name='merchant']", provider_form).val(), + description: $("input[name='invoice_num']", provider_form).val(), + currency: currency, + amount: amount, + }); }); - }); - } + } + }); }); });