diff --git a/src/CONST.ts b/src/CONST.ts index 8439ad4f8c58..65ba4843022d 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -2689,27 +2689,27 @@ const CONST = { ARE_RULES_ENABLED: 'areRulesEnabled', ARE_PER_DIEM_RATES_ENABLED: 'arePerDiemRatesEnabled', }, - DEFAULT_CATEGORIES: [ - 'Advertising', - 'Benefits', - 'Car', - 'Equipment', - 'Fees', - 'Home Office', - 'Insurance', - 'Interest', - 'Labor', - 'Maintenance', - 'Materials', - 'Meals and Entertainment', - 'Office Supplies', - 'Other', - 'Professional Services', - 'Rent', - 'Taxes', - 'Travel', - 'Utilities', - ], + DEFAULT_CATEGORIES: { + ADVERTISING: 'Advertising', + BENEFITS: 'Benefits', + CAR: 'Car', + EQUIPMENT: 'Equipment', + FEES: 'Fees', + HOME_OFFICE: 'Home Office', + INSURANCE: 'Insurance', + INTEREST: 'Interest', + LABOR: 'Labor', + MAINTENANCE: 'Maintenance', + MATERIALS: 'Materials', + MEALS_AND_ENTERTAINMENT: 'Meals and Entertainment', + OFFICE_SUPPLIES: 'Office Supplies', + OTHER: 'Other', + PROFESSIONAL_SERVICES: 'Professional Services', + RENT: 'Rent', + TAXES: 'Taxes', + TRAVEL: 'Travel', + UTILITIES: 'Utilities', + }, OWNERSHIP_ERRORS: { NO_BILLING_CARD: 'noBillingCard', AMOUNT_OWED: 'amountOwed', diff --git a/src/libs/actions/Policy/Category.ts b/src/libs/actions/Policy/Category.ts index 9f9ff8ba2804..5613209b9a0d 100644 --- a/src/libs/actions/Policy/Category.ts +++ b/src/libs/actions/Policy/Category.ts @@ -143,6 +143,89 @@ function buildOptimisticPolicyCategories(policyID: string, categories: readonly return onyxData; } +function buildOptimisticMccGroup() { + const optimisticMccGroup: Record<'mccGroup', Record> = { + mccGroup: { + airlines: { + category: CONST.POLICY.DEFAULT_CATEGORIES.TRAVEL, + groupID: 'airlines', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + commuter: { + category: CONST.POLICY.DEFAULT_CATEGORIES.CAR, + groupID: 'commuter', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + gas: { + category: CONST.POLICY.DEFAULT_CATEGORIES.CAR, + groupID: 'gas', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + goods: { + category: CONST.POLICY.DEFAULT_CATEGORIES.MATERIALS, + groupID: 'goods', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + groceries: { + category: CONST.POLICY.DEFAULT_CATEGORIES.MEALS_AND_ENTERTAINMENT, + groupID: 'groceries', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + hotel: { + category: CONST.POLICY.DEFAULT_CATEGORIES.TRAVEL, + groupID: 'hotel', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + mail: { + category: CONST.POLICY.DEFAULT_CATEGORIES.OFFICE_SUPPLIES, + groupID: 'mail', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + meals: { + category: CONST.POLICY.DEFAULT_CATEGORIES.MEALS_AND_ENTERTAINMENT, + groupID: 'meals', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + rental: { + category: CONST.POLICY.DEFAULT_CATEGORIES.TRAVEL, + groupID: 'rental', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + services: { + category: CONST.POLICY.DEFAULT_CATEGORIES.PROFESSIONAL_SERVICES, + groupID: 'services', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + taxi: { + category: CONST.POLICY.DEFAULT_CATEGORIES.TRAVEL, + groupID: 'taxi', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + uncategorized: { + category: CONST.POLICY.DEFAULT_CATEGORIES.OTHER, + groupID: 'uncategorized', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + utilities: { + category: CONST.POLICY.DEFAULT_CATEGORIES.UTILITIES, + groupID: 'utilities', + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + }, + }; + + const successMccGroup: Record<'mccGroup', Record>> = {mccGroup: {}}; + Object.keys(optimisticMccGroup.mccGroup).forEach((key) => (successMccGroup.mccGroup[key] = {pendingAction: null})); + + const mccGroupData = { + optimisticData: optimisticMccGroup, + successData: successMccGroup, + failureData: {mccGroup: null}, + }; + + return mccGroupData; +} + function updateImportSpreadsheetData(categoriesLength: number) { const onyxData: OnyxData = { successData: [ @@ -1369,6 +1452,7 @@ function getPolicyCategoriesData(policyID: string | undefined) { export { buildOptimisticPolicyCategories, + buildOptimisticMccGroup, buildOptimisticPolicyRecentlyUsedCategories, clearCategoryErrors, createPolicyCategory, diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 21ea41bab8a8..3abd4254c735 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -99,7 +99,7 @@ import type {Errors} from '@src/types/onyx/OnyxCommon'; import type {Attributes, CompanyAddress, CustomUnit, NetSuiteCustomList, NetSuiteCustomSegment, Rate, TaxRate} from '@src/types/onyx/Policy'; import type {OnyxData} from '@src/types/onyx/Request'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import {buildOptimisticPolicyCategories} from './Category'; +import {buildOptimisticMccGroup, buildOptimisticPolicyCategories} from './Category'; type ReportCreationData = Record< string, @@ -1755,7 +1755,8 @@ function buildPolicyData( pendingChatMembers, } = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName, expenseReportId); - const optimisticCategoriesData = buildOptimisticPolicyCategories(policyID, CONST.POLICY.DEFAULT_CATEGORIES); + const optimisticCategoriesData = buildOptimisticPolicyCategories(policyID, Object.values(CONST.POLICY.DEFAULT_CATEGORIES)); + const optimisticMccGroupData = buildOptimisticMccGroup(); const shouldSetCreatedWorkspaceAsActivePolicy = !!activePolicyID && allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`]?.type === CONST.POLICY.TYPE.PERSONAL; @@ -1805,6 +1806,7 @@ function buildPolicyData( }, avatarURL: file?.uri, originalFileName: file?.name, + ...optimisticMccGroupData.optimisticData, }, }, { @@ -1885,6 +1887,7 @@ function buildPolicyData( description: null, type: null, }, + ...optimisticMccGroupData.successData, }, }, { @@ -1946,7 +1949,7 @@ function buildPolicyData( { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: {employeeList: null}, + value: {employeeList: null, ...optimisticMccGroupData.failureData}, }, { onyxMethod: Onyx.METHOD.SET, @@ -2137,7 +2140,7 @@ function createDraftWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policy { onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT}${policyID}`, - value: CONST.POLICY.DEFAULT_CATEGORIES.reduce>((acc, category) => { + value: Object.values(CONST.POLICY.DEFAULT_CATEGORIES).reduce>((acc, category) => { acc[category] = { name: category, enabled: true, diff --git a/tests/actions/PolicyTest.ts b/tests/actions/PolicyTest.ts index 07820ce1cd30..9aa8f3db7d17 100644 --- a/tests/actions/PolicyTest.ts +++ b/tests/actions/PolicyTest.ts @@ -81,6 +81,7 @@ describe('actions/Policy', () => { expect(policy?.isPolicyExpenseChatEnabled).toBe(true); expect(policy?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD); expect(policy?.employeeList).toEqual({[ESH_EMAIL]: {errors: {}, role: CONST.POLICY.ROLE.ADMIN}}); + expect(policy?.mccGroup).toBeDefined(); let allReports: OnyxCollection = await new Promise((resolve) => { const connection = Onyx.connect({