[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:
@@ -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
|
||||
|
||||
@@ -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
@@ -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'
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user