public List <YearlyData> AddForProduct(List <YearlyData> records, MinAndMaxYears minAndMaxYears) { string productName = records.Select(r => r.ProductName).First(); for (var i = minAndMaxYears.Minimum; i <= minAndMaxYears.Maximum; i++) { if (records.All(r => r.OriginYear != i)) { for (int j = i; j <= minAndMaxYears.Maximum; j++) { records.Add(new YearlyData { ProductName = productName, DevelopmentYear = j, OriginYear = i, IncrementalValue = 0 }); } } else { for (int j = i; j <= minAndMaxYears.Maximum; j++) { if (!records.Any(r => r.DevelopmentYear == j && r.OriginYear == i)) { records.Add(new YearlyData { ProductName = productName, DevelopmentYear = j, OriginYear = i, IncrementalValue = 0 }); } } } } return(records); }
public void AddsMissingYearsForCompProduct() { // Arrange _records = new List <YearlyData>() { new YearlyData { ProductName = "Comp", DevelopmentYear = 1992, OriginYear = 1992, IncrementalValue = 110m }, new YearlyData { ProductName = "Comp", DevelopmentYear = 1993, OriginYear = 1992, IncrementalValue = 170m }, new YearlyData { ProductName = "Comp", DevelopmentYear = 1993, OriginYear = 1993, IncrementalValue = 200m } }; _minAndMaxYears = new MinAndMaxYears { Minimum = 1990, Maximum = 1993 }; // Act var result = _target.AddForProduct(_records, _minAndMaxYears); // Assert Assert.That(result.Count, Is.EqualTo(10)); Assert.That(result[0].DevelopmentYear, Is.EqualTo(1992), "1st record - Development Year"); Assert.That(result[0].OriginYear, Is.EqualTo(1992), "1st record - Origin Year"); Assert.That(result[1].DevelopmentYear, Is.EqualTo(1993), "2nd record - Development Year"); Assert.That(result[1].OriginYear, Is.EqualTo(1992), "2nd record - Origin Year"); Assert.That(result[2].DevelopmentYear, Is.EqualTo(1993), "3rd record - Development Year"); Assert.That(result[2].OriginYear, Is.EqualTo(1993), "3rd record - Origin Year"); Assert.That(result[3].DevelopmentYear, Is.EqualTo(1990), "4th record - Development Year"); Assert.That(result[3].OriginYear, Is.EqualTo(1990), "4th record - Origin Year"); Assert.That(result[4].DevelopmentYear, Is.EqualTo(1991), "5th record - Development Year"); Assert.That(result[4].OriginYear, Is.EqualTo(1990), "5th record - Origin Year"); Assert.That(result[5].DevelopmentYear, Is.EqualTo(1992), "6th record - Development Year"); Assert.That(result[5].OriginYear, Is.EqualTo(1990), "6th record - Origin Year"); Assert.That(result[6].DevelopmentYear, Is.EqualTo(1993), "7th record - Development Year"); Assert.That(result[6].OriginYear, Is.EqualTo(1990), "7th record - Development Year"); Assert.That(result[7].DevelopmentYear, Is.EqualTo(1991), "8th record - Development Year"); Assert.That(result[7].OriginYear, Is.EqualTo(1991), "8th record - Origin Year"); Assert.That(result[8].DevelopmentYear, Is.EqualTo(1992), "9th record - Development Year"); Assert.That(result[8].OriginYear, Is.EqualTo(1991), "9th record - Origin Year"); Assert.That(result[9].DevelopmentYear, Is.EqualTo(1993), "10th record - Development Year"); Assert.That(result[9].OriginYear, Is.EqualTo(1991), "10th record - Origin Year"); }
public void AddsMissingYearForNonCompProduct() { // Arrange _records = new List <YearlyData>() { new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1990, OriginYear = 1990, IncrementalValue = 45.2m }, // Missing DevelopmentYear 1992 new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1991, OriginYear = 1990, IncrementalValue = 64.8m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1993, OriginYear = 1990, IncrementalValue = 37.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1991, OriginYear = 1991, IncrementalValue = 50.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1992, OriginYear = 1991, IncrementalValue = 75.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1993, OriginYear = 1991, IncrementalValue = 25.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1992, OriginYear = 1992, IncrementalValue = 55.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1993, OriginYear = 1992, IncrementalValue = 85.0m }, new YearlyData { ProductName = "Non-Comp", DevelopmentYear = 1993, OriginYear = 1993, IncrementalValue = 100.0m } }; _minAndMaxYears = new MinAndMaxYears { Minimum = 1990, Maximum = 1993 }; // Act var result = _target.AddForProduct(_records, _minAndMaxYears); // Assert Assert.That(result.Count, Is.EqualTo(10)); Assert.That(result[9].DevelopmentYear, Is.EqualTo(1992), "10th record - Development Year"); Assert.That(result[9].OriginYear, Is.EqualTo(1990), "10th record - Origin Year"); }
public IActionResult ProcessFile(int id) { /* * This solution assumes that this web application is running on an intranet (not the public internet) and none of the users are malicious * There is basic protection insofar as this method does not accept any string inputs * However if this were to go on the public internet, a security review might first be needed */ var file = _csvLoader.GetFileById(id); if (file == null) { throw new System.Exception("File Not Found"); } var records = _csvLoader.LoadCsvFile(_inputFilesPath + "\\" + file.Name); IncrementalValue.DefaultNullsToZeroes(records); var defects = _fileValidator.Validate(file, records); if (defects != null && defects.Errors.Any()) { return(RedirectToAction("Index", "Failure", defects)); } if (records != null) { MinAndMaxYears minAndMaxYears = new MinAndMaxYears { Minimum = records.Min(p => p.OriginYear), Maximum = records.Max(p => p.OriginYear) }; var recordsPerProduct = _recordsPerProduct.SortRecordsByProduct(records); recordsPerProduct = new MissingYears().Add(recordsPerProduct, minAndMaxYears); string outputFileName = _csvOutput.GetOutputFileName(file.Name); _csvOutput.Write(recordsPerProduct, outputFileName); } return(RedirectToAction("Index", "Success", new { id = file.Id, fileName = file.Name })); }
public void Write(CsvWriter csv, List <YearlyData> productRecords, MinAndMaxYears minAndMaxYears) { if (productRecords.Any()) { string productName = productRecords.Select(r => r.ProductName).First(); csv.WriteField(productName); var runningTotals = RunningTotals(productRecords, minAndMaxYears); foreach (var value in runningTotals) { csv.WriteField(value); } csv.NextRecord(); } }
public void CalculatesRunningTotalsForCompProduct() { // Arrange var minAndMaxYears = new MinAndMaxYears() { Minimum = 1990, Maximum = 1993 }; // Act var result = _target.RunningTotals(_records, minAndMaxYears); Assert.That(result[0], Is.EqualTo("0")); Assert.That(result[1], Is.EqualTo("0")); Assert.That(result[2], Is.EqualTo("0")); Assert.That(result[3], Is.EqualTo("0")); Assert.That(result[4], Is.EqualTo("0")); Assert.That(result[5], Is.EqualTo("0")); Assert.That(result[6], Is.EqualTo("0")); Assert.That(result[7], Is.EqualTo("110")); Assert.That(result[8], Is.EqualTo("280")); Assert.That(result[9], Is.EqualTo("200")); }
public List <string> RunningTotals(List <YearlyData> productRecords, MinAndMaxYears minAndMaxYears) { List <string> runningTotals = new List <string>(); int range = minAndMaxYears.Maximum - minAndMaxYears.Minimum; for (int y = 0; y <= range; y++) { decimal runningTotal = 0m; for (int x = 0; x <= range - y; x++) { var increment = FindIncrementalValue( productRecords, minAndMaxYears.Minimum, x, y); runningTotal += increment; runningTotals.Add(FormattedNumber(runningTotal)); } } return(runningTotals); }
public void Write(List <List <YearlyData> > recordsPerProduct, string outputFileName) { if (!recordsPerProduct.Any()) { return; } using var writer = new StreamWriter(OutputFilesPath + "\\" + outputFileName); using var csv = new CsvWriter(writer); SetCsvHelperConfiguration(csv); var records = FlattenRecords(recordsPerProduct); SummaryRecord.Write(csv, records); MinAndMaxYears minAndMaxYears = new MinAndMaxYears { Minimum = records.Min(p => p.OriginYear), Maximum = records.Max(p => p.OriginYear) }; new ProductClaimsRecord().WriteForAllProducts(csv, recordsPerProduct, minAndMaxYears); }
public void WriteForAllProducts(CsvWriter csv, List <List <YearlyData> > recordsPerProduct, MinAndMaxYears minAndMaxYears) { foreach (var productRecords in recordsPerProduct) { Write(csv, productRecords, minAndMaxYears); } }
public List <List <YearlyData> > Add(List <List <YearlyData> > recordsPerProduct, MinAndMaxYears minAndMaxYears) { /* The full data set is needed we before we can write out all the running totals for each product * Wherever a year is not already specified we assume the Incremental Value is 0 */ foreach (var productRecords in recordsPerProduct) { var yearlyData = productRecords; AddForProduct(yearlyData, minAndMaxYears); } return(recordsPerProduct); }