diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 909f847fd75d..97a67e9991a0 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -730,7 +730,7 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/export` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/quickbooks-online/export` as const, backTo), }, POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/export/company-card-expense-account', @@ -1211,7 +1211,8 @@ const ROUTES = { }, WORKSPACE_COMPANY_CARD_EXPORT: { route: 'settings/workspaces/:policyID/company-cards/:bank/:cardID/edit/export', - getRoute: (policyID: string, cardID: string, bank: string) => `settings/workspaces/${policyID}/company-cards/${bank}/${cardID}/edit/export` as const, + getRoute: (policyID: string, cardID: string, bank: string, backTo?: string) => + getUrlWithBackToParam(`settings/workspaces/${policyID}/company-cards/${bank}/${cardID}/edit/export`, backTo), }, WORKSPACE_EXPENSIFY_CARD: { route: 'settings/workspaces/:policyID/expensify-card', @@ -1503,7 +1504,7 @@ const ROUTES = { }, POLICY_ACCOUNTING_XERO_EXPORT: { route: 'settings/workspaces/:policyID/accounting/xero/export', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/export` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/xero/export` as const, backTo), }, POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT: { route: 'settings/workspaces/:policyID/connections/xero/export/preferred-exporter/select', @@ -1628,7 +1629,7 @@ const ROUTES = { }, POLICY_ACCOUNTING_NETSUITE_EXPORT: { route: 'settings/workspaces/:policyID/connections/netsuite/export/', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/export/` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/connections/netsuite/export/` as const, backTo), }, POLICY_ACCOUNTING_NETSUITE_PREFERRED_EXPORTER_SELECT: { route: 'settings/workspaces/:policyID/connections/netsuite/export/preferred-exporter/select', @@ -1766,7 +1767,7 @@ const ROUTES = { }, POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT: { route: 'settings/workspaces/:policyID/accounting/sage-intacct/export', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/sage-intacct/export` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/accounting/sage-intacct/export`, backTo), }, POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER: { route: 'settings/workspaces/:policyID/accounting/sage-intacct/export/preferred-exporter', diff --git a/src/components/ConnectionLayout.tsx b/src/components/ConnectionLayout.tsx index 538ee3559580..9a232e83fb97 100644 --- a/src/components/ConnectionLayout.tsx +++ b/src/components/ConnectionLayout.tsx @@ -32,7 +32,7 @@ type ConnectionLayoutProps = { title?: TranslationPaths; /** The current policyID */ - policyID: string; + policyID?: string; /** Defines which types of access should be verified */ accessVariants?: AccessVariant[]; diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 9869f4e39f94..3f672398cba7 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -427,6 +427,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_EXPORT_DATE_SELECT]: { policyID: string; @@ -544,6 +545,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.XERO_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.XERO_EXPORT_PURCHASE_BILL_DATE_SELECT]: { policyID: string; @@ -620,6 +622,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_PREFERRED_EXPORTER_SELECT]: { policyID: string; @@ -710,6 +713,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_EXPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PREFERRED_EXPORTER]: { policyID: string; @@ -832,6 +836,7 @@ type SettingsNavigatorParamList = { policyID: string; cardID: string; bank: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW]: { policyID: string; diff --git a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx index 47c5ada80f46..9384cf785e9c 100644 --- a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx +++ b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -7,35 +8,40 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {getCurrentSageIntacctEntityName} from '@libs/PolicyUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; function SageIntacctExportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; - + const policyID = policy?.id; + const route = useRoute>(); + const backTo = route?.params?.backTo; const {export: exportConfig, pendingFields, errorFields} = policy?.connections?.intacct?.config ?? {}; + const isConnectionShouldBeRemovedFromCompanyCard = exportConfig?.reimbursable === CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.EXPENSE_REPORT && backTo; const sections = useMemo( () => [ { description: translate('workspace.sageIntacct.preferredExporter'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER.getRoute(policyID)), + action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER.getRoute(policyID)), title: exportConfig?.exporter ?? translate('workspace.sageIntacct.notConfigured'), subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORTER], }, { description: translate('workspace.sageIntacct.exportDate.label'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT_DATE.getRoute(policyID)), + action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT_DATE.getRoute(policyID)), title: exportConfig?.exportDate ? translate(`workspace.sageIntacct.exportDate.values.${exportConfig.exportDate}.label`) : translate(`workspace.sageIntacct.notConfigured`), subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORT_DATE], }, { description: translate('workspace.accounting.exportOutOfPocket'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_REIMBURSABLE_EXPENSES.getRoute(policyID)), + action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_REIMBURSABLE_EXPENSES.getRoute(policyID)), title: exportConfig?.reimbursable ? translate(`workspace.sageIntacct.reimbursableExpenses.values.${exportConfig.reimbursable}`) : translate('workspace.sageIntacct.notConfigured'), @@ -43,7 +49,7 @@ function SageIntacctExportPage({policy}: WithPolicyProps) { }, { description: translate('workspace.accounting.exportCompanyCard'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_NON_REIMBURSABLE_EXPENSES.getRoute(policyID)), + action: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_NON_REIMBURSABLE_EXPENSES.getRoute(policyID)), title: exportConfig?.nonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : translate('workspace.sageIntacct.notConfigured'), @@ -67,6 +73,7 @@ function SageIntacctExportPage({policy}: WithPolicyProps) { title="workspace.sageIntacct.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]} policyID={policyID} + onBackButtonPress={isConnectionShouldBeRemovedFromCompanyCard ? () => Navigation.navigate(backTo) : undefined} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx index 88e7934bf17f..1535c713db60 100644 --- a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import {View} from 'react-native'; import ConnectionLayout from '@components/ConnectionLayout'; @@ -16,6 +17,8 @@ import { findSelectedTaxAccountWithDefaultSelect, settingsPendingAction, } from '@libs/PolicyUtils'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {DividerLineItem, MenuItem, ToggleItem} from '@pages/workspace/accounting/netsuite/types'; import { shouldHideExportForeignCurrencyAmount, @@ -33,17 +36,25 @@ import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOpt import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; type MenuItemWithSubscribedSettings = Pick & {subscribedSettings?: string[]}; function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const route = useRoute>(); + const backTo = route?.params?.backTo; + const policyID = policy?.id; const policyOwner = policy?.owner ?? ''; const {canUseNetSuiteUSATax} = usePermissions(); const config = policy?.connections?.netsuite?.options.config; + const isConnectionShouldBeRemovedFromCompanyCard = + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + (config?.reimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT || + config?.nonreimbursableExpensesExportDestination === CONST.NETSUITE_EXPORT_DESTINATION.EXPENSE_REPORT) && + backTo; const {subsidiaryList, receivableList, taxAccountsList, items} = policy?.connections?.netsuite?.options?.data ?? {}; const selectedSubsidiary = useMemo(() => (subsidiaryList ?? []).find((subsidiary) => subsidiary.internalID === config?.subsidiaryID), [subsidiaryList, config?.subsidiaryID]); @@ -77,9 +88,11 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { type: 'menuitem', title: config?.exporter ?? policyOwner, description: translate('workspace.accounting.preferredExporter'), - onPress: () => { - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_PREFERRED_EXPORTER_SELECT.getRoute(policyID)); - }, + onPress: !policyID + ? undefined + : () => { + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_PREFERRED_EXPORTER_SELECT.getRoute(policyID)); + }, subscribedSettings: [CONST.NETSUITE_CONFIG.EXPORTER], }, { @@ -92,14 +105,14 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { ? translate(`workspace.netsuite.exportDate.values.${config.exportDate}.label`) : translate(`workspace.netsuite.exportDate.values.${CONST.NETSUITE_EXPORT_DATE.LAST_EXPENSE}.label`), description: translate('workspace.accounting.exportDate'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_DATE_SELECT.getRoute(policyID)), + onPress: () => (!policyID ? undefined : Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_DATE_SELECT.getRoute(policyID))), subscribedSettings: [CONST.NETSUITE_CONFIG.EXPORT_DATE], }, { type: 'menuitem', title: config?.reimbursableExpensesExportDestination ? translate(`workspace.netsuite.exportDestination.values.${config.reimbursableExpensesExportDestination}.label`) : undefined, description: translate('workspace.accounting.exportOutOfPocket'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT_EXPENSES.getRoute(policyID, CONST.NETSUITE_EXPENSE_TYPE.REIMBURSABLE)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT_EXPENSES.getRoute(policyID, CONST.NETSUITE_EXPENSE_TYPE.REIMBURSABLE)), subscribedSettings: [ CONST.NETSUITE_CONFIG.REIMBURSABLE_EXPENSES_EXPORT_DESTINATION, ...(!shouldHideReimbursableDefaultVendor(true, config) ? [CONST.NETSUITE_CONFIG.DEFAULT_VENDOR] : []), @@ -114,7 +127,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { ? translate(`workspace.netsuite.exportDestination.values.${config.nonreimbursableExpensesExportDestination}.label`) : undefined, description: translate('workspace.accounting.exportCompanyCard'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT_EXPENSES.getRoute(policyID, CONST.NETSUITE_EXPENSE_TYPE.NON_REIMBURSABLE)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT_EXPENSES.getRoute(policyID, CONST.NETSUITE_EXPENSE_TYPE.NON_REIMBURSABLE)), subscribedSettings: [ CONST.NETSUITE_CONFIG.NON_REIMBURSABLE_EXPENSES_EXPORT_DESTINATION, ...(!shouldHideReimbursableDefaultVendor(false, config) ? [CONST.NETSUITE_CONFIG.DEFAULT_VENDOR] : []), @@ -131,14 +144,14 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { type: 'menuitem', title: selectedReceivable ? selectedReceivable.name : undefined, description: translate('workspace.netsuite.exportInvoices'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_RECEIVABLE_ACCOUNT_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_RECEIVABLE_ACCOUNT_SELECT.getRoute(policyID)), subscribedSettings: [CONST.NETSUITE_CONFIG.RECEIVABLE_ACCOUNT], }, { type: 'menuitem', title: invoiceItemValue, description: translate('workspace.netsuite.invoiceItem.label'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_INVOICE_ITEM_PREFERENCE_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_INVOICE_ITEM_PREFERENCE_SELECT.getRoute(policyID)), subscribedSettings: [CONST.NETSUITE_CONFIG.INVOICE_ITEM_PREFERENCE, ...(shouldShowInvoiceItemMenuItem(config) ? [CONST.NETSUITE_CONFIG.INVOICE_ITEM] : [])], }, { @@ -149,7 +162,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { type: 'menuitem', title: selectedProvTaxPostingAccount ? selectedProvTaxPostingAccount.name : undefined, description: translate('workspace.netsuite.journalEntriesProvTaxPostingAccount'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_PROVINCIAL_TAX_POSTING_ACCOUNT_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_PROVINCIAL_TAX_POSTING_ACCOUNT_SELECT.getRoute(policyID)), subscribedSettings: [CONST.NETSUITE_CONFIG.PROVINCIAL_TAX_POSTING_ACCOUNT], shouldHide: shouldHideProvincialTaxPostingAccountSelect(selectedSubsidiary, config), }, @@ -157,7 +170,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { type: 'menuitem', title: selectedTaxPostingAccount ? selectedTaxPostingAccount.name : undefined, description: translate('workspace.netsuite.journalEntriesTaxPostingAccount'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_TAX_POSTING_ACCOUNT_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_TAX_POSTING_ACCOUNT_SELECT.getRoute(policyID)), subscribedSettings: [CONST.NETSUITE_CONFIG.TAX_POSTING_ACCOUNT], shouldHide: shouldHideTaxPostingAccountSelect(canUseNetSuiteUSATax, selectedSubsidiary, config), }, @@ -166,8 +179,8 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title: translate('workspace.netsuite.foreignCurrencyAmount'), isActive: !!config?.allowForeignCurrency, switchAccessibilityLabel: translate('workspace.netsuite.foreignCurrencyAmount'), - onToggle: () => Connections.updateNetSuiteAllowForeignCurrency(policyID, !config?.allowForeignCurrency, config?.allowForeignCurrency), - onCloseError: () => Policy.clearNetSuiteErrorField(policyID, CONST.NETSUITE_CONFIG.ALLOW_FOREIGN_CURRENCY), + onToggle: () => (!policyID ? null : Connections.updateNetSuiteAllowForeignCurrency(policyID, !config?.allowForeignCurrency, config?.allowForeignCurrency)), + onCloseError: !policyID ? undefined : () => Policy.clearNetSuiteErrorField(policyID, CONST.NETSUITE_CONFIG.ALLOW_FOREIGN_CURRENCY), pendingAction: settingsPendingAction([CONST.NETSUITE_CONFIG.ALLOW_FOREIGN_CURRENCY], config?.pendingFields), errors: ErrorUtils.getLatestErrorField(config, CONST.NETSUITE_CONFIG.ALLOW_FOREIGN_CURRENCY), shouldHide: shouldHideExportForeignCurrencyAmount(config), @@ -177,8 +190,8 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title: translate('workspace.netsuite.exportToNextOpenPeriod'), isActive: !!config?.exportToNextOpenPeriod, switchAccessibilityLabel: translate('workspace.netsuite.exportToNextOpenPeriod'), - onCloseError: () => Policy.clearNetSuiteErrorField(policyID, CONST.NETSUITE_CONFIG.EXPORT_TO_NEXT_OPEN_PERIOD), - onToggle: () => Connections.updateNetSuiteExportToNextOpenPeriod(policyID, !config?.exportToNextOpenPeriod, config?.exportToNextOpenPeriod ?? false), + onCloseError: !policyID ? undefined : () => Policy.clearNetSuiteErrorField(policyID, CONST.NETSUITE_CONFIG.EXPORT_TO_NEXT_OPEN_PERIOD), + onToggle: () => (!policyID ? null : Connections.updateNetSuiteExportToNextOpenPeriod(policyID, !config?.exportToNextOpenPeriod, config?.exportToNextOpenPeriod ?? false)), pendingAction: settingsPendingAction([CONST.NETSUITE_CONFIG.EXPORT_TO_NEXT_OPEN_PERIOD], config?.pendingFields), errors: ErrorUtils.getLatestErrorField(config, CONST.NETSUITE_CONFIG.EXPORT_TO_NEXT_OPEN_PERIOD), }, @@ -192,6 +205,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title="workspace.netsuite.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} + onBackButtonPress={isConnectionShouldBeRemovedFromCompanyCard ? () => Navigation.navigate(backTo) : undefined} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx b/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx index cfc659ac202c..dcfce5d70b95 100644 --- a/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbo/export/QuickbooksExportConfigurationPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -8,16 +9,21 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import * as PolicyUtils from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; function QuickbooksExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const route = useRoute>(); + const backTo = route?.params?.backTo; + const policyID = policy?.id; const policyOwner = policy?.owner ?? ''; const qboConfig = policy?.connections?.quickbooksOnline?.config; const errorFields = qboConfig?.errorFields; @@ -26,34 +32,36 @@ function QuickbooksExportConfigurationPage({policy}: WithPolicyConnectionsProps) () => qboConfig?.nonReimbursableExpensesExportDestination === CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL, [qboConfig?.nonReimbursableExpensesExportDestination], ); + const isConnectionShouldBeRemovedFromCompanyCard = shouldShowVendorMenuItems && backTo; + const menuItems = [ { description: translate('workspace.accounting.preferredExporter'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_PREFERRED_EXPORTER.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_PREFERRED_EXPORTER.getRoute(policyID)), title: qboConfig?.export?.exporter ?? policyOwner, subscribedSettings: [CONST.QUICKBOOKS_CONFIG.EXPORT], }, { description: translate('workspace.qbo.date'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT_DATE_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT_DATE_SELECT.getRoute(policyID)), title: qboConfig?.exportDate ? translate(`workspace.qbo.exportDate.values.${qboConfig?.exportDate}.label`) : undefined, subscribedSettings: [CONST.QUICKBOOKS_CONFIG.EXPORT_DATE], }, { description: translate('workspace.accounting.exportOutOfPocket'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID)), title: qboConfig?.reimbursableExpensesExportDestination ? translate(`workspace.qbo.accounts.${qboConfig?.reimbursableExpensesExportDestination}`) : undefined, subscribedSettings: [CONST.QUICKBOOKS_CONFIG.REIMBURSABLE_EXPENSES_EXPORT_DESTINATION, CONST.QUICKBOOKS_CONFIG.REIMBURSABLE_EXPENSES_ACCOUNT], }, { description: translate('workspace.qbo.exportInvoices'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_INVOICE_ACCOUNT_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_INVOICE_ACCOUNT_SELECT.getRoute(policyID)), title: qboConfig?.receivableAccount?.name, subscribedSettings: [CONST.QUICKBOOKS_CONFIG.RECEIVABLE_ACCOUNT], }, { description: translate('workspace.accounting.exportCompanyCard'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT.getRoute(policyID)), brickRoadIndicator: qboConfig?.errorFields?.exportCompanyCard ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, title: qboConfig?.nonReimbursableExpensesExportDestination ? translate(`workspace.qbo.accounts.${qboConfig?.nonReimbursableExpensesExportDestination}`) : undefined, subscribedSettings: [ @@ -78,6 +86,7 @@ function QuickbooksExportConfigurationPage({policy}: WithPolicyConnectionsProps) title="workspace.qbo.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} + onBackButtonPress={isConnectionShouldBeRemovedFromCompanyCard ? () => Navigation.navigate(backTo) : undefined} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx b/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx index 52f1163588db..69b6375f2856 100644 --- a/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroExportConfigurationPage.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useMemo} from 'react'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -7,18 +8,24 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import {getCurrentXeroOrganizationName} from '@libs/PolicyUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const policyID = policy?.id ?? '-1'; + const policyID = policy?.id; + const route = useRoute>(); + const backTo = route?.params?.backTo; const policyOwner = policy?.owner ?? ''; const {export: exportConfiguration, errorFields, pendingFields} = policy?.connections?.xero?.config ?? {}; + const isConnectionShouldBeRemovedFromCompanyCard = !exportConfiguration?.nonReimbursableAccount && backTo; const {bankAccounts} = policy?.connections?.xero?.data ?? {}; const selectedBankAccountName = useMemo(() => { @@ -31,9 +38,11 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { const menuItems = [ { description: translate('workspace.accounting.preferredExporter'), - onPress: () => { - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT.getRoute(policyID)); - }, + onPress: !policyID + ? undefined + : () => { + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT.getRoute(policyID)); + }, title: exportConfiguration?.exporter ?? policyOwner, subscribedSettings: [CONST.XERO_CONFIG.EXPORTER], }, @@ -46,13 +55,13 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { }, { description: translate('workspace.xero.purchaseBillDate'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT_PURCHASE_BILL_DATE_SELECT.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT_PURCHASE_BILL_DATE_SELECT.getRoute(policyID)), title: exportConfiguration?.billDate ? translate(`workspace.xero.exportDate.values.${exportConfiguration.billDate}.label`) : undefined, subscribedSettings: [CONST.XERO_CONFIG.BILL_DATE], }, { description: translate('workspace.xero.advancedConfig.purchaseBillStatusTitle'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_BILL_STATUS_SELECTOR.getRoute(policyID)), + onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_BILL_STATUS_SELECTOR.getRoute(policyID)), title: exportConfiguration?.billStatus?.purchase ? translate(`workspace.xero.invoiceStatus.values.${exportConfiguration.billStatus.purchase}`) : undefined, subscribedSettings: [CONST.XERO_CONFIG.BILL_STATUS], }, @@ -72,7 +81,7 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { }, { description: translate('workspace.xero.xeroBankAccount'), - onPress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT_BANK_ACCOUNT_SELECT.getRoute(policyID)), + onPress: () => (!policyID ? undefined : Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT_BANK_ACCOUNT_SELECT.getRoute(policyID))), title: selectedBankAccountName, subscribedSettings: [CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT], }, @@ -86,6 +95,7 @@ function XeroExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title="workspace.xero.exportDescription" accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} policyID={policyID} + onBackButtonPress={isConnectionShouldBeRemovedFromCompanyCard ? () => Navigation.navigate(backTo) : undefined} featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} contentContainerStyle={styles.pb2} titleStyle={styles.ph5} diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx index 88aeb2557b03..30364bbb3b80 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx @@ -28,7 +28,7 @@ type WorkspaceCompanyCardAccountSelectCardProps = PlatformStackScreenProps= CONST.STANDARD_LIST_ITEM_LIMIT; const defaultCard = translate('workspace.moreFeatures.companyCards.defaultCard'); diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx index fb49ece0feb0..6528d35b3374 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx @@ -148,7 +148,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag description={exportMenuItem.description} title={exportMenuItem.title} shouldShowRightIcon - onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_EXPORT.getRoute(policyID, cardID, bank))} + onPress={() => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARD_EXPORT.getRoute(policyID, cardID, bank, Navigation.getActiveRoute()))} /> ) : null} diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index 634ee5807b6f..1dd8943c4e10 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -23,6 +23,7 @@ function getExportMenuItem( translate: LocaleContextProps['translate'], policy?: Policy, companyCard?: Card, + backTo?: string | undefined, ): ExportIntegration | undefined { const currentConnectionName = PolicyUtils.getCurrentConnectionName(policy); const defaultCard = translate('workspace.moreFeatures.companyCards.defaultCard'); @@ -34,7 +35,8 @@ function getExportMenuItem( currency: '', }; - const {nonReimbursableExpensesExportDestination, nonReimbursableExpensesAccount} = policy?.connections?.quickbooksOnline?.config ?? {}; + const {nonReimbursableExpensesExportDestination, nonReimbursableExpensesAccount, reimbursableExpensesExportDestination, reimbursableExpensesAccount} = + policy?.connections?.quickbooksOnline?.config ?? {}; const {export: exportConfig} = policy?.connections?.intacct?.config ?? {}; const {export: exportConfiguration} = policy?.connections?.xero?.config ?? {}; const config = policy?.connections?.netsuite?.options.config; @@ -43,16 +45,22 @@ function getExportMenuItem( switch (connectionName) { case CONST.POLICY.CONNECTIONS.NAME.QBO: { - const type = nonReimbursableExpensesExportDestination ? translate(`workspace.qbo.accounts.${nonReimbursableExpensesExportDestination}`) : undefined; + const typeNonReimbursable = nonReimbursableExpensesExportDestination ? translate(`workspace.qbo.accounts.${nonReimbursableExpensesExportDestination}`) : undefined; + const typeReimbursable = reimbursableExpensesExportDestination ? translate(`workspace.qbo.accounts.${reimbursableExpensesExportDestination}`) : undefined; + const type = typeNonReimbursable ?? typeReimbursable; const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', {integration: currentConnectionName, type}) : undefined; let data: Account[]; - let shouldShowMenuItem = true; + let shouldShowMenuItem = nonReimbursableExpensesExportDestination !== CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL; let title: string | undefined = ''; let selectedAccount: string | undefined = ''; - const defaultAccount = nonReimbursableExpensesAccount?.name; + const defaultAccount = nonReimbursableExpensesAccount?.name ?? reimbursableExpensesAccount?.name; let isDefaultTitle = false; let exportType: ValueOf | undefined; - switch (nonReimbursableExpensesExportDestination) { + const qboConfig = nonReimbursableExpensesExportDestination ?? reimbursableExpensesExportDestination; + switch (qboConfig) { + case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.JOURNAL_ENTRY: + case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.CHECK: + case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.VENDOR_BILL: case CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD: { data = creditCards ?? []; isDefaultTitle = !!( @@ -89,7 +97,7 @@ function getExportMenuItem( title, exportType, shouldShowMenuItem, - onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT.getRoute(policyID)), + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT.getRoute(policyID, backTo)), data: resultData.map((card) => ({ value: card.name, text: card.name, @@ -114,9 +122,9 @@ function getExportMenuItem( return { description, exportType, - shouldShowMenuItem: true, + shouldShowMenuItem: !!exportConfiguration?.nonReimbursableAccount, title: isDefaultTitle ? defaultCard : selectedAccount?.name, - onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT.getRoute(policyID)), + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT.getRoute(policyID, backTo)), data: (resultData ?? []).map((card) => { return { value: card.id, @@ -128,9 +136,13 @@ function getExportMenuItem( }; } case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: { - const type = config?.nonreimbursableExpensesExportDestination + const typeNonreimbursable = config?.nonreimbursableExpensesExportDestination ? translate(`workspace.netsuite.exportDestination.values.${config.nonreimbursableExpensesExportDestination}.label`) : undefined; + const typeReimbursable = config?.reimbursableExpensesExportDestination + ? translate(`workspace.netsuite.exportDestination.values.${config.reimbursableExpensesExportDestination}.label`) + : undefined; + const type = typeNonreimbursable ?? typeReimbursable; let title: string | undefined = ''; let exportType: ValueOf | undefined; let shouldShowMenuItem = true; @@ -139,7 +151,9 @@ function getExportMenuItem( let defaultAccount: string | undefined = ''; let isDefaultTitle = false; - switch (config?.nonreimbursableExpensesExportDestination) { + const netSuiteConfig = config?.nonreimbursableExpensesExportDestination ?? config?.reimbursableExpensesExportDestination; + + switch (netSuiteConfig) { case CONST.NETSUITE_EXPORT_DESTINATION.VENDOR_BILL: { const vendors = policy?.connections?.netsuite.options.data.vendors; // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing @@ -199,11 +213,15 @@ function getExportMenuItem( shouldShowMenuItem, exportType, data, - onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT.getRoute(policyID)), + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT.getRoute(policyID, backTo)), }; } case CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT: { - const type = exportConfig?.nonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : undefined; + const isNonReimbursable = !!exportConfig?.nonReimbursable; + const isReimbursable = !!exportConfig?.reimbursable; + const typeNonReimbursable = isNonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : undefined; + const typeReimbursable = isReimbursable ? translate(`workspace.sageIntacct.reimbursableExpenses.values.${exportConfig.reimbursable}`) : undefined; + const type = typeNonReimbursable ?? typeReimbursable; const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', {integration: currentConnectionName, type}) : undefined; let exportType: ValueOf | undefined; let title: string | undefined = ''; @@ -212,9 +230,12 @@ function getExportMenuItem( let shouldShowMenuItem = true; let data: SelectorType[]; - switch (exportConfig?.nonReimbursable) { - case CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL: { - const defaultAccount = PolicyUtils.getSageIntacctNonReimbursableActiveDefaultVendor(policy); + const sageConfig = exportConfig?.nonReimbursable ?? exportConfig?.reimbursable; + + switch (sageConfig) { + case CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL: + case CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL: { + const defaultAccount = isNonReimbursable ? PolicyUtils.getSageIntacctNonReimbursableActiveDefaultVendor(policy) : exportConfig?.reimbursableExpenseReportDefaultVendor; isDefaultTitle = !!( companyCard?.nameValuePairs?.intacct_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || (defaultAccount && !companyCard?.nameValuePairs?.intacct_export_vendor) @@ -260,7 +281,6 @@ function getExportMenuItem( }; }); exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_INTACCT_EXPORT_CHARGE_CARD; - break; } default: @@ -273,7 +293,7 @@ function getExportMenuItem( shouldShowMenuItem, exportType, title, - onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT.getRoute(policyID)), + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT.getRoute(policyID, backTo)), data, }; }