Acumatica · Customization

Acumatica Time Entry — Customisation Patterns

Acumatica Time Entry — Customisation Patterns is one of those Acumatica customisations that every team eventually needs and almost no team does well the first time.

John Kihiu12 min read

Time entry looks like the simplest self-service screen in Acumatica — a grid of hours against days — until you factor in overtime rules, project billability, and payroll or Projects module integration all reading from the same records. Most time-entry customizations are really about getting those downstream calculations right.

Core DACs and screens

Time entries are typically recorded through EPTimeCard/EPActivity style DACs, submitted through a self-service time entry screen (often numbered around EP305000) and approved through the standard Approval Maps engine. Time entries that reference a project and task feed into PMTran for project cost and billing purposes; time entries without a project reference typically feed payroll or general labor tracking instead.

Extension points

Overtime rules (daily over 8 hours, weekly over 40, state-specific variants) are the most common time-entry customization, and they're best implemented as a calculation run at approval or at a nightly batch process rather than recalculated live on every keystroke in the entry grid — overtime depends on a full week's entries, which aren't necessarily complete while the employee is still entering Tuesday's hours.

Don't compute overtime from a single day's entry

A validation that fires on each time card row and tries to compute overtime immediately will get it wrong whenever entries are submitted out of order (which is common — people don't always fill in their week Monday-first). Compute overtime as a rollup over the full pay period once entries are complete or at approval time, not incrementally per row.

A realistic scenario: daily and weekly overtime

A frequent request: apply daily overtime (anything over 8 hours in a single day pays at 1.5x) and weekly overtime (anything over 40 total pays at 1.5x, with daily OT hours not double-counted toward the weekly threshold) — a specific interaction that's easy to get subtly wrong.

C# · OVERTIME CALCULATION
public class TimeCardOvertimeCalculator
{
    public virtual (decimal regular, decimal overtime) CalculateWeek(IEnumerable<EPActivity> weekEntries)
    {
        decimal totalRegular = 0, totalOT = 0;
        var byDay = weekEntries.GroupBy(a => a.Date.Value.Date);

        foreach (var day in byDay)
        {
            decimal dayHours = day.Sum(a => a.TimeSpent ?? 0);
            decimal dayOT = Math.Max(0, dayHours - 8m);
            decimal dayRegular = dayHours - dayOT;

            totalOT += dayOT;
            totalRegular += dayRegular;
        }

        // Weekly OT applies on top of regular hours already counted,
        // not on hours already classified as daily OT.
        decimal weeklyOTThreshold = Math.Max(0, totalRegular - 40m);
        totalOT += weeklyOTThreshold;
        totalRegular -= weeklyOTThreshold;

        return (totalRegular, totalOT);
    }
}

This is a simplified illustration of the daily-then-weekly cascading logic — actual payroll rules vary significantly by jurisdiction (some states require daily OT past a different threshold, some have double-time rules past 12 hours), so this needs to be parameterized per the client's actual policy rather than treated as a universal formula.

Project billability interactions

When a time entry is tagged to a billable project task, the hours flow into PMTran and eventually the project billing engine — overtime premium handling needs an explicit decision here: does the client bill the client at a blended rate, a straight rate with OT absorbed internally, or pass through the OT premium? This is a business decision that needs to be nailed down before writing the calculation, not inferred from the code.

Testing considerations

Test a full pay period with entries submitted out of chronological order, at least one day crossing the daily OT threshold, and a week crossing the weekly threshold — and test the interaction of both in the same week, since that's where the subtlest bugs live, exactly as illustrated in the calculation above.

Wrapping up

Time entry customization is a payroll problem wearing an ERP UI — get the overtime cascade logic (daily before weekly, no double counting) and the project-billing interaction explicitly agreed before writing code, and compute overtime as a period rollup rather than a live per-entry calculation.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.