From 28c4e5530f062cc7c618c67810220e5126330d5e Mon Sep 17 00:00:00 2001 From: Stuart Longland Date: Fri, 23 Mar 2012 15:21:46 +1000 Subject: [PATCH 001/298] faces: Fix 24-hour and end-at-midnight timespans In cases where a working day either: - Spans 24 hours or - ends at midnight the time span calculation code incorrectly calculates the time of that day, either stating that the day is 0 minutes long, or worse, is negative. The following patch addresses this. Non-working days are specified using the Python 'None', or 'False' values, rather than specifying the same start and end time, as the latter will now be interpreted as a 24-hour period. bzr revid: me@vk4msl.yi.org-20120323052146-vosvz50lg12n7e1i --- addons/resource/faces/pcalendar.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/resource/faces/pcalendar.py b/addons/resource/faces/pcalendar.py index c82c49d4816..4b023911b1e 100644 --- a/addons/resource/faces/pcalendar.py +++ b/addons/resource/faces/pcalendar.py @@ -895,7 +895,16 @@ class Calendar(object): def _recalc_working_time(self): def slot_sum_time(day): slots = self.working_times.get(day, DEFAULT_WORKING_DAYS[day]) - return sum(map(lambda slot: slot[1] - slot[0], slots)) + def time_diff(times): + (start, end) = times + if end == start: + return 24*60 # 24 hours + + diff = end - start + if end < start: + diff += (24*60) + return diff + return sum(map(time_diff, slots)) self.day_times = map(slot_sum_time, range(0, 7)) self.week_time = sum(self.day_times) From 5c4dba40f74f09d5ff0856fb9904f61ff792656e Mon Sep 17 00:00:00 2001 From: Stuart Longland Date: Fri, 23 Mar 2012 15:22:50 +1000 Subject: [PATCH 002/298] resource: Convert working hours to UTC Faces assumes that all times are given in the same timezone. OpenERP uses UTC internally, and uses UTC when communicating task and project start/end times to faces. It unfortunately gives the working hours in local time. The following converts the time zone to UTC, assuming that the working hours are in the time zone of the currently logged-in user. (This will have to be fixed to convert each resources' calendar from the resource's local time zone to UTC.) bzr revid: me@vk4msl.yi.org-20120323052250-m03bth2dy755hw1p --- addons/resource/resource.py | 145 ++++++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 46 deletions(-) diff --git a/addons/resource/resource.py b/addons/resource/resource.py index fb3d8c0980e..b3bfcea9664 100644 --- a/addons/resource/resource.py +++ b/addons/resource/resource.py @@ -19,7 +19,7 @@ # ############################################################################## -from datetime import datetime, timedelta +from datetime import datetime, timedelta, time, date import math from faces import * from osv import fields, osv @@ -28,6 +28,7 @@ from tools.translate import _ from itertools import groupby from operator import itemgetter +import pytz class resource_calendar(osv.osv): _name = "resource.calendar" @@ -279,8 +280,9 @@ def convert_timeformat(time_string): hour_part = split_list[0] mins_part = split_list[1] round_mins = int(round(float(mins_part) * 60,-2)) - converted_string = hour_part + ':' + str(round_mins)[0:2] - return converted_string + return time(int(hour_part), round_mins) + #converted_string = hour_part + ':' + str(round_mins)[0:2] + #return converted_string class resource_resource(osv.osv): _name = "resource.resource" @@ -366,51 +368,102 @@ class resource_resource(osv.osv): Change the format of working calendar from 'Openerp' format to bring it into 'Faces' format. @param calendar_id : working calendar of the project """ + tz = pytz.utc + if context and ('tz' in context): + tz = pytz.timezone(context['tz']) + + wktime_local = None + week_days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] if not calendar_id: - # Calendar is not specified: working days: 24/7 - return [('fri', '8:0-12:0','13:0-17:0'), ('thu', '8:0-12:0','13:0-17:0'), ('wed', '8:0-12:0','13:0-17:0'), - ('mon', '8:0-12:0','13:0-17:0'), ('tue', '8:0-12:0','13:0-17:0')] - resource_attendance_pool = self.pool.get('resource.calendar.attendance') - time_range = "8:00-8:00" - non_working = "" - week_days = {"0": "mon", "1": "tue", "2": "wed","3": "thu", "4": "fri", "5": "sat", "6": "sun"} - wk_days = {} - wk_time = {} - wktime_list = [] + # Calendar is not specified: working days: some sane default + wktime_local = [ + (0, time(8,0), time(12,0)), + (0, time(13,0), time(17,0)), + (1, time(8,0), time(12,0)), + (1, time(13,0), time(17,0)), + (2, time(8,0), time(12,0)), + (2, time(13,0), time(17,0)), + (3, time(8,0), time(12,0)), + (3, time(13,0), time(17,0)), + (4, time(8,0), time(12,0)), + (4, time(13,0), time(17,0)), + ] + #return [('fri', '8:0-12:0','13:0-17:0'), ('thu', '8:0-12:0','13:0-17:0'), ('wed', '8:0-12:0','13:0-17:0'), + # ('mon', '8:0-12:0','13:0-17:0'), ('tue', '8:0-12:0','13:0-17:0')] + else: + resource_attendance_pool = self.pool.get('resource.calendar.attendance') + non_working = "" + wktime_local = [] + + week_ids = resource_attendance_pool.search(cr, uid, [('calendar_id', '=', calendar_id)], context=context) + weeks = resource_attendance_pool.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'], context=context) + # Convert time formats into appropriate format required + # and create lists inside wktime_local. + for week in weeks: + res_str = "" + day = None + if week['dayofweek']: + day = int(week['dayofweek']) + else: + raise osv.except_osv(_('Configuration Error!'),_('Make sure the Working time has been configured with proper week days!')) + hour_from = convert_timeformat(week['hour_from']) + hour_to = convert_timeformat(week['hour_to']) + wktime_local.append((day, hour_from, hour_to)) + + # We now have working hours _in local time_. Non-working days are an + # empty list, while working days are a list of tuples, consisting of a + # start time and an end time. We will convert these to UTC for time + # calculation purposes. + + # We need to get this into a dict + # which will be in the following format: + # { 'day': [(time(9,0), time(17,0)), ...], ... } + wktime_utc = {} + + # NOTE: This may break with regards to DST! + for (day, start, end) in wktime_local: + # Convert start time to UTC + start_dt_local = datetime.combine(date.today(), start.replace(tzinfo=tz)) + start_dt_utc = start_dt_local.astimezone(pytz.utc) + start_dt_day = (day + (start_dt_utc.date() - start_dt_local.date()).days) % 7 + + # Convert end time to UTC + end_dt_local = datetime.combine(date.today(), end.replace(tzinfo=tz)) + end_dt_utc = end_dt_local.astimezone(pytz.utc) + end_dt_day = (day + (end_dt_utc.date() - end_dt_local.date()).days) % 7 + + # Are start and end still on the same day? + if start_dt_day == end_dt_day: + day_name = week_days[start_dt_day] + if day_name not in wktime_utc: + wktime_utc[day_name] = [] + wktime_utc[day_name].append((start_dt_utc.time(), end_dt_utc.time())) + else: + day_start_name = week_days[start_dt_day] + if day_start_name not in wktime_utc: + wktime_utc[day_start_name] = [] + # We go until midnight that day + wktime_utc[day_start_name].append((start_dt_utc.time(), time(0,0))) + + day_end_name = week_days[end_dt_day] + if day_end_name not in wktime_utc: + wktime_utc[day_end_name] = [] + # Then resume from midnight that day + wktime_utc[day_end_name].append((time(0,0), end_dt_utc.time())) + + # Now having gotten a list of times together, generate the final output wktime_cal = [] - week_ids = resource_attendance_pool.search(cr, uid, [('calendar_id', '=', calendar_id)], context=context) - weeks = resource_attendance_pool.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'], context=context) - # Convert time formats into appropriate format required - # and create a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')] - for week in weeks: - res_str = "" - day = None - if week_days.get(week['dayofweek'],False): - day = week_days[week['dayofweek']] - wk_days[week['dayofweek']] = week_days[week['dayofweek']] - else: - raise osv.except_osv(_('Configuration Error!'),_('Make sure the Working time has been configured with proper week days!')) - hour_from_str = convert_timeformat(week['hour_from']) - hour_to_str = convert_timeformat(week['hour_to']) - res_str = hour_from_str + '-' + hour_to_str - wktime_list.append((day, res_str)) - # Convert into format like [('mon', '8:00-12:00', '13:00-18:00')] - for item in wktime_list: - if wk_time.has_key(item[0]): - wk_time[item[0]].append(item[1]) - else: - wk_time[item[0]] = [item[0]] - wk_time[item[0]].append(item[1]) - for k,v in wk_time.items(): - wktime_cal.append(tuple(v)) - # Add for the non-working days like: [('sat, sun', '8:00-8:00')] - for k, v in wk_days.items(): - if week_days.has_key(k): - week_days.pop(k) - for v in week_days.itervalues(): - non_working += v + ',' - if non_working: - wktime_cal.append((non_working[:-1], time_range)) + for day, times in wktime_utc.iteritems(): + # Sort the times + times.sort() + wktime = ['{0}-{1}'.format(s.strftime('%H:%M'), e.strftime('%H:%M')) for (s, e) in times] + wktime.insert(0, day) + wktime_cal.append(tuple(wktime)) + # Finally, add in non-working days + for day in week_days: + if day not in wktime_utc: + wktime_cal.append((day, None)) + return wktime_cal resource_resource() From 149800235092a70d8694bd1836d68c8f67d759b2 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 23 Oct 2012 13:13:01 +0200 Subject: [PATCH 003/298] [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 From 5815b2c2e4be4f915ec892cb808334e9c37e9125 Mon Sep 17 00:00:00 2001 From: "Bharat Devnani (OpenERP)" Date: Thu, 1 Nov 2012 13:02:08 +0530 Subject: [PATCH 004/298] [IMP] made compatible to version 7.0 bzr revid: bde@tinyerp.com-20121101073208-i1s4m2jca2qvraik --- .../{__terp__.py => __openerp__.py} | 0 addons/account_test/account_test_view.xml | 76 +++++++++---------- 2 files changed, 38 insertions(+), 38 deletions(-) rename addons/account_test/{__terp__.py => __openerp__.py} (100%) diff --git a/addons/account_test/__terp__.py b/addons/account_test/__openerp__.py similarity index 100% rename from addons/account_test/__terp__.py rename to addons/account_test/__openerp__.py diff --git a/addons/account_test/account_test_view.xml b/addons/account_test/account_test_view.xml index 8351cb0687a..5f0d7f45090 100644 --- a/addons/account_test/account_test_view.xml +++ b/addons/account_test/account_test_view.xml @@ -2,10 +2,9 @@ - - Tests - accounting.assert.test - tree + + Tests + accounting.assert.test @@ -14,43 +13,44 @@ - - - Tests - accounting.assert.test - form + + + Tests + accounting.assert.test -
- - - - - - - - - - - - - - - - + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+
+ + + Accounting Tests + accounting.assert.test + tree,form + + + - - Accounting Tests - accounting.assert.test - tree,form - - - - -
+
From d73ccce5ba6c15e1a93b3da4f8478b77ea58ee35 Mon Sep 17 00:00:00 2001 From: "Bharat Devnani (OpenERP)" Date: Thu, 1 Nov 2012 15:15:56 +0530 Subject: [PATCH 005/298] [IMP] improved module according to version 7 conventions bzr revid: bde@tinyerp.com-20121101094556-s05h6ymbrxdgjfk1 --- addons/account_test/__openerp__.py | 31 ++++++++++----------- addons/account_test/account_test_view.xml | 33 ++++++++++++++--------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/addons/account_test/__openerp__.py b/addons/account_test/__openerp__.py index 5578f0339ae..13328cddcb4 100644 --- a/addons/account_test/__openerp__.py +++ b/addons/account_test/__openerp__.py @@ -20,23 +20,24 @@ # ############################################################################## { - "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", + 'name' : 'Accounting Consistency Tests', + 'version' : '1.0', + 'author' : 'OpenERP', + 'category' : 'Test accounting', + 'website': 'http://www.openerp.com', + 'description': """Asserts on accounting + =====================""", + 'depends' : ['account'], + 'data' : [ + 'security/ir.model.access.csv', + 'account_test_view.xml', + 'account_test_report.xml', + 'account_test_data.xml', ], 'demo_xml': [ - "account_test_demo.xml", + 'account_test_demo.xml', ], - "active": False, - "installable": True + 'active': False, + 'installable': True } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_test/account_test_view.xml b/addons/account_test/account_test_view.xml index 5f0d7f45090..c6fc0c8294b 100644 --- a/addons/account_test/account_test_view.xml +++ b/addons/account_test/account_test_view.xml @@ -22,23 +22,32 @@ + - - + - -
- -
- - - -
- -
+ + + + + + + + + +
+Example: 
+sql = 'select id, name, ref, date from account_move_line where account_id in 
+(select id from account_account where type = 'view')'
+cr.execute(sql)
+result = cr.dictfetchall()
+                                    
+
+
+
From fa8f714a590206f7923ef62a88bc39fe1b70491f Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Thu, 8 Nov 2012 15:01:00 +0100 Subject: [PATCH 006/298] [WIP] imp crm tests bzr revid: abo@openerp.com-20121108140100-wmpa3ko8cpo840zq --- addons/crm/test/process/lead2opportunity2win.yml | 6 +++--- addons/crm/test/ui/crm_demo.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index dc5aadbcf16..d6f1c53de63 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -1,12 +1,12 @@ - - In order to test convert customer lead into opportunity, + In order to test the conversion of a lead into a opportunity, - - I open customer lead. + I open a lead. - !python {model: crm.lead}: | self.case_open(cr, uid, [ref("crm_case_4")]) - - I check lead state is "Open". + I check if the lead state is "Open". - !assert {model: crm.lead, id: crm.crm_case_4, string: Lead in open state}: - state == "open" diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml index 842b3a4e887..9154ffdf513 100644 --- a/addons/crm/test/ui/crm_demo.yml +++ b/addons/crm/test/ui/crm_demo.yml @@ -1,5 +1,5 @@ - - I create lead record to call of partner onchange, stage onchange and Mailing opt-in onchange method. + I create a lead record to call a partner onchange, stage onchange and mailing opt-in onchange method. - !record {model: crm.lead, id: crm_case_25}: name: 'Need more info about your pc2' @@ -8,7 +8,7 @@ stage_id: crm.stage_lead1 state: draft - - I create lead record to call Mailing opt-out onchange method. + I create a lead record to call a mailing opt-out onchange method. - !record {model: crm.lead, id: crm_case_18}: name: 'Need 20 Days of Consultancy' @@ -16,13 +16,13 @@ state: draft opt_out: True - - I create phonecall record to call partner onchange method. + I create a phonecall record to call a partner onchange method. - !record {model: crm.phonecall, id: crm_phonecall_5}: name: 'Bad time' partner_id: base.res_partner_5 - - I setting next stage "New" for the lead. + I set the next stage to "New" for the lead. - !python {model: crm.lead}: | self.stage_next(cr, uid, [ref("crm_case_4")], context={'stage_type': 'lead'}) From 9c3aefeb022f2b795a67779b46ed62dedbbf96f9 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Thu, 8 Nov 2012 18:58:41 +0100 Subject: [PATCH 007/298] [IMP] indentation bzr revid: abo@openerp.com-20121108175841-mf5c1jhywj07cvvk --- addons/crm/test/process/lead2opportunity2win.yml | 2 +- addons/crm/wizard/crm_lead_to_partner_view.xml | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index d6f1c53de63..0523c2d6296 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -8,7 +8,7 @@ - I check if the lead state is "Open". - - !assert {model: crm.lead, id: crm.crm_case_4, string: Lead in open state}: + !assert {model: crm.lead, id: crm.crm_case_4, string: Lead state is Open}: - state == "open" - I fill in a lead2partner wizard. diff --git a/addons/crm/wizard/crm_lead_to_partner_view.xml b/addons/crm/wizard/crm_lead_to_partner_view.xml index 21a14dd3726..136985dca65 100644 --- a/addons/crm/wizard/crm_lead_to_partner_view.xml +++ b/addons/crm/wizard/crm_lead_to_partner_view.xml @@ -1,9 +1,8 @@ - + - - - + + crm.lead2partner.view crm.lead2partner @@ -20,9 +19,8 @@ - + - Create a Partner @@ -33,5 +31,5 @@ new - + From bfc4d87f3145fe93f2918edaea31197b10a9576c Mon Sep 17 00:00:00 2001 From: "Hiral Patel (OpenERP)" Date: Fri, 9 Nov 2012 11:40:28 +0530 Subject: [PATCH 008/298] [IMP] move Email Notification on Answer boolean below Type field bzr revid: hip@tinyerp.com-20121109061028-9suru2afitw4wf57 --- addons/survey/survey_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml index f6920c68d34..36d6fb08b3a 100644 --- a/addons/survey/survey_view.xml +++ b/addons/survey/survey_view.xml @@ -45,8 +45,8 @@ - + From b15100587788448da36b8acb1201e013acc02106 Mon Sep 17 00:00:00 2001 From: "Hiral Patel (OpenERP)" Date: Fri, 9 Nov 2012 11:52:30 +0530 Subject: [PATCH 009/298] [IMP] Resize Type field to fit Responsible field bzr revid: hip@tinyerp.com-20121109062230-yspb3pivwwggulm6 --- addons/survey/survey_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml index 36d6fb08b3a..3c2e6055416 100644 --- a/addons/survey/survey_view.xml +++ b/addons/survey/survey_view.xml @@ -45,7 +45,7 @@ - + From f3377ee338daf8863ef1e0add8dc1f9eb7fc1c27 Mon Sep 17 00:00:00 2001 From: "Pinakin Nayi (OpenERP)" Date: Fri, 9 Nov 2012 12:09:12 +0530 Subject: [PATCH 010/298] [IMP] improve module bzr revid: pna@tinyerp.com-20121109063912-7g5jy22j3fx2vxu8 --- addons/account_test/__openerp__.py | 2 +- addons/account_test/account_test_view.xml | 7 ++++++- addons/account_test/report/__init__.py | 2 ++ addons/account_test/report/account_test_report.py | 1 + addons/account_test/security/ir.model.access.csv | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/account_test/__openerp__.py b/addons/account_test/__openerp__.py index 13328cddcb4..b755d4aa872 100644 --- a/addons/account_test/__openerp__.py +++ b/addons/account_test/__openerp__.py @@ -34,7 +34,7 @@ 'account_test_report.xml', 'account_test_data.xml', ], - 'demo_xml': [ + 'demo': [ 'account_test_demo.xml', ], 'active': False, diff --git a/addons/account_test/account_test_view.xml b/addons/account_test/account_test_view.xml index c6fc0c8294b..bcedebf0eeb 100644 --- a/addons/account_test/account_test_view.xml +++ b/addons/account_test/account_test_view.xml @@ -29,7 +29,7 @@ - + @@ -57,6 +57,11 @@ result = cr.dictfetchall() Accounting Tests accounting.assert.test tree,form + +

+ Click to create Accounting Test. +

+
diff --git a/addons/account_test/report/__init__.py b/addons/account_test/report/__init__.py index 21a4929330b..0e4fbf07082 100644 --- a/addons/account_test/report/__init__.py +++ b/addons/account_test/report/__init__.py @@ -1 +1,3 @@ import account_test_report + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_test/report/account_test_report.py b/addons/account_test/report/account_test_report.py index 79a52611756..66d5043412f 100644 --- a/addons/account_test/report/account_test_report.py +++ b/addons/account_test/report/account_test_report.py @@ -103,3 +103,4 @@ class report_assert_account(report_sxw.rml_parse): 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) +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_test/security/ir.model.access.csv b/addons/account_test/security/ir.model.access.csv index fb90ba43825..95f2336f80b 100644 --- a/addons/account_test/security/ir.model.access.csv +++ b/addons/account_test/security/ir.model.access.csv @@ -1,3 +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 +"access_accounting_assert_test_manager","accounting.assert.test","model_accounting_assert_test",account.group_account_manager,1,0,0,0 From 33eca6f1d64528ea6aec40194c109f163f68de12 Mon Sep 17 00:00:00 2001 From: "Hiral Patel (OpenERP)" Date: Fri, 9 Nov 2012 12:49:47 +0530 Subject: [PATCH 011/298] [IMP] Answer Survey action button should be red after sending a request bzr revid: hip@tinyerp.com-20121109071947-i25qvwx118iqn8p2 --- addons/hr_evaluation/hr_evaluation_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml index e0978847acb..d2cb0bd8ee5 100644 --- a/addons/hr_evaluation/hr_evaluation_view.xml +++ b/addons/hr_evaluation/hr_evaluation_view.xml @@ -290,7 +290,7 @@