Commit c00ff151 authored by Romain Courteaud's avatar Romain Courteaud

slapos_subscription_request: create Subscription Requuest manually from a resource

parent bc3e5d52
......@@ -30,12 +30,10 @@ if subscription_request is not None:
# Find matching Service
service = None
source_decision_value = None
project_value = None
resource_vcl = []
if item.getPortalType() == 'Instance Tree':
service, software_release, software_type = item.InstanceTree_getSoftwareProduct()
source_decision_value = item.getDestinationSectionValue(portal_type="Person")
project_value = item.getFollowUpValue(portal_type="Project")
if service is not None:
resource_vcl = [
'software_release/%s' % software_release.getRelativeUrl(),
......@@ -54,107 +52,12 @@ if source_decision_value is None:
storeWorkflowComment(item, 'Can not find the person to contact to generate the Subscription Request')
return
#################################################################
# Find Sale Trade Condition and price
source_section_value = source_decision_value.getCareerSubordinationValue(source_decision_value)
source_section_value = source_decision_value.getCareerSubordinationValue(source_decision_value)
# Create a temp Sale Order to calculate the real price and find the trade condition
now = DateTime()
module = portal.sale_order_module
#aggregate_value_list = []
tmp_sale_order = module.newContent(
portal_type='Sale Order',
temp_object=True,
#effective_date=now+1,
start_date=now,
# Ensure stop date value is higher than start date
# it will be updated by OpenSaleOrder_updatePeriod
# stop_date=now + 2,
destination_value=source_decision_value,
destination_section_value=source_section_value,
#destination_decision_value=source_decision_value,
destination_project_value=project_value,
ledger_value=portal.portal_categories.ledger.automated,
# XXX XXX destination_project_value=instance_tree.getFollowUpValue(),
)
tmp_sale_order.SaleOrder_applySaleTradeCondition(batch_mode=1, force=1)
if tmp_sale_order.getSpecialise(None) is None:
storeWorkflowComment(item, 'Can not find a trade condition to generate the Subscription Request')
try:
subscription_request = service.Resource_createSubscriptionRequest(source_decision_value, resource_vcl)
except AssertionError, error:
storeWorkflowComment(item, str(error))
return
# If no accounting is needed, no need to check the price
if tmp_sale_order.getSourceSection(None) == tmp_sale_order.getDestinationSection(None):
price = 0
else:
# Add line
tmp_order_line = tmp_sale_order.newContent(
portal_type='Sale Order Line',
temp_object=True,
resource_value=service,
variation_category_list=resource_vcl,
quantity_unit=service.getQuantityUnit(),
base_contribution_list=service.getBaseContributionList(),
use=service.getUse(),
quantity=1
)
if resource_vcl:
base_id = 'movement'
cell_key = list(tmp_order_line.getCellKeyList(base_id=base_id))[0]
tmp_order_cell = tmp_order_line.newCell(
base_id=base_id,
portal_type='Sale Order Cell',
temp_object=True,
*cell_key
)
tmp_order_cell.edit(
mapped_value_property_list=['price','quantity'],
quantity=1,
predicate_category_list=cell_key,
variation_category_list=cell_key
)
price = tmp_order_cell.getPrice(0)
else:
price = tmp_order_line.getPrice(0)
if not price:
storeWorkflowComment(item, 'Can not find a price to generate the Subscription Request')
return
subscription_request.setAggregateValue(item)
# Prevent concurrent transactions which could create the Subscription Request
item.serialize()
subscription_request = portal.subscription_request_module.newContent(
portal_type='Subscription Request',
source_value=source_decision_value,
source_section_value=source_section_value,
source_decision_value=source_decision_value,
start_date=now,
effective_date=now,
resource_value=service,
variation_category_list=resource_vcl,
aggregate_value=item,
quantity_unit=tmp_order_line.getQuantityUnit(),
quantity=1,
ledger="automated",
specialise_value=tmp_sale_order.getSpecialiseValue(),
destination=tmp_sale_order.getSource(),
destination_section=tmp_sale_order.getSourceSection(),
price_currency=tmp_sale_order.getPriceCurrency(),
price=price,
activate_kw=activate_kw
)
subscription_request.submit()
if len(subscription_request.checkConsistency()) != 0:
raise NotImplementedError(subscription_request.checkConsistency())
subscription_request.SubscriptionRequest_createOpenSaleOrder()
subscription_request.validate()
return subscription_request
portal = context.getPortalObject()
resource = context
if subscriber_person_value is None:
raise AssertionError('Can not find a person profile')
project_value = None
if resource.getPortalType() == "Software Product":
project_value = resource.getFollowUpValue(portal_type="Project")
elif resource.getPortalType() == "Service":
if resource.getRelativeUrl() != "service_module/slapos_virtual_master_subscription":
raise NotImplementedError('Unsupported resource: %s' % resource.getRelativeUrl())
else:
raise NotImplementedError('Unsupported resource: %s' % resource.getRelativeUrl())
######################################################
# Find Sale Trade Condition and price
source_section = subscriber_person_value.getCareerSubordination(subscriber_person_value.getRelativeUrl())
# Create a temp Sale Order to calculate the real price and find the trade condition
now = DateTime()
module = portal.portal_trash
#aggregate_value_list = []
tmp_sale_order = module.newContent(
portal_type='Sale Order',
temp_object=True,
#effective_date=now+1,
start_date=now,
# Ensure stop date value is higher than start date
# it will be updated by OpenSaleOrder_updatePeriod
# stop_date=now + 2,
destination_value=subscriber_person_value,
destination_section=source_section,
#destination_decision_value=source_decision_value,
destination_project_value=project_value,
ledger_value=portal.portal_categories.ledger.automated,
# XXX XXX destination_project_value=instance_tree.getFollowUpValue(),
)
tmp_sale_order.SaleOrder_applySaleTradeCondition(batch_mode=1, force=1)
if tmp_sale_order.getSpecialise(None) is None:
raise AssertionError('Can not find a trade condition to generate the Subscription Request')
# If no accounting is needed, no need to check the price
if (tmp_sale_order.getSourceSection(None) == tmp_sale_order.getDestinationSection(None)) or \
(tmp_sale_order.getSourceSection(None) is None):
price = 0
else:
# Add line
tmp_order_line = tmp_sale_order.newContent(
portal_type='Sale Order Line',
temp_object=True,
resource_value=resource,
variation_category_list=variation_category_list,
quantity_unit=resource.getQuantityUnit(),
base_contribution_list=resource.getBaseContributionList(),
use=resource.getUse(),
quantity=1
)
if 0:# XXX resource_vcl:
base_id = 'movement'
cell_key = list(tmp_order_line.getCellKeyList(base_id=base_id))[0]
tmp_order_cell = tmp_order_line.newCell(
base_id=base_id,
portal_type='Sale Order Cell',
temp_object=True,
*cell_key
)
tmp_order_cell.edit(
mapped_value_property_list=['price','quantity'],
quantity=1,
predicate_category_list=cell_key,
variation_category_list=cell_key
)
price = tmp_order_cell.getPrice(0)
else:
price = tmp_order_line.getPrice(0)
if not price:
raise AssertionError('Can not find a price to generate the Subscription Request')
subscription_request = portal.subscription_request_module.newContent(
portal_type='Subscription Request',
source_value=subscriber_person_value,
source_section_value=source_section,
source_decision_value=subscriber_person_value,
start_date=now,
effective_date=now,
resource_value=resource,
variation_category_list=variation_category_list,
# XXX aggregate_value=item,
quantity_unit=resource.getQuantityUnit(),
quantity=1,
ledger="automated",
specialise_value=tmp_sale_order.getSpecialiseValue(),
destination=tmp_sale_order.getSource(),
destination_section=tmp_sale_order.getSourceSection(),
price_currency=tmp_sale_order.getPriceCurrency(),
price=price,
# XXX activate_kw=activate_kw
)
"""
if len(subscription_request.checkConsistency()) != 0:
raise NotImplementedError(subscription_request.checkConsistency())
"""
subscription_request.submit()
return subscription_request
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>_params</string> </key>
<value> <string>subscriber_person_value, variation_category_list</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Resource_createSubscriptionRequest</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
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