79 lines
3.8 KiB
Python
79 lines
3.8 KiB
Python
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)
|