Skip to content

Commit 9edca4b

Browse files
authored
Merge pull request Expensify#78109 from callstack-internal/feat/72239-per-diem-field
Enable creating per diem expense from self dm
2 parents 4b11f10 + e659a19 commit 9edca4b

21 files changed

Lines changed: 604 additions & 125 deletions

src/CONST/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,7 @@ const CONST = {
11451145
SPLIT_DISTANCE: 'splitDistance',
11461146
TRACK_MANUAL: 'trackManual',
11471147
TRACK_SCAN: 'trackScan',
1148+
TRACK_PER_DIEM: 'trackPerDiem',
11481149
TRACK_DISTANCE: 'trackDistance',
11491150
ASSIGN_TASK: 'assignTask',
11501151
SEND_MONEY: 'sendMoney',

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {MouseProvider} from '@hooks/useMouseContext';
1111
import useOnyx from '@hooks/useOnyx';
1212
import usePermissions from '@hooks/usePermissions';
1313
import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
14+
import usePolicyForTransaction from '@hooks/usePolicyForTransaction';
1415
import usePreferredPolicy from '@hooks/usePreferredPolicy';
1516
import usePrevious from '@hooks/usePrevious';
1617
import useThemeStyles from '@hooks/useThemeStyles';
@@ -270,7 +271,6 @@ function MoneyRequestConfirmationList({
270271
}: MoneyRequestConfirmationListProps) {
271272
const [policyCategoriesReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${policyID}`, {canBeMissing: true});
272273
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
273-
const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
274274
const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
275275
const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {canBeMissing: true});
276276
const [defaultMileageRateDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {
@@ -307,7 +307,14 @@ function MoneyRequestConfirmationList({
307307
);
308308

309309
const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
310-
const policy = isTrackExpense ? policyForMovingExpenses : (policyReal ?? policyDraft);
310+
const {policy} = usePolicyForTransaction({
311+
transaction,
312+
reportPolicyID: policyID,
313+
action,
314+
iouType,
315+
isPerDiemRequest,
316+
});
317+
311318
const policyCategories = policyCategoriesReal ?? policyCategoriesDraft;
312319
const defaultMileageRate = defaultMileageRateDraft ?? defaultMileageRateReal;
313320

src/hooks/usePolicyForTransaction.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,51 @@
1+
import {useMemo} from 'react';
12
import type {OnyxEntry} from 'react-native-onyx';
3+
import {getPolicyByCustomUnitID} from '@libs/PolicyUtils';
24
import {isExpenseUnreported} from '@libs/TransactionUtils';
35
import CONST from '@src/CONST';
46
import ONYXKEYS from '@src/ONYXKEYS';
5-
import type {Policy, Report, Transaction} from '@src/types/onyx';
7+
import type {Policy, Transaction} from '@src/types/onyx';
68
import useOnyx from './useOnyx';
79
import usePolicyForMovingExpenses from './usePolicyForMovingExpenses';
810

911
type UsePolicyForTransactionParams = {
1012
/** The transaction to determine the policy for */
1113
transaction: OnyxEntry<Transaction>;
1214

13-
/** The report associated with the transaction */
14-
report: OnyxEntry<Report>;
15+
/** The report policy ID associated with the transaction */
16+
reportPolicyID: string | undefined;
1517

1618
/** The current action being performed */
1719
action: string;
1820

1921
/** The type of IOU (split, track, submit, etc.) */
2022
iouType: string;
23+
24+
/** Indicates if the request is a per diem request */
25+
isPerDiemRequest?: boolean;
2126
};
2227

2328
type UsePolicyForTransactionResult = {
2429
/** The policy to use for the transaction */
2530
policy: OnyxEntry<Policy>;
2631
};
2732

28-
function usePolicyForTransaction({transaction, report, action, iouType}: UsePolicyForTransactionParams): UsePolicyForTransactionResult {
33+
function usePolicyForTransaction({transaction, reportPolicyID, action, iouType, isPerDiemRequest}: UsePolicyForTransactionParams): UsePolicyForTransactionResult {
2934
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
35+
36+
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
37+
38+
const customUnitPolicy = useMemo(() => {
39+
return getPolicyByCustomUnitID(transaction, allPolicies);
40+
}, [transaction, allPolicies]);
41+
42+
const [reportPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${reportPolicyID}`, {canBeMissing: true});
43+
3044
const isUnreportedExpense = isExpenseUnreported(transaction);
3145
const isCreatingTrackExpense = action === CONST.IOU.ACTION.CREATE && iouType === CONST.IOU.TYPE.TRACK;
3246

33-
const [reportPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
34-
const policy = isUnreportedExpense || isCreatingTrackExpense ? policyForMovingExpenses : reportPolicy;
47+
const policyForSelfDMExpense = isPerDiemRequest ? customUnitPolicy : policyForMovingExpenses;
48+
const policy = isUnreportedExpense || isCreatingTrackExpense ? policyForSelfDMExpense : reportPolicy;
3549

3650
return {policy};
3751
}

src/libs/API/parameters/CreatePerDiemRequestParams.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type CreatePerDiemRequestParams = {
1111
category?: string;
1212
description: string;
1313
tag?: string;
14-
iouReportID: string;
14+
iouReportID?: string;
1515
chatReportID: string;
1616
transactionID: string;
1717
reportActionID: string;

src/libs/QuickActionUtils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const getQuickActionIcon = (
2121
case CONST.QUICK_ACTIONS.REQUEST_DISTANCE:
2222
return icons.Car;
2323
case CONST.QUICK_ACTIONS.PER_DIEM:
24+
case CONST.QUICK_ACTIONS.TRACK_PER_DIEM:
2425
return icons.CalendarSolid;
2526
case CONST.QUICK_ACTIONS.SPLIT_MANUAL:
2627
case CONST.QUICK_ACTIONS.SPLIT_SCAN:
@@ -75,6 +76,7 @@ const getQuickActionTitle = (action: QuickActionName): TranslationPaths => {
7576
case CONST.QUICK_ACTIONS.TRACK_DISTANCE:
7677
return 'quickAction.recordDistance';
7778
case CONST.QUICK_ACTIONS.PER_DIEM:
79+
case CONST.QUICK_ACTIONS.TRACK_PER_DIEM:
7880
return 'quickAction.perDiem';
7981
case CONST.QUICK_ACTIONS.SPLIT_MANUAL:
8082
return 'quickAction.splitBill';
@@ -101,7 +103,7 @@ const isQuickActionAllowed = (
101103
isReportArchived: boolean | undefined,
102104
isRestrictedToPreferredPolicy = false,
103105
) => {
104-
if (quickAction?.action === CONST.QUICK_ACTIONS.PER_DIEM) {
106+
if (quickAction?.action === CONST.QUICK_ACTIONS.PER_DIEM || quickAction?.action === CONST.QUICK_ACTIONS.TRACK_PER_DIEM) {
105107
if (!quickActionPolicy?.arePerDiemRatesEnabled) {
106108
return false;
107109
}

0 commit comments

Comments
 (0)