summaryrefslogtreecommitdiff
path: root/addons/website_payment
diff options
context:
space:
mode:
authorDamien Bouvy <dbo@odoo.com>2015-07-31 10:05:29 +0200
committerDamien Bouvy <dbo@odoo.com>2015-09-04 16:08:22 +0200
commitf341ca62ab1572fe2e564e2a4d2fa32e671e59e3 (patch)
treec66a8aaec0b692565add18947008f7047c96878a /addons/website_payment
parentf8a98d977e5e665689b9adb3954ef55bbf04008b (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
Diffstat (limited to 'addons/website_payment')
-rw-r--r--addons/website_payment/__openerp__.py1
-rw-r--r--addons/website_payment/controllers/main.py63
-rw-r--r--addons/website_payment/models/__init__.py3
-rw-r--r--addons/website_payment/models/res_config.py25
-rw-r--r--addons/website_payment/static/src/js/payment_transaction.js38
-rw-r--r--addons/website_payment/views/res_config_view.xml18
-rw-r--r--addons/website_payment/views/website_payment_templates.xml88
-rw-r--r--addons/website_payment/views/website_payment_view.xml10
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>