diff --git a/product/ERP5/tests/testTaskReporting.py b/product/ERP5/tests/testTaskReporting.py
new file mode 100644
index 0000000000000000000000000000000000000000..c4da60ae6bf0cd3dccd17183f87db4c869e04c25
--- /dev/null
+++ b/product/ERP5/tests/testTaskReporting.py
@@ -0,0 +1,326 @@
+#############################################################################
+#
+# Copyright  2008 Nexedi SA Contributors. All Rights Reserved.
+#              Sebastien Robin <seb@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.
+#
+##############################################################################
+
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5ReportTestCase
+from Products.ERP5Type.tests.utils import reindex
+import transaction
+from DateTime import DateTime
+
+class TestTaskReporting(ERP5ReportTestCase):
+  """Test Task Reporting
+  """
+  def getTitle(self):
+    return "Task Reporting"
+
+  def getBusinessTemplateList(self):
+    """Returns list of BT to be installed."""
+    return ('erp5_base','erp5_pdm', 'erp5_trade', 'erp5_project',)
+
+  @reindex
+  def _makeOneTask(self, simulation_state='planned', **kw):
+    """Create a task, support many options"""
+    task_module = self.getPortalObject().task_module
+    task = task_module.newContent(portal_type='Task', **kw)
+    if simulation_state == 'planned':
+      task.plan()
+    if simulation_state == 'confirmed':
+      task.confirm()
+
+  def afterSetUp(self):
+    """Setup the fixture.
+    """
+    self.portal = self.getPortal()
+
+    for rule_id in ['default_order_rule', 'default_delivery_rule']:
+      rule = getattr(self.portal.portal_rules, rule_id)
+      if rule.getValidationState() == 'draft':
+        rule.validate()
+
+    # create organisations
+    if not self.portal.organisation_module.has_key('Organisation_1'):
+      org = self.portal.organisation_module.newContent(
+                              portal_type='Organisation',
+                              reference='Organisation_1',
+                              title='Organisation_1',
+                              id='Organisation_1')
+
+    if not self.portal.organisation_module.has_key('Organisation_2'):
+      org = self.portal.organisation_module.newContent(
+                              portal_type='Organisation',
+                              reference='Organisation_2',
+                              title='Organisation_2',
+                              id='Organisation_2')
+
+    # create persons
+    if not self.portal.organisation_module.has_key('Person_1'):
+      org = self.portal.person_module.newContent(
+                              portal_type='Person',
+                              reference='Person_1',
+                              title='Person_1',
+                              id='Person_1')
+    if not self.portal.organisation_module.has_key('Person_2'):
+      org = self.portal.person_module.newContent(
+                              portal_type='Person',
+                              reference='Person_2',
+                              title='Person_2',
+                              id='Person_2')
+
+    # create project
+    if not self.portal.project_module.has_key('Project_1'):
+      project = self.portal.project_module.newContent(
+                              portal_type='Project',
+                              reference='Project_1',
+                              title='Project_1',
+                              start_date=DateTime('2009/01/01'),
+                              stop_date=DateTime('2009/12/31'),
+                              id='Project_1')
+      project.newContent(portal_type='Project Line',
+                         id='Line_1',
+                         title='Line_1')
+      project.newContent(portal_type='Project Line',
+                         id='Line_2',
+                         title='Line_2')
+    if not self.portal.organisation_module.has_key('Project_2'):
+      project = self.portal.project_module.newContent(
+                              portal_type='Project',
+                              reference='Project_2',
+                              title='Project_2',
+                              start_date=DateTime('2009/01/01'),
+                              stop_date=DateTime('2009/12/31'),
+                              id='Project_2')
+
+    # create unit categories
+    for unit_id in ('day', 'hour',):
+      if not self.portal.portal_categories['quantity_unit'].has_key(unit_id):
+        self.portal.portal_categories.quantity_unit.newContent(
+                                  portal_type='Category',
+                                  title=unit_id.title(),
+                                  reference=unit_id,
+                                  id=unit_id)
+
+    # Create resources
+    module = self.portal.product_module
+    if not module.has_key('development'):
+      product = module.newContent(
+          portal_type='Product',
+          id='development',
+          title='Development',
+          reference='ref 1',
+          quantity_unit='unit'
+          )
+    if not module.has_key('consulting'):
+      product = module.newContent(
+          portal_type='Product',
+          id='consulting',
+          title='Consulting',
+          reference='ref 2',
+          quantity_unit='unit'
+          )
+
+    # and all this available to catalog
+    transaction.commit()
+    self.tic()
+
+  def beforeTearDown(self):
+    """Remove all documents.
+    """
+    transaction.abort()
+
+    portal = self.getPortal()
+    portal.task_module.manage_delObjects(
+                      list(portal.task_module.objectIds()))
+    portal.task_report_module.manage_delObjects(
+                      list(portal.task_report_module.objectIds()))
+    portal.portal_simulation.manage_delObjects(
+                      list(portal.portal_simulation.objectIds()))
+
+    transaction.commit()
+    self.tic()
+
+  def testProjectMontlyReport(self):
+    """
+    Check monthly report available on project
+    """
+    # Create Tasks
+    self._makeOneTask(
+              title='Task 1',
+              task_line_quantity=3,
+              resource='product_module/development',
+              source='person_module/Person_1',
+              source_section='organisation_module/Organisation_1',
+              destination='organisation_module/Organisation_2',
+              destination_section='organisation_module/Organisation_2',
+              source_project='project_module/Project_1/Line_1',
+              start_date=DateTime('2009/07/23'),
+              stop_date=DateTime('2009/07/26'),
+              )
+
+    request = self.portal.REQUEST
+    request['from_date'] = DateTime('2009/07/01')
+    request['at_date'] = DateTime('2009/07/31')
+    request['report_depth'] = 5
+    report_section_list = self.getReportSectionList(
+        self.portal.project_module.Project_1,
+        'Project_viewMonthlyReport')
+    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()]
+    self.assertEquals(2, len(data_line_list))
+    self.checkLineProperties(data_line_list[0],
+                   **{'person_module/Person_1': 3.0,
+                      })
+    self.checkLineProperties(data_line_list[1],
+                   **{'person_module/Person_1': 3.0,
+                      })
+
+    request = self.portal.REQUEST
+    request.form['from_date'] = DateTime('2009/07/01')
+    request.form['at_date'] = DateTime('2009/07/30')
+    request.form['report_depth'] = 5
+    report_section_list = self.getReportSectionList(
+        self.portal.project_module.Project_1,
+        'Project_viewMonthlyReport')
+    self.assertEquals(1, len(report_section_list))
+
+    # We should have this result
+    # month             Person1
+    # 2009-07             3
+    #   Project1/Line1    3
+    line_list = self.getListBoxLineList(report_section_list[0])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    self.assertEquals(2, len(data_line_list))
+    self.checkLineProperties(data_line_list[0],
+                   **{'person_module/Person_1': 3.0,
+                      })
+    self.checkLineProperties(data_line_list[1],
+                   **{'person_module/Person_1': 3.0,
+                      })
+    # Create Tasks
+    self._makeOneTask(
+              title='Task 2',
+              task_line_quantity=5,
+              resource='product_module/development',
+              source='person_module/Person_1',
+              source_section='organisation_module/Organisation_1',
+              destination='organisation_module/Organisation_2',
+              destination_section='organisation_module/Organisation_2',
+              source_project='project_module/Project_1/Line_2',
+              start_date=DateTime('2009/08/02'),
+              stop_date=DateTime('2009/08/07'),
+              )
+    self._makeOneTask(
+              title='Task 3',
+              task_line_quantity=7,
+              resource='product_module/development',
+              source='person_module/Person_1',
+              source_section='organisation_module/Organisation_1',
+              destination='organisation_module/Organisation_2',
+              destination_section='organisation_module/Organisation_2',
+              source_project='project_module/Project_1/Line_2',
+              start_date=DateTime('2009/08/20'),
+              stop_date=DateTime('2009/08/30'),
+              simulation_state='confirmed',
+              )
+    self._makeOneTask(
+              title='Task 4',
+              task_line_quantity=11,
+              resource='product_module/development',
+              source='person_module/Person_1',
+              source_section='organisation_module/Organisation_1',
+              destination='organisation_module/Organisation_2',
+              destination_section='organisation_module/Organisation_2',
+              source_project='project_module/Project_1/Line_1',
+              start_date=DateTime('2009/08/20'),
+              stop_date=DateTime('2009/08/30'),
+              simulation_state='confirmed',
+              )
+    # And also a task splitted between two months
+    self._makeOneTask(
+              title='Task 5',
+              task_line_quantity=13,
+              resource='product_module/development',
+              source='person_module/Person_2',
+              source_section='organisation_module/Organisation_1',
+              destination='organisation_module/Organisation_2',
+              destination_section='organisation_module/Organisation_2',
+              source_project='project_module/Project_1/Line_2',
+              start_date=DateTime('2009/07/01'),
+              stop_date=DateTime('2009/08/31'),
+              )
+
+    # We should have this result
+    # month             Person1  Person2
+    # 2009-07             3         6.5
+    #   Project1/Line1    3         0
+    #   Project1/Line2    0         6.5
+    # 2009-08             23        6.5
+    #   Project1/Line2    11        0
+    #   Project1/Line2    12        6.5
+    # 2009-09             0         0
+    request = self.portal.REQUEST
+    request['from_date'] = DateTime('2009/07/01')
+    request['at_date'] = DateTime('2009/09/30')
+    request['report_depth'] = 5
+    request.form['month_dict'] = None
+    report_section_list = self.getReportSectionList(
+        self.portal.project_module.Project_1,
+        'Project_viewMonthlyReport')
+    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()]
+    self.assertEquals(7, len(data_line_list))
+    self.checkLineProperties(data_line_list[0],
+                   **{'person_module/Person_1': 3.0,
+                      'person_module/Person_2': 6.5,
+                      })
+    self.checkLineProperties(data_line_list[1],
+                   **{'person_module/Person_1': 3.0,
+                      'person_module/Person_2': None,
+                      })
+    self.checkLineProperties(data_line_list[2],
+                   **{'person_module/Person_1': None,
+                      'person_module/Person_2': 6.5,
+                      })
+    self.checkLineProperties(data_line_list[3],
+                   **{'person_module/Person_1': 23,
+                      'person_module/Person_2': 6.5,
+                      })
+    self.checkLineProperties(data_line_list[4],
+                   **{'person_module/Person_1': 11,
+                      'person_module/Person_2': None,
+                      })
+    self.checkLineProperties(data_line_list[5],
+                   **{'person_module/Person_1': 12,
+                      'person_module/Person_2': 6.5,
+                      })
+    self.checkLineProperties(data_line_list[6],
+                   **{'person_module/Person_1': None,
+                      'person_module/Person_2': None,
+                      })
diff --git a/product/ERP5Type/tests/ERP5TypeTestCase.py b/product/ERP5Type/tests/ERP5TypeTestCase.py
index e363950d664dc9fe7e50b69f30e085255b69d0db..e3ef6c50f7bf8a64cd9d0c9c1123ca3ff1d3281b 100644
--- a/product/ERP5Type/tests/ERP5TypeTestCase.py
+++ b/product/ERP5Type/tests/ERP5TypeTestCase.py
@@ -951,6 +951,7 @@ class ERP5ReportTestCase(ERP5TypeTestCase):
     here = report_section.getObject(self.portal)
     report_section.pushReport(self.portal)
     form = getattr(here, report_section.getFormId())
+    self.portal.REQUEST['here'] = here
     if form.has_field('listbox'):
       result = form.listbox.get_value('default',
                                       render_format='list',
@@ -969,7 +970,6 @@ class ERP5ReportTestCase(ERP5TypeTestCase):
     if diff_list:
       self.fail('Lines differs:\n' + '\n'.join(diff_list))
 
-
 from unittest import _makeLoader, TestSuite
 
 def dummy_makeSuite(testCaseClass, prefix='dummy_test', sortUsing=cmp, suiteClass=TestSuite):