#fix:payrolland leave
This commit is contained in:
parent
80e90ca88a
commit
257e05cc34
|
|
@ -3,6 +3,10 @@ import re
|
||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
from odoo.tools.safe_eval import safe_eval
|
from odoo.tools.safe_eval import safe_eval
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class EmployeePayslipDownloadWizard(models.TransientModel):
|
class EmployeePayslipDownloadWizard(models.TransientModel):
|
||||||
|
|
@ -10,6 +14,58 @@ class EmployeePayslipDownloadWizard(models.TransientModel):
|
||||||
_rec_name = 'employee_id'
|
_rec_name = 'employee_id'
|
||||||
_description = 'Employee Payslip Download Wizard'
|
_description = 'Employee Payslip Download Wizard'
|
||||||
|
|
||||||
|
def _default_period(self):
|
||||||
|
today = fields.Date.today()
|
||||||
|
return self.env['payroll.period'].search([
|
||||||
|
('from_date', '<=', today),
|
||||||
|
('to_date', '>=', today),
|
||||||
|
], limit=1)
|
||||||
|
|
||||||
|
def _default_period_line(self):
|
||||||
|
previous_month_end = fields.Date.today().replace(day=1) - relativedelta(days=1)
|
||||||
|
|
||||||
|
_logger.info("Today: %s", fields.Date.today())
|
||||||
|
_logger.info("Previous Month End: %s", previous_month_end)
|
||||||
|
|
||||||
|
period = self._default_period()
|
||||||
|
_logger.info("Period: %s", period.name if period else "None")
|
||||||
|
|
||||||
|
lines = self.env['payroll.period.line'].search([
|
||||||
|
('period_id', '=', period.id),
|
||||||
|
], order='from_date')
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
_logger.info(
|
||||||
|
"Month=%s From=%s To=%s",
|
||||||
|
line.name,
|
||||||
|
line.from_date,
|
||||||
|
line.to_date
|
||||||
|
)
|
||||||
|
|
||||||
|
month = self.env['payroll.period.line'].search([
|
||||||
|
('period_id', '=', period.id),
|
||||||
|
('from_date', '<=', previous_month_end),
|
||||||
|
('to_date', '>=', previous_month_end),
|
||||||
|
], limit=1)
|
||||||
|
|
||||||
|
_logger.info("Selected Month: %s", month.name if month else "None")
|
||||||
|
|
||||||
|
return month
|
||||||
|
|
||||||
|
# def _default_period_line(self):
|
||||||
|
# # Last day of the previous month
|
||||||
|
# previous_month_end = fields.Date.today().replace(day=1) - relativedelta(days=1)
|
||||||
|
#
|
||||||
|
# period = self._default_period()
|
||||||
|
# if not period:
|
||||||
|
# return False
|
||||||
|
#
|
||||||
|
# return self.env['payroll.period.line'].search([
|
||||||
|
# ('period_id', '=', period.id),
|
||||||
|
# ('from_date', '<=', previous_month_end),
|
||||||
|
# ('to_date', '<=', previous_month_end),
|
||||||
|
# ], limit=1)
|
||||||
|
|
||||||
employee_id = fields.Many2one(
|
employee_id = fields.Many2one(
|
||||||
'hr.employee',
|
'hr.employee',
|
||||||
required=True,
|
required=True,
|
||||||
|
|
@ -28,18 +84,33 @@ class EmployeePayslipDownloadWizard(models.TransientModel):
|
||||||
'payroll.period',
|
'payroll.period',
|
||||||
string='Payroll Period',
|
string='Payroll Period',
|
||||||
required=True,
|
required=True,
|
||||||
|
default=_default_period,
|
||||||
|
)
|
||||||
|
today = fields.Date(
|
||||||
|
default=fields.Date.today
|
||||||
)
|
)
|
||||||
period_line = fields.Many2one(
|
period_line = fields.Many2one(
|
||||||
'payroll.period.line',
|
'payroll.period.line',
|
||||||
string='Month',
|
string="Month",
|
||||||
domain="[('period_id', '=', period_id)]",
|
default=_default_period_line,
|
||||||
|
domain="[('period_id','=',period_id), ('to_date','<=', previous_month_end)]",
|
||||||
)
|
)
|
||||||
payslip_count = fields.Integer(
|
payslip_count = fields.Integer(
|
||||||
string='Available Payslips',
|
string='Available Payslips',
|
||||||
compute='_compute_payslip_count',
|
compute='_compute_payslip_count',
|
||||||
)
|
)
|
||||||
is_hr_manager = fields.Boolean(compute="_compute_is_hr_manager")
|
is_hr_manager = fields.Boolean(compute="_compute_is_hr_manager")
|
||||||
|
previous_month_end = fields.Date(
|
||||||
|
default=lambda self: (
|
||||||
|
fields.Date.today().replace(day=1)
|
||||||
|
- relativedelta(days=1)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
available_period_ids = fields.Many2many(
|
||||||
|
'payroll.period',
|
||||||
|
compute='_compute_available_period_ids'
|
||||||
|
)
|
||||||
|
|
||||||
def _compute_is_hr_manager(self):
|
def _compute_is_hr_manager(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
rec.is_hr_manager = self.env.user.has_group('hr.group_hr_manager')
|
rec.is_hr_manager = self.env.user.has_group('hr.group_hr_manager')
|
||||||
|
|
@ -129,3 +200,112 @@ class EmployeePayslipDownloadWizard(models.TransientModel):
|
||||||
'url': '/employee_it_declaration/my_payslips/%s' % self.id,
|
'url': '/employee_it_declaration/my_payslips/%s' % self.id,
|
||||||
'target': 'self',
|
'target': 'self',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# @api.onchange('employee_id')
|
||||||
|
# def _onchange_employee_id(self):
|
||||||
|
#
|
||||||
|
# if not self.employee_id:
|
||||||
|
# return {}
|
||||||
|
#
|
||||||
|
# # Replace joining_date with your employee joining field
|
||||||
|
# joining_date = self.employee_id.doj
|
||||||
|
# today = fields.Date.today()
|
||||||
|
#
|
||||||
|
# if not joining_date:
|
||||||
|
# joining_date = today
|
||||||
|
# # today = fields.Date.today()
|
||||||
|
# current_period = self.env['payroll.period'].search([
|
||||||
|
# ('from_date', '<=', today),
|
||||||
|
# ('to_date', '>=', today),
|
||||||
|
# ], limit=1)
|
||||||
|
#
|
||||||
|
# if current_period:
|
||||||
|
# self.period_id = current_period
|
||||||
|
#
|
||||||
|
# return {
|
||||||
|
# 'domain': {
|
||||||
|
# 'period_id': [
|
||||||
|
# ('to_date', '>=', joining_date),
|
||||||
|
# ('from_date', '<=', today),
|
||||||
|
# ]
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
@api.depends('employee_id')
|
||||||
|
def _compute_available_period_ids(self):
|
||||||
|
today = fields.Date.today()
|
||||||
|
|
||||||
|
for rec in self:
|
||||||
|
employee = rec.employee_id or self.env.user.employee_id
|
||||||
|
if not employee:
|
||||||
|
rec.available_period_ids = False
|
||||||
|
continue
|
||||||
|
|
||||||
|
joining_date = employee.doj or today
|
||||||
|
|
||||||
|
periods = self.env['payroll.period'].search([
|
||||||
|
('to_date', '>=', joining_date),
|
||||||
|
('from_date', '<=', today),
|
||||||
|
])
|
||||||
|
|
||||||
|
rec.available_period_ids = periods
|
||||||
|
|
||||||
|
# @api.onchange('employee_id')
|
||||||
|
# def _onchange_employee_id(self):
|
||||||
|
# if not self.employee_id:
|
||||||
|
# return {}
|
||||||
|
#
|
||||||
|
# joining_date = self.employee_id.doj
|
||||||
|
# today = fields.Date.today()
|
||||||
|
#
|
||||||
|
# if not joining_date:
|
||||||
|
# joining_date = today
|
||||||
|
#
|
||||||
|
# # Current Financial Year
|
||||||
|
# current_period = self.env['payroll.period'].search([
|
||||||
|
# ('from_date', '<=', today),
|
||||||
|
# ('to_date', '>=', today),
|
||||||
|
# ], limit=1)
|
||||||
|
# if current_period:
|
||||||
|
# self.period_id = current_period
|
||||||
|
#
|
||||||
|
# return {
|
||||||
|
# 'domain': {
|
||||||
|
# 'period_id': [
|
||||||
|
# ('to_date', '>=', joining_date), # DOJ year onwards
|
||||||
|
# ('from_date', '<=', today), # No future FY
|
||||||
|
# ]
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
@api.onchange('period_id')
|
||||||
|
def _onchange_period_id(self):
|
||||||
|
|
||||||
|
self.period_line = False
|
||||||
|
|
||||||
|
if not self.period_id:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
previous_month_end = (
|
||||||
|
fields.Date.today().replace(day=1)
|
||||||
|
- relativedelta(days=1)
|
||||||
|
)
|
||||||
|
|
||||||
|
month = self.env['payroll.period.line'].search([
|
||||||
|
('period_id', '=', self.period_id.id),
|
||||||
|
('from_date', '<=', previous_month_end),
|
||||||
|
('to_date', '>=', previous_month_end),
|
||||||
|
], limit=1)
|
||||||
|
|
||||||
|
if month:
|
||||||
|
self.period_line = month
|
||||||
|
|
||||||
|
return {
|
||||||
|
'domain': {
|
||||||
|
'period_line': [
|
||||||
|
('period_id', '=', self.period_id.id),
|
||||||
|
('to_date', '<=', previous_month_end),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -27,12 +27,11 @@
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="period_id" options="{'no_edit': True, 'no_create': True, 'no_open': True}"/>
|
<field name="period_id" domain="[('id', 'in', available_period_ids)]" options="{'no_edit': True, 'no_create': True, 'no_open': True}"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="period_line"
|
<field name="period_line"
|
||||||
force_save="1"
|
force_save="1"
|
||||||
domain="[('period_id', '=', period_id)]"
|
|
||||||
required="download_type == 'single'"
|
required="download_type == 'single'"
|
||||||
invisible="download_type != 'single'"/>
|
invisible="download_type != 'single'"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
|
||||||
|
|
@ -349,11 +349,18 @@ class HRLeave(models.Model):
|
||||||
action = self.sudo().env.ref('hr_holidays.hr_leave_action_my')
|
action = self.sudo().env.ref('hr_holidays.hr_leave_action_my')
|
||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'name': action.name,
|
'res_model': 'hr.leave',
|
||||||
'res_model': action.res_model,
|
'res_id': rec.id,
|
||||||
'view_mode': action.view_mode,
|
'view_mode': 'form',
|
||||||
'target': 'current',
|
'target': 'current',
|
||||||
}
|
}
|
||||||
|
# return {
|
||||||
|
# 'type': 'ir.actions.act_window',
|
||||||
|
# 'name': action.name,
|
||||||
|
# 'res_model': action.res_model,
|
||||||
|
# 'view_mode': 'form',
|
||||||
|
# 'target': 'current',
|
||||||
|
# }
|
||||||
|
|
||||||
def action_reset_confirm(self):
|
def action_reset_confirm(self):
|
||||||
if any(holiday.state not in ['cancel', 'refuse'] for holiday in self):
|
if any(holiday.state not in ['cancel', 'refuse'] for holiday in self):
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,23 @@ from odoo.exceptions import UserError
|
||||||
class HrLeaveAllocation(models.Model):
|
class HrLeaveAllocation(models.Model):
|
||||||
_inherit = 'hr.leave.allocation'
|
_inherit = 'hr.leave.allocation'
|
||||||
|
|
||||||
state = fields.Selection(selection_add=[
|
# state = fields.Selection(selection_add=[
|
||||||
|
# ('draft', 'Draft'),
|
||||||
|
# ('submitted', 'Submitted'),
|
||||||
|
# ('refuse', 'Rejected')
|
||||||
|
# ],default='draft',)
|
||||||
|
|
||||||
|
state = fields.Selection([
|
||||||
('draft', 'Draft'),
|
('draft', 'Draft'),
|
||||||
('submitted', 'Submitted'),
|
('submitted', 'Submitted'),
|
||||||
|
('confirm', 'To Approve'),
|
||||||
|
('validate1', 'Second Approval'),
|
||||||
|
('validate', 'Approved'),
|
||||||
('refuse', 'Rejected'),
|
('refuse', 'Rejected'),
|
||||||
])
|
],
|
||||||
|
string='Status',
|
||||||
|
tracking=True,copy=False)
|
||||||
|
|
||||||
|
|
||||||
def action_submit(self):
|
def action_submit(self):
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue