You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
5.4 KiB
114 lines
5.4 KiB
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
from datetime import datetime
|
|
from odoo import models, fields, api, _
|
|
from odoo.exceptions import ValidationError
|
|
date_format = "%Y-%m-%d"
|
|
|
|
|
|
class HrResignation(models.Model):
|
|
_name = 'hr.resignation'
|
|
_inherit = 'mail.thread'
|
|
_rec_name = 'employee_id'
|
|
|
|
def _get_employee_id(self):
|
|
# assigning the related employee of the logged in user
|
|
employee_rec = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
|
|
return employee_rec.id
|
|
|
|
name = fields.Char(string='Order Reference', required=True, copy=False, readonly=True, index=True,
|
|
default=lambda self: _('New'))
|
|
employee_id = fields.Many2one('hr.employee', string="Employee", default=_get_employee_id,
|
|
help='Name of the employee for whom the request is creating')
|
|
department_id = fields.Many2one('hr.department', string="Department", related='employee_id.department_id',
|
|
help='Department of the employee')
|
|
joined_date = fields.Date(string="Join Date", required=True, related='employee_id.joining_date',
|
|
help='Joining date of the employee')
|
|
expected_revealing_date = fields.Date(string="Revealing Date", required=True,
|
|
help='Date on which he is revealing from the company')
|
|
resign_confirm_date = fields.Date(string="Resign confirm date", help='Date on which the request is confirmed')
|
|
approved_revealing_date = fields.Date(string="Approved Date", help='The date approved for the revealing')
|
|
reason = fields.Text(string="Reason", help='Specify reason for leaving the company')
|
|
notice_period = fields.Char(string="Notice Period", compute='_notice_period')
|
|
state = fields.Selection([('draft', 'Draft'), ('confirm', 'Confirm'), ('approved', 'Approved'), ('cancel', 'Cancel')],
|
|
string='Status', default='draft')
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
# assigning the sequence for the record
|
|
if vals.get('name', _('New')) == _('New'):
|
|
vals['name'] = self.env['ir.sequence'].next_by_code('hr.resignation') or _('New')
|
|
res = super(HrResignation, self).create(vals)
|
|
return res
|
|
|
|
@api.constrains('employee_id')
|
|
def check_employee(self):
|
|
# Checking whether the user is creating leave request of his/her own
|
|
for rec in self:
|
|
if not self.env.user.has_group('hr.group_hr_user'):
|
|
if rec.employee_id.user_id.id and rec.employee_id.user_id.id != self.env.uid:
|
|
raise ValidationError(_('You cannot create request for other employees'))
|
|
|
|
@api.onchange('employee_id')
|
|
@api.depends('employee_id')
|
|
def check_request_existence(self):
|
|
# Check whether any resignation request already exists
|
|
for rec in self:
|
|
if rec.employee_id:
|
|
resignation_request = self.env['hr.resignation'].search([('employee_id', '=', rec.employee_id.id),
|
|
('state', 'in', ['confirm', 'approved'])])
|
|
if resignation_request:
|
|
raise ValidationError(_('There is a resignation request in confirmed or'
|
|
' approved state for this employee'))
|
|
|
|
@api.multi
|
|
def _notice_period(self):
|
|
# calculating the notice period for the employee
|
|
for rec in self:
|
|
if rec.approved_revealing_date and rec.resign_confirm_date:
|
|
approved_date = datetime.strptime(rec.approved_revealing_date, date_format)
|
|
confirmed_date = datetime.strptime(rec.resign_confirm_date, date_format)
|
|
notice_period = approved_date - confirmed_date
|
|
rec.notice_period = notice_period.days
|
|
|
|
@api.constrains('joined_date', 'expected_revealing_date')
|
|
def _check_dates(self):
|
|
# validating the entered dates
|
|
for rec in self:
|
|
resignation_request = self.env['hr.resignation'].search([('employee_id', '=', rec.employee_id.id),
|
|
('state', 'in', ['confirm', 'approved'])])
|
|
if resignation_request:
|
|
raise ValidationError(_('There is a resignation request in confirmed or'
|
|
' approved state for this employee'))
|
|
if rec.joined_date >= rec.expected_revealing_date:
|
|
raise ValidationError(_('Revealing date must be anterior to joining date'))
|
|
|
|
@api.multi
|
|
def confirm_resignation(self):
|
|
for rec in self:
|
|
rec.state = 'confirm'
|
|
rec.resign_confirm_date = datetime.now()
|
|
|
|
@api.multi
|
|
def cancel_resignation(self):
|
|
for rec in self:
|
|
rec.state = 'cancel'
|
|
|
|
@api.multi
|
|
def reject_resignation(self):
|
|
for rec in self:
|
|
rec.state = 'rejected'
|
|
|
|
@api.multi
|
|
def approve_resignation(self):
|
|
for rec in self:
|
|
if not rec.approved_revealing_date:
|
|
raise ValidationError(_('Enter Approved Revealing Date'))
|
|
if rec.approved_revealing_date and rec.resign_confirm_date:
|
|
if rec.approved_revealing_date <= rec.resign_confirm_date:
|
|
raise ValidationError(_('Approved revealing date must be anterior to confirmed date'))
|
|
rec.state = 'approved'
|
|
|
|
|
|
|
|
|
|
|