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)], }