feat: add change tracking on ticket updates, plugin version constant

This commit is contained in:
2026-05-06 09:29:43 +10:00
parent e6c328827d
commit 1223791096
+47 -12
View File
@@ -9,6 +9,8 @@ namespace Disco.Plugins.ServiceTracker.Services
{
public class ServiceTrackerService
{
public const string PluginVersion = "1.1.0";
private readonly DiscoDataContext _database;
private readonly ServiceTrackerDataStore _dataStore;
private readonly ServiceTrackerConfig _config;
@@ -118,7 +120,7 @@ namespace Disco.Plugins.ServiceTracker.Services
else ageBadge = (ageDays / 30) + " mo" + (ageDays / 30 > 1 ? "s" : "");
var eta = (ticket != null ? ticket.EstimatedCompletion : null) ?? job.ExpectedClosedDate;
string etaDisplay = "";
string etaDisplay = "\u2014";
if (eta.HasValue)
{
var etaDays = (int)(eta.Value - now).TotalDays;
@@ -152,7 +154,7 @@ namespace Disco.Plugins.ServiceTracker.Services
{
JobId = job.Id,
JobTypeDescription = job.JobType != null ? job.JobType.Description : job.JobTypeId,
DeviceSerialNumber = job.DeviceSerialNumber ?? "",
DeviceSerialNumber = job.DeviceSerialNumber ?? "\u2014",
DeviceModelDescription = job.Device != null && job.Device.DeviceModel != null ? job.Device.DeviceModel.Description : null,
DeviceComputerName = job.Device != null ? job.Device.DeviceDomainId : null,
UserId = job.UserId,
@@ -198,15 +200,13 @@ namespace Disco.Plugins.ServiceTracker.Services
AvgAgeDays = tiles.Count > 0 ? Math.Round(tiles.Average(t => (double)t.AgeDays), 1) : 0,
OldestJobDays = tiles.Count > 0 ? tiles.Max(t => t.AgeDays) : 0
};
foreach (var p in _config.Priorities)
stats.ByPriority[p.Id] = tiles.Count(t => t.PriorityId == p.Id);
foreach (var p in _config.Priorities) stats.ByPriority[p.Id] = tiles.Count(t => t.PriorityId == p.Id);
stats.Critical = tiles.Count(t => t.PriorityId == "critical");
stats.High = tiles.Count(t => t.PriorityId == "high");
stats.Medium = tiles.Count(t => t.PriorityId == "medium");
stats.Low = tiles.Count(t => t.PriorityId == "low");
stats.Scheduled = tiles.Count(t => t.PriorityId == "scheduled");
foreach (var l in _config.Locations)
stats.ByLocation[l.Id] = tiles.Count(t => t.LocationId == l.Id);
foreach (var l in _config.Locations) stats.ByLocation[l.Id] = tiles.Count(t => t.LocationId == l.Id);
stats.InItOffice = tiles.Count(t => t.LocationId == "it-office");
stats.WithUser = tiles.Count(t => t.LocationId == "with-user");
stats.AtRepairer = tiles.Count(t => t.LocationId == "at-repairer");
@@ -262,13 +262,48 @@ namespace Disco.Plugins.ServiceTracker.Services
{
var ticket = _dataStore.GetTicket(jobId);
if (ticket == null) ticket = new ServiceTicket { JobId = jobId };
if (priorityId != null) ticket.PriorityId = priorityId;
if (locationId != null) ticket.LocationId = locationId;
if (assignedTechId != null) ticket.AssignedTechId = assignedTechId;
if (eta.HasValue) ticket.EstimatedCompletion = eta;
if (status != null) ticket.StatusOverride = status;
if (summary != null) ticket.Summary = summary;
if (ticket.ChangeLog == null) ticket.ChangeLog = new List<ChangeEntry>();
// Track changes
if (priorityId != null && priorityId != ticket.PriorityId)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "Priority", OldValue = ticket.PriorityId, NewValue = priorityId });
ticket.PriorityId = priorityId;
}
if (locationId != null && locationId != ticket.LocationId)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "Location", OldValue = ticket.LocationId, NewValue = locationId });
ticket.LocationId = locationId;
}
if (assignedTechId != null && assignedTechId != ticket.AssignedTechId)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "Assigned Tech", OldValue = ticket.AssignedTechId, NewValue = assignedTechId });
ticket.AssignedTechId = assignedTechId;
}
if (eta.HasValue)
{
var oldEta = ticket.EstimatedCompletion.HasValue ? ticket.EstimatedCompletion.Value.ToString("dd MMM yyyy") : "none";
var newEta = eta.Value.ToString("dd MMM yyyy");
if (oldEta != newEta)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "ETA", OldValue = oldEta, NewValue = newEta });
ticket.EstimatedCompletion = eta;
}
}
if (status != null && status != ticket.StatusOverride)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "Status", OldValue = ticket.StatusOverride ?? "(Disco default)", NewValue = string.IsNullOrEmpty(status) ? "(Disco default)" : status });
ticket.StatusOverride = status;
}
if (summary != null && summary != ticket.Summary)
{
ticket.ChangeLog.Add(new ChangeEntry { UserId = modifiedBy, Field = "Summary", OldValue = null, NewValue = "(updated)" });
ticket.Summary = summary;
}
ticket.LastModifiedBy = modifiedBy;
// Recalculate SLA if priority changed
if (priorityId != null)
{
var priority = _config.Priorities.FirstOrDefault(p => p.Id == priorityId);