details: https://code.openbravo.com/erp/devel/pi/rev/85730acf7b16 changeset: 23405:85730acf7b16 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Wed May 28 13:23:22 2014 +0200 summary: Fixed bug 26719 Stock reservation pick lines does not keep selected lines
details: https://code.openbravo.com/erp/devel/pi/rev/eece3bb3d696 changeset: 23406:eece3bb3d696 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Thu May 29 12:35:15 2014 +0200 summary: Fixed bug 26689 Return from customer pick lines does not keep selected lines details: https://code.openbravo.com/erp/devel/pi/rev/2b23a4e38022 changeset: 23407:2b23a4e38022 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Wed May 28 13:24:31 2014 +0200 summary: Fixed bug 26688 Return to vendor pick lines does not keep selected lines details: https://code.openbravo.com/erp/devel/pi/rev/6deeeb7a363e changeset: 23408:6deeeb7a363e user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Thu May 29 15:32:20 2014 +0200 summary: Related to issue 26689 diffstat: modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java | 2 +- src-db/database/sourcedata/AD_TAB.xml | 1 + src-db/database/sourcedata/AD_TABLE.xml | 3 +- src-db/database/sourcedata/OBUIAPP_PARAMETER.xml | 2 +- src/org/openbravo/common/datasource/ResultMapCriteriaUtils.java | 520 ++++++++++ src/org/openbravo/common/datasource/ReturnFromCustomerPickEditLineDatasource.java | 51 +- src/org/openbravo/common/datasource/ReturnFromCustomerPickEditLineRow.java | 4 + src/org/openbravo/common/datasource/ReturnToVendorPickAndEditDataSource.java | 164 ++- src/org/openbravo/common/datasource/StockReservationPickAndEditDataSource.java | 258 +++- 9 files changed, 853 insertions(+), 152 deletions(-) diffs (truncated from 1332 to 300 lines): diff -r b99f3051275b -r 6deeeb7a363e modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java --- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java Thu May 29 21:00:40 2014 +0000 +++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java Thu May 29 15:32:20 2014 +0200 @@ -1230,7 +1230,7 @@ * * @return a valid order by clause (or an empty string if no sorting) */ - protected String getOrderByClause() { + public String getOrderByClause() { if (orderByClause != null) { return orderByClause; } diff -r b99f3051275b -r 6deeeb7a363e src-db/database/sourcedata/AD_TAB.xml --- a/src-db/database/sourcedata/AD_TAB.xml Thu May 29 21:00:40 2014 +0000 +++ b/src-db/database/sourcedata/AD_TAB.xml Thu May 29 15:32:20 2014 +0200 @@ -18104,6 +18104,7 @@ <!--F4204696A73647E2AA9700106C00C7A5--> <DISABLE_PARENT_KEY_PROPERTY><![CDATA[N]]></DISABLE_PARENT_KEY_PROPERTY> <!--F4204696A73647E2AA9700106C00C7A5--> <ISREADONLYTREE><![CDATA[N]]></ISREADONLYTREE> <!--F4204696A73647E2AA9700106C00C7A5--> <ISSHOWTREENODEICONS><![CDATA[Y]]></ISSHOWTREENODEICONS> +<!--F4204696A73647E2AA9700106C00C7A5--> <EM_OBUIAPP_SELECTION><![CDATA[OB.RM.RMOrderSelectionChange]]></EM_OBUIAPP_SELECTION> <!--F4204696A73647E2AA9700106C00C7A5--> <EM_OBUIAPP_CAN_ADD><![CDATA[N]]></EM_OBUIAPP_CAN_ADD> <!--F4204696A73647E2AA9700106C00C7A5--> <EM_OBUIAPP_CAN_DELETE><![CDATA[N]]></EM_OBUIAPP_CAN_DELETE> <!--F4204696A73647E2AA9700106C00C7A5--> <EM_OBUIAPP_SHOW_SELECT><![CDATA[Y]]></EM_OBUIAPP_SHOW_SELECT> diff -r b99f3051275b -r 6deeeb7a363e src-db/database/sourcedata/AD_TABLE.xml --- a/src-db/database/sourcedata/AD_TABLE.xml Thu May 29 21:00:40 2014 +0000 +++ b/src-db/database/sourcedata/AD_TABLE.xml Thu May 29 15:32:20 2014 +0200 @@ -11031,7 +11031,8 @@ <!--A9BC62219E644720867F6402B0C25933--> <TABLENAME><![CDATA[C_RM_RFC_PE_LINES]]></TABLENAME> <!--A9BC62219E644720867F6402B0C25933--> <CLASSNAME><![CDATA[C_RM_RFC_PE_LINES]]></CLASSNAME> <!--A9BC62219E644720867F6402B0C25933--> <ISVIEW><![CDATA[N]]></ISVIEW> -<!--A9BC62219E644720867F6402B0C25933--> <ACCESSLEVEL><![CDATA[3]]></ACCESSLEVEL> +<!--A9BC62219E644720867F6402B0C25933--> <ACCESSLEVEL><![CDATA[1]]></ACCESSLEVEL> +<!--A9BC62219E644720867F6402B0C25933--> <AD_WINDOW_ID><![CDATA[FF808081330213E60133021822E40007]]></AD_WINDOW_ID> <!--A9BC62219E644720867F6402B0C25933--> <ISSECURITYENABLED><![CDATA[N]]></ISSECURITYENABLED> <!--A9BC62219E644720867F6402B0C25933--> <ISDELETEABLE><![CDATA[Y]]></ISDELETEABLE> <!--A9BC62219E644720867F6402B0C25933--> <ISHIGHVOLUME><![CDATA[N]]></ISHIGHVOLUME> diff -r b99f3051275b -r 6deeeb7a363e src-db/database/sourcedata/OBUIAPP_PARAMETER.xml --- a/src-db/database/sourcedata/OBUIAPP_PARAMETER.xml Thu May 29 21:00:40 2014 +0000 +++ b/src-db/database/sourcedata/OBUIAPP_PARAMETER.xml Thu May 29 15:32:20 2014 +0200 @@ -318,7 +318,7 @@ <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <FIELDLENGTH><![CDATA[0]]></FIELDLENGTH> <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <ISMANDATORY><![CDATA[N]]></ISMANDATORY> <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <AD_ELEMENT_ID><![CDATA[B27C7AF72FEFEC33E040007F0100076A]]></AD_ELEMENT_ID> -<!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <ISFIXED><![CDATA[N]]></ISFIXED> +<!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <ISFIXED><![CDATA[Y]]></ISFIXED> <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <EVALUATEFIXEDVALUE><![CDATA[N]]></EVALUATEFIXEDVALUE> <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <OBUIAPP_PROCESS_ID><![CDATA[30A4E65B69B14134A78C7B270D3502F7]]></OBUIAPP_PROCESS_ID> <!--DAC023BDC4D2413D9B5F9ECD5411E39D--> <STARTINNEWLINE><![CDATA[N]]></STARTINNEWLINE> diff -r b99f3051275b -r 6deeeb7a363e src/org/openbravo/common/datasource/ResultMapCriteriaUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/openbravo/common/datasource/ResultMapCriteriaUtils.java Thu May 29 15:32:20 2014 +0200 @@ -0,0 +1,520 @@ +package org.openbravo.common.datasource; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.codehaus.jettison.json.JSONArray; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.openbravo.base.structure.BaseOBObject; +import org.openbravo.service.json.JsonUtils; + +class ResultMapCriteriaUtils { + private static final String CRITERIA_KEY = "criteria"; + private static final String VALUE_KEY = "value"; + private static final String FIELD_NAME_KEY = "fieldName"; + private static final String OPERATOR_KEY = "operator"; + + private static final String OPERATOR_AND = "and"; + private static final String OPERATOR_OR = "or"; + + private static final String OPERATOR_EQUALS = "equals"; + private static final String OPERATOR_NOTEQUAL = "notEqual"; + private static final String OPERATOR_IEQUALS = "iEquals"; + private static final String OPERATOR_INOTEQUAL = "iNotEqual"; + private static final String OPERATOR_GREATERTHAN = "greaterThan"; + private static final String OPERATOR_LESSTHAN = "lessThan"; + private static final String OPERATOR_GREATEROREQUAL = "greaterOrEqual"; + private static final String OPERATOR_LESSOREQUAL = "lessOrEqual"; + private static final String OPERATOR_IGREATERTHAN = "iGreaterThan"; + private static final String OPERATOR_ILESSTHAN = "iLessThan"; + private static final String OPERATOR_IGREATEROREQUAL = "iGreaterOrEqual"; + private static final String OPERATOR_ILESSOREQUAL = "iLessOrEqual"; + private static final String OPERATOR_CONTAINS = "contains"; + private static final String OPERATOR_STARTSWITH = "startsWith"; + private static final String OPERATOR_ENDSWITH = "endsWith"; + private static final String OPERATOR_ICONTAINS = "iContains"; + private static final String OPERATOR_ISTARTSWITH = "iStartsWith"; + private static final String OPERATOR_IENDSWITH = "iEndsWith"; + private static final String OPERATOR_NOTCONTAINS = "notContains"; + private static final String OPERATOR_NOTSTARTSWITH = "notStartsWith"; + private static final String OPERATOR_NOTENDSWITH = "notEndsWith"; + private static final String OPERATOR_INOTCONTAINS = "iNotContains"; + private static final String OPERATOR_INOTSTARTSWITH = "iNotStartsWith"; + private static final String OPERATOR_INOTENDSWITH = "iNotEndsWith"; + // private static final String OPERATOR_REGEXP = "regexp"; + // private static final String OPERATOR_IREGEXP = "iregexp"; + private static final String OPERATOR_ISNULL = "isNull"; + private static final String OPERATOR_NOTNULL = "notNull"; + private static final String OPERATOR_INSET = "inSet"; + private static final String OPERATOR_NOTINSET = "notInSet"; + private static final String OPERATOR_EQUALSFIELD = "equalsField"; + private static final String OPERATOR_NOTEQUALFIELD = "notEqualField"; + private static final String OPERATOR_GREATERTHANFIElD = "greaterThanField"; + private static final String OPERATOR_LESSTHANFIELD = "lessThanField"; + private static final String OPERATOR_GREATEROREQUALFIELD = "greaterOrEqualField"; + private static final String OPERATOR_LESSOREQUALFIElD = "lessOrEqualField"; + private static final String OPERATOR_CONTAINSFIELD = "containsField"; + private static final String OPERATOR_STARTSWITHFIELD = "startsWithField"; + private static final String OPERATOR_ENDSWITHFIELD = "endsWithField"; + private static final String OPERATOR_NOT = "not"; + private static final String OPERATOR_BETWEEN = "between"; + private static final String OPERATOR_BETWEENINCLUSIVE = "betweenInclusive"; + private static final String OPERATOR_IBETWEEN = "iBetween"; + private static final String OPERATOR_IBETWEENINCLUSIVE = "iBetweenInclusive"; + private static final String OPERATOR_EXISTS = "exists"; + + Map<String, Object> recordMap; + JSONArray criteriaArray; + boolean mainOperatorIsAnd; + + private int UTCServerMinutesTimeZoneDiff = 0; + private int clientUTCMinutesTimeZoneDiff = 0; + + private SimpleDateFormat simpleDateFormat = JsonUtils.createDateFormat(); + private SimpleDateFormat simpleDateTimeFormat = JsonUtils.createJSTimeFormat(); + + ResultMapCriteriaUtils(Map<String, Object> orderMap, Map<String, String> parameters) { + JSONArray _criteriaArray = null; + try { + _criteriaArray = (JSONArray) JsonUtils.buildCriteria(parameters).get("criteria"); + } catch (JSONException e) { + _criteriaArray = null; + } + String mainOperator = parameters.get("operator"); + + this.recordMap = orderMap; + this.criteriaArray = _criteriaArray; + this.mainOperatorIsAnd = OPERATOR_AND.equals(mainOperator); + } + + boolean applyFilter() throws JSONException { + if (criteriaArray == null) { + return true; + } + boolean finalResult = mainOperatorIsAnd; + for (int i = 0; i < criteriaArray.length(); i++) { + // Each element of the criteria array is added assuming an OR statement. + JSONObject criteria = criteriaArray.getJSONObject(i); + boolean critResult = parseCriteria(criteria); + if (mainOperatorIsAnd) { + finalResult &= critResult; + } else { + finalResult |= critResult; + } + } + return finalResult; + } + + private boolean parseCriteria(JSONObject jsonCriteria) throws JSONException { + // a constructor so the content is an advanced criteria + if (jsonCriteria.has("_constructor") || hasOrAndOperator(jsonCriteria)) { + return parseAdvancedCriteria(jsonCriteria); + } + return parseSingleClause(jsonCriteria); + } + + private boolean hasOrAndOperator(JSONObject jsonCriteria) throws JSONException { + if (!jsonCriteria.has(OPERATOR_KEY)) { + return mainOperatorIsAnd; + } + return OPERATOR_OR.equals(jsonCriteria.get(OPERATOR_KEY)) + || OPERATOR_AND.equals(jsonCriteria.get(OPERATOR_KEY)); + } + + private boolean parseSingleClause(JSONObject jsonCriteria) throws JSONException { + String operator = jsonCriteria.getString(OPERATOR_KEY); + + if (operator.equals(OPERATOR_BETWEEN) || operator.equals(OPERATOR_BETWEENINCLUSIVE) + || operator.equals(OPERATOR_IBETWEEN) || operator.equals(OPERATOR_IBETWEENINCLUSIVE)) { + return parseBetween(jsonCriteria, operator, true); + } + + Object value = jsonCriteria.has(VALUE_KEY) ? jsonCriteria.get(VALUE_KEY) : null; + + if (operator.equals(OPERATOR_EXISTS)) { + // not supported + return mainOperatorIsAnd; + } + + String fieldName = jsonCriteria.getString(FIELD_NAME_KEY); + + // translate to a OR for each value + if (value instanceof JSONArray) { + final JSONArray jsonArray = (JSONArray) value; + final JSONObject advancedCriteria = new JSONObject(); + advancedCriteria.put(OPERATOR_KEY, OPERATOR_OR); + final JSONArray subCriteria = new JSONArray(); + for (int i = 0; i < jsonArray.length(); i++) { + final JSONObject subCriterion = new JSONObject(); + subCriterion.put(OPERATOR_KEY, operator); + subCriterion.put(FIELD_NAME_KEY, fieldName); + subCriterion.put(VALUE_KEY, jsonArray.get(i)); + subCriteria.put(i, subCriterion); + } + advancedCriteria.put(CRITERIA_KEY, subCriteria); + return parseAdvancedCriteria(advancedCriteria); + } + + // Retrieves the UTC time zone offset of the client + if (jsonCriteria.has("minutesTimezoneOffset")) { + int clientMinutesTimezoneOffset = Integer.parseInt(jsonCriteria.get("minutesTimezoneOffset") + .toString()); + Calendar now = Calendar.getInstance(); + // Obtains the UTC time zone offset of the server + int serverMinutesTimezoneOffset = (now.get(Calendar.ZONE_OFFSET) + now + .get(Calendar.DST_OFFSET)) / (1000 * 60); + // Obtains the time zone offset between the server and the client + clientUTCMinutesTimeZoneDiff = clientMinutesTimezoneOffset; + UTCServerMinutesTimeZoneDiff = serverMinutesTimezoneOffset; + } + + if (operator.equals(OPERATOR_ISNULL) || operator.equals(OPERATOR_NOTNULL)) { + value = null; + } + + // if a comparison is done on an equal date then replace + // with a between start time and end time on that date + if (operator.equals(OPERATOR_EQUALS) || operator.equals(OPERATOR_EQUALSFIELD)) { + Object curValue = recordMap.get(fieldName); + if (curValue instanceof Date) { + if (operator.equals(OPERATOR_EQUALS)) { + return parseSimpleClause(fieldName, OPERATOR_GREATEROREQUAL, value) + && parseSimpleClause(fieldName, OPERATOR_LESSOREQUAL, value); + + } else { + return parseSimpleClause(fieldName, OPERATOR_GREATEROREQUALFIELD, value) + && parseSimpleClause(fieldName, OPERATOR_LESSOREQUALFIElD, value); + } + } + } + + return parseSimpleClause(fieldName, operator, value); + } + + private boolean parseBetween(JSONObject jsonCriteria, String operator, boolean inclusive) + throws JSONException { + final String fieldName = jsonCriteria.getString(FIELD_NAME_KEY); + final Object start = jsonCriteria.get("start"); + final Object end = jsonCriteria.get("end"); + final boolean leftClause = parseSimpleClause(fieldName, getBetweenOperator(operator, false), + start); + final boolean rightClause = parseSimpleClause(fieldName, getBetweenOperator(operator, true), + end); + return leftClause && rightClause; + } + + private boolean parseSimpleClause(String fieldName, String operator, Object value) + throws JSONException { + + String hqlOperator = getHqlOperator(operator); + String strField = fieldName; + boolean filterIdentifier = false; + // if (strField.endsWith("$_identifier")) { + // strField = strField.substring(0, strField.length() - 12); + // filterIdentifier = true; + // } + Object mapValue = recordMap.get(strField); + if (operator.equals(OPERATOR_NOTNULL)) { + return mapValue != null; + } else if (operator.equals(OPERATOR_ISNULL)) { + return mapValue == null; + } + + Object localValue = value; + if (ignoreCase(mapValue, operator)) { + localValue = localValue.toString().toUpperCase(); + } + + boolean returnVal = mainOperatorIsAnd; + + if ("id".equals(strField)) { + // ID is always equals + returnVal = mapValue != JSONObject.NULL && ((String) localValue).equals((String) mapValue); + } else if (filterIdentifier) { + BaseOBObject currentVal = (BaseOBObject) mapValue; + String strCurrValIdentifier = currentVal.getIdentifier(); + String strCurrentFilter = (String) localValue; + returnVal = StringUtils.containsIgnoreCase(strCurrValIdentifier, strCurrentFilter); + } else if (mapValue instanceof Boolean) { + returnVal = (Boolean) mapValue == (Boolean) localValue; + } else if (mapValue instanceof BigDecimal) { + BigDecimal filterValue = new BigDecimal((Integer) localValue); + int compare = filterValue.compareTo((BigDecimal) mapValue); ------------------------------------------------------------------------------ Time is money. Stop wasting it! Get your web API in 5 minutes. www.restlet.com/download http://p.sf.net/sfu/restlet _______________________________________________ Openbravo-commits mailing list Openbravo-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbravo-commits