diff options
| author | Damien Bouvy <dbo@odoo.com> | 2015-07-31 10:05:29 +0200 |
|---|---|---|
| committer | Damien Bouvy <dbo@odoo.com> | 2015-09-04 16:08:22 +0200 |
| commit | f341ca62ab1572fe2e564e2a4d2fa32e671e59e3 (patch) | |
| tree | c66a8aaec0b692565add18947008f7047c96878a | |
| parent | f8a98d977e5e665689b9adb3954ef55bbf04008b (diff) | |
[IMP] website_payment: generic payment controller
- generate payment from the frontend using a simple form
- send a payment with a simple url
- define a default provider for payments
| -rw-r--r-- | addons/website_payment/__openerp__.py | 1 | ||||
| -rw-r--r-- | addons/website_payment/controllers/main.py | 63 | ||||
| -rw-r--r-- | addons/website_payment/models/__init__.py | 3 | ||||
| -rw-r--r-- | addons/website_payment/models/res_config.py | 25 | ||||
| -rw-r--r-- | addons/website_payment/static/src/js/payment_transaction.js | 38 | ||||
| -rw-r--r-- | addons/website_payment/views/res_config_view.xml | 18 | ||||
| -rw-r--r-- | addons/website_payment/views/website_payment_templates.xml | 88 | ||||
| -rw-r--r-- | addons/website_payment/views/website_payment_view.xml | 10 |
8 files changed, 234 insertions, 12 deletions
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('<i class="fa fa-refresh fa-spin"></i> '); + 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <data> + <record id="website_default_acquirer" model="ir.ui.view"> + <field name="name">account.config.settings.inherit</field> + <field name="model">account.config.settings</field> + <field name="inherit_id" ref="payment.payment_acquirer_installation"/> + <field name="arch" type="xml"> + <xpath expr="//div[@name='configure_payments_button']" position="after"> + <div name="customer_payments"> + <label for="default_acquirer"/> + <field name="default_acquirer" class="oe_inline"/> + </div> + </xpath> + </field> + </record> + </data> +</odoo> 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 @@ <openerp> <data> <template id="header_footer_custom_payment" inherit_id="website.footer_default" customize_show="True" active="False" name="Payment Methods"> - <xpath expr="//div[@id='info']" position="inside"> + <xpath expr="//div[@class='o_my_details']" position="inside"> <h4 class="payment_method_title">Payment Method</h4> <ul class="payment_method_list list-inline"> <t t-foreach="request.website.payment_acquirers()" t-as="acquirer"> @@ -18,13 +18,14 @@ <link rel='stylesheet' href='/website_payment/static/src/css/website_payment.css'/> <script type="text/javascript" src="/website_payment/static/src/js/payment_acquirer.js"></script> <script type="text/javascript" src="/website_payment/static/lib/jquery.payment/jquery.payment.js"></script> + <script type="text/javascript" src="/website_payment/static/src/js/payment_transaction.js"></script> </xpath> </template> <template id="pay_methods" name="Payment Methods"> <t t-call="website.layout"> <t t-set="additional_title">Payment Methods</t> - <div id="wrap"> + <div class="wrap"> <div class="container"> <div class="row"> <div class="col-sm-6"> @@ -82,5 +83,88 @@ </xpath> </template> + <template id="pay"> + <t t-call="website.layout"> + <t t-set="additional_title">Payment</t> + <div class="wrap"> + <div class="container o_website_payment"> + <h1>Payment</h1> + <div class="row"> + <div class="col-md-6"> + <div class="oe_structure"></div> + <div> + <div class="form-horizontal row o_website_payment_new_payment" t-att-data-acquirer_id="acquirer.id" t-att-data-currency_id="currency.id" t-att-data-reference="reference" t-att-data-amount="amount"> + <div class="form-group"> + <label for="form_reference" class="col-sm-3 control-label">Reference</label> + <div class="col-sm-9"> + <span name="form_reference" class="form-control" t-esc="reference"/> + </div> + </div> + <div class="form-group"> + <label for="form_amount" class="col-sm-3 control-label">Amount</label> + <div class="col-sm-9"> + <span name="form_amount" class="form-control" t-esc="amount"/> + <!-- + <span name="form_amount" class="form-control" t-esc="amount" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/> + --> + </div> + </div> + <div class="col-sm-12 o_website_payment_form" t-raw="payment_form"/> + <div class="col-sm-6 col-sm-offset-6 text-muted mt16"> + <img alt="payment_provider_logo" class="pull-right ml8" t-att-src="website.image_url(acquirer, 'image_small')"/> + <span>This transaction will be processed by <t t-esc="acquirer.name"/>.</span> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </t> + </template> + + <template id="confirm"> + <t t-call="website.layout"> + <t t-set="additional_title">Payment</t> + <div class="wrap"> + <div class="container o_website_payment"> + <h1>Payment</h1> + <div class="row"> + <div class="col-md-6"> + <div class="form-horizontal"> + <div t-attf-class="alert alert-#{status}" t-esc="message"/> + <div class="form-group"> + <label for="form_partner_name" class="col-sm-3 control-label">From</label> + <div class="col-sm-9"> + <span name="form_partner_name" class="form-control" t-esc="tx.partner_name"/> + </div> + </div> + <div class="form-group"> + <label for="form_reference" class="col-sm-3 control-label">Reference</label> + <div class="col-sm-9"> + <span name="form_reference" class="form-control" t-esc="tx.reference"/> + </div> + </div> + <div class="form-group"> + <label for="form_amount" class="col-sm-3 control-label">Amount</label> + <div class="col-sm-9"> + <span name="form_amount" class="form-control" t-esc="tx.amount" t-esc-options='{"widget": "monetary", "display_currency": "tx.currency_id"}'/> + </div> + </div> + <div class="col-sm-12"> + <a t-attf-class="btn btn-#{status} pull-right" href="/my/home"><i class="fa fa-arrow-circle-right"/> Back to My Account</a> + </div> + <div class="col-sm-6 col-sm-offset-6 text-muted mt16"> + <img alt="payment_provider_logo" class="pull-right ml8" t-att-src="website.image_url(tx.acquirer_id, 'image_small')"/> + <span>Payment processed by <t t-esc="tx.acquirer_id.name"/>.</span> + </div> + </div> + </div> + </div> + </div> + </div> + </t> + </template> + </data> </openerp> 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 @@ <field name="model">payment.acquirer</field> <field name="inherit_id" ref="payment.acquirer_form"/> <field name="arch" type="xml"> - <xpath expr="//group[@name='acquirer_base']" position="before"> - <div class="oe_button_box" name="button_box"> - <button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe"> - <field name="website_published" widget="website_button"/> - </button> - </div> + <xpath expr="//div[@class='oe_button_box']/*[1]" position="before"> + <button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe"> + <field name="website_published" widget="website_button"/> + </button> </xpath> </field> </record> |
