148 lines
6.2 KiB
Python
148 lines
6.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2009-2018 Noviat
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
import copy
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class AccountInvoice(models.Model):
|
|
_inherit = 'account.invoice'
|
|
|
|
@api.multi
|
|
def finalize_invoice_move_lines(self, move_lines):
|
|
move_lines = super(AccountInvoice, self) \
|
|
.finalize_invoice_move_lines(move_lines)
|
|
new_lines = []
|
|
for line_tuple in move_lines:
|
|
line = line_tuple[2]
|
|
dp = self.env['decimal.precision']
|
|
if line.get('asset_profile_id') and \
|
|
line.get('quantity', 0.0) > 1.0:
|
|
profile = self.env['account.asset.profile'].browse(
|
|
[line.get('asset_profile_id')])
|
|
if profile.asset_product_item:
|
|
origin_line = copy.deepcopy(line)
|
|
line_qty = line.get('quantity')
|
|
line['quantity'] = round(line['quantity'] / line_qty,
|
|
dp.precision_get('Account'))
|
|
line['debit'] = round(line['debit'] / line_qty,
|
|
dp.precision_get('Account'))
|
|
line['credit'] = round(line['credit'] / line_qty,
|
|
dp.precision_get('Account'))
|
|
for analytic_line_tuple in line['analytic_line_ids']:
|
|
analytic_line = analytic_line_tuple[2]
|
|
analytic_line['amount'] = round(
|
|
analytic_line['amount'] / line_qty,
|
|
dp.precision_get('Account'))
|
|
analytic_line['unit_amount'] = round(
|
|
analytic_line['unit_amount'] / line_qty, 2)
|
|
line_to_create = line_qty
|
|
while line_to_create > 1:
|
|
line_to_create -= 1
|
|
new_line = copy.deepcopy(line_tuple)
|
|
new_lines.append(new_line)
|
|
# Compute rounding difference and apply it on the first
|
|
# line
|
|
line['quantity'] += round(
|
|
origin_line['quantity'] - line['quantity'] * line_qty,
|
|
2)
|
|
line['debit'] += round(
|
|
origin_line['debit'] - line['debit'] * line_qty,
|
|
dp.precision_get('Account'))
|
|
line['credit'] += round(
|
|
origin_line['credit'] - line['credit'] * line_qty,
|
|
dp.precision_get('Account'))
|
|
i = 0
|
|
for analytic_line_tuple in line['analytic_line_ids']:
|
|
analytic_line = analytic_line_tuple[2]
|
|
origin_analytic_line = \
|
|
origin_line['analytic_line_ids'][i][2]
|
|
analytic_line['amount'] += round(
|
|
origin_analytic_line['amount'] - analytic_line[
|
|
'amount'] * line_qty,
|
|
dp.precision_get('Account'))
|
|
analytic_line['unit_amount'] += round(
|
|
origin_analytic_line['unit_amount'] -
|
|
analytic_line[
|
|
'unit_amount'] * line_qty,
|
|
dp.precision_get('Account'))
|
|
i += 1
|
|
move_lines.extend(new_lines)
|
|
return move_lines
|
|
|
|
@api.multi
|
|
def action_move_create(self):
|
|
res = super(AccountInvoice, self).action_move_create()
|
|
for inv in self:
|
|
move = inv.move_id
|
|
assets = [aml.asset_id for aml in
|
|
filter(lambda x: x.asset_id, move.line_ids)]
|
|
for asset in assets:
|
|
asset.code = inv.move_name
|
|
asset_line_name = asset._get_depreciation_entry_name(0)
|
|
asset.depreciation_line_ids[0].with_context(
|
|
{'allow_asset_line_update': True}
|
|
).name = asset_line_name
|
|
return res
|
|
|
|
@api.multi
|
|
def action_cancel(self):
|
|
assets = self.env['account.asset']
|
|
for inv in self:
|
|
move = inv.move_id
|
|
assets = move.line_ids.mapped('asset_id')
|
|
super(AccountInvoice, self).action_cancel()
|
|
if assets:
|
|
assets.unlink()
|
|
return True
|
|
|
|
@api.model
|
|
def line_get_convert(self, line, part):
|
|
res = super(AccountInvoice, self).line_get_convert(line, part)
|
|
if line.get('asset_profile_id'):
|
|
# skip empty debit/credit
|
|
if res.get('debit') or res.get('credit'):
|
|
res['asset_profile_id'] = line['asset_profile_id']
|
|
return res
|
|
|
|
@api.model
|
|
def inv_line_characteristic_hashcode(self, invoice_line):
|
|
res = super(AccountInvoice, self).inv_line_characteristic_hashcode(
|
|
invoice_line)
|
|
res += '-%s' % invoice_line.get('asset_profile_id', 'False')
|
|
return res
|
|
|
|
@api.model
|
|
def invoice_line_move_line_get(self):
|
|
res = super(AccountInvoice, self).invoice_line_move_line_get()
|
|
invoice_line_obj = self.env['account.invoice.line']
|
|
for vals in res:
|
|
invline = invoice_line_obj.browse(vals['invl_id'])
|
|
if invline.asset_profile_id:
|
|
vals['asset_profile_id'] = invline.asset_profile_id.id
|
|
return res
|
|
|
|
|
|
class AccountInvoiceLine(models.Model):
|
|
_inherit = 'account.invoice.line'
|
|
|
|
asset_profile_id = fields.Many2one(
|
|
comodel_name='account.asset.profile',
|
|
string='Asset Profile')
|
|
asset_id = fields.Many2one(
|
|
comodel_name='account.asset',
|
|
string='Asset',
|
|
domain=[('type', '=', 'normal'),
|
|
('state', 'in', ['open', 'close'])],
|
|
help="Complete this field when selling an asset "
|
|
"in order to facilitate the creation of the "
|
|
"asset removal accounting entries via the "
|
|
"asset 'Removal' button")
|
|
|
|
@api.onchange('account_id')
|
|
def _onchange_account_id(self):
|
|
self.asset_profile_id = self.account_id.asset_profile_id.id
|
|
return super(AccountInvoiceLine, self)._onchange_account_id()
|