mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
111 lines
5.0 KiB
Python
111 lines
5.0 KiB
Python
# 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,
|
|
salary_rules=None, full_reset=False):
|
|
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
|
|
}
|
|
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)
|
|
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[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,
|
|
})
|
|
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])
|
|
|
|
# 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], 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], 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%', accounts['none'], accounts[ap_code])
|