Commit c1ea6cea authored by Rafael Monnerat's avatar Rafael Monnerat Committed by Alain Takoudjou

slapos_subscription_request: Generate deduction for the reservation fee.

parent 3b56aae6
...@@ -24,7 +24,7 @@ role_list = ['member', 'subscriber'] ...@@ -24,7 +24,7 @@ role_list = ['member', 'subscriber']
open_assignment_list = person.searchFolder(portal_type="Assignment", open_assignment_list = person.searchFolder(portal_type="Assignment",
validation_state="open") validation_state="open")
#Initialisation # Initialisation
assignment_duration = context.portal_preferences.getPreferredCredentialAssignmentDuration() assignment_duration = context.portal_preferences.getPreferredCredentialAssignmentDuration()
today = DateTime() today = DateTime()
delay = today+assignment_duration delay = today+assignment_duration
......
...@@ -10,7 +10,10 @@ if hosting_subscription is None: ...@@ -10,7 +10,10 @@ if hosting_subscription is None:
if hosting_subscription is not None: if hosting_subscription is not None:
instance = hosting_subscription.getPredecessorValue() instance = hosting_subscription.getPredecessorValue()
# This ensure that the user has a valid cloud contract # This ensure that the user has a valid cloud contract
user_contract = instance.SoftwareInstance_requestValidationPayment() instance.SoftwareInstance_requestValidationPayment()
# create a Deduction for his fee
context.SubscriptionRequest_generateReservationRefoundSalePackingList()
if context.SubscriptionRequest_testPaymentBalance(): if context.SubscriptionRequest_testPaymentBalance():
context.confirm() context.confirm()
from zExceptions import Unauthorized
if REQUEST is not None:
pass #raise Unauthorized
portal = context.getObject()
if context.REQUEST.get("refund_packing_list_%s" % context.getUid(),
None) is not None:
return
tag = "refund_packing_list_%s_inProfess" % context.getUid()
if (portal.portal_activities.countMessageWithTag(tag) > 0):
return
service = portal.restrictedTraverse(
"service_module/slapos_reservation_refund")
if len(portal.portal_catalog(
default_resource_uid=service.getUid(),
portal_type="Sale Packing List Line",
simulation_state="delivered",
parent_causality_uid=context.getUid())):
# Already generated
return
sale_invoice_transaction = context.getCausalityValue(
portal_type="Sale Invoice Transaction")
if sale_invoice_transaction is None or sale_invoice_transaction.getSimulationState() in ["draft", "cancelled", "deleted"]:
# No invoice generated, nothing to do
return
payment_transaction = sale_invoice_transaction.getCausalityRelatedValue(
portal_type="Payment Transaction")
if payment_transaction is None or payment_transaction.getSimulationState() != "stopped":
# Nothing to do bug wait the payment
return
# Time to create the PL
person = sale_invoice_transaction.getDestinationValue(portal_type="Person")
delivery_template = portal.restrictedTraverse(
portal.portal_preferences.getPreferredInstanceDeliveryTemplate())
delivery = delivery_template.Base_createCloneDocument(batch_mode=1)
delivery.edit(
title="Reservation Deduction",
specialise="sale_trade_condition_module/slapos_reservation_refund_trade_condition",
destination=person.getRelativeUrl(),
destination_decision=person.getRelativeUrl(),
start_date=payment_transaction.getCreationDate(),
causality_uid=context.getUid()
)
line = delivery.newContent(
portal_type="Sale Packing List Line",
title="Reservation Deduction",
quantity=1,
destination_value=person,
destination_decision_value=person,
destination_section_value=person,
resource_value=service,
quantity_unit=service.getQuantityUnit(),
price=-sale_invoice_transaction.getTotalPrice(),
causality_uid=context.getUid()
)
delivery.confirm(comment="Created from %s" % context.getRelativeUrl())
delivery.start()
delivery.stop()
delivery.deliver()
delivery.startBuilding()
delivery.reindexObject(activate_kw={'tag': tag})
line.reindexObject(activate_kw={'tag': tag})
context.REQUEST.set("refound_packing_list_%s" % context.getUid(),
delivery)
return delivery
<?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>_params</string> </key>
<value> <string>REQUEST=None</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SubscriptionRequest_generateReservationRefoundSalePackingList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -38,8 +38,21 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin): ...@@ -38,8 +38,21 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin):
self.createNotificationMessage("subscription_request-confirmation-with-password") self.createNotificationMessage("subscription_request-confirmation-with-password")
self.createNotificationMessage("subscription_request-confirmation-without-password", self.createNotificationMessage("subscription_request-confirmation-without-password",
text_content='${name} ${login_name}') text_content='${name} ${login_name}')
self.cleanUpSubscriptionRequest()
self.tic() self.tic()
def cleanUpSubscriptionRequest(self):
for subscription_request in self.portal.portal_catalog(
portal_type="Subscription Request",
simulation_state=["draft", "planned", "ordered"],
title="Test Subscription Request %"):
if subscription_request.getSimulationState() == "draft":
subscription_request.cancel()
if subscription_request.getSimulationState() == "planned":
subscription_request.order()
if subscription_request.getSimulationState() == "ordered":
subscription_request.confirm()
def createNotificationMessage(self, reference, def createNotificationMessage(self, reference,
content_type='text/html', text_content='${name} ${login_name} ${login_password}'): content_type='text/html', text_content='${name} ${login_name} ${login_password}'):
...@@ -171,10 +184,13 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin): ...@@ -171,10 +184,13 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin):
self.logout() self.logout()
self.login() self.login()
# 195 is the month payment
# 195*3 is the 3 months to pay upfront to use.
# 25 is the reservation fee deduction.
data_kw = { data_kw = {
'errorCode': '0', 'errorCode': '0',
'transactionStatus': '6', 'transactionStatus': '6',
'authAmount': 58500*quantity, 'authAmount': (19500*3-2500)*quantity,
'authDevise': '978', 'authDevise': '978',
} }
payment.PaymentTransaction_createPayzenEvent().PayzenEvent_processUpdate(data_kw, True) payment.PaymentTransaction_createPayzenEvent().PayzenEvent_processUpdate(data_kw, True)
...@@ -287,7 +303,8 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin): ...@@ -287,7 +303,8 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin):
self.assertNotEqual(instance.getAggregate(), None) self.assertNotEqual(instance.getAggregate(), None)
def checkAggregatedSalePackingList(self, subscription_request, sale_packing_list): def checkAggregatedSalePackingList(self, subscription_request, sale_packing_list):
sale_packing_list_line = sale_packing_list.objectValues()[0] sale_packing_list_line = [ i for i in sale_packing_list.objectValues()
if i.getResource() == "service_module/slapos_instance_subscription"][0]
quantity = subscription_request.getQuantity() quantity = subscription_request.getQuantity()
# The values are without tax # The values are without tax
...@@ -298,6 +315,17 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin): ...@@ -298,6 +315,17 @@ class TestSlapOSTrialScenario(DefaultScenarioMixin):
self.assertEqual(sale_packing_list.getCausality(), self.assertEqual(sale_packing_list.getCausality(),
subscription_request.getRelativeUrl()) subscription_request.getRelativeUrl())
sale_packing_list_line = [ i for i in sale_packing_list.objectValues()
if i.getResource() == "service_module/slapos_reservation_refund"][0]
quantity = subscription_request.getQuantity()
# The values are without tax
self.assertEqual(sale_packing_list_line.getQuantity(), 1)
self.assertEqual(sale_packing_list_line.getPrice(), -25*quantity)
self.assertEqual(sale_packing_list_line.getTotalPrice(), -25*quantity)
self.assertEqual(sale_packing_list.getCausality(),
subscription_request.getRelativeUrl())
@changeSkin('Hal') @changeSkin('Hal')
def _requestSubscription(self, **kw): def _requestSubscription(self, **kw):
return self.web_site.hateoas.SubscriptionRequestModule_requestSubscritption(**kw) return self.web_site.hateoas.SubscriptionRequestModule_requestSubscritption(**kw)
......
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