This commit is contained in:
root 2022-08-30 09:43:37 +05:30
commit 44ba69976c
7 changed files with 95 additions and 80 deletions

View File

@ -26,7 +26,9 @@ class AccountAnalyticLine(models.Model):
return res
def _domain_project_id(self):
domain = [('allow_timesheets', '=', True), ('is_sub_project', '=', False)]
today = fields.Date.today()
#domain = [('allow_timesheets', '=', True), ('is_sub_project', '=', False)]
domain = [('allow_timesheets', '=', True), ('is_sub_project', '=', False),('date', '>=', today),('date_start', '<=', today)]
if not self.user_has_groups('hr_timesheet.group_timesheet_manager'):
return expression.AND([domain,
['|', ('privacy_visibility', '!=', 'followers'),
@ -77,21 +79,26 @@ class AccountAnalyticLine(models.Model):
def _onchange_employee_id(self):
project_manager_grp = self.env.ref('project.group_project_manager').users.ids
project_user_grp = self.env.ref('project.group_project_user').users.ids
today = fields.Date.today()
domain = []
if self.employee_id and self.employee_id.user_id and self.employee_id.user_id.id in project_manager_grp:
all_projects = self.env['project.project'].search([('allow_timesheets', '=', True),
('is_sub_project', '=', False)]).ids
('is_sub_project', '=', False),
('date', '>=', today),('date_start', '<=', today)]).ids
domain = [('id', 'in', all_projects)]
else:
if self.employee_id and self.employee_id.user_id and self.employee_id.user_id.id in project_user_grp:
manager_id = self.env['project.project'].search(
[('user_id', '=', self.employee_id.user_id.id), ('allow_timesheets', '=', True),
('date', '>=', today),('date_start', '<=', today),
('is_sub_project', '=', False)]).ids
emp_project_ids = self.env['project.project'].search(
[('privacy_visibility', 'in', ('employees', 'portal')), ('allow_timesheets', '=', True),
('date', '>=', today),('date_start', '<=', today),
('is_sub_project', '=', False)]).ids
project_ids = self.env['project.project'].search(
[('privacy_visibility', '=', 'followers'), ('allow_timesheets', '=', True),
('date', '>=', today),('date_start', '<=', today),
('is_sub_project', '=', False),
('allowed_internal_user_ids', 'in', self.employee_id.user_id.id)]).ids
consul_ids = self.env['project.sale.line.employee.map'].search([('employee_id', '=', self.employee_id.id)])

View File

@ -160,8 +160,8 @@
</xpath>
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="partner_id" string="Client" required="0" groups="project.group_project_manager"/>
<field name="date_start" groups="project.group_project_manager"/>
<field name="date" groups="project.group_project_manager"/>
<field name="date_start" groups="project.group_project_manager" required="1"/>
<field name="date" groups="project.group_project_manager" required="1"/>
</xpath>
<!-- <xpath expr="//page[@name='settings']" position="after">
<page string="Consultant Allocation" groups="project.group_project_manager"

View File

@ -1,4 +1,4 @@
from odoo import api, fields, models
from odoo import api, fields, models, _
from odoo.exceptions import UserError, AccessError, ValidationError
from datetime import datetime, timedelta
from dateutil import relativedelta
@ -25,7 +25,6 @@ class ProjectResourceWizard(models.TransientModel):
project_id = fields.Many2one('project.project')
add_project_resource = fields.One2many('project.resource.line', 'wizard_id')
def action_add_project_lines(self):
record = self.env['project.sale.line.employee.map']
for val in self.add_project_resource:
@ -56,6 +55,7 @@ class ProjectResourceLine(models.Model):
wizard_id = fields.Integer()
project_id = fields.Many2one('project.project')
employee_id = fields.Many2one('hr.employee')
employee_ids = fields.Many2many('hr.employee', compute='_compute_allow_employee_ids')
role = fields.Selection([('Manager', 'Manager'),('Employee', 'Employee'), ], string="Role", default="Employee")
start_date = fields.Date()
end_date = fields.Date()
@ -66,6 +66,19 @@ class ProjectResourceLine(models.Model):
hour_distribution = fields.Selection(related='project_id.hour_distribution')
distribution_per = fields.Float("%")
@api.depends('employee_id')
def _compute_allow_employee_ids(self):
for rec in self:
if rec.project_id.privacy_visibility == 'followers':
users = rec.project_id.allowed_internal_user_ids
employees = self.env['hr.employee'].search([('user_id', 'in', users.ids)]).ids
elif rec.project_id.privacy_visibility == 'employees':
employees = self.env['hr.employee'].search([]).ids
else:
portal_users = rec.project_id.allowed_portal_user_ids
employees = self.env['hr.employee'].search([]).ids + portal_users.ids
rec.employee_ids = employees
@api.onchange('employee_id')
def onchange_employee_price(self):
if self.employee_id:
@ -85,3 +98,13 @@ class ProjectResourceLine(models.Model):
def onchange_start_date(self):
if self.start_date:
self.end_date = self.start_date + relativedelta.relativedelta(months=1) - relativedelta.relativedelta(days=1)
if self.start_date and self.end_date and (self.end_date > self.start_date):
raise AccessError('End date could not be greater than start date')
@api.onchange('start_date', 'end_date')
def _onchange_start_date(self):
if self.project_id:
if self.start_date and not self.project_id.date_start <= self.start_date <= self.project_id.date:
raise AccessError(_('Allocation Start date must be between %s to %s') % (self.project_id.date_start,self.project_id.date))
if self.end_date and not (self.project_id.date_start <= self.end_date <= self.project_id.date):
raise AccessError(_('Allocation Start date must be between %s to %s') % (self.project_id.date_start,self.project_id.date))

View File

@ -10,7 +10,8 @@
</group>
<field name="add_project_resource" context="{'default_project_id': active_id}">
<tree editable="bottom">
<field name="employee_id"/>
<field name="employee_id" domain="[('id', 'in', employee_ids)]"/>
<field name="employee_ids" widget="many2many_tags" invisible="1"/>
<field name="role"/>
<field name="start_date" required="1"/>
<field name="end_date"/>

View File

@ -11,6 +11,7 @@ class EmployeeInherit(models.Model):
allow_to_create = fields.Selection(selection=[('always', 'Always'), ('specific', 'Specific')] )
permission_history = fields.One2many(comodel_name="timesheet.block.history", inverse_name="employee_id",
string="History", required=False )
class EmployeePublicInherit(models.Model):
_inherit = 'hr.employee.public'
@ -37,90 +38,71 @@ class TimehseetBlock(models.Model):
@api.model
def create(self, values):
current_date = datetime.today().date()
config = self.env['ir.config_parameter'].sudo()
config_days_limit = float(config.get_param('timesheet_block.timesheet_edit_create_limit'))
entry_date = datetime.strptime(values['start_datetime'],"%Y-%m-%d %H:%M:%S").date()
months_diff = current_date.month - entry_date.month
employee_object = self.env['hr.employee'].sudo().search([('user_id', '=', self.env.uid)])
days = (current_date - entry_date).days
employee_object = self.env['hr.employee'].search([('user_id', '=', self.env.uid)])
project_manager_group = self.env.ref('hr_timesheet.group_timesheet_manager')
config = self.env['ir.config_parameter'].sudo()
config_days_limit = float(config.get_param('timesheet_block.timesheet_edit_create_limit'))
if entry_date <= current_date:
if self.env.uid not in project_manager_group.users.ids:
if employee_object.allow_to_create == False:
if months_diff == 0:
res = super(TimehseetBlock, self).create(values)
return res
if self.env.uid not in project_manager_group.users.ids:
if days >= config_days_limit:
permission_list = []
if employee_object.allow_to_create != 'always' or employee_object.allow_to_create == False:
permission_object = employee_object.permission_history.search([('permission_type', '=', 'create'),('employee_id', '=', employee_object.id)])
for permission in permission_object:
permission_list.append(permission.date)
permission_untill = False
if len(permission_list) != 0:
permission_untill = datetime.strptime(str(max(permission_list)), "%Y-%m-%d").date()
if permission_untill:
if permission_untill < entry_date:
raise AccessError('You can not create the backdate entry please contact to HR')
else:
raise AccessError('You can not create your backdate entry')
elif employee_object.allow_to_create == 'always':
res = super(TimehseetBlock, self).create(values)
return res
else:
if months_diff == 0:
res = super(TimehseetBlock, self).create(values)
return res
if months_diff == 1:
if current_date.day <= config_days_limit:
res = super(TimehseetBlock, self).create(values)
return res
else:
raise AccessError('You can not create your backdate entry ')
else:
raise AccessError('You can not create your backdate entry ')
else:
res = super(TimehseetBlock, self).create(values)
return res
else:
raise AccessError('You can not create future entry')
raise AccessError('You can not create the backdate entry please contact to HR')
return super(TimehseetBlock, self).create(values)
def write(self, values):
def write(self, record):
current_date = datetime.today().date()
if 'date' in values:
entry_date = datetime.strptime(values['start_datetime'],"%Y-%m-%d %H:%M:%S").date()
else:
res_date = str(self.date).split('.', 1)[0]
entry_date = datetime.strptime(str(res_date), '%Y-%m-%d').date()
months_diff = current_date.month - entry_date.month
employee_object = self.env['hr.employee'].sudo().search([('user_id', '=', self.env.uid)])
project_manager_group = self.env.ref('hr_timesheet.group_timesheet_manager')
config = self.env['ir.config_parameter'].sudo()
config_days_limit = float(config.get_param('timesheet_block.timesheet_edit_create_limit'))
if entry_date <= current_date:
if self.env.uid not in project_manager_group.users.ids:
if employee_object.allow_to_edit == False:
if months_diff == 0:
res = super(TimehseetBlock, self).write(values)
return res
else:
raise AccessError('You can not edit your backdate entry ')
elif employee_object.allow_to_edit == 'always':
res = super(TimehseetBlock, self).write(values)
return res
else:
if months_diff == 0:
res = super(TimehseetBlock, self).write(values)
return res
if months_diff == 1:
if current_date.day <= config_days_limit:
res = super(TimehseetBlock, self).write(values)
return res
if 'start_datetime' in record or 'end_datetime' in record or 'project_id' in record or 'sub_project' in record or 'task_id' in record or 'description' in record:
if 'start_datetime' in record:
entry_date = datetime.strptime(record['start_datetime'],"%Y-%m-%d %H:%M:%S").date()
else:
res_date = str(self.start_datetime).split('.', 1)[0]
entry_date = datetime.strptime(str(res_date), '%Y-%m-%d %H:%M:%S').date()
if current_date != entry_date:
employee_object = self.env['hr.employee'].search([('user_id', '=', self.env.uid)])
if employee_object.allow_to_edit != 'always' or employee_object.allow_to_edit == False:
permission_list = []
permission_object = employee_object.permission_history.search([('permission_type', '=', 'edit'),('employee_id', '=', employee_object.id)])
for permission in permission_object:
permission_list.append(permission.date)
permission_untill =False
if len(permission_list) != 0:
permission_untill = datetime.strptime(str(max(permission_list)), "%Y-%m-%d").date()
# project = False
if self.user_id.id == self.env.uid:
if permission_untill:
if permission_untill < entry_date:
raise AccessError(
'You can not edit your backdate entry please connect to HR/Department Head/Project Manager')
else:
raise AccessError(
'You can not edit your backdate entry ')
else:
raise AccessError('You can not edit your backdate entry ')
else:
res = super(TimehseetBlock, self).write(values)
return res
else:
raise AccessError('You can not create future entry')
'You can not edit your backdate entry please connect to HR/Department Head/Project Manager')
return super(TimehseetBlock, self).write(record)
@api.onchange('end_datetime')
@api.onchange('end_datetime' ,'start_datetime')
def _onchange_end_datetime(self):
if self.end_datetime:
current_date = datetime.today().date()
end_date = datetime.strptime(str(self.end_datetime), "%Y-%m-%d %H:%M:%S").date()
if end_date > current_date:
raise AccessError('End date cannot be a future date!')
if self.end_datetime and self.start_datetime:
end_date = datetime.strptime(str(self.end_datetime), "%Y-%m-%d %H:%M:%S").date()
start_date = datetime.strptime(str(self.start_datetime), "%Y-%m-%d %H:%M:%S").date()
if start_date > end_date:
raise AccessError('End date should be greater than start date!')

View File

@ -1,2 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_timesheet_permission_history_user,access.timesheet.block.history.user,model_timesheet_block_history,,1,1,0,0
access_timesheet_permission_history_manager,access.timesheet.block.history.manager,model_timesheet_block_history,hr_timesheet.group_timesheet_manager,1,1,1,1
access_timesheet_permission_history_user,access.timesheet.block.history.user,model_timesheet_block_history,hr_timesheet.group_hr_timesheet_user,1,1,1,0
access_back_date_assign_user,access.back.date.assign.user,model_back_date_assign,hr_timesheet.group_timesheet_manager,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_timesheet_permission_history_user access_timesheet_permission_history_manager access.timesheet.block.history.user access.timesheet.block.history.manager model_timesheet_block_history hr_timesheet.group_timesheet_manager 1 1 0 1 0 1
3 access_timesheet_permission_history_user access.timesheet.block.history.user model_timesheet_block_history hr_timesheet.group_hr_timesheet_user 1 1 1 0
4 access_back_date_assign_user access.back.date.assign.user model_back_date_assign hr_timesheet.group_timesheet_manager 1 1 1 1

View File

@ -20,7 +20,7 @@
type="action" groups="hr.group_hr_manager"
class="oe_highlight"/>
<group/>
<field name="permission_history" readonly="1">
<field name="permission_history" readonly="1" groups="hr_timesheet.group_timesheet_manager">
<tree editable="bottom">
<field name="date"/>
<field name="reason"/>