diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs
index 88f580c9..acd5e481 100644
--- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs
+++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs
@@ -1145,6 +1145,33 @@ namespace AyaNova.DataList
}
+ ////////////////////////////////////////////////////////////////////////
+ //
+ ///
+ /// Translate KPI tag filter to PostgreSQL friendly SQL criteria
+ ///
+ public static string KPITagFilterToSqlCriteria(string SqlColumnNameToFilter, List sValue, bool bAny)
+ {
+ if(sValue.Count==0) return string.Empty;
+ //if it's an OR (any) query then need to build individual terms, if it's not then it's just an all or AND query and can pass through as is
+ if (sValue.Count > 0 && bAny == true)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.Append(" AND ");
+ sb.Append("(");
+ foreach (string s in sValue)
+ {
+ sb.Append($"({TagDataFilterToColumnCriteria(SqlColumnNameToFilter, DataListFilterComparisonOperator.Contains, s)}) OR ");
+ }
+ var ret = sb.ToString();
+ return ret.Substring(0, ret.LastIndexOf(" OR ")) + ")";
+ }
+ else
+ {
+ //it's an AND (not any) query so it's just all inclusive but still contains
+ return " AND " + TagDataFilterToColumnCriteria(SqlColumnNameToFilter, DataListFilterComparisonOperator.Contains, string.Join(",", sValue));
+ }
+ }
diff --git a/server/AyaNova/kpi/WorkOrderOverdueAllList.cs b/server/AyaNova/kpi/WorkOrderOverdueAllList.cs
index bce29a48..b8defcfb 100644
--- a/server/AyaNova/kpi/WorkOrderOverdueAllList.cs
+++ b/server/AyaNova/kpi/WorkOrderOverdueAllList.cs
@@ -27,15 +27,17 @@ namespace AyaNova.KPI
{
var wotags = options.Criteria["wotags"].ToObject>();
+ bool wotagsany = options.Criteria["wotagsany"].ToObject();
var woitemtags = options.Criteria["woitemtags"].ToObject>();
+ bool woitemtagsany = options.Criteria["woitemtagsany"].ToObject();
- string woTagsWhere = null;
- if (wotags.Count > 0)
- woTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorder.tags", DataListFilterComparisonOperator.Contains, string.Join(",", wotags));
+ string woTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorder.tags", wotags, wotagsany);
+ // if (wotags.Count > 0)
+ // woTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorder.tags", DataListFilterComparisonOperator.Contains, string.Join(",", wotags));
- string woItemTagsWhere = null;
- if (woitemtags.Count > 0)
- woItemTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorderitem.tags", DataListFilterComparisonOperator.Contains, string.Join(",", woitemtags));
+ string woItemTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorderitem.tags", woitemtags, woitemtagsany); ;
+ // if (woitemtags.Count > 0)
+ // woItemTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorderitem.tags", DataListFilterComparisonOperator.Contains, string.Join(",", woitemtags));
_dataQuery = @$"SELECT row_to_json(t) as res from (
SELECT distinct(AWORKORDER.ID),