Automation Center Overview Public

Automation Center

The ERPat Automation Center lets administrators build scheduled rules that approve routine work automatically — with a preview before anything changes, an Observe mode that mutates nothing, and a reason code recorded against every single record.

Guide version: r1 Module version: 0.3.3 Updated: 2026-09-04 Estimated time: 4 min 1 views
Introduction

Automation Center

Build scheduled rules that do the routine approving for you — after you have watched them decide, and never before.

⚡ 1 cron job ◈ 5 screens ☑ 3 tables ⚿ 10 permissions ▤ v0.3.2

Every payroll period, somebody opens Attendance and clicks Approve a few hundred times on records that were never in doubt. The Automation Center is where you write down the rule you were applying in your head, watch it agree with you for a while, and only then let it act.

Live mode changes real records. That is why it is not the default and not one click away. An automation must first complete an Observe run against the same configuration, promotion needs a separate permission, and the first live run is capped — to your First live run limit, 50 by default. Read Permissions, Authority & Scheduling before you promote anything.

What it is — and what it is not

The Automation Center schedules, throttles, records and audits. It does not own attendance, payroll, or employee data, and it contains no rule about any of them. Every capability it offers is contributed by the module that owns those records: HumanResource owns attendance, so HumanResource — not this module — decides what "eligible for approval" means and performs the approval through the very same service the Approve button calls.

It does

Hold the schedule, claim the occurrence, freeze the configuration, lease the run, feed candidates through in bounded chunks, stop at its caps, record an outcome and a reason for every record, and write one audit entry per run.

It does not

Know what an attendance record is. Decide what may be approved. Write to a business table. Own a second scheduler. Outlive the module whose data it acts on — switch that module off and its automations stop and ask for review.

How a decision gets made

Nothing here is magic, and nothing is hidden. A run walks the same three questions a person walks, in the same order:

Which records are even candidates? The owning module's handler asks, bounded by your lookback window, your settle delay, and your scope (departments, teams, individuals — or everyone).
Do they pass your rules? The conditions you built in the wizard are evaluated against pre-fetched values. A record that fails gets a reason code, not silence.
Should anything change? In Observe mode, no — the run reports what it would have done and touches nothing. In Live mode it calls the owning module's own service, attributed to the System actor, one record at a time.
????
Preview and Live are the same code. The preview in the builder and the run that eventually acts share one evaluator, differing only in whether a decision is written. A preview that could disagree with the run it predicts would be worse than no preview at all — so there is deliberately no second code path.

Explore the guide

This guide serves two readers. If you are setting up and running automations, the first three cards are your path. If you are a module developer adding a new kind of automation, start at the Integration Contract.

The module at a glance

Module slugautomations — the setting is module_automations, off by default
Where it livesSidebar → Administration, between System Logs and Settings
SchedulerERPat's Advanced Cron runtime. Exactly ONE job: automation_dispatch, every minute, per tenant
Tablesautomations, automation_runs, automation_run_items — tenant database only
Types availableContributed by other modules. Today: Attendance Auto Decision, owned by HumanResource
StatusMilestones 1–3 shipped (engine, builder, Observe, Live, clone). M4 (operations UI, notifications, APIs) and M5 (hardening) pending — see Research & Gaps
ℹ️
No types installed? The Automation Center still works and is still useful — run history, past-run analytics and engine health all function with zero registered types. It deliberately does not declare a hard dependency on any module, because that would take the whole module offline instead of just the one unavailable type.
Was this guide helpful?

Report a content problem