From cb6e27c992e514083b751f58b74edd20bd4f58a0 Mon Sep 17 00:00:00 2001 From: Josse Colpaert Date: Fri, 20 Feb 2015 16:31:36 +0100 Subject: [PATCH] [IMP] When invoicing from multiple pickings, services should be checked for all purchases/sales [FIX] Should make sure purchase order lines are not invoiced twice --- addons/purchase/stock.py | 26 ++++++++++++++------------ addons/sale_stock/sale_stock.py | 14 +++++++------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py index cf7b445fbf6..2b415f0115f 100644 --- a/addons/purchase/stock.py +++ b/addons/purchase/stock.py @@ -69,6 +69,20 @@ class stock_move(osv.osv): self.pool.get('purchase.order').write(cr, uid, [purchase_line.order_id.id], { 'invoice_ids': [(4, invoice_line_vals['invoice_id'])], }) + purchase_line_obj = self.pool.get('purchase.order.line') + purchase_obj = self.pool.get('purchase.order') + invoice_line_obj = self.pool.get('account.invoice.line') + purchase_id = move.purchase_line_id.order_id.id + purchase_line_ids = purchase_line_obj.search(cr, uid, [('order_id', '=', purchase_id), ('product_id.type', '=', 'service'), ('invoice_lines', '=', False)], context=context) + if purchase_line_ids: + inv_lines = [] + for po_line in purchase_line_obj.browse(cr, uid, purchase_line_ids, context=context): + acc_id = purchase_obj._choose_account_from_po_line(cr, uid, po_line, context=context) + inv_line_data = purchase_obj._prepare_inv_line(cr, uid, acc_id, po_line, context=context) + inv_line_id = invoice_line_obj.create(cr, uid, inv_line_data, context=context) + inv_lines.append(inv_line_id) + po_line.write({'invoice_lines': [(4, inv_line_id)]}) + invoice_line_obj.write(cr, uid, inv_lines, {'invoice_id': invoice_line_vals['invoice_id']}, context=context) return invoice_line_id def _get_master_data(self, cr, uid, move, company, context=None): @@ -148,18 +162,6 @@ class stock_picking(osv.osv): purchase_line_obj = self.pool.get('purchase.order.line') invoice_line_obj = self.pool.get('account.invoice.line') invoice_id = super(stock_picking, self)._create_invoice_from_picking(cr, uid, picking, vals, context=context) - if picking.move_lines and picking.move_lines[0].purchase_line_id: - purchase_id = picking.move_lines[0].purchase_line_id.order_id.id - purchase_line_ids = purchase_line_obj.search(cr, uid, [('order_id', '=', purchase_id), ('product_id.type', '=', 'service'), ('invoiced', '=', False)], context=context) - if purchase_line_ids: - inv_lines = [] - for po_line in purchase_line_obj.browse(cr, uid, purchase_line_ids, context=context): - acc_id = purchase_obj._choose_account_from_po_line(cr, uid, po_line, context=context) - inv_line_data = purchase_obj._prepare_inv_line(cr, uid, acc_id, po_line, context=context) - inv_line_id = invoice_line_obj.create(cr, uid, inv_line_data, context=context) - inv_lines.append(inv_line_id) - po_line.write({'invoice_lines': [(4, inv_line_id)]}) - invoice_line_obj.write(cr, uid, inv_lines, {'invoice_id': invoice_id}, context=context) return invoice_id def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, move, context=None): diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 66e01cd99a5..b6250abdfe8 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -368,6 +368,13 @@ class stock_move(osv.osv): self.pool.get('sale.order').write(cr, uid, [sale_line.order_id.id], { 'invoice_ids': [(4, invoice_line_vals['invoice_id'])], }) + sale_line_obj = self.pool.get('sale.order.line') + invoice_line_obj = self.pool.get('account.invoice.line') + sale_line_ids = sale_line_obj.search(cr, uid, [('order_id', '=', move.procurement_id.sale_line_id.order_id.id), ('product_id.type', '=', 'service'), ('invoiced', '=', False)], context=context) + if sale_line_ids: + created_lines = sale_line_obj.invoice_line_create(cr, uid, sale_line_ids, context=context) + invoice_line_obj.write(cr, uid, created_lines, {'invoice_id': invoice_line_vals['invoice_id']}, context=context) + return invoice_line_id def _get_master_data(self, cr, uid, move, company, context=None): @@ -436,13 +443,6 @@ class stock_picking(osv.osv): sale_line_obj = self.pool.get('sale.order.line') invoice_line_obj = self.pool.get('account.invoice.line') invoice_id = super(stock_picking, self)._create_invoice_from_picking(cr, uid, picking, vals, context=context) - if picking.group_id: - sale_ids = sale_obj.search(cr, uid, [('procurement_group_id', '=', picking.group_id.id)], context=context) - if sale_ids: - sale_line_ids = sale_line_obj.search(cr, uid, [('order_id', 'in', sale_ids), ('product_id.type', '=', 'service'), ('invoiced', '=', False)], context=context) - if sale_line_ids: - created_lines = sale_line_obj.invoice_line_create(cr, uid, sale_line_ids, context=context) - invoice_line_obj.write(cr, uid, created_lines, {'invoice_id': invoice_id}, context=context) return invoice_id def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, move, context=None):