Skip to content

Commit fe9e10c

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
style(oracle-hcm): align expanded operations with CI formatting
1 parent daa123f commit fe9e10c

6 files changed

Lines changed: 1113 additions & 371 deletions

File tree

apps/sim/blocks/blocks/oracle_fusion_hcm.ts

Lines changed: 183 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,9 +1685,16 @@ export const OracleFusionHcmBlock: BlockConfig = {
16851685
id: 'processMode',
16861686
title: 'Process Mode',
16871687
type: 'dropdown',
1688-
options: [{ id: 'TIME_ENTER', label: 'TIME_ENTER' }, { id: 'TIME_SAVE', label: 'TIME_SAVE' }, { id: 'TIME_SUBMIT', label: 'TIME_SUBMIT' }],
1688+
options: [
1689+
{ id: 'TIME_ENTER', label: 'TIME_ENTER' },
1690+
{ id: 'TIME_SAVE', label: 'TIME_SAVE' },
1691+
{ id: 'TIME_SUBMIT', label: 'TIME_SUBMIT' },
1692+
],
16891693
value: () => 'TIME_ENTER',
1690-
condition: { field: 'operation', value: ['create_time_entry', 'update_time_entry', 'delete_time_entry'] },
1694+
condition: {
1695+
field: 'operation',
1696+
value: ['create_time_entry', 'update_time_entry', 'delete_time_entry'],
1697+
},
16911698
required: { field: 'operation', value: [] },
16921699
description:
16931700
'TIME_ENTER (default), TIME_SAVE, or TIME_SUBMIT. Requests process asynchronously; acceptance is not completion or approval',
@@ -1696,7 +1703,10 @@ export const OracleFusionHcmBlock: BlockConfig = {
16961703
id: 'changeReason',
16971704
title: 'Change Reason',
16981705
type: 'short-input',
1699-
condition: { field: 'operation', value: ['create_time_entry', 'update_time_entry', 'delete_time_entry'] },
1706+
condition: {
1707+
field: 'operation',
1708+
value: ['create_time_entry', 'update_time_entry', 'delete_time_entry'],
1709+
},
17001710
required: { field: 'operation', value: [] },
17011711
description: 'Tenant-configured audit change reason code',
17021712
},
@@ -1713,8 +1723,22 @@ export const OracleFusionHcmBlock: BlockConfig = {
17131723
id: 'timeRecordEventRequestId',
17141724
title: 'Time Record Event Request Id',
17151725
type: 'short-input',
1716-
condition: { field: 'operation', value: ['get_time_record_request', 'list_time_record_request_events', 'list_time_record_event_messages'] },
1717-
required: { field: 'operation', value: ['get_time_record_request', 'list_time_record_request_events', 'list_time_record_event_messages'] },
1726+
condition: {
1727+
field: 'operation',
1728+
value: [
1729+
'get_time_record_request',
1730+
'list_time_record_request_events',
1731+
'list_time_record_event_messages',
1732+
],
1733+
},
1734+
required: {
1735+
field: 'operation',
1736+
value: [
1737+
'get_time_record_request',
1738+
'list_time_record_request_events',
1739+
'list_time_record_event_messages',
1740+
],
1741+
},
17181742
description: 'Time record event request ID, as a positive decimal string',
17191743
},
17201744
{
@@ -1885,7 +1909,13 @@ export const OracleFusionHcmBlock: BlockConfig = {
18851909
if (rest.screenEntryValue === '') {
18861910
rest.screenEntryValue = undefined
18871911
}
1888-
for (const key of ['limit', 'offset', 'salaryAmount', 'measure', 'timeRecordVersion'] as const) {
1912+
for (const key of [
1913+
'limit',
1914+
'offset',
1915+
'salaryAmount',
1916+
'measure',
1917+
'timeRecordVersion',
1918+
] as const) {
18891919
if (typeof rest[key] === 'string') rest[key] = Number(rest[key])
18901920
}
18911921
for (const key of ['entryValues', 'bindings', 'timeAttributes'] as const) {
@@ -1905,66 +1935,178 @@ export const OracleFusionHcmBlock: BlockConfig = {
19051935
},
19061936
},
19071937
inputs: {
1908-
personNumber: { type: 'string', description: 'Worker person number, including any leading zeros; does not require current public-directory membership' },
1909-
payrollRelationshipId: { type: 'string', description: 'Payroll relationship ID, as a positive decimal string' },
1910-
payrollAssignmentId: { type: 'string', description: 'Payroll assignment RelationshipGroupId, not the HR AssignmentId; positive decimal string' },
1911-
assignedPayrollId: { type: 'string', description: 'Assigned payroll ID, as a positive decimal string' },
1938+
personNumber: {
1939+
type: 'string',
1940+
description:
1941+
'Worker person number, including any leading zeros; does not require current public-directory membership',
1942+
},
1943+
payrollRelationshipId: {
1944+
type: 'string',
1945+
description: 'Payroll relationship ID, as a positive decimal string',
1946+
},
1947+
payrollAssignmentId: {
1948+
type: 'string',
1949+
description:
1950+
'Payroll assignment RelationshipGroupId, not the HR AssignmentId; positive decimal string',
1951+
},
1952+
assignedPayrollId: {
1953+
type: 'string',
1954+
description: 'Assigned payroll ID, as a positive decimal string',
1955+
},
19121956
payrollId: { type: 'string', description: 'Payroll ID, as a positive decimal string' },
1913-
effectiveStartDate: { type: 'string', description: 'Effective start date in YYYY-MM-DD format' },
1957+
effectiveStartDate: {
1958+
type: 'string',
1959+
description: 'Effective start date in YYYY-MM-DD format',
1960+
},
19141961
effectiveEndDate: { type: 'string', description: 'Effective end date in YYYY-MM-DD format' },
19151962
lsed: { type: 'string', description: 'Lsed in YYYY-MM-DD format' },
1916-
overridingPeriodId: { type: 'string', description: 'Overriding period ID, as a positive decimal string' },
1917-
timeCardRequired: { type: 'string', description: 'Oracle time-card requirement code, such as Y or N' },
1918-
rangeMode: { type: 'string', description: 'CORRECTION changes the historical row; UPDATE starts an effective-dated change' },
1919-
legislativeDataGroupId: { type: 'string', description: 'Legislative data group ID, as a positive decimal string' },
1963+
overridingPeriodId: {
1964+
type: 'string',
1965+
description: 'Overriding period ID, as a positive decimal string',
1966+
},
1967+
timeCardRequired: {
1968+
type: 'string',
1969+
description: 'Oracle time-card requirement code, such as Y or N',
1970+
},
1971+
rangeMode: {
1972+
type: 'string',
1973+
description: 'CORRECTION changes the historical row; UPDATE starts an effective-dated change',
1974+
},
1975+
legislativeDataGroupId: {
1976+
type: 'string',
1977+
description: 'Legislative data group ID, as a positive decimal string',
1978+
},
19201979
elementTypeId: { type: 'string', description: 'Element type ID, as a positive decimal string' },
19211980
assignmentNumber: { type: 'string', description: 'HR assignment number' },
1922-
elementEntryId: { type: 'string', description: 'Element entry ID, as a positive decimal string' },
1981+
elementEntryId: {
1982+
type: 'string',
1983+
description: 'Element entry ID, as a positive decimal string',
1984+
},
19231985
elementName: { type: 'string', description: 'Name of the element matching elementTypeId' },
1924-
creatorType: { type: 'string', description: 'Oracle element-entry creator code supported by the tenant' },
1925-
entryType: { type: 'string', description: 'Oracle element-entry type code supported by the tenant' },
1926-
entryValues: { type: 'json', description: 'Up to 100 typed objects: inputValueId (positive decimal string) and screenEntryValue (string up to 60 characters or null). Input IDs serialize exactly as JSON integers' },
1927-
elementEntryValueId: { type: 'string', description: 'Element entry value ID, as a positive decimal string' },
1986+
creatorType: {
1987+
type: 'string',
1988+
description: 'Oracle element-entry creator code supported by the tenant',
1989+
},
1990+
entryType: {
1991+
type: 'string',
1992+
description: 'Oracle element-entry type code supported by the tenant',
1993+
},
1994+
entryValues: {
1995+
type: 'json',
1996+
description:
1997+
'Up to 100 typed objects: inputValueId (positive decimal string) and screenEntryValue (string up to 60 characters or null). Input IDs serialize exactly as JSON integers',
1998+
},
1999+
elementEntryValueId: {
2000+
type: 'string',
2001+
description: 'Element entry value ID, as a positive decimal string',
2002+
},
19282003
screenEntryValue: {
19292004
type: 'string',
19302005
description: 'Element input value as text; use clearScreenEntryValue to explicitly clear it',
19312006
},
1932-
clearScreenEntryValue: { type: 'boolean', description: 'Explicitly clear the element input value' },
2007+
clearScreenEntryValue: {
2008+
type: 'boolean',
2009+
description: 'Explicitly clear the element input value',
2010+
},
19332011
objectActionId: { type: 'string', description: 'Object action ID, as a positive decimal string' },
19342012
salaryId: { type: 'string', description: 'Salary ID, as a positive decimal string' },
19352013
salaryBasisId: { type: 'string', description: 'Salary basis ID, as a positive decimal string' },
1936-
salaryAmount: { type: 'number', description: 'Nonnegative salary amount in the salary basis currency and frequency; administrative write, not an approval request' },
2014+
salaryAmount: {
2015+
type: 'number',
2016+
description:
2017+
'Nonnegative salary amount in the salary basis currency and frequency; administrative write, not an approval request',
2018+
},
19372019
dateFrom: { type: 'string', description: 'Date from in YYYY-MM-DD format' },
19382020
dateTo: { type: 'string', description: 'Date to in YYYY-MM-DD format' },
1939-
componentKind: { type: 'string', description: 'Component family: standard, simple, or rate; each is independently paginated' },
2021+
componentKind: {
2022+
type: 'string',
2023+
description: 'Component family: standard, simple, or rate; each is independently paginated',
2024+
},
19402025
gradeRateId: { type: 'string', description: 'Grade rate ID, as a positive decimal string' },
19412026
reviewPeriodId: { type: 'string', description: 'Review period ID, as a positive decimal string' },
19422027
goalPlanId: { type: 'string', description: 'Goal plan ID, as a positive decimal string' },
19432028
goalId: { type: 'string', description: 'Goal ID, as a positive decimal string' },
19442029
evaluationId: { type: 'string', description: 'Evaluation ID, as a positive decimal string' },
19452030
evalRoleId: { type: 'string', description: 'Eval role ID, as a positive decimal string' },
1946-
evalParticipantId: { type: 'string', description: 'Eval participant ID, as a positive decimal string' },
2031+
evalParticipantId: {
2032+
type: 'string',
2033+
description: 'Eval participant ID, as a positive decimal string',
2034+
},
19472035
profileId: { type: 'string', description: 'Profile ID, as a positive decimal string' },
1948-
sectionKind: { type: 'string', description: 'Secured profile section family: skill or certification' },
1949-
profileSectionId: { type: 'string', description: 'Profile section ID, as a positive decimal string' },
1950-
startTime: { type: 'string', description: 'Start timestamp in ISO 8601 with explicit time-zone offset' },
1951-
stopTime: { type: 'string', description: 'Stop timestamp in ISO 8601 with explicit time-zone offset' },
2036+
sectionKind: {
2037+
type: 'string',
2038+
description: 'Secured profile section family: skill or certification',
2039+
},
2040+
profileSectionId: {
2041+
type: 'string',
2042+
description: 'Profile section ID, as a positive decimal string',
2043+
},
2044+
startTime: {
2045+
type: 'string',
2046+
description: 'Start timestamp in ISO 8601 with explicit time-zone offset',
2047+
},
2048+
stopTime: {
2049+
type: 'string',
2050+
description: 'Stop timestamp in ISO 8601 with explicit time-zone offset',
2051+
},
19522052
timeRecordId: { type: 'string', description: 'Time record ID, as a positive decimal string' },
1953-
timeRecordGroupId: { type: 'string', description: 'Time record group ID, as a positive decimal string' },
2053+
timeRecordGroupId: {
2054+
type: 'string',
2055+
description: 'Time record group ID, as a positive decimal string',
2056+
},
19542057
timeAttributeId: { type: 'string', description: 'Time attribute ID, as a positive decimal string' },
1955-
dataSourceUsageId: { type: 'string', description: 'Data source usage ID, as a positive decimal string' },
1956-
timeAttributeUsageId: { type: 'string', description: 'Time attribute usage ID, as a positive decimal string' },
1957-
bindings: { type: 'json', description: 'Up to five typed {name, value} bindings from list_time_attribute_criteria_binds; values cannot contain finder separators' },
1958-
measure: { type: 'number', description: 'Positive quantity in hours or units; may accompany startTime and stopTime' },
1959-
referenceDate: { type: 'string', description: 'Optional processing date for entries spanning multiple days (YYYY-MM-DD)' },
1960-
payrollTimeType: { type: 'string', description: 'PayrollTimeType attribute value discovered for the assignment and effective date' },
1961-
timeAttributes: { type: 'json', description: 'Up to 30 typed {attributeName, attributeValue} qualifiers discovered through the time configuration tools. PayrollTimeType uses its dedicated input' },
1962-
processMode: { type: 'string', description: 'TIME_ENTER (default), TIME_SAVE, or TIME_SUBMIT. Requests process asynchronously; acceptance is not completion or approval' },
2058+
dataSourceUsageId: {
2059+
type: 'string',
2060+
description: 'Data source usage ID, as a positive decimal string',
2061+
},
2062+
timeAttributeUsageId: {
2063+
type: 'string',
2064+
description: 'Time attribute usage ID, as a positive decimal string',
2065+
},
2066+
bindings: {
2067+
type: 'json',
2068+
description:
2069+
'Up to five typed {name, value} bindings from list_time_attribute_criteria_binds; values cannot contain finder separators',
2070+
},
2071+
measure: {
2072+
type: 'number',
2073+
description: 'Positive quantity in hours or units; may accompany startTime and stopTime',
2074+
},
2075+
referenceDate: {
2076+
type: 'string',
2077+
description: 'Optional processing date for entries spanning multiple days (YYYY-MM-DD)',
2078+
},
2079+
payrollTimeType: {
2080+
type: 'string',
2081+
description: 'PayrollTimeType attribute value discovered for the assignment and effective date',
2082+
},
2083+
timeAttributes: {
2084+
type: 'json',
2085+
description:
2086+
'Up to 30 typed {attributeName, attributeValue} qualifiers discovered through the time configuration tools. PayrollTimeType uses its dedicated input',
2087+
},
2088+
processMode: {
2089+
type: 'string',
2090+
description:
2091+
'TIME_ENTER (default), TIME_SAVE, or TIME_SUBMIT. Requests process asynchronously; acceptance is not completion or approval',
2092+
},
19632093
changeReason: { type: 'string', description: 'Tenant-configured audit change reason code' },
1964-
timeRecordVersion: { type: 'number', description: 'Current time-record version from get_time_record; required for update and delete' },
1965-
timeRecordEventRequestId: { type: 'string', description: 'Time record event request ID, as a positive decimal string' },
1966-
timeRecordEventId: { type: 'string', description: 'Time record event ID, as a positive decimal string' },
1967-
operation: { type: 'string', description: 'Oracle HCM operation; writes require explicit authorization' },
2094+
timeRecordVersion: {
2095+
type: 'number',
2096+
description: 'Current time-record version from get_time_record; required for update and delete',
2097+
},
2098+
timeRecordEventRequestId: {
2099+
type: 'string',
2100+
description: 'Time record event request ID, as a positive decimal string',
2101+
},
2102+
timeRecordEventId: {
2103+
type: 'string',
2104+
description: 'Time record event ID, as a positive decimal string',
2105+
},
2106+
operation: {
2107+
type: 'string',
2108+
description: 'Oracle HCM operation; writes require explicit authorization',
2109+
},
19682110
oauthCredential: { type: 'string', description: 'Oracle Fusion integration-user credential' },
19692111
personId: { type: 'string', description: 'Person ID' },
19702112
assignmentId: { type: 'string', description: 'Assignment ID' },

apps/sim/lib/internal/oracle-fusion-hcm/operations.test.ts

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,20 +1227,67 @@ describe('Oracle Fusion HCM payroll, compensation, talent, and time', () => {
12271227
})
12281228

12291229
it('does not replay an ambiguous time intake timeout and drops upstream details', async () => {
1230-
mocks.requestOracleFusionJson.mockRejectedValueOnce(new OracleFusionProviderError('private timeout detail', 504))
1231-
await expect(operations.executeOracleFusionHcmCreateTimeEntry({ ...auth, personNumber: '0007', measure: 8, referenceDate: '2026-01-01', processMode: 'TIME_ENTER' })).rejects.toThrow('Oracle Fusion HCM request timed out')
1230+
mocks.requestOracleFusionJson.mockRejectedValueOnce(
1231+
new OracleFusionProviderError('private timeout detail', 504)
1232+
)
1233+
await expect(
1234+
operations.executeOracleFusionHcmCreateTimeEntry({
1235+
...auth,
1236+
personNumber: '0007',
1237+
measure: 8,
1238+
referenceDate: '2026-01-01',
1239+
processMode: 'TIME_ENTER',
1240+
})
1241+
).rejects.toThrow('Oracle Fusion HCM request timed out')
12321242
expect(mocks.requestOracleFusionJson).toHaveBeenCalledOnce()
12331243
})
12341244

12351245
it('reads processing events and messages through their complete request/event parents', async () => {
1236-
mocks.requestOracleFusionJson.mockResolvedValueOnce(collection([{ timeRecordEventId: '2', timeRecordEventRequestId: '1', eventStatus: 'In process', timeRecordId: null, eventStatusValue: 4 }]))
1237-
const events = await operations.executeOracleFusionHcmListTimeRecordRequestEvents({ ...auth, timeRecordEventRequestId: '1' })
1238-
expect(lastRequest().address.relativePath).toBe('timeRecordEventRequests/1/child/timeRecordEvent')
1239-
expect(events.output.timeRecordRequestEvents[0]).toMatchObject({ eventStatus: 'In process', timeRecordId: null, eventStatusValue: 4 })
1240-
mocks.requestOracleFusionJson.mockResolvedValueOnce(collection([{ timeRecordEventMessageId: '3', messageName: 'HWM_VALIDATION', messageField: 'startTime', allowException: 'N' }]))
1241-
const messages = await operations.executeOracleFusionHcmListTimeRecordEventMessages({ ...auth, timeRecordEventRequestId: '1', timeRecordEventId: '2' })
1242-
expect(lastRequest().address.relativePath).toBe('timeRecordEventRequests/1/child/timeRecordEvent/2/child/timeRecordEventMessage')
1243-
expect(messages.output.timeRecordEventMessages[0]).toMatchObject({ messageName: 'HWM_VALIDATION', allowException: 'N' })
1246+
mocks.requestOracleFusionJson.mockResolvedValueOnce(
1247+
collection([
1248+
{
1249+
timeRecordEventId: '2',
1250+
timeRecordEventRequestId: '1',
1251+
eventStatus: 'In process',
1252+
timeRecordId: null,
1253+
eventStatusValue: 4,
1254+
},
1255+
])
1256+
)
1257+
const events = await operations.executeOracleFusionHcmListTimeRecordRequestEvents({
1258+
...auth,
1259+
timeRecordEventRequestId: '1',
1260+
})
1261+
expect(lastRequest().address.relativePath).toBe(
1262+
'timeRecordEventRequests/1/child/timeRecordEvent'
1263+
)
1264+
expect(events.output.timeRecordRequestEvents[0]).toMatchObject({
1265+
eventStatus: 'In process',
1266+
timeRecordId: null,
1267+
eventStatusValue: 4,
1268+
})
1269+
mocks.requestOracleFusionJson.mockResolvedValueOnce(
1270+
collection([
1271+
{
1272+
timeRecordEventMessageId: '3',
1273+
messageName: 'HWM_VALIDATION',
1274+
messageField: 'startTime',
1275+
allowException: 'N',
1276+
},
1277+
])
1278+
)
1279+
const messages = await operations.executeOracleFusionHcmListTimeRecordEventMessages({
1280+
...auth,
1281+
timeRecordEventRequestId: '1',
1282+
timeRecordEventId: '2',
1283+
})
1284+
expect(lastRequest().address.relativePath).toBe(
1285+
'timeRecordEventRequests/1/child/timeRecordEvent/2/child/timeRecordEventMessage'
1286+
)
1287+
expect(messages.output.timeRecordEventMessages[0]).toMatchObject({
1288+
messageName: 'HWM_VALIDATION',
1289+
allowException: 'N',
1290+
})
12441291
expect(messages.output.timeRecordEventMessages[0]).not.toHaveProperty('messageText')
12451292
})
12461293
})

0 commit comments

Comments
 (0)