using System.Collections.Generic;
private static List<int> GetRange(int startYear, int endYear)
return Enumerable.Range(startYear, endYear - startYear + 1).ToList();
private static List<int> GetFiscalYearRange(DateTime startDate, DateTime endDate, int fiscalYearEnd)
var rangeStart = GetFinancialYear(startDate, fiscalYearEnd);
var rangeEnd = GetFinancialYear(endDate, fiscalYearEnd);
return GetRange(rangeStart, rangeEnd);
private static List<int> GetCalendarYearRange(DateTime startDate, DateTime endDate)
return GetRange(startDate.Year, endDate.Year);
private static int GetFinancialYear(DateTime currentDate, int fiscalYearEnd)
ValidateMonth(fiscalYearEnd);
return currentDate.Month >= fiscalYearEnd + 1 ? currentDate.Year + 1 : currentDate.Year;
private static void ValidateMonth(int fiscalYearEnd)
if (fiscalYearEnd > 12 || fiscalYearEnd < 1)
throw new Exception("Month is not valid");
public static void Main()
startDate: '2018-1-01T00:00:00',
endDate: '2020-8-29T00:00:00',
startDate: '2018-1-01T00:00:00',
endDate: '2020-8-29T00:00:00',
startDate: '2018-9-01T00:00:00',
endDate: '2020-8-29T00:00:00',
var organizationList = JsonConvert.DeserializeObject<List<Organization>>(inputJSON);
if (organizationList == null)
throw new Exception("No data after object deserialization");
var outputList = new List<OrganizationYears>();
foreach (var organization in organizationList)
if (organization == null)
throw new Exception("No data");
if (organization.StartDate >= organization.EndDate)
throw new Exception("Start date is greater or equal than end date");
var organizationYear = new OrganizationYears() { OrgId = organization.OrgId };
organizationYear.CalendarYears = GetCalendarYearRange(organization.StartDate, organization.EndDate);
organizationYear.FiscalYears = GetFiscalYearRange(organization.StartDate, organization.EndDate, organization.FiscalYearEnd);
outputList.Add(organizationYear);
string jsonString = JsonConvert.SerializeObject(outputList);
Console.WriteLine(jsonString);
Console.WriteLine(new Exception(String.Concat("There was a problem trying to Serialize/Deserialize data", Environment.NewLine, ex.ToString())));
public class Organization
public int OrgId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int FiscalYearEnd { get; set; }
public class OrganizationYears
public int OrgId { get; set; }
public List<int> CalendarYears { get; set; }
public List<int> FiscalYears { get; set; }