blob: b40b07decd9a084efd7dd91ff56c93efb1a8e377 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.ofbiz.base.util.StringUtil
import org.apache.ofbiz.base.util.UtilDateTime
import org.apache.ofbiz.entity.condition.EntityCondition
import org.apache.ofbiz.entity.condition.EntityConditionList
import org.apache.ofbiz.entity.condition.EntityExpr
import org.apache.ofbiz.entity.condition.EntityFieldValue
import org.apache.ofbiz.entity.condition.EntityFunction
import org.apache.ofbiz.entity.condition.EntityOperator
import org.apache.ofbiz.entity.util.EntityFindOptions
import java.sql.Timestamp
List mainAndConds = []
List orExprs = []
String entityName = context.entityName
String searchFields = context.searchFields
String displayFields = context.displayFields ?: searchFields
boolean searchDistinct = Boolean.valueOf(context.searchDistinct ?: false)
String searchValueFieldName = parameters.term
String fieldValue = null
if (searchValueFieldName) {
fieldValue = searchValueFieldName
} else if (parameters.searchValueFieldName) { // This is to find the description of a lookup value on initialization.
fieldValue = parameters.get(parameters.searchValueFieldName)
context.description = 'true'
}
String searchType = context.searchType
Set<String> displayFieldsSet = null
Map conditionDates = context.conditionDates
String fromDateName = null
String thruDateName = null
Timestamp filterByDateValue = null
//If conditionDates is present on context, resolve values use add condition date to the condition search
if (conditionDates) {
filterByDateValue = conditionDates.filterByDateValue ?: UtilDateTime.nowTimestamp()
fromDateName = conditionDates.fromDateName ?: null
thruDateName = conditionDates.thruDateName ?: null
//if the field filterByDate is present, init default value for fromDate and thruDate
if (!fromDateName && !thruDateName) {
fromDateName = 'fromDate'
thruDateName = 'thruDate'
}
}
if (searchFields && fieldValue) {
List<String> searchFieldsList = StringUtil.toList(searchFields)
displayFieldsSet = StringUtil.toSet(displayFields)
if (context.description && fieldValue instanceof String) {
returnField = parameters.searchValueFieldName
} else {
returnField = searchFieldsList[0] //default to first element of searchFields
displayFieldsSet.add(returnField) //add it to select fields, in case it is missing
}
context.returnField = returnField
context.displayFieldsSet = displayFieldsSet
switch (searchType) {
case 'STARTS_WITH':
searchValue = fieldValue.toUpperCase() + '%'
break
case 'EQUALS':
searchValue = fieldValue
break
default:
searchValue = '%' + fieldValue.toUpperCase() + '%'
break
}
searchFieldsList.each { fieldName ->
if (searchType == 'EQUALS') {
orExprs.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(searchFieldsList[0]), EntityOperator.EQUALS, searchValue))
return //in case of EQUALS, we search only a match for the returned field
}
orExprs.add(EntityCondition.makeCondition(EntityFunction.upper(EntityFieldValue.makeFieldValue(fieldName)),
EntityOperator.LIKE, searchValue))
}
}
/* the following is part of an attempt to handle additional parameters that are passed in from other form fields at run-time,
* but that is not supported by the Jquery Autocompleter, but this is still useful to pass parameters from the
* lookup screen definition:
*/
Map conditionFields = context.conditionFields
if (conditionFields) {
// these fields are for additonal conditions, this is a Map of name/value pairs
for (conditionFieldEntry in conditionFields.entrySet()) {
if (conditionFieldEntry.getValue() instanceof List) {
List orCondFields = []
conditionFieldEntry.getValue().each { entry ->
orCondFields.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(conditionFieldEntry.getKey()),
EntityOperator.EQUALS, entry))
}
mainAndConds.add(EntityCondition.makeCondition(orCondFields, EntityOperator.OR))
} else {
mainAndConds.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(conditionFieldEntry.getKey()),
EntityOperator.EQUALS, conditionFieldEntry.getValue()))
}
}
}
if (orExprs && entityName && displayFieldsSet) {
mainAndConds.add(EntityCondition.makeCondition(orExprs, EntityOperator.OR))
//if there is an extra condition, add it to main condition list
if (context.andCondition && context.andCondition instanceof EntityCondition) {
mainAndConds.add(context.andCondition)
}
if (conditionDates) {
List condsDateList = []
if (thruDateName) {
List condsByThruDate = []
condsByThruDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(thruDateName),
EntityOperator.GREATER_THAN, filterByDateValue))
condsByThruDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(thruDateName), EntityOperator.EQUALS, null))
condsDateList.add(EntityCondition.makeCondition(condsByThruDate, EntityOperator.OR))
}
if (fromDateName) {
List condsByFromDate = []
condsByFromDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(fromDateName),
EntityOperator.LESS_THAN_EQUAL_TO, filterByDateValue))
condsByFromDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(fromDateName), EntityOperator.EQUALS, null))
condsDateList.add(EntityCondition.makeCondition(condsByFromDate, EntityOperator.OR))
}
mainAndConds.add(EntityCondition.makeCondition(condsDateList, EntityOperator.AND))
}
EntityConditionList<EntityExpr> entityConditionList = EntityCondition.makeCondition(mainAndConds, EntityOperator.AND)
String viewSizeStr = context.autocompleterViewSize
Integer autocompleterViewSize = Integer.valueOf(viewSizeStr ?: 10)
EntityFindOptions findOptions = new EntityFindOptions()
findOptions.setMaxRows(autocompleterViewSize)
findOptions.setDistinct(searchDistinct)
autocompleteOptions = delegator.findList(entityName, entityConditionList, displayFieldsSet, StringUtil.toList(displayFields), findOptions, false)
if (autocompleteOptions) {
context.autocompleteOptions = autocompleteOptions
}
}