2
0
account-financial-tools/account_asset_management/models/account_invoice.py

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()