diff --git a/product/ERP5/Document/CategoryDivergenceTester.py b/product/ERP5/Document/CategoryDivergenceTester.py new file mode 100755 index 0000000000000000000000000000000000000000..326e4a93e40b24908617aa2216664c0a4c5324fe --- /dev/null +++ b/product/ERP5/Document/CategoryDivergenceTester.py @@ -0,0 +1,121 @@ +############################################################################# +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Rafael Monnerat <rafael@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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type.ObjectMessage import ObjectMessage +from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface +from Products.ERP5.Document.PropertyDivergenceTester import \ + PropertyDivergenceTester + +class CategoryDivergenceTester(PropertyDivergenceTester): + """ + The purpose of this divergence tester is to check the + consistency between delivery movement and simulation movement + for some specific categories. + """ + meta_type = 'ERP5 Divergence Tester' + portal_type = 'Category Divergence Tester' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative interfaces + __implements__ = ( Interface.DivergenceTester, ) + + # Declarative properties + property_sheets = ( PropertySheet.Base + , PropertySheet.XMLObject + , PropertySheet.CategoryCore + , PropertySheet.DublinCore + , PropertySheet.DivergenceTester + ) + + + def explain(self, simulation_movement): + """ + This method returns a list of messages that contains + the divergence of the Delivery Line. + """ + divergence_message_list = [] + tested_property = self.getTestedPropertyList() + for tested_property_id, tested_property_title in \ + self._splitStringList(tested_property): + delivery_mvt = simulation_movement.getDeliveryValue() + message = None + delivery_mvt_category_list = \ + delivery_mvt.getPropertyList(tested_property_id) + simulation_category_list = \ + simulation_movement.getPropertyList(tested_property_id) + + # XXX Don't we need to check the order too ? + delivery_mvt_category_list.sort() + simulation_category_list.sort() + + if delivery_mvt_category_list != simulation_category_list: + + delivery_mvt_category_title_list = [] + for mvt_category in delivery_mvt_category_list: + category_value = delivery_mvt.resolveCategory(mvt_category) + if category_value.getPortalType() == 'Category': + delivery_mvt_category_title_list.append(category_value.getTranslatedTitle()) + else: + delivery_mvt_category_title_list.append(category_value.getTitle()) + + + simulation_category_title_list = [] + for mvt_category in simulation_category_list: + category_value = delivery_mvt.resolveCategory(mvt_category) + if category_value.getPortalType() == 'Category': + simulation_category_title_list.append(category_value.getTranslatedTitle()) + else: + simulation_category_title_list.append(category_value.getTitle()) + + delivery_mvt_property = ' , '.join(delivery_mvt_category_title_list) + simulation_mvt_property = ' , '.join(movement_category_title_list) + + solver_script_list = self.getSolverScriptList() + if solver_script_list is None: + solver_script_list = [] + + message = ObjectMessage(object_relative_url= delivery_mvt.getRelativeUrl(), + simulation_movement = simulation_movement, + decision_value = delivery_mvt_property , + prevision_value = simulation_mvt_property, + tested_property=tested_property_id, + message=tested_property_title, + solver_script_list=self._splitStringList(property = solver_script_list) + ) + + divergence_message_list.append(message) + + return divergence_message_list diff --git a/product/ERP5/Document/PropertyDivergenceTester.py b/product/ERP5/Document/PropertyDivergenceTester.py new file mode 100755 index 0000000000000000000000000000000000000000..00fbdd3c4e325fc224a62a22da8a0702dca1d263 --- /dev/null +++ b/product/ERP5/Document/PropertyDivergenceTester.py @@ -0,0 +1,109 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Rafael Monnerat <rafael@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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type.XMLObject import XMLObject + +from Products.ERP5Type.ObjectMessage import ObjectMessage +from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface +from Products.ERP5Type.Utils import convertToUpperCase + +class PropertyDivergenceTester(XMLObject): + """ + The purpose of this divergence tester is to check the + consistency between delivery movement and simulation movement + for some specific properties. + """ + meta_type = 'ERP5 Divergence Tester' + portal_type = 'Property Divergence Tester' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative interfaces + __implements__ = ( Interface.DivergenceTester, ) + + # Declarative properties + property_sheets = ( PropertySheet.Base + , PropertySheet.XMLObject + , PropertySheet.CategoryCore + , PropertySheet.DublinCore + , PropertySheet.DivergenceTester + ) + + def test(self, simulation_movement): + """ + This is the fast method to test, return 0 or 1. + It depends if the simulation_movement is divergent or not. + """ + return len(self.explain(simulation_movement)) + + def explain(self, simulation_movement): + """ + This method returns a list of messages that contains + the divergence of the Delivery Line. + """ + divergence_message_list = [] + tested_property = self.getTestedPropertyList() + for tested_property_id, tested_property_title in \ + self._splitStringList(property=tested_property): + + delivery_mvt = simulation_movement.getDeliveryValue() + delivery_mvt_property = delivery_mvt.getProperty(tested_property_id) + simulation_mvt_property = simulation_movement.getProperty(tested_property_id) + + message = None + + if delivery_mvt_property != simulation_mvt_property: + solver_script_list = self.getSolverScriptList() + if solver_script_list is None: + solver_script_list = [] + message = ObjectMessage( + object_relative_url=delivery_mvt.getRelativeUrl(), + simulation_movement=simulation_movement, + decision_value=delivery_mvt_property , + prevision_value=simulation_mvt_property, + tested_property=tested_property_id, + message=tested_property_title, + solver_script_list=self._splitStringList(solver_script_list) + ) + divergence_message_list.append(message) + + return divergence_message_list + + def _splitStringList(self, string_list): + """ + Convert a list of string with a pipe (ex: ["azert | qsdfg", ] ) + to a list of tuple (ex: [("azert", "qsdfg"), ] ) + """ + return [tuple([x.strip() for x in x.split('|')]) for x in string_list] diff --git a/product/ERP5/Document/QuantityDivergenceTester.py b/product/ERP5/Document/QuantityDivergenceTester.py new file mode 100755 index 0000000000000000000000000000000000000000..f8d74e23dfcf144c5173a8f52a7143dde8de9620 --- /dev/null +++ b/product/ERP5/Document/QuantityDivergenceTester.py @@ -0,0 +1,107 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Rafael M. Monnerat <rafael@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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type.ObjectMessage import ObjectMessage +from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface +from Products.ERP5.Document.PropertyDivergenceTester import \ + PropertyDivergenceTester + +class QuantityDivergenceTester(PropertyDivergenceTester): + """ + The purpose of this divergence tester is to check the + consistency between delivery movement and simulation movement + for the property quantity. + """ + meta_type = 'ERP5 Divergence Tester' + portal_type = 'Quantity Divergence Tester' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative interfaces + __implements__ = ( Interface.DivergenceTester, ) + + + # Declarative properties + property_sheets = ( PropertySheet.Base + , PropertySheet.XMLObject + , PropertySheet.CategoryCore + , PropertySheet.DublinCore + , PropertySheet.DivergenceTester + ) + + + def explain(self, simulation_movement): + """ + This method returns a list of messages that contains + the divergence of the Delivery Line. + """ + delivery = simulation_movement.getDeliveryValue() + + d_quantity = delivery.getQuantity() + quantity = simulation_movement.getCorrectedQuantity() + d_error = simulation_movement.getDeliveryError() + + solver_script_list = self.getSolverScriptList() + if solver_script_list is None: + solver_script_list = [] + + message = ObjectMessage(object_relative_url= delivery.getRelativeUrl(), + simulation_movement = simulation_movement, + decision_value = d_quantity , + prevision_value = quantity, + tested_property='quantity', + message='Quantity', + solver_script_list=self._splitStringList(solver_script_list) + ) + + + if quantity is None: + if d_quantity is None: + return [] + return [message] + if d_quantity is None: + d_quantity = 0 + if d_error is None: + d_error = 0 + delivery_ratio = simulation_movement.getDeliveryRatio() + # if the delivery_ratio is None, make sure that we are + # divergent even if the delivery quantity is 0 + if delivery_ratio is not None: + d_quantity *= delivery_ratio + if delivery_ratio == 0 and quantity > 0: + return [message] + if d_quantity != quantity + d_error: + return [message] + return [] diff --git a/product/ERP5/Interface/DivergenceTester.py b/product/ERP5/Interface/DivergenceTester.py new file mode 100755 index 0000000000000000000000000000000000000000..97f2e96829fc97efa0190f970c9860afc03a4845 --- /dev/null +++ b/product/ERP5/Interface/DivergenceTester.py @@ -0,0 +1,50 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Rafael Monnerat <rafael@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. +# +############################################################################## + +try: + from Interface import Interface +except ImportError: + # for Zope versions before 2.6.0 + from Interface import Base as Interface + +class DivergenceTester(Interface): + """ + ERP5 Divergence Tester + """ + + def test(simulation_movement): + """ + This is the fast method to test, return 0 or 1. + It depends if the simulation_movement is divergent or not. + """ + + def explain(simulation_movement): + """ + This method returns a list of messages that contains + the divergence of the Delivery Line. + """ diff --git a/product/ERP5/PropertySheet/DivergenceTester.py b/product/ERP5/PropertySheet/DivergenceTester.py new file mode 100755 index 0000000000000000000000000000000000000000..29a55e5756ec1a3b4bd0117c53c1a37f60e48581 --- /dev/null +++ b/product/ERP5/PropertySheet/DivergenceTester.py @@ -0,0 +1,46 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Rafael Monnerat <rafael@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. +# +############################################################################## + + +class DivergenceTester: + """ + Divergence Tester are use for the divergence testers. + """ + + _properties = ( + { 'id' : 'tested_property', + 'description' : 'Property used to Test', + 'type' : 'lines', + 'default' : (), + 'mode' : 'w' }, + { 'id' : 'solver_script', + 'description' : 'List of scripts used to call the solvers', + 'type' : 'string', + 'multivalued' : 1, + 'mode' : 'w' }, + )