Public release from ruodoo-project: 19.0 - 2026-11-01 22:52:25 UTC
This commit is contained in:
78
rsbu_payroll/hooks.py
Normal file
78
rsbu_payroll/hooks.py
Normal file
@@ -0,0 +1,78 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user