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.
		
		
		
		
		
			
		
			
				
					
					
						
							760 lines
						
					
					
						
							41 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							760 lines
						
					
					
						
							41 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Ammu Raj (odoo@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/>. | |
| # | |
| ################################################################################ | |
| import calendar | |
| import io | |
| import json | |
| from datetime import datetime | |
| import xlsxwriter | |
| from odoo import models, fields, api | |
| from odoo.tools.date_utils import get_month, get_fiscal_year, \ | |
|     get_quarter_number, subtract | |
| 
 | |
| 
 | |
| class TaxReport(models.TransientModel): | |
|     """For creating Tax report.""" | |
|     _name = 'tax.report' | |
|     _description = 'Tax Report' | |
| 
 | |
|     @api.model | |
|     def view_report(self): | |
|         """ | |
|         View a tax report for the current month. This function retrieves | |
|         tax-related information for the current month. It calculates the net | |
|         amount and tax amount for both sales and purchases based on the tax | |
|         information associated with account move lines. | |
|             :return: Dictionary containing sale and purchase data for the | |
|                      current month. | |
|         """ | |
|         sale = [] | |
|         purchase = [] | |
|         tax_ids = self.env['account.move.line'].search([]).mapped( | |
|             'tax_ids') | |
|         today = fields.Date.today() | |
|         for tax in tax_ids: | |
|             tax_id = self.env['account.move.line'].search( | |
|                 [('tax_ids', '=', tax.id), ('parent_state', '=', 'posted'), | |
|                  ('date', '>=', get_month(today)[0]), | |
|                  ('date', '<=', get_month(today)[1])]).read( | |
|                 ['debit', 'credit']) | |
|             tax_debit_sums = sum(record['debit'] for record in tax_id) | |
|             tax_credit_sums = sum(record['credit'] for record in tax_id) | |
|             if tax.type_tax_use == 'sale': | |
|                 sale.append({ | |
|                     'name': tax.name, | |
|                     'amount': tax.amount, | |
|                     'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                     'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                             tax.amount / 100), 2) | |
|                 }) | |
|             elif tax.type_tax_use == 'purchase': | |
|                 purchase.append({ | |
|                     'name': tax.name, | |
|                     'amount': tax.amount, | |
|                     'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                     'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                             tax.amount / 100), 2) | |
|                 }) | |
|         return { | |
|             'sale': sale, | |
|             'purchase': purchase | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_filter_values(self, start_date, end_date, comparison_number, | |
|                           comparison_type, options, report_type): | |
|         """ | |
|            Get filtered tax values based on various criteria. | |
|  | |
|            :param start_date: Start date of the filter period. | |
|            :param end_date: End date of the filter period. | |
|            :param comparison_number: Number of comparison periods. | |
|            :param comparison_type: Type of comparison (year, month, quarter). | |
|            :param options: Filter options. | |
|            :param report_type: Type of report (account, tax). | |
|            :return: Dictionary containing dynamic_date_num, sale, and purchase | |
|                     data. | |
|            """ | |
|         sale = [] | |
|         purchase = [] | |
|         dynamic_date_num = {} | |
|         if options == {}: | |
|             options = None | |
|         if options is None: | |
|             option_domain = ['posted'] | |
|         elif 'draft' in options: | |
|             option_domain = ['posted', 'draft'] | |
|         tax_ids = self.env['account.move.line'].search([]).mapped( | |
|             'tax_ids') | |
|         start_date_first = \ | |
|             get_fiscal_year(datetime.strptime(start_date, "%Y-%m-%d").date())[ | |
|                 0] if comparison_type == 'year' else datetime.strptime( | |
|                 start_date, "%Y-%m-%d").date() | |
|         end_date_first = \ | |
|             get_fiscal_year(datetime.strptime(end_date, "%Y-%m-%d").date())[ | |
|                 1] if comparison_type == 'year' else datetime.strptime( | |
|                 end_date, "%Y-%m-%d").date() | |
|         if report_type is not None and 'account' in report_type: | |
|             start_date = start_date_first | |
|             end_date = end_date_first | |
|             account_ids = self.env['account.move.line'].search([]).mapped( | |
|                 'account_id') | |
|             for account in account_ids: | |
|                 tax_ids = self.env['account.move.line'].search( | |
|                     [('account_id', '=', account.id)]).mapped('tax_ids') | |
|                 if tax_ids: | |
|                     for tax in tax_ids: | |
|                         dynamic_total_tax_sum = {} | |
|                         dynamic_total_net_sum = {} | |
|                         if comparison_number: | |
|                             if comparison_type == 'year': | |
|                                 start_date = start_date_first | |
|                                 end_date = end_date_first | |
|                                 for i in range(1, eval(comparison_number) + 1): | |
|                                     com_start_date = subtract(start_date, | |
|                                                               years=i) | |
|                                     com_end_date = subtract(end_date, years=i) | |
|                                     tax_id = self.env[ | |
|                                         'account.move.line'].search( | |
|                                         [('tax_ids', '=', tax.id), | |
|                                          ('date', '>=', com_start_date), | |
|                                          ('date', '<=', com_end_date), | |
|                                          ('account_id', '=', account.id), | |
|                                          ('parent_state', 'in', | |
|                                           option_domain)]).read( | |
|                                         ['debit', 'credit']) | |
|                                     tax_debit_sums = sum( | |
|                                         record['debit'] for record in tax_id) | |
|                                     tax_credit_sums = sum( | |
|                                         record['credit'] for record in tax_id) | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                     dynamic_total_tax_sum[ | |
|                                         f"dynamic_total_tax_sum{i}"] = \ | |
|                                         dynamic_total_net_sum[ | |
|                                             f"dynamic_total_net_sum{i}"] * ( | |
|                                                 tax.amount / 100) | |
|                             elif comparison_type == 'month': | |
|                                 dynamic_date_num[ | |
|                                     f"dynamic_date_num{0}"] = self.get_month_name( | |
|                                     start_date) + ' ' + str(start_date.year) | |
|                                 for i in range(1, eval(comparison_number) + 1): | |
|                                     com_start_date = subtract(start_date, | |
|                                                               months=i) | |
|                                     com_end_date = subtract(end_date, months=i) | |
|                                     tax_id = self.env[ | |
|                                         'account.move.line'].search( | |
|                                         [('tax_ids', '=', tax.id), | |
|                                          ('date', '>=', com_start_date), | |
|                                          ('account_id', '=', account.id), | |
|                                          ('date', '<=', com_end_date), | |
|                                          ('parent_state', 'in', | |
|                                           option_domain)]).read( | |
|                                         ['debit', 'credit']) | |
|                                     tax_debit_sums = sum( | |
|                                         record['debit'] for record in tax_id) | |
|                                     tax_credit_sums = sum( | |
|                                         record['credit'] for record in tax_id) | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                     dynamic_total_tax_sum[ | |
|                                         f"dynamic_total_tax_sum{i}"] = \ | |
|                                         dynamic_total_net_sum[ | |
|                                             f"dynamic_total_net_sum{i}"] * ( | |
|                                                 tax.amount / 100) | |
|                                     dynamic_date_num[ | |
|                                         f"dynamic_date_num{i}"] = self.get_month_name( | |
|                                         com_start_date) + ' ' + str( | |
|                                         com_start_date.year) | |
|                             elif comparison_type == 'quarter': | |
|                                 dynamic_date_num[ | |
|                                     f"dynamic_date_num{0}"] = 'Q' + ' ' + str( | |
|                                     get_quarter_number( | |
|                                         start_date)) + ' ' + str( | |
|                                     start_date.year) | |
|                                 for i in range(1, eval(comparison_number) + 1): | |
|                                     com_start_date = subtract(start_date, | |
|                                                               months=i * 3) | |
|                                     com_end_date = subtract(end_date, | |
|                                                             months=i * 3) | |
|                                     tax_id = self.env[ | |
|                                         'account.move.line'].search( | |
|                                         [('tax_ids', '=', tax.id), | |
|                                          ('date', '>=', com_start_date), | |
|                                          ('account_id', '=', account.id), | |
|                                          ('date', '<=', com_end_date), | |
|                                          ('parent_state', 'in', | |
|                                           option_domain)]).read( | |
|                                         ['debit', 'credit']) | |
|                                     tax_debit_sums = sum( | |
|                                         record['debit'] for record in tax_id) | |
|                                     tax_credit_sums = sum( | |
|                                         record['credit'] for record in tax_id) | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                     dynamic_total_tax_sum[ | |
|                                         f"dynamic_total_tax_sum{i}"] = \ | |
|                                         dynamic_total_net_sum[ | |
|                                             f"dynamic_total_net_sum{i}"] * ( | |
|                                                 tax.amount / 100) | |
|                                     dynamic_date_num[ | |
|                                         f"dynamic_date_num{i}"] = 'Q' + ' ' + str( | |
|                                         get_quarter_number( | |
|                                             com_start_date)) + ' ' + str( | |
|                                         com_start_date.year) | |
|                         tax_id = self.env['account.move.line'].search( | |
|                             [('tax_ids', '=', tax.id), | |
|                              ('date', '>=', start_date_first), | |
|                              ('date', '<=', end_date_first), | |
|                              ('parent_state', 'in', option_domain), | |
|                              ('account_id', '=', account.id)]).read( | |
|                             ['debit', 'credit']) | |
|                         tax_debit_sums = sum( | |
|                             record['debit'] for record in tax_id) | |
|                         tax_credit_sums = sum( | |
|                             record['credit'] for record in tax_id) | |
|                         if tax_id and tax.type_tax_use == 'sale': | |
|                             if comparison_number: | |
|                                 sale.append({ | |
|                                     'name': tax.name, | |
|                                     'amount': tax.amount, | |
|                                     'net': round( | |
|                                         tax_debit_sums + tax_credit_sums, | |
|                                         2), | |
|                                     'tax': round( | |
|                                         (tax_debit_sums + tax_credit_sums) * ( | |
|                                                 tax.amount / 100), 2), | |
|                                     'dynamic net': dynamic_total_net_sum, | |
|                                     'dynamic tax': dynamic_total_tax_sum, | |
|                                     'account': account.display_name, | |
|                                 }) | |
|                             else: | |
|                                 sale.append({ | |
|                                     'name': tax.name, | |
|                                     'amount': tax.amount, | |
|                                     'net': round( | |
|                                         tax_debit_sums + tax_credit_sums, | |
|                                         2), | |
|                                     'tax': round( | |
|                                         (tax_debit_sums + tax_credit_sums) * ( | |
|                                                 tax.amount / 100), 2), | |
|                                     'account': account.display_name, | |
|                                 }) | |
|                         elif tax_id and tax.type_tax_use == 'purchase': | |
|                             if comparison_number: | |
|                                 purchase.append({ | |
|                                     'name': tax.name, | |
|                                     'amount': tax.amount, | |
|                                     'net': round( | |
|                                         tax_debit_sums + tax_credit_sums, | |
|                                         2), | |
|                                     'tax': round( | |
|                                         (tax_debit_sums + tax_credit_sums) * ( | |
|                                                 tax.amount / 100), 2), | |
|                                     'dynamic net': dynamic_total_net_sum, | |
|                                     'dynamic tax': dynamic_total_tax_sum, | |
|                                     'account': account.display_name, | |
|                                 }) | |
|                             else: | |
|                                 purchase.append({ | |
|                                     'name': tax.name, | |
|                                     'amount': tax.amount, | |
|                                     'net': round( | |
|                                         tax_debit_sums + tax_credit_sums, | |
|                                         2), | |
|                                     'tax': round( | |
|                                         (tax_debit_sums + tax_credit_sums) * ( | |
|                                                 tax.amount / 100), 2), | |
|                                     'account': account.display_name, | |
|                                 }) | |
|         elif report_type is not None and 'tax' in report_type: | |
|             start_date = start_date_first | |
|             end_date = end_date_first | |
|             for tax in tax_ids: | |
|                 account_ids = self.env['account.move.line'].search( | |
|                     [('tax_ids', '=', tax.id)]).mapped('account_id') | |
|                 for account in account_ids: | |
|                     dynamic_total_tax_sum = {} | |
|                     dynamic_total_net_sum = {} | |
|                     if comparison_number: | |
|                         if comparison_type == 'year': | |
|                             start_date = start_date_first | |
|                             end_date = end_date_first | |
|                             for i in range(1, eval(comparison_number) + 1): | |
|                                 com_start_date = subtract(start_date, | |
|                                                           years=i) | |
|                                 com_end_date = subtract(end_date, years=i) | |
|                                 tax_id = self.env[ | |
|                                     'account.move.line'].search( | |
|                                     [('tax_ids', '=', tax.id), | |
|                                      ('date', '>=', com_start_date), | |
|                                      ('date', '<=', com_end_date), | |
|                                      ('account_id', '=', account.id), | |
|                                      ('parent_state', 'in', | |
|                                       option_domain)]).read( | |
|                                     ['debit', 'credit']) | |
|                                 tax_debit_sums = sum( | |
|                                     record['debit'] for record in tax_id) | |
|                                 tax_credit_sums = sum( | |
|                                     record['credit'] for record in tax_id) | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                 dynamic_total_tax_sum[ | |
|                                     f"dynamic_total_tax_sum{i}"] = \ | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] * ( | |
|                                             tax.amount / 100) | |
|                         elif comparison_type == 'month': | |
|                             dynamic_date_num[ | |
|                                 f"dynamic_date_num{0}"] = self.get_month_name( | |
|                                 start_date) + ' ' + str(start_date.year) | |
|                             for i in range(1, eval(comparison_number) + 1): | |
|                                 com_start_date = subtract(start_date, months=i) | |
|                                 com_end_date = subtract(end_date, months=i) | |
|                                 tax_id = self.env[ | |
|                                     'account.move.line'].search( | |
|                                     [('tax_ids', '=', tax.id), | |
|                                      ('date', '>=', com_start_date), | |
|                                      ('date', '<=', com_end_date), | |
|                                      ('account_id', '=', account.id), | |
|                                      ('parent_state', 'in', | |
|                                       option_domain)]).read( | |
|                                     ['debit', 'credit']) | |
|                                 tax_debit_sums = sum( | |
|                                     record['debit'] for record in tax_id) | |
|                                 tax_credit_sums = sum( | |
|                                     record['credit'] for record in tax_id) | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                 dynamic_total_tax_sum[ | |
|                                     f"dynamic_total_tax_sum{i}"] = \ | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] * ( | |
|                                             tax.amount / 100) | |
|                                 dynamic_date_num[ | |
|                                     f"dynamic_date_num{i}"] = self.get_month_name( | |
|                                     com_start_date) + ' ' + str( | |
|                                     com_start_date.year) | |
|                         elif comparison_type == 'quarter': | |
|                             dynamic_date_num[ | |
|                                 f"dynamic_date_num{0}"] = 'Q' + ' ' + str( | |
|                                 get_quarter_number(start_date)) + ' ' + str( | |
|                                 start_date.year) | |
|                             for i in range(1, eval(comparison_number) + 1): | |
|                                 com_start_date = subtract(start_date, | |
|                                                           months=i * 3) | |
|                                 com_end_date = subtract(end_date, | |
|                                                         months=i * 3) | |
|                                 tax_id = self.env[ | |
|                                     'account.move.line'].search( | |
|                                     [('tax_ids', '=', tax.id), | |
|                                      ('date', '>=', com_start_date), | |
|                                      ('date', '<=', com_end_date), | |
|                                      ('account_id', '=', account.id), | |
|                                      ('parent_state', 'in', | |
|                                       option_domain)]).read( | |
|                                     ['debit', 'credit']) | |
|                                 tax_debit_sums = sum( | |
|                                     record['debit'] for record in tax_id) | |
|                                 tax_credit_sums = sum( | |
|                                     record['credit'] for record in tax_id) | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                                 dynamic_total_tax_sum[ | |
|                                     f"dynamic_total_tax_sum{i}"] = \ | |
|                                     dynamic_total_net_sum[ | |
|                                         f"dynamic_total_net_sum{i}"] * ( | |
|                                             tax.amount / 100) | |
|                                 dynamic_date_num[ | |
|                                     f"dynamic_date_num{i}"] = 'Q' + ' ' + str( | |
|                                     get_quarter_number( | |
|                                         com_start_date)) + ' ' + str( | |
|                                     com_start_date.year) | |
|                     tax_id = self.env['account.move.line'].search( | |
|                         [('tax_ids', '=', tax.id), | |
|                          ('parent_state', 'in', option_domain), | |
|                          ('date', '>=', start_date_first), | |
|                          ('date', '<=', end_date_first), | |
|                          ('account_id', '=', account.id)]).read( | |
|                         ['debit', 'credit']) | |
|                     tax_debit_sums = sum( | |
|                         record['debit'] for record in tax_id) | |
|                     tax_credit_sums = sum( | |
|                         record['credit'] for record in tax_id) | |
|                     if tax_id and tax.type_tax_use == 'sale': | |
|                         if comparison_number: | |
|                             sale.append({ | |
|                                 'name': tax.name, | |
|                                 'amount': tax.amount, | |
|                                 'net': round(tax_debit_sums + tax_credit_sums, | |
|                                              2), | |
|                                 'tax': round( | |
|                                     (tax_debit_sums + tax_credit_sums) * ( | |
|                                             tax.amount / 100), 2), | |
|                                 'dynamic net': dynamic_total_net_sum, | |
|                                 'dynamic tax': dynamic_total_tax_sum, | |
|                                 'account': account.display_name, | |
|                             }) | |
|                         else: | |
|                             sale.append({ | |
|                                 'name': tax.name, | |
|                                 'amount': tax.amount, | |
|                                 'net': round(tax_debit_sums + tax_credit_sums, | |
|                                              2), | |
|                                 'tax': round( | |
|                                     (tax_debit_sums + tax_credit_sums) * ( | |
|                                             tax.amount / 100), 2), | |
|                                 'account': account.display_name, | |
|                             }) | |
|                     elif tax_id and tax.type_tax_use == 'purchase': | |
|                         if comparison_number: | |
|                             purchase.append({ | |
|                                 'name': tax.name, | |
|                                 'amount': tax.amount, | |
|                                 'net': round(tax_debit_sums + tax_credit_sums, | |
|                                              2), | |
|                                 'tax': round( | |
|                                     (tax_debit_sums + tax_credit_sums) * ( | |
|                                             tax.amount / 100), 2), | |
|                                 'dynamic net': dynamic_total_net_sum, | |
|                                 'dynamic tax': dynamic_total_tax_sum, | |
|                                 'account': account.display_name, | |
|                             }) | |
|                         else: | |
|                             purchase.append({ | |
|                                 'name': tax.name, | |
|                                 'amount': tax.amount, | |
|                                 'net': round(tax_debit_sums + tax_credit_sums, | |
|                                              2), | |
|                                 'tax': round( | |
|                                     (tax_debit_sums + tax_credit_sums) * ( | |
|                                             tax.amount / 100), 2), | |
|                                 'account': account.display_name, | |
|                             }) | |
|         else: | |
|             start_date = start_date_first | |
|             end_date = end_date_first | |
|             for tax in tax_ids: | |
|                 dynamic_total_tax_sum = {} | |
|                 dynamic_total_net_sum = {} | |
|                 if comparison_number: | |
|                     if comparison_type == 'year': | |
|                         start_date = start_date_first | |
|                         end_date = end_date_first | |
|                         for i in range(1, eval(comparison_number) + 1): | |
|                             com_start_date = subtract(start_date, | |
|                                                       years=i) | |
|                             com_end_date = subtract(end_date, years=i) | |
|                             tax_id = self.env[ | |
|                                 'account.move.line'].search( | |
|                                 [('tax_ids', '=', tax.id), | |
|                                  ('date', '>=', com_start_date), | |
|                                  ('date', '<=', com_end_date), | |
|                                  ('parent_state', 'in', option_domain)]).read( | |
|                                 ['debit', 'credit']) | |
|                             tax_debit_sums = sum( | |
|                                 record['debit'] for record in tax_id) | |
|                             tax_credit_sums = sum( | |
|                                 record['credit'] for record in tax_id) | |
|                             dynamic_total_net_sum[ | |
|                                 f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                             dynamic_total_tax_sum[ | |
|                                 f"dynamic_total_tax_sum{i}"] = \ | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] * ( | |
|                                         tax.amount / 100) | |
|                     elif comparison_type == 'month': | |
|                         dynamic_date_num[ | |
|                             f"dynamic_date_num{0}"] = self.get_month_name( | |
|                             start_date) + ' ' + str(start_date.year) | |
|                         for i in range(1, eval(comparison_number) + 1): | |
|                             com_start_date = subtract(start_date, months=i) | |
|                             com_end_date = subtract(end_date, months=i) | |
|                             tax_id = self.env[ | |
|                                 'account.move.line'].search( | |
|                                 [('tax_ids', '=', tax.id), | |
|                                  ('date', '>=', com_start_date), | |
|                                  ('date', '<=', com_end_date), | |
|                                  ('parent_state', 'in', option_domain)]).read( | |
|                                 ['debit', 'credit']) | |
|                             tax_debit_sums = sum( | |
|                                 record['debit'] for record in tax_id) | |
|                             tax_credit_sums = sum( | |
|                                 record['credit'] for record in tax_id) | |
|                             dynamic_total_net_sum[ | |
|                                 f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                             dynamic_total_tax_sum[ | |
|                                 f"dynamic_total_tax_sum{i}"] = \ | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] * ( | |
|                                         tax.amount / 100) | |
|                             dynamic_date_num[ | |
|                                 f"dynamic_date_num{i}"] = self.get_month_name( | |
|                                 com_start_date) + ' ' + str( | |
|                                 com_start_date.year) | |
|                     elif comparison_type == 'quarter': | |
|                         dynamic_date_num[ | |
|                             f"dynamic_date_num{0}"] = 'Q' + ' ' + str( | |
|                             get_quarter_number(start_date)) + ' ' + str( | |
|                             start_date.year) | |
|                         for i in range(1, eval(comparison_number) + 1): | |
|                             com_start_date = subtract(start_date, | |
|                                                       months=i * 3) | |
|                             com_end_date = subtract(end_date, | |
|                                                     months=i * 3) | |
|                             tax_id = self.env[ | |
|                                 'account.move.line'].search( | |
|                                 [('tax_ids', '=', tax.id), | |
|                                  ('date', '>=', com_start_date), | |
|                                  ('date', '<=', com_end_date), | |
|                                  ('parent_state', 'in', option_domain)]).read( | |
|                                 ['debit', 'credit']) | |
|                             tax_debit_sums = sum( | |
|                                 record['debit'] for record in tax_id) | |
|                             tax_credit_sums = sum( | |
|                                 record['credit'] for record in tax_id) | |
|                             dynamic_total_net_sum[ | |
|                                 f"dynamic_total_net_sum{i}"] = tax_debit_sums + tax_credit_sums | |
|                             dynamic_total_tax_sum[ | |
|                                 f"dynamic_total_tax_sum{i}"] = \ | |
|                                 dynamic_total_net_sum[ | |
|                                     f"dynamic_total_net_sum{i}"] * ( | |
|                                         tax.amount / 100) | |
|                             dynamic_date_num[ | |
|                                 f"dynamic_date_num{i}"] = 'Q' + ' ' + str( | |
|                                 get_quarter_number( | |
|                                     com_start_date)) + ' ' + str( | |
|                                 com_start_date.year) | |
|                 tax_id = self.env['account.move.line'].search( | |
|                     [('tax_ids', '=', tax.id), | |
|                      ('parent_state', 'in', option_domain), | |
|                      ('date', '>=', start_date_first), | |
|                      ('date', '<=', end_date_first)]).read(['debit', 'credit']) | |
|                 tax_debit_sums = sum(record['debit'] for record in tax_id) | |
|                 tax_credit_sums = sum(record['credit'] for record in tax_id) | |
|                 if tax.type_tax_use == 'sale': | |
|                     if comparison_number: | |
|                         sale.append({ | |
|                             'name': tax.name, | |
|                             'amount': tax.amount, | |
|                             'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                             'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                                     tax.amount / 100), 2), | |
|                             'dynamic net': dynamic_total_net_sum, | |
|                             'dynamic tax': dynamic_total_tax_sum, | |
|                         }) | |
|                     else: | |
|                         sale.append({ | |
|                             'name': tax.name, | |
|                             'amount': tax.amount, | |
|                             'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                             'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                                     tax.amount / 100), 2), | |
|                         }) | |
|                 elif tax.type_tax_use == 'purchase': | |
|                     if comparison_number: | |
|                         purchase.append({ | |
|                             'name': tax.name, | |
|                             'amount': tax.amount, | |
|                             'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                             'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                                     tax.amount / 100), 2), | |
|                             'dynamic net': dynamic_total_net_sum, | |
|                             'dynamic tax': dynamic_total_tax_sum, | |
|                         }) | |
|                     else: | |
|                         purchase.append({ | |
|                             'name': tax.name, | |
|                             'amount': tax.amount, | |
|                             'net': round(tax_debit_sums + tax_credit_sums, 2), | |
|                             'tax': round((tax_debit_sums + tax_credit_sums) * ( | |
|                                     tax.amount / 100), 2), | |
|                         }) | |
|         return { | |
|             'dynamic_date_num': dynamic_date_num, | |
|             'sale': sale, | |
|             'purchase': purchase | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_month_name(self, date): | |
|         """ | |
|         Retrieve the abbreviated name of the month for a given date. | |
|  | |
|         :param date: The date for which to retrieve the month's abbreviated | |
|                      name. | |
|         :type date: datetime.date | |
|         :return: Abbreviated name of the month (e.g., 'Jan', 'Feb', ..., 'Dec'). | |
|         :rtype: str | |
|         """ | |
|         month_names = calendar.month_abbr | |
|         return month_names[date.month] | |
| 
 | |
|     @api.model | |
|     def get_xlsx_report(self, data, response, report_name, report_action): | |
|         """ | |
|         Generate an XLSX report based on provided data and response stream. | |
|  | |
|         Generates an Excel workbook with specified report format, including | |
|         subheadings,column headers, and row data for the given financial report | |
|         data. | |
|  | |
|         :param str data: JSON-encoded data for the report. | |
|         :param response: Response object to stream the generated report. | |
|         :param str report_name: Name of the financial report. | |
|         """ | |
|         data = json.loads(data) | |
|         output = io.BytesIO() | |
|         workbook = xlsxwriter.Workbook(output, {'in_memory': True}) | |
|         sheet = workbook.add_worksheet() | |
|         sub_heading = workbook.add_format( | |
|             {'align': 'center', 'bold': True, 'font_size': '10px', | |
|              'border': 1, | |
|              'border_color': 'black'}) | |
|         side_heading_sub = workbook.add_format( | |
|             {'align': 'left', 'bold': True, 'font_size': '10px', | |
|              'border': 1, | |
|              'border_color': 'black'}) | |
|         side_heading_sub.set_indent(1) | |
|         txt_name = workbook.add_format({'font_size': '10px', 'border': 1}) | |
|         txt_name.set_indent(2) | |
|         sheet.set_column(0, 0, 30) | |
|         sheet.set_column(1, 1, 20) | |
|         sheet.set_column(2, 2, 15) | |
|         sheet.set_column(3, 3, 15) | |
|         col = 0 | |
|         sheet.write('A3:b4', report_name, sub_heading) | |
|         sheet.write(5, col, '', sub_heading) | |
|         i = 1 | |
|         for date_view in data['date_viewed']: | |
|             sheet.merge_range(5, col + i, 5, col + i + 1, date_view, | |
|                               sub_heading) | |
|             i += 2 | |
|         j = 1 | |
|         prev_account = None | |
|         prev_tax = None | |
|         sheet.write(6, col, '', sub_heading) | |
|         for date in data['date_viewed']: | |
|             sheet.write(6, col + j, 'NET', sub_heading) | |
|             sheet.write(6, col + j + 1, 'TAX', sub_heading) | |
|             j += 1 | |
|         sheet.write(7, col, 'Sales', sub_heading) | |
|         sheet.write(7, col + 1, ' ', sub_heading) | |
|         sheet.write(7, col + 2, data['sale_total'], sub_heading) | |
|         row = 8 | |
|         for sale in data['data']['sale']: | |
|             if data['report_type']: | |
|                 if list(data['report_type'].keys())[0] == 'account': | |
|                     if prev_account != sale['account']: | |
|                         prev_account = sale['account'] | |
|                         sheet.write(row, col, sale['account'], txt_name) | |
|                         sheet.write(row, col + 1, '', txt_name) | |
|                         sheet.write(row, col + 2, '', txt_name) | |
|                 elif list(data['report_type'].keys())[0] == 'tax': | |
|                     if prev_tax != sale['name']: | |
|                         prev_tax = sale['name'] | |
|                         sheet.write(row, col, sale['name'] + '(' + str( | |
|                             sale['amount']) + '%)', txt_name) | |
|                         sheet.write(row, col + 1, '', txt_name) | |
|                         sheet.write(row, col + 2, '', txt_name) | |
|                 row += 1 | |
|                 if data['apply_comparison']: | |
|                     if sale['dynamic net']: | |
|                         periods = data['comparison_number_range'] | |
|                         for num in periods: | |
|                             if sale['dynamic net'][ | |
|                                 'dynamic_total_net_sum' + str(num)]: | |
|                                 sheet.write(row, col + j, sale['dynamic net'][ | |
|                                     'dynamic_total_net_sum' + str(num)], | |
|                                             txt_name) | |
|                             if sale['dynamic tax'][ | |
|                                 'dynamic_total_tax_sum' + str(num)]: | |
|                                 sheet.write(row, col, sale['dynamic tax'][ | |
|                                     'dynamic_total_tax_sum' + str(num)], | |
|                                             txt_name) | |
|                             j += 1 | |
|                 j = 0 | |
|                 sheet.write(row, col + j, sale['name'], txt_name) | |
|                 sheet.write(row, col + j + 1, sale['net'], txt_name) | |
|                 sheet.write(row, col + j + 2, sale['tax'], txt_name) | |
|             else: | |
|                 j = 0 | |
|                 sheet.write(row, col + j, sale['name'], txt_name) | |
|                 sheet.write(row, col + j + 1, sale['net'], txt_name) | |
|                 sheet.write(row, col + j + 2, sale['tax'], txt_name) | |
|                 row += 1 | |
|         row += 1 | |
|         sheet.write(row, col, 'Purchase', sub_heading) | |
|         sheet.write(row, col + 1, ' ', sub_heading) | |
|         sheet.write(row, col + 2, data['purchase_total'], sub_heading) | |
|         row += 1 | |
|         for purchase in data['data']['purchase']: | |
|             if data['report_type']: | |
|                 if list(data['report_type'].keys())[0] == 'account': | |
|                     if prev_account != purchase['account']: | |
|                         prev_account = purchase['account'] | |
|                         sheet.write(row, col, purchase['account'], txt_name) | |
|                         sheet.write(row, col + 1, '', txt_name) | |
|                         sheet.write(row, col + 2, '', txt_name) | |
|                 elif list(data['report_type'].keys())[0] == 'tax': | |
|                     if prev_tax != purchase['name']: | |
|                         prev_tax = purchase['name'] | |
|                         sheet.write(row, col, purchase['name'] + '(' + str( | |
|                             purchase['amount']) + '%)', txt_name) | |
|                         sheet.write(row, col + 1, '', txt_name) | |
|                         sheet.write(row, col + 2, '', txt_name) | |
|                 row += 1 | |
|                 if data['apply_comparison']: | |
|                     if purchase['dynamic net']: | |
|                         periods = data['comparison_number_range'] | |
|                         for num in periods: | |
|                             if purchase['dynamic net'][ | |
|                                 'dynamic_total_net_sum' + str(num)]: | |
|                                 sheet.write(row, col + j, | |
|                                             purchase['dynamic net'][ | |
|                                                 'dynamic_total_net_sum' + str( | |
|                                                     num)], | |
|                                             txt_name) | |
|                             if purchase['dynamic tax'][ | |
|                                 'dynamic_total_tax_sum' + str(num)]: | |
|                                 sheet.write(row, col, purchase['dynamic tax'][ | |
|                                     'dynamic_total_tax_sum' + str(num)], | |
|                                             txt_name) | |
|                             j += 1 | |
|                 j = 0 | |
|                 sheet.write(row, col + j, purchase['name'], txt_name) | |
|                 sheet.write(row, col + j + 1, purchase['net'], txt_name) | |
|                 sheet.write(row, col + j + 2, purchase['tax'], txt_name) | |
|             else: | |
|                 j = 0 | |
|                 sheet.write(row, col + j, purchase['name'], txt_name) | |
|                 sheet.write(row, col + j + 1, purchase['net'], txt_name) | |
|                 sheet.write(row, col + j + 2, purchase['tax'], txt_name) | |
|                 row += 1 | |
|         row += 1 | |
|         sheet.write(row, col, 'Purchase', sub_heading) | |
|         sheet.write(row, col + 1, ' ', sub_heading) | |
|         sheet.write(row, col + 2, data['purchase_total'], sub_heading) | |
|         row += 1 | |
|         workbook.close() | |
|         output.seek(0) | |
|         response.stream.write(output.read()) | |
|         output.close()
 | |
| 
 |