Files
public/rsbu_chart_of_accounts/wizards/rsbu_account_load_wizard.py

178 lines
11 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.
from odoo import fields, models, _
# Типовой план счетов по Приказу Минфина № 94н.
# Формат: (код, наименование, признак, [субконто]).
# Признак: A - активный, P - пассивный, AP - активно-пассивный, OB - забалансовый.
# Субконто: p - partner, pr - product, u - user, e - employee.
CHART_94N = [
# Раздел I. Внеоборотные активы
('01', 'Основные средства', 'A', []),
('02', 'Амортизация основных средств', 'P', []),
('03', 'Доходные вложения в материальные ценности', 'A', []),
('04', 'Нематериальные активы', 'A', []),
('05', 'Амортизация нематериальных активов', 'P', []),
('07', 'Оборудование к установке', 'A', []),
('08', 'Вложения во внеоборотные активы', 'A', []),
('09', 'Отложенные налоговые активы', 'A', []),
# Раздел II. Производственные запасы
('10', 'Материалы', 'A', ['pr']),
('11', 'Животные на выращивании и откорме', 'A', []),
('14', 'Резервы под снижение стоимости материальных ценностей', 'P', []),
('15', 'Заготовление и приобретение материальных ценностей', 'A', []),
('16', 'Отклонение в стоимости материальных ценностей', 'AP', []),
('19', 'Налог на добавленную стоимость по приобретённым ценностям', 'A', []),
# Раздел III. Затраты на производство
('20', 'Основное производство', 'A', []),
('21', 'Полуфабрикаты собственного производства', 'A', []),
('23', 'Вспомогательные производства', 'A', []),
('25', 'Общепроизводственные расходы', 'A', []),
('26', 'Общехозяйственные расходы', 'A', []),
('28', 'Брак в производстве', 'A', []),
('29', 'Обслуживающие производства и хозяйства', 'A', []),
# Раздел IV. Готовая продукция и товары
('40', 'Выпуск продукции (работ, услуг)', 'AP', []),
('41', 'Товары', 'A', ['pr']),
('42', 'Торговая наценка', 'P', []),
('43', 'Готовая продукция', 'A', ['pr']),
('44', 'Расходы на продажу', 'A', []),
('45', 'Товары отгруженные', 'A', []),
('46', 'Выполненные этапы по незавершённым работам', 'A', []),
# Раздел V. Денежные средства
('50', 'Касса', 'A', []),
('51', 'Расчётные счета', 'A', []),
('52', 'Валютные счета', 'A', []),
('55', 'Специальные счета в банках', 'A', []),
('57', 'Переводы в пути', 'A', []),
('58', 'Финансовые вложения', 'A', []),
('59', 'Резервы под обесценение финансовых вложений', 'P', []),
# Раздел VI. Расчёты
('60', 'Расчёты с поставщиками и подрядчиками', 'AP', ['p']),
('62', 'Расчёты с покупателями и заказчиками', 'AP', ['p']),
('63', 'Резервы по сомнительным долгам', 'P', []),
('66', 'Расчёты по краткосрочным кредитам и займам', 'P', ['p']),
('67', 'Расчёты по долгосрочным кредитам и займам', 'P', ['p']),
('68', 'Расчёты по налогам и сборам', 'AP', []),
('69', 'Расчёты по социальному страхованию и обеспечению', 'AP', []),
('70', 'Расчёты с персоналом по оплате труда', 'P', ['e']),
('71', 'Расчёты с подотчётными лицами', 'AP', ['e']),
('73', 'Расчёты с персоналом по прочим операциям', 'AP', ['e']),
('75', 'Расчёты с учредителями', 'AP', ['p']),
('76', 'Расчёты с разными дебиторами и кредиторами', 'AP', ['p']),
('77', 'Отложенные налоговые обязательства', 'P', []),
('79', 'Внутрихозяйственные расчёты', 'AP', []),
# Раздел VII. Капитал
('80', 'Уставный капитал', 'P', []),
('81', 'Собственные акции (доли)', 'A', []),
('82', 'Резервный капитал', 'P', []),
('83', 'Добавочный капитал', 'P', []),
('84', 'Нераспределённая прибыль (непокрытый убыток)', 'AP', []),
('86', 'Целевое финансирование', 'P', []),
# Раздел VIII. Финансовые результаты
('90', 'Продажи', 'AP', []),
('91', 'Прочие доходы и расходы', 'AP', []),
('94', 'Недостачи и потери от порчи ценностей', 'A', []),
('96', 'Резервы предстоящих расходов', 'P', []),
('97', 'Расходы будущих периодов', 'A', []),
('98', 'Доходы будущих периодов', 'P', []),
('99', 'Прибыли и убытки', 'AP', []),
# Забалансовые счета
('001', 'Арендованные основные средства', 'OB', []),
('002', 'Товарно-материальные ценности, принятые на ответственное хранение', 'OB', []),
('003', 'Материалы, принятые в переработку', 'OB', []),
('004', 'Товары, принятые на комиссию', 'OB', []),
('005', 'Оборудование, принятое для монтажа', 'OB', []),
('006', 'Бланки строгой отчётности', 'OB', []),
('007', 'Списанная в убыток задолженность неплатёжеспособных дебиторов', 'OB', []),
('008', 'Обеспечения обязательств и платежей полученные', 'OB', []),
('009', 'Обеспечения обязательств и платежей выданные', 'OB', []),
('010', 'Износ основных средств', 'OB', []),
('011', 'Основные средства, сданные в аренду', 'OB', []),
]
# Ключевые субсчета по регламенту (../../docs/research/08-business-process-usn.md).
# Формат: (код субсчёта, наименование, признак, [субконто], код родителя).
SUBACCOUNTS_94N = [
('62.01', 'Расчёты с покупателями и заказчиками', 'A', ['p'], '62'),
('62.АВ', 'Авансы полученные', 'P', ['p'], '62'),
('68.НДС', 'НДС', 'AP', [], '68'),
('68.НДФЛ', 'НДФЛ', 'P', [], '68'),
('69.ЕТ', 'Страховые взносы по единому тарифу', 'P', [], '69'),
('69.ТР', 'Взносы на травматизм', 'P', [], '69'),
('76.АВ', 'НДС по авансам полученным', 'A', ['p'], '76'),
('90.01', 'Выручка', 'P', [], '90'),
('90.02', 'Себестоимость продаж', 'A', [], '90'),
('90.03', 'Налог на добавленную стоимость', 'A', [], '90'),
('90.08', 'Управленческие расходы', 'A', [], '90'),
('90.09', 'Прибыль/убыток от продаж', 'AP', [], '90'),
('91.01', 'Прочие доходы', 'P', [], '91'),
('91.02', 'Прочие расходы', 'A', [], '91'),
('91.09', 'Сальдо прочих доходов и расходов', 'AP', [], '91'),
]
KIND_MAP = {'A': 'active', 'P': 'passive', 'AP': 'active_passive', 'OB': 'off_balance'}
SUBCONTO_FIELD = {'p': 'subconto_partner', 'pr': 'subconto_product',
'u': 'subconto_user', 'e': 'subconto_employee'}
class RsbuAccountLoadWizard(models.TransientModel):
"""Визард загрузки типового плана счетов 94н для компании."""
_name = 'rsbu.account.load.wizard'
_description = 'РСБУ — Загрузка типового плана счетов'
company_id = fields.Many2one(
'res.company', string='Компания', required=True,
default=lambda self: self.env.company,
)
overwrite = fields.Boolean(
string='Не создавать существующие',
default=True,
help='Пропускать счета, код которых уже есть у компании.',
)
def _subconto_vals(self, subconto):
vals = {}
for key in subconto:
vals[SUBCONTO_FIELD[key]] = True
return vals
def action_load(self):
self.ensure_one()
Account = self.env['rsbu.account']
company = self.company_id
existing = {a.code: a for a in Account.with_context(
active_test=False).search([('company_id', '=', company.id)])}
# 1) Синтетические счета.
for code, name, kind, subconto in CHART_94N:
if code in existing:
continue
vals = {
'code': code, 'name': name,
'account_kind': KIND_MAP[kind],
'company_id': company.id,
}
vals.update(self._subconto_vals(subconto))
existing[code] = Account.create(vals)
# 2) Субсчета (с привязкой к родителю).
for code, name, kind, subconto, parent_code in SUBACCOUNTS_94N:
if code in existing:
continue
parent = existing.get(parent_code)
vals = {
'code': code, 'name': name,
'account_kind': KIND_MAP[kind],
'company_id': company.id,
'parent_id': parent.id if parent else False,
}
vals.update(self._subconto_vals(subconto))
existing[code] = Account.create(vals)
return {
'type': 'ir.actions.act_window',
'name': _('План счетов РСБУ'),
'res_model': 'rsbu.account',
'view_mode': 'list,form',
'domain': [('company_id', '=', company.id)],
}