[IMP] payment: add options to automatically confirm SO's through website

Introduces two new options:
- confirm_so: to confirm the sale order on acquirer confirmation
- generate_and_pay_invoice: confirm_so + generation of invoice and
                            payment registration
This commit is contained in:
Joren Van Onder
2016-06-17 13:09:18 +02:00
parent 303e585371
commit 8a761721d1
12 changed files with 57 additions and 15 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ class account_abstract_payment(models.AbstractModel):
currency_id = fields.Many2one('res.currency', string='Currency', required=True, default=lambda self: self.env.user.company_id.currency_id)
payment_date = fields.Date(string='Payment Date', default=fields.Date.context_today, required=True, copy=False)
communication = fields.Char(string='Memo')
journal_id = fields.Many2one('account.journal', string='Payment Method', required=True, domain=[('type', 'in', ('bank', 'cash'))])
journal_id = fields.Many2one('account.journal', string='Payment Journal', required=True, domain=[('type', 'in', ('bank', 'cash'))])
company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', readonly=True)
hide_payment_method = fields.Boolean(compute='_compute_hide_payment_method',
+1
View File
@@ -13,6 +13,7 @@
'views/assets.xml',
'views/res_config_view.xml',
'views/res_partner_view.xml',
'views/account_payment.xml',
'security/ir.model.access.csv',
'security/payment_security.xml',
],
+1
View File
@@ -2,3 +2,4 @@
import payment_acquirer
import res_partner
import account_payment
+8
View File
@@ -0,0 +1,8 @@
# coding: utf-8
from odoo import fields, models
class AccountPayment(models.Model):
_inherit = 'account.payment'
payment_transaction_id = fields.Many2one('payment.transaction', string="Payment Transaction")
+4 -3
View File
@@ -79,8 +79,8 @@ class PaymentAcquirer(osv.Model):
help="Make this payment acquirer available (Customer invoices, etc.)"),
'auto_confirm': fields.selection(
[('none', 'No automatic confirmation'),
('at_pay_confirm', 'At payment with acquirer confirmation'),
('at_pay_now', 'At payment no acquirer confirmation needed')],
('confirm_so', 'Confirm the SO on acquirer confirmation'),
('generate_and_pay_invoice', 'On acquirer confirmation, confirm the SO, generate the invoice and pay it')],
string='Order Confirmation', required=True),
'pending_msg': fields.html('Pending Message', translate=True, help='Message displayed, if order is in pending state after having done the payment process.'),
'done_msg': fields.html('Done Message', translate=True, help='Message displayed, if order is done successfully after having done the payment process.'),
@@ -96,6 +96,7 @@ class PaymentAcquirer(osv.Model):
'module_id': fields.many2one('ir.module.module', string='Corresponding Module'),
'module_state': fields.related('module_id', 'state', type='char', string='Installation State'),
'description': fields.html('Description'),
'journal_id': fields.many2one('account.journal', 'Accounting Journal', help="Account journal used for automatic payment reconciliation."),
}
image = openerp.fields.Binary("Image", attachment=True,
@@ -113,7 +114,7 @@ class PaymentAcquirer(osv.Model):
'company_id': lambda self, cr, uid, obj, ctx=None: self.pool['res.users'].browse(cr, uid, uid).company_id.id,
'environment': 'test',
'website_published': False,
'auto_confirm': 'at_pay_confirm',
'auto_confirm': 'confirm_so',
'pending_msg': '<i>Pending,</i> Your online payment has been successfully processed. But your order is not validated yet.',
'done_msg': '<i>Done,</i> Your online payment has been successfully processed. Thank you for your order.',
'cancel_msg': '<i>Cancel,</i> Your payment has been cancelled.',
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="view_account_payment_form_inherit_payment" model="ir.ui.view">
<field name="name">view.account.payment.form.inherit.payment</field>
<field name="model">account.payment</field>
<field name="inherit_id" ref="account.view_account_payment_form"/>
<field name="arch" type="xml">
<xpath expr='//group[2]' position="inside">
<field name="payment_transaction_id"/>
</xpath>
</field>
</record>
</data>
</odoo>
@@ -78,6 +78,7 @@
<page string="Configuration" groups="base.group_no_one">
<group name="acquirer_config">
<field name="auto_confirm"/>
<field name="journal_id" attrs="{'required': [('auto_confirm', '=', 'generate_and_pay_invoice')]}"/>
<field name="fees_active"/>
<field name="fees_dom_fixed" attrs="{'invisible': [('fees_active', '=', False)]}"/>
<field name="fees_dom_var" attrs="{'invisible': [('fees_active', '=', False)]}"/>
+24 -2
View File
@@ -11,13 +11,32 @@ class PaymentAcquirer(models.Model):
_name = 'payment.acquirer'
_inherit = ['payment.acquirer','website.published.mixin']
class PaymentTransaction(models.Model):
_inherit = 'payment.transaction'
# link with the sale order
sale_order_id = fields.Many2one('sale.order', string='Sale Order')
def _generate_and_pay_invoice(self, tx, acquirer_name):
created_invoice = tx.sale_order_id.action_invoice_create()
created_invoice = self.env['account.invoice'].browse(created_invoice)
if created_invoice:
_logger.info('<%s> transaction completed, auto-generated invoice %s (ID %s) for %s (ID %s)',
acquirer_name, created_invoice.name, created_invoice.id, tx.sale_order_id.name, tx.sale_order_id.id)
created_invoice.signal_workflow('invoice_open')
if tx.acquirer_id.journal_id:
created_invoice.pay_and_reconcile(tx.acquirer_id.journal_id, pay_amount=created_invoice.amount_total)
if created_invoice.payment_ids:
created_invoice.payment_ids[0].payment_transaction_id = tx
else:
_logger.warning('<%s> transaction completed, could not auto-generate payment for %s (ID %s) (no journal set on acquirer)',
acquirer_name, tx.sale_order_id.name, tx.sale_order_id.id)
else:
_logger.warning('<%s> transaction completed, could not auto-generate invoice for %s (ID %s)',
acquirer_name, tx.sale_order_id.name, tx.sale_order_id.id)
@api.model
def form_feedback(self, data, acquirer_name):
""" Override to confirm the sale order, if defined, and if the transaction
@@ -36,9 +55,12 @@ class PaymentTransaction(models.Model):
# verify SO/TX match, excluding tx.fees which are currently not included in SO
amount_matches = float_compare(tx.amount, tx.sale_order_id.amount_total, 2) == 0
if amount_matches:
if tx.state == 'done' and tx.acquirer_id.auto_confirm == 'at_pay_confirm':
if tx.state == 'done' and tx.acquirer_id.auto_confirm in ['confirm_so', 'generate_and_pay_invoice']:
_logger.info('<%s> transaction completed, auto-confirming order %s (ID %s)', acquirer_name, tx.sale_order_id.name, tx.sale_order_id.id)
tx.sale_order_id.with_context(send_email=True).action_confirm()
if tx.acquirer_id.auto_confirm == 'generate_and_pay_invoice':
self._generate_and_pay_invoice(tx, acquirer_name)
elif tx.state not in ['cancel', 'error'] and tx.sale_order_id.state == 'draft':
_logger.info('<%s> transaction pending/to confirm manually, sending quote email for order %s (ID %s)', acquirer_name, tx.sale_order_id.name, tx.sale_order_id.id)
tx.sale_order_id.force_quotation_send()
-3
View File
@@ -219,9 +219,6 @@ class sale_quote(http.Controller):
'payment_tx_id': tx_id
}, context=context)
# confirm the quotation
if tx.acquirer_id.auto_confirm == 'at_pay_now':
request.registry['sale.order'].action_confirm(cr, SUPERUSER_ID, [order.id], context=dict(request.context, send_email=True))
return payment_obj.render(
request.cr, SUPERUSER_ID, tx.acquirer_id.id,
tx.reference,
-4
View File
@@ -778,10 +778,6 @@ class WebsiteSale(http.Controller):
'payment_tx_id': request.session['sale_transaction_id']
})
# confirm the quotation
if tx.acquirer_id.auto_confirm == 'at_pay_now':
order.with_context(send_email=True).action_confirm()
return tx.acquirer_id.with_context(submit_class='btn btn-primary', submit_txt=_('Pay Now')).sudo().render(
tx.reference,
order.amount_total,
@@ -18,7 +18,7 @@
<t t-if="doc.payment_acquirer_id.auto_confirm == 'none'">
<t t-raw="doc.payment_acquirer_id.pending_msg"/>
</t>
<t t-if="doc.payment_acquirer_id.auto_confirm == 'at_pay_confirm'">
<t t-if="doc.payment_acquirer_id.auto_confirm in ['confirm_so', 'generate_and_pay_invoice']">
<t t-if="doc.payment_tx_id.state == 'pending'">
<t t-raw="doc.payment_acquirer_id.pending_msg"/>
</t>
+1 -1
View File
@@ -1454,7 +1454,7 @@
</div>
</div>
</t>
<t t-if="order.payment_acquirer_id.auto_confirm == 'at_pay_confirm'">
<t t-if="order.payment_acquirer_id.auto_confirm in ['confirm_so', 'generate_and_pay_invoice']">
<t t-if="order.payment_tx_id.state == 'pending'">
<div class="alert alert-info" role="alert">
<t t-raw="order.payment_acquirer_id.pending_msg"/>