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)