From e8623a009a269e1b40348d0203239f8f62ce7060 Mon Sep 17 00:00:00 2001 From: jmra-odoo <jmra@odoo.com> Date: Mon, 17 Mar 2025 13:18:22 +0530 Subject: [PATCH 1/3] [ADD] l10n_in_hr_payroll_extension: Indian l10n modification for hr_payroll With This Commit ======================================================== - Added default configurations for deductions and allowances in setting. - Added salary components and deductions section in `hr_contract`. - Implemented dynamic percentage-based calculations for payroll allowances. - Added computation logic to ensure real-time updates based on wage. - Improved salary structure display in payroll & employee contracts. --- l10n_in_hr_payroll_extension/__init__.py | 1 + l10n_in_hr_payroll_extension/__manifest__.py | 10 ++ .../models/__init__.py | 3 + .../models/hr_contract.py | 118 +++++++++++++ .../models/res_company.py | 27 +++ .../models/res_config_settings.py | 36 ++++ .../views/hr_contract_views.xml | 146 ++++++++++++++++ .../views/res_config_settings_views.xml | 163 ++++++++++++++++++ 8 files changed, 504 insertions(+) create mode 100644 l10n_in_hr_payroll_extension/__init__.py create mode 100644 l10n_in_hr_payroll_extension/__manifest__.py create mode 100644 l10n_in_hr_payroll_extension/models/__init__.py create mode 100644 l10n_in_hr_payroll_extension/models/hr_contract.py create mode 100644 l10n_in_hr_payroll_extension/models/res_company.py create mode 100644 l10n_in_hr_payroll_extension/models/res_config_settings.py create mode 100644 l10n_in_hr_payroll_extension/views/hr_contract_views.xml create mode 100644 l10n_in_hr_payroll_extension/views/res_config_settings_views.xml diff --git a/l10n_in_hr_payroll_extension/__init__.py b/l10n_in_hr_payroll_extension/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/l10n_in_hr_payroll_extension/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/l10n_in_hr_payroll_extension/__manifest__.py b/l10n_in_hr_payroll_extension/__manifest__.py new file mode 100644 index 00000000000..1e4175e4ae9 --- /dev/null +++ b/l10n_in_hr_payroll_extension/__manifest__.py @@ -0,0 +1,10 @@ +{ + 'name': "Indian Payroll Extension", + 'depends': ['l10n_in_hr_payroll'], + 'installable': True, + 'license': 'LGPL-3', + 'data': [ + 'views/res_config_settings_views.xml', + 'views/hr_contract_views.xml', + ], +} diff --git a/l10n_in_hr_payroll_extension/models/__init__.py b/l10n_in_hr_payroll_extension/models/__init__.py new file mode 100644 index 00000000000..880e048d29b --- /dev/null +++ b/l10n_in_hr_payroll_extension/models/__init__.py @@ -0,0 +1,3 @@ +from . import res_company +from . import res_config_settings +from . import hr_contract diff --git a/l10n_in_hr_payroll_extension/models/hr_contract.py b/l10n_in_hr_payroll_extension/models/hr_contract.py new file mode 100644 index 00000000000..025d95d27b1 --- /dev/null +++ b/l10n_in_hr_payroll_extension/models/hr_contract.py @@ -0,0 +1,118 @@ +from odoo import api, fields, models + + +class HrContract(models.Model): + _inherit = 'hr.contract' + + l10n_in_basic_salary = fields.Float(string="Basic Salary", help="Basic salary calculated from the wage", compute="_compute_l10n_in_basic_salary", inverse="_inverse_l10n_in_basic_salary") + l10n_in_house_rent_allowance = fields.Float(string="House Rent Allowance", compute="_compute_l10n_in_house_rent_allowance", inverse="_inverse_l10n_in_house_rent_allowance") + l10n_in_standard_allowance = fields.Float(string="Standard Allowance", default=4167) + l10n_in_performance_bonus = fields.Float(string="Performance Bonus", compute="_compute_l10n_in_performance_bonus", inverse="_inverse_l10n_in_performance_bonus") + l10n_in_leave_travel_allowance = fields.Float(string="Leave Travel Allowance", compute="_compute_l10n_in_leave_travel_allowance", inverse="_inverse_l10n_in_leave_travel_allowance") + l10n_in_leave_allowance = fields.Float(string="Leave Allowance", compute="_compute_leave_allowance", inverse="_inverse_leave_allowance") + l10n_in_leave_days = fields.Float(string="Leave Days", default=1) + l10n_in_gratuity = fields.Float(string="Gratuity", default=0) + l10n_in_supplementary_allowance = fields.Float(string="Supplementary Allowance", compute="_compute_l10n_in_supplementary_allowance", inverse="_inverse_l10n_in_supplementary_allowance", default=0) + + l10n_in_basic_salary_percent = fields.Float(string="Basic Salary Percentage", help="basic salary percentage of wage", default=50) + l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance Percentage", help="this is the percentage of basic salary", default=50) + l10n_in_standard_allowance_percent = fields.Float(string="Standard Allowance Percentage", compute="_compute_l10n_in_standard_allowance_percent", inverse="_inverse_l10n_in_standard_allowance_percent") + l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus Percentage", default=20) + l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance Percentage", default=20) + l10n_in_leave_allowance_per_day_percent = fields.Float(string="Leave allowance per day percentage") + l10n_in_leave_allowance_percent = fields.Float(string="Leave Allowance Percentage") + l10n_in_gratuity_percent = fields.Float(string="Gratuity Percentage", compute="_compute_l10n_in_gratuity_percent", inverse="_inverse_l10n_in_gratuity_percent") + l10n_in_supplementary_allowance_percent = fields.Float(string="Supplementary Allowance Percentage") + + l10n_in_pf_employee_contribution = fields.Float(related="company_id.l10n_in_pf_employee_contribution", readonly=False) + l10n_in_pf_employer_contribution = fields.Float(related="company_id.l10n_in_pf_employer_contribution", readonly=False) + l10n_in_professional_tax = fields.Float(string="Professional Tax", default=200) + l10n_in_esic_employee_contribution = fields.Float(related="company_id.l10n_in_esic_employee_contribution", readonly=False) + l10n_in_esic_employer_contribution = fields.Float(related="company_id.l10n_in_esic_employer_contribution", readonly=False) + l10n_in_lwf_employee_contribution = fields.Float(related="company_id.l10n_in_lwf_employee_contribution", readonly=False) + l10n_in_lwf_employer_contribution = fields.Float(related="company_id.l10n_in_lwf_employer_contribution", readonly=False) + l10n_in_other_deduction = fields.Float(string="Other Deduction") + + @api.depends("l10n_in_basic_salary_percent", "wage") + def _compute_l10n_in_basic_salary(self): + for record in self: + record.l10n_in_basic_salary = record.wage * (record.l10n_in_basic_salary_percent / 100) + + def _inverse_l10n_in_basic_salary(self): + for record in self: + record.l10n_in_basic_salary_percent = (record.l10n_in_basic_salary * 100) / record.wage if record.wage else 0 + + @api.depends("l10n_in_basic_salary", "l10n_in_house_rent_allowance_percent") + def _compute_l10n_in_house_rent_allowance(self): + for record in self: + record.l10n_in_house_rent_allowance = record.l10n_in_basic_salary * (record.l10n_in_house_rent_allowance_percent / 100) + + def _inverse_l10n_in_house_rent_allowance(self): + for record in self: + record.l10n_in_house_rent_allowance_percent = (record.l10n_in_house_rent_allowance * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + + @api.depends("l10n_in_standard_allowance", "wage") + def _compute_l10n_in_standard_allowance_percent(self): + for record in self: + record.l10n_in_standard_allowance_percent = (record.l10n_in_standard_allowance * 100) / record.wage if record.wage else 0 + + def _inverse_l10n_in_standard_allowance_percent(self): + for record in self: + record.l10n_in_standard_allowance = (record.l10n_in_standard_allowance_percent * record.wage) / 100 + + @api.depends("l10n_in_performance_bonus_percent", "l10n_in_basic_salary") + def _compute_l10n_in_performance_bonus(self): + for record in self: + record.l10n_in_performance_bonus = record.l10n_in_basic_salary * (record.l10n_in_performance_bonus_percent / 100) + + def _inverse_l10n_in_performance_bonus(self): + for record in self: + record.l10n_in_performance_bonus_percent = (record.l10n_in_performance_bonus * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + + @api.depends("l10n_in_leave_travel_allowance_percent", "l10n_in_basic_salary") + def _compute_l10n_in_leave_travel_allowance(self): + for record in self: + record.l10n_in_leave_travel_allowance = record.l10n_in_basic_salary * (record.l10n_in_leave_travel_allowance_percent / 100) + + def _inverse_l10n_in_leave_travel_allowance(self): + for record in self: + record.l10n_in_leave_travel_allowance_percent = record.l10n_in_leave_days * ((record.l10n_in_leave_allowance * 100) / record.wage if record.wage else 0) + + @api.depends('wage', 'l10n_in_leave_allowance_per_day_percent', 'l10n_in_leave_days') + def _compute_leave_allowance(self): + for record in self: + record.l10n_in_leave_allowance = (record.wage * (record.l10n_in_leave_allowance_per_day_percent/100) * record.l10n_in_leave_days) + + def _inverse_leave_allowance(self): + for record in self: + if record.l10n_in_basic_salary and record.l10n_in_leave_days: + record.l10n_in_leave_allowance_percent = record.l10n_in_leave_allowance * 100 / record.wage if record.wage else 0 + record.l10n_in_leave_allowance_per_day_percent = (record.l10n_in_leave_allowance * 100 / (record.wage * record.l10n_in_leave_days)) if record.wage else 0 + + @api.depends("l10n_in_gratuity", "l10n_in_basic_salary") + def _compute_l10n_in_gratuity_percent(self): + for record in self: + record.l10n_in_gratuity_percent = (record.l10n_in_gratuity * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + + def _inverse_l10n_in_gratuity_percent(self): + for record in self: + record.l10n_in_gratuity = record.l10n_in_basic_salary * (record.l10n_in_gratuity_percent / 100) + + @api.depends("wage", "l10n_in_basic_salary", "l10n_in_house_rent_allowance", "l10n_in_standard_allowance", "l10n_in_performance_bonus", "l10n_in_leave_travel_allowance", "l10n_in_leave_allowance", "l10n_in_gratuity") + def _compute_l10n_in_supplementary_allowance(self): + for record in self: + total_allowance = sum([ + record.l10n_in_basic_salary, + record.l10n_in_house_rent_allowance, + record.l10n_in_standard_allowance, + record.l10n_in_performance_bonus, + record.l10n_in_leave_travel_allowance, + record.l10n_in_leave_allowance, + record.l10n_in_gratuity + ]) + if record.wage: + record.l10n_in_supplementary_allowance = record.wage - total_allowance + + def _inverse_l10n_in_supplementary_allowance(self): + for record in self: + record.l10n_in_supplementary_allowance_percent = (record.l10n_in_supplementary_allowance * 100) / record.wage if record.wage else 0 diff --git a/l10n_in_hr_payroll_extension/models/res_company.py b/l10n_in_hr_payroll_extension/models/res_company.py new file mode 100644 index 00000000000..04ccd22ee86 --- /dev/null +++ b/l10n_in_hr_payroll_extension/models/res_company.py @@ -0,0 +1,27 @@ +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + l10n_in_org_pan_number = fields.Char(string="PAN Number") + l10n_in_org_tan_number = fields.Char(string="TAN Number") + l10n_in_org_tds_circle = fields.Char(string="TDS Circle/AO Code") + l10n_in_org_tax_details = fields.Boolean(string="Organisation Tax Details") + + l10n_in_is_provident_fund = fields.Boolean(string="Employee's Provident Fund") + l10n_in_employer_identification = fields.Char(string="Employer Identification") + l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution") + l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution") + + l10n_in_is_professional_tax = fields.Boolean(string="Professional Tax") + l10n_in_professional_tax_number = fields.Char(string="Professional Tax Number") + + l10n_in_is_esic = fields.Boolean(string="Employee's State Insurance Corporation") + l10n_in_esic_ip = fields.Char(string="ESIC IP") + l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution") + l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution") + + l10n_in_is_lwf = fields.Boolean(string="Labour Welfare Fund") + l10n_in_lwf_employee_contribution = fields.Float(string="Employee Contribution") + l10n_in_lwf_employer_contribution = fields.Float(string="Employer Contribution") diff --git a/l10n_in_hr_payroll_extension/models/res_config_settings.py b/l10n_in_hr_payroll_extension/models/res_config_settings.py new file mode 100644 index 00000000000..6914f6567ab --- /dev/null +++ b/l10n_in_hr_payroll_extension/models/res_config_settings.py @@ -0,0 +1,36 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + l10n_in_org_pan_number = fields.Char(related='company_id.l10n_in_org_pan_number', readonly=False) + l10n_in_org_tan_number = fields.Char(related='company_id.l10n_in_org_tan_number', readonly=False) + l10n_in_org_tds_circle = fields.Char(related='company_id.l10n_in_org_tds_circle', readonly=False) + l10n_in_org_tax_details = fields.Boolean(related='company_id.l10n_in_org_tax_details', readonly=False) + + l10n_in_is_provident_fund = fields.Boolean(related='company_id.l10n_in_is_provident_fund', readonly=False, default=True) + l10n_in_employer_identification = fields.Char(related='company_id.l10n_in_employer_identification', readonly=False) + l10n_in_pf_employee_contribution = fields.Float(related='company_id.l10n_in_pf_employee_contribution', readonly=False, default=12) + l10n_in_pf_employer_contribution = fields.Float(related='company_id.l10n_in_pf_employer_contribution', readonly=False, default=12) + + l10n_in_is_professional_tax = fields.Boolean(related='company_id.l10n_in_is_professional_tax', readonly=False, default=True) + l10n_in_professional_tax_number = fields.Char(related='company_id.l10n_in_professional_tax_number', readonly=False) + + l10n_in_is_esic = fields.Boolean(related='company_id.l10n_in_is_esic', readonly=False, default=True) + l10n_in_esic_ip = fields.Char(related='company_id.l10n_in_esic_ip', readonly=False) + l10n_in_esic_employee_contribution = fields.Float(related='company_id.l10n_in_esic_employee_contribution', readonly=False, default=0.75) + l10n_in_esic_employer_contribution = fields.Float(related='company_id.l10n_in_esic_employer_contribution', readonly=False, default=3.25) + + l10n_in_is_lwf = fields.Boolean(related='company_id.l10n_in_is_lwf', readonly=False, default=True) + l10n_in_lwf_employee_contribution = fields.Float(related='company_id.l10n_in_lwf_employee_contribution', readonly=False, default=6) + l10n_in_lwf_employer_contribution = fields.Float(related='company_id.l10n_in_lwf_employer_contribution', readonly=False, default=12) + + default_l10n_in_basic_salary_percent = fields.Float(string="Basic Salary", help="You can define the % of the salary from company cost to compute the basic salary based on your wages (Including D4).", default_model="hr.contract", default=50) + default_l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance", help="You can define 50% for metro city and 40% for non-metro city.", default_model="hr.contract", default=50) + default_l10n_in_standard_allowance = fields.Float(string="Standard Allowance", default_model="hr.contract", default=4167) + default_l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus", default_model="hr.contract", default=20) + default_l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance", default_model="hr.contract", default=20) + default_l10n_in_leave_days = fields.Float(string="Leave Days", default_model="hr.contract", default=1) + default_l10n_in_gratuity = fields.Float(string="Gratuity", default_model="hr.contract") + default_l10n_in_supplementary_allowance = fields.Float(string="Supplementary Allowance", default_model="hr.contract") diff --git a/l10n_in_hr_payroll_extension/views/hr_contract_views.xml b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml new file mode 100644 index 00000000000..510307702e2 --- /dev/null +++ b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml @@ -0,0 +1,146 @@ +<odoo> + <record id="hr_contract_form_in_inherit" model="ir.ui.view"> + <field name="name">hr.contract.form.in.inherit</field> + <field name="model">hr.contract</field> + <field name="inherit_id" ref="l10n_in_hr_payroll.hr_contract_form_in_inherit"/> + <field name="arch" type="xml"> + <xpath expr="//group[field[@name='l10n_in_driver_salay']]" position="attributes"> + <attribute name="invisible">1</attribute> + </xpath> + <xpath expr="//group[field[@name='l10n_in_provident_fund']]" position="attributes"> + <attribute name="invisible">1</attribute> + </xpath> + <xpath expr="//group[@name='salary_info']" position="inside"> + <group name="salary_componensts" string="Salary Components" invisible="country_code != 'IN'"> + <label for="l10n_in_basic_salary" /> + <div class="o_row mw-80" name="l10n_in_basic_salary"> + <field name="l10n_in_basic_salary"/> + <div>₹ / month</div> + <field name="l10n_in_basic_salary_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_house_rent_allowance" /> + <div class="o_row mw-80" name="l10n_in_house_rent_allowance"> + <field name="l10n_in_house_rent_allowance"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_house_rent_allowance_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_standard_allowance" /> + <div class="o_row mw-80" name="l10n_in_standard_allowance"> + <field name="l10n_in_standard_allowance"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_standard_allowance_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_performance_bonus" /> + <div class="o_row mw-80" name="l10n_in_performance_bonus"> + <field name="l10n_in_performance_bonus"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_performance_bonus_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_leave_travel_allowance" /> + <div class="o_row mw-80" name="l10n_in_leave_travel_allowance"> + <field name="l10n_in_leave_travel_allowance"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_leave_travel_allowance_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_leave_allowance" /> + <div class="o_row mw-80" name="l10n_in_leave_allowance"> + <field name="l10n_in_leave_allowance"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_leave_allowance_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_leave_days" /> + <div class="o_row mw-80" name="l10n_in_leave_days"> + <field name="l10n_in_leave_days"/> + <div class="mb-2">days / month</div> + </div> + + <label for="l10n_in_gratuity" /> + <div class="o_row mw-80" name="l10n_in_gratuity"> + <field name="l10n_in_gratuity"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_gratuity_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + + <label for="l10n_in_supplementary_allowance" /> + <div class="o_row mw-80" name="l10n_in_supplementary_allowance"> + <field name="l10n_in_supplementary_allowance"/> + <div class="mb-2">₹ / month</div> + <field name="l10n_in_supplementary_allowance_percent" groups="base.group_no_one"/> + <div groups="base.group_no_one">%</div> + </div> + </group> + <div id="deductions_container" invisible="country_code != 'IN'"> + <group name="tax_deductions" string="Tax Deductions"> + <label for="l10n_in_tds"/> + <div class="d-flex gap-3"> + <field name="l10n_in_tds"/> + <button name="%(l10n_in_hr_payroll.action_tds_calculation)d" string="TDS Calculator" type="action" class="w-75 btn btn-secondary"/> + </div> + </group> + <group name="other_deductions" string="Other Deductions"> + <label for="l10n_in_pf_employee_contribution" string="PF Employee Contribution" /> + <div class="o_row mw-60" name="l10n_in_pf_employee_contribution"> + <field name="l10n_in_pf_employee_contribution"/> + <div class="mb-2">%</div> + </div> + + <label for="l10n_in_pf_employer_contribution" string="PF Employer Contribution" /> + <div class="o_row mw-60" name="l10n_in_pf_employer_contribution"> + <field name="l10n_in_pf_employer_contribution"/> + <div class="mb-2">%</div> + </div> + + <label for="l10n_in_professional_tax"/> + <div class="o_row mw-60" name="l10n_in_professional_tax"> + <field name="l10n_in_professional_tax"/> + <div class="mb-2">₹ / month</div> + </div> + + <label for="l10n_in_esic_employee_contribution" string="ESIC Employee Contribution" /> + <div class="o_row mw-60" name="l10n_in_esic_employee_contribution"> + <field name="l10n_in_esic_employee_contribution"/> + <div class="mb-2">%</div> + </div> + + <label for="l10n_in_esic_employer_contribution" string="ESIC Employer Contribution" /> + <div class="o_row mw-60" name="l10n_in_esic_employer_contribution"> + <field name="l10n_in_esic_employer_contribution"/> + <div class="mb-2">%</div> + </div> + + <label for="l10n_in_lwf_employee_contribution" string="LWF Employee Contribution" /> + <div class="o_row mw-60" name="l10n_in_lwf_employee_contribution"> + <field name="l10n_in_lwf_employee_contribution"/> + <div class="mb-2">₹ / month</div> + </div> + + <label for="l10n_in_lwf_employer_contribution" string="LWF Employer Contribution" /> + <div class="o_row mw-60" name="l10n_in_lwf_employer_contribution"> + <field name="l10n_in_lwf_employer_contribution"/> + <div class="mb-2">₹ / month</div> + </div> + + <label for="l10n_in_other_deduction" /> + <div class="o_row mw-60" name="l10n_in_other_deduction"> + <field name="l10n_in_other_deduction"/> + <div class="mb-2">₹ / month</div> + </div> + </group> + </div> + </xpath> + </field> + </record> +</odoo> diff --git a/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml new file mode 100644 index 00000000000..6646c5cb7d3 --- /dev/null +++ b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml @@ -0,0 +1,163 @@ +<odoo> + <record id="res_config_settings_view_form_inherited" model="ir.ui.view"> + <field name="name">res.config.settings.view.form.inherited.l10n_in_hr_payroll</field> + <field name="model">res.config.settings</field> + <field name="inherit_id" ref="l10n_in_hr_payroll.res_config_settings_view_form" /> + <field name="arch" type="xml"> + <xpath expr="//block[@id='hr_payroll_accountant']" position="inside"> + <setting string="Organisation Tax Details" + help="PAN and TAN number's details, used to generate the TDS reports" + invisible="company_country_code != 'IN'"> + <field name="l10n_in_org_tax_details" /> + <group class="mt16" invisible="not l10n_in_org_tax_details"> + <field name="l10n_in_org_pan_number" /> + <field name="l10n_in_org_tan_number" /> + <field name="l10n_in_org_tds_circle" /> + </group> + </setting> + </xpath> + <xpath expr="//div[@id='l10n_in_hr_payroll']" position="after"> + <div class="row o_settings_container" invisible="company_country_code != 'IN'"> + <div class="col-lg-6 col-12 o_setting_box" id="epf_section"> + <div class="o_setting_left_pane"> + <field name="l10n_in_is_provident_fund" /> + </div> + <div class="o_setting_right_pane"> + <label for="l10n_in_is_provident_fund" + string="Employee's Provident Fund" /> + <group class="mt16" invisible="not l10n_in_is_provident_fund"> + <field name="l10n_in_employer_identification" /> + + <label for="l10n_in_pf_employee_contribution"/> + <div class="o_row"> + <field name="l10n_in_pf_employee_contribution" /> + <div>%</div> + </div> + + <label for="l10n_in_pf_employer_contribution"/> + <div class="o_row"> + <field name="l10n_in_pf_employer_contribution" /> + <div>%</div> + </div> + </group> + </div> + </div> + <div class="col-lg-6 col-12 o_setting_box" id="esic_section"> + <div class="o_setting_left_pane"> + <field name="l10n_in_is_esic" /> + </div> + <div class="o_setting_right_pane"> + <label for="l10n_in_is_esic" + string="Employee's State Insurance Corporation" /> + <group class="mt16" invisible="not l10n_in_is_esic"> + <field name="l10n_in_esic_ip" /> + + <label for="l10n_in_esic_employee_contribution"/> + <div class="o_row"> + <field name="l10n_in_esic_employee_contribution" /> + <div>%</div> + </div> + + <label for="l10n_in_esic_employer_contribution"/> + <div class="o_row"> + <field name="l10n_in_esic_employer_contribution" /> + <div>%</div> + </div> + </group> + </div> + </div> + </div> + <div class="row o_settings_container" invisible="company_country_code != 'IN'"> + <div class="col-lg-6 col-12 o_setting_box" id="pt_section"> + <div class="o_setting_left_pane"> + <field name="l10n_in_is_professional_tax" /> + </div> + <div class="o_setting_right_pane"> + <label for="l10n_in_is_professional_tax" string="Professional Tax" /> + <group class="mt16" invisible="not l10n_in_is_professional_tax"> + <field name="l10n_in_professional_tax_number" /> + </group> + </div> + </div> + <div class="col-lg-6 col-12 o_setting_box" id="lwf_section"> + <div class="o_setting_left_pane"> + <field name="l10n_in_is_lwf" /> + </div> + <div class="o_setting_right_pane"> + <label for="l10n_in_is_lwf" string="Labour Welfare Fund" /> + <group class="mt16" invisible="not l10n_in_is_lwf"> + <label for="l10n_in_lwf_employee_contribution"/> + <div class="o_row mw-80"> + <field name="l10n_in_lwf_employee_contribution" /> + <div>₹</div> + </div> + + <label for="l10n_in_lwf_employer_contribution"/> + <div class="o_row mw-80"> + <field name="l10n_in_lwf_employer_contribution" /> + <div>₹</div> + </div> + </group> + </div> + </div> + </div> + <div class="row o_settings_container" id="salary_components_section" invisible="company_country_code != 'IN'"> + <div class="col-lg-8 col-12 o_setting_box"> + <div class="o_setting_right_pane"> + <span class="fw-bold fs-4">Salary Components</span> + <group name="l10n_in_salary_components" class="mt16"> + <label for="default_l10n_in_basic_salary_percent"/> + <div class="o_row mw-80" name="default_l10n_in_basic_salary_percent"> + <field name="default_l10n_in_basic_salary_percent" nolabel="1"/> + <div>%</div> + </div> + + <label for="default_l10n_in_house_rent_allowance_percent" /> + <div class="o_row mw-80" name="default_l10n_in_house_rent_allowance_percent"> + <field name="default_l10n_in_house_rent_allowance_percent" nolabel="1"/> + <div class="mb-2">%</div> + </div> + + <label for="default_l10n_in_standard_allowance" /> + <div class="o_row mw-80" name="default_l10n_in_standard_allowance"> + <field name="default_l10n_in_standard_allowance" nolabel="1"/> + <div class="mb-2">%</div> + </div> + + <label for="default_l10n_in_performance_bonus_percent" /> + <div class="o_row mw-80" name="default_l10n_in_performance_bonus_percent"> + <field name="default_l10n_in_performance_bonus_percent" nolabel="1"/> + <div class="mb-2">%</div> + </div> + + <label for="default_l10n_in_leave_travel_allowance_percent" /> + <div class="o_row mw-80" name="default_l10n_in_leave_travel_allowance_percent"> + <field name="default_l10n_in_leave_travel_allowance_percent" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> + + <label for="default_l10n_in_leave_days" /> + <div class="o_row mw-80" name="default_l10n_in_leave_days"> + <field name="default_l10n_in_leave_days" nolabel="1"/> + <div class="mb-2">days / month</div> + </div> + + <label for="default_l10n_in_gratuity" /> + <div class="o_row mw-80" name="default_l10n_in_gratuity"> + <field name="default_l10n_in_gratuity" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> + + <label for="default_l10n_in_supplementary_allowance" /> + <div class="o_row mw-80" name="default_l10n_in_supplementary_allowance"> + <field name="default_l10n_in_supplementary_allowance" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> + </group> + </div> + </div> + </div> + </xpath> + </field> + </record> +</odoo> From b405a1996ecb84d5161c745cb731253d782aa9a1 Mon Sep 17 00:00:00 2001 From: jmra-odoo <jmra@odoo.com> Date: Thu, 20 Mar 2025 14:11:39 +0530 Subject: [PATCH 2/3] [IMP] l10n_in_hr_payroll_extension: test cases and monetary fields With This Commit ======================================================== - Added Test Cases for salary component calculations - Modified some fields to make them monetary - Minor changes in views according above changes --- .gitignore | 1 + .../models/hr_contract.py | 36 +++++++++---------- .../models/res_company.py | 15 +------- .../models/res_config_settings.py | 24 +++++++------ .../tests/__init__.py | 1 + .../tests/test_hr_contract.py | 29 +++++++++++++++ .../views/hr_contract_views.xml | 24 ++++++------- .../views/res_config_settings_views.xml | 26 +++++++------- 8 files changed, 88 insertions(+), 68 deletions(-) create mode 100644 l10n_in_hr_payroll_extension/tests/__init__.py create mode 100644 l10n_in_hr_payroll_extension/tests/test_hr_contract.py diff --git a/.gitignore b/.gitignore index b6e47617de1..2ab793ba540 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +.vscode diff --git a/l10n_in_hr_payroll_extension/models/hr_contract.py b/l10n_in_hr_payroll_extension/models/hr_contract.py index 025d95d27b1..32c1302cf62 100644 --- a/l10n_in_hr_payroll_extension/models/hr_contract.py +++ b/l10n_in_hr_payroll_extension/models/hr_contract.py @@ -4,15 +4,15 @@ class HrContract(models.Model): _inherit = 'hr.contract' - l10n_in_basic_salary = fields.Float(string="Basic Salary", help="Basic salary calculated from the wage", compute="_compute_l10n_in_basic_salary", inverse="_inverse_l10n_in_basic_salary") - l10n_in_house_rent_allowance = fields.Float(string="House Rent Allowance", compute="_compute_l10n_in_house_rent_allowance", inverse="_inverse_l10n_in_house_rent_allowance") - l10n_in_standard_allowance = fields.Float(string="Standard Allowance", default=4167) - l10n_in_performance_bonus = fields.Float(string="Performance Bonus", compute="_compute_l10n_in_performance_bonus", inverse="_inverse_l10n_in_performance_bonus") - l10n_in_leave_travel_allowance = fields.Float(string="Leave Travel Allowance", compute="_compute_l10n_in_leave_travel_allowance", inverse="_inverse_l10n_in_leave_travel_allowance") - l10n_in_leave_allowance = fields.Float(string="Leave Allowance", compute="_compute_leave_allowance", inverse="_inverse_leave_allowance") + l10n_in_basic_salary = fields.Monetary(string="Basic Salary", help="Basic salary calculated from the wage", compute="_compute_l10n_in_basic_salary", inverse="_inverse_l10n_in_basic_salary", currency_field="currency_id") + l10n_in_house_rent_allowance = fields.Monetary(string="House Rent Allowance", compute="_compute_l10n_in_house_rent_allowance", inverse="_inverse_l10n_in_house_rent_allowance", currency_field="currency_id") + l10n_in_standard_allowance = fields.Monetary(string="Standard Allowance", default=4167, currency_field="currency_id") + l10n_in_performance_bonus = fields.Monetary(string="Performance Bonus", compute="_compute_l10n_in_performance_bonus", inverse="_inverse_l10n_in_performance_bonus", currency_field="currency_id") + l10n_in_leave_travel_allowance = fields.Monetary(string="Leave Travel Allowance", compute="_compute_l10n_in_leave_travel_allowance", inverse="_inverse_l10n_in_leave_travel_allowance", currency_field="currency_id") + l10n_in_leave_allowance = fields.Monetary(string="Leave Allowance", compute="_compute_leave_allowance", inverse="_inverse_leave_allowance", currency_field="currency_id") l10n_in_leave_days = fields.Float(string="Leave Days", default=1) - l10n_in_gratuity = fields.Float(string="Gratuity", default=0) - l10n_in_supplementary_allowance = fields.Float(string="Supplementary Allowance", compute="_compute_l10n_in_supplementary_allowance", inverse="_inverse_l10n_in_supplementary_allowance", default=0) + l10n_in_gratuity = fields.Monetary(string="Gratuity", currency_field="currency_id") + l10n_in_supplementary_allowance = fields.Monetary(string="Supplementary Allowance", compute="_compute_l10n_in_supplementary_allowance", inverse="_inverse_l10n_in_supplementary_allowance", currency_field="currency_id") l10n_in_basic_salary_percent = fields.Float(string="Basic Salary Percentage", help="basic salary percentage of wage", default=50) l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance Percentage", help="this is the percentage of basic salary", default=50) @@ -24,14 +24,14 @@ class HrContract(models.Model): l10n_in_gratuity_percent = fields.Float(string="Gratuity Percentage", compute="_compute_l10n_in_gratuity_percent", inverse="_inverse_l10n_in_gratuity_percent") l10n_in_supplementary_allowance_percent = fields.Float(string="Supplementary Allowance Percentage") - l10n_in_pf_employee_contribution = fields.Float(related="company_id.l10n_in_pf_employee_contribution", readonly=False) - l10n_in_pf_employer_contribution = fields.Float(related="company_id.l10n_in_pf_employer_contribution", readonly=False) - l10n_in_professional_tax = fields.Float(string="Professional Tax", default=200) - l10n_in_esic_employee_contribution = fields.Float(related="company_id.l10n_in_esic_employee_contribution", readonly=False) - l10n_in_esic_employer_contribution = fields.Float(related="company_id.l10n_in_esic_employer_contribution", readonly=False) - l10n_in_lwf_employee_contribution = fields.Float(related="company_id.l10n_in_lwf_employee_contribution", readonly=False) - l10n_in_lwf_employer_contribution = fields.Float(related="company_id.l10n_in_lwf_employer_contribution", readonly=False) - l10n_in_other_deduction = fields.Float(string="Other Deduction") + l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution", default=12) + l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution", default=12) + l10n_in_professional_tax = fields.Monetary(string="Professional Tax", default=200) + l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution", default=0.75) + l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution", default=3.25) + l10n_in_lwf_employee_contribution = fields.Monetary(string="Employee Contribution", currency_field="currency_id", default=6) + l10n_in_lwf_employer_contribution = fields.Monetary(string="Employer Contribution", currency_field="currency_id", default=12) + l10n_in_other_deduction = fields.Monetary(string="Other Deduction", currency_field="currency_id") @api.depends("l10n_in_basic_salary_percent", "wage") def _compute_l10n_in_basic_salary(self): @@ -76,12 +76,12 @@ def _compute_l10n_in_leave_travel_allowance(self): def _inverse_l10n_in_leave_travel_allowance(self): for record in self: - record.l10n_in_leave_travel_allowance_percent = record.l10n_in_leave_days * ((record.l10n_in_leave_allowance * 100) / record.wage if record.wage else 0) + record.l10n_in_leave_travel_allowance_percent = (record.l10n_in_leave_travel_allowance * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 @api.depends('wage', 'l10n_in_leave_allowance_per_day_percent', 'l10n_in_leave_days') def _compute_leave_allowance(self): for record in self: - record.l10n_in_leave_allowance = (record.wage * (record.l10n_in_leave_allowance_per_day_percent/100) * record.l10n_in_leave_days) + record.l10n_in_leave_allowance = (record.wage * (record.l10n_in_leave_allowance_per_day_percent / 100) * record.l10n_in_leave_days) def _inverse_leave_allowance(self): for record in self: diff --git a/l10n_in_hr_payroll_extension/models/res_company.py b/l10n_in_hr_payroll_extension/models/res_company.py index 04ccd22ee86..03ce8e60df5 100644 --- a/l10n_in_hr_payroll_extension/models/res_company.py +++ b/l10n_in_hr_payroll_extension/models/res_company.py @@ -4,24 +4,11 @@ class ResCompany(models.Model): _inherit = 'res.company' + l10n_in_org_tax_details = fields.Boolean(string="Organisation Tax Details") l10n_in_org_pan_number = fields.Char(string="PAN Number") l10n_in_org_tan_number = fields.Char(string="TAN Number") l10n_in_org_tds_circle = fields.Char(string="TDS Circle/AO Code") - l10n_in_org_tax_details = fields.Boolean(string="Organisation Tax Details") - l10n_in_is_provident_fund = fields.Boolean(string="Employee's Provident Fund") l10n_in_employer_identification = fields.Char(string="Employer Identification") - l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution") - l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution") - - l10n_in_is_professional_tax = fields.Boolean(string="Professional Tax") l10n_in_professional_tax_number = fields.Char(string="Professional Tax Number") - - l10n_in_is_esic = fields.Boolean(string="Employee's State Insurance Corporation") l10n_in_esic_ip = fields.Char(string="ESIC IP") - l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution") - l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution") - - l10n_in_is_lwf = fields.Boolean(string="Labour Welfare Fund") - l10n_in_lwf_employee_contribution = fields.Float(string="Employee Contribution") - l10n_in_lwf_employer_contribution = fields.Float(string="Employer Contribution") diff --git a/l10n_in_hr_payroll_extension/models/res_config_settings.py b/l10n_in_hr_payroll_extension/models/res_config_settings.py index 6914f6567ab..ce65fd40f8a 100644 --- a/l10n_in_hr_payroll_extension/models/res_config_settings.py +++ b/l10n_in_hr_payroll_extension/models/res_config_settings.py @@ -4,27 +4,29 @@ class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' + currency_id = fields.Many2one("res.currency", default=lambda self: self.env.company.currency_id) + + l10n_in_org_tax_details = fields.Boolean(related='company_id.l10n_in_org_tax_details', readonly=False) l10n_in_org_pan_number = fields.Char(related='company_id.l10n_in_org_pan_number', readonly=False) l10n_in_org_tan_number = fields.Char(related='company_id.l10n_in_org_tan_number', readonly=False) l10n_in_org_tds_circle = fields.Char(related='company_id.l10n_in_org_tds_circle', readonly=False) - l10n_in_org_tax_details = fields.Boolean(related='company_id.l10n_in_org_tax_details', readonly=False) - l10n_in_is_provident_fund = fields.Boolean(related='company_id.l10n_in_is_provident_fund', readonly=False, default=True) + l10n_in_is_provident_fund = fields.Boolean(string="Employee's Provident Fund", default=True) l10n_in_employer_identification = fields.Char(related='company_id.l10n_in_employer_identification', readonly=False) - l10n_in_pf_employee_contribution = fields.Float(related='company_id.l10n_in_pf_employee_contribution', readonly=False, default=12) - l10n_in_pf_employer_contribution = fields.Float(related='company_id.l10n_in_pf_employer_contribution', readonly=False, default=12) + default_l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution", default_model="hr.contract", default=12) + default_l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution", default_model="hr.contract", default=12) - l10n_in_is_professional_tax = fields.Boolean(related='company_id.l10n_in_is_professional_tax', readonly=False, default=True) + l10n_in_is_professional_tax = fields.Boolean(string="Professional Tax", default=True) l10n_in_professional_tax_number = fields.Char(related='company_id.l10n_in_professional_tax_number', readonly=False) - l10n_in_is_esic = fields.Boolean(related='company_id.l10n_in_is_esic', readonly=False, default=True) + l10n_in_is_esic = fields.Boolean(string="Employee's State Insurance Corporation", default=True) l10n_in_esic_ip = fields.Char(related='company_id.l10n_in_esic_ip', readonly=False) - l10n_in_esic_employee_contribution = fields.Float(related='company_id.l10n_in_esic_employee_contribution', readonly=False, default=0.75) - l10n_in_esic_employer_contribution = fields.Float(related='company_id.l10n_in_esic_employer_contribution', readonly=False, default=3.25) + default_l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution", default_model="hr.contract", default=0.75) + default_l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution", default_model="hr.contract", default=3.25) - l10n_in_is_lwf = fields.Boolean(related='company_id.l10n_in_is_lwf', readonly=False, default=True) - l10n_in_lwf_employee_contribution = fields.Float(related='company_id.l10n_in_lwf_employee_contribution', readonly=False, default=6) - l10n_in_lwf_employer_contribution = fields.Float(related='company_id.l10n_in_lwf_employer_contribution', readonly=False, default=12) + l10n_in_is_lwf = fields.Boolean(string="Labour Welfare Fund", default=True) + default_l10n_in_lwf_employee_contribution = fields.Monetary(string="Employee Contribution", currency_field="currency_id", default_model="hr.contract", default=6) + default_l10n_in_lwf_employer_contribution = fields.Monetary(string="Employer Contribution", currency_field="currency_id", default_model="hr.contract", default=12) default_l10n_in_basic_salary_percent = fields.Float(string="Basic Salary", help="You can define the % of the salary from company cost to compute the basic salary based on your wages (Including D4).", default_model="hr.contract", default=50) default_l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance", help="You can define 50% for metro city and 40% for non-metro city.", default_model="hr.contract", default=50) diff --git a/l10n_in_hr_payroll_extension/tests/__init__.py b/l10n_in_hr_payroll_extension/tests/__init__.py new file mode 100644 index 00000000000..0894c057839 --- /dev/null +++ b/l10n_in_hr_payroll_extension/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_contract diff --git a/l10n_in_hr_payroll_extension/tests/test_hr_contract.py b/l10n_in_hr_payroll_extension/tests/test_hr_contract.py new file mode 100644 index 00000000000..6c756030053 --- /dev/null +++ b/l10n_in_hr_payroll_extension/tests/test_hr_contract.py @@ -0,0 +1,29 @@ +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestHrContract(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.contract = cls.env['hr.contract'].create({ + 'name': "Test Contract", + 'wage': 100000, + 'l10n_in_basic_salary_percent': 50, + 'l10n_in_house_rent_allowance_percent': 50, + 'l10n_in_standard_allowance': 4167, + 'l10n_in_performance_bonus_percent': 20, + 'l10n_in_leave_travel_allowance_percent': 20, + 'l10n_in_gratuity': 250, + }) + + def test_salary_component_amounts(self): + self.assertEqual(self.contract.l10n_in_basic_salary, 50000, "50% of 100000 should be 50000") + self.assertEqual(self.contract.l10n_in_house_rent_allowance, 25000, "50% of 50000(Basic Salary) should be 25000") + self.assertEqual(self.contract.l10n_in_standard_allowance_percent, 4.167, "4167 is a 4.17% of 100000(Wage)") + self.assertEqual(self.contract.l10n_in_performance_bonus, 10000, "20% of 50000(Basic Salary) should be 10000") + self.assertEqual(self.contract.l10n_in_leave_travel_allowance, 10000, "20% of 50000(Basic Salary) should be 10000") + self.assertEqual(self.contract.l10n_in_gratuity_percent, 0.50, "250 is a 0.50% of 50000(Basic Salary)") + self.assertEqual(self.contract.l10n_in_supplementary_allowance, 583, "supplementary should be remaining amount from wage") diff --git a/l10n_in_hr_payroll_extension/views/hr_contract_views.xml b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml index 510307702e2..44c2540f827 100644 --- a/l10n_in_hr_payroll_extension/views/hr_contract_views.xml +++ b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml @@ -15,7 +15,7 @@ <label for="l10n_in_basic_salary" /> <div class="o_row mw-80" name="l10n_in_basic_salary"> <field name="l10n_in_basic_salary"/> - <div>₹ / month</div> + <div> / month</div> <field name="l10n_in_basic_salary_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -23,7 +23,7 @@ <label for="l10n_in_house_rent_allowance" /> <div class="o_row mw-80" name="l10n_in_house_rent_allowance"> <field name="l10n_in_house_rent_allowance"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_house_rent_allowance_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -31,7 +31,7 @@ <label for="l10n_in_standard_allowance" /> <div class="o_row mw-80" name="l10n_in_standard_allowance"> <field name="l10n_in_standard_allowance"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_standard_allowance_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -39,7 +39,7 @@ <label for="l10n_in_performance_bonus" /> <div class="o_row mw-80" name="l10n_in_performance_bonus"> <field name="l10n_in_performance_bonus"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_performance_bonus_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -47,7 +47,7 @@ <label for="l10n_in_leave_travel_allowance" /> <div class="o_row mw-80" name="l10n_in_leave_travel_allowance"> <field name="l10n_in_leave_travel_allowance"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_leave_travel_allowance_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -55,7 +55,7 @@ <label for="l10n_in_leave_allowance" /> <div class="o_row mw-80" name="l10n_in_leave_allowance"> <field name="l10n_in_leave_allowance"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_leave_allowance_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -69,7 +69,7 @@ <label for="l10n_in_gratuity" /> <div class="o_row mw-80" name="l10n_in_gratuity"> <field name="l10n_in_gratuity"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_gratuity_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -77,7 +77,7 @@ <label for="l10n_in_supplementary_allowance" /> <div class="o_row mw-80" name="l10n_in_supplementary_allowance"> <field name="l10n_in_supplementary_allowance"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> <field name="l10n_in_supplementary_allowance_percent" groups="base.group_no_one"/> <div groups="base.group_no_one">%</div> </div> @@ -106,7 +106,7 @@ <label for="l10n_in_professional_tax"/> <div class="o_row mw-60" name="l10n_in_professional_tax"> <field name="l10n_in_professional_tax"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> </div> <label for="l10n_in_esic_employee_contribution" string="ESIC Employee Contribution" /> @@ -124,19 +124,19 @@ <label for="l10n_in_lwf_employee_contribution" string="LWF Employee Contribution" /> <div class="o_row mw-60" name="l10n_in_lwf_employee_contribution"> <field name="l10n_in_lwf_employee_contribution"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> </div> <label for="l10n_in_lwf_employer_contribution" string="LWF Employer Contribution" /> <div class="o_row mw-60" name="l10n_in_lwf_employer_contribution"> <field name="l10n_in_lwf_employer_contribution"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> </div> <label for="l10n_in_other_deduction" /> <div class="o_row mw-60" name="l10n_in_other_deduction"> <field name="l10n_in_other_deduction"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2"> / month</div> </div> </group> </div> diff --git a/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml index 6646c5cb7d3..1f5212021f6 100644 --- a/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml +++ b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml @@ -28,15 +28,15 @@ <group class="mt16" invisible="not l10n_in_is_provident_fund"> <field name="l10n_in_employer_identification" /> - <label for="l10n_in_pf_employee_contribution"/> + <label for="default_l10n_in_pf_employee_contribution"/> <div class="o_row"> - <field name="l10n_in_pf_employee_contribution" /> + <field name="default_l10n_in_pf_employee_contribution" /> <div>%</div> </div> - <label for="l10n_in_pf_employer_contribution"/> + <label for="default_l10n_in_pf_employer_contribution"/> <div class="o_row"> - <field name="l10n_in_pf_employer_contribution" /> + <field name="default_l10n_in_pf_employer_contribution" /> <div>%</div> </div> </group> @@ -52,15 +52,15 @@ <group class="mt16" invisible="not l10n_in_is_esic"> <field name="l10n_in_esic_ip" /> - <label for="l10n_in_esic_employee_contribution"/> + <label for="default_l10n_in_esic_employee_contribution"/> <div class="o_row"> - <field name="l10n_in_esic_employee_contribution" /> + <field name="default_l10n_in_esic_employee_contribution" /> <div>%</div> </div> - <label for="l10n_in_esic_employer_contribution"/> + <label for="default_l10n_in_esic_employer_contribution"/> <div class="o_row"> - <field name="l10n_in_esic_employer_contribution" /> + <field name="default_l10n_in_esic_employer_contribution" /> <div>%</div> </div> </group> @@ -86,15 +86,15 @@ <div class="o_setting_right_pane"> <label for="l10n_in_is_lwf" string="Labour Welfare Fund" /> <group class="mt16" invisible="not l10n_in_is_lwf"> - <label for="l10n_in_lwf_employee_contribution"/> + <label for="default_l10n_in_lwf_employee_contribution"/> <div class="o_row mw-80"> - <field name="l10n_in_lwf_employee_contribution" /> + <field name="default_l10n_in_lwf_employee_contribution" /> <div>₹</div> </div> - <label for="l10n_in_lwf_employer_contribution"/> + <label for="default_l10n_in_lwf_employer_contribution"/> <div class="o_row mw-80"> - <field name="l10n_in_lwf_employer_contribution" /> + <field name="default_l10n_in_lwf_employer_contribution" /> <div>₹</div> </div> </group> @@ -133,7 +133,7 @@ <label for="default_l10n_in_leave_travel_allowance_percent" /> <div class="o_row mw-80" name="default_l10n_in_leave_travel_allowance_percent"> <field name="default_l10n_in_leave_travel_allowance_percent" nolabel="1"/> - <div class="mb-2">₹ / month</div> + <div class="mb-2">%</div> </div> <label for="default_l10n_in_leave_days" /> From 69d698a23834d54702d94f0772fa86d138a5d08d Mon Sep 17 00:00:00 2001 From: jmra-odoo <jmra@odoo.com> Date: Fri, 11 Apr 2025 16:58:56 +0530 Subject: [PATCH 3/3] [IMP] l10n_in_hr_payroll_extension: company dependant, formatting With this commit ==================================================== - Made salary structure company dependent - Added percentage widget to required fields & code formatting --- .../models/hr_contract.py | 100 ++++++------ .../models/res_company.py | 21 ++- .../models/res_config_settings.py | 34 ++--- .../views/hr_contract_views.xml | 56 +++---- .../views/res_config_settings_views.xml | 143 +++++++++--------- 5 files changed, 179 insertions(+), 175 deletions(-) diff --git a/l10n_in_hr_payroll_extension/models/hr_contract.py b/l10n_in_hr_payroll_extension/models/hr_contract.py index 32c1302cf62..9eebf2c1419 100644 --- a/l10n_in_hr_payroll_extension/models/hr_contract.py +++ b/l10n_in_hr_payroll_extension/models/hr_contract.py @@ -6,19 +6,19 @@ class HrContract(models.Model): l10n_in_basic_salary = fields.Monetary(string="Basic Salary", help="Basic salary calculated from the wage", compute="_compute_l10n_in_basic_salary", inverse="_inverse_l10n_in_basic_salary", currency_field="currency_id") l10n_in_house_rent_allowance = fields.Monetary(string="House Rent Allowance", compute="_compute_l10n_in_house_rent_allowance", inverse="_inverse_l10n_in_house_rent_allowance", currency_field="currency_id") - l10n_in_standard_allowance = fields.Monetary(string="Standard Allowance", default=4167, currency_field="currency_id") + l10n_in_standard_allowance = fields.Monetary(string="Standard Allowance", default=lambda self: self.env.company.l10n_in_standard_allowance, currency_field="currency_id") l10n_in_performance_bonus = fields.Monetary(string="Performance Bonus", compute="_compute_l10n_in_performance_bonus", inverse="_inverse_l10n_in_performance_bonus", currency_field="currency_id") l10n_in_leave_travel_allowance = fields.Monetary(string="Leave Travel Allowance", compute="_compute_l10n_in_leave_travel_allowance", inverse="_inverse_l10n_in_leave_travel_allowance", currency_field="currency_id") l10n_in_leave_allowance = fields.Monetary(string="Leave Allowance", compute="_compute_leave_allowance", inverse="_inverse_leave_allowance", currency_field="currency_id") - l10n_in_leave_days = fields.Float(string="Leave Days", default=1) - l10n_in_gratuity = fields.Monetary(string="Gratuity", currency_field="currency_id") - l10n_in_supplementary_allowance = fields.Monetary(string="Supplementary Allowance", compute="_compute_l10n_in_supplementary_allowance", inverse="_inverse_l10n_in_supplementary_allowance", currency_field="currency_id") + l10n_in_leave_days = fields.Float(string="Leave Days", default=lambda self: self.env.company.l10n_in_leave_days) + l10n_in_gratuity = fields.Monetary(string="Gratuity", currency_field="currency_id", default=lambda self: self.env.company.l10n_in_gratuity) + l10n_in_supplementary_allowance = fields.Monetary(string="Supplementary Allowance", compute="_compute_l10n_in_supplementary_allowance", inverse="_inverse_l10n_in_supplementary_allowance", currency_field="currency_id", default=lambda self: self.env.company.l10n_in_supplementary_allowance) - l10n_in_basic_salary_percent = fields.Float(string="Basic Salary Percentage", help="basic salary percentage of wage", default=50) - l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance Percentage", help="this is the percentage of basic salary", default=50) + l10n_in_basic_salary_percent = fields.Float(string="Basic Salary Percentage", help="basic salary percentage of wage", default=lambda self: self.env.company.l10n_in_basic_salary_percent) + l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance Percentage", help="this is the percentage of basic salary", default=lambda self: self.env.company.l10n_in_house_rent_allowance_percent) l10n_in_standard_allowance_percent = fields.Float(string="Standard Allowance Percentage", compute="_compute_l10n_in_standard_allowance_percent", inverse="_inverse_l10n_in_standard_allowance_percent") - l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus Percentage", default=20) - l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance Percentage", default=20) + l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus Percentage", default=lambda self: self.env.company.l10n_in_performance_bonus_percent) + l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance Percentage", default=lambda self: self.env.company.l10n_in_leave_travel_allowance_percent) l10n_in_leave_allowance_per_day_percent = fields.Float(string="Leave allowance per day percentage") l10n_in_leave_allowance_percent = fields.Float(string="Leave Allowance Percentage") l10n_in_gratuity_percent = fields.Float(string="Gratuity Percentage", compute="_compute_l10n_in_gratuity_percent", inverse="_inverse_l10n_in_gratuity_percent") @@ -35,84 +35,84 @@ class HrContract(models.Model): @api.depends("l10n_in_basic_salary_percent", "wage") def _compute_l10n_in_basic_salary(self): - for record in self: - record.l10n_in_basic_salary = record.wage * (record.l10n_in_basic_salary_percent / 100) + for contract in self: + contract.l10n_in_basic_salary = contract.wage * contract.l10n_in_basic_salary_percent def _inverse_l10n_in_basic_salary(self): - for record in self: - record.l10n_in_basic_salary_percent = (record.l10n_in_basic_salary * 100) / record.wage if record.wage else 0 + for contract in self: + contract.l10n_in_basic_salary_percent = contract.l10n_in_basic_salary / contract.wage if contract.wage else 0 @api.depends("l10n_in_basic_salary", "l10n_in_house_rent_allowance_percent") def _compute_l10n_in_house_rent_allowance(self): - for record in self: - record.l10n_in_house_rent_allowance = record.l10n_in_basic_salary * (record.l10n_in_house_rent_allowance_percent / 100) + for contract in self: + contract.l10n_in_house_rent_allowance = contract.l10n_in_basic_salary * contract.l10n_in_house_rent_allowance_percent def _inverse_l10n_in_house_rent_allowance(self): - for record in self: - record.l10n_in_house_rent_allowance_percent = (record.l10n_in_house_rent_allowance * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + for contract in self: + contract.l10n_in_house_rent_allowance_percent = contract.l10n_in_house_rent_allowance / contract.l10n_in_basic_salary if contract.l10n_in_basic_salary else 0 @api.depends("l10n_in_standard_allowance", "wage") def _compute_l10n_in_standard_allowance_percent(self): - for record in self: - record.l10n_in_standard_allowance_percent = (record.l10n_in_standard_allowance * 100) / record.wage if record.wage else 0 + for contract in self: + contract.l10n_in_standard_allowance_percent = contract.l10n_in_standard_allowance / contract.wage if contract.wage else 0 def _inverse_l10n_in_standard_allowance_percent(self): - for record in self: - record.l10n_in_standard_allowance = (record.l10n_in_standard_allowance_percent * record.wage) / 100 + for contract in self: + contract.l10n_in_standard_allowance = contract.l10n_in_standard_allowance_percent * contract.wage @api.depends("l10n_in_performance_bonus_percent", "l10n_in_basic_salary") def _compute_l10n_in_performance_bonus(self): - for record in self: - record.l10n_in_performance_bonus = record.l10n_in_basic_salary * (record.l10n_in_performance_bonus_percent / 100) + for contract in self: + contract.l10n_in_performance_bonus = contract.l10n_in_basic_salary * contract.l10n_in_performance_bonus_percent def _inverse_l10n_in_performance_bonus(self): - for record in self: - record.l10n_in_performance_bonus_percent = (record.l10n_in_performance_bonus * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + for contract in self: + contract.l10n_in_performance_bonus_percent = contract.l10n_in_performance_bonus / contract.l10n_in_basic_salary if contract.l10n_in_basic_salary else 0 @api.depends("l10n_in_leave_travel_allowance_percent", "l10n_in_basic_salary") def _compute_l10n_in_leave_travel_allowance(self): - for record in self: - record.l10n_in_leave_travel_allowance = record.l10n_in_basic_salary * (record.l10n_in_leave_travel_allowance_percent / 100) + for contract in self: + contract.l10n_in_leave_travel_allowance = contract.l10n_in_basic_salary * contract.l10n_in_leave_travel_allowance_percent def _inverse_l10n_in_leave_travel_allowance(self): - for record in self: - record.l10n_in_leave_travel_allowance_percent = (record.l10n_in_leave_travel_allowance * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + for contract in self: + contract.l10n_in_leave_travel_allowance_percent = contract.l10n_in_leave_travel_allowance / contract.l10n_in_basic_salary if contract.l10n_in_basic_salary else 0 @api.depends('wage', 'l10n_in_leave_allowance_per_day_percent', 'l10n_in_leave_days') def _compute_leave_allowance(self): - for record in self: - record.l10n_in_leave_allowance = (record.wage * (record.l10n_in_leave_allowance_per_day_percent / 100) * record.l10n_in_leave_days) + for contract in self: + contract.l10n_in_leave_allowance = contract.wage * contract.l10n_in_leave_allowance_per_day_percent * contract.l10n_in_leave_days def _inverse_leave_allowance(self): - for record in self: - if record.l10n_in_basic_salary and record.l10n_in_leave_days: - record.l10n_in_leave_allowance_percent = record.l10n_in_leave_allowance * 100 / record.wage if record.wage else 0 - record.l10n_in_leave_allowance_per_day_percent = (record.l10n_in_leave_allowance * 100 / (record.wage * record.l10n_in_leave_days)) if record.wage else 0 + for contract in self: + if contract.l10n_in_basic_salary and contract.l10n_in_leave_days: + contract.l10n_in_leave_allowance_percent = contract.l10n_in_leave_allowance / contract.wage if contract.wage else 0 + contract.l10n_in_leave_allowance_per_day_percent = contract.l10n_in_leave_allowance / (contract.wage * contract.l10n_in_leave_days) if contract.wage else 0 @api.depends("l10n_in_gratuity", "l10n_in_basic_salary") def _compute_l10n_in_gratuity_percent(self): - for record in self: - record.l10n_in_gratuity_percent = (record.l10n_in_gratuity * 100) / record.l10n_in_basic_salary if record.l10n_in_basic_salary else 0 + for contract in self: + contract.l10n_in_gratuity_percent = contract.l10n_in_gratuity / contract.l10n_in_basic_salary if contract.l10n_in_basic_salary else 0 def _inverse_l10n_in_gratuity_percent(self): - for record in self: - record.l10n_in_gratuity = record.l10n_in_basic_salary * (record.l10n_in_gratuity_percent / 100) + for contract in self: + contract.l10n_in_gratuity = contract.l10n_in_basic_salary * contract.l10n_in_gratuity_percent @api.depends("wage", "l10n_in_basic_salary", "l10n_in_house_rent_allowance", "l10n_in_standard_allowance", "l10n_in_performance_bonus", "l10n_in_leave_travel_allowance", "l10n_in_leave_allowance", "l10n_in_gratuity") def _compute_l10n_in_supplementary_allowance(self): - for record in self: + for contract in self: total_allowance = sum([ - record.l10n_in_basic_salary, - record.l10n_in_house_rent_allowance, - record.l10n_in_standard_allowance, - record.l10n_in_performance_bonus, - record.l10n_in_leave_travel_allowance, - record.l10n_in_leave_allowance, - record.l10n_in_gratuity + contract.l10n_in_basic_salary, + contract.l10n_in_house_rent_allowance, + contract.l10n_in_standard_allowance, + contract.l10n_in_performance_bonus, + contract.l10n_in_leave_travel_allowance, + contract.l10n_in_leave_allowance, + contract.l10n_in_gratuity ]) - if record.wage: - record.l10n_in_supplementary_allowance = record.wage - total_allowance + if contract.wage: + contract.l10n_in_supplementary_allowance = contract.wage - total_allowance def _inverse_l10n_in_supplementary_allowance(self): - for record in self: - record.l10n_in_supplementary_allowance_percent = (record.l10n_in_supplementary_allowance * 100) / record.wage if record.wage else 0 + for contract in self: + contract.l10n_in_supplementary_allowance_percent = contract.l10n_in_supplementary_allowance / contract.wage if contract.wage else 0 diff --git a/l10n_in_hr_payroll_extension/models/res_company.py b/l10n_in_hr_payroll_extension/models/res_company.py index 03ce8e60df5..20a1185d9cc 100644 --- a/l10n_in_hr_payroll_extension/models/res_company.py +++ b/l10n_in_hr_payroll_extension/models/res_company.py @@ -9,6 +9,25 @@ class ResCompany(models.Model): l10n_in_org_tan_number = fields.Char(string="TAN Number") l10n_in_org_tds_circle = fields.Char(string="TDS Circle/AO Code") - l10n_in_employer_identification = fields.Char(string="Employer Identification") + l10n_in_pf_employer_identification = fields.Char(string="Employer Identification") + l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution", default=12) + l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution", default=12) + l10n_in_professional_tax_number = fields.Char(string="Professional Tax Number") + l10n_in_esic_ip = fields.Char(string="ESIC IP") + l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution", default=0.75) + l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution", default=3.25) + + l10n_in_lwf_employee_contribution = fields.Monetary(string="Employee Contribution", currency_field="currency_id", default=6) + l10n_in_lwf_employer_contribution = fields.Monetary(string="Employer Contribution", currency_field="currency_id", default=12) + + # Salary Structure + l10n_in_basic_salary_percent = fields.Float(string="Basic Salary Percentage", default=0.50) + l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance", help="You can define 50% for metro city and 40% for non-metro city.", default=0.50) + l10n_in_standard_allowance = fields.Float(string="Standard Allowance", default=4167) + l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus", default=0.20) + l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance", default=0.20) + l10n_in_leave_days = fields.Float(string="Leave Days", default=1) + l10n_in_gratuity = fields.Float(string="Gratuity") + l10n_in_supplementary_allowance = fields.Float(string="Supplementary Allowance") diff --git a/l10n_in_hr_payroll_extension/models/res_config_settings.py b/l10n_in_hr_payroll_extension/models/res_config_settings.py index ce65fd40f8a..a90def5f03e 100644 --- a/l10n_in_hr_payroll_extension/models/res_config_settings.py +++ b/l10n_in_hr_payroll_extension/models/res_config_settings.py @@ -12,27 +12,27 @@ class ResConfigSettings(models.TransientModel): l10n_in_org_tds_circle = fields.Char(related='company_id.l10n_in_org_tds_circle', readonly=False) l10n_in_is_provident_fund = fields.Boolean(string="Employee's Provident Fund", default=True) - l10n_in_employer_identification = fields.Char(related='company_id.l10n_in_employer_identification', readonly=False) - default_l10n_in_pf_employee_contribution = fields.Float(string="Employee Contribution", default_model="hr.contract", default=12) - default_l10n_in_pf_employer_contribution = fields.Float(string="Employer Contribution", default_model="hr.contract", default=12) + l10n_in_pf_employer_identification = fields.Char(related='company_id.l10n_in_pf_employer_identification', readonly=False) + l10n_in_pf_employee_contribution = fields.Float(related="company_id.l10n_in_pf_employee_contribution", readonly=False) + l10n_in_pf_employer_contribution = fields.Float(related="company_id.l10n_in_pf_employer_contribution", readonly=False) l10n_in_is_professional_tax = fields.Boolean(string="Professional Tax", default=True) l10n_in_professional_tax_number = fields.Char(related='company_id.l10n_in_professional_tax_number', readonly=False) l10n_in_is_esic = fields.Boolean(string="Employee's State Insurance Corporation", default=True) - l10n_in_esic_ip = fields.Char(related='company_id.l10n_in_esic_ip', readonly=False) - default_l10n_in_esic_employee_contribution = fields.Float(string="Employee Contribution", default_model="hr.contract", default=0.75) - default_l10n_in_esic_employer_contribution = fields.Float(string="Employer Contribution", default_model="hr.contract", default=3.25) + l10n_in_esic_ip = fields.Char(string="ESIC IP", related='company_id.l10n_in_esic_ip', readonly=False) + l10n_in_esic_employee_contribution = fields.Float(related="company_id.l10n_in_esic_employee_contribution", readonly=False) + l10n_in_esic_employer_contribution = fields.Float(related="company_id.l10n_in_esic_employer_contribution", readonly=False) l10n_in_is_lwf = fields.Boolean(string="Labour Welfare Fund", default=True) - default_l10n_in_lwf_employee_contribution = fields.Monetary(string="Employee Contribution", currency_field="currency_id", default_model="hr.contract", default=6) - default_l10n_in_lwf_employer_contribution = fields.Monetary(string="Employer Contribution", currency_field="currency_id", default_model="hr.contract", default=12) - - default_l10n_in_basic_salary_percent = fields.Float(string="Basic Salary", help="You can define the % of the salary from company cost to compute the basic salary based on your wages (Including D4).", default_model="hr.contract", default=50) - default_l10n_in_house_rent_allowance_percent = fields.Float(string="House Rent Allowance", help="You can define 50% for metro city and 40% for non-metro city.", default_model="hr.contract", default=50) - default_l10n_in_standard_allowance = fields.Float(string="Standard Allowance", default_model="hr.contract", default=4167) - default_l10n_in_performance_bonus_percent = fields.Float(string="Performance Bonus", default_model="hr.contract", default=20) - default_l10n_in_leave_travel_allowance_percent = fields.Float(string="Leave Travel Allowance", default_model="hr.contract", default=20) - default_l10n_in_leave_days = fields.Float(string="Leave Days", default_model="hr.contract", default=1) - default_l10n_in_gratuity = fields.Float(string="Gratuity", default_model="hr.contract") - default_l10n_in_supplementary_allowance = fields.Float(string="Supplementary Allowance", default_model="hr.contract") + l10n_in_lwf_employee_contribution = fields.Monetary(related="company_id.l10n_in_lwf_employee_contribution", readonly=False) + l10n_in_lwf_employer_contribution = fields.Monetary(related="company_id.l10n_in_lwf_employer_contribution", readonly=False) + + l10n_in_basic_salary_percent = fields.Float(related="company_id.l10n_in_basic_salary_percent", readonly=False) + l10n_in_house_rent_allowance_percent = fields.Float(related="company_id.l10n_in_house_rent_allowance_percent", readonly=False) + l10n_in_standard_allowance = fields.Float(related="company_id.l10n_in_standard_allowance", readonly=False) + l10n_in_performance_bonus_percent = fields.Float(related="company_id.l10n_in_performance_bonus_percent", readonly=False) + l10n_in_leave_travel_allowance_percent = fields.Float(related="company_id.l10n_in_leave_travel_allowance_percent", readonly=False) + l10n_in_leave_days = fields.Float(related="company_id.l10n_in_leave_days", readonly=False) + l10n_in_gratuity = fields.Float(related="company_id.l10n_in_gratuity", readonly=False) + l10n_in_supplementary_allowance = fields.Float(related="company_id.l10n_in_supplementary_allowance", readonly=False) diff --git a/l10n_in_hr_payroll_extension/views/hr_contract_views.xml b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml index 44c2540f827..32b877eb05e 100644 --- a/l10n_in_hr_payroll_extension/views/hr_contract_views.xml +++ b/l10n_in_hr_payroll_extension/views/hr_contract_views.xml @@ -12,74 +12,66 @@ </xpath> <xpath expr="//group[@name='salary_info']" position="inside"> <group name="salary_componensts" string="Salary Components" invisible="country_code != 'IN'"> - <label for="l10n_in_basic_salary" /> + <label for="l10n_in_basic_salary"/> <div class="o_row mw-80" name="l10n_in_basic_salary"> <field name="l10n_in_basic_salary"/> <div> / month</div> - <field name="l10n_in_basic_salary_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_basic_salary_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_house_rent_allowance" /> + <label for="l10n_in_house_rent_allowance"/> <div class="o_row mw-80" name="l10n_in_house_rent_allowance"> <field name="l10n_in_house_rent_allowance"/> <div class="mb-2"> / month</div> - <field name="l10n_in_house_rent_allowance_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_house_rent_allowance_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_standard_allowance" /> + <label for="l10n_in_standard_allowance"/> <div class="o_row mw-80" name="l10n_in_standard_allowance"> <field name="l10n_in_standard_allowance"/> <div class="mb-2"> / month</div> - <field name="l10n_in_standard_allowance_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_standard_allowance_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_performance_bonus" /> + <label for="l10n_in_performance_bonus"/> <div class="o_row mw-80" name="l10n_in_performance_bonus"> <field name="l10n_in_performance_bonus"/> <div class="mb-2"> / month</div> - <field name="l10n_in_performance_bonus_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_performance_bonus_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_leave_travel_allowance" /> + <label for="l10n_in_leave_travel_allowance"/> <div class="o_row mw-80" name="l10n_in_leave_travel_allowance"> <field name="l10n_in_leave_travel_allowance"/> <div class="mb-2"> / month</div> - <field name="l10n_in_leave_travel_allowance_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_leave_travel_allowance_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_leave_allowance" /> + <label for="l10n_in_leave_allowance"/> <div class="o_row mw-80" name="l10n_in_leave_allowance"> <field name="l10n_in_leave_allowance"/> <div class="mb-2"> / month</div> - <field name="l10n_in_leave_allowance_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_leave_allowance_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_leave_days" /> + <label for="l10n_in_leave_days"/> <div class="o_row mw-80" name="l10n_in_leave_days"> <field name="l10n_in_leave_days"/> <div class="mb-2">days / month</div> </div> - <label for="l10n_in_gratuity" /> + <label for="l10n_in_gratuity"/> <div class="o_row mw-80" name="l10n_in_gratuity"> <field name="l10n_in_gratuity"/> <div class="mb-2"> / month</div> - <field name="l10n_in_gratuity_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_gratuity_percent" widget="percentage" groups="base.group_no_one"/> </div> - <label for="l10n_in_supplementary_allowance" /> + <label for="l10n_in_supplementary_allowance"/> <div class="o_row mw-80" name="l10n_in_supplementary_allowance"> <field name="l10n_in_supplementary_allowance"/> <div class="mb-2"> / month</div> - <field name="l10n_in_supplementary_allowance_percent" groups="base.group_no_one"/> - <div groups="base.group_no_one">%</div> + <field name="l10n_in_supplementary_allowance_percent" widget="percentage" groups="base.group_no_one"/> </div> </group> <div id="deductions_container" invisible="country_code != 'IN'"> @@ -91,13 +83,13 @@ </div> </group> <group name="other_deductions" string="Other Deductions"> - <label for="l10n_in_pf_employee_contribution" string="PF Employee Contribution" /> + <label for="l10n_in_pf_employee_contribution" string="PF Employee Contribution"/> <div class="o_row mw-60" name="l10n_in_pf_employee_contribution"> <field name="l10n_in_pf_employee_contribution"/> <div class="mb-2">%</div> </div> - <label for="l10n_in_pf_employer_contribution" string="PF Employer Contribution" /> + <label for="l10n_in_pf_employer_contribution" string="PF Employer Contribution"/> <div class="o_row mw-60" name="l10n_in_pf_employer_contribution"> <field name="l10n_in_pf_employer_contribution"/> <div class="mb-2">%</div> @@ -109,31 +101,31 @@ <div class="mb-2"> / month</div> </div> - <label for="l10n_in_esic_employee_contribution" string="ESIC Employee Contribution" /> + <label for="l10n_in_esic_employee_contribution" string="ESIC Employee Contribution"/> <div class="o_row mw-60" name="l10n_in_esic_employee_contribution"> <field name="l10n_in_esic_employee_contribution"/> <div class="mb-2">%</div> </div> - <label for="l10n_in_esic_employer_contribution" string="ESIC Employer Contribution" /> + <label for="l10n_in_esic_employer_contribution" string="ESIC Employer Contribution"/> <div class="o_row mw-60" name="l10n_in_esic_employer_contribution"> <field name="l10n_in_esic_employer_contribution"/> <div class="mb-2">%</div> </div> - <label for="l10n_in_lwf_employee_contribution" string="LWF Employee Contribution" /> + <label for="l10n_in_lwf_employee_contribution" string="LWF Employee Contribution"/> <div class="o_row mw-60" name="l10n_in_lwf_employee_contribution"> <field name="l10n_in_lwf_employee_contribution"/> <div class="mb-2"> / month</div> </div> - <label for="l10n_in_lwf_employer_contribution" string="LWF Employer Contribution" /> + <label for="l10n_in_lwf_employer_contribution" string="LWF Employer Contribution"/> <div class="o_row mw-60" name="l10n_in_lwf_employer_contribution"> <field name="l10n_in_lwf_employer_contribution"/> <div class="mb-2"> / month</div> </div> - <label for="l10n_in_other_deduction" /> + <label for="l10n_in_other_deduction"/> <div class="o_row mw-60" name="l10n_in_other_deduction"> <field name="l10n_in_other_deduction"/> <div class="mb-2"> / month</div> diff --git a/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml index 1f5212021f6..c36f6bbdb24 100644 --- a/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml +++ b/l10n_in_hr_payroll_extension/views/res_config_settings_views.xml @@ -2,17 +2,17 @@ <record id="res_config_settings_view_form_inherited" model="ir.ui.view"> <field name="name">res.config.settings.view.form.inherited.l10n_in_hr_payroll</field> <field name="model">res.config.settings</field> - <field name="inherit_id" ref="l10n_in_hr_payroll.res_config_settings_view_form" /> + <field name="inherit_id" ref="l10n_in_hr_payroll.res_config_settings_view_form"/> <field name="arch" type="xml"> <xpath expr="//block[@id='hr_payroll_accountant']" position="inside"> <setting string="Organisation Tax Details" help="PAN and TAN number's details, used to generate the TDS reports" invisible="company_country_code != 'IN'"> - <field name="l10n_in_org_tax_details" /> + <field name="l10n_in_org_tax_details"/> <group class="mt16" invisible="not l10n_in_org_tax_details"> - <field name="l10n_in_org_pan_number" /> - <field name="l10n_in_org_tan_number" /> - <field name="l10n_in_org_tds_circle" /> + <field name="l10n_in_org_pan_number"/> + <field name="l10n_in_org_tan_number"/> + <field name="l10n_in_org_tds_circle"/> </group> </setting> </xpath> @@ -20,23 +20,23 @@ <div class="row o_settings_container" invisible="company_country_code != 'IN'"> <div class="col-lg-6 col-12 o_setting_box" id="epf_section"> <div class="o_setting_left_pane"> - <field name="l10n_in_is_provident_fund" /> + <field name="l10n_in_is_provident_fund"/> </div> <div class="o_setting_right_pane"> <label for="l10n_in_is_provident_fund" - string="Employee's Provident Fund" /> + string="Employee's Provident Fund"/> <group class="mt16" invisible="not l10n_in_is_provident_fund"> - <field name="l10n_in_employer_identification" /> + <field name="l10n_in_pf_employer_identification"/> - <label for="default_l10n_in_pf_employee_contribution"/> + <label for="l10n_in_pf_employee_contribution"/> <div class="o_row"> - <field name="default_l10n_in_pf_employee_contribution" /> + <field name="l10n_in_pf_employee_contribution"/> <div>%</div> </div> - <label for="default_l10n_in_pf_employer_contribution"/> + <label for="l10n_in_pf_employer_contribution"/> <div class="o_row"> - <field name="default_l10n_in_pf_employer_contribution" /> + <field name="l10n_in_pf_employer_contribution"/> <div>%</div> </div> </group> @@ -44,23 +44,23 @@ </div> <div class="col-lg-6 col-12 o_setting_box" id="esic_section"> <div class="o_setting_left_pane"> - <field name="l10n_in_is_esic" /> + <field name="l10n_in_is_esic"/> </div> <div class="o_setting_right_pane"> <label for="l10n_in_is_esic" - string="Employee's State Insurance Corporation" /> + string="Employee's State Insurance Corporation"/> <group class="mt16" invisible="not l10n_in_is_esic"> - <field name="l10n_in_esic_ip" /> + <field name="l10n_in_esic_ip"/> - <label for="default_l10n_in_esic_employee_contribution"/> + <label for="l10n_in_esic_employee_contribution"/> <div class="o_row"> - <field name="default_l10n_in_esic_employee_contribution" /> + <field name="l10n_in_esic_employee_contribution"/> <div>%</div> </div> - <label for="default_l10n_in_esic_employer_contribution"/> + <label for="l10n_in_esic_employer_contribution"/> <div class="o_row"> - <field name="default_l10n_in_esic_employer_contribution" /> + <field name="l10n_in_esic_employer_contribution"/> <div>%</div> </div> </group> @@ -70,93 +70,86 @@ <div class="row o_settings_container" invisible="company_country_code != 'IN'"> <div class="col-lg-6 col-12 o_setting_box" id="pt_section"> <div class="o_setting_left_pane"> - <field name="l10n_in_is_professional_tax" /> + <field name="l10n_in_is_professional_tax"/> </div> <div class="o_setting_right_pane"> - <label for="l10n_in_is_professional_tax" string="Professional Tax" /> + <label for="l10n_in_is_professional_tax" string="Professional Tax"/> <group class="mt16" invisible="not l10n_in_is_professional_tax"> - <field name="l10n_in_professional_tax_number" /> + <field name="l10n_in_professional_tax_number"/> </group> </div> </div> <div class="col-lg-6 col-12 o_setting_box" id="lwf_section"> <div class="o_setting_left_pane"> - <field name="l10n_in_is_lwf" /> + <field name="l10n_in_is_lwf"/> </div> <div class="o_setting_right_pane"> - <label for="l10n_in_is_lwf" string="Labour Welfare Fund" /> + <label for="l10n_in_is_lwf" string="Labour Welfare Fund"/> <group class="mt16" invisible="not l10n_in_is_lwf"> - <label for="default_l10n_in_lwf_employee_contribution"/> + <label for="l10n_in_lwf_employee_contribution"/> <div class="o_row mw-80"> - <field name="default_l10n_in_lwf_employee_contribution" /> + <field name="l10n_in_lwf_employee_contribution"/> <div>₹</div> </div> - <label for="default_l10n_in_lwf_employer_contribution"/> + <label for="l10n_in_lwf_employer_contribution"/> <div class="o_row mw-80"> - <field name="default_l10n_in_lwf_employer_contribution" /> + <field name="l10n_in_lwf_employer_contribution"/> <div>₹</div> </div> </group> </div> </div> </div> - <div class="row o_settings_container" id="salary_components_section" invisible="company_country_code != 'IN'"> + <setting class="row o_settings_container" string="Salary Components" id="salary_components_section" invisible="company_country_code != 'IN'" company_dependent="1"> <div class="col-lg-8 col-12 o_setting_box"> - <div class="o_setting_right_pane"> - <span class="fw-bold fs-4">Salary Components</span> - <group name="l10n_in_salary_components" class="mt16"> - <label for="default_l10n_in_basic_salary_percent"/> - <div class="o_row mw-80" name="default_l10n_in_basic_salary_percent"> - <field name="default_l10n_in_basic_salary_percent" nolabel="1"/> - <div>%</div> - </div> + <group name="l10n_in_salary_components" class="mt16"> + <label for="l10n_in_basic_salary_percent"/> + <div class="o_row mw-40" name="l10n_in_basic_salary_percent"> + <field name="l10n_in_basic_salary_percent" widget="percentage" nolabel="1"/> + </div> - <label for="default_l10n_in_house_rent_allowance_percent" /> - <div class="o_row mw-80" name="default_l10n_in_house_rent_allowance_percent"> - <field name="default_l10n_in_house_rent_allowance_percent" nolabel="1"/> - <div class="mb-2">%</div> - </div> + <label for="l10n_in_house_rent_allowance_percent"/> + <div class="o_row mw-40" name="l10n_in_house_rent_allowance_percent"> + <field name="l10n_in_house_rent_allowance_percent" widget="percentage" nolabel="1"/> + </div> - <label for="default_l10n_in_standard_allowance" /> - <div class="o_row mw-80" name="default_l10n_in_standard_allowance"> - <field name="default_l10n_in_standard_allowance" nolabel="1"/> - <div class="mb-2">%</div> - </div> + <label for="l10n_in_standard_allowance"/> + <div class="o_row mw-80" name="l10n_in_standard_allowance"> + <field name="l10n_in_standard_allowance" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> - <label for="default_l10n_in_performance_bonus_percent" /> - <div class="o_row mw-80" name="default_l10n_in_performance_bonus_percent"> - <field name="default_l10n_in_performance_bonus_percent" nolabel="1"/> - <div class="mb-2">%</div> - </div> + <label for="l10n_in_performance_bonus_percent"/> + <div class="o_row mw-40" name="l10n_in_performance_bonus_percent"> + <field name="l10n_in_performance_bonus_percent" widget="percentage" nolabel="1"/> + </div> - <label for="default_l10n_in_leave_travel_allowance_percent" /> - <div class="o_row mw-80" name="default_l10n_in_leave_travel_allowance_percent"> - <field name="default_l10n_in_leave_travel_allowance_percent" nolabel="1"/> - <div class="mb-2">%</div> - </div> + <label for="l10n_in_leave_travel_allowance_percent"/> + <div class="o_row mw-40" name="l10n_in_leave_travel_allowance_percent"> + <field name="l10n_in_leave_travel_allowance_percent" widget="percentage" nolabel="1"/> + </div> - <label for="default_l10n_in_leave_days" /> - <div class="o_row mw-80" name="default_l10n_in_leave_days"> - <field name="default_l10n_in_leave_days" nolabel="1"/> - <div class="mb-2">days / month</div> - </div> + <label for="l10n_in_leave_days"/> + <div class="o_row mw-80" name="l10n_in_leave_days"> + <field name="l10n_in_leave_days" nolabel="1"/> + <div class="mb-2">days / month</div> + </div> - <label for="default_l10n_in_gratuity" /> - <div class="o_row mw-80" name="default_l10n_in_gratuity"> - <field name="default_l10n_in_gratuity" nolabel="1"/> - <div class="mb-2">₹ / month</div> - </div> + <label for="l10n_in_gratuity"/> + <div class="o_row mw-80" name="l10n_in_gratuity"> + <field name="l10n_in_gratuity" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> - <label for="default_l10n_in_supplementary_allowance" /> - <div class="o_row mw-80" name="default_l10n_in_supplementary_allowance"> - <field name="default_l10n_in_supplementary_allowance" nolabel="1"/> - <div class="mb-2">₹ / month</div> - </div> - </group> - </div> + <label for="l10n_in_supplementary_allowance"/> + <div class="o_row mw-80" name="l10n_in_supplementary_allowance"> + <field name="l10n_in_supplementary_allowance" nolabel="1"/> + <div class="mb-2">₹ / month</div> + </div> + </group> </div> - </div> + </setting> </xpath> </field> </record>