2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2008-08-24 14:45:43 +00:00
##################################################################################
#
2010-02-17 08:49:38 +00:00
# Copyright (c) 2005-2006 Axelor SARL. (http://www.axelor.com)
2010-01-12 09:18:39 +00:00
# and 2004-2010 Tiny SPRL (<http://tiny.be>).
2008-08-24 14:45:43 +00:00
#
# $Id: hr.py 4656 2006-11-24 09:58:42Z Cyp $
#
2009-10-14 11:15:34 +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.
2008-08-24 14:45:43 +00:00
#
2009-10-14 11:15:34 +00:00
# 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.
2008-08-24 14:45:43 +00:00
#
2009-10-14 11:15:34 +00:00
# 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/>.
2008-08-24 14:45:43 +00:00
#
##############################################################################
2010-07-03 10:21:52 +00:00
2010-05-18 06:26:16 +00:00
import datetime
2010-09-22 08:23:53 +00:00
from itertools import groupby
from operator import itemgetter
2010-05-04 11:19:18 +00:00
2008-08-24 14:45:43 +00:00
import netsvc
from osv import fields , osv
2009-03-06 22:18:24 +00:00
from tools . translate import _
2008-08-24 14:45:43 +00:00
2010-09-22 08:23:53 +00:00
2008-08-30 11:45:40 +00:00
class hr_holidays_status ( osv . osv ) :
_name = " hr.holidays.status "
2010-05-19 18:32:32 +00:00
_description = " Leave Type "
2010-05-04 11:19:18 +00:00
2010-05-26 10:19:25 +00:00
def get_days ( self , cr , uid , ids , employee_id , return_false , context = None ) :
2010-09-22 08:23:53 +00:00
cr . execute ( """ SELECT id, type, number_of_days, holiday_status_id FROM hr_holidays WHERE employee_id = %s AND state= ' validate ' AND holiday_status_id in %s """ ,
[ employee_id , tuple ( ids ) ] )
result = sorted ( cr . dictfetchall ( ) , key = lambda x : x [ ' holiday_status_id ' ] )
grouped_lines = dict ( ( k , [ v for v in itr ] ) for k , itr in groupby ( result , itemgetter ( ' holiday_status_id ' ) ) )
2009-09-24 10:46:21 +00:00
res = { }
2010-05-21 06:46:54 +00:00
for record in self . browse ( cr , uid , ids , context = context ) :
2009-09-24 10:46:21 +00:00
res [ record . id ] = { }
max_leaves = leaves_taken = 0
if not return_false :
2010-09-22 08:23:53 +00:00
if record . id in grouped_lines :
leaves_taken = - sum ( [ item [ ' number_of_days ' ] for item in grouped_lines [ record . id ] if item [ ' type ' ] == ' remove ' ] )
max_leaves = sum ( [ item [ ' number_of_days ' ] for item in grouped_lines [ record . id ] if item [ ' type ' ] == ' add ' ] )
2009-09-24 10:46:21 +00:00
res [ record . id ] [ ' max_leaves ' ] = max_leaves
res [ record . id ] [ ' leaves_taken ' ] = leaves_taken
res [ record . id ] [ ' remaining_leaves ' ] = max_leaves - leaves_taken
return res
2009-03-13 06:25:53 +00:00
2010-05-26 10:19:25 +00:00
def _user_left_days ( self , cr , uid , ids , name , args , context = None ) :
2009-09-24 10:46:21 +00:00
return_false = False
2010-04-16 13:05:03 +00:00
employee_id = False
res = { }
2009-09-24 10:46:21 +00:00
if context and context . has_key ( ' employee_id ' ) :
if not context [ ' employee_id ' ] :
2010-01-12 05:32:48 +00:00
return_false = True
2009-09-24 10:46:21 +00:00
employee_id = context [ ' employee_id ' ]
else :
2010-07-27 07:11:45 +00:00
employee_ids = self . pool . get ( ' hr.employee ' ) . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] , context = context )
2009-09-24 10:46:21 +00:00
if employee_ids :
employee_id = employee_ids [ 0 ]
else :
return_false = True
2010-03-17 17:09:26 +00:00
if employee_id :
res = self . get_days ( cr , uid , ids , employee_id , return_false , context = context )
2010-05-14 14:46:47 +00:00
else :
2010-08-02 10:31:53 +00:00
res = dict . fromkeys ( ids , { ' leaves_taken ' : 0 , ' remaining_leaves ' : 0 , ' max_leaves ' : 0 } )
2009-09-24 10:46:21 +00:00
return res
2009-03-13 06:25:53 +00:00
_columns = {
2010-10-12 21:59:40 +00:00
' name ' : fields . char ( ' Leave Type ' , size = 64 , required = True , translate = True ) ,
2010-12-29 12:41:23 +00:00
' categ_id ' : fields . many2one ( ' crm.case.categ ' , ' Meeting ' , domain = " [( ' object_id.model ' , ' = ' , ' crm.meeting ' )] " , help = ' If you set a meeting type, OpenERP will create a meeting in the calendar once a leave is validated. ' ) ,
2010-10-12 21:59:40 +00:00
' color_name ' : fields . selection ( [ ( ' red ' , ' Red ' ) , ( ' blue ' , ' Blue ' ) , ( ' lightgreen ' , ' Light Green ' ) , ( ' lightblue ' , ' Light Blue ' ) , ( ' lightyellow ' , ' Light Yellow ' ) , ( ' magenta ' , ' Magenta ' ) , ( ' lightcyan ' , ' Light Cyan ' ) , ( ' black ' , ' Black ' ) , ( ' lightpink ' , ' Light Pink ' ) , ( ' brown ' , ' Brown ' ) , ( ' violet ' , ' Violet ' ) , ( ' lightcoral ' , ' Light Coral ' ) , ( ' lightsalmon ' , ' Light Salmon ' ) , ( ' lavender ' , ' Lavender ' ) , ( ' wheat ' , ' Wheat ' ) , ( ' ivory ' , ' Ivory ' ) ] , ' Color in Report ' , required = True , help = ' This color will be used in the leaves summary located in Reporting \ Leaves by Departement ' ) ,
2010-07-28 12:39:48 +00:00
' limit ' : fields . boolean ( ' Allow to Override Limit ' , help = ' If you tick this checkbox, the system will allow, for this section, the employees to take more leaves than the available ones. ' ) ,
2010-05-04 11:19:18 +00:00
' active ' : fields . boolean ( ' Active ' , help = " If the active field is set to false, it will allow you to hide the leave type without removing it. " ) ,
2010-12-29 16:51:30 +00:00
' max_leaves ' : fields . function ( _user_left_days , method = True , string = ' Maximum Allowed ' , help = ' This value is given by the sum of all holidays requests with a positive value. ' , multi = ' user_left_days ' ) ,
2010-05-04 11:19:18 +00:00
' leaves_taken ' : fields . function ( _user_left_days , method = True , string = ' Leaves Already Taken ' , help = ' This value is given by the sum of all holidays requests with a negative value. ' , multi = ' user_left_days ' ) ,
' remaining_leaves ' : fields . function ( _user_left_days , method = True , string = ' Remaining Leaves ' , help = ' Maximum Leaves Allowed - Leaves Already Taken ' , multi = ' user_left_days ' ) ,
2010-05-10 10:58:32 +00:00
' double_validation ' : fields . boolean ( ' Apply Double Validation ' , help = " If its True then its Allocation/Request have to be validated by second validator " )
2009-03-13 06:25:53 +00:00
}
_defaults = {
2010-05-04 11:19:18 +00:00
' color_name ' : ' red ' ,
' active ' : True ,
2010-08-26 04:52:04 +00:00
}
2009-09-24 10:46:21 +00:00
hr_holidays_status ( )
2009-03-13 06:25:53 +00:00
2008-08-24 14:45:43 +00:00
class hr_holidays ( osv . osv ) :
_name = " hr.holidays "
2010-05-19 18:32:32 +00:00
_description = " Leave "
2009-09-24 10:46:21 +00:00
_order = " type desc, date_from asc "
2010-05-10 04:56:49 +00:00
def _employee_get ( obj , cr , uid , context = None ) :
2010-07-27 07:11:45 +00:00
ids = obj . pool . get ( ' hr.employee ' ) . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] , context = context )
2010-05-10 04:56:49 +00:00
if ids :
return ids [ 0 ]
return False
2008-11-20 17:21:19 +00:00
2010-12-29 12:41:23 +00:00
def _compute_number_of_days ( self , cr , uid , ids , name , args , context = None ) :
result = { }
for hol in self . browse ( cr , uid , ids , context = context ) :
if hol . type == ' remove ' :
result [ hol . id ] = - hol . number_of_days_temp
else :
result [ hol . id ] = hol . number_of_days_temp
return result
2008-08-24 14:45:43 +00:00
_columns = {
2010-10-08 13:22:47 +00:00
' name ' : fields . char ( ' Description ' , required = True , size = 64 ) ,
2011-01-31 06:48:45 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft ' ) , ( ' confirm ' , ' Waiting Approval ' ) , ( ' refuse ' , ' Refused ' ) ,
2010-12-29 12:41:23 +00:00
( ' validate1 ' , ' Waiting Second Approval ' ) , ( ' validate ' , ' Approved ' ) , ( ' cancel ' , ' Cancelled ' ) ] ,
' State ' , readonly = True , help = ' When the holiday request is created the state is \' Draft \' . \n It is confirmed by the user and request is sent to admin, the state is \' Waiting Approval \' . \
2010-09-06 09:47:54 +00:00
If the admin accepts it , the state is \' Approved \' . If it is refused, the state is \' Refused \' . ' ) ,
2010-12-29 12:41:23 +00:00
' user_id ' : fields . related ( ' employee_id ' , ' user_id ' , type = ' many2one ' , relation = ' res.users ' , string = ' User ' , store = True ) ,
2010-07-03 10:21:52 +00:00
' date_from ' : fields . datetime ( ' Start Date ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' date_to ' : fields . datetime ( ' End Date ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2010-11-10 11:20:09 +00:00
' holiday_status_id ' : fields . many2one ( " hr.holidays.status " , " Leave Type " , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2010-10-27 12:49:59 +00:00
' employee_id ' : fields . many2one ( ' hr.employee ' , " Employee " , select = True , invisible = False , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = ' Leave Manager can let this field empty if this leave request/allocation is for every employee ' ) ,
2010-09-06 10:47:48 +00:00
#'manager_id': fields.many2one('hr.employee', 'Leave Manager', invisible=False, readonly=True, help='This area is automaticly filled by the user who validate the leave'),
#'notes': fields.text('Notes',readonly=True, states={'draft':[('readonly',False)]}),
' manager_id ' : fields . many2one ( ' hr.employee ' , ' First Approval ' , invisible = False , readonly = True , help = ' This area is automaticly filled by the user who validate the leave ' ) ,
' notes ' : fields . text ( ' Reasons ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2009-09-24 10:46:21 +00:00
' number_of_days_temp ' : fields . float ( ' Number of Days ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2010-12-29 12:41:23 +00:00
' number_of_days ' : fields . function ( _compute_number_of_days , method = True , string = ' Number of Days ' , store = True ) ,
2011-02-01 12:40:38 +00:00
' case_id ' : fields . many2one ( ' crm.meeting ' , ' Meeting ' ) ,
2009-09-24 10:46:21 +00:00
' type ' : fields . selection ( [ ( ' remove ' , ' Leave Request ' ) , ( ' add ' , ' Allocation Request ' ) ] , ' Request Type ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Choose ' Leave Request ' if someone wants to take an off-day. \n Choose ' Allocation Request ' if you want to increase the number of leaves available for someone " ) ,
' parent_id ' : fields . many2one ( ' hr.holidays ' , ' Parent ' ) ,
' linked_request_ids ' : fields . one2many ( ' hr.holidays ' , ' parent_id ' , ' Linked Requests ' , ) ,
2010-04-07 10:41:20 +00:00
' department_id ' : fields . related ( ' employee_id ' , ' department_id ' , string = ' Department ' , type = ' many2one ' , relation = ' hr.department ' , readonly = True , store = True ) ,
2010-12-29 12:41:23 +00:00
' category_id ' : fields . many2one ( ' hr.employee.category ' , " Category " , help = ' Category of Employee ' ) ,
2010-10-12 21:59:40 +00:00
' holiday_type ' : fields . selection ( [ ( ' employee ' , ' By Employee ' ) , ( ' category ' , ' By Employee Category ' ) ] , ' Allocation Type ' , help = ' By Employee: Allocation/Request for individual Employee, By Employee Category: Allocation/Request for group of employees in category ' , required = True ) ,
2010-12-20 09:45:13 +00:00
' manager_id2 ' : fields . many2one ( ' hr.employee ' , ' Second Approval ' , readonly = True , help = ' This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation) ' )
2010-08-26 04:52:04 +00:00
}
2008-08-24 14:45:43 +00:00
_defaults = {
2010-10-27 12:49:59 +00:00
' employee_id ' : _employee_get ,
2010-07-03 10:21:52 +00:00
' state ' : ' draft ' ,
2010-05-04 11:19:18 +00:00
' type ' : ' remove ' ,
2008-11-20 17:21:19 +00:00
' user_id ' : lambda obj , cr , uid , context : uid ,
2010-05-05 12:18:58 +00:00
' holiday_type ' : ' employee '
2010-08-26 04:52:04 +00:00
}
2010-12-29 12:41:23 +00:00
_sql_constraints = [
( ' type_value ' , " CHECK( (holiday_type= ' employee ' AND employee_id IS NOT NULL) or (holiday_type= ' category ' AND category_id IS NOT NULL)) " , " You have to select an employee or a category " ) ,
( ' date_check ' , " CHECK ( number_of_days_temp > 0 ) " , " The number of days must be greater than 0 ! " ) ,
( ' date_check2 ' , " CHECK ( (type= ' add ' ) OR (date_from < date_to)) " , " The start date must be before the end date ! " )
]
2008-11-20 17:21:19 +00:00
2010-05-26 09:54:56 +00:00
def _create_resource_leave ( self , cr , uid , vals , context = None ) :
2010-05-26 10:19:25 +00:00
''' This method will create entry in resource calendar leave object at the time of holidays validated '''
2010-05-26 09:54:56 +00:00
obj_res_leave = self . pool . get ( ' resource.calendar.leaves ' )
2010-07-27 07:11:45 +00:00
return obj_res_leave . create ( cr , uid , vals , context = context )
2010-05-26 09:54:56 +00:00
def _remove_resouce_leave ( self , cr , uid , ids , context = None ) :
2010-05-26 10:19:25 +00:00
''' This method will create entry in resource calendar leave object at the time of holidays cancel/removed '''
2010-05-26 09:54:56 +00:00
obj_res_leave = self . pool . get ( ' resource.calendar.leaves ' )
2010-07-27 07:11:45 +00:00
leave_ids = obj_res_leave . search ( cr , uid , [ ( ' holiday_id ' , ' in ' , ids ) ] , context = context )
2010-05-26 09:54:56 +00:00
return obj_res_leave . unlink ( cr , uid , leave_ids )
2010-05-10 04:56:49 +00:00
def onchange_type ( self , cr , uid , ids , holiday_type ) :
result = { }
2010-10-27 13:10:19 +00:00
if holiday_type == ' employee ' :
2010-05-10 04:56:49 +00:00
ids_employee = self . pool . get ( ' hr.employee ' ) . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] )
if ids_employee :
result [ ' value ' ] = {
' employee_id ' : ids_employee [ 0 ]
2010-12-29 12:41:23 +00:00
}
2010-05-10 04:56:49 +00:00
return result
2010-12-29 12:41:23 +00:00
# TODO: can be improved using resource calendar method
2010-05-18 06:26:16 +00:00
def _get_number_of_days ( self , date_from , date_to ) :
2010-05-14 15:18:57 +00:00
""" Returns a float equals to the timedelta between two dates given as string. """
DATETIME_FORMAT = " % Y- % m- %d % H: % M: % S "
from_dt = datetime . datetime . strptime ( date_from , DATETIME_FORMAT )
to_dt = datetime . datetime . strptime ( date_to , DATETIME_FORMAT )
timedelta = to_dt - from_dt
2010-05-18 06:26:16 +00:00
diff_day = timedelta . days + float ( timedelta . seconds ) / 86400
2010-05-14 15:18:57 +00:00
return diff_day
2008-12-31 09:54:58 +00:00
2010-05-26 09:54:56 +00:00
def unlink ( self , cr , uid , ids , context = None ) :
2010-12-29 12:41:23 +00:00
for rec in self . browse ( cr , uid , ids , context = context ) :
if rec . state < > ' draft ' :
raise osv . except_osv ( _ ( ' Warning! ' ) , _ ( ' You cannot delete a leave which is not in draft state ! ' ) )
2010-01-05 08:07:22 +00:00
return super ( hr_holidays , self ) . unlink ( cr , uid , ids , context )
2008-12-31 09:54:58 +00:00
2010-05-14 15:22:19 +00:00
def onchange_date_from ( self , cr , uid , ids , date_to , date_from ) :
2008-11-20 17:21:19 +00:00
result = { }
2010-05-14 15:22:19 +00:00
if date_to and date_from :
2010-05-14 15:18:57 +00:00
diff_day = self . _get_number_of_days ( date_from , date_to )
2009-09-24 10:46:21 +00:00
result [ ' value ' ] = {
' number_of_days_temp ' : round ( diff_day ) + 1
}
return result
2008-11-20 17:21:19 +00:00
result [ ' value ' ] = {
2010-05-14 15:22:19 +00:00
' number_of_days_temp ' : 0 ,
2008-11-20 17:21:19 +00:00
}
return result
2010-07-03 10:21:52 +00:00
def onchange_sec_id ( self , cr , uid , ids , status , context = None ) :
2009-09-24 10:46:21 +00:00
warning = { }
if status :
2010-12-29 12:41:23 +00:00
brows_obj = self . pool . get ( ' hr.holidays.status ' ) . browse ( cr , uid , status , context = context )
2010-03-17 17:09:26 +00:00
if brows_obj . categ_id and brows_obj . categ_id . section_id and not brows_obj . categ_id . section_id . allow_unlink :
2009-09-24 10:46:21 +00:00
warning = {
' title ' : " Warning for " ,
2010-05-12 17:09:20 +00:00
' message ' : " You won \' t be able to cancel this leave request because the CRM Sales Team of the leave type disallows. "
2010-12-29 12:41:23 +00:00
}
2009-09-24 10:46:21 +00:00
return { ' warning ' : warning }
2008-08-24 14:45:43 +00:00
def set_to_draft ( self , cr , uid , ids , * args ) :
self . write ( cr , uid , ids , {
2010-07-03 10:21:52 +00:00
' state ' : ' draft ' ,
2009-09-24 10:46:21 +00:00
' manager_id ' : False ,
2011-03-22 10:04:47 +00:00
' manager_id2 ' : False ,
2008-08-24 14:45:43 +00:00
} )
2010-12-29 12:41:23 +00:00
wf_service = netsvc . LocalService ( " workflow " )
2010-05-26 10:19:25 +00:00
for id in ids :
wf_service . trg_create ( uid , ' hr.holidays ' , id , cr )
2008-08-24 14:45:43 +00:00
return True
2010-12-29 12:41:23 +00:00
def holidays_validate ( self , cr , uid , ids , * args ) :
2010-05-14 09:13:31 +00:00
self . check_holidays ( cr , uid , ids )
2010-12-29 12:41:23 +00:00
obj_emp = self . pool . get ( ' hr.employee ' )
2010-12-09 05:50:40 +00:00
ids2 = obj_emp . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] )
2010-12-29 12:41:23 +00:00
manager = ids2 and ids2 [ 0 ] or False
return self . write ( cr , uid , ids , { ' state ' : ' validate1 ' , ' manager_id ' : manager } )
2010-05-14 09:13:31 +00:00
2010-12-29 12:41:23 +00:00
def holidays_validate2 ( self , cr , uid , ids , * args ) :
2010-05-14 09:13:31 +00:00
self . check_holidays ( cr , uid , ids )
2010-12-29 12:41:23 +00:00
obj_emp = self . pool . get ( ' hr.employee ' )
2010-07-03 10:21:52 +00:00
ids2 = obj_emp . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] )
2010-12-29 12:41:23 +00:00
manager = ids2 and ids2 [ 0 ] or False
2011-03-22 10:04:47 +00:00
self . write ( cr , uid , ids , { ' state ' : ' validate ' } )
2010-12-29 12:41:23 +00:00
data_holiday = self . browse ( cr , uid , ids )
2010-05-10 10:58:32 +00:00
for record in data_holiday :
2011-03-22 10:04:47 +00:00
if record . holiday_status_id . double_validation :
self . write ( cr , uid , ids , { ' manager_id2 ' : manager } )
2010-07-03 10:21:52 +00:00
if record . holiday_type == ' employee ' and record . type == ' remove ' :
2010-12-29 12:41:23 +00:00
meeting_obj = self . pool . get ( ' crm.meeting ' )
2010-05-11 12:28:51 +00:00
vals = {
2010-12-29 12:41:23 +00:00
' name ' : record . name ,
' categ_id ' : record . holiday_status_id . categ_id . id ,
' duration ' : record . number_of_days_temp * 8 ,
' note ' : record . notes ,
' user_id ' : record . user_id . id ,
' date ' : record . date_from ,
' end_date ' : record . date_to ,
' date_deadline ' : record . date_to ,
}
case_id = meeting_obj . create ( cr , uid , vals )
self . write ( cr , uid , ids , { ' case_id ' : case_id } )
2010-12-20 09:45:13 +00:00
elif record . holiday_type == ' category ' :
2010-12-29 12:41:23 +00:00
emp_ids = obj_emp . search ( cr , uid , [ ( ' category_ids ' , ' child_of ' , [ record . category_id . id ] ) ] )
2010-12-20 09:45:13 +00:00
leave_ids = [ ]
2010-05-18 10:40:30 +00:00
for emp in obj_emp . browse ( cr , uid , emp_ids ) :
vals = {
2010-12-29 12:41:23 +00:00
' name ' : record . name ,
' type ' : record . type ,
' holiday_type ' : ' employee ' ,
' holiday_status_id ' : record . holiday_status_id . id ,
' date_from ' : record . date_from ,
' date_to ' : record . date_to ,
' notes ' : record . notes ,
' number_of_days_temp ' : record . number_of_days_temp ,
' parent_id ' : record . id ,
' employee_id ' : emp . id
2010-12-20 09:45:13 +00:00
}
leave_ids . append ( self . create ( cr , uid , vals , context = None ) )
2010-12-29 12:41:23 +00:00
wf_service = netsvc . LocalService ( " workflow " )
for leave_id in leave_ids :
wf_service . trg_validate ( uid , ' hr.holidays ' , leave_id , ' confirm ' , cr )
wf_service . trg_validate ( uid , ' hr.holidays ' , leave_id , ' validate ' , cr )
wf_service . trg_validate ( uid , ' hr.holidays ' , leave_id , ' second_validate ' , cr )
2008-08-24 14:45:43 +00:00
return True
def holidays_confirm ( self , cr , uid , ids , * args ) :
2010-12-29 12:41:23 +00:00
self . check_holidays ( cr , uid , ids )
return self . write ( cr , uid , ids , { ' state ' : ' confirm ' } )
2008-08-24 14:45:43 +00:00
def holidays_refuse ( self , cr , uid , ids , * args ) :
2010-12-09 05:50:40 +00:00
obj_emp = self . pool . get ( ' hr.employee ' )
2010-12-29 12:41:23 +00:00
ids2 = obj_emp . search ( cr , uid , [ ( ' user_id ' , ' = ' , uid ) ] )
manager = ids2 and ids2 [ 0 ] or False
2011-03-24 11:18:33 +00:00
self . write ( cr , uid , ids , { ' state ' : ' refuse ' } )
2010-12-29 12:41:23 +00:00
self . holidays_cancel ( cr , uid , ids )
2008-08-24 14:45:43 +00:00
return True
def holidays_cancel ( self , cr , uid , ids , * args ) :
2010-12-29 12:41:23 +00:00
obj_crm_meeting = self . pool . get ( ' crm.meeting ' )
for record in self . browse ( cr , uid , ids ) :
# Delete the meeting
if record . case_id :
2011-02-01 12:40:38 +00:00
obj_crm_meeting . unlink ( cr , uid , [ record . case_id . id ] )
2008-08-24 14:45:43 +00:00
2010-12-29 12:41:23 +00:00
# If a category that created several holidays, cancel all related
wf_service = netsvc . LocalService ( " workflow " )
2011-03-10 09:54:32 +00:00
for request in record . linked_request_ids or [ ] :
wf_service . trg_validate ( uid , ' hr.holidays ' , request . id , ' cancel ' , cr )
2010-12-29 12:41:23 +00:00
return True
2008-08-24 14:45:43 +00:00
2010-05-05 12:18:58 +00:00
def check_holidays ( self , cr , uid , ids ) :
2010-07-27 07:11:45 +00:00
holi_status_obj = self . pool . get ( ' hr.holidays.status ' )
2008-08-24 14:45:43 +00:00
for record in self . browse ( cr , uid , ids ) :
2010-12-29 12:41:23 +00:00
if record . holiday_type == ' employee ' and record . type == ' remove ' :
if record . employee_id and not record . holiday_status_id . limit :
leaves_rest = holi_status_obj . get_days ( cr , uid , [ record . holiday_status_id . id ] , record . employee_id . id , False ) [ record . holiday_status_id . id ] [ ' remaining_leaves ' ]
if leaves_rest < record . number_of_days_temp :
raise osv . except_osv ( _ ( ' Warning! ' ) , _ ( ' You cannot validate leaves for employee %s : too few remaining days ( %s ). ' ) % ( record . employee_id . name , leaves_rest ) )
2008-08-24 14:45:43 +00:00
return True
hr_holidays ( )
2010-05-11 12:28:51 +00:00
class resource_calendar_leaves ( osv . osv ) :
_inherit = " resource.calendar.leaves "
_description = " Leave Detail "
_columns = {
' holiday_id ' : fields . many2one ( " hr.holidays " , " Holiday " ) ,
2010-08-26 04:52:04 +00:00
}
2010-05-11 12:28:51 +00:00
resource_calendar_leaves ( )
2010-05-26 10:19:25 +00:00