You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

119 lines
5.0 KiB

# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Nikhil M (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
selection_field = {'posted': 'Posted Entries only',
'draft': 'Include UnPosted Entries'}
class TrialBalanceReport(models.TransientModel):
"""Create new model"""
_name = 'trial.balance.report'
_description = 'trial balance report'
start_date = fields.Date(string="Start Date",
help="Select start date to fetch the trial "
"balance data")
end_date = fields.Date(string="End Date",
help="Select end date to fetch the trial "
"balance data")
journals_ids = fields.Many2many('account.journal', string="Journals",
help="Select the journals to added in the"
"trail balance")
company_id = fields.Many2one('res.company', string="Company",
help="Select the company of the journals",
default=lambda self: self.env.company)
state = fields.Selection([
('posted', 'Posted Entries only'),
('draft', 'Include UnPosted Entries'),
], tracking=True, string="State", help="Select the state of journal "
"entries which we want to report")
def button_to_get_pdf(self):
"""It will create the report using defined query"""
where_conditions = []
parameters = []
state_value = ""
currency = self.env.user.company_id.currency_id.symbol
if self.start_date:
where_conditions.append("account_move_line.date >= %s")
parameters.append(self.start_date)
if self.end_date:
where_conditions.append("account_move_line.date <= %s")
parameters.append(self.end_date)
if self.company_id:
where_conditions.append("account_move_line.company_id = %s")
parameters.append(str(self.company_id.id))
if self.state == 'posted':
where_conditions.append("parent_state = 'posted'")
if self.state == 'draft':
where_conditions.append("parent_state in ('posted', 'draft')")
if self.journals_ids:
journal_ids = [journal.id for journal in self.journals_ids]
where_conditions.append("journal_id IN %s")
parameters.append(tuple(journal_ids))
where_query = " AND ".join(where_conditions)
query = """
SELECT
account_account.code AS code,
account_account.name AS ac_name,
SUM(account_move_line.debit) AS debit,
SUM(account_move_line.credit) AS credit,
SUM(account_move_line.debit) - SUM(account_move_line.credit) AS
balance
FROM
account_move_line
JOIN
account_account ON account_account.id =
account_move_line.account_id
{}
GROUP BY
account_id,
account_account.name,
account_account.code
""".format("WHERE " + where_query if where_conditions else "")
self.env.cr.execute(query, tuple(parameters))
main_query = self.env.cr.dictfetchall()
total_credit = 0.0
total_debit = 0.0
for rec in main_query:
total_credit += rec['credit']
total_debit += rec['debit']
balance = total_debit - total_credit
if self.state:
state_value = selection_field[self.state]
journals = str(self.journals_ids.mapped('name'))
result = journals[1:-1].replace("'", "")
data = {
'query': main_query,
'start_date': self.start_date,
'end_date': self.end_date,
'total_credit': round(total_credit, 2),
'total_debit': round(total_debit, 2),
'balance': round(balance),
'currency': currency,
'state': state_value,
'journals_name': result
}
return self.env.ref(
'trial_balance_pdf.action_report_trial_balance').report_action(
self, data=data)