From 87a8104add517c9193f7a5b2abb1d99273113eba Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Sun, 5 Jan 2020 14:22:02 -0800 Subject: [PATCH 1/5] NEW `l10n_us_hr_payroll_account` Rewrite for Odoo 13 --- l10n_us_hr_payroll_account/__init__.py | 13 +++ l10n_us_hr_payroll_account/__manifest__.py | 26 +++++ .../data/l10n_us_hr_payroll_account_data.xml | 5 + .../data/l10n_us_hr_payroll_account_demo.xml | 14 +++ l10n_us_hr_payroll_account/models/__init__.py | 3 + .../models/account_chart_template.py | 92 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9635 bytes 7 files changed, 153 insertions(+) create mode 100644 l10n_us_hr_payroll_account/__init__.py create mode 100644 l10n_us_hr_payroll_account/__manifest__.py create mode 100644 l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml create mode 100644 l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_demo.xml create mode 100644 l10n_us_hr_payroll_account/models/__init__.py create mode 100644 l10n_us_hr_payroll_account/models/account_chart_template.py create mode 100644 l10n_us_hr_payroll_account/static/description/icon.png diff --git a/l10n_us_hr_payroll_account/__init__.py b/l10n_us_hr_payroll_account/__init__.py new file mode 100644 index 00000000..6412a7a0 --- /dev/null +++ b/l10n_us_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 USA structure. + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + companies = env['res.company'].search([('partner_id.country_id', '=', env.ref('base.us').id)]) + for company in companies: + env['account.chart.template']._us_configure_payroll_account_data(company) diff --git a/l10n_us_hr_payroll_account/__manifest__.py b/l10n_us_hr_payroll_account/__manifest__.py new file mode 100644 index 00000000..d0443654 --- /dev/null +++ b/l10n_us_hr_payroll_account/__manifest__.py @@ -0,0 +1,26 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +{ + 'name': 'United States of America - Payroll with Accounting', + 'author': 'Hibou Corp. ', + 'version': '13.0.2019.0.0', + 'category': 'Human Resources', + 'depends': [ + 'l10n_us_hr_payroll', + 'hr_payroll_account', + 'l10n_generic_coa', + ], + 'description': """ +Accounting Data for USA Payroll Rules. +====================================== + """, + 'auto_install': True, + 'data': [ + 'data/l10n_us_hr_payroll_account_data.xml', + ], + 'demo': [ + 'data/l10n_us_hr_payroll_account_demo.xml', + ], + 'post_init_hook': '_post_install_hook_configure_journals', + 'license': 'OPL-1', +} diff --git a/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml new file mode 100644 index 00000000..92f68e70 --- /dev/null +++ b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_demo.xml b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_demo.xml new file mode 100644 index 00000000..e6093d7e --- /dev/null +++ b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_demo.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/l10n_us_hr_payroll_account/models/__init__.py b/l10n_us_hr_payroll_account/models/__init__.py new file mode 100644 index 00000000..21f7d3d7 --- /dev/null +++ b/l10n_us_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_us_hr_payroll_account/models/account_chart_template.py b/l10n_us_hr_payroll_account/models/account_chart_template.py new file mode 100644 index 00000000..d64158dc --- /dev/null +++ b/l10n_us_hr_payroll_account/models/account_chart_template.py @@ -0,0 +1,92 @@ +# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. + +from odoo import models + +ACCOUNT_PAYABLE = '211000' +SALARY_EXPENSES = '630000' + + +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._us_configure_payroll_account_data(company) + return res + + def _us_configure_payroll_account_data(self, companies, ap_code=ACCOUNT_PAYABLE, salary_exp_code=SALARY_EXPENSES): + account_codes = ( + ap_code, + salary_exp_code, + ) + us_structures = self.env['hr.payroll.structure'].search([('country_id', '=', self.env.ref('base.us').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 + } + + def set_rule_accounts(code, account_debit, account_credit): + rule_domain = [ + ('struct_id', 'in', us_structures.ids), + ('code', '=like', code), + ] + rules = self.env['hr.salary.rule'].search(rule_domain) + values = {} + if account_debit: + values['account_debit'] = account_debit.id + if account_credit: + values['account_credit'] = account_credit.id + rules.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[SALARY_EXPENSES].id + if not journal.default_debit_account_id: + journal.default_debit_account_id = accounts[SALARY_EXPENSES].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[SALARY_EXPENSES].id, + 'default_debit_account_id': accounts[SALARY_EXPENSES].id, + '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 us_structures]) + + # Find rules and set accounts on them. + # Find all rules that are ... + + # BASIC* -> SALARY_EXPENSE debit account + set_rule_accounts('BASIC%', accounts[salary_exp_code], None) + # EE_* -> AP debit + set_rule_accounts('EE_%', accounts[ap_code], None) + # ER_* -> AP debit, SE credit + set_rule_accounts('ER_%', accounts[ap_code], accounts[salary_exp_code]) + # NET* -> AP credit + set_rule_accounts('NET%', None, accounts[ap_code]) diff --git a/l10n_us_hr_payroll_account/static/description/icon.png b/l10n_us_hr_payroll_account/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac2e2aa9ff9decf40744fabad90fef31b3c0abb GIT binary patch literal 9635 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 literal 0 HcmV?d00001 From b3375621bd304780cce7c10274ce1c098176479c Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Wed, 5 Feb 2020 14:07:18 -0800 Subject: [PATCH 2/5] FIX `l10n_us_hr_payroll_account` Cannot create journal with optional field from `hr_payroll_payment` --- l10n_us_hr_payroll_account/models/account_chart_template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/l10n_us_hr_payroll_account/models/account_chart_template.py b/l10n_us_hr_payroll_account/models/account_chart_template.py index d64158dc..758f4528 100644 --- a/l10n_us_hr_payroll_account/models/account_chart_template.py +++ b/l10n_us_hr_payroll_account/models/account_chart_template.py @@ -68,8 +68,9 @@ class AccountChartTemplate(models.Model): 'company_id': company.id, 'default_credit_account_id': accounts[SALARY_EXPENSES].id, 'default_debit_account_id': accounts[SALARY_EXPENSES].id, - 'payroll_entry_type': 'grouped', }) + if hasattr(journal, 'payroll_entry_type'): + journal.payroll_entry_type = 'grouped' self.env['ir.property'].create([{ 'name': 'structure_journal_id', From a0b4c596bef4a8c493015b86b6a3d070faaff2b0 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Fri, 18 Sep 2020 10:21:27 -0700 Subject: [PATCH 3/5] [IMP] l10n_us_hr_payroll_account: add record rules to reset accounting on selected rules --- .../data/l10n_us_hr_payroll_account_data.xml | 31 +++++++++++++++- .../models/account_chart_template.py | 37 ++++++++++++++----- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml index 92f68e70..94aa5427 100644 --- a/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml +++ b/l10n_us_hr_payroll_account/data/l10n_us_hr_payroll_account_data.xml @@ -1,5 +1,34 @@ - + + + US Default Accounting + + + code + + if records: + companies = env.user.company_ids + # You can override the account codes with kwargs like + # ap_code='2111', salary_exp_code='6111' + env['account.chart.template']._us_configure_payroll_account_data(companies, salary_rules=records, full_reset=False) + + + + + US Default Accounting (Reset) + + + code + + if records: + companies = env.user.company_ids + # You can override the account codes with kwargs like + # ap_code='2111', salary_exp_code='6111' + env['account.chart.template']._us_configure_payroll_account_data(companies, salary_rules=records, full_reset=True) + + + + diff --git a/l10n_us_hr_payroll_account/models/account_chart_template.py b/l10n_us_hr_payroll_account/models/account_chart_template.py index 758f4528..16232431 100644 --- a/l10n_us_hr_payroll_account/models/account_chart_template.py +++ b/l10n_us_hr_payroll_account/models/account_chart_template.py @@ -17,7 +17,8 @@ class AccountChartTemplate(models.Model): self._us_configure_payroll_account_data(company) return res - def _us_configure_payroll_account_data(self, companies, ap_code=ACCOUNT_PAYABLE, salary_exp_code=SALARY_EXPENSES): + def _us_configure_payroll_account_data(self, companies, ap_code=ACCOUNT_PAYABLE, salary_exp_code=SALARY_EXPENSES, + salary_rules=None, full_reset=False): account_codes = ( ap_code, salary_exp_code, @@ -34,19 +35,33 @@ class AccountChartTemplate(models.Model): [('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', us_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) - values = {} - if account_debit: - values['account_debit'] = account_debit.id - if account_credit: - values['account_credit'] = account_credit.id - rules.write(values) + 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'), @@ -84,10 +99,12 @@ class AccountChartTemplate(models.Model): # Find all rules that are ... # BASIC* -> SALARY_EXPENSE debit account - set_rule_accounts('BASIC%', accounts[salary_exp_code], None) + set_rule_accounts('BASIC%', accounts[salary_exp_code], accounts['none']) + # ALW* -> SALARY_EXPENSE debit account + set_rule_accounts('ALW%', accounts[salary_exp_code], accounts['none']) # EE_* -> AP debit - set_rule_accounts('EE_%', accounts[ap_code], None) + set_rule_accounts('EE_%', accounts[ap_code], accounts['none']) # ER_* -> AP debit, SE credit set_rule_accounts('ER_%', accounts[ap_code], accounts[salary_exp_code]) # NET* -> AP credit - set_rule_accounts('NET%', None, accounts[ap_code]) + set_rule_accounts('NET%', accounts['none'], accounts[ap_code]) From 433f93712a272dab6fb9b03ab87083cfd9efdb07 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Sun, 22 Nov 2020 08:26:23 -0800 Subject: [PATCH 4/5] [MIG] l10n_us_hr_payroll_account: to Odoo Enterprise 14.0 --- l10n_us_hr_payroll_account/__manifest__.py | 2 +- .../models/account_chart_template.py | 21 +++++++------------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/l10n_us_hr_payroll_account/__manifest__.py b/l10n_us_hr_payroll_account/__manifest__.py index d0443654..b9a206b2 100644 --- a/l10n_us_hr_payroll_account/__manifest__.py +++ b/l10n_us_hr_payroll_account/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'United States of America - Payroll with Accounting', 'author': 'Hibou Corp. ', - 'version': '13.0.2019.0.0', + 'version': '14.0.2020.0.0', 'category': 'Human Resources', 'depends': [ 'l10n_us_hr_payroll', diff --git a/l10n_us_hr_payroll_account/models/account_chart_template.py b/l10n_us_hr_payroll_account/models/account_chart_template.py index 16232431..fe3cbbb7 100644 --- a/l10n_us_hr_payroll_account/models/account_chart_template.py +++ b/l10n_us_hr_payroll_account/models/account_chart_template.py @@ -69,10 +69,8 @@ class AccountChartTemplate(models.Model): ('company_id', '=', company.id), ]) if journal: - if not journal.default_credit_account_id: - journal.default_credit_account_id = accounts[SALARY_EXPENSES].id - if not journal.default_debit_account_id: - journal.default_debit_account_id = accounts[SALARY_EXPENSES].id + if not journal.default_account_id: + journal.default_account_id = accounts[SALARY_EXPENSES].id if hasattr(journal, 'payroll_entry_type'): journal.payroll_entry_type = 'grouped' else: @@ -81,19 +79,16 @@ class AccountChartTemplate(models.Model): 'code': 'PAYR', 'type': 'general', 'company_id': company.id, - 'default_credit_account_id': accounts[SALARY_EXPENSES].id, - 'default_debit_account_id': accounts[SALARY_EXPENSES].id, + 'default_account_id': accounts[SALARY_EXPENSES].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 us_structures]) + self.env['ir.property']._set_multi( + "journal_id", + "hr.payroll.structure", + {structure.id: journal for structure in us_structures}, + ) # Find rules and set accounts on them. # Find all rules that are ... From a5fe7b7988053b75374298ec878d6df13eb6420c Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 7 Oct 2021 09:01:15 -0700 Subject: [PATCH 5/5] [MIG] l10n_us_hr_payroll_account: to Odoo 15.0 --- l10n_us_hr_payroll_account/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_us_hr_payroll_account/__manifest__.py b/l10n_us_hr_payroll_account/__manifest__.py index b9a206b2..bca376f1 100644 --- a/l10n_us_hr_payroll_account/__manifest__.py +++ b/l10n_us_hr_payroll_account/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'United States of America - Payroll with Accounting', 'author': 'Hibou Corp. ', - 'version': '14.0.2020.0.0', + 'version': '15.0.2021.0.0', 'category': 'Human Resources', 'depends': [ 'l10n_us_hr_payroll',