From 257e05cc3447abe9002d8b166f06137aa3641f02 Mon Sep 17 00:00:00 2001 From: seshikanth Date: Mon, 29 Jun 2026 12:48:07 +0530 Subject: [PATCH] #fix:payrolland leave --- .../models/employee_payslip_download_wiz.py | 186 +++++++++++++++++- ...employee_payslip_download_wizard_views.xml | 3 +- .../hr_timeoff_extended/models/hr_timeoff.py | 13 +- .../models/hr_leave_allocation.py | 16 +- 4 files changed, 208 insertions(+), 10 deletions(-) diff --git a/addons_extensions/employee_it_declaration/models/employee_payslip_download_wiz.py b/addons_extensions/employee_it_declaration/models/employee_payslip_download_wiz.py index 2e82ad7cd..e1fb53d5e 100644 --- a/addons_extensions/employee_it_declaration/models/employee_payslip_download_wiz.py +++ b/addons_extensions/employee_it_declaration/models/employee_payslip_download_wiz.py @@ -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), + ] + } + } \ No newline at end of file diff --git a/addons_extensions/employee_it_declaration/views/employee_payslip_download_wizard_views.xml b/addons_extensions/employee_it_declaration/views/employee_payslip_download_wizard_views.xml index d0ce96181..854d41715 100644 --- a/addons_extensions/employee_it_declaration/views/employee_payslip_download_wizard_views.xml +++ b/addons_extensions/employee_it_declaration/views/employee_payslip_download_wizard_views.xml @@ -27,12 +27,11 @@ - + diff --git a/addons_extensions/hr_timeoff_extended/models/hr_timeoff.py b/addons_extensions/hr_timeoff_extended/models/hr_timeoff.py index 02334e7fa..003675a7f 100644 --- a/addons_extensions/hr_timeoff_extended/models/hr_timeoff.py +++ b/addons_extensions/hr_timeoff_extended/models/hr_timeoff.py @@ -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): diff --git a/addons_extensions/leaves_timesheets_extended/models/hr_leave_allocation.py b/addons_extensions/leaves_timesheets_extended/models/hr_leave_allocation.py index 0ddd0df09..f0028661c 100644 --- a/addons_extensions/leaves_timesheets_extended/models/hr_leave_allocation.py +++ b/addons_extensions/leaves_timesheets_extended/models/hr_leave_allocation.py @@ -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):