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.
		
		
		
		
		
			
		
			
				
					
					
						
							722 lines
						
					
					
						
							38 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							722 lines
						
					
					
						
							38 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from datetime import datetime | |
| 
 | |
| from odoo import models, api, fields | |
| 
 | |
| FETCH_RANGE = 2000 | |
| import io | |
| import json | |
| 
 | |
| try: | |
|     from odoo.tools.misc import xlsxwriter | |
| except ImportError: | |
|     import xlsxwriter | |
| year = datetime.now().year | |
| 
 | |
| 
 | |
| class AccountCasgFlow(models.TransientModel): | |
|     _name = "account.cash.flow" | |
|     _inherit = "account.report" | |
| 
 | |
|     date_from = fields.Date(string="Start Date", default=str(year) + '-01-01') | |
|     date_to = fields.Date(string="End Date", default=fields.Date.today) | |
|     today = fields.Date(string="Report Date", default=fields.Date.today) | |
|     levels = fields.Selection([('summary', 'Summary'), | |
|                                ('consolidated', 'Consolidated'), | |
|                                ('detailed', 'Detailed'), | |
|                                ('very', 'Very Detailed')], | |
|                               string='Levels', required=True, default='summary', | |
|                               help='Different levels for cash flow statements \n' | |
|                                    'Summary: Month wise report.\n' | |
|                                    'Consolidated: Based on account types.\n' | |
|                                    'Detailed: Based on accounts.\n' | |
|                                    'Very Detailed: Accounts with their move lines') | |
|     account_ids = fields.Many2many("account.account", | |
|                                    string="Accounts") | |
| 
 | |
|     @api.model | |
|     def view_report(self, option): | |
|         r = self.env['account.cash.flow'].search([('id', '=', option[0])]) | |
|         data = { | |
|             'model': self, | |
|             'journals': r.journal_ids, | |
|             'target_move': r.target_move, | |
|             'levels': r.levels, | |
|         } | |
|         if r.date_from: | |
|             data.update({ | |
|                 'date_from': r.date_from, | |
|             }) | |
|         if r.date_to: | |
|             data.update({ | |
|                 'date_to': r.date_to, | |
|             }) | |
|         filters = self.get_filter(option) | |
|         report_lines = self._get_report_values(data, option) | |
|         fetched_data = report_lines['fetched_data'] | |
|         fetched = report_lines['fetched'] | |
|         account_res = report_lines['account_res'] | |
|         journal_res = report_lines['journal_res'] | |
|         levels = report_lines['levels'] | |
|         currency = self._get_currency() | |
|         user = self.env.user | |
|         user_language = user.lang | |
|         for data in fetched_data: | |
|             if filters['levels'] != 'summary': | |
|                 language_name = data.get('name') | |
|                 if isinstance(language_name, dict): | |
|                     data['account'] = language_name[ | |
|                         user_language] if user_language in language_name else \ | |
|                         language_name['en_US'] | |
|                 else: | |
|                     data['account'] = data.get('name') | |
|         for rec in journal_res: | |
|             for item in rec.get('journal_lines'): | |
|                 if isinstance(item['name'], dict): | |
|                     item['new_name'] = item['name'][ | |
|                         user_language] if user_language in item['name'] else \ | |
|                         item['name']['en_US'] | |
|                 else: | |
|                     item['new_name']  = data.get('name') | |
|         return { | |
|             'name': "Cash Flow Statements", | |
|             'type': 'ir.actions.client', | |
|             'tag': 'c_f', | |
|             'report_lines': report_lines, | |
|             'fetched_data': fetched_data, | |
|             'fetched': fetched, | |
|             'account_res': account_res, | |
|             'journal_res': journal_res, | |
|             'levels': r.levels, | |
|             'filters': filters, | |
|             'currency': currency, | |
|         } | |
| 
 | |
|     def get_filter(self, option): | |
|         data = self.get_filter_data(option) | |
|         filters = {} | |
|         if data.get('journal_ids'): | |
|             filters['journals'] = self.env['account.journal'].browse( | |
|                 data.get('journal_ids')).mapped('code') | |
|         else: | |
|             filters['journals'] = ['All'] | |
|         if data.get('account_ids', []): | |
|             filters['accounts'] = self.env['account.account'].browse( | |
|                 data.get('account_ids', [])).mapped('code') | |
|         else: | |
|             filters['accounts'] = ['All'] | |
|         if data.get('target_move'): | |
|             filters['target_move'] = data.get('target_move') | |
|         if data.get('date_from'): | |
|             filters['date_from'] = data.get('date_from') | |
|         if data.get('date_to'): | |
|             filters['date_to'] = data.get('date_to') | |
|         if data.get('levels'): | |
|             filters['levels'] = data.get('levels') | |
|         filters['company_id'] = '' | |
|         filters['accounts_list'] = data.get('accounts_list') | |
|         filters['journals_list'] = data.get('journals_list') | |
|         filters['company_name'] = data.get('company_name') | |
|         filters['target_move'] = data.get('target_move').capitalize() | |
|         return filters | |
| 
 | |
|     def get_filter_data(self, option): | |
|         r = self.env['account.cash.flow'].search([('id', '=', option[0])]) | |
|         default_filters = {} | |
|         company_id = self.env.companies | |
|         company_domain = [('company_id', 'in', company_id.ids)] | |
|         journals = r.journal_ids if r.journal_ids else ( | |
|             self.env[('account.journal')].search(company_domain)) | |
|         accounts = self.account_ids if self.account_ids else ( | |
|             self.env['account.account'].search(company_domain)) | |
|         filter_dict = { | |
|             'journal_ids': r.journal_ids.ids, | |
|             'account_ids': self.account_ids.ids, | |
|             'company_id': company_id.ids, | |
|             'date_from': r.date_from, | |
|             'date_to': r.date_to, | |
|             'levels': r.levels, | |
|             'target_move': r.target_move, | |
|             'journals_list': [(j.id, j.name, j.code) for j in journals], | |
|             'accounts_list': [(a.id, a.name) for a in accounts], | |
|             'company_name': ', '.join(self.env.companies.mapped('name')), | |
|         } | |
|         filter_dict.update(default_filters) | |
|         return filter_dict | |
| 
 | |
|     def _get_report_values(self, data, option): | |
|         cr = self.env.cr | |
|         data = self.get_filter(option) | |
|         company_id = self.env.company | |
|         currency = company_id.currency_id | |
|         symbol = company_id.currency_id.symbol | |
|         rounding = company_id.currency_id.rounding | |
|         position = company_id.currency_id.position | |
|         fetched_data = [] | |
|         account_res = [] | |
|         journal_res = [] | |
|         fetched = [] | |
|         account_type_id = 'asset_cash' | |
|         model = self.env.context.get('active_model') | |
|         if data.get('levels') == 'summary': | |
|             state = """ AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else '' | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             query3 = """SELECT to_char(am.date, 'Month') as month_part,  | |
|                      extract(YEAR from am.date) as year_part, | |
|                      sum(aml.debit) AS total_debit, sum(aml.credit) AS  | |
|                      total_credit, | |
|                      sum(aml.balance) AS total_balance FROM (SELECT am.date,  | |
|                      am.id, am.state FROM account_move as am | |
|                      LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                      LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                      WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am   | |
|                                  LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                  LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                  GROUP BY month_part,year_part""" | |
|             cr = self._cr | |
|             cr.execute(query3) | |
|             fetched_data = cr.dictfetchall() | |
|         elif data.get('date_from') is False: | |
|             account_type_id = 'asset_cash' | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
| 
 | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             sql = """SELECT DISTINCT aa.id, aa.name,aa.code, sum(aml.debit) AS total_debit, | |
|                                                 sum(aml.credit) AS total_credit,sum(aml.balance) AS total_balance | |
|                                                  FROM (SELECT am.* FROM account_move as am | |
|                                                 LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                 LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                 WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                                                     LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                                     LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                                     GROUP BY aa.name, aa.code,aa.id""" | |
|             cr = self._cr | |
|             cr.execute(sql) | |
|             fetched_data = cr.dictfetchall() | |
|         elif data.get('date_from') is False and data.get('date_from') != False: | |
|             account_type_id = 'asset_cash' | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
| 
 | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             sql = """SELECT DISTINCT aa.id, aa.name,aa.code, sum(aml.debit) AS total_debit, | |
|                                                            sum(aml.credit) AS total_credit,sum(aml.balance) AS total_balance | |
|                                                             FROM (SELECT am.* FROM account_move as am | |
|                                                            LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                            LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                            WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                                                                LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                                                LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                                                GROUP BY aa.name, aa.code,aa.id""" | |
|             cr = self._cr | |
|             cr.execute(sql) | |
|             fetched_data = cr.dictfetchall() | |
|         elif data.get('date_from') is False and data.get('date_from') != False: | |
|             account_type_id = 'asset_cash' | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
| 
 | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             sql = """SELECT DISTINCT aa.id, aa.name,aa.code, sum(aml.debit) AS total_debit, | |
|                                                            sum(aml.credit) AS total_credit,sum(aml.balance) AS total_balance | |
|                                                             FROM (SELECT am.* FROM account_move as am | |
|                                                            LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                            LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                            WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                                                                LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                                                LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                                                GROUP BY aa.name, aa.code,aa.id""" | |
|             cr = self._cr | |
|             cr.execute(sql) | |
|             fetched_data = cr.dictfetchall() | |
| 
 | |
|         elif data.get('date_to') == " ": | |
|             account_type_id = 'asset_cash' | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
| 
 | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             sql = """SELECT DISTINCT aa.id, aa.name,aa.code, sum(aml.debit) AS total_debit, | |
|                                                 sum(aml.credit) AS total_credit,sum(aml.balance) AS total_balance | |
|                                                  FROM (SELECT am.* FROM account_move as am | |
|                                                 LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                 LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                 WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                                                     LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                                     LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                                     GROUP BY aa.name, aa.code,aa.id""" | |
|             cr = self._cr | |
|             cr.execute(sql) | |
|             fetched_data = cr.dictfetchall() | |
| 
 | |
|         elif data.get('levels') == 'consolidated': | |
|             state = """ AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else '' | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             query2 = """SELECT aa.name, sum(aml.debit) AS total_debit, sum(aml.credit) AS total_credit, | |
|                          sum(aml.balance) AS total_balance FROM (  SELECT am.id, am.state FROM account_move as am | |
|                          LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                          LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                          WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                      LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                      LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                      GROUP BY aa.name""" | |
|             cr = self._cr | |
|             cr.execute(query2) | |
|             fetched_data = cr.dictfetchall() | |
|         elif data.get('levels') == 'detailed': | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             query1 = """SELECT aa.id,aa.name,aa.code, sum(aml.debit) AS total_debit, sum(aml.credit) AS total_credit, | |
|                          sum(aml.balance) AS total_balance FROM (SELECT am.id, am.state FROM account_move as am | |
|                          LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                          LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                          WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                      LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                      LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                      GROUP BY aa.name, aa.code, aa.id""" | |
|             cr = self._cr | |
|             cr.execute(query1) | |
|             fetched_data = cr.dictfetchall() | |
|             for account in self.env['account.account'].search([]): | |
|                 child_lines = self.get_journal_lines(account, data) | |
|                 if child_lines: | |
|                     journal_res.append(child_lines) | |
| 
 | |
|         else: | |
|             account_type_id = 'asset_cash' | |
|             state = """AND am.state = 'posted' """ if data.get( | |
|                 'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
|             state2 = ' AND aml.company_id IN %s' % str( | |
|                 tuple(self.env.companies.ids) + tuple([0])) | |
|             # filter = " AND aml.parent_state in ('draft','posted')" | |
|             sql = """SELECT DISTINCT aa.id, aa.name,aa.code, sum(aml.debit) AS total_debit, | |
|                                              sum(aml.credit) AS total_credit,sum(aml.balance) AS total_balance | |
|                                               FROM (SELECT am.* FROM account_move as am | |
|                                              LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                              LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                              WHERE am.date BETWEEN '""" + str( | |
|                 data.get('date_from')) + """' and '""" + str( | |
|                 data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|                 account_type_id) + """' """ + state + state2 + """) am | |
|                                                                  LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                                  LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                                  GROUP BY aa.name, aa.code,aa.id""" | |
|             cr = self._cr | |
|             cr.execute(sql) | |
|             fetched_data = cr.dictfetchall() | |
|             for account in self.env['account.account'].search([]): | |
|                 child_lines = self._get_lines(account, data) | |
|                 if child_lines: | |
|                     account_res.append(child_lines) | |
|                 journals = self.get_journal_lines(account, data) | |
|                 if journals: | |
|                     journal_res.append(journals) | |
|         return { | |
|             'date_from': data.get('date_from'), | |
|             'date_to': data.get('date_to'), | |
|             'levels': data.get('level'), | |
|             'doc_ids': self.ids, | |
|             'doc_model': model, | |
|             'fetched_data': fetched_data, | |
|             'account_res': account_res, | |
|             'journal_res': journal_res, | |
|             'fetched': fetched, | |
|             'company_currency_id': currency, | |
|             'company_currency_symbol': symbol, | |
|             'company_currency_position': position, | |
|         } | |
| 
 | |
|     def _get_lines(self, account, data): | |
|         account_type_id = 'asset_cash' | |
|         state = """AND am.state = 'posted' """ if data.get( | |
|             'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
|         state2 = ' AND aml.company_id IN %s' % str( | |
|             tuple(self.env.companies.ids) + tuple([0])) | |
|         query = """SELECT aml.account_id,aj.id as j_id,aj.name,am.id, am.name as move_name, sum(aml.debit) AS total_debit,  | |
|                     sum(aml.credit) AS total_credit, COALESCE(SUM(aml.debit - aml.credit),0) AS balance FROM (SELECT am.* FROM account_move as am | |
|                     LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                     LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                     WHERE am.date BETWEEN '""" + str( | |
|             data.get('date_from')) + """' and '""" + str( | |
|             data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|             account_type_id) + """' """ + state + state2 + """) am | |
|                                         LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                         LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                         LEFT JOIN account_journal aj ON aj.id = am.journal_id | |
|                                         WHERE aa.id = """ + str(account.id) + """ | |
|                                         GROUP BY am.name, aml.account_id, aj.id, aj.name, am.id""" | |
| 
 | |
|         cr = self._cr | |
|         cr.execute(query) | |
|         fetched_data = cr.dictfetchall() | |
| 
 | |
|         sql2 = """SELECT aa.name as account_name,aa.id as account_id, aj.id, aj.name, sum(aml.debit) AS total_debit, | |
|                         sum(aml.credit) AS total_credit, sum(aml.balance) AS total_balance FROM (SELECT am.* FROM account_move as am | |
|                             LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                             LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                             WHERE am.date BETWEEN '""" + str( | |
|             data.get('date_from')) + """' and '""" + str( | |
|             data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|             account_type_id) + """' """ + state + state2 + """) am | |
|                                                 LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                                 LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                                 LEFT JOIN account_journal aj ON aj.id = am.journal_id | |
|                                                 WHERE aa.id = """ + str( | |
|             account.id) + """ | |
|                                                 GROUP BY aa.name, aj.name, aj.id,aa.id""" | |
| 
 | |
|         cr = self._cr | |
|         cr.execute(sql2) | |
|         fetch_data = cr.dictfetchall() | |
|         if fetched_data: | |
|             return { | |
|                 'account': account.name, | |
|                 'id': account.id, | |
|                 'code': account.code, | |
|                 'move_lines': fetched_data, | |
|                 'journal_lines': fetch_data, | |
|             } | |
| 
 | |
|     def get_journal_lines(self, account, data, offset=0, | |
|                           fetch_range=FETCH_RANGE): | |
|         account_type_id = 'asset_cash' | |
|         offset_count = offset * fetch_range | |
|         state = """AND am.state = 'posted' """ if data.get( | |
|             'target_move') == 'Posted' else """AND am.state in ('draft','posted') """ | |
|         state2 = ' AND aml.company_id IN %s' % str( | |
|             tuple(self.env.companies.ids) + tuple([0])) | |
|         sql2 = """SELECT aa.name as account_name, aj.name, sum(aml.debit) AS total_debit, | |
|          sum(aml.credit) AS total_credit, COALESCE(SUM(aml.debit - aml.credit),0) AS balance FROM (SELECT am.* FROM account_move as am | |
|              LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|              LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|              WHERE am.date BETWEEN '""" + str( | |
|             data.get('date_from')) + """' and '""" + str( | |
|             data.get('date_to')) + """' AND aa.account_type='""" + str( | |
|             account_type_id) + """' """ + state + state2 + """) am | |
|                                  LEFT JOIN account_move_line aml ON aml.move_id = am.id | |
|                                  LEFT JOIN account_account aa ON aa.id = aml.account_id | |
|                                  LEFT JOIN account_journal aj ON aj.id = am.journal_id | |
|                                  WHERE aa.id = """ + str(account.id) + """ | |
|                                  GROUP BY aa.name, aj.name""" | |
| 
 | |
|         cr = self._cr | |
|         cr.execute(sql2) | |
|         fetched_data = cr.dictfetchall() | |
|         if fetched_data: | |
|             return { | |
|                 'account': account.name, | |
|                 'id': account.id, | |
|                 'journal_lines': fetched_data, | |
|                 'offset': offset_count, | |
|             } | |
| 
 | |
|     @api.model | |
|     def create(self, vals): | |
|         vals['target_move'] = 'posted' | |
|         vals['name'] = 'yy' | |
|         res = super(AccountCasgFlow, self).create(vals) | |
|         return res | |
| 
 | |
|     def write(self, vals): | |
|         if vals.get('target_move'): | |
|             vals.update({'target_move': vals.get('target_move').lower()}) | |
|         if vals.get('journal_ids'): | |
|             vals.update({'journal_ids': [(6, 0, vals.get('journal_ids'))]}) | |
|         if vals.get('journal_ids') == []: | |
|             vals.update({'journal_ids': [(5,)]}) | |
|         if vals.get('account_ids'): | |
|             vals.update( | |
|                 {'account_ids': [(4, j) for j in vals.get('account_ids')]}) | |
|         if vals.get('account_ids') == []: | |
|             vals.update({'account_ids': [(5,)]}) | |
| 
 | |
|         res = super(AccountCasgFlow, self).write(vals) | |
|         return res | |
| 
 | |
|     @api.model | |
|     def _get_currency(self): | |
|         journal = self.env['account.journal'].browse( | |
|             self.env.context.get('default_journal_id', False)) | |
|         if journal.currency_id: | |
|             return journal.currency_id.id | |
|         lang = self.env.user.lang | |
|         if not lang: | |
|             lang = 'en_US' | |
|         lang = lang.replace("_", '-') | |
|         currency_array = [self.env.company.currency_id.symbol, | |
|                           self.env.company.currency_id.position, lang] | |
|         return currency_array | |
| 
 | |
|     def get_dynamic_xlsx_report(self, data, response, report_data, dfr_data): | |
|         user = self.env.user | |
|         user_language = user.lang | |
|         report_main_data = json.loads(dfr_data) | |
|         data = json.loads(data) | |
|         report_data = report_main_data.get('report_lines') | |
|         output = io.BytesIO() | |
|         workbook = xlsxwriter.Workbook(output, {'in_memory': True}) | |
|         fetched_data = report_data.get('fetched_data') | |
|         account_res = report_data.get('account_res') | |
|         journal_res = report_data.get('journal_res') | |
|         fetched = report_data.get('fetched') | |
|         # account_type_id = self.env.ref('account.data_account_type_liquidity').id | |
|         currency_symbol = self.env.company.currency_id.symbol | |
| 
 | |
|         logged_users = self.env['res.company']._company_default_get( | |
|             'account.account') | |
|         sheet = workbook.add_worksheet() | |
|         bold = workbook.add_format({'align': 'center', | |
|                                     'bold': True, | |
|                                     'font_size': '10px', | |
|                                     'border': 1}) | |
|         date = workbook.add_format({'font_size': '10px'}) | |
|         cell_format = workbook.add_format({'bold': True, | |
|                                            'font_size': '10px'}) | |
|         head = workbook.add_format({'align': 'center', | |
|                                     'bold': True, | |
|                                     'bg_color': '#D3D3D3', | |
|                                     'font_size': '15px'}) | |
|         txt = workbook.add_format({'align': 'left', | |
|                                    'font_size': '10px'}) | |
|         txt_left = workbook.add_format({'align': 'left', | |
|                                         'font_size': '10px', | |
|                                         'border': 1}) | |
|         txt_center = workbook.add_format({'align': 'center', | |
|                                           'font_size': '10px', | |
|                                           'border': 1}) | |
|         amount = workbook.add_format({'align': 'right', | |
|                                       'font_size': '10px', | |
|                                       'border': 1}) | |
|         amount_bold = workbook.add_format({'align': 'right', | |
|                                            'bold': True, | |
|                                            'font_size': '10px', | |
|                                            'border': 1}) | |
|         txt_bold = workbook.add_format({'align': 'left', | |
|                                         'bold': True, | |
|                                         'font_size': '10px', | |
|                                         'border': 1}) | |
| 
 | |
|         sheet.set_column('C:C', 30, cell_format) | |
|         sheet.set_column('D:E', 20, cell_format) | |
|         sheet.set_column('F:F', 20, cell_format) | |
|         sheet.merge_range('C3:F5', '') | |
|         sheet.merge_range('C3:F4', 'CASH FLOW STATEMENTS', head) | |
|         sheet.merge_range('C4:F4', '') | |
| 
 | |
|         sheet.write('C6', "Date From", cell_format) | |
|         sheet.write('D6', str(data['date_from']), date) | |
|         sheet.write('E6', "Date To", cell_format) | |
|         sheet.write('F6', str(data['date_to']), date) | |
|         if data.get('levels'): | |
|             sheet.write('C7', "Level", cell_format) | |
|             sheet.write('D7', data.get("levels"), date) | |
|         sheet.write('E7', "Target Moves", cell_format) | |
|         sheet.write('F7', data.get("target_move"), date) | |
|         sheet.write('C9', 'NAME', bold) | |
|         sheet.write('D9', 'CASH IN', bold) | |
|         sheet.write('E9', 'CASH OUT', bold) | |
|         sheet.write('F9', 'BALANCE', bold) | |
| 
 | |
|         row_num = 9 | |
|         col_num = 2 | |
|         fetched_data_list = fetched_data | |
|         account_res_list = account_res | |
|         journal_res_list = journal_res | |
|         fetched_list = fetched | |
| 
 | |
|         for i_rec in fetched_data_list: | |
|             if data['levels'] == 'summary': | |
|                 sheet.write(row_num + 1, col_num, | |
|                             str(i_rec['month_part']) + str( | |
|                                 int(i_rec['year_part'])), txt_left) | |
|                 sheet.write(row_num + 1, col_num + 1, | |
|                             str(i_rec['total_debit']) + str(currency_symbol), | |
|                             amount) | |
|                 sheet.write(row_num + 1, col_num + 2, | |
|                             str(i_rec['total_credit']) + str(currency_symbol), | |
|                             amount) | |
|                 sheet.write(row_num + 1, col_num + 3, | |
|                             str(i_rec['total_debit'] - i_rec[ | |
|                                 'total_credit']) + str(currency_symbol), | |
|                             amount) | |
|                 row_num = row_num + 1 | |
|             elif data['levels'] == 'consolidated': | |
|                 langs = i_rec['name'] | |
|                 if isinstance(langs, dict): | |
|                      language = user_language if user_language in langs else 'en_US' | |
|                      sheet.write(row_num + 1, col_num, i_rec['name'][language], | |
|                                  txt_left) | |
|                 else: | |
|                     sheet.write(row_num + 1, col_num, i_rec['name'], | |
|                                 txt_left) | |
|                 sheet.write(row_num + 1, col_num + 1, | |
|                             str(i_rec['total_debit']) + str(currency_symbol), | |
|                             amount) | |
|                 sheet.write(row_num + 1, col_num + 2, | |
|                             str(i_rec['total_credit']) + str(currency_symbol), | |
|                             amount) | |
|                 sheet.write(row_num + 1, col_num + 3, | |
|                             str(i_rec['total_debit'] - i_rec[ | |
|                                 'total_credit']) + str(currency_symbol), | |
|                             amount) | |
|                 row_num = row_num + 1 | |
| 
 | |
|         for j_rec in journal_res_list: | |
|             if data['levels'] == 'detailed': | |
|                 for k in fetched_data_list: | |
|                     language_two = user_language if user_language in k[ | |
|                         'name'] else 'en_US' | |
|                     if k['id'] == j_rec['id']: | |
|                         if isinstance(k['name'], dict): | |
|                             sheet.write(row_num + 1, col_num, | |
|                                         str(k['code']) + str( | |
|                                             k['name'][language_two]), txt_bold) | |
|                         else: | |
|                             sheet.write(row_num + 1, col_num, | |
|                                         str(k['code']) + str( | |
|                                             k['name']), txt_bold) | |
|                         sheet.write(row_num + 1, col_num + 1, | |
|                                     str(k['total_debit']) + str( | |
|                                         currency_symbol), amount_bold) | |
|                         sheet.write(row_num + 1, col_num + 2, | |
|                                     str(k['total_credit']) + str( | |
|                                         currency_symbol), amount_bold) | |
|                         sheet.write(row_num + 1, col_num + 3, | |
|                                     str(k['total_debit'] - k[ | |
|                                         'total_credit']) + str(currency_symbol), | |
|                                     amount_bold) | |
|                         row_num = row_num + 1 | |
|                 for l_jrec in j_rec['journal_lines']: | |
|                     language_one = user_language if user_language in l_jrec[ | |
|                         'name'] else 'en_US' | |
|                     if isinstance(l_jrec['name'], dict): | |
|                         sheet.write(row_num + 1, col_num, | |
|                                         l_jrec['name'][language_one], txt_left) | |
|                     else: | |
|                         sheet.write(row_num + 1, col_num, | |
|                                     l_jrec['name'], txt_left) | |
|                     sheet.write(row_num + 1, col_num + 1, | |
|                                 str(l_jrec['total_debit']) + str( | |
|                                     currency_symbol), amount) | |
|                     sheet.write(row_num + 1, col_num + 2, | |
|                                 str(l_jrec['total_credit']) + str( | |
|                                     currency_symbol), amount) | |
|                     sheet.write(row_num + 1, col_num + 3, | |
|                                 str(l_jrec['total_debit'] - l_jrec[ | |
|                                     'total_credit']) + str(currency_symbol), | |
|                                 amount) | |
|                     row_num = row_num + 1 | |
| 
 | |
|         for j_rec in account_res_list: | |
|             if data['levels'] == 'very': | |
|                 for k in fetched_data_list: | |
|                     if k['id'] == j_rec['id']: | |
|                         all_lang = k['name'] | |
|                         language_four = user_language if user_language in all_lang else 'en_US' | |
|                         if isinstance(all_lang, dict): | |
|                             sheet.write(row_num + 1, col_num, | |
|                                         str(k['code']) + str( | |
|                                             k['name'][language_four]), txt_bold) | |
|                         else: | |
|                             sheet.write(row_num + 1, col_num, | |
|                                         str(k['code']) + str( | |
|                                             k['name']), txt_bold) | |
|                         sheet.write(row_num + 1, col_num + 1, | |
|                                     str(k['total_debit']) + str( | |
|                                         currency_symbol), amount_bold) | |
|                         sheet.write(row_num + 1, col_num + 2, | |
|                                     str(k['total_credit']) + str( | |
|                                         currency_symbol), amount_bold) | |
|                         sheet.write(row_num + 1, col_num + 3, | |
|                                     str(k['total_debit'] - k[ | |
|                                         'total_credit']) + str(currency_symbol), | |
|                                     amount_bold) | |
|                         row_num = row_num + 1 | |
|                 for l_jrec in j_rec['journal_lines']: | |
|                     if l_jrec['account_name'] == j_rec['account']: | |
|                         sheet.write(row_num + 1, col_num, l_jrec['name'], | |
|                                     txt_left) | |
|                         sheet.write(row_num + 1, col_num + 1, | |
|                                     str(l_jrec['total_debit']) + str( | |
|                                         currency_symbol), amount) | |
|                         sheet.write(row_num + 1, col_num + 2, | |
|                                     str(l_jrec['total_credit']) + str( | |
|                                         currency_symbol), amount) | |
|                         sheet.write(row_num + 1, col_num + 3, | |
|                                     str(l_jrec['total_debit'] - l_jrec[ | |
|                                         'total_credit']) + str(currency_symbol), | |
|                                     amount) | |
|                         row_num = row_num + 1 | |
|                     for m_rec in j_rec['move_lines']: | |
|                         if m_rec['name'] == l_jrec['name']: | |
|                             sheet.write(row_num + 1, col_num, | |
|                                         m_rec['move_name'], txt_center) | |
|                             sheet.write(row_num + 1, col_num + 1, | |
|                                         str(m_rec['total_debit']) + str( | |
|                                             currency_symbol), amount) | |
|                             sheet.write(row_num + 1, col_num + 2, | |
|                                         str(m_rec['total_credit']) + str( | |
|                                             currency_symbol), amount) | |
|                             sheet.write(row_num + 1, col_num + 3, | |
|                                         str(m_rec['total_debit'] - m_rec[ | |
|                                             'total_credit']) + str( | |
|                                             currency_symbol), | |
|                                         amount) | |
|                             row_num = row_num + 1 | |
| 
 | |
|         workbook.close() | |
|         output.seek(0) | |
|         response.stream.write(output.read()) | |
|         output.close()
 | |
| 
 |