diff --git a/addons/delivery/models/stock_picking.py b/addons/delivery/models/stock_picking.py index 355c978d366..36aeae3ddae 100644 --- a/addons/delivery/models/stock_picking.py +++ b/addons/delivery/models/stock_picking.py @@ -78,7 +78,7 @@ class StockPicking(models.Model): 'account_id': account_id, 'price_unit': price, 'quantity': 1, - 'invoice_line_tax_id': [(6, 0, taxes_ids)], + 'invoice_line_tax_ids': [(6, 0, taxes_ids)], } return res diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 89350139b4d..cc0b600530b 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -1724,6 +1724,12 @@ class account_invoice(osv.Model): orders, logging the invoice receipt or payment. """ _inherit = 'account.invoice' + _columns = { + 'purchase_ids': fields.many2many('purchase.order', 'purchase_invoice_rel', 'invoice_id', + 'purchase_id', 'Purchases', copy=False, + help="Purchases linked to this invoice") + } + def invoice_validate(self, cr, uid, ids, context=None): res = super(account_invoice, self).invoice_validate(cr, uid, ids, context=context) purchase_order_obj = self.pool.get('purchase.order') @@ -1845,4 +1851,10 @@ class account_invoice_line(osv.Model): return [] -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +class account_invoice_line(osv.Model): + """ Override account_invoice_line to add the link to the purchase order line it is related to""" + _inherit = 'account.invoice.line' + _columns = { + 'purchase_line_ids': fields.many2many('purchase.order.line', 'purchase_order_line_invoice_rel', 'invoice_id','order_line_id', + 'Purchase Order Lines', readonly=True, copy=False) + } \ No newline at end of file diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py index f18ff4574ec..b0e40275637 100644 --- a/addons/purchase/stock.py +++ b/addons/purchase/stock.py @@ -46,43 +46,14 @@ class stock_move(osv.osv): default['purchase_line_id'] = False return super(stock_move, self).copy(cr, uid, id, default, context) - def _create_invoice_line_from_vals(self, cr, uid, move, invoice_line_vals, context=None): - if move.purchase_line_id: - invoice_line_vals['purchase_line_id'] = move.purchase_line_id.id - invoice_line_vals['account_analytic_id'] = move.purchase_line_id.account_analytic_id.id or False - invoice_line_id = super(stock_move, self)._create_invoice_line_from_vals(cr, uid, move, invoice_line_vals, context=context) - if move.purchase_line_id: - purchase_line = move.purchase_line_id - self.pool.get('purchase.order.line').write(cr, uid, [purchase_line.id], { - 'invoice_lines': [(4, invoice_line_id)] - }, context=context) - 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), ('invoice_lines', '=', False), '|', ('product_id', '=', False), ('product_id.type', '=', 'service')], 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): - if context.get('inv_type') == 'in_invoice' and move.purchase_line_id: + def _get_master_data(self, cr, uid, move, inv_type, context=None): + if inv_type == 'in_invoice' and move.purchase_line_id: purchase_order = move.purchase_line_id.order_id return purchase_order.partner_id, purchase_order.create_uid.id, purchase_order.currency_id.id - if context.get('inv_type') == 'in_refund' and move.origin_returned_move_id.purchase_line_id: + if inv_type == 'in_refund' and move.origin_returned_move_id.purchase_line_id: purchase_order = move.origin_returned_move_id.purchase_line_id.order_id return purchase_order.partner_id, purchase_order.create_uid.id, purchase_order.currency_id.id - elif context.get('inv_type') in ('in_invoice', 'in_refund') and move.picking_id: + elif inv_type in ('in_invoice', 'in_refund') and move.picking_id: # In case of an extra move, it is better to use the data from the original moves for purchase_move in move.picking_id.move_lines: if purchase_move.purchase_line_id: @@ -94,19 +65,20 @@ class stock_move(osv.osv): if partner and partner.property_product_pricelist_purchase and code == 'incoming': currency = partner.property_product_pricelist_purchase.currency_id.id return partner, uid, currency - return super(stock_move, self)._get_master_data(cr, uid, move, company, context=context) - + return super(stock_move, self)._get_master_data(cr, uid, move, inv_type, context=context) def _get_invoice_line_vals(self, cr, uid, move, partner, inv_type, context=None): res = super(stock_move, self)._get_invoice_line_vals(cr, uid, move, partner, inv_type, context=context) + purchase_line = False if inv_type == 'in_invoice' and move.purchase_line_id: purchase_line = move.purchase_line_id - res['invoice_line_tax_ids'] = [(6, 0, [x.id for x in purchase_line.taxes_id])] - res['price_unit'] = purchase_line.price_unit elif inv_type == 'in_refund' and move.origin_returned_move_id.purchase_line_id: purchase_line = move.origin_returned_move_id.purchase_line_id - res['invoice_line_tax_id'] = [(6, 0, [x.id for x in purchase_line.taxes_id])] + if purchase_line: + res['invoice_line_tax_ids'] = [(6, 0, [x.id for x in purchase_line.taxes_id])] res['price_unit'] = purchase_line.price_unit + res['account_analytic_id'] = purchase_line.account_analytic_id.id + res['purchase_line_ids'] = [(4, purchase_line.id)] return res def _get_moves_taxes(self, cr, uid, moves, inv_type, context=None): @@ -122,7 +94,7 @@ class stock_move(osv.osv): mov = self.browse(cr, uid, mov_id[0], context=context) fp = mov.purchase_line_id.order_id.fiscal_position res = self.pool.get("account.invoice.line").product_id_change(cr, uid, [], move.product_id.id, None, partner_id=move.picking_id.partner_id.id, fposition_id=(fp and fp.id), type='in_invoice', context=context) - extra_move_tax[0, move.product_id] = [(6, 0, res['value']['invoice_line_tax_id'])] + extra_move_tax[0, move.product_id] = [(6, 0, res['value']['invoice_line_tax_ids'])] return (is_extra_move, extra_move_tax) @@ -187,23 +159,37 @@ class stock_picking(osv.osv): }), } - def _create_invoice_from_picking(self, cr, uid, picking, vals, context=None): - purchase_obj = self.pool.get("purchase.order") - 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) - return invoice_id - - def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, move, context=None): - inv_vals = super(stock_picking, self)._get_invoice_vals(cr, uid, key, inv_type, journal_id, move, context=context) - if move.purchase_line_id and move.purchase_line_id.order_id: - purchase = move.purchase_line_id.order_id - inv_vals.update({ - 'fiscal_position_id': purchase.fiscal_position_id.id, - 'payment_term_id': purchase.payment_term_id.id, - }) + def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, moves, context=None): + inv_vals = super(stock_picking, self)._get_invoice_vals(cr, uid, key, inv_type, journal_id, moves, context=context) + purchases = [] + for move in moves: + if move.purchase_line_id or move.origin_returned_move_id.purchase_line_id: + purchase = move.purchase_line_id.order_id or move.origin_returned_move_id.purchase_line_id.order_id + inv_vals.update({ + 'fiscal_position_id': purchase.fiscal_position_id.id, + 'payment_term_id': purchase.payment_term_id.id, + }) + purchases.append(purchase.id) + if purchases: + inv_vals['purchase_ids'] = [(6, 0, list(set(purchases)))] return inv_vals + def get_service_line_vals(self, cr, uid, moves, partner, inv_type, context=None): + purchase_obj = self.pool['purchase.order'] + purchase_line_obj = self.pool['purchase.order.line'] + res = super(stock_picking, self).get_service_line_vals(cr, uid, moves, partner, inv_type, context=context) + # Add service lines for purchases + if inv_type == 'in_invoice': + purchase_ids = list(set([x.purchase_line_id.order_id.id for x in moves if x.purchase_line_id])) + purchase_line_ids = purchase_line_obj.search(cr, uid, [('order_id', 'in', purchase_ids), ('invoice_lines', '=', False), '|', ('product_id', '=', False), + ('product_id.type', '=', 'service')], context=context) + 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_data['purchase_line_ids'] = [(4, po_line.id)] + res += [(0, 0, inv_line_data)] + return res + class stock_warehouse(osv.osv): _inherit = 'stock.warehouse' diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 8c78faf9505..bfc3eb248bb 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1148,6 +1148,8 @@ class account_invoice(osv.Model): _columns = { 'team_id': fields.many2one('crm.team', 'Sales Team', oldname='section_id'), + 'sale_ids': fields.many2many('sale.order', 'sale_order_invoice_rel', 'invoice_id', 'order_id', 'Sale Orders', + readonly=True, copy=False, help="This is the list of sale orders related to this invoice. One invoice may have multiple sale orders related. "), } _defaults = { @@ -1174,6 +1176,15 @@ class account_invoice(osv.Model): return super(account_invoice, self).unlink(cr, uid, ids, context=context) +class account_invoice_line(osv.Model): + _inherit = 'account.invoice.line' + + _columns= { + 'sale_line_ids': fields.many2many('sale.order.line', 'sale_order_line_invoice_rel', 'invoice_id', 'order_line_id', + 'Sale Order Lines', readonly=True, copy=False) + } + + class procurement_order(osv.osv): _inherit = 'procurement.order' _columns = { diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index 969d55d08b0..4882bb3ac85 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -361,39 +361,20 @@ class sale_order_line(osv.osv): class stock_move(osv.osv): _inherit = 'stock.move' - def _create_invoice_line_from_vals(self, cr, uid, move, invoice_line_vals, context=None): - invoice_line_id = super(stock_move, self)._create_invoice_line_from_vals(cr, uid, move, invoice_line_vals, context=context) - if context.get('inv_type') in ('out_invoice', 'out_refund') and move.procurement_id and move.procurement_id.sale_line_id: - sale_line = move.procurement_id.sale_line_id - self.pool.get('sale.order.line').write(cr, uid, [sale_line.id], { - 'invoice_lines': [(4, invoice_line_id)] - }, context=context) - 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), ('invoiced', '=', False), '|', ('product_id', '=', False), ('product_id.type', '=', 'service')], 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): - if context.get('inv_type') in ('out_invoice', 'out_refund') and move.procurement_id and move.procurement_id.sale_line_id and move.procurement_id.sale_line_id.order_id.order_policy == 'picking': - sale_order = move.procurement_id.sale_line_id.order_id + def _get_master_data(self, cr, uid, move, inv_type, context=None): + if inv_type in ('out_invoice', 'out_refund') and (move.procurement_id.sale_line_id or move.origin_returned_move_id.procurement_id.sale_line_id): + sale_order = move.procurement_id.sale_line_id.order_id or move.origin_returned_move_id.procurement_id.sale_line_id.order_id return sale_order.partner_invoice_id, sale_order.user_id.id, sale_order.pricelist_id.currency_id.id - elif move.picking_id.sale_id and context.get('inv_type') in ('out_invoice', 'out_refund'): + elif move.picking_id.sale_id or move.origin_returned_move_id.picking_id.sale_id and inv_type in ('out_invoice', 'out_refund'): # In case of extra move, it is better to use the same data as the original moves - sale_order = move.picking_id.sale_id + sale_order = move.picking_id.sale_id or move.origin_returned_move_id.picking_id.sale_id return sale_order.partner_invoice_id, sale_order.user_id.id, sale_order.pricelist_id.currency_id.id - return super(stock_move, self)._get_master_data(cr, uid, move, company, context=context) + return super(stock_move, self)._get_master_data(cr, uid, move, inv_type, context=context) def _get_invoice_line_vals(self, cr, uid, move, partner, inv_type, context=None): res = super(stock_move, self)._get_invoice_line_vals(cr, uid, move, partner, inv_type, context=context) - if inv_type in ('out_invoice', 'out_refund') and move.procurement_id and move.procurement_id.sale_line_id: - sale_line = move.procurement_id.sale_line_id + if inv_type in ('out_invoice', 'out_refund') and (move.procurement_id.sale_line_id or move.origin_returned_move_id.procurement_id.sale_line_id): + sale_line = move.procurement_id.sale_line_id or move.origin_returned_move_id.procurement_id.sale_line_id res['invoice_line_tax_ids'] = [(6, 0, [x.id for x in sale_line.tax_id])] res['account_analytic_id'] = sale_line.order_id.project_id and sale_line.order_id.project_id.id or False res['discount'] = sale_line.discount @@ -406,6 +387,7 @@ class stock_move(osv.osv): res['price_unit'] = sale_line.price_unit uos_coeff = move.product_uom_qty and move.product_uos_qty / move.product_uom_qty or 1.0 res['price_unit'] = res['price_unit'] / uos_coeff + res['sale_line_ids'] = [(4, sale_line.id)] return res def _get_moves_taxes(self, cr, uid, moves, inv_type, context=None): @@ -418,7 +400,7 @@ class stock_move(osv.osv): elif move.picking_id.sale_id and move.product_id.product_tmpl_id.taxes_id: fp = move.picking_id.sale_id.fiscal_position res = self.pool.get("account.invoice.line").product_id_change(cr, uid, [], move.product_id.id, None, partner_id=move.picking_id.partner_id.id, fposition_id=(fp and fp.id), context=context) - extra_move_tax[0, move.product_id] = [(6, 0, res['value']['invoice_line_tax_id'])] + extra_move_tax[0, move.product_id] = [(6, 0, res['value']['invoice_line_tax_ids'])] return (is_extra_move, extra_move_tax) def _get_taxes(self, cr, uid, move, context=None): @@ -463,27 +445,35 @@ class stock_picking(osv.osv): 'sale_id': fields.function(_get_sale_id, type="many2one", relation="sale.order", string="Sale Order"), } - def _create_invoice_from_picking(self, cr, uid, picking, vals, context=None): - sale_obj = self.pool.get('sale.order') - 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) - return invoice_id - - def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, move, context=None): - inv_vals = super(stock_picking, self)._get_invoice_vals(cr, uid, key, inv_type, journal_id, move, context=context) - sale = move.picking_id.sale_id - if sale: - inv_vals.update({ - 'fiscal_position_id': sale.fiscal_position_id.id, - 'payment_term_id': sale.payment_term_id.id, - 'user_id': sale.user_id.id, - 'team_id': sale.team_id.id, - 'name': sale.client_order_ref or '', - 'comment': sale.note, - }) + def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, moves, context=None): + inv_vals = super(stock_picking, self)._get_invoice_vals(cr, uid, key, inv_type, journal_id, moves, context=context) + if inv_type in ('out_invoice', 'out_refund'): + sales = [x.picking_id.sale_id or x.origin_returned_move_id.picking_id.sale_id for x in moves if x.picking_id.sale_id or x.origin_returned_move_id.picking_id.sale_id] + if sales: + sale = sales[0] + inv_vals.update({ + 'fiscal_position_id': sale.fiscal_position_id.id, + 'payment_term_id': sale.payment_term_id.id, + 'user_id': sale.user_id.id, + 'team_id': sale.team_id.id, + 'name': sale.client_order_ref or '', + 'sale_ids': [(6, 0, list(set([x.id for x in sales])))], + }) return inv_vals + def get_service_line_vals(self, cr, uid, moves, partner, inv_type, context=None): + res = super(stock_picking, self).get_service_line_vals(cr, uid, moves, partner, inv_type, context=context) + if inv_type == 'out_invoice': + sale_line_obj = self.pool.get('sale.order.line') + orders = list(set([x.procurement_id.sale_line_id.order_id.id for x in moves if x.procurement_id.sale_line_id])) + sale_line_ids = sale_line_obj.search(cr, uid, [('order_id', 'in', orders), ('invoiced', '=', False), '|', ('product_id', '=', False), + ('product_id.type', '=', 'service')], context=context) + if sale_line_ids: + created_lines = sale_line_obj.invoice_line_create(cr, uid, sale_line_ids, context=context) + res += [(4, x) for x in created_lines] + return res + + class account_invoice(osv.Model): _inherit = 'account.invoice' _columns = { diff --git a/addons/stock_account/stock.py b/addons/stock_account/stock.py index a3c32b9b168..6e3e81be447 100644 --- a/addons/stock_account/stock.py +++ b/addons/stock_account/stock.py @@ -72,19 +72,14 @@ class stock_move(osv.osv): 'invoice_state': lambda *args, **argv: 'none' } - def _get_master_data(self, cr, uid, move, company, context=None): + def _get_master_data(self, cr, uid, move, inv_type, context=None): ''' returns a tuple (browse_record(res.partner), ID(res.users), ID(res.currency)''' - currency = company.currency_id.id + currency = move.company_id.currency_id.id partner = move.picking_id and move.picking_id.partner_id - if partner: - code = self.get_code_from_locs(cr, uid, move, context=context) - if partner.property_product_pricelist and code == 'outgoing': - currency = partner.property_product_pricelist.currency_id.id + if partner and partner.property_product_pricelist and inv_type in ('out_invoice', 'out_refund'): + currency = partner.property_product_pricelist.currency_id.id return partner, uid, currency - def _create_invoice_line_from_vals(self, cr, uid, move, invoice_line_vals, context=None): - return self.pool.get('account.invoice.line').create(cr, uid, invoice_line_vals, context=context) - def _get_price_unit_invoice(self, cr, uid, move_line, type, context=None): """ Gets price unit for invoice @param move_line: Stock move lines @@ -263,7 +258,7 @@ class stock_picking(osv.osv): self.pool.get('account.invoice.line').write(cr, uid, [ol.id], {'account_id': a}) return invoices - def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, move, context=None): + def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, moves, context=None): if context is None: context = {} partner, currency_id, company_id, user_id = key @@ -273,12 +268,8 @@ class stock_picking(osv.osv): else: account_id = partner.property_account_payable_id.id payment_term = partner.property_supplier_payment_term_id.id or False - if not move.origin: - origin = move.picking_id.name - else: - origin = move.picking_id.name + ', ' + move.origin return { - 'origin': origin, + 'origin': ','.join(list(set([x.picking_id.name for x in moves]))), 'date_invoice': context.get('date_inv', False), 'user_id': user_id, 'partner_id': partner.id, @@ -291,55 +282,58 @@ class stock_picking(osv.osv): 'journal_id': journal_id, } + def get_service_line_vals(self, cr, uid, moves, partner, inv_type, context=None): + return [] + def _invoice_create_line(self, cr, uid, moves, journal_id, inv_type='out_invoice', context=None): invoice_obj = self.pool.get('account.invoice') move_obj = self.pool.get('stock.move') invoices = {} is_extra_move, extra_move_tax = move_obj._get_moves_taxes(cr, uid, moves, inv_type, context=context) + product_price_unit = {} + invoices_moves = {} for move in moves: company = move.company_id origin = move.picking_id.name - partner, _user_id, currency_id = move_obj._get_master_data(cr, uid, move, company, context=context) - + partner, _user_id, currency_id = move_obj._get_master_data(cr, uid, move, inv_type, context=context) # Force user_id to be current user, to avoid creating multiple invoices when lines # have been sold by different salesmen _user_id = uid - key = (partner, currency_id, company.id, _user_id) - invoice_vals = self._get_invoice_vals(cr, uid, key, inv_type, journal_id, move, context=context) - if key not in invoices: - # Get account and payment terms - invoice_id = self._create_invoice_from_picking(cr, uid, move.picking_id, invoice_vals, context=context) - invoices[key] = invoice_id + if key not in invoices_moves: + invoices_moves[key] = [move] else: - invoice = invoice_obj.browse(cr, uid, invoices[key], context=context) - if not invoice.origin or invoice_vals['origin'] not in invoice.origin.split(', '): - elements = (invoice.origin or '').split(',') + (invoice_vals['origin'] or '').split(',') - invoice_origin = ', '.join(set(e.strip() for e in elements)) - invoice.write({'origin': invoice_origin}) + invoices_moves[key] += [move] - invoice_line_vals = move_obj._get_invoice_line_vals(cr, uid, move, partner, inv_type, context=context) - invoice_line_vals['invoice_id'] = invoices[key] - invoice_line_vals['origin'] = origin - if not is_extra_move[move.id]: - product_price_unit[invoice_line_vals['product_id'], invoice_line_vals['uos_id']] = invoice_line_vals['price_unit'] - if is_extra_move[move.id] and (invoice_line_vals['product_id'], invoice_line_vals['uos_id']) in product_price_unit: - invoice_line_vals['price_unit'] = product_price_unit[invoice_line_vals['product_id'], invoice_line_vals['uos_id']] - if is_extra_move[move.id]: - desc = (inv_type in ('out_invoice', 'out_refund') and move.product_id.product_tmpl_id.description_sale) or \ - (inv_type in ('in_invoice','in_refund') and move.product_id.product_tmpl_id.description_purchase) - invoice_line_vals['name'] += ' ' + desc if desc else '' - if extra_move_tax[move.picking_id, move.product_id]: - invoice_line_vals['invoice_line_tax_ids'] = extra_move_tax[move.picking_id, move.product_id] - #the default product taxes - elif (0, move.product_id) in extra_move_tax: - invoice_line_vals['invoice_line_tax_ids'] = extra_move_tax[0, move.product_id] - - move_obj._create_invoice_line_from_vals(cr, uid, move, invoice_line_vals, context=context) - move_obj.write(cr, uid, move.id, {'invoice_state': 'invoiced'}, context=context) - - return invoices.values() + inv_moves={} + for key in invoices_moves.keys(): + moves_key = invoices_moves[key] + invoice_vals = self._get_invoice_vals(cr, uid, key, inv_type, journal_id, moves_key, context=context) + partner = key[0] + invoice_line_vals = [] + for move in moves_key: + line_vals = move_obj._get_invoice_line_vals(cr, uid, move, partner, inv_type, context=context) + if not is_extra_move[move.id]: + product_price_unit[line_vals['product_id'], line_vals['uos_id']] = line_vals['price_unit'] + if is_extra_move[move.id] and (line_vals['product_id'], line_vals['uos_id']) in product_price_unit: + line_vals['price_unit'] = product_price_unit[line_vals['product_id'], line_vals['uos_id']] + if is_extra_move[move.id]: + desc = (inv_type in ('out_invoice', 'out_refund') and move.product_id.product_tmpl_id.description_sale) or \ + (inv_type in ('in_invoice','in_refund') and move.product_id.product_tmpl_id.description_purchase) + line_vals['name'] += ' ' + desc if desc else '' + if extra_move_tax[move.picking_id, move.product_id]: + line_vals['invoice_line_tax_ids'] = extra_move_tax[move.picking_id, move.product_id] + #the default product taxes + elif (0, move.product_id) in extra_move_tax: + line_vals['invoice_line_tax_ids'] = extra_move_tax[0, move.product_id] + invoice_line_vals += [(0, 0, line_vals)] + invoice_vals['invoice_line_ids'] = invoice_line_vals + invoice_vals['invoice_line_ids'] += self.get_service_line_vals(cr, uid, moves_key, partner, inv_type, context=context) + invoice_id = invoice_obj.create(cr, uid, invoice_vals, context=context) + move_obj.write(cr, uid, [x.id for x in moves_key], {'invoice_state': 'invoiced'}, context=context) + inv_moves[invoice_id] = moves_key + return inv_moves def _prepare_values_extra_move(self, cr, uid, op, product, remaining_qty, context=None): """