From afdb30d40f3ba810ef73053e66131ce0aac2d8c6 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 28 Apr 2022 19:31:24 +0000 Subject: [PATCH] [ADD] l10n_pe_hr_payroll_account: for 13.0 --- l10n_pe_hr_payroll_account/__init__.py | 13 ++ l10n_pe_hr_payroll_account/__manifest__.py | 25 ++++ .../data/l10n_pe_hr_payroll_account_data.xml | 48 +++++++ .../data/l10n_pe_hr_payroll_account_demo.xml | 14 ++ l10n_pe_hr_payroll_account/models/__init__.py | 3 + .../models/account_chart_template.py | 136 ++++++++++++++++++ 6 files changed, 239 insertions(+) create mode 100644 l10n_pe_hr_payroll_account/__init__.py create mode 100644 l10n_pe_hr_payroll_account/__manifest__.py create mode 100644 l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_data.xml create mode 100644 l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_demo.xml create mode 100644 l10n_pe_hr_payroll_account/models/__init__.py create mode 100644 l10n_pe_hr_payroll_account/models/account_chart_template.py diff --git a/l10n_pe_hr_payroll_account/__init__.py b/l10n_pe_hr_payroll_account/__init__.py new file mode 100644 index 00000000..116ac075 --- /dev/null +++ b/l10n_pe_hr_payroll_account/__init__.py @@ -0,0 +1,13 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +from odoo import api, SUPERUSER_ID +from . import models + +def _post_install_hook_configure_journals(cr, registry): + """ + This method will create a salary journal for each company and allocate it to each Peru structure. + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + companies = env['res.company'].search([('partner_id.country_id', '=', env.ref('base.pe').id)]) + for company in companies: + env['account.chart.template']._pe_configure_payroll_account_data(company) diff --git a/l10n_pe_hr_payroll_account/__manifest__.py b/l10n_pe_hr_payroll_account/__manifest__.py new file mode 100644 index 00000000..39c2e347 --- /dev/null +++ b/l10n_pe_hr_payroll_account/__manifest__.py @@ -0,0 +1,25 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +{ + 'name': 'Peru - Payroll with Accounting', + 'author': 'Hibou Corp. ', + 'version': '13.0.2022.0.0', + 'category': 'Human Resources', + 'depends': [ + 'l10n_pe_hr_payroll', + 'hr_payroll_account', + ], + 'description': """ +Accounting Data for Peru Payroll Rules. +======================================= + """, + 'auto_install': True, + 'data': [ + 'data/l10n_pe_hr_payroll_account_data.xml', + ], + 'demo': [ + 'data/l10n_pe_hr_payroll_account_demo.xml', + ], + 'post_init_hook': '_post_install_hook_configure_journals', + 'license': 'OPL-1', +} diff --git a/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_data.xml b/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_data.xml new file mode 100644 index 00000000..0f65f6db --- /dev/null +++ b/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_data.xml @@ -0,0 +1,48 @@ + + + + + + Peru Default Accounting + + + code + + if records: + companies = env.user.company_ids + # You can override the account codes with kwargs like: + # pay_ee='1234', + # pay_afp='1235', + # pay_onp='1236', + # pay_eps='1237', + # pay_ir_5ta_cat='1238', + # pay_essalud='1239', + # exp_salary='1240', + # exp_essalud='1241', + env['account.chart.template']._pe_configure_payroll_account_data(companies, salary_rules=records, full_reset=False) + + + + + Peru Default Accounting (Reset) + + + code + + if records: + companies = env.user.company_ids + # You can override the account codes with kwargs like: + # pay_ee='1234', + # pay_afp='1235', + # pay_onp='1236', + # pay_eps='1237', + # pay_ir_5ta_cat='1238', + # pay_essalud='1239', + # exp_salary='1240', + # exp_essalud='1241', + env['account.chart.template']._pe_configure_payroll_account_data(companies, salary_rules=records, full_reset=True) + + + + + diff --git a/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_demo.xml b/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_demo.xml new file mode 100644 index 00000000..58168767 --- /dev/null +++ b/l10n_pe_hr_payroll_account/data/l10n_pe_hr_payroll_account_demo.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/l10n_pe_hr_payroll_account/models/__init__.py b/l10n_pe_hr_payroll_account/models/__init__.py new file mode 100644 index 00000000..21f7d3d7 --- /dev/null +++ b/l10n_pe_hr_payroll_account/models/__init__.py @@ -0,0 +1,3 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +from . import account_chart_template diff --git a/l10n_pe_hr_payroll_account/models/account_chart_template.py b/l10n_pe_hr_payroll_account/models/account_chart_template.py new file mode 100644 index 00000000..0bdc2f6f --- /dev/null +++ b/l10n_pe_hr_payroll_account/models/account_chart_template.py @@ -0,0 +1,136 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +from odoo import models + +EXP_SALARY = '6211000' +EXP_ESSALUD = '6271000' + +PAY_EE = '4111000' +PAY_AFP = '407' # TODO +PAY_AFP = '4032000' # TODO +PAY_ONP = '4032000' +PAY_EPS = '4075' # TODO EPS isn't implemented +PAY_IR_5TA_CAT = '4017' # TODO +PAY_ESSALUD = '4031000' + + +class AccountChartTemplate(models.Model): + _inherit = 'account.chart.template' + + def _load(self, sale_tax_rate, purchase_tax_rate, company): + """ + Override to configure payroll accounting data as well as accounting data. + """ + res = super()._load(sale_tax_rate, purchase_tax_rate, company) + self._pe_configure_payroll_account_data(company) + return res + + def _pe_configure_payroll_account_data(self, companies, + pay_ee=PAY_EE, + pay_afp=PAY_AFP, + pay_onp=PAY_ONP, + pay_eps=PAY_EPS, + pay_ir_5ta_cat=PAY_IR_5TA_CAT, + pay_essalud=PAY_ESSALUD, + exp_salary=EXP_SALARY, + exp_essalud=EXP_ESSALUD, + salary_rules=None, full_reset=False): + account_codes = ( + pay_ee, + pay_afp, + pay_onp, + pay_eps, + pay_ir_5ta_cat, + pay_essalud, + exp_salary, + exp_essalud, + ) + pe_structures = self.env['hr.payroll.structure'].search([('country_id', '=', self.env.ref('base.pe').id)]) + journal_field_id = self.env['ir.model.fields'].search([ + ('model', '=', 'hr.payroll.structure'), + ('name', '=', 'journal_id')], limit=1) + + for company in companies: + self = self.with_context({'allowed_company_ids': company.ids}) + accounts = { + code: self.env['account.account'].search( + [('company_id', '=', company.id), ('code', '=like', '%s%%' % code)], limit=1) + for code in account_codes + } + accounts['none'] = self.env['account.account'].browse() + + def set_rule_accounts(code, account_debit, account_credit): + rule_domain = [ + ('struct_id', 'in', pe_structures.ids), + ('code', '=like', code), + ] + if salary_rules: + rule_domain.append(('id', 'in', salary_rules.ids)) + rules = self.env['hr.salary.rule'].search(rule_domain) + if full_reset: + values = { + 'account_debit': account_debit.id, + 'account_credit': account_credit.id, + } + rules.write(values) + else: + # we need to ensure we do not update an account that is already set + for rule in rules: + values = {} + if account_debit and not rule.account_debit: + values['account_debit'] = account_debit.id + if account_credit and not rule.account_credit: + values['account_credit'] = account_credit.id + if values: + # save a write if no values to write + rule.write(values) + + journal = self.env['account.journal'].search([ + ('code', '=', 'PAYR'), + ('name', '=', 'Payroll'), + ('company_id', '=', company.id), + ]) + if journal: + if not journal.default_credit_account_id: + journal.default_credit_account_id = accounts[exp_salary].id + if not journal.default_debit_account_id: + journal.default_debit_account_id = accounts[exp_salary].id + if hasattr(journal, 'payroll_entry_type'): + journal.payroll_entry_type = 'grouped' + else: + journal = self.env['account.journal'].create({ + 'name': 'Payroll', + 'code': 'PAYR', + 'type': 'general', + 'company_id': company.id, + 'default_credit_account_id': accounts[exp_salary].id, + 'default_debit_account_id': accounts[exp_salary].id, + }) + if hasattr(journal, 'payroll_entry_type'): + journal.payroll_entry_type = 'grouped' + + self.env['ir.property'].create([{ + 'name': 'structure_journal_id', + 'company_id': company.id, + 'fields_id': journal_field_id.id, + 'value_reference': 'account.journal,%s' % journal.id, + 'res_id': 'hr.payroll.structure,%s' % structure.id, + } for structure in pe_structures]) + + # Find rules and set accounts on them. + # Find all rules that are ... + + # BASIC* -> SALARY_EXPENSE debit account + set_rule_accounts('BASIC%', accounts[exp_salary], accounts['none']) + # ALW* -> SALARY_EXPENSE debit account + set_rule_accounts('ALW%', accounts[exp_salary], accounts['none']) + # EE_* -> AP debit + set_rule_accounts('EE_%', accounts[pay_ee], accounts['none']) # initialize + set_rule_accounts('EE_PE_AFP%', accounts[pay_afp], accounts['none']) + set_rule_accounts('EE_PE_ONP%', accounts[pay_onp], accounts['none']) + set_rule_accounts('EE_PE_IR_5TA_CAT%', accounts[pay_ir_5ta_cat], accounts['none']) + # ER_* -> AP debit, SE credit + set_rule_accounts('ER_%', accounts[pay_ee], accounts[exp_salary]) # initialize + set_rule_accounts('ER_PE_ESSALUD%', accounts[pay_essalud], accounts[exp_essalud]) + # NET* -> AP credit + set_rule_accounts('NET%', accounts['none'], accounts[pay_ee])