63883b3df3074bd277e65e31ff83c2825bcfeea0
[odoo/odoo.git] / addons / payment_transfer / models / payment_acquirer.py
1 # -*- coding: utf-'8' "-*-"
2
3 from openerp.addons.payment.models.payment_acquirer import ValidationError
4 from openerp.osv import osv
5 from openerp.tools.float_utils import float_compare
6 from openerp.tools.translate import _
7
8 import logging
9 import pprint
10
11 _logger = logging.getLogger(__name__)
12
13
14 class TransferPaymentAcquirer(osv.Model):
15     _inherit = 'payment.acquirer'
16
17     def _get_providers(self, cr, uid, context=None):
18         providers = super(TransferPaymentAcquirer, self)._get_providers(cr, uid, context=context)
19         providers.append(['transfer', 'Wire Transfer'])
20         return providers
21
22     def transfer_get_form_action_url(self, cr, uid, id, context=None):
23         return '/payment/transfer/feedback'
24
25     def _format_transfer_data(self, cr, uid, context=None):
26         bank_ids = [bank.id for bank in self.pool['res.users'].browse(cr, uid, uid, context=context).company_id.bank_ids]
27         # filter only bank accounts marked as visible
28         bank_ids = self.pool['res.partner.bank'].search(cr, uid, [('id', 'in', bank_ids), ('footer', '=', True)], context=context)
29         accounts = self.pool['res.partner.bank'].name_get(cr, uid, bank_ids, context=context)
30         bank_title = _('Bank Accounts') if len(accounts) > 1 else _('Bank Account')
31         bank_accounts = ''.join(['<ul>'] + ['<li>%s</li>' % name for id, name in accounts] + ['</ul>'])
32         post_msg = '''<div>
33 <h3>Please use the following transfer details</h3>
34 <h4>%(bank_title)s</h4>
35 %(bank_accounts)s
36 <h4>Communication</h4>
37 <p>Please use the order name as communication reference.</p>
38 </div>''' % {
39             'bank_title': bank_title,
40             'bank_accounts': bank_accounts,
41         }
42         return post_msg
43
44     def create(self, cr, uid, values, context=None):
45         """ Hook in create to create a default post_msg. This is done in create
46         to have access to the name and other creation values. If no post_msg
47         or a void post_msg is given at creation, generate a default one. """
48         if values.get('name') == 'transfer' and not values.get('post_msg'):
49             values['post_msg'] = self._format_transfer_data(cr, uid, context=context)
50         return super(TransferPaymentAcquirer, self).create(cr, uid, values, context=context)
51
52
53 class TransferPaymentTransaction(osv.Model):
54     _inherit = 'payment.transaction'
55
56     def _transfer_form_get_tx_from_data(self, cr, uid, data, context=None):
57         reference, amount, currency_name = data.get('reference'), data.get('amount'), data.get('currency_name')
58         tx_ids = self.search(
59             cr, uid, [
60                 ('reference', '=', reference),
61             ], context=context)
62
63         if not tx_ids or len(tx_ids) > 1:
64             error_msg = 'received data for reference %s' % (pprint.pformat(reference))
65             if not tx_ids:
66                 error_msg += '; no order found'
67             else:
68                 error_msg += '; multiple order found'
69             _logger.error(error_msg)
70             raise ValidationError(error_msg)
71
72         return self.browse(cr, uid, tx_ids[0], context=context)
73
74     def _transfer_form_get_invalid_parameters(self, cr, uid, tx, data, context=None):
75         invalid_parameters = []
76
77         if float_compare(float(data.get('amount', '0.0')), tx.amount, 2) != 0:
78             invalid_parameters.append(('amount', data.get('amount'), '%.2f' % tx.amount))
79         if data.get('currency') != tx.currency_id.name:
80             invalid_parameters.append(('currency', data.get('currency'), tx.currency_id.name))
81
82         return invalid_parameters
83
84     def _transfer_form_validate(self, cr, uid, tx, data, context=None):
85         _logger.info('Validated transfer payment for tx %s: set as pending' % (tx.reference))
86         return tx.write({'state': 'pending'})