Files
public/rsbu_payroll/hooks.py

79 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import logging
_logger = logging.getLogger(__name__)
# Схема проводок кадрового цикла: код правила → (счёт Дт, счёт Кт) в кодах
# плана счетов РСБУ 94н. Счёт затрат по умолчанию — 26 (общехозяйственные
# расходы), типично для УСН-компаний сферы услуг; переопределяется вручную.
RULE_ACCOUNTS = {
'BASIC': ('26', '70'), # начисление оклада
'PREMIUM': ('26', '70'), # премия
'VACATION': ('26', '70'), # отпускные
'SICK3': ('26', '70'), # больничный за счёт работодателя
'NDFL': ('70', '68.НДФЛ'), # удержание НДФЛ
'INSURANCE': ('26', '69.ЕТ'), # страховые взносы (единый тариф)
'INJURY': ('26', '69.ТР'), # взносы на травматизм
# GROSS / NET — промежуточные итоги, счетов не имеют.
}
def _find_account(env, company, code):
return env['rsbu.account'].search([
('code', '=', code),
('company_id', '=', company.id),
], limit=1)
def _assign_accounts_for_company(env, company):
"""Проставить счета РСБУ на правилах зарплаты для одной компании."""
Rule = env['hr.salary.rule']
for code, (debit_code, credit_code) in RULE_ACCOUNTS.items():
rule = env.ref(
'rsbu_payroll.rsbu_rule_%s' % code.lower(),
raise_if_not_found=False)
if not rule:
continue
debit = _find_account(env, company, debit_code)
credit = _find_account(env, company, credit_code)
if not (debit and credit):
_logger.info(
'rsbu_payroll: для компании %s не найдены счета %s/%s '
'(план счетов РСБУ не загружен?) — правило %s не настроено.',
company.display_name, debit_code, credit_code, code)
continue
# Счета company_dependent — пишем в контексте компании.
rule.with_company(company).write({
'rsbu_account_debit': debit.id,
'rsbu_account_credit': credit.id,
})
def _ensure_leave_kinds(env):
"""Проставить вид отсутствия (rsbu_leave_kind) на типах hr.leave.type.
Типы отсутствий создаются с noupdate=1 (пользователь может их
настраивать), поэтому классификатор проставляем программно для
надёжности и на существующих базах.
"""
mapping = {
'rsbu_payroll.rsbu_leave_annual': 'vacation',
'rsbu_payroll.rsbu_leave_sick': 'sick',
'rsbu_payroll.rsbu_leave_unpaid': 'unpaid',
}
for xmlid, kind in mapping.items():
rec = env.ref(xmlid, raise_if_not_found=False)
if rec and rec.rsbu_leave_kind != kind:
rec.rsbu_leave_kind = kind
def post_init_setup_rule_accounts(env):
"""Назначить счета РСБУ на правилах зарплаты по всем компаниям.
Счета `rsbu.account` — company-dependent и без стабильных xmlid, поэтому
задаём их программно поиском по коду для каждой компании с загруженным
планом счетов РСБУ. Идемпотентно (повторный вызов перезаписывает).
"""
for company in env['res.company'].search([]):
_assign_accounts_for_company(env, company)
_ensure_leave_kinds(env)