Payroll Rules
Automate adjustments to each employee's daily hour-type totals (minimums, maximums, additions, multiplications, moves between types...) based on conditions, before they're consolidated into the payroll.
Payroll rules apply automatic adjustments to the hours of each type that MyChronos calculates for every employee and day, before they're consolidated into the payroll. They're useful for cases like guaranteeing a minimum number of hours of a given type, capping a maximum, or adding a bonus when a specific condition is met.
Where to find it
This option is only visible if the Payrolls module is active on your account and you have the Payrolls edit permission. Go to Settings (main menu) → Payrolls group → Payroll rules.
How it works
When a payroll is generated or regenerated, MyChronos evaluates active rules for each employee and each day in the period, in this order:
- It fetches all active rules whose scope includes that employee, ordered by Priority ascending.
- For each rule, it checks whether its Conditions are met for that specific day.
- If they are, it applies the rule's Actions to that day's hour breakdown.
Rules form a pipeline: each rule sees the accumulated result of all previous rules, not the original data. This means priority order matters a lot — a priority-2 rule may or may not trigger depending on what the priority-1 rule already did.
Rules apply in ascending priority order
Rules with a lower priority number are evaluated and applied first; later rules see the effects of earlier ones.
Creating a rule
Click Create inside Payroll rules.
General
- Name — identifies the rule in the list.
- Priority — a number that determines evaluation order (ascending).
- Scope — who the rule applies to: All employees, Specific employees, or Employee groups. Depending on your choice, a multi-select of employees or employee groups appears.
- Active — temporarily disable a rule without deleting it.
Conditions
Define when the rule should apply. If you don't add any conditions, the rule always applies (to every day of every employee in its scope).
First choose the block's Logic operator: All match (AND) or Any matches (OR). Then add one or more conditions:
| Condition type | What it compares |
|---|---|
| Sum of an hour type for the day | The sum of a specific hour type for that day, against a time value (comparator: greater than or equal to, equal to, or less than or equal to) |
| Sum of all hour types for the day | The sum of all hours for that day (of any type), against a time value |
| Day has a duty | Whether that day has an assigned duty, optionally of a specific duty type (leave empty for any duty) |
| Day has timesheets at a workplace | Whether the employee has any clock-in at a specific workplace that day |
| Day has an absence of type | Whether that day has an approved absence of any of the selected absence types. Both the employee's own absences and those of the calendar assigned to them that day are taken into account |
| Day of the week | Whether the day falls on any of the selected weekdays (Monday to Sunday) |
| Specific date | Whether the day is exactly the given date |
| Day of the month | Whether the day of the month (1 to 31) is any of the selected ones |
| Condition group | A subgroup with its own logic operator (AND/OR) and its own conditions, for mixing logic |
Only one level of nesting
You can add a Condition group inside the main block, but you can't add another group inside that subgroup — only one level of nesting is supported.
Actions
Define what the rule does when its conditions are met. Add one or more actions; each specifies an Action type and the Hour type it acts on:
| Action type | Effect on the given hour type |
|---|---|
| Set minimum for hour type | Raises it up to the given value, only if it's currently lower. Never lowers it. |
| Set maximum for hour type | Lowers it down to the given value, only if it's currently higher. Never raises it. |
| Set hour type to | Sets it to exactly the given value, regardless of what it was before. |
| Add to hour type | Adds the given value on top of whatever it already was. |
| Subtract from hour type | Subtracts the given value, never going below 0. |
| Multiply hour type | Multiplies the hours by the given Factor (e.g. 1.5 increases them by 50%; 0.5 halves them). Never goes below 0. |
| Move hours between hour types | Moves hours from one type (From hour type) to another (To hour type). With Move all hours on, everything is moved; otherwise you enter an amount. If fewer hours are available, only those are moved (e.g. asking to move 10:00 when there are 4:00 moves 4:00). |
Each condition's and action's value is entered as a time (hours and minutes), except the multiply Factor, which is a decimal number.
Action order matters
Within a single rule, actions apply top to bottom and each one sees the result of the previous one. For example, starting from 6:00, Add 3:00 then Set maximum 8:00 leaves 8:00; in reverse order it leaves 9:00. To enforce a cap, put the maximum action last. You can drag actions to reorder them.
Worked example
Imagine two rules designed to guarantee a minimum number of Duty hours and reward a full duty shift:
| Rule | Priority | Condition | Action |
|---|---|---|---|
| Guarantee minimum duty | 1 | (none — always applies) | Set minimum for hour type Duty to 10:00 |
| Bonus for full duty | 2 | Sum of an hour type for the day: Duty ≥ 10:00 | Add to hour type Duty 2:00 |
For an employee who clocked 7:00 of Duty on a given day:
- The priority-1 rule has no conditions, so it always applies: since 7:00 is less than 10:00, the minimum raises it to 10:00.
- The priority-2 rule evaluates its condition against the already-updated result: 10:00 ≥ 10:00 is true, so it adds 2:00 more.
- Final result consolidated into the payroll: 12:00 of Duty for that day.
If the employee had already clocked 11:00 of Duty, the first rule wouldn't have changed anything (already above the minimum), and the second would still have applied, leaving the total at 13:00.
Example: moving hours depending on the day
A rule with the condition Day of the week: Sunday and the action Move hours between hour types from Regular to Holiday with Move all hours on makes all regular hours worked on a Sunday count as holiday hours.
If the condition were Day has an absence of type: Local holiday, it would also apply to the days marked as holidays in the employee's calendar.
Changes only show up when you generate or regenerate a payroll
Editing or creating a rule doesn't recalculate existing payrolls. To see its effect, generate a new payroll or use Regenerate from the payroll summary for the affected period.
FAQ
Can I make a rule only affect a specific workplace? Yes, using the "Day has timesheets at a workplace" condition.
Can I apply a rule only on certain days? Yes, with the "Day of the week", "Specific date" or "Day of the month" conditions. For several specific dates, add them inside a condition group with the Any matches (OR) operator.
Does the absence condition take pending absences into account? No, only approved absences.
Can a single rule adjust several hour types at once? Yes, by adding several actions, each with its own hour type.
What happens if two rules with the same priority affect the same hour type? Both still apply, in whatever order the system retrieves them; assign different priorities when the order matters to avoid ambiguity.