The situation
A fabrication studio tracks the cost of every job as a NetSuite project. Its shop-floor staff clock in and out on the payroll provider's time clock, which runs on UKG Ready. The time clock did not know about NetSuite's projects, and NetSuite did not see the hours, so job costing ran a step behind and depended on re-keying timesheets.
What we built
A two-way REST integration in three Map/Reduce jobs and a User Event.
Projects out as cost centres. A job takes active NetSuite projects and their tasks and creates them as cost centres in the payroll system, in a parent and child tree that mirrors project and task. When a project is renamed, re-coded or changes status, the job updates the matching cost centre. Finished or held work is hidden from the time clock instead of deleted, so past hours keep their reference. A task counts as active only if its department is active. A User Event on the project keeps task and department values in step when a project changes, because NetSuite clears them.
People and hours in. A second job reads employees from the payroll system. It links them to existing NetSuite employees, creates new hires, updates changed details, and marks terminated staff inactive with their release date. It never creates a terminated employee. The job then reads approved time entries and creates NetSuite time records against the right project, task and department.
The two systems compared. A third job compares cost centres and employees in both systems and emails the differences, so a mismatch shows up before payroll closes.
What it does now
Staff clock time against the job they are working on, from the same list of jobs NetSuite has, and those hours reach the project without re-keying. The error email reports invalid time entries, for example hours against a cost centre that no longer maps to a project, with enough detail to fix them at the source.
Under the hood
- The payroll API token is cached for 50 minutes. On an authentication failure the cache is cleared and the call retried once.
- Cost centres carry the NetSuite id as their external id, which makes the push an upsert.
- Visibility changes always send the time-allocation flag, because the payroll API resets it otherwise.
- Terminated employees become inactive in NetSuite and are never created.
- The business can run the comparison job at any time as a reconciliation check.
- Every job ends with an emailed summary of what failed and why.