Files
public/ruodoo_demo_data/__init__.py

152 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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