Skip to content

Commit 3967e86

Browse files
authored
Merge pull request #52197 from paultsimura/fix/49278-pending-refactor
fix: 0.00 for Pending... @1.00 / mi
2 parents 9d8571b + 139154c commit 3967e86

File tree

10 files changed

+148
-770
lines changed

10 files changed

+148
-770
lines changed

src/components/ReportActionItem/MoneyRequestView.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,9 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
200200
let amountDescription = `${translate('iou.amount')}`;
201201

202202
const hasRoute = TransactionUtils.hasRoute(transactionBackup ?? transaction, isDistanceRequest);
203-
const {unit, rate, currency} = DistanceRequestUtils.getRate({transaction, policy});
203+
const {unit, rate} = DistanceRequestUtils.getRate({transaction, policy});
204204
const distance = TransactionUtils.getDistanceInMeters(transactionBackup ?? transaction, unit);
205+
const currency = transactionCurrency ?? CONST.CURRENCY.USD;
205206
const rateToDisplay = DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, isOffline);
206207
const distanceToDisplay = DistanceRequestUtils.getDistanceForDisplay(hasRoute, distance, unit, rate, translate);
207208
let merchantTitle = isEmptyMerchant ? '' : transactionMerchant;

src/libs/API/parameters/EditMoneyRequestParams.ts

-14
This file was deleted.

src/libs/API/parameters/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ export type {default as StartSplitBillParams} from './StartSplitBillParams';
157157
export type {default as SendMoneyParams} from './SendMoneyParams';
158158
export type {default as ApproveMoneyRequestParams} from './ApproveMoneyRequestParams';
159159
export type {default as UnapproveExpenseReportParams} from './UnapproveExpenseReportParams';
160-
export type {default as EditMoneyRequestParams} from './EditMoneyRequestParams';
161160
export type {default as ReplaceReceiptParams} from './ReplaceReceiptParams';
162161
export type {default as SubmitReportParams} from './SubmitReportParams';
163162
export type {default as DetachReceiptParams} from './DetachReceiptParams';

src/libs/API/types.ts

-4
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ const WRITE_COMMANDS = {
192192
HOLD_MONEY_REQUEST: 'HoldRequest',
193193
UPDATE_BILLING_CARD_CURRENCY: 'UpdateBillingCardCurrency',
194194
UNHOLD_MONEY_REQUEST: 'UnHoldRequest',
195-
UPDATE_DISTANCE_REQUEST: 'UpdateDistanceRequest',
196195
REQUEST_MONEY: 'RequestMoney',
197196
SPLIT_BILL: 'SplitBill',
198197
SPLIT_BILL_AND_OPEN_REPORT: 'SplitBillAndOpenReport',
@@ -203,7 +202,6 @@ const WRITE_COMMANDS = {
203202
SEND_MONEY_WITH_WALLET: 'SendMoneyWithWallet',
204203
APPROVE_MONEY_REQUEST: 'ApproveMoneyRequest',
205204
UNAPPROVE_EXPENSE_REPORT: 'UnapproveExpenseReport',
206-
EDIT_MONEY_REQUEST: 'EditMoneyRequest',
207205
REPLACE_RECEIPT: 'ReplaceReceipt',
208206
SUBMIT_REPORT: 'SubmitReport',
209207
DETACH_RECEIPT: 'DetachReceipt',
@@ -616,7 +614,6 @@ type WriteCommandParameters = {
616614
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DESCRIPTION]: Parameters.UpdateMoneyRequestParams;
617615
[WRITE_COMMANDS.HOLD_MONEY_REQUEST]: Parameters.HoldMoneyRequestParams;
618616
[WRITE_COMMANDS.UNHOLD_MONEY_REQUEST]: Parameters.UnHoldMoneyRequestParams;
619-
[WRITE_COMMANDS.UPDATE_DISTANCE_REQUEST]: Parameters.UpdateMoneyRequestParams;
620617
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST_AMOUNT_AND_CURRENCY]: Parameters.UpdateMoneyRequestParams;
621618
[WRITE_COMMANDS.REQUEST_MONEY]: Parameters.RequestMoneyParams;
622619
[WRITE_COMMANDS.SPLIT_BILL]: Parameters.SplitBillParams;
@@ -628,7 +625,6 @@ type WriteCommandParameters = {
628625
[WRITE_COMMANDS.SEND_MONEY_WITH_WALLET]: Parameters.SendMoneyParams;
629626
[WRITE_COMMANDS.APPROVE_MONEY_REQUEST]: Parameters.ApproveMoneyRequestParams;
630627
[WRITE_COMMANDS.UNAPPROVE_EXPENSE_REPORT]: Parameters.UnapproveExpenseReportParams;
631-
[WRITE_COMMANDS.EDIT_MONEY_REQUEST]: Parameters.EditMoneyRequestParams;
632628
[WRITE_COMMANDS.REPLACE_RECEIPT]: Parameters.ReplaceReceiptParams;
633629
[WRITE_COMMANDS.SUBMIT_REPORT]: Parameters.SubmitReportParams;
634630
[WRITE_COMMANDS.DETACH_RECEIPT]: Parameters.DetachReceiptParams;

src/libs/DistanceRequestUtils.ts

+9
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,14 @@ function getUpdatedDistanceUnit({transaction, policy, policyDraft}: {transaction
364364
return getRate({transaction, policy, policyDraft, useTransactionDistanceUnit: false}).unit;
365365
}
366366

367+
/**
368+
* Get the mileage rate by its ID in the form it's configured for the policy.
369+
* If not found, return undefined.
370+
*/
371+
function getRateByCustomUnitRateID({customUnitRateID, policy}: {customUnitRateID: string; policy: OnyxEntry<Policy>}): MileageRate | undefined {
372+
return getMileageRates(policy, true, customUnitRateID)[customUnitRateID];
373+
}
374+
367375
export default {
368376
getDefaultMileageRate,
369377
getDistanceMerchant,
@@ -378,6 +386,7 @@ export default {
378386
getDistanceUnit,
379387
getUpdatedDistanceUnit,
380388
getRate,
389+
getRateByCustomUnitRateID,
381390
};
382391

383392
export type {MileageRate};

src/libs/ReportUtils.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -3709,12 +3709,10 @@ function getModifiedExpenseOriginalMessage(
37093709
originalMessage.oldCurrency = TransactionUtils.getCurrency(oldTransaction);
37103710
originalMessage.oldMerchant = TransactionUtils.getMerchant(oldTransaction);
37113711

3712-
const modifiedDistanceFields = TransactionUtils.calculateAmountForUpdatedWaypointOrRate(updatedTransaction, transactionChanges, policy, isFromExpenseReport);
3713-
37143712
// For the originalMessage, we should use the non-negative amount, similar to what TransactionUtils.getAmount does for oldAmount
3715-
originalMessage.amount = Math.abs(modifiedDistanceFields.modifiedAmount);
3716-
originalMessage.currency = modifiedDistanceFields.modifiedCurrency ?? CONST.CURRENCY.USD;
3717-
originalMessage.merchant = modifiedDistanceFields.modifiedMerchant;
3713+
originalMessage.amount = Math.abs(updatedTransaction.modifiedAmount ?? 0);
3714+
originalMessage.currency = updatedTransaction.modifiedCurrency ?? CONST.CURRENCY.USD;
3715+
originalMessage.merchant = updatedTransaction.modifiedMerchant;
37183716
}
37193717

37203718
return originalMessage;

src/libs/TransactionUtils/index.ts

+58-50
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,19 @@ function areRequiredFieldsEmpty(transaction: OnyxEntry<Transaction>): boolean {
249249
/**
250250
* Given the edit made to the expense, return an updated transaction object.
251251
*/
252-
function getUpdatedTransaction(transaction: Transaction, transactionChanges: TransactionChanges, isFromExpenseReport: boolean, shouldUpdateReceiptState = true): Transaction {
252+
function getUpdatedTransaction({
253+
transaction,
254+
transactionChanges,
255+
isFromExpenseReport,
256+
shouldUpdateReceiptState = true,
257+
policy = undefined,
258+
}: {
259+
transaction: Transaction;
260+
transactionChanges: TransactionChanges;
261+
isFromExpenseReport: boolean;
262+
shouldUpdateReceiptState?: boolean;
263+
policy?: OnyxEntry<Policy>;
264+
}): Transaction {
253265
// Only changing the first level fields so no need for deep clone now
254266
const updatedTransaction = lodashDeepClone(transaction);
255267
let shouldStopSmartscan = false;
@@ -281,7 +293,29 @@ function getUpdatedTransaction(transaction: Transaction, transactionChanges: Tra
281293

282294
if (Object.hasOwn(transactionChanges, 'waypoints')) {
283295
updatedTransaction.modifiedWaypoints = transactionChanges.waypoints;
296+
updatedTransaction.isLoading = true;
284297
shouldStopSmartscan = true;
298+
299+
if (!transactionChanges.routes?.route0?.geometry?.coordinates) {
300+
// The waypoints were changed, but there is no route – it is pending from the BE and we should mark the fields as pending
301+
updatedTransaction.amount = CONST.IOU.DEFAULT_AMOUNT;
302+
updatedTransaction.modifiedAmount = CONST.IOU.DEFAULT_AMOUNT;
303+
updatedTransaction.modifiedMerchant = Localize.translateLocal('iou.fieldPending');
304+
} else {
305+
const mileageRate = DistanceRequestUtils.getRate({transaction: updatedTransaction, policy});
306+
const {unit, rate} = mileageRate;
307+
308+
const distanceInMeters = getDistanceInMeters(transaction, unit);
309+
const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
310+
const updatedAmount = isFromExpenseReport ? -amount : amount;
311+
const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, transaction.currency, Localize.translateLocal, (digit) =>
312+
toLocaleDigit(preferredLocale, digit),
313+
);
314+
315+
updatedTransaction.amount = updatedAmount;
316+
updatedTransaction.modifiedAmount = updatedAmount;
317+
updatedTransaction.modifiedMerchant = updatedMerchant;
318+
}
285319
}
286320

287321
if (Object.hasOwn(transactionChanges, 'customUnitRateID')) {
@@ -290,20 +324,38 @@ function getUpdatedTransaction(transaction: Transaction, transactionChanges: Tra
290324
shouldStopSmartscan = true;
291325

292326
const existingDistanceUnit = transaction?.comment?.customUnit?.distanceUnit;
293-
const allReports = ReportConnection.getAllReports();
294-
const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction.reportID}`] ?? null;
295-
const policyID = report?.policyID ?? '';
296-
const policy = PolicyUtils.getPolicy(policyID);
297327

298328
// Get the new distance unit from the rate's unit
299329
const newDistanceUnit = DistanceRequestUtils.getUpdatedDistanceUnit({transaction: updatedTransaction, policy});
330+
lodashSet(updatedTransaction, 'comment.customUnit.distanceUnit', newDistanceUnit);
300331

301332
// If the distanceUnit is set and the rate is changed to one that has a different unit, convert the distance to the new unit
302333
if (existingDistanceUnit && newDistanceUnit !== existingDistanceUnit) {
303334
const conversionFactor = existingDistanceUnit === CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES ? CONST.CUSTOM_UNITS.MILES_TO_KILOMETERS : CONST.CUSTOM_UNITS.KILOMETERS_TO_MILES;
304335
const distance = NumberUtils.roundToTwoDecimalPlaces((transaction?.comment?.customUnit?.quantity ?? 0) * conversionFactor);
305336
lodashSet(updatedTransaction, 'comment.customUnit.quantity', distance);
306-
lodashSet(updatedTransaction, 'pendingFields.merchant', CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE);
337+
}
338+
339+
if (!isFetchingWaypointsFromServer(transaction)) {
340+
// When the waypoints are being fetched from the server, we have no information about the distance, and cannot recalculate the updated amount.
341+
// Otherwise, recalculate the fields based on the new rate.
342+
343+
const oldMileageRate = DistanceRequestUtils.getRate({transaction, policy});
344+
const updatedMileageRate = DistanceRequestUtils.getRate({transaction: updatedTransaction, policy, useTransactionDistanceUnit: false});
345+
const {unit, rate} = updatedMileageRate;
346+
347+
const distanceInMeters = getDistanceInMeters(transaction, oldMileageRate?.unit);
348+
const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
349+
const updatedAmount = isFromExpenseReport ? -amount : amount;
350+
const updatedCurrency = updatedMileageRate.currency ?? CONST.CURRENCY.USD;
351+
const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, updatedCurrency, Localize.translateLocal, (digit) =>
352+
toLocaleDigit(preferredLocale, digit),
353+
);
354+
355+
updatedTransaction.amount = updatedAmount;
356+
updatedTransaction.modifiedAmount = updatedAmount;
357+
updatedTransaction.modifiedMerchant = updatedMerchant;
358+
updatedTransaction.modifiedCurrency = updatedCurrency;
307359
}
308360
}
309361

@@ -861,49 +913,6 @@ function calculateTaxAmount(percentage: string, amount: number, currency: string
861913
return parseFloat(taxAmount.toFixed(decimals));
862914
}
863915

864-
/**
865-
* Calculates updated amount, currency, and merchant for a distance request with modified waypoints or customUnitRateID
866-
*/
867-
function calculateAmountForUpdatedWaypointOrRate(
868-
transaction: OnyxInputOrEntry<Transaction>,
869-
transactionChanges: TransactionChanges,
870-
policy: OnyxInputOrEntry<Policy>,
871-
isFromExpenseReport: boolean,
872-
) {
873-
const hasModifiedRouteWithPendingWaypoints = !isEmptyObject(transactionChanges.waypoints) && isEmptyObject(transactionChanges?.routes?.route0?.geometry);
874-
const hasModifiedRateWithPendingWaypoints = !!transactionChanges?.customUnitRateID && isFetchingWaypointsFromServer(transaction);
875-
if (hasModifiedRouteWithPendingWaypoints || hasModifiedRateWithPendingWaypoints) {
876-
return {
877-
amount: CONST.IOU.DEFAULT_AMOUNT,
878-
modifiedAmount: CONST.IOU.DEFAULT_AMOUNT,
879-
modifiedMerchant: Localize.translateLocal('iou.fieldPending'),
880-
};
881-
}
882-
883-
const customUnitRateID = transactionChanges.customUnitRateID ?? getRateID(transaction) ?? '';
884-
const mileageRates = DistanceRequestUtils.getMileageRates(policy, true);
885-
const policyCurrency = policy?.outputCurrency ?? PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD;
886-
const mileageRate = isCustomUnitRateIDForP2P(transaction)
887-
? DistanceRequestUtils.getRateForP2P(policyCurrency, transaction ?? undefined)
888-
: mileageRates?.[customUnitRateID] ?? DistanceRequestUtils.getDefaultMileageRate(policy);
889-
const {unit, rate, currency} = mileageRate;
890-
891-
const distanceInMeters = getDistanceInMeters(transaction, unit);
892-
const amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0);
893-
const updatedAmount = isFromExpenseReport ? -amount : amount;
894-
const updatedCurrency = currency ?? CONST.CURRENCY.USD;
895-
const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, updatedCurrency, Localize.translateLocal, (digit) =>
896-
toLocaleDigit(preferredLocale, digit),
897-
);
898-
899-
return {
900-
amount: updatedAmount,
901-
modifiedAmount: updatedAmount,
902-
modifiedMerchant: updatedMerchant,
903-
modifiedCurrency: updatedCurrency,
904-
};
905-
}
906-
907916
/**
908917
* Calculates count of all tax enabled options
909918
*/
@@ -1216,7 +1225,6 @@ function buildTransactionsMergeParams(reviewDuplicates: OnyxEntry<ReviewDuplicat
12161225
export {
12171226
buildOptimisticTransaction,
12181227
calculateTaxAmount,
1219-
calculateAmountForUpdatedWaypointOrRate,
12201228
getWorkspaceTaxesSettingsName,
12211229
getDefaultTaxCode,
12221230
transformedTaxRates,

0 commit comments

Comments
 (0)