~technofluid-team/openobject-addons/technofluid_multiple_installations

« back to all changes in this revision

Viewing changes to hr/report/bymonth.py

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-dedd7f8a42bd4557112a0513082691b8590ad6cc
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##############################################################################
 
2
#
 
3
# Copyright (c) 2005-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
 
4
#
 
5
# WARNING: This program as such is intended to be used by professional
 
6
# programmers who take the whole responsability of assessing all potential
 
7
# consequences resulting from its eventual inadequacies and bugs
 
8
# End users who are looking for a ready-to-use solution with commercial
 
9
# garantees and support are strongly adviced to contract a Free Software
 
10
# Service Company
 
11
#
 
12
# This program is Free Software; you can redistribute it and/or
 
13
# modify it under the terms of the GNU General Public License
 
14
# as published by the Free Software Foundation; either version 2
 
15
# of the License, or (at your option) any later version.
 
16
#
 
17
# This program is distributed in the hope that it will be useful,
 
18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
20
# GNU General Public License for more details.
 
21
#
 
22
# You should have received a copy of the GNU General Public License
 
23
# along with this program; if not, write to the Free Software
 
24
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
25
#
 
26
##############################################################################
 
27
 
 
28
from mx import DateTime
 
29
from mx.DateTime import now
 
30
import time
 
31
 
 
32
import netsvc
 
33
import pooler
 
34
 
 
35
from report.interface import report_rml
 
36
from report.interface import toxml
 
37
 
 
38
one_day = DateTime.RelativeDateTime(days=1)
 
39
month2name = [0,'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
 
40
 
 
41
def hour2str(h):
 
42
        hours = int(h)
 
43
        minutes = int(round((h - hours) * 60, 0))
 
44
        return '%02dh%02d' % (hours, minutes)
 
45
 
 
46
class report_custom(report_rml):
 
47
        def create_xml(self, cr, uid, ids, datas, context):
 
48
                service = netsvc.LocalService('object_proxy')
 
49
 
 
50
                month = DateTime.DateTime(datas['form']['year'], datas['form']['month'], 1)
 
51
                
 
52
                user_xml = ['<month>%s</month>' % month2name[month.month], '<year>%s</year>' % month.year]
 
53
                
 
54
                # Public holidays
 
55
                jf_sql = """select hol.date_from, hol.date_to from hr_holidays as hol, hr_holidays_status as stat
 
56
                                        where hol.holiday_status = stat.id and stat.name = 'Public holidays' """
 
57
                cr.execute(jf_sql)
 
58
                jfs = []
 
59
                jfs = [(DateTime.strptime(l['date_from'], '%Y-%m-%d %H:%M:%S'), DateTime.strptime(l['date_to'], '%Y-%m-%d %H:%M:%S')) for l in cr.dictfetchall()]
 
60
                
 
61
                for employee_id in ids:
 
62
                        emp = service.execute(cr.dbname, uid, 'hr.employee', 'read', [employee_id])[0]
 
63
                        stop, days_xml = False, []
 
64
                        user_repr = '''
 
65
                        <user>
 
66
                          <name>%s</name>
 
67
                          <regime>%s</regime>
 
68
                          <holiday>%s</holiday>
 
69
                          %%s
 
70
                        </user>
 
71
                        ''' % (toxml(emp['name']),emp['regime'],emp['holiday_max'])
 
72
                        today, tomor = month, month + one_day
 
73
                        while today.month == month.month:
 
74
                                #### Work hour calculation
 
75
                                sql = '''
 
76
                                select action, att.name
 
77
                                from hr_employee as emp inner join hr_attendance as att
 
78
                                     on emp.id = att.employee_id
 
79
                                where att.name between '%s' and '%s' and emp.id = %s
 
80
                                order by att.name
 
81
                                '''
 
82
                                cr.execute(sql, (today, tomor, employee_id))
 
83
                                attendences = cr.dictfetchall()
 
84
                                wh = 0
 
85
                                if attendences and attendences[0]['action'] == 'sign_out':
 
86
                                        attendences.insert(0, {'name': today.strftime('%Y-%m-%d %H:%M:%S'), 'action':'sign_in'})
 
87
                                if attendences and attendences[-1]['action'] == 'sign_in':
 
88
                                        attendences.append({'name' : tomor.strftime('%Y-%m-%d %H:%M:%S'), 'action':'sign_out'})
 
89
                                for att in attendences:
 
90
                                        dt = DateTime.strptime(att['name'], '%Y-%m-%d %H:%M:%S')
 
91
                                        if att['action'] == 'sign_out':
 
92
                                                wh += (dt - ldt).hours
 
93
                                        ldt = dt
 
94
 
 
95
                                #### Theoretical workhour calculation
 
96
                                sql = '''
 
97
                                select t.hour_from, t.hour_to
 
98
                                from hr_timesheet as t
 
99
                                         inner join (hr_timesheet_group as g inner join hr_timesheet_employee_rel as rel
 
100
                                                         on rel.tgroup_id = g.id and rel.emp_id = %s)
 
101
                                         on t.tgroup_id = g.id
 
102
                                where dayofweek = %s 
 
103
                                          and date_from = (select max(date_from) 
 
104
                                                                           from hr_timesheet inner join (hr_timesheet_employee_rel 
 
105
                                                                                                                                                inner join hr_timesheet_group 
 
106
                                                                                                                                                on hr_timesheet_group.id = hr_timesheet_employee_rel.tgroup_id
 
107
                                                                                                                                                        and hr_timesheet_employee_rel.emp_id = %s)
 
108
                                                                                                                 on hr_timesheet.tgroup_id = hr_timesheet_group.id
 
109
                                                                           where dayofweek = %s and date_from <= '%s') 
 
110
                                order by date_from desc
 
111
                                '''
 
112
                                isPH = False
 
113
                                for jf_start, jf_end in jfs:
 
114
                                        if jf_start <= today <= jf_end:
 
115
                                                isPH = True
 
116
                                                break
 
117
                                if isPH:
 
118
                                        twh = 0
 
119
                                else:
 
120
                                        cr.execute(sql, (emp['id'], today.day_of_week, emp['id'], today.day_of_week, today))
 
121
                                        ths = cr.dictfetchall()
 
122
                                        twh = reduce(lambda x,y:x+(DateTime.strptime(y['hour_to'], '%H:%M:%S') - DateTime.strptime(y['hour_from'], '%H:%M:%S')).hours,ths, 0)
 
123
 
 
124
                                #### Holiday calculation
 
125
                                hh = 0
 
126
                                sql = '''
 
127
                                select hol.date_from, hol.date_to, stat.name as status
 
128
                                from hr_employee as emp 
 
129
                                         inner join (hr_holidays as hol left join hr_holidays_status as stat
 
130
                                                     on hol.holiday_status = stat.id)
 
131
                                     on emp.id = hol.employee_id
 
132
                                where ((hol.date_from <= '%s' and hol.date_to >= '%s') 
 
133
                                       or (hol.date_from < '%s' and hol.date_to >= '%s')
 
134
                                           or (hol.date_from > '%s' and hol.date_to < '%s'))
 
135
                                          and emp.id = %s
 
136
                                order by hol.date_from
 
137
                                '''
 
138
                                cr.execute(sql, (today, today, tomor, tomor, today, tomor, employee_id))
 
139
                                holidays = cr.dictfetchall()
 
140
                                for hol in holidays:
 
141
                                        df = DateTime.strptime(hol['date_from'], '%Y-%m-%d %H:%M:%S')
 
142
                                        dt = DateTime.strptime(hol['date_to'], '%Y-%m-%d %H:%M:%S')
 
143
                                        if (df.year, df.month, df.day) <= (today.year, today.month, today.day) <= (dt.year, dt.month, dt.day):
 
144
                                                if (df.year, df.month, df.day) == (dt.year, dt.month, dt.day):
 
145
                                                        hh += (dt - df).hours
 
146
                                                else:
 
147
                                                        hh = twh
 
148
                                
 
149
                                # Week xml representation
 
150
                                twh, wh, hh = map(hour2str, (twh, wh, hh))
 
151
                                today_xml = '<day num="%s"><th>%s</th><wh>%s</wh><hh>%s</hh></day>' % ((today - month).days+1, twh, wh, hh)
 
152
                                days_xml.append(today_xml)
 
153
                                today, tomor = tomor, tomor + one_day
 
154
                                
 
155
                        user_xml.append(user_repr % '\n'.join(days_xml))
 
156
                
 
157
                xml = '''<?xml version="1.0" encoding="UTF-8" ?>
 
158
                <report>
 
159
                %s
 
160
                </report>
 
161
                ''' % '\n'.join(user_xml)
 
162
 
 
163
                return xml
 
164
 
 
165
report_custom('report.hr.timesheet.bymonth', 'hr.employee', '', 'addons/hr/report/bymonth.xsl')
 
166
# vim:noexpandtab:tw=0