2010-02-05 15:09:27 +00:00
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# 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
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import time
2012-11-29 14:24:28 +00:00
from datetime import datetime
2010-02-05 15:09:27 +00:00
2012-12-06 14:56:32 +00:00
from openerp . osv import fields , osv
from openerp import tools
from openerp . tools . translate import _
2012-12-17 15:23:03 +00:00
import openerp . addons . decimal_precision as dp
2010-02-05 15:09:27 +00:00
class account_analytic_account ( osv . osv ) :
_name = ' account.analytic.account '
2012-06-26 15:12:40 +00:00
_inherit = [ ' mail.thread ' ]
2010-05-19 18:32:32 +00:00
_description = ' Analytic Account '
2012-12-19 17:31:27 +00:00
_track = {
' state ' : {
2013-06-27 14:46:47 +00:00
' analytic.mt_account_pending ' : lambda self , cr , uid , obj , ctx = None : obj . state == ' pending ' ,
' analytic.mt_account_closed ' : lambda self , cr , uid , obj , ctx = None : obj . state == ' close ' ,
' analytic.mt_account_opened ' : lambda self , cr , uid , obj , ctx = None : obj . state == ' open ' ,
2012-12-19 17:31:27 +00:00
} ,
}
2010-02-05 15:09:27 +00:00
2010-10-20 08:54:13 +00:00
def _compute_level_tree ( self , cr , uid , ids , child_ids , res , field_names , context = None ) :
2011-09-17 14:00:00 +00:00
currency_obj = self . pool . get ( ' res.currency ' )
recres = { }
def recursive_computation ( account ) :
result2 = res [ account . id ] . copy ( )
2010-10-20 08:54:13 +00:00
for son in account . child_ids :
2011-09-17 14:00:00 +00:00
result = recursive_computation ( son )
2010-10-20 08:54:13 +00:00
for field in field_names :
2011-09-17 14:00:00 +00:00
if ( account . currency_id . id != son . currency_id . id ) and ( field != ' quantity ' ) :
result [ field ] = currency_obj . compute ( cr , uid , son . currency_id . id , account . currency_id . id , result [ field ] , context = context )
result2 [ field ] + = result [ field ]
return result2
2010-09-23 07:53:54 +00:00
for account in self . browse ( cr , uid , ids , context = context ) :
2010-10-20 08:54:13 +00:00
if account . id not in child_ids :
2010-02-11 15:16:50 +00:00
continue
2011-09-17 14:00:00 +00:00
recres [ account . id ] = recursive_computation ( account )
return recres
2010-02-05 15:09:27 +00:00
2012-02-16 18:01:11 +00:00
def _debit_credit_bal_qtty ( self , cr , uid , ids , fields , arg , context = None ) :
2010-02-11 15:16:50 +00:00
res = { }
2010-08-17 05:10:27 +00:00
if context is None :
context = { }
2010-10-20 08:54:13 +00:00
child_ids = tuple ( self . search ( cr , uid , [ ( ' parent_id ' , ' child_of ' , ids ) ] ) )
for i in child_ids :
res [ i ] = { }
2012-02-16 18:01:11 +00:00
for n in fields :
2010-10-20 08:54:13 +00:00
res [ i ] [ n ] = 0.0
2010-03-17 11:56:13 +00:00
2010-10-20 08:54:13 +00:00
if not child_ids :
2010-02-11 15:16:50 +00:00
return res
2010-03-17 11:56:13 +00:00
2010-02-05 15:09:27 +00:00
where_date = ' '
2011-01-17 11:20:56 +00:00
where_clause_args = [ tuple ( child_ids ) ]
2010-08-17 05:10:27 +00:00
if context . get ( ' from_date ' , False ) :
2010-10-20 08:54:13 +00:00
where_date + = " AND l.date >= %s "
where_clause_args + = [ context [ ' from_date ' ] ]
2010-08-17 05:10:27 +00:00
if context . get ( ' to_date ' , False ) :
2010-10-20 08:54:13 +00:00
where_date + = " AND l.date <= %s "
where_clause_args + = [ context [ ' to_date ' ] ]
cr . execute ( """
SELECT a . id ,
2010-10-25 14:24:35 +00:00
sum (
2010-10-25 15:28:34 +00:00
CASE WHEN l . amount > 0
2011-01-17 11:20:56 +00:00
THEN l . amount
2010-10-25 15:28:34 +00:00
ELSE 0.0
END
) as debit ,
sum (
CASE WHEN l . amount < 0
THEN - l . amount
2011-01-17 11:20:56 +00:00
ELSE 0.0
2010-10-25 15:28:34 +00:00
END
) as credit ,
2010-10-20 08:54:13 +00:00
COALESCE ( SUM ( l . amount ) , 0 ) AS balance ,
COALESCE ( SUM ( l . unit_amount ) , 0 ) AS quantity
2011-01-17 11:20:56 +00:00
FROM account_analytic_account a
LEFT JOIN account_analytic_line l ON ( a . id = l . account_id )
2010-10-25 14:24:35 +00:00
WHERE a . id IN % s
2010-10-20 08:54:13 +00:00
""" + where_date + """
GROUP BY a . id """ , where_clause_args)
2012-02-16 18:01:11 +00:00
for row in cr . dictfetchall ( ) :
res [ row [ ' id ' ] ] = { }
for field in fields :
res [ row [ ' id ' ] ] [ field ] = row [ field ]
return self . _compute_level_tree ( cr , uid , ids , child_ids , res , fields , context )
2010-02-05 15:09:27 +00:00
2012-10-25 13:53:59 +00:00
def name_get ( self , cr , uid , ids , context = None ) :
res = [ ]
2012-11-08 07:29:38 +00:00
if not ids :
2012-11-09 05:14:40 +00:00
return res
2012-11-08 07:29:38 +00:00
if isinstance ( ids , ( int , long ) ) :
ids = [ ids ]
2012-10-25 13:53:59 +00:00
for id in ids :
elmt = self . browse ( cr , uid , id , context = context )
res . append ( ( id , self . _get_one_full_name ( elmt ) ) )
return res
2012-10-24 17:06:01 +00:00
def _get_full_name ( self , cr , uid , ids , name = None , args = None , context = None ) :
if context == None :
context = { }
res = { }
2012-10-25 13:53:59 +00:00
for elmt in self . browse ( cr , uid , ids , context = context ) :
res [ elmt . id ] = self . _get_one_full_name ( elmt )
2012-10-24 17:06:01 +00:00
return res
2012-10-25 13:53:59 +00:00
def _get_one_full_name ( self , elmt , level = 6 ) :
2012-10-24 17:06:01 +00:00
if level < = 0 :
return ' ... '
2012-11-30 16:34:45 +00:00
if elmt . parent_id and not elmt . type == ' template ' :
2012-12-20 15:05:47 +00:00
parent_path = self . _get_one_full_name ( elmt . parent_id , level - 1 ) + " / "
2012-10-24 17:06:01 +00:00
else :
parent_path = ' '
2012-10-25 13:53:59 +00:00
return parent_path + elmt . name
2011-01-28 09:19:06 +00:00
2011-01-17 10:25:22 +00:00
def _child_compute ( self , cr , uid , ids , name , arg , context = None ) :
result = { }
if context is None :
context = { }
2011-01-28 09:19:06 +00:00
2011-01-17 10:25:22 +00:00
for account in self . browse ( cr , uid , ids , context = context ) :
2011-01-27 09:15:53 +00:00
result [ account . id ] = map ( lambda x : x . id , [ child for child in account . child_ids if child . state != ' template ' ] )
2011-01-17 10:25:22 +00:00
return result
2011-03-11 13:03:40 +00:00
def _get_analytic_account ( self , cr , uid , ids , context = None ) :
2011-03-11 11:37:10 +00:00
company_obj = self . pool . get ( ' res.company ' )
analytic_obj = self . pool . get ( ' account.analytic.account ' )
accounts = [ ]
for company in company_obj . browse ( cr , uid , ids , context = context ) :
accounts + = analytic_obj . search ( cr , uid , [ ( ' company_id ' , ' = ' , company . id ) ] )
return accounts
def _set_company_currency ( self , cr , uid , ids , name , value , arg , context = None ) :
2012-05-08 14:13:05 +00:00
if isinstance ( ids , ( int , long ) ) :
2011-03-11 11:37:10 +00:00
ids = [ ids ]
for account in self . browse ( cr , uid , ids , context = context ) :
2011-03-24 11:12:12 +00:00
if account . company_id :
if account . company_id . currency_id . id != value :
2013-04-29 05:38:51 +00:00
raise osv . except_osv ( _ ( ' Error! ' ) , _ ( " If you set a company, the currency selected has to be the same as it ' s currency. \n You can remove the company belonging, and thus change the currency, only on analytic account of type ' view ' . This can be really useful for consolidation purposes of several companies charts with different currencies, for example. " ) )
2012-10-05 14:36:06 +00:00
if value :
return cr . execute ( """ update account_analytic_account set currency_id= %s where id= %s """ , ( value , account . id , ) )
2011-03-11 11:37:10 +00:00
def _currency ( self , cr , uid , ids , field_name , arg , context = None ) :
result = { }
for rec in self . browse ( cr , uid , ids , context = context ) :
2011-03-24 11:12:12 +00:00
if rec . company_id :
2011-03-11 11:37:10 +00:00
result [ rec . id ] = rec . company_id . currency_id . id
2011-03-24 11:12:12 +00:00
else :
result [ rec . id ] = rec . currency_id . id
2011-03-11 11:37:10 +00:00
return result
2010-02-05 15:09:27 +00:00
_columns = {
2013-04-10 12:20:11 +00:00
' name ' : fields . char ( ' Account/Contract Name ' , size = 128 , required = True , track_visibility = ' onchange ' ) ,
2013-02-05 10:02:23 +00:00
' complete_name ' : fields . function ( _get_full_name , type = ' char ' , string = ' Full Name ' ) ,
2013-04-10 12:20:11 +00:00
' code ' : fields . char ( ' Reference ' , select = True , track_visibility = ' onchange ' ) ,
2012-10-28 15:15:37 +00:00
' type ' : fields . selection ( [ ( ' view ' , ' Analytic View ' ) , ( ' normal ' , ' Analytic Account ' ) , ( ' contract ' , ' Contract or Project ' ) , ( ' template ' , ' Template of Contract ' ) ] , ' Type of Account ' , required = True ,
2012-06-26 13:01:25 +00:00
help = " If you select the View Type, it means you won \' t allow to create journal entries using that account. \n " \
" The type ' Analytic account ' stands for usual accounts that you only want to use in accounting. \n " \
" If you select Contract or Project, it offers you the possibility to manage the validity and the invoicing options for this account. \n " \
2012-10-28 15:15:37 +00:00
" The special type ' Template of Contract ' allows you to define a template with default data that you can reuse easily. " ) ,
2012-07-23 12:05:31 +00:00
' template_id ' : fields . many2one ( ' account.analytic.account ' , ' Template of Contract ' ) ,
2010-09-01 13:58:06 +00:00
' description ' : fields . text ( ' Description ' ) ,
2010-02-05 15:09:27 +00:00
' parent_id ' : fields . many2one ( ' account.analytic.account ' , ' Parent Analytic Account ' , select = 2 ) ,
' child_ids ' : fields . one2many ( ' account.analytic.account ' , ' parent_id ' , ' Child Accounts ' ) ,
2011-07-01 23:41:24 +00:00
' child_complete_ids ' : fields . function ( _child_compute , relation = ' account.analytic.account ' , string = " Account Hierarchy " , type = ' many2many ' ) ,
2010-02-05 15:09:27 +00:00
' line_ids ' : fields . one2many ( ' account.analytic.line ' , ' account_id ' , ' Analytic Entries ' ) ,
2011-07-01 23:41:24 +00:00
' balance ' : fields . function ( _debit_credit_bal_qtty , type = ' float ' , string = ' Balance ' , multi = ' debit_credit_bal_qtty ' , digits_compute = dp . get_precision ( ' Account ' ) ) ,
' debit ' : fields . function ( _debit_credit_bal_qtty , type = ' float ' , string = ' Debit ' , multi = ' debit_credit_bal_qtty ' , digits_compute = dp . get_precision ( ' Account ' ) ) ,
' credit ' : fields . function ( _debit_credit_bal_qtty , type = ' float ' , string = ' Credit ' , multi = ' debit_credit_bal_qtty ' , digits_compute = dp . get_precision ( ' Account ' ) ) ,
' quantity ' : fields . function ( _debit_credit_bal_qtty , type = ' float ' , string = ' Quantity ' , multi = ' debit_credit_bal_qtty ' ) ,
2012-10-28 11:05:06 +00:00
' quantity_max ' : fields . float ( ' Prepaid Service Units ' , help = ' Sets the higher limit of time to work on the contract, based on the timesheet. (for instance, number of hours in a limited support contract.) ' ) ,
2012-05-28 10:43:10 +00:00
' partner_id ' : fields . many2one ( ' res.partner ' , ' Customer ' ) ,
2013-04-10 12:20:11 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Project Manager ' , track_visibility = ' onchange ' ) ,
' manager_id ' : fields . many2one ( ' res.users ' , ' Account Manager ' , track_visibility = ' onchange ' ) ,
2012-10-16 09:34:45 +00:00
' date_start ' : fields . date ( ' Start Date ' ) ,
2014-01-06 15:38:18 +00:00
' date ' : fields . date ( ' Expiration Date ' , select = True , track_visibility = ' onchange ' ) ,
2010-12-28 15:22:05 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) , #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
2013-02-14 19:37:41 +00:00
' state ' : fields . selection ( [ ( ' template ' , ' Template ' ) , ( ' draft ' , ' New ' ) , ( ' open ' , ' In Progress ' ) , ( ' pending ' , ' To Renew ' ) , ( ' close ' , ' Closed ' ) , ( ' cancelled ' , ' Cancelled ' ) ] , ' Status ' , required = True , track_visibility = ' onchange ' ) ,
2012-10-04 16:26:11 +00:00
' currency_id ' : fields . function ( _currency , fnct_inv = _set_company_currency , #the currency_id field is readonly except if it's a view account and if there is no company
2011-03-11 11:37:10 +00:00
store = {
2011-03-11 13:03:40 +00:00
' res.company ' : ( _get_analytic_account , [ ' currency_id ' ] , 10 ) ,
2011-03-11 11:37:10 +00:00
} , string = ' Currency ' , type = ' many2one ' , relation = ' res.currency ' ) ,
2010-02-05 15:09:27 +00:00
}
2012-09-21 13:14:24 +00:00
2012-07-23 12:05:31 +00:00
def on_change_template ( self , cr , uid , ids , template_id , context = None ) :
if not template_id :
return { }
res = { ' value ' : { } }
template = self . browse ( cr , uid , template_id , context = context )
2012-11-29 16:25:58 +00:00
if template . date_start and template . date :
from_dt = datetime . strptime ( template . date_start , tools . DEFAULT_SERVER_DATE_FORMAT )
to_dt = datetime . strptime ( template . date , tools . DEFAULT_SERVER_DATE_FORMAT )
timedelta = to_dt - from_dt
res [ ' value ' ] [ ' date ' ] = datetime . strftime ( datetime . now ( ) + timedelta , tools . DEFAULT_SERVER_DATE_FORMAT )
2012-11-29 14:24:28 +00:00
res [ ' value ' ] [ ' date_start ' ] = fields . date . today ( )
2012-07-23 12:05:31 +00:00
res [ ' value ' ] [ ' quantity_max ' ] = template . quantity_max
2012-11-29 16:25:58 +00:00
res [ ' value ' ] [ ' parent_id ' ] = template . parent_id and template . parent_id . id or False
2012-07-23 12:05:31 +00:00
res [ ' value ' ] [ ' description ' ] = template . description
return res
2012-09-21 13:14:24 +00:00
2012-06-07 05:54:36 +00:00
def on_change_partner_id ( self , cr , uid , ids , partner_id , name , context = { } ) :
2012-05-28 10:43:10 +00:00
res = { }
if partner_id :
2012-06-14 13:45:11 +00:00
partner = self . pool . get ( ' res.partner ' ) . browse ( cr , uid , partner_id , context = context )
if partner . user_id :
res [ ' manager_id ' ] = partner . user_id . id
if not name :
res [ ' name ' ] = _ ( ' Contract: ' ) + partner . name
2012-05-28 10:43:10 +00:00
return { ' value ' : res }
2010-02-05 15:09:27 +00:00
2010-08-17 05:10:27 +00:00
def _default_company ( self , cr , uid , context = None ) :
2010-02-05 15:09:27 +00:00
user = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context )
if user . company_id :
return user . company_id . id
return self . pool . get ( ' res.company ' ) . search ( cr , uid , [ ( ' parent_id ' , ' = ' , False ) ] ) [ 0 ]
2010-08-17 05:10:27 +00:00
2010-12-28 15:22:05 +00:00
def _get_default_currency ( self , cr , uid , context = None ) :
user = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context )
return user . company_id . currency_id . id
2010-02-05 15:09:27 +00:00
_defaults = {
2010-10-11 10:23:00 +00:00
' type ' : ' normal ' ,
2010-02-05 15:09:27 +00:00
' company_id ' : _default_company ,
2012-05-28 09:19:10 +00:00
' code ' : lambda obj , cr , uid , context : obj . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' account.analytic.account ' ) ,
2010-10-11 10:23:00 +00:00
' state ' : ' open ' ,
' user_id ' : lambda self , cr , uid , ctx : uid ,
2010-06-16 11:51:39 +00:00
' partner_id ' : lambda self , cr , uid , ctx : ctx . get ( ' partner_id ' , False ) ,
2010-12-28 15:22:05 +00:00
' date_start ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' currency_id ' : _get_default_currency ,
2010-02-05 15:09:27 +00:00
}
2011-06-06 10:58:26 +00:00
def check_recursion ( self , cr , uid , ids , context = None , parent = None ) :
return super ( account_analytic_account , self ) . _check_recursion ( cr , uid , ids , context = context , parent = parent )
2010-02-05 15:09:27 +00:00
2013-05-16 09:46:13 +00:00
_order = ' code, name asc '
2010-02-05 15:09:27 +00:00
_constraints = [
2012-07-27 06:55:57 +00:00
( check_recursion , ' Error! You cannot create recursive analytic accounts. ' , [ ' parent_id ' ] ) ,
2010-02-05 15:09:27 +00:00
]
2013-02-21 01:29:20 +00:00
def name_create ( self , cr , uid , name , context = None ) :
raise osv . except_osv ( _ ( ' Warning ' ) , _ ( " Quick account creation disallowed. " ) )
2010-08-17 05:10:27 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
2010-02-05 15:09:27 +00:00
if not default :
default = { }
2012-08-13 08:37:29 +00:00
analytic = self . browse ( cr , uid , id , context = context )
2012-09-24 16:26:45 +00:00
default . update (
code = False ,
line_ids = [ ] ,
name = _ ( " %s (copy) " ) % ( analytic [ ' name ' ] ) )
2010-02-05 15:09:27 +00:00
return super ( account_analytic_account , self ) . copy ( cr , uid , id , default , context = context )
2010-12-28 15:22:05 +00:00
def on_change_company ( self , cr , uid , id , company_id ) :
if not company_id :
return { }
currency = self . pool . get ( ' res.company ' ) . read ( cr , uid , [ company_id ] , [ ' currency_id ' ] ) [ 0 ] [ ' currency_id ' ]
return { ' value ' : { ' currency_id ' : currency } }
2010-02-05 15:09:27 +00:00
def on_change_parent ( self , cr , uid , id , parent_id ) :
if not parent_id :
return { }
parent = self . read ( cr , uid , [ parent_id ] , [ ' partner_id ' , ' code ' ] ) [ 0 ]
if parent [ ' partner_id ' ] :
partner = parent [ ' partner_id ' ] [ 0 ]
else :
partner = False
2010-10-11 10:23:00 +00:00
res = { ' value ' : { } }
2010-02-05 15:09:27 +00:00
if partner :
res [ ' value ' ] [ ' partner_id ' ] = partner
return res
def name_search ( self , cr , uid , name , args = None , operator = ' ilike ' , context = None , limit = 100 ) :
if not args :
args = [ ]
2010-11-23 07:05:05 +00:00
if context is None :
2010-02-05 15:09:27 +00:00
context = { }
2011-04-22 14:21:42 +00:00
if name :
2012-10-23 12:38:14 +00:00
account_ids = self . search ( cr , uid , [ ( ' code ' , ' = ' , name ) ] + args , limit = limit , context = context )
if not account_ids :
2012-12-21 16:30:03 +00:00
dom = [ ]
for name2 in name . split ( ' / ' ) :
name = name2 . strip ( )
account_ids = self . search ( cr , uid , dom + [ ( ' name ' , ' ilike ' , name ) ] + args , limit = limit , context = context )
if not account_ids : break
dom = [ ( ' parent_id ' , ' in ' , account_ids ) ]
2011-04-22 14:21:42 +00:00
else :
2012-10-23 12:38:14 +00:00
account_ids = self . search ( cr , uid , args , limit = limit , context = context )
return self . name_get ( cr , uid , account_ids , context = context )
2012-06-26 13:01:25 +00:00
2010-04-29 05:46:14 +00:00
class account_analytic_line ( osv . osv ) :
_name = ' account.analytic.line '
2010-05-19 18:32:32 +00:00
_description = ' Analytic Line '
2010-04-29 05:46:14 +00:00
_columns = {
2010-10-11 10:23:00 +00:00
' name ' : fields . char ( ' Description ' , size = 256 , required = True ) ,
2011-01-17 11:20:56 +00:00
' date ' : fields . date ( ' Date ' , required = True , select = True ) ,
2010-10-11 10:23:00 +00:00
' amount ' : fields . float ( ' Amount ' , required = True , help = ' Calculated by multiplying the quantity and the price given in the Product \' s cost price. Always expressed in the company main currency. ' , digits_compute = dp . get_precision ( ' Account ' ) ) ,
' unit_amount ' : fields . float ( ' Quantity ' , help = ' Specifies the amount of quantity to count. ' ) ,
2012-11-14 17:07:58 +00:00
' account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , required = True , ondelete = ' restrict ' , select = True , domain = [ ( ' type ' , ' <> ' , ' view ' ) ] ) ,
2010-10-11 10:23:00 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' User ' ) ,
2010-09-06 10:33:34 +00:00
' company_id ' : fields . related ( ' account_id ' , ' company_id ' , type = ' many2one ' , relation = ' res.company ' , string = ' Company ' , store = True , readonly = True ) ,
2010-04-29 05:46:14 +00:00
}
2012-10-24 13:09:25 +00:00
2012-10-25 14:54:43 +00:00
def _get_default_date ( self , cr , uid , context = None ) :
return fields . date . context_today ( self , cr , uid , context = context )
def __get_default_date ( self , cr , uid , context = None ) :
return self . _get_default_date ( cr , uid , context = context )
2012-10-24 13:09:25 +00:00
2010-04-29 05:46:14 +00:00
_defaults = {
2012-10-25 14:54:43 +00:00
' date ' : __get_default_date ,
2010-05-18 05:15:14 +00:00
' company_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' account.analytic.line ' , context = c ) ,
2010-10-11 10:23:00 +00:00
' amount ' : 0.00
2010-04-29 05:46:14 +00:00
}
2010-08-17 05:10:27 +00:00
2010-09-01 12:31:18 +00:00
_order = ' date desc '
2012-06-26 13:01:25 +00:00
2011-12-16 05:54:55 +00:00
def _check_no_view ( self , cr , uid , ids , context = None ) :
analytic_lines = self . browse ( cr , uid , ids , context = context )
for line in analytic_lines :
if line . account_id . type == ' view ' :
return False
return True
2012-06-26 13:01:25 +00:00
2011-12-16 05:54:55 +00:00
_constraints = [
2012-07-27 06:55:57 +00:00
( _check_no_view , ' You cannot create analytic line on view account. ' , [ ' account_id ' ] ) ,
2012-06-26 13:01:25 +00:00
]
2010-04-29 05:46:14 +00:00
2010-09-01 13:58:06 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: