A Guide to Running Payroll

The Payroll Extraction subdomain provides a set of API operations that allow you to extract payroll and accrual data simply and quickly.

Getting started with Payroll

The payroll and accrual workflow is divided into two parts:

Stage Payroll

Payroll can be staged as part of an API or Boomi-based integration. The process starts with the Stage Payroll Asynchronously (POST /v1/commons/payroll/staging/async) API payroll or accrual asynchronous staging API operation, which allows you to specify a pay group, dates, and other payroll or accrual parameters. Each request receives a unique identifier called a requestId. The system tracks the status of each request, which can be queried using the Retrieve Payroll Staging Asynchronous Request Status by ID (GET /v1/commons/payroll/staging/{requestId}/status) operation. The Payroll Staging and Payroll Export resources follow our standard asynchronous request structure:

Payroll Staging

OperationMethodURL EndpointPurpose
Stage Payroll AsynchronouslyPOST/v1/commons/payroll/staging/asyncCreate asynchronous job
Retrieve Payroll Staging Asynchronous Request Status by IDGET/v1/commons/payroll/staging/{requestId}/statusRetrieve status of a single asynchronous job
Retrieve Asynchronous Payroll Extraction Details by IDGET/v1/commons/payroll/staging/{requestId}/detailsRetrieve details about a single asynchronous job

Payroll Export

OperationMethodURL EndpointPurpose
Export Payroll AsynchronouslyPOST/v1/commons/payroll/export/asyncCreate asynchronous job
Retrieve Payroll Export Asynchronous Request Status by IDGET/v1/commons/payroll/export/async/{exportId}/statusRetrieve status of a single asynchronous job
Retrieve Summary of Asynchronous Payroll Export JobsGET/v1/commons/payroll/export/asyncRetrieve the statuses of all asynchronous requests
Retrieve Payroll Export Asynchronous Response Payload by IDGET/v1/commons/payroll/export/async/{exportId}/responseRetrieve the response body for a completed asynchronous job

The Stage Payroll Asynchronously operation extracts data from the system based on the parameters passed in the request. Once the data is assembled, the status of the asychronous job changes to completed.

Export Payroll

Once generated, the integration extracts exported payroll or accrual data based on the request ID using the streaming or asynchronous Payroll Export operations. Based on available staging table columns for payroll or accrual data (refer to Pre-defined payroll staging columns and Pre-defined accrual staging columns for available columns), the call specifies a valid SQL query containing data columns based on your requirements with or without headers and footers.

The integration uses the Retrieve Payroll Staging Asynchronous Request Status by ID](ref:retrieve-payroll-staging-asynchronous-request-status-by-id) (GET /v1/commons/payroll/export/async/{exportId}/status) operation to poll the status of your request. Once the status is completed, call the Retrieve Payroll Export Asynchronous Response Payload by ID (GET /v1/commons/payroll/export/async/{exportId}/response) operation to extract the data according to your needs. This operation supports various output formats, including CSV, JSON, a specific filename, a compression option, and so on.

Pre-defined configuration data

The Payroll Extraction operations provide configuration data elements containing payroll and accrual staging columns that are already part of the system configuration. You can edit some pre-defined configuration data to suit your business needs.

Pre-defined payroll staging columns

The following is a list of the columns available for payroll staging.


prm_payroll_staging_data columns

Column Definition

Comments

id

bigint NOT NULL

unique id for this table

staging_request_id

bigint NOT NULL

id for the request

staging_datetime

timestamp without time zone NOT NULL

Current datetime

custom_parameter_1

text, 50 characters, nullable

Passed in from API request - allows integration to supply other indicators they want persisted in staging such as paygroup or timezone etc

custom_parameter_2

text, 50 characters, nullable

Passed in from API request - allows integration to supply other indicators they want persisted in staging such as paygroup or timezone etc

person_id

bigint NOT NULL

actual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

person_num

character varying(15)

actual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

full_name

character varying(64)

actual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

first_name

character varying(30)

actual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

last_name

character varying(30)

actual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

middle_name

character varying(1)

aactual_total.apply_date within range passed in, actual_total.work_item_id=work_item_employee_assignment.work_item_id,work_item_employee_assignment.employee_id=wtkemployee.wtkemployeeid, wtkemployee.personid-person.personid

range_start_date

timestamp without time zone NOT NULL

Pass in start date for apply_date range

range_end_date

timestamp without time zone NOT NULL

Passed in end date for apply_date range

apply_date

timestamp without time zone NOT NULL


amount_type

character varying(50)

actual_total.paycode_id = Paycode.paycodeId paycode.paycodeamttypeid=paycodeamttype.paycodeamttypeid

hours_amount

bigint


days_amount

numeric(19,6)


money_amount

numeric(19,6)


wage_multiplier

numeric(16,6)

actual_total.paycode_id = paycode.paycodeId

wage_addition

numeric(16,6)

actual_total.paycode_id = paycode.paycodeId

effective_wage_rage

numeric(19,6)

guard against dividing by 0. Ignore if amount_type is money

paycode_id

bigint NOT NULL


paycode_name

character varying(50)

actual_total.paycode_id = paycode.paycodeId

paycode_mapped_output1

character varying(50)

from paycode mapping table

paycode_mapped_output2

character varying(50)

from paycode mapping table

paycode_mapped_output3

character varying(50)

from paycode mapping table

is_historical_correction

boolean


original_date

timestamp without time zone NOT NULL


original_payperiod_start

timestamp without time zone NOT NULL

payperiod.payruleid = effective payruleid for employee on original_date

original_payperiod_end

timestamp without time zone NOT NULL

payperiod.payruleid = effective payruleid for employee on original_date

include_in_totals

numeric(1,0)

Need to take the opposite value of already_paid to get the correct value for include_in_totals

worked_job

text

actual_total.orgjob_id=org_effective_node.org_node_id and applydate between effective dates

worked_job_mapped

text

from GL mapping table (worked_job)

worked_location_job_type_path

text

actual_total.orgjob_id=org_effective_node.org_node_id and org_effective_node.org_node_type_id=org_effective_node_type.org_node_type_id

worked_labor_level1_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level1_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level2_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level2_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level3_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level3_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level4_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level4_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level5_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level5_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level6_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level6_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_cost_center_name

description character varying(250)

actual_total.labor_account_id=laboracct.laboracctid

worked_cost_center_id

bigint

actual_total.labor_account_id=laboracct.laboracctid

worked_labor_level1_mapped

character varying(50)

from GL mapping table (worked_labor_level1)

worked_labor_level2_mapped

character varying(50)

from GL mapping table (worked_labor_level2)

worked_labor_level3_mapped

character varying(50)

from GL mapping table (worked_labor_level3)

worked_labor_level4_mapped

character varying(50)

from GL mapping table (worked_labor_level4)

worked_labor_level5_mapped

character varying(50)

from GL mapping table (worked_labor_level5)

worked_labor_level6_mapped

character varying(50)

from GL mapping table (worked_labor_level6)

worked_cost_center_mapped

character varying(50)

from GL mapping table (worked_cost_center)

signoffthrudtm

timestamp without time zone


employment_status

character varying(30)

personstatusmm.personid,employmentstatid/applydate between effective dates

primary_job

text

combhomeacct.orgnodeid=org_effective_node.org_node_id and applydate between effective dates for both tables

primary_job_mapped

text


home_location_job_type_path

text

combhomeacct.orgnodeid=org_effective_node.org_node_id and org_effective_node.org_node_type_id=org_effective_node_type.org_node_type_id

home_labor_level1_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level1_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level2_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level2_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level3_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level3_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level4_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level4_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level5_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level5_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level6_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level6_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_cost_center_name

description character varying(250)

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_cost_center_id

bigint

combhomeacct.laboracctid=laboracct.laboracctid and applydate between combhomeacct effective dates

home_labor_level1_mapped

character varying(50)


home_labor_level2_mapped

character varying(50)


home_labor_level3_mapped

character varying(50)


home_labor_level4_mapped

character varying(50)


home_labor_level5_mapped

character varying(50)


home_labor_level6_mapped

character varying(50)


home_cost_center_mapped

character varying(50)


base_wage_rate

numeric(16,6)

basewagerthist.employeeid=wtkemployee.employeeid and wtkemployee.personnum=person.personnum

currency_code

character varying(10)

currency.currencyid=currencyassignmnt.currencyid and currencyassignmnt.employeeid=wtkemployee.employeeid and wtkemployee.personnum=person.personnum

payrule

character varying(50)

assignpayrule.employeeid,payruleid applydate between effective dates

employment_term

character varying(50)

empgrpschedmm.employeeid,grpscheduleid apply date between effective dates/groupschedule.contractsw=1

hire_date

timestamp without time zone


badge_number

character varying(50)

Person.personid=badgeassign.personid and actual_total.apply_date between basdeassign effective dates

worker_type

character varying(50)

Person.personid= wtkemployee.personid and wtkemployee.workertypeid=workertype.workertypeid

timezone

character varying(30)

Person.personid= wtkemployee.personid timzone.timezoneid=wtkemployee.timezoneid

last_total_time

timestamp without time zone

Person.personid = totaleventts.personid

last_total_change_time

timestamp without time zone

Person.personid = totaleventts.personid

person_custom_field1_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field1_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field2_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field2_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field3_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field3_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field4_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field4_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field5_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field5_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field6_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field6_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field7_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field7_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field8_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field8_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field9_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field9_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field10_name

character varying(30)

customdatadef.customdatadefid = personcstmdata.customdatadefid

person_custom_field10_value

character varying(2000)

customdatadef.customdatadefid = personcstmdata.customdatadefid

Pre-defined accrual staging columns

The following is a list of the columns available for accrual staging.

prm_accrual_staging_datacolumns Columns definition
staging_request_id bigint NOT NULL
staging_datetime timestamp without time zone NOT NULL
custom_parameter_1 character varying(50)
custom_parameter_2 character varying(50)
person_id bigint NOT NULL
person_num character varying(15)
range_start_date timestamp without time zone NOT NULL
range_end_date timestamp without time zone NOT NULL
accrual_code_name character varying(50) NOT NULL
accrual_amount_type character varying(10) NOT NULL
available_starting_balance numeric(19,6)
available_ending_balance numeric(19,6)
vested_starting_balance numeric(19,6)
vested_ending_balance numeric(19,6)
probationary_starting_balance numeric(19,6)
probationary_ending_balance numeric(19,6)
accrual_output_1 character varying(50)
accrual_output_2 character varying(50)
accrual_output_3 character varying(50)
*accrual_taking_sum numeric(19,6)
accrual_earnings_sum numeric(19,6)
*accrual_reporting_period_taking_sum numeric(19,6)
accrual_reporting_period_earning_sum numeric(19,6)

Note: Accrual Taking should be a positive number. Accrual Taking does support a negative taking which would be a taken credit. A historical correction is one example. You must perform an activity to negate the operation on the respective field's sign.