diff --git a/src/CONST.ts b/src/CONST.ts index 9fde47bca7bf..5ea39f464e66 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -176,9 +176,9 @@ const onboardingPersonalSpendMessage: OnboardingMessage = { 'Here’s how to track an expense:\n' + '\n' + '1. Click the green *+* button.\n' + - '2. Choose *Track expense*.\n' + + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + - '4. Click *Track*.\n' + + '4. Click *Create*.\n' + '\n' + 'And you’re done! Yep, it’s that easy.', }, diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 54e55b064341..01539b0d5776 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -11,19 +11,45 @@ import {MouseProvider} from '@hooks/useMouseContext'; import usePrevious from '@hooks/usePrevious'; import useThemeStyles from '@hooks/useThemeStyles'; import blurActiveElement from '@libs/Accessibility/blurActiveElement'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; +// +import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency, getCurrencyDecimals} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; -import * as IOUUtils from '@libs/IOUUtils'; +import {calculateAmount, insertTagIntoTransactionTagsString, isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil} from '@libs/IOUUtils'; import Log from '@libs/Log'; -import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; +import {validateAmount} from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import {getDistanceRateCustomUnitRate, isTaxTrackingEnabled} from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getIOUConfirmationOptionsFromPayeePersonalDetail, hasEnabledOptions} from '@libs/OptionsListUtils'; +import {getDistanceRateCustomUnitRate, getTagLists, isTaxTrackingEnabled} from '@libs/PolicyUtils'; +import {isDraftReport, isOptimisticPersonalDetail} from '@libs/ReportUtils'; +import type {OptionData} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; -import * as IOU from '@userActions/IOU'; +import { + areRequiredFieldsEmpty, + calculateTaxAmount, + getDefaultTaxCode, + getDistanceInMeters, + getRateID, + getTag, + getTaxValue, + hasMissingSmartscanFields, + hasRoute as hasRouteUtil, + isMerchantMissing, + isScanRequest as isScanRequestUtil, +} from '@libs/TransactionUtils'; +import { + adjustRemainingSplitShares, + resetSplitShares, + setCustomUnitRateID, + setIndividualShare, + setMoneyRequestAmount, + setMoneyRequestCategory, + setMoneyRequestMerchant, + setMoneyRequestPendingFields, + setMoneyRequestTag, + setMoneyRequestTaxAmount, + setMoneyRequestTaxRate, + setSplitShares, +} from '@userActions/IOU'; import {hasInvoicingDetails} from '@userActions/Policy/Policy'; import type {IOUAction, IOUType} from '@src/CONST'; import CONST from '@src/CONST'; @@ -145,7 +171,7 @@ type MoneyRequestConfirmationListProps = { isConfirmed?: boolean; }; -type MoneyRequestConfirmationListItem = Participant | ReportUtils.OptionData; +type MoneyRequestConfirmationListItem = Participant | OptionData; function MoneyRequestConfirmationList({ transaction, @@ -204,10 +230,10 @@ function MoneyRequestConfirmationList({ const isTypeSend = iouType === CONST.IOU.TYPE.PAY; const isTypeTrackExpense = iouType === CONST.IOU.TYPE.TRACK; const isTypeInvoice = iouType === CONST.IOU.TYPE.INVOICE; - const isScanRequest = useMemo(() => TransactionUtils.isScanRequest(transaction), [transaction]); + const isScanRequest = useMemo(() => isScanRequestUtil(transaction), [transaction]); const transactionID = transaction?.transactionID; - const customUnitRateID = TransactionUtils.getRateID(transaction); + const customUnitRateID = getRateID(transaction); useEffect(() => { if (customUnitRateID !== '-1' || !isDistanceRequest || !transactionID || !policy?.id) { @@ -222,7 +248,7 @@ function MoneyRequestConfirmationList({ return; } - IOU.setCustomUnitRateID(transactionID, rateID); + setCustomUnitRateID(transactionID, rateID); }, [defaultMileageRate, customUnitRateID, lastSelectedDistanceRates, policy?.id, transactionID, isDistanceRequest]); const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft}); @@ -233,11 +259,11 @@ function MoneyRequestConfirmationList({ const prevCurrency = usePrevious(currency); // A flag for showing the categories field - const shouldShowCategories = (isPolicyExpenseChat || isTypeInvoice) && (!!iouCategory || OptionsListUtils.hasEnabledOptions(Object.values(policyCategories ?? {}))); + const shouldShowCategories = (isPolicyExpenseChat || isTypeInvoice) && (!!iouCategory || hasEnabledOptions(Object.values(policyCategories ?? {}))); const shouldShowMerchant = shouldShowSmartScanFields && !isDistanceRequest && !isTypeSend && !isPerDiemRequest; - const policyTagLists = useMemo(() => PolicyUtils.getTagLists(policyTags), [policyTags]); + const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]); const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest) && !isPerDiemRequest; @@ -259,26 +285,26 @@ function MoneyRequestConfirmationList({ ) { return; } - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction); - IOU.setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); + const defaultTaxCode = getDefaultTaxCode(policy, transaction); + setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); }, [customUnitRateID, policy, previousCustomUnitRateID, previousTransactionCurrency, previousTransactionModifiedCurrency, shouldShowTax, transaction, transactionID]); - const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action); + const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action); - const distance = TransactionUtils.getDistanceInMeters(transaction, unit); + const distance = getDistanceInMeters(transaction, unit); const prevDistance = usePrevious(distance); const shouldCalculateDistanceAmount = isDistanceRequest && (iouAmount === 0 || prevRate !== rate || prevDistance !== distance || prevCurrency !== currency); - const hasRoute = TransactionUtils.hasRoute(transaction, isDistanceRequest); + const hasRoute = hasRouteUtil(transaction, isDistanceRequest); const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate) && !isMovingTransactionFromTrackExpense; const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); const formattedAmount = isDistanceRequestWithPendingRoute ? '' - : CurrencyUtils.convertToDisplayString(shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount, isDistanceRequest ? currency : iouCurrencyCode); + : convertToDisplayString(shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount, isDistanceRequest ? currency : iouCurrencyCode); const formattedAmountPerAttendee = isDistanceRequestWithPendingRoute ? '' - : CurrencyUtils.convertToDisplayString( + : convertToDisplayString( (shouldCalculateDistanceAmount ? distanceRequestAmount : iouAmount) / (iouAttendees?.length && iouAttendees.length > 0 ? iouAttendees.length : 1), isDistanceRequest ? currency : iouCurrencyCode, ); @@ -293,25 +319,20 @@ function MoneyRequestConfirmationList({ return false; } - return (!!hasSmartScanFailed && TransactionUtils.hasMissingSmartscanFields(transaction)) || (didConfirmSplit && TransactionUtils.areRequiredFieldsEmpty(transaction)); + return (!!hasSmartScanFailed && hasMissingSmartscanFields(transaction)) || (didConfirmSplit && areRequiredFieldsEmpty(transaction)); }, [isEditingSplitBill, hasSmartScanFailed, transaction, didConfirmSplit]); - const isMerchantEmpty = useMemo(() => !iouMerchant || TransactionUtils.isMerchantMissing(transaction), [transaction, iouMerchant]); + const isMerchantEmpty = useMemo(() => !iouMerchant || isMerchantMissing(transaction), [transaction, iouMerchant]); const isMerchantRequired = isPolicyExpenseChat && (!isScanRequest || isEditingSplitBill) && shouldShowMerchant; const isCategoryRequired = !!policy?.requiresCategory; const shouldDisableParticipant = (participant: Participant): boolean => { - if (ReportUtils.isDraftReport(participant.reportID)) { + if (isDraftReport(participant.reportID)) { return true; } - if ( - !participant.isInvoiceRoom && - !participant.isPolicyExpenseChat && - !participant.isSelfDM && - ReportUtils.isOptimisticPersonalDetail(participant.accountID ?? CONST.DEFAULT_NUMBER_ID) - ) { + if (!participant.isInvoiceRoom && !participant.isPolicyExpenseChat && !participant.isSelfDM && isOptimisticPersonalDetail(participant.accountID ?? CONST.DEFAULT_NUMBER_ID)) { return true; } @@ -344,7 +365,7 @@ function MoneyRequestConfirmationList({ return; } const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); - IOU.setMoneyRequestAmount(transactionID, amount, currency ?? ''); + setMoneyRequestAmount(transactionID, amount, currency ?? ''); isFirstUpdatedDistanceAmount.current = true; }, [distance, rate, unit, transactionID, currency, isDistanceRequest]); @@ -354,12 +375,12 @@ function MoneyRequestConfirmationList({ } const amount = distanceRequestAmount; - IOU.setMoneyRequestAmount(transactionID, amount, currency ?? ''); + setMoneyRequestAmount(transactionID, amount, currency ?? ''); // If it's a split request among individuals, set the split shares const participantAccountIDs: number[] = selectedParticipantsProp.map((participant) => participant.accountID ?? CONST.DEFAULT_NUMBER_ID); if (isTypeSplit && !isPolicyExpenseChat && amount && transaction?.currency) { - IOU.setSplitShares(transaction, amount, currency, participantAccountIDs); + setSplitShares(transaction, amount, currency, participantAccountIDs); } }, [shouldCalculateDistanceAmount, distanceRequestAmount, transactionID, currency, isTypeSplit, isPolicyExpenseChat, selectedParticipantsProp, transaction]); @@ -389,14 +410,14 @@ function MoneyRequestConfirmationList({ } } else { taxableAmount = transaction.amount ?? 0; - taxCode = transaction.taxCode ?? TransactionUtils.getDefaultTaxCode(policy, transaction) ?? ''; + taxCode = transaction.taxCode ?? getDefaultTaxCode(policy, transaction) ?? ''; } if (taxCode && taxableAmount) { - const taxPercentage = TransactionUtils.getTaxValue(policy, transaction, taxCode) ?? ''; - const taxAmount = TransactionUtils.calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); - const taxAmountInSmallestCurrencyUnits = CurrencyUtils.convertToBackendAmount(Number.parseFloat(taxAmount.toString())); - IOU.setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); + const taxPercentage = getTaxValue(policy, transaction, taxCode) ?? ''; + const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); + const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString())); + setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); } }, [ policy, @@ -429,16 +450,19 @@ function MoneyRequestConfirmationList({ text = translate('common.next'); } } else if (isTypeTrackExpense) { - text = translate('iou.trackExpense'); + text = translate('iou.createExpense'); + if (iouAmount !== 0) { + text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); + } } else if (isTypeSplit && iouAmount === 0) { text = translate('iou.splitExpense'); } else if ((receiptPath && isTypeRequest) || isDistanceRequestWithPendingRoute || isPerDiemRequest) { - text = translate('iou.submitExpense'); + text = translate('iou.createExpense'); if (iouAmount !== 0) { - text = translate('iou.submitAmount', {amount: formattedAmount}); + text = translate('iou.createExpenseWithAmount', {amount: formattedAmount}); } } else { - const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.submitAmount'; + const translationKey = isTypeSplit ? 'iou.splitAmount' : 'iou.createExpenseWithAmount'; text = translate(translationKey, {amount: formattedAmount}); } return [ @@ -467,8 +491,8 @@ function MoneyRequestConfirmationList({ if (!transaction?.transactionID) { return; } - const amountInCents = CurrencyUtils.convertToBackendAmount(value); - IOU.setIndividualShare(transaction?.transactionID, accountID, amountInCents); + const amountInCents = convertToBackendAmount(value); + setIndividualShare(transaction?.transactionID, accountID, amountInCents); }, [transaction], ); @@ -509,7 +533,7 @@ function MoneyRequestConfirmationList({ if (!isTypeSplit || !transaction?.splitShares) { return; } - IOU.adjustRemainingSplitShares(transaction); + adjustRemainingSplitShares(transaction); }, [isTypeSplit, transaction]); const selectedParticipants = useMemo(() => selectedParticipantsProp.filter((participant) => participant.selected), [selectedParticipantsProp]); @@ -521,7 +545,7 @@ function MoneyRequestConfirmationList({ return []; } - const payeeOption = OptionsListUtils.getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails); + const payeeOption = getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails); if (shouldShowReadOnlySplits) { return [payeeOption, ...selectedParticipants].map((participantOption: Participant) => { const isPayer = participantOption.accountID === payeeOption.accountID; @@ -529,7 +553,7 @@ function MoneyRequestConfirmationList({ if (iouAmount > 0) { amount = transaction?.comment?.splits?.find((split) => split.accountID === participantOption.accountID)?.amount ?? - IOUUtils.calculateAmount(selectedParticipants.length, iouAmount, iouCurrencyCode ?? '', isPayer); + calculateAmount(selectedParticipants.length, iouAmount, iouCurrencyCode ?? '', isPayer); } return { ...participantOption, @@ -537,7 +561,7 @@ function MoneyRequestConfirmationList({ isInteractive: !shouldDisableParticipant(participantOption), rightElement: ( - {amount ? CurrencyUtils.convertToDisplayString(amount, iouCurrencyCode) : ''} + {amount ? convertToDisplayString(amount, iouCurrencyCode) : ''} ), }; @@ -545,7 +569,7 @@ function MoneyRequestConfirmationList({ } const currencySymbol = currencyList?.[iouCurrencyCode ?? '']?.symbol ?? iouCurrencyCode; - const formattedTotalAmount = CurrencyUtils.convertToDisplayStringWithoutCurrency(iouAmount, iouCurrencyCode); + const formattedTotalAmount = convertToDisplayStringWithoutCurrency(iouAmount, iouCurrencyCode); return [payeeOption, ...selectedParticipants].map((participantOption: Participant) => ({ ...participantOption, @@ -567,7 +591,7 @@ function MoneyRequestConfirmationList({ inputStyle={[styles.optionRowAmountInput]} containerStyle={[styles.textInputContainer]} touchableInputWrapperStyle={[styles.ml3]} - onFormatAmount={CurrencyUtils.convertToDisplayStringWithoutCurrency} + onFormatAmount={convertToDisplayStringWithoutCurrency} onAmountChange={(value: string) => onSplitShareChange(participantOption.accountID ?? CONST.DEFAULT_NUMBER_ID, Number(value))} maxLength={formattedTotalAmount.length} contentWidth={formattedTotalAmount.length * 8} @@ -608,7 +632,7 @@ function MoneyRequestConfirmationList({ {!shouldShowReadOnlySplits && !!isSplitModified && ( { - IOU.resetSplitShares(transaction); + resetSplitShares(transaction); }} accessibilityLabel={CONST.ROLE.BUTTON} role={CONST.ROLE.BUTTON} @@ -642,7 +666,7 @@ function MoneyRequestConfirmationList({ ...[ { title: translate('moneyRequestConfirmationList.paidBy'), - data: [OptionsListUtils.getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails)], + data: [getIOUConfirmationOptionsFromPayeePersonalDetail(payeePersonalDetails)], shouldShow: true, }, { @@ -679,10 +703,10 @@ function MoneyRequestConfirmationList({ When the user completes the initial steps of the IOU flow offline and then goes online on the confirmation page. In this scenario, the route will be fetched from the server, and the waypoints will no longer be pending. */ - IOU.setMoneyRequestPendingFields(transactionID, {waypoints: isDistanceRequestWithPendingRoute ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : null}); + setMoneyRequestPendingFields(transactionID, {waypoints: isDistanceRequestWithPendingRoute ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : null}); const distanceMerchant = DistanceRequestUtils.getDistanceMerchant(hasRoute, distance, unit, rate ?? 0, currency ?? CONST.CURRENCY.USD, translate, toLocaleDigit); - IOU.setMoneyRequestMerchant(transactionID, distanceMerchant, true); + setMoneyRequestMerchant(transactionID, distanceMerchant, true); }, [ isDistanceRequestWithPendingRoute, hasRoute, @@ -705,7 +729,7 @@ function MoneyRequestConfirmationList({ if (!transactionID || iouCategory || !shouldShowCategories || enabledCategories.length !== 1 || !isCategoryRequired) { return; } - IOU.setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy?.id); + setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy?.id); // Keep 'transaction' out to ensure that we autoselect the option only once // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, [shouldShowCategories, policyCategories, isCategoryRequired, policy?.id]); @@ -716,20 +740,20 @@ function MoneyRequestConfirmationList({ return; } - let updatedTagsString = TransactionUtils.getTag(transaction); + let updatedTagsString = getTag(transaction); policyTagLists.forEach((tagList, index) => { const isTagListRequired = tagList.required ?? false; if (!isTagListRequired) { return; } const enabledTags = Object.values(tagList.tags).filter((tag) => tag.enabled); - if (enabledTags.length !== 1 || TransactionUtils.getTag(transaction, index)) { + if (enabledTags.length !== 1 || getTag(transaction, index)) { return; } - updatedTagsString = IOUUtils.insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index); + updatedTagsString = insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index); }); - if (updatedTagsString !== TransactionUtils.getTag(transaction) && updatedTagsString) { - IOU.setMoneyRequestTag(transactionID, updatedTagsString); + if (updatedTagsString !== getTag(transaction) && updatedTagsString) { + setMoneyRequestTag(transactionID, updatedTagsString); } // Keep 'transaction' out to ensure that we autoselect the option only once // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps @@ -770,7 +794,7 @@ function MoneyRequestConfirmationList({ setFormError('iou.error.noParticipantSelected'); return; } - if (!isEditingSplitBill && isMerchantRequired && (isMerchantEmpty || (shouldDisplayFieldError && TransactionUtils.isMerchantMissing(transaction)))) { + if (!isEditingSplitBill && isMerchantRequired && (isMerchantEmpty || (shouldDisplayFieldError && isMerchantMissing(transaction)))) { setFormError('iou.error.invalidMerchant'); return; } @@ -786,13 +810,13 @@ function MoneyRequestConfirmationList({ if (iouType !== CONST.IOU.TYPE.PAY) { // validate the amount for distance expenses - const decimals = CurrencyUtils.getCurrencyDecimals(iouCurrencyCode); - if (isDistanceRequest && !isDistanceRequestWithPendingRoute && !MoneyRequestUtils.validateAmount(String(iouAmount), decimals)) { + const decimals = getCurrencyDecimals(iouCurrencyCode); + if (isDistanceRequest && !isDistanceRequestWithPendingRoute && !validateAmount(String(iouAmount), decimals)) { setFormError('common.error.invalidAmount'); return; } - if (isEditingSplitBill && TransactionUtils.areRequiredFieldsEmpty(transaction)) { + if (isEditingSplitBill && areRequiredFieldsEmpty(transaction)) { setDidConfirmSplit(true); setFormError('iou.error.genericSmartscanFailureMessage'); return; diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index 378933e1a89e..7d9b72a79eac 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -3,7 +3,6 @@ import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; @@ -60,7 +59,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { const displayNamesWithTooltips = getDisplayNamesWithTooltips(getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails), isMultipleParticipant); const welcomeMessage = SidebarUtils.getWelcomeMessage(report, policy); const moneyRequestOptions = temporary_getMoneyRequestOptions(report, policy, participantAccountIDs); - const {canUseCombinedTrackSubmit} = usePermissions(); + const filteredOptions = moneyRequestOptions.filter( (item): item is Exclude => item !== CONST.IOU.TYPE.INVOICE, @@ -69,7 +68,7 @@ function ReportWelcomeText({report, policy}: ReportWelcomeTextProps) { .map( (item, index) => `${index === filteredOptions.length - 1 && index > 0 ? `${translate('common.or')} ` : ''}${translate( - canUseCombinedTrackSubmit && item === 'submit' ? `reportActionsView.create` : `reportActionsView.iouTypes.${item}`, + item === 'submit' ? `reportActionsView.create` : `reportActionsView.iouTypes.${item}`, )}`, ) .join(', '); diff --git a/src/languages/en.ts b/src/languages/en.ts index 98564c2c5b3e..4b91f9ca78b1 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -839,15 +839,15 @@ const translations = { quickAction: { scanReceipt: 'Scan receipt', recordDistance: 'Record distance', - requestMoney: 'Submit expense', + requestMoney: 'Create expense', splitBill: 'Split expense', splitScan: 'Split receipt', splitDistance: 'Split distance', paySomeone: ({name}: PaySomeoneParams = {}) => `Pay ${name ?? 'someone'}`, assignTask: 'Assign task', header: 'Quick action', - trackManual: 'Track expense', - trackScan: 'Track receipt', + trackManual: 'Create expense', + trackScan: 'Create expense for receipt', trackDistance: 'Track distance', noLongerHaveReportAccess: 'You no longer have access to your previous quick action destination. Pick a new one below.', updateDestination: 'Update destination', @@ -868,10 +868,9 @@ const translations = { categorize: 'Categorize', share: 'Share', participants: 'Participants', - submitExpense: 'Submit expense', createExpense: 'Create expense', - trackExpense: 'Track expense', chooseRecipient: 'Choose recipient', + createExpenseWithAmount: ({amount}: {amount: string}) => `Create ${amount} expense`, confirmDetails: 'Confirm details', pay: 'Pay', cancelPayment: 'Cancel payment', diff --git a/src/languages/es.ts b/src/languages/es.ts index caf031de377e..90b14c9fb433 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -834,7 +834,7 @@ const translations = { quickAction: { scanReceipt: 'Escanear recibo', recordDistance: 'Grabar distancia', - requestMoney: 'Presentar gasto', + requestMoney: 'Crear gasto', splitBill: 'Dividir gasto', splitScan: 'Dividir recibo', splitDistance: 'Dividir distancia', @@ -862,11 +862,10 @@ const translations = { categorize: 'Categorizar', share: 'Compartir', participants: 'Participantes', - submitExpense: 'Presentar gasto', createExpense: 'Crear gasto', paySomeone: ({name}: PaySomeoneParams = {}) => `Pagar a ${name ?? 'alguien'}`, - trackExpense: 'Seguimiento de gastos', chooseRecipient: 'Elige destinatario', + createExpenseWithAmount: ({amount}: {amount: string}) => `Crear un gasto de ${amount}`, confirmDetails: 'Confirma los detalles', pay: 'Pagar', cancelPayment: 'Cancelar el pago', diff --git a/src/libs/API/parameters/UpdateMoneyRequestParams.ts b/src/libs/API/parameters/UpdateMoneyRequestParams.ts index 549d02260beb..0f210d6c661d 100644 --- a/src/libs/API/parameters/UpdateMoneyRequestParams.ts +++ b/src/libs/API/parameters/UpdateMoneyRequestParams.ts @@ -2,7 +2,7 @@ import type {TransactionDetails} from '@libs/ReportUtils'; type UpdateMoneyRequestParams = Partial & { reportID?: string; - transactionID: string; + transactionID?: string; reportActionID?: string; }; diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index f89f00f8d10c..a98d5e7d4009 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -1,9 +1,6 @@ import type {OnyxEntry} from 'react-native-onyx'; import CONST from '@src/CONST'; import type Beta from '@src/types/onyx/Beta'; -import * as SessionUtils from './SessionUtils'; - -const isAccountIDEven = (accountID: number) => accountID % 2 === 0; function canUseAllBetas(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.ALL); @@ -25,12 +22,6 @@ function canUseCategoryAndTagApprovers(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.CATEGORY_AND_TAG_APPROVERS) || canUseAllBetas(betas); } -function canUseCombinedTrackSubmit(): boolean { - // We don't need to show this to all betas since this will be used for developing a feature for A/B testing. - const session = SessionUtils.getSession(); - return isAccountIDEven(session?.accountID ?? CONST.DEFAULT_NUMBER_ID); -} - function canUsePerDiem(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.PER_DIEM) || canUseAllBetas(betas); } @@ -55,7 +46,6 @@ export default { canUseLinkPreviews, canUseSpotnanaTravel, canUseNetSuiteUSATax, - canUseCombinedTrackSubmit, canUseCategoryAndTagApprovers, canUsePerDiem, canUseMergeAccounts, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 57951ece5c21..26c96c6d4c5a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3662,7 +3662,7 @@ function getTransactionReportName(reportAction: OnyxEntry, policy: OnyxEntry, } const requestOptions = getMoneyRequestOptions(report, policy, participantAccountIDs); - if (Permissions.canUseCombinedTrackSubmit()) { - requestOptions.push(CONST.IOU.TYPE.CREATE); - } + requestOptions.push(CONST.IOU.TYPE.CREATE); return requestOptions.includes(iouType); } diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 0ac396709b07..9b71bb8f99f2 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -2917,8 +2917,8 @@ function calculateDiffAmount( * @param policyCategories */ function getUpdateMoneyRequestParams( - transactionID: string, - transactionThreadReportID: string, + transactionID: string | undefined, + transactionThreadReportID: string | undefined, transactionChanges: TransactionChanges, policy: OnyxEntry, policyTagList: OnyxTypes.OnyxInputOrEntry, @@ -3254,8 +3254,8 @@ function getUpdateMoneyRequestParams( * @param policy May be undefined, an empty object, or an object matching the Policy type (src/types/onyx/Policy.ts) */ function getUpdateTrackExpenseParams( - transactionID: string, - transactionThreadReportID: string, + transactionID: string | undefined, + transactionThreadReportID: string | undefined, transactionChanges: TransactionChanges, policy: OnyxEntry, ): UpdateMoneyRequestData { @@ -3560,8 +3560,8 @@ function updateMoneyRequestTaxRate({transactionID, optimisticReportActionID, tax } type UpdateMoneyRequestDistanceParams = { - transactionID: string; - transactionThreadReportID: string; + transactionID: string | undefined; + transactionThreadReportID: string | undefined; waypoints: WaypointCollection; routes?: Routes; policy?: OnyxEntry; diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 709d160a6f08..a469af82dd1c 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -73,7 +73,6 @@ import enhanceParameters from '@libs/Network/enhanceParameters'; import type {NetworkStatus} from '@libs/NetworkConnection'; import LocalNotification from '@libs/Notification/LocalNotification'; import Parser from '@libs/Parser'; -import Permissions from '@libs/Permissions'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as PhoneNumber from '@libs/PhoneNumber'; import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils'; @@ -3602,16 +3601,14 @@ function prepareOnboardingOptimisticData( wasInvited?: boolean, ) { // If the user has the "combinedTrackSubmit" beta enabled we'll show different tasks for track and submit expense. - if (Permissions.canUseCombinedTrackSubmit()) { - if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { - // eslint-disable-next-line no-param-reassign - data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.PERSONAL_SPEND]; - } + if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { + // eslint-disable-next-line no-param-reassign + data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.PERSONAL_SPEND]; + } - if (engagementChoice === CONST.ONBOARDING_CHOICES.EMPLOYER || engagementChoice === CONST.ONBOARDING_CHOICES.SUBMIT) { - // eslint-disable-next-line no-param-reassign - data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.SUBMIT]; - } + if (engagementChoice === CONST.ONBOARDING_CHOICES.EMPLOYER || engagementChoice === CONST.ONBOARDING_CHOICES.SUBMIT) { + // eslint-disable-next-line no-param-reassign + data = CONST.COMBINED_TRACK_SUBMIT_ONBOARDING_MESSAGES[CONST.ONBOARDING_CHOICES.SUBMIT]; } // Guides are assigned and tasks are posted in the #admins room for the MANAGE_TEAM onboarding action, except for emails that have a '+'. diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index b182bf43a52b..363977b381c8 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -12,21 +12,20 @@ import PopoverMenu from '@components/PopoverMenu'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import usePrevious from '@hooks/usePrevious'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import * as Browser from '@libs/Browser'; +import {isSafari} from '@libs/Browser'; import getIconForAction from '@libs/getIconForAction'; import Navigation from '@libs/Navigation/Navigation'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as SubscriptionUtils from '@libs/SubscriptionUtils'; -import * as IOU from '@userActions/IOU'; -import * as Modal from '@userActions/Modal'; -import * as Report from '@userActions/Report'; -import * as Task from '@userActions/Task'; +import {canCreateTaskInReport, getPayeeName, temporary_getMoneyRequestOptions} from '@libs/ReportUtils'; +import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils'; +import {startMoneyRequest} from '@userActions/IOU'; +import {close} from '@userActions/Modal'; +import {setIsComposerFullSize} from '@userActions/Report'; +import {clearOutTaskInfoAndNavigate} from '@userActions/Task'; import DelegateNoAccessModal from '@src/components/DelegateNoAccessModal'; import type {IOUType} from '@src/CONST'; import CONST from '@src/CONST'; @@ -121,14 +120,13 @@ function AttachmentPickerWithMenuItems({ const {isDelegateAccessRestricted} = useDelegateUserDetails(); const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`); - const {canUseCombinedTrackSubmit} = usePermissions(); /** * Returns the list of IOU Options */ const moneyRequestOptions = useMemo(() => { const selectOption = (onSelected: () => void, shouldRestrictAction: boolean) => { - if (shouldRestrictAction && policy && SubscriptionUtils.shouldRestrictUserBillableActions(policy.id)) { + if (shouldRestrictAction && policy && shouldRestrictUserBillableActions(policy.id)) { Navigation.navigate(ROUTES.RESTRICTED_ACTION.getRoute(policy.id)); return; } @@ -140,51 +138,48 @@ function AttachmentPickerWithMenuItems({ [CONST.IOU.TYPE.SPLIT]: { icon: Expensicons.Transfer, text: translate('iou.splitExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? '-1'), true), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.SUBMIT]: { - icon: canUseCombinedTrackSubmit ? getIconForAction(CONST.IOU.TYPE.CREATE) : getIconForAction(CONST.IOU.TYPE.REQUEST), - text: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? '-1'), true), + icon: getIconForAction(CONST.IOU.TYPE.CREATE), + text: translate('iou.createExpense'), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.PAY]: { icon: getIconForAction(CONST.IOU.TYPE.SEND), - text: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), + text: translate('iou.paySomeone', {name: getPayeeName(report)}), onSelected: () => { if (isDelegateAccessRestricted) { setIsNoDelegateAccessMenuVisible(true); return; } - selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? '-1'), false); + selectOption(() => startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false); }, }, [CONST.IOU.TYPE.TRACK]: { - icon: canUseCombinedTrackSubmit ? getIconForAction(CONST.IOU.TYPE.CREATE) : getIconForAction(CONST.IOU.TYPE.TRACK), - text: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? '-1'), true), + icon: getIconForAction(CONST.IOU.TYPE.CREATE), + text: translate('iou.createExpense'), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true), }, [CONST.IOU.TYPE.INVOICE]: { icon: Expensicons.InvoiceGeneric, text: translate('workspace.invoices.sendInvoice'), - onSelected: () => selectOption(() => IOU.startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? '-1'), false), + onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false), }, }; - const moneyRequestOptionsList = ReportUtils.temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => ({ + const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => ({ ...options[option], })); - return canUseCombinedTrackSubmit - ? // Removes track option for the workspace with the canUseCombinedTrackSubmit enabled - moneyRequestOptionsList.filter((item, index, self) => index === self.findIndex((t) => t.text === item.text)) - : moneyRequestOptionsList; - }, [translate, canUseCombinedTrackSubmit, report, policy, reportParticipantIDs, isDelegateAccessRestricted]); + return moneyRequestOptionsList.filter((item, index, self) => index === self.findIndex((t) => t.text === item.text)); + }, [translate, report, policy, reportParticipantIDs, isDelegateAccessRestricted]); /** * Determines if we can show the task option */ const taskOption: PopoverMenuItem[] = useMemo(() => { - if (!ReportUtils.canCreateTaskInReport(report)) { + if (!canCreateTaskInReport(report)) { return []; } @@ -192,7 +187,7 @@ function AttachmentPickerWithMenuItems({ { icon: Expensicons.Task, text: translate('newTaskPage.assignTask'), - onSelected: () => Task.clearOutTaskInfoAndNavigate(reportID, report), + onSelected: () => clearOutTaskInfoAndNavigate(reportID, report), }, ]; }, [report, reportID, translate]); @@ -300,7 +295,7 @@ function AttachmentPickerWithMenuItems({ onPress={(e) => { e?.preventDefault(); raiseIsScrollLikelyLayoutTriggered(); - Report.setIsComposerFullSize(reportID, false); + setIsComposerFullSize(reportID, false); }} // Keep focus on the composer when Collapse button is clicked. onMouseDown={(e) => e.preventDefault()} @@ -321,7 +316,7 @@ function AttachmentPickerWithMenuItems({ onPress={(e) => { e?.preventDefault(); raiseIsScrollLikelyLayoutTriggered(); - Report.setIsComposerFullSize(reportID, true); + setIsComposerFullSize(reportID, true); }} // Keep focus on the composer when Expand button is clicked. onMouseDown={(e) => e.preventDefault()} @@ -352,11 +347,11 @@ function AttachmentPickerWithMenuItems({ // function must be called from within a event handler that was initiated // by the user on Safari. if (index === menuItems.length - 1) { - if (Browser.isSafari()) { + if (isSafari()) { triggerAttachmentPicker(); return; } - Modal.close(() => { + close(() => { triggerAttachmentPicker(); }); } diff --git a/src/pages/iou/MoneyRequestAmountForm.tsx b/src/pages/iou/MoneyRequestAmountForm.tsx index 533c113c2a86..a948e43d8656 100644 --- a/src/pages/iou/MoneyRequestAmountForm.tsx +++ b/src/pages/iou/MoneyRequestAmountForm.tsx @@ -15,9 +15,9 @@ import useLocalize from '@hooks/useLocalize'; import usePrevious from '@hooks/usePrevious'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; +import {convertToDisplayString, convertToFrontendAmountAsInteger, convertToFrontendAmountAsString} from '@libs/CurrencyUtils'; +import {canUseTouchScreen as canUseTouchScreenUtil} from '@libs/DeviceCapabilities'; +import {addLeadingZero} from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; import variables from '@styles/variables'; import type {BaseTextInputRef} from '@src/components/TextInput/BaseTextInput/types'; @@ -72,7 +72,7 @@ type MoneyRequestAmountFormProps = { const isAmountInvalid = (amount: string) => !amount.length || parseFloat(amount) < 0.01; const isTaxAmountInvalid = (currentAmount: string, taxAmount: number, isTaxAmountForm: boolean, currency: string) => - isTaxAmountForm && Number.parseFloat(currentAmount) > CurrencyUtils.convertToFrontendAmountAsInteger(Math.abs(taxAmount), currency); + isTaxAmountForm && Number.parseFloat(currentAmount) > convertToFrontendAmountAsInteger(Math.abs(taxAmount), currency); const AMOUNT_VIEW_ID = 'amountView'; const NUM_PAD_CONTAINER_VIEW_ID = 'numPadContainerView'; @@ -109,7 +109,7 @@ function MoneyRequestAmountForm( const isFocused = useIsFocused(); const wasFocused = usePrevious(isFocused); - const formattedTaxAmount = CurrencyUtils.convertToDisplayString(Math.abs(taxAmount), currency); + const formattedTaxAmount = convertToDisplayString(Math.abs(taxAmount), currency); /** * Event occurs when a user presses a mouse button over an DOM element. @@ -151,7 +151,7 @@ function MoneyRequestAmountForm( const initializeAmount = useCallback( (newAmount: number) => { - const frontendAmount = newAmount ? CurrencyUtils.convertToFrontendAmountAsString(newAmount, currency) : ''; + const frontendAmount = newAmount ? convertToFrontendAmountAsString(newAmount, currency) : ''; moneyRequestAmountInput.current?.changeAmount(frontendAmount); moneyRequestAmountInput.current?.changeSelection({ start: frontendAmount.length, @@ -186,11 +186,11 @@ function MoneyRequestAmountForm( if (currentAmount.length > 0) { const selectionStart = selection.start === selection.end ? selection.start - 1 : selection.start; const newAmount = `${currentAmount.substring(0, selectionStart)}${currentAmount.substring(selection.end)}`; - moneyRequestAmountInput.current?.setNewAmount(MoneyRequestUtils.addLeadingZero(newAmount)); + moneyRequestAmountInput.current?.setNewAmount(addLeadingZero(newAmount)); } return; } - const newAmount = MoneyRequestUtils.addLeadingZero(`${currentAmount.substring(0, selection.start)}${key}${currentAmount.substring(selection.end)}`); + const newAmount = addLeadingZero(`${currentAmount.substring(0, selection.start)}${key}${currentAmount.substring(selection.end)}`); moneyRequestAmountInput.current?.setNewAmount(newAmount); }, [shouldUpdateSelection], @@ -237,15 +237,12 @@ function MoneyRequestAmountForm( if (iouType === CONST.IOU.TYPE.SPLIT) { return translate('iou.splitExpense'); } - if (iouType === CONST.IOU.TYPE.TRACK) { - return translate('iou.trackExpense'); - } - return translate('iou.submitExpense'); + return translate('iou.createExpense'); } return isEditing ? translate('common.save') : translate('common.next'); }, [skipConfirmation, iouType, isEditing, translate]); - const canUseTouchScreen = DeviceCapabilities.canUseTouchScreen(); + const canUseTouchScreen = canUseTouchScreenUtil(); useEffect(() => { setFormError(''); diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 0c3b0022c89a..e5572bd34294 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -11,14 +11,14 @@ import useLocalize from '@hooks/useLocalize'; import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; +import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; import OnyxTabNavigator, {TabScreenWithFocusTrapWrapper, TopTab} from '@libs/Navigation/OnyxTabNavigator'; -import * as PolicyUtils from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getActivePolicies, getPerDiemCustomUnit} from '@libs/PolicyUtils'; +import {getPayeeName} from '@libs/ReportUtils'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import type {IOURequestType} from '@userActions/IOU'; -import * as IOU from '@userActions/IOU'; +import {initMoneyRequest} from '@userActions/IOU'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; @@ -52,15 +52,15 @@ function IOURequestStartPage({ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID || CONST.DEFAULT_NUMBER_ID}`); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); - const {canUseCombinedTrackSubmit, canUsePerDiem} = usePermissions(); + const {canUsePerDiem} = usePermissions(); const tabTitles = { [CONST.IOU.TYPE.REQUEST]: translate('iou.createExpense'), - [CONST.IOU.TYPE.SUBMIT]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.submitExpense'), - [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), - [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: ReportUtils.getPayeeName(report)}), + [CONST.IOU.TYPE.SUBMIT]: translate('iou.createExpense'), + [CONST.IOU.TYPE.SEND]: translate('iou.paySomeone', {name: getPayeeName(report)}), + [CONST.IOU.TYPE.PAY]: translate('iou.paySomeone', {name: getPayeeName(report)}), [CONST.IOU.TYPE.SPLIT]: translate('iou.createExpense'), - [CONST.IOU.TYPE.TRACK]: canUseCombinedTrackSubmit ? translate('iou.createExpense') : translate('iou.trackExpense'), + [CONST.IOU.TYPE.TRACK]: translate('iou.createExpense'), [CONST.IOU.TYPE.INVOICE]: translate('workspace.invoices.sendInvoice'), [CONST.IOU.TYPE.CREATE]: translate('iou.createExpense'), }; @@ -75,7 +75,7 @@ function IOURequestStartPage({ if (transaction?.reportID === reportID || isLoadingSelectedTab) { return; } - IOU.initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, transactionRequestType); + initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, transactionRequestType); }, [transaction, policy, reportID, iouType, isFromGlobalCreate, transactionRequestType, isLoadingSelectedTab]); const navigateBack = () => { @@ -87,7 +87,7 @@ function IOURequestStartPage({ if (transaction?.iouRequestType === newIOUType) { return; } - IOU.initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, newIOUType); + initMoneyRequest(reportID, policy, isFromGlobalCreate, transaction?.iouRequestType, newIOUType); }, [policy, reportID, isFromGlobalCreate, transaction], ); @@ -100,15 +100,15 @@ function IOURequestStartPage({ return [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement].filter((element) => !!element) as HTMLElement[]; }, [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement]); - const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email) - .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: PolicyUtils.getPerDiemCustomUnit(mappedPolicy)})) + const perDiemCustomUnits = getActivePolicies(allPolicies, session?.email) + .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: getPerDiemCustomUnit(mappedPolicy)})) .filter(({customUnit}) => !isEmptyObject(customUnit) && !!customUnit.enabled); const doesPerDiemPolicyExist = perDiemCustomUnits.length > 0; const moreThanOnePerDiemExist = perDiemCustomUnits.length > 1; - const currentPolicyPerDiemUnit = PolicyUtils.getPerDiemCustomUnit(policy); + const currentPolicyPerDiemUnit = getPerDiemCustomUnit(policy); const doesCurrentPolicyPerDiemExist = !isEmptyObject(currentPolicyPerDiemUnit) && !!currentPolicyPerDiemUnit.enabled; @@ -134,7 +134,7 @@ function IOURequestStartPage({ > - {PolicyUtils.isPolicyAdmin(policy) && !!policy?.areCategoriesEnabled && ( + {isPolicyAdmin(policy) && !!policy?.areCategoriesEnabled && (