~sebastien.beau/hr-timesheet/hr-timesheet-fix-project-id-not-required

« back to all changes in this revision

Viewing changes to hr_attendance_analysis/wizard/print_calendar_report.py

  • Committer: Guewen Baconnier
  • Author(s): Laetitia Gangloff (Acsone)
  • Date: 2014-03-07 14:28:50 UTC
  • mfrom: (57.3.2 hr-timesheet)
  • Revision ID: guewen.baconnier@camptocamp.com-20140307142850-zj19igde0kb7cf25
hr_attendance_analysis: externalise contract calendar

In order to be able to use another calendar in some extension modules:
- rename get_active_contracts to get_reference_calendar and return the possible calendar attached to retrieve contract
- update code to take account of this change (_get_attendance_duration and print_calendar method)
- externalise store part of column in _store_rules to easily extends it

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
        'year': lambda * a: datetime.now().year,
56
56
        'from_date': lambda * a: (datetime.now()-timedelta(30)).strftime('%Y-%m-%d'),
57
57
        'to_date': lambda * a: datetime.now().strftime('%Y-%m-%d'),
58
 
        'employee_ids': lambda s, cr, uid, c: s.pool.get('hr.employee').search(cr, uid, []),        
 
58
        'employee_ids': lambda s, cr, uid, c: s.pool.get('hr.employee').search(cr, uid, [], context=None),
59
59
    }
60
60
 
61
61
    _name = "attendance_analysis.wizard.calendar_report"
74
74
        if context is None:
75
75
            context = {}
76
76
        attendance_pool = self.pool.get('hr.attendance')
77
 
        contract_pool = self.pool.get('hr.contract')
78
77
        holidays_pool = self.pool.get('hr.holidays')
79
78
 
80
79
        days_by_employee = {}
81
80
        
82
 
        form = self.read(cr, uid, ids)[0]
 
81
        form = self.read(cr, uid, ids, context=context)[0]
83
82
        from_date = datetime.strptime(form['from_date'], '%Y-%m-%d')
84
83
        to_date = datetime.strptime(form['to_date'], '%Y-%m-%d')
85
84
        if from_date > to_date:
97
96
                current_total_attendances = 0.0
98
97
                current_total_overtime = 0.0
99
98
                current_total_leaves = 0.0
100
 
                current_total_due = 24.0 # If contract is not specified: working days = 24/7
 
99
                current_total_due = 24.0 # If calendar is not specified: working days = 24/7
101
100
                current_total_inside_calendar = 0.0
102
101
                str_current_date = current_date.strftime('%Y-%m-%d')
103
102
                days_by_employee[employee_id][str_current_date] = {
121
120
                    ('name','>=',str_current_date_beginning),
122
121
                    ('name','<=',str_current_date_end),
123
122
                    ('action','=','sign_in'),
124
 
                    ])
 
123
                    ], context=context)
125
124
                # computing attendance totals
126
 
                for attendance in attendance_pool.browse(cr, uid, attendance_ids):
 
125
                for attendance in attendance_pool.browse(cr, uid, attendance_ids, context=context):
127
126
                    current_total_attendances = attendance_pool.time_sum(
128
127
                        current_total_attendances,attendance.duration)
129
128
                    current_total_overtime = attendance_pool.time_sum(current_total_overtime,
135
134
                #printing up to 4 attendances
136
135
                if len(attendance_ids) < 5:
137
136
                    count = 1
138
 
                    for attendance in sorted(attendance_pool.browse(cr, uid, attendance_ids),
 
137
                    for attendance in sorted(attendance_pool.browse(cr, uid, attendance_ids, context=context),
139
138
                        key=lambda x: x['name']):
140
139
                        days_by_employee[employee_id][str_current_date][
141
140
                            'signin_'+str(count)] = attendance.name[11:16]
152
151
                    'overtime'
153
152
                    ] = current_total_overtime
154
153
                
155
 
                active_contract_ids = attendance_pool.get_active_contracts(
156
 
                    cr, uid, int(employee_id), date=str_current_date)
 
154
                reference_calendar = attendance_pool.get_reference_calendar(
 
155
                    cr, uid, int(employee_id), date=str_current_date, context=context)
157
156
                # computing due total
158
 
                if active_contract_ids:
159
 
                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])
160
 
                    if contract.working_hours and contract.working_hours.attendance_ids:
 
157
                if reference_calendar:
 
158
                    if reference_calendar.attendance_ids:
161
159
                        current_total_due = 0.0
162
 
                        for calendar_attendance in contract.working_hours.attendance_ids:
 
160
                        for calendar_attendance in reference.attendance_ids:
163
161
                            if ((
164
162
                                not calendar_attendance.dayofweek
165
163
                                or int(calendar_attendance.dayofweek) == current_date.weekday()
200
198
                    ('date_to', '>', str_current_date_end),
201
199
                    ('state', '=', 'validate'),
202
200
                    ('employee_id', '=', int(employee_id)),
203
 
                    ])
204
 
                for holiday in holidays_pool.browse(cr, uid, holidays_ids):
 
201
                    ], context=context)
 
202
                for holiday in holidays_pool.browse(cr, uid, holidays_ids, context=context):
205
203
                    date_from = datetime.strptime(holiday.date_from, '%Y-%m-%d %H:%M:%S')
206
204
                    date_to = datetime.strptime(holiday.date_to, '%Y-%m-%d %H:%M:%S')
207
205
                    # if beginned before today
230
228
                        ] = attendance_pool.time_difference(
231
229
                        current_total_inside_calendar, due_minus_leaves)
232
230
 
233
 
                if active_contract_ids:
234
 
                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])
235
 
                    if contract.working_hours and contract.working_hours.leave_rounding:
236
 
                        float_rounding = float(contract.working_hours.leave_rounding)
 
231
                if reference_calendar:
 
232
                    if reference_calendar.leave_rounding:
 
233
                        float_rounding = float(reference_calendar.leave_rounding)
237
234
                        days_by_employee[employee_id][str_current_date][
238
235
                            'negative'
239
236
                            ] = math.floor(
272
269
                    days_by_employee[employee_id][str_date]['due'])
273
270
                
274
271
                # computing overtime types
275
 
                active_contract_ids = attendance_pool.get_active_contracts(
276
 
                    cr, uid, int(employee_id), date=str_date)
277
 
                if active_contract_ids:
278
 
                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])                
279
 
                    if contract.working_hours and contract.working_hours.overtime_type_ids:
 
272
                reference_calendar = attendance_pool.get_reference_calendar(
 
273
                    cr, uid, int(employee_id), date=str_date, context=context)
 
274
                if reference_calendar:
 
275
                    if reference_calendar.overtime_type_ids:
280
276
                        sorted_types = sorted(
281
 
                            contract.working_hours.overtime_type_ids,
 
277
                            reference_calendar.overtime_type_ids,
282
278
                            key=lambda k: k.sequence)
283
279
                        current_overtime = days_by_employee[employee_id][
284
280
                            str_date]['overtime']