Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix workflows default for workspaces #50391

Merged
merged 16 commits into from
Mar 3, 2025
12 changes: 9 additions & 3 deletions src/libs/actions/Policy/Policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,8 @@ function buildPolicyData(

const optimisticCategoriesData = buildOptimisticPolicyCategories(policyID, CONST.POLICY.DEFAULT_CATEGORIES);

const shouldEnableWorkflowsByDefault =
!introSelected?.choice || introSelected.choice === CONST.ONBOARDING_CHOICES.MANAGE_TEAM || introSelected.choice === CONST.ONBOARDING_CHOICES.LOOKING_AROUND;
const shouldSetCreatedWorkspaceAsActivePolicy = !!activePolicyID && allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`]?.type === CONST.POLICY.TYPE.PERSONAL;

const optimisticData: OnyxUpdate[] = [
Expand All @@ -1774,16 +1776,16 @@ function buildPolicyData(
outputCurrency,
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
autoReporting: true,
autoReportingFrequency: CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT,
autoReportingFrequency: shouldEnableWorkflowsByDefault ? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.IMMEDIATE : CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT,
approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
harvesting: {
enabled: true,
enabled: !shouldEnableWorkflowsByDefault,
},
customUnits,
areCategoriesEnabled: true,
areTagsEnabled: false,
areDistanceRatesEnabled: false,
areWorkflowsEnabled: false,
areWorkflowsEnabled: shouldEnableWorkflowsByDefault,
areReportFieldsEnabled: false,
areConnectionsEnabled: false,
employeeList: {
Expand Down Expand Up @@ -3132,6 +3134,7 @@ function enablePolicyWorkflows(policyID: string, enabled: boolean) {
? {
approvalMode: CONST.POLICY.APPROVAL_MODE.OPTIONAL,
autoReporting: false,
autoReportingFrequency: CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT,
harvesting: {
enabled: false,
},
Expand All @@ -3144,6 +3147,7 @@ function enablePolicyWorkflows(policyID: string, enabled: boolean) {
? {
approvalMode: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
autoReporting: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
autoReportingFrequency: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
harvesting: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
reimbursementChoice: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
}
Expand Down Expand Up @@ -3181,6 +3185,7 @@ function enablePolicyWorkflows(policyID: string, enabled: boolean) {
? {
approvalMode: policy?.approvalMode,
autoReporting: policy?.autoReporting,
autoReportingFrequency: policy?.autoReportingFrequency,
harvesting: policy?.harvesting,
reimbursementChoice: policy?.reimbursementChoice,
}
Expand All @@ -3191,6 +3196,7 @@ function enablePolicyWorkflows(policyID: string, enabled: boolean) {
? {
approvalMode: null,
autoReporting: null,
autoReportingFrequency: null,
harvesting: null,
reimbursementChoice: null,
}
Expand Down
82 changes: 82 additions & 0 deletions tests/actions/PolicyTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,55 @@ describe('actions/Policy', () => {
expect(reportAction.pendingAction).toBeFalsy();
});
});

it('create a new workspace with enabled workflow if the onboarding purpose is newDotManageTeam or newDotLookingAround', async () => {
Onyx.merge(`${ONYXKEYS.NVP_INTRO_SELECTED}`, {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM});
await waitForBatchedUpdates();

const policyID = Policy.generatePolicyID();
// When a new workspace is created with introSelected set to TRACK_WORKSPACE
Policy.createWorkspace(ESH_EMAIL, true, WORKSPACE_NAME, policyID);
await waitForBatchedUpdates();

const policy: OnyxEntry<PolicyType> | OnyxCollection<PolicyType> = await new Promise((resolve) => {
const connection = Onyx.connect({
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
callback: (workspace) => {
Onyx.disconnect(connection);
resolve(workspace);
},
});
});

// Then the workflows feature is enabled
expect(policy?.areWorkflowsEnabled).toBeTruthy();

// And the delay submission is manually
expect(policy?.autoReportingFrequency).toBe(CONST.POLICY.AUTO_REPORTING_FREQUENCIES.IMMEDIATE);
});

it('create a new workspace with disabled workflow if the onboarding purpose is not newDotManageTeam or newDotLookingAround', async () => {
Onyx.merge(`${ONYXKEYS.NVP_INTRO_SELECTED}`, {choice: CONST.ONBOARDING_CHOICES.PERSONAL_SPEND});
await waitForBatchedUpdates();

const policyID = Policy.generatePolicyID();
// When a new workspace is created with introSelected set to TRACK_WORKSPACE
Policy.createWorkspace(ESH_EMAIL, true, WORKSPACE_NAME, policyID);
await waitForBatchedUpdates();

const policy: OnyxEntry<PolicyType> | OnyxCollection<PolicyType> = await new Promise((resolve) => {
const connection = Onyx.connect({
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
callback: (workspace) => {
Onyx.disconnect(connection);
resolve(workspace);
},
});
});

// Then the workflows feature is disabled
expect(policy?.areWorkflowsEnabled).toBeFalsy();
});
});

describe('upgradeToCorporate', () => {
Expand Down Expand Up @@ -373,4 +422,37 @@ describe('actions/Policy', () => {
});
});
});

describe('enablePolicyWorkflows', () => {
it('should update delay submission to instant when disabling the workflows feature', async () => {
(fetch as MockFetch)?.pause?.();
Onyx.set(ONYXKEYS.SESSION, {email: ESH_EMAIL, accountID: ESH_ACCOUNT_ID});
const fakePolicy: PolicyType = {
...createRandomPolicy(0, CONST.POLICY.TYPE.TEAM),
areWorkflowsEnabled: true,
autoReporting: true,
autoReportingFrequency: CONST.POLICY.AUTO_REPORTING_FREQUENCIES.IMMEDIATE,
};
Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
await waitForBatchedUpdates();

// Disable the workflow feature
Policy.enablePolicyWorkflows(fakePolicy.id, false);
await waitForBatchedUpdates();

const policy: OnyxEntry<PolicyType> = await new Promise((resolve) => {
const connection = Onyx.connect({
key: `${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`,
callback: (workspace) => {
Onyx.disconnect(connection);
resolve(workspace);
},
});
});

// Chekck if the autoReportingFrequency is updated to instand
expect(policy?.areWorkflowsEnabled).toBeFalsy();
expect(policy?.autoReportingFrequency).toBe(CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT);
});
});
});
Loading