Skip to content
Closed
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 src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1275,7 +1275,7 @@ export default withOnyx<MoneyRequestConfirmationListProps, MoneyRequestConfirmat
},
mileageRates: {
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
selector: (policy: OnyxEntry<OnyxTypes.Policy>) => DistanceRequestUtils.getMileageRates(policy),
selector: DistanceRequestUtils.getMileageRates,
},
policy: {
key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
Expand Down
2 changes: 1 addition & 1 deletion src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,7 @@ export default withOnyx<MoneyRequestViewPropsWithoutTransaction, MoneyRequestVie
},
distanceRates: {
key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`,
selector: (policy: OnyxEntry<OnyxTypes.Policy>) => DistanceRequestUtils.getMileageRates(policy, true),
selector: DistanceRequestUtils.getMileageRates,
},
})(
withOnyx<MoneyRequestViewProps, MoneyRequestViewTransactionOnyxProps>({
Expand Down
77 changes: 36 additions & 41 deletions src/libs/DistanceRequestUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import type {LastSelectedDistanceRates, Report} from '@src/types/onyx';
import type {Unit} from '@src/types/onyx/Policy';
import type Policy from '@src/types/onyx/Policy';
import type {EmptyObject} from '@src/types/utils/EmptyObject';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import * as CurrencyUtils from './CurrencyUtils';
import * as PolicyUtils from './PolicyUtils';
import * as ReportUtils from './ReportUtils';
Expand Down Expand Up @@ -39,35 +38,6 @@ Onyx.connect({
const METERS_TO_KM = 0.001; // 1 kilometer is 1000 meters
const METERS_TO_MILES = 0.000621371; // There are approximately 0.000621371 miles in a meter

function getMileageRates(policy: OnyxEntry<Policy>, includeDisabledRates = false): Record<string, MileageRate> {
const mileageRates: Record<string, MileageRate> = {};

if (!policy || !policy?.customUnits) {
return mileageRates;
}

const distanceUnit = PolicyUtils.getCustomUnit(policy);
if (!distanceUnit?.rates) {
return mileageRates;
}

Object.entries(distanceUnit.rates).forEach(([rateID, rate]) => {
if (!includeDisabledRates && !rate.enabled) {
return;
}

mileageRates[rateID] = {
rate: rate.rate,
currency: rate.currency,
unit: distanceUnit.attributes.unit,
name: rate.name,
customUnitRateID: rate.customUnitRateID,
};
});

return mileageRates;
}

/**
* Retrieves the default mileage rate based on a given policy.
*
Expand All @@ -79,17 +49,16 @@ function getMileageRates(policy: OnyxEntry<Policy>, includeDisabledRates = false
* @returns [unit] - The unit of measurement for the distance.
*/
function getDefaultMileageRate(policy: OnyxEntry<Policy> | EmptyObject): MileageRate | null {
if (isEmptyObject(policy) || !policy?.customUnits) {
if (!policy?.customUnits) {
return null;
}

const distanceUnit = PolicyUtils.getCustomUnit(policy);
if (!distanceUnit?.rates) {
return null;
}
const mileageRates = getMileageRates(policy);

const distanceRate = Object.values(mileageRates).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE) ?? Object.values(mileageRates)[0];
const distanceRate = Object.values(distanceUnit.rates).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE) ?? Object.values(distanceUnit.rates)[0];

return {
customUnitRateID: distanceRate.customUnitRateID,
Expand Down Expand Up @@ -210,6 +179,38 @@ function getDistanceMerchant(
return `${distanceInUnits} @ ${ratePerUnit}`;
}

/**
* Retrieves the mileage rates for given policy.
*
* @param policy - The policy from which to extract the mileage rates.
*
* @returns An array of mileage rates or an empty array if not found.
*/
function getMileageRates(policy: OnyxEntry<Policy>): Record<string, MileageRate> {
const mileageRates: Record<string, MileageRate> = {};

if (!policy || !policy?.customUnits) {
return mileageRates;
}

const distanceUnit = PolicyUtils.getCustomUnit(policy);
if (!distanceUnit?.rates) {
return mileageRates;
}

Object.entries(distanceUnit.rates).forEach(([rateID, rate]) => {
mileageRates[rateID] = {
rate: rate.rate,
currency: rate.currency,
unit: distanceUnit.attributes.unit,
name: rate.name,
customUnitRateID: rate.customUnitRateID,
};
});

return mileageRates;
}

/**
* Retrieves the rate and unit for a P2P distance expense for a given currency.
*
Expand Down Expand Up @@ -255,17 +256,11 @@ function getCustomUnitRateID(reportID: string) {
const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`] ?? null;
const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`] ?? null;
const policy = PolicyUtils.getPolicy(report?.policyID ?? parentReport?.policyID ?? '');

let customUnitRateID: string = CONST.CUSTOM_UNITS.FAKE_P2P_ID;

if (ReportUtils.isPolicyExpenseChat(report) || ReportUtils.isPolicyExpenseChat(parentReport)) {
const distanceUnit = Object.values(policy?.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
const lastSelectedDistanceRateID = lastSelectedDistanceRates?.[policy?.id ?? ''] ?? '';
const lastSelectedDistanceRate = distanceUnit?.rates[lastSelectedDistanceRateID] ?? {};
if (lastSelectedDistanceRate.enabled && lastSelectedDistanceRateID) {
customUnitRateID = lastSelectedDistanceRateID;
} else {
customUnitRateID = getDefaultMileageRate(policy)?.customUnitRateID ?? '';
}
customUnitRateID = lastSelectedDistanceRates?.[policy?.id ?? ''] ?? getDefaultMileageRate(policy)?.customUnitRateID ?? '';
}

return customUnitRateID;
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2392,7 +2392,7 @@ function calculateAmountForUpdatedWaypoint(
let updatedMerchant = Localize.translateLocal('iou.fieldPending');
if (!isEmptyObject(transactionChanges?.routes)) {
const customUnitRateID = TransactionUtils.getRateID(transaction) ?? '';
const mileageRates = DistanceRequestUtils.getMileageRates(policy, true);
const mileageRates = DistanceRequestUtils.getMileageRates(policy);
const policyCurrency = policy?.outputCurrency ?? PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD;
const mileageRate = TransactionUtils.isCustomUnitRateIDForP2P(transaction)
? DistanceRequestUtils.getRateForP2P(policyCurrency)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ const IOURequestStepDistanceRateWithOnyx = withOnyx<IOURequestStepDistanceRatePr
},
rates: {
key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? '0'}`,
selector: (policy: OnyxEntry<Policy>) => DistanceRequestUtils.getMileageRates(policy),
selector: DistanceRequestUtils.getMileageRates,
},
})(IOURequestStepDistanceRate);

Expand Down