How to configure Builder
Configure Simulation Select Method
After r32519 (2010-02-15), the hierarchy of simulation tree is modified.
- old simulation tree
AR (Order Rule)
+-SM (order:Sale Order Line, delivery:Sale Packing List Line)
+-AR (Invoicing Rule)
+-...- new simulation tree
AR (Order Simulation Rule)
+-SM (delivery:Sale Order Line) <-- NEW
+-AR (Deliverying Simulation Rule) <-- NEW
+-SM (delivery:Sale Packing List Line)
+-AR (Invoicing Rule)
+-...If you don't want to migrate existing data, please configure select movement method appropriately to support both simulation hierarchy. The change on SaleOrder_selectMovement can be a good hint. But if you want to support the new simulation hierarchy only, you can make it more simple and fast.
Configure Movement Groups
After r23647 (2008-09-16), Movement Group in Builder becomes ERP5 Document (like Divergence Tester in Rule).
- Collect Order Group
- Select one of 'Delivery/Line/Cell' to specify in which level a movement group belongs to.
- Sort Index
- Use this property to specify the order of Movement Groups in each level.
- Divergence Scope
- If a Movement Group is related to Property, Category or Quantity, then specify the scope in this field.
See HowToConfigureMovementGroup for the detail of Movement Group.
Note that the following Movement Groups are not yet ported because they are not used in our public repository.
CriterionMovementGroup
IntIndexMovementGroup
OptionMovementGroup
ParentExplanationCausalityMovementGroup
RootAppliedRuleCausalityMovementGroup
SplitResourceMovementGroup
TransformationAppliedRuleCausalityMovementGroup
utility script for porting your custom Builder
Save the following as 'Script (Python)' named 'convertBuilder' and call it like 'portal_deliveries/foo_builder/convertBuilder'. Please review the int_index of each Movement Group after conversion.
1 migrate_dict = {
2 'AdministrationPathMovementGroup':[[], ['source_administration', 'destination_administration'], []],
3 'AggregateMovementGroup':[[], ['aggregate'], []],
4 'BaseApplicationMovementGroup':[[], ['base_application'], []],
5 'BaseContributionMovementGroup':[[], ['base_contribution'], []],
6 'BaseVariantMovementGroup':[[], [], ['Base Variant Movement Group']],
7 'BrandMovementGroup':[['brand'], [], []],
8 'CausalityAssignmentMovementGroup':[[], [], ['Causality Assignment Movement Group']],
9 'CausalityMovementGroup':[[], [], ['Causality Movement Group']],
10 'ColourMovementGroup':[[], ['colour'], []],
11 'DateMovementGroup':[['start_date', 'stop_date'], [], []],
12 'DecisionMovementGroup':[['decision'], [], []],
13 'DecisionPathMovementGroup':[[], ['source_decision', 'destination_decision'], []],
14 'DestinationDecisionMovementGroup':[[], ['destination_decision'], []],
15 'DestinationMovementGroup':[[], ['destination'], []],
16 'OrderMovementGroup':[[], [], ['Order Movement Group']],
17 'ParentExplanationCausalityMovementGroup':[[], [], ['Parent Explanation Causality Movement Group']],
18 'PathMovementGroup':[[], ['source', 'destination'], []],
19 'PaymentModeMovementGroup':[[], ['payment_mode'], []],
20 'PaymentPathMovementGroup':[[], ['source_payment', 'destination_payment'], []],
21 'PriceCurrencyMovementGroup':[[], ['price_currency'], []],
22 'QuantitySignMovementGroup':[[], [], ['Quantity Sign Movement Group']],
23 'QuantityUnitMovementGroup':[[], ['quantity_unit'], []],
24 'RequirementMovementGroup':[[], [], ['Requirement Movement Group']],
25 'ResourceMovementGroup':[[], ['resource'], []],
26 'SectionPathMovementGroup':[[], ['source_section', 'destination_section'], []],
27 'SourceMovementGroup':[[], ['source'], []],
28 'SourceProjectMovementGroup':[[], ['source_project'], []],
29 'SplitMovementGroup':[[], [], ['Split Movement Group']],
30 'TitleMovementGroup':[[], [], ['Title Movement Group']],
31 'TradePathMovementGroup':[[], ['source_trade', 'destination_trade'], []],
32 'VariantMovementGroup':[[], [], ['Variant Movement Group']],
33 'VariationPropertyMovementGroup':[[], [], ['Variation Property Movement Group']],
34 }
35
36 def getTitle(portal_type, level):
37 return '%s_on_%s' % ('_'.join([x.lower() for x in portal_type.split()]), level)
38
39 for level in 'delivery', 'line', 'cell':
40 property_list = []
41 category_list = []
42 other_list = []
43 num = 1
44
45 if level == 'delivery':
46 collect_order_list = context.getDeliveryCollectOrderList()
47 elif level == 'line':
48 collect_order_list = context.getDeliveryLineCollectOrderList()
49 elif level == 'cell':
50 collect_order_list = context.getDeliveryCellCollectOrderList()
51
52 for i in collect_order_list:
53 try:
54 prop, cat, other = migrate_dict[i]
55 except KeyError:
56 print '%s on %s level could not be merged.' % (i, level)
57 continue
58 property_list.extend(prop)
59 category_list.extend(cat)
60 other_list.extend(other)
61
62 if len(property_list):
63 portal_type='Property Movement Group'
64 title = getTitle(portal_type, level)
65 context.newContent(portal_type=portal_type, id=title, title=title,
66 tested_property=property_list,
67 categories=('divergence_scope/property', 'collect_order_group/%s' % level),
68 int_index=num)
69 num += 1
70
71 if len(category_list):
72 portal_type='Category Movement Group'
73 title = getTitle(portal_type, level)
74 context.newContent(portal_type=portal_type, id=title, title=title,
75 tested_property=category_list,
76 categories=('divergence_scope/category', 'collect_order_group/%s' % level),
77 int_index=num)
78 num += 1
79
80 for portal_type in other_list:
81 title = getTitle(portal_type, level)
82 context.newContent(portal_type=portal_type, id=title, title=title,
83 categories=('collect_order_group/%s' % level,),
84 int_index=num)
85 num += 1
86
87 print 'finished.'
88 return printed