diff --git a/src/CONST.ts b/src/CONST.ts index be2f9506cdfe..aac314ca926f 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -346,6 +346,9 @@ const CONST = { INSTALLED: 'installed', NOT_INSTALLED: 'not-installed', }, + TAX_RATES: { + NAME_MAX_LENGTH: 50, + }, PLATFORM: { IOS: 'ios', ANDROID: 'android', @@ -4065,10 +4068,6 @@ const CONST = { SESSION_STORAGE_KEYS: { INITIAL_URL: 'INITIAL_URL', }, - - TAX_RATES: { - NAME_MAX_LENGTH: 50, - }, } as const; type Country = keyof typeof CONST.ALL_COUNTRIES; diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index f2a0caadf4ae..e91b4d491423 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -339,6 +339,8 @@ const ONYXKEYS = { WORKSPACE_DESCRIPTION_FORM_DRAFT: 'workspaceDescriptionFormDraft', WORKSPACE_RATE_AND_UNIT_FORM: 'workspaceRateAndUnitForm', WORKSPACE_RATE_AND_UNIT_FORM_DRAFT: 'workspaceRateAndUnitFormDraft', + WORKSPACE_TAX_CUSTOM_NAME: 'workspaceTaxCustomName', + WORKSPACE_TAX_CUSTOM_NAME_DRAFT: 'workspaceTaxCustomNameDraft', POLICY_CREATE_DISTANCE_RATE_FORM: 'policyCreateDistanceRateForm', POLICY_CREATE_DISTANCE_RATE_FORM_DRAFT: 'policyCreateDistanceRateFormDraft', CLOSE_ACCOUNT_FORM: 'closeAccount', @@ -424,6 +426,7 @@ type OnyxFormValuesMapping = { [ONYXKEYS.FORMS.WORKSPACE_CATEGORY_FORM]: FormTypes.WorkspaceCategoryForm; [ONYXKEYS.FORMS.WORKSPACE_TAG_CREATE_FORM]: FormTypes.WorkspaceTagCreateForm; [ONYXKEYS.FORMS.WORKSPACE_RATE_AND_UNIT_FORM]: FormTypes.WorkspaceRateAndUnitForm; + [ONYXKEYS.FORMS.WORKSPACE_TAX_CUSTOM_NAME]: FormTypes.WorkspaceTaxCustomName; [ONYXKEYS.FORMS.CLOSE_ACCOUNT_FORM]: FormTypes.CloseAccountForm; [ONYXKEYS.FORMS.PROFILE_SETTINGS_FORM]: FormTypes.ProfileSettingsForm; [ONYXKEYS.FORMS.DISPLAY_NAME_FORM]: FormTypes.DisplayNameForm; diff --git a/src/ROUTES.ts b/src/ROUTES.ts index abfb1bee0aa0..5769b60a8284 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -584,6 +584,22 @@ const ROUTES = { route: 'settings/workspaces/:policyID/taxes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes` as const, }, + WORKSPACE_TAXES_SETTINGS: { + route: 'settings/workspaces/:policyID/taxes/settings', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes/settings` as const, + }, + WORKSPACE_TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT: { + route: 'settings/workspaces/:policyID/taxes/settings/workspace-currency', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes/settings/workspace-currency` as const, + }, + WORKSPACE_TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT: { + route: 'settings/workspaces/:policyID/taxes/settings/foreign-currency', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes/settings/foreign-currency` as const, + }, + WORKSPACE_TAXES_SETTINGS_CUSTOM_TAX_NAME: { + route: 'settings/workspaces/:policyID/taxes/settings/tax-name', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes/settings/tax-name` as const, + }, WORKSPACE_MEMBER_DETAILS: { route: 'settings/workspaces/:policyID/members/:accountID', getRoute: (policyID: string, accountID: number, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/members/${accountID}`, backTo), diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 2e44076bffee..2fbd122f9972 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -216,6 +216,10 @@ const SCREENS = { TAGS_SETTINGS: 'Tags_Settings', TAGS_EDIT: 'Tags_Edit', TAXES: 'Workspace_Taxes', + TAXES_SETTINGS: 'Workspace_Taxes_Settings', + TAXES_SETTINGS_CUSTOM_TAX_NAME: 'Workspace_Taxes_Settings_CustomTaxName', + TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT: 'Workspace_Taxes_Settings_WorkspaceCurrency', + TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT: 'Workspace_Taxes_Settings_ForeignCurrency', TAX_CREATE: 'Workspace_Tax_Create', TAG_CREATE: 'Tag_Create', TAG_SETTINGS: 'Tag_Settings', diff --git a/src/components/TaxPicker.tsx b/src/components/TaxPicker.tsx index 664aa741c400..dad7117bef67 100644 --- a/src/components/TaxPicker.tsx +++ b/src/components/TaxPicker.tsx @@ -1,17 +1,18 @@ -import React, {useMemo, useState} from 'react'; +import React, {useCallback, useMemo, useState} from 'react'; import type {EdgeInsets} from 'react-native-safe-area-context'; import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; -import useThemeStyles from '@hooks/useThemeStyles'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import type {TaxRatesWithDefault} from '@src/types/onyx'; -import OptionsSelector from './OptionsSelector'; +import SelectionList from './SelectionList'; +import RadioListItem from './SelectionList/RadioListItem'; +import type {ListItem} from './SelectionList/types'; type TaxPickerProps = { /** Collection of tax rates attached to a policy */ - taxRates: TaxRatesWithDefault; + taxRates?: TaxRatesWithDefault; /** The selected tax rate of an expense */ selectedTaxRate?: string; @@ -23,20 +24,21 @@ type TaxPickerProps = { insets?: EdgeInsets; /** Callback to fire when a tax is pressed */ - onSubmit: () => void; + onSubmit: (tax: ListItem) => void; }; function TaxPicker({selectedTaxRate = '', taxRates, insets, onSubmit}: TaxPickerProps) { - const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); const {translate} = useLocalize(); const [searchValue, setSearchValue] = useState(''); - const taxRatesCount = TransactionUtils.getEnabledTaxRateCount(taxRates.taxes); + const taxRatesCount = TransactionUtils.getEnabledTaxRateCount(taxRates?.taxes ?? {}); const isTaxRatesCountBelowThreshold = taxRatesCount < CONST.TAX_RATES_LIST_THRESHOLD; const shouldShowTextInput = !isTaxRatesCountBelowThreshold; + const getTaxName = useCallback((key: string) => taxRates?.taxes[key].name, [taxRates?.taxes]); + const selectedOptions = useMemo(() => { if (!selectedTaxRate) { return []; @@ -44,39 +46,32 @@ function TaxPicker({selectedTaxRate = '', taxRates, insets, onSubmit}: TaxPicker return [ { - name: selectedTaxRate, + name: getTaxName(selectedTaxRate), enabled: true, accountID: null, }, ]; - }, [selectedTaxRate]); + }, [selectedTaxRate, getTaxName]); const sections = useMemo(() => { - const {taxRatesOptions} = OptionsListUtils.getFilteredOptions({}, {}, [], searchValue, selectedOptions, [], false, false, false, {}, [], false, {}, [], false, false, true, taxRates); + const taxRatesOptions = OptionsListUtils.getTaxRatesSection(taxRates, selectedOptions as OptionsListUtils.Category[], searchValue, selectedTaxRate); return taxRatesOptions; - }, [taxRates, searchValue, selectedOptions]); + }, [taxRates, searchValue, selectedOptions, selectedTaxRate]); - const selectedOptionKey = sections?.[0]?.data?.find((taxRate) => taxRate.searchText === selectedTaxRate)?.keyForList; + const headerMessage = OptionsListUtils.getHeaderMessageForNonUserList(sections[0].data.length > 0, searchValue); return ( - ); } diff --git a/src/languages/en.ts b/src/languages/en.ts index 1bcb52345e62..3718db667e3d 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1856,6 +1856,7 @@ export default { addRate: 'Add rate', workspaceDefault: 'Workspace currency default', foreignDefault: 'Foreign currency default', + customTaxName: 'Custom tax name', value: 'Value', errors: { taxRateAlreadyExists: 'This tax name is already in use.', diff --git a/src/languages/es.ts b/src/languages/es.ts index dc57425f82ff..c8f08b5278cd 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1880,6 +1880,7 @@ export default { addRate: 'Añadir tasa', workspaceDefault: 'Moneda por defecto del espacio de trabajo', foreignDefault: 'Moneda extranjera por defecto', + customTaxName: 'Nombre del impuesto', value: 'Valor', errors: { taxRateAlreadyExists: 'Ya existe un impuesto con este nombre', diff --git a/src/libs/API/parameters/SetPolicyCurrencyDefaultParams.ts b/src/libs/API/parameters/SetPolicyCurrencyDefaultParams.ts new file mode 100644 index 000000000000..bfbfdf9e3b35 --- /dev/null +++ b/src/libs/API/parameters/SetPolicyCurrencyDefaultParams.ts @@ -0,0 +1,6 @@ +type SetPolicyCurrencyDefaultParams = { + policyID: string; + taxCode: string; +}; + +export default SetPolicyCurrencyDefaultParams; diff --git a/src/libs/API/parameters/SetPolicyCustomTaxNameParams.ts b/src/libs/API/parameters/SetPolicyCustomTaxNameParams.ts new file mode 100644 index 000000000000..49dbdb7e215e --- /dev/null +++ b/src/libs/API/parameters/SetPolicyCustomTaxNameParams.ts @@ -0,0 +1,6 @@ +type SetPolicyCustomTaxNameParams = { + policyID: string; + customTaxName: string; +}; + +export default SetPolicyCustomTaxNameParams; diff --git a/src/libs/API/parameters/SetPolicyForeignCurrencyDefaultParams.ts b/src/libs/API/parameters/SetPolicyForeignCurrencyDefaultParams.ts new file mode 100644 index 000000000000..5dff8aabe427 --- /dev/null +++ b/src/libs/API/parameters/SetPolicyForeignCurrencyDefaultParams.ts @@ -0,0 +1,6 @@ +type SetPolicyForeignCurrencyDefaultParams = { + policyID: string; + taxCode: string; +}; + +export default SetPolicyForeignCurrencyDefaultParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index d681968e6695..286e61f88ced 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -182,3 +182,6 @@ export type {default as EnablePolicyTaxesParams} from './EnablePolicyTaxesParams export type {default as OpenPolicyMoreFeaturesPageParams} from './OpenPolicyMoreFeaturesPageParams'; export type {default as CreatePolicyDistanceRateParams} from './CreatePolicyDistanceRateParams'; export type {default as CreatePolicyTagsParams} from './CreatePolicyTagsParams'; +export type {default as SetPolicyCustomTaxNameParams} from './SetPolicyCustomTaxNameParams'; +export type {default as SetPolicyForeignCurrencyDefaultParams} from './SetPolicyForeignCurrencyDefaultParams'; +export type {default as SetPolicyCurrencyDefaultParams} from './SetPolicyCurrencyDefaultParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index a32b67b90e58..396aefa01a8e 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -173,6 +173,9 @@ const WRITE_COMMANDS = { ENABLE_POLICY_TAXES: 'EnablePolicyTaxes', ENABLE_POLICY_WORKFLOWS: 'EnablePolicyWorkflows', ENABLE_POLICY_REPORT_FIELDS: 'EnablePolicyReportFields', + SET_POLICY_TAXES_CURRENCY_DEFAULT: 'SetPolicyCurrencyDefaultTax', + SET_POLICY_TAXES_FOREIGN_CURRENCY_DEFAULT: 'SetPolicyForeignCurrencyDefaultTax', + SET_POLICY_CUSTOM_TAX_NAME: 'SetPolicyCustomTaxName', JOIN_POLICY_VIA_INVITE_LINK: 'JoinWorkspaceViaInviteLink', ACCEPT_JOIN_REQUEST: 'AcceptJoinRequest', DECLINE_JOIN_REQUEST: 'DeclineJoinRequest', @@ -352,6 +355,9 @@ type WriteCommandParameters = { [WRITE_COMMANDS.JOIN_POLICY_VIA_INVITE_LINK]: Parameters.JoinPolicyInviteLinkParams; [WRITE_COMMANDS.ACCEPT_JOIN_REQUEST]: Parameters.AcceptJoinRequestParams; [WRITE_COMMANDS.DECLINE_JOIN_REQUEST]: Parameters.DeclineJoinRequestParams; + [WRITE_COMMANDS.SET_POLICY_TAXES_CURRENCY_DEFAULT]: Parameters.SetPolicyCurrencyDefaultParams; + [WRITE_COMMANDS.SET_POLICY_CUSTOM_TAX_NAME]: Parameters.SetPolicyCustomTaxNameParams; + [WRITE_COMMANDS.SET_POLICY_TAXES_FOREIGN_CURRENCY_DEFAULT]: Parameters.SetPolicyForeignCurrencyDefaultParams; [WRITE_COMMANDS.CREATE_POLICY_TAX]: Parameters.CreatePolicyTaxParams; [WRITE_COMMANDS.CREATE_POLICY_DISTANCE_RATE]: Parameters.CreatePolicyDistanceRateParams; }; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index c591c3bc963d..69741141f4f3 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -268,6 +268,10 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../pages/workspace/tags/TagSettingsPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAGS_EDIT]: () => require('../../../pages/workspace/tags/WorkspaceEditTagsPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAG_CREATE]: () => require('../../../pages/workspace/tags/WorkspaceCreateTagPage').default as React.ComponentType, + [SCREENS.WORKSPACE.TAXES_SETTINGS]: () => require('../../../pages/workspace/taxes/WorkspaceTaxesSettingsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.TAXES_SETTINGS_CUSTOM_TAX_NAME]: () => require('../../../pages/workspace/taxes/WorkspaceTaxesSettingsCustomTaxName').default as React.ComponentType, + [SCREENS.WORKSPACE.TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT]: () => require('../../../pages/workspace/taxes/WorkspaceTaxesSettingsForeignCurrency').default as React.ComponentType, + [SCREENS.WORKSPACE.TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT]: () => require('../../../pages/workspace/taxes/WorkspaceTaxesSettingsWorkspaceCurrency').default as React.ComponentType, [SCREENS.REIMBURSEMENT_ACCOUNT]: () => require('../../../pages/ReimbursementAccount/ReimbursementAccountPage').default as React.ComponentType, [SCREENS.GET_ASSISTANCE]: () => require('../../../pages/GetAssistancePage').default as React.ComponentType, [SCREENS.SETTINGS.TWO_FACTOR_AUTH]: () => require('../../../pages/settings/Security/TwoFactorAuth/TwoFactorAuthPage').default as React.ComponentType, diff --git a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts index da317a8baf5e..6f06df9bf2ff 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -11,8 +11,13 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial> = { SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET, SCREENS.WORKSPACE.WORKFLOWS_PAYER, ], - [SCREENS.WORKSPACE.TAGS]: [SCREENS.WORKSPACE.TAGS_SETTINGS, SCREENS.WORKSPACE.TAGS_EDIT, SCREENS.WORKSPACE.TAG_CREATE, SCREENS.WORKSPACE.TAG_SETTINGS], - [SCREENS.WORKSPACE.TAXES]: [SCREENS.WORKSPACE.TAX_CREATE], + [SCREENS.WORKSPACE.TAXES]: [ + SCREENS.WORKSPACE.TAXES_SETTINGS, + SCREENS.WORKSPACE.TAXES_SETTINGS_CUSTOM_TAX_NAME, + SCREENS.WORKSPACE.TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT, + SCREENS.WORKSPACE.TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT, + ], + [SCREENS.WORKSPACE.TAGS]: [SCREENS.WORKSPACE.TAGS_SETTINGS, SCREENS.WORKSPACE.TAGS_EDIT, SCREENS.WORKSPACE.TAG_CREATE, SCREENS.WORKSPACE.TAG_SETTINGS, SCREENS.WORKSPACE.TAX_CREATE], [SCREENS.WORKSPACE.CATEGORIES]: [SCREENS.WORKSPACE.CATEGORY_CREATE, SCREENS.WORKSPACE.CATEGORY_SETTINGS, SCREENS.WORKSPACE.CATEGORIES_SETTINGS, SCREENS.WORKSPACE.CATEGORY_EDIT], [SCREENS.WORKSPACE.DISTANCE_RATES]: [SCREENS.WORKSPACE.CREATE_DISTANCE_RATE], }; diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index a0591e628ddf..ae8d47a69988 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -307,6 +307,18 @@ const config: LinkingOptions['config'] = { tagName: (tagName: string) => decodeURIComponent(tagName), }, }, + [SCREENS.WORKSPACE.TAXES_SETTINGS]: { + path: ROUTES.WORKSPACE_TAXES_SETTINGS.route, + }, + [SCREENS.WORKSPACE.TAXES_SETTINGS_CUSTOM_TAX_NAME]: { + path: ROUTES.WORKSPACE_TAXES_SETTINGS_CUSTOM_TAX_NAME.route, + }, + [SCREENS.WORKSPACE.TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT]: { + path: ROUTES.WORKSPACE_TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT.route, + }, + [SCREENS.WORKSPACE.TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT]: { + path: ROUTES.WORKSPACE_TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT.route, + }, [SCREENS.REIMBURSEMENT_ACCOUNT]: { path: ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.route, exact: true, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 858ddaf934a0..4c9bdb579605 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -193,6 +193,18 @@ type SettingsNavigatorParamList = { policyID: string; tagName: string; }; + [SCREENS.WORKSPACE.TAXES_SETTINGS]: { + policyID: string; + }; + [SCREENS.WORKSPACE.TAXES_SETTINGS_CUSTOM_TAX_NAME]: { + policyID: string; + }; + [SCREENS.WORKSPACE.TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT]: { + policyID: string; + }; + [SCREENS.WORKSPACE.TAXES_SETTINGS_WORKSPACE_CURRENCY_DEFAULT]: { + policyID: string; + }; [SCREENS.WORKSPACE.MEMBER_DETAILS]: { policyID: string; accountID: string; diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index 0bf4da8cede7..ff55343fa762 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -1202,8 +1202,8 @@ function hasEnabledTags(policyTagList: Array * @param taxRates - The original tax rates object. * @returns The transformed tax rates object.g */ -function transformedTaxRates(taxRates: TaxRatesWithDefault | undefined): Record { - const defaultTaxKey = taxRates?.defaultExternalID; +function transformedTaxRates(taxRates: TaxRatesWithDefault | undefined, defaultKey?: string): Record { + const defaultTaxKey = defaultKey ?? taxRates?.defaultExternalID; const getModifiedName = (data: TaxRate, code: string) => `${data.name} (${data.value})${defaultTaxKey === code ? ` • ${Localize.translateLocal('common.default')}` : ''}`; const taxes = Object.fromEntries(Object.entries(taxRates?.taxes ?? {}).map(([code, data]) => [code, {...data, code, modifiedName: getModifiedName(data, code), name: data.name}])); return taxes; @@ -1234,10 +1234,10 @@ function getTaxRatesOptions(taxRates: Array>): Option[] { /** * Builds the section list for tax rates */ -function getTaxRatesSection(taxRates: TaxRatesWithDefault | undefined, selectedOptions: Category[], searchInputValue: string): CategorySection[] { +function getTaxRatesSection(taxRates: TaxRatesWithDefault | undefined, selectedOptions: Category[], searchInputValue: string, defaultTaxKey?: string): CategorySection[] { const policyRatesSections = []; - const taxes = transformedTaxRates(taxRates); + const taxes = transformedTaxRates(taxRates, defaultTaxKey); const sortedTaxRates = sortTaxRates(taxes); const enabledTaxRates = sortedTaxRates.filter((taxRate) => !taxRate.isDisabled); @@ -2074,6 +2074,7 @@ export { formatSectionsFromSearchTerm, transformedTaxRates, getShareLogOptions, + getTaxRatesSection, }; -export type {MemberForList, CategorySection, GetOptions, PayeePersonalDetails}; +export type {MemberForList, CategorySection, GetOptions, PayeePersonalDetails, Category}; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 6c1b53e21436..c230116fb643 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3828,6 +3828,162 @@ function clearCreateDistanceRateItemAndError(policyID: string, customUnitID: str }); } +function setPolicyCustomTaxName(policyID: string, customTaxName: string) { + const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; + const originalCustomTaxName = policy?.taxRates?.name; + const onyxData: OnyxData = { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + name: customTaxName, + pendingFields: {name: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}, + errorFields: null, + }, + }, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + pendingFields: {name: null}, + errorFields: null, + }, + }, + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + name: originalCustomTaxName, + pendingFields: {name: null}, + errorFields: {name: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage')}, + }, + }, + }, + ], + }; + + const parameters = { + policyID, + customTaxName, + }; + + API.write(WRITE_COMMANDS.SET_POLICY_CUSTOM_TAX_NAME, parameters, onyxData); +} + +function setWorkspaceCurrencyDefault(policyID: string, taxCode: string) { + const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; + const originalDefaultExternalID = policy?.taxRates?.defaultExternalID; + const onyxData: OnyxData = { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + defaultExternalID: taxCode, + pendingFields: {defaultExternalID: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}, + errorFields: null, + }, + }, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + pendingFields: {defaultExternalID: null}, + errorFields: null, + }, + }, + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + defaultExternalID: originalDefaultExternalID, + pendingFields: {defaultExternalID: null}, + errorFields: {defaultExternalID: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage')}, + }, + }, + }, + ], + }; + + const parameters = { + policyID, + taxCode, + }; + + API.write(WRITE_COMMANDS.SET_POLICY_TAXES_CURRENCY_DEFAULT, parameters, onyxData); +} + +function setForeignCurrencyDefault(policyID: string, taxCode: string) { + const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; + const originalDefaultForeignCurrencyID = policy?.taxRates?.foreignTaxDefault; + const onyxData: OnyxData = { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + foreignTaxDefault: taxCode, + pendingFields: {foreignTaxDefault: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}, + errorFields: null, + }, + }, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + pendingFields: {foreignTaxDefault: null}, + errorFields: null, + }, + }, + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + taxRates: { + foreignTaxDefault: originalDefaultForeignCurrencyID, + pendingFields: {foreignTaxDefault: null}, + errorFields: {foreignTaxDefault: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage')}, + }, + }, + }, + ], + }; + + const parameters = { + policyID, + taxCode, + }; + + API.write(WRITE_COMMANDS.SET_POLICY_TAXES_FOREIGN_CURRENCY_DEFAULT, parameters, onyxData); +} + export { removeMembers, updateWorkspaceMembersRole, @@ -3908,4 +4064,7 @@ export { clearWorkspaceReimbursementErrors, deleteWorkspaceCategories, setWorkspaceTagEnabled, + setWorkspaceCurrencyDefault, + setForeignCurrencyDefault, + setPolicyCustomTaxName, }; diff --git a/src/pages/iou/request/step/IOURequestStepTaxRatePage.js b/src/pages/iou/request/step/IOURequestStepTaxRatePage.js index 0cc2375b5510..335964adf309 100644 --- a/src/pages/iou/request/step/IOURequestStepTaxRatePage.js +++ b/src/pages/iou/request/step/IOURequestStepTaxRatePage.js @@ -59,8 +59,7 @@ function IOURequestStepTaxRatePage({ }; const taxRates = lodashGet(policy, 'taxRates', {}); const defaultTaxKey = taxRates.defaultExternalID; - const defaultTaxName = (defaultTaxKey && `${taxRates.taxes[defaultTaxKey].name} (${taxRates.taxes[defaultTaxKey].value}) • ${translate('common.default')}`) || ''; - const selectedTaxRate = (transaction.taxRate && transaction.taxRate.text) || defaultTaxName; + const selectedTaxRate = (transaction.taxRate && transaction.taxRate.keyForList) || defaultTaxKey; const updateTaxRates = (taxes) => { const taxAmount = getTaxAmount(taxRates, taxes.text, transaction.amount); diff --git a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx index b50739b29aa7..d0724f4592ba 100644 --- a/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx +++ b/src/pages/workspace/taxes/WorkspaceTaxesPage.tsx @@ -141,7 +141,7 @@ function WorkspaceTaxesPage({policy, route}: WorkspaceTaxesPageProps) { />