You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2014/11/08 10:38:09 UTC

svn commit: r1637535 - in /ofbiz/trunk/applications/product: entitydef/entitymodel.xml src/org/ofbiz/product/subscription/SubscriptionServices.java widget/catalog/SubscriptionForms.xml

Author: jacopoc
Date: Sat Nov  8 09:38:09 2014
New Revision: 1637535

URL: http://svn.apache.org/r1637535
Log:
OFBIZ-5793 Enhanced logic to run product subscription expiry service only once when the subscription expires:
a) augment the OFBiz data model with the new field: Subscription.expirationCompletedDate
b) modify the algorithm of runServiceUponSubscriptionExpiry to also check whether the expiry service has already run, by checking that expirationCompletedDate is null.
if expirationCompletedDate is null (and the other conditions are satisfied), run the service in SubscriptionResource.serviceNameOnExpiry and update the date/time into expirationCompletedDate
if expirationCompletedDate is not null, skip the expired subscription and move to the next

Thanks to Ivan Cauchi for the patch (slightly modified by me).

Modified:
    ofbiz/trunk/applications/product/entitydef/entitymodel.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/product/subscription/SubscriptionServices.java
    ofbiz/trunk/applications/product/widget/catalog/SubscriptionForms.xml

Modified: ofbiz/trunk/applications/product/entitydef/entitymodel.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?rev=1637535&r1=1637534&r2=1637535&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Sat Nov  8 09:38:09 2014
@@ -4462,7 +4462,7 @@ under the License.
         <field name="canclAutmExtTimeUomId" type="id"><description>Unit Of Measure used for the automatic extension of the subscription.</description></field>
         <field name="gracePeriodOnExpiry" type="numeric"><description>The time period (before the end of the thruDate) after which the automatic extension of the subscription will be executed.</description></field>
         <field name="gracePeriodOnExpiryUomId" type="id"><description>Unit Of Measure used for the automatic extension of the subscription.</description></field>
-        <field name="serviceNameOnExpiry" type="long-varchar"><description>Name of service which will run on subscription expiration.</description></field>
+        <field name="expirationCompletedDate" type="date-time"><description>The date when expiration completed.</description></field>
         <prim-key field="subscriptionId"/>
         <relation type="one" fk-name="SUBSC_SRESRC" rel-entity-name="SubscriptionResource">
             <key-map field-name="subscriptionResourceId"/>

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/subscription/SubscriptionServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/subscription/SubscriptionServices.java?rev=1637535&r1=1637534&r2=1637535&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/subscription/SubscriptionServices.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/subscription/SubscriptionServices.java Sat Nov  8 09:38:09 2014
@@ -315,6 +315,7 @@ public class SubscriptionServices {
         String gracePeriodOnExpiry = null;
         String gracePeriodOnExpiryUomId = null;
         String subscriptionId = null;
+        Timestamp expirationCompletedDate = null;
         
         try {
             EntityCondition cond1 = EntityCondition.makeCondition("automaticExtend", EntityOperator.EQUALS, "N");
@@ -325,57 +326,61 @@ public class SubscriptionServices {
             
             if (subscriptionList != null) {
                 for (GenericValue subscription : subscriptionList) {
-                    Calendar currentDate = Calendar.getInstance();
-                    currentDate.setTime(UtilDateTime.nowTimestamp());
-                    // check if the thruDate + grace period (if provided) is earlier than today's date
-                    Calendar endDateSubscription = Calendar.getInstance();
-                    int field = Calendar.MONTH;
-                    String subscriptionResourceId = subscription.getString("subscriptionResourceId");
-                    GenericValue subscriptionResource = null;
-                    subscriptionResource = EntityQuery.use(delegator).from("SubscriptionResource").where("subscriptionResourceId", subscriptionResourceId).queryOne();
-                    subscriptionId = subscription.getString("subscriptionId");
-                    gracePeriodOnExpiry = subscription.getString("gracePeriodOnExpiry");
-                    gracePeriodOnExpiryUomId = subscription.getString("gracePeriodOnExpiryUomId");
-                    String serviceNameOnExpiry = subscriptionResource.getString("serviceNameOnExpiry");
-                    endDateSubscription.setTime(subscription.getTimestamp("thruDate"));
-                    
-                    if (gracePeriodOnExpiry != null && gracePeriodOnExpiryUomId != null) {
-                        if ("TF_day".equals(gracePeriodOnExpiryUomId)) {
-                            field = Calendar.DAY_OF_YEAR;
-                        } else if ("TF_wk".equals(gracePeriodOnExpiryUomId)) {
-                            field = Calendar.WEEK_OF_YEAR;
-                        } else if ("TF_mon".equals(gracePeriodOnExpiryUomId)) {
-                            field = Calendar.MONTH;
-                        } else if ("TF_yr".equals(gracePeriodOnExpiryUomId)) {
-                            field = Calendar.YEAR;
-                        } else {
-                            Debug.logWarning("Don't know anything about gracePeriodOnExpiryUomId [" + gracePeriodOnExpiryUomId + "], defaulting to month", module);
-                        }
-                        endDateSubscription.add(field, Integer.valueOf(gracePeriodOnExpiry).intValue());
-                    }
-                    
-                    if ((currentDate.after(endDateSubscription) || currentDate.equals(endDateSubscription)) && serviceNameOnExpiry != null) {
-                        if (userLogin != null) {
-                            expiryMap.put("userLogin", userLogin);
-                        }
-                        if (subscriptionId != null) {
-                            expiryMap.put("subscriptionId", subscriptionId);
-                        }
-                        result = dispatcher.runSync(serviceNameOnExpiry, expiryMap);
-                        if (ServiceUtil.isSuccess(result)) {
-                            Debug.logInfo("Subscription expired successfully for subscription ID:" + subscriptionId, module);
-                        } else if (ServiceUtil.isError(result)) {
-                            result = null;
-                            Debug.logError("Error expiring subscription while processing with subscriptionId: " + subscriptionId, module);
+                	expirationCompletedDate = subscription.getTimestamp("expirationCompletedDate");
+                	if (expirationCompletedDate == null) {
+                		Calendar currentDate = Calendar.getInstance();
+                        currentDate.setTime(UtilDateTime.nowTimestamp());
+                        // check if the thruDate + grace period (if provided) is earlier than today's date
+                        Calendar endDateSubscription = Calendar.getInstance();
+                        int field = Calendar.MONTH;
+                        String subscriptionResourceId = subscription.getString("subscriptionResourceId");
+                        GenericValue subscriptionResource = null;
+                        subscriptionResource = EntityQuery.use(delegator).from("SubscriptionResource").where("subscriptionResourceId", subscriptionResourceId).queryOne();
+                        subscriptionId = subscription.getString("subscriptionId");
+                        gracePeriodOnExpiry = subscription.getString("gracePeriodOnExpiry");
+                        gracePeriodOnExpiryUomId = subscription.getString("gracePeriodOnExpiryUomId");
+                        String serviceNameOnExpiry = subscriptionResource.getString("serviceNameOnExpiry");
+                        endDateSubscription.setTime(subscription.getTimestamp("thruDate"));
+                        
+                        if (gracePeriodOnExpiry != null && gracePeriodOnExpiryUomId != null) {
+                            if ("TF_day".equals(gracePeriodOnExpiryUomId)) {
+                                field = Calendar.DAY_OF_YEAR;
+                            } else if ("TF_wk".equals(gracePeriodOnExpiryUomId)) {
+                                field = Calendar.WEEK_OF_YEAR;
+                            } else if ("TF_mon".equals(gracePeriodOnExpiryUomId)) {
+                                field = Calendar.MONTH;
+                            } else if ("TF_yr".equals(gracePeriodOnExpiryUomId)) {
+                                field = Calendar.YEAR;
+                            } else {
+                                Debug.logWarning("Don't know anything about gracePeriodOnExpiryUomId [" + gracePeriodOnExpiryUomId + "], defaulting to month", module);
+                            }
+                            endDateSubscription.add(field, Integer.valueOf(gracePeriodOnExpiry).intValue());
                         }
+                        if ((currentDate.after(endDateSubscription) || currentDate.equals(endDateSubscription)) && serviceNameOnExpiry != null) {
+                            if (userLogin != null) {
+                                expiryMap.put("userLogin", userLogin);
+                            }
+                            if (subscriptionId != null) {
+                                expiryMap.put("subscriptionId", subscriptionId);
+                            }
+                            result = dispatcher.runSync(serviceNameOnExpiry, expiryMap);
+                            if (ServiceUtil.isSuccess(result)) {
+                                subscription.set("expirationCompletedDate", UtilDateTime.nowTimestamp());
+                                delegator.store(subscription);
+                                Debug.logInfo("Subscription expired successfully for subscription ID:" + subscriptionId, module);
+                            } else if (ServiceUtil.isError(result)) {
+                                result = null;
+                                Debug.logError("Error expiring subscription while processing with subscriptionId: " + subscriptionId, module);
+                            }
 
-                        if (result != null && subscriptionId != null) {
-                            Debug.logInfo("Service mentioned in serviceNameOnExpiry called with result: " + result.get("successMessage"), module);
-                        } else if (result == null && subscriptionId != null) {
-                            Debug.logError("Subscription couldn't be expired for subscriptionId: " + subscriptionId, module);
-                            return ServiceUtil.returnError("Subscription couldn't be expired for subscriptionId: " + subscriptionId);
+                            if (result != null && subscriptionId != null) {
+                                Debug.logInfo("Service mentioned in serviceNameOnExpiry called with result: " + result.get("successMessage"), module);
+                            } else if (result == null && subscriptionId != null) {
+                                Debug.logError("Subscription couldn't be expired for subscriptionId: " + subscriptionId, module);
+                                return ServiceUtil.returnError("Subscription couldn't be expired for subscriptionId: " + subscriptionId);
+                            }
                         }
-                    }
+                	}
                 }
             }
         } catch (GenericServiceException e) {

Modified: ofbiz/trunk/applications/product/widget/catalog/SubscriptionForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/widget/catalog/SubscriptionForms.xml?rev=1637535&r1=1637534&r2=1637535&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/widget/catalog/SubscriptionForms.xml (original)
+++ ofbiz/trunk/applications/product/widget/catalog/SubscriptionForms.xml Sat Nov  8 09:38:09 2014
@@ -304,7 +304,6 @@ under the License.
                 </entity-options>
             </drop-down>
         </field>
-        <field name="serviceNameOnExpiry" ><ignored/></field>
         <field name="submitButton" title="${uiLabelMap.CommonUpdate}" widget-style="smallSubmit"><submit button-type="button"/></field>
     </form>