Skip to content

Commit dfa69e6

Browse files
authored
Merge pull request #52269 from shubham1206agra/per-diem-3
Feature: Per Diem Rates Settings Page
2 parents 2b31276 + 0e677a7 commit dfa69e6

21 files changed

+166
-37
lines changed

src/ROUTES.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,10 @@ const ROUTES = {
12951295
route: 'settings/workspaces/:policyID/per-diem',
12961296
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem` as const,
12971297
},
1298+
WORKSPACE_PER_DIEM_SETTINGS: {
1299+
route: 'settings/workspaces/:policyID/per-diem/settings',
1300+
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/settings` as const,
1301+
},
12981302
RULES_CUSTOM_NAME: {
12991303
route: 'settings/workspaces/:policyID/rules/name',
13001304
getRoute: (policyID: string) => `settings/workspaces/${policyID}/rules/name` as const,

src/SCREENS.ts

+1
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ const SCREENS = {
546546
RULES_MAX_EXPENSE_AGE: 'Rules_Max_Expense_Age',
547547
RULES_BILLABLE_DEFAULT: 'Rules_Billable_Default',
548548
PER_DIEM: 'Per_Diem',
549+
PER_DIEM_SETTINGS: 'Per_Diem_Settings',
549550
},
550551

551552
EDIT_REQUEST: {

src/languages/en.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2526,6 +2526,7 @@ const translations = {
25262526
return 'Member';
25272527
}
25282528
},
2529+
defaultCategory: 'Default category',
25292530
},
25302531
perDiem: {
25312532
subtitle: 'Set per diem rates to control daily employee spend. ',
@@ -4091,7 +4092,6 @@ const translations = {
40914092
unit: 'Unit',
40924093
taxFeatureNotEnabledMessage: 'Taxes must be enabled on the workspace to use this feature. Head over to ',
40934094
changePromptMessage: ' to make that change.',
4094-
defaultCategory: 'Default category',
40954095
deleteDistanceRate: 'Delete distance rate',
40964096
areYouSureDelete: () => ({
40974097
one: 'Are you sure you want to delete this rate?',

src/languages/es.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2550,6 +2550,7 @@ const translations = {
25502550
return 'Miembro';
25512551
}
25522552
},
2553+
defaultCategory: 'Categoría predeterminada',
25532554
},
25542555
perDiem: {
25552556
subtitle: 'Establece las tasas per diem para controlar los gastos diarios de los empleados. ',
@@ -4136,7 +4137,6 @@ const translations = {
41364137
unit: 'Unidad',
41374138
taxFeatureNotEnabledMessage: 'Los impuestos deben estar activados en el área de trabajo para poder utilizar esta función. Dirígete a ',
41384139
changePromptMessage: ' para hacer ese cambio.',
4139-
defaultCategory: 'Categoría predeterminada',
41404140
deleteDistanceRate: 'Eliminar tasa de distancia',
41414141
areYouSureDelete: () => ({
41424142
one: '¿Estás seguro de que quieres eliminar esta tasa?',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type EnableDistanceRequestTaxParams = {
2+
policyID: string;
3+
customUnit: string;
4+
};
5+
6+
export default EnableDistanceRequestTaxParams;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type SetCustomUnitDefaultCategoryParams = {
2+
policyID: string;
3+
customUnitID: string;
4+
category: string;
5+
};
6+
7+
export default SetCustomUnitDefaultCategoryParams;

src/libs/API/parameters/SetPolicyDistanceRatesDefaultCategoryParams.ts

-6
This file was deleted.

src/libs/API/parameters/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ export type {default as EnablePolicyTaxesParams} from './EnablePolicyTaxesParams
206206
export type {default as OpenPolicyMoreFeaturesPageParams} from './OpenPolicyMoreFeaturesPageParams';
207207
export type {default as CreatePolicyDistanceRateParams} from './CreatePolicyDistanceRateParams';
208208
export type {default as SetPolicyDistanceRatesUnitParams} from './SetPolicyDistanceRatesUnitParams';
209-
export type {default as SetPolicyDistanceRatesDefaultCategoryParams} from './SetPolicyDistanceRatesDefaultCategoryParams';
209+
export type {default as EnableDistanceRequestTaxParams} from './EnableDistanceRequestTaxParams';
210+
export type {default as SetCustomUnitDefaultCategoryParams} from './SetCustomUnitDefaultCategoryParams';
210211
export type {default as UpdatePolicyDistanceRateValueParams} from './UpdatePolicyDistanceRateValueParams';
211212
export type {default as SetPolicyDistanceRatesEnabledParams} from './SetPolicyDistanceRatesEnabledParams';
212213
export type {default as DeletePolicyDistanceRatesParams} from './DeletePolicyDistanceRatesParams';

src/libs/API/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ const WRITE_COMMANDS = {
285285
REQUEST_WORKSPACE_OWNER_CHANGE: 'RequestWorkspaceOwnerChange',
286286
ADD_BILLING_CARD_AND_REQUEST_WORKSPACE_OWNER_CHANGE: 'AddBillingCardAndRequestPolicyOwnerChange',
287287
SET_POLICY_DISTANCE_RATES_UNIT: 'SetPolicyDistanceRatesUnit',
288-
SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY: 'SetPolicyDistanceRatesDefaultCategory',
288+
SET_CUSTOM_UNIT_DEFAULT_CATEGORY: 'SetCustomUnitDefaultCategory',
289289
ENABLE_DISTANCE_REQUEST_TAX: 'EnableDistanceRequestTax',
290290
UPDATE_POLICY_DISTANCE_RATE_VALUE: 'UpdatePolicyDistanceRateValue',
291291
UPDATE_POLICY_DISTANCE_TAX_RATE_VALUE: 'UpdateDistanceTaxRate',
@@ -688,8 +688,8 @@ type WriteCommandParameters = {
688688
[WRITE_COMMANDS.RENAME_POLICY_TAX]: Parameters.RenamePolicyTaxParams;
689689
[WRITE_COMMANDS.UPDATE_POLICY_TAX_CODE]: Parameters.UpdatePolicyTaxCodeParams;
690690
[WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_UNIT]: Parameters.SetPolicyDistanceRatesUnitParams;
691-
[WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY]: Parameters.SetPolicyDistanceRatesDefaultCategoryParams;
692-
[WRITE_COMMANDS.ENABLE_DISTANCE_REQUEST_TAX]: Parameters.SetPolicyDistanceRatesDefaultCategoryParams;
691+
[WRITE_COMMANDS.SET_CUSTOM_UNIT_DEFAULT_CATEGORY]: Parameters.SetCustomUnitDefaultCategoryParams;
692+
[WRITE_COMMANDS.ENABLE_DISTANCE_REQUEST_TAX]: Parameters.EnableDistanceRequestTaxParams;
693693
[WRITE_COMMANDS.REPORT_EXPORT]: Parameters.ReportExportParams;
694694
[WRITE_COMMANDS.MARK_AS_EXPORTED]: Parameters.MarkAsExportedParams;
695695
[WRITE_COMMANDS.REQUEST_EXPENSIFY_CARD_LIMIT_INCREASE]: Parameters.RequestExpensifyCardLimitIncreaseParams;

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
570570
[SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AMOUNT]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesMaxExpenseAmountPage').default,
571571
[SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AGE]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesMaxExpenseAgePage').default,
572572
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesBillableDefaultPage').default,
573+
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/WorkspacePerDiemSettingsPage').default,
573574
});
574575

575576
const EnablePaymentsStackNavigator = createModalStackNavigator<EnablePaymentsNavigatorParamList>({

src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts

+1
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = {
245245
SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AGE,
246246
SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT,
247247
],
248+
[SCREENS.WORKSPACE.PER_DIEM]: [SCREENS.WORKSPACE.PER_DIEM_SETTINGS],
248249
};
249250

250251
export default FULL_SCREEN_TO_RHP_MAPPING;

src/libs/Navigation/linkingConfig/config.ts

+3
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,9 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
944944
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: {
945945
path: ROUTES.RULES_BILLABLE_DEFAULT.route,
946946
},
947+
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: {
948+
path: ROUTES.WORKSPACE_PER_DIEM_SETTINGS.route,
949+
},
947950
},
948951
},
949952
[SCREENS.RIGHT_MODAL.PRIVATE_NOTES]: {

src/libs/Navigation/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,9 @@ type SettingsNavigatorParamList = {
898898
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: {
899899
policyID: string;
900900
};
901+
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: {
902+
policyID: string;
903+
};
901904
} & ReimbursementAccountNavigatorParamList;
902905

903906
type NewChatNavigatorParamList = {

src/libs/actions/Policy/Category.ts

+13-13
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type {
1313
SetPolicyCategoryMaxAmountParams,
1414
SetPolicyCategoryReceiptsRequiredParams,
1515
SetPolicyCategoryTaxParams,
16-
SetPolicyDistanceRatesDefaultCategoryParams,
1716
SetWorkspaceCategoryDescriptionHintParams,
1817
UpdatePolicyCategoryGLCodeParams,
1918
} from '@libs/API/parameters';
@@ -28,13 +27,13 @@ import {translateLocal} from '@libs/Localize';
2827
import Log from '@libs/Log';
2928
import enhanceParameters from '@libs/Network/enhanceParameters';
3029
import * as OptionsListUtils from '@libs/OptionsListUtils';
31-
import {navigateWhenEnableFeature, removePendingFieldsFromCustomUnit} from '@libs/PolicyUtils';
30+
import {navigateWhenEnableFeature} from '@libs/PolicyUtils';
3231
import * as PolicyUtils from '@libs/PolicyUtils';
3332
import * as ReportUtils from '@libs/ReportUtils';
3433
import CONST from '@src/CONST';
3534
import ONYXKEYS from '@src/ONYXKEYS';
3635
import type {Policy, PolicyCategories, PolicyCategory, RecentlyUsedCategories, Report} from '@src/types/onyx';
37-
import type {ApprovalRule, CustomUnit, ExpenseRule} from '@src/types/onyx/Policy';
36+
import type {ApprovalRule, ExpenseRule} from '@src/types/onyx/Policy';
3837
import type {PolicyCategoryExpenseLimitType} from '@src/types/onyx/PolicyCategory';
3938
import type {OnyxData} from '@src/types/onyx/Request';
4039

@@ -1015,15 +1014,15 @@ function enablePolicyCategories(policyID: string, enabled: boolean) {
10151014
}
10161015
}
10171016

1018-
function setPolicyDistanceRatesDefaultCategory(policyID: string, currentCustomUnit: CustomUnit, newCustomUnit: CustomUnit) {
1017+
function setPolicyCustomUnitDefaultCategory(policyID: string, customUnitID: string, oldCategory: string | undefined, category: string) {
10191018
const optimisticData: OnyxUpdate[] = [
10201019
{
10211020
onyxMethod: Onyx.METHOD.MERGE,
10221021
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
10231022
value: {
10241023
customUnits: {
1025-
[newCustomUnit.customUnitID]: {
1026-
...newCustomUnit,
1024+
[customUnitID]: {
1025+
defaultCategory: category,
10271026
pendingFields: {defaultCategory: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE},
10281027
},
10291028
},
@@ -1037,7 +1036,7 @@ function setPolicyDistanceRatesDefaultCategory(policyID: string, currentCustomUn
10371036
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
10381037
value: {
10391038
customUnits: {
1040-
[newCustomUnit.customUnitID]: {
1039+
[customUnitID]: {
10411040
pendingFields: {defaultCategory: null},
10421041
},
10431042
},
@@ -1051,8 +1050,8 @@ function setPolicyDistanceRatesDefaultCategory(policyID: string, currentCustomUn
10511050
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
10521051
value: {
10531052
customUnits: {
1054-
[currentCustomUnit.customUnitID]: {
1055-
...currentCustomUnit,
1053+
[customUnitID]: {
1054+
defaultCategory: oldCategory,
10561055
errorFields: {defaultCategory: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')},
10571056
pendingFields: {defaultCategory: null},
10581057
},
@@ -1061,12 +1060,13 @@ function setPolicyDistanceRatesDefaultCategory(policyID: string, currentCustomUn
10611060
},
10621061
];
10631062

1064-
const params: SetPolicyDistanceRatesDefaultCategoryParams = {
1063+
const params = {
10651064
policyID,
1066-
customUnit: JSON.stringify(removePendingFieldsFromCustomUnit(newCustomUnit)),
1065+
customUnitID,
1066+
category,
10671067
};
10681068

1069-
API.write(WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY, params, {optimisticData, successData, failureData});
1069+
API.write(WRITE_COMMANDS.SET_CUSTOM_UNIT_DEFAULT_CATEGORY, params, {optimisticData, successData, failureData});
10701070
}
10711071

10721072
function downloadCategoriesCSV(policyID: string, onDownloadFailed: () => void) {
@@ -1364,7 +1364,7 @@ export {
13641364
setPolicyCategoryGLCode,
13651365
clearCategoryErrors,
13661366
enablePolicyCategories,
1367-
setPolicyDistanceRatesDefaultCategory,
1367+
setPolicyCustomUnitDefaultCategory,
13681368
deleteWorkspaceCategories,
13691369
buildOptimisticPolicyCategories,
13701370
setPolicyCategoryReceiptsRequired,

src/libs/actions/Policy/PerDiem.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as ReportUtils from '@libs/ReportUtils';
99
import CONST from '@src/CONST';
1010
import ONYXKEYS from '@src/ONYXKEYS';
1111
import type {Policy, Report} from '@src/types/onyx';
12+
import type {ErrorFields} from '@src/types/onyx/OnyxCommon';
1213
import type {OnyxData} from '@src/types/onyx/Request';
1314

1415
const allPolicies: OnyxCollection<Policy> = {};
@@ -119,4 +120,14 @@ function openPolicyPerDiemPage(policyID?: string) {
119120
API.read(READ_COMMANDS.OPEN_POLICY_PER_DIEM_RATES_PAGE, params);
120121
}
121122

122-
export {enablePerDiem, openPolicyPerDiemPage};
123+
function clearPolicyPerDiemRatesErrorFields(policyID: string, customUnitID: string, updatedErrorFields: ErrorFields) {
124+
Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
125+
customUnits: {
126+
[customUnitID]: {
127+
errorFields: updatedErrorFields,
128+
},
129+
},
130+
});
131+
}
132+
133+
export {enablePerDiem, openPolicyPerDiemPage, clearPolicyPerDiemRatesErrorFields};

src/pages/workspace/categories/WorkspaceCategoriesSettingsPage.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, {useMemo, useState} from 'react';
22
import {View} from 'react-native';
33
import {useOnyx} from 'react-native-onyx';
4+
import CategorySelectorModal from '@components/CategorySelector/CategorySelectorModal';
45
import HeaderWithBackButton from '@components/HeaderWithBackButton';
56
import ScreenWrapper from '@components/ScreenWrapper';
67
import SelectionList from '@components/SelectionList';
@@ -12,7 +13,6 @@ import Navigation from '@libs/Navigation/Navigation';
1213
import * as OptionsListUtils from '@libs/OptionsListUtils';
1314
import * as PolicyUtils from '@libs/PolicyUtils';
1415
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
15-
import CategorySelectorModal from '@pages/workspace/distanceRates/CategorySelector/CategorySelectorModal';
1616
import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections';
1717
import withPolicyConnections from '@pages/workspace/withPolicyConnections';
1818
import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow';

src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx

+4-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, {useState} from 'react';
33
import {View} from 'react-native';
44
import {useOnyx} from 'react-native-onyx';
55
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
6+
import CategorySelector from '@components/CategorySelector';
67
import HeaderWithBackButton from '@components/HeaderWithBackButton';
78
import OfflineWithFeedback from '@components/OfflineWithFeedback';
89
import ScreenWrapper from '@components/ScreenWrapper';
@@ -28,7 +29,6 @@ import ONYXKEYS from '@src/ONYXKEYS';
2829
import ROUTES from '@src/ROUTES';
2930
import type SCREENS from '@src/SCREENS';
3031
import type {CustomUnit} from '@src/types/onyx/Policy';
31-
import CategorySelector from './CategorySelector';
3232
import UnitSelector from './UnitSelector';
3333

3434
type PolicyDistanceRatesSettingsPageProps = StackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS>;
@@ -61,14 +61,11 @@ function PolicyDistanceRatesSettingsPage({route}: PolicyDistanceRatesSettingsPag
6161
};
6262

6363
const setNewCategory = (category: ListItem) => {
64-
if (!category.searchText || !customUnit) {
64+
if (!category.searchText || !customUnit || defaultCategory === category.searchText) {
6565
return;
6666
}
6767

68-
Category.setPolicyDistanceRatesDefaultCategory(policyID, customUnit, {
69-
...customUnit,
70-
defaultCategory: defaultCategory === category.searchText ? '' : category.searchText,
71-
});
68+
Category.setPolicyCustomUnitDefaultCategory(policyID, customUnitID, customUnit.defaultCategory, category.searchText);
7269
};
7370

7471
const clearErrorFields = (fieldName: keyof CustomUnit) => {
@@ -125,7 +122,7 @@ function PolicyDistanceRatesSettingsPage({route}: PolicyDistanceRatesSettingsPag
125122
>
126123
<CategorySelector
127124
policyID={policyID}
128-
label={translate('workspace.distanceRates.defaultCategory')}
125+
label={translate('workspace.common.defaultCategory')}
129126
defaultValue={defaultCategory}
130127
wrapperStyle={[styles.ph5, styles.mt3]}
131128
setNewCategory={setNewCategory}

src/pages/workspace/perDiem/WorkspacePerDiemPage.tsx

+2-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import * as Link from '@userActions/Link';
3939
import * as Modal from '@userActions/Modal';
4040
import * as PerDiem from '@userActions/Policy/PerDiem';
4141
import CONST from '@src/CONST';
42-
// import ROUTES from '@src/ROUTES';
42+
import ROUTES from '@src/ROUTES';
4343
import type SCREENS from '@src/SCREENS';
4444
import type {PendingAction} from '@src/types/onyx/OnyxCommon';
4545
import type {Rate} from '@src/types/onyx/Policy';
@@ -216,8 +216,7 @@ function WorkspacePerDiemPage({route}: WorkspacePerDiemPageProps) {
216216
);
217217

218218
const openSettings = () => {
219-
// TODO: Uncomment this when the import feature is ready
220-
// Navigation.navigate(ROUTES.WORKSPACE_PER_DIEM_RATES_SETTINGS.getRoute(policyID));
219+
Navigation.navigate(ROUTES.WORKSPACE_PER_DIEM_SETTINGS.getRoute(policyID));
221220
};
222221

223222
// eslint-disable-next-line @typescript-eslint/no-unused-vars

0 commit comments

Comments
 (0)