# Copyright 2018 Forest and Biomass Romania # Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, api class VATReport(models.AbstractModel): _name = 'report.account_financial_report.vat_report' def _get_tax_data(self, tax_ids): taxes = self.env['account.tax'].browse(tax_ids) tax_data = {} for tax in taxes: tax_data.update({ tax.id: { 'id': tax.id, 'name': tax.name, 'tax_group_id': tax.tax_group_id.id, 'tags_ids': tax.tag_ids.ids } }) return tax_data @api.model def _get_vat_report_domain(self, company_id, date_from, date_to): domain = [('company_id', '=', company_id), ('date', '>=', date_from), ('date', '<', date_to), ('tax_line_id', '!=', False), ('tax_exigible', '=', True)] return domain def _get_vat_report_data(self, company_id, date_from, date_to): domain = self._get_vat_report_domain(company_id, date_from, date_to) ml_fields = ['id', 'tax_base_amount', 'balance', 'tax_line_id', 'analytic_tag_ids'] tax_move_lines = self.env['account.move.line'].search_read( domain=domain, fields=ml_fields, ) vat_data = {} tax_ids = set() for tax_move_line in tax_move_lines: tax_ml_id = tax_move_line['id'] vat_data[tax_ml_id] = {} vat_data[tax_ml_id].update({ 'id': tax_ml_id, 'net': tax_move_line['tax_base_amount'], 'tax': tax_move_line['balance'] if tax_move_line[ 'balance'] > 0 else (-1) * tax_move_line['balance'], 'tax_line_id': tax_move_line['tax_line_id'], }) tax_ids.add(tax_move_line['tax_line_id'][0]) tax_data = self._get_tax_data(tax_ids) return vat_data, tax_data def _get_tax_group_data(self, tax_group_ids): tax_groups = self.env['account.tax.group'].browse(tax_group_ids) tax_group_data = {} for tax_group in tax_groups: tax_group_data.update({ tax_group.id: { 'id': tax_group.id, 'name': tax_group.name, 'code': str(tax_group.sequence), } }) return tax_group_data def _get_vat_report_group_data(self, vat_report_data, tax_data, tax_detail): vat_report = {} for tax_move_line in vat_report_data.values(): tax_id = tax_move_line['tax_line_id'][0] tax_group_id = tax_data[tax_id]['tax_group_id'] if tax_group_id not in vat_report.keys(): vat_report[tax_group_id] = {} vat_report[tax_group_id]['net'] = 0.0 vat_report[tax_group_id]['tax'] = 0.0 vat_report[tax_group_id][tax_id] = tax_data[tax_id] vat_report[tax_group_id][tax_id].update( {'net': 0.0, 'tax': 0.0} ) else: if tax_id not in vat_report[tax_group_id].keys(): vat_report[tax_group_id][tax_id] = tax_data[tax_id] vat_report[tax_group_id][tax_id].update( {'net': 0.0, 'tax': 0.0} ) vat_report[tax_group_id]['net'] += tax_move_line['net'] vat_report[tax_group_id]['tax'] += tax_move_line['tax'] vat_report[tax_group_id][tax_id]['net'] += tax_move_line['net'] vat_report[tax_group_id][tax_id]['tax'] += tax_move_line['tax'] tax_group_data = self._get_tax_group_data(vat_report.keys()) vat_report_list = [] for tax_group_id in vat_report.keys(): vat_report[tax_group_id]['name'] = tax_group_data[ tax_group_id]['name'] vat_report[tax_group_id]['code'] = tax_group_data[ tax_group_id]['code'] if tax_detail: vat_report[tax_group_id]['taxes'] = [] for tax_id in vat_report[tax_group_id]: if isinstance(tax_id, int): vat_report[tax_group_id]['taxes'].append( vat_report[tax_group_id][tax_id] ) vat_report_list.append(vat_report[tax_group_id]) return vat_report_list def _get_tags_data(self, tags_ids): tags = self.env['account.account.tag'].browse(tags_ids) tags_data = {} for tag in tags: tags_data.update({tag.id: { 'code': "", 'name': tag.name} }) return tags_data def _get_vat_report_tag_data(self, vat_report_data, tax_data, tax_detail): vat_report = {} for tax_move_line in vat_report_data.values(): tax_id = tax_move_line['tax_line_id'][0] tags_ids = tax_data[tax_id]['tags_ids'] if tags_ids: for tag_id in tags_ids: if tag_id not in vat_report.keys(): vat_report[tag_id] = {} vat_report[tag_id]['net'] = 0.0 vat_report[tag_id]['tax'] = 0.0 vat_report[tag_id][tax_id] = tax_data[tax_id] vat_report[tag_id][tax_id].update( {'net': 0.0, 'tax': 0.0} ) else: if tax_id not in vat_report[tag_id].keys(): vat_report[tag_id][tax_id] = tax_data[tax_id] vat_report[tag_id][tax_id].update( {'net': 0.0, 'tax': 0.0} ) vat_report[tag_id][tax_id]['net'] += tax_move_line['net'] vat_report[tag_id][tax_id]['tax'] += tax_move_line['tax'] vat_report[tag_id]['net'] += tax_move_line['net'] vat_report[tag_id]['tax'] += tax_move_line['tax'] tags_data = self._get_tags_data(vat_report.keys()) vat_report_list = [] for tag_id in vat_report.keys(): vat_report[tag_id]['name'] = tags_data[tag_id]['name'] vat_report[tag_id]['code'] = tags_data[tag_id]['code'] if tax_detail: vat_report[tag_id]['taxes'] = [] for tax_id in vat_report[tag_id]: if isinstance(tax_id, int): vat_report[tag_id]['taxes'].append( vat_report[tag_id][tax_id] ) vat_report_list.append(vat_report[tag_id]) return vat_report_list @api.multi def _get_report_values(self, docids, data): wizard_id = data['wizard_id'] company = self.env['res.company'].browse(data['company_id']) company_id = data['company_id'] date_from = data['date_from'] date_to = data['date_to'] based_on = data['based_on'] tax_detail = data['tax_detail'] vat_report_data, tax_data = self._get_vat_report_data( company_id, date_from, date_to) if based_on == 'taxgroups': vat_report = self._get_vat_report_group_data( vat_report_data, tax_data, tax_detail) else: vat_report = self._get_vat_report_tag_data( vat_report_data, tax_data, tax_detail) return { 'doc_ids': [wizard_id], 'doc_model': 'open.items.report.wizard', 'docs': self.env['open.items.report.wizard'].browse(wizard_id), 'company_name': company.display_name, 'currency_name': company.currency_id.name, 'date_to': data['date_to'], 'date_from': data['date_from'], 'based_on': data['based_on'], 'tax_detail': data['tax_detail'], 'vat_report': vat_report, }