# Copyright 2017 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import time from datetime import datetime from dateutil.relativedelta import relativedelta from flectra.fields import Date from flectra.tests.common import TransactionCase from . import abstract_test_foreign_currency as a_t_f_c class TestJournalLedger(a_t_f_c.AbstractTestForeignCurrency): """ Technical tests for General Ledger Report. """ def _getReportModel(self): return self.env['report_journal_ledger'] def _getQwebReportName(self): return 'account_financial_report.report_journal_ledger_qweb' def _getXlsxReportName(self): return 'a_f_r.report_journal_ledger_xlsx' def _getXlsxReportActionName(self): return 'account_financial_report.' \ 'action_report_journal_ledger_xlsx' def _getReportTitle(self): return 'Flectra' def _getBaseFilters(self): return { 'date_from': time.strftime('%Y-01-01'), 'date_to': time.strftime('%Y-12-31'), 'company_id': self.company.id, 'journal_ids': [(6, 0, self.journal_sale.ids)] } def _getAdditionalFiltersToBeTested(self): return [ {'move_target': "All", 'sort_option': "Date", 'group_option': "Journal", 'with_account_name': True, 'foreign_currency': True}, ] def test_02_generation_report_html(self): """Check if report HTML is correctly generated""" # Check if returned report action is correct report_type = 'qweb-html' report_action = self.report.print_report(report_type) self.assertDictContainsSubset( { 'type': 'ir.actions.report', 'report_name': self.qweb_report_name, 'report_type': 'qweb-html', }, report_action ) # Check if report template is correct report = self.env['ir.actions.report'].search( [('report_name', '=', self.qweb_report_name), ('report_type', '=', report_type)], limit=1) self.assertEqual(report.report_type, 'qweb-html') rep = report.render(self.report.ids, {}) self.assertTrue(self.report_title.encode('utf8') in rep[0]) self.assertTrue( self.report.journal_ids[0].name.encode('utf8') in rep[0] ) def test_04_compute_data(self): return True class TestJournalReport(TransactionCase): def setUp(self): super(TestJournalReport, self).setUp() self.AccountObj = self.env['account.account'] self.InvoiceObj = self.env['account.invoice'] self.JournalObj = self.env['account.journal'] self.JournalReportObj = self.env['journal.ledger.report.wizard'] self.MoveObj = self.env['account.move'] self.ReportJournalLedger = self.env['report_journal_ledger'] self.TaxObj = self.env['account.tax'] self.company = self.env.ref('base.main_company') today = datetime.today() last_year = today - relativedelta(years=1) self.previous_fy_date_start = Date.to_string( last_year.replace(month=1, day=1)) self.previous_fy_date_end = Date.to_string( last_year.replace(month=12, day=31)) self.fy_date_start = Date.to_string( today.replace(month=1, day=1)) self.fy_date_end = Date.to_string( today.replace(month=12, day=31)) self.receivable_account = self.AccountObj.search([ ('user_type_id.name', '=', 'Receivable') ], limit=1) self.income_account = self.AccountObj.search([ ('user_type_id.name', '=', 'Income') ], limit=1) self.payable_account = self.AccountObj.search([ ('user_type_id.name', '=', 'Payable') ], limit=1) self.journal_sale = self.JournalObj.create({ 'name': "Test journal sale", 'code': "TST-JRNL-S", 'type': 'sale', 'company_id': self.company.id, }) self.journal_purchase = self.JournalObj.create({ 'name': "Test journal purchase", 'code': "TST-JRNL-P", 'type': 'sale', 'company_id': self.company.id, }) self.tax_15_s = self.TaxObj.create({ 'sequence': 30, 'name': 'Tax 15.0% (Percentage of Price)', 'amount': 15.0, 'amount_type': 'percent', 'include_base_amount': False, 'type_tax_use': 'sale', }) self.tax_20_s = self.TaxObj.create({ 'sequence': 30, 'name': 'Tax 20.0% (Percentage of Price)', 'amount': 20.0, 'amount_type': 'percent', 'include_base_amount': False, 'type_tax_use': 'sale', }) self.tax_15_p = self.TaxObj.create({ 'sequence': 30, 'name': 'Tax 15.0% (Percentage of Price)', 'amount': 15.0, 'amount_type': 'percent', 'include_base_amount': False, 'type_tax_use': 'purchase', }) self.tax_20_p = self.TaxObj.create({ 'sequence': 30, 'name': 'Tax 20.0% (Percentage of Price)', 'amount': 20.0, 'amount_type': 'percent', 'include_base_amount': False, 'type_tax_use': 'purchase', }) self.partner_2 = self.env.ref('base.res_partner_2') def _add_move( self, date, journal, receivable_debit, receivable_credit, income_debit, income_credit): move_name = 'move name' move_vals = { 'journal_id': journal.id, 'date': date, 'line_ids': [ (0, 0, { 'name': move_name, 'debit': receivable_debit, 'credit': receivable_credit, 'account_id': self.receivable_account.id }), (0, 0, { 'name': move_name, 'debit': income_debit, 'credit': income_credit, 'account_id': self.income_account.id }), ] } return self.MoveObj.create(move_vals) def check_report_journal_debit_credit( self, report, expected_debit, expected_credit): self.assertEqual( expected_debit, sum([journal.debit for journal in report.report_journal_ledger_ids]) ) self.assertEqual( expected_credit, sum([journal.credit for journal in report.report_journal_ledger_ids]) ) def check_report_journal_debit_credit_taxes( self, report, expected_base_debit, expected_base_credit, expected_tax_debit, expected_tax_credit): self.assertEqual( expected_base_debit, sum([ journal.base_debit for journal in report.report_journal_ledger_tax_line_ids ]) ) self.assertEqual( expected_base_credit, sum([ journal.base_credit for journal in report.report_journal_ledger_tax_line_ids ]) ) self.assertEqual( expected_tax_debit, sum([ journal.tax_debit for journal in report.report_journal_ledger_tax_line_ids ]) ) self.assertEqual( expected_tax_credit, sum([ journal.tax_credit for journal in report.report_journal_ledger_tax_line_ids ]) ) def test_01_test_total(self): today_date = Date.today() last_year_date = Date.to_string( datetime.today() - relativedelta(years=1)) move1 = self._add_move( today_date, self.journal_sale, 0, 100, 100, 0) move2 = self._add_move( last_year_date, self.journal_sale, 0, 100, 100, 0) report = self.ReportJournalLedger.create({ 'date_from': self.fy_date_start, 'date_to': self.fy_date_end, 'company_id': self.company.id, 'journal_ids': [(6, 0, self.journal_sale.ids)] }) report.compute_data_for_report() self.check_report_journal_debit_credit(report, 100, 100) move3 = self._add_move( today_date, self.journal_sale, 0, 100, 100, 0) report.compute_data_for_report() self.check_report_journal_debit_credit(report, 200, 200) report.move_target = 'posted' report.compute_data_for_report() self.check_report_journal_debit_credit(report, 0, 0) move1.post() report.compute_data_for_report() self.check_report_journal_debit_credit(report, 100, 100) move2.post() report.compute_data_for_report() self.check_report_journal_debit_credit(report, 100, 100) move3.post() report.compute_data_for_report() self.check_report_journal_debit_credit(report, 200, 200) report.date_from = self.previous_fy_date_start report.compute_data_for_report() self.check_report_journal_debit_credit(report, 300, 300) def test_02_test_taxes_out_invoice(self): invoice_values = { 'journal_id': self.journal_sale.id, 'partner_id': self.partner_2.id, 'type': 'out_invoice', 'invoice_line_ids': [ (0, 0, { 'quantity': 1.0, 'price_unit': 100, 'account_id': self.receivable_account.id, 'name': "Test", 'invoice_line_tax_ids': [(6, 0, [self.tax_15_s.id])], }), (0, 0, { 'quantity': 1.0, 'price_unit': 100, 'account_id': self.receivable_account.id, 'name': "Test", 'invoice_line_tax_ids': [(6, 0, [ self.tax_15_s.id, self.tax_20_s.id ])], }) ] } invoice = self.InvoiceObj.create(invoice_values) invoice.action_invoice_open() report = self.ReportJournalLedger.create({ 'date_from': self.fy_date_start, 'date_to': self.fy_date_end, 'company_id': self.company.id, 'journal_ids': [(6, 0, self.journal_sale.ids)] }) report.compute_data_for_report() self.check_report_journal_debit_credit(report, 250, 250) self.check_report_journal_debit_credit_taxes(report, 0, 300, 0, 50) def test_03_test_taxes_in_invoice(self): invoice_values = { 'journal_id': self.journal_sale.id, 'partner_id': self.partner_2.id, 'type': 'in_invoice', 'invoice_line_ids': [ (0, 0, { 'quantity': 1.0, 'price_unit': 100, 'account_id': self.payable_account.id, 'name': "Test", 'invoice_line_tax_ids': [(6, 0, [self.tax_15_p.id])], }), (0, 0, { 'quantity': 1.0, 'price_unit': 100, 'account_id': self.payable_account.id, 'name': "Test", 'invoice_line_tax_ids': [(6, 0, [ self.tax_15_p.id, self.tax_20_p.id ])], }) ] } invoice = self.InvoiceObj.create(invoice_values) invoice.action_invoice_open() report = self.ReportJournalLedger.create({ 'date_from': self.fy_date_start, 'date_to': self.fy_date_end, 'company_id': self.company.id, 'journal_ids': [(6, 0, self.journal_sale.ids)] }) report.compute_data_for_report() self.check_report_journal_debit_credit(report, 250, 250) self.check_report_journal_debit_credit_taxes(report, 300, 0, 50, 0)