details:   https://code.openbravo.com/erp/devel/pi/rev/def13514e4af
changeset: 32798:def13514e4af
user:      Alvaro Ferraz <alvaro.ferraz <at> openbravo.com>
date:      Fri Sep 22 09:55:57 2017 +0200
summary:   Fixes issue 36877: New Organization selector for Purchase Order 
Report

details:   https://code.openbravo.com/erp/devel/pi/rev/2955207cac37
changeset: 32799:2955207cac37
user:      Alvaro Ferraz <alvaro.ferraz <at> openbravo.com>
date:      Fri Sep 22 15:20:34 2017 +0200
summary:   Related to issue 36877: Code review improvements

Avoid in clause which can have problems in Oracle, and use exists clause 
instead.
Check data access level from both process definition and report and process.
Depending on data access level, selector will retrieve following organizations:
- Organization: Role org access organizations.
- All or Client/Organization: Role org access organizations + * organization.
- System/Client: * organization.

diffstat:

 src-db/database/sourcedata/AD_REFERENCE.xml                                    
|  12 +
 src-db/database/sourcedata/OBUIAPP_PARAMETER.xml                               
|   2 +-
 src-db/database/sourcedata/OBUISEL_SELECTOR.xml                                
|  16 +
 src/org/openbravo/erpCommon/info/ContextRoleDirectAccessibleOrganizations.java 
|  81 ++++++++++
 4 files changed, 110 insertions(+), 1 deletions(-)

diffs (145 lines):

diff -r f77ab92dd57f -r 2955207cac37 src-db/database/sourcedata/AD_REFERENCE.xml
--- a/src-db/database/sourcedata/AD_REFERENCE.xml       Fri Sep 22 15:22:49 
2017 +0200
+++ b/src-db/database/sourcedata/AD_REFERENCE.xml       Fri Sep 22 15:20:34 
2017 +0200
@@ -4250,6 +4250,18 @@
 <!--0588C365DDAC46079E9D6ABD652CB6E4-->  
<ISVALUEDISPLAYED><![CDATA[N]]></ISVALUEDISPLAYED>
 <!--0588C365DDAC46079E9D6ABD652CB6E4--></AD_REFERENCE>
 
+<!--06AB6C4089ED49C387779E28E0359F8C--><AD_REFERENCE>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<AD_REFERENCE_ID><![CDATA[06AB6C4089ED49C387779E28E0359F8C]]></AD_REFERENCE_ID>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  <NAME><![CDATA[Context Role Direct 
Accessible Organizations]]></NAME>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<ISBASEREFERENCE><![CDATA[N]]></ISBASEREFERENCE>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<PARENTREFERENCE_ID><![CDATA[95E2A8B50A254B2AAE6774B8C2F28120]]></PARENTREFERENCE_ID>
+<!--06AB6C4089ED49C387779E28E0359F8C-->  
<ISVALUEDISPLAYED><![CDATA[N]]></ISVALUEDISPLAYED>
+<!--06AB6C4089ED49C387779E28E0359F8C--></AD_REFERENCE>
+
 <!--085E99751D2045AA9D4FA23F4B765B21--><AD_REFERENCE>
 <!--085E99751D2045AA9D4FA23F4B765B21-->  
<AD_REFERENCE_ID><![CDATA[085E99751D2045AA9D4FA23F4B765B21]]></AD_REFERENCE_ID>
 <!--085E99751D2045AA9D4FA23F4B765B21-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r f77ab92dd57f -r 2955207cac37 
src-db/database/sourcedata/OBUIAPP_PARAMETER.xml
--- a/src-db/database/sourcedata/OBUIAPP_PARAMETER.xml  Fri Sep 22 15:22:49 
2017 +0200
+++ b/src-db/database/sourcedata/OBUIAPP_PARAMETER.xml  Fri Sep 22 15:20:34 
2017 +0200
@@ -517,7 +517,7 @@
 <!--3DBAFE673E004477AD1426381A44134A-->  <HELP><![CDATA[An organization is a 
unit of your client or legal entity - examples are store, department. You can 
share data between organizations.]]></HELP>
 <!--3DBAFE673E004477AD1426381A44134A-->  <SEQNO><![CDATA[10]]></SEQNO>
 <!--3DBAFE673E004477AD1426381A44134A-->  
<AD_REFERENCE_ID><![CDATA[95E2A8B50A254B2AAE6774B8C2F28120]]></AD_REFERENCE_ID>
-<!--3DBAFE673E004477AD1426381A44134A-->  
<AD_REFERENCE_VALUE_ID><![CDATA[100A788331734AE8BCC87BA0AC9E3406]]></AD_REFERENCE_VALUE_ID>
+<!--3DBAFE673E004477AD1426381A44134A-->  
<AD_REFERENCE_VALUE_ID><![CDATA[06AB6C4089ED49C387779E28E0359F8C]]></AD_REFERENCE_VALUE_ID>
 <!--3DBAFE673E004477AD1426381A44134A-->  
<COLUMNNAME><![CDATA[AD_Org_ID]]></COLUMNNAME>
 <!--3DBAFE673E004477AD1426381A44134A-->  
<ISCENTRALLYMAINTAINED><![CDATA[Y]]></ISCENTRALLYMAINTAINED>
 <!--3DBAFE673E004477AD1426381A44134A-->  
<FIELDLENGTH><![CDATA[32]]></FIELDLENGTH>
diff -r f77ab92dd57f -r 2955207cac37 
src-db/database/sourcedata/OBUISEL_SELECTOR.xml
--- a/src-db/database/sourcedata/OBUISEL_SELECTOR.xml   Fri Sep 22 15:22:49 
2017 +0200
+++ b/src-db/database/sourcedata/OBUISEL_SELECTOR.xml   Fri Sep 22 15:20:34 
2017 +0200
@@ -1080,6 +1080,22 @@
 <!--E65052A724B3451CA643A0CC355CEA40-->  
<CUSTOM_QUERY><![CDATA[N]]></CUSTOM_QUERY>
 <!--E65052A724B3451CA643A0CC355CEA40--></OBUISEL_SELECTOR>
 
+<!--E80D7648BF3848BD9DD23B31287CC59B--><OBUISEL_SELECTOR>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<OBUISEL_SELECTOR_ID><![CDATA[E80D7648BF3848BD9DD23B31287CC59B]]></OBUISEL_SELECTOR_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  <NAME><![CDATA[Context Role Direct 
Accessible Organizations]]></NAME>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<AD_REFERENCE_ID><![CDATA[06AB6C4089ED49C387779E28E0359F8C]]></AD_REFERENCE_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<AD_TABLE_ID><![CDATA[155]]></AD_TABLE_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<FILTER_EXPRESSION><![CDATA[OB.getFilterExpression("org.openbravo.erpCommon.info.ContextRoleDirectAccessibleOrganizations")]]></FILTER_EXPRESSION>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<OBCLKER_TEMPLATE_ID><![CDATA[9314DE8599AD44E7BFC4CC50699042AB]]></OBCLKER_TEMPLATE_ID>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<SUGGESTIONTEXTMATCHSTYLE><![CDATA[startsWith]]></SUGGESTIONTEXTMATCHSTYLE>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<POPUPTEXTMATCHSTYLE><![CDATA[startsWith]]></POPUPTEXTMATCHSTYLE>
+<!--E80D7648BF3848BD9DD23B31287CC59B-->  
<CUSTOM_QUERY><![CDATA[N]]></CUSTOM_QUERY>
+<!--E80D7648BF3848BD9DD23B31287CC59B--></OBUISEL_SELECTOR>
+
 <!--E8F1B0721E104D07AAC532290C951C37--><OBUISEL_SELECTOR>
 <!--E8F1B0721E104D07AAC532290C951C37-->  
<OBUISEL_SELECTOR_ID><![CDATA[E8F1B0721E104D07AAC532290C951C37]]></OBUISEL_SELECTOR_ID>
 <!--E8F1B0721E104D07AAC532290C951C37-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r f77ab92dd57f -r 2955207cac37 
src/org/openbravo/erpCommon/info/ContextRoleDirectAccessibleOrganizations.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ 
b/src/org/openbravo/erpCommon/info/ContextRoleDirectAccessibleOrganizations.java
    Fri Sep 22 15:20:34 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo  Public  License
+ * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
+ * Version 1.1  with a permitted attribution clause; you may not  use this
+ * file except in compliance with the License. You  may  obtain  a copy of
+ * the License at http://www.openbravo.com/legal/license.html 
+ * Software distributed under the License  is  distributed  on  an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific  language  governing  rights  and  limitations
+ * under the License. 
+ * The Original Code is Openbravo ERP. 
+ * The Initial Developer of the Original Code is Openbravo SLU 
+ * All portions are Copyright (C) 2017 Openbravo SLU 
+ * All Rights Reserved. 
+ * Contributor(s):  ______________________________________.
+ ************************************************************************
+ */
+
+package org.openbravo.erpCommon.info;
+
+import java.util.Map;
+
+import org.openbravo.base.model.AccessLevel;
+import org.openbravo.client.application.FilterExpression;
+import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBDal;
+
+/**
+ * Filter expression for the "Context Role Direct Accessible Organizations" 
reference.
+ * 
+ * It filters the organizations to be displayed taking into account if their 
access has been
+ * explicitly defined for the role in the current context. It also takes into 
account if the access
+ * level of the process definition allows to include the organization '*'.
+ */
+public class ContextRoleDirectAccessibleOrganizations implements 
FilterExpression {
+
+  @Override
+  public String getExpression(Map<String, String> requestMap) {
+    StringBuilder filterExpression = new StringBuilder("");
+    filterExpression.append("exists (select 1 from ADRoleOrganization ro where 
ro.role.id = '"
+        + OBContext.getOBContext().getRole().getId() + "' and 
ro.organization.id = e.id)");
+
+    int accessLevel;
+    if (requestMap.containsKey("inpadProcessId")) {
+      accessLevel = getProcessAccessLevel(requestMap.get("inpadProcessId"));
+    } else if (requestMap.containsKey("_processDefinitionId")) {
+      accessLevel = 
getProcessDefinitionAccessLevel(requestMap.get("_processDefinitionId"));
+    } else {
+      return filterExpression.toString();
+    }
+
+    if (accessLevel == AccessLevel.ORGANIZATION.getDbValue()) {
+      filterExpression.append(" AND e.id <> '0'");
+    } else if (accessLevel == AccessLevel.ALL.getDbValue()
+        || accessLevel == AccessLevel.CLIENT_ORGANIZATION.getDbValue()) {
+      filterExpression.append(" OR e.id = '0'");
+    } else if (accessLevel == AccessLevel.SYSTEM_CLIENT.getDbValue()) {
+      filterExpression = new StringBuilder("e.id = '0'");
+    }
+    return filterExpression.toString();
+  }
+
+  private int getProcessAccessLevel(String processId) {
+    org.openbravo.model.ad.ui.Process process = OBDal.getInstance().get(
+        org.openbravo.model.ad.ui.Process.class, processId);
+    if (process == null) {
+      return -1;
+    }
+    return Integer.parseInt(process.getDataAccessLevel());
+  }
+
+  private int getProcessDefinitionAccessLevel(String processDefinitionId) {
+    org.openbravo.client.application.Process processDefinition = 
OBDal.getInstance().get(
+        org.openbravo.client.application.Process.class, processDefinitionId);
+    if (processDefinition == null) {
+      return -1;
+    }
+    return Integer.parseInt(processDefinition.getDataAccessLevel());
+  }
+}

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to