-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Feat/36985 create new rate field #38543
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
Changes from all commits
1db16d9
2c19aa3
f3b17ad
b3e1f48
6e94444
e759979
cde1d19
c3cb80b
5bf399a
857c320
bf5e278
ef7b30e
6f3afdd
50174f3
eb3aff8
18e2c7c
1ddc839
7dc206c
7698b5a
a0227e0
eb350ee
af94a75
272c300
0682afb
6105b5d
063a8b6
7fe595a
9e68814
68eecf0
35baf30
e9a15d7
e9f448b
4217a98
ae3ded4
f432cb5
b100cf1
0826359
c7b8854
b16107a
3bd9aad
bd83588
27f1fc1
7712cec
72d3142
34908eb
fcbdddd
7bf1e97
6b04d40
fc2c260
7fb35ab
c37ef58
ddf117d
118aa7b
a9d6ef7
ec0bfec
1511b2e
5c03b38
96c281d
4658af3
2d99306
6234c99
96a7032
5de2028
80f9b5e
42206ee
8f26c89
592bf7a
dfa02a3
5dc83c5
410fdb1
3c47a2c
997ef8d
949bf4e
64951eb
28948ab
6bcd257
520cf1f
5b9b4d1
706ba6f
fb59ef1
2955ee9
05fe83a
f6ef05f
a73490b
779cbea
d6d6f96
fc8f59c
bdfbbdb
911d684
1a142b8
5229462
9c8fbdf
63c5edd
1bb47d0
8fe0f19
29da5dc
6bb3199
a93e729
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,13 +8,14 @@ import {withOnyx} from 'react-native-onyx'; | |
import type {OnyxEntry} from 'react-native-onyx'; | ||
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; | ||
import useLocalize from '@hooks/useLocalize'; | ||
import useNetwork from '@hooks/useNetwork'; | ||
import usePermissions from '@hooks/usePermissions'; | ||
import usePrevious from '@hooks/usePrevious'; | ||
import useTheme from '@hooks/useTheme'; | ||
import useThemeStyles from '@hooks/useThemeStyles'; | ||
import * as CurrencyUtils from '@libs/CurrencyUtils'; | ||
import DistanceRequestUtils from '@libs/DistanceRequestUtils'; | ||
import type {DefaultMileageRate} from '@libs/DistanceRequestUtils'; | ||
import type {MileageRate} from '@libs/DistanceRequestUtils'; | ||
import * as IOUUtils from '@libs/IOUUtils'; | ||
import Log from '@libs/Log'; | ||
import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; | ||
|
@@ -65,7 +66,13 @@ type MoneyRequestConfirmationListOnyxProps = { | |
session: OnyxEntry<OnyxTypes.Session>; | ||
|
||
/** Unit and rate used for if the expense is a distance expense */ | ||
mileageRate: OnyxEntry<DefaultMileageRate>; | ||
mileageRates: OnyxEntry<Record<string, MileageRate>>; | ||
|
||
/** Mileage rate default for the policy */ | ||
defaultMileageRate: OnyxEntry<MileageRate>; | ||
|
||
/** Last selected distance rates */ | ||
lastSelectedDistanceRates: OnyxEntry<Record<string, string>>; | ||
}; | ||
|
||
type MoneyRequestConfirmationListProps = MoneyRequestConfirmationListOnyxProps & { | ||
|
@@ -180,7 +187,7 @@ function MoneyRequestConfirmationList({ | |
isScanRequest = false, | ||
iouAmount, | ||
policyCategories, | ||
mileageRate, | ||
mileageRates, | ||
isDistanceRequest = false, | ||
policy, | ||
isPolicyExpenseChat = false, | ||
|
@@ -208,28 +215,50 @@ function MoneyRequestConfirmationList({ | |
onToggleBillable, | ||
hasSmartScanFailed, | ||
reportActionID, | ||
defaultMileageRate, | ||
lastSelectedDistanceRates, | ||
action = CONST.IOU.ACTION.CREATE, | ||
}: MoneyRequestConfirmationListProps) { | ||
const theme = useTheme(); | ||
const styles = useThemeStyles(); | ||
const {translate, toLocaleDigit} = useLocalize(); | ||
const currentUserPersonalDetails = useCurrentUserPersonalDetails(); | ||
const {canUseViolations} = usePermissions(); | ||
const {canUseP2PDistanceRequests, canUseViolations} = usePermissions(iouType); | ||
const {isOffline} = useNetwork(); | ||
|
||
const isTypeRequest = iouType === CONST.IOU.TYPE.REQUEST; | ||
const isTypeSplit = iouType === CONST.IOU.TYPE.SPLIT; | ||
const isTypeSend = iouType === CONST.IOU.TYPE.SEND; | ||
const isTypeTrackExpense = iouType === CONST.IOU.TYPE.TRACK_EXPENSE; | ||
|
||
const {unit, rate, currency} = mileageRate ?? { | ||
unit: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, | ||
rate: 0, | ||
currency: CONST.CURRENCY.USD, | ||
}; | ||
const distance = transaction?.routes?.route0.distance ?? 0; | ||
const shouldCalculateDistanceAmount = isDistanceRequest && iouAmount === 0; | ||
const taxRates = policy?.taxRates; | ||
const transactionID = transaction?.transactionID ?? ''; | ||
const customUnitRateID = TransactionUtils.getRateID(transaction) ?? ''; | ||
|
||
useEffect(() => { | ||
if (customUnitRateID || !canUseP2PDistanceRequests) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We shouldn't have returned early for P2P distance requests, instead we should had checked for |
||
return; | ||
} | ||
if (!customUnitRateID) { | ||
const rateID = lastSelectedDistanceRates?.[policy?.id ?? ''] ?? defaultMileageRate?.customUnitRateID ?? ''; | ||
IOU.setCustomUnitRateID(transactionID, rateID); | ||
} | ||
}, [defaultMileageRate, customUnitRateID, lastSelectedDistanceRates, policy?.id, canUseP2PDistanceRequests, transactionID]); | ||
|
||
const policyCurrency = policy?.outputCurrency ?? PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD; | ||
|
||
const mileageRate = TransactionUtils.isCustomUnitRateIDForP2P(transaction) | ||
? DistanceRequestUtils.getRateForP2P(policyCurrency) | ||
: mileageRates?.[customUnitRateID] ?? DistanceRequestUtils.getDefaultMileageRate(policy); | ||
|
||
const {unit, rate} = mileageRate ?? {}; | ||
|
||
const prevRate = usePrevious(rate); | ||
const shouldCalculateDistanceAmount = isDistanceRequest && (iouAmount === 0 || prevRate !== rate); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we need to also consider unit value to avoid issue #53988 |
||
|
||
const currency = (mileageRate as MileageRate)?.currency ?? policyCurrency; | ||
|
||
const distance = transaction?.routes?.route0?.distance ?? 0; | ||
const taxRates = policy?.taxRates ?? null; | ||
|
||
// A flag for showing the categories field | ||
const shouldShowCategories = isPolicyExpenseChat && (!!iouCategory || OptionsListUtils.hasEnabledOptions(Object.values(policyCategories ?? {}))); | ||
|
@@ -255,12 +284,12 @@ function MoneyRequestConfirmationList({ | |
// A flag for showing the billable field | ||
const shouldShowBillable = policy?.disabledFields?.defaultBillable === false; | ||
const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action); | ||
const hasRoute = TransactionUtils.hasRoute(transaction); | ||
const hasRoute = TransactionUtils.hasRoute(transaction, isDistanceRequest); | ||
const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate) && !isMovingTransactionFromTrackExpense; | ||
const formattedAmount = isDistanceRequestWithPendingRoute | ||
? '' | ||
: CurrencyUtils.convertToDisplayString( | ||
shouldCalculateDistanceAmount ? DistanceRequestUtils.getDistanceRequestAmount(distance, unit, rate ?? 0) : iouAmount, | ||
shouldCalculateDistanceAmount ? DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0) : iouAmount, | ||
isDistanceRequest ? currency : iouCurrencyCode, | ||
); | ||
const formattedTaxAmount = CurrencyUtils.convertToDisplayString(transaction?.taxAmount, iouCurrencyCode); | ||
|
@@ -329,7 +358,7 @@ function MoneyRequestConfirmationList({ | |
return; | ||
} | ||
|
||
const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit, rate ?? 0); | ||
const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); | ||
IOU.setMoneyRequestAmount(transactionID, amount, currency ?? ''); | ||
}, [shouldCalculateDistanceAmount, distance, rate, unit, transactionID, currency]); | ||
|
||
|
@@ -720,13 +749,50 @@ function MoneyRequestConfirmationList({ | |
style={[styles.moneyRequestMenuItem]} | ||
titleStyle={styles.flex1} | ||
onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams()))} | ||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing | ||
neil-marcellini marked this conversation as resolved.
Show resolved
Hide resolved
|
||
disabled={didConfirm} | ||
// todo: handle edit for transaction while moving from track expense | ||
interactive={!isReadOnly && !isMovingTransactionFromTrackExpense} | ||
/> | ||
), | ||
shouldShow: isDistanceRequest, | ||
isSupplementary: true, | ||
shouldShow: isDistanceRequest && !canUseP2PDistanceRequests, | ||
isSupplementary: false, | ||
}, | ||
{ | ||
item: ( | ||
<MenuItemWithTopDescription | ||
key={translate('common.distance')} | ||
shouldShowRightIcon={!isReadOnly} | ||
title={DistanceRequestUtils.getDistanceForDisplay(hasRoute, distance, unit, rate, translate)} | ||
description={translate('common.distance')} | ||
style={[styles.moneyRequestMenuItem]} | ||
titleStyle={styles.flex1} | ||
onPress={() => | ||
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(CONST.IOU.ACTION.CREATE, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams())) | ||
neil-marcellini marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
disabled={didConfirm} | ||
interactive={!isReadOnly} | ||
/> | ||
), | ||
shouldShow: isDistanceRequest && canUseP2PDistanceRequests, | ||
isSupplementary: false, | ||
}, | ||
{ | ||
item: ( | ||
<MenuItemWithTopDescription | ||
key={translate('common.rate')} | ||
shouldShowRightIcon={Boolean(rate) && !isReadOnly && isPolicyExpenseChat} | ||
title={DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, isOffline)} | ||
description={translate('common.rate')} | ||
style={[styles.moneyRequestMenuItem]} | ||
titleStyle={styles.flex1} | ||
onPress={() => Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRouteWithoutParams()))} | ||
disabled={didConfirm} | ||
interactive={Boolean(rate) && !isReadOnly && isPolicyExpenseChat} | ||
/> | ||
), | ||
shouldShow: isDistanceRequest && canUseP2PDistanceRequests, | ||
isSupplementary: false, | ||
}, | ||
{ | ||
item: ( | ||
|
@@ -986,11 +1052,18 @@ export default withOnyx<MoneyRequestConfirmationListProps, MoneyRequestConfirmat | |
policyTags: { | ||
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, | ||
}, | ||
mileageRate: { | ||
defaultMileageRate: { | ||
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, | ||
selector: DistanceRequestUtils.getDefaultMileageRate, | ||
}, | ||
mileageRates: { | ||
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, | ||
selector: DistanceRequestUtils.getMileageRates, | ||
}, | ||
policy: { | ||
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, | ||
}, | ||
lastSelectedDistanceRates: { | ||
key: ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, | ||
}, | ||
})(MoneyRequestConfirmationList); |
Uh oh!
There was an error while loading. Please reload this page.