CWF Timesheet Access rights
This commit is contained in:
parent
11066ba9c1
commit
62df996ae4
|
|
@ -7,6 +7,7 @@
|
|||
'depends': ['hr_attendance_extended','web', 'mail', 'base','hr_emp_dashboard','hr_employee_extended'],
|
||||
'data': [
|
||||
# 'views/timesheet_form.xml',
|
||||
'security/security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'views/timesheet_view.xml',
|
||||
'views/timesheet_weekly_view.xml',
|
||||
|
|
|
|||
|
|
@ -1,109 +1,45 @@
|
|||
<odoo>
|
||||
<data noupdate="0">
|
||||
<record id="email_template_timesheet_update" model="mail.template">
|
||||
<field name="name">Timesheet Update Reminder</field>
|
||||
<field name="email_from">${(user.email or '')}</field>
|
||||
<field name="subject">Reminder: Update Your Weekly Timesheet</field>
|
||||
<field name="body_html" type="html"> <style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f6f9;
|
||||
}
|
||||
.email-container {
|
||||
width: 100%;
|
||||
background: linear-gradient(45deg, #3498db, #2c3e50);
|
||||
padding: 40px 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.email-content {
|
||||
background-color: white;
|
||||
border-radius: 12px;
|
||||
width: 80%;
|
||||
max-width: 700px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.header h1 {
|
||||
color: #3498db;
|
||||
font-size: 32px;
|
||||
margin: 0;
|
||||
}
|
||||
.greeting {
|
||||
font-size: 18px;
|
||||
color: #2c3e50;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.message {
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
line-height: 1.5;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.cta-button {
|
||||
display: inline-block;
|
||||
padding: 12px 25px;
|
||||
background-color: #3498db;
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
.cta-button:hover {
|
||||
background-color: #2980b9;
|
||||
}
|
||||
.footer {
|
||||
font-size: 14px;
|
||||
color: #7f8c8d;
|
||||
margin-top: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
.footer a {
|
||||
color: #3498db;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="email-container">
|
||||
<div class="email-content">
|
||||
<div class="header">
|
||||
<h1>Timesheet Reminder</h1>
|
||||
</div>
|
||||
<div class="greeting">
|
||||
<p>Dear <strong t-out="object.employee_id.name"/> ,</p>
|
||||
</div>
|
||||
<div class="message">
|
||||
<p>
|
||||
I hope this message finds you in good spirits. I would like to remind you to please update your weekly timesheet for the period from <strong t-out="object.week_id.week_start_date"/> to <strong t-out="object.week_id.week_end_date"/>.
|
||||
Timely updates are crucial for maintaining accurate records and ensuring smooth processing.
|
||||
</p>
|
||||
<p>
|
||||
To make things easier, you can use the link below to update your timesheet:
|
||||
</p>
|
||||
<a href="https://ftprotech.in/odoo/action-261" class="cta-button" target="_blank">Update Timesheet</a>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<p>
|
||||
Thank you for your attention.<br/>
|
||||
Best regards,<br/>
|
||||
<strong>Fast Track Project Pvt Ltd.</strong>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://ftprotech.in/" target="_blank">Visit our site</a> for more information.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</field>
|
||||
<field name="model_id" ref="model_cwf_timesheet_line"/> <!-- Ensure this line references the correct model -->
|
||||
</record>
|
||||
<record id="email_template_timesheet_weekly_update" model="mail.template">
|
||||
<field name="name">Timesheet Update Reminder</field>
|
||||
<field name="model_id" ref="cwf_timesheet.model_cwf_weekly_timesheet"/>
|
||||
<field name="email_from">{{ user.email_formatted }}</field>
|
||||
<field name="email_to">{{ object.employee_id.user_id.email }}</field>
|
||||
<field name="subject">Reminder: Update Your Weekly Timesheet</field>
|
||||
<field name="description">
|
||||
Reminder to employee to update their weekly timesheet.
|
||||
</field>
|
||||
<field name="body_html" type="html">
|
||||
<p style="margin: 0px; padding: 0px; font-size: 13px;">
|
||||
Dear <t t-esc="ctx['employee_name']">Employee</t>,
|
||||
<br/>
|
||||
<br/>
|
||||
I hope this message finds you in good spirits. I would like to remind you to please update your weekly timesheet for the period from
|
||||
<strong>
|
||||
<t t-esc="ctx['week_from']"/>
|
||||
</strong>
|
||||
to
|
||||
<strong>
|
||||
<t t-esc="ctx['week_to']"/>
|
||||
</strong>.
|
||||
Timely updates are crucial for maintaining accurate records and ensuring smooth processing.
|
||||
<br/>
|
||||
<br/>
|
||||
To make things easier, you can use the link below to update your timesheet:
|
||||
<br/>
|
||||
<a href="https://ftprotech.in/odoo/action-261" class="cta-button" target="_blank">Update Timesheet</a>
|
||||
<br/>
|
||||
<br/>
|
||||
Thank you for your attention.
|
||||
<br/>
|
||||
Best regards,
|
||||
<br/>
|
||||
<strong>Fast Track Project Pvt Ltd.</strong>
|
||||
<br/>
|
||||
<br/>
|
||||
<a href="https://ftprotech.in/" target="_blank">Visit our site</a> for more information.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
|
|||
|
|
@ -68,8 +68,14 @@ class CwfTimesheet(models.Model):
|
|||
lines = fields.One2many('cwf.timesheet.line','week_id')
|
||||
cwf_calendar_id = fields.Many2one('cwf.timesheet.calendar')
|
||||
|
||||
@api.depends('name','week_start_date','week_end_date')
|
||||
def _compute_display_name(self):
|
||||
for rec in self:
|
||||
rec.display_name = rec.name if not rec.week_start_date and rec.week_end_date else "%s (%s - %s)"%(rec.name,rec.week_start_date.strftime('%-d %b'), rec.week_end_date.strftime('%-d %b') )
|
||||
|
||||
|
||||
def send_timesheet_update_email(self):
|
||||
template = self.env.ref('cwf_timesheet.email_template_timesheet_update')
|
||||
template = self.env.ref('cwf_timesheet.email_template_timesheet_weekly_update')
|
||||
# Ensure that we have a valid employee email
|
||||
current_date = fields.Date.from_string(self.week_start_date)
|
||||
end_date = fields.Date.from_string(self.week_end_date)
|
||||
|
|
@ -85,12 +91,12 @@ class CwfTimesheet(models.Model):
|
|||
# Loop through each day of the week and create timesheet lines for each employee
|
||||
while current_date <= end_date:
|
||||
for employee in employees:
|
||||
existing_record = self.env['cwf.weekly.timesheet'].search([
|
||||
existing_record = self.env['cwf.weekly.timesheet'].sudo().search([
|
||||
('week_id', '=', self.id),
|
||||
('employee_id', '=', employee.id)
|
||||
], limit=1)
|
||||
if not existing_record:
|
||||
self.env['cwf.timesheet.line'].create({
|
||||
self.env['cwf.timesheet.line'].sudo().create({
|
||||
'week_id': self.id,
|
||||
'employee_id': employee.id,
|
||||
'week_day':current_date,
|
||||
|
|
@ -106,24 +112,27 @@ class CwfTimesheet(models.Model):
|
|||
'employee_id': employee.id,
|
||||
'status': 'draft'
|
||||
})
|
||||
else:
|
||||
weekly_timesheet = weekly_timesheet_exists
|
||||
|
||||
# Generate the URL for the newly created weekly_timesheet
|
||||
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
||||
record_url = f"{base_url}/web#id={weekly_timesheet.id}&view_type=form&model=cwf.weekly.timesheet"
|
||||
|
||||
weekly_timesheet.update_attendance()
|
||||
|
||||
if employee.work_email:
|
||||
if employee.work_email and weekly_timesheet:
|
||||
email_values = {
|
||||
'email_to': employee.work_email,
|
||||
'body_html': template.body_html.replace(
|
||||
'https://ftprotech.in/odoo/action-261',
|
||||
record_url
|
||||
), # Email body from template
|
||||
'email_to': employee.work_email, # Email body from template
|
||||
'subject': 'Timesheet Update Notification',
|
||||
}
|
||||
body_html = template.body_html.replace(
|
||||
'https://ftprotech.in/odoo/action-261',
|
||||
record_url
|
||||
),
|
||||
render_ctx = {'employee_name':weekly_timesheet.employee_id.name,'week_from':weekly_timesheet.week_id.week_start_date,'week_to':weekly_timesheet.week_id.week_end_date}
|
||||
|
||||
template.send_mail(self.id, email_values=email_values, force_send=True)
|
||||
|
||||
template.with_context(default_body_html=body_html,**render_ctx).send_mail(weekly_timesheet.id, email_values=email_values, force_send=True)
|
||||
|
||||
|
||||
class CwfWeeklyTimesheet(models.Model):
|
||||
|
|
@ -131,7 +140,16 @@ class CwfWeeklyTimesheet(models.Model):
|
|||
_description = "CWF Weekly Timesheet"
|
||||
_rec_name = 'employee_id'
|
||||
|
||||
week_id = fields.Many2one('cwf.timesheet', 'Week')
|
||||
|
||||
def _default_week_id(self):
|
||||
timesheet = False
|
||||
current_date = fields.Date.today()
|
||||
timesheet = self.env['cwf.timesheet'].sudo().search([('week_start_date','<=',current_date),('week_end_date','>=',current_date)],limit=1)
|
||||
if timesheet:
|
||||
return timesheet.id
|
||||
return timesheet
|
||||
|
||||
week_id = fields.Many2one('cwf.timesheet', 'Week', default=lambda self: self._default_week_id())
|
||||
employee_id = fields.Many2one('hr.employee', default=lambda self: self.env.user.employee_id.id)
|
||||
cwf_timesheet_lines = fields.One2many('cwf.timesheet.line' ,'weekly_timesheet')
|
||||
status = fields.Selection([('draft','Draft'),('submitted','Submitted')], default='draft')
|
||||
|
|
@ -141,6 +159,8 @@ class CwfWeeklyTimesheet(models.Model):
|
|||
@api.constrains('week_id', 'employee_id')
|
||||
def _check_unique_week_employee(self):
|
||||
for record in self:
|
||||
if record.week_id.week_start_date > fields.Date.today():
|
||||
raise ValidationError(_("You Can't select future week period"))
|
||||
# Search for existing records with the same week_id and employee_id
|
||||
existing_record = self.env['cwf.weekly.timesheet'].search([
|
||||
('week_id', '=', record.week_id.id),
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ access_cwf_timesheet_calendar,cwf_timesheet_calendar,model_cwf_timesheet_calenda
|
|||
access_cwf_timesheet_calendar_user,cwf_timesheet_calendar_user,model_cwf_timesheet_calendar,base.group_user,1,0,0,0
|
||||
|
||||
|
||||
access_cwf_timesheet_line_user,access.cwf.timesheet.line,model_cwf_timesheet_line,,1,1,1,1
|
||||
access_cwf_timesheet_line_manager,access.cwf.timesheet.line.manager,model_cwf_timesheet_line,hr_attendance.group_hr_attendance_manager,1,1,1,1
|
||||
access_cwf_timesheet_line_user,access.cwf.timesheet.line,model_cwf_timesheet_line,hr_employee_extended.group_external_user,1,1,1,1
|
||||
|
||||
access_cwf_weekly_timesheet_user,cwf.weekly.timesheet access,model_cwf_weekly_timesheet,,1,1,1,1
|
||||
|
||||
access_cwf_weekly_timesheet_manager,cwf.weekly.timesheet.manager access,model_cwf_weekly_timesheet,hr_attendance.group_hr_attendance_manager,1,1,1,1
|
||||
access_cwf_weekly_timesheet_user,cwf.weekly.timesheet access,model_cwf_weekly_timesheet,hr_employee_extended.group_external_user,1,1,1,0
|
||||
|
|
|
|||
|
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data noupdate="0">
|
||||
<record id="cwf_weekly_timesheet_user_rule" model="ir.rule">
|
||||
<field name="name">CWF Weekly Timesheet User Rule</field>
|
||||
<field ref="cwf_timesheet.model_cwf_weekly_timesheet" name="model_id"/>
|
||||
<field name="domain_force">[('employee_id.user_id.id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('hr_employee_extended.group_external_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="cwf_timesheet_line_user_rule" model="ir.rule">
|
||||
<field name="name">CWF Timesheet Line User Rule</field>
|
||||
<field ref="cwf_timesheet.model_cwf_timesheet_line" name="model_id"/>
|
||||
<field name="domain_force">[('employee_id.user_id.id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('hr_employee_extended.group_external_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="cwf_weekly_timesheet_manager_rule" model="ir.rule">
|
||||
<field name="name">CWF Weekly Timesheet manager Rule</field>
|
||||
<field ref="cwf_timesheet.model_cwf_weekly_timesheet" name="model_id"/>
|
||||
<field name="domain_force">['|',('employee_id.user_id.id','!=',user.id),('employee_id.user_id.id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('hr_attendance.group_hr_attendance_manager'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="cwf_timesheet_line_manager_rule" model="ir.rule">
|
||||
<field name="name">CWF Timesheet Line manager Rule</field>
|
||||
<field ref="cwf_timesheet.model_cwf_timesheet_line" name="model_id"/>
|
||||
<field name="domain_force">['|',('employee_id.user_id.id','!=',user.id),('employee_id.user_id.id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('hr_attendance.group_hr_attendance_manager'))]"/>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -43,7 +43,7 @@
|
|||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_timesheet_calendar_form" name="CWF Timesheet Calendar" parent="hr_attendance_extended.menu_attendance_attendance" action="cwf_timesheet.action_cwf_timesheet_calendar"/>
|
||||
<menuitem id="menu_timesheet_calendar_form" name="CWF Timesheet Calendar" parent="hr_attendance_extended.menu_attendance_attendance" action="cwf_timesheet.action_cwf_timesheet_calendar" groups="hr_employee_extended.group_external_user,hr_attendance.group_hr_attendance_manager"/>
|
||||
|
||||
|
||||
|
||||
|
|
@ -71,7 +71,17 @@
|
|||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_timesheet_list" model="ir.ui.view">
|
||||
<field name="name">cwf.timesheet.list</field>
|
||||
<field name="model">cwf.timesheet</field>
|
||||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<field name="name"/>
|
||||
<field name="week_start_date"/>
|
||||
<field name="week_end_date"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_cwf_timesheet" model="ir.actions.act_window">
|
||||
<field name="name">CWF Timesheet</field>
|
||||
<field name="res_model">cwf.timesheet</field>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<field name="name">cwf.weekly.timesheet.form</field>
|
||||
<field name="model">cwf.weekly.timesheet</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="CWF Weekly Timesheet" create="0">
|
||||
<form string="CWF Weekly Timesheet">
|
||||
<header>
|
||||
<button name="update_attendance" string="Update"
|
||||
type="object" class="oe_highlight" invisible="status != 'draft'"/>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="week_id" readonly="1"/>
|
||||
<field name="week_id" readonly="0"/>
|
||||
<field name="employee_id" readonly="1"/>
|
||||
<label for="week_start_date" string="Dates"/>
|
||||
<div class="o_row">
|
||||
|
|
@ -46,7 +46,7 @@
|
|||
<field name="name">cwf.weekly.timesheet.list</field>
|
||||
<field name="model">cwf.weekly.timesheet</field>
|
||||
<field name="arch" type="xml">
|
||||
<list create="0">
|
||||
<list>
|
||||
<field name="week_id"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="status"/>
|
||||
|
|
@ -148,8 +148,8 @@
|
|||
|
||||
|
||||
<menuitem id="menu_timesheet_form" name="CWF Weekly Timesheet "
|
||||
parent="hr_attendance_extended.menu_attendance_attendance" action="action_cwf_weekly_timesheet"/>
|
||||
parent="hr_attendance_extended.menu_attendance_attendance" action="action_cwf_weekly_timesheet" groups="hr_employee_extended.group_external_user,hr_attendance.group_hr_attendance_manager"/>
|
||||
<menuitem id="menu_timesheet_form_line" name="CWF Timesheet Lines"
|
||||
parent="hr_attendance_extended.menu_attendance_attendance" action="action_cwf_timesheet_line"/>
|
||||
parent="hr_attendance_extended.menu_attendance_attendance" action="action_cwf_timesheet_line" groups="hr_employee_extended.group_external_user,hr_attendance.group_hr_attendance_manager"/>
|
||||
|
||||
</odoo>
|
||||
Loading…
Reference in New Issue