From e1b1f2451656648ddb79f781d0e03aa2e9014541 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 23 Mar 2016 14:05:23 +0100 Subject: [PATCH 1/4] [FIX] payment, website_sale: back port of f89e8f9 --- addons/payment/models/payment_acquirer.py | 8 ++++++++ addons/website_sale/controllers/main.py | 10 ++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index d634c217ec9..3f7e45f8888 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -454,6 +454,14 @@ class PaymentTransaction(osv.Model): 'partner_phone': partner and partner.phone or False, }} + def get_next_reference(self, cr, uid, reference, context=None): + ref_suffix = 1 + init_ref = reference + while self.pool['payment.transaction'].search_count(cr, uid, [('reference', '=', reference)], context=context): + reference = init_ref + '-' + str(ref_suffix) + ref_suffix += 1 + return reference + # -------------------------------------------------- # FORM RELATED METHODS # -------------------------------------------------- diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index c9ceabb568e..b50836ee065 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -687,18 +687,16 @@ class website_sale(http.Controller): values['errors'] = sale_order_obj._get_errors(cr, uid, order, context=context) values.update(sale_order_obj._get_website_data(cr, uid, order, context)) - # fetch all registered payment means - # if tx: - # acquirer_ids = [tx.acquirer_id.id] - # else: if not values['errors']: + # find an already existing transaction + tx = request.website.sale_get_transaction() acquirer_ids = payment_obj.search(cr, SUPERUSER_ID, [('website_published', '=', True), ('company_id', '=', order.company_id.id)], context=context) values['acquirers'] = list(payment_obj.browse(cr, uid, acquirer_ids, context=context)) render_ctx = dict(context, submit_class='btn btn-primary', submit_txt=_('Pay Now')) for acquirer in values['acquirers']: acquirer.button = payment_obj.render( cr, SUPERUSER_ID, acquirer.id, - order.name, + tx and tx.reference or request.env['payment.transaction'].get_next_reference(order.name), order.amount_total, order.pricelist_id.currency_id.id, partner_id=shipping_partner_id, @@ -748,7 +746,7 @@ class website_sale(http.Controller): 'currency_id': order.pricelist_id.currency_id.id, 'partner_id': order.partner_id.id, 'partner_country_id': order.partner_id.country_id.id, - 'reference': order.name, + 'reference': request.env['payment.transaction'].get_next_reference(order.name), 'sale_order_id': order.id, }, context=context) request.session['sale_transaction_id'] = tx_id From a430e2c8c53f3c18274236db4d913072318d78f2 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 23 Mar 2016 14:06:26 +0100 Subject: [PATCH 2/4] [FIX] payment, website_sale: back port of cb9d798 --- addons/payment/models/payment_acquirer.py | 3 ++- addons/website_sale/controllers/main.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index 3f7e45f8888..2e4512cdbd3 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -2,6 +2,7 @@ import logging +import openerp from openerp.osv import osv, fields from openerp.tools import float_round, float_repr from openerp.tools.translate import _ @@ -457,7 +458,7 @@ class PaymentTransaction(osv.Model): def get_next_reference(self, cr, uid, reference, context=None): ref_suffix = 1 init_ref = reference - while self.pool['payment.transaction'].search_count(cr, uid, [('reference', '=', reference)], context=context): + while self.pool['payment.transaction'].search_count(cr, openerp.SUPERUSER_ID, [('reference', '=', reference)], context=context): reference = init_ref + '-' + str(ref_suffix) ref_suffix += 1 return reference diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index b50836ee065..cb6a416c068 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -730,12 +730,11 @@ class website_sale(http.Controller): tx = request.website.sale_get_transaction() if tx: tx_id = tx.id - if tx.reference != order.name: + if tx.sale_order_id.id != order.id or tx.state in ['error', 'cancel'] or tx.acquirer_id.id != acquirer_id: tx = False tx_id = False elif tx.state == 'draft': # button cliked but no more info -> rewrite on tx or create a new one ? tx.write({ - 'acquirer_id': acquirer_id, 'amount': order.amount_total, }) if not tx: From a0c473379ae8ff1b7a0e70d786dc3aad49570ba9 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 23 Mar 2016 14:11:32 +0100 Subject: [PATCH 3/4] [FIX] website_sale: back port of 15f27b2614a4d6f86ded20fc7b3d8e796a2db078 --- addons/website_sale/controllers/main.py | 17 +++++++++++++---- .../static/src/js/website_sale_payment.js | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index cb6a416c068..410f976dd98 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -688,15 +688,13 @@ class website_sale(http.Controller): values.update(sale_order_obj._get_website_data(cr, uid, order, context)) if not values['errors']: - # find an already existing transaction - tx = request.website.sale_get_transaction() acquirer_ids = payment_obj.search(cr, SUPERUSER_ID, [('website_published', '=', True), ('company_id', '=', order.company_id.id)], context=context) values['acquirers'] = list(payment_obj.browse(cr, uid, acquirer_ids, context=context)) render_ctx = dict(context, submit_class='btn btn-primary', submit_txt=_('Pay Now')) for acquirer in values['acquirers']: acquirer.button = payment_obj.render( cr, SUPERUSER_ID, acquirer.id, - tx and tx.reference or request.env['payment.transaction'].get_next_reference(order.name), + '/', order.amount_total, order.pricelist_id.currency_id.id, partner_id=shipping_partner_id, @@ -718,6 +716,7 @@ class website_sale(http.Controller): user is redirected to the checkout page """ cr, uid, context = request.cr, request.uid, request.context + payment_obj = request.registry.get('payment.acquirer') transaction_obj = request.registry.get('payment.transaction') order = request.website.sale_get_order(context=context) @@ -749,6 +748,7 @@ class website_sale(http.Controller): 'sale_order_id': order.id, }, context=context) request.session['sale_transaction_id'] = tx_id + tx = transaction_obj.browse(cr, SUPERUSER_ID, tx_id, context=context) # update quotation request.registry['sale.order'].write( @@ -757,7 +757,16 @@ class website_sale(http.Controller): 'payment_tx_id': request.session['sale_transaction_id'] }, context=context) - return tx_id + return payment_obj.render( + cr, SUPERUSER_ID, tx.acquirer_id.id, + tx.reference, + order.amount_total, + order.pricelist_id.currency_id.id, + partner_id=order.partner_shipping_id.id or order.partner_invoice_id.id, + tx_values={ + 'return_url': '/shop/payment/validate', + }, + context=dict(context, submit_class='btn btn-primary', submit_txt=_('Pay Now'))) @http.route('/shop/payment/get_status/', type='json', auth="public", website=True) def payment_get_status(self, sale_order_id, **post): diff --git a/addons/website_sale/static/src/js/website_sale_payment.js b/addons/website_sale/static/src/js/website_sale_payment.js index 8ca1b85f907..94ebde001b2 100644 --- a/addons/website_sale/static/src/js/website_sale_payment.js +++ b/addons/website_sale/static/src/js/website_sale_payment.js @@ -19,6 +19,7 @@ $(document).ready(function () { return false; } openerp.jsonRpc('/shop/payment/transaction/' + acquirer_id, 'call', {}).then(function (data) { + $form.html(data); $form.submit(); }); }); From 9752aedb4ec3977a634299d7683c03fda7e005a6 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 23 Mar 2016 14:59:22 +0100 Subject: [PATCH 4/4] [FIX] website_sale: update partner details when reusing payment transaction When attempting to pay a cart in the ecommerce, if the customer went on the payment acquirer site (meaning, the `payment.transaction` is created in the database), then come back to the checkout form using the browser back button, and changed his customer details (address, email, phone,...), these changes in the details were not applied in the `payment.transaction` record that was being re-used. e.g. Checkout > Confirm > Choose Paypal, Pay Now > History back to the checkout and apply changes in the address > Confirm > Pay Now. --- addons/website_sale/controllers/main.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 410f976dd98..e6ec0ddc785 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -733,9 +733,7 @@ class website_sale(http.Controller): tx = False tx_id = False elif tx.state == 'draft': # button cliked but no more info -> rewrite on tx or create a new one ? - tx.write({ - 'amount': order.amount_total, - }) + tx.write(dict(transaction_obj.on_change_partner_id(cr, uid, None, order.partner_id.id, context=context).get('values', {}), amount=order.amount_total)) if not tx: tx_id = transaction_obj.create(cr, SUPERUSER_ID, { 'acquirer_id': acquirer_id,