diff --git a/product/ERP5/Interface/IAmount.py b/product/ERP5/Interface/IAmount.py new file mode 100644 index 0000000000000000000000000000000000000000..830787cba6d4cc0590f6f1e1ecf528611f5c8f36 --- /dev/null +++ b/product/ERP5/Interface/IAmount.py @@ -0,0 +1,154 @@ +############################################################################## +# +# Copyright (c) 2009 Nexedi SARL 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 responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from Interface import Interface + +class IAmount(Interface): + """ + An amount represents a quantity of a given resource + in a given quantity unit. Optional efficiency + or (exclusive) profit/loss quantity can be specified + in order to represent a profit or loss ratio to take + into account in calculations. + + The Amount interface is useful each time + we need to add or substract amounts of resources + independently of a movement. This is the case for example + for all Transformation related classes. + + Equations: + net_quantity = quantity * efficiency + + TODO: + consider how to make Interface compatible + with accessor generation (ex. getResource) + + Addition: + target_quantity is obsolete, it is never defined. + """ + + # Core API + def getQuantity(): + """ + Returns the quantity of the resource + in the unit specified by the Amount + """ + + def getResource(): + """ + Returns the resource category relative URL + of the Amount + """ + + def getQuantityUnit(): + """ + Returns the quantity unit category relative URL + of the Amount + """ + + def isCancellationAmount(): + """ + A cancellation amount must be interpreted + reversely write to the sign of qauntity. + + For example, a negative credit for a cancellation + amount is a negative credit, not a positive + debit. + + A negative production quantity for a cancellation + amount is a cancelled production, not + a consumption + """ + + # Net Quantity API + def getEfficiency(): + """ + Returns a value which is rate affect to the net quantity + Only used for transformation for now. + """ + + def getNetQuantity(): + """ + Returns affected quantity by some optional effects. + """ + + # Price API + + def getPrice(): + """ + Returns price + """ + + def getTotalPrice(): + """ + Returns total price for the number of items + """ + + # Conversion API + def getConvertedQuantity(): + """ + Returns the quantity converted by the resource + """ + + def getNetConvertedQuantity(): + """ + Returns the net quantity converted by the resource + """ + + # Make it possible to add amounts + def __add__(value): + """ + Add + + If the amount can understands argument as amount for addition, + returns calculated + """ + + def __sub__(value): + """ + Substract + + If the amount can understands argument as amount for substraction, + returns calculated + """ + + def __mul__(value): + """ + Multiply + + If the amount can understands argument as efficiency for multiplication, + returns calculated + """ + + def __div__(value): + """ + Devide + + If the amount can understands argument as efficiency for division, + returns calculated + """ diff --git a/product/ERP5/Interface/IArrow.py b/product/ERP5/Interface/IArrow.py index c233d7f25fada114bae87134c8e8fd5b62ab76e3..dc417e68384b31b92b90427c97861802650f7048 100644 --- a/product/ERP5/Interface/IArrow.py +++ b/product/ERP5/Interface/IArrow.py @@ -29,33 +29,16 @@ from zope.interface import Interface class IArrow(Interface): - """ - The Arrow lists the methods which are available to - access all source and destination categories of - a movement or of a delivery. + """The Arrow lists the methods which are available to + access all source and destination categories of + a movement or of a delivery. """ def getSourceArrowBaseCategoryList(): - """ - Returns all categories which are used to define the source - of this Arrow + """Returns all categories which are used to define the source + of this Arrow """ def getDestinationArrowBaseCategoryList(): - """ - Returns all categories which are used to define the destination - of this Arrow - """ - - def _getSourceArrowList(spec=(), filter=None, portal_type=(), base=0, - keep_default=1, checked_permission=None): - """ - Returns all categories which define the source of the - document (ex. source, source_section, etc.) - """ - - def _getDestinationArrowList(spec=(), filter=None, portal_type=(), base=0, - keep_default=1, checked_permission=None): - """ - Returns all categories which define the destination of the - document (ex. destination, destination_section, etc.) - """ + """Returns all categories which are used to define the destination + of this Arrow + """ \ No newline at end of file diff --git a/product/ERP5/Interface/IMovement.py b/product/ERP5/Interface/IMovement.py new file mode 100644 index 0000000000000000000000000000000000000000..19ff98a3503d3006c9f8cc90dbd6864fcf2dc682 --- /dev/null +++ b/product/ERP5/Interface/IMovement.py @@ -0,0 +1,253 @@ +############################################################################## +# +# Copyright (c) 2009 Nexedi SARL 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 responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from Interface import Interface + +class IMovement(Interface): + """ + A movement represents amount of resource how are changed + on the path. The movement should be ables to provide how + amount is/was existed on node both source and destination. + Because of movement may be affected on path. + + The movement interface can be represents any kind of delivery. + It is useful to represent changed of between nodes. + + Equations: + destination_quantity = source_quantity * efficiency + (These values can be calculated by Amount) + + + Production/Consumption + + (A -> B) + if source_quantity > 0 and destination_quantity > 0 + production_quantity = destination_quantity + consumption_quantity = source_quantity + + if source_quantity < 0 and destination_quantity < 0 + production_quantity = - source_quantity + consumption_quantity = - destination_quantity + + if source_quantity < 0 and destination_quantity > 0 + or + source_quantity > 0 and destination_quantity < 0 + raise + + + (A -> Nothing) + if source_quantity > 0 + consumption_quantity = source_quantity + production_quantity = 0 + + if source_quantity < 0 + consumption_quantity = 0 + production_quantity = - source_quantity + + (Nothing -> B) + if destination_quantity > 0 + consumption_quantity = 0 + production_quantity = destination_quantity + + if destination_quantity < 0 + consumption_quantity = - destination_quantity + production_quantity = 0 + + + Credit/Debit + + (A -> B) + if source_quantity > 0 and destination_quantity > 0 + source_credit = - source_quantity + source_debit = source_quantity + destination_credit = destination_quantity + destination_debit = - destination_quantity + + if source_quantity < 0 and destination_quantity < 0 + source_credit = source_quantity + source_debit = - source_quantity + destination_credit = - destination_quantity + destination_debit = destination_quantity + + if source_quantity < 0 and destination_quantity > 0 + or + source_quantity > 0 and destination_quantity < 0 + raise + + (A -> Nothing) + if source_quantity > 0 + source_credit = source_quantity + source_debit = - source_quantity + destination_credit = 0 + destination_debit = 0 + + if source_quantity < 0 + source_credit = - source_quantity + source_debit = source_quantity + destination_credit = 0 + destination_debit = 0 + + (Nothing -> B) + if destination_quantity > 0 + source_credit = 0 + source_debit = 0 + destination_credit = destination_quantity + destination_debit = - destination_quantity + + if destination_quantity < 0 + source_credit = 0 + source_debit = 0 + destination_credit = - destination_quantity + destination_debit = destination_quantity + + source_asset_price = price + destination_asset_price = price + """ + + # Conversion API for cataloging + def getConvertedSourceQuantity(): + """ + Returns the quantity how are removed + from source by the movement + """ + + def getConvertedDestinationQuantity(): + """ + Returns the quantity how are reached + to destination by the movement + """ + + # Helper methods for Production + def getConsumptionQuantity(): + """ + Returns the quantity how are consumed + on the path by the movement + """ + + def getProductionQuantity(): + """ + Returns the quantity how are produced + on the path by the movement + """ + + # Helper methods for Accounting + def getSourceDebit(): + """ + Returns the quantity how are debited + from source node by the movement + """ + + def getSourceCredit(): + """ + Returns the quantity how are credited + from source node by the movement + """ + + def getDestinationDebit(): + """ + Returns the quantity how are debited + to destination node by the movement + """ + + def getDestinationCredit(): + """ + Returns the quantity how are credited + to destination node by the movement + """ + + def getSourceAssetPrice(): + """ + Returns the price how are taken + from source by the movement + """ + + def getSourceInventoriatedTotalAssetPrice(): + """ + Returns a price which can be used + to calculate stock value (asset) + """ + + def getSourceInventoriatedTotalAssetDebit(): + """ + Returns the debit part of inventoriated + source total asset price. + """ + + def getSourceInventoriatedTotalAssetCredit(): + """ + Returns the credit part of inventoriated + source total asset price. + """ + + def getSourceAssetDebit(): + """ + Return the debit part of the source total + asset price. + """ + + def getSourceAssetCredit(): + """ + Return the credit part of the source total + asset price. + """ + + def getDestinationAssetPrice(): + """ + Returns the price how are given + to destination by the movement + """ + + def getDestinationInventoriatedTotalAssetPrice(): + """ + Returns a price which can be used + to calculate stock value (asset) + """ + + def getDestinationInventoriatedTotalAssetDebit(): + """ + Returns the debit part of inventoriated + destination total asset price. + """ + + def getDestinationInventoriatedTotalAssetCredit(): + """ + Returns the credit part of inventoriated + destination total asset price. + """ + + def getDestinationAssetDebit(): + """ + Return the debit part of the destination total + asset price. + """ + + def getDestinationAssetCredit(): + """ + Return the credit part of the destination total + asset price. + """ diff --git a/product/ERP5/Interface/ISimulationMovement.py b/product/ERP5/Interface/ISimulationMovement.py new file mode 100644 index 0000000000000000000000000000000000000000..636ffa90daa2973b6bb9d7b2b5c132d2211879dd --- /dev/null +++ b/product/ERP5/Interface/ISimulationMovement.py @@ -0,0 +1,118 @@ +############################################################################## +# +# Copyright (c) 2009 Nexedi SARL 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 responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from Interface import Interface + +class ISimulationMovement(Interface): + """ + The SimulationMovement interface + introduces the possibility to define + quantity errors between the simulation + and the reality. + + In short: parent applied rules use the Movement + API to define quantity. + + Child applied rules use the Delivered API + to use appropriate values which include + the delivery_error. + + DeliverySolver either solve divergence by + setting the delivery_error (then no target + solver needed, at least for quantity) or + by changing the quantity (then TargetSolver + is needed to backtrack the quantity). + + quantity(SM) + delivery_error (SM) = + quantity(DL) * delivery_ratio(SM) + """ + + # Delivery API + def getDeliveryRatio(): + """ + Returns ratio to apply on the quantity + property of the corresponding delivery + to obtain the current quantity + """ + + def getDeliveryError(): + """ + Returns correction to make the match + between delivery quantity and simulation + quantity consistent + """ + + def getDeliveryQuantity(): + """ + Returns quantity which was actually + shipped, taking into account the errors + of the simulation fixed by the delivery + + quantity + delivery_error + """ + + def getDeliveryConvertedQuantity(): + """ + Returns delivery quantity converted by the resource + """ + + # Divergence API + def isConvergent(): + """ + Returns the simulation movement is convergent + or not, with related the delivery + """ + + def isDivergent(): + """ + Returns the simulation movement is divergent + or not, to related the delivery + """ + + def getDivergenceList(): + """ + Returns listed divergences which is made by tester + of parent applied rule + Each divergence has why the delivery was judged + """ + + def isFrozen(): + """ + Returns status of the simulation movement, it is + frozen or not, once it is frozen, all operations + can not change anything of the simulation movement + """ + + def isSimulated(): + """ + Returns the simulation movement is simulated or not + When the simulation movement is simulated, all operations + can not remove it, but can update, because related delivery + to be orphan, if can remove it + """ +