Skip to content

Instantly share code, notes, and snippets.

@hasokeric
Last active June 11, 2024 16:01
Show Gist options
  • Save hasokeric/87118eb580d4865f49d1038bee4353d7 to your computer and use it in GitHub Desktop.
Save hasokeric/87118eb580d4865f49d1038bee4353d7 to your computer and use it in GitHub Desktop.
Epicor NACHA File
+----------------------------+
| File Transmission Record |
+----------------------------+
|
v
+----------------------------+ <--------- First physical record(s) on file
| File Header Record | <--------- Type 1 - File Header Record
+----------------------------+ <--------- One per file - first logical record on file
|
v
+----------------------------+
| Company/Batch Header Rec | <--------- Type 5 - Company/Batch Header Record
+----------------------------+ <--------- One per batch
|
v
+----------------------------+
| First Entry Detail Rec | <--------- Each entry detail may have an optional Addenda Record
+----------------------------+ <--------- Type 6 - Entry Detail Record
|
v
+----------------------------+
| Second Entry Detail Rec |
+----------------------------+
|
v
.......
|
v
+----------------------------+
| Last Entry Detail Rec |
+----------------------------+
|
v
+----------------------------+
| Company/Batch Control Rec | <--------- Type 8 - Company/Batch Control Record
+----------------------------+ <--------- One per batch
|
v
........
|
v
+----------------------------+
| Company/Batch Header Rec |
+----------------------------+
|
v
+----------------------------+
| First Entry Detail Rec |
+----------------------------+
|
v
.......
|
v
+----------------------------+
| Last Entry Detail Rec |
+----------------------------+
|
v
+----------------------------+
| Company/Batch Control Rec | <--------- Type 8 - Company/Batch Control Record
+----------------------------+
|
v
+----------------------------+
| File Control Record | <--------- Type 9 - File Control Record
+----------------------------+ <--------- One per file - last logical record
|
v
+----------------------------+
| Blocking or Padding Record | <--------- File used to complete last physical block
+----------------------------+
public static List<DateTime> GetBankHolidays(int year)
{
// Initialize holidays list with all holidays
List<DateTime> holidays = new List<DateTime>
{
// New Year's Day
new DateTime(year, 1, 1),
// Martin Luther King Jr. Day (3rd Monday in January)
new DateTime(year, 1, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 1, 1).DayOfWeek + 7) % 7),
// Presidents' Day (3rd Monday in February)
new DateTime(year, 2, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 2, 1).DayOfWeek + 7) % 7),
// Memorial Day (last Monday in May)
new DateTime(year, 5, 31).AddDays(-(int)new DateTime(year, 5, 31).DayOfWeek + (int)DayOfWeek.Monday),
// Juneteenth National Independence Day
new DateTime(year, 6, 19),
// Independence Day
new DateTime(year, 7, 4),
// Labor Day (1st Monday in September)
new DateTime(year, 9, 1).AddDays((1 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 9, 1).DayOfWeek + 7) % 7),
// Columbus Day (2nd Monday in October)
new DateTime(year, 10, 1).AddDays((2 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 10, 1).DayOfWeek + 7) % 7),
// Veterans Day
new DateTime(year, 11, 11),
// Thanksgiving Day (4th Thursday in November)
new DateTime(year, 11, 1).AddDays((4 - 1) * 7 + (DayOfWeek.Thursday - new DateTime(year, 11, 1).DayOfWeek + 7) % 7),
// Christmas Day
new DateTime(year, 12, 25)
};
// Adjust holidays that fall on weekends
for (int i = 0; i < holidays.Count; i++)
{
if (holidays[i].DayOfWeek == DayOfWeek.Saturday)
holidays[i] = holidays[i].AddDays(-1); // Observed on Friday
else if (holidays[i].DayOfWeek == DayOfWeek.Sunday)
holidays[i] = holidays[i].AddDays(1); // Observed on Monday
}
return holidays;
}
public static Func<int, List<DateTime>> GetBankHolidays = (year) =>
{
// Initialize holidays list with all holidays
List<DateTime> holidays = new List<DateTime>
{
new DateTime(year, 1, 1), // New Year's Day
new DateTime(year, 1, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 1, 1).DayOfWeek + 7) % 7), // Martin Luther King Jr. Day
new DateTime(year, 2, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 2, 1).DayOfWeek + 7) % 7), // Presidents' Day
new DateTime(year, 5, 31).AddDays(-(int)new DateTime(year, 5, 31).DayOfWeek + (int)DayOfWeek.Monday), // Memorial Day
new DateTime(year, 6, 19), // Juneteenth National Independence Day
new DateTime(year, 7, 4), // Independence Day
new DateTime(year, 9, 1).AddDays((1 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 9, 1).DayOfWeek + 7) % 7), // Labor Day
new DateTime(year, 10, 1).AddDays((2 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 10, 1).DayOfWeek + 7) % 7), // Columbus Day
new DateTime(year, 11, 11), // Veterans Day
new DateTime(year, 11, 1).AddDays((4 - 1) * 7 + (DayOfWeek.Thursday - new DateTime(year, 11, 1).DayOfWeek + 7) % 7), // Thanksgiving Day
new DateTime(year, 12, 25) // Christmas Day
};
// Adjust holidays that fall on weekends
for (int i = 0; i < holidays.Count; i++)
{
if (holidays[i].DayOfWeek == DayOfWeek.Saturday)
holidays[i] = holidays[i].AddDays(-1); // Observed on Friday
else if (holidays[i].DayOfWeek == DayOfWeek.Sunday)
holidays[i] = holidays[i].AddDays(1); // Observed on Monday
}
return holidays;
};
public static Func<int, List<DateTime>> GetBankHolidays = (year) =>
{
// Initialize holidays list with all holidays
List<DateTime> holidays = new List<DateTime>
{
// New Year's Day
new DateTime(year, 1, 1),
// Martin Luther King Jr. Day (3rd Monday in January)
new DateTime(year, 1, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 1, 1).DayOfWeek + 7) % 7),
// Presidents' Day (3rd Monday in February)
new DateTime(year, 2, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 2, 1).DayOfWeek + 7) % 7),
// Memorial Day (last Monday in May)
new DateTime(year, 5, 31).AddDays(-(int)new DateTime(year, 5, 31).DayOfWeek + (int)DayOfWeek.Monday),
// Juneteenth National Independence Day
new DateTime(year, 6, 19),
// Independence Day
new DateTime(year, 7, 4),
// Labor Day (1st Monday in September)
new DateTime(year, 9, 1).AddDays((1 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 9, 1).DayOfWeek + 7) % 7),
// Columbus Day (2nd Monday in October)
new DateTime(year, 10, 1).AddDays((2 - 1) * 7 + (DayOfWeek.Monday - new DateTime(year, 10, 1).DayOfWeek + 7) % 7),
// Veterans Day
new DateTime(year, 11, 11),
// Thanksgiving Day (4th Thursday in November)
new DateTime(year, 11, 1).AddDays((4 - 1) * 7 + (DayOfWeek.Thursday - new DateTime(year, 11, 1).DayOfWeek + 7) % 7),
// Christmas Day
new DateTime(year, 12, 25)
};
// Adjust holidays that fall on weekends
for (int i = 0; i < holidays.Count; i++)
{
if (holidays[i].DayOfWeek == DayOfWeek.Saturday)
holidays[i] = holidays[i].AddDays(-1); // Observed on Friday
else if (holidays[i].DayOfWeek == DayOfWeek.Sunday)
holidays[i] = holidays[i].AddDays(1); // Observed on Monday
}
return holidays;
};
public static Func<DateTime, DateTime> GetNextValidDate = (inputDate) =>
{
// Initialize holidays list with all holidays for the input year
List<DateTime> holidays = new List<DateTime>
{
// New Year's Day
new DateTime(inputDate.Year, 1, 1),
// Martin Luther King Jr. Day (3rd Monday in January)
new DateTime(inputDate.Year, 1, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(inputDate.Year, 1, 1).DayOfWeek + 7) % 7),
// Presidents' Day (3rd Monday in February)
new DateTime(inputDate.Year, 2, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(inputDate.Year, 2, 1).DayOfWeek + 7) % 7),
// Memorial Day (last Monday in May)
new DateTime(inputDate.Year, 5, 31).AddDays(-(int)new DateTime(inputDate.Year, 5, 31).DayOfWeek + (int)DayOfWeek.Monday),
// Juneteenth National Independence Day
new DateTime(inputDate.Year, 6, 19),
// Independence Day
new DateTime(inputDate.Year, 7, 4),
// Labor Day (1st Monday in September)
new DateTime(inputDate.Year, 9, 1).AddDays((1 - 1) * 7 + (DayOfWeek.Monday - new DateTime(inputDate.Year, 9, 1).DayOfWeek + 7) % 7),
// Columbus Day (2nd Monday in October)
new DateTime(inputDate.Year, 10, 1).AddDays((2 - 1) * 7 + (DayOfWeek.Monday - new DateTime(inputDate.Year, 10, 1).DayOfWeek + 7) % 7),
// Veterans Day
new DateTime(inputDate.Year, 11, 11),
// Thanksgiving Day (4th Thursday in November)
new DateTime(inputDate.Year, 11, 1).AddDays((4 - 1) * 7 + (DayOfWeek.Thursday - new DateTime(inputDate.Year, 11, 1).DayOfWeek + 7) % 7),
// Christmas Day
new DateTime(inputDate.Year, 12, 25)
};
// Adjust holidays that fall on weekends
holidays = holidays.Select(holiday =>
{
if (holiday.DayOfWeek == DayOfWeek.Saturday)
return holiday.AddDays(-1); // Observed on Friday
if (holiday.DayOfWeek == DayOfWeek.Sunday)
return holiday.AddDays(1); // Observed on Monday
return holiday;
}).ToList();
// Check if inputDate is a holiday
if (holidays.Contains(inputDate))
{
// Find the next valid date using LINQ
inputDate = Enumerable.Range(1, int.MaxValue)
.Select(offset => inputDate.AddDays(offset))
.First(date => !holidays.Contains(date));
}
return inputDate;
};
public static Func<DateTime?, DateTime?> GetNextValidDate = inputDate =>
{
if (!inputDate.HasValue) return null;
var date = inputDate.Value;
var holidays = new List<DateTime>
{
new DateTime(date.Year, 1, 1),
new DateTime(date.Year, 1, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(date.Year, 1, 1).DayOfWeek + 7) % 7),
new DateTime(date.Year, 2, 1).AddDays((3 - 1) * 7 + (DayOfWeek.Monday - new DateTime(date.Year, 2, 1).DayOfWeek + 7) % 7),
new DateTime(date.Year, 5, 31).AddDays(-(int)new DateTime(date.Year, 5, 31).DayOfWeek + (int)DayOfWeek.Monday),
new DateTime(date.Year, 6, 19),
new DateTime(date.Year, 7, 4),
new DateTime(date.Year, 9, 1).AddDays((1 - 1) * 7 + (DayOfWeek.Monday - new DateTime(date.Year, 9, 1).DayOfWeek + 7) % 7),
new DateTime(date.Year, 10, 1).AddDays((2 - 1) * 7 + (DayOfWeek.Monday - new DateTime(date.Year, 10, 1).DayOfWeek + 7) % 7),
new DateTime(date.Year, 11, 11),
new DateTime(date.Year, 11, 1).AddDays((4 - 1) * 7 + (DayOfWeek.Thursday - new DateTime(date.Year, 11, 1).DayOfWeek + 7) % 7),
new DateTime(date.Year, 12, 25)
}.Select(holiday => holiday.DayOfWeek == DayOfWeek.Saturday ? holiday.AddDays(-1) : holiday.DayOfWeek == DayOfWeek.Sunday ? holiday.AddDays(1) : holiday).ToList();
return holidays.Contains(date) ? Enumerable.Range(1, int.MaxValue).Select(offset => date.AddDays(offset)).First(d => !holidays.Contains(d)) : date;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment