Return ticket IDs and resolve external links

This commit is contained in:
Drechsler, Meik
2026-07-20 10:38:34 +02:00
parent a3fa0e0c54
commit 02fabc91cf
11 changed files with 215 additions and 12 deletions

View File

@@ -15,6 +15,8 @@
<TicketConfiguration> <TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" /> <DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" /> <CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<UseSimplifiedCaseCompletionDialog Policy="Hidden" Value="false" />
<SimplifiedCaseCompletionTicketOpenMode Policy="Hidden" Value="Preview" />
<NotesMandatory Policy="Mandatory" Value="true" /> <NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" /> <ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern"> <TicketProcessing Policy="Mandatory" Value="extern">

View File

@@ -44,6 +44,14 @@
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="TicketExternalOpenModeEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="None"/>
<xs:enumeration value="Preview"/>
<xs:enumeration value="Edit"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HorizontalAlignmentEnum"> <xs:simpleType name="HorizontalAlignmentEnum">
<xs:restriction base="xs:NCName"> <xs:restriction base="xs:NCName">
<xs:enumeration value="Default"/> <xs:enumeration value="Default"/>
@@ -150,6 +158,22 @@
</xs:complexContent> </xs:complexContent>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="UseSimplifiedCaseCompletionDialog" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="SimplifiedCaseCompletionTicketOpenMode" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PolicyNode">
<xs:attribute name="Value" type="TicketExternalOpenModeEnum" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="ShowOverview" minOccurs="0" maxOccurs="1"> <xs:element name="ShowOverview" minOccurs="0" maxOccurs="1">
<xs:complexType> <xs:complexType>
<xs:complexContent> <xs:complexContent>

View File

@@ -606,6 +606,20 @@ namespace C4IT.DataHistoryProvider
return GlobalConfig; return GlobalConfig;
} }
public Task<cTicketExternalLinkResult> GetTicketExternalLinkAsync(Guid ticketId, enumTicketExternalOpenMode mode, cF4sdWebRequestInfo requestInfo, int logDeep, CancellationToken token)
{
if (M42WpmCollector == null)
{
return Task.FromResult(new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
});
}
return M42WpmCollector.GetTicketExternalLinkAsync(ticketId, mode, requestInfo, logDeep, token);
}
private void RegisterSearchRelationProviders(IEnumerable<ISearchResultRelationProvider> providers) private void RegisterSearchRelationProviders(IEnumerable<ISearchResultRelationProvider> providers)
{ {
_searchResultRelationProviders.AddRange(providers); _searchResultRelationProviders.AddRange(providers);

View File

@@ -1574,6 +1574,49 @@ namespace C4IT.DataHistoryProvider
return null; return null;
} }
public async Task<cTicketExternalLinkResult> GetTicketExternalLinkAsync(Guid ticketId, enumTicketExternalOpenMode mode, cF4sdWebRequestInfo requestInfo, int logDeep, CancellationToken token)
{
var result = new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
};
if (ticketId == Guid.Empty || mode == enumTicketExternalOpenMode.None)
return result;
var ticketDetails = await GetTicketMainTableAsync(ticketId, requestInfo, logDeep + 1, token);
var ticketTable = ticketDetails?.FirstOrDefault();
if (ticketTable?.Columns == null)
return result;
string previewUrl = null;
if (ticketTable.Columns.TryGetValue("DirectLinkPreview", out var previewColumn))
previewUrl = previewColumn.Values?.FirstOrDefault()?.ToString();
var resolvedMode = mode;
var url = previewUrl;
if (mode == enumTicketExternalOpenMode.Edit)
{
string editUrl = null;
if (ticketTable.Columns.TryGetValue("DirectLinkEdit", out var editColumn))
editUrl = editColumn.Values?.FirstOrDefault()?.ToString();
if (!string.IsNullOrWhiteSpace(editUrl))
url = editUrl;
else
resolvedMode = enumTicketExternalOpenMode.Preview;
}
if (string.IsNullOrWhiteSpace(url))
return result;
result.Success = true;
result.Url = url;
result.Mode = resolvedMode;
return result;
}
private object ConvertToF4sdType(object objVal, enumFasdValueType ValueType) private object ConvertToF4sdType(object objVal, enumFasdValueType ValueType)
{ {
try try

View File

@@ -472,6 +472,16 @@ namespace C4IT.DataHistoryProvider
, "NotesMandatory" , "NotesMandatory"
, "<NotesMandatory Policy=\"Hidden\" Value=\"false\" />" , "<NotesMandatory Policy=\"Hidden\" Value=\"false\" />"
); );
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "UseSimplifiedCaseCompletionDialog"
, "<UseSimplifiedCaseCompletionDialog Policy=\"Hidden\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "SimplifiedCaseCompletionTicketOpenMode"
, $"<SimplifiedCaseCompletionTicketOpenMode Policy=\"Hidden\" Value=\"{enumTicketExternalOpenMode.Preview}\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration" , "TicketConfiguration"
, "ShowOverview" , "ShowOverview"

View File

@@ -15,6 +15,8 @@
<TicketConfiguration> <TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" /> <DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" /> <CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<UseSimplifiedCaseCompletionDialog Policy="Hidden" Value="false" />
<SimplifiedCaseCompletionTicketOpenMode Policy="Hidden" Value="Preview" />
<NotesMandatory Policy="Mandatory" Value="true" /> <NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" /> <ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern"> <TicketProcessing Policy="Mandatory" Value="extern">

View File

@@ -18,32 +18,55 @@ namespace F4SDwebService.Controllers.Matrix42
public async Task<IHttpActionResult> Matrix42TicketFinalization([FromBody] cApiM42Ticket jsonRequest) public async Task<IHttpActionResult> Matrix42TicketFinalization([FromBody] cApiM42Ticket jsonRequest)
{ {
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); } MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var requestInfo = new cF4sdWebRequestInfo("Matrix42TicketFinalization", jsonRequest.Action?.ToString() + " + " + jsonRequest.Ticket?.ToString() ?? "", cAuthentication.GetUserInfo(ActionContext)); var requestInfo = new cF4sdWebRequestInfo("Matrix42TicketFinalization", jsonRequest?.Action?.ToString() + " + " + jsonRequest?.Ticket?.ToString() ?? "", cAuthentication.GetUserInfo(ActionContext));
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); } if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); }
var apiError = 0; var apiError = 0;
try try
{ {
if (jsonRequest == null)
return BadRequest();
if (string.Equals(jsonRequest.StatusIdValue, "Closed", StringComparison.InvariantCultureIgnoreCase)) if (string.Equals(jsonRequest.StatusIdValue, "Closed", StringComparison.InvariantCultureIgnoreCase))
await WebApiApplication.Collector.M42WpmCollector.ReopenM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None); await WebApiApplication.Collector.M42WpmCollector.ReopenM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
string operationResult = null;
switch (jsonRequest.Action) switch (jsonRequest.Action)
{ {
case enumCloseCaseTicketStatus.Save: case enumCloseCaseTicketStatus.Save:
if (jsonRequest.Ticket == null || jsonRequest.Ticket.HasValue && jsonRequest.Ticket.Equals(Guid.Empty)) if (jsonRequest.Ticket == null || jsonRequest.Ticket.HasValue && jsonRequest.Ticket.Equals(Guid.Empty))
return Ok(await WebApiApplication.Collector.M42WpmCollector.CreateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None)); operationResult = await WebApiApplication.Collector.M42WpmCollector.CreateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
else else
return Ok(await WebApiApplication.Collector.M42WpmCollector.UpdateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None)); operationResult = await WebApiApplication.Collector.M42WpmCollector.UpdateM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.Close: case enumCloseCaseTicketStatus.Close:
return Ok(await WebApiApplication.Collector.M42WpmCollector.CloseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None)); operationResult = await WebApiApplication.Collector.M42WpmCollector.CloseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.OnHold: case enumCloseCaseTicketStatus.OnHold:
return Ok(await WebApiApplication.Collector.M42WpmCollector.PauseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None)); operationResult = await WebApiApplication.Collector.M42WpmCollector.PauseM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
case enumCloseCaseTicketStatus.Forward: case enumCloseCaseTicketStatus.Forward:
return Ok(await WebApiApplication.Collector.M42WpmCollector.ForwardM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None)); operationResult = await WebApiApplication.Collector.M42WpmCollector.ForwardM42TicketAsync(jsonRequest, requestInfo, 1, CancellationToken.None);
break;
default: break; default:
return BadRequest();
} }
return Ok(jsonRequest);
if (operationResult == null)
return InternalServerError();
var ticketId = jsonRequest.Ticket;
if ((!ticketId.HasValue || ticketId.Value == Guid.Empty) && Guid.TryParse(operationResult, out var createdTicketId))
ticketId = createdTicketId;
if (!ticketId.HasValue || ticketId.Value == Guid.Empty)
return InternalServerError();
return Ok(new cTicketFinalizationResult
{
Success = true,
TicketId = ticketId
});
} }
catch (Exception E) catch (Exception E)
{ {

View File

@@ -0,0 +1,58 @@
using C4IT.DataHistoryProvider;
using C4IT.FASD.Base;
using C4IT.Logging;
using F4SDwebService;
using System;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using static C4IT.Logging.cLogManager;
namespace FasdWebService.Controllers
{
[RoutePrefix("api/Ticketing")]
public class TicketingController : ApiController
{
[HttpGet]
[Route("GetExternalLink")]
public async Task<IHttpActionResult> GetExternalLink(Guid ticketId, enumTicketExternalOpenMode mode)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var requestInfo = new cF4sdWebRequestInfo("Ticketing.GetExternalLink", ticketId.ToString(), cAuthentication.GetUserInfo(ActionContext));
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); }
var apiError = 0;
try
{
if (ticketId == Guid.Empty || mode == enumTicketExternalOpenMode.None)
return BadRequest();
var result = await WebApiApplication.Collector.GetTicketExternalLinkAsync(ticketId, mode, requestInfo, 1, CancellationToken.None);
return Ok(result ?? new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
});
}
catch (Exception E)
{
apiError = E.HResult;
LogException(E);
}
finally
{
if (WebApiApplication.Debug_apiTiming) WebApiApplication.SaveApiTimingEntry(requestInfo.requestName, requestInfo.id, requestInfo.created, apiError);
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceEnd(0, requestInfo.requestName, requestInfo.id, requestInfo.created, requestInfo.created, ErrorCode: apiError); }
if (CM != null) LogMethodEnd(CM);
}
return Ok(new cTicketExternalLinkResult
{
Success = false,
Mode = enumTicketExternalOpenMode.None
});
}
}
}

View File

@@ -324,6 +324,7 @@
<Compile Include="Controllers\RemoteDesktopController.cs" /> <Compile Include="Controllers\RemoteDesktopController.cs" />
<Compile Include="Controllers\SearchDefault.cs" /> <Compile Include="Controllers\SearchDefault.cs" />
<Compile Include="Controllers\F4SDAnalyticsDataController.cs" /> <Compile Include="Controllers\F4SDAnalyticsDataController.cs" />
<Compile Include="Controllers\TicketingController.cs" />
<Compile Include="Controllers\TicketOverviewController.cs" /> <Compile Include="Controllers\TicketOverviewController.cs" />
<Compile Include="Controllers\StagedSearchRelationController.cs" /> <Compile Include="Controllers\StagedSearchRelationController.cs" />
<Compile Include="Controllers\UsageController.cs" /> <Compile Include="Controllers\UsageController.cs" />

View File

@@ -15,6 +15,8 @@
<TicketConfiguration> <TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" /> <DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" /> <CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<UseSimplifiedCaseCompletionDialog Policy="Hidden" Value="false" />
<SimplifiedCaseCompletionTicketOpenMode Policy="Hidden" Value="Preview" />
<NotesMandatory Policy="Mandatory" Value="true" /> <NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" /> <ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern"> <TicketProcessing Policy="Mandatory" Value="extern">

View File

@@ -44,6 +44,14 @@
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="TicketExternalOpenModeEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="None"/>
<xs:enumeration value="Preview"/>
<xs:enumeration value="Edit"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HorizontalAlignmentEnum"> <xs:simpleType name="HorizontalAlignmentEnum">
<xs:restriction base="xs:NCName"> <xs:restriction base="xs:NCName">
<xs:enumeration value="Default"/> <xs:enumeration value="Default"/>
@@ -150,6 +158,22 @@
</xs:complexContent> </xs:complexContent>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="UseSimplifiedCaseCompletionDialog" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="SimplifiedCaseCompletionTicketOpenMode" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PolicyNode">
<xs:attribute name="Value" type="TicketExternalOpenModeEnum" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="ShowOverview" minOccurs="0" maxOccurs="1"> <xs:element name="ShowOverview" minOccurs="0" maxOccurs="1">
<xs:complexType> <xs:complexType>
<xs:complexContent> <xs:complexContent>