# -*- coding: utf-8 -*- # © 2013-2014 ACSONE SA (<http://acsone.eu>). # © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, fields, api, _ from openerp.exceptions import UserError class AccountInvoice(models.Model): _inherit = 'account.invoice' payment_order_ok = fields.Boolean( related='payment_mode_id.payment_order_ok', readonly=True) @api.model def _get_reference_type(self): rt = super(AccountInvoice, self)._get_reference_type() rt.append(('structured', _('Structured Reference'))) return rt @api.model def line_get_convert(self, line, part): """Copy supplier bank account from invoice to account move line""" res = super(AccountInvoice, self).line_get_convert(line, part) if line.get('type') == 'dest' and line.get('invoice_id'): invoice = self.browse(line['invoice_id']) if invoice.type in ('in_invoice', 'in_refund'): res['partner_bank_id'] = invoice.partner_bank_id.id or False return res @api.multi def _prepare_new_payment_order(self): self.ensure_one() vals = {'payment_mode_id': self.payment_mode_id.id} return vals @api.multi def create_account_payment_line(self): apoo = self.env['account.payment.order'] aplo = self.env['account.payment.line'] result_payorder_ids = [] action_payment_type = 'debit' for inv in self: if inv.state != 'open': raise UserError(_( "The invoice %s is not in Open state") % inv.number) if not inv.payment_mode_id: raise UserError(_( "No Payment Mode on invoice %s") % inv.number) if not inv.move_id: raise UserError(_( "No Journal Entry on invoice %s") % inv.number) if not inv.payment_order_ok: raise UserError(_( "The invoice %s has a payment mode '%s' " "which is not selectable in payment orders.")) payorders = apoo.search([ ('payment_mode_id', '=', inv.payment_mode_id.id), ('state', '=', 'draft')]) if payorders: payorder = payorders[0] new_payorder = False else: payorder = apoo.create(inv._prepare_new_payment_order()) new_payorder = True result_payorder_ids.append(payorder.id) action_payment_type = payorder.payment_type count = 0 for line in inv.move_id.line_ids: if line.account_id == inv.account_id and not line.reconciled: paylines = aplo.search([ ('move_line_id', '=', line.id), ('state', '!=', 'cancel')]) if not paylines: line.create_payment_line_from_move_line(payorder) count += 1 if count: if new_payorder: inv.message_post(_( '%d payment lines added to the new draft payment ' 'order %s which has been automatically created.') % (count, payorder.name)) else: inv.message_post(_( '%d payment lines added to the existing draft ' 'payment order %s.') % (count, payorder.name)) else: raise UserError(_( 'No Payment Line created for invoice %s because ' 'it already exists or because this invoice is ' 'already paid.') % inv.number) action = self.env['ir.actions.act_window'].for_xml_id( 'account_payment_order', 'account_payment_order_%s_action' % action_payment_type) if len(result_payorder_ids) == 1: action.update({ 'view_mode': 'form,tree,pivot,graph', 'res_id': payorder.id, 'views': False, }) else: action.update({ 'view_mode': 'tree,form,pivot,graph', 'domain': "[('id', 'in', %s)]" % result_payorder_ids, 'views': False, }) return action