diff --git a/addons/website_payment/__openerp__.py b/addons/website_payment/__openerp__.py index 481c0110906..4dff58e8134 100644 --- a/addons/website_payment/__openerp__.py +++ b/addons/website_payment/__openerp__.py @@ -14,6 +14,7 @@ 'data': [ 'views/website_payment_view.xml', 'views/website_payment_templates.xml', + 'views/res_config_view.xml', ], 'auto_install': False, } diff --git a/addons/website_payment/controllers/main.py b/addons/website_payment/controllers/main.py index 15df9d8a9a2..39d659f3b24 100644 --- a/addons/website_payment/controllers/main.py +++ b/addons/website_payment/controllers/main.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- -import werkzeug - from openerp import http from openerp.http import request -from openerp import tools from openerp.tools.translate import _ @@ -27,3 +24,63 @@ class website_payment(http.Controller): pay_meth = request.env['payment.method'].browse(int(delete_pm_id)) pay_meth.unlink() return request.redirect('/my/payment_method') + + @http.route(['/website_payment/pay'], type='http', auth='public', website=True) + def pay(self, reference='', amount=False, currency_id=None, acquirer_id=None, **kw): + env = request.env + user = env.user.sudo() + + currency_id = currency_id and int(currency_id) or user.company_id.currency_id.id + currency = env['res.currency'].browse(currency_id) + + # Try default one then fallback on first + acquirer_id = acquirer_id and int(acquirer_id) or \ + env['ir.values'].get_default('payment.acquirer', 'acquirer_id') or \ + env['payment.acquirer'].search([('website_published', '=', True)])[0].id + + acquirer = env['payment.acquirer'].with_context(submit_class='btn btn-primary pull-right', + submit_txt=_('Pay Now')).browse(acquirer_id) + # auto-increment reference with a number suffix if the reference already exists + ref_suffix = 1 + init_ref = reference + while request.env['payment.transaction'].sudo().search_count([('reference', '=', reference)]): + reference = init_ref + '-' + str(ref_suffix) + ref_suffix += 1 + + partner_id = user.partner_id.id if user.partner_id.id != request.website.partner_id.id else False + + payment_form = acquirer.render(reference, float(amount), currency.id, values={'return_url': '/website_payment/confirm', 'partner_id': partner_id})[0] + values = { + 'reference': reference, + 'acquirer': acquirer, + 'currency': currency, + 'amount': amount, + 'payment_form': payment_form, + } + return request.website.render('website_payment.pay', values) + + @http.route(['/website_payment/transaction'], type='json', auth="public", website=True) + def transaction(self, reference, amount, currency_id, acquirer_id): + partner_id = request.env.user.partner_id.id if request.env.user.partner_id != request.website.partner_id else False + values = { + 'acquirer_id': int(acquirer_id), + 'reference': reference, + 'amount': float(amount), + 'currency_id': int(currency_id), + 'partner_id': partner_id, + } + + tx = request.env['payment.transaction'].sudo().create(values) + request.session['website_payment_tx_id'] = tx.id + return tx.id + + @http.route(['/website_payment/confirm'], type='http', auth='public', website=True) + def confirm(self, **kw): + tx_id = request.session.pop('website_payment_tx_id', False) + if tx_id: + tx = request.env['payment.transaction'].browse(tx_id) + status = (tx.state == 'done' and 'success') or 'danger' + message = (tx.state == 'done' and 'Your payment was successful! It may take some time to be validated on our end.') or 'OOps! There was a problem with your payment.' + return request.website.render('website_payment.confirm', {'tx': tx, 'status': status, 'message': message}) + else: + return request.redirect('/my/home') diff --git a/addons/website_payment/models/__init__.py b/addons/website_payment/models/__init__.py index a6b2daed781..0a02268206c 100644 --- a/addons/website_payment/models/__init__.py +++ b/addons/website_payment/models/__init__.py @@ -1,2 +1,3 @@ -import website +import res_config import payment +import website diff --git a/addons/website_payment/models/res_config.py b/addons/website_payment/models/res_config.py new file mode 100644 index 00000000000..c27aa269f79 --- /dev/null +++ b/addons/website_payment/models/res_config.py @@ -0,0 +1,25 @@ +from openerp import api, fields, models + + +class PaymentConfigSettings(models.TransientModel): + _inherit = 'account.config.settings' + + default_acquirer = fields.Many2one("payment.acquirer", + string="Default Acquirer", + help="Default payment acquirer for website payments; your provider needs to be visible in the website.", + domain="[('website_published','=',True)]" + ) + + @api.model + def get_default_acquirer(self, fields): + default_acquirer = False + if 'default_acquirer' in fields: + default_acquirer = self.env['ir.values'].get_default('payment.transaction', 'acquirer_id', company_id=self.env.user.company_id.id) + return { + 'default_acquirer': default_acquirer + } + + @api.multi + def set_default_acquirer(self): + for wizard in self: + self.env['ir.values'].set_default('payment.transaction', 'acquirer_id', wizard.default_acquirer.id, company_id=self.env.user.company_id.id) diff --git a/addons/website_payment/static/src/js/payment_transaction.js b/addons/website_payment/static/src/js/payment_transaction.js new file mode 100644 index 00000000000..461bb999114 --- /dev/null +++ b/addons/website_payment/static/src/js/payment_transaction.js @@ -0,0 +1,38 @@ +odoo.define('website_payment.website_payment', function (require) { +"use strict"; + +var website = require('website.website'); +var ajax = require('web.ajax'); + +if(!$('.o_website_payment').length) { + return $.Deferred().reject("DOM doesn't contain '.o_website_payment'"); +} + +// When clicking on payment button: create the tx using json then continue to the acquirer +var $payment = $(".o_website_payment_form"); +$payment.on("click", 'button[type="submit"],button[name="submit"]', function (ev) { + ev.preventDefault(); + ev.stopPropagation(); + $(ev.currentTarget).attr('disabled', true); + $(ev.currentTarget).prepend(' '); + var $form = $(ev.currentTarget).parents('form'); + var data =$("div[class~='o_website_payment_new_payment']").data(); + console.log(data); + ajax.jsonRpc('/website_payment/transaction/', 'call', data).then(function (result) { + $form.submit(); + }); + + function getFormData($form){ + var unindexed_array = $form.serializeArray(); + var indexed_array = {}; + + $.map(unindexed_array, function(n, i){ + indexed_array[n.name] = n.value; + }); + + return indexed_array; + } +}); + + +}); diff --git a/addons/website_payment/views/res_config_view.xml b/addons/website_payment/views/res_config_view.xml new file mode 100644 index 00000000000..dc4a95bc893 --- /dev/null +++ b/addons/website_payment/views/res_config_view.xml @@ -0,0 +1,18 @@ + + + + + account.config.settings.inherit + account.config.settings + + + +
+
+
+
+
+
+
diff --git a/addons/website_payment/views/website_payment_templates.xml b/addons/website_payment/views/website_payment_templates.xml index 006229e8a38..f72125c0552 100644 --- a/addons/website_payment/views/website_payment_templates.xml +++ b/addons/website_payment/views/website_payment_templates.xml @@ -2,7 +2,7 @@ + + + + diff --git a/addons/website_payment/views/website_payment_view.xml b/addons/website_payment/views/website_payment_view.xml index eef9fdae2c6..3f808a969a9 100644 --- a/addons/website_payment/views/website_payment_view.xml +++ b/addons/website_payment/views/website_payment_view.xml @@ -24,12 +24,10 @@ payment.acquirer - -
- -
+ +