public static List <TerritoryLastCompleted> LastCompletedFrom(IList <AssignmentRowRaw> rows) { var parsedRows = new List <TerritoryLastCompleted>(); foreach (var row in rows) { DateTime?checkedIn = null; if (DateTime.TryParse(row.CheckedIn, out DateTime checkedInDate)) { checkedIn = checkedInDate; } DateTime?checkedOut = null; if (DateTime.TryParse(row.CheckedOut, out DateTime checkedOutDate)) { checkedOut = checkedOutDate; } var parsed = new TerritoryLastCompleted { Territory = row.Territory, Publisher = row.Publisher, CheckedOut = checkedOut, CheckedIn = checkedIn, }; parsedRows.Add(parsed); } var territories = parsedRows.GroupBy(r => r.Territory).ToList(); var assignments = new List <TerritoryLastCompleted>(); foreach (var territory in territories) { var lastCheckedIn = territory.OrderBy(e => e.CheckedIn).Last(); var assignment = new TerritoryLastCompleted() { Territory = lastCheckedIn.Territory, TimesWorked = territory.Count(), Publisher = lastCheckedIn.Publisher, CheckedOut = lastCheckedIn.CheckedOut, CheckedIn = lastCheckedIn.CheckedIn, }; assignments.Add(assignment); } return(assignments); }
static void LastCompleted(List <string> args) { Console.WriteLine("Generating 'last completed' from S-13 form..."); if (args.Count != 4) { throw new NormalException("Wrong number of arguments! Usage: alba last-completed <s-13-csv-input-file> <alba-assignments-csv-input-file> <s-13-csv-output-file>"); } string inputPath = args[1]; string albaTerritoryAssignmentsPath = args[2]; string outputPath = args[3]; Console.WriteLine($"Input File Path: {inputPath}"); Console.WriteLine($"Alba Assignment File Path: {albaTerritoryAssignmentsPath}"); Console.WriteLine($"Output File Path: {outputPath}"); Console.WriteLine("Loading..."); var rows = PivotAssignmentRowsToS13Columns.LoadFrom(inputPath); Console.WriteLine("Removing entries with Checked-In blank..."); var cleaned = rows .Where(r => !string.IsNullOrWhiteSpace(r.CheckedIn)) .ToList(); var parsed = PivotAssignmentRowsToS13Columns.LastCompletedFrom(cleaned); Console.WriteLine("Adding unworked territories..."); var albaAssignments = DownloadTerritoryAssignments.LoadFromCsv(albaTerritoryAssignmentsPath); var errors = new List <string>(); foreach (var assignment in albaAssignments) { try { int number = int.Parse(assignment.Number); if (!parsed.Exists(c => string.Equals(c.Territory, number.ToString(), StringComparison.OrdinalIgnoreCase))) { var t = new TerritoryLastCompleted { Territory = assignment.Number, TimesWorked = 0, Publisher = "Never Completed", }; parsed.Add(t); } } catch (Exception e) { errors.Add($"Number: {assignment.Number}: {e.Message}"); } } foreach (string error in errors) { Console.WriteLine(error); } Console.WriteLine("Sorting by number..."); var ordered = parsed.OrderBy(c => int.Parse(c.Territory)).ToList(); Console.WriteLine("Saving data to new file..."); PivotAssignmentRowsToS13Columns.SaveTo(ordered, outputPath); }