[FIX] hr_timesheet_sheet: forbid to record an attendance in a submitted timesheet (opw 592632)
bzr revid: mat@openerp.com-20140425100856-lcpgyjdk4u632bws
This commit is contained in:
commit
bb85882322
|
@ -20,10 +20,11 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
|
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp import netsvc
|
from openerp import netsvc
|
||||||
|
|
||||||
|
@ -390,18 +391,22 @@ class hr_attendance(osv.osv):
|
||||||
attendance_ids.extend([row[0] for row in cr.fetchall()])
|
attendance_ids.extend([row[0] for row in cr.fetchall()])
|
||||||
return attendance_ids
|
return attendance_ids
|
||||||
|
|
||||||
|
def _get_current_sheet(self, cr, uid, employee_id, date=False, context=None):
|
||||||
|
if not date:
|
||||||
|
date = time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||||
|
# ending date with no time to avoid timesheet with early date_to
|
||||||
|
date_to = date[0:10]+' 00:00:00'
|
||||||
|
# limit=1 because only one sheet possible for an employee between 2 dates
|
||||||
|
sheet_ids = self.pool.get('hr_timesheet_sheet.sheet').search(cr, uid, [
|
||||||
|
('date_to', '>=', date_to), ('date_from', '<=', date),
|
||||||
|
('employee_id', '=', employee_id)
|
||||||
|
], limit=1, context=context)
|
||||||
|
return sheet_ids and sheet_ids[0] or False
|
||||||
|
|
||||||
def _sheet(self, cursor, user, ids, name, args, context=None):
|
def _sheet(self, cursor, user, ids, name, args, context=None):
|
||||||
sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
|
|
||||||
res = {}.fromkeys(ids, False)
|
res = {}.fromkeys(ids, False)
|
||||||
for attendance in self.browse(cursor, user, ids, context=context):
|
for attendance in self.browse(cursor, user, ids, context=context):
|
||||||
date_to = datetime.strftime(datetime.strptime(attendance.name[0:10], '%Y-%m-%d'), '%Y-%m-%d %H:%M:%S')
|
res[attendance.id] = self._get_current_sheet(cursor, user, attendance.employee_id.id, attendance.name, context=context)
|
||||||
sheet_ids = sheet_obj.search(cursor, user,
|
|
||||||
[('date_to', '>=', date_to), ('date_from', '<=', attendance.name),
|
|
||||||
('employee_id', '=', attendance.employee_id.id)],
|
|
||||||
context=context)
|
|
||||||
if sheet_ids:
|
|
||||||
# [0] because only one sheet possible for an employee between 2 dates
|
|
||||||
res[attendance.id] = sheet_obj.name_get(cursor, user, sheet_ids, context=context)[0]
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
|
@ -420,16 +425,15 @@ class hr_attendance(osv.osv):
|
||||||
def create(self, cr, uid, vals, context=None):
|
def create(self, cr, uid, vals, context=None):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
if 'sheet_id' in context:
|
|
||||||
ts = self.pool.get('hr_timesheet_sheet.sheet').browse(cr, uid, context['sheet_id'], context=context)
|
sheet_id = context.get('sheet_id') or self._get_current_sheet(cr, uid, vals.get('employee_id'), vals.get('name'), context=context)
|
||||||
|
if sheet_id:
|
||||||
|
ts = self.pool.get('hr_timesheet_sheet.sheet').browse(cr, uid, sheet_id, context=context)
|
||||||
if ts.state not in ('draft', 'new'):
|
if ts.state not in ('draft', 'new'):
|
||||||
raise osv.except_osv(_('Error!'), _('You cannot modify an entry in a confirmed timesheet.'))
|
raise osv.except_osv(_('Error!'), _('You can not enter an attendance in a submitted timesheet. Ask your manager to reset it before adding attendance.'))
|
||||||
res = super(hr_attendance,self).create(cr, uid, vals, context=context)
|
elif ts.date_from > vals.get('name') or ts.date_to < vals.get('name'):
|
||||||
if 'sheet_id' in context:
|
raise osv.except_osv(_('User Error!'), _('You can not enter an attendance date outside the current timesheet dates.'))
|
||||||
if context['sheet_id'] != self.browse(cr, uid, res, context=context).sheet_id.id:
|
return super(hr_attendance,self).create(cr, uid, vals, context=context)
|
||||||
raise osv.except_osv(_('User Error!'), _('You cannot enter an attendance ' \
|
|
||||||
'date outside the current timesheet dates.'))
|
|
||||||
return res
|
|
||||||
|
|
||||||
def unlink(self, cr, uid, ids, *args, **kwargs):
|
def unlink(self, cr, uid, ids, *args, **kwargs):
|
||||||
if isinstance(ids, (int, long)):
|
if isinstance(ids, (int, long)):
|
||||||
|
|
Loading…
Reference in New Issue