diff --git a/product/ERP5/tests/testAccountingReports.py b/product/ERP5/tests/testAccountingReports.py new file mode 100644 index 0000000000000000000000000000000000000000..679602617aa50dec71a1a5b3334acaf6c266c981 --- /dev/null +++ b/product/ERP5/tests/testAccountingReports.py @@ -0,0 +1,375 @@ +############################################################################# +# +# Copyright (c) 2006 Nexedi SA and Contributors. All Rights Reserved. +# Jerome Perrin <jerome@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +"""Tests Standards ERP5 Accounting Reports +""" + +import unittest + +from DateTime import DateTime + +from Products.ERP5.tests.testAccounting import AccountingTestCase +from Products.ERP5Form.Selection import Selection + + +class TestAccountingReports(AccountingTestCase): + """Test Accounting reports""" + + # utility methods for ERP5 Report + def getReportSectionList(self, report_name): + """Get the list of report sections in a report.""" + report = getattr(self.portal, report_name) + report_method = getattr(self.portal, report.report_method) + return report_method() + + def getListBoxLineList(self, report_section): + """Render the listbox in a report section, return None if no listbox exists + in the report_section. + """ + result = None + here = report_section.getObject(self.portal) + report_section.pushReport(self.portal) + form = getattr(here, report_section.getFormId()) + if form.has_field('listbox'): + result = form.listbox.get_value('default', + render_format='list', + REQUEST=self.portal.REQUEST) + report_section.popReport(self.portal) + return result + + + def testJournal(self): + # Journal report. + # this will be a journal for 2006/02/02, for Sale Invoice Transaction + # portal type. Many cases are covered by this test. + + account_module = self.account_module + # before the date + self._makeOne( + portal_type='Accounting Transaction', + simulation_state='delivered', + start_date=DateTime(2006, 1, 1), + lines=(dict(source_value=account_module.equity, + source_debit=100), + dict(source_value=account_module.stocks, + source_credit=100))) + + # during the period + first = self._makeOne( + portal_type='Sale Invoice Transaction', + title='First One', + simulation_state='delivered', + destination_section_value=self.organisation_module.client_1, + start_date=DateTime(2006, 2, 2), + lines=(dict(source_value=account_module.receivable, + source_debit=119.60), + dict(source_value=account_module.collected_vat, + source_credit=19.60), + dict(source_value=account_module.goods_sales, + source_credit=100.00))) + + second = self._makeOne( + portal_type='Sale Invoice Transaction', + title='Second One', + simulation_state='delivered', + destination_section_value=self.organisation_module.client_2, + start_date=DateTime(2006, 2, 2), + lines=(dict(source_value=account_module.receivable, + source_debit=239.20), + dict(source_value=account_module.collected_vat, + source_credit=39.20), + dict(source_value=account_module.goods_sales, + source_credit=200.00))) + + third = self._makeOne( + title='Third One', + portal_type='Sale Invoice Transaction', + simulation_state='delivered', + # with a person member of the group + destination_section_value=self.person_module.john_smith, + start_date=DateTime(2006, 2, 2, 2, 2), # with hour:minutes + lines=(dict(source_value=account_module.receivable, + destination_value=account_module.receivable, + source_debit=358.80), + dict(source_value=account_module.collected_vat, + source_credit=58.80), + dict(source_value=account_module.goods_sales, + # with a title on the line + title='Line Title', + source_credit=300.00))) + + # another portal type + self._makeOne( + portal_type='Accounting Transaction', + simulation_state='delivered', + start_date=DateTime(2006, 2, 2), + lines=(dict(source_value=account_module.equity, + source_debit=111), + dict(source_value=account_module.stocks, + source_credit=111))) + + # after the period + self._makeOne( + portal_type='Sale Invoice Transaction', + simulation_state='delivered', + destination_section_value=self.organisation_module.client_2, + start_date=DateTime(2006, 2, 3), + lines=(dict(source_value=account_module.receivable, + source_debit=598.00), + dict(source_value=account_module.collected_vat, + source_credit=98.00), + dict(source_value=account_module.goods_sales, + source_credit=500.00))) + + # set request variables and render + request_form = self.portal.REQUEST.form + request_form['at_date'] = DateTime(2006, 2, 2) + request_form['section_category'] = 'group/demo_group' + request_form['portal_type'] = ['Sale Invoice Transaction'] + request_form['simulation_state'] = ['delivered'] + + report_section_list = self.getReportSectionList( + 'AccountingTransactionModule_viewJournalReport') + self.assertEquals(1, len(report_section_list)) + + # precision is set in the REQUEST (so that fields know how to format) + precision = self.portal.REQUEST.get('precision') + self.assertEquals(2, precision) + + line_list = self.getListBoxLineList(report_section_list[0]) + data_line_list = [l for l in line_list if l.isDataLine()] + # we have 3 transactions, with 3 lines each + self.assertEquals(9, len(data_line_list)) + + # test columns values + line = data_line_list[0] + self.assertEquals(line.column_id_list, + ['specific_reference', 'date', 'title', 'node_title', + 'mirror_section_title', 'debit', 'credit']) + + # First Transaction + line = data_line_list[0] + self.assertEquals(first.getSourceReference(), + line.getColumnProperty('specific_reference')) + self.assertEquals(DateTime(2006, 2, 2), + line.getColumnProperty('date')) + self.assertEquals('First One', line.getColumnProperty('title')) + self.assertEquals('41', line.getColumnProperty('node_title')) + self.assertEquals('Client 1', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(119.60, line.getColumnProperty('debit')) + self.assertEquals(0, line.getColumnProperty('credit')) + line = data_line_list[1] + # some values are only present when we display the first line of the + # transaction (this is a way to see different transactions) + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('4457', line.getColumnProperty('node_title')) + self.assertEquals('Client 1', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(19.60, line.getColumnProperty('credit')) + line = data_line_list[2] + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('7', line.getColumnProperty('node_title')) + self.assertEquals('Client 1', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(100.00, line.getColumnProperty('credit')) + + # Second Transaction + line = data_line_list[3] + self.assertEquals(second.getSourceReference(), + line.getColumnProperty('specific_reference')) + self.assertEquals(DateTime(2006, 2, 2), line.getColumnProperty('date')) + self.assertEquals('Second One', line.getColumnProperty('title')) + self.assertEquals('41', line.getColumnProperty('node_title')) + self.assertEquals('Client 2', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(239.20, line.getColumnProperty('debit')) + self.assertEquals(0, line.getColumnProperty('credit')) + line = data_line_list[4] + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('4457', line.getColumnProperty('node_title')) + self.assertEquals('Client 2', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(39.20, line.getColumnProperty('credit')) + line = data_line_list[5] + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('7', line.getColumnProperty('node_title')) + self.assertEquals('Client 2', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(200, line.getColumnProperty('credit')) + + # Third Transaction + line = data_line_list[6] + self.assertEquals(third.getSourceReference(), + line.getColumnProperty('specific_reference')) + self.assertEquals(DateTime(2006, 2, 2, 2, 2), # 2006/02/02 will be + # displayed, but this rendering level cannot be + # tested with this framework + line.getColumnProperty('date')) + self.assertEquals('Third One', line.getColumnProperty('title')) + self.assertEquals('41', line.getColumnProperty('node_title')) + self.assertEquals('John Smith', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(358.80, line.getColumnProperty('debit')) + self.assertEquals(0, line.getColumnProperty('credit')) + line = data_line_list[7] + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('4457', line.getColumnProperty('node_title')) + self.assertEquals('John Smith', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(58.80, line.getColumnProperty('credit')) + line = data_line_list[8] + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + # If a title is set on the line, we can see it on this report + self.assertEquals('Line Title', line.getColumnProperty('title')) + self.assertEquals('7', line.getColumnProperty('node_title')) + self.assertEquals('John Smith', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(300.0, line.getColumnProperty('credit')) + + # Stat Line + stat_line = line_list[-1] + self.failUnless(stat_line.isStatLine()) + self.failIf(stat_line.getColumnProperty('specific_reference')) + self.failIf(stat_line.getColumnProperty('date')) + self.failIf(stat_line.getColumnProperty('title')) + self.failIf(stat_line.getColumnProperty('node_title')) + self.failIf(stat_line.getColumnProperty('mirror_section_title')) + # when printing the report, the field does the rounding, so we can round in + # the test + self.assertEquals(717.60, round(stat_line.getColumnProperty('debit'), + precision)) + self.assertEquals(717.60, round(stat_line.getColumnProperty('credit'), + precision)) + + + def testJournalWithBankAccount(self): + # Journal report when selecting a bank account + # this will be a journal for 2006/02/02, whith two bank accounts + + account_module = self.account_module + + bank1 = self.section.newContent(portal_type='Bank Account') + bank1.validate() + bank2 = self.section.newContent(portal_type='Bank Account') + bank2.validate() + + transaction = self._makeOne( + portal_type='Payment Transaction', + title='Good One', + simulation_state='delivered', + source_payment_value=bank1, + destination_section_value=self.organisation_module.client_1, + start_date=DateTime(2006, 2, 2), + lines=(dict(source_value=account_module.receivable, + source_debit=100.0), + dict(source_value=account_module.bank, + source_credit=100.0))) + + self._makeOne( + portal_type='Payment Transaction', + title='Other One', + simulation_state='delivered', + source_payment_value=bank2, + destination_section_value=self.organisation_module.client_1, + start_date=DateTime(2006, 2, 2), + lines=(dict(source_value=account_module.receivable, + source_debit=200.0), + dict(source_value=account_module.bank, + source_credit=200.0))) + + + # set request variables and render + request_form = self.portal.REQUEST.form + request_form['at_date'] = DateTime(2006, 2, 2) + request_form['section_category'] = 'group/demo_group' + request_form['portal_type'] = ['Payment Transaction'] + request_form['simulation_state'] = ['delivered'] + request_form['payment'] = bank1.getRelativeUrl() + + report_section_list = self.getReportSectionList( + 'AccountingTransactionModule_viewJournalReport') + self.assertEquals(1, len(report_section_list)) + + line_list = self.getListBoxLineList(report_section_list[0]) + data_line_list = [l for l in line_list if l.isDataLine()] + # we have 1 transactions with 2 lines + self.assertEquals(2, len(data_line_list)) + + line = data_line_list[0] + self.assertEquals(transaction.getSourceReference(), + line.getColumnProperty('specific_reference')) + self.assertEquals(DateTime(2006, 2, 2), + line.getColumnProperty('date')) + self.assertEquals('Good One', line.getColumnProperty('title')) + self.assertEquals('41', line.getColumnProperty('node_title')) + self.assertEquals('Client 1', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(100.00, line.getColumnProperty('debit')) + self.assertEquals(0, line.getColumnProperty('credit')) + line = data_line_list[1] + # some values are only present when we display the first line of the + # transaction (this is a way to see different transactions) + self.failIf(line.getColumnProperty('specific_reference')) + self.failIf(line.getColumnProperty('date')) + self.failIf(line.getColumnProperty('title')) + self.assertEquals('5', line.getColumnProperty('node_title')) + self.assertEquals('Client 1', + line.getColumnProperty('mirror_section_title')) + self.assertEquals(0, line.getColumnProperty('debit')) + self.assertEquals(100.00, line.getColumnProperty('credit')) + + # Stat Line + stat_line = line_list[-1] + self.failUnless(stat_line.isStatLine()) + self.assertEquals(100, stat_line.getColumnProperty('debit')) + self.assertEquals(100, stat_line.getColumnProperty('credit')) + + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestAccountingReports)) + return suite +