152 lines
7.6 KiB
Python
152 lines
7.6 KiB
Python
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
|