2011-07-01 13:31:45 +00:00
# -*- encoding: utf-8 -*-
2011-03-30 13:25:27 +00:00
##############################################################################
2011-05-12 13:44:20 +00:00
#
2011-03-30 13:25:27 +00:00
# OpenERP, Open Source Management Solution
2011-06-06 10:06:29 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2011-03-30 13:25:27 +00:00
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
2011-05-12 13:44:20 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2011-03-30 13:25:27 +00:00
#
##############################################################################
import time
2011-05-09 14:29:15 +00:00
from datetime import datetime
2011-06-03 09:46:52 +00:00
from dateutil . relativedelta import relativedelta
from osv import osv , fields
2011-05-27 05:21:42 +00:00
import decimal_precision as dp
2011-05-09 14:29:15 +00:00
2011-03-30 13:25:27 +00:00
class account_asset_category ( osv . osv ) :
_name = ' account.asset.category '
_description = ' Asset category '
2011-05-12 12:40:38 +00:00
2011-03-30 13:25:27 +00:00
_columns = {
2011-05-13 09:19:17 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True , select = 1 ) ,
2011-03-30 13:25:27 +00:00
' note ' : fields . text ( ' Note ' ) ,
2011-05-13 10:09:54 +00:00
' account_analytic_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic account ' ) ,
2011-03-30 20:21:06 +00:00
' account_asset_id ' : fields . many2one ( ' account.account ' , ' Asset Account ' , required = True ) ,
' account_depreciation_id ' : fields . many2one ( ' account.account ' , ' Depreciation Account ' , required = True ) ,
2011-05-12 11:23:50 +00:00
' account_expense_depreciation_id ' : fields . many2one ( ' account.account ' , ' Depr. Expense Account ' , required = True ) ,
2011-03-30 13:25:27 +00:00
' journal_id ' : fields . many2one ( ' account.journal ' , ' Journal ' , required = True ) ,
2011-05-13 10:09:54 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = True ) ,
2011-05-17 10:37:53 +00:00
' method ' : fields . selection ( [ ( ' linear ' , ' Linear ' ) , ( ' progressif ' , ' Progressive ' ) ] , ' Computation method ' , required = True ) ,
2011-07-09 20:32:24 +00:00
' method_number ' : fields . integer ( ' Number of Depreciations ' ) ,
2011-06-22 16:07:15 +00:00
' method_period ' : fields . integer ( ' Period Length ' , help = " State here the time between 2 depreciations, in months " ) ,
2011-05-17 12:44:52 +00:00
' method_progress_factor ' : fields . float ( ' Progressif Factor ' ) ,
2011-07-09 20:32:24 +00:00
' method_time ' : fields . selection ( [ ( ' number ' , ' Number of Depreciations ' ) , ( ' end ' , ' Ending Date ' ) ] , ' Time Method ' , required = True ,
help = " Choose the method to use to compute the dates and number of depreciation lines. \n " \
" Number of Depreciations: Fix the number of depreciation lines and the time between 2 depreciations. \n " \
" Ending Date: Choose the time between 2 depreciations and the date the depreciations won ' t go beyond. " ) ,
2011-06-06 05:57:53 +00:00
' method_end ' : fields . date ( ' Ending date ' ) ,
2011-05-17 12:44:52 +00:00
' prorata ' : fields . boolean ( ' Prorata Temporis ' , help = ' Indicates that the accounting entries for this asset have to be done from the purchase date instead of the first January ' ) ,
2011-05-24 15:52:19 +00:00
' open_asset ' : fields . boolean ( ' Skip Draft State ' , help = " Check this if you want to automatically confirm the assets of this category when created by invoice. " ) ,
2011-03-30 13:25:27 +00:00
}
2011-05-12 12:40:38 +00:00
_defaults = {
' company_id ' : lambda self , cr , uid , context : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' account.asset.category ' , context = context ) ,
2011-05-17 13:18:03 +00:00
' method ' : ' linear ' ,
2011-07-09 20:32:24 +00:00
' method_number ' : 5 ,
' method_time ' : ' number ' ,
2011-05-17 13:18:03 +00:00
' method_period ' : 12 ,
' method_progress_factor ' : 0.3 ,
2011-03-30 13:25:27 +00:00
}
2011-05-12 12:40:38 +00:00
2011-05-17 13:15:18 +00:00
def onchange_account_asset ( self , cr , uid , ids , account_asset_id , context = None ) :
res = { ' value ' : { } }
2011-05-19 05:00:27 +00:00
if account_asset_id :
2011-05-17 13:15:18 +00:00
res [ ' value ' ] = { ' account_depreciation_id ' : account_asset_id }
return res
2011-05-17 06:41:17 +00:00
2011-03-30 13:25:27 +00:00
account_asset_category ( )
class account_asset_asset ( osv . osv ) :
_name = ' account.asset.asset '
_description = ' Asset '
def _get_period ( self , cr , uid , context = { } ) :
periods = self . pool . get ( ' account.period ' ) . find ( cr , uid )
if periods :
return periods [ 0 ]
else :
return False
2011-05-10 12:11:09 +00:00
2011-05-09 14:29:15 +00:00
def _get_last_depreciation_date ( self , cr , uid , ids , context = None ) :
"""
@param id : ids of a account . asset . asset objects
@return : Returns a dictionary of the effective dates of the last depreciation entry made for given asset ids . If there isn ' t any, return the purchase date of this asset
"""
cr . execute ( """
SELECT a . id as id , COALESCE ( MAX ( l . date ) , a . purchase_date ) AS date
FROM account_asset_asset a
LEFT JOIN account_move_line l ON ( l . asset_id = a . id )
2011-05-12 10:12:08 +00:00
WHERE a . id IN % s
2011-05-09 14:29:15 +00:00
GROUP BY a . id , a . purchase_date """ , (tuple(ids),))
return dict ( cr . fetchall ( ) )
2011-07-01 12:55:05 +00:00
def _compute_board_amount ( self , cr , uid , asset , i , residual_amount , amount_to_depr , undone_dotation_number , posted_depreciation_line_ids , total_days , depreciation_date , context = None ) :
2011-07-01 12:21:57 +00:00
#by default amount = 0
amount = 0
if i == undone_dotation_number :
amount = residual_amount
else :
if asset . method == ' linear ' :
amount = amount_to_depr / ( undone_dotation_number - len ( posted_depreciation_line_ids ) )
if asset . prorata :
2011-07-09 20:32:24 +00:00
amount = amount_to_depr / asset . method_number
2011-07-01 12:21:57 +00:00
days = total_days - float ( depreciation_date . strftime ( ' % j ' ) )
if i == 1 :
2011-07-09 20:32:24 +00:00
amount = ( amount_to_depr / asset . method_number ) / total_days * days
2011-07-01 12:21:57 +00:00
elif i == undone_dotation_number :
2011-07-09 20:32:24 +00:00
amount = ( amount_to_depr / asset . method_number ) / total_days * ( total_days - days )
2011-07-01 12:21:57 +00:00
elif asset . method == ' degressive ' :
amount = residual_amount * asset . method_progress_factor
return amount
def _compute_board_undone_dotation_nb ( self , cr , uid , asset , depreciation_date , total_days , context = None ) :
2011-07-09 20:32:24 +00:00
undone_dotation_number = asset . method_number
2011-07-01 12:21:57 +00:00
if asset . method_time == ' end ' :
end_date = datetime . strptime ( asset . method_end , ' % Y- % m- %d ' )
undone_dotation_number = ( end_date - depreciation_date ) . days / total_days
if asset . prorata or asset . method_time == ' end ' :
undone_dotation_number + = 1
return undone_dotation_number
2011-05-02 09:51:34 +00:00
def compute_depreciation_board ( self , cr , uid , ids , context = None ) :
2011-05-09 14:29:15 +00:00
depreciation_lin_obj = self . pool . get ( ' account.asset.depreciation.line ' )
2011-03-30 20:21:06 +00:00
for asset in self . browse ( cr , uid , ids , context = context ) :
2011-06-13 07:08:52 +00:00
if asset . value_residual == 0.0 :
2011-06-13 06:44:36 +00:00
continue
2011-06-23 14:38:32 +00:00
posted_depreciation_line_ids = depreciation_lin_obj . search ( cr , uid , [ ( ' asset_id ' , ' = ' , asset . id ) , ( ' move_check ' , ' = ' , True ) ] )
2011-06-08 13:35:53 +00:00
old_depreciation_line_ids = depreciation_lin_obj . search ( cr , uid , [ ( ' asset_id ' , ' = ' , asset . id ) , ( ' move_id ' , ' = ' , False ) ] )
if old_depreciation_line_ids :
depreciation_lin_obj . unlink ( cr , uid , old_depreciation_line_ids , context = context )
2011-06-09 10:25:52 +00:00
amount_to_depr = residual_amount = asset . value_residual
2011-06-23 14:38:32 +00:00
2011-05-09 14:29:15 +00:00
depreciation_date = datetime . strptime ( self . _get_last_depreciation_date ( cr , uid , [ asset . id ] , context ) [ asset . id ] , ' % Y- % m- %d ' )
day = depreciation_date . day
month = depreciation_date . month
year = depreciation_date . year
2011-05-23 12:21:58 +00:00
total_days = ( year % 4 ) and 365 or 366
2011-07-01 12:21:57 +00:00
undone_dotation_number = self . _compute_board_undone_dotation_nb ( cr , uid , asset , depreciation_date , total_days , context = context )
2011-06-23 14:38:32 +00:00
for x in range ( len ( posted_depreciation_line_ids ) , undone_dotation_number ) :
i = x + 1
2011-07-01 12:55:05 +00:00
amount = self . _compute_board_amount ( cr , uid , asset , i , residual_amount , amount_to_depr , undone_dotation_number , posted_depreciation_line_ids , total_days , depreciation_date , context = context )
2011-05-09 14:29:15 +00:00
residual_amount - = amount
vals = {
2011-05-12 13:44:20 +00:00
' amount ' : amount ,
' asset_id ' : asset . id ,
2011-05-24 13:04:45 +00:00
' sequence ' : i ,
2011-06-07 05:38:22 +00:00
' name ' : str ( asset . id ) + ' / ' + str ( i ) ,
2011-05-09 14:29:15 +00:00
' remaining_value ' : residual_amount ,
2011-06-23 14:38:32 +00:00
' depreciated_value ' : ( asset . purchase_value - asset . salvage_value ) - ( residual_amount + amount ) ,
2011-05-09 14:29:15 +00:00
' depreciation_date ' : depreciation_date . strftime ( ' % Y- % m- %d ' ) ,
2011-05-12 13:44:20 +00:00
}
2011-06-08 13:35:53 +00:00
depreciation_lin_obj . create ( cr , uid , vals , context = context )
2011-06-03 09:46:52 +00:00
# Considering Depr. Period as months
depreciation_date = ( datetime ( year , month , day ) + relativedelta ( months = + asset . method_period ) )
day = depreciation_date . day
month = depreciation_date . month
year = depreciation_date . year
2011-05-09 14:29:15 +00:00
return True
2011-05-02 09:51:34 +00:00
2011-03-30 13:25:27 +00:00
def validate ( self , cr , uid , ids , context = { } ) :
return self . write ( cr , uid , ids , {
2011-05-24 13:14:14 +00:00
' state ' : ' open '
2011-03-30 13:25:27 +00:00
} , context )
2011-06-28 10:13:40 +00:00
def set_to_close ( self , cr , uid , ids , context = None ) :
return self . write ( cr , uid , ids , { ' state ' : ' close ' } , context = context )
2011-06-07 05:38:22 +00:00
def _amount_residual ( self , cr , uid , ids , name , args , context = None ) :
2011-05-12 13:44:20 +00:00
cr . execute ( """ SELECT
2011-06-06 10:15:00 +00:00
l . asset_id as id , round ( SUM ( abs ( l . debit - l . credit ) ) ) AS amount
2011-03-30 20:21:06 +00:00
FROM
2011-05-09 14:29:15 +00:00
account_move_line l
2011-03-30 20:21:06 +00:00
WHERE
2011-05-09 14:29:15 +00:00
l . asset_id IN % s GROUP BY l . asset_id """ , (tuple(ids),))
2011-03-30 20:21:06 +00:00
res = dict ( cr . fetchall ( ) )
2011-05-09 14:29:15 +00:00
for asset in self . browse ( cr , uid , ids , context ) :
2011-05-27 13:49:30 +00:00
res [ asset . id ] = asset . purchase_value - res . get ( asset . id , 0.0 ) - asset . salvage_value
2011-03-30 20:21:06 +00:00
for id in ids :
res . setdefault ( id , 0.0 )
return res
2011-03-30 13:25:27 +00:00
_columns = {
2011-05-09 10:27:17 +00:00
' period_id ' : fields . many2one ( ' account.period ' , ' First Period ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' account_move_line_ids ' : fields . one2many ( ' account.move.line ' , ' asset_id ' , ' Entries ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2011-06-28 13:31:19 +00:00
' name ' : fields . char ( ' Asset ' , size = 64 , required = True , select = 1 , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
' code ' : fields . char ( ' Reference ' , size = 16 , select = 1 , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-07-01 13:31:45 +00:00
' purchase_value ' : fields . float ( ' Gross value ' , required = True , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
' currency_id ' : fields . many2one ( ' res.currency ' , ' Currency ' , required = True , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-06-28 13:31:19 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = True , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-05-09 10:27:17 +00:00
' note ' : fields . text ( ' Note ' ) ,
2011-06-28 13:31:19 +00:00
' category_id ' : fields . many2one ( ' account.asset.category ' , ' Asset category ' , required = True , change_default = True , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-03-30 13:25:27 +00:00
' localisation ' : fields . char ( ' Localisation ' , size = 32 , select = 2 ) ,
2011-07-06 09:09:52 +00:00
' parent_id ' : fields . many2one ( ' account.asset.asset ' , ' Parent Asset ' , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-03-30 20:21:06 +00:00
' child_ids ' : fields . one2many ( ' account.asset.asset ' , ' parent_id ' , ' Children Assets ' ) ,
2011-06-28 13:31:19 +00:00
' purchase_date ' : fields . date ( ' Purchase Date ' , required = True , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-07-06 05:55:18 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft ' ) , ( ' open ' , ' Running ' ) , ( ' close ' , ' Close ' ) ] , ' State ' , required = True ,
2011-07-06 06:03:39 +00:00
help = " When an asset is created, the state is ' Draft ' . \n " \
2011-07-09 19:57:40 +00:00
" If the asset is confirmed, the state goes in ' Running ' and the depreciation lines can be posted in the accounting. \n " \
" You can manually close an asset when the depreciation is over. If the last line of depreciation is posted, the asset automatically goes in that state. " ) ,
2011-03-30 13:25:27 +00:00
' active ' : fields . boolean ( ' Active ' , select = 2 ) ,
2011-06-28 13:31:19 +00:00
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-07-01 12:21:57 +00:00
' method ' : fields . selection ( [ ( ' linear ' , ' Linear ' ) , ( ' degressive ' , ' Degressive ' ) ] , ' Computation Method ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Linear: Calculated on basis of Gross Value/During (interval) \
\nDegressive : Calculated on basis of Gross Value * Degressive Factor " ),
2011-07-09 20:32:24 +00:00
' method_number ' : fields . integer ( ' Number of Depreciations ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Calculates Depreciation within specified interval " ) ,
2011-06-22 16:07:15 +00:00
' method_period ' : fields . integer ( ' Period Length ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " State here the time during 2 depreciations, in months " ) ,
2011-06-27 10:25:54 +00:00
' method_end ' : fields . date ( ' Ending Date ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2011-03-30 20:21:06 +00:00
' method_progress_factor ' : fields . float ( ' Progressif Factor ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2011-05-27 09:37:42 +00:00
' value_residual ' : fields . function ( _amount_residual , method = True , digits_compute = dp . get_precision ( ' Account ' ) , string = ' Residual Value ' ) ,
2011-07-09 20:32:24 +00:00
' method_time ' : fields . selection ( [ ( ' number ' , ' Number of Depreciations ' ) , ( ' end ' , ' Ending Date ' ) ] , ' Time Method ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ,
help = " Choose the method to use to compute the dates and number of depreciation lines. \n " \
" Number of Depreciations: Fix the number of depreciation lines and the time between 2 depreciations. \n " \
" Ending Date: Choose the time between 2 depreciations and the date the depreciations won ' t go beyond. " ) ,
2011-07-01 13:31:45 +00:00
' prorata ' : fields . boolean ( ' Prorata Temporis ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = ' Indicates that the accounting entries for this asset have to be done from the purchase date instead of the first January ' ) ,
2011-05-10 12:11:09 +00:00
' history_ids ' : fields . one2many ( ' account.asset.history ' , ' asset_id ' , ' History ' , readonly = True ) ,
2011-07-09 19:57:40 +00:00
' depreciation_line_ids ' : fields . one2many ( ' account.asset.depreciation.line ' , ' asset_id ' , ' Depreciation Lines ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] , ' open ' : [ ( ' readonly ' , False ) ] } ) ,
2011-06-28 13:31:19 +00:00
' salvage_value ' : fields . float ( ' Salvage Value ' , digits_compute = dp . get_precision ( ' Account ' ) , help = " It is the amount you plan to have that you cannot depreciate. " , readonly = False , states = { ' close ' : [ ( ' readonly ' , True ) ] } ) ,
2011-03-30 13:25:27 +00:00
}
_defaults = {
' code ' : lambda obj , cr , uid , context : obj . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' account.asset.code ' ) ,
2011-03-31 23:43:25 +00:00
' purchase_date ' : lambda obj , cr , uid , context : time . strftime ( ' % Y- % m- %d ' ) ,
2011-03-30 13:25:27 +00:00
' active ' : lambda obj , cr , uid , context : True ,
' state ' : lambda obj , cr , uid , context : ' draft ' ,
' period_id ' : _get_period ,
2011-05-11 06:47:44 +00:00
' method ' : lambda obj , cr , uid , context : ' linear ' ,
2011-07-09 20:32:24 +00:00
' method_number ' : lambda obj , cr , uid , context : 5 ,
' method_time ' : lambda obj , cr , uid , context : ' number ' ,
2011-05-11 06:47:44 +00:00
' method_period ' : lambda obj , cr , uid , context : 12 ,
' method_progress_factor ' : lambda obj , cr , uid , context : 0.3 ,
' currency_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , c ) . company_id . currency_id . id ,
2011-05-12 12:40:38 +00:00
' company_id ' : lambda self , cr , uid , context : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' account.asset.asset ' , context = context ) ,
2011-03-30 13:25:27 +00:00
}
2011-06-27 06:42:52 +00:00
def _check_recursion ( self , cr , uid , ids , context = None , parent = None ) :
return super ( account_asset_asset , self ) . _check_recursion ( cr , uid , ids , context = context , parent = parent )
2011-05-02 09:51:34 +00:00
2011-05-23 06:21:52 +00:00
def _check_prorata ( self , cr , uid , ids , context = None ) :
2011-05-23 12:53:22 +00:00
for asset in self . browse ( cr , uid , ids , context = context ) :
2011-07-09 20:32:24 +00:00
if asset . prorata and ( asset . method != ' linear ' or asset . method_time != ' number ' ) :
2011-05-23 06:21:52 +00:00
return False
return True
_constraints = [
2011-06-27 06:42:52 +00:00
( _check_recursion , ' Error ! You can not create recursive assets. ' , [ ' parent_id ' ] ) ,
2011-07-09 20:32:24 +00:00
( _check_prorata , ' \n Prorata temporis can be applied only for computation method linear and time method number. ' , [ ' prorata ' ] ) ,
2011-05-23 06:21:52 +00:00
]
2011-05-02 09:51:34 +00:00
2011-05-17 10:37:53 +00:00
def onchange_category_id ( self , cr , uid , ids , category_id , context = None ) :
res = { ' value ' : { } }
2011-05-17 13:18:03 +00:00
asset_categ_obj = self . pool . get ( ' account.asset.category ' )
2011-05-17 10:37:53 +00:00
if category_id :
2011-05-17 13:18:03 +00:00
category_obj = asset_categ_obj . browse ( cr , uid , category_id , context = context )
res [ ' value ' ] = {
2011-06-07 05:38:22 +00:00
' method ' : category_obj . method ,
2011-07-09 20:32:24 +00:00
' method_number ' : category_obj . method_number ,
2011-05-17 12:44:52 +00:00
' method_time ' : category_obj . method_time ,
' method_period ' : category_obj . method_period ,
' method_progress_factor ' : category_obj . method_progress_factor ,
2011-06-06 05:57:53 +00:00
' method_end ' : category_obj . method_end ,
2011-05-17 12:44:52 +00:00
' prorata ' : category_obj . prorata ,
2011-05-17 13:18:03 +00:00
}
2011-05-17 10:37:53 +00:00
return res
2011-06-07 05:38:22 +00:00
2011-07-09 20:32:24 +00:00
def onchange_method_time ( self , cr , uid , ids , method = ' linear ' , method_time = ' number ' , context = None ) :
2011-06-09 13:25:59 +00:00
res = { ' value ' : { } }
2011-07-09 20:32:24 +00:00
if method != ' linear ' or method_time != ' number ' :
2011-06-09 13:25:59 +00:00
res [ ' value ' ] = { ' prorata ' : False }
return res
2011-06-07 05:38:22 +00:00
2011-05-26 11:07:02 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
if default is None :
default = { }
if context is None :
context = { }
2011-05-27 13:51:44 +00:00
default . update ( { ' depreciation_line_ids ' : [ ] , ' state ' : ' draft ' } )
2011-05-26 11:07:02 +00:00
return super ( account_asset_asset , self ) . copy ( cr , uid , id , default , context = context )
2011-05-02 09:51:34 +00:00
2011-03-30 13:25:27 +00:00
def _compute_period ( self , cr , uid , property , context = { } ) :
2011-07-09 20:32:24 +00:00
if ( len ( property . entry_asset_ids or [ ] ) / 2 ) > = property . method_number :
2011-03-30 13:25:27 +00:00
return False
if len ( property . entry_asset_ids ) :
cp = property . entry_asset_ids [ - 1 ] . period_id
cpid = self . pool . get ( ' account.period ' ) . next ( cr , uid , cp , property . method_period , context )
current_period = self . pool . get ( ' account.period ' ) . browse ( cr , uid , cpid , context )
else :
current_period = property . asset_id . period_id
return current_period
def _compute_move ( self , cr , uid , property , period , context = { } ) :
2011-03-31 23:43:25 +00:00
#FIXME: fucntion not working OK
2011-03-30 13:25:27 +00:00
result = [ ]
total = 0.0
for move in property . asset_id . entry_ids :
total + = move . debit - move . credit
for move in property . entry_asset_ids :
if move . account_id == property . account_asset_ids :
total + = move . debit
total + = - move . credit
2011-07-09 20:32:24 +00:00
periods = ( len ( property . entry_asset_ids ) / 2 ) - property . method_number
2011-03-30 20:21:06 +00:00
2011-03-30 13:25:27 +00:00
if periods == 1 :
amount = total
else :
if property . method == ' linear ' :
amount = total / periods
else :
amount = total * property . method_progress_factor
move_id = self . pool . get ( ' account.move ' ) . create ( cr , uid , {
' journal_id ' : property . journal_id . id ,
' period_id ' : period . id ,
' name ' : property . name or property . asset_id . name ,
' ref ' : property . asset_id . code
} )
result = [ move_id ]
id = self . pool . get ( ' account.move.line ' ) . create ( cr , uid , {
' name ' : property . name or property . asset_id . name ,
' move_id ' : move_id ,
' account_id ' : property . account_asset_id . id ,
' debit ' : amount > 0 and amount or 0.0 ,
' credit ' : amount < 0 and - amount or 0.0 ,
' ref ' : property . asset_id . code ,
' period_id ' : period . id ,
' journal_id ' : property . journal_id . id ,
' partner_id ' : property . asset_id . partner_id . id ,
' date ' : time . strftime ( ' % Y- % m- %d ' ) ,
} )
id2 = self . pool . get ( ' account.move.line ' ) . create ( cr , uid , {
' name ' : property . name or property . asset_id . name ,
' move_id ' : move_id ,
' account_id ' : property . account_actif_id . id ,
' credit ' : amount > 0 and amount or 0.0 ,
' debit ' : amount < 0 and - amount or 0.0 ,
' ref ' : property . asset_id . code ,
' period_id ' : period . id ,
' journal_id ' : property . journal_id . id ,
' partner_id ' : property . asset_id . partner_id . id ,
' date ' : time . strftime ( ' % Y- % m- %d ' ) ,
} )
2011-05-11 06:47:44 +00:00
#
2011-03-31 23:43:25 +00:00
self . pool . get ( ' account.asset.asset ' ) . write ( cr , uid , [ property . id ] , {
2011-03-30 13:25:27 +00:00
' entry_asset_ids ' : [ ( 4 , id2 , False ) , ( 4 , id , False ) ]
} )
2011-07-09 20:32:24 +00:00
if property . method_number - ( len ( property . entry_asset_ids ) / 2 ) < = 1 :
2011-03-30 20:21:06 +00:00
#self.pool.get('account.asset.property')._close(cr, uid, property, context)
2011-03-30 13:25:27 +00:00
return result
return result
def _compute_entries ( self , cr , uid , asset , period_id , context = { } ) :
2011-05-12 13:44:20 +00:00
#FIXME: function not working CHECK all res
2011-03-30 13:25:27 +00:00
result = [ ]
2011-03-31 23:43:25 +00:00
date_start = self . pool . get ( ' account.period ' ) . browse ( cr , uid , period_id , context ) . date_start
for property in asset . property_ids :
if property . state == ' open ' :
period = self . _compute_period ( cr , uid , property , context )
if period and ( period . date_start < = date_start ) :
result + = self . _compute_move ( cr , uid , property , period , context )
2011-03-30 13:25:27 +00:00
return result
2011-06-28 06:19:08 +00:00
def create ( self , cr , uid , vals , context = None ) :
2011-06-28 06:50:50 +00:00
asset_id = super ( account_asset_asset , self ) . create ( cr , uid , vals , context = context )
self . compute_depreciation_board ( cr , uid , [ asset_id ] , context = context )
return asset_id
2011-06-28 06:19:08 +00:00
2011-03-30 13:25:27 +00:00
account_asset_asset ( )
2011-03-30 20:21:06 +00:00
class account_asset_depreciation_line ( osv . osv ) :
_name = ' account.asset.depreciation.line '
_description = ' Asset depreciation line '
2011-05-12 08:48:45 +00:00
2011-05-12 11:37:46 +00:00
def _get_move_check ( self , cr , uid , ids , name , args , context = None ) :
2011-05-12 08:48:45 +00:00
res = { }
for line in self . browse ( cr , uid , ids , context = context ) :
2011-05-12 17:10:05 +00:00
res [ line . id ] = bool ( line . move_id )
2011-05-12 08:48:45 +00:00
return res
2011-03-30 13:25:27 +00:00
_columns = {
2011-03-30 20:21:06 +00:00
' name ' : fields . char ( ' Depreciation Name ' , size = 64 , required = True , select = 1 ) ,
' sequence ' : fields . integer ( ' Sequence of the depreciation ' , required = True ) ,
2011-03-30 13:25:27 +00:00
' asset_id ' : fields . many2one ( ' account.asset.asset ' , ' Asset ' , required = True ) ,
2011-05-09 14:29:15 +00:00
' amount ' : fields . float ( ' Depreciation Amount ' , required = True ) ,
2011-05-11 06:47:44 +00:00
' remaining_value ' : fields . float ( ' Amount to Depreciate ' , required = True ) ,
' depreciated_value ' : fields . float ( ' Amount Already Depreciated ' , required = True ) ,
' depreciation_date ' : fields . char ( ' Depreciation Date ' , size = 64 , select = 1 ) ,
2011-05-12 09:52:37 +00:00
' move_id ' : fields . many2one ( ' account.move ' , ' Depreciation Entry ' ) ,
2011-05-16 13:12:32 +00:00
' move_check ' : fields . function ( _get_move_check , method = True , type = ' boolean ' , string = ' Posted ' , store = True )
2011-03-30 13:25:27 +00:00
}
2011-05-12 09:52:37 +00:00
2011-06-28 10:13:40 +00:00
def create_move ( self , cr , uid , ids , context = None ) :
2011-06-29 06:40:56 +00:00
can_close = False
2011-05-12 13:44:20 +00:00
if context is None :
context = { }
2011-05-12 09:52:37 +00:00
asset_obj = self . pool . get ( ' account.asset.asset ' )
period_obj = self . pool . get ( ' account.period ' )
move_obj = self . pool . get ( ' account.move ' )
move_line_obj = self . pool . get ( ' account.move.line ' )
2011-05-12 13:44:20 +00:00
currency_obj = self . pool . get ( ' res.currency ' )
2011-05-12 09:52:37 +00:00
for line in self . browse ( cr , uid , ids , context = context ) :
2011-07-01 13:31:45 +00:00
if currency_obj . is_zero ( cr , uid , line . asset_id . currency_id , line . remaining_value ) :
2011-06-29 06:40:56 +00:00
can_close = True
2011-05-20 08:48:31 +00:00
depreciation_date = line . asset_id . prorata and line . asset_id . purchase_date or time . strftime ( ' % Y- % m- %d ' )
2011-05-12 09:52:37 +00:00
period_ids = period_obj . find ( cr , uid , depreciation_date , context = context )
2011-05-12 13:44:20 +00:00
company_currency = line . asset_id . company_id . currency_id . id
current_currency = line . asset_id . currency_id . id
context . update ( { ' date ' : depreciation_date } )
amount = currency_obj . compute ( cr , uid , current_currency , company_currency , line . amount , context = context )
sign = line . asset_id . category_id . journal_id . type = ' purchase ' and 1 or - 1
2011-05-12 09:52:37 +00:00
move_vals = {
' name ' : line . name ,
' date ' : depreciation_date ,
2011-05-12 11:23:50 +00:00
' ref ' : line . name ,
2011-05-12 09:52:37 +00:00
' period_id ' : period_ids and period_ids [ 0 ] or False ,
' journal_id ' : line . asset_id . category_id . journal_id . id ,
}
move_id = move_obj . create ( cr , uid , move_vals , context = context )
2011-06-28 12:43:08 +00:00
asset_name = line . asset_id . name
reference = line . name
journal_id = line . asset_id . category_id . journal_id . id
partner_id = line . asset_id . partner_id . id
2011-05-12 09:52:37 +00:00
move_line_obj . create ( cr , uid , {
2011-06-28 12:43:08 +00:00
' name ' : asset_name ,
' ref ' : reference ,
2011-05-12 09:52:37 +00:00
' move_id ' : move_id ,
2011-05-12 11:23:50 +00:00
' account_id ' : line . asset_id . category_id . account_depreciation_id . id ,
2011-05-12 09:52:37 +00:00
' debit ' : 0.0 ,
2011-05-12 13:44:20 +00:00
' credit ' : amount ,
2011-05-12 09:52:37 +00:00
' period_id ' : period_ids and period_ids [ 0 ] or False ,
2011-06-28 12:43:08 +00:00
' journal_id ' : journal_id ,
' partner_id ' : partner_id ,
2011-05-12 13:44:20 +00:00
' currency_id ' : company_currency < > current_currency and current_currency or False ,
' amount_currency ' : company_currency < > current_currency and - sign * line . amount or 0.0 ,
2011-05-12 09:52:37 +00:00
' date ' : depreciation_date ,
} )
move_line_obj . create ( cr , uid , {
2011-06-28 12:43:08 +00:00
' name ' : asset_name ,
' ref ' : reference ,
2011-05-12 09:52:37 +00:00
' move_id ' : move_id ,
2011-05-12 11:23:50 +00:00
' account_id ' : line . asset_id . category_id . account_expense_depreciation_id . id ,
2011-05-12 09:52:37 +00:00
' credit ' : 0.0 ,
2011-05-12 13:44:20 +00:00
' debit ' : amount ,
2011-05-12 09:52:37 +00:00
' period_id ' : period_ids and period_ids [ 0 ] or False ,
2011-06-28 12:43:08 +00:00
' journal_id ' : journal_id ,
' partner_id ' : partner_id ,
2011-05-12 13:44:20 +00:00
' currency_id ' : company_currency < > current_currency and current_currency or False ,
' amount_currency ' : company_currency < > current_currency and sign * line . amount or 0.0 ,
2011-05-12 09:52:37 +00:00
' analytic_account_id ' : line . asset_id . category_id . account_analytic_id . id ,
' date ' : depreciation_date ,
2011-05-24 06:25:30 +00:00
' asset_id ' : line . asset_id . id
2011-05-12 09:52:37 +00:00
} )
self . write ( cr , uid , line . id , { ' move_id ' : move_id } , context = context )
2011-06-29 06:40:56 +00:00
if can_close :
asset_obj . write ( cr , uid , [ line . asset_id . id ] , { ' state ' : ' close ' } , context = context )
2011-05-12 09:52:37 +00:00
return True
2011-03-30 20:21:06 +00:00
account_asset_depreciation_line ( )
2011-03-30 13:25:27 +00:00
class account_move_line ( osv . osv ) :
_inherit = ' account.move.line '
_columns = {
' asset_id ' : fields . many2one ( ' account.asset.asset ' , ' Asset ' ) ,
2011-05-12 13:44:20 +00:00
' entry_ids ' : fields . one2many ( ' account.move.line ' , ' asset_id ' , ' Entries ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2011-03-30 13:25:27 +00:00
}
account_move_line ( )
2011-05-10 18:59:04 +00:00
class account_asset_history ( osv . osv ) :
_name = ' account.asset.history '
2011-03-30 13:25:27 +00:00
_description = ' Asset history '
_columns = {
' name ' : fields . char ( ' History name ' , size = 64 , select = 1 ) ,
' user_id ' : fields . many2one ( ' res.users ' , ' User ' , required = True ) ,
' date ' : fields . date ( ' Date ' , required = True ) ,
2011-03-30 20:21:06 +00:00
' asset_id ' : fields . many2one ( ' account.asset.asset ' , ' Asset ' , required = True ) ,
2011-07-09 20:32:24 +00:00
' method_time ' : fields . selection ( [ ( ' number ' , ' Number of Depreciations ' ) , ( ' end ' , ' Ending Date ' ) ] , ' Time Method ' , required = True ,
help = " Choose the method to use to compute the dates and number of depreciation lines. \n " \
" Number of Depreciations: Fix the number of depreciation lines and the time between 2 depreciations. \n " \
" Ending Date: Choose the time between 2 depreciations and the date the depreciations won ' t go beyond. " ) ,
' method_number ' : fields . integer ( ' Number of Depreciations ' ) ,
2011-07-01 08:42:33 +00:00
' method_period ' : fields . integer ( ' Period Length ' , help = " Time in month between two depreciations " ) ,
2011-03-30 13:25:27 +00:00
' method_end ' : fields . date ( ' Ending date ' ) ,
' note ' : fields . text ( ' Note ' ) ,
}
2011-07-01 08:09:31 +00:00
_order = ' date desc '
2011-03-30 13:25:27 +00:00
_defaults = {
' date ' : lambda * args : time . strftime ( ' % Y- % m- %d ' ) ,
2011-07-01 08:09:31 +00:00
' user_id ' : lambda self , cr , uid , ctx : uid
2011-03-30 13:25:27 +00:00
}
2011-06-27 08:51:42 +00:00
2011-05-10 18:59:04 +00:00
account_asset_history ( )
2011-03-30 13:25:27 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: