~openerp-commiter/openobject-addons/trunk-extra-addons

« back to all changes in this revision

Viewing changes to payroll/payroll-4.1.1/report/bymonth.py

  • Committer: Fabien Pinckaers
  • Date: 2007-10-22 15:43:19 UTC
  • Revision ID: fp@tinyerp.com-0e3856f5497dc052a67d6cb8d3210379d82d4b13
Portal: Analytic Package

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