Commit 02e3c0f7 authored by Łukasz Nowak's avatar Łukasz Nowak

Generate aggregated packing list.

Uses portal integrations to store mappings of current delivery for person.

Uses hand crafted order builder to update quantity by adding.
parent 0fd8edaf
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>view</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>View</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/OrderBuilder_view</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>view_predicate_group</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>3.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Predicate</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/DeliveryBuilder_viewPredicateGroupList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>view_profile</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>2.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Profile</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/OrderBuilder_viewProfile</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from Products.ERP5.Document.OrderBuilder import OrderBuilder
from Products.ERP5.Document.SimulatedDeliveryBuilder import BUILDING_KEY
from Products.ERP5Type.TransactionalVariable import getTransactionalVariable
from Products.ERP5.mixin.builder import BuilderMixin
class SlapOSAccountingQuantityUpdatingOrderBuilder(OrderBuilder):
def _setDeliveryMovementProperties(self, delivery_movement,
simulation_movement, property_dict,
update_existing_movement=0,
force_update=0, activate_kw=None):
"""
Initialize or update delivery movement properties.
Set delivery ratio on simulation movement.
Create the relation between simulation movement
and delivery movement.
"""
delivery = delivery_movement.getExplanationValue()
building = getTransactionalVariable()[BUILDING_KEY]
if delivery in building:
building.add(delivery_movement)
simulation_movement.recursiveReindexObject(activate_kw=dict(
activate_kw or (), tag='built:'+delivery.getPath()))
BuilderMixin._setDeliveryMovementProperties(
self, delivery_movement,
simulation_movement, property_dict,
update_existing_movement=update_existing_movement,
force_update=force_update,
activate_kw=activate_kw)
if update_existing_movement and not force_update:
delivery_movement.edit(
quantity=delivery_movement.getQuantity() +
simulation_movement.getQuantity())
else:
simulation_movement._setDeliveryRatio(1)
delivery_movement = delivery_movement.getRelativeUrl()
if simulation_movement.getDeliveryList() != [delivery_movement]:
simulation_movement._setDelivery(delivery_movement)
if not simulation_movement.isTempDocument():
try:
getCausalityState = delivery.aq_explicit.getCausalityState
except AttributeError:
return
if getCausalityState() == 'building':
# Make sure no other node is changing state of the delivery
delivery.serializeCausalityState()
else:
delivery.startBuilding()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Integration Site" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>slapos_aggregated_delivery_integration_site</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>slapos_aggregated_delivery_integration_site</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Integration Site</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>SlapOS Aggregated Delivery Integration Site</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Integration Base Category Mapping" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_destination_reference</string> </key>
<value> <string>causality</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Causality</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Causality</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Integration Base Category Mapping</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="SlapOS Accounting Quantity Updating Order Builder" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>delivery_after_generation_script_id</string> </key>
<value> <string>SalePackingList_postSlapOSaggregatedDeliveryBuilder</string> </value>
</item>
<item>
<key> <string>delivery_cell_portal_type</string> </key>
<value> <string>Sale Packing List Cell</string> </value>
</item>
<item>
<key> <string>delivery_cell_separate_order</string> </key>
<value>
<tuple>
<string>calculateAddQuantity</string>
<string>calculateAveragePrice</string>
</tuple>
</value>
</item>
<item>
<key> <string>delivery_creatable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>delivery_line_portal_type</string> </key>
<value> <string>Sale Packing List Line</string> </value>
</item>
<item>
<key> <string>delivery_module</string> </key>
<value> <string>sale_packing_list_module</string> </value>
</item>
<item>
<key> <string>delivery_portal_type</string> </key>
<value> <string>Sale Packing List</string> </value>
</item>
<item>
<key> <string>delivery_select_method_id</string> </key>
<value> <string>OrderBuilder_selectSlapOSAggregatedDeliveryList</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>slapos_aggregated_delivery_builder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>SlapOS Accounting Quantity Updating Order Builder</string> </value>
</item>
<item>
<key> <string>simulation_select_method_id</string> </key>
<value> <string>OrderBuilder_generateSlapOSAggregatedMovementList</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>SlapOS Aggregated Delivery Builder</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/delivery</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>category_movement_group_on_delivery</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination</string>
<string>destination_section</string>
<string>price_currency</string>
<string>source</string>
<string>source_section</string>
<string>specialise</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>update_always</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>category_movement_group_on_line</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>resource</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>update_always</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Property Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>property_movement_group_on_line</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Property Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>price</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>update_always</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -104,6 +104,10 @@
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>slapos_consumption_trade_condition</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
......
......@@ -104,6 +104,10 @@
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>slapos_subscription_trade_condition</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
......
<allowed_content_type_list>
<portal_type id="Order Tool">
<item>SlapOS Accounting Quantity Updating Order Builder</item>
</portal_type>
<portal_type id="Rule Tool">
<item>Subscription Item Root Simulation Rule</item>
</portal_type>
<portal_type id="SlapOS Accounting Quantity Updating Order Builder">
<item>Base Variant Movement Group</item>
<item>Category Movement Group</item>
<item>Causality Assignment Movement Group</item>
<item>Causality Movement Group</item>
<item>Day Movement Group</item>
<item>Delivery Causality Assignment Movement Group</item>
<item>Mirror Movement Group</item>
<item>Monthly Range Movement Group</item>
<item>Nested Line Movement Group</item>
<item>Order Movement Group</item>
<item>Parent Delivery Category Movement Group</item>
<item>Parent Delivery Property Movement Group</item>
<item>Parent Explanation Movement Group</item>
<item>Predicate</item>
<item>Property Assignment Movement Group</item>
<item>Property Movement Group</item>
<item>Quantity Sign Movement Group</item>
<item>Requirement Movement Group</item>
<item>Root Applied Rule Causality Movement Group</item>
<item>Split Movement Group</item>
<item>Title Movement Group</item>
<item>Variant Movement Group</item>
<item>Variation Property Movement Group</item>
</portal_type>
<portal_type id="Subscription Item Root Simulation Rule">
<item>Accounting Rule Cell</item>
<item>Category Membership Divergence Tester</item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Base Type" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>acquire_local_roles</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>content_icon</string> </key>
<value> <string>document.gif</string> </value>
</item>
<item>
<key> <string>content_meta_type</string> </key>
<value> <string>ERP5 Order Builder</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string> Delivery Builder objects allow to gather multiple Simulation Movements\n
into a single Delivery. \n
\n
The initial quantity property of the Delivery Line is calculated by\n
summing quantities of related Simulation Movements.\n
\n
Delivery Builders are called for example whenever an order is confirmed.\n
They are also called globaly in order to gather any confirmed or above \n
Simulation Movement which was not associated to any Delivery Line. \n
Such movements are called orphaned Simulation Movements.\n
\n
Delivery Builder objects are provided with a set a parameters to achieve \n
their goal:\n
\n
A path definition: source, destination, etc. which defines the general \n
kind of movements it applies.\n
\n
simulation_select_method which defines how to query all Simulation \n
Movements which meet certain criteria (including the above path path \n
definition).\n
\n
collect_order_list which defines how to group selected movements \n
according to gathering rules.\n
\n
delivery_select_method which defines how to select existing Delivery \n
which may eventually be updated with selected simulation movements.\n
\n
delivery_module, delivery_type and delivery_line_type which define the \n
module and portal types for newly built Deliveries and Delivery Lines.\n
\n
Delivery Builders can also be provided with optional parameters to \n
restrict selection to a given root Applied Rule caused by a single Order\n
or to Simulation Movements related to a limited set of existing \n
Deliveries.\n
</string> </value>
</item>
<item>
<key> <string>factory</string> </key>
<value> <string>addOrderBuilder</string> </value>
</item>
<item>
<key> <string>filter_content_types</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SlapOS Accounting Quantity Updating Order Builder</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>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>type_class</string> </key>
<value> <string>SlapOSAccountingQuantityUpdatingOrderBuilder</string> </value>
</item>
<item>
<key> <string>type_interface</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>type_mixin</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>preferred_aggregated_sale_trade_condition_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
<item>
<key> <string>preference</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>write_permission</string> </key>
<value> <string>Manage properties</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>select_kw = kwargs.copy()\n
select_kw.pop(\'portal_type\', None)\n
select_kw.pop(\'delivery_relative_url_list\', None)\n
from Products.ERP5Type.Document import newTempSimulationMovement\n
portal = context.getPortalObject()\n
\n
business_process_uid_list = [\n
portal.business_process_module.slapos_consumption_business_process.getUid(),\n
portal.business_process_module.slapos_subscription_business_process.getUid()]\n
specialise_reference_list = [q.getReference() for q in portal.portal_catalog(specialise_uid=business_process_uid_list,\n
portal_type=\'Sale Trade Condition\')]\n
\n
select_kw.update(\n
limit=50, # just take a bit\n
portal_type=\'Sale Packing List Line\',\n
simulation_state=\'delivered\',\n
parent_specialise_reference=specialise_reference_list,\n
parent_specialise_portal_type=\'Sale Trade Condition\',\n
grouping_reference=None,\n
sort_on=((\'modification_date\', \'ASC\'),) # the highest chance to find movement which can be delivered\n
)\n
movement_list = portal.portal_catalog(**select_kw)\n
\n
specialise = portal.portal_preferences.getPreferredAggregatedSaleTradeCondition()\n
temp_movement_list = []\n
id = 1\n
for movement in movement_list:\n
if movement.getGroupingReference() is not None:\n
continue\n
temp_movement = newTempSimulationMovement(\n
portal, movement.getRelativeUrl(),\n
quantity=movement.getQuantity(),\n
resource=movement.getResource(),\n
source=movement.getDestination(),\n
destination=movement.getDestination(),\n
source_section=movement.getSourceSection(),\n
destination_section=movement.getDestination(),\n
specialise=specialise,\n
price_currency=movement.getPriceCurrency()\n
)\n
if movement.getResource() == \'service_module/slapos_instance_subscription\':\n
temp_movement.edit(price=1.0)\n
else:\n
temp_movement.edit(price=0.0)\n
temp_movement_list.append(temp_movement)\n
id += 1\n
\n
return temp_movement_list\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>*args, **kwargs</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OrderBuilder_generateSlapOSAggregatedMovementList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string># beware: the configuration of OrderBuilder_generateSlapOSAggregatedMovementList shall\n
# provide small amounts of movements\n
person_delivery_mapping = {}\n
portal = context.getPortalObject()\n
\n
specialise = portal.portal_preferences.getPreferredAggregatedSaleTradeCondition()\n
for movement in movement_list:\n
person = movement.getDestinationValue()\n
try:\n
delivery = person_delivery_mapping[person]\n
except KeyError:\n
delivery = person.Person_getAggregatedDelivery()\n
if delivery is None or delivery.getSimulationState() != \'confirmed\':\n
delivery = portal.sale_packing_list_module.newContent(\n
portal_type=\'Sale Packing List\',\n
source=movement.getDestination(),\n
destination=movement.getDestination(),\n
source_section=movement.getSourceSection(),\n
destination_section=movement.getDestination(),\n
specialise=specialise,\n
price_currency=movement.getPriceCurrency()\n
)\n
delivery.confirm(\'New aggregated delivery.\')\n
person.Person_setAggregatedDelivery(delivery)\n
person_delivery_mapping[person] = delivery\n
return person_delivery_mapping.values()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>movement_list, *args, **kwargs</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OrderBuilder_selectSlapOSAggregatedDeliveryList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>integration_site = context.getPortalObject().restrictedTraverse(\n
\'portal_integrations/slapos_aggregated_delivery_integration_site\')\n
\n
person_id = context.getId().replace(\'-\', \'_\')\n
try:\n
mapping = integration_site.getCategoryFromMapping(\'Causality/%s\' % person_id, create_mapping_line=True, create_mapping=True)\n
except ValueError:\n
return None\n
return context.restrictedTraverse(mapping)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Person_getAggregatedDelivery</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>integration_site = context.getPortalObject().restrictedTraverse(\n
\'portal_integrations/slapos_aggregated_delivery_integration_site\')\n
\n
\n
person_id = context.getId().replace(\'-\', \'_\')\n
integration_site.Causality[person_id].setDestinationReference(delivery.getRelativeUrl())\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>delivery</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Person_setAggregatedDelivery</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>restrictedTraverse = context.getPortalObject().restrictedTraverse\n
person = context.getDestination()\n
reference = context.getReference()\n
input_movement_list = [restrictedTraverse(q) for q in\n
related_simulation_movement_path_list\n
if restrictedTraverse(q).getDestination() == person]\n
\n
script.log([q.getDeliveryRatio() for q in input_movement_list])\n
for delivery_line in input_movement_list:\n
delivery_line.setGroupingReference(reference)\n
if context.getCausalityState() == \'draft\':\n
context.startBuilding()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>related_simulation_movement_path_list, *args, **kwargs</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SalePackingList_postSlapOSaggregatedDeliveryBuilder</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -99,6 +99,7 @@
<string>my_preferred_instance_destroy_movement_template</string>
<string>my_preferred_instance_setup_movement_template</string>
<string>my_preferred_instance_delivery_template</string>
<string>my_preferred_aggregated_sale_trade_condition</string>
</list>
</value>
</item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_preferred_aggregated_sale_trade_condition</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_string_field</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Preferred Aggregated Sale Trade Condition</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -1613,3 +1613,177 @@ class TestSlapOSPaymentTransactionOrderBuilder(testSlapOSMixin):
payment = payment_list[0].getObject()
self.assertPayment(payment, invoice)
class TestSlapOSPaymentTransactionOrderBuilder(testSlapOSMixin):
def emptyBuild(self, **kw):
delivery_list = self._build(**kw)
self.assertSameSet([], delivery_list)
return delivery_list
def fullBuild(self, **kw):
delivery_list = self._build(**kw)
self.assertNotEqual([], delivery_list)
return delivery_list
def _build(self, **kw):
return self.portal.portal_orders.slapos_aggregated_delivery_builder.build(
**kw)
def _createDelivery(self, **kwargs):
delivery = self.portal.restrictedTraverse(
self.portal.portal_preferences.getPreferredInstanceDeliveryTemplate()
).Base_createCloneDocument(batch_mode=1)
delivery.edit(**kwargs)
self.portal.portal_workflow._jumpToStateFor(delivery, 'delivered')
return delivery
def _addDeliveryLine(self, delivery, **kwargs):
kwargs.setdefault('portal_type', 'Sale Packing List Line')
kwargs.setdefault('quantity', 1.0)
kwargs.setdefault('resource', 'service_module/slapos_instance_setup')
kwargs.setdefault('price', 0.0)
delivery_line = delivery.newContent(**kwargs)
return delivery_line
def test(self):
person = self.portal.person_module.template_member\
.Base_createCloneDocument(batch_mode=1)
delivery = self._createDelivery(destination_value=person,
destination_decision_value=person)
delivery_line = self._addDeliveryLine(delivery)
self.tic()
delivery_list = self.fullBuild(uid=delivery_line.getUid())
self.assertEqual(1, len(delivery_list))
built_delivery = delivery_list[0]
self.assertEqual(delivery_line.getGroupingReference(),
built_delivery.getReference())
self.assertEqual('confirmed', built_delivery.getSimulationState())
self.assertEqual('building', built_delivery.getCausalityState())
self.assertEqual(delivery.getPriceCurrency(),
built_delivery.getPriceCurrency())
delivery_line_list = built_delivery.contentValues(
portal_type='Sale Packing List Line')
self.assertEqual(1, len(delivery_line_list))
built_delivery_line = delivery_line_list[0]
self.assertEqual(1.0, built_delivery_line.getQuantity())
self.assertEqual(0.0, built_delivery_line.getPrice())
self.assertEqual(delivery_line.getResource(),
built_delivery_line.getResource())
def test_many_lines(self):
person = self.portal.person_module.template_member\
.Base_createCloneDocument(batch_mode=1)
delivery = self._createDelivery(destination_value=person,
destination_decision_value=person)
setup_line_1 = self._addDeliveryLine(delivery)
setup_line_2 = self._addDeliveryLine(delivery)
cleanup_line = self._addDeliveryLine(delivery,
resource='service_module/slapos_instance_cleanup')
update_line = self._addDeliveryLine(delivery,
resource='service_module/slapos_instance_update')
subscription_line = self._addDeliveryLine(delivery,
resource='service_module/slapos_instance_subscription')
self.tic()
delivery_list = self.fullBuild(uid=[setup_line_1.getUid(),
setup_line_2.getUid(), cleanup_line.getUid(), update_line.getUid(),
subscription_line.getUid()])
self.assertEqual(1, len(delivery_list))
built_delivery = delivery_list[0]
self.assertEqual(setup_line_1.getGroupingReference(),
built_delivery.getReference())
self.assertEqual(setup_line_2.getGroupingReference(),
built_delivery.getReference())
self.assertEqual(cleanup_line.getGroupingReference(),
built_delivery.getReference())
self.assertEqual(update_line.getGroupingReference(),
built_delivery.getReference())
self.assertEqual('confirmed', built_delivery.getSimulationState())
self.assertEqual('building', built_delivery.getCausalityState())
delivery_line_list = built_delivery.contentValues(
portal_type='Sale Packing List Line')
self.assertEqual(4, len(delivery_line_list))
built_setup_line = [q for q in delivery_line_list if q.getResource() == 'service_module/slapos_instance_setup'][0]
built_cleanup_line = [q for q in delivery_line_list if q.getResource() == 'service_module/slapos_instance_cleanup'][0]
built_update_line = [q for q in delivery_line_list if q.getResource() == 'service_module/slapos_instance_update'][0]
built_subscription_line = [q for q in delivery_line_list if q.getResource() == 'service_module/slapos_instance_subscription'][0]
self.assertEqual(2.0, built_setup_line.getQuantity())
self.assertEqual(0.0, built_setup_line.getPrice())
self.assertEqual(setup_line_1.getResource(),
built_setup_line.getResource())
self.assertEqual(1.0, built_cleanup_line.getQuantity())
self.assertEqual(0.0, built_cleanup_line.getPrice())
self.assertEqual(cleanup_line.getResource(),
built_cleanup_line.getResource())
self.assertEqual(1.0, built_update_line.getQuantity())
self.assertEqual(0.0, built_update_line.getPrice())
self.assertEqual(update_line.getResource(),
built_update_line.getResource())
self.assertEqual(1.0, built_subscription_line.getQuantity())
self.assertEqual(1.0, built_subscription_line.getPrice())
self.assertEqual(subscription_line.getResource(),
built_subscription_line.getResource())
def test_added_after(self):
person = self.portal.person_module.template_member\
.Base_createCloneDocument(batch_mode=1)
delivery = self._createDelivery(destination_value=person,
destination_decision_value=person)
delivery_line = self._addDeliveryLine(delivery)
self.tic()
delivery_list = self.fullBuild(uid=delivery_line.getUid())
self.assertEqual(1, len(delivery_list))
built_delivery = delivery_list[0]
self.assertEqual(delivery_line.getGroupingReference(),
built_delivery.getReference())
self.assertEqual('confirmed', built_delivery.getSimulationState())
self.assertEqual('building', built_delivery.getCausalityState())
delivery_line_list = built_delivery.contentValues(
portal_type='Sale Packing List Line')
self.assertEqual(1, len(delivery_line_list))
built_delivery_line = delivery_line_list[0]
self.assertEqual(1.0, built_delivery_line.getQuantity())
self.assertEqual(0.0, built_delivery_line.getPrice())
self.assertEqual(delivery_line.getResource(),
built_delivery_line.getResource())
delivery_line_2 = self._addDeliveryLine(delivery)
self.tic()
delivery_list = self.fullBuild(uid=delivery_line_2.getUid())
self.assertEqual(1, len(delivery_list))
new_built_delivery = delivery_list[0]
self.assertEqual(built_delivery, new_built_delivery)
self.assertEqual(delivery_line_2.getGroupingReference(),
built_delivery.getReference())
self.assertEqual('confirmed', built_delivery.getSimulationState())
self.assertEqual('building', built_delivery.getCausalityState())
delivery_line_list = built_delivery.contentValues(
portal_type='Sale Packing List Line')
self.assertEqual(1, len(delivery_line_list))
built_delivery_line = delivery_line_list[0]
self.assertEqual(2.0, built_delivery_line.getQuantity())
self.assertEqual(0.0, built_delivery_line.getPrice())
self.assertEqual(delivery_line_2.getResource(),
built_delivery_line.getResource())
erp5_accounting
erp5_open_trade
erp5_invoicing
erp5_open_trade
erp5_simplified_invoicing
erp5_tiosafe_core
slapos_cloud
\ No newline at end of file
144
\ No newline at end of file
145
\ No newline at end of file
Hosting Subscription | periodicity
SlapOS Accounting Quantity Updating Order Builder | view
SlapOS Accounting Quantity Updating Order Builder | view_predicate_group
SlapOS Accounting Quantity Updating Order Builder | view_profile
Subscription Item Root Simulation Rule | view
System Preference | slapos_accounting_system_preference
\ No newline at end of file
SubscriptionItemRootSimulationRule
\ No newline at end of file
SubscriptionItemRootSimulationRule
SlapOSAccountingQuantityUpdatingOrderBuilder
\ No newline at end of file
......@@ -43,6 +43,10 @@ portal_deliveries/slapos_sale_invoice_transaction_trade_model_builder
portal_deliveries/slapos_sale_invoice_transaction_trade_model_builder/**
portal_deliveries/slapos_sale_packing_list_builder
portal_deliveries/slapos_sale_packing_list_builder/**
portal_integrations/slapos_aggregated_delivery_integration_site
portal_integrations/slapos_aggregated_delivery_integration_site/Causality
portal_orders/slapos_aggregated_delivery_builder
portal_orders/slapos_aggregated_delivery_builder/**
portal_orders/slapos_payment_transaction_builder
portal_orders/slapos_payment_transaction_builder/**
portal_rules/slapos_delivery_root_simulation_rule
......
Order Tool | SlapOS Accounting Quantity Updating Order Builder
Rule Tool | Subscription Item Root Simulation Rule
SlapOS Accounting Quantity Updating Order Builder | Base Variant Movement Group
SlapOS Accounting Quantity Updating Order Builder | Category Movement Group
SlapOS Accounting Quantity Updating Order Builder | Causality Assignment Movement Group
SlapOS Accounting Quantity Updating Order Builder | Causality Movement Group
SlapOS Accounting Quantity Updating Order Builder | Day Movement Group
SlapOS Accounting Quantity Updating Order Builder | Delivery Causality Assignment Movement Group
SlapOS Accounting Quantity Updating Order Builder | Mirror Movement Group
SlapOS Accounting Quantity Updating Order Builder | Monthly Range Movement Group
SlapOS Accounting Quantity Updating Order Builder | Nested Line Movement Group
SlapOS Accounting Quantity Updating Order Builder | Order Movement Group
SlapOS Accounting Quantity Updating Order Builder | Parent Delivery Category Movement Group
SlapOS Accounting Quantity Updating Order Builder | Parent Delivery Property Movement Group
SlapOS Accounting Quantity Updating Order Builder | Parent Explanation Movement Group
SlapOS Accounting Quantity Updating Order Builder | Predicate
SlapOS Accounting Quantity Updating Order Builder | Property Assignment Movement Group
SlapOS Accounting Quantity Updating Order Builder | Property Movement Group
SlapOS Accounting Quantity Updating Order Builder | Quantity Sign Movement Group
SlapOS Accounting Quantity Updating Order Builder | Requirement Movement Group
SlapOS Accounting Quantity Updating Order Builder | Root Applied Rule Causality Movement Group
SlapOS Accounting Quantity Updating Order Builder | Split Movement Group
SlapOS Accounting Quantity Updating Order Builder | Title Movement Group
SlapOS Accounting Quantity Updating Order Builder | Variant Movement Group
SlapOS Accounting Quantity Updating Order Builder | Variation Property Movement Group
Subscription Item Root Simulation Rule | Accounting Rule Cell
Subscription Item Root Simulation Rule | Category Membership Divergence Tester
Subscription Item Root Simulation Rule | DateTime Divergence Tester
......
SlapOS Accounting Quantity Updating Order Builder
Subscription Item Root Simulation Rule
\ No newline at end of file
......@@ -81,6 +81,10 @@
<key> <string>portal_type</string> </key>
<value> <string>System Preference</string> </value>
</item>
<item>
<key> <string>preferred_aggregated_sale_trade_condition</string> </key>
<value> <string>sale_trade_condition_module/slapos_trade_condition</string> </value>
</item>
<item>
<key> <string>preferred_credential_recovery_automatic_approval</string> </key>
<value> <int>1</int> </value>
......
250
\ No newline at end of file
251
\ No newline at end of file
......@@ -119,6 +119,7 @@ class testSlapOSMixin(Products.Vifib.tests.VifibMixin.testVifibMixin):
'erp5_simulation',
'erp5_pdm',
'erp5_trade',
'erp5_tiosafe_core',
'erp5_item',
'erp5_forge',
'erp5_ingestion_mysql_innodb_catalog',
......
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