FIFO.py 3.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2008-2009 Nexedi SA and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility 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
# guarantees 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.
#
##############################################################################

30 31
import zope.interface
from Products.ERP5Type import interfaces
32 33 34 35
from DeliverySolver import DeliverySolver

class FIFO(DeliverySolver):
  """
Leonardo Rochael Almeida's avatar
typo  
Leonardo Rochael Almeida committed
36
  The FIFO solver reduces delivered quantity by reducing the quantity of
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
37
  simulation movements from the last order.
38
  """
Jean-Paul Smets's avatar
Jean-Paul Smets committed
39

40 41 42
  # Declarative interfaces
  zope.interface.implements(interfaces.IDeliverySolver)

43 44
  title = 'FIFO Solver'

45 46 47 48 49 50
  # IDeliverySolver Implementation
  def __init__(self, simulation_movement_list):
    """
      Move this to mixin
    """
    self.simulation_movement_list = simulation_movement_list
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
51 52

  def getTotalQuantity(self):
53 54 55 56 57 58 59 60 61
    """
      Move this to mixin
    """
    total_quantity = 0
    for movement in self.simulation_movement_list:
      total_quantity += movement.getQuantity()
    return total_quantity

  def setTotalQuantity(self, new_quantity):
Jean-Paul Smets's avatar
Jean-Paul Smets committed
62 63 64
    """
    """
    result = []
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
65
    simulation_movement_list = self._getSimulationMovementList()
66
    remaining_quantity = self.getTotalQuantity() - new_quantity
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
67
    for movement in simulation_movement_list:
Jean-Paul Smets's avatar
Jean-Paul Smets committed
68
      if remaining_quantity:
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
69 70 71 72
        quantity = movement.getQuantity()
        if quantity < remaining_quantity:
          result.append((movement, quantity))
          remaining_quantity -= quantity
Jean-Paul Smets's avatar
Jean-Paul Smets committed
73 74
          movement.setQuantity(0)
        else:
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
75 76
          result.append((movement, remaining_quantity))
          movement.setQuantity(quantity - remaining_quantity)
Jean-Paul Smets's avatar
Jean-Paul Smets committed
77 78 79 80
          remaining_quantity = 0
    # Return movement, split_quantity tuples
    for movement in simulation_movement_list:
      movement.setDeliveryRatio(movement.getQuantity() / new_quantity)
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
81 82 83 84 85 86
    return result

  def _getSimulationMovementList(self):
    """
    Returns a list of simulation movement sorted from the last order.
    """
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
87
    simulation_movement_list = self.simulation_movement_list
88
    if len(simulation_movement_list) > 1:
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
89
      return sorted(simulation_movement_list,
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
90
        key=lambda x:x.getExplainationValue().getStartDate(), reverse=True)
Kazuhiko Shiozaki's avatar
Kazuhiko Shiozaki committed
91 92
    else:
      return simulation_movement_list