Rename activity filter configuration to ticket filters

This commit is contained in:
Drechsler, Meik
2026-07-23 12:46:46 +02:00
parent 275d884bfe
commit 52e74deb57
9 changed files with 64 additions and 60 deletions

View File

@@ -24,7 +24,7 @@
<TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" /> <TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" />
<TicketTypeProcessing Type="Incident" Value="intern" /> <TicketTypeProcessing Type="Incident" Value="intern" />
</TicketProcessing> </TicketProcessing>
<ActivityFilters> <TicketFilters>
<Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include"> <Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include">
<Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" /> <Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" />
<Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" /> <Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" />
@@ -39,7 +39,7 @@
<Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" /> <Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" />
<Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" /> <Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" />
</Filter> </Filter>
</ActivityFilters> </TicketFilters>
<OverviewPollingPersonal Policy="Mandatory" Value="10" /> <OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" /> <OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration> </TicketConfiguration>

View File

@@ -132,14 +132,14 @@
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:simpleType name="ActivityFilterMatchEnum"> <xs:simpleType name="TicketFilterMatchEnum">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:enumeration value="include"/> <xs:enumeration value="include"/>
<xs:enumeration value="exclude"/> <xs:enumeration value="exclude"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="ActivityFilterEmptyHandlingEnum"> <xs:simpleType name="TicketFilterEmptyHandlingEnum">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:enumeration value="include"/> <xs:enumeration value="include"/>
<xs:enumeration value="exclude"/> <xs:enumeration value="exclude"/>
@@ -197,7 +197,7 @@
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="ActivityFilters" minOccurs="0" maxOccurs="1"> <xs:element name="TicketFilters" minOccurs="0" maxOccurs="1">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<xs:element name="Filter" minOccurs="0" maxOccurs="unbounded"> <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
@@ -213,8 +213,8 @@
<xs:attribute name="Provider" type="xs:string" use="optional"/> <xs:attribute name="Provider" type="xs:string" use="optional"/>
<xs:attribute name="Field" type="xs:string" use="required"/> <xs:attribute name="Field" type="xs:string" use="required"/>
<xs:attribute name="Enabled" type="xs:boolean" use="optional" default="false"/> <xs:attribute name="Enabled" type="xs:boolean" use="optional" default="false"/>
<xs:attribute name="Match" type="ActivityFilterMatchEnum" use="optional" default="exclude"/> <xs:attribute name="Match" type="TicketFilterMatchEnum" use="optional" default="exclude"/>
<xs:attribute name="EmptyHandling" type="ActivityFilterEmptyHandlingEnum" use="optional" default="include"/> <xs:attribute name="EmptyHandling" type="TicketFilterEmptyHandlingEnum" use="optional" default="include"/>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:sequence> </xs:sequence>

View File

@@ -413,8 +413,8 @@ namespace C4IT.DataHistoryProvider
GlobalConfig = new cF4sdGlobalConfig(regPath: null); GlobalConfig = new cF4sdGlobalConfig(regPath: null);
if (GlobalParametersConfigFile.Parameters != null) if (GlobalParametersConfigFile.Parameters != null)
GlobalConfig.Load(CentralParameters: GlobalParametersConfigFile.Parameters); GlobalConfig.Load(CentralParameters: GlobalParametersConfigFile.Parameters);
GlobalConfig.TicketConfiguration.ActivityFilters = GlobalConfig.TicketConfiguration.TicketFilters =
GlobalParametersConfigFile.ActivityFilters ?? new cActivityFilterPolicy(); GlobalParametersConfigFile.TicketFilters ?? new cTicketFilterPolicy();
} }
return true; return true;
@@ -508,7 +508,7 @@ namespace C4IT.DataHistoryProvider
// load the global parameters // load the global parameters
if (!RefreshGlobalConfigurationParameters()) if (!RefreshGlobalConfigurationParameters())
return false; return false;
InfrastructureConfig.RemoveLegacyActivityFilterConfiguration(); InfrastructureConfig.RemoveLegacyTicketFilterConfiguration();
mainDbConnection = InfrastructureConfig.HistoryDB.Connection; mainDbConnection = InfrastructureConfig.HistoryDB.Connection;

View File

@@ -694,18 +694,18 @@ namespace C4IT.DataHistoryProvider
var objSid = new SecurityIdentifier(UserId.sid, 0); var objSid = new SecurityIdentifier(UserId.sid, 0);
var strSid = objSid.ToString(); var strSid = objSid.ToString();
var _wc = await GetWebClient(requestInfo, Token); var _wc = await GetWebClient(requestInfo, Token);
var request = new cTicketActivityListRequest var request = new cTicketListFilterRequest
{ {
Sid = strSid, Sid = strSid,
Hours = Collector.InfrastructureConfig.M42Wpm.ClosedTicketHistory, Hours = Collector.InfrastructureConfig.M42Wpm.ClosedTicketHistory,
Filters = GetActivityFilters() Filters = GetTicketFilters()
}; };
var res = await PostJsonAsync(_wc, constUrlGetTicketsV2, request, Token); var res = await PostJsonAsync(_wc, constUrlGetTicketsV2, request, Token);
if (res?.StatusCode == HttpStatusCode.NotFound) if (res?.StatusCode == HttpStatusCode.NotFound)
{ {
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues)) if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{ {
LogEntry("The activity filter policy requires the v2 ticket API; legacy fallback was rejected (fail closed).", LogLevels.Warning); LogEntry("The ticket filter policy requires the v2 ticket API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return null; return null;
} }
var strUrl = string.Format( var strUrl = string.Format(
@@ -1111,17 +1111,17 @@ namespace C4IT.DataHistoryProvider
return (int)Collector.InfrastructureConfig.M42Wpm.ActivityQueueFilterOption; return (int)Collector.InfrastructureConfig.M42Wpm.ActivityQueueFilterOption;
} }
private cActivityFilterPolicy GetActivityFilters() private cTicketFilterPolicy GetTicketFilters()
{ {
return Collector?.GetGlobalConfig()?.TicketConfiguration?.ActivityFilters return Collector?.GetGlobalConfig()?.TicketConfiguration?.TicketFilters
?? new cActivityFilterPolicy(); ?? new cTicketFilterPolicy();
} }
private bool TryGetLegacyQueueFilter(out int queueOption, out string encodedQueues) private bool TryGetLegacyQueueFilter(out int queueOption, out string encodedQueues)
{ {
queueOption = 0; queueOption = 0;
encodedQueues = null; encodedQueues = null;
var activeFilters = (GetActivityFilters()?.Filters ?? new List<cActivityFilter>()) var activeFilters = (GetTicketFilters()?.Filters ?? new List<cTicketFilter>())
.Where(entry => entry?.Enabled == true) .Where(entry => entry?.Enabled == true)
.ToList(); .ToList();
if (activeFilters.Count == 0) if (activeFilters.Count == 0)
@@ -1129,17 +1129,17 @@ namespace C4IT.DataHistoryProvider
if (activeFilters.Count != 1) if (activeFilters.Count != 1)
return false; return false;
var activityFilter = activeFilters[0]; var ticketFilter = activeFilters[0];
if (!string.Equals(activityFilter.Provider, "Matrix42", StringComparison.OrdinalIgnoreCase) if (!string.Equals(ticketFilter.Provider, "Matrix42", StringComparison.OrdinalIgnoreCase)
|| !string.Equals(activityFilter.Field, "Queue", StringComparison.OrdinalIgnoreCase) || !string.Equals(ticketFilter.Field, "Queue", StringComparison.OrdinalIgnoreCase)
|| activityFilter.Match != enumActivityFilterMatch.include || ticketFilter.Match != enumTicketFilterMatch.include
|| activityFilter.EmptyHandling == enumActivityFilterEmptyHandling.only) || ticketFilter.EmptyHandling == enumTicketFilterEmptyHandling.only)
{ {
return false; return false;
} }
queueOption = activityFilter.EmptyHandling == enumActivityFilterEmptyHandling.include ? 1 : 2; queueOption = ticketFilter.EmptyHandling == enumTicketFilterEmptyHandling.include ? 1 : 2;
var values = (activityFilter.Values ?? new List<cActivityFilterValue>()) var values = (ticketFilter.Values ?? new List<cTicketFilterValue>())
.Where(value => value != null) .Where(value => value != null)
.Select(value => .Select(value =>
{ {
@@ -1227,14 +1227,14 @@ namespace C4IT.DataHistoryProvider
Sid = sid, Sid = sid,
Scope = scope, Scope = scope,
Keys = requestedKeys?.ToList() ?? new List<string>(), Keys = requestedKeys?.ToList() ?? new List<string>(),
Filters = GetActivityFilters() Filters = GetTicketFilters()
}; };
var res = await PostJsonAsync(wc, constUrlGetTicketOverviewCountsV2, request, token); var res = await PostJsonAsync(wc, constUrlGetTicketOverviewCountsV2, request, token);
if (res?.StatusCode == HttpStatusCode.NotFound) if (res?.StatusCode == HttpStatusCode.NotFound)
{ {
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues)) if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{ {
LogEntry("The activity filter policy requires the v2 overview API; legacy fallback was rejected (fail closed).", LogLevels.Warning); LogEntry("The ticket filter policy requires the v2 overview API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); return new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
} }
var urlBuilder = new StringBuilder(constUrlGetTicketOverviewCounts); var urlBuilder = new StringBuilder(constUrlGetTicketOverviewCounts);
@@ -1358,14 +1358,14 @@ namespace C4IT.DataHistoryProvider
Scope = scope, Scope = scope,
Key = key, Key = key,
Count = Math.Max(0, count), Count = Math.Max(0, count),
Filters = GetActivityFilters() Filters = GetTicketFilters()
}; };
var res = await PostJsonAsync(wc, constUrlGetTicketOverviewRelationsV2, request, Token); var res = await PostJsonAsync(wc, constUrlGetTicketOverviewRelationsV2, request, Token);
if (res?.StatusCode == HttpStatusCode.NotFound) if (res?.StatusCode == HttpStatusCode.NotFound)
{ {
if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues)) if (!TryGetLegacyQueueFilter(out var queueOption, out var encodedQueues))
{ {
LogEntry("The activity filter policy requires the v2 relation API; legacy fallback was rejected (fail closed).", LogLevels.Warning); LogEntry("The ticket filter policy requires the v2 relation API; legacy fallback was rejected (fail closed).", LogLevels.Warning);
return new List<cF4sdApiSearchResultRelation>(); return new List<cF4sdApiSearchResultRelation>();
} }
var urlBuilder = new StringBuilder(constUrlGetTicketOverviewRelations); var urlBuilder = new StringBuilder(constUrlGetTicketOverviewRelations);

View File

@@ -25,7 +25,7 @@ namespace C4IT.DataHistoryProvider
private const string constConfigRootElement = "F4SD-Global-Configuration"; private const string constConfigRootElement = "F4SD-Global-Configuration";
public cConfigHelperParameterList Parameters { get; private set; } = null; public cConfigHelperParameterList Parameters { get; private set; } = null;
public cActivityFilterPolicy ActivityFilters { get; private set; } = new cActivityFilterPolicy(); public cTicketFilterPolicy TicketFilters { get; private set; } = new cTicketFilterPolicy();
private cDataHistoryConfigInfrastructure InfrastructureConfig = null; private cDataHistoryConfigInfrastructure InfrastructureConfig = null;
@@ -111,8 +111,8 @@ namespace C4IT.DataHistoryProvider
if (_ticketProcessingEntry != null) if (_ticketProcessingEntry != null)
_result.Items[_ticketProcessingEntry.Name] = _ticketProcessingEntry; _result.Items[_ticketProcessingEntry.Name] = _ticketProcessingEntry;
continue; continue;
case "ActivityFilters": case "TicketFilters":
ActivityFilters = getActivityFilters(_item, Parser); TicketFilters = getTicketFilters(_item, Parser);
continue; continue;
} }
@@ -166,20 +166,20 @@ namespace C4IT.DataHistoryProvider
return _result; return _result;
} }
private static cActivityFilterPolicy getActivityFilters(XmlElement node, cXmlParser parser) private static cTicketFilterPolicy getTicketFilters(XmlElement node, cXmlParser parser)
{ {
var result = new cActivityFilterPolicy(); var result = new cTicketFilterPolicy();
foreach (XmlElement filterNode in node.SelectNodes("Filter").OfType<XmlElement>()) foreach (XmlElement filterNode in node.SelectNodes("Filter").OfType<XmlElement>())
{ {
parser.EnterElement(filterNode.Name); parser.EnterElement(filterNode.Name);
try try
{ {
if (!Enum.TryParse(filterNode.GetAttribute("Match"), true, out enumActivityFilterMatch match)) if (!Enum.TryParse(filterNode.GetAttribute("Match"), true, out enumTicketFilterMatch match))
match = enumActivityFilterMatch.exclude; match = enumTicketFilterMatch.exclude;
if (!Enum.TryParse(filterNode.GetAttribute("EmptyHandling"), true, out enumActivityFilterEmptyHandling emptyHandling)) if (!Enum.TryParse(filterNode.GetAttribute("EmptyHandling"), true, out enumTicketFilterEmptyHandling emptyHandling))
emptyHandling = enumActivityFilterEmptyHandling.include; emptyHandling = enumTicketFilterEmptyHandling.include;
var filter = new cActivityFilter var filter = new cTicketFilter
{ {
Provider = filterNode.GetAttribute("Provider"), Provider = filterNode.GetAttribute("Provider"),
Field = filterNode.GetAttribute("Field"), Field = filterNode.GetAttribute("Field"),
@@ -190,7 +190,7 @@ namespace C4IT.DataHistoryProvider
foreach (XmlElement valueNode in filterNode.SelectNodes("Value").OfType<XmlElement>()) foreach (XmlElement valueNode in filterNode.SelectNodes("Value").OfType<XmlElement>())
{ {
filter.Values.Add(new cActivityFilterValue filter.Values.Add(new cTicketFilterValue
{ {
ID = valueNode.GetAttribute("ID"), ID = valueNode.GetAttribute("ID"),
Name = valueNode.GetAttribute("Name") Name = valueNode.GetAttribute("Name")
@@ -208,7 +208,7 @@ namespace C4IT.DataHistoryProvider
return result; return result;
} }
private string getDefaultActivityFiltersXml() private string getDefaultTicketFiltersXml()
{ {
var queueOption = InfrastructureConfig?.M42Wpm?.ActivityQueueFilterOption var queueOption = InfrastructureConfig?.M42Wpm?.ActivityQueueFilterOption
?? enumActivityQueueFilterOptions.showAll; ?? enumActivityQueueFilterOptions.showAll;
@@ -216,11 +216,11 @@ namespace C4IT.DataHistoryProvider
?? new List<cApiM42TicketQueueInfo>(); ?? new List<cApiM42TicketQueueInfo>();
var enableQueueFilter = queueOption != enumActivityQueueFilterOptions.showAll && queues.Count > 0; var enableQueueFilter = queueOption != enumActivityQueueFilterOptions.showAll && queues.Count > 0;
var emptyHandling = queueOption == enumActivityQueueFilterOptions.onlyListedQueues var emptyHandling = queueOption == enumActivityQueueFilterOptions.onlyListedQueues
? enumActivityFilterEmptyHandling.exclude ? enumTicketFilterEmptyHandling.exclude
: enumActivityFilterEmptyHandling.include; : enumTicketFilterEmptyHandling.include;
var xml = new StringBuilder(); var xml = new StringBuilder();
xml.Append("<ActivityFilters>"); xml.Append("<TicketFilters>");
xml.AppendFormat( xml.AppendFormat(
"<Filter Provider=\"Matrix42\" Field=\"Queue\" Enabled=\"{0}\" Match=\"include\" EmptyHandling=\"{1}\">", "<Filter Provider=\"Matrix42\" Field=\"Queue\" Enabled=\"{0}\" Match=\"include\" EmptyHandling=\"{1}\">",
enableQueueFilter.ToString().ToLowerInvariant(), enableQueueFilter.ToString().ToLowerInvariant(),
@@ -243,7 +243,7 @@ namespace C4IT.DataHistoryProvider
xml.Append("<Value ID=\"1676de08-27f3-550c-b410-5610e807aa02\" Name=\"HR Service Management\" />"); xml.Append("<Value ID=\"1676de08-27f3-550c-b410-5610e807aa02\" Name=\"HR Service Management\" />");
xml.Append("<Value ID=\"ed7dde08-199e-c27b-b410-562b64037aa1\" Name=\"Gebäudemanagement\" />"); xml.Append("<Value ID=\"ed7dde08-199e-c27b-b410-562b64037aa1\" Name=\"Gebäudemanagement\" />");
xml.Append("</Filter>"); xml.Append("</Filter>");
xml.Append("</ActivityFilters>"); xml.Append("</TicketFilters>");
return xml.ToString(); return xml.ToString();
} }
@@ -582,12 +582,16 @@ namespace C4IT.DataHistoryProvider
); );
RetVal |= DoXmlInsertElement(XmlRoot RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration" , "TicketConfiguration"
, "ActivityFilters" , "TicketFilters"
, getDefaultActivityFiltersXml() , getDefaultTicketFiltersXml()
); );
RetVal |= DoXmlRemoveElement(XmlRoot RetVal |= DoXmlRemoveElement(XmlRoot
, "TicketConfiguration" , "TicketConfiguration"
, "OpenActivitiesExternally" , "ActivityFilters"
);
RetVal |= DoXmlRemoveElement(XmlRoot
, "TicketConfiguration"
, "OpenActivitiesExternally"
); );
RetVal |= DoXmlInsertElement(XmlRoot RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration" , "TicketConfiguration"

View File

@@ -121,9 +121,9 @@ namespace C4IT.DataHistoryProvider
return false; return false;
} }
internal bool RemoveLegacyActivityFilterConfiguration() internal bool RemoveLegacyTicketFilterConfiguration()
{ {
// Queue filtering moved to the provider-neutral global ActivityFilters policy. // Queue filtering moved to the provider-neutral global TicketFilters policy.
// This intentionally runs only after the global configuration was loaded: // This intentionally runs only after the global configuration was loaded:
// DoXmlUpdates runs before InstantiateProperties and would otherwise erase // DoXmlUpdates runs before InstantiateProperties and would otherwise erase
// the values before the one-time migration can read them. // the values before the one-time migration can read them.

View File

@@ -24,7 +24,7 @@
<TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" /> <TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" />
<TicketTypeProcessing Type="Incident" Value="intern" /> <TicketTypeProcessing Type="Incident" Value="intern" />
</TicketProcessing> </TicketProcessing>
<ActivityFilters> <TicketFilters>
<Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include"> <Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include">
<Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" /> <Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" />
<Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" /> <Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" />
@@ -39,7 +39,7 @@
<Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" /> <Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" />
<Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" /> <Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" />
</Filter> </Filter>
</ActivityFilters> </TicketFilters>
<OverviewPollingPersonal Policy="Mandatory" Value="10" /> <OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" /> <OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration> </TicketConfiguration>

View File

@@ -24,7 +24,7 @@
<TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" /> <TicketTypeProcessing Type="UnclassifiedTicket" Value="intern" />
<TicketTypeProcessing Type="Incident" Value="intern" /> <TicketTypeProcessing Type="Incident" Value="intern" />
</TicketProcessing> </TicketProcessing>
<ActivityFilters> <TicketFilters>
<Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include"> <Filter Provider="Matrix42" Field="Queue" Enabled="false" Match="include" EmptyHandling="include">
<Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" /> <Value ID="2a7e8099-3d57-f011-1988-00155d320605" Name="HR" />
<Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" /> <Value ID="2a7a8099-3d47-f011-1988-00155d320505" Name="FM" />
@@ -39,7 +39,7 @@
<Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" /> <Value ID="1676de08-27f3-550c-b410-5610e807aa02" Name="HR Service Management" />
<Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" /> <Value ID="ed7dde08-199e-c27b-b410-562b64037aa1" Name="Gebäudemanagement" />
</Filter> </Filter>
</ActivityFilters> </TicketFilters>
<OverviewPollingPersonal Policy="Mandatory" Value="10" /> <OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" /> <OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration> </TicketConfiguration>

View File

@@ -132,14 +132,14 @@
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:simpleType name="ActivityFilterMatchEnum"> <xs:simpleType name="TicketFilterMatchEnum">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:enumeration value="include"/> <xs:enumeration value="include"/>
<xs:enumeration value="exclude"/> <xs:enumeration value="exclude"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="ActivityFilterEmptyHandlingEnum"> <xs:simpleType name="TicketFilterEmptyHandlingEnum">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:enumeration value="include"/> <xs:enumeration value="include"/>
<xs:enumeration value="exclude"/> <xs:enumeration value="exclude"/>
@@ -197,7 +197,7 @@
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="ActivityFilters" minOccurs="0" maxOccurs="1"> <xs:element name="TicketFilters" minOccurs="0" maxOccurs="1">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<xs:element name="Filter" minOccurs="0" maxOccurs="unbounded"> <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
@@ -213,8 +213,8 @@
<xs:attribute name="Provider" type="xs:string" use="optional"/> <xs:attribute name="Provider" type="xs:string" use="optional"/>
<xs:attribute name="Field" type="xs:string" use="required"/> <xs:attribute name="Field" type="xs:string" use="required"/>
<xs:attribute name="Enabled" type="xs:boolean" use="optional" default="false"/> <xs:attribute name="Enabled" type="xs:boolean" use="optional" default="false"/>
<xs:attribute name="Match" type="ActivityFilterMatchEnum" use="optional" default="exclude"/> <xs:attribute name="Match" type="TicketFilterMatchEnum" use="optional" default="exclude"/>
<xs:attribute name="EmptyHandling" type="ActivityFilterEmptyHandlingEnum" use="optional" default="include"/> <xs:attribute name="EmptyHandling" type="TicketFilterEmptyHandlingEnum" use="optional" default="include"/>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:sequence> </xs:sequence>