From 149800235092a70d8694bd1836d68c8f67d759b2 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 23 Oct 2012 13:13:01 +0200 Subject: [PATCH] [ADD] account_test bzr revid: qdp-launchpad@openerp.com-20121023111301-c41qvtxm1l5p0nq0 --- addons/account_test/__init__.py | 2 + addons/account_test/__terp__.py | 42 +++ addons/account_test/account_test.py | 65 +++++ addons/account_test/account_test_data.xml | 175 ++++++++++++ addons/account_test/account_test_demo.xml | 29 ++ addons/account_test/account_test_report.xml | 14 + addons/account_test/account_test_view.xml | 56 ++++ addons/account_test/i18n/fr_FR.po | 264 ++++++++++++++++++ addons/account_test/report/__init__.py | 1 + addons/account_test/report/account_test.rml | 78 ++++++ .../report/account_test_report.py | 105 +++++++ .../account_test/security/ir.model.access.csv | 3 + 12 files changed, 834 insertions(+) create mode 100644 addons/account_test/__init__.py create mode 100644 addons/account_test/__terp__.py create mode 100644 addons/account_test/account_test.py create mode 100644 addons/account_test/account_test_data.xml create mode 100644 addons/account_test/account_test_demo.xml create mode 100644 addons/account_test/account_test_report.xml create mode 100644 addons/account_test/account_test_view.xml create mode 100644 addons/account_test/i18n/fr_FR.po create mode 100644 addons/account_test/report/__init__.py create mode 100644 addons/account_test/report/account_test.rml create mode 100644 addons/account_test/report/account_test_report.py create mode 100644 addons/account_test/security/ir.model.access.csv diff --git a/addons/account_test/__init__.py b/addons/account_test/__init__.py new file mode 100644 index 00000000000..106682f4a12 --- /dev/null +++ b/addons/account_test/__init__.py @@ -0,0 +1,2 @@ +import account_test +import report diff --git a/addons/account_test/__terp__.py b/addons/account_test/__terp__.py new file mode 100644 index 00000000000..5578f0339ae --- /dev/null +++ b/addons/account_test/__terp__.py @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (c) 2011 CCI Connect asbl (http://www.cciconnect.be) All Rights Reserved. +# Philmer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + "name" : "OpenERP", + "version" : "1.0", + "author" : "OpenERP", + "category" : "Test accounting", + "website": "http://www.openerp.com", + "description": "Asserts on accounting", + "depends" : ["account"], + "update_xml" : [ + "account_test_view.xml", + "account_test_report.xml", + "security/ir.model.access.csv", + "account_test_data.xml", + ], + 'demo_xml': [ + "account_test_demo.xml", + ], + "active": False, + "installable": True +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_test/account_test.py b/addons/account_test/account_test.py new file mode 100644 index 00000000000..069ba6601e4 --- /dev/null +++ b/addons/account_test/account_test.py @@ -0,0 +1,65 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2005-2006 TINY SPRL. (http://tiny.be) All Rights Reserved. +# +# $Id: product_expiry.py 4304 2006-10-25 09:54:51Z ged $ +# +# 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. +# +############################################################################## + +from osv import fields,osv +import pooler +import netsvc +import time +from xml import dom + + +CODE_EXEC_DEFAULT = '''\ +res = [] +cr.execute("select id, code from account_journal") +for record in cr.dictfetchall(): + res.append(record['code']) +result = res +''' + +class accounting_assert_test(osv.osv): + _name = "accounting.assert.test" + _order = "sequence" + + _columns = { + 'name': fields.char('Test Name', size=256, required=True, select=True, translate=True), + 'desc': fields.text('Test Description', select=True, translate=True), + 'code_exec': fields.text('Python code or SQL query', required=True), + 'active': fields.boolean('Active'), + 'sequence': fields.integer('Sequence'), + } + + _defaults = { + 'code_exec': lambda *a: CODE_EXEC_DEFAULT, + 'active': lambda *a: True, + 'sequence': lambda *a: 10, + } + +accounting_assert_test() + diff --git a/addons/account_test/account_test_data.xml b/addons/account_test/account_test_data.xml new file mode 100644 index 00000000000..453d8184b9e --- /dev/null +++ b/addons/account_test/account_test_data.xml @@ -0,0 +1,175 @@ + + + + + + 1 + Test 1: General balance + Check the balance: Debit sum = Credit sum + + + + + 2 + Test 2: Opening a fiscal year + Check if the balance of the new opened fiscal year matches with last year's balance + + + + + 3 + Test 3: Movement lines + Check if movement lines are balanced and have the same date and period + 0 or am.period_id!=ml.period_id or (am.date!=ml.date) +""" +cr.execute(sql) +res = cr.dictfetchall() +if res: + res.insert(0,_('* The test failed for these movement lines:')) + result = res + +]]> + + + + 4 + Test 4: Totally reconciled mouvements + Check if the totally reconciled movements are balanced + 0", (record['reconcile_id'],)) + reconcile_ids=cr.dictfetchall() + if reconcile_ids: + res.append(', '.join(["Reconcile name: %(name)s, id=%(id)s " % r for r in reconcile_ids])) +result = res +if result: + res.insert(0,_('* The test failed for these reconciled items(id/name):')) +]]> + + + + 5 + Test 5.1 : Payable and Receivable accountant lines of reconciled invoices + Check that reconciled invoice for Sales/Purchases has reconciled entries for Payable and Receivable Accounts + + + + + + 6 + Test 5.2 : Reconcilied invoices and Payable/Receivable accounts + Check that reconciled account moves, that define Payable and Receivable accounts, are belonging to reconciled invoices + + + + + 7 + Test 6 : Invoices status + Check that paid/reconciled invoices are not in 'Open' state + + + + + + 8 + Test 7: « View  » account type + Check that there's no move for any account with « View » account type + + + + + 9 + Test 8 : Closing balance on bank statements + Check on bank statement that the Closing Balance = Starting Balance + sum of statement lines + 0.000000001;") +result = cr.dictfetchall() +if result: + result.insert(0,_('* Unbalanced bank statement that need to be checked: ')) +]]> + + + + 10 + Test 9 : Accounts and partners on account moves + Check that general accounts and partners on account moves are active + + + + diff --git a/addons/account_test/account_test_demo.xml b/addons/account_test/account_test_demo.xml new file mode 100644 index 00000000000..d10182f61b8 --- /dev/null +++ b/addons/account_test/account_test_demo.xml @@ -0,0 +1,29 @@ + + + + + + Test 1 + Test 1 + + 0""" +cr.execute(sql) +result = cr.dictfetchall() +]]> + + + + diff --git a/addons/account_test/account_test_report.xml b/addons/account_test/account_test_report.xml new file mode 100644 index 00000000000..480507b6072 --- /dev/null +++ b/addons/account_test/account_test_report.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/addons/account_test/account_test_view.xml b/addons/account_test/account_test_view.xml new file mode 100644 index 00000000000..8351cb0687a --- /dev/null +++ b/addons/account_test/account_test_view.xml @@ -0,0 +1,56 @@ + + + + + + Tests + accounting.assert.test + tree + + + + + + + + + + + Tests + accounting.assert.test + form + +
+ + + + + + + + + + + + + + + + + +
+
+ + + Accounting Tests + accounting.assert.test + tree,form + + + + +
+
diff --git a/addons/account_test/i18n/fr_FR.po b/addons/account_test/i18n/fr_FR.po new file mode 100644 index 00000000000..6266ff9fa54 --- /dev/null +++ b/addons/account_test/i18n/fr_FR.po @@ -0,0 +1,264 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_test +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 5.0.16\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2011-11-13 15:05:26+0000\n" +"PO-Revision-Date: 2011-11-13 15:05:26+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_test +#: field:accounting.assert.test,desc:0 +msgid "Test Description" +msgstr "Test Description" + +#. module: account_test +#: constraint:ir.model:0 +msgid "The Object name must start with x_ and not contain any special character !" +msgstr "Le nom de l'object doit commencer par x_ et ne doit pas contenir de caractères spéciaux !" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_02 +msgid "Test 2: Opening a fiscal year" +msgstr "Test 2: Ouverture d'une année fiscale" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_03 +msgid "Check if movement lines are balanced and have the same date and period" +msgstr "Vérifier que les lignes d'un même mouvement sont balancées, avec la même période et la même date" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_09_1 +msgid "Test 9.1 : Gap in Invoices sequence" +msgstr "Test 9: Trous dans la numérotation des factures" + +#. module: account_test +#: model:ir.actions.report.xml,name:account_test.account_assert_test_report +msgid "Accounting Tests" +msgstr "Tests Comptables" + +#. module: account_test +#: field:accounting.assert.test,name:0 +msgid "Test Name" +msgstr "Nom du test" + +#. module: account_test +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Modèle non valide pour le définition de l'action" + +#. module: account_test +#: field:accounting.assert.test,code_exec:0 +msgid "Python code or SQL query" +msgstr "Code Python ou requête SQL" + +#. module: account_test +#: rml:account.test.assert.print:0 +msgid "Accouting tests on" +msgstr "Tests comptables sur" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_06 +msgid "Check that paid/reconciled invoices are not in 'Open' state" +msgstr "Vérifier que les factures paid/reconcilied ne sont pas 'open'" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_11_2 +msgid "Test 11.2: Analytical moves" +msgstr "Test 11.2: Lignes analytiques" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_09_2 +msgid "Check that there's no gap in Bank Stetement sequence" +msgstr "Test 9: Trous dans la numérotation des extraits de comptes" + +#. module: account_test +#: view:accounting.assert.test:0 +msgid "Tests" +msgstr "Tests" + +#. module: account_test +#: view:accounting.assert.test:0 +msgid "Expression to evaluate" +msgstr "Expression à évaluer" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_06_1 +msgid "Check that there's no move for any account with « View » account type" +msgstr "Vérifier qu'il n'y a pas de mouvements sur des comptes de type 'vue'" + +#. module: account_test +#: model:ir.actions.act_window,name:account_test.action_accounting_assert +#: model:ir.ui.menu,name:account_test.menu_action_license +msgid "Accounting Tests" +msgstr "Tests Comptables" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_09_2 +msgid "Test 9.2 : Gap in Bank Statement sequence" +msgstr "Test 9.2 : Trous dans la numérotation des extraits de comptes" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_01 +msgid "Test 1: General balance" +msgstr "Test 1: Balance Générale" + +#. module: account_test +#: model:ir.module.module,description:account_test.module_meta_information +msgid "Asserts on accounting" +msgstr "Asserts on accounting" + +#. module: account_test +#: code:addons/account_test/report/account_test_report.py:0 +#, python-format +msgid "The test was passed successfully" +msgstr "Le test est passé avec succès" + +#. module: account_test +#: field:accounting.assert.test,active:0 +msgid "Active" +msgstr "Active" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_06 +msgid "Test 6 : Invoices status" +msgstr "Test 6: vérifier les factures" + +#. module: account_test +#: model:ir.model,name:account_test.model_accounting_assert_test +msgid "accounting.assert.test" +msgstr "accounting.assert.test" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_05_2 +msgid "Check that reconciled account moves, that define Payable and Receivable accounts, are belonging to reconciled invoices" +msgstr "Vérifier que les lignes de factures d'achat/vente réconciliées ont des écritures pour les comptes payables et recevables réconciliées" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_11_2 +msgid "Check that amounts by analytical plan are equals to the amount of account move line" +msgstr "Vérifier que les montants par plan analytique sont égaux au montant de la ligne du mouvement comptable" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_11_1 +msgid "Check that each account move line has at least 3 analytical moves" +msgstr "Vérifier que chaque ligne d'un mouvement comptable a au moins 3 lignes analytiques" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_07 +msgid "Test 8 : Closing balance on bank statements" +msgstr "Test 8 : Vérification des lignes financières des extraits de comptes" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_07 +msgid "Check on bank statement that the Closing Balance = Starting Balance + sum of statement lines" +msgstr "Vérifier que le solde de fin est égal au solde de début + la somme des mouvements" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_05 +msgid "Test 5.1 : Payable and Receivable lines accounts of reconciled invoices" +msgstr "Test 5.1 : Vérification des lignes des comptes payables et recevables des factures réconciliées" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_03 +msgid "Test 3: Movement lines" +msgstr "Test 3: Mouvements comptables" + +#. module: account_test +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "XML Invalide pour cette vue" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_11_1 +msgid "Test 11.1: Analytical moves" +msgstr "Test 11.1: Mouvements analytiques" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_05_2 +msgid "Test 5.2 : Reconcilied invoices and Payable/Receivable accounts" +msgstr "Test 5.2 : Factures réconciliées et les lignes des comptes payables et recevables non réconciliées " + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_15 +msgid "Test 15 : Analytical moves for Analytic multi plan" +msgstr "Test 15 : Mouvements analytiques" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_15 +msgid "Check that analytic accounts used on lines are present in analytic sections of different plans" +msgstr "Vérifier que les centres de coûts présents dans les lignes sont bien présents dans les sections analytiques des différents plans" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_04 +msgid "Test 4: Totally reconciled mouvements" +msgstr "Test 4: Vérification des reconcile complets" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_04 +msgid "Check if the totally reconciled movements are balanced" +msgstr "Vérification des reconcile complets" + +#. module: account_test +#: field:accounting.assert.test,sequence:0 +msgid "Sequence" +msgstr "Séquence" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_02 +msgid "Check if the balance of the new opened fiscal year matches with last year's balance" +msgstr "Vérifier que l'ouverture d'une année fiscale correspond au solde de l'année passée" + +#. module: account_test +#: view:accounting.assert.test:0 +msgid "Python Code" +msgstr "Code Python" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_08 +msgid "Test 9 : Accounts and partners on account moves" +msgstr "Test 9 : Comptes et partenaires sur les mouvements comptables" + +#. module: account_test +#: model:accounting.assert.test,name:account_test.account_test_06_1 +msgid "Test 7: « View  » account type" +msgstr "Test 7: mouvements sur comptes type 'vue'" + +#. module: account_test +#: model:ir.module.module,shortdesc:account_test.module_meta_information +msgid "OpenERP" +msgstr "OpenERP" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_05 +msgid "Check that reconciled invoice for Sales/Purchases has reconciled entries for Payable and Receivable Accounts" +msgstr "Vérifier que les factures réconcilées ont des écritures comptables sur les comptes payables ou recevables réconciliées" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_09_1 +msgid "Check that there's no gap in invoices sequence" +msgstr "Vérifier que les factures n'ont pas de trous dans leur numérotation" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_01 +msgid "Check the balance: Debit sum = Credit sum" +msgstr "Vérifier la balance générale: somme débit = somme crédit" + +#. module: account_test +#: model:accounting.assert.test,desc:account_test.account_test_14 +msgid "Check that general accounts and partners on account moves are active" +msgstr "Vérifier que les comptes généraux ainsi que les partenaires renseignés sur les mouvements comptables sont actifs" + +#. module: account_test +#: view:accounting.assert.test:0 +msgid "Code Help" +msgstr "Code Help" + diff --git a/addons/account_test/report/__init__.py b/addons/account_test/report/__init__.py new file mode 100644 index 00000000000..21a4929330b --- /dev/null +++ b/addons/account_test/report/__init__.py @@ -0,0 +1 @@ +import account_test_report diff --git a/addons/account_test/report/account_test.rml b/addons/account_test/report/account_test.rml new file mode 100644 index 00000000000..1efa12fd5cb --- /dev/null +++ b/addons/account_test/report/account_test.rml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accouting tests on [[ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ]] + + + +
+ [[repeatIn(objects,'o')]] + + + + [[ o.name ]] + + + + + [[ o.desc or '' ]] + + + + + + + [[ repeatIn(execute_code(o.code_exec), 'test_result') ]] + [[ test_result ]] + + + + + + +
+ +
+
diff --git a/addons/account_test/report/account_test_report.py b/addons/account_test/report/account_test_report.py new file mode 100644 index 00000000000..79a52611756 --- /dev/null +++ b/addons/account_test/report/account_test_report.py @@ -0,0 +1,105 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved +# $Id$ +# +# 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 3 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, see . +# +############################################################################## + +import datetime +import time +import re +from report import report_sxw +from itertools import groupby +from operator import itemgetter +from tools.translate import _ +# +# Use period and Journal for selection or resources +# +class report_assert_account(report_sxw.rml_parse): + def __init__(self, cr, uid, name, context): + super(report_assert_account, self).__init__(cr, uid, name, context=context) + self.localcontext.update( { + 'time': time, + 'datetime': datetime, + 'execute_code': self.execute_code, + }) + + def execute_code(self, code_exec): + def group(lst, col): + return dict((k, [v for v in itr]) for k, itr in groupby(sorted(lst, key=lambda x: x[col]), itemgetter(col))) + + def sort_by_intified_num(a, b): + if a is None: + return -1 + elif b is None: + return 1 + else: + #if a is not None and b is not None: + return cmp(int(a), int(b)) + + def reconciled_inv(): + reconciled_inv_ids = self.pool.get('account.invoice').search(self.cr, self.uid, [('reconciled','=',True)]) + return reconciled_inv_ids + + + def get_parent(acc_id): + acc_an_id = self.pool.get('account.analytic.account').browse(self.cr, self.uid, acc_id).parent_id + while acc_an_id.parent_id: + acc_an_id = acc_an_id.parent_id + return acc_an_id.id + + def order_columns(item, cols=None): + if cols is None: + cols = item.keys() + return [(col, item.get(col)) for col in cols if col in item.keys()] + + localdict = { + 'cr': self.cr, + '_': _, + 'reconciled_inv' : reconciled_inv, + 'group' : group, + 'get_parent' : get_parent, + 'now': datetime.datetime.now(), + 'result': None, + 'column_order': None, + } + + exec code_exec in localdict + + result = localdict['result'] + column_order = localdict.get('column_order', None) + + if not isinstance(result, (tuple, list, set)): + result = [result] + + if not result: + result = [_('The test was passed successfully')] + elif all([isinstance(x, dict) for x in result]): + result = [', '.join(["%s: %s" % (k, v) for k, v in order_columns(rec, column_order)]) for rec in result] + else: + def _format(a): + if isinstance(a, dict): + return ', '.join(["%s: %s" % (tup[0], tup[1]) for tup in order_columns(a, column_order)]) + else: + return a + result = [_format(rec) for rec in result] + + return result + +report_sxw.report_sxw('report.account.test.assert.print', 'accounting.assert.test', 'addons/account_test/report/account_test.rml', parser=report_assert_account, header=False) + diff --git a/addons/account_test/security/ir.model.access.csv b/addons/account_test/security/ir.model.access.csv new file mode 100644 index 00000000000..fb90ba43825 --- /dev/null +++ b/addons/account_test/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_accounting_assert_test","accounting.assert.test","model_accounting_assert_test",base.group_system,1,1,1,1 +"access_accounting_assert_test","accounting.assert.test","model_accounting_assert_test",account.group_account_manager,1,0,0,0