A common approach is to send calls to a Call Flow Designer (CFD) application first. This application could look up in a database a list of holidays and office hours, then make the determination where to route the calls rather than the default routing in 3CX. My assumption is that callers dial a number specific to that location, correct? In that case, perhaps 4 tables could do the trick.
Office Table
---------------------------
Id OfficeName
Did Table
---------------------------
Did Id
Office Hours Table
---------------------------
Id DayOfWeek OfficeHoursStart OfficeHoursEnd InRouteExt OutRouteExt
Holiday Table
-----------------------------
Id HolidayStart HolidayEnd Repeat HolidayRouteExt
1. The CFD first checks if the DID is on the DID list.
A. If not, route to a default extension
B. If it is on the list, then it looks up what location
2. With the location, it checks whether this date and time falls within a holiday
A. If holiday, route to holiday extension
B. If not holiday check office hours
3. Check if within office hours
A. If office hours route to In-office extension
B. If not in office hours, route to out-office extension
I don't think it would be that challenging to create.