diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml new file mode 100644 index 0000000000000000000000000000000000000000..671ea4cfc5efc04e447bc36054a2eb7237024338 --- /dev/null +++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml @@ -0,0 +1,124 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <tuple> + <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_property_domain_dict</string> </key> + <value> + <dictionary> + <item> + <key> <string>short_title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + </value> + </item> + <item> + <key> <string>title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> + </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>acquire_local_roles</string> </key> + <value> <int>1</int> </value> + </item> + <item> + <key> <string>categories</string> </key> + <value> + <tuple/> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string>The FIFO solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value> + </item> + <item> + <key> <string>factory</string> </key> + <value> <string>addFIFODeliverySolver</string> </value> + </item> + <item> + <key> <string>group_list</string> </key> + <value> + <tuple> + <string>delivery_solver</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>FIFO Delivery Solver</string> </value> + </item> + <item> + <key> <string>init_script</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>permission</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>portal_type</string> </key> + <value> <string>Solver Type</string> </value> + </item> + <item> + <key> <string>solver_action_title</string> </key> + <value> <string>First In, First Out</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="2" aka="AAAAAAAAAAI="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>short_title</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="3" aka="AAAAAAAAAAM="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>title</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml new file mode 100644 index 0000000000000000000000000000000000000000..245672af407aa8da0d1534df3df17a6047a599fe --- /dev/null +++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml @@ -0,0 +1,124 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <tuple> + <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_property_domain_dict</string> </key> + <value> + <dictionary> + <item> + <key> <string>short_title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + </value> + </item> + <item> + <key> <string>title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> + </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>acquire_local_roles</string> </key> + <value> <int>1</int> </value> + </item> + <item> + <key> <string>categories</string> </key> + <value> + <tuple/> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string>The LIFO solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value> + </item> + <item> + <key> <string>factory</string> </key> + <value> <string>addLIFODeliverySolver</string> </value> + </item> + <item> + <key> <string>group_list</string> </key> + <value> + <tuple> + <string>delivery_solver</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>LIFO Delivery Solver</string> </value> + </item> + <item> + <key> <string>init_script</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>permission</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>portal_type</string> </key> + <value> <string>Solver Type</string> </value> + </item> + <item> + <key> <string>solver_action_title</string> </key> + <value> <string>Last In, First Out</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="2" aka="AAAAAAAAAAI="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>short_title</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="3" aka="AAAAAAAAAAM="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>title</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml new file mode 100644 index 0000000000000000000000000000000000000000..5bb4f254b5bf9e33421acb2370e6f4a0936264cf --- /dev/null +++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml @@ -0,0 +1,124 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <tuple> + <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>_property_domain_dict</string> </key> + <value> + <dictionary> + <item> + <key> <string>short_title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + </value> + </item> + <item> + <key> <string>title</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> + </value> + </item> + </dictionary> + </value> + </item> + <item> + <key> <string>acquire_local_roles</string> </key> + <value> <int>1</int> </value> + </item> + <item> + <key> <string>categories</string> </key> + <value> + <tuple/> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string>The Minimise Price solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value> + </item> + <item> + <key> <string>factory</string> </key> + <value> <string>addMinimisePriceDeliverySolver</string> </value> + </item> + <item> + <key> <string>group_list</string> </key> + <value> + <tuple> + <string>delivery_solver</string> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>Minimise Price Delivery Solver</string> </value> + </item> + <item> + <key> <string>init_script</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>permission</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>portal_type</string> </key> + <value> <string>Solver Type</string> </value> + </item> + <item> + <key> <string>solver_action_title</string> </key> + <value> <string>Minimise Price</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="2" aka="AAAAAAAAAAI="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>short_title</string> </value> + </item> + </dictionary> + </pickle> + </record> + <record id="3" aka="AAAAAAAAAAM="> + <pickle> + <tuple> + <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>domain_name</string> </key> + <value> <string>erp5_content</string> </value> + </item> + <item> + <key> <string>property_name</string> </key> + <value> <string>title</string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_simulation_test/bt/template_path_list b/bt5/erp5_simulation_test/bt/template_path_list index d0e01a5e7dfb980374487393e2ee8ebac9730a62..250ce098455499ffc23ab61972956e086831b9d1 100644 --- a/bt5/erp5_simulation_test/bt/template_path_list +++ b/bt5/erp5_simulation_test/bt/template_path_list @@ -23,6 +23,12 @@ portal_solvers/Accept Solver portal_solvers/Accept Solver/* portal_solvers/Adopt Solver portal_solvers/Adopt Solver/* +portal_solvers/FIFO Delivery Solver +portal_solvers/FIFO Delivery Solver/* +portal_solvers/LIFO Delivery Solver +portal_solvers/LIFO Delivery Solver/* +portal_solvers/Minimise Price Delivery Solver +portal_solvers/Minimise Price Delivery Solver/* portal_solvers/Production Reduction Solver portal_solvers/Production Reduction Solver/* portal_solvers/Quantity Cancel Solver diff --git a/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml b/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml index 4e5ddf06a2b3adf2cfd0378051ca8aa2c3d01df3..5bfe8dc6a03c8692958fd24c9394328a95b7cad2 100644 --- a/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml +++ b/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml @@ -47,6 +47,7 @@ <string>destination_account</string> <string>source_function</string> <string>destination_function</string> + <string>specialise</string> </tuple> </value> </item> diff --git a/product/ERP5/tests/testERP5Simulation.py b/product/ERP5/tests/testERP5Simulation.py index 625a4127f7a4d8008dee84df1daf8c9c97a3cce4..204497b0f3dbc79a005aab89204c4265cf31b42d 100644 --- a/product/ERP5/tests/testERP5Simulation.py +++ b/product/ERP5/tests/testERP5Simulation.py @@ -44,15 +44,6 @@ class TestERP5SimulationMixin(TestInvoiceMixin): def afterSetUp(self, quiet=1, run=1): TestInvoiceMixin.afterSetUp(self) - portal_rules = self.portal.portal_rules - for rule in portal_rules.objectValues(portal_type='Order Root Simulation Rule'): - if rule.getValidationState() == 'validated': - rule.invalidate() - - self.validateNewRules() - self.setUpBusinessProcess() - - def setUpBusinessProcess(self): business_process = self.portal.business_process_module.erp5_default_business_process pay_business_link = business_process['pay'] pay_business_link.setSource('account_module/bank') @@ -125,296 +116,6 @@ class TestERP5SimulationMixin(TestInvoiceMixin): if new_order_rule.getValidationState() != 'validated': new_order_rule.validate() - def stepCreateOrder(self,sequence=None, sequence_list=None, **kw): - """ - Create a empty order - """ - organisation = sequence.get('organisation') - project = sequence.get('project') -# person = sequence.get('person') - portal = self.getPortal() - order_module = portal.getDefaultModule(portal_type=self.order_portal_type) - order = order_module.newContent(portal_type=self.order_portal_type) - order.edit( - title = "Order%s" % order.getId(), - specialise='business_process_module/erp5_default_business_process', - start_date = self.datetime + 10, - stop_date = self.datetime + 20, - ) - if organisation is not None: - order.edit(source_value=organisation, - source_section_value=organisation, - destination_value=organisation, - destination_section_value=organisation, - # Added for test Packing List Copy - source_decision_value=organisation, - destination_decision_value=organisation, - source_administration_value=organisation, - destination_administration_value=organisation, - ) - if project is not None: - order.edit(source_project_value=project, - destination_project_value=project, - ) - sequence.edit( order = order ) - - def _acceptDecisionQuantity(self, document): - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(document) - quantity_solver_decision = filter( - lambda x:x.getCausalityValue().getTestedProperty()=='quantity', - solver_process.contentValues())[0] - # use Quantity Accept Solver. - quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver']) - # configure for Accept Solver. - kw = {'tested_property_list':['quantity',]} - quantity_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def _acceptDivergenceOnInvoice(self, invoice, divergence_list): - print invoice, divergence_list - return self._acceptDecisionQuantity(invoice) - - def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None): - """ - Solve quantity divergence by using solver tool. - """ - packing_list = sequence.get('packing_list') - self._acceptDecisionQuantity(packing_list) - - def stepAcceptDecisionQuantityInvoice(self, sequence=None, - sequence_list=None): - """ - Solve quantity divergence by using solver tool. - """ - invoice = sequence.get('invoice') - self._acceptDecisionQuantity(invoice) - - def stepAcceptDecisionResource(self,sequence=None, sequence_list=None): - """ - Solve quantity divergence by using solver tool. - """ - packing_list = sequence.get('packing_list') - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - resource_solver_decision = filter( - lambda x:x.getCausalityValue().getTestedProperty()=='resource', - solver_process.contentValues())[0] - # use Resource Replacement Solver. - resource_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver']) - # configure for Accept Solver. - kw = {'tested_property_list':['resource',]} - resource_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def stepSplitAndDeferPackingList(self, sequence=None, sequence_list=None): - """ - Do the split and defer action - """ - packing_list = sequence.get('packing_list') - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - quantity_solver_decision = filter( - lambda x:x.getCausalityValue().getTestedProperty()=='quantity', - solver_process.contentValues())[0] - # use Quantity Split Solver. - quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver']) - # configure for Quantity Split Solver. - kw = {'delivery_solver':'FIFO Delivery Solver', - 'start_date':self.datetime + 15, - 'stop_date':self.datetime + 25} - quantity_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - # build split deliveries manually. XXX ad-hoc - previous_tag = None - for delivery_builder in packing_list.getBuilderList(): - this_builder_tag = '%s_split_%s' % (packing_list.getPath(), - delivery_builder.getId()) - after_tag = [] - if previous_tag: - after_tag.append(previous_tag) - delivery_builder.activate( - after_method_id=('solve', - 'immediateReindexObject', - 'recursiveImmediateReindexObject',), # XXX too brutal. - after_tag=after_tag, - ).build(explanation_uid=packing_list.getCausalityValue().getUid()) - - def _adoptPrevisionQuantity(self, packing_list): - """ - Solve quantity divergence by using solver tool. - """ - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - quantity_solver_decision = filter( - lambda x:x.getCausalityValue().getTestedProperty()=='quantity', - solver_process.contentValues())[0] - # use Quantity Adoption Solver. - quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Adopt Solver']) - # configure for Adopt Solver. - kw = {'tested_property_list':['quantity',]} - quantity_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def _adoptDivergenceOnInvoice(self, invoice, divergence_list): - print invoice, divergence_list - return self._adoptPrevisionQuantity(invoice) - - def _adoptDivergenceOnPackingList(self, packing_list, divergence_list): - print packing_list, divergence_list - return self._adoptPrevisionQuantity(packing_list) - - def stepAdoptPrevisionQuantity(self,sequence=None, sequence_list=None): - """ - Solve quantity divergence by using solver tool. - """ - packing_list = sequence.get('packing_list') - self._adoptPrevisionQuantity(packing_list) - - def stepNewPackingListAdoptPrevisionQuantity(self, sequence=None, - sequence_list=None): - """ - Solve quantity divergence by using solver tool. - """ - packing_list = sequence.get('new_packing_list') - self._adoptPrevisionQuantity(packing_list) - - def stepAdoptPrevisionResource(self,sequence=None, sequence_list=None): - """ - Solve resource divergence by using solver tool. - """ - packing_list = sequence.get('packing_list') - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - resource_solver_decision = filter( - lambda x:x.getCausalityValue().getTestedProperty()=='resource', - solver_process.contentValues())[0] - # use Resource Adopt Solver. - resource_solver_decision.setSolverValue(self.portal.portal_solvers['Adopt Solver']) - # configure for Adopt Solver. - kw = {'tested_property_list':['resource',]} - resource_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def stepCheckPackingListLineWithSameResource(self,sequence=None, sequence_list=None): - """ - Look if the packing list has new previsions - """ - old_packing_list_line = sequence.get('packing_list_line') - packing_list_line = old_packing_list_line.aq_parent[str(int(old_packing_list_line.getId())-1)] - resource = sequence.get('resource') - for line in sequence.get('packing_list').getMovementList(): - self.assertEquals(line.getResourceValue(), resource) - self.assertEquals(line.getQuantity(), self.default_quantity) - self.assertEquals(line.getCausalityList(), - [x.getParentValue().getParentValue().getDelivery() for x in \ - line.getDeliveryRelatedValueList()]) - - def stepUnifyDestinationWithDecision(self,sequence=None, sequence_list=None): - """ - Check if simulation movement are disconnected - """ - packing_list = sequence.get('packing_list') - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - for destination_solver_decision in filter( - lambda x:x.getCausalityValue().getTestedProperty()=='destination', - solver_process.contentValues()): - # use Destination Replacement Solver. - destination_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver']) - # configure for Accept Solver. - kw = {'tested_property_list':['destination',]} - destination_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def _unifyStartDateWithDecision(self, document): - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(document) - for start_date_solver_decision in filter( - lambda x:x.getCausalityValue().getTestedProperty()=='start_date', - solver_process.contentValues()): - # use StartDate Replacement Solver. - start_date_solver_decision.setSolverValue(self.portal.portal_solvers['Unify Solver']) - # configure for Unify Solver. - kw = {'tested_property_list':['start_date',], - 'value':document.getStartDate()} - start_date_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def stepUnifyStartDateWithDecision(self,sequence=None, sequence_list=None): - packing_list = sequence.get('packing_list') - self._unifyStartDateWithDecision(packing_list) - - def stepUnifyStartDateWithDecisionInvoice(self,sequence=None, sequence_list=None): - invoice = sequence.get('invoice') - self._unifyStartDateWithDecision(invoice) - - def stepUnifyStartDateWithPrevision(self,sequence=None, sequence_list=None): - """ - Check if simulation movement are disconnected - """ - packing_list = sequence.get('packing_list') - applied_rule = sequence.get('applied_rule') - simulation_line_list = applied_rule.objectValues() - start_date = simulation_line_list[-1].getStartDate() - solver_process_tool = self.portal.portal_solver_processes - solver_process = solver_process_tool.newSolverProcess(packing_list) - for start_date_solver_decision in filter( - lambda x:x.getCausalityValue().getTestedProperty()=='start_date', - solver_process.contentValues()): - # use StartDate Replacement Solver. - start_date_solver_decision.setSolverValue(self.portal.portal_solvers['Unify Solver']) - # configure for Unify Solver. - kw = {'tested_property_list':['start_date',], - 'value':start_date} - start_date_solver_decision.updateConfiguration(**kw) - solver_process.buildTargetSolverList() - solver_process.solve() - - def stepCheckPackingListLineWithDifferentResource(self,sequence=None, sequence_list=None): - """ - Look if the packing list has new previsions - """ - packing_list_line = sequence.get('packing_list_line') - new_resource = sequence.get('resource') - self.assertEquals(packing_list_line.getQuantity(), self.default_quantity*2) - self.assertEquals(packing_list_line.getResourceValue(), new_resource) - simulation_line_list = packing_list_line.getDeliveryRelatedValueList() - order_line_list = sum([x.getParentValue().getParentValue().getDeliveryList() for x in simulation_line_list], []) - self.assertEquals(sorted(packing_list_line.getCausalityList()), - sorted(order_line_list)) - - def stepCheckSimulationMovementHasRecordedQuantity(self, sequence=None, - sequence_list=None): - movement_list = sequence.get('packing_list').objectValues( - portal_type=self.packing_list_line_portal_type) - self._checkRecordedProperty(movement_list, 'quantity', True) - - def stepCheckSimulationMovementHasNoRecordedQuantity(self, sequence=None, - sequence_list=None): - movement_list = sequence.get('packing_list').objectValues( - portal_type=self.packing_list_line_portal_type) - self._checkRecordedProperty(movement_list, 'quantity', False) - - def stepCheckSimulationMovementHasRecordedResource(self, sequence=None, - sequence_list=None): - movement_list = sequence.get('packing_list').objectValues( - portal_type=self.packing_list_line_portal_type) - self._checkRecordedProperty(movement_list, 'resource', True) - - def stepCheckSimulationMovementHasNoRecordedResource(self, sequence=None, - sequence_list=None): - movement_list = sequence.get('packing_list').objectValues( - portal_type=self.packing_list_line_portal_type) - self._checkRecordedProperty(movement_list, 'resource', False) - class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase): run_all_test = 1 quiet = 0 @@ -576,25 +277,6 @@ class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase): sequence_list.play(self, quiet=quiet) -class TestERP5SimulationPackingList(TestERP5SimulationMixin, TestPackingList): - pass - -for failing_method in [ - # This test does not work as it is because of the different behaviour of - # Adopt Solver. - 'test_05d_SimulationChangeResourceOnOneSimulationMovementForMergedLine', - - # Those tests currently fail because they are making assertions on an applied - # rule which with the new simulation structure is not the same as in the - # original test packing list - 'test_06_SimulationChangeStartDate', - 'test_07_SimulationChangeStartDateWithTwoOrderLine', - 'test_07a_SimulationChangeStartDateWithTwoOrderLine', - - ]: - setattr(TestERP5SimulationPackingList, failing_method, - expectedFailure(getattr(TestERP5SimulationPackingList, failing_method))) - class TestERP5SimulationInvoice(TestERP5SimulationMixin, TestSaleInvoice): quiet = TestSaleInvoice.quiet diff --git a/product/ERP5/tests/testInvoice.py b/product/ERP5/tests/testInvoice.py index cc5b1a8fea2edf41468cf6eca0402e309a1f6fd9..4a8b67e053157a9d9bdfae6d9b715045bcb3266e 100644 --- a/product/ERP5/tests/testInvoice.py +++ b/product/ERP5/tests/testInvoice.py @@ -964,11 +964,11 @@ class TestInvoiceMixin(TestPackingListMixin, sequence_list=None): invoice = sequence.get('invoice') self._solveDeliveryGroupDivergence(invoice, 'start_date', - invoice.getRelativeUrl()) + 'Unify Solver', value=invoice.getStartDate()) def stepAcceptDecisionQuantityInvoice(self,sequence=None, sequence_list=None): invoice = sequence.get('invoice') - self._solveDivergence(invoice, 'quantity', 'accept') + self._solveDivergence(invoice, 'quantity', 'Accept Solver') def stepAcceptDecisionInvoice(self, sequence=None, sequence_list=None, **kw): @@ -2313,11 +2313,8 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent( def _acceptDivergenceOnInvoice(self, invoice, divergence_list): - builder_list = invoice.getBuilderList() - self.assertEquals(2, len(builder_list)) - for builder in builder_list: - builder.solveDivergence(invoice.getRelativeUrl(), - divergence_to_accept_list=divergence_list) + print invoice, divergence_list + self._solveDivergence(invoice, 'quantity', 'Accept Solver') def test_accept_quantity_divergence_on_invoice_with_stopped_packing_list( self, quiet=quiet): @@ -2373,11 +2370,8 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent( self.assertEquals('solved', packing_list.getCausalityState()) def _adoptDivergenceOnInvoice(self, invoice, divergence_list): - builder_list = invoice.getBuilderList() - self.assertEquals(2, len(builder_list)) - for builder in builder_list: - builder.solveDivergence(invoice.getRelativeUrl(), - divergence_to_adopt_list=divergence_list) + print invoice, divergence_list + self._solveDivergence(invoice, 'quantity', 'Adopt Solver') def test_adopt_quantity_divergence_on_invoice_line_with_stopped_packing_list( self, quiet=quiet): diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5/tests/testPackingList.py index 9f19bd1d6d1e521ee8c5c14352e7c80e32fae145..dfc561423f3872f7c3508e5b53c02a78510625ef 100644 --- a/product/ERP5/tests/testPackingList.py +++ b/product/ERP5/tests/testPackingList.py @@ -294,16 +294,33 @@ class TestPackingListMixin(TestOrderMixin): Do the split and defer action """ packing_list = sequence.get('packing_list') - kw = {'listbox':[ - {'listbox_key':line.getRelativeUrl(), - 'choice':'SplitAndDefer'} for line in packing_list.getMovementList() \ - if line.isDivergent()]} - self.portal.portal_workflow.doActionFor( - packing_list, - 'split_and_defer_action', - start_date=self.datetime + 15, - stop_date=self.datetime + 25, - **kw) + solver_process_tool = self.portal.portal_solver_processes + solver_process = solver_process_tool.newSolverProcess(packing_list) + quantity_solver_decision, = [x for x in solver_process.contentValues() + if x.getCausalityValue().getTestedProperty() == 'quantity'] + # use Quantity Split Solver. + quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver']) + # configure for Quantity Split Solver. + kw = {'delivery_solver':'FIFO Delivery Solver', + 'start_date':self.datetime + 15, + 'stop_date':self.datetime + 25} + quantity_solver_decision.updateConfiguration(**kw) + solver_process.buildTargetSolverList() + solver_process.solve() + # build split deliveries manually. XXX ad-hoc + previous_tag = None + for delivery_builder in packing_list.getBuilderList(): + this_builder_tag = '%s_split_%s' % (packing_list.getPath(), + delivery_builder.getId()) + after_tag = [] + if previous_tag: + after_tag.append(previous_tag) + delivery_builder.activate( + after_method_id=('solve', + 'immediateReindexObject', + 'recursiveImmediateReindexObject',), # XXX too brutal. + after_tag=after_tag, + ).build(explanation_uid=packing_list.getCausalityValue().getUid()) def stepSplitAndDeferDoNothingPackingList(self, sequence=None, sequence_list=None, **kw): """ @@ -627,7 +644,7 @@ class TestPackingListMixin(TestOrderMixin): Check if simulation movement are disconnected """ packing_list = sequence.get('new_packing_list') - self._solveDivergence(packing_list, 'quantity', 'adopt') + self._solveDivergence(packing_list, 'quantity', 'Adopt Solver') def stepUnifyDestinationWithDecision(self,sequence=None, sequence_list=None, **kw): """ @@ -635,7 +652,7 @@ class TestPackingListMixin(TestOrderMixin): """ packing_list = sequence.get('packing_list') self._solveDeliveryGroupDivergence(packing_list, 'destination', - packing_list.getRelativeUrl()) + 'Accept Solver') def stepUnifyStartDateWithDecision(self,sequence=None, sequence_list=None, **kw): """ @@ -643,15 +660,13 @@ class TestPackingListMixin(TestOrderMixin): """ packing_list = sequence.get('packing_list') self._solveDeliveryGroupDivergence(packing_list, 'start_date', - packing_list.getRelativeUrl()) + 'Unify Solver', value=packing_list.getStartDate()) def stepUnifyStopDateWithDecision(self,sequence=None, sequence_list=None, **kw): """ Solve divergence on stop date using unify """ - packing_list = sequence.get('packing_list') - self._solveDeliveryGroupDivergence(packing_list, 'stop_date', - packing_list.getRelativeUrl()) + raise NotImplementedError def stepUnifyStartDateWithPrevision(self,sequence=None, sequence_list=None, **kw): """ @@ -661,58 +676,55 @@ class TestPackingListMixin(TestOrderMixin): applied_rule = sequence.get('applied_rule') simulation_movement_list = applied_rule.objectValues() self._solveDeliveryGroupDivergence(packing_list, 'start_date', - simulation_movement_list[-1].getRelativeUrl()) + 'Unify Solver', value=simulation_movement_list[-1].getStartDate()) def stepUnifyStopDateWithPrevision(self,sequence=None, sequence_list=None, **kw): """ Solve divergence on stop date using unify """ - packing_list = sequence.get('packing_list') - applied_rule = sequence.get('applied_rule') - simulation_movement_list = applied_rule.objectValues() - self._solveDeliveryGroupDivergence(packing_list, 'stop_date', - simulation_movement_list[-1].getRelativeUrl()) - - def _solveDeliveryGroupDivergence(self, obj, property, target_url): - kw = {'delivery_group_listbox': - {property:{'choice':target_url}}} - self.portal.portal_workflow.doActionFor( - obj, - 'solve_divergence_action', - **kw) + raise NotImplementedError + + def _solveDeliveryGroupDivergence(self, document, property, solver, **kw): + solver_process_tool = self.portal.portal_solver_processes + solver_process = solver_process_tool.newSolverProcess(document) + for solver_decision in solver_process.contentValues(): + if solver_decision.getCausalityValue().getTestedProperty() == property: + # use Quantity Accept Solver. + solver_decision.setSolverValue(self.portal.portal_solvers[solver]) + # configure for Accept Solver. + solver_decision.updateConfiguration(tested_property_list=[property], + **kw) + solver_process.buildTargetSolverList() + solver_process.solve() def stepAcceptDecisionResource(self,sequence=None, sequence_list=None, **kw): packing_list = sequence.get('packing_list') - self._solveDivergence(packing_list, 'resource', 'accept') + self._solveDivergence(packing_list, 'resource', 'Accept Solver') def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None, **kw): packing_list = sequence.get('packing_list') - self._solveDivergence(packing_list, 'quantity', 'accept') + self._solveDivergence(packing_list, 'quantity', 'Accept Solver') def stepAdoptPrevisionResource(self,sequence=None, sequence_list=None, **kw): packing_list = sequence.get('packing_list') - self._solveDivergence(packing_list, 'resource', 'adopt') + self._solveDivergence(packing_list, 'resource', 'Adopt Solver') def stepAdoptPrevisionQuantity(self,sequence=None, sequence_list=None, **kw): packing_list = sequence.get('packing_list') - self._solveDivergence(packing_list, 'quantity', 'adopt') - - def _solveDivergence(self, obj, property, decision, group='line'): - """ - Solve divergences for a given property by taking decision. - FIXME: Only "line" level divergence are supported - """ - kw = {'%s_group_listbox' % group:{}} - for divergence in obj.getDivergenceList(): - if divergence.getProperty('tested_property') != property: - continue - sm_url = divergence.getProperty('simulation_movement').getRelativeUrl() - kw['line_group_listbox']['%s&%s' % (sm_url, property)] = { - 'choice':decision} - self.portal.portal_workflow.doActionFor( - obj, - 'solve_divergence_action', - **kw) + self._solveDivergence(packing_list, 'quantity', 'Adopt Solver') + + def _solveDivergence(self, document, property, solver): + """Solve divergence by using solver tool""" + solver_process_tool = self.portal.portal_solver_processes + solver_process = solver_process_tool.newSolverProcess(document) + solver_decision, = [x for x in solver_process.contentValues() + if x.getCausalityValue().getTestedProperty() == property] + # use Quantity Accept Solver. + solver_decision.setSolverValue(self.portal.portal_solvers[solver]) + # configure for Accept Solver. + solver_decision.updateConfiguration(tested_property_list=[property]) + solver_process.buildTargetSolverList() + solver_process.solve() def stepCheckPackingListLineWithNewQuantityPrevision(self,sequence=None, sequence_list=None, **kw): """ @@ -734,41 +746,27 @@ class TestPackingListMixin(TestOrderMixin): """ packing_list_line = sequence.get('packing_list_line') new_resource = sequence.get('resource') - self.assertEquals(packing_list_line.getQuantity(), self.default_quantity) - self.assertNotEquals(packing_list_line.getResourceValue(), new_resource) - simulation_movement_list = packing_list_line.getDeliveryRelatedValueList() - order_line_list = [x.getParentValue().getParentValue().getDelivery() \ - for x in simulation_movement_list] + self.assertEquals(packing_list_line.getQuantity(), self.default_quantity*2) + self.assertEquals(packing_list_line.getResourceValue(), new_resource) + simulation_line_list = packing_list_line.getDeliveryRelatedValueList() + order_line_list = sum([x.getParentValue().getParentValue().getDeliveryList() + for x in simulation_line_list], []) self.assertEquals(sorted(packing_list_line.getCausalityList()), sorted(order_line_list)) - new_packing_list_line = packing_list_line.aq_parent[str(int(packing_list_line.getId())+1)] - self.assertEquals(new_packing_list_line.getQuantity(), self.default_quantity) - self.assertEquals(new_packing_list_line.getResourceValue(), new_resource) - simulation_movement_list = new_packing_list_line.getDeliveryRelatedValueList() - order_line_list = [x.getParentValue().getParentValue().getDelivery() \ - for x in simulation_movement_list] - self.assertEquals(sorted(new_packing_list_line.getCausalityList()), - sorted(order_line_list)) def stepCheckPackingListLineWithSameResource(self,sequence=None, sequence_list=None, **kw): """ Look if the packing list has new previsions """ - order_line = sequence.get('order_line') - packing_list_line = order_line.getCausalityRelatedValue() - old_packing_list_line = [x for x in \ - sequence.get('packing_list').objectValues() \ - if x != packing_list_line][0] + old_packing_list_line = sequence.get('packing_list_line') + packing_list_line = old_packing_list_line.aq_parent[str(int(old_packing_list_line.getId())-1)] resource = sequence.get('resource') - self.assertEquals(old_packing_list_line.getQuantity(), 0) - self.assertNotEquals(old_packing_list_line.getResourceValue(), resource) - self.assertEquals(packing_list_line.getQuantity(), self.default_quantity * 2) - self.assertEquals(packing_list_line.getResourceValue(), resource) - simulation_movement_list = packing_list_line.getDeliveryRelatedValueList() - order_line_list = [x.getParentValue().getParentValue().getDelivery() \ - for x in simulation_movement_list] - self.assertEquals(sorted(packing_list_line.getCausalityList()), - sorted(order_line_list)) + for line in sequence.get('packing_list').getMovementList(): + self.assertEquals(line.getResourceValue(), resource) + self.assertEquals(line.getQuantity(), self.default_quantity) + self.assertEquals(line.getCausalityList(), + [x.getParentValue().getParentValue().getDelivery() + for x in line.getDeliveryRelatedValueList()]) def stepCheckNewPackingListAfterStartDateAdopt(self,sequence=None, sequence_list=None, **kw): """ @@ -996,26 +994,26 @@ class TestPackingListMixin(TestOrderMixin): def stepCheckSimulationMovementHasRecordedQuantity(self, sequence=None, sequence_list=None): - movement_list = sequence.get('order').objectValues( - portal_type=self.order_line_portal_type) + movement_list = sequence.get('packing_list').objectValues( + portal_type=self.packing_list_line_portal_type) self._checkRecordedProperty(movement_list, 'quantity', True) def stepCheckSimulationMovementHasNoRecordedQuantity(self, sequence=None, sequence_list=None): - movement_list = sequence.get('order').objectValues( - portal_type=self.order_line_portal_type) + movement_list = sequence.get('packing_list').objectValues( + portal_type=self.packing_list_line_portal_type) self._checkRecordedProperty(movement_list, 'quantity', False) def stepCheckSimulationMovementHasRecordedResource(self, sequence=None, sequence_list=None): - movement_list = sequence.get('order').objectValues( - portal_type=self.order_line_portal_type) + movement_list = sequence.get('packing_list').objectValues( + portal_type=self.packing_list_line_portal_type) self._checkRecordedProperty(movement_list, 'resource', True) def stepCheckSimulationMovementHasNoRecordedResource(self, sequence=None, sequence_list=None): - movement_list = sequence.get('order').objectValues( - portal_type=self.order_line_portal_type) + movement_list = sequence.get('packing_list').objectValues( + portal_type=self.packing_list_line_portal_type) self._checkRecordedProperty(movement_list, 'resource', False) class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) : @@ -1179,6 +1177,8 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) : sequence_list.play(self, quiet=quiet) + # This test does not work as it is because of the different behaviour of + # Adopt Solver. def test_05d_SimulationChangeResourceOnOneSimulationMovementForMergedLine(self, quiet=quiet, run=run_all_test): if not run: return sequence_list = SequenceList() @@ -1246,6 +1246,10 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) : sequence_list.play(self, quiet=quiet) + # The 3 following tests currently fail because they are making assertions on + # an applied rule which with the new simulation structure is not the same as + # in the original test packing list. + def test_06_SimulationChangeStartDate(self, quiet=quiet, run=run_all_test): if not run: return sequence_list = SequenceList() @@ -1793,7 +1797,7 @@ class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase): self.added_target_solver_list = [] def beforeTearDown(self, quiet=1, run=1): - self.portal.portal_rules.default_delivery_simulation_rule.default_quantity_tester.edit( + self.portal.portal_rules.new_delivery_simulation_rule.quantity_tester.edit( solver=()) solver_process_type_info = self.portal.portal_types['Solver Process'] solver_process_type_info.setTypeAllowedContentTypeList(self.original_allowed_content_types) diff --git a/product/ERP5/tests/testTradeModelLine.py b/product/ERP5/tests/testTradeModelLine.py index 88e984d8e15a83a1d5c2ef7025bae00c41ff7a77..8fb10da6ce3875496cede85a7e39607477020346 100644 --- a/product/ERP5/tests/testTradeModelLine.py +++ b/product/ERP5/tests/testTradeModelLine.py @@ -576,7 +576,7 @@ class TestTradeModelLine(TestTradeModelLineMixin): transaction.commit() self.tic() - def test_01b_InvoiceModifyQuantityAndSolveDivergency(self): + def test_01b_NewSimulation_InvoiceModifyQuantityAndSolveDivergency(self): invoice = self.test_01_OrderWithSimpleTaxedAndDiscountedLines('invoice') for line in invoice.getMovementList(): diff --git a/product/ERP5Legacy/tests/testLegacyTradeModelLine.py b/product/ERP5Legacy/tests/testLegacyTradeModelLine.py index 6ef5b18a105ce4bb93bcb28191d34dc5c6bdf015..26e051f12e0a62304a247834630ec256f855ea00 100644 --- a/product/ERP5Legacy/tests/testLegacyTradeModelLine.py +++ b/product/ERP5Legacy/tests/testLegacyTradeModelLine.py @@ -38,6 +38,10 @@ from Products.ERP5.tests.testTradeModelLine import * TestTradeModelLine.trade_model_path_portal_type = None TestTradeModelLine.business_link_portal_type = None +for name in list(TestTradeModelLine.__dict__): + if '_NewSimulation_' in name: + delattr(TestTradeModelLine, name) + def createBusinessProcess(self, *args, **kw): business_process = super(TestTradeModelLine, self) \ .createBusinessProcess(*args, **kw)