using Newtonsoft.Json.Converters;
using System.Collections.Generic;
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 organizationData = ConvertData<List<OrganizationData>>(inputJSON);
var results = new List<OrganizationResult>();
foreach (var item in organizationData)
results.Add(ProcessOrganization(item));
var returnJson = JsonConvert.SerializeObject(results, Formatting.Indented);
Console.WriteLine(returnJson);
Console.WriteLine(ex.Message.ToString());
private static T ConvertData<T>(string json, JsonConverter converter = null)
if (string.IsNullOrWhiteSpace(json))
return JsonConvert.DeserializeObject<T>(json, new IsoDateTimeConverter());
return JsonConvert.DeserializeObject<T>(json, converter);
private static OrganizationResult ProcessOrganization(OrganizationData organizationData)
var results = new OrganizationResult()
OrganizationId = organizationData.OrganizationId
results.CalendarYears.AddRange(BuildYears(organizationData.StartDate.Year, organizationData.EndDate.Year));
var startYear = organizationData.StartDate.ToFinancialYear(organizationData.FiscalYearEnd);
var endYear = organizationData.EndDate.ToFinancialYear(organizationData.FiscalYearEnd);
results.FiscalYears.AddRange(BuildYears(startYear, endYear));
private static IList<int> BuildYears(int startYear, int endYear)
var results = new List<int>();
int years = (endYear - startYear) + 1;
for (int i = 0; i < years; i++)
results.Add(startYear + i);
public class OrganizationData
public int OrganizationId { get; set; }
[JsonProperty("startDate")]
public DateTime StartDate { get; set; }
[JsonProperty("endDate")]
public DateTime EndDate { get; set; }
[JsonProperty("fiscalYearEnd")]
public int FiscalYearEnd { get; set; }
public class OrganizationResult
public OrganizationResult()
CalendarYears = new List<int>();
FiscalYears = new List<int>();
public int OrganizationId { get; set; }
[JsonProperty("calendarYears")]
public IList<int> CalendarYears { get; set; }
[JsonProperty("fiscalYears")]
public IList<int> FiscalYears { get; set; }
public static class DateTimeExtensions
public static int ToFinancialYear(this DateTime dateTime, int yearEndMonth)
return (dateTime.Month > yearEndMonth ? dateTime.Year + 1 : dateTime.Year);
public static class CollectionExtensions
public static void AddRange<T>(this IList<T> values, IList<T> collection)
if (!values.IsReadOnly && collection != null)
foreach (T t in collection)