#fix:payrolland leave

This commit is contained in:
seshikanth 2026-06-29 12:48:07 +05:30
parent 80e90ca88a
commit 257e05cc34
4 changed files with 208 additions and 10 deletions

View File

@ -3,6 +3,10 @@ import re
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.tools.safe_eval import safe_eval
from dateutil.relativedelta import relativedelta
import logging
_logger = logging.getLogger(__name__)
class EmployeePayslipDownloadWizard(models.TransientModel):
@ -10,6 +14,58 @@ class EmployeePayslipDownloadWizard(models.TransientModel):
_rec_name = 'employee_id'
_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(
'hr.employee',
required=True,
@ -28,18 +84,33 @@ class EmployeePayslipDownloadWizard(models.TransientModel):
'payroll.period',
string='Payroll Period',
required=True,
default=_default_period,
)
today = fields.Date(
default=fields.Date.today
)
period_line = fields.Many2one(
'payroll.period.line',
string='Month',
domain="[('period_id', '=', period_id)]",
string="Month",
default=_default_period_line,
domain="[('period_id','=',period_id), ('to_date','<=', previous_month_end)]",
)
payslip_count = fields.Integer(
string='Available Payslips',
compute='_compute_payslip_count',
)
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):
for rec in self:
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,
'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),
]
}
}

View File

@ -27,12 +27,11 @@
</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>
<field name="period_line"
force_save="1"
domain="[('period_id', '=', period_id)]"
required="download_type == 'single'"
invisible="download_type != 'single'"/>
</group>

View File

@ -349,11 +349,18 @@ class HRLeave(models.Model):
action = self.sudo().env.ref('hr_holidays.hr_leave_action_my')
return {
'type': 'ir.actions.act_window',
'name': action.name,
'res_model': action.res_model,
'view_mode': action.view_mode,
'res_model': 'hr.leave',
'res_id': rec.id,
'view_mode': 'form',
'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):
if any(holiday.state not in ['cancel', 'refuse'] for holiday in self):

View File

@ -5,11 +5,23 @@ from odoo.exceptions import UserError
class HrLeaveAllocation(models.Model):
_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'),
('submitted', 'Submitted'),
('confirm', 'To Approve'),
('validate1', 'Second Approval'),
('validate', 'Approved'),
('refuse', 'Rejected'),
])
],
string='Status',
tracking=True,copy=False)
def action_submit(self):