[IMP] sale, purchase, stock_account: Refactor invoicing on picking

- Added reverse for purchase_ids/purchase_line_ids/invoice_ids/invoice_line_ids
- Put first everything in a dictionary by invoice to create and
then create invoice by invoice
This commit is contained in:
Josse Colpaert
2015-07-27 16:59:08 +02:00
parent 6d484ad026
commit edd1e04eb8
6 changed files with 145 additions and 152 deletions
+1 -1
View File
@@ -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
+13 -1
View File
@@ -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)
}
+40 -54
View File
@@ -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'
+11
View File
@@ -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 = {
+37 -47
View File
@@ -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 = {
+43 -49
View File
@@ -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):
"""