From 953794adc27d19dadc937eb3fea6e22d998b9764 Mon Sep 17 00:00:00 2001 From: raman Date: Wed, 26 Mar 2025 17:25:33 +0530 Subject: [PATCH] indian payroll --- .../l10n_in_hr_payroll/__init__.py | 7 + .../l10n_in_hr_payroll/__manifest__.py | 61 +++ .../l10n_in_hr_payroll/controller/__init__.py | 3 + .../l10n_in_hr_payroll/controller/main.py | 136 +++++ .../data/hr_contract_type_data.xml | 13 + .../hr_payroll_dashboard_warning_data.xml | 77 +++ .../data/hr_payroll_structure_data.xml | 46 ++ .../data/hr_payroll_structure_type_data.xml | 23 + .../data/hr_rule_parameters_data.xml | 304 +++++++++++ .../data/hr_salary_rule_category_data.xml | 20 + .../data/ir_sequence_data.xml | 13 + .../data/l10n_in_hr_payroll_demo.xml | 430 +++++++++++++++ .../data/report_paperformat.xml | 17 + .../data/res_partner_data.xml | 54 ++ .../hr_salary_rule_ind_emp_data.xml | 511 ++++++++++++++++++ .../hr_salary_rule_regular_pay_data.xml | 248 +++++++++ .../hr_salary_rule_stipend_data.xml | 21 + .../hr_salary_rule_worker_data.xml | 50 ++ .../i18n/l10n_in_hr_payroll.pot | 26 + .../l10n_in_hr_payroll/models/__init__.py | 10 + .../l10n_in_hr_payroll/models/hr_contract.py | 47 ++ .../l10n_in_hr_payroll/models/hr_employee.py | 24 + .../l10n_in_hr_payroll/models/hr_payslip.py | 57 ++ .../models/hr_payslip_run.py | 26 + .../models/l10n_in_salary_statement.py | 107 ++++ .../l10n_in_hr_payroll/models/res_company.py | 16 + .../models/res_config_settings.py | 14 + .../l10n_in_hr_payroll/models/res_users.py | 17 + .../l10n_in_hr_payroll/report/__init__.py | 6 + .../report/report_hr_epf.py | 149 +++++ .../report/report_hr_yearly_salary_detail.py | 149 +++++ .../report/report_payroll_advice.py | 34 ++ .../security/ir.model.access.csv | 6 + .../static/img/hr_employee_alisha_sharma.jpg | Bin 0 -> 40913 bytes .../static/img/hr_employee_shaurya.jpg | Bin 0 -> 43108 bytes .../static/img/hr_employee_vihaan.jpg | Bin 0 -> 55165 bytes .../l10n_in_hr_payroll/tests/__init__.py | 4 + .../l10n_in_hr_payroll/tests/common.py | 88 +++ .../tests/test_hr_contract.py | 43 ++ .../tests/test_payment_advice_batch.py | 62 +++ .../views/hr_contract_views.xml | 30 + .../views/hr_employee_views.xml | 25 + .../views/l10n_in_hr_payroll_report.xml | 56 ++ .../views/l10n_in_salary_statement.xml | 45 ++ .../views/report_hr_epf_views.xml | 54 ++ ...eport_hr_yearly_salary_detail_template.xml | 106 ++++ .../views/report_l10n_in_salary_statement.xml | 69 +++ .../views/report_payroll_advice_template.xml | 68 +++ .../views/report_payslip_details_template.xml | 122 +++++ .../views/res_config_settings_views.xml | 40 ++ .../views/res_users_views.xml | 15 + .../l10n_in_hr_payroll/wizard/__init__.py | 6 + .../wizard/hr_payroll_payment_report.xml | 36 ++ .../hr_payroll_payment_report_wizard.py | 158 ++++++ .../wizard/hr_salary_register.py | 55 ++ .../wizard/hr_salary_register.xml | 74 +++ .../wizard/hr_tds_calculation.py | 122 +++++ .../wizard/hr_tds_calculation.xml | 36 ++ .../wizard/hr_yearly_salary_detail.py | 74 +++ .../wizard/hr_yearly_salary_detail_view.xml | 54 ++ 60 files changed, 4164 insertions(+) create mode 100644 addons_extensions/l10n_in_hr_payroll/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/__manifest__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/controller/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/controller/main.py create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot create mode 100644 addons_extensions/l10n_in_hr_payroll/models/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_contract.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_employee.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_company.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_users.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py create mode 100644 addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_shaurya.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/common.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py create mode 100644 addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report_wizard.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_salary_register.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_salary_register.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_tds_calculation.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_tds_calculation.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml diff --git a/addons_extensions/l10n_in_hr_payroll/__init__.py b/addons_extensions/l10n_in_hr_payroll/__init__.py new file mode 100644 index 000000000..637b45b52 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/__init__.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models +from . import report +from . import wizard +from . import controller diff --git a/addons_extensions/l10n_in_hr_payroll/__manifest__.py b/addons_extensions/l10n_in_hr_payroll/__manifest__.py new file mode 100644 index 000000000..af506ce52 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/__manifest__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Indian Payroll', + 'countries': ['in'], + 'category': 'Human Resources/Payroll', + 'depends': ['hr_payroll'], + 'auto_install': ['hr_payroll'], + 'description': """ +Indian Payroll Salary Rules. +============================ + + -Configuration of hr_payroll for India localization + -All main contributions rules for India payslip. + * New payslip report + * Employee Contracts + * Allow to configure Basic / Gross / Net Salary + * Employee PaySlip + * Allowance / Deduction + * Integrated with Leaves Management + * Medical Allowance, Travel Allowance, Child Allowance, ... + - Payroll Advice and Report + - Yearly Salary by Employee Report + """, + 'data': [ + 'data/report_paperformat.xml', + 'views/l10n_in_hr_payroll_report.xml', + 'data/res_partner_data.xml', + 'data/hr_salary_rule_category_data.xml', + 'data/hr_payroll_structure_type_data.xml', + 'data/hr_payroll_structure_data.xml', + 'data/salary_rules/hr_salary_rule_stipend_data.xml', + 'data/salary_rules/hr_salary_rule_ind_emp_data.xml', + 'data/salary_rules/hr_salary_rule_regular_pay_data.xml', + 'data/salary_rules/hr_salary_rule_worker_data.xml', + 'data/hr_contract_type_data.xml', + 'data/hr_rule_parameters_data.xml', + 'data/ir_sequence_data.xml', + 'data/hr_payroll_dashboard_warning_data.xml', + 'wizard/hr_tds_calculation.xml', + 'views/hr_contract_views.xml', + 'views/res_users_views.xml', + 'views/hr_employee_views.xml', + 'views/res_config_settings_views.xml', + 'security/ir.model.access.csv', + 'views/report_payslip_details_template.xml', + 'wizard/hr_salary_register.xml', + 'views/report_hr_epf_views.xml', + 'wizard/hr_yearly_salary_detail_view.xml', + 'wizard/hr_payroll_payment_report.xml', + 'views/report_hr_yearly_salary_detail_template.xml', + 'views/report_payroll_advice_template.xml', + 'views/l10n_in_salary_statement.xml', + 'views/report_l10n_in_salary_statement.xml', + ], + 'demo': [ + 'data/l10n_in_hr_payroll_demo.xml', + ], + 'license': 'OEEL-1', +} diff --git a/addons_extensions/l10n_in_hr_payroll/controller/__init__.py b/addons_extensions/l10n_in_hr_payroll/controller/__init__.py new file mode 100644 index 000000000..80ee4da1c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/controller/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons_extensions/l10n_in_hr_payroll/controller/main.py b/addons_extensions/l10n_in_hr_payroll/controller/main.py new file mode 100644 index 000000000..5bac0be80 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/controller/main.py @@ -0,0 +1,136 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime +from io import BytesIO +from copy import deepcopy + +from odoo import http, _ +from odoo.http import request +from odoo.tools.misc import xlsxwriter + + +class L10nInSalaryRegisterController(http.Controller): + + def _get_payslip_rules(self, employee_ids, payslips, struct_id=None): + rule_by_name = [] + if struct_id and struct_id.rule_ids: + rule_by_name = [(i.code, i.name) for i in struct_id.rule_ids] + else: + rule_by_name = [ + (rule.code, rule.name) + for payslip in payslips + for rule in payslip.struct_id.rule_ids + ] + child_dict = {code: [name, 0] for code, name in rule_by_name} + rules_per_employee = {employee_id: deepcopy(child_dict) for employee_id in employee_ids} + rules_by_name = dict(rule_by_name) + return rules_by_name, rules_per_employee + + @http.route(['/export/salary-register/'], type='http', auth='user') + def export_salary_register(self, wizard_id): + wizard = request.env['salary.register.wizard'].browse(wizard_id) + if not wizard.exists() or not request.env.user.has_group('hr_payroll.group_hr_payroll_user'): + return request.render( + 'http_routing.http_error', + { + 'status_code': 'Oops', + 'status_message': _('It seems that you either not have the rights to access the Salary Register ' + 'or that you try to access it outside normal circumstances. ' + 'If you think there is a problem, please contact an administrator.') + } + ) + output = BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + worksheet = workbook.add_worksheet('salary_register_report') + style_highlight = workbook.add_format({'bold': True, 'pattern': 1, 'bg_color': '#E0E0E0', 'align': 'center'}) + style_normal = workbook.add_format({'align': 'center'}) + column_width = 30 + + date_from = str(wizard.date_from) + date_to = str(wizard.date_to) + employee_ids = wizard.employee_ids + struct_id = wizard.struct_id + + # VERTICAL HEADERS + vertical_headers = [ + _('EMPLOYER ID'), + _('EMPLOYER NAME'), + _('FROM DATE'), + _('TO DATE'), + ] + # VERTICAL DATA + vertical_data = [ + wizard.company_id.company_registry or '', + wizard.company_id.name, + date_from, + date_to, + ] + blank_lines = 1 + + # HORIZONTAL HEADERS + horizontal_headers = [ + _('EMPLOYEE CODE'), + _('EMPLOYEE NAME'), + ] + + # HORIZONTAL DATA + domain = [('employee_id', 'in', employee_ids.ids), ('date_from', '>=', date_from), ('date_to', '<=', date_to), ('state', '=', 'paid')] + if struct_id: + domain.append(('struct_id', '=', struct_id.id)) + payslips_per_employee = dict(request.env['hr.payslip']._read_group( + domain=domain, + groupby=['employee_id'], + aggregates=['id:recordset'], + )) + rules_by_name, rules_per_employee = self._get_payslip_rules(employee_ids, payslips_per_employee.values(), struct_id=struct_id) + rules_per_employee = { + employee: rules + for employee, rules in rules_per_employee.items() + if employee in payslips_per_employee + } + # Dynamically calculated headers + horizontal_headers = [*horizontal_headers, *rules_by_name.values()] + for employee_id, payslips in payslips_per_employee.items(): + rule_codes = payslips.struct_id.rule_ids.mapped('code') + payslip_rules = payslips._get_line_values(rule_codes, compute_sum=True) + for code, rule in payslip_rules.items(): + rules_per_employee[employee_id][code][1] += rule['sum']['total'] + + horizontal_data = [] + for employee_id in rules_per_employee: + dynamic_horizontal_data = [data[1] for data in rules_per_employee[employee_id].values()] + horizontal_data.append(( + employee_id.registration_number or "", + employee_id.name, + *dynamic_horizontal_data, + )) + + # WRITE IN WORKSHEET + row = 0 + for (vertical_header, vertical_point) in zip(vertical_headers, vertical_data): + worksheet.write(row, 0, vertical_header, style_highlight) + worksheet.write(row, 1, vertical_point, style_normal) + row += 1 + + row += blank_lines + for col, horizontal_header in enumerate(horizontal_headers): + worksheet.write(row, col, horizontal_header, style_highlight) + worksheet.set_column(col, col, column_width) + + for payroll_line in horizontal_data: + row += 1 + for col, payroll_point in enumerate(payroll_line): + worksheet.write(row, col, payroll_point, style_normal) + + row += 1 + workbook.close() + xlsx_data = output.getvalue() + date_obj = datetime.strptime(date_from, '%Y-%m-%d').date() + filename = _("salary_register_report_%(year)s_%(month)s", year=date_obj.year, month=date_obj.month) + response = request.make_response( + xlsx_data, + headers=[ + ('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'), + ('Content-Disposition', f'attachment; filename={filename}.xlsx')], + ) + return response diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml new file mode 100644 index 000000000..216cd829f --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml @@ -0,0 +1,13 @@ + + + + Probation + 4 + + + + Intern + 5 + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml new file mode 100644 index 000000000..8780895b9 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml @@ -0,0 +1,77 @@ + + + + + + Employees Without PAN Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_pan = self.env['hr.employee'].search([ + ('l10n_in_pan', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_pan: + warning_count = len(employees_wo_pan) + warning_records = employees_wo_pan + + + + + Employees Without UAN Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_uan = self.env['hr.employee'].search([ + ('l10n_in_uan', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_uan: + warning_count = len(employees_wo_uan) + warning_records = employees_wo_uan + + + + + Employees Without ESIC Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_esic = self.env['hr.employee'].search([ + ('l10n_in_esic_number', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_esic: + warning_count = len(employees_wo_esic) + warning_records = employees_wo_esic + + + + + Employees Probation ends within a week + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees who are on the probation and their contracts expire within a week + probation_contract_type = self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation', raise_if_not_found=False) + if probation_contract_type: + nearly_expired_contracts = self.env['hr.contract'].search([ + ('contract_type_id', '=', probation_contract_type.id), + ('state', '=', 'open'), ('kanban_state', '!=', 'blocked'), + ('date_end', '<=', date.today() + relativedelta(days=7)), + ('date_end', '>=', date.today() + relativedelta(days=1)), + ]) + if nearly_expired_contracts: + warning_count = len(nearly_expired_contracts.employee_id) + warning_records = nearly_expired_contracts.employee_id + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml new file mode 100644 index 000000000..679e3d105 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml @@ -0,0 +1,46 @@ + + + + + India: Regular Pay + + + + + + + + Worker Pay + + + + + + + Stipend + + + + Stipend + + + + Non-Executive Employee + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml new file mode 100644 index 000000000..039859e1c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml @@ -0,0 +1,23 @@ + + + + hourly + + + + India: Employee Pay + + + + India: Intern + + + + India: Worker + + + + India: Non-Executives + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml new file mode 100644 index 000000000..4b155effd --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml @@ -0,0 +1,304 @@ + + + + + India: Basic Salary Value + l10n_in_basic_value + + + + 7000 + + + + + + India: Basic Salary Percentage + l10n_in_basic_percent + + + + 0.60 + + + + + + India: Basic Salary Days + l10n_in_basic_days + + + + 0.31 + + + + + + India: House Rent Allowance Value + l10n_in_hra_value + + + + 0.40 + + + + + + India: Standard Allowance + l10n_in_std_alw + + + + 4167 + + + + + + India: Bonus Value and Percentage + l10n_in_bonus_percent + + + + [ + (450000.00, (12, 0.30)), + (550000.00, (3, 0.20)), + (0.00, (1, 0.10)), + ] + + + + + + India: TDS Rate Chart + l10n_in_tds_rate_chart + + + + [ + (0.0, (0, 300000)), + (0.05, (300000, 600000)), + (0.1, (600000, 900000)), + (0.15, (900000, 1200000)), + (0.2, (1200000, 1500000)), + (0.3, (1500000, 'inf')) + ] + + + + + + India: Surcharge Rate + l10n_in_surcharge_rate + + + + [ + (0.0, (0, 5000000)), + (0.1, (5000000, 10000000)), + (0.15, (10000000, 20000000)), + (0.25, (20000000, 'inf')), + ] + + + + + + India: Standard Deduction + l10n_in_standard_deduction + + + + 50000 + + + + + + India: Minimun Income for Tax Rebate + l10n_in_min_income_tax_rebate + + + + 700000 + + + + + + India: Miminum Income for Surcharge + l10n_in_min_income_surcharge + + + + 5000000 + + + + + + India: Maximum Tax Rate for Surcharge + l10n_in_max_surcharge_tax_rate + + + + [ + (5000000, 1200000, 0), + (10000000, 2700000, 270000), + (20000000, 5700000, 855000), + (50000000, 14700000, 3675000), + ] + + + + + + India: Leave Travel Allowance Value and Percentage + l10n_in_lta_percent + + + + [ + (450000.00, (12, 0.30)), + (550000.00, (3, 0.20)), + (0.00, (1, 0.10)), + ] + + + + + + India: Professional Tax + l10n_in_professional_tax + + + + [-200, -150, -80] + + + + + + India: Provident Fund Percentage + l10n_in_pf_percent + + + + 0.12 + + + + + + India: Provident Fund Value + l10n_in_pf_amount + + + + 15000.00 + + + + + + India: EPS Contri Percentage + l10n_in_eps_contri_percent + + + + 0.0833 + + + + + + India: Employer's State Insurance Corporation Percentage + l10n_in_esicf_percent + + + + 0.0325 + + + + + + India: City Compensatory Allowance Percentage + l10n_in_city_alw_percent + + + + 0.10 + + + + + + India: Child Education Allowance + l10n_in_chea_value + + + + [100, 200] + + + + + + India: Child Hostel Allowance Value + l10n_in_child_hostel_allowance + + + + [300, 600] + + + + + + India: Employer's State Insurance Corporation Value + l10n_in_esicf_value + + + + 21000 + + + + + + India: Leave Days + l10n_in_leave_days + + + + 22 + + + + + + India: India:Employee's NPS Contribution + l10n_in_cbda_percent + + + + 0.10 + + + + + + India: Performace Bonus Percentage + l10n_in_regular_bonus_percent + + + + 0.40 + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml new file mode 100644 index 000000000..285139ffb --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml @@ -0,0 +1,20 @@ + + + + + Special Allowance + SPA + + + + Leave Allowance + LEAVE + + + + Performance Bonus + PBS + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml b/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml new file mode 100644 index 000000000..42fa6fd70 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml @@ -0,0 +1,13 @@ + + + + + + Payment Advice + payment.advice + 3 + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml b/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml new file mode 100644 index 000000000..08865e478 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml @@ -0,0 +1,430 @@ + + + + + IN Company + Block no. 401 + Street 2 + Hyderabad + + + 500001 + +91 81234 56789 + + + + IN Company + + + 24DUMMY1234AAZA + + + + HDFC Bank + HDFC0000123 + + + + State Bank + SBIS0000321 + + + + + + + + + Vihaan Sengupta + A-4 Gunj Society + near AK Hospital + Hyderabad + 385426 + + + +91 98765 43021 + vihaan.sengupta@example.com + + + + Alisha Sharma + + + + + Shaurya Khurana + + + + + 1245670000123 + + + + + + + + + 0112340000998 + + + + + + + + + 0222340000789 + + + + + + + + + + vihaan@example.com + vihaan@123 + --
+V. Sengupta
+ + + + Asia/Kolkata + +
+ + + + Standard 24 hours/week + + 8 + + + + + Research & Development IN + + + + Technical Support & Investigation + + + + Marketing + + + + + Experienced Developer + + 5 + + + + Technical Support & Investigation Intern + + 10 + + + + + + Vihaan Sengupta + male + single + +91 8765432109 + + A-4 Gunj Society + near AK Hospital + Hyderabad + 385426 + + + +91 7654321098 + vihaan.sengupta123@example.com + + Software Developer + + Harshiv Sengupta + +91 9348762345 + India + + bachelor + Computer Engineering + TechInnova University + + + + 82735682375623 + + + + Father + 124567334654 + 93874947361284657 + HDIUE8765M + + + Shaurya Khurana + + male + + + single + +91 7890123456 + 503, highsky residency + VR Road + Ahmedabad + 385876 + + + +91 9870165432 + shaurya.khurana@example.com + India + + Asia/Kolkata + + + 82735682375623 + + + + + 387438790384 + 93487475300284657 + KUPYH9876I + + + Alisha Sharma + + + + female + Asia/Kolkata + +91 9887756789 + alisha.sharma@example.com + India + + + + + + + 398175628304 + 4658302649025064783 + GUNI5723P + + + + + Alisha Sharma + + + + + open + + + + + + Shaurya Contract + + + + hourly + 250 + + + + + open + + + + + + Vihaan Sengupta Contract + + + + 50000 + open + + 5000 + 1442.50 + 6550 + 12 + 12 + 6850 + 2750 + 1560 + + + + + + + Vihaan Sengupta Contract + + + + 40000 + close + + + + + 4000 + 1142 + 5100 + 12 + 16 + 5560 + 2000 + 1160 + + + + + Paid Time Off for Indian Employee 1 + + + + 24 + confirm + + + + + Paid Time Off for Indian Employee 2 + + + + 24 + confirm + + + + + Paid Time Off for Indian Employee 3 + + + + 24 + confirm + + + + + + + + 1 + + + confirm + + + + + + 0.5 + + + + confirm + + + + + + + + + + 5500 + 5500 + + + Health Insurance + + + + + + + + + + + + + + + + Vihaan Payslip September + + + + + + + + Shaurya Payslip September + + + + + + + + Vihaan Payslip October + + + + + + + + + Alisha Sharma November + + + + + + + + + + + + + +
+
diff --git a/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml b/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml new file mode 100644 index 000000000..b24941486 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml @@ -0,0 +1,17 @@ + + + + Yealy Salary Head Report + + A4 + 0 + 0 + Landscape + 15 + 15 + 5 + 5 + + 96 + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml b/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml new file mode 100644 index 000000000..5eef7fdfe --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml @@ -0,0 +1,54 @@ + + + + Register for House Rent Allowance + + + + Register for Provident Fund + + + + Register for Professional Tax + + + + Register for Food Coupen + + + + Register for TDS + + + + Register for NPS Contribution + + + + Register for Voluntary Provident Fund + + + + Register for Company Provided Transport Deduction + + + + Register for State Labour Welfare Fund Deduction + + + + Register for Company Provided Group Term Insurance Deduction + + + + Register for Leave Availed Deduction + + + + Register for Company Provided Medical Insurance Deduction + + + + Register for Other Deduction from Employer + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml new file mode 100644 index 000000000..ad61926dd --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml @@ -0,0 +1,511 @@ + + + + HRAMN + code + +nonmetro_alw = contract.l10n_in_house_rent_allowance_metro_nonmetro / 100 +result = contract.wage * nonmetro_alw + + + House Rent Allowance + + + HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses. + + + + + SA + Grade/Special/Management/Supplementary Allowance + + python + result = bool(contract.l10n_in_supplementary_allowance) + code + result = contract.l10n_in_supplementary_allowance + + This allowance is normally given as an additional benefit to employees and is fully taxable. + + + + + CHEA + Child Education Allowance + + python + result = bool(employee.children) + code + +amounts = payslip._rule_parameter('l10n_in_chea_value') +if employee.children == 1: + result = amounts[0] +else: + result = amounts[1] + + + Per school going child 1200 per annum is non-taxable.Maximum for 2 children, so max 2400 per annum becomes non-taxable. + + + + + CHEAH + Child Hostel Allowance + + python + result = bool(employee.l10n_in_residing_child_hostel) + code + +amounts = payslip._rule_parameter('l10n_in_child_hostel_allowance') +if employee.l10n_in_residing_child_hostel == 1: + result = amounts[0] +else: + result = amounts[1] + + In case the children are in hostel, the exemption available for child. + + + + + + CBDA + City Compensatory Allowance + + none + + code + +city_alw_percent = payslip._rule_parameter('l10n_in_city_alw_percent') +result = contract.wage * city_alw_percent + + This allowance is paid to Employees who are posted in big cities. The purpose is to compensate the high cost of living in cities like Mumbai, Delhi, etc. However it is Fully Taxable. + + + + + CMETRO + City Allowance for Metro city + + none + + fix + 850.0 + + + + + CNMETRO + City Allowance for Non Metro city + + none + + fix + 800.0 + + + + + ARRE + Arrears + + code + +result = 'ARS' in inputs and inputs['ARS'].amount +result_name = 'ARS' in inputs and inputs['ARS'].name + + + + Generally arrears are fully taxable, but employee may claim exemption u/s 89(1). +One would need to compute income tax on the arrears if it would have been received in actual year. +Now difference of income tax between payment year and actual year would be allowed for deduction. + + + + + MEDA + Medical Reimbursement + + code + +result = 'MR' in inputs and inputs['MR'].amount +result_name = 'MR' in inputs and inputs['MR'].name + + + This component is on-taxable up to 15000 per year (or Rs 1500 per month) on producing medical bills. + + + + + fix + + 'WORK100' in worked_days and worked_days['WORK100'].number_of_days + FC + + Food Allowance + + + + + + + ESICF + Employer's State Insurance Corporation + + + python + result = result_rules['GROSS']['total'] <= payslip._rule_parameter('l10n_in_esicf_value') + code + +esicf_percent = payslip._rule_parameter('l10n_in_esicf_percent') +gross = categories['GROSS'] +result = gross * esicf_percent + + + + + + + + ERPF + Employer's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + + + + Both the employees and employer contribute to the fund at the rate of 12% of the basic wages, dearness allowance and retaining allowance, if any, payable to employees per month. + + + + + PERJ + Book and Periodicals Allowance (BNP) + + code + +result = 'PJ' in inputs and inputs['PJ'].amount +result_name = 'PJ' in inputs and inputs['PJ'].name + + + Some employers may provide component for buying magazines, journals and books as a part of knowledge enhancement for business growth.This part would become non taxable on providing original bills. + + + + + UNIFS + Uniform/Dress Allowance for Senior Executive + + fix + + + Some sections of employees mat get allowance for purchase of office dress/uniform.In such case, the component would become non-taxable. + + + + + TELR + Telephone Reimbursement + + code + +result = 'TR' in inputs and inputs['TR'].amount +result_name = 'TR' in inputs and inputs['TR'].name + + + In some of the cases, companies may provide a component for telephone bills.Employees may provide actual phone usage bills to reimburse this component and make it non-taxable. + + + + + + PDA + Professional Development Allowance + + fix + + + + + + + CAR + Car Expenses Reimbursement + + code + +result = 'CEI' in inputs and inputs['CEI'].amount +result_name = 'CEI' in inputs and inputs['CEI'].name + + + In case company provides component for this and employee use self owned car for official and personal purposes, Rs 1800 per month would be non-taxable on showing bills for fuel or can maintenance. This amount would be Rs 2400 in case car is more capacity than 1600cc. + + + + + INT + Mobile and Internet Expense + + code + +result = 'IE' in inputs and inputs['IE'].amount +result_name = 'IE' in inputs and inputs['IE'].name + + + Employer may also provide reimbursement of Mobile and Internet Expense and thus this would become non taxable. + + + + + DRI + Driver Salary + + python + result = bool(contract.l10n_in_driver_salay) + fix + + + Rs. 900 per month (non taxable) + + + + + + + + EPMF + Employee's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + Employer contribution does not become part of employee’s income and hence income tax is not payable on this part. + + + + + + + ENPFC + Employee's NPS Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_cbda_percent') +result = -contract.wage * pf_ctb_percent + + + + Employee can claim deduction even of employer's contribution to NPS. + + + + + VPF + Voluntary Provident Fund Contribution + + python + result = bool(contract.l10n_in_voluntary_provident_fund) + code + +VPF = contract.l10n_in_voluntary_provident_fund +result = -contract.wage * VPF / 100 + + + + VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government.This additional amount enjoys all the benefits of PF except that the employer is not liable to contribute any extra amount apart from 12%.An added advantage is that the interest rate is equal to the interest rate of PF and he withdrawal is tax free. Please note that the maximum contribution towards VPF is 100% of your Basic.The highest rate of interest (close to 9%) makes it a very attractive saving scheme. Because of these advantages many employees chose not to close their PF account even after getting employment else where other than India.Employees also get a major tax break on their entire contribution to the fund up to a ceiling of Rs. 70,000/- + + + + + CPT + Deduction for Company Provided Transport + + none + fix + + + + Company provided transport amount is based on company. + + + + + fix + + 'WORK100' in worked_days and worked_days['WORK100'].number_of_days + FD + + Deduction Towards Food Coupons + + + + + + + LWFE + Employee's Deduction Towards State Labour Welfare Fund + + fix + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + + LWF + Employer's Deduction Towards State Labour Welfare Fund + + fix + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + + CGTI + Deduction Towards Company Provided Group Term Insurance + + fix + + + + Group term insurance provides a solid foundation to a comprehensive employee benifit program,backed up by government asistance in the form of valuable tax incentives to both employees and employers. + + + + + DLA + Deduction Towards Leave Availed + + python + result = 'LAI' in inputs + code + +result = -inputs['LAI'].amount +result_name = inputs['LAI'].name + + + + + + CMT + Deduction Towards Company Provided Medical Insurance + + python + result = bool(contract.l10n_in_medical_insurance) + code + +result = -contract.l10n_in_medical_insurance + + + + + + + + + ODE + Other Deduction from Employer + + fix + + + + + + + + ENPC + Employer's NPS Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_cbda_percent') +result = -contract.wage * pf_ctb_percent + + + + Any amount contributed by your employer to your NPS account is treated as part of your salary and is included in your income but you can claim deduction under Section 80C for this too.thus, effectively making it exempt from tax within the limit of 10% of your basic salary. This is very useful and tax efficient for you particularly if you fall in the maximum tax. + + + + + EPF + Employer's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + + + + Both the employees and employer contribute to the fund at the rate of 12% of the basic wages, dearness allowance and retaining allowance, if any, payable to employees per month. + + + + + ESICS + Employer's State Insurance Corporation + + + python + result = bool(contract.l10n_in_esic_amount) + code + result = -contract.l10n_in_esic_amount + + + + + + EXPENSE + Refund Expenses + + python + result = 'EXPENSES' in inputs + code + +result = inputs['EXPENSES'].amount +result_name = inputs['EXPENSES'].name + + + + + + GRATUITY + Gratuity + + + python + result = bool(contract.l10n_in_gratuity) + code + result = -contract.l10n_in_gratuity + + + + + PF + Provident fund + + python + result = bool(contract.l10n_in_provident_fund) + code + +PF = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * PF + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml new file mode 100644 index 000000000..e67fcffda --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml @@ -0,0 +1,248 @@ + + + + + + + + + + TDS + Tax Deducted at Source + + python + result = bool(contract.l10n_in_tds) + code + result = -(contract.l10n_in_tds) + + + As per income tax rules, all payment which are taxable in nature should be done after deduction of taxes at the source itself. Hence employer compute income tax on salary payment and deduct it every month. This TDS is based on employee’s saving/investment declaration at the start of year. If investments for tax saving is not done, large amount may be deducted in last few months. + + + + + HRA + House Rent Allowance + + + code + +hra_value = payslip._rule_parameter('l10n_in_hra_value') +result = categories['BASIC'] * hra_value + + + + + + STD + Standard Allowance + + + 1 + code + +std_awl = payslip._rule_parameter('l10n_in_std_alw') +work_rate = 1 +if payslip.worked_days_line_ids: + total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) + total_unpaid_days = worked_days['LEAVE90'].number_of_days if 'LEAVE90' in worked_days else 0 + work_rate = (total_days - total_unpaid_days) / total_days +result = std_awl * work_rate + + + + + + BONUS + Bonus + + + code + +bonus_percent = payslip._rule_parameter('l10n_in_bonus_percent') +result = 0 +for treshhold, coef in bonus_percent: + annual_wage = contract.wage * coef[0] + if annual_wage < treshhold: + result = categories['BASIC'] * coef[1] + break + + + + + + LTA + Leave Travel Allowance + + + code + +lta_percent = payslip._rule_parameter('l10n_in_lta_percent') +result = 0 +for treshhold, coef in lta_percent: + annual_wage = contract.wage * coef[0] + if annual_wage < treshhold: + result = categories['BASIC'] * coef[1] + break + + + + + + SPL + Supplementary Allowance + + + code + +basic_and_alw = categories['BASIC'] + categories['ALW'] +basic_in_per = payslip._rule_parameter('l10n_in_basic_percent') +result = payslip.paid_amount * basic_in_per - basic_and_alw + + + + + + P_BONUS + Performance Bonus + + + code + +basic_percent = payslip._rule_parameter('l10n_in_basic_percent') +regular_bonus_percent = payslip._rule_parameter('l10n_in_regular_bonus_percent') +worked_days_ratio = 1 +if payslip.worked_days_line_ids: + total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) + total_unpaid_days = worked_days['LEAVE90'].number_of_days if 'LEAVE90' in worked_days else 0 + worked_days_ratio = (total_days - total_unpaid_days) / total_days +bonus_base_ded = contract.wage * basic_percent * 2 / payslip._rule_parameter('l10n_in_leave_days') + contract.l10n_in_gratuity +bonus_base = contract.wage * regular_bonus_percent - bonus_base_ded +result = bonus_base * worked_days_ratio + + + + + + + + + + + LEAVE + Leave Allowance + + + python + result = bool(contract.l10n_in_leave_allowance) + code + result = contract.l10n_in_leave_allowance + + False + + + + PT + Professional Tax + + + code + +amounts = payslip._rule_parameter('l10n_in_professional_tax') +if categories['GROSS'] >= 12000: + result = amounts[0] +elif categories['GROSS'] >= 9000 and categories['GROSS'] < 12000: + result = amounts[1] +elif categories['GROSS'] >= 6000 and categories['GROSS'] < 9000: + result = amounts[2] +else: + result = 0 + + + + + + PF + Provident fund - Employee + + + python + result = bool(contract.l10n_in_provident_fund) + code + +total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) +total_worked_days = total_days - ('LEAVE90' in worked_days and worked_days['LEAVE90'].number_of_days) +result = - categories['BASIC'] * payslip._rule_parameter('l10n_in_pf_percent') if ((categories['BASIC']) < 15000) else -(1800/total_days) * total_worked_days + + + + + + PFE + Provident fund - Employer + + + python + result = bool(contract.l10n_in_provident_fund) + code + +total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) +total_worked_days = total_days - ('LEAVE90' in worked_days and worked_days['LEAVE90'].number_of_days) +result = - categories['BASIC'] * payslip._rule_parameter('l10n_in_pf_percent') if ((categories['BASIC']) < 15000) else -(1800/total_days) * total_worked_days + + + + + + ATTACH_SALARY + Attachment of Salary + + + python + result = 'ATTACH_SALARY' in inputs + code + +result = -inputs['ATTACH_SALARY'].amount +result_name = inputs['ATTACH_SALARY'].name + + + + + + ASSIG_SALARY + Assignment of Salary + + + code + python + result = 'ASSIG_SALARY' in inputs + +result = -inputs['ASSIG_SALARY'].amount +result_name = inputs['ASSIG_SALARY'].name + + + + + Expenses Reimbursement + EXPENSES + + + python + result = inputs['EXPENSES'].amount > 0.0 if 'EXPENSES' in inputs else False + code + +result = inputs['EXPENSES'].amount +result_name = inputs['EXPENSES'].name + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml new file mode 100644 index 000000000..460431122 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml new file mode 100644 index 000000000..7709ab313 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml @@ -0,0 +1,50 @@ + + + + TCA + Transport/Conveyance Allownace + + fix + + + A conveyance allowance refers to an amount of money reimbursed to someone for the operation of a vehicle or the riding of a vehicle. The allowance is typically a designated amount or percentage of total transportation expenses that is referenced in a country's tax laws or code. Organizations and private or public businesses may also offer a conveyance allowance in addition to reimbursing employees or members for transportation expenses. In this instance, the conveyance allowance may identify an unusual transport occurrence that may not be covered by a designated travel expense report such as travel to a specific job site that requires a daily bus or taxi ride. + + + + + SA + Special + + python + result = bool(contract.l10n_in_supplementary_allowance) + code + result = contract.l10n_in_supplementary_allowance + + This allowance is normally given as an additional benefit to worker and is fully taxable. + + + + + PTD + Professional Tax + + python + result = categories['GROSS'] >= 3000 + code + +amounts = payslip._rule_parameter('l10n_in_professional_tax') +if categories['GROSS'] >= 12000: + result = amounts[0] +elif categories['GROSS'] >= 9000 and categories < 11999: + result = amounts[1] +elif categories['GROSS'] >= 6000 and categories['GROSS'] <= 8999: + result = amounts[2] +else: + result = 0 + + + + Workers living in states that impose the professional tax must submit a payment each half-year for the right to practice a profession or trade. It applies equally to employees who work for the national or state government, and those employed by private corporations. The professional tax uses a six-month accounting system, which divides the year into two periods, beginning on April 1 and October 1. + + + diff --git a/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot b/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot new file mode 100644 index 000000000..149c5d733 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot @@ -0,0 +1,26 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~16.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-06-05 06:08+0000\n" +"PO-Revision-Date: 2023-06-05 06:08+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: model_terms:ir.ui.view,arch_db:l10n_in_hr_payroll.report_payslip_details_template +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model_terms:ir.ui.view,arch_db:l10n_in_hr_payroll.report_payslip_details_template +msgid "Joining Date" +msgstr "" diff --git a/addons_extensions/l10n_in_hr_payroll/models/__init__.py b/addons_extensions/l10n_in_hr_payroll/models/__init__.py new file mode 100644 index 000000000..fe3977d69 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/__init__.py @@ -0,0 +1,10 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import hr_employee +from . import res_users +from . import hr_contract +from . import hr_payslip +from . import hr_payslip_run +from . import res_company +from . import res_config_settings +from . import l10n_in_salary_statement diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py b/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py new file mode 100644 index 000000000..7fea3230b --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py @@ -0,0 +1,47 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import timedelta +from odoo import api, fields, models, _ + + +class HrContract(models.Model): + """ + Employee contract allows to add different values in fields. + Fields are used in salary rule computation. + """ + _inherit = 'hr.contract' + + l10n_in_tds = fields.Float(string='TDS', digits='Payroll', + help='Amount for Tax Deduction at Source') + l10n_in_driver_salay = fields.Boolean(string='Driver Salary', help='Check this box if you provide allowance for driver') + l10n_in_medical_insurance = fields.Float(string='Medical Insurance', digits='Payroll', + help='Deduction towards company provided medical insurance') + l10n_in_provident_fund = fields.Boolean(string='Provident Fund', default=False, + help='Check this box if you contribute for PF') + l10n_in_voluntary_provident_fund = fields.Float(string='Voluntary Provident Fund (%)', digits='Payroll', + help='VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government and VPF computed as percentage(%)') + l10n_in_house_rent_allowance_metro_nonmetro = fields.Float(string='House Rent Allowance (%)', digits='Payroll', + help='HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses for metro city it is 50% and for non metro 40%. \nHRA computed as percentage(%)') + l10n_in_supplementary_allowance = fields.Float(string='Supplementary Allowance', digits='Payroll') + l10n_in_gratuity = fields.Float(string='Gratuity') + l10n_in_esic_amount = fields.Float(string='ESIC Amount', digits='Payroll', + help='Deduction towards company provided ESIC Amount') + l10n_in_leave_allowance = fields.Float(string='Leave Allowance', digits='Payroll', + help='Deduction towards company provided Leave Allowance') + + @api.model + def update_state(self): + contract_type_id = self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation', raise_if_not_found=False) + if contract_type_id: + one_week_ago = fields.Date.today() - timedelta(weeks=1) + contracts = self.env['hr.contract'].search([ + ('date_end', '=', one_week_ago), ('state', '=', 'open'), ('contract_type_id', '=', contract_type_id.id) + ]) + for contract in contracts: + contract.activity_schedule( + 'note.mail_activity_data_reminder', + user_id=contract.hr_responsible_id.id, + note=_("End date of %(name)s's contract is today.", name=contract.employee_id.name), + ) + return super().update_state() diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py b/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py new file mode 100644 index 000000000..4d2f352e3 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py @@ -0,0 +1,24 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import re + +from odoo import fields, models + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + l10n_in_uan = fields.Char(string='UAN', groups="hr.group_hr_user") + l10n_in_pan = fields.Char(string='PAN', groups="hr.group_hr_user") + l10n_in_esic_number = fields.Char(string='ESIC Number', groups="hr.group_hr_user") + l10n_in_relationship = fields.Char("Relationship", groups="hr.group_hr_user", tracking=True) + l10n_in_residing_child_hostel = fields.Integer("Child Residing in hostel", groups="hr.group_hr_user", tracking=True) + + _sql_constraints = [ + ('unique_l10n_in_uan', 'unique (l10n_in_uan)', 'This UAN already exists'), + ('unique_l10n_in_pan', 'unique (l10n_in_pan)', 'This PAN already exists'), + ('unique_l10n_in_esic_number', 'unique (l10n_in_esic_number)', 'This ESIC Number already exists'), + ] + + def _get_employees_with_invalid_ifsc(self): + return self.filtered(lambda emp: not bool(re.match("^[A-Z]{4}0[A-Z0-9]{6}$", emp.bank_account_id.bank_bic))) diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py new file mode 100644 index 000000000..8a59108e2 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py @@ -0,0 +1,57 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime, time + +from odoo import api, models, _ +from odoo.tools import format_date, date_utils + + +class HrPayslip(models.Model): + _inherit = 'hr.payslip' + + def _get_l10n_in_company_working_time(self, return_hours=False): + self.ensure_one() + slip_date_time = datetime.combine(self.date_from, time(12, 0, 0)) + company_work_data = self.company_id.resource_calendar_id.get_work_duration_data( + date_utils.start_of(slip_date_time, 'month'), + date_utils.end_of(slip_date_time, 'month')) + if return_hours: + return company_work_data['hours'] + return company_work_data['days'] + + @api.depends('employee_id', 'struct_id', 'date_from') + def _compute_name(self): + super()._compute_name() + for slip in self.filtered(lambda s: s.country_code == 'IN'): + lang = slip.employee_id.lang or self.env.user.lang + payslip_name = slip.struct_id.payslip_name or _('Salary Slip') + date = format_date(self.env, slip.date_from, date_format="MMMM y", lang_code=lang) + if slip.number: + slip.name = '%(payslip_name)s - %(slip_ref)s - %(dates)s' % { + 'slip_ref': slip.number, + 'payslip_name': payslip_name, + 'dates': date + } + else: + slip.name = '%(payslip_name)s - %(dates)s' % { + 'payslip_name': payslip_name, + 'dates': date + } + + def _get_data_files_to_update(self): + # Note: file order should be maintained + return super()._get_data_files_to_update() + [( + 'l10n_in_hr_payroll', [ + 'data/hr_salary_rule_category_data.xml', + 'data/hr_payroll_structure_type_data.xml', + 'data/hr_rule_parameters_data.xml', + 'data/salary_rules/hr_salary_rule_ind_emp_data.xml', + 'data/salary_rules/hr_salary_rule_regular_pay_data.xml', + 'data/salary_rules/hr_salary_rule_worker_data.xml', + ])] + + def _get_base_local_dict(self): + return {**super()._get_base_local_dict(), '_': self.env._} + + def _get_employee_timeoff_data(self): + return self.env['hr.leave.type'].with_company(self.company_id).with_context(employee_id=self.employee_id.id).get_allocation_data_request() diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py new file mode 100644 index 000000000..28b5e5af7 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py @@ -0,0 +1,26 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, _ + + +class HrPayslipRun(models.Model): + _inherit = 'hr.payslip.run' + + def action_payment_report(self, export_format='advice'): + self.ensure_one() + return { + 'name': _('Create Payment'), + 'type': 'ir.actions.act_window', + 'res_model': 'hr.payroll.payment.report.wizard', + 'view_mode': 'form', + 'view_id': 'hr_payslip_payment_report_view_form', + 'views': [(False, 'form')], + 'target': 'new', + 'context': { + 'default_payslip_ids': self.slip_ids.ids, + 'default_payslip_run_id': self.id, + 'default_export_format': export_format, + 'default_date': self.date_end, + 'dialog_size': 'medium', + }, + } diff --git a/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py b/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py new file mode 100644 index 000000000..0fd72f265 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py @@ -0,0 +1,107 @@ +import calendar + +from odoo import api, fields, models, Command, _ +from dateutil.relativedelta import relativedelta +from collections import defaultdict +from datetime import datetime + + +class L10nInSalaryStatement(models.Model): + _name = 'l10n_in_hr_payroll.salary.statement' + _inherit = 'hr.payroll.declaration.mixin' + _description = 'Salary Statement Report' + + name = fields.Char(string="Description", required=True, compute='_compute_name', readonly=False, store=True) + month = fields.Selection([ + ('1', 'January'), + ('2', 'February'), + ('3', 'March'), + ('4', 'April'), + ('5', 'May'), + ('6', 'June'), + ('7', 'July'), + ('8', 'August'), + ('9', 'September'), + ('10', 'October'), + ('11', 'November'), + ('12', 'December'), + ], required=True, default=lambda self: str((fields.Date.today() + relativedelta(months=-1)).month)) + + def default_get(self, fields_list): + res = super().default_get(fields_list) + res['year'] = str(datetime.now().year) + return res + + @api.depends('year', 'month') + def _compute_name(self): + for sheet in self: + month_name = calendar.month_name[int(sheet.month)] + sheet.name = _('Salary Statement - %(month)s, %(year)s', month=month_name, year=sheet.year) + + def action_generate_declarations(self): + for sheet in self: + date_from = datetime(int(sheet.year), int(sheet.month), 1) + date_to = date_from + relativedelta(months=1, days=-1) + employees = self.env['hr.payslip'].search([ + ('date_to', '<=', date_to), + ('date_from', '>=', date_from), + ('state', 'in', ['done', 'paid']), + ('company_id', '=', sheet.company_id.id), + ]).mapped('employee_id') + + sheet.write({ + 'line_ids': [Command.clear()] + [Command.create({ + 'employee_id': employee.id, + 'res_model': 'l10n_in_hr_payroll.salary.statement', + 'res_id': sheet.id, + }) for employee in employees] + }) + return super().action_generate_declarations() + + def _country_restriction(self): + return 'IN' + + def _get_pdf_report(self): + return self.env.ref('l10n_in_hr_payroll.action_report_salary_statement') + + def _get_rendering_data(self, employees): + self.ensure_one() + date_from = datetime(int(self.year), int(self.month), 1) + date_to = date_from + relativedelta(months=1) + payslips = self.env['hr.payslip'].search([ + ('employee_id', 'in', employees.ids), + ('state', 'in', ['done', 'paid']), + ('date_from', '>=', date_from), + ('date_to', '<=', date_to), + ]) + + result = defaultdict(lambda: { + 'month': calendar.month_name[int(self.month)], + 'year': self.year, + 'allow_rules': defaultdict(lambda: {'name': '', 'total': 0, 'total_annual': 0}), + 'deduct_rules': defaultdict(lambda: {'name': '', 'total': 0, 'total_annual': 0}), + 'ctc': 0, + 'ctc_annual': 0 + }) + + for line in payslips.line_ids.filtered(lambda l: l.salary_rule_id.appears_on_payslip): + employee_id = line.employee_id + rule_category = result[employee_id]['deduct_rules' if line.total < 0 else 'allow_rules'][line.salary_rule_id] + + rule_category['name'] = line.salary_rule_id.name + rule_category['total'] = line.total + rule_category['total_annual'] = line.total * 12 + + if line.code == 'GROSS' or line.total < 0: + total = abs(line.total) + result[employee_id]['ctc'] += total + result[employee_id]['ctc_annual'] += total * 12 + result[employee_id]['date'] = line.date_from.strftime('%d/%m/%Y') + + result = dict(result) + return result + + def _get_pdf_filename(self, employee): + self.ensure_one() + month_name = calendar.month_name[int(self.month)] + return _('%(employee_name)s-salary-statement-report-%(month)s-%(year)s', employee_name=employee.name, month=month_name, year=self.year) diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_company.py b/addons_extensions/l10n_in_hr_payroll/models/res_company.py new file mode 100644 index 000000000..c39f14032 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_company.py @@ -0,0 +1,16 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class ResCompany(models.Model): + _inherit = 'res.company' + + l10n_in_dearness_allowance = fields.Boolean(string='Dearness Allowance', default=True, + help='Check this box if your company provide Dearness Allowance to employee') + l10n_in_epf_employer_id = fields.Char(string="EPF Employer ID", + help="Code of 10 numbers. The first seven numbers represent the establishment ID.\n Next three numbers represent the extension code.") + l10n_in_esic_ip_number = fields.Char(string="ESIC IP Number", + help="Code of 17 digits.\n The Identification number is assigned to the company if registered under the Indian provisions of the Employee\'s State Insurance (ESI) Act.") + l10n_in_pt_number = fields.Char(string="PT Number", + help="Code of 11 digit.\n The P TIN digit number with the first two digits indicating the State.") + l10n_in_is_statutory_compliance = fields.Boolean(string="Statutory Compliance") diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py b/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py new file mode 100644 index 000000000..f799311f2 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + l10n_in_dearness_allowance = fields.Boolean( + string="Dearness Allowance", related='company_id.l10n_in_dearness_allowance', readonly=False) + l10n_in_epf_employer_id = fields.Char(related='company_id.l10n_in_epf_employer_id', readonly=False) + l10n_in_esic_ip_number = fields.Char(related='company_id.l10n_in_esic_ip_number', readonly=False) + l10n_in_pt_number = fields.Char(related='company_id.l10n_in_pt_number', readonly=False) + l10n_in_is_statutory_compliance = fields.Boolean(related='company_id.l10n_in_is_statutory_compliance', readonly=False) diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_users.py b/addons_extensions/l10n_in_hr_payroll/models/res_users.py new file mode 100644 index 000000000..7cc8e695b --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_users.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class User(models.Model): + _inherit = 'res.users' + + l10n_in_relationship = fields.Char(related='employee_id.l10n_in_relationship', readonly=False, related_sudo=False) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + ['l10n_in_relationship'] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + ['l10n_in_relationship'] diff --git a/addons_extensions/l10n_in_hr_payroll/report/__init__.py b/addons_extensions/l10n_in_hr_payroll/report/__init__.py new file mode 100644 index 000000000..495a2479c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/__init__.py @@ -0,0 +1,6 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import report_payroll_advice +from . import report_hr_yearly_salary_detail +from . import report_hr_epf diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py b/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py new file mode 100644 index 000000000..e735a7c07 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py @@ -0,0 +1,149 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import base64 +import io +import calendar +from odoo import api, fields, models +from odoo.tools.misc import xlsxwriter + +MONTH_SELECTION = [ + ('1', 'January'), + ('2', 'February'), + ('3', 'March'), + ('4', 'April'), + ('5', 'May'), + ('6', 'June'), + ('7', 'July'), + ('8', 'August'), + ('9', 'September'), + ('10', 'October'), + ('11', 'November'), + ('12', 'December'), +] + + +class HrEPFReport(models.Model): + _name = 'l10n.in.hr.payroll.epf.report' + _description = 'Indian Payroll: Employee Provident Fund Report' + + month = fields.Selection(MONTH_SELECTION, default='1', required=True) + year = fields.Integer(required=True, default=lambda self: fields.Date.context_today(self).year) + xls_file = fields.Binary(string="XLS file") + xls_filename = fields.Char() + + @api.depends('month', 'year') + def _compute_display_name(self): + month_description = dict(self._fields['month']._description_selection(self.env)) + for report in self: + report.display_name = f"{month_description.get(report.month)}-{report.year}" + + @api.model + def _get_employee_pf_data(self, year, month): + # Get the relevant records based on the year and month + indian_employees = self.env['hr.employee'].search([('contract_id.l10n_in_provident_fund', '=', True)]).filtered(lambda e: e.company_country_code == 'IN') + + result = [] + end_date = calendar.monthrange(year, int(month))[1] + + payslips = self.env['hr.payslip'].search([ + ('employee_id', 'in', indian_employees.ids), + ('date_from', '>=', f'{year}-{month}-1'), + ('date_to', '<=', f'{year}-{month}-{end_date}'), + ('state', 'in', ('done', 'paid')) + ]) + + if not payslips: + return [] + + payslip_line_values = payslips._get_line_values(['GROSS', 'BASIC', 'PF']) + + for employee in indian_employees: + + wage = 0 + epf = 0 + eps = 0 + epf_contri = 0 + + payslip_ids = payslips.filtered(lambda p: p.employee_id == employee) + + if not payslip_ids: + continue + + for payslip in payslip_ids: + pf_value = payslip_line_values['PF'][payslip.id]['total'] + if pf_value == 0: + continue + + epf_contri -= pf_value + wage += payslip_line_values['GROSS'][payslip.id]['total'] + epf += payslip_line_values['BASIC'][payslip.id]['total'] + + # Skip the employee if there are no valid PF contributions + if epf_contri == 0: + continue + + # Calculate contributions and differences + eps = min(payslip_ids[0]._rule_parameter('l10n_in_pf_amount'), epf) + eps_contri = round(eps * payslip_ids[0]._rule_parameter('l10n_in_eps_contri_percent'), 2) + diff = round(epf_contri - eps_contri, 2) + + result.append(( + employee.l10n_in_uan, + employee.name, + wage, + epf, + eps, + eps, + epf_contri, + eps_contri, + diff, + 0, 0, + )) + + return result + + def action_export_xlsx(self): + self.ensure_one() + + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + worksheet = workbook.add_worksheet('Employee_provident_fund_report') + style_highlight = workbook.add_format({'bold': True, 'pattern': 1, 'bg_color': '#E0E0E0', 'align': 'center'}) + style_normal = workbook.add_format({'align': 'center', 'font_size': 12}) + row = 0 + worksheet.set_row(row, 20) + + headers = [ + "UAN", + "MEMBER NAME", + "GROSS WAGES", + "EPF WAGES", + "EPS WAGES", + "EDLI WAGES", + "EPF CONTRIBUTION REMITTED", + "EPS CONTRIBUTION REMITTED", + "EPF EPS DIFFERENCE REMITTED", + "NCP DAYS", + "REFUNDED OF ADVANCES" + ] + + rows = self._get_employee_pf_data(self.year, self.month) + + for col, header in enumerate(headers): + worksheet.write(row, col, header, style_highlight) + worksheet.set_column(col, col, 30) + + row = 1 + for data_row in rows: + col = 0 + worksheet.set_row(row, 20) + for data in data_row: + worksheet.write(row, col, data, style_normal) + col += 1 + row += 1 + + workbook.close() + xlsx_data = output.getvalue() + + self.xls_file = base64.encodebytes(xlsx_data) + self.xls_filename = f"{self.display_name} EPF Report.xlsx" diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py b/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py new file mode 100644 index 000000000..a12f3f8b6 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py @@ -0,0 +1,149 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date +from dateutil.relativedelta import relativedelta + + +from odoo import api, fields, models, _ +from odoo.tools import SQL +from odoo.exceptions import UserError + +class EmployeesYearlySalaryReport(models.AbstractModel): + _name = 'report.l10n_in_hr_payroll.report_hryearlysalary' + _description = "Indian Yearly Salary Report" + + # YTI: This mess deserves a good cleaning + + def _get_periods_new(self, form): + months = [] + # Get start year-month-date and end year-month-date + first_year = int(form['year']) + first_month = 1 + + # Get name of the months from integer + month_name = [] + for count in range(0, 12): + m = date(first_year, first_month, 1).strftime('%b') + month_name.append(m) + months.append(f"{first_month:02d}-{first_year}") + if first_month == 12: + first_month = 0 + first_year += 1 + first_month += 1 + return [month_name], months + + def _get_employee(self, form): + return self.env['hr.employee'].browse(form.get('employee_ids', [])) + + def _get_employee_detail_new(self, form, employee_id, months, date_from, date_to): + structures_data = {} + payslip_lines = self._cal_monthly_amt(form, employee_id, months, date_from, date_to) + for structure_name, payslip_data in payslip_lines.items(): + allow_list = [] + deduct_list = [] + total = 0.0 + gross = False + net = False + for line in payslip_data: + code = line[0] + subline = line[1:] + if code == "GROSS": + gross = [code, subline] + elif code == "NET": + net = [code, subline] + elif subline[-1] > 0.0 and code != "NET": + total += subline[-1] + allow_list.append([code, subline]) + elif subline[-1] < 0.0: + total += subline[-1] + deduct_list.append([code, subline]) + + if gross: + allow_list.append(gross) + if net: + deduct_list.append(net) + + structures_data[structure_name] = { + 'allow_list': allow_list, + 'deduct_list': deduct_list, + 'total': total, + } + + return structures_data + + def _cal_monthly_amt(self, form, emp_id, months, date_from, date_to): + result = {} + salaries = {} + + self.env.cr.execute(SQL( + """ + SELECT src.code, pl.name, sum(pl.total), to_char(p.date_to,'mm-yyyy') as to_date, ps.name + FROM hr_payslip_line as pl + LEFT JOIN hr_salary_rule AS sr on sr.id = pl.salary_rule_id + LEFT JOIN hr_salary_rule_category AS src on (sr.category_id = src.id) + LEFT JOIN hr_payslip as p on pl.slip_id = p.id + LEFT JOIN hr_employee as e on e.id = p.employee_id + LEFT JOIN hr_payroll_structure as ps on ps.id = p.struct_id + WHERE p.employee_id = %(employee_id)s + AND p.state = 'paid' + AND p.date_from >= %(date_from)s AND p.date_to <= %(date_to)s + GROUP BY src.parent_id, pl.sequence, pl.id, sr.category_id, pl.name, p.date_to, src.code, ps.name + ORDER BY pl.sequence, src.parent_id + """, employee_id=emp_id, date_from=date_from, date_to=date_to + )) + + for category_code, item_name, amount, payslip_date, structure_name in self.env.cr.fetchall(): + salaries.setdefault(structure_name, {}).setdefault(category_code, {}).setdefault(item_name, {}).setdefault(payslip_date, 0.0) + salaries[structure_name][category_code][item_name][payslip_date] += amount + + result = {key: self.salary_list(value, months) for key, value in salaries.items()} + return result + + def salary_list(self, salaries, months): + cat_salary_all = [] + for code, category_amount in salaries.items(): + for category_name, amount in category_amount.items(): + cat_salary = [code, category_name] + total = 0.0 + for month in months: + if month != 'None': + if len(month) != 7: + month = '0' + str(month) + if amount.get(month): + cat_salary.append(amount[month]) + total += amount[month] + else: + cat_salary.append(0.00) + else: + cat_salary.append('') + cat_salary.append(total) + cat_salary_all.append(cat_salary) + return cat_salary_all + + @api.model + def _get_report_values(self, docids, data=None): + if not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Form content is missing, this report cannot be printed.")) + + model = self.env.context.get('active_model') + docs = self.env[model].browse(self.env.context.get('active_id')) + employees = self._get_employee(data['form']) + month_name, months = self._get_periods_new(data['form']) + date_from = fields.Date.today() + relativedelta(day=1, month=1, year=int(data['form']['year'])) + date_to = fields.Date.today() + relativedelta(day=31, month=12, year=int(data['form']['year'])) + + employee_data = {} + for employee in employees: + structures_data = self._get_employee_detail_new(data['form'], employee.id, months, date_from, date_to) + employee_data[employee.id] = structures_data + return { + 'doc_ids': docids, + 'doc_model': model, + 'data': data, + 'docs': docs, + 'date_from': date_from, + 'date_to': date_to, + 'get_employee': self._get_employee, + 'get_periods': lambda form: month_name, + 'get_employee_detail_new': lambda emp_id: employee_data.get(emp_id, {}), + } diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py b/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py new file mode 100644 index 000000000..164384c4f --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py @@ -0,0 +1,34 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import time + +from odoo import api, models + + +class payroll_advice_report(models.AbstractModel): + _name = 'report.l10n_in_hr_payroll.report_payrolladvice' + _description = "Indian Payroll Advice Report" + + def get_month(self, input_date): + res = { + 'from_name': '', 'to_name': '' + } + slip = self.env['hr.payslip'].search([('date_from', '<=', input_date), ('date_to', '>=', input_date)], limit=1) + if slip: + from_date = slip.date_from + to_date = slip.date_to + res['from_name'] = from_date.strftime('%d') + '-' + from_date.strftime('%B') + '-' + from_date.strftime('%Y') + res['to_name'] = to_date.strftime('%d') + '-' + to_date.strftime('%B') + '-' + to_date.strftime('%Y') + return res + + @api.model + def _get_report_values(self, docids, data=None): + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(docids) + return { + 'doc_ids': docids, + 'doc_model': 'hr.payroll.payment.report.wizard', + 'data': data, + 'docs': payment_report, + 'time': time, + 'get_month': self.get_month, + } diff --git a/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv b/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv new file mode 100644 index 000000000..9a1946dc0 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv @@ -0,0 +1,6 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_yearly_salary_detail_user","yearly.salary.detail","model_yearly_salary_detail","hr_payroll.group_hr_payroll_user",1,1,1,0 +l10n_in_hr_payroll.access_salary_register_wizard,access_salary_register_wizard,l10n_in_hr_payroll.model_salary_register_wizard,hr_payroll.group_hr_payroll_user,1,1,1,1 +l10n_in_hr_payroll.access_l10n_in_tds_computation_wizard,access_l10n_in_tds_computation_wizard,l10n_in_hr_payroll.model_l10n_in_tds_computation_wizard,base.group_user,1,1,1,0 +access_report_l10n_in_hr_payroll_report_epf,report.l10n_in_hr_payroll.report_epf,model_l10n_in_hr_payroll_epf_report,hr_payroll.group_hr_payroll_user,1,1,1,1 +l10n_in_hr_payroll.access_l10n_in_hr_payroll_salary_statement,access_l10n_in_hr_payroll_salary_statement,l10n_in_hr_payroll.model_l10n_in_hr_payroll_salary_statement,"hr_payroll.group_hr_payroll_user",1,1,1,1 diff --git a/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg b/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f3908976b122c3dad2ae009e7c11e662b091544 GIT binary patch literal 40913 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 literal 0 HcmV?d00001 diff --git a/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg b/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5d7d9c73872ffc50b2fb239edc9572c59f3e1a2 GIT binary patch literal 55165 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 Y+(#(60NH;})7sbVj>lq0voSya+4t|r2LJ#7 literal 0 HcmV?d00001 diff --git a/addons_extensions/l10n_in_hr_payroll/tests/__init__.py b/addons_extensions/l10n_in_hr_payroll/tests/__init__.py new file mode 100644 index 000000000..e275ab870 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/__init__.py @@ -0,0 +1,4 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_payment_advice_batch +from . import test_hr_contract diff --git a/addons_extensions/l10n_in_hr_payroll/tests/common.py b/addons_extensions/l10n_in_hr_payroll/tests/common.py new file mode 100644 index 000000000..eda93ec02 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/common.py @@ -0,0 +1,88 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date + +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestPayrollCommon(TransactionCase): + + def setUp(self): + super(TestPayrollCommon, self).setUp() + + self.Bank = self.env['res.partner.bank'] + self.Employee = self.env['hr.employee'] + self.PayslipRun = self.env['hr.payslip.run'] + self.PayslipEmployee = self.env['hr.payslip.employees'] + self.Company = self.env['res.company'] + self.partner = self.env.ref('base.partner_admin') + self.bank_1 = self.env.ref('base.res_bank_1') + self.in_country = self.env.ref('base.in') + self.rd_dept = self.env.ref('hr.dep_rd') + self.employee_fp = self.env.ref('hr.employee_admin') + self.employee_al = self.env.ref('hr.employee_al') + + self.company_in = self.Company.create({ + 'name': 'Company IN', + 'country_code': 'IN', + }) + + self.in_bank = self.env['res.bank'].create({ + 'name': 'Bank IN', + 'bic': 'ABCD0123456' + }) + + # I create a new employee “Rahul” + self.rahul_emp = self.Employee.create({ + 'name': 'Rahul', + 'country_id': self.in_country.id, + 'department_id': self.rd_dept.id, + }) + + # I create a new employee “Rahul” + self.jethalal_emp = self.Employee.create({ + 'name': 'Jethalal', + 'country_id': self.in_country.id, + 'department_id': self.rd_dept.id, + }) + + self.res_bank = self.Bank.create({ + 'acc_number': '3025632343043', + 'partner_id': self.rahul_emp.work_contact_id.id, + 'acc_type': 'bank', + 'bank_id': self.in_bank.id, + 'allow_out_payment': True, + }) + self.rahul_emp.bank_account_id = self.res_bank + + self.res_bank_1 = self.Bank.create({ + 'acc_number': '3025632343044', + 'partner_id': self.jethalal_emp.work_contact_id.id, + 'acc_type': 'bank', + 'bank_id': self.in_bank.id, + 'allow_out_payment': True, + }) + self.jethalal_emp.bank_account_id = self.res_bank_1 + + self.contract_rahul = self.env['hr.contract'].create({ + 'date_start': date(2023, 1, 1), + 'date_end': date(2023, 1, 31), + 'name': 'Rahul Probation contract', + 'wage': 5000.0, + 'employee_id': self.rahul_emp.id, + 'state': 'open', + 'hr_responsible_id': self.employee_fp.id, + }) + + self.contract_jethalal = self.env['hr.contract'].create({ + 'date_start': date(2023, 1, 1), + 'date_end': date(2023, 1, 31), + 'name': 'Jethalal Probation contract', + 'wage': 5000.0, + 'employee_id': self.jethalal_emp.id, + 'state': 'open', + 'hr_responsible_id': self.employee_fp.id, + }) diff --git a/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py b/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py new file mode 100644 index 000000000..dae2eb72c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py @@ -0,0 +1,43 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date + +from freezegun import freeze_time +from odoo.addons.l10n_in_hr_payroll.tests.common import TestPayrollCommon +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestHrContract(TestPayrollCommon): + + def test_contract_end_reminder_to_hr(self): + """ Check reminder activity is set the for probation contract + Test Case + --------- + 1) Create contract + 2) Check the activity is activity schedule or not + 3) Now run cron + 4) Check the activity is activity schedule or not + """ + user_admin_id = self.env.ref('base.user_admin').id + + contract = self.env['hr.contract'].create({ + 'date_start': date(2020, 1, 1), + 'date_end': date(2020, 4, 30), + 'name': 'Rahul Probation contract', + 'resource_calendar_id': self.env.company.resource_calendar_id.id, + 'wage': 5000.0, + 'employee_id': self.rahul_emp.id, + 'state': 'open', + 'contract_type_id': self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation').id, + 'kanban_state': 'done', + 'hr_responsible_id': user_admin_id, + }) + with freeze_time("2020-04-24"): + mail_activity = self.env['mail.activity'].search([('res_id', '=', contract.id), ('res_model', '=', 'hr.contract')]) + self.assertFalse(mail_activity.exists(), "There should be no mail activity as contract is not ends on 2020-04-10") + # run the cron + self.env['hr.contract'].update_state() + mail_activity = self.env['mail.activity'].search([('res_id', '=', contract.id), ('res_model', '=', 'hr.contract')]) + self.assertTrue(mail_activity.exists(), "There should be reminder activity as employee rahul's contract end today") diff --git a/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py b/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py new file mode 100644 index 000000000..a2236c129 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py @@ -0,0 +1,62 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import Command +from odoo.addons.l10n_in_hr_payroll.tests.common import TestPayrollCommon +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestPaymentAdviceBatch(TestPayrollCommon): + def _prepare_payslip_run(self): + payslip_run = self.env['hr.payslip.run'].create({ + 'date_start': '2023-01-01', + 'date_end': '2023-01-31', + 'name': 'January Batch', + 'company_id': self.company_in.id, + }) + + payslip_employee = self.env['hr.payslip.employees'].with_company(self.company_in).create({ + 'employee_ids': [ + Command.set([self.rahul_emp.id, self.jethalal_emp.id]) + ] + }) + + payslip_employee.with_context(active_id=payslip_run.id).compute_sheet() + payslip_run.action_validate() + return payslip_run + + def test_payment_report_advice_xlsx_creation(self): + payslip_run = self._prepare_payslip_run() + self.assertEqual(payslip_run.state, "close", "Payslip run should be in Done state") + + # Generating the XLSX report for the batch + payment_report_dict = self.env["hr.payroll.payment.report.wizard"].create({ + 'payslip_ids': payslip_run.slip_ids.ids, + 'payslip_run_id': payslip_run.id, + 'export_format': 'advice', + }).generate_payment_report_xls() + + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(payment_report_dict['res_id']) + + self.assertTrue(payslip_run.payment_report, "XLSX File should be generated!") + self.assertTrue(payment_report.l10n_in_payment_advice_xlsx, "XLSX File should be generated!") + self.assertEqual(payment_report.l10n_in_payment_advice_filename_xlsx, payment_report.l10n_in_reference + '.xlsx') + self.assertTrue(payslip_run.payment_report_filename) + + def test_payment_report_advice_pdf_creation(self): + payslip_run = self._prepare_payslip_run() + self.assertEqual(payslip_run.state, "close", "Payslip run should be in Done state") + + # Generating the PDF report for the batch + payment_report_dict = self.env["hr.payroll.payment.report.wizard"].create({ + 'payslip_ids': payslip_run.slip_ids.ids, + 'payslip_run_id': payslip_run.id, + 'export_format': 'advice', + }).generate_payment_report_pdf() + + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(payment_report_dict['res_id']) + + self.assertTrue(payslip_run.payment_report, "PDF File should be generated!") + self.assertTrue(payment_report.l10n_in_payment_advice_pdf, "PDF File should be generated!") + self.assertEqual(payment_report.l10n_in_payment_advice_filename_pdf, payment_report.l10n_in_reference + '.pdf') + self.assertTrue(payslip_run.payment_report_filename) diff --git a/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml b/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml new file mode 100644 index 000000000..61525ffca --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml @@ -0,0 +1,30 @@ + + + + hr.contract.form.in.inherit + hr.contract + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml b/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml new file mode 100644 index 000000000..60beb61ec --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml @@ -0,0 +1,25 @@ + + + + + hr.employee.form.in.inherit + hr.employee + + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml new file mode 100644 index 000000000..abb5873ff --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml @@ -0,0 +1,56 @@ + + + + PaySlip Details + hr.payslip + qweb-pdf + l10n_in_hr_payroll.report_payslip + l10n_in_hr_payroll.report_payslip + 'Payslip - %s' % (object.employee_id.name) + + report + + + + PaySlip Details (Light) + hr.payslip + qweb-pdf + l10n_in_hr_payroll.report_light_payslip + l10n_in_hr_payroll.report_light_payslip + 'Payslip - %s' % (object.employee_id.name) + + report + + + + + Advice Report + hr.payroll.payment.report.wizard + qweb-pdf + l10n_in_hr_payroll.report_payrolladvice + l10n_in_hr_payroll.report_payrolladvice + report + + + + Yearly Salary by Employee + yearly.salary.detail + qweb-pdf + l10n_in_hr_payroll.report_hryearlysalary + l10n_in_hr_payroll.report_hryearlysalary + + + report + + + + Salary Statement + hr.employee + qweb-pdf + l10n_in_hr_payroll.report_salary_statement + l10n_in_hr_payroll.report_salary_statement + (object._get_report_base_filename()) + + report + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml new file mode 100644 index 000000000..e20b244dc --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml @@ -0,0 +1,45 @@ + + + + l10n_in_hr_payroll.salary.statement.form + l10n_in_hr_payroll.salary.statement + +
+
+
+ +
+ +
+ + + + + +
+
+
+
+ + + Salary Statement Report + ir.actions.act_window + l10n_in_hr_payroll.salary.statement + list,form + + + +
diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml b/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml new file mode 100644 index 000000000..4ae4ba964 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml @@ -0,0 +1,54 @@ + + + + + l10n.in.hr.payroll.epf.report + + + + + + + + + + l10n.in.hr.payroll.epf.report + +
+
+
+ + + + + + + + +
+

Generation Complete

+

+ Download the XLSX details file:
+ +

+
+
+
+
+
+ + + EPF Report + l10n.in.hr.payroll.epf.report + list,form + + + + +
diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml new file mode 100644 index 000000000..5d0f6604a --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml @@ -0,0 +1,106 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml b/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml new file mode 100644 index 000000000..e80c36790 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml @@ -0,0 +1,69 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml new file mode 100644 index 000000000..15d7d2a8e --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml @@ -0,0 +1,68 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml new file mode 100644 index 000000000..738013749 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml b/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml new file mode 100644 index 000000000..4f32bd9ac --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml @@ -0,0 +1,40 @@ + + + + res.config.settings.view.form.inherit.l10n_in_hr_payroll + res.config.settings + + + +

Indian Localization

+
+
+
+
+ Company Information +
+ Offical Company Information +
+ + + +
+
+
+
+ +
+
+
+
+
+ + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml b/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml new file mode 100644 index 000000000..e82fef0f8 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml @@ -0,0 +1,15 @@ + + + + + res.user.preferences.view.form.l10n.in.payroll.inherit + res.users + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py b/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py new file mode 100644 index 000000000..6bdea8998 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py @@ -0,0 +1,6 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import hr_yearly_salary_detail +from . import hr_salary_register +from . import hr_tds_calculation +from . import hr_payroll_payment_report_wizard diff --git a/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml b/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml new file mode 100644 index 000000000..d77e14d16 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml @@ -0,0 +1,36 @@ + + + + hr.payroll.payment.advice.report.wizard.form + hr.payroll.payment.report.wizard + + + + + + + + + + + + + + + export_format == 'advice' + + +