74 lines
3.9 KiB
Python
74 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""Оборотно-сальдовая ведомость (ОСВ) по РСБУ-проводкам.
|
||
|
||
Строится за период по проведённым строкам rsbu.move.line, сгруппированным
|
||
по счёту плана счетов. Для каждого счёта показываются шесть показателей:
|
||
сальдо на начало (Дт/Кт), обороты за период (Дт/Кт), сальдо на конец
|
||
(Дт/Кт) — как в 1С.
|
||
|
||
Особенности:
|
||
* сальдо активно-пассивных счетов (60/62/76) — РАЗВЁРНУТОЕ (дебиторка и
|
||
кредиторка одновременно), считается в разрезе субконто через
|
||
rsbu.account.get_expanded_balance;
|
||
* иерархия счетов сворачивается снизу вверх: показатели счёта-группы =
|
||
сумма показателей его потомков-листьев;
|
||
* начало года для сальдо — календарное (1 января), результатные счета
|
||
90/91/99 к концу года закрываются регламентом закрытия месяца.
|
||
|
||
Строки живут в рамках пользовательской сессии (TransientModel); отчёт на
|
||
экране (QWeb-HTML) и переход к проводкам (drill-down) строятся поверх них.
|
||
"""
|
||
from odoo import api, fields, models
|
||
|
||
|
||
class RsbuTrialBalanceLine(models.TransientModel):
|
||
_name = 'rsbu.trial.balance.line'
|
||
_description = 'РСБУ — Строка оборотно-сальдовой ведомости'
|
||
_order = 'code'
|
||
|
||
wizard_id = fields.Many2one(
|
||
'rsbu.trial.balance.wizard', string='Отчёт', ondelete='cascade',
|
||
index=True)
|
||
account_id = fields.Many2one('rsbu.account', string='Счёт', index=True)
|
||
code = fields.Char(string='Код счёта', index=True)
|
||
name = fields.Char(string='Наименование счёта')
|
||
level = fields.Integer(string='Уровень')
|
||
is_group = fields.Boolean(string='Счёт-группа')
|
||
parent_code = fields.Char(string='Код родителя')
|
||
|
||
company_id = fields.Many2one('res.company', string='Компания')
|
||
currency_id = fields.Many2one('res.currency', string='Валюта')
|
||
|
||
opening_debit = fields.Monetary(string='Сальдо нач. Дт',
|
||
currency_field='currency_id')
|
||
opening_credit = fields.Monetary(string='Сальдо нач. Кт',
|
||
currency_field='currency_id')
|
||
turnover_debit = fields.Monetary(string='Оборот Дт',
|
||
currency_field='currency_id')
|
||
turnover_credit = fields.Monetary(string='Оборот Кт',
|
||
currency_field='currency_id')
|
||
closing_debit = fields.Monetary(string='Сальдо кон. Дт',
|
||
currency_field='currency_id')
|
||
closing_credit = fields.Monetary(string='Сальдо кон. Кт',
|
||
currency_field='currency_id')
|
||
|
||
def action_open_entries(self):
|
||
"""Drill-down: открыть проводки счёта за период отчёта."""
|
||
self.ensure_one()
|
||
wiz = self.wizard_id
|
||
domain = [
|
||
('account_id', 'child_of', self.account_id.id),
|
||
('state', '=', 'posted'),
|
||
('company_id', '=', self.company_id.id),
|
||
('date', '>=', wiz.date_from),
|
||
('date', '<=', wiz.date_to),
|
||
]
|
||
return {
|
||
'type': 'ir.actions.act_window',
|
||
'name': '%s %s' % (self.code, self.name or ''),
|
||
'res_model': 'rsbu.move.line',
|
||
'view_mode': 'list,form',
|
||
'domain': domain,
|
||
'context': {'search_default_group_account': 0},
|
||
}
|