Sunday, 22 February 2026

Oracle Cloud Payroll - US Retiree Payroll Configuration

US RETIREE PAYROLL IN ORACLE CLOUD HCM — MUST-DO CONFIGURATION

This article is designed to help Oracle Cloud HCM practitioners implement US retiree payroll in a clean, auditable way. It focuses on practical configuration choices, common setup gaps, and testable outcomes—so teams can enable learning, reduce rework, and deliver reliable payroll operations.

This checklist is based on hands-on implementation patterns and guidance from Oracle documentation/support material, including:
  • Oracle Support Document ID 2461709.1 — “Oracle Fusion Human Capital Management for RETIREES US: Implementation and Use (v1.9)”
  • Oracle Cloud Human Capital Management for the United States: How do I perform tax filing through a third-party? KB160976
  • Audience: Payroll implementers, HCM functional consultants, payroll admins supporting US retiree pay
  • Scope: US retirees paid via Oracle Cloud Payroll (commonly pension/annuity payments; often reported via 1099-R depending on your program design)

————————————————————————————————————

Retiree payroll has a few “small” setup decisions that create big downstream impact: tax card creation, TRU/PSU structure, registrations, reporting card associations, and address quality. If you get right early, year-end, reconciliation, and ongoing maintenance become predictable.

————————————————————————————————————

SECTION A — FOUNDATION (NON-NEGOTIABLE)

If you are already payroll customer running employee's payroll then this would be already configured.

A1) Set the United States Selected Extension correctly

  • Confirm your US “Selected Extension” setting aligns with how you plan to process retirees (HR-only vs payroll-enabled configuration).

A2) Address Validation + geographies maintenance (strongly recommended)

  • Enable Address Validation (if your governance permits).
  • Establish an operational cadence to refresh geographies (as applicable).

————————————————————————————————————

SECTION B — ORG STRUCTURE (BUILD RETIREE BOUNDARIES EARLY)

B1) Separate retiree PSUs from employee PSUs (recommended baseline)
  • Create retiree Payroll Statutory Units (PSUs) separately from employee PSUs where your business/legal reporting model supports it.
B2) Create retiree TRUs separately; lock down distribution code governance
  • Create retiree TRUs separately from employee TRUs.
  • If your program requires different 1099-R distribution codes, segment TRUs accordingly.
  • Governance rule: do not change TRU’s 1099-R distribution code after creation—create a new TRU if the code changes.
        Manage LRU HCM Information => Enter the distribution code






————————————————————————————————————

SECTION C — TAX REGISTRATIONS (REQUIRED FOR STABLE PAYROLL PROCESSES)

This configuration is same as your regular employee(Non-Retiree) payroll configuration.

C1) US Federal registration at LRU level (FEIN)

  • Create the US Federal Tax registration at the LRU level.
  • Enter the Employer FEIN.

C2) State registrations (as applicable)

  • Populate state registrations for jurisdictions where you withhold/report, based on your compliance model and filing responsibilities.

————————————————————————————————————

SECTION D — TRU CALCULATION RULES (PUT WITHHOLDING LOGIC IN THE RIGHT PLACE)

This configuration is same as your regular employee(Non-Retiree) payroll configuration.

D1) Create TRU calculation rules card

Create “Calculation Rules for Tax Reporting and Payroll Statutory Unit” at the TRU level.

D2) Flat-rate override governance (if your retiree program uses it)

Recommended override priority (high → low)
1. Retiree person tax card overrides
2. TRU-level overrides
3. Tax engine defaults

Note –

Retiree payments that are subject to 1099-R rules are not subject to SUI, SDI, FLI, Social Security, or Medicare taxes. Therefore, the payroll process does not calculate them.

————————————————————————————————————

SECTION E — CONSOLIDATION GROUP AND PAYROLL GROUP

E1) It would be better to create separate consolidation group and payroll definition for retiree payroll processing

————————————————————————————————————

SECTION F — RETIREE TAX CARDS (ENSURE THEY AUTO-CREATE AND STAY CORRECT)

F1) Confirm the retiree tax card model
  • Validate the retiree tax card behavior for your program (commonly “Tax Withholding for Pensions and Annuities”).
F2) Validate auto-creation is working (don’t assume)

F3) State-tax edge case validation

When you onboard or convert employee to retiree; you will see below calculation created and TRU association created auto




————————————————————————————————————

SECTION G — REPORTING INFORMATION CARD (OFTEN MISSED, HIGH IMPACT)

G1) Confirm TRU components are associated to the correct assignment

  • Validate that Reporting Information Card components created per TRU are correctly associated to the retiree assignment number—especially when multiple TRUs exist.


————————————————————————————————————

SECTION H — RETIREE ASSIGNMENT (MINIMUM REQUIRED FIELDS)

This data point is same as your regular employee(non-retiree) payroll data point.

H1) Retiree must have a payroll-eligible assignment

  • Payroll relationships are assigned
  • Ensure retiree assignment is Active and Payroll Eligible

————————————————————————————————————

SECTION I — HOME ADDRESS, LOCATION AND WFH FLAG FOR RETIREES (WHAT IT MEANS IN ORACLE)

Key point (clear definition)

Retirees aren’t “working,” but Oracle still requires a Work Location on the retiree assignment. For WFH/Remote retirees, treat Work Location as a required data field for consistency and reporting—not as a local tax driver.

I1) All Retirees must have valid US Home Address for payroll processing. Retirees can have overseas mailing address for communication.

I2) Create a dedicated retiree remote location and assign it to all retirees and check 'Work From Home' flag for them.




————————————————————————————————————

SECTION J — PAYMENTS (DIRECT DEPOSIT MUST BE OPERATIONALLY SUPPORTED)

This data point is same as your regular employee(Non-Retiree) payroll data point.

J1) Run prerequisite process for new retirees
  • Run “Maintain Party and Location Current Record” before entering personal payment methods (for newly onboarded retirees).
J2) Enter payment methods
  • Use “Manage Personal Payment Methods” to add direct deposit details.

————————————————————————————————————

SECTION K — KNOWN CONSTRAINTS (DESIGN AROUND THEM EARLY)
  • Local taxes for retirees may not be supported in retiree processing models; plan your retiree withholding accordingly.
  • Involuntary deductions may not be supported for retiree processing; define an alternative approach if required.
  • Confirm territory/jurisdiction scope early if you have retirees outside standard US states.

————————————————————————————————————

Finally Let's add earning elements and run QuickPay to see the results








————————————————————————————————————

Disclaimer: 

The checklist provided here focuses on foundational setup patterns and common “must-do” configurations for US retiree processing in Oracle Cloud HCM. Actual implementations can vary by retiree plan design, bargaining agreements, legal/tax requirements, and reporting needs. Most projects also require additional configuration, including elements and balance definitions, fast formulas, eligibility, costing rules, payroll calendars, retro and correction processes, and integrations with third-party or downstream systems (e.g., tax services, payment files, benefits providers, and financial/GL systems) to deliver end-to-end processing and statutory reporting.

Friday, 21 July 2017

Oracle Cloud Benefits - Person Change Life Event Fast Formula

Person Change Life Event Fast Formula

- Recently i had requirement of triggering life event in below cases.
(1) Change of working hours >= 30
(2) Change of working hours < 30
(3) Employees' termination or Death
(4) Salary Change

Below are the fast formulas that i have used to achieve the requirement.

(1)

/*****************************************************************************
FORMULA NAME: XX_CHG_WORKING_HOURS_GT_30
FORMULA TYPE: Person Life Changes

BEN_ASG_IN_NORMAL_HOURS  = New Value
BEN_ASG_IO_NORMAL_HOURS  = Old Value
*******************************************************************************/
INPUTS ARE BEN_ASG_IN_NORMAL_HOURS(text),BEN_ASG_IO_NORMAL_HOURS(text)

Default for BEN_ASG_IO_NORMAL_HOURS is '999'
Default for BEN_ASG_IN_NORMAL_HOURS is '999'

l_return = 'N'

IF (to_number(BEN_ASG_IO_NORMAL_HOURS) <> to_number(BEN_ASG_IN_NORMAL_HOURS) AND to_number(BEN_ASG_IO_NORMAL_HOURS)>= 30 AND to_number(BEN_ASG_IN_NORMAL_HOURS)< 30)
then
(l_return = 'Y') 
else 
(l_return = 'N')

return l_return


(2)


/*****************************************************************************

FORMULA NAME: XX_CHG_WORKING_HOURS_LT_30
FORMULA TYPE: Person Life Changes

*******************************************************************************/
INPUTS ARE BEN_ASG_IN_NORMAL_HOURS(text),BEN_ASG_IO_NORMAL_HOURS(text)

Default for BEN_ASG_IO_NORMAL_HOURS is '999'
Default for BEN_ASG_IN_NORMAL_HOURS is '999'

l_return = 'N'

IF (to_number(BEN_ASG_IO_NORMAL_HOURS) <> to_number(BEN_ASG_IN_NORMAL_HOURS) AND to_number(BEN_ASG_IO_NORMAL_HOURS)< 30 AND to_number(BEN_ASG_IN_NORMAL_HOURS)>= 30)
then
(l_return = 'Y') 
else 
(l_return = 'N')

return l_return


(3)

/*****************************************************************************

FORMULA NAME: XX_TERMINATION_LE
FORMULA TYPE: Person Life Changes

*******************************************************************************/
DEFAULT FOR PER_PER_ENTERPRISE_TERMINATION_ACTION_CODE is 'X'

L_RETURN='N'
IF (PER_PER_ENTERPRISE_TERMINATION_ACTION_CODE = 'TERMINATION' OR PER_PER_ENTERPRISE_TERMINATION_ACTION_CODE = 'RESIGNATION' OR PER_PER_ENTERPRISE_TERMINATION_ACTION_CODE ='DEATH' ) THEN
L_RETURN='Y'
RETURN L_RETURN

(4)

/*****************************************************************************

FORMULA NAME: XX_SALARY_CHG_LE
FORMULA TYPE: Person Life Changes

*******************************************************************************/
inputs are BEN_SAL_IN_SALARY_AMOUNT(text), BEN_SAL_IO_SALARY_AMOUNT(text)
default for BEN_SAL_IN_SALARY_AMOUNT is '99999999'
default for BEN_SAL_IO_SALARY_AMOUNT is '99999999'
l_create_ptnl = 'N'
If (TO_NUMBER(BEN_SAL_IO_SALARY_AMOUNT) <> TO_NUMBER(BEN_SAL_IN_SALARY_AMOUNT))
THEN
( l_create_ptnl = 'Y' )
ELSE
( l_create_ptnl = 'N' )
return l_create_ptnl


Friday, 3 April 2015

Oracle Payroll Costing hierarchy

Oracle Payroll Costing Hierarchy


In oracle payroll costing can be set at 5 levels with below priority order.


- Payroll                    = Lowest
- Element Link
- Organization
- Assignment
- Element Entry        = Highest



Thursday, 14 August 2014

Query for attachments in oracle apps





You can get attached_document_id of approximate all applications transaction as shown below.

=============================================================

SELECT  fad.attached_document_id         attached_document_id
FROM    applsys.fnd_attached_documents   fad
WHERE   fad.entity_name                  = 'R_DOCUMENT_EXTRA_INFO'
AND     FAD.PK1_VALUE                    IN(SELECT  HDEI.DOCUMENT_EXTRA_INFO_ID  DOCUMENT_EXTRA_INFO_ID
                                            FROM    hr.hr_document_extra_info HDEI
                                           )
UNION
SELECT fad.attached_document_id          attached_document_id
FROM   applsys.fnd_attached_documents    fad
WHERE  fad.entity_name                   = 'PQH_SS_ATTACHMENT'
AND    fad.pk1_value                     IN(SELECT hat.transaction_id      transaction_id
                                            FROM   hr.hr_api_transactions  hat
                                            )
UNION
SELECT fad.attached_document_id          attached_document_id
FROM   applsys.fnd_attached_documents    fad
WHERE  fad.entity_name                   = 'AP_INVOICES'
AND    fad.pk1_value                     IN(SELECT aia.invoice_id      invoice_id
                                            FROM   ap.ap_invoices_all  aia
                                            )
UNION
SELECT fad.attached_document_id          attached_document_id
FROM   applsys.fnd_attached_documents    fad
WHERE  fad.entity_name                   IN ('PO_HEAD','PO_HEADERS')
AND    fad.pk1_value                     IN (SELECT pha.po_header_id   header_id
                                             FROM   po.po_headers_all  pha
                                             )
UNION
SELECT fad.attached_document_id           attached_document_id
FROM   applsys.fnd_attached_documents     fad
WHERE  fad.entity_name                    = 'OIE_HEADER_ATTACHMENTS'
AND    fad.pk1_value                      IN(SELECT  arha.report_header_id            report_header_id
                                             FROM    ap.ap_expense_report_headers_all arha
                                          )
UNION
SELECT fad.attached_document_id       attached_document_id
FROM   applsys.fnd_attached_documents fad
WHERE  fad.entity_name                = 'OKC_CONTRACT_DOCS'
AND    fad.pk2_value                  IN(SELECT ocd.business_document_id
                                         FROM   okc.okc_contract_docs ocd
                                          )
UNION
SELECT  fad.attached_document_id       attached_document_id
FROM    applsys.fnd_attached_documents fad
WHERE   fad.entity_name                = 'PO_LINES'
AND     fad.pk1_value                  IN(SELECT pla.po_line_id   po_line_id
                                          FROM   po.po_lines_all  pla            
                                          )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'OIE_LINE_ATTACHMENTS'
AND    fad.pk1_value                   IN(SELECT arla.report_header_id          report_header_id
                                          FROM   ap.ap_expense_report_lines_all arla
                                          )
UNION
SELECT fad.attached_document_id       attached_document_id
FROM   applsys.fnd_attached_documents fad
WHERE  fad.entity_name                = 'REQ_HEADERS'
AND    fad.pk1_value                  IN(SELECT prha.requisition_header_id    requisition_header_id
                                         FROM   po.po_requisition_headers_all prha
                                         )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 ='REQ_LINES'
AND    fad.pk1_value                   IN(SELECT prla.requisition_line_id     requisition_line_id
                                          FROM   po.po_requisition_lines_all  prla
                                          )
UNION
SELECT fad.attached_document_id         attached_document_id
FROM   applsys.fnd_attached_documents   fad
WHERE  fad.entity_name                  ='PO_SHIPMENTS'
AND    fad.pk1_value                    IN(SELECT plla.line_location_id     line_location_id
                                           FROM   po.po_line_locations_all  plla
                                           )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'IBY_PAY_INSTRUCTIONS_ALL'
AND    fad.pk1_value                   IN(SELECT pia.payment_instruction_id     payment_insruction_id
                                          FROM   iby.iby_pay_instructions_all   pia
                                          )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'PER_ABSENCE_ATTENDANCES'
AND    fad.pk1_value                   IN(SELECT to_char(paa.absence_attendance_id) absence_attendance_id
                                          FROM   hr.per_absence_attendances         paa
                                          )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'XX_LOOKUP_DOCUMENT_ENTITY'
AND    fad.pk2_value                   LIKE '%BBW%%'
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'PER_PEOPLE_F'
AND    fad.pk1_value                   IN(SELECT asg.person_id             person_id
                                          FROM   hr.per_all_assignments_f  asg
                                          )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'PAY_ELEMENT_ENTRIES_F'
AND    fad.pk1_value                   IN(SELECT peef.element_entry_id    element_entry_id
                                          FROM   hr.pay_element_entries_f peef
                                          )
UNION
SELECT fad.attached_document_id        attached_document_id
FROM   applsys.fnd_attached_documents  fad
WHERE  fad.entity_name                 = 'OTA_DELEGATE_BOOKINGS'
AND    fad.pk1_value                   IN(SELECT odb.booking_id             booking_id
                                          FROM   OTA.OTA_DELEGATE_BOOKINGS  ODB
                                          )


==================================================================

Once you have the attached_document_id

you can use below query


SELECT fd.* FROM FND_ATTACHED_DOCUMENTS FAD, FND_DOCUMENTS FD
WHERE FAD.DOCUMENT_ID=FD.DOCUMENT_ID;

based on datatype_id in fnd_documents

you can join with any of

,APPLSYS.FND_LOBS
,APPLSYS.FND_DOCUMENTS_SHORT_TEXT
,APPLSYS.FND_DOCUMENTS_LONG_TEXT

tables.



Wednesday, 23 July 2014

How to download attachment stored in fnd_lobs table.


How to download attachment stored in fnd_lobs table


-        -          Open employee’s record and click on attachment icon.


-      Attach any new document under category as show below.





Now you can see the attachment symbol.



Attachment will be stored in fnd_lobs table.

below are queries to identify the attachment record.

select * from fnd_attached_documents
where entity_name='PER_PEOPLE_F'
and pk1_value=33579
order by creation_date desc;


select * from fnd_documents
where document_id=2349427;

select * from fnd_lobs
where file_id=2990785;

Now if you download the attachment through pl/sql procedure.

prerequisite 

- server directory -  where you want to download the file - generally database tier
- read/write access on the that directory.
- proper privileges on UTL_file packages

you can below procedure to download above attachment.



CREATE OR REPLACE PROCEDURE APPS.xx_download_attachment
AS
   CURSOR cur_new_attmt
   IS
      SELECT fl.file_id, fl.file_name, fl.file_data,
             DBMS_LOB.getlength (fl.file_data) file_length
        FROM fnd_lobs fl
       WHERE fl.file_id =2990785;

   v_start           NUMBER             DEFAULT 1;
   v_bytelen         NUMBER             DEFAULT 32000;
   v_len_copy        NUMBER;
   v_raw_var         RAW (32000);
   v_output          UTL_FILE.file_type;
   v_inv_file_name   VARCHAR2 (100);
   v_position        NUMBER;
   v_first_rec       BOOLEAN            DEFAULT TRUE;
BEGIN
   v_position := 10;

   FOR rec_inv IN cur_new_attmt
   LOOP
      v_inv_file_name := NULL;
      v_inv_file_name := rec_inv.file_name;
      v_position := 20;
      -- define output directory AND OPEN THE file IN WRITE BYTE MODE
      v_output := UTL_FILE.fopen ('ODPDIR', v_inv_file_name, 'wb', 32760);
      v_position := 30;

      -- maximum size OF buffer parameter IS 32767 BEFORE
      -- which you have TO flush  your buffer
      IF rec_inv.file_length < 32760
      THEN
         UTL_FILE.put_raw (v_output, rec_inv.file_data);
         UTL_FILE.fflush (v_output);
      ELSE
         v_position := 40;
         v_start := 1;
         v_bytelen := 32000;
         v_len_copy := rec_inv.file_length;

         WHILE v_start < rec_inv.file_length AND v_bytelen > 0
         LOOP
            v_position := 50;
            DBMS_LOB.READ (rec_inv.file_data, v_bytelen, v_start, v_raw_var);
            v_position := 60;
            UTL_FILE.put_raw (v_output, v_raw_var);
            v_position := 70;
            UTL_FILE.fflush (v_output);
            v_start := v_start + v_bytelen;
            v_len_copy := v_len_copy - v_bytelen;

            IF v_len_copy < 32000
            THEN
               v_bytelen := v_len_copy;
            END IF;
         END LOOP;

         v_position := 80;
         UTL_FILE.fclose (v_output);
      END IF;

      v_position := 90;
      DBMS_OUTPUT.put_line (' File_name :' || rec_inv.file_name);
   END LOOP;
END xx_download_attachment;
/


=======================================================================


execute the procedure to download the attachment.


execute xx_download_attachment;

Note : 

-  'ODPDIR' is the directory name.

refer dba_directories for more detail.

select * from dba_directories;





Tuesday, 22 July 2014

How to change current session language


How to change current session language in oracle

select * from per_business_groups;

output : no rows selected.

sometime some views will not return any data because of current session language.
Language install in your application is 'US', but what if your current session language is 'GB' or 'AR'.

sometimes your current session language depends on the tool that you are using or some default setup.

Generally it returns 'US'.
=====================================

select userenv('LANG') from dual;

output : US

=====================================

If it's not then you can your current session language by using alter session command.

eg. For AR

alter session set NLS_LANGUAGE='ARABIC';

eg. For GB

alter session set NLS_LANGUAGE='ENGLISH';

eg. For US

alter session set NLS_LANGUAGE='AMERICAN';

=================================================================


How to Restrict Global Assignment EFF Values by Employee Legislation in Oracle Fusion HCM

How to Restrict Global Assignment EFF Values by Employee Legislation in Oracle Fusion HCM In global Oracle Fusion HCM implementations, one...