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);
        }
Exemple #2
0
        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");
        }
Exemple #3
0
        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");
        }
Exemple #4
0
        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 }));
        }
Exemple #5
0
        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"));
        }
Exemple #7
0
        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);
        }
Exemple #9
0
 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);
        }