Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2916,9 +2916,9 @@ const CONST = {

ZENEFITS: {
APPROVAL_MODE: {
BASIC: 'basic',
MANAGER: 'manager',
CUSTOM: 'custom',
BASIC: 'APPROVAL_SUBMIT_AND_APPROVE',
MANAGER: 'APPROVAL_ADVANCED',
CUSTOM: 'APPROVAL_MANUAL',
},
},

Expand Down
46 changes: 40 additions & 6 deletions src/libs/actions/connections/Zenefits.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {OnyxUpdate} from 'react-native-onyx';
import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import {write} from '@libs/API';
Expand All @@ -8,6 +8,7 @@ import {getCommandURL} from '@libs/ApiUtils';
import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {PolicyConnectionSyncProgress} from '@src/types/onyx/Policy';

function getZenefitsSetupLink(policyID: string) {
const params: ConnectPolicyToZenefitsParams = {policyID};
Expand All @@ -18,17 +19,41 @@ function getZenefitsSetupLink(policyID: string) {
return commandURL + new URLSearchParams(params).toString();
}

function getZenefitsSyncProgressOptimisticData(policyID: string): OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS> {
return {
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`,
value: {
stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.ZENEFITS_SYNC_TITLE,
connectionName: CONST.POLICY.CONNECTIONS.NAME.ZENEFITS,
timestamp: new Date().toISOString(),
},
};
}

function getZenefitsSyncProgressFailureData(
policyID: string,
currentConnectionSyncProgress: OnyxEntry<PolicyConnectionSyncProgress>,
): OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS> {
return {
onyxMethod: Onyx.METHOD.SET,
key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`,
value: currentConnectionSyncProgress ?? null,
};
}

function updateZenefitsApprovalMode(
policyID: string | undefined,
approvalMode: ValueOf<typeof CONST.ZENEFITS.APPROVAL_MODE>,
currentApprovalMode?: ValueOf<typeof CONST.ZENEFITS.APPROVAL_MODE> | null,
currentConnectionSyncProgress?: OnyxEntry<PolicyConnectionSyncProgress>,
) {
if (!policyID) {
return;
}

const previousApprovalMode = currentApprovalMode ?? null;
const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS>> = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
Expand All @@ -44,6 +69,7 @@ function updateZenefitsApprovalMode(
},
},
},
getZenefitsSyncProgressOptimisticData(policyID),
];
const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
{
Expand All @@ -61,7 +87,7 @@ function updateZenefitsApprovalMode(
},
},
];
const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS>> = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
Expand All @@ -77,18 +103,24 @@ function updateZenefitsApprovalMode(
},
},
},
getZenefitsSyncProgressFailureData(policyID, currentConnectionSyncProgress),
];

write(WRITE_COMMANDS.UPDATE_ZENEFITS_APPROVAL_MODE, {policyID, approvalMode}, {optimisticData, successData, failureData});
}

function updateZenefitsFinalApprover(policyID: string | undefined, finalApprover: string | null, currentFinalApprover?: string | null) {
function updateZenefitsFinalApprover(
policyID: string | undefined,
finalApprover: string | null,
currentFinalApprover?: string | null,
currentConnectionSyncProgress?: OnyxEntry<PolicyConnectionSyncProgress>,
) {
if (!policyID) {
return;
}

const previousFinalApprover = currentFinalApprover ?? null;
const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS>> = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
Expand All @@ -104,6 +136,7 @@ function updateZenefitsFinalApprover(policyID: string | undefined, finalApprover
},
},
},
getZenefitsSyncProgressOptimisticData(policyID),
];
const successData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
{
Expand All @@ -121,7 +154,7 @@ function updateZenefitsFinalApprover(policyID: string | undefined, finalApprover
},
},
];
const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY>> = [
const failureData: Array<OnyxUpdate<typeof ONYXKEYS.COLLECTION.POLICY | typeof ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS>> = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
Expand All @@ -137,6 +170,7 @@ function updateZenefitsFinalApprover(policyID: string | undefined, finalApprover
},
},
},
getZenefitsSyncProgressFailureData(policyID, currentConnectionSyncProgress),
];

write(WRITE_COMMANDS.UPDATE_ZENEFITS_FINAL_APPROVER, {policyID, finalApprover}, {optimisticData, successData, failureData});
Expand Down
2 changes: 1 addition & 1 deletion src/pages/workspace/hr/HRApprovalModePageBase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import type Beta from '@src/types/onyx/Beta';
import type Policy from '@src/types/onyx/Policy';
import type {PolicyConnectionSyncProgress} from '@src/types/onyx/Policy';

type ApprovalModeValue = ValueOf<typeof CONST.GUSTO.APPROVAL_MODE> | ValueOf<typeof CONST.MERGE_HR.APPROVAL_MODE>;
type ApprovalModeValue = ValueOf<typeof CONST.GUSTO.APPROVAL_MODE> | ValueOf<typeof CONST.ZENEFITS.APPROVAL_MODE> | ValueOf<typeof CONST.MERGE_HR.APPROVAL_MODE>;

type HRApprovalModeProviderConfig<T extends ApprovalModeValue = ApprovalModeValue> = {
testID: string;
Expand Down
42 changes: 32 additions & 10 deletions src/pages/workspace/hr/zenefits/ZenefitsApprovalModePage.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
import React from 'react';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import type {ValueOf} from 'type-fest';
import useLocalize from '@hooks/useLocalize';
import Navigation from '@libs/Navigation/Navigation';
import {updateZenefitsApprovalMode} from '@libs/actions/connections/Zenefits';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
import {isZenefitsConnected} from '@libs/PolicyUtils';
import HRApprovalModePageBase from '@pages/workspace/hr/HRApprovalModePageBase';
import type {HRApprovalModeProviderConfig} from '@pages/workspace/hr/HRApprovalModePageBase';
import CONST from '@src/CONST';
import type SCREENS from '@src/SCREENS';

function ZenefitsApprovalModePage() {
type ZenefitsApprovalModePageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.HR_ZENEFITS_APPROVAL_MODE>;

function ZenefitsApprovalModePage({
route: {
params: {policyID},
},
}: ZenefitsApprovalModePageProps) {
const {translate} = useLocalize();

const config: HRApprovalModeProviderConfig<ValueOf<typeof CONST.ZENEFITS.APPROVAL_MODE>> = {
testID: 'ZenefitsApprovalModePage',
beta: CONST.BETAS.ZENEFITS,
isConnected: isZenefitsConnected,
approvalModes: CONST.ZENEFITS.APPROVAL_MODE,
getCurrentApprovalMode: (policy) => policy?.connections?.zenefits?.config?.approvalMode ?? null,
getProviderName: () => translate('workspace.hr.zenefits.title'),
getHeaderTitle: () => translate('workspace.hr.approvalMode'),
handleSave: ({draftApprovalMode, currentApprovalMode, connectionSyncProgress}) =>
updateZenefitsApprovalMode(policyID, draftApprovalMode, currentApprovalMode, connectionSyncProgress),
};

return (
<ScreenWrapper testID="ZenefitsApprovalModePage">
<HeaderWithBackButton
title={translate('workspace.common.hr')}
onBackButtonPress={() => Navigation.goBack()}
/>
</ScreenWrapper>
<HRApprovalModePageBase
policyID={policyID}
config={config}
/>
);
}

Expand Down
39 changes: 29 additions & 10 deletions src/pages/workspace/hr/zenefits/ZenefitsFinalApproverPage.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,38 @@
import React from 'react';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import useLocalize from '@hooks/useLocalize';
import Navigation from '@libs/Navigation/Navigation';
import {updateZenefitsFinalApprover} from '@libs/actions/connections/Zenefits';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
import {isZenefitsConnected} from '@libs/PolicyUtils';
import HRFinalApproverPageBase from '@pages/workspace/hr/HRFinalApproverPageBase';
import type {HRFinalApproverProviderConfig} from '@pages/workspace/hr/HRFinalApproverPageBase';
import CONST from '@src/CONST';
import type SCREENS from '@src/SCREENS';

function ZenefitsFinalApproverPage() {
type ZenefitsFinalApproverPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.HR_ZENEFITS_FINAL_APPROVER>;

function ZenefitsFinalApproverPage({
route: {
params: {policyID},
},
}: ZenefitsFinalApproverPageProps) {
const {translate} = useLocalize();

const config: HRFinalApproverProviderConfig = {
testID: 'ZenefitsFinalApproverPage',
beta: CONST.BETAS.ZENEFITS,
isConnected: isZenefitsConnected,
getCurrentFinalApprover: (policy) => policy?.connections?.zenefits?.config?.finalApprover ?? null,
getProviderName: () => translate('workspace.hr.zenefits.title'),
getHeaderTitle: () => translate('workspace.hr.finalApprover'),
handleSave: ({policyID: id, email, currentFinalApprover, connectionSyncProgress}) => updateZenefitsFinalApprover(id, email, currentFinalApprover, connectionSyncProgress),
};

return (
<ScreenWrapper testID="ZenefitsFinalApproverPage">
<HeaderWithBackButton
title={translate('workspace.common.hr')}
onBackButtonPress={() => Navigation.goBack()}
/>
</ScreenWrapper>
<HRFinalApproverPageBase
policyID={policyID}
config={config}
/>
);
}

Expand Down
Loading