From 188a937227a2d03df485f75a6cccfce25f0db27b Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 1 Feb 2012 19:31:23 +0100 Subject: [PATCH] Add function _prepare_invoice(), which builds the dict containing the values of the invoice that will be created. Remove function _inv_get() ; developers should inherit _prepare_invoice() now. bzr revid: alexis@via.ecp.fr-20120201183123-kih36wb5ipoqvlc6 --- addons/sale/sale.py | 66 +++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 89bef24..9f8e448 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -393,43 +393,24 @@ class sale_order(osv.osv): def button_dummy(self, cr, uid, ids, context=None): return True - #FIXME: the method should return the list of invoices created (invoice_ids) - # and not the id of the last invoice created (res). The problem is that we - # cannot change it directly since the method is called by the sales order - # workflow and I suppose it expects a single id... - def _inv_get(self, cr, uid, order, context=None): - return {} - - def _make_invoice(self, cr, uid, order, lines, context=None): - journal_obj = self.pool.get('account.journal') - inv_obj = self.pool.get('account.invoice') - obj_invoice_line = self.pool.get('account.invoice.line') - if context is None: - context = {} - - journal_ids = journal_obj.search(cr, uid, [('type', '=', 'sale'), ('company_id', '=', order.company_id.id)], limit=1) + def _prepare_invoice(self, cr, uid, order, lines, context=None): + """ Builds the dict containing the values for the invoice + @param order: order object + @param line: list of invoice line IDs that must be attached to the invoice + @return: dict that will be used to create the invoice object + """ + journal_ids = self.pool.get('account.journal').search(cr, uid, + [('type', '=', 'sale'), ('company_id', '=', order.company_id.id)], + limit=1) if not journal_ids: raise osv.except_osv(_('Error !'), _('There is no sales journal defined for this company: "%s" (id:%d)') % (order.company_id.name, order.company_id.id)) - a = order.partner_id.property_account_receivable.id - pay_term = order.payment_term and order.payment_term.id or False - invoiced_sale_line_ids = self.pool.get('sale.order.line').search(cr, uid, [('order_id', '=', order.id), ('invoiced', '=', True)], context=context) - from_line_invoice_ids = [] - for invoiced_sale_line_id in self.pool.get('sale.order.line').browse(cr, uid, invoiced_sale_line_ids, context=context): - for invoice_line_id in invoiced_sale_line_id.invoice_lines: - if invoice_line_id.invoice_id.id not in from_line_invoice_ids: - from_line_invoice_ids.append(invoice_line_id.invoice_id.id) - for preinv in order.invoice_ids: - if preinv.state not in ('cancel',) and preinv.id not in from_line_invoice_ids: - for preline in preinv.invoice_line: - inv_line_id = obj_invoice_line.copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit}) - lines.append(inv_line_id) - inv = { + return { 'name': order.client_order_ref or '', 'origin': order.name, 'type': 'out_invoice', 'reference': order.client_order_ref or order.name, - 'account_id': a, + 'account_id': order.partner_id.property_account_receivable.id, 'partner_id': order.partner_id.id, 'journal_id': journal_ids[0], 'address_invoice_id': order.partner_invoice_id.id, @@ -437,15 +418,32 @@ class sale_order(osv.osv): 'invoice_line': [(6, 0, lines)], 'currency_id': order.pricelist_id.currency_id.id, 'comment': order.note, - 'payment_term': pay_term, + 'payment_term': order.payment_term and order.payment_term.id or False, 'fiscal_position': order.fiscal_position.id or order.partner_id.property_account_position.id, - 'date_invoice': context.get('date_invoice',False), + 'date_invoice': context.get('date_invoice', False), 'company_id': order.company_id.id, 'user_id': order.user_id and order.user_id.id or False } - inv.update(self._inv_get(cr, uid, order)) + + def _make_invoice(self, cr, uid, order, lines, context=None): + inv_obj = self.pool.get('account.invoice') + obj_invoice_line = self.pool.get('account.invoice.line') + if context is None: + context = {} + invoiced_sale_line_ids = self.pool.get('sale.order.line').search(cr, uid, [('order_id', '=', order.id), ('invoiced', '=', True)], context=context) + from_line_invoice_ids = [] + for invoiced_sale_line_id in self.pool.get('sale.order.line').browse(cr, uid, invoiced_sale_line_ids, context=context): + for invoice_line_id in invoiced_sale_line_id.invoice_lines: + if invoice_line_id.invoice_id.id not in from_line_invoice_ids: + from_line_invoice_ids.append(invoice_line_id.invoice_id.id) + for preinv in order.invoice_ids: + if preinv.state not in ('cancel',) and preinv.id not in from_line_invoice_ids: + for preline in preinv.invoice_line: + inv_line_id = obj_invoice_line.copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit}) + lines.append(inv_line_id) + inv = self._prepare_invoice(cr, uid, order, lines, context=context) inv_id = inv_obj.create(cr, uid, inv, context=context) - data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], pay_term, time.strftime(DEFAULT_SERVER_DATE_FORMAT)) + data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], inv['payment_term'], time.strftime(DEFAULT_SERVER_DATE_FORMAT)) if data.get('value', False): inv_obj.write(cr, uid, [inv_id], data['value'], context=context) inv_obj.button_compute(cr, uid, [inv_id]) -- 1.7.10.4