2008-07-23 14:41:47 +00:00
# -*- encoding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
#
2008-11-03 19:18:56 +00:00
# OpenERP, Open Source Management Solution
2009-01-04 22:12:50 +00:00
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
2008-11-03 19:18:56 +00:00
# $Id$
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +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 General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +00:00
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2006-12-07 13:41:40 +00:00
#
##############################################################################
from mx import DateTime
import time
from osv import fields , osv
2008-07-08 08:13:12 +00:00
from tools . translate import _
2006-12-07 13:41:40 +00:00
class hr_timesheet_group ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " hr.timesheet.group "
_description = " Working Time "
_columns = {
' name ' : fields . char ( " Group name " , size = 64 , required = True ) ,
' timesheet_id ' : fields . one2many ( ' hr.timesheet ' , ' tgroup_id ' , ' Working Time ' ) ,
' manager ' : fields . many2one ( ' res.users ' , ' Workgroup manager ' ) ,
}
#
# TODO: improve; very slow !
# bug if transition to another period
#
def interval_get ( self , cr , uid , id , dt_from , hours , byday = True ) :
if not id :
return [ ( dt_from , dt_from + DateTime . RelativeDateTime ( hours = int ( hours ) * 3 ) ) ]
todo = hours
cycle = 0
result = [ ]
while todo > 0 :
2008-12-10 14:29:55 +00:00
cr . execute ( " select hour_from,hour_to from hr_timesheet where dayofweek= ' %s ' and tgroup_id= %s order by hour_from " , ( dt_from . day_of_week , id ) )
2008-07-22 15:11:28 +00:00
for ( hour_from , hour_to ) in cr . fetchall ( ) :
2009-01-01 12:11:10 +00:00
import math
hour_from = ' %02d : %02d ' % ( math . floor ( abs ( hour_from ) ) , round ( abs ( hour_from ) % 1 + 0.01 , 2 ) * 60 )
hour_to = ' %02d : %02d ' % ( math . floor ( abs ( hour_to ) ) , round ( abs ( hour_to ) % 1 + 0.01 , 2 ) * 60 )
2008-07-22 15:11:28 +00:00
h1 , m1 = map ( int , hour_from . split ( ' : ' ) )
h2 , m2 = map ( int , hour_to . split ( ' : ' ) )
d1 = DateTime . DateTime ( dt_from . year , dt_from . month , dt_from . day , h1 , m1 )
d2 = DateTime . DateTime ( dt_from . year , dt_from . month , dt_from . day , h2 , m2 )
if dt_from < d2 :
date1 = max ( dt_from , d1 )
if date1 + DateTime . RelativeDateTime ( hours = todo ) < = d2 :
result . append ( ( date1 , date1 + DateTime . RelativeDateTime ( hours = todo ) ) )
todo = 0
else :
todo - = ( d2 - date1 ) . hours
result . append ( ( date1 , d2 ) )
dt_from = DateTime . DateTime ( dt_from . year , dt_from . month , dt_from . day ) + DateTime . RelativeDateTime ( days = 1 )
cycle + = 1
if cycle > 7 and todo == hours :
return [ ( dt_from , dt_from + DateTime . RelativeDateTime ( hours = hours * 3 ) ) ]
if byday :
i = 1
while i < len ( result ) :
if ( result [ i ] [ 0 ] - result [ i - 1 ] [ 1 ] ) . days < 1 :
result [ i - 1 ] = ( result [ i - 1 ] [ 0 ] , result [ i ] [ 1 ] )
del result [ i ]
else :
i + = 1
return result
2006-12-07 13:41:40 +00:00
hr_timesheet_group ( )
class hr_employee_category ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " hr.employee.category "
_description = " Employee Category "
2009-01-02 09:54:21 +00:00
2008-07-22 15:11:28 +00:00
_columns = {
' name ' : fields . char ( " Category " , size = 64 , required = True ) ,
2009-01-27 11:15:46 +00:00
' parent_id ' : fields . many2one ( ' hr.employee.category ' , ' Parent Category ' , select = True ) ,
' child_ids ' : fields . one2many ( ' hr.employee.category ' , ' parent_id ' , ' Child Categories ' )
2008-07-22 15:11:28 +00:00
}
2009-01-02 09:54:21 +00:00
def _check_recursion ( self , cr , uid , ids ) :
level = 100
while len ( ids ) :
cr . execute ( ' select distinct parent_id from hr_employee_category where id in ( ' + ' , ' . join ( map ( str , ids ) ) + ' ) ' )
ids = filter ( None , map ( lambda x : x [ 0 ] , cr . fetchall ( ) ) )
if not level :
return False
level - = 1
return True
_constraints = [
( _check_recursion , ' Error ! You cannot create recursive Categories. ' , [ ' parent_id ' ] )
]
2006-12-07 13:41:40 +00:00
hr_employee_category ( )
class hr_employee ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " hr.employee "
_description = " Employee "
2007-05-07 11:59:33 +00:00
2008-07-22 15:11:28 +00:00
_columns = {
' name ' : fields . char ( " Employee " , size = 128 , required = True ) ,
' active ' : fields . boolean ( ' Active ' ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
2008-08-27 20:53:10 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Related User ' ) ,
' country_id ' : fields . many2one ( ' res.country ' , ' Nationality ' ) ,
2009-01-17 22:16:45 +00:00
' birthday ' : fields . date ( " Birthday " ) ,
2008-08-27 20:53:10 +00:00
' ssnid ' : fields . char ( ' SSN No ' , size = 32 ) ,
' sinid ' : fields . char ( ' SIN No ' , size = 32 ) ,
' otherid ' : fields . char ( ' Other ID ' , size = 32 ) ,
' gender ' : fields . selection ( [ ( ' ' , ' ' ) , ( ' male ' , ' Male ' ) , ( ' female ' , ' Female ' ) ] , ' Gender ' ) ,
' marital ' : fields . selection ( [ ( ' maried ' , ' Maried ' ) , ( ' unmaried ' , ' Unmaried ' ) , ( ' divorced ' , ' Divorced ' ) , ( ' other ' , ' Other ' ) ] , ' Marital Status ' , size = 32 ) ,
2008-10-29 15:16:39 +00:00
' address_id ' : fields . many2one ( ' res.partner.address ' , ' Working Address ' ) ,
2008-08-27 20:53:10 +00:00
' work_phone ' : fields . char ( ' Work Phone ' , size = 32 ) ,
' work_email ' : fields . char ( ' Work Email ' , size = 128 ) ,
' work_location ' : fields . char ( ' Office Location ' , size = 32 ) ,
2008-07-22 15:11:28 +00:00
' notes ' : fields . text ( ' Notes ' ) ,
2008-08-27 20:53:10 +00:00
' parent_id ' : fields . many2one ( ' hr.employee ' , ' Manager ' , select = True ) ,
2008-07-22 15:11:28 +00:00
' category_id ' : fields . many2one ( ' hr.employee.category ' , ' Category ' ) ,
' child_ids ' : fields . one2many ( ' hr.employee ' , ' parent_id ' , ' Subordinates ' ) ,
}
_defaults = {
' active ' : lambda * a : True ,
}
2008-09-16 14:25:47 +00:00
2009-01-02 09:54:21 +00:00
def _check_recursion ( self , cr , uid , ids ) :
level = 100
while len ( ids ) :
cr . execute ( ' select distinct parent_id from hr_employee where id in ( ' + ' , ' . join ( map ( str , ids ) ) + ' ) ' )
ids = filter ( None , map ( lambda x : x [ 0 ] , cr . fetchall ( ) ) )
if not level :
return False
level - = 1
return True
_constraints = [
( _check_recursion , ' Error ! You cannot create recursive Hierarchy of Employees. ' , [ ' parent_id ' ] )
]
2006-12-07 13:41:40 +00:00
hr_employee ( )
class hr_timesheet ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " hr.timesheet "
_description = " Timesheet Line "
_columns = {
' name ' : fields . char ( " Name " , size = 64 , required = True ) ,
' dayofweek ' : fields . selection ( [ ( ' 0 ' , ' Monday ' ) , ( ' 1 ' , ' Tuesday ' ) , ( ' 2 ' , ' Wednesday ' ) , ( ' 3 ' , ' Thursday ' ) , ( ' 4 ' , ' Friday ' ) , ( ' 5 ' , ' Saturday ' ) , ( ' 6 ' , ' Sunday ' ) ] , ' Day of week ' ) ,
' date_from ' : fields . date ( ' Starting date ' ) ,
2008-10-27 21:44:17 +00:00
' hour_from ' : fields . float ( ' Work from ' , size = 8 , required = True ) ,
' hour_to ' : fields . float ( " Work to " , size = 8 , required = True ) ,
2008-07-22 15:11:28 +00:00
' tgroup_id ' : fields . many2one ( " hr.timesheet.group " , " Employee ' s timesheet group " , select = True ) ,
}
_order = ' dayofweek, hour_from '
2006-12-07 13:41:40 +00:00
hr_timesheet ( )