diff --git a/Services/ServiceTrackerService.cs b/Services/ServiceTrackerService.cs index 543ce45..2681faa 100644 --- a/Services/ServiceTrackerService.cs +++ b/Services/ServiceTrackerService.cs @@ -9,12 +9,8 @@ namespace Disco.Plugins.ServiceTracker.Services { public class ServiceTrackerService { - public const string PluginVersion = "1.5.8"; + public const string PluginVersion = "1.5.9"; - /// - /// Status values that mean a ticket is closed/done. Checked against the saved StatusOverride - /// for NTT tickets so that manually resolved/dismissed sheet jobs don't reappear. - /// private static readonly string[] ClosedStatusKeywords = new[] { "resolved", "dismissed", "complete", "closed", "done", "cancel", "finished" }; private readonly DiscoDataContext _database; @@ -25,12 +21,10 @@ namespace Disco.Plugins.ServiceTracker.Services public DashboardViewModel BuildDashboard(string filterPriority = null, string filterLocation = null, string filterStatus = null, string filterTech = null, string sortBy = "newest") { - // --- Cache check: return cached model if data files haven't changed --- var filterKey = (filterPriority ?? "") + "|" + (filterLocation ?? "") + "|" + (filterStatus ?? "") + "|" + (filterTech ?? ""); var cached = DashboardCache.GetIfValid(_dataStore.DataDirectory, sortBy, filterKey); if (cached != null) return cached; - // --- Full rebuild --- var tiles = new List(); string sheetError = null; var openJobs = _database.Jobs.Include("Device").Include("Device.DeviceModel").Include("User").Include("OpenedTechUser").Include("JobType").Include("JobSubTypes").Where(j => j.ClosedDate == null).ToList(); var allTickets = _dataStore.LoadAllTickets(); var ticketLookup = allTickets.ToDictionary(t => t.JobId, t => t); @@ -50,9 +44,6 @@ namespace Disco.Plugins.ServiceTracker.Services foreach (var e in sr.Tickets) { ServiceTicket st; el.TryGetValue(e.InternalId, out st); - - // Skip if the ticket has been manually closed/resolved/dismissed in the tracker, - // even if the sheet row still appears open. if (st != null && !string.IsNullOrEmpty(st.StatusOverride)) { var ov = st.StatusOverride.ToLower().Trim(); @@ -60,7 +51,6 @@ namespace Disco.Plugins.ServiceTracker.Services foreach (var kw in ClosedStatusKeywords) { if (ov.Contains(kw)) { manuallyClosed = true; break; } } if (manuallyClosed) continue; } - if (st == null) { st = new ServiceTicket { JobId = e.InternalId, Source = "ntt", PriorityId = GoogleSheetService.MapPriority(e.RawPriority), LocationId = _config.DefaultLocationId, AssignedTechId = ResolveSheetTech(e.AssignedTo), Summary = e.IssueDescription, EstimatedCompletion = e.PreferredDate, CreatedDate = e.Timestamp, LastModifiedDate = DateTime.Now }; _dataStore.SaveExternalTicket(st); el[e.InternalId] = st; } tiles.Add(BuildSheetTile(e, st)); sheetCount++; @@ -88,8 +78,6 @@ namespace Disco.Plugins.ServiceTracker.Services } var stats = BuildStats(main); stats.FromGoogleSheet = sheetCount; var result = new DashboardViewModel { Tiles = main, ReadyForReturn = rfr, OnHold = onHold, AwaitingVendor = awaitingVendor, AwaitingParts = awaitingParts, Stats = stats, Config = _config, CurrentFilter = filterPriority ?? filterLocation ?? filterStatus ?? "", SortBy = sortBy, GoogleSheetError = sheetError }; - - // --- Store in cache --- DashboardCache.Store(result, _dataStore.DataDirectory, sortBy, filterKey); return result; } @@ -121,20 +109,16 @@ namespace Disco.Plugins.ServiceTracker.Services var now = DateTime.Now; var pid = st != null ? st.PriorityId : GoogleSheetService.MapPriority(ext.RawPriority); var pri = _config.Priorities.FirstOrDefault(p => p.Id == pid) ?? _config.Priorities.FirstOrDefault(); - var lid = st != null ? st.LocationId : null; string rawSheetLocation = null; if (string.IsNullOrEmpty(lid) && !string.IsNullOrEmpty(ext.Location)) { var matched = MatchSheetLocation(ext.Location); - if (matched != null) - lid = matched.Id; - else - rawSheetLocation = ext.Location; + if (matched != null) lid = matched.Id; + else rawSheetLocation = ext.Location; } if (string.IsNullOrEmpty(lid)) lid = _config.DefaultLocationId; var loc = _config.Locations.FirstOrDefault(l => l.Id == lid) ?? _config.Locations.FirstOrDefault(); - int age = ext.Timestamp > DateTime.MinValue ? (int)(now - ext.Timestamp).TotalDays : 0; var tid = st != null ? st.AssignedTechId : ResolveSheetTech(ext.AssignedTo); string ln = null; int nc = 0;