Public release from ruodoo-project: 19.0 - 2026-11-01 22:52:25 UTC

This commit is contained in:
CI Publish Bot
2026-11-01 22:54:30 +00:00
commit 26250aa580
2492 changed files with 664277 additions and 0 deletions

View File

@@ -0,0 +1,151 @@
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