public ImportResponse ImportScheduledTaxRates(string fullFilePath) { var response = new ImportResponse(); if (string.IsNullOrWhiteSpace(fullFilePath)) { response.AddError("No file specified"); return(response); } if (!fullFilePath.EndsWith(".csv")) { response.AddError("file must be in .csv format"); return(response); } if (!File.Exists(fullFilePath)) { response.AddError("File does not exist"); return(response); } var lines = File.ReadAllLines(fullFilePath); for (int i = 1; i < lines.Length; i++) { var lineParts = lines[i].Split(';'); if (lineParts.Length != 4) { response.AddFailedLine(i, "Not able to find all elements"); continue; } var municipality = lineParts[0]; var partsAreValid = true; if (string.IsNullOrWhiteSpace(municipality)) { response.AddFailedLine(i, "No municipality name specified"); partsAreValid = false; } if (!decimal.TryParse(lineParts[1], out decimal rate)) { response.AddFailedLine(i, $"Unable to parse rate {lineParts[1]} to a decimal"); partsAreValid = false; } var frequencyParses = Enum.TryParse(lineParts[2], true, out Frequency frequency) && Enum.IsDefined(typeof(Frequency), frequency); if (!frequencyParses) { response.AddFailedLine(i, $"Unable to parse {lineParts[2]} to a valid frequency"); partsAreValid = false; } if (frequencyParses) { var(Success, ErrorMessage, Ranges) = ParseDateRanges(lineParts[3], frequency); if (!Success) { partsAreValid = false; response.AddFailedLine(i, ErrorMessage); } if (!partsAreValid) { continue; } foreach (var(Start, End) in Ranges) { var scheduledTaxRate = _scheduledTaxRateFactory.Create(municipality, rate, frequency, Start, End); _municipalityRepository.SaveScheduledTaxRate(scheduledTaxRate); } } } return(response); }