diff --git a/bt5/erp5_free_subscription/PortalTypeTemplateItem/portal_types/Free%20Subscription%20Request.xml b/bt5/erp5_free_subscription/PortalTypeTemplateItem/portal_types/Free%20Subscription%20Request.xml
index dabe376393d13f7b9ff6b3b87396d5fae1d7c267..0fce63b1ebdcf0fb60b147a58e037a44d3117302 100644
--- a/bt5/erp5_free_subscription/PortalTypeTemplateItem/portal_types/Free%20Subscription%20Request.xml
+++ b/bt5/erp5_free_subscription/PortalTypeTemplateItem/portal_types/Free%20Subscription%20Request.xml
@@ -28,9 +28,7 @@
-
init_script
-
-
-
+ FreeSubscriptionRequest_init
-
permission
@@ -42,9 +40,15 @@
portal_type
Base Type
+ -
+ short_title
+
+
+
+
-
type_class
- XMLObject
+ Ticket
-
type_interface
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList.xml
index e542f0a7b769784c9b0f9a2dda07bf9844cbbfa3..e44b2ae375c09e9a7c273203a9735b5fed79eeb8 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList.xml
@@ -67,7 +67,9 @@
-
hidden
-
+
+ listbox_delivery_start_date
+
-
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox.xml
index 99881076c84233f1e7e03cbce574e8603c3d4615..ca911a05b3397fce7c2865fe5e7c73fc5c07d07d 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox.xml
@@ -93,6 +93,10 @@
free_subscription_request_type_title
Type
+
+ delivery.start_date
+ Begin Date
+
translated_validation_state_title
State
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox_delivery_start_date.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox_delivery_start_date.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd8f58b6b4fd7ce57cf83f3af19a3461436451cd
--- /dev/null
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequestModule_viewFreeSubscriptionRequestList/listbox_delivery_start_date.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
-
+ delegated_list
+
+
+
+
+ -
+ id
+ listbox_delivery_start_date
+
+ -
+ message_values
+
+
+
-
+ external_validator_failed
+ The input failed the external validator.
+
+
+
+
+ -
+ overrides
+
+
+
-
+ field_id
+
+
+ -
+ form_id
+
+
+ -
+ target
+
+
+
+
+
+ -
+ tales
+
+
+
-
+ field_id
+
+
+ -
+ form_id
+
+
+ -
+ target
+
+
+
+
+
+ -
+ values
+
+
+
-
+ field_id
+ my_date_time_field
+
+ -
+ form_id
+ Base_viewFieldLibrary
+
+ -
+ target
+ Click to edit the target
+
+
+
+
+
+
+
+
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.py b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.py
new file mode 100644
index 0000000000000000000000000000000000000000..1262de960b4b8727e21e72a9e4134e372842b6f8
--- /dev/null
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.py
@@ -0,0 +1,2 @@
+if 'start_date' not in kw.get('edit_kw', {}):
+ context.setStartDate(DateTime())
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f2d89d437f183418faf4bb41254ec5976883f71a
--- /dev/null
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_init.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+ -
+ Script_magic
+ 3
+
+ -
+ _bind_names
+
+
+
+
+ -
+ _params
+ **kw
+
+ -
+ id
+ FreeSubscriptionRequest_init
+
+
+
+
+
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view.xml
index 9c05f62945f2e3213b138b7cba0da9d8f260a9e1..fb878384e09c02bd4ed745ea4c5df9762f48b6d9 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view.xml
@@ -88,7 +88,7 @@
my_reference
my_free_subscription_request_type
- my_effective_date
+ my_start_date
my_translated_validation_state_title
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_effective_date.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_start_date.xml
similarity index 96%
rename from bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_effective_date.xml
rename to bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_start_date.xml
index 7d2991894300285d0e5158fa00c99fd0c0ff3d2c..3177dcbada6d8346d2f48a735ab34bc0670df00b 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_effective_date.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscriptionRequest_view/my_start_date.xml
@@ -16,7 +16,7 @@
-
id
- my_effective_date
+ my_start_date
-
message_values
@@ -89,7 +89,7 @@
-
title
- Stop Date
+ Begin Date
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest.xml
index 0d3a155922cb8e576fec5d313e6f2314982c06dd..5ce7e881c2225415958f572aeb84b73618946de6 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest.xml
@@ -57,7 +57,9 @@
-
hidden
-
+
+ listbox_delivery_start_date
+
-
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox.xml
index 00c5a893650873d8a67e873d796931079c8790fd..5d228c3e521000bb5f932081df7ffe7c24c27031 100644
--- a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox.xml
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox.xml
@@ -116,6 +116,10 @@
free_subscription_request_type_title
Type
+
+ delivery.start_date
+ Begin Date
+
translated_validation_state_title
State
diff --git a/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox_delivery_start_date.xml b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox_delivery_start_date.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd8f58b6b4fd7ce57cf83f3af19a3461436451cd
--- /dev/null
+++ b/bt5/erp5_free_subscription/SkinTemplateItem/portal_skins/erp5_free_subscription/FreeSubscription_viewFreeSubscriptionRequest/listbox_delivery_start_date.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
-
+ delegated_list
+
+
+
+
+ -
+ id
+ listbox_delivery_start_date
+
+ -
+ message_values
+
+
+
-
+ external_validator_failed
+ The input failed the external validator.
+
+
+
+
+ -
+ overrides
+
+
+
-
+ field_id
+
+
+ -
+ form_id
+
+
+ -
+ target
+
+
+
+
+
+ -
+ tales
+
+
+
-
+ field_id
+
+
+ -
+ form_id
+
+
+ -
+ target
+
+
+
+
+
+ -
+ values
+
+
+
-
+ field_id
+ my_date_time_field
+
+ -
+ form_id
+ Base_viewFieldLibrary
+
+ -
+ target
+ Click to edit the target
+
+
+
+
+
+
+
+
diff --git a/bt5/erp5_free_subscription/WorkflowTemplateItem/portal_workflow/free_subscription_interaction_workflow/scripts/Request_updateFreeSubscription.py b/bt5/erp5_free_subscription/WorkflowTemplateItem/portal_workflow/free_subscription_interaction_workflow/scripts/Request_updateFreeSubscription.py
index d24c18f65b8a0ba4407d9866422841bbd547033b..d1793712e460316e14cf940d3b09b49a9d3ba239 100644
--- a/bt5/erp5_free_subscription/WorkflowTemplateItem/portal_workflow/free_subscription_interaction_workflow/scripts/Request_updateFreeSubscription.py
+++ b/bt5/erp5_free_subscription/WorkflowTemplateItem/portal_workflow/free_subscription_interaction_workflow/scripts/Request_updateFreeSubscription.py
@@ -1,16 +1,56 @@
request = state_change["object"]
+portal = request.getPortalObject()
+now = DateTime()
+request_type = request.getFreeSubscriptionRequestType()
+resource = request.getResource()
+stop_date = request.getStopDate()
-if request.getFreeSubscriptionRequestType() == "unsubscription":
- free_subscription = request.getFollowUpValue()
- if free_subscription.getValidationState() != "invalidated":
- free_subscription.invalidate()
-elif request.getFreeSubscriptionRequestType() == "subscription":
- from DateTime import DateTime
- portal = request.getPortalObject()
+# Rule is we prioritise effective_date if it exists,
+# then getStopDate result (stop_date or acquiring from start_date) if it is not None
+# and finally current date
+if request.hasEffectiveDate():
+ effective_date = request.getEffectiveDate()
+else:
+ effective_date = stop_date or now
+
+free_subscription = request.getFollowUpValue()
+if free_subscription is None:
free_subscription = portal.free_subscription_module.newContent(
source=request.getSource(),
destination=request.getDestination(),
- resource=request.getResource(),
- effective_date=DateTime())
- free_subscription.validate()
- request.setFollowUpValue(free_subscription)
+ resource=resource,
+ effective_date=effective_date,
+ )
+request.setFollowUpValue(free_subscription)
+variation_category_list = request.getVariationCategoryList()
+
+if request_type == "unsubscription":
+ assert not variation_category_list, 'unsubscription type of Free Subscription Request with non empty variation_category_list'
+ validation_state = free_subscription.getValidationState()
+ if validation_state != "invalidated":
+ if validation_state == "draft":
+ # validate, so that we can invalidate in same transaction
+ free_subscription.validate()
+ # Rule is we prioritise expiration_date if it exists
+ # then getStopDate result (stop_date or acquiring from start_date) if it is not None
+ # and finally current date
+ if request.hasExpirationDate():
+ expiration_date = request.getExpirationDate()
+ else:
+ expiration_date = stop_date or now
+ free_subscription.setExpirationDate(expiration_date)
+ free_subscription.invalidate()
+elif request_type == "subscription":
+ variation_range_category_list = request.getVariationRangeCategoryList()
+ if not variation_category_list:
+ assert not request.getVariationRangeCategoryList(), 'subscription type of Free Subscription Request with non empty variation_category_list, while resource has list defined'
+ for variation_category in variation_category_list:
+ assert variation_category in variation_range_category_list, 'not allowed variation_category %s' % variation_category
+ free_subscription.setExpirationDate(None)
+ if free_subscription.getValidationState() != "validated":
+ free_subscription.validate()
+ free_subscription.setEffectiveDate(effective_date)
+else:
+ raise RuntimeError('Unknown request type %s' % request_type)
+
+free_subscription.setVariationCategoryList(variation_category_list)