Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Mobile-Expensify
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
versionCode 1009031606
versionName "9.3.16-6"
versionCode 1009031607
versionName "9.3.16-7"
// Supported language variants must be declared here to avoid from being removed during the compilation.
// This also helps us to not include unnecessary language variants in the APK.
resConfigs "en", "es"
Expand Down
2 changes: 1 addition & 1 deletion ios/NewExpensify/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>9.3.16.6</string>
<string>9.3.16.7</string>
<key>FullStory</key>
<dict>
<key>OrgId</key>
Expand Down
2 changes: 1 addition & 1 deletion ios/NotificationServiceExtension/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<key>CFBundleShortVersionString</key>
<string>9.3.16</string>
<key>CFBundleVersion</key>
<string>9.3.16.6</string>
<string>9.3.16.7</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
Expand Down
2 changes: 1 addition & 1 deletion ios/ShareViewController/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<key>CFBundleShortVersionString</key>
<string>9.3.16</string>
<key>CFBundleVersion</key>
<string>9.3.16.6</string>
<string>9.3.16.7</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
"version": "9.3.16-6",
"version": "9.3.16-7",
"author": "Expensify, Inc.",
"homepage": "https://new.expensify.com",
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
Expand Down
22 changes: 18 additions & 4 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
setIndividualShare,
setMoneyRequestAmount,
setMoneyRequestCategory,
setMoneyRequestDistance,
setMoneyRequestMerchant,
setMoneyRequestPendingFields,
setMoneyRequestTag,
Expand All @@ -35,6 +36,7 @@ import {getIsMissingAttendeesViolation} from '@libs/AttendeeUtils';
import {isCategoryDescriptionRequired} from '@libs/CategoryUtils';
import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils';
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
import {calculateGPSDistance} from '@libs/GPSDraftDetailsUtils';
import {calculateAmount, insertTagIntoTransactionTagsString, isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil} from '@libs/IOUUtils';
import Log from '@libs/Log';
import {validateAmount} from '@libs/MoneyRequestUtils';
Expand Down Expand Up @@ -345,8 +347,8 @@ function MoneyRequestConfirmationList({
return;
}

setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy);
}, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy]);
setCustomUnitRateID(transactionID, lastSelectedRate);
}, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense]);

const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft});
const rate = mileageRate.rate;
Expand Down Expand Up @@ -393,6 +395,19 @@ function MoneyRequestConfirmationList({

const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0);

// Update GPS distance whenever the current distance unit differs from the one that was used
// to calculate the distance stored in transaction.comment.customUnit.quantity
const gpsDistance = transaction?.comment?.customUnit?.quantity;
const gpsDistanceWithCurrentDistanceUnit = calculateGPSDistance(distance, unit);
const shouldUpdateGpsDistance = isGPSDistanceRequest && gpsDistance !== gpsDistanceWithCurrentDistanceUnit;
useEffect(() => {
if (!shouldUpdateGpsDistance || !transactionID || isReadOnly) {
return;
}

setMoneyRequestDistance(transactionID, gpsDistanceWithCurrentDistanceUnit, true);
}, [shouldUpdateGpsDistance, transactionID, isReadOnly, gpsDistanceWithCurrentDistanceUnit]);

let amountToBeUsed = iouAmount;

if (shouldCalculateDistanceAmount) {
Expand Down Expand Up @@ -499,7 +514,7 @@ function MoneyRequestConfirmationList({
// If there is a distance rate in the policy that matches the rate and unit of the currently selected mileage rate, select it automatically
const matchingRate = Object.values(policyRates).find((policyRate) => policyRate.rate === mileageRate.rate && policyRate.unit === mileageRate.unit);
if (matchingRate?.customUnitRateID) {
setCustomUnitRateID(transactionID, matchingRate.customUnitRateID, transaction, policy);
setCustomUnitRateID(transactionID, matchingRate.customUnitRateID);
return;
}

Expand All @@ -516,7 +531,6 @@ function MoneyRequestConfirmationList({
isMovingTransactionFromTrackExpense,
setFormError,
clearFormErrors,
transaction,
]);

const routeError = Object.values(transaction?.errorFields?.route ?? {}).at(0);
Expand Down
2 changes: 1 addition & 1 deletion src/libs/GPSDraftDetailsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ function getGPSCoordinates(gpsDraftDetails: GpsDraftDetails | undefined): string
}

function calculateGPSDistance(distanceInMeters: number, unit: Unit): number {
return DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit);
return roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit));
}

function getGPSConvertedDistance(gpsDraftDetails: GpsDraftDetails | undefined, unit: Unit): number {
Expand Down
5 changes: 1 addition & 4 deletions src/libs/actions/IOU/MoneyRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -661,10 +661,7 @@ function handleMoneyRequestStepDistanceNavigation({
lastSelectedDistanceRates,
});
setTransactionReport(transactionID, {reportID: transactionReportID}, true);
// Do not pass transaction and policy so it only updates customUnitRateID without changing distance and distance unit
// as it is set for Manual requests before this function is called and transaction may have
// obsolete customUnit values
setCustomUnitRateID(transactionID, rateID, undefined, undefined);
setCustomUnitRateID(transactionID, rateID);
setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserAccountID).then(() => {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID));
});
Expand Down
47 changes: 6 additions & 41 deletions src/libs/actions/IOU/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
import {isOffline} from '@libs/Network/NetworkStore';
// eslint-disable-next-line @typescript-eslint/no-deprecated
import {buildNextStepNew, buildOptimisticNextStep} from '@libs/NextStepUtils';
import {roundToTwoDecimalPlaces} from '@libs/NumberUtils';
import * as NumberUtils from '@libs/NumberUtils';
import {getManagerMcTestParticipant, getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils';
import Parser from '@libs/Parser';
Expand Down Expand Up @@ -1510,48 +1509,15 @@ function setMoneyRequestReceipt(transactionID: string, source: string, filename:
}

/**
* Set custom unit rateID for the transaction draft, also updates quantity and distanceUnit
* if passed transaction previously had it to make sure that transaction does not have inconsistent
* states (for example distanceUnit not matching distance unit of the new customUnitRateID)
* Set custom unit rateID for the transaction draft
*/
function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined, transaction: OnyxEntry<OnyxTypes.Transaction>, policy: OnyxEntry<OnyxTypes.Policy>) {
function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined) {
const isFakeP2PRate = customUnitRateID === CONST.CUSTOM_UNITS.FAKE_P2P_ID;

let newDistanceUnit: Unit | undefined;
let newQuantity: number | undefined;

if (customUnitRateID && transaction) {
const distanceRate = isFakeP2PRate
? DistanceRequestUtils.getRate({transaction, useTransactionDistanceUnit: false, policy})
: DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID});

const transactionDistanceUnit = transaction.comment?.customUnit?.distanceUnit;
const transactionQuantity = transaction.comment?.customUnit?.quantity;

const shouldUpdateDistanceUnit = !!transactionDistanceUnit && !!distanceRate?.unit;
const shouldUpdateQuantity = transactionQuantity !== null && transactionQuantity !== undefined;

if (shouldUpdateDistanceUnit) {
newDistanceUnit = distanceRate.unit;
}
if (shouldUpdateQuantity && !!distanceRate?.unit) {
const newQuantityInMeters = getDistanceInMeters(transaction, transactionDistanceUnit);

// getDistanceInMeters returns 0 only if there was not enough input to get the correct
// distance in meters or if the current transaction distance is 0
if (newQuantityInMeters !== 0) {
newQuantity = DistanceRequestUtils.convertDistanceUnit(newQuantityInMeters, distanceRate.unit);
}
}
}

Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {
comment: {
customUnit: {
customUnitRateID,
...(!isFakeP2PRate && {defaultP2PRate: null}),
distanceUnit: newDistanceUnit,
quantity: newQuantity,
},
},
});
Expand Down Expand Up @@ -1699,8 +1665,8 @@ function addSubrate(transaction: OnyxEntry<OnyxTypes.Transaction>, currentIndex:
Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction?.transactionID}`, newTransaction);
}

function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean, distanceUnit: Unit) {
Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat, distanceUnit}}});
function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean) {
Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat}}});
}

/**
Expand Down Expand Up @@ -1762,7 +1728,6 @@ function setMoneyRequestDistanceRate(transactionID: string, customUnitRateID: st
if (distanceRate?.unit && distanceRate?.unit !== transaction?.comment?.customUnit?.distanceUnit) {
newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), distanceRate.unit);
}

Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {
comment: {
customUnit: {
Expand Down Expand Up @@ -7174,7 +7139,7 @@ function trackExpense(params: CreateTrackExpenseParams) {
attendees: attendees ? JSON.stringify(attendees) : undefined,
currency,
comment,
distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined,
distance,
created,
merchant,
iouReportID: iouReport?.reportID,
Expand Down Expand Up @@ -8047,7 +8012,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest
createdIOUReportActionID,
reportPreviewReportActionID: reportPreviewAction.reportActionID,
waypoints: JSON.stringify(sanitizedWaypoints),
distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined,
distance,
receipt,
odometerStart,
odometerEnd,
Expand Down
2 changes: 1 addition & 1 deletion src/pages/iou/request/step/IOURequestStepDestination.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ function IOURequestStepDestination({
setCustomUnitID(transactionID, customUnit.customUnitID);
setMoneyRequestCategory(transactionID, customUnit?.defaultCategory ?? '', undefined);
}
setCustomUnitRateID(transactionID, destination.keyForList ?? '', transaction, policy);
setCustomUnitRateID(transactionID, destination.keyForList ?? '');
setMoneyRequestCurrency(transactionID, destination.currency);
clearSubrates(transactionID);
}
Expand Down
13 changes: 4 additions & 9 deletions src/pages/iou/request/step/IOURequestStepDistanceManual.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import Navigation from '@libs/Navigation/Navigation';
import {roundToTwoDecimalPlaces} from '@libs/NumberUtils';
import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from '@libs/ReportUtils';
import shouldUseDefaultExpensePolicyUtil from '@libs/shouldUseDefaultExpensePolicy';
import {getDistanceInMeters, getRateID} from '@libs/TransactionUtils';
import {getRateID} from '@libs/TransactionUtils';
import variables from '@styles/variables';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -101,12 +101,8 @@ function IOURequestStepDistanceManual({
const shouldUseDefaultExpensePolicy = useMemo(() => shouldUseDefaultExpensePolicyUtil(iouType, defaultExpensePolicy), [iouType, defaultExpensePolicy]);

const customUnitRateID = getRateID(transaction);
// to make sure the correct distance amount and unit will be shown we use distance unit
// from defaultExpensePolicy or current report's policy instead of from transaction and
// then we use transaction data (distanceUnit and quantity) for conversions
const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy, useTransactionDistanceUnit: false}).unit;
const distanceInMeters = getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit ? transaction.comment.customUnit.distanceUnit : unit);
const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)) : undefined;
const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy}).unit;
const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined;
const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);

useEffect(() => {
Expand Down Expand Up @@ -153,7 +149,7 @@ function IOURequestStepDistanceManual({
const navigateToNextPage = useCallback(
(amount: string) => {
const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(amount));
setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft, unit);
setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft);

if (action === CONST.IOU.ACTION.EDIT) {
if (distance !== distanceAsFloat) {
Expand Down Expand Up @@ -247,7 +243,6 @@ function IOURequestStepDistanceManual({
policyCategories,
parentReportNextStep,
recentWaypoints,
unit,
selfDMReport,
betas,
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ function IOURequestStepDistanceOdometer({
const calculatedDistance = roundToTwoDecimalPlaces(distance);

// Store total distance in transaction.comment.customUnit.quantity
setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft, unit);
setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft);

if (isEditing) {
// Update existing transaction
Expand Down Expand Up @@ -509,7 +509,7 @@ function IOURequestStepDistanceOdometer({
lastSelectedDistanceRates,
});
setTransactionReport(transactionID, {reportID: transactionReportID}, true);
setCustomUnitRateID(transactionID, rateID, transaction, policy);
setCustomUnitRateID(transactionID, rateID);
setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID).then(() => {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
Expand Down
20 changes: 4 additions & 16 deletions src/pages/iou/request/step/IOURequestStepParticipants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ function IOURequestStepParticipants({

const rateID = CONST.CUSTOM_UNITS.FAKE_P2P_ID;
for (const transaction of transactions) {
setCustomUnitRateID(transaction.transactionID, rateID, transaction, activePolicy);
setCustomUnitRateID(transaction.transactionID, rateID);
const shouldSetParticipantAutoAssignment = iouType === CONST.IOU.TYPE.CREATE;
setMoneyRequestParticipantsFromReport(
transaction.transactionID,
Expand All @@ -215,19 +215,7 @@ function IOURequestStepParticipants({
}
});
});
}, [
selfDMReportID,
transactions,
action,
initialTransactionID,
waitForKeyboardDismiss,
iouType,
selfDMReport,
currentUserPersonalDetails.accountID,
isActivePolicyRequest,
backTo,
activePolicy,
]);
}, [selfDMReportID, transactions, action, initialTransactionID, waitForKeyboardDismiss, iouType, selfDMReport, currentUserPersonalDetails.accountID, isActivePolicyRequest, backTo]);

const addParticipant = useCallback(
(val: Participant[]) => {
Expand Down Expand Up @@ -264,11 +252,11 @@ function IOURequestStepParticipants({

if (transactions.length > 0) {
for (const transaction of transactions) {
setCustomUnitRateID(transaction.transactionID, rateID, transaction, policy);
setCustomUnitRateID(transaction.transactionID, rateID);
}
} else {
// Fallback to using initialTransactionID directly
setCustomUnitRateID(initialTransactionID, rateID, undefined, policy);
setCustomUnitRateID(initialTransactionID, rateID);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/pages/iou/request/step/IOURequestStepReport.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {
// Clear subrates, and update customUnitID if policy changed for per diem transactions
if (policyChanged && isPerDiemTransaction) {
setCustomUnitID(transaction.transactionID, newCustomUnitID ?? CONST.CUSTOM_UNITS.FAKE_P2P_ID);
setCustomUnitRateID(transaction.transactionID, undefined, transaction, newPolicy);
setCustomUnitRateID(transaction.transactionID, undefined);
clearSubrates(transaction.transactionID);
}

Expand Down
2 changes: 1 addition & 1 deletion src/pages/iou/request/step/IOURequestStepUpgrade.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ function IOURequestStepUpgrade({
}
setTransactionReport(transactionID, {reportID: expenseReportID}, true);
// Let the confirmation step decide the distance rate because policy data is not fully available at this step
setCustomUnitRateID(transactionID, '-1', undefined, undefined);
setCustomUnitRateID(transactionID, '-1');
Navigation.setParams({reportID: expenseReportID});

navigateWithMicrotask(ROUTES.WORKSPACE_CREATE_DISTANCE_RATE_UPGRADE.getRoute(policyID, transactionID, expenseReportID));
Expand Down