[FIX] hr_attendance : timesheet - sign in - out : must not allow overlaps

bzr revid: mdi@tinyerp.com-20111114122823-7ehd1axt0l0b2euz
This commit is contained in:
Divyesh Makwana (Open ERP) 2011-11-14 17:58:23 +05:30
parent 7cc8e12c10
commit dde556db2e
1 changed files with 15 additions and 13 deletions

View File

@ -64,19 +64,21 @@ class hr_attendance(osv.osv):
}
def _altern_si_so(self, cr, uid, ids, context=None):
for id in ids:
sql = '''
SELECT action, name
FROM hr_attendance AS att
WHERE employee_id = (SELECT employee_id FROM hr_attendance WHERE id=%s)
AND action IN ('sign_in','sign_out')
AND name <= (SELECT name FROM hr_attendance WHERE id=%s)
ORDER BY name DESC
LIMIT 2 '''
cr.execute(sql,(id,id))
atts = cr.fetchall()
if not ((len(atts)==1 and atts[0][0] == 'sign_in') or (len(atts)==2 and atts[0][0] != atts[1][0] and atts[0][1] != atts[1][1])):
return False
current_attendance_data = self.browse(cr, uid, ids, context=context)[0]
obj_attendance_ids = self.search(cr, uid, [('employee_id', '=', current_attendance_data.employee_id.id)], context=context)
obj_attendance_ids.remove(ids[0])
hr_attendance_data = self.browse(cr, uid, obj_attendance_ids, context=context)
for old_attendance in hr_attendance_data:
if old_attendance.employee_id.id == current_attendance_data['employee_id'].id:
if old_attendance.action == current_attendance_data['action']:
return False
elif old_attendance.name >= current_attendance_data['name']:
return False
else:
return True
if current_attendance_data['action'] == 'sign_out':
return False
return True
_constraints = [(_altern_si_so, 'Error: Sign in (resp. Sign out) must follow Sign out (resp. Sign in)', ['action'])]