Skip to main content
Skip table of contents

Payroll Contract Transactions

Earnings vs. Pay Transactions

Earning and pay are recorded through two separate hour codes. The earnings are set up on calendars and schedules defined for the type of work covered by the contract. Such earnings are said to be “patched in," which means that they are automatically derived by the Patch by Pay Line payroll process based on an employee's calendar and schedule. The earnings are recorded at a very detailed level, using specific dates, hour codes, number of hours, dollars and hourly rate for each entry. The pay, in contrast to earnings, is a lump sum dollar amount that is calculated for each pay period.

Contract Earnings

In the standard setup, default earnings are accounted for in a patching process called Patch by Pay Line, which is a pre-process to the payroll calculation (Force Calc). Patch by Pay Line reads each of the employee's pay assignments and builds a special timecard batch based on the calendars and schedules assigned to each employee. Refer to Patch by Pay Line - PYTCDTPT for more information.

Begin/End Dt (Effective): Must "touch" the period dates to be considered active.

Patch Beg/End: Date range over which earnings are patched in.

Paid Beg/End: Date range over which the salary (pay) is considered active. If these dates are blank, the effective dates are used.

Patch Type: Patch Type Code on the pay assignment controls options for the number of hours patched.

  • H – Use the number of hours stated on the pay assignment.

  • P – Use the hours derived from the work schedule and prorate by the Calendar Percent. (Calendar Percent default is 1.00.)

  • F – Prorate the scheduled hours by the Effort field on the pay assignment.

  • D – Patch hours and dollars per day using the Hrs/Day and Dol/Day values on the pay assignment. Dollar amount is patched directly rather than being calculated as hours multiplied by rate.

  • N – Do not use patching for this pay assignment.

Generate Earnings via the Patch by Pay Line Process

  • Operates at the level of each separate pay assignment, not at the contract level. Contract earnings are derived later by summing the earnings on each pay line.

  • Each pay assignment may have a separate Calendar and Work Schedule attached.

  • Patched hours are reduced by the number of exception hours (sick, vacation, etc.).

  • Patch entries for earnings hours and dollars are written as timecard entries.

  • Entries are written to a standard batch name "PATCHnnnnnnn" where "nnnnnnn" is the current pay period. Each time the process runs, all patching records for an employee are deleted and re-created.

  • Because the entries are timecards, there are no Force Calc spreading issues.

  • The process employs cumulative rounding logic to avoid rounding errors where hourly rates are used. That means that all the detail entries will add up to the right total dollars in each period, for both salary and rate types of hour codes.

Earnings Correction Utility

Use the Earnings Correction utility to generate earnings on a contract if earnings patched do not equal the Total Contract Value (TCV). The periods remaining to earn must be zero and the latest Calc End date on the Contract must be prior to the period begin date. The mask to generate the earnings correction is PYUTRTEC. The earning correction transactions are written to a standard batch name "CTENDnnnnnnn" where "nnnnnnn" is the current pay period. Each time the process runs, all earnings correction records for an employee are deleted and re-created.

Question Prompts
Enter the Period as YYccIII (YY=Year, cc=Pay Cycle, III=Number): Enter the unpaid period currently being processed. The earnings correction batch will be written to this period.

How would you like employees selected? ID - Select by ID, PC - Select entire pay cycle, SC - Select by Selection Criteria. Standard Selection Criteria to run the process on only selected employees.

Please enter the Begin Date for periods to be included: The utility will look for contracts that end between the date entered above and a day prior to the Pay Period being processed (MM/DD/YYYY).

Exceptions

Exceptions such as sick or vacation time, are recorded as timecard entries and can reduce the patched hours accordingly. They affect Contract Earnings directly in order that they may post to GL on dedicated object codes.

Contract Pay

The regular contract salary paid out each period is controlled by an hour code within the employee's Pay Class. Unless there are changes made to the basic contract agreement, the salary amount will remain constant each pay period from beginning to end.

The Calculation of Pay on the HR Pay Assignment Page

The basic calculation to arrive at a per-period pay amount is:

Total Contract Value / Total Contract Pay Periods

In this calculation, the Total Contract Value (TCV) is simply the sum of all anticipated earnings for all pay assignments for the contract. By default, the TCV is calculated by reading the calendar and counting the number of paid days and multiplying that amount by hours per day and the hourly rate. Configuration is available in the HRPY/CNTRCTIDcommon code to use the actual days from each HR pay assignment so that an overridden number of days can be specified. Note: the calendar will be used if the contract change occurs mid period to count the number of days into the period an assignment is active.

This pay calculation is fairly simple and easy to monitor if the contract remains unchanged throughout its life. Unfortunately, that is probably the exception rather than the rule. More often than not, a contract will change in some essential way before it is finished. Errors in setup may be detected part-way into the contract. Pay rate changes may be negotiated, often in a retro situation. Early terminations, emergency leave, or other changes can have a material effect on the Total Contract Value, and as a result the contract needs to shift.

A general formula to account for mid-year corrections or changes is the following:

(Total Contract Value – YTD Paid) / Remaining Periods

On a contract change, the formula for per period paid diverges between contract calculation options. The total paid on the contract will hit the Total Contract Value by the time the contract ends, but the timeframes in which the salary amounts are paid out will differ.

Contract Calc Options

Calc Option

Description

23

(Level pay) - Calculates even payments for the remainder of the contract.

25

(Prorated pay) - Assumes PY will prorate the salary found on the pay assignments that stop and start in the period. Payments after the period with the mid period split will have level payments, but the period containing the mid period split will calculate a prorated salary amount base on amount of time each pay assignment was active over the paid days in the period.

26

(Level pay with one time pay adjustment) - Sets the per period pay to a target amount (base per period by default) and writes out a one-time up-front pay adjustment in order to pay out the full total contract value.

27

(Level pay with positive one time pay adjustment) - Sets the per period pay to a target amount if the level pay calculated is more than the base per period amount. If the base per period amount is used, then a one-time up-front pay adjustment is made in order to pay out the full total contract value.

How to Select a Calc Option

Calc option 23 is used if the unpaid earnings are always divided equally over the remaining periods to pay.

Calc option 25 is used if the salary is to be prorated in the period of the change.

Calc option 26 is used if the per period pay amount should always hit a certain target amount. Use this calc option if the intent is to have all employees on a particular pay index see the same per period gross pay amount, regardless of whether the employee started the contract year on the given pay index. The target amount will default to the base per period pay which is a projected amount based on full contract year values, but this is configurable through HRPY/CNTRCTID common code settings.

Calc option 27 is used if the per period pay amount should never be higher than a certain target amount. Use this calc option if the intent is to not have an employee's gross amount decrease the following year if the employee stays on the same pay index. The target amount will default to the base per period pay which is a projected amount based on full contract year values, but this is configurable through HRPY/CNTRCTIDcommon code settings. By default, the one-time adjustment will be written to the 5th Misc Value field on the HR pay assignment, but this is configurable through HRPY/CNTRCTIDcommon code settings.

Additional Configurable Functionality

Pay Follows Earnings Pay Line

Contract Pay may follow the same pay line of the Contract Earnings. In order to maintain the same BusinessPlus Contract ID when the pay line data changes mid contract (typically GL information), set common code HRPY/CNTRCTIDAssociated Description 2 to "PAY FOLLOWS EARNINGS." The HR pay assignment will do additional calculations and write out the escrow amount* and the moved escrow amount**, to specified Misc Value fields on the HR pay assignment.

Escrow amount: This is the escrow amount that will follow the pay line and is written to a Misc Value field on the HR Pay assignment page. It is specified in Associated Value 3 of the HRPY/CNTRCTIDcommon code and defaults to Misc Value field 5 of HR pay assignment.
Moved escrow amount: This is the amount of escrow that has been moved from the pay line and is to be paid on another pay line. The amount will be written to a Misc Value field on the HR Pay assignment page. It is specified in Associated Value 4 of the HRPY/CNTRCTIDcommon code and defaults to Misc Value field 4.

Contract Payout on Early Contract Stop

The escrow amount to be paid on a contract ending will be written to a specified Misc Value field on the HR Pay Assignment page. The Misc Value field is specified in Associated Value 3 of the HRPY/CNTRCTIDcommon code and defaults to Misc Value field 5. In order to flag a contract as an Early Stop, set the Payout Type field to PF (used for a lump sum payout of the remaining escrow) or PS (used to spread the remaining escrow over the original pay date timeframe). With the Payout Type field set, it will be required that the Paid Dates be set to the Original Pay Dates, and the Contract Dates will be set to the Original Calc Dates. End the contract by changing the Pay and Calc dates to reflect the contract stop date. Refer to Early Contract Stops for detailed steps in stopping a contract early.

Generate Contract Pay via the Patch by Pay Line Process

The Patch by Pay Line process will generate contract pay and write paid transaction out to the PATCH timecard set. The pay calculation operates at the pay assignment level. Contract pay is derived in the recompute process by summing the Contract Pay on each pay line containing the contract ID. The HR Pay Assignment page is responsible for coming up with the per period pay amount on each pay assignment on a contract. Once these amounts are sent to Payroll, the Patch by Pay Line process and the Retro Utility uses the salary amounts found on the PY pay assignments as the amounts that should have been paid in a given period.

Payroll Processing of Contract Changes

Level Payments on mid period contract changes (calc option 23): This option will pay the full amount found on the last pay assignment active in the period.

Prorated Payments on mid period contract changes (calc option 25): This option will take the salary amount on the pay assignment and multiply it by the number of paid days covered by the assignment in the period divided by the total number of paid days in the period.

Upfront pay adjustment on contract changes (calc option 26 and 27): Upfront pay adjustment amounts are determined by the calculation on the HR Pay Assignment page and are written to a specified Misc Value on the pay assignment. The upfront adjustment amount will be paid in the period in which the assignment begins. If the payout amount changes based on retroactive calculation changes in HR, the Retro Utility will identify and generate retroactive pay transactions for the difference.

Pay follows Earnings line on contract changes: Escrow pay amounts are determined by the calculation on the HR Pay Assignment page and are written to a specified Misc Value on the pay assignment. The escrow amount will be paid in the periods covered by the Paid Date timeframe. If the escrow amount changes based on a retroactive calculation changes in HR, the Retro Utility will identify and generate a retroactive pay transaction for the difference.

Early contract stop and payoff options: The contract payout amount is determined by the calculation on the HR Pay Assignment page and is written to a specified Misc Value on the pay assignment. The payout amount will be paid in the periods covered by the Paid Date timeframe, if the contract is marked with a PS If the contract is marked with a PF as the payout type option, the paid dates entered on the HR pay assignment will not be sent to payroll and the payout will occur in the final period covered by the pay assignment effective dates. If the payout amount changes based on retroactive calculation changes in HR, the Retro Utility will identify and generate retroactive pay transactions for the difference. Refer to Contract Stops for detailed steps in stopping a contract early.

Supplemental Payroll Processing

Special processing is performed by Patch by Pay Line in supplemental pay periods. Supplemental pay periods are all periods where the Type field is not set to REG. The Type field should be set to blank (or SUPP). Set the supplemental pay period date range to match the regular pay period.  Run the Patch by Pay Line mask (PYTCDTPT) to generate the difference between what was paid in the regular pay period and what should have been paid. The process will find contract changes made after the regular pay period was paid and generate PATCH timecard transactions for any differences found.

Putting a "1.00000" in Associated Numeric Value 3 of the PYFG/PY214C common code will indicate to the Patch by Pay Line process to patch the full pay and earnings without looking for paid transactions in the pay period timeframe.

LWOP (Leave Without Pay) Processing

The LWOP Request amount entered and processed from timecards is added to the LWOP Balance. The LWOP Taken transaction generated will be no greater than the Contract Pay available.

Lump Sum LWOP Payout

An attempt will be made to take the entire LWOP Balance in the period being processed. The LWOP Balance amount that exceeds the Period Contract Pay amount will remain in the LWOP Balance.

Spread LWOP Payout

An attempt will be made to take the LWOP Balance amount and divide it by the number of periods left to pay on the contract. This will result in smoothing effecting of the pay reduction. The LWOP Balance amount left over will remain in the LWOP Balance.

Lump Sum LWOP Payout

An attempt will be made to take the entire LWOP Balance in the period being processed. The LWOP Balance amount that exceeds the Period Contract Pay amount will remain in the LWOP Balance.

Period 1 October:

Contract Pay (September)

= $4753.75

LWOP Request (Vol Dock)

= $6068.62

LWOP Balance (pre taken)

= $0.00

LWOP Taken

= $4753.75

LWOP Balance (post taken)

= $1314.87

Gross Pay

= $0

Lump Sum LWOP Balance Recovery

Each month, the LWOP taken calc code will look to see if any LWOP balance exists. If so, it will continue to reduce the contract pay by any LWOP balance until the LWOP balance is zero.

Period 2 November:

Contract Pay (October)

= $4753.75

LWOP Request

= $0

LWOP Balance (pre taken)

= $1314.87

LWOP Taken

= $1314.87

LWOP Balance (post taken)

= $0

Gross Pay

= $3438.88

Calc Code Debug

E99999 , 3135: --------------------

E99999 , 3135: CNFC.ID 01/2010-11

E99999 , 3135: Period Pay: 0000000000004753.75

E99999 , 3135: LWOP Bal : 0000000000001314.87

E99999 , 3135: Taken : 0000000000001314.87

E99999 , 3135: --------------------

LWOP Effect on the Contract Accumulator Record (PYUPCX)

Total Contract Value is reduced by LWOP Request.

Total Earnings (Total Deposits) is reduced by LWOP.

Regular Earnings Amount relects the full patched Earnings amount. To reduce by LWOP, the LWOP request hour must add to the Patch Pay and Hour bases.

Leave Without Pay Balance is the LWOP Balance (Request - Taken)

Leave Without Pay Amount is the LWOP Request (and/or LWOP Both) Total.


LWOP Taken:

  • Subtracts from LWOP balance.

  • Subtracts from the Regular Pay bucket.

  • Subtracts from Withdraws (corresponds with the Total Pay fields on the right side of the tab and page).

LWOP Request:

  • Adds LWOP balance from the Regular Pay bucket.

  • Does NOT subtract Regular Earning bucket.

  • Adds to the LWOP Earn bucket (Appears below Total Earnings on the left side of the tab and page.

  • Subtracts from Deposits (corresponds with the Total Earnings fields on the right side of the tab and page).

  • Subtracts from TCV.

  • Total Earnings (in the left column of the tab and page) is overstated by the LWOP Earn bucket (unless LWOP directly affects the patching of earnings).

LWOP Both:

  • No effect on LWOP balance.

  • Subtracts Regular Pay bucket.

  • Does NOT subtract Regular Earning bucket.

  • Adds to the LWOP Earn bucket (appears below Total Earnings on the left side of the tab and page).

  • Subtracts from the Withdraws and Deposits (corresponds with the Total Pay and Total Earnings fields on the right side of the tab and page)

  • Subtracts from TCV.

  • Total Earnings (in the left column of the tab and page) is overstated by the LWOP Earn bucket (unless LWOP directly affects the patching of earnings)

LWOP Taken Calc Code (Lump Sum Payout)

<< Contract LWOP Taken >>
CVAR9 := "DEBUG"
NVAR1 := 0
DO
NVAR1 := NVAR1 + 1
LOAD(CTFC.CLS,NVAR1)
IF MSCX.STATUS = "FAILED"
GOTO LABEL1
ENDIF
IF CTFC.WOPBAL <> 0
IF CTFC.WOPBAL > CTFC.PYTDPD
CTFC.CDHPAY := CTFC.PYTDPD
ELSE
CTFC.CDHPAY := CTFC.WOPBAL
ENDIF
ENDIF
IF CVAR9 = "DEBUG"
WARN("--------------------------------")
WARN("CNFC.ID ",CTFC.CTID)
WARN(" Period Pay:", CTFC.PYTDPD)
WARN(" LWOP Balance:", CTFC.WOPBAL)
WARN(" Taken:", CTFC.CDHPAY)
WARN("--------------------------------")
ENDIF
MSCX.STATUS := "FLUSH"
LABEL1
UNTIL MSCX.STATUS = "FAILED"



On this page:


JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.