# 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). import time from datetime import date from odoo.tests import common class TestVATReport(common.TransactionCase): def setUp(self): super(TestVATReport, self).setUp() self.date_from = time.strftime("%Y-%m-01") self.date_to = time.strftime("%Y-%m-28") self.company = self.env.ref("base.main_company") self.receivable_account = self.env["account.account"].search( [ ("company_id", "=", self.company.id), ("user_type_id.name", "=", "Receivable"), ], limit=1, ) self.income_account = self.env["account.account"].search( [ ("company_id", "=", self.company.id), ("user_type_id.name", "=", "Income"), ], limit=1, ) self.tax_account = self.env["account.account"].search( [ ("company_id", "=", self.company.id), ( "user_type_id", "=", self.env.ref( "account.data_account_type_non_current_liabilities" ).id, ), ], limit=1, ) self.bank_journal = self.env["account.journal"].search( [("type", "=", "bank"), ("company_id", "=", self.company.id)], limit=1 ) self.tax_tag_01 = self.env["account.account.tag"].create( {"name": "Tag 01", "applicability": "taxes"} ) self.tax_tag_02 = self.env["account.account.tag"].create( {"name": "Tag 02", "applicability": "taxes"} ) self.tax_tag_03 = self.env["account.account.tag"].create( {"name": "Tag 03", "applicability": "taxes"} ) self.tax_group_10 = self.env["account.tax.group"].create( {"name": "Tax 10%", "sequence": 1} ) self.tax_group_20 = self.env["account.tax.group"].create( {"name": "Tax 20%", "sequence": 2} ) self.tax_10 = self.env["account.tax"].create( { "name": "Tax 10.0%", "amount": 10.0, "amount_type": "percent", "type_tax_use": "sale", "account_id": self.tax_account.id, "company_id": self.company.id, "refund_account_id": self.tax_account.id, "tax_group_id": self.tax_group_10.id, "tag_ids": [(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])], } ) self.tax_20 = self.env["account.tax"].create( { "sequence": 30, "name": "Tax 20.0%", "amount": 20.0, "amount_type": "percent", "type_tax_use": "sale", "tax_exigibility": "on_payment", "account_id": self.tax_account.id, "company_id": self.company.id, "refund_account_id": self.tax_account.id, "cash_basis_account_id": self.tax_account.id, "tax_group_id": self.tax_group_20.id, "tag_ids": [(6, 0, [self.tax_tag_02.id, self.tax_tag_03.id])], } ) invoice = self.env["account.invoice"].create( { "partner_id": self.env.ref("base.res_partner_2").id, "account_id": self.receivable_account.id, "company_id": self.company.id, "date_invoice": time.strftime("%Y-%m-03"), "type": "out_invoice", } ) self.env["account.invoice.line"].create( { "product_id": self.env.ref("product.product_product_4").id, "quantity": 1.0, "price_unit": 100.0, "invoice_id": invoice.id, "name": "product", "account_id": self.income_account.id, "invoice_line_tax_ids": [(6, 0, [self.tax_10.id])], } ) invoice.compute_taxes() invoice.action_invoice_open() self.cbinvoice = self.env["account.invoice"].create( { "partner_id": self.env.ref("base.res_partner_2").id, "account_id": self.receivable_account.id, "company_id": self.company.id, "date_invoice": time.strftime("%Y-%m-05"), "type": "out_invoice", } ) self.env["account.invoice.line"].create( { "product_id": self.env.ref("product.product_product_4").id, "quantity": 1.0, "price_unit": 500.0, "invoice_id": self.cbinvoice.id, "name": "product", "account_id": self.income_account.id, "invoice_line_tax_ids": [(6, 0, [self.tax_20.id])], } ) self.cbinvoice.compute_taxes() self.cbinvoice.action_invoice_open() self.cbinvoice.pay_and_reconcile( self.bank_journal.id, 300, date(date.today().year, date.today().month, 10) ) def _get_report_lines(self, taxgroups=False): based_on = "taxtags" if taxgroups: based_on = "taxgroups" vat_report = self.env["vat.report.wizard"].create( { "date_from": self.date_from, "date_to": self.date_to, "company_id": self.company.id, "based_on": based_on, "tax_detail": True, } ) data = vat_report._prepare_vat_report() res_data = self.env[ "report.account_financial_report.vat_report" ]._get_report_values(vat_report, data) return res_data def check_tag_or_group_in_report(self, tag_or_group_name, vat_report): tag_or_group_in_report = False for tag_or_group in vat_report: if tag_or_group["name"] == tag_or_group_name: tag_or_group_in_report = True break return tag_or_group_in_report def check_tax_in_report(self, tax_name, vat_report): tax_in_report = False for tag_or_group in vat_report: if tag_or_group["taxes"]: for tax in tag_or_group["taxes"]: if tax["name"] == tax_name: tax_in_report = True return tax_in_report def _get_tag_or_group_line(self, tag_or_group_name, vat_report): tag_or_group_net = False tag_or_group_tax = False for tag_or_group in vat_report: if tag_or_group["name"] == tag_or_group_name: tag_or_group_net = tag_or_group["net"] tag_or_group_tax = tag_or_group["tax"] return tag_or_group_net, tag_or_group_tax def _get_tax_line(self, tax_name, vat_report): tax_net = False tax_tax = False for tag_or_group in vat_report: if tag_or_group["taxes"]: for tax in tag_or_group["taxes"]: if tax["name"] == tax_name: tax_net = tax["net"] tax_tax = tax["tax"] return tax_net, tax_tax def test_01_compute(self): # Generate the vat lines res_data = self._get_report_lines() vat_report = res_data["vat_report"] # Check report based on taxtags check_tax_tag_01 = self.check_tag_or_group_in_report( self.tax_tag_01.name, vat_report ) self.assertTrue(check_tax_tag_01) check_tax_tag_02 = self.check_tag_or_group_in_report( self.tax_tag_02.name, vat_report ) self.assertTrue(check_tax_tag_02) check_tax_tag_03 = self.check_tag_or_group_in_report( self.tax_tag_03.name, vat_report ) self.assertTrue(check_tax_tag_03) check_tax_10 = self.check_tax_in_report(self.tax_10.name, vat_report) self.assertTrue(check_tax_10) check_tax_20 = self.check_tax_in_report(self.tax_20.name, vat_report) self.assertTrue(check_tax_20) tag_01_net, tag_01_tax = self._get_tag_or_group_line( self.tax_tag_01.name, vat_report ) tag_02_net, tag_02_tax = self._get_tag_or_group_line( self.tax_tag_02.name, vat_report ) tag_03_net, tag_03_tax = self._get_tag_or_group_line( self.tax_tag_03.name, vat_report ) tax_10_net, tax_10_tax = self._get_tax_line(self.tax_10.name, vat_report) tax_20_net, tax_20_tax = self._get_tax_line(self.tax_20.name, vat_report) self.assertEqual(tag_01_net, 100) self.assertEqual(tag_01_tax, 10) self.assertEqual(tag_02_net, 350) self.assertEqual(tag_02_tax, 60) self.assertEqual(tag_03_net, 250) self.assertEqual(tag_03_tax, 50) self.assertEqual(tax_10_net, 100) self.assertEqual(tax_10_tax, 10) self.assertEqual(tax_20_net, 250) self.assertEqual(tax_20_tax, 50) # Check report based on taxgroups res_data = self._get_report_lines(taxgroups=True) vat_report = res_data["vat_report"] check_group_10 = self.check_tag_or_group_in_report( self.tax_group_10.name, vat_report ) self.assertTrue(check_group_10) check_group_20 = self.check_tag_or_group_in_report( self.tax_group_20.name, vat_report ) self.assertTrue(check_group_20) check_tax_10 = self.check_tax_in_report(self.tax_10.name, vat_report) self.assertTrue(check_tax_10) check_tax_20 = self.check_tax_in_report(self.tax_20.name, vat_report) self.assertTrue(check_tax_20) group_10_net, group_10_tax = self._get_tag_or_group_line( self.tax_group_10.name, vat_report ) group_20_net, group_20_tax = self._get_tag_or_group_line( self.tax_group_20.name, vat_report ) tax_10_net, tax_10_tax = self._get_tax_line(self.tax_10.name, vat_report) tax_20_net, tax_20_tax = self._get_tax_line(self.tax_20.name, vat_report) self.assertEqual(group_10_net, 100) self.assertEqual(group_10_tax, 10) self.assertEqual(group_20_net, 250) self.assertEqual(group_20_tax, 50) self.assertEqual(tax_10_net, 100) self.assertEqual(tax_10_tax, 10) self.assertEqual(tax_20_net, 250) self.assertEqual(tax_20_tax, 50) def test_wizard_date_range(self): vat_wizard = self.env["vat.report.wizard"] date_range = self.env["date.range"] self.type = self.env["date.range.type"].create( {"name": "Month", "company_id": False, "allow_overlap": False} ) dt = date_range.create( { "name": "FS2016", "date_start": time.strftime("%Y-%m-01"), "date_end": time.strftime("%Y-%m-28"), "type_id": self.type.id, } ) wizard = vat_wizard.create( { "date_range_id": dt.id, "date_from": time.strftime("%Y-%m-28"), "date_to": time.strftime("%Y-%m-01"), "tax_detail": True, } ) wizard.onchange_date_range_id() self.assertEqual( wizard.date_from, date(date.today().year, date.today().month, 1) ) self.assertEqual( wizard.date_to, date(date.today().year, date.today().month, 28) ) wizard._export("qweb-pdf") wizard.button_export_html() wizard.button_export_pdf() wizard.button_export_xlsx() wizard = vat_wizard.create( { "date_range_id": dt.id, "date_from": time.strftime("%Y-%m-28"), "date_to": time.strftime("%Y-%m-01"), "based_on": "taxgroups", "tax_detail": True, } ) wizard.onchange_date_range_id() self.assertEqual( wizard.date_from, date(date.today().year, date.today().month, 1) ) self.assertEqual( wizard.date_to, date(date.today().year, date.today().month, 28) ) wizard._export("qweb-pdf") wizard.button_export_html() wizard.button_export_pdf() wizard.button_export_xlsx()