import logging from odoo import fields from . import models _logger = logging.getLogger(__name__) def pre_init_setup_accounting(env): """Настроить бухгалтерию до загрузки демо-данных. Демо-данные (договоры, счета) требуют настроенного плана счетов и журналов (продаж/покупок). В чистой базе их ещё нет. Загружаем типовой план счетов и сразу выставляем рубли — до появления проводок, иначе Odoo запретит менять валюту компании. """ company = env.ref('base.main_company', raise_if_not_found=False) if not company: return # Рубль как валюта компании (пока нет ни одной проводки). rub = env['res.currency'].with_context(active_test=False).search( [('name', '=', 'RUB')], limit=1) if rub and not rub.active: rub.active = True # План счетов — только если ещё не настроен (нет журналов). has_journals = env['account.journal'].search_count( [('company_id', '=', company.id)]) if not has_journals: try: env['account.chart.template'].try_loading( 'generic_coa', company=company, install_demo=False) except Exception as exc: # noqa: BLE001 _logger.warning( 'ruodoo_demo_data: не удалось загрузить типовой план счетов: %s', exc) # Фискальная страна — Россия. Типовой план счетов (generic_coa) # выставляет её в США, из-за чего российские ставки НДС (country_id=RU) # не видны в документах. Приводим к РФ. ru = env.ref('base.ru', raise_if_not_found=False) if ru: if company.country_id != ru: company.country_id = ru.id if company.account_fiscal_country_id != ru: company.account_fiscal_country_id = ru.id # Российские ставки НДС (country_id=RU) обязательны: демо-заказы продаж и # закупок автоматически создают счета (sale_order.xml / purchase_order.xml), # а штатная проверка account.move._validate_taxes_country отклоняет налоги # generic_coa (США) при фискальной стране РФ. Создаём ставки НДС через # rsbu_vat_templates до загрузки data/*.xml, чтобы продукты и счета могли # на них ссылаться. try: env['account.tax']._rsbu_setup_vat_taxes() except Exception as exc: # noqa: BLE001 _logger.warning( 'ruodoo_demo_data: не удалось создать ставки НДС РФ: %s', exc) # Налоги по умолчанию для компании должны быть РФ-совместимы: generic_coa # оставляет ставки США, несовместимые с фискальной страной РФ. Выставляем # «НДС 5%» как значение по умолчанию для строк без продукта. if ru: sale_tax = env['account.tax'].search([ ('name', '=', 'НДС 5% (продажа)'), ('type_tax_use', '=', 'sale'), ('country_id', '=', ru.id), ('company_id', 'child_of', company.root_id.id), ], limit=1) purchase_tax = env['account.tax'].search([ ('name', '=', 'НДС 5% (покупка)'), ('type_tax_use', '=', 'purchase'), ('country_id', '=', ru.id), ('company_id', 'child_of', company.root_id.id), ], limit=1) if sale_tax: company.account_sale_tax_id = sale_tax.id if purchase_tax: company.account_purchase_tax_id = purchase_tax.id if rub and company.currency_id != rub: try: company.currency_id = rub.id except Exception: # noqa: BLE001 _logger.warning( 'ruodoo_demo_data: не удалось выставить рубли до загрузки демо.') # План счетов и журналы уже готовы — создаём профиль «Основной договор» # с закреплённым xmlid, чтобы демо-данные могли ссылаться на него. try: from odoo.addons.l10n_ru_contract_account.hooks import ensure_main_profile ensure_main_profile(env, company=company) except Exception as exc: # noqa: BLE001 _logger.warning( 'ruodoo_demo_data: не удалось создать профиль «Основной договор»: %s', exc) def post_init_setup_company(env): """Принудительно задать имя основной компании и валюту RUB. XML-данные с noupdate="1" не перезаписывают уже существующее имя компании (напр. дефолтное "ООО CodUP" из образа), а валюту компании Odoo по умолчанию ставит USD. Хук гарантирует РФ-настройки демо. """ company = env.ref('base.main_company', raise_if_not_found=False) if not company: return # 1) Активировать российский рубль. rub = env['res.currency'].with_context(active_test=False).search( [('name', '=', 'RUB')], limit=1) if rub and not rub.active: rub.active = True # 2) Имя основной компании (через партнёра) — РФ-название. if company.partner_id: company.partner_id.name = 'ООО "Моя компания"' # 3) Валюта компании — рубли. Как правило уже выставлена в pre_init # (до появления проводок). Дублируем на случай ручной установки. if rub and company.currency_id != rub: try: company.currency_id = rub.id except Exception: _logger.warning( 'ruodoo_demo_data: не удалось сменить валюту компании на RUB ' '(вероятно, уже есть проводки). Смените валюту вручную.') # 4) Гарантировать профиль «Основной договор» (idempotent). try: from odoo.addons.l10n_ru_contract_account.hooks import ensure_main_profile ensure_main_profile(env, company=company) except Exception as exc: # noqa: BLE001 _logger.warning( 'ruodoo_demo_data: не удалось дозаполнить профиль ' '«Основной договор»: %s', exc) # 5) Счета поставщиков, созданные из заказов на закупку # (action_create_invoice), не имеют даты — Odoo требует её при # проведении. Проставляем дату демо-счетам, чтобы они проводились. bills = env['account.move'].search([ ('move_type', 'in', ('in_invoice', 'in_refund')), ('state', '=', 'draft'), ('invoice_date', '=', False), ]) for bill in bills: base_date = bill.invoice_date_due or bill.date or fields.Date.today() bill.invoice_date = base_date