Commit dfc15f27 authored by Jean-Paul Smets's avatar Jean-Paul Smets

updated asset price method


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@199 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 3bfb5e73
...@@ -30,9 +30,9 @@ from Products.CMFCore.utils import UniqueObject ...@@ -30,9 +30,9 @@ from Products.CMFCore.utils import UniqueObject
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from Globals import InitializeClass, DTMLFile from Globals import InitializeClass, DTMLFile
from Products.ERP5Type.Document.Folder import Folder from Products.ERP5Type.Document import Folder
from Products.ERP5Type import Permissions from Products.ERP5Type import Permissions
from Products.ERP5.ERP5Globals import default_section_category, order_type_list from Products.ERP5.ERP5Globals import default_section_category, order_type_list, current_inventory_state_list
from Products.ERP5 import _dtmldir from Products.ERP5 import _dtmldir
...@@ -882,4 +882,162 @@ class SimulationTool (Folder, UniqueObject): ...@@ -882,4 +882,162 @@ class SimulationTool (Folder, UniqueObject):
return solve(matrix, point) return solve(matrix, point)
# Asset Price Calculation
def updateAssetPrice(self, resource, variation_text, section_category, node_category,
strict_membership=0, simulation_state=current_inventory_state_list):
section_value = self.portal_categories.resolveCategory(section_category)
node_value = self.portal_categories.resolveCategory(node_category)
# Initialize price
current_asset_price = 0.0 # Missing: initial inventory price !!!
current_inventory = 0.0
# Parse each movement
for b in self.Resource_zGetMovementHistoryList(resource=[resource],
variation_text=variation_text,
section_category=section_category,
node_category=node_category,
strict_membership=strict_membership,
simulation_state=simulation_state): # strict_membership not taken into account
m = b.getObject()
result = []
update_source = 0
update_destination = 0
if m is not None:
previous_inventory = current_inventory
quantity = m.getQuantity()
if quantity is None:
quantity = 0.0
if m.getSourceValue() is None:
# This is a production movement
# Use Industrial Price
current_inventory += quantity # Update inventory
asset_price = 0.0
# asset_price = m.getIndustrialPrice()
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Production or Inventory', 'Price: %s' % asset_price
))
update_source = 0
update_destination = 1
elif m.getDestinationValue() is None:
# This is a consumption movement - do nothing
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Consumption or Inventory', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 0
elif m.getSourceValue().isMemberOf(node_category) and m.getDestinationValue().isMemberOf(node_category):
# This is an internal movement - do nothing
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Internal', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
elif m.getSourceValue().isMemberOf(node_category) and quantity < 0:
# This is a physically inbound movement - try to use commercial price
if m.getSourceSectionValue() is None:
# No meaning
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Error', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
elif m.getDestinationSectionValue() is None:
# No meaning
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Error', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
elif m.getDestinationSectionValue().isMemberOf(section_category):
# Inbound from same section
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Inbound same section', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
else:
current_inventory += quantity # Update inventory
asset_price = m.getPrice()
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Inbound different section', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 0
elif m.getDestinationValue().isMemberOf(node_category) and quantity > 0:
# This is a physically inbound movement - try to use commercial price
# This is a physically inbound movement - try to use commercial price
if m.getSourceSectionValue() is None:
# No meaning
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Error', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
elif m.getDestinationSectionValue() is None:
# No meaning
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Error', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
elif m.getSourceSectionValue().isMemberOf(section_category):
# Inbound from same section
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Inbound same section', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 1
else:
current_inventory += quantity # Update inventory
asset_price = m.getPrice()
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Inbound different section', 'Price: %s' % asset_price
))
update_source = 1
update_destination = 0
else:
# Outbound movement
current_inventory += quantity # Update inventory
asset_price = current_asset_price
result.append((m.getStartDate(), m.getSource(), m.getSourceSection(), m.getDestination(), m.getDestinationSection(),
m.getQuantity(), 'Outbound', 'Price: %s' % asset_price
))
if quantity > 0:
update_source = 0
update_destination = 1
else:
update_source = 1
update_destination = 0
# Update asset_price
if current_inventory > 0:
# Update price with an average of incoming goods and current goods
current_asset_price = ( current_asset_price * previous_inventory + asset_price * quantity ) / float(current_inventory)
else:
# New price is the price of incoming goods - negative stock has no meaning for asset calculation
current_asset_price = asset_price
# Update Asset Price on the right side
if update_source:
m.setSourceAssetPrice(current_asset_price)
if update_destination:
m.setDestinationAssetPrice(current_asset_price)
return result
InitializeClass(SimulationTool) InitializeClass(SimulationTool)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment