Public release from ruodoo-project: 19.0 - 2026-11-01 22:52:25 UTC

This commit is contained in:
CI Publish Bot
2026-11-01 22:54:30 +00:00
commit 26250aa580
2492 changed files with 664277 additions and 0 deletions

78
rsbu_payroll/hooks.py Normal file
View 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)