From c011f20813f453b6143e0c73a903271d17861f56 Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Thu, 21 Jul 2005 13:02:29 +0000
Subject: [PATCH] As Jerome rewrote Simulation part of Accounting, some methods
 can be removed.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3480 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/Document/Delivery.py | 512 ------------------------------
 1 file changed, 512 deletions(-)

diff --git a/product/ERP5/Document/Delivery.py b/product/ERP5/Document/Delivery.py
index 391ac5f8d5..f48b602691 100755
--- a/product/ERP5/Document/Delivery.py
+++ b/product/ERP5/Document/Delivery.py
@@ -39,187 +39,8 @@ from Acquisition import Explicit, Implicit
 from Products.PythonScripts.Utility import allow_class
 from DateTime import DateTime
 
-# XXX FIXME: to be deleted
-from Products.ERP5Type.XMLMatrix import TempXMLMatrix
-from Products.ERP5.MovementGroup import OrderMovementGroup, PathMovementGroup
-from Products.ERP5.MovementGroup import DateMovementGroup, ResourceMovementGroup
-from Products.ERP5.MovementGroup import VariantMovementGroup, RootMovementGroup
-
 from zLOG import LOG
 
-# XXX FIXME: to be deleted
-class TempDeliveryCell(DeliveryCell):
-
-  def getPrice(self):
-    return self.price
-
-  def _setPrice(self, value):
-    self.price = value
-
-  def getQuantity(self):
-    return self.quantity
-
-  def _setQuantity(self, value):
-    self.quantity = value
-
-  def reindexObject(self, *args, **kw):
-    pass
-
-  def activate(self):
-    return self
-
-
-# XXX FIXME: to be deleted
-class XMLMatrix(TempXMLMatrix):
-
-  def newCellContent(self, id,**kw):
-    """
-      If you delete this method, please check the code of the method
-      ERP5/Document/InventoryLine.newCellContent() and delete it.
-      If nothing has changed from the date I wrote this comment, the
-      behaviour of InventoryLine will be the same without
-      InventoryLine.newCellContent(), because Inventory line is a subclass
-      of Delivery which is a subclass of XMLMatrix (Kev).
-    """
-    new_temp_object = TempDeliveryCell(id)
-    self._setObject(id, new_temp_object)
-    return self.get(id)
-
-
-# XXX FIXME: to be deleted
-class Group(Implicit):
-  """
-    Hold movements which have the same resource and the same variation.
-  """
-  # Declarative security
-  security = ClassSecurityInfo()
-  #security.declareObjectProtected(Permissions.View)
-  security.declareObjectPublic()
-
-  # These get methods are workarounds for the Zope security model.
-  security.declareProtected(Permissions.AccessContentsInformation, 'getMovementList')
-  def getMovementList(self):
-    return self.movement_list
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getResourceId')
-  def getResourceId(self):
-    return self.resource_id
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getResourceTitle')
-  def getResourceTitle(self):
-    return self.resource_title
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getVariationBaseCategoryList')
-  def getVariationBaseCategoryList(self):
-    return list(self.variation_base_category_list)
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getTotalPrice')
-  def getTotalPrice(self):
-    return self.total_price
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getTotalQuantity')
-  def getTotalQuantity(self):
-    return self.total_quantity
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'getMatrix')
-  def getMatrix(self):
-    return self.matrix
-
-  def __init__(self, movement):
-    self.movement_list = []
-    #self.quantity_unit = movement.getQuantityUnit() # This is likely an error JPSforYO
-    resource_value = movement.getResourceValue()
-    if resource_value is not None:
-      self.quantity_unit = resource_value.getDefaultQuantityUnit()
-    else:
-      self.quantity_unit = movement.getQuantityUnit() # Meaningless XXX ?
-    self.resource = movement.getResource()
-    self.resource_id = movement.getResourceId()
-    self.resource_title = movement.getResourceTitle()
-    self.variation_base_category_list = movement.getVariationBaseCategoryList()
-    self.variation_category_list = []
-    # self.total_price = movement.getTotalPrice() # This is likely an error JPSforYO
-    # self.total_quantity = movement.getTotalQuantity() # This is likely an error JPSforYO
-    self.total_price = 0.0 # No need to add twice since we add it in append
-    self.total_quantity = 0.0 # No need to add twice since we add it in append
-    self.matrix = XMLMatrix(None)
-    self.append(movement)
-
-  def test(self, movement):
-    # Use resource rather than resource_id JPSforYO
-    if movement.getResource() == self.resource and \
-      movement.getVariationBaseCategoryList() == self.variation_base_category_list:
-      return 1
-    else:
-      return 0
-
-  def append(self, movement):
-    if not movement in self.movement_list:
-      self.movement_list.append(movement)
-      price = movement.getTotalPrice()
-      if price is not None:
-        self.total_price += price # XXX Something should be done wrt to currency
-      # If one order has beed negociated in USD and anotehr in EUR, then there is no
-      # way to merge invoices. Multiple invoices must be produced
-      # This may require serious extensions to this code
-      # ie. N deliveries result in M invoices (1 invoice per currency)
-      #self.total_quantity += movement.getTotalQuantity() # This is likely an error JPSforYO
-      self.total_quantity += movement.getInventoriatedQuantity()
-      for category in movement.getVariationCategoryList():
-        if category not in self.variation_category_list:
-          self.variation_category_list.append(category)
-
-  def finish(self):
-    # Make up a list of cell ranges for setCellRange.
-    cell_range_list = []
-    for base_category in self.variation_base_category_list:
-      cell_range = []
-      for movement in self.movement_list:
-        for category in movement.getCategoryMembershipList(base_category, base=1):
-          if not category in cell_range:
-            cell_range.append(category)
-      cell_range_list.append(cell_range)
-
-    kw_list = {'base_id' : 'movement'}
-    apply(self.matrix._setCellRange, cell_range_list, kw_list)
-
-    # Add every movement into the matrix.
-    for movement in self.movement_list:
-      # Make sure that the order of the category lists is preserved.
-      point = []
-      for base_category in self.variation_base_category_list:
-        point += movement.getCategoryMembershipList(base_category, base=1)
-      cell = apply(self.matrix.getCell, point, kw_list)
-      if cell is None:
-        cell = apply(self.matrix.newCell, point, kw_list)
-        cell.setMappedValuePropertyList(['price', 'quantity'])
-        cell._setPrice(movement.getPrice())
-        cell._setQuantity(movement.getQuantity())
-      else:
-        quantity = movement.getQuantity()
-        if quantity:
-          cell._setPrice(movement.getPrice() * quantity + cell.getPrice()) # Accumulate total price
-          cell._setQuantity(quantity + cell.getQuantity())  # Accumulate quantity
-
-    # Normalize price to compute unit price
-    for cell in self.matrix.getCellValueList():
-      quantity =  cell.getQuantity()
-      if quantity:
-        cell._setPrice(cell.getPrice() / float(quantity))
-      else:
-        cell._setPrice(0.0) # if quantity is zero, price is et to 0.0 as a convention
-    # Normalize self price also JPSforYO
-    quantity = self.total_quantity
-    if quantity:
-      self.price = self.total_price / float(quantity)
-    else:
-      self.price = 0.0
-    #LOG('Group', 0, repr(self.total_price), repr(self.total_quantity))
-
-InitializeClass(Group)
-#allow_class(Group)
-
-
 class Delivery(XMLObject):
     """
         Each time delivery is modified, it MUST launch a reindexing of
@@ -257,180 +78,6 @@ class Delivery(XMLObject):
       """
       return 1
 
-# XXX FIXME: to be deleted
-    security.declareProtected(Permissions.ModifyPortalContent, 'buildInvoiceList')
-    def buildInvoiceList(self):
-      """
-        Retrieve all invoices lines into the simulation
-      """
-      reindexable_movement_list = []
-
-      parent_simulation_line_list = []
-      for o in self.objectValues():
-        parent_simulation_line_list += [x for x in o.getDeliveryRelatedValueList() \
-                                        if x.getPortalType()=='Simulation Movement']
-      invoice_rule_list = []
-      simulation_invoice_line_list = []
-      for o in parent_simulation_line_list:
-        for rule in o.objectValues():
-          invoice_rule_list.append(rule)
-          simulation_invoice_line_list += rule.objectValues()
-      #LOG('buildInvoiceList simulation_invoice_line_list',0,simulation_invoice_line_list)
-      from Products.ERP5.MovementGroup import OrderMovementGroup
-      from Products.ERP5.MovementGroup import PathMovementGroup
-      from Products.ERP5.MovementGroup import DateMovementGroup
-      from Products.ERP5.MovementGroup import ResourceMovementGroup
-      from Products.ERP5.MovementGroup import VariantMovementGroup
-      #class_list = [OrderMovementGroup,PathMovementGroup,DateMovementGroup,ResourceMovementGroup,VariantMovementGroup]
-      class_list = [OrderMovementGroup,PathMovementGroup,DateMovementGroup,ResourceMovementGroup]
-      root_group = self.portal_simulation.collectMovement(simulation_invoice_line_list,class_list=class_list)
-      invoice_list = []
-
-      #LOG('buildInvoiceList root_group',0,root_group)
-      if root_group is not None:
-        #LOG('buildInvoiceList root_group.group_list',0,root_group.group_list)
-        for order_group in root_group.group_list:
-          #LOG('buildInvoiceList order_group.order',0,order_group.order)
-          if order_group.order is not None:
-            # Only build if there is not order yet
-            #LOG('buildInvoiceList order_group.group_list',0,order_group.group_list)
-            for path_group in order_group.group_list :
-              invoice_module = self.accounting
-              invoice_type = 'Sale Invoice Transaction'
-              invoice_line_type = 'Invoice Line'
-
-              #LOG('buildInvoiceList path_group.group_list',0,path_group.group_list)
-              for date_group in path_group.group_list :
-
-                invoice = invoice_module.newContent(portal_type = invoice_type,
-                              start_date = date_group.start_date,
-                              stop_date = date_group.stop_date,
-                              source = path_group.source,
-                              destination = path_group.destination,
-                              source_section = path_group.source_section,
-                              destination_section = path_group.destination_section,
-                              causality_value = self,
-                              title = self.getTitle(),
-                              description = 'Invoice related to the Delivery %s' % self.getTitle())
-                # the new invoice is added to the invoice_list
-                invoice_list.append(invoice)
-                #for rule in invoice_rule_list : rule.setDeliveryValue(invoice) # This looks strange. Is it okay to do this ?
-
-                for resource_group in date_group.group_list :
-
-                  #LOG('buildInvoiceList resource_group.group_list',0,resource_group.group_list)
-                  # Create a new Sale Invoice Transaction Line for each resource
-                  invoice_line = invoice.newContent(
-                        portal_type=invoice_line_type
-                      , resource=resource_group.resource)
-
-#                  line_variation_category_list = []
-#                  line_variation_base_category_dict = {}
-
-                  # compute line_variation_base_category_list and
-                  # line_variation_category_list for new delivery_line
-#                  for variant_group in resource_group.group_list :
-#                    for variation_item in variant_group.category_list :
-#                      if not variation_item in line_variation_category_list :
-#                        line_variation_category_list.append(variation_item)
-#                        variation_base_category_items = variation_item.split('/')
-#                        if len(variation_base_category_items) > 0 :
-#                          line_variation_base_category_dict[variation_base_category_items[0]] = 1
-
-                  # update variation_base_category_list and line_variation_category_list for delivery_line
-#                  line_variation_base_category_list = line_variation_base_category_dict.keys()
-#                  invoice_line.setVariationBaseCategoryList(line_variation_base_category_list)
-#                  invoice_line.setVariationCategoryList(line_variation_category_list)
-
-                  # IMPORTANT : invoice cells are automatically created during setVariationCategoryList
-
-                  #XXX for now, we quickly need this working, without the need of variant_group
-                  object_to_update = invoice_line
-                  # compute quantity and price for invoice_cell or invoice_line and
-                  # build relation between simulation_movement and invoice_cell or invoice_line
-                  if object_to_update is not None :
-                    quantity = 0
-                    total_price = 0
-                    for movement in resource_group.movement_list :
-                      quantity += movement.getConvertedQuantity()
-                      try :
-                        total_price += movement.getNetConvertedQuantity() * movement.getPrice() # XXX WARNING - ADD PRICED QUANTITY
-                      except :
-                        total_price = None
-                      # What do we really need to update in the simulation movement ?
-                      if movement.getPortalType() == 'Simulation Movement' :
-                        movement._setDeliveryValue(object_to_update)
-                        reindexable_movement_list.append(movement)
-
-                    if quantity <> 0 and total_price is not None:
-                      average_price = total_price/quantity
-                    else :
-                      average_price = 0
-
-                    #LOG('buildInvoiceList edit', 0, repr(( object_to_update, quantity, average_price, )))
-                    object_to_update.edit(quantity = quantity,
-                                          price = average_price)
-
-                  # update quantity and price for each invoice_cell
-                  #XXX for variant_group in resource_group.group_list :
-                  if 0 :
-                    #LOG('Variant_group examin',0,str(variant_group.category_list))
-                    object_to_update = None
-                    # if there is no variation of the resource, update invoice_line with quantities and price
-                    if len(variant_group.category_list) == 0 :
-                      object_to_update = invoice_line
-                    # else find which invoice_cell is represented by variant_group
-                    else :
-                      categories_identity = 0
-                      #LOG('Before Check cell',0,str(invoice_cell_type))
-                      #LOG('Before Check cell',0,str(invoice_line.contentValues()))
-                      for invoice_cell in invoice_line.contentValues(filter={'portal_type':'Invoice Cell'}) :
-                        #LOG('Check cell',0,str(invoice_cell))
-                        #LOG('Check cell',0,str(variant_group.category_list))
-                        if len(variant_group.category_list) == len(invoice_cell.getVariationCategoryList()) :
-                          #LOG('Parse category',0,str(invoice_cell.getVariationCategoryList()))
-                          for category in invoice_cell.getVariationCategoryList() :
-                            if not category in variant_group.category_list :
-                              #LOG('Not found category',0,str(category))
-                              break
-                          else :
-                            categories_identity = 1
-
-                        if categories_identity :
-                          object_to_update = invoice_cell
-                          break
-
-                    # compute quantity and price for invoice_cell or invoice_line and
-                    # build relation between simulation_movement and invoice_cell or invoice_line
-                    if object_to_update is not None :
-                      cell_quantity = 0
-                      cell_total_price = 0
-                      for movement in variant_group.movement_list :
-                        cell_quantity += movement.getConvertedQuantity()
-                        try :
-                          cell_total_price += movement.getNetConvertedQuantity() * movement.getPrice() # XXX WARNING - ADD PRICED QUANTITY
-                        except :
-                          cell_total_price = None
-                        # What do we really need to update in the simulation movement ?
-                        if movement.getPortalType() == 'Simulation Movement' :
-                          movement._setDeliveryValue(object_to_update)
-                          reindexable_movement_list.append(movement)
-
-                      if cell_quantity <> 0 and cell_total_price is not None:
-                        average_price = cell_total_price/cell_quantity
-                      else :
-                        average_price = 0
-
-                      #LOG('buildInvoiceList edit', 0, repr(( object_to_update, cell_quantity, average_price, )))
-                      object_to_update.edit(quantity = cell_quantity,
-                                            price = average_price)
-
-      # we now reindex the movements we modified
-      for movement in reindexable_movement_list :
-        movement.immediateReindexObject()
-      return invoice_list
-
-
     # Pricing methods
     def _getTotalPrice(self, context):
       return 2.0
@@ -784,164 +431,6 @@ class Delivery(XMLObject):
       kw['category'] = self._getMovementResourceList()
       return self.portal_simulation.getMovementHistoryStat(**kw)
 
-
-# XXX FIXME: to be deleted
-    security.declareProtected(Permissions.AccessContentsInformation, 'collectMovement')
-    def collectMovement(self, movement_list):
-      """
-        Collect all movements into a list of group objects.
-      """
-      from Globals import InitializeClass
-
-      # Collect each delivery cell into a delivery line.
-      group_list = []
-      for movement in movement_list:
-        movement_in_group = 0
-        for group in group_list:
-          if group.test(movement):
-            group.append(movement)
-            movement_in_group = 1
-            break
-        if not movement_in_group:
-          group_list.append(Group(movement).__of__(self))
-
-      # This is required to build a matrix.
-      for group in group_list:
-        group.finish()
-
-      return group_list
-
-# XXX FIXME: to be deleted
-    security.declareProtected(Permissions.AccessContentsInformation, 'buildInvoiceLineList')
-    def buildInvoiceLineList(self, movement_group):
-      """
-        Build invoice lines from a list of movements.
-      """
-      invoice_line_list = []
-
-      if movement_group is not None:
-        for group in movement_group:
-          # Create each invoice_line in the new invoice
-          # but only if quantity > 0
-          if group.total_quantity > 0 :
-            invoice_line = self.newContent(portal_type = 'Invoice Line',
-                                          resource = group.resource,
-                                          quantity_unit = group.quantity_unit) # FIXME: more args
-            invoice_line_list.append(invoice_line)
-
-            # Make sure that the order is always preserved.
-            variation_base_category_list = list(group.variation_base_category_list)
-            variation_base_category_list.sort()
-            invoice_line.setVariationBaseCategoryList(variation_base_category_list)
-            #LOG('buildInvoiceLineList', 0, "group.variation_base_category_list = %s" % str(group.variation_base_category_list))
-            variation_category_list = []
-            for cell_key in group.matrix.getCellKeyList(base_id='movement'):
-              for variation_category in cell_key:
-                if variation_category not in variation_category_list:
-                  variation_category_list.append(variation_category)
-            invoice_line.setVariationCategoryList(variation_category_list)
-            # IMPORTANT : delivery cells are automatically created during setVariationCategoryList
-
-            #LOG('buildInvoiceLineList', 0, "invoice_line.contentValues() = %s" % str(invoice_line.contentValues()))
-            if len(variation_category_list) > 0:
-              for invoice_cell in invoice_line.contentValues(filter={'portal_type':'Invoice Cell'}):
-                category_list = invoice_cell.getVariationCategoryList()
-                # XXX getVariationCategoryList does not return the same order as setVariationBaseCategoryList
-                point = []
-                for base_category in group.variation_base_category_list:
-                  for category in category_list:
-                    if category.startswith(base_category + '/'):
-                      point.append(category)
-                      break
-                kw_list = {'base_id' : 'movement'}
-                cell = apply(group.matrix.getCell, point, kw_list)
-                #LOG('buildInvoiceLineList', 0,
-                #    "point = %s, cell = %s" % (str(point), str(cell)))
-                if cell is not None:
-                  #LOG('buildInvoiceLineList', 0,
-                  #    "quentity = %s, price = %s" % (str(cell.getQuantity()), str(cell.getPrice())))
-                  invoice_cell.edit(quantity = cell.getQuantity(),
-                                    price = cell.getPrice(),
-                                    force_update = 1)
-            else:
-              # There is no variation category.
-              invoice_line.edit(quantity = group.total_quantity,
-                                price = group.price,
-                                force_update = 1) # Use unit price JPSforYO
-
-      return invoice_line_list
-
-# XXX FIXME: to be deleted
-    # Simulation consistency propagation
-    security.declareProtected(Permissions.ModifyPortalContent, 'updateFromSimulation')
-    def updateFromSimulation(self, update_target = 0):
-      """
-      Update all lines of this transaction based on movements in the simulation
-      related to this transaction.
-      """
-      # XXX update_target no more used
-      transaction_type = self.getPortalType()
-      line_type = transaction_type + " Line"
-      to_aggregate_movement_list = []
-      to_reindex_list = []
-      source_section = self.getSourceSection()
-      destination_section = self.getDestinationSection()
-      resource = self.getResource()
-      start_date = self.getStartDate()
-
-      def updateLineOrCell(c):
-        quantity = 0
-        source = c.getSource()
-        destination = c.getDestination()
-        for m in c.getDeliveryRelatedValueList():
-          m_source_section = m.getSourceSection()
-          m_destination_section = m.getDestinationSection()
-          m_resource = m.getResource()
-          m_start_date = m.getStartDate()
-          m_source = m.getSource()
-          m_destination = m.getDestination()
-          m_quantity = m.getCorrectedQuantity()
-          if m_source_section == source_section and m_destination_section == destination_section \
-              and m_resource == resource and m_start_date == start_date:
-            if m_source == source and m_destination == destination:
-              # The path is the same, only the quantity may have changed
-              if m_quantity:
-                quantity += m_quantity
-            else:
-              # Source and/or destination have changed. The Simulation Movement has
-              # to be linked to a new TransactionLine
-              m.setDelivery('')
-              to_aggregate_movement_list.append(m)
-            to_reindex_list.append(m)
-          else:
-            # Source_section and/or destination_section and/or date and/or resource differ
-            # The Simulation Movement has to be linked to a new Transaction (or an existing one)
-            m.setDelivery('')
-            to_aggregate_movement_list.append(m)
-            to_reindex_list.append(m)
-        # Recalculate delivery ratios for the remaining movements in this line
-        c.setQuantity(quantity)
-        c.updateSimulationDeliveryProperties()
-
-      # Update the transaction from simulation
-      for l in self.contentValues(filter={'portal_type':self.getPortalDeliveryMovementTypeList()}):
-        if l.hasCellContent():
-          for c in l.contentValues(filter={'portal_type':self.getPortalDeliveryMovementTypeList()}):
-            updateLineOrCell(c)
-        else:
-          updateLineOrCell(l)
-
-      # Re-aggregate the disconnected movements
-      # XXX Dirty ; it should use DeliveryBuilder when it will be available
-      if len(to_aggregate_movement_list) > 0:
-        applied_rule_type = to_aggregate_movement_list[0].getRootAppliedRule().getSpecialiseId()
-        if applied_rule_type == "default_amortisation_rule":
-          self.portal_simulation.buildDeliveryList( self.portal_simulation.collectMovement(to_aggregate_movement_list,
-                                                        [ResourceMovementGroup, DateMovementGroup, PathMovementGroup] ) )
-
-      # Touch the Transaction to make an automatic converge
-      self.edit()
-
 # XXX FIXME: to be deleted
     security.declareProtected(Permissions.ModifyPortalContent, 'propagateResourceToSimulation')
     def propagateResourceToSimulation(self):
@@ -1155,4 +644,3 @@ class Delivery(XMLObject):
         LOG("ERP5 Error:", 100, 
             "Could not expand applied rule %s for delivery %s" %\
                 (applied_rule_id, self.getId()))
-
-- 
2.30.9