- Home
- Blog
- Scheduling Concepts
- How a Schedule Accounts for Holidays and Downtime
A schedule accounts for holidays and downtime by turning them into the effective hours a work center actually has on a given day. EDGEBIC by User Solutions computes those hours from one formula per work center, shift, and date, subtracting downtime and partial holidays, applying instances and utilization, and honoring any capacity override. Before it allocates a single hour of work, the engine asks this calculation how much the machine can do, so every Gantt bar, every utilization percentage, and every due-date promise rests on the same numbers.
Get this configuration right and the schedule matches what the plant can deliver. Get it wrong and everything downstream is wrong too, because a job cannot be placed correctly against capacity that does not reflect reality. The good news is that the whole thing reduces to one resolution chain and one formula.
The one formula behind every capacity number
For any combination of work center, shift, and date, EDGEBIC resolves effective hours in three steps and takes the first that applies:
- Daily capacity override. If a planner has entered a specific number of hours for this exact work center, shift, and date, that number is used verbatim.
- Date-range override. If a range-based total covers this date, the engine spreads it across the available days and shifts in the window.
- The shift formula. Otherwise:
gross = shift end - shift start
net = gross - break - downtime - partial holiday hours
capacity = max(0, net) x number of instances x (utilization % / 100)
A machining center on an 08:00 to 16:30 shift, 30 minutes of it lost to a break, an hour of Wednesday maintenance, two instances, and 85 percent utilization comes out at 11.9 hours on a Wednesday: 8.5 gross, minus 0.5 and 1.0 for 7.0 net, times 2 instances times 0.85. That is the exact figure the engine schedules against and the exact figure the capacity dashboard shows, because both run the same calculation. How those first two subtractions get told to the system is the practical question, and the answer is the shift hours themselves or a per-day override, not a downtime record.
Before any of this, a date gate decides whether the work center is even open. A whole-day plant holiday, the work center's own availability flag or effective date, or a non-working weekend all return "closed" and the date is skipped entirely, with capacity of zero. Which calendar that gate reads depends on whether the work center inherits the plant's shifts and holidays or overrides them with its own.
Three levels of holidays that combine cleanly
Not every closure is plant-wide, so EDGEBIC models holidays at three scopes:
- Plant-wide holiday. Closes every work center and every shift. A public holiday, a company shutdown. It can be recurring (same month and day every year) or one-off, and it can be whole-day or a partial window. This is the only one with a screen you can enter records on.
- Shift holiday. Closes a single shift on the machines that use it. Honored by the engine, but not creatable in the current release: express it as per-day capacity overrides of zero on that shift.
- Work-center holiday. Closes one machine on a specific date. Also honored but not creatable: an annual teardown on CNC-3 is a per-day capacity override of zero on that work center.
They combine without double-counting because they are resolved in priority. If a plant-wide whole-day holiday exists for a date, every work center reports zero and no allocations are created, regardless of what shift or machine holidays also exist. If there is no plant closure, a shift holiday narrows the block to its shift, and a work-center holiday narrows it to its machine. A partial-day holiday (say a 45-minute monthly union assembly from 10:00 to 10:45) does not close anything; it subtracts only the overlap between the holiday window and each shift's window from that shift's hours.
Downtime: subtracting hours, not days
Downtime is different from a holiday. A holiday removes a day or a window; downtime subtracts hours from within a shift while leaving the shift alive. A recurring two-hour lubrication every Monday takes two hours off Monday's capacity on that machine, but the rest of Monday still schedules. Downtime can be recurring (fires every week on its chosen day) or one-off (fires only on its specific date), and its hours come off in the net line of the formula, before instances and utilization multiply. So a downtime window that exceeds the shift length simply drives capacity to zero rather than negative, which is exactly what you want.
Overrides: when the planner owns the number
The two override paths at the top of the resolution chain exist for the cases the standing calendar cannot express.
A daily override authorizes or restricts one cell. To open a normally non-working Saturday for a rush order, you enter the approved hours for that work center, shift, and date, say 4.0, with a reason. The engine uses 4.0 exactly, without re-multiplying by instances or utilization, so you enter the total you actually want the machine to have. This is the one place the planner, not the formula, owns the final number, and it wins over everything else for that cell.
A date-range override models a period-wide budget: a start and end date and a total capacity, which the engine divides across the available days in the window and then again by the shifts active each day. It sits in the middle of the resolution chain and a per-day override beats it on any date both cover. It is worth knowing the rung exists, because it explains the ordering, but the current release exposes no entry point for creating one. In practice you do the division yourself and enter per-day overrides: retooling a welding cell on 60 hours across five weekdays and two shifts is 6 hours per shift slot, typed into ten cells with a shared reason, and any plant holiday inside the range should be left out of your day count.
Why one chokepoint matters
The reason to insist on a single resolution chain is consistency. The scheduling engine and the capacity dashboard could, in a lesser design, compute available hours two different ways and disagree, leaving a planner unsure which number to trust. EDGEBIC computes capacity through the same logic on both sides, pre-loading the same override records and applying the same formula, so the dashboard's bar for Wednesday and the engine's Wednesday allocation always agree. When they ever appear not to, the cause is a stale snapshot (a change made after the run started) rather than two competing calculations.
This capacity calculation is the foundation the rest of the engine builds on. The multi-shift allocator that fills capacity consumes exactly these per-shift buckets, and the operator skill constraint stacks on top of them: a window has to be an open, capacity-bearing machine slot before the engine even asks whether a qualified person can staff it. Understanding holidays and downtime is therefore the prerequisite for reading almost any placement the schedule makes.
For the wider picture of how these hours flow into a plan, see the complete scheduling engine guide, and for the general distinction between a schedule that respects capacity and one that ignores it, finite versus infinite capacity scheduling covers why the bucket matters at all.
To configure your own plant calendar and watch a holiday zero out a day the way it should, bring your data to a demo.
EDGEBIC computes effective hours per work center, shift, and date from one formula: shift hours minus break, downtime, and any partial-holiday hours, multiplied by the number of machine instances, multiplied by the utilization percentage. A capacity override for a specific date replaces the formula outright. Both the scheduling engine and the capacity dashboard use the same calculation, so they never disagree on what a work center can do.
Plant-wide holidays close every work center and shift, such as a public holiday. Shift holidays close a single shift, and work-center holidays close one machine. They combine without double-counting: a plant-wide whole-day holiday blocks everything, while the narrower scopes confine the closure to one shift or one machine. Only the plant-wide scope has a screen in the current release, though: the narrower two are honored by the engine but cannot be created, so a single shift or a single machine is closed with per-day capacity overrides instead.
A holiday removes a whole day or blocks a partial window across shifts. Downtime subtracts hours from within a shift without eliminating it: a two-hour lubrication reduces that shift's available hours by two but still leaves the rest of the shift schedulable, and the subtraction happens before instances and utilization are applied. The engine also understands downtime that recurs on a weekday, but the current release has no screen for creating downtime records, so in practice a standing weekly loss goes into the shift hours and a dated one goes into a per-day capacity override.
Use a daily capacity override for that work center, shift, and date. You enter the total hours the machine will be available that day, and the engine uses it verbatim without re-multiplying by instances or utilization, so you own the final number. The override wins over the standing formula and over any date-range override, and it makes a normally non-working Saturday schedulable for just that machine and shift.
Expert Q&A: Deep Dive
Q: A public holiday landed mid-week but the schedule still put jobs on that day. What did I configure wrong?
A: Almost certainly the plan predates the holiday, or the record is not doing what you think. Saving a holiday never moves existing work, so rerun the schedule first. If jobs still land there, open the record and check three things: that it is marked active, that Closes the whole day is ticked if you meant a full closure rather than a window, and, for a recurring holiday, that the month and day are right, since only those two fields drive the recurrence and a mistyped date fires on the wrong day every year. Scope is rarely the culprit here, because the plant holiday screen is the only closure record you can create.
Q: We are retooling a welding cell for a week and can only guarantee 60 total hours across the whole week. How do I model that without editing every day?
A: Do the division once and enter it as per-day capacity overrides. Sixty hours across five weekdays is 12 a day, and on a two-shift work center that is 6 per shift slot, so you type 6 into each of the ten cells with a reason such as retooling week. Every scheduling run that week is then constrained to the budget. A date-range override that would hold the whole 60 in one record does exist in the engine, but it has no visible entry point in the current release, so the arithmetic is yours to do and the entry is a short typing job. Watch for a plant holiday inside the range: exclude it from your day count, or the remaining days will be short.
Frequently Asked Questions
Ready to Transform Your Production Scheduling?
User Solutions has been helping manufacturers optimize their production schedules for over 35 years. One-time license, 5-day implementation.

User Solutions Team
Manufacturing Software Experts
User Solutions has been developing production planning and scheduling software for manufacturers since 1991. Our team combines 35+ years of manufacturing software expertise with deep industry knowledge to help factories optimize their operations.
Share this article
Related Articles
Plan on Lead Time vs Require on Hand: the Material Availability Choice
A product's Material Availability setting decides whether a job without covering supply is planned on an assumption or reported as a shortage. Here is what each choice does to the plan.
Why a Missing Tool Stops the Job Instead of Scheduling Anyway
A step whose tool is inactive, unknown, or at zero quantity fails the run immediately and names the tool. Why that refusal is a feature, not a limitation.
Why a Tool Is Held for Setup and Run Alike
An operator can tend two machines at once. A fixture cannot be half mounted. Why tools book at the full rate for every hour, with no attention fraction and no escape.
