[Erp5-report] r19411 - /erp5/trunk/products/ERP5/tests/testCrmReports.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Feb 19 18:04:29 CET 2008


Author: jerome
Date: Tue Feb 19 18:04:28 2008
New Revision: 19411

URL: http://svn.erp5.org?rev=19411&view=rev
Log:
Test for new CRM reports originally made by daniel with the help of thierry.


Added:
    erp5/trunk/products/ERP5/tests/testCrmReports.py

Added: erp5/trunk/products/ERP5/tests/testCrmReports.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testCrmReports.py?rev=19411&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/tests/testCrmReports.py (added)
+++ erp5/trunk/products/ERP5/tests/testCrmReports.py Tue Feb 19 18:04:28 2008
@@ -1,0 +1,2197 @@
+#############################################################################
+#
+# Copyright  2007 Nexedi SA Contributors. All Rights Reserved.
+#              Thierry Brettnacher <tb at nexedi.com>
+#              Daniel Feliubadalo <daniel at sip2000.com>
+#              Jerome Perrin <jerome at 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 Crm Reports
+"""
+import unittest
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.utils import reindex
+from AccessControl.SecurityManagement import newSecurityManager
+from DateTime import DateTime
+
+class CrmTestCase(ERP5TypeTestCase):
+  """Tests starts with a preference activated for self.my_organisation, logged in
+  as a user with Assignee, Assignor and Author role.
+
+  All documents created appart from this configuration will be deleted in
+  teardown. So users of this test case are encouraged to create new documents
+  rather than modifying default documents. 
+  """
+  
+  username = 'username'
+
+  
+  def _doWorkflowAction(self, ob, action,**kw):
+    self.portal.portal_workflow.doActionFor(ob, action, 
+                                            comment = 'for unit test',**kw)
+                           
+  @reindex  
+  def _makeOneTicket(self, portal_type='Campaign', 
+                     start_date=None,
+                     stop_date=None,
+                     simulation_state='draft', **kw):
+    """Creates an ticket, and edit it with kw.
+    
+    The default settings is for self.section.
+    You can pass a list of mapping as lines, then lines will be created
+    using this information.
+    """
+    kw.setdefault('start_date', start_date)
+    kw.setdefault('stop_date', stop_date)
+    kw.setdefault('resource', 'service_module/1')
+    tk=None
+    if portal_type == ('Campaign'):
+      tk = self.campaign_module.newContent(portal_type=portal_type,**kw)
+    elif portal_type == ('Meeting'):
+      tk = self.meeting_module.newContent(portal_type=portal_type,**kw)
+    elif portal_type == ('Sale Opportunity'):
+      tk = self.sale_opportunity_module.newContent(portal_type=portal_type,**kw)
+    elif portal_type == ('Support Request'):
+      tk = self.support_request_module.newContent(portal_type=portal_type,**kw)
+
+    if simulation_state == 'validated':
+      tk.validate()
+    elif simulation_state == 'offered': #for Sale Opportunity workflow
+      tk.offer()
+    return tk
+
+  def _makeOneEvent(self, portal_type='Fax Message', 
+                     start_date=DateTime(),
+                     simulation_state='draft', 
+                     follow_up_ticket_title = "",
+                     follow_up_ticket_type = "Campaign",
+                     **kw):
+    """Creates an event, and edit it with kw.
+    
+    The default settings is for self.section.
+    You can pass a list of mapping as lines, then lines will be created
+    using this information.
+    """
+    kw.setdefault('start_date', start_date)
+    kw.setdefault('resource', 'service_module/2')
+    ev = self.event_module.newContent(portal_type=portal_type,**kw)
+
+    if simulation_state == 'assigned':
+      ticket=self.portal.restrictedTraverse(ev.getFollowUp())
+      self._doWorkflowAction(ev,'assign_action',
+                         follow_up_ticket_type = ticket.getPortalType(),
+                         follow_up_ticket_title = ticket.getTitle())
+    elif simulation_state == 'planned':
+      ev.plan()
+    elif simulation_state == 'posted':
+      ev.start()
+    elif simulation_state == 'delivered':
+      ev.start()
+      ev.deliver()
+    elif simulation_state == 'new':
+      ev.receive()
+    elif simulation_state == 'acknowledged':
+      ticket=self.portal.restrictedTraverse(ev.getFollowUp())
+      self._doWorkflowAction(ev,'assign_action',
+                         follow_up_ticket_type = ticket.getPortalType(),
+                         follow_up_ticket_title = ticket.getTitle())
+      ev.acknowledge()
+    elif simulation_state == 'cancelled':
+      ev.receive()
+      ev.cancel()
+    elif simulation_state == 'deleted':
+      ev.delete()
+    elif simulation_state == 'expired':
+      ev.receive()
+      ev.expire()
+    elif simulation_state == 'responded':
+      ev.receive()
+      ev.respond()
+    elif simulation_state == 'started':
+      ev.start()
+    elif simulation_state == 'ordered':
+      ev.plan()
+      ev.order()
+    return ev
+
+  def login(self):
+    """login with Manager roles."""
+    uf = self.getPortal().acl_users
+    uf._doAddUser('manager', 'manager', ['Manager', 'Assignee', 'Assignor',
+                               'Associate', 'Auditor', 'Author'], [])
+    user = uf.getUserById('manager').__of__(uf)
+    newSecurityManager(None, user)
+
+  def setUp(self):
+    """Setup the fixture.
+    """
+    ERP5TypeTestCase.setUp(self)
+    self.portal = self.getPortal()
+    self.event_module = self.portal.event_module
+    self.campaign_module = self.portal.campaign_module
+    self.meeting_module = self.portal.meeting_module
+    self.sale_opportunity_module = self.portal.sale_opportunity_module
+    self.support_request_module = self.portal.support_request_module
+    self.organisation_module = self.portal.organisation_module
+    self.person_module = self.portal.person_module
+    self.portal_categories = self.portal.portal_categories
+
+ 
+    # create group category
+    if not self.portal_categories['group'].has_key('demo_group'): 
+      group=self.portal_categories.group
+      subgroup = group.newContent(portal_type='Category',
+                                title='demo_group',
+                                reference='demo_group',
+                                id='demo_group')
+    # create users and organisations
+    if not self.person_module.has_key('Person_1'): 
+      user = self.portal.person_module.newContent(
+                              portal_type='Person',
+                              reference='Person_1',
+                              title='Person_1',
+                              id='Person_1')
+      user.validate()
+    if not self.person_module.has_key('Person_2'): 
+      user = self.portal.person_module.newContent(
+                              portal_type='Person',
+                              reference='Person_2',
+                              title='Person_2',
+                              id='Person_2')
+      user.validate()
+    if not self.person_module.has_key('Person_3'): 
+      user = self.portal.person_module.newContent(
+                              portal_type='Person',
+                              reference='Person_3',
+                              title='Person_3',
+                              id='Person_3')
+      user.validate()
+    if not self.organisation_module.has_key('Organisation_1'): 
+      org = self.portal.organisation_module.newContent(
+                              portal_type='Organisation',
+                              reference='Organisation_1',
+                              title='Organisation_1',
+                              id='Organisation_1')
+      org.validate()
+    if not self.organisation_module.has_key('Organisation_2'): 
+      org = self.portal.organisation_module.newContent(
+                              portal_type='Organisation',
+                              reference='Organisation_2',
+                              title='Organisation_2',
+                              id='Organisation_2')
+      org.validate()
+    if not self.organisation_module.has_key('My_organisation'): 
+      org = self.portal.organisation_module.newContent(
+                              portal_type='Organisation',
+                              reference='My_organisation',
+                              title='My_organisation',
+                              group_value=self.portal_categories['group'].demo_group,
+                              id='My_organisation')
+      org.validate()
+    
+    # make sure documents are validated
+    for module in (self.organisation_module,
+                   self.person_module):
+      for doc in module.objectValues():
+        doc.validate()
+
+    # and all this available to catalog
+    get_transaction().commit()
+    self.tic()
+
+
+  def tearDown(self):
+    """Remove all documents.
+    """
+    get_transaction().abort()
+    self.campaign_module.manage_delObjects(
+                      list(self.campaign_module.objectIds()))
+    self.meeting_module.manage_delObjects(
+                      list(self.meeting_module.objectIds()))
+    self.sale_opportunity_module.manage_delObjects(
+                      list(self.sale_opportunity_module.objectIds()))
+    self.support_request_module.manage_delObjects(
+                      list(self.support_request_module.objectIds()))
+    self.organisation_module.manage_delObjects(
+                      list(self.campaign_module.objectIds()))
+    self.person_module.manage_delObjects(
+                      list(self.person_module.objectIds()))
+    self.portal_categories['group'].manage_delObjects((['demo_group',]))
+    self.event_module.manage_delObjects(
+                      list(self.event_module.objectIds()))
+                      
+    get_transaction().commit()
+    self.tic()
+    ERP5TypeTestCase.tearDown(self)
+
+  def getBusinessTemplateList(self):
+    """Returns list of BT to be installed."""
+    return ('erp5_base', 'erp5_crm', )
+
+
+class TestCrmReports(CrmTestCase):
+  """Test Crm reports
+  
+  Test basic cases of gathering data to render reports, the purpose of those
+  tests is to exercise basic reporting features to make sure no regression
+  happen. Input data used for tests usually contain edge cases, for example:
+    * movements at the boundaries of the period.
+    * movements with other simulation states.
+    * movements with node in the section_category we want to exclude (Persons).
+    * movements with source & destination for other sections.
+  """
+  def getTitle(self):
+    return "Crm Reports"
+
+  # utility methods for ERP5 Report -> TODO move in framework !
+  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 checkLineProperties(self, line, **kw):
+    """Check properties of a report line.
+    """
+    for k, v in kw.items():
+      self.assertEquals(v, line.getColumnProperty(k),
+          '`%s`: expected: %r actual: %r' % (k, v, line.getColumnProperty(k)))
+  # /utility methods for ERP5 Report
+
+  def testCampaignStatus(self):
+    # Campaign Status report.
+    
+    # First campaign
+    first = self._makeOneTicket(
+              portal_type='Campaign',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second campaign
+    second = self._makeOneTicket(
+              portal_type='Campaign',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first campaign
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventOut3=self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventIn1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=eventOut1.getRelativeUrl())
+    # creating one free event for test
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second campaign
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    eventInt1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=eventOut1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                               'CampaignModule_viewCampaignStatusReport')
+    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 2 campaigns
+    self.assertEquals(2, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['title', 'ticket_type', 'destination_section', 'destination_decision',
+         'source', 'start_date', 'stop_date','validation_state','outgoing',
+         'incoming','progression','efficiency'])
+    
+    # First campaign
+    self.checkLineProperties(data_line_list[0],
+                   title='First One',
+                   ticket_type = first.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 11, 30),
+                   start_date = DateTime(2007, 2, 2),
+                   destination_section = first.getDestinationSectionTitle(),
+                   destination_decision = self.person_module.Person_1.getTitle(),
+                   source = self.person_module.Person_2.getTitle(),
+                   validation_state = 'Open',
+                   outgoing = 3,
+                   incoming = 1,
+                   progression = 66.00/100,
+                   efficiency = 33.00/100)    
+    # Second campaign
+    self.checkLineProperties(data_line_list[1],
+                   title='Second One',
+                   ticket_type = second.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 12, 31),
+                   start_date = DateTime(2007, 1, 2),
+                   destination_section = second.getDestinationSectionTitle(),
+                   destination_decision = second.getDestinationDecisionTitle(),
+                   source = second.getSourceTitle(),
+                   validation_state = 'Open',
+                   outgoing = 2,
+                   incoming = 1,
+                   progression = 100.00/100,
+                   efficiency = 50.00/100)
+                  
+  def testCampaignDetailedReport(self):
+    # Campaign Detailed report.
+    
+    # First campaign
+    first = self._makeOneTicket(
+              portal_type='Campaign',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second campaign
+    second = self._makeOneTicket(
+              portal_type='Campaign',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first campaign
+    first_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    first_event_out2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_out3 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=first_event_out1.getRelativeUrl())
+    # creating one free event for test
+    free_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second campaign
+    second_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_out2 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=second_event_out1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                               'CampaignModule_viewCampaignDetailedReport')
+    self.assertEquals(2, len(report_section_list))
+        
+    line_list = self.getListBoxLineList(report_section_list[1])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 7 events
+    self.assertEquals(7, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['campaign', 'direction', 'title', 'type','destination_title_list',
+         'source', 'start_date','stop_date','validation_state'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        ticket=first
+        event=first_event_out1
+        direction='Outgoing'
+        campaign=ticket.getTitle()
+      elif i==1:
+        ticket=first
+        event=first_event_inc1
+        direction='Incoming'
+        campaign=''
+      elif i==2:
+        ticket=first
+        event=first_event_out2
+        direction='Outgoing'
+        campaign=ticket.getTitle()
+      elif i==3:
+        ticket=first
+        event=first_event_out3
+        direction='Outgoing'
+        campaign=ticket.getTitle()
+      elif i==4:
+        ticket=second
+        event=second_event_out1
+        direction='Outgoing'
+        campaign=ticket.getTitle()
+      elif i==5:
+        ticket=second
+        event=second_event_out2
+        direction='Outgoing'
+        campaign=ticket.getTitle()
+      elif i==6:
+        ticket=second
+        event=second_event_inc1
+        direction='Incoming'
+        campaign=ticket.getTitle()
+      self.checkLineProperties(data_line_list[i],
+                   campaign = campaign,
+                   direction = direction,
+                   type = event.getTranslatedPortalType(),
+                   destination_title_list = event.getDestinationTitleList(),
+                   title = event.getTitle(),
+                   stop_date = event.getStopDate(),
+                   start_date = event.getStartDate(),
+                   source = event.getSourceTitle(),
+                   validation_state = event.getTranslatedSimulationStateTitle())
+
+  def testMeetingStatus(self):
+    # Meeting Status report.
+    
+    # First Meeting
+    first = self._makeOneTicket(
+              portal_type='Meeting',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Meeting
+    second = self._makeOneTicket(
+              portal_type='Meeting',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first meeting
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventOut3=self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventIn1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=eventOut1.getRelativeUrl())
+    # creating one free event for test
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second meeting
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    eventInt1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=eventOut1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                               'MeetingModule_viewMeetingStatusReport')
+    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 2 meetings
+    self.assertEquals(2, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['title', 'ticket_type', 'destination_section', 'destination_decision',
+         'destination_title','source', 'start_date', 'stop_date',
+         'validation_state','outgoing','incoming'])
+ 
+    # First meeting
+    self.checkLineProperties(data_line_list[0],
+                   title='First One',
+                   ticket_type = first.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 11, 30),
+                   start_date = DateTime(2007, 2, 2),
+                   destination_section = first.getDestinationSectionTitle(),
+                   destination_decision = self.person_module.Person_1.getTitle(),
+                   destination_title = first.getDestinationTitle(),
+                   source = self.person_module.Person_2.getTitle(),
+                   validation_state = 'Open',
+                   outgoing = 3,
+                   incoming = 1)
+    # Second meeting
+    self.checkLineProperties(data_line_list[1],
+                   title='Second One',
+                   ticket_type = second.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 12, 31),
+                   start_date = DateTime(2007, 1, 2),
+                   destination_section = second.getDestinationSectionTitle(),
+                   destination_decision = second.getDestinationDecisionTitle(),
+                   destination_title = second.getDestinationTitle(),
+                   source = second.getSourceTitle(),
+                   validation_state = 'Open',
+                   outgoing = 2,
+                   incoming = 1)
+                  
+  def testMeetingDetailedReport(self):
+    # Meeting Detailed report.
+    
+    # First Meeting
+    first = self._makeOneTicket(
+              portal_type='Meeting',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Meeting
+    second = self._makeOneTicket(
+              portal_type='Meeting',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first Meeting
+    first_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    first_event_out2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_out3 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=first_event_out1.getRelativeUrl())
+    # creating one free event for test
+    free_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second Meeting
+    second_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_out2 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=second_event_out1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                               'MeetingModule_viewMeetingDetailedReport')
+    self.assertEquals(2, len(report_section_list))
+        
+    line_list = self.getListBoxLineList(report_section_list[1])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 7 events
+    self.assertEquals(7, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['meeting', 'direction', 'title', 'type','destination_title_list',
+         'source', 'start_date','stop_date','validation_state'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        ticket=first
+        event=first_event_out1
+        direction='Outgoing'
+        meeting=ticket.getTitle()
+      elif i==1:
+        ticket=first
+        event=first_event_inc1
+        direction='Incoming'
+        meeting=''
+      elif i==2:
+        ticket=first
+        event=first_event_out2
+        direction='Outgoing'
+        meeting=ticket.getTitle()
+      elif i==3:
+        ticket=first
+        event=first_event_out3
+        direction='Outgoing'
+        meeting=ticket.getTitle()
+      elif i==4:
+        ticket=second
+        event=second_event_out1
+        direction='Outgoing'
+        meeting=ticket.getTitle()
+      elif i==5:
+        ticket=second
+        event=second_event_out2
+        direction='Outgoing'
+        meeting=ticket.getTitle()
+      elif i==6:
+        ticket=second
+        event=second_event_inc1
+        direction='Incoming'
+        meeting=ticket.getTitle()
+      self.checkLineProperties(data_line_list[i],
+                   meeting = meeting,
+                   direction = direction,
+                   type = event.getTranslatedPortalType(),
+                   destination_title_list = event.getDestinationTitleList(),
+                   title = event.getTitle(),
+                   stop_date = event.getStopDate(),
+                   start_date = event.getStartDate(),
+                   source = event.getSourceTitle(),
+                   validation_state = event.getTranslatedSimulationStateTitle())
+                  
+  def testSupportRequestStatus(self):
+    # Support Request Status report.
+    
+    # First Support Request
+    first = self._makeOneTicket(
+              portal_type='Support Request',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Support Request
+    second = self._makeOneTicket(
+              portal_type='Support Request',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first Support Request
+    first_event_inc1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    first_event_inc2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Inc 2 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_inc3=self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Inc 3 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_out1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Inc 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=first_event_inc1.getRelativeUrl())
+    # creating one free event for test
+    feEvInc1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second Support Request
+    second_event_inc1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_inc2 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 2 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_out1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Inc 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=second_event_inc1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                        'SupportRequestModule_viewSupportRequestStatusReport')
+    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 2 Support Request
+    self.assertEquals(2, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['title', 'ticket_type', 'destination_section', 'destination_decision',
+         'source', 'source_decision', 'start_date', 'stop_date',
+         'validation_state','incoming','outgoing'])
+ 
+    # First Support Request
+    self.checkLineProperties(data_line_list[0],
+                   title='First One',
+                   ticket_type = first.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 11, 30),
+                   start_date = DateTime(2007, 2, 2),
+                   destination_section = first.getDestinationSectionTitle(),
+                   destination_decision = self.person_module.Person_1.getTitle(),
+                   source_decision = first.getSourceDecisionTitle(),
+                   source = self.person_module.Person_2.getTitle(),
+                   validation_state = 'Open',
+                   outgoing = 1,
+                   incoming = 3)
+    # Second Support Request
+    self.checkLineProperties(data_line_list[1],
+                   title='Second One',
+                   ticket_type = second.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 12, 31),
+                   start_date = DateTime(2007, 1, 2),
+                   destination_section = second.getDestinationSectionTitle(),
+                   destination_decision = second.getDestinationDecisionTitle(),
+                   source_decision = second.getSourceDecisionTitle(),
+                   source = second.getSourceTitle(),
+                   validation_state = 'Open',
+                   outgoing = 1,
+                   incoming = 2)
+                                    
+  def testSupportRequestDetailedReport(self):
+    # Support Request Detailed report.
+    
+    # First Support Request
+    first = self._makeOneTicket(
+              portal_type='Support Request',
+              title='First One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Support Request
+    second = self._makeOneTicket(
+              portal_type='Support Request',
+              title='Second One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first Support Request
+    first_event_inc1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    first_event_inc2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Inc 2 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_inc3=self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Inc 3 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_out1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Inc 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=first_event_inc1.getRelativeUrl())
+    # creating one free event for test
+    feEvInc1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second Support Request
+    second_event_inc1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_inc2 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Inc 2 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_out1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Inc 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=second_event_inc1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['validation_state'] = ['validated',]
+    
+    report_section_list = self.getReportSectionList(
+                      'SupportRequestModule_viewSupportRequestDetailedReport')
+    self.assertEquals(2, len(report_section_list))
+        
+    line_list = self.getListBoxLineList(report_section_list[1])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 7 events
+    self.assertEquals(7, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['support_request', 'direction', 'title', 'type','destination_title_list',
+         'source', 'start_date','stop_date','validation_state'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        ticket=first
+        event=first_event_inc1
+        direction='Incoming'
+        support_request=ticket.getTitle()
+      elif i==1:
+        ticket=first
+        event=first_event_out1
+        direction='Outgoing'
+        support_request=''
+      elif i==2:
+        ticket=first
+        event=first_event_inc2
+        direction='Incoming'
+        support_request=ticket.getTitle()
+      elif i==3:
+        ticket=first
+        event=first_event_inc3
+        direction='Incoming'
+        support_request=ticket.getTitle()
+      elif i==4:
+        ticket=second
+        event=second_event_inc1
+        direction='Incoming'
+        support_request=ticket.getTitle()
+      elif i==5:
+        ticket=second
+        event=second_event_inc2
+        direction='Incoming'
+        support_request=ticket.getTitle()
+      elif i==6:
+        ticket=second
+        event=second_event_out1
+        direction='Outgoing'
+        support_request=ticket.getTitle()
+      self.checkLineProperties(data_line_list[i],
+                   support_request = support_request,
+                   direction = direction,
+                   type = event.getTranslatedPortalType(),
+                   destination_title_list = event.getDestinationTitleList(),
+                   title = event.getTitle(),
+                   stop_date = event.getStopDate(),
+                   start_date = event.getStartDate(),
+                   source = event.getSourceTitle(),
+                   validation_state = event.getTranslatedSimulationStateTitle())
+                  
+  def testSaleOpportunityStatus(self):
+    # Sale Opportunity Status report.
+    
+    # First Sale Opportunity
+    first = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='First One',
+              simulation_state='contacted',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Sale Opportunity
+    second = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='Second One',
+              simulation_state='offered',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of first Sale Opportunity
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventOut3=self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    eventIn1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=eventOut1.getRelativeUrl())
+    # creating one free event for test
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second Sale Opportunity
+    eventOut1=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    eventOut2=self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    eventInt1=self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=eventOut1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['sale_opportunity_state'] = ['contacted','offered']
+    
+    report_section_list = self.getReportSectionList(
+                      'SaleOpportunityModule_viewSaleOpportunityStatusReport')
+    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 2 Sale Opportunity
+    self.assertEquals(2, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['title', 'ticket_type', 'destination_section', 'destination_decision',
+         'source','source_decision','start_date', 'stop_date',
+         'validation_state','outgoing','incoming'])
+ 
+    # First Sale Opportunity
+    self.checkLineProperties(data_line_list[0],
+                   title='First One',
+                   ticket_type = first.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 11, 30),
+                   start_date = DateTime(2007, 2, 2),
+                   destination_section = first.getDestinationSectionTitle(),
+                   destination_decision = self.person_module.Person_1.getTitle(),
+                   source_decision = first.getSourceDecisionTitle(),
+                   source = self.person_module.Person_2.getTitle(),
+                   validation_state = 'Contacted',
+                   outgoing = 3,
+                   incoming = 1)
+    # Second Sale Opportunity
+    self.checkLineProperties(data_line_list[1],
+                   title='Second One',
+                   ticket_type = second.getResourceTranslatedTitle(),
+                   stop_date = DateTime(2007, 12, 31),
+                   start_date = DateTime(2007, 1, 2),
+                   destination_section = second.getDestinationSectionTitle(),
+                   destination_decision = second.getDestinationDecisionTitle(),
+                   source_decision = second.getSourceDecisionTitle(),
+                   source = second.getSourceTitle(),
+                   validation_state = 'Offered',
+                   outgoing = 2,
+                   incoming = 1)
+                  
+  def testSaleOpportunityDetailedReport(self):
+    # Sale Opportunity Detailed report.
+    
+    # First Sale Opportunity
+    first = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='First One',
+              simulation_state='contacted',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              destination_decision_value = self.person_module.Person_1,
+              source_value = self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    # Second Sale Opportunity
+    second = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='Second One',
+              simulation_state='offered',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events of Sale Opportunity
+    first_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=first.getRelativeUrl())              
+    first_event_out2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Out 2 of First',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_out3 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Out 3 of First',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=first.getRelativeUrl())
+    first_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of First',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              causality=first_event_out1.getRelativeUrl())
+    # creating one free event for test
+    free_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events of second Sale Opportunity
+    second_event_out1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 1 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_out2 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Out 2 of Second',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 2, 2, 1),
+              follow_up=second.getRelativeUrl())              
+    second_event_inc1 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Response to Out 1 of Second',
+              simulation_state='new',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              #create a follow-up and causality ralationship to test that
+              #only count one time by follow-up
+              causality=second_event_out1.getRelativeUrl(),
+              follow_up=second.getRelativeUrl())              
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    request_form['section_category'] = 'group/demo_group'
+    request_form['sale_opportunity_state'] = ['contacted','offered']
+    
+    report_section_list = self.getReportSectionList(
+                    'SaleOpportunityModule_viewSaleOpportunityDetailedReport')
+    self.assertEquals(2, len(report_section_list))
+        
+    line_list = self.getListBoxLineList(report_section_list[1])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 7 events
+    self.assertEquals(7, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['sale_opportunity', 'direction', 'title', 'type','destination_title_list',
+         'source', 'start_date','stop_date','validation_state'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        ticket=first
+        event=first_event_out1
+        direction='Outgoing'
+        sale_opportunity=ticket.getTitle()
+      elif i==1:
+        ticket=first
+        event=first_event_inc1
+        direction='Incoming'
+        sale_opportunity=''
+      elif i==2:
+        ticket=first
+        event=first_event_out2
+        direction='Outgoing'
+        sale_opportunity=ticket.getTitle()
+      elif i==3:
+        ticket=first
+        event=first_event_out3
+        direction='Outgoing'
+        sale_opportunity=ticket.getTitle()
+      elif i==4:
+        ticket=second
+        event=second_event_out1
+        direction='Outgoing'
+        sale_opportunity=ticket.getTitle()
+      elif i==5:
+        ticket=second
+        event=second_event_out2
+        direction='Outgoing'
+        sale_opportunity=ticket.getTitle()
+      elif i==6:
+        ticket=second
+        event=second_event_inc1
+        direction='Incoming'
+        sale_opportunity=ticket.getTitle()
+      self.checkLineProperties(data_line_list[i],
+                   sale_opportunity = sale_opportunity,
+                   direction = direction,
+                   type = event.getTranslatedPortalType(),
+                   destination_title_list = event.getDestinationTitleList(),
+                   title = event.getTitle(),
+                   stop_date = event.getStopDate(),
+                   start_date = event.getStartDate(),
+                   source = event.getSourceTitle(),
+                   validation_state = event.getTranslatedSimulationStateTitle())
+
+  def testEventActivity(self):
+    # Event Activity report.
+    
+    # creating one ticket of every type
+    sale_opportunity = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='Sale Opportunity One',
+              simulation_state='contacted',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    campaign = self._makeOneTicket(
+              portal_type='Campaign',
+              title='Campaign One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+    meeting = self._makeOneTicket(
+              portal_type='Meeting',
+              title='Meeting One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+    support_request = self._makeOneTicket(
+              portal_type='Support Request',
+              title='Support Request One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events in every incoming-outgoing state related with tickets
+    event1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 1',
+              simulation_state='acknowledged',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())              
+    event2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 2',
+              simulation_state='assigned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    event3 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Event 3',
+              simulation_state='cancelled',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=meeting.getRelativeUrl())
+    event4 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Event 4',
+              simulation_state='expired',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              follow_up=support_request.getRelativeUrl())
+    event5 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 5',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event6 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 6',
+              simulation_state='responded',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    event7 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Event 7',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=meeting.getRelativeUrl())
+    event8 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Event 8',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=support_request.getRelativeUrl())
+    event9 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 9',
+              simulation_state='ordered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event10 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 10',
+              simulation_state='started',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    # creating free event for unassigned
+    free_event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    free_event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 2',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events in every non incoming-outgoing state related with tickets
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event deleted 1',
+              simulation_state='draft',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())              
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event deleted 2',
+              simulation_state='deleted',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    # creating events in incoming-outgoing state related with tickets
+    # by causality with one related event
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event causality 1',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              causality=event9.getRelativeUrl())              
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event causality 2',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              causality=event10.getRelativeUrl())
+    # creating events related with same ticket by follow-up and causality
+    # Only must count one time (follow-up)
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event both 1',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              causality=event5.getRelativeUrl(),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event both 2',
+              simulation_state='responded',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              causality=event6.getRelativeUrl(),
+              follow_up=campaign.getRelativeUrl()) 
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    
+    report_section_list = self.getReportSectionList(
+                                    'EventModule_viewEventActivityReport')
+    #Obtain 2 listbox with outgoing and incoming events
+    self.assertEquals(2, len(report_section_list))
+    
+    #Outgoing
+    line_list = self.getListBoxLineList(report_section_list[0])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 6 states
+    self.assertEquals(6, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['validation_state','Campaign', 'Meeting', 
+         'SaleOpportunity','SupportRequest', 'unassigned','total'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        pvalidation_state = 'Acknowledged'
+        pCampaign = 0
+        pMeeting = 0
+        pSaleOpportunity = 1
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 1
+      elif i==1:
+        pvalidation_state = 'Assigned'
+        pCampaign = 1
+        pMeeting = 0
+        pSaleOpportunity = 0
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 1
+      elif i==2:
+        pvalidation_state = 'Cancelled'
+        pCampaign = 0
+        pMeeting = 1
+        pSaleOpportunity = 0
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 1
+      elif i==3:
+        pvalidation_state = 'Expired'
+        pCampaign = 0
+        pMeeting = 0
+        pSaleOpportunity = 0
+        pSupportRequest = 1
+        punassigned = 0
+        ptotal = 1
+      elif i==4:
+        pvalidation_state = 'New'
+        pCampaign = 1
+        pMeeting = 0
+        pSaleOpportunity = 3
+        pSupportRequest = 0
+        punassigned = 1
+        ptotal = 5
+      elif i==5:
+        pvalidation_state = 'Responded'
+        pCampaign = 2
+        pMeeting = 0
+        pSaleOpportunity = 0
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 2
+      self.checkLineProperties(data_line_list[i],
+                         validation_state = pvalidation_state,
+                         Campaign = pCampaign,
+                         Meeting = pMeeting,
+                         SaleOpportunity = pSaleOpportunity,
+                         SupportRequest = pSupportRequest,
+                         unassigned = punassigned,
+                         total = ptotal)
+    # Stat Line
+    stat_line = line_list[-1]
+    self.failUnless(stat_line.isStatLine())
+    self.assertEquals('Total', stat_line.getColumnProperty('validation_state'))
+    self.assertEquals(4, stat_line.getColumnProperty('Campaign'))
+    self.assertEquals(1, stat_line.getColumnProperty('Meeting'))
+    self.assertEquals(4, stat_line.getColumnProperty('SaleOpportunity'))
+    self.assertEquals(1, stat_line.getColumnProperty('SupportRequest'))
+    self.assertEquals(1, stat_line.getColumnProperty('unassigned'))
+    self.assertEquals(11, stat_line.getColumnProperty('total'))
+
+    #Incoming
+    line_list = self.getListBoxLineList(report_section_list[1])
+    data_line_list = [l for l in line_list if l.isDataLine()]
+    # we have 4 states
+    self.assertEquals(4, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['validation_state','Campaign', 'Meeting', 
+         'SaleOpportunity','SupportRequest', 'unassigned','total'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        pvalidation_state = 'Delivered'
+        pCampaign = 0
+        pMeeting = 1
+        pSaleOpportunity = 0
+        pSupportRequest = 0
+        punassigned = 1
+        ptotal = 2
+      elif i==1:
+        pvalidation_state = 'Outgoing'
+        pCampaign = 0
+        pMeeting = 0
+        pSaleOpportunity = 0
+        pSupportRequest = 1
+        punassigned = 0
+        ptotal = 1
+      elif i==2:
+        pvalidation_state = 'Pending'
+        pCampaign = 0
+        pMeeting = 0
+        pSaleOpportunity = 1
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 1
+      elif i==3:
+        pvalidation_state = 'Posted'
+        pCampaign = 1
+        pMeeting = 0
+        pSaleOpportunity = 0
+        pSupportRequest = 0
+        punassigned = 0
+        ptotal = 1
+      self.checkLineProperties(data_line_list[i],
+                         validation_state = pvalidation_state,
+                         Campaign = pCampaign,
+                         Meeting = pMeeting,
+                         SaleOpportunity = pSaleOpportunity,
+                         SupportRequest = pSupportRequest,
+                         unassigned = punassigned,
+                         total = ptotal)
+    # Stat Line
+    stat_line = line_list[-1]
+    self.failUnless(stat_line.isStatLine())
+    self.assertEquals('Total', stat_line.getColumnProperty('validation_state'))
+    self.assertEquals(1, stat_line.getColumnProperty('Campaign'))
+    self.assertEquals(1, stat_line.getColumnProperty('Meeting'))
+    self.assertEquals(1, stat_line.getColumnProperty('SaleOpportunity'))
+    self.assertEquals(1, stat_line.getColumnProperty('SupportRequest'))
+    self.assertEquals(1, stat_line.getColumnProperty('unassigned'))
+    self.assertEquals(5, stat_line.getColumnProperty('total'))
+                  
+  def testEventDetailedReport(self):
+    # Event Detailed Report report.
+    
+    # creating one ticket of every type
+    sale_opportunity = self._makeOneTicket(
+              portal_type='Sale Opportunity',
+              title='Sale Opportunity One',
+              simulation_state='contacted',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              start_date=DateTime(2007, 2, 2),
+              stop_date=DateTime(2007, 11, 30))
+    campaign = self._makeOneTicket(
+              portal_type='Campaign',
+              title='Campaign One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+    meeting = self._makeOneTicket(
+              portal_type='Meeting',
+              title='Meeting One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_1,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+    support_request = self._makeOneTicket(
+              portal_type='Support Request',
+              title='Support Request One',
+              simulation_state='validated',
+              source_section_value=self.organisation_module.My_organisation,
+              destination_section_value=self.organisation_module.Organisation_2,
+              start_date=DateTime(2007, 1, 2),
+              stop_date=DateTime(2007, 12, 31))
+
+    # creating events in every incoming-outgoing state related with tickets
+    event1 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 1',
+              simulation_state='acknowledged',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())              
+    event2 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 2',
+              simulation_state='assigned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    event3 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Event 3',
+              simulation_state='cancelled',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=meeting.getRelativeUrl())
+    event4 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Event 4',
+              simulation_state='expired',
+              destination_value=self.organisation_module.My_organisation,
+              source_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 7, 1, 1),
+              follow_up=support_request.getRelativeUrl())
+    event5 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 5',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event6 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 6',
+              simulation_state='responded',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    event7 = self._makeOneEvent(
+              portal_type='Mail Message',
+              title='Event 7',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=meeting.getRelativeUrl())
+    event8 = self._makeOneEvent(
+              portal_type='Phone Call',
+              title='Event 8',
+              simulation_state='planned',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=support_request.getRelativeUrl())
+    event9 = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event 9',
+              simulation_state='ordered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event10 = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event 10',
+              simulation_state='started',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    # creating free event for unassigned
+    free_event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 1',
+              simulation_state='delivered',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    free_event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Free 2',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 2, 1, 1))
+    # creating events in every non incoming-outgoing state related with tickets
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event deleted 1',
+              simulation_state='draft',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              follow_up=sale_opportunity.getRelativeUrl())              
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event deleted 2',
+              simulation_state='deleted',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              follow_up=campaign.getRelativeUrl())
+    # creating events in incoming-outgoing state related with tickets
+    # by causality with one related event
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event causality 1',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_1,
+              start_date=DateTime(2007, 2, 2, 1, 1),
+              causality=event9.getRelativeUrl())              
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event causality 2',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_2,
+              start_date=DateTime(2007, 2, 1, 1, 1),
+              causality=event10.getRelativeUrl())
+    # creating events related with same ticket by follow-up and causality
+    # Only must count one time (follow-up)
+    event = self._makeOneEvent(
+              portal_type='Fax Message',
+              title='Event both 1',
+              simulation_state='new',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              causality=event5.getRelativeUrl(),
+              follow_up=sale_opportunity.getRelativeUrl())
+    event = self._makeOneEvent(
+              portal_type='Letter',
+              title='Event both 2',
+              simulation_state='responded',
+              source_value=self.organisation_module.My_organisation,
+              destination_value=self.person_module.Person_3,
+              start_date=DateTime(2007, 2, 3, 1, 1),
+              causality=event6.getRelativeUrl(),
+              follow_up=campaign.getRelativeUrl()) 
+              
+    get_transaction().commit()
+    self.tic()
+    # set request variables and render
+    request_form = self.portal.REQUEST.other
+    request_form['from_date'] = DateTime(2007, 1, 1)
+    
+    report_section_list = self.getReportSectionList(
+                                    'EventModule_viewEventDetailedReport')
+    #Obtain 1 listbox with outgoing and incoming events
+    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 5 lines
+    self.assertEquals(5, len(data_line_list))
+    
+    # test columns values
+    line = data_line_list[0]
+    self.assertEquals(line.column_id_list,
+        ['ticket_title','ticket_type', 'resource', 
+         'delivered', 'ordered', 'acknowledged', 'assigned', 
+         'started', 'draft', 'planned', 'cancelled', 'new', 
+         'expired', 'responded','total'])
+    for i in range(len(data_line_list)):
+      if i==0:
+        pticket_title = 'Campaign One'
+        pticket_type = 'Campaign'
+        pdelivered = 0
+        pordered = 0
+        packnowledged = 0
+        passigned = 1
+        pstarted = 1
+        pdraft = 0
+        pplanned = 0
+        pcancelled = 0
+        pnew = 1
+        pexpired = 0
+        presponded = 2
+        ptotal = 5
+      elif i==1:
+        pticket_title = 'Meeting One'
+        pticket_type = 'Meeting'
+        pdelivered = 1
+        pordered = 0
+        packnowledged = 0
+        passigned = 0
+        pstarted = 0
+        pdraft = 0
+        pplanned = 0
+        pcancelled = 1
+        pnew = 0
+        pexpired = 0
+        presponded = 0
+        ptotal = 2
+      elif i==2:
+        pticket_title = 'Sale Opportunity One'
+        pticket_type = 'Sale Opportunity'
+        pdelivered = 0
+        pordered = 1
+        packnowledged = 1
+        passigned = 0
+        pstarted = 0
+        pdraft = 1
+        pplanned = 0
+        pcancelled = 0
+        pnew = 3
+        pexpired = 0
+        presponded = 0
+        ptotal = 6
+      elif i==3:
+        pticket_title = 'Support Request One'
+        pticket_type = 'Support Request'
+        pdelivered = 0
+        pordered = 0
+        packnowledged = 0
+        passigned = 0
+        pstarted = 0
+        pdraft = 0
+        pplanned = 1
+        pcancelled = 0
+        pnew = 0
+        pexpired = 1
+        presponded = 0
+        ptotal = 2
+      elif i==4:
+        pticket_title = ''
+        pticket_type = 'Unassigned'
+        pdelivered = 1
+        pordered = 0
+        packnowledged = 0
+        passigned = 0
+        pstarted = 0
+        pdraft = 0
+        pplanned = 0
+        pcancelled = 0
+        pnew = 1
+        pexpired = 0
+        presponded = 0
+        ptotal = 2
+      self.checkLineProperties(data_line_list[i],
+                        ticket_title = pticket_title,
+                        ticket_type = pticket_type,
+                        delivered = pdelivered,
+                        ordered = pordered,
+                        acknowledged = packnowledged,
+                        assigned = passigned,
+                        started = pstarted,
+                        draft = pdraft,
+                        planned = pplanned,
+                        cancelled = pcancelled,
+                        new = pnew,
+                        expired = pexpired,
+                        responded = presponded,
+                        total = ptotal)
+    # Stat Line
+    stat_line = line_list[-1]
+    self.failUnless(stat_line.isStatLine())
+    self.assertEquals('Total', stat_line.getColumnProperty('ticket_title'))
+    self.assertEquals(2, stat_line.getColumnProperty('delivered'))
+    self.assertEquals(1, stat_line.getColumnProperty('ordered'))
+    self.assertEquals(1, stat_line.getColumnProperty('acknowledged'))
+    self.assertEquals(1, stat_line.getColumnProperty('assigned'))
+    self.assertEquals(1, stat_line.getColumnProperty('started'))
+    self.assertEquals(1, stat_line.getColumnProperty('draft'))
+    self.assertEquals(1, stat_line.getColumnProperty('planned'))
+    self.assertEquals(1, stat_line.getColumnProperty('cancelled'))
+    self.assertEquals(5, stat_line.getColumnProperty('new'))
+    self.assertEquals(1, stat_line.getColumnProperty('expired'))
+    self.assertEquals(2, stat_line.getColumnProperty('responded'))
+    self.assertEquals(17, stat_line.getColumnProperty('total'))
+
+def test_suite():
+  suite = unittest.TestSuite()
+  suite.addTest(unittest.makeSuite(TestCrmReports))
+  return suite
+




More information about the Erp5-report mailing list