# HG changeset patch
# User Shankar Balachandran <shankar.balachandran@openbravo.com>
# Date 1385979193 -19800
# Node ID 1869d6837452058732671fcb80981775d5a4d841
# Parent  2322aa599cc3f0bfb0867e9d945fb623bda11e7b
Fixes Issue 0025181 : Create a new window preference if a general preference is modified

If an user modifies the window preference which is generic to users/role/org/client it was being overwriten.
Now a new preference is created for this particular user in this case.

diff -r 2322aa599cc3 -r 1869d6837452 modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationActionHandler.java
--- a/modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationActionHandler.java	Mon Dec 02 13:47:34 2013 +0530
+++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationActionHandler.java	Mon Dec 02 15:43:13 2013 +0530
@@ -86,7 +86,8 @@
       final String tabId = (String) parameters.get(TABID);
       final String windowId = (String) parameters.get(WINDOWID);
       final String applyLevelInformation = (String) parameters.get(APPLYLEVELINFORMATION);
-      final String personalizationID = (String) parameters.get(PERSONALIZATIONID);
+      Boolean saveAsNewPreference = false;
+      String personalizationID = (String) parameters.get(PERSONALIZATIONID);
       if (action.equals(ACTION_DELETE)) {
         final UIPersonalization uiPersonalization = OBDal.getInstance().get(
             UIPersonalization.class, personalizationID);
@@ -126,15 +127,24 @@
           // updated, use the original level information
           final UIPersonalization uiPersonalization = OBDal.getInstance().get(
               UIPersonalization.class, personalizationID);
-          clientID = uiPersonalization.getVisibleAtClient().getId();
-          orgID = uiPersonalization.getVisibleAtOrganization().getId();
-          roleID = uiPersonalization.getVisibleAtRole().getId();
-          userID = uiPersonalization.getUser().getId();
+          clientID = uiPersonalization.getVisibleAtClient() != null ? uiPersonalization
+              .getVisibleAtClient().getId() : null;
+          orgID = uiPersonalization.getVisibleAtOrganization() != null ? uiPersonalization
+              .getVisibleAtOrganization().getId() : null;
+          roleID = uiPersonalization.getVisibleAtRole() != null ? uiPersonalization
+              .getVisibleAtRole().getId() : null;
+          userID = uiPersonalization.getUser() != null ? uiPersonalization.getUser().getId() : null;
+        }
+
+        if (clientID == null || orgID == null || roleID == null || userID == null) {
+          // the personalization is a global personalization. do not update it. create a new
+          // personalization for the user
+          saveAsNewPreference = true;
         }
 
         final UIPersonalization uiPersonalization = personalizationHandler.storePersonalization(
             personalizationID, clientID, orgID, roleID, userID, tabId, windowId,
-            (String) parameters.get(TARGET), data);
+            (String) parameters.get(TARGET), data, saveAsNewPreference);
         final JSONObject result = new JSONObject();
         result.put("personalizationId", uiPersonalization.getId());
         return result;
diff -r 2322aa599cc3 -r 1869d6837452 modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationHandler.java
--- a/modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationHandler.java	Mon Dec 02 13:47:34 2013 +0530
+++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/personalization/PersonalizationHandler.java	Mon Dec 02 15:43:13 2013 +0530
@@ -369,17 +369,55 @@
    */
   public UIPersonalization storePersonalization(String persId, String clientId, String orgId,
       String roleId, String userId, String tabId, String windowId, String target, String value) {
+    return storePersonalization(persId, clientId, orgId, roleId, userId, tabId, windowId, target,
+        value, false);
+  }
+
+  /**
+   * Stores the personalization json object for a certain level, if there is no current record then
+   * a new one is created and persisted. If the pers
+   * 
+   * @param persId
+   *          if a specific personalization id is set then the system updates that record and
+   *          ignores the other parameters.
+   * @param clientId
+   *          the client, maybe null
+   * @param orgId
+   *          the organization id, maybe null
+   * @param roleId
+   *          the role id, maybe null
+   * @param userId
+   *          the user id, maybe null
+   * @param tabId
+   *          the tab id, may not be null
+   * @param target
+   *          the personalization target, is either form or grid
+   * @param value
+   *          the value, a json string
+   * @param saveAsNewPersonalization
+   *          to save the personalization as a new personalization
+   * @return the persisted record
+   */
+  public UIPersonalization storePersonalization(String persId, String clientId, String orgId,
+      String roleId, String userId, String tabId, String windowId, String target, String value,
+      Boolean saveAsNewPersonalization) {
     OBContext.setAdminMode(false);
     try {
-      UIPersonalization uiPersonalization;
-      if (persId != null) {
-        uiPersonalization = OBDal.getInstance().get(UIPersonalization.class, persId);
-        if (uiPersonalization == null) {
-          throw new IllegalArgumentException("UI Personalization with id " + persId + " not found");
+      UIPersonalization uiPersonalization = null;
+      // if saveAsNewPersonalization is true ignore the persId and create a new personalization row.
+      // Happens in the case where a global personalization is modified by a particular user. Refer
+      // https://issues.openbravo.com/view.php?id=25181
+      if (!saveAsNewPersonalization) {
+        if (persId != null) {
+          uiPersonalization = OBDal.getInstance().get(UIPersonalization.class, persId);
+          if (uiPersonalization == null) {
+            throw new IllegalArgumentException("UI Personalization with id " + persId
+                + " not found");
+          }
+        } else {
+          uiPersonalization = getPersonalization(clientId, orgId, roleId, userId, tabId, windowId,
+              true);
         }
-      } else {
-        uiPersonalization = getPersonalization(clientId, orgId, roleId, userId, tabId, windowId,
-            true);
       }
 
       if (uiPersonalization == null) {
