@@ -345,7 +345,7 @@ function MoneyRequestView({
345345 const canEditDate =
346346 isEditable && canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . DATE , undefined , isChatReportArchived , undefined , transaction , moneyRequestReport , policy ) ;
347347
348- const canEditDistanceOrRate = isPolicyAccessible ( policy , currentUserEmailParam ) || isP2PDistanceRequest ;
348+ const canEditDistanceOrRate = isPolicyAccessible ( policy , currentUserEmailParam ) || isTrackExpense || isP2PDistanceRequest ;
349349
350350 const canEditDistance =
351351 ! isGPSDistanceRequest &&
@@ -421,10 +421,14 @@ function MoneyRequestView({
421421 const distance = getDistanceInMeters ( transactionBackup ?? updatedTransaction ?? transaction , unit ) ;
422422 const currency = transactionCurrency ?? CONST . CURRENCY . USD ;
423423 const hasRequiredCompanyCardViolation = transactionViolations . some ( ( violation ) => violation . name === CONST . VIOLATIONS . COMPANY_CARD_REQUIRED ) ;
424- const isCustomUnitOutOfPolicy = transactionViolations . some ( ( violation ) => violation . name === CONST . VIOLATIONS . CUSTOM_UNIT_OUT_OF_POLICY ) || ( isDistanceRequest && ! rate ) ;
424+ const isCustomUnitOutOfPolicy =
425+ ( transactionViolations . some ( ( violation ) => violation . name === CONST . VIOLATIONS . CUSTOM_UNIT_OUT_OF_POLICY ) || ( isDistanceRequest && ! rate ) ) && ! isTrackExpense ;
426+ const calculateFromTransactionData = isTrackExpense && ! rate ;
427+ const distanceUnit = calculateFromTransactionData ? transaction ?. comment ?. customUnit ?. distanceUnit : unit ;
428+ const distanceRate = calculateFromTransactionData ? ( transactionAmount ?? 0 ) / ( transaction ?. comment ?. customUnit ?. quantity ?? 1 ) : rate ;
425429 let rateToDisplay = isCustomUnitOutOfPolicy
426430 ? translate ( 'common.rateOutOfPolicy' )
427- : DistanceRequestUtils . getRateForDisplay ( unit , rate , currency , translate , toLocaleDigit , getCurrencySymbol , isOffline ) ;
431+ : DistanceRequestUtils . getRateForDisplay ( distanceUnit , distanceRate , currency , translate , toLocaleDigit , getCurrencySymbol , isOffline ) ;
428432 const distanceToDisplay = DistanceRequestUtils . getDistanceForDisplay ( hasRoute , distance , unit , rate , translate , undefined , isManualDistanceRequest ) ;
429433 let merchantTitle = isEmptyMerchant ? '' : transactionMerchant ;
430434 let amountTitle = formattedTransactionAmount ?. toString ( ) || '' ;
@@ -655,6 +659,35 @@ function MoneyRequestView({
655659 return ;
656660 }
657661
662+ if ( isTrackExpense ) {
663+ if ( shouldNavigateToUpgradePath && transactionThreadReport ) {
664+ Navigation . navigate (
665+ ROUTES . MONEY_REQUEST_UPGRADE . getRoute ( {
666+ action : CONST . IOU . ACTION . EDIT ,
667+ iouType,
668+ transactionID : transaction . transactionID ,
669+ reportID : transactionThreadReport ?. reportID ,
670+ upgradePath : CONST . UPGRADE_PATHS . DISTANCE_RATES ,
671+ } ) ,
672+ ) ;
673+ return ;
674+ }
675+ if ( ! policy && shouldSelectPolicy ) {
676+ Navigation . navigate (
677+ ROUTES . SET_DEFAULT_WORKSPACE . getRoute (
678+ ROUTES . MONEY_REQUEST_STEP_DISTANCE_RATE . getRoute (
679+ CONST . IOU . ACTION . EDIT ,
680+ iouType ,
681+ transaction . transactionID ,
682+ transactionThreadReport ?. reportID ,
683+ Navigation . getActiveRoute ( ) ,
684+ ) ,
685+ ) ,
686+ ) ;
687+ return ;
688+ }
689+ }
690+
658691 Navigation . navigate (
659692 ROUTES . MONEY_REQUEST_STEP_DISTANCE_RATE . getRoute (
660693 CONST . IOU . ACTION . EDIT ,
0 commit comments