Public release from ruodoo-project: 19.0 - 2026-11-01 22:52:25 UTC
This commit is contained in:
2
rsbu_reporting_base/__init__.py
Normal file
2
rsbu_reporting_base/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import models
|
||||
from .hooks import post_init_check_upd_conflict
|
||||
45
rsbu_reporting_base/__manifest__.py
Normal file
45
rsbu_reporting_base/__manifest__.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': 'РСБУ — Реквизиты отчётности (фундамент)',
|
||||
'version': '19.0.2026.09.29',
|
||||
'summary': 'Реквизиты компании и сотрудников для отчётности ФНС/СФР',
|
||||
'description': """
|
||||
РСБУ — Реквизиты отчётности (фундамент этапов 8–10)
|
||||
===================================================
|
||||
|
||||
Общий фундамент для регламентной отчётности ФНС и СФР: реквизиты
|
||||
страхователя/налогоплательщика (компания) и персональные данные
|
||||
физлиц (сотрудники), необходимые для деклараций, расчётов и
|
||||
персонифицированных сведений.
|
||||
|
||||
Возможности:
|
||||
------------
|
||||
* Реквизиты компании: ОКТМО, код налогового органа, ОКВЭД,
|
||||
КБК по налогам и взносам, регистрационный номер СФР, класс
|
||||
профессионального риска, подписант отчётности.
|
||||
* Данные сотрудника: СНИЛС, ИНН физлица, дата рождения, гражданство,
|
||||
код категории застрахованного лица, статус налогоплательщика.
|
||||
|
||||
Значения задаются настройками/данными (не хардкодом). Конкретные коды,
|
||||
КБК и версии форматов подлежат сверке со специалистом и актуальной
|
||||
нормативкой (TODO по каждому полю).
|
||||
|
||||
НЕСОВМЕСТИМОСТЬ: не устанавливать вместе с устаревшим l10n_ru_upd_xml —
|
||||
РСБУ-слой определяет собственные поля отчётности (ОКЕИ на единице
|
||||
измерения и др.), которые конфликтуют со старым модулем. УПД формируется
|
||||
из rsbu.invoice (rsbu_fns_reporting), l10n_ru_upd_xml должен быть удалён.
|
||||
""",
|
||||
'author': 'MK.Lab, RuOdoo',
|
||||
'website': 'https://ruodoo.ru',
|
||||
'category': 'Accounting/Localizations',
|
||||
'depends': ['rsbu_payroll'],
|
||||
'data': [
|
||||
'views/res_config_settings_views.xml',
|
||||
'views/res_partner_views.xml',
|
||||
],
|
||||
'post_init_hook': 'post_init_check_upd_conflict',
|
||||
'installable': True,
|
||||
'application': False,
|
||||
'license': 'LGPL-3',
|
||||
'maintainers': ['mklab', 'ruodoo'],
|
||||
}
|
||||
26
rsbu_reporting_base/hooks.py
Normal file
26
rsbu_reporting_base/hooks.py
Normal file
@@ -0,0 +1,26 @@
|
||||
"""Хук установки: предупреждение о несовместимости с l10n_ru_upd_xml.
|
||||
|
||||
РСБУ-слой отчётности определяет собственные поля (okei на uom.uom, а также
|
||||
через смежные модули edi/inn/kpp/okpo на res.company/res.partner), которые
|
||||
дублируют поля устаревшего модуля l10n_ru_upd_xml. Совместная установка
|
||||
может привести к неоднозначному определению полей и некорректной генерации
|
||||
УПД. Старый модуль помечен deprecated и должен быть удалён.
|
||||
"""
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def post_init_check_upd_conflict(env):
|
||||
"""Предупредить, если установлен устаревший l10n_ru_upd_xml."""
|
||||
module = env['ir.module.module'].sudo().search([
|
||||
('name', '=', 'l10n_ru_upd_xml'),
|
||||
('state', '=', 'installed'),
|
||||
], limit=1)
|
||||
if module:
|
||||
_logger.warning(
|
||||
'НЕСОВМЕСТИМОСТЬ: установлен устаревший модуль l10n_ru_upd_xml. '
|
||||
'РСБУ-слой формирует УПД из rsbu.invoice (rsbu_fns_reporting) и '
|
||||
'определяет собственные поля отчётности (ОКЕИ и др.), которые '
|
||||
'конфликтуют со старым модулем. Удалите l10n_ru_upd_xml во '
|
||||
'избежание некорректной генерации УПД и дублирования полей.')
|
||||
4
rsbu_reporting_base/models/__init__.py
Normal file
4
rsbu_reporting_base/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from . import res_company
|
||||
from . import res_config_settings
|
||||
from . import res_partner
|
||||
from . import uom_uom
|
||||
95
rsbu_reporting_base/models/res_company.py
Normal file
95
rsbu_reporting_base/models/res_company.py
Normal file
@@ -0,0 +1,95 @@
|
||||
"""Реквизиты компании (страхователя/налогоплательщика) для отчётности.
|
||||
|
||||
Обязательные реквизиты XML-форматов ФНС и СФР, отсутствующие в базовых
|
||||
модулях: ОКТМО, код налогового органа, ОКВЭД, КБК по налогам/взносам,
|
||||
регистрационный номер СФР, класс профессионального риска, подписант.
|
||||
|
||||
ВНИМАНИЕ: конкретные коды (ОКТМО, код НО), значения КБК и класс профриска
|
||||
зависят от организации и региона — задаются пользователем в настройках.
|
||||
Приведённые defaults КБК — типовые на 2026 и подлежат сверке с актуальными
|
||||
приказами Минфина. TODO(сверка).
|
||||
"""
|
||||
from odoo import fields, models
|
||||
|
||||
# Типовые КБК 2026 (подлежат сверке — TODO). Заданы как defaults, чтобы
|
||||
# не хардкодить в генераторах XML; пользователь корректирует в настройках.
|
||||
KBK_USN_INCOME = '18210501011011000110' # УСН «Доходы»
|
||||
KBK_NDS = '18210301000011000110' # НДС
|
||||
KBK_NDFL = '18210102010011000110' # НДФЛ (агент)
|
||||
KBK_INSURANCE_UNIFIED = '18210201000011000160' # Страховые взносы (ед. тариф)
|
||||
KBK_INJURY = '79710212000061000160' # Взносы на травматизм (СФР)
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
# --- Территория и налоговый орган ---
|
||||
rsbu_oktmo = fields.Char(
|
||||
string='ОКТМО',
|
||||
help='Код территории муниципального образования (ОКТМО) для '
|
||||
'деклараций и уведомлений. TODO(сверка).')
|
||||
rsbu_tax_office_code = fields.Char(
|
||||
string='Код налогового органа',
|
||||
help='Четырёхзначный код ИФНС по месту учёта. TODO(сверка).')
|
||||
rsbu_okved = fields.Char(
|
||||
string='ОКВЭД',
|
||||
help='Основной код вида экономической деятельности. TODO(сверка).')
|
||||
|
||||
# --- КБК по налогам и взносам ---
|
||||
rsbu_kbk_usn = fields.Char(
|
||||
string='КБК УСН', default=KBK_USN_INCOME,
|
||||
help='КБК налога при УСН. TODO(сверка с приказом Минфина).')
|
||||
rsbu_kbk_nds = fields.Char(
|
||||
string='КБК НДС', default=KBK_NDS,
|
||||
help='КБК налога на добавленную стоимость. TODO(сверка).')
|
||||
rsbu_kbk_ndfl = fields.Char(
|
||||
string='КБК НДФЛ', default=KBK_NDFL,
|
||||
help='КБК налога на доходы физлиц (налоговый агент). TODO(сверка).')
|
||||
rsbu_kbk_insurance = fields.Char(
|
||||
string='КБК страховых взносов', default=KBK_INSURANCE_UNIFIED,
|
||||
help='КБК страховых взносов по единому тарифу. TODO(сверка).')
|
||||
rsbu_kbk_injury = fields.Char(
|
||||
string='КБК взносов на травматизм', default=KBK_INJURY,
|
||||
help='КБК взносов на травматизм (СФР). TODO(сверка).')
|
||||
|
||||
# --- Реквизиты страхователя в СФР ---
|
||||
rsbu_sfr_reg_number = fields.Char(
|
||||
string='Рег. номер в СФР',
|
||||
help='Регистрационный номер страхователя в Социальном фонде России '
|
||||
'(для ЕФС-1). TODO(сверка).')
|
||||
rsbu_profrisk_class = fields.Char(
|
||||
string='Класс профриска',
|
||||
help='Класс профессионального риска (определяет тариф взносов на '
|
||||
'травматизм). TODO(сверка с уведомлением СФР).')
|
||||
rsbu_ogrn = fields.Char(
|
||||
string='ОГРН',
|
||||
help='Основной государственный регистрационный номер юридического '
|
||||
'лица (13 знаков). Элемент «ОГРН» блока «Страхователь» в ЕФС-1. '
|
||||
'Для ИП указывается ОГРНИП (15 знаков).')
|
||||
|
||||
# --- Подписант отчётности ---
|
||||
rsbu_signatory_id = fields.Many2one(
|
||||
'res.users', string='Подписант отчётности',
|
||||
help='Лицо, подписывающее налоговую/страховую отчётность '
|
||||
'(руководитель или уполномоченный представитель).')
|
||||
rsbu_signatory_is_representative = fields.Boolean(
|
||||
string='Подписант — представитель',
|
||||
help='Отмечено — подписант является уполномоченным представителем '
|
||||
'(признак «2» в XML), иначе руководитель (признак «1»).')
|
||||
rsbu_signatory_title = fields.Char(
|
||||
string='Должность подписанта', default='ГЕНЕРАЛЬНЫЙ ДИРЕКТОР',
|
||||
help='Должность руководителя (уполномоченного представителя), '
|
||||
'подписывающего отчётность. Элемент «Должность» в блоке '
|
||||
'«Руководитель» ЕФС-1.')
|
||||
|
||||
# --- Электронный документооборот (ЭДО) — для имени файла обмена УПД ---
|
||||
rsbu_edo_operator_code = fields.Char(
|
||||
string='Код оператора ЭДО (УИОЭДО)', size=3, default='000',
|
||||
help='Трёхзначный код оператора ЭДО, присвоенный ФНС (напр. «2BM» — '
|
||||
'Диадок, «2BE» — СБИС). «000» — при обмене не через оператора '
|
||||
'ЭДО. Используется в имени файла обмена УПД.')
|
||||
rsbu_edo_participant_id = fields.Char(
|
||||
string='Идентификатор участника ЭДО',
|
||||
help='Уникальный идентификатор участника (организации) в системе '
|
||||
'ЭДО, присвоенный оператором (УИОтпр в имени файла обмена). '
|
||||
'При обмене не через оператора — GUID участника.')
|
||||
48
rsbu_reporting_base/models/res_config_settings.py
Normal file
48
rsbu_reporting_base/models/res_config_settings.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = 'res.config.settings'
|
||||
|
||||
rsbu_oktmo = fields.Char(
|
||||
related='company_id.rsbu_oktmo', readonly=False, string='ОКТМО')
|
||||
rsbu_tax_office_code = fields.Char(
|
||||
related='company_id.rsbu_tax_office_code', readonly=False,
|
||||
string='Код налогового органа')
|
||||
rsbu_okved = fields.Char(
|
||||
related='company_id.rsbu_okved', readonly=False, string='ОКВЭД')
|
||||
rsbu_kbk_usn = fields.Char(
|
||||
related='company_id.rsbu_kbk_usn', readonly=False, string='КБК УСН')
|
||||
rsbu_kbk_nds = fields.Char(
|
||||
related='company_id.rsbu_kbk_nds', readonly=False, string='КБК НДС')
|
||||
rsbu_kbk_ndfl = fields.Char(
|
||||
related='company_id.rsbu_kbk_ndfl', readonly=False, string='КБК НДФЛ')
|
||||
rsbu_kbk_insurance = fields.Char(
|
||||
related='company_id.rsbu_kbk_insurance', readonly=False,
|
||||
string='КБК страховых взносов')
|
||||
rsbu_kbk_injury = fields.Char(
|
||||
related='company_id.rsbu_kbk_injury', readonly=False,
|
||||
string='КБК взносов на травматизм')
|
||||
rsbu_sfr_reg_number = fields.Char(
|
||||
related='company_id.rsbu_sfr_reg_number', readonly=False,
|
||||
string='Рег. номер в СФР')
|
||||
rsbu_profrisk_class = fields.Char(
|
||||
related='company_id.rsbu_profrisk_class', readonly=False,
|
||||
string='Класс профриска')
|
||||
rsbu_signatory_id = fields.Many2one(
|
||||
related='company_id.rsbu_signatory_id', readonly=False,
|
||||
string='Подписант отчётности')
|
||||
rsbu_signatory_is_representative = fields.Boolean(
|
||||
related='company_id.rsbu_signatory_is_representative', readonly=False,
|
||||
string='Подписант — представитель')
|
||||
rsbu_signatory_title = fields.Char(
|
||||
related='company_id.rsbu_signatory_title', readonly=False,
|
||||
string='Должность подписанта')
|
||||
rsbu_ogrn = fields.Char(
|
||||
related='company_id.rsbu_ogrn', readonly=False, string='ОГРН')
|
||||
rsbu_edo_operator_code = fields.Char(
|
||||
related='company_id.rsbu_edo_operator_code', readonly=False,
|
||||
string='Код оператора ЭДО (УИОЭДО)')
|
||||
rsbu_edo_participant_id = fields.Char(
|
||||
related='company_id.rsbu_edo_participant_id', readonly=False,
|
||||
string='Идентификатор участника ЭДО')
|
||||
17
rsbu_reporting_base/models/res_partner.py
Normal file
17
rsbu_reporting_base/models/res_partner.py
Normal file
@@ -0,0 +1,17 @@
|
||||
"""Идентификатор участника ЭДО на контрагенте — для имени файла обмена.
|
||||
|
||||
Ранее поле называлось `edi` (в устаревшем l10n_ru_upd_xml). Переносим в
|
||||
РСБУ-слой как `rsbu_edo_participant_id`, чтобы отчётность/УПД не зависели
|
||||
от deprecated-модуля.
|
||||
"""
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
rsbu_edo_participant_id = fields.Char(
|
||||
string='Идентификатор участника ЭДО',
|
||||
help='Уникальный идентификатор контрагента в системе ЭДО, '
|
||||
'присвоенный оператором (УИПол — получатель — в имени файла '
|
||||
'обмена УПД). При обмене не через оператора — GUID участника.')
|
||||
16
rsbu_reporting_base/models/uom_uom.py
Normal file
16
rsbu_reporting_base/models/uom_uom.py
Normal file
@@ -0,0 +1,16 @@
|
||||
"""Код ОКЕИ на единице измерения — для отчётных XML (УПД и др.).
|
||||
|
||||
Ранее поле добавлял устаревший l10n_ru_upd_xml; переносим в РСБУ-слой,
|
||||
чтобы отчётность не зависела от deprecated-модуля. ОКЕИ — код единицы по
|
||||
Общероссийскому классификатору единиц измерения (напр. 796 — штука,
|
||||
006 — метр). TODO(справочник ОКЕИ).
|
||||
"""
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class UomUom(models.Model):
|
||||
_inherit = 'uom.uom'
|
||||
|
||||
okei = fields.Char(
|
||||
string='Код ОКЕИ',
|
||||
help='Код единицы измерения по ОКЕИ (для УПД и налоговых XML).')
|
||||
BIN
rsbu_reporting_base/static/description/icon.png
Normal file
BIN
rsbu_reporting_base/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
114
rsbu_reporting_base/views/res_config_settings_views.xml
Normal file
114
rsbu_reporting_base/views/res_config_settings_views.xml
Normal file
@@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="res_config_settings_view_form_rsbu_reporting"
|
||||
model="ir.ui.view">
|
||||
<field name="name">res.config.settings.view.form.rsbu.reporting</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="priority" eval="35"/>
|
||||
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//form" position="inside">
|
||||
<app string="РСБУ — Отчётность" name="rsbu_reporting_base"
|
||||
img="/rsbu_reporting_base/static/description/icon.png">
|
||||
<block title="Реквизиты налогоплательщика"
|
||||
name="rsbu_reporting_taxpayer">
|
||||
<setting string="Территория и налоговый орган"
|
||||
help="ОКТМО, код ИФНС, ОКВЭД для деклараций">
|
||||
<div class="content-group">
|
||||
<div class="row">
|
||||
<label for="rsbu_oktmo" class="col-lg-4"/>
|
||||
<field name="rsbu_oktmo"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_tax_office_code"
|
||||
class="col-lg-4"/>
|
||||
<field name="rsbu_tax_office_code"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_okved" class="col-lg-4"/>
|
||||
<field name="rsbu_okved"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting string="КБК по налогам и взносам"
|
||||
help="Коды бюджетной классификации (сверить)">
|
||||
<div class="content-group">
|
||||
<div class="row">
|
||||
<label for="rsbu_kbk_usn" class="col-lg-4"/>
|
||||
<field name="rsbu_kbk_usn"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_kbk_nds" class="col-lg-4"/>
|
||||
<field name="rsbu_kbk_nds"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_kbk_ndfl" class="col-lg-4"/>
|
||||
<field name="rsbu_kbk_ndfl"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_kbk_insurance"
|
||||
class="col-lg-4"/>
|
||||
<field name="rsbu_kbk_insurance"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_kbk_injury"
|
||||
class="col-lg-4"/>
|
||||
<field name="rsbu_kbk_injury"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
<block title="Реквизиты страхователя (СФР)"
|
||||
name="rsbu_reporting_sfr">
|
||||
<setting string="Регистрация в СФР"
|
||||
help="Рег. номер и класс профриска для ЕФС-1">
|
||||
<div class="content-group">
|
||||
<div class="row">
|
||||
<label for="rsbu_sfr_reg_number"
|
||||
class="col-lg-4"/>
|
||||
<field name="rsbu_sfr_reg_number"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_profrisk_class"
|
||||
class="col-lg-4"/>
|
||||
<field name="rsbu_profrisk_class"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
<block title="Подписант отчётности"
|
||||
name="rsbu_reporting_signatory">
|
||||
<setting string="Подписант"
|
||||
help="Лицо, подписывающее отчётность">
|
||||
<field name="rsbu_signatory_id"/>
|
||||
<div class="mt8">
|
||||
<field name="rsbu_signatory_is_representative"
|
||||
class="oe_inline"/>
|
||||
<label for="rsbu_signatory_is_representative"
|
||||
string="Подписант — уполномоченный представитель"/>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
<block title="Электронный документооборот (ЭДО)"
|
||||
name="rsbu_reporting_edo">
|
||||
<setting string="Реквизиты ЭДО"
|
||||
help="Для имени файла обмена УПД">
|
||||
<div class="content-group">
|
||||
<div class="row">
|
||||
<label for="rsbu_edo_operator_code"
|
||||
class="col-lg-5"/>
|
||||
<field name="rsbu_edo_operator_code"/>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="rsbu_edo_participant_id"
|
||||
class="col-lg-5"/>
|
||||
<field name="rsbu_edo_participant_id"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
</app>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
21
rsbu_reporting_base/views/res_partner_views.xml
Normal file
21
rsbu_reporting_base/views/res_partner_views.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="view_partner_form_rsbu_edo" model="ir.ui.view">
|
||||
<field name="name">res.partner.form.rsbu.edo</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page string="РСБУ — ЭДО" name="rsbu_edo">
|
||||
<group>
|
||||
<field name="rsbu_edo_participant_id"/>
|
||||
</group>
|
||||
<div class="alert alert-info" role="alert">
|
||||
Идентификатор участника в системе ЭДО используется
|
||||
в имени файла обмена УПД (получатель/отправитель).
|
||||
</div>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user