From 96635abc692056842858efcdfaa276615380f802 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 15 Mar 2024 16:37:35 +0200 Subject: [PATCH 01/31] QBO import main page --- ios/Podfile.lock | 4 +- src/ROUTES.ts | 8 ++ src/SCREENS.ts | 2 + src/languages/en.ts | 13 +++ src/languages/es.ts | 13 +++ .../AppNavigator/ModalStackNavigators.tsx | 1 + src/libs/Navigation/linkingConfig/config.ts | 1 + src/libs/Navigation/types.ts | 9 ++ .../qbo/PolicyQuickbooksImportPage.tsx | 92 +++++++++++++++++++ src/types/onyx/Policy.ts | 4 +- 10 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d0007ec51668..b8ebda2a875b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1913,8 +1913,8 @@ SPEC CHECKSUMS: SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Turf: 13d1a92d969ca0311bbc26e8356cca178ce95da2 VisionCamera: 0a6794d1974aed5d653d0d0cb900493e2583e35a - Yoga: 13c8ef87792450193e117976337b8527b49e8c03 + Yoga: e64aa65de36c0832d04e8c7bd614396c77a80047 PODFILE CHECKSUM: a431c146e1501391834a2f299a74093bac53b530 -COCOAPODS: 1.13.0 +COCOAPODS: 1.11.3 diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 680c5bced9a9..c3a2898782cd 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -615,6 +615,14 @@ const ROUTES = { route: 'r/:reportID/transaction/:transactionID/receipt', getRoute: (reportID: string, transactionID: string) => `r/${reportID}/transaction/${transactionID}/receipt` as const, }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import` as const, + }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_OPTION: { + route: 'workspace/:policyID/accounting/quickbooks-online/import/:option', + getRoute: (policyID: string, option: string) => `workspace/${policyID}/connections/quickbooks-online/import/${option}` as const, + }, } as const; /** diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 7ccb24aa19e5..4827514e3c5e 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -238,6 +238,8 @@ const SCREENS = { MEMBER_DETAILS: 'Workspace_Member_Details', MEMBER_DETAILS_ROLE_SELECTION: 'Workspace_Member_Details_Role_Selection', DISTANCE_RATES: 'Distance_Rates', + ACCOUNTING: 'Policy_Accounting', + QUICKBOOKSONLINE_IMPORT: 'Policy_Accounting_QuickbooksOnline_Import', }, EDIT_REQUEST: { diff --git a/src/languages/en.ts b/src/languages/en.ts index eecd81c54123..1188e72138df 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1769,6 +1769,19 @@ export default { requested: 'Requested', distanceRates: 'Distance rates', }, + qbo: { + import: 'Import', + importDescription: 'Choose which coding configurations are imported from QuickBooks Online to Expensify', + classes: 'Classes', + accounts: 'Chart of Accounts', + locations: 'Locations', + taxes: 'Taxes', + customers: 'Customers/Projects', + imported: 'Imported', + notImported: 'Not imported', + importedAsTags: 'Imported, displayed as tags', + importedAsReportFields: 'Imported, displayed as categories', + }, type: { free: 'Free', control: 'Control', diff --git a/src/languages/es.ts b/src/languages/es.ts index cd36f9071de6..88043e0c44e9 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1793,6 +1793,19 @@ export default { requested: 'Solicitado', distanceRates: 'Tasas de distancia', }, + qbo: { + import: 'Importación', + importDescription: 'Elija qué configuraciones de codificación se importan de QuickBooks Online a Expensify', + classes: 'Clases', + locations: 'Ubicaciones', + accounts: 'Catálogo de cuentas', + customers: 'Clientes/Proyectos', + imported: 'Importado', + taxes: 'Impuestos', + notImported: 'No importado', + importedAsTags: 'Importado, mostrado como etiquetas', + importedAsReportFields: 'Importado, mostrado como categorías', + }, type: { free: 'Gratis', control: 'Control', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index 2e55593ddd01..17ae9f3470d5 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -267,6 +267,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../pages/workspace/tags/WorkspaceTagsSettingsPage').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.QUICKBOOKSONLINE_IMPORT]: () => require('../../../pages/workspace/qbo/PolicyQuickbooksImportPage').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/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 56734e3c7242..2d279dc91bdd 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -232,6 +232,7 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.CURRENCY]: { path: ROUTES.WORKSPACE_PROFILE_CURRENCY.route, }, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT.route}, [SCREENS.WORKSPACE.DESCRIPTION]: { path: ROUTES.WORKSPACE_PROFILE_DESCRIPTION.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 939841279eed..cb0e454720f3 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -199,6 +199,9 @@ type SettingsNavigatorParamList = { accountID: string; backTo: Routes; }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { + policyID: string; + }; [SCREENS.GET_ASSISTANCE]: { backTo: Routes; }; @@ -550,6 +553,12 @@ type WorkspacesCentralPaneNavigatorParamList = { [SCREENS.WORKSPACE.DISTANCE_RATES]: { policyID: string; }; + [SCREENS.WORKSPACE.ACCOUNTING]: { + policyID: string; + }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { + policyID: string; + }; }; type FullScreenNavigatorParamList = { diff --git a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx new file mode 100644 index 000000000000..552b49b8c8b7 --- /dev/null +++ b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx @@ -0,0 +1,92 @@ +import React, {useCallback} from 'react'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import withPolicy from '@pages/workspace/withPolicy'; +import type {WithPolicyProps} from '@pages/workspace/withPolicy'; +import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; + +function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const quickbooksOnlineConfigTitles = { + DEFAULT: translate('workspace.qbo.imported'), + NONE: translate('workspace.qbo.notImported'), + TAG: translate('workspace.qbo.importedAsTags'), + REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), + }; + const {syncClasses, syncCustomers, syncLocations, syncAccounts, syncTaxes} = policy?.connections?.quickbooksOnline?.config ?? {}; + + const onPressConfigOption = useCallback((option: string) => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_OPTION.getRoute(policy?.id ?? '', option)), [policy?.id]); + + const sections = [ + { + description: translate('workspace.qbo.accounts'), + navigationKey: 'accounts', + errorIndicator: !!policy?.errors?.syncAccounts, + title: syncAccounts, + }, + { + description: translate('workspace.qbo.classes'), + navigationKey: 'classes', + errorIndicator: !!policy?.errors?.syncClasses, + title: syncClasses, + }, + { + description: translate('workspace.qbo.customers'), + navigationKey: 'customers', + errorIndicator: !!policy?.errors?.syncCustomers, + title: syncCustomers, + }, + { + description: translate('workspace.qbo.locations'), + navigationKey: 'locations', + errorIndicator: !!policy?.errors?.syncLocations, + title: syncLocations, + }, + { + description: translate('workspace.qbo.taxes'), + navigationKey: 'taxes', + errorIndicator: !!policy?.errors?.syncTaxes, + title: syncTaxes, + }, + ]; + + return ( + + + + {translate('workspace.qbo.importDescription')} + {sections.map((section) => ( + + onPressConfigOption(section.navigationKey)} + brickRoadIndicator={section.errorIndicator ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + ))} + + + ); +} + +PolicyQuickbooksImportPage.displayName = 'PolicyQuickbooksImportPage'; + +export default withPolicy(PolicyQuickbooksImportPage); diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 688300933a5e..3ed2e5c963ff 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -151,6 +151,8 @@ type QBOConnectionConfig = { syncClasses: IntegrationEntityMap; syncCustomers: IntegrationEntityMap; syncLocations: IntegrationEntityMap; + syncAccounts: IntegrationEntityMap; + syncTaxes: IntegrationEntityMap; exportDate: string; lastConfigurationTime: number; syncTax: boolean; @@ -357,4 +359,4 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback< export default Policy; -export type {Unit, CustomUnit, Attributes, Rate, TaxRate, TaxRates, TaxRatesWithDefault, PendingJoinRequestPolicy}; +export type {Unit, CustomUnit, Attributes, Rate, TaxRate, TaxRates, TaxRatesWithDefault, PendingJoinRequestPolicy, IntegrationEntityMap}; From b9670c99d1a73168ff3fc5a278a2d80c96a0b392 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 15 Mar 2024 16:39:46 +0200 Subject: [PATCH 02/31] lock --- ios/Podfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b8ebda2a875b..d0007ec51668 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1913,8 +1913,8 @@ SPEC CHECKSUMS: SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Turf: 13d1a92d969ca0311bbc26e8356cca178ce95da2 VisionCamera: 0a6794d1974aed5d653d0d0cb900493e2583e35a - Yoga: e64aa65de36c0832d04e8c7bd614396c77a80047 + Yoga: 13c8ef87792450193e117976337b8527b49e8c03 PODFILE CHECKSUM: a431c146e1501391834a2f299a74093bac53b530 -COCOAPODS: 1.11.3 +COCOAPODS: 1.13.0 From 8e78317eae55798c4db5db9e53d12973ab8b4ace Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 19 Mar 2024 16:38:15 +0200 Subject: [PATCH 03/31] Add Chart of account sub page + new routes and Policy api --- src/ROUTES.ts | 22 +++++- src/SCREENS.ts | 5 ++ src/languages/en.ts | 3 + src/languages/es.ts | 3 + src/libs/API/types.ts | 1 + .../AppNavigator/ModalStackNavigators.tsx | 1 + src/libs/Navigation/linkingConfig/config.ts | 5 ++ src/libs/actions/Policy.ts | 65 +++++++++++++++++ .../qbo/PolicyQuickbooksImportPage.tsx | 48 +++++++++++-- ...kbooksChartOfAccountsConfigurationPage.tsx | 72 +++++++++++++++++++ 10 files changed, 215 insertions(+), 10 deletions(-) create mode 100644 src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index bbb92351d244..332c9c959b64 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -634,9 +634,25 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import', getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_OPTION: { - route: 'workspace/:policyID/accounting/quickbooks-online/import/:option', - getRoute: (policyID: string, option: string) => `workspace/${policyID}/connections/quickbooks-online/import/${option}` as const, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/accounts', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/accounts` as const, + }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/classes', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/classes` as const, + }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/customers', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/customers` as const, + }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/locations', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/locations` as const, + }, + POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES: { + route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/taxes', + getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/taxes` as const, }, } as const; diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 32c8c06933b5..ed7fd7e02cf7 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -243,6 +243,11 @@ const SCREENS = { CREATE_DISTANCE_RATE: 'Create_Distance_Rate', ACCOUNTING: 'Policy_Accounting', QUICKBOOKSONLINE_IMPORT: 'Policy_Accounting_QuickbooksOnline_Import', + QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: 'Policy_Accounting_QuickbooksOnline_Import_Chart_Of_Accounts', + QUICKBOOKSONLINE_CLASSES: 'Policy_Accounting_QuickbooksOnline_Import_Classes', + QUICKBOOKSONLINE_CUSTOMER: 'Policy_Accounting_QuickbooksOnline_Import_Customer', + QUICKBOOKSONLINE_LOCATIONS: 'Policy_Accounting_QuickbooksOnline_Import_Locations', + QUICKBOOKSONLINE_TAXES: 'Policy_Accounting_QuickbooksOnline_Import_Taxes', }, EDIT_REQUEST: { diff --git a/src/languages/en.ts b/src/languages/en.ts index 2170606d8241..696c635e33b8 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1781,6 +1781,9 @@ export default { notImported: 'Not imported', importedAsTags: 'Imported, displayed as tags', importedAsReportFields: 'Imported, displayed as categories', + accountsDescription: 'Chart of Accounts import as categories when connected to an accounting integration, this cannot be disabled.', + accountsSwitchTitle: 'Enable newly imported Chart of Accounts.', + accountsSwitchDescription: 'New categories imported from QuickBooks Online to Expensify will be either enabled or disabled by default.', }, type: { free: 'Free', diff --git a/src/languages/es.ts b/src/languages/es.ts index 0a0e94b3fadd..2e95f7082f98 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1805,6 +1805,9 @@ export default { notImported: 'No importado', importedAsTags: 'Importado, mostrado como etiquetas', importedAsReportFields: 'Importado, mostrado como categorías', + accountsDescription: 'El plan de cuentas se importa como categorías cuando se conecta a una integración contable; esto no se puede desactivar.', + accountsSwitchTitle: 'Habilite el plan de cuentas recién importado.', + accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', }, type: { free: 'Gratis', diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 396aefa01a8e..8a36fed8903a 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -180,6 +180,7 @@ const WRITE_COMMANDS = { ACCEPT_JOIN_REQUEST: 'AcceptJoinRequest', DECLINE_JOIN_REQUEST: 'DeclineJoinRequest', CREATE_POLICY_TAX: 'CreatePolicyTax', + UPDATE_POLICY_CONNECTIONS_CONFIGURATION: 'UpdatePolicyConnectionsConfiguration', CREATE_POLICY_DISTANCE_RATE: 'CreatePolicyDistanceRate', } as const; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index ebc0fbf19607..66e4e522e363 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -273,6 +273,7 @@ const SettingsModalStackNavigator = createModalStackNavigator 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.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: () => require('../../../pages/workspace/qbo/PolicyQuickbooksImportPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: () => require('../../../pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage').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/config.ts b/src/libs/Navigation/linkingConfig/config.ts index aef64cb0a843..ec533b4cff9b 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -233,6 +233,11 @@ const config: LinkingOptions['config'] = { path: ROUTES.WORKSPACE_PROFILE_CURRENCY.route, }, [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMER]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.route}, [SCREENS.WORKSPACE.DESCRIPTION]: { path: ROUTES.WORKSPACE_PROFILE_DESCRIPTION.route, }, diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 2cb4801e09c6..73847ae8472e 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3258,6 +3258,70 @@ function openPolicyDistanceRatesPage(policyID?: string) { API.read(READ_COMMANDS.OPEN_POLICY_DISTANCE_RATES_PAGE, params); } +function updatePolicyConnectionConfig(policyID: string, connectionName: string, settingName: string, settingValue: string | boolean) { + const parameters = {policyID, connectionName, settingName, settingValue, idempotencyKey: settingName}; + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + pendingFields: { + [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE + }, + connections: { + quickbooksOnline: { + config: { + [settingName]: settingValue, + }, + }, + }, + }, + }, + ]; + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + errorFields: { + [settingName]: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage') + }, + pendingFields: { + [settingName]: null + }, + connections: { + quickbooksOnline: { + config: { + [settingName]: settingValue, + }, + }, + }, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + pendingFields: { + [settingName]: null + }, + connections: { + quickbooksOnline: { + config: { + [settingName]: settingValue, + }, + }, + }, + }, + }, + ]; + + API.write(WRITE_COMMANDS.UPDATE_POLICY_CONNECTIONS_CONFIGURATION, parameters, {optimisticData, failureData, successData}); +} + function navigateWhenEnableFeature(policyID: string, featureRoute: Route) { const isNarrowLayout = getIsNarrowLayout(); @@ -4066,5 +4130,6 @@ export { setWorkspaceTagEnabled, setWorkspaceCurrencyDefault, setForeignCurrencyDefault, + updatePolicyConnectionConfig, setPolicyCustomTaxName, }; diff --git a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx index 552b49b8c8b7..46a3a2bec1ec 100644 --- a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx +++ b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx @@ -13,47 +13,81 @@ import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +const NAVIGATION_KEYS = { + ACCOUNTS: 'accounts', + CLASSES: 'classes', + CUSTOMERS: 'customers', + LOCATIONS: 'locations', + TAXES: 'taxes', +}; + function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const quickbooksOnlineConfigTitles = { DEFAULT: translate('workspace.qbo.imported'), + true: translate('workspace.qbo.imported'), + false: translate('workspace.qbo.notImported'), NONE: translate('workspace.qbo.notImported'), TAG: translate('workspace.qbo.importedAsTags'), REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), }; - const {syncClasses, syncCustomers, syncLocations, syncAccounts, syncTaxes} = policy?.connections?.quickbooksOnline?.config ?? {}; + const {syncClasses, syncCustomers, syncLocations, syncTaxes, syncAccounts} = policy?.connections?.quickbooksOnline?.config ?? {}; - const onPressConfigOption = useCallback((option: string) => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_OPTION.getRoute(policy?.id ?? '', option)), [policy?.id]); + const onPressConfigOption = useCallback( + (option: string) => { + const policyID = policy?.id ?? ''; + switch (option) { + case NAVIGATION_KEYS.ACCOUNTS: + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)); + break; + case NAVIGATION_KEYS.CLASSES: + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)); + break; + case NAVIGATION_KEYS.CUSTOMERS: + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.getRoute(policyID)); + break; + case NAVIGATION_KEYS.LOCATIONS: + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)); + break; + case NAVIGATION_KEYS.TAXES: + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)); + break; + default: + break; + } + }, + [policy?.id], + ); const sections = [ { description: translate('workspace.qbo.accounts'), - navigationKey: 'accounts', + navigationKey: NAVIGATION_KEYS.ACCOUNTS, errorIndicator: !!policy?.errors?.syncAccounts, title: syncAccounts, }, { description: translate('workspace.qbo.classes'), - navigationKey: 'classes', + navigationKey: NAVIGATION_KEYS.CLASSES, errorIndicator: !!policy?.errors?.syncClasses, title: syncClasses, }, { description: translate('workspace.qbo.customers'), - navigationKey: 'customers', + navigationKey: NAVIGATION_KEYS.CUSTOMERS, errorIndicator: !!policy?.errors?.syncCustomers, title: syncCustomers, }, { description: translate('workspace.qbo.locations'), - navigationKey: 'locations', + navigationKey: NAVIGATION_KEYS.LOCATIONS, errorIndicator: !!policy?.errors?.syncLocations, title: syncLocations, }, { description: translate('workspace.qbo.taxes'), - navigationKey: 'taxes', + navigationKey: NAVIGATION_KEYS.TAXES, errorIndicator: !!policy?.errors?.syncTaxes, title: syncTaxes, }, diff --git a/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx b/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx new file mode 100644 index 000000000000..e97bce1b4cbc --- /dev/null +++ b/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import {View} from 'react-native'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; +import Switch from '@components/Switch'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import withPolicy from '@pages/workspace/withPolicy'; +import type {WithPolicyProps} from '@pages/workspace/withPolicy'; +import variables from '@styles/variables'; +import * as Policy from '@userActions/Policy'; + +function QuickbooksChartOfAccountsConfigurationPage({policy}: WithPolicyProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id ?? ''; + const {enableNewCategories} = policy?.connections?.quickbooksOnline?.config ?? {}; + + return ( + + + + + {translate('workspace.qbo.accountsDescription')} + + + + {translate('workspace.qbo.accountsSwitchTitle')} + + {translate('workspace.qbo.accountsSwitchDescription')} + + + + + Policy.updatePolicyConnectionConfig( + policyID, + 'quickbooksOnline', + 'enableNewCategories', + !enableNewCategories, + )} + /> + + + + + + ); +} + +QuickbooksChartOfAccountsConfigurationPage.displayName = 'QuickbooksChartOfAccountsConfigurationPage'; + +export default withPolicy(QuickbooksChartOfAccountsConfigurationPage); From c0fe32b14f19a7e55b4cfc4f8ba134ac6c45e480 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 19 Mar 2024 16:50:59 +0200 Subject: [PATCH 04/31] prettier --- src/libs/actions/Policy.ts | 8 ++++---- .../qbo/QuickbooksChartOfAccountsConfigurationPage.tsx | 7 +------ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 73847ae8472e..bace18b54d80 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3266,7 +3266,7 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { pendingFields: { - [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE + [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, connections: { quickbooksOnline: { @@ -3284,10 +3284,10 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { errorFields: { - [settingName]: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage') + [settingName]: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage'), }, pendingFields: { - [settingName]: null + [settingName]: null, }, connections: { quickbooksOnline: { @@ -3306,7 +3306,7 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { pendingFields: { - [settingName]: null + [settingName]: null, }, connections: { quickbooksOnline: { diff --git a/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx b/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx index e97bce1b4cbc..5c0f8806ab1d 100644 --- a/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx +++ b/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx @@ -52,12 +52,7 @@ function QuickbooksChartOfAccountsConfigurationPage({policy}: WithPolicyProps) { Policy.updatePolicyConnectionConfig( - policyID, - 'quickbooksOnline', - 'enableNewCategories', - !enableNewCategories, - )} + onToggle={() => Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} /> From f85ce0d9c7a595517112e275f05e0993cabbced8 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 20 Mar 2024 11:29:28 +0200 Subject: [PATCH 05/31] resolve suggested comments --- src/ROUTES.ts | 12 ++-- .../qbo/PolicyQuickbooksImportPage.tsx | 63 +++++-------------- 2 files changed, 21 insertions(+), 54 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 332c9c959b64..28605edfb2c6 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -632,27 +632,27 @@ const ROUTES = { }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import` as const, }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/accounts', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/accounts` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/accounts` as const, }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/classes', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/classes` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/classes` as const, }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/customers', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/customers` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/customers` as const, }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/locations', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/locations` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/locations` as const, }, POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/taxes', - getRoute: (policyID: string) => `workspace/${policyID}/connections/quickbooks-online/import/taxes` as const, + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/taxes` as const, }, } as const; diff --git a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx index 46a3a2bec1ec..5e7d8cd48522 100644 --- a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx +++ b/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx @@ -1,4 +1,4 @@ -import React, {useCallback} from 'react'; +import React from 'react'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -13,14 +13,6 @@ import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -const NAVIGATION_KEYS = { - ACCOUNTS: 'accounts', - CLASSES: 'classes', - CUSTOMERS: 'customers', - LOCATIONS: 'locations', - TAXES: 'taxes', -}; - function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -32,63 +24,38 @@ function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { TAG: translate('workspace.qbo.importedAsTags'), REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), }; + const policyID = policy?.id ?? ''; const {syncClasses, syncCustomers, syncLocations, syncTaxes, syncAccounts} = policy?.connections?.quickbooksOnline?.config ?? {}; - const onPressConfigOption = useCallback( - (option: string) => { - const policyID = policy?.id ?? ''; - switch (option) { - case NAVIGATION_KEYS.ACCOUNTS: - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)); - break; - case NAVIGATION_KEYS.CLASSES: - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)); - break; - case NAVIGATION_KEYS.CUSTOMERS: - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.getRoute(policyID)); - break; - case NAVIGATION_KEYS.LOCATIONS: - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)); - break; - case NAVIGATION_KEYS.TAXES: - Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)); - break; - default: - break; - } - }, - [policy?.id], - ); - const sections = [ { description: translate('workspace.qbo.accounts'), - navigationKey: NAVIGATION_KEYS.ACCOUNTS, - errorIndicator: !!policy?.errors?.syncAccounts, + action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), + hasError: Boolean(policy?.errors?.syncAccounts), title: syncAccounts, }, { description: translate('workspace.qbo.classes'), - navigationKey: NAVIGATION_KEYS.CLASSES, - errorIndicator: !!policy?.errors?.syncClasses, + action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)), + hasError: Boolean(policy?.errors?.syncClasses), title: syncClasses, }, { description: translate('workspace.qbo.customers'), - navigationKey: NAVIGATION_KEYS.CUSTOMERS, - errorIndicator: !!policy?.errors?.syncCustomers, + action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.getRoute(policyID)), + hasError: Boolean(policy?.errors?.syncCustomers), title: syncCustomers, }, { description: translate('workspace.qbo.locations'), - navigationKey: NAVIGATION_KEYS.LOCATIONS, - errorIndicator: !!policy?.errors?.syncLocations, + action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)), + hasError: Boolean(policy?.errors?.syncLocations), title: syncLocations, }, { description: translate('workspace.qbo.taxes'), - navigationKey: NAVIGATION_KEYS.TAXES, - errorIndicator: !!policy?.errors?.syncTaxes, + action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)), + hasError: Boolean(policy?.errors?.syncTaxes), title: syncTaxes, }, ]; @@ -108,11 +75,11 @@ function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { {sections.map((section) => ( onPressConfigOption(section.navigationKey)} - brickRoadIndicator={section.errorIndicator ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + onPress={section.action} + brickRoadIndicator={section.hasError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} /> ))} From 7b90e68609c1ab7368d84799b4f6c458c9ad5ca8 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 20 Mar 2024 15:39:16 +0200 Subject: [PATCH 06/31] update naming, add mock pages, and correct routing --- src/ROUTES.ts | 16 ++++++++------ src/SCREENS.ts | 14 ++++++------- .../AppNavigator/ModalStackNavigators.tsx | 9 ++++++-- .../FULL_SCREEN_TO_RHP_MAPPING.ts | 8 +++++++ src/libs/Navigation/linkingConfig/config.ts | 15 +++++++------ src/libs/Navigation/types.ts | 21 +++++++++++++++++++ .../accounting/WorkspaceAccountingPage.tsx | 21 +++++++++++++++++++ .../qbo/QuickbooksChartOfAccountsPage.tsx} | 10 ++++----- .../accounting/qbo/QuickbooksClassesPage.tsx | 21 +++++++++++++++++++ .../qbo/QuickbooksCustomersPage.tsx | 21 +++++++++++++++++++ .../qbo/QuickbooksImportPage.tsx} | 20 +++++++++--------- .../qbo/QuickbooksLocationsPage.tsx | 21 +++++++++++++++++++ .../accounting/qbo/QuickbooksTaxesPage.tsx | 21 +++++++++++++++++++ 13 files changed, 182 insertions(+), 36 deletions(-) create mode 100644 src/pages/workspace/accounting/WorkspaceAccountingPage.tsx rename src/pages/workspace/{qbo/QuickbooksChartOfAccountsConfigurationPage.tsx => accounting/qbo/QuickbooksChartOfAccountsPage.tsx} (87%) create mode 100644 src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx create mode 100644 src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx rename src/pages/workspace/{qbo/PolicyQuickbooksImportPage.tsx => accounting/qbo/QuickbooksImportPage.tsx} (78%) create mode 100644 src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx create mode 100644 src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 8d2a128c1681..fd64cb4085ac 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -536,6 +536,10 @@ const ROUTES = { route: 'settings/workspaces/:policyID/members', getRoute: (policyID: string) => `settings/workspaces/${policyID}/members` as const, }, + WORKSPACE_ACCOUNTING: { + route: 'settings/workspaces/:policyID/accounting', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting` as const, + }, WORKSPACE_CATEGORIES: { route: 'settings/workspaces/:policyID/categories', getRoute: (policyID: string) => `settings/workspaces/${policyID}/categories` as const, @@ -638,27 +642,27 @@ const ROUTES = { route: 'r/:reportID/transaction/:transactionID/receipt', getRoute: (reportID: string, transactionID: string) => `r/${reportID}/transaction/${transactionID}/receipt` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_IMPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/accounts', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/accounts` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/classes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/classes` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/customers', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/customers` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/locations', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/locations` as const, }, - POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES: { + WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/taxes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/taxes` as const, }, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index c510a628fc9d..684efb5ecbb1 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -209,6 +209,7 @@ const SCREENS = { INVOICES: 'Workspace_Invoices', TRAVEL: 'Workspace_Travel', MEMBERS: 'Workspace_Members', + ACCOUNTING: 'Workspace_Accounting', INVITE: 'Workspace_Invite', INVITE_MESSAGE: 'Workspace_Invite_Message', CATEGORIES: 'Workspace_Categories', @@ -243,13 +244,12 @@ const SCREENS = { DISTANCE_RATES: 'Distance_Rates', CREATE_DISTANCE_RATE: 'Create_Distance_Rate', DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings', - ACCOUNTING: 'Policy_Accounting', - QUICKBOOKSONLINE_IMPORT: 'Policy_Accounting_QuickbooksOnline_Import', - QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: 'Policy_Accounting_QuickbooksOnline_Import_Chart_Of_Accounts', - QUICKBOOKSONLINE_CLASSES: 'Policy_Accounting_QuickbooksOnline_Import_Classes', - QUICKBOOKSONLINE_CUSTOMER: 'Policy_Accounting_QuickbooksOnline_Import_Customer', - QUICKBOOKSONLINE_LOCATIONS: 'Policy_Accounting_QuickbooksOnline_Import_Locations', - QUICKBOOKSONLINE_TAXES: 'Policy_Accounting_QuickbooksOnline_Import_Taxes', + QUICKBOOKSONLINE_IMPORT: 'Workspace_Accounting_QuickbooksOnline_Import', + QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: 'Workspace_Accounting_QuickbooksOnline_Import_Chart_Of_Accounts', + QUICKBOOKSONLINE_CLASSES: 'Workspace_Accounting_QuickbooksOnline_Import_Classes', + QUICKBOOKSONLINE_CUSTOMERS: 'Workspace_Accounting_QuickbooksOnline_Import_Customers', + QUICKBOOKSONLINE_LOCATIONS: 'Workspace_Accounting_QuickbooksOnline_Import_Locations', + QUICKBOOKSONLINE_TAXES: 'Workspace_Accounting_QuickbooksOnline_Import_Taxes', }, EDIT_REQUEST: { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index 7c27f66bc218..188a7ec39cfa 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -195,6 +195,7 @@ const WorkspaceSettingsModalStackNavigator = createModalStackNavigator( [SCREENS.WORKSPACE.INVOICES]: () => require('../../../pages/workspace/invoices/WorkspaceInvoicesPage').default as React.ComponentType, [SCREENS.WORKSPACE.TRAVEL]: () => require('../../../pages/workspace/travel/WorkspaceTravelPage').default as React.ComponentType, [SCREENS.WORKSPACE.MEMBERS]: () => require('../../../pages/workspace/WorkspaceMembersPage').default as React.ComponentType, + [SCREENS.WORKSPACE.ACCOUNTING]: () => require('@pages/workspace/accounting/WorkspaceAccountingPage').default as React.ComponentType, [SCREENS.WORKSPACE.CATEGORIES]: () => require('../../../pages/workspace/categories/WorkspaceCategoriesPage').default as React.ComponentType, [SCREENS.WORKSPACE.MORE_FEATURES]: () => require('../../../pages/workspace/WorkspaceMoreFeaturesPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAGS]: () => require('../../../pages/workspace/tags/WorkspaceTagsPage').default as React.ComponentType, @@ -274,8 +275,12 @@ const SettingsModalStackNavigator = createModalStackNavigator 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.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: () => require('../../../pages/workspace/qbo/PolicyQuickbooksImportPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: () => require('../../../pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: () => require('../../../pages/workspace/accounting/qbo/QuickbooksImportPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: () => require('@pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: () => require('../../../pages/workspace/accounting/qbo/QuickbooksCustomersPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: () => require('../../../pages/workspace/accounting/qbo/QuickbooksTaxesPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: () => require('../../../pages/workspace/accounting/qbo/QuickbooksLocationsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: () => require('../../../pages/workspace/accounting/qbo/QuickbooksClassesPage').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 7388d6447ffa..d76b3aa96302 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -11,6 +11,14 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial> = { SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET, SCREENS.WORKSPACE.WORKFLOWS_PAYER, ], + [SCREENS.WORKSPACE.ACCOUNTING]: [ + SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT, + SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS, + SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES, + SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES, + SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS, + SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS, + ], [SCREENS.WORKSPACE.TAXES]: [ SCREENS.WORKSPACE.TAXES_SETTINGS, SCREENS.WORKSPACE.TAX_CREATE, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 4806fdf99778..f77cef23e454 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -232,12 +232,12 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.CURRENCY]: { path: ROUTES.WORKSPACE_PROFILE_CURRENCY.route, }, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_IMPORT.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMER]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_IMPORT.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.route}, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES.route}, [SCREENS.WORKSPACE.DESCRIPTION]: { path: ROUTES.WORKSPACE_PROFILE_DESCRIPTION.route, }, @@ -594,6 +594,9 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.INVOICES]: { path: ROUTES.WORKSPACE_INVOICES.route, }, + [SCREENS.WORKSPACE.ACCOUNTING]: { + path: ROUTES.WORKSPACE_ACCOUNTING.route, + }, [SCREENS.WORKSPACE.TRAVEL]: { path: ROUTES.WORKSPACE_TRAVEL.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 32be4695e20a..e7af967deec8 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -228,6 +228,21 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { policyID: string; }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: { + policyID: string; + }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: { + policyID: string; + }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: { + policyID: string; + }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: { + policyID: string; + }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: { + policyID: string; + }; [SCREENS.GET_ASSISTANCE]: { backTo: Routes; }; @@ -562,6 +577,9 @@ type WorkspacesCentralPaneNavigatorParamList = { [SCREENS.WORKSPACE.TRAVEL]: { policyID: string; }; + [SCREENS.WORKSPACE.ACCOUNTING]: { + policyID: string; + }; [SCREENS.WORKSPACE.MEMBERS]: { policyID: string; }; @@ -587,6 +605,9 @@ type WorkspacesCentralPaneNavigatorParamList = { [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { policyID: string; }; + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: { + policyID: string; + }; }; type FullScreenNavigatorParamList = { diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx new file mode 100644 index 000000000000..7c2245514839 --- /dev/null +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import {View} from 'react-native'; +import ScreenWrapper from '@components/ScreenWrapper'; +import withPolicy from '@pages/workspace/withPolicy'; + +// Fake page will be removed after normal on will be merged +function WorkspaceAccountingPage() { + return ( + + + + ); +} + +WorkspaceAccountingPage.displayName = 'WorkspaceAccountingPage'; + +export default withPolicy(WorkspaceAccountingPage); diff --git a/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx similarity index 87% rename from src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx rename to src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index 5c0f8806ab1d..fc0e215947d6 100644 --- a/src/pages/workspace/qbo/QuickbooksChartOfAccountsConfigurationPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -8,13 +8,13 @@ import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -function QuickbooksChartOfAccountsConfigurationPage({policy}: WithPolicyProps) { +function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id ?? ''; @@ -24,7 +24,7 @@ function QuickbooksChartOfAccountsConfigurationPage({policy}: WithPolicyProps) { + + + ); +} + +QuickbooksClassesPage.displayName = 'QuickbooksClassesPage'; + +export default withPolicy(QuickbooksClassesPage); diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx new file mode 100644 index 000000000000..92eb1444face --- /dev/null +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import {View} from 'react-native'; +import ScreenWrapper from '@components/ScreenWrapper'; +import withPolicy from '@pages/workspace/withPolicy'; + +// Fake page will be removed after normal on will be implemented +function QuickbooksCustomersPage() { + return ( + + + + ); +} + +QuickbooksCustomersPage.displayName = 'QuickbooksCustomersPage'; + +export default withPolicy(QuickbooksCustomersPage); diff --git a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx similarity index 78% rename from src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx rename to src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 5e7d8cd48522..06a6f46ace1a 100644 --- a/src/pages/workspace/qbo/PolicyQuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -7,13 +7,13 @@ import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { +function QuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const quickbooksOnlineConfigTitles = { @@ -30,31 +30,31 @@ function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { const sections = [ { description: translate('workspace.qbo.accounts'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncAccounts), title: syncAccounts, }, { description: translate('workspace.qbo.classes'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncClasses), title: syncClasses, }, { description: translate('workspace.qbo.customers'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMER.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncCustomers), title: syncCustomers, }, { description: translate('workspace.qbo.locations'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncLocations), title: syncLocations, }, { description: translate('workspace.qbo.taxes'), - action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncTaxes), title: syncTaxes, }, @@ -64,7 +64,7 @@ function PolicyQuickbooksImportPage({policy}: WithPolicyProps) { + + + ); +} + +QuickbooksLocationsPage.displayName = 'QuickbooksLocationsPage'; + +export default withPolicy(QuickbooksLocationsPage); diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx new file mode 100644 index 000000000000..aafd34bb3df2 --- /dev/null +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import {View} from 'react-native'; +import ScreenWrapper from '@components/ScreenWrapper'; +import withPolicy from '@pages/workspace/withPolicy'; + +// Fake page will be removed after normal on will be implemented +function QuickbooksTaxesPage() { + return ( + + + + ); +} + +QuickbooksTaxesPage.displayName = 'QuickbooksTaxesPage'; + +export default withPolicy(QuickbooksTaxesPage); From 758a77b9ef3cc424a5f859108380ded0447004e6 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 20 Mar 2024 15:47:42 +0200 Subject: [PATCH 07/31] fix ts --- .../UpdateWorkspaceAccountingChartOfAccounts.ts | 9 +++++++++ src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 3 ++- src/libs/actions/Policy.ts | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts diff --git a/src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts b/src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts new file mode 100644 index 000000000000..1f26f409fc34 --- /dev/null +++ b/src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts @@ -0,0 +1,9 @@ +type UpdateWorkspaceAccountingChartOfAccounts = { + policyID: string; + connectionName: string; + settingName: string; + settingValue: string | boolean; + idempotencyKey: string; +}; + +export default UpdateWorkspaceAccountingChartOfAccounts; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 84ace32d6261..fd8d2eb0cecc 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -189,3 +189,4 @@ export type {default as DeletePolicyTagsParams} from './DeletePolicyTagsParams'; export type {default as SetPolicyCustomTaxNameParams} from './SetPolicyCustomTaxNameParams'; export type {default as SetPolicyForeignCurrencyDefaultParams} from './SetPolicyForeignCurrencyDefaultParams'; export type {default as SetPolicyCurrencyDefaultParams} from './SetPolicyCurrencyDefaultParams'; +export type {default as UpdateWorkspaceAccountingChartOfAccounts} from './UpdateWorkspaceAccountingChartOfAccounts'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 74f6d2231ad9..267f09250fc3 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -182,7 +182,7 @@ const WRITE_COMMANDS = { ACCEPT_JOIN_REQUEST: 'AcceptJoinRequest', DECLINE_JOIN_REQUEST: 'DeclineJoinRequest', CREATE_POLICY_TAX: 'CreatePolicyTax', - UPDATE_POLICY_CONNECTIONS_CONFIGURATION: 'UpdatePolicyConnectionsConfiguration', + UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION: 'UpdateWorkspaceConnectionsConfiguration', CREATE_POLICY_DISTANCE_RATE: 'CreatePolicyDistanceRate', SET_POLICY_DISTANCE_RATES_UNIT: 'SetPolicyDistanceRatesUnit', SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY: 'SetPolicyDistanceRatesDefaultCategory', @@ -369,6 +369,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.CREATE_POLICY_DISTANCE_RATE]: Parameters.CreatePolicyDistanceRateParams; [WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_UNIT]: Parameters.SetPolicyDistanceRatesUnitParams; [WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY]: Parameters.SetPolicyDistanceRatesDefaultCategoryParams; + [WRITE_COMMANDS.UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION]: Parameters.UpdateWorkspaceAccountingChartOfAccounts; }; const READ_COMMANDS = { diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 36ac333579a5..c1094d0f4bfd 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3456,7 +3456,7 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, }, ]; - API.write(WRITE_COMMANDS.UPDATE_POLICY_CONNECTIONS_CONFIGURATION, parameters, {optimisticData, failureData, successData}); + API.write(WRITE_COMMANDS.UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION, parameters, {optimisticData, failureData, successData}); } function navigateWhenEnableFeature(policyID: string, featureRoute: Route) { From 441bbf033c16de0f0837ef9b7873117d8f1ca79b Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 21 Mar 2024 16:37:57 +0200 Subject: [PATCH 08/31] add 2 more screen - classes and customer + pending actions, clean up code --- src/languages/en.ts | 6 ++- src/languages/es.ts | 7 ++- src/libs/actions/Policy.ts | 31 ++++++----- .../qbo/QuickbooksChartOfAccountsPage.tsx | 10 ++-- .../accounting/qbo/QuickbooksClassesPage.tsx | 53 +++++++++++++++++- .../qbo/QuickbooksCustomersPage.tsx | 54 +++++++++++++++++-- .../accounting/qbo/QuickbooksImportPage.tsx | 5 +- src/types/onyx/Policy.ts | 8 +-- 8 files changed, 141 insertions(+), 33 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index c85e535f61e6..1dde27b39773 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1740,6 +1740,7 @@ export default { reimburse: 'Reimbursements', categories: 'Categories', tags: 'Tags', + reportFields: 'Report Fields', taxes: 'Taxes', bills: 'Bills', invoices: 'Invoices', @@ -1779,12 +1780,15 @@ export default { taxes: 'Taxes', customers: 'Customers/Projects', imported: 'Imported', + displayedAs: 'Displayed as', notImported: 'Not imported', importedAsTags: 'Imported, displayed as tags', - importedAsReportFields: 'Imported, displayed as categories', + importedAsReportFields: 'Imported, displayed as report fields', accountsDescription: 'Chart of Accounts import as categories when connected to an accounting integration, this cannot be disabled.', accountsSwitchTitle: 'Enable newly imported Chart of Accounts.', accountsSwitchDescription: 'New categories imported from QuickBooks Online to Expensify will be either enabled or disabled by default.', + classesDescription: 'Choose whether to import classes, and see where classes are displayed.', + customersDescription: 'Choose whether to import Customers/Projects and see where customers/projects are displayed.' }, type: { free: 'Free', diff --git a/src/languages/es.ts b/src/languages/es.ts index 0aa882381d17..0ec454c16338 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1764,6 +1764,7 @@ export default { reimburse: 'Reembolsos', categories: 'Categorías', tags: 'Etiquetas', + reportFields: 'Campos de informe', taxes: 'Impuestos', bills: 'Pagar facturas', invoices: 'Enviar facturas', @@ -1803,12 +1804,16 @@ export default { customers: 'Clientes/Proyectos', imported: 'Importado', taxes: 'Impuestos', + displayedAs: 'Mostrado como', notImported: 'No importado', importedAsTags: 'Importado, mostrado como etiquetas', - importedAsReportFields: 'Importado, mostrado como categorías', + importedAsReportFields: 'Importado, mostrado como campos de informe', accountsDescription: 'El plan de cuentas se importa como categorías cuando se conecta a una integración contable; esto no se puede desactivar.', accountsSwitchTitle: 'Habilite el plan de cuentas recién importado.', accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', + classesDescription: 'Elija si desea importar clases y vea dónde se muestran las clases.', + customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.' + }, type: { free: 'Gratis', diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index c1094d0f4bfd..5d98868f6f47 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3402,34 +3402,38 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - pendingFields: { - [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, - }, connections: { quickbooksOnline: { config: { [settingName]: settingValue, + pendingFields: { + [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + errorFields: { + [settingName]: null, + }, }, }, }, }, }, ]; + const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - errorFields: { - [settingName]: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage'), - }, - pendingFields: { - [settingName]: null, - }, connections: { quickbooksOnline: { config: { [settingName]: settingValue, + pendingFields: { + [settingName]: null, + }, + errorFields: { + [settingName]: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage'), + }, }, }, }, @@ -3442,13 +3446,16 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - pendingFields: { - [settingName]: null, - }, connections: { quickbooksOnline: { config: { [settingName]: settingValue, + pendingFields: { + [settingName]: null, + }, + errorFields: { + [settingName]: null, + }, }, }, }, diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index fc0e215947d6..cf91db5f6d33 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -8,7 +8,6 @@ import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; @@ -18,7 +17,7 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id ?? ''; - const {enableNewCategories} = policy?.connections?.quickbooksOnline?.config ?? {}; + const {enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; return ( - + - + - + + + + {translate('workspace.qbo.classesDescription')} + + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + {isSwitchOn && ( + + + + )} + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index 92eb1444face..aedcee58c942 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -1,17 +1,65 @@ import React from 'react'; import {View} from 'react-native'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; +import Switch from '@components/Switch'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; import withPolicy from '@pages/workspace/withPolicy'; +import type {WithPolicyProps} from '@pages/workspace/withPolicy'; +import variables from '@styles/variables'; +import * as Policy from '@userActions/Policy'; -// Fake page will be removed after normal on will be implemented -function QuickbooksCustomersPage() { +function QuickbooksCustomersPage({policy}: WithPolicyProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id ?? ''; + const {syncCustomers, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; + const isSwitchOn = syncCustomers !== 'NONE' && syncCustomers !== false; + const isReportFieldsSelected = syncCustomers === 'REPORT_FIELD'; return ( - + + + + {translate('workspace.qbo.customersDescription')} + + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + {isSwitchOn && ( + + + + )} + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 06a6f46ace1a..104d870cdd9a 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -66,10 +66,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { shouldEnableMaxHeight testID={QuickbooksImportPage.displayName} > - + {translate('workspace.qbo.importDescription')} {sections.map((section) => ( diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 751a53e5fd1d..e2449d6edff1 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -136,12 +136,12 @@ type QBOConnectionData = { vendors: Vendor[]; }; -type IntegrationEntityMap = 'NONE' | 'DEFAULT' | 'TAG' | 'REPORT_FIELD'; +type IntegrationEntityMap = 'NONE' | 'DEFAULT' | 'TAG' | 'REPORT_FIELD' | false | true; /** * User configuration for the QuickBooks Online accounting integration. */ -type QBOConnectionConfig = { +type QBOConnectionConfig = OnyxCommon.OnyxValueWithOfflineFeedback<{ realmId: string; companyName: string; autoSync: { @@ -167,10 +167,12 @@ type QBOConnectionConfig = { lastConfigurationTime: number; syncTax: boolean; enableNewCategories: boolean; + errors?: OnyxCommon.Errors; + errorFields?: OnyxCommon.ErrorFields; export: { exporter: string; }; -}; +}>; type Connection = { lastSync?: ConnectionLastSync; data: ConnectionData; From 6bc7a25ddfe49960f82194a52c095f699fbd55ee Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 21 Mar 2024 16:44:21 +0200 Subject: [PATCH 09/31] update after merge conflicts --- src/types/onyx/Policy.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 86d3be96cf1b..919294c191bf 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -426,4 +426,17 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback< export default Policy; -export type {PolicyReportField, PolicyReportFieldType, Unit, CustomUnit, Attributes, Rate, TaxRate, TaxRates, TaxRatesWithDefault, PolicyFeatureName, IntegrationEntityMap, PendingJoinRequestPolicy}; +export type { + PolicyReportField, + PolicyReportFieldType, + Unit, + CustomUnit, + Attributes, + Rate, + TaxRate, + TaxRates, + TaxRatesWithDefault, + PolicyFeatureName, + IntegrationEntityMap, + PendingJoinRequestPolicy, +}; From 3a6113bf5b8e1ec1ab9e108e723dbcb5f44d59ad Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 21 Mar 2024 16:50:25 +0200 Subject: [PATCH 10/31] remove line --- src/languages/es.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index e1b1cc143114..3d9c6c696c38 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1834,7 +1834,6 @@ export default { accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', classesDescription: 'Elija si desea importar clases y vea dónde se muestran las clases.', customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.' - }, type: { free: 'Gratis', From bcfa12a9f3c34d0cc7bde7ac1fc21f4442b58b6e Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 21 Mar 2024 16:52:51 +0200 Subject: [PATCH 11/31] lint --- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 372bfa73fc27..8df3b04bdd2b 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1806,7 +1806,7 @@ export default { accountsSwitchTitle: 'Enable newly imported Chart of Accounts.', accountsSwitchDescription: 'New categories imported from QuickBooks Online to Expensify will be either enabled or disabled by default.', classesDescription: 'Choose whether to import classes, and see where classes are displayed.', - customersDescription: 'Choose whether to import Customers/Projects and see where customers/projects are displayed.' + customersDescription: 'Choose whether to import Customers/Projects and see where customers/projects are displayed.', }, type: { free: 'Free', diff --git a/src/languages/es.ts b/src/languages/es.ts index 3d9c6c696c38..0f1773d24783 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1833,7 +1833,7 @@ export default { accountsSwitchTitle: 'Habilite el plan de cuentas recién importado.', accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', classesDescription: 'Elija si desea importar clases y vea dónde se muestran las clases.', - customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.' + customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.', }, type: { free: 'Gratis', From 3477c63b83d3eddf12b7a63577d8997d6c698654 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 22 Mar 2024 15:42:26 +0200 Subject: [PATCH 12/31] Taxes and Locations pages --- src/languages/en.ts | 4 ++ src/languages/es.ts | 4 ++ .../accounting/qbo/QuickbooksClassesPage.tsx | 1 - .../accounting/qbo/QuickbooksImportPage.tsx | 9 ++- .../qbo/QuickbooksLocationsPage.tsx | 66 ++++++++++++++++++- .../accounting/qbo/QuickbooksTaxesPage.tsx | 42 +++++++++++- 6 files changed, 117 insertions(+), 9 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 8df3b04bdd2b..61357e200cf6 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1807,6 +1807,10 @@ export default { accountsSwitchDescription: 'New categories imported from QuickBooks Online to Expensify will be either enabled or disabled by default.', classesDescription: 'Choose whether to import classes, and see where classes are displayed.', customersDescription: 'Choose whether to import Customers/Projects and see where customers/projects are displayed.', + locationsDescription: 'Choose whether to import locations, and see where locations are displayed.', + taxesDescription: 'Choose whether to import tax rates and tax defaults from your accounting integration.', + locationsAdditionalDescription: + 'Locations are imported as Tags. This limits exporting expense reports as Vendor Bills or Checks to QuickBooks Online. To unlock these export options, either disable. Locations import or upgrade to the Control Plan to export Locations encoded as a Report Field.', }, type: { free: 'Free', diff --git a/src/languages/es.ts b/src/languages/es.ts index 0f1773d24783..ccafd0be0a9d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1834,6 +1834,10 @@ export default { accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', classesDescription: 'Elija si desea importar clases y vea dónde se muestran las clases.', customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.', + locationsDescription: 'Elija si desea importar ubicaciones y vea dónde se muestran las ubicaciones.', + taxesDescription: 'Elija si desea importar tasas impositivas y valores predeterminados de impuestos desde su integración contable.', + locationsAdditionalDescription: + 'Las ubicaciones se importan como etiquetas. Esto limita la exportación de informes de gastos como facturas de proveedores o cheques a QuickBooks Online. Para desbloquear estas opciones de exportación, deshabilite. Las ubicaciones se importan o actualizan al Plan de control para exportar ubicaciones codificadas como un campo de informe.', }, type: { free: 'Gratis', diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index 40e12e935439..28312260197b 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -14,7 +14,6 @@ import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -// Fake page will be removed after normal on will be implemented function QuickbooksClassesPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 104d870cdd9a..7b3b87850693 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -25,7 +25,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), }; const policyID = policy?.id ?? ''; - const {syncClasses, syncCustomers, syncLocations, syncTaxes, syncAccounts} = policy?.connections?.quickbooksOnline?.config ?? {}; + const {syncClasses, syncCustomers, syncLocations, syncTaxes, syncAccounts, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const sections = [ { @@ -33,30 +33,35 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncAccounts), title: syncAccounts, + pendingAction: pendingFields?.syncAccounts, }, { description: translate('workspace.qbo.classes'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncClasses), title: syncClasses, + pendingAction: pendingFields?.syncClasses, }, { description: translate('workspace.qbo.customers'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncCustomers), title: syncCustomers, + pendingAction: pendingFields?.syncCustomers, }, { description: translate('workspace.qbo.locations'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncLocations), title: syncLocations, + pendingAction: pendingFields?.syncLocations, }, { description: translate('workspace.qbo.taxes'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncTaxes), title: syncTaxes, + pendingAction: pendingFields?.syncTaxes, }, ]; @@ -70,7 +75,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { {translate('workspace.qbo.importDescription')} {sections.map((section) => ( - + - + + + + {translate('workspace.qbo.locationsDescription')} + + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + {isSwitchOn && ( + + + + )} + + + {translate('workspace.qbo.locationsAdditionalDescription')} + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index aafd34bb3df2..fe0447b3dd1b 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -1,17 +1,53 @@ import React from 'react'; import {View} from 'react-native'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; +import Switch from '@components/Switch'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; import withPolicy from '@pages/workspace/withPolicy'; +import type {WithPolicyProps} from '@pages/workspace/withPolicy'; +import variables from '@styles/variables'; +import * as Policy from '@userActions/Policy'; -// Fake page will be removed after normal on will be implemented -function QuickbooksTaxesPage() { +function QuickbooksTaxesPage({policy}: WithPolicyProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id ?? ''; + const {syncTaxes, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; + const isSwitchOn = syncTaxes !== 'NONE' && syncTaxes !== false; return ( - + + + + {translate('workspace.qbo.taxesDescription')} + + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + ); } From 9c170b43f9ef314833e3c187982e0fa6798ef770 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 22 Mar 2024 18:01:20 +0200 Subject: [PATCH 13/31] translations --- src/languages/en.ts | 8 ++++---- src/languages/es.ts | 28 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 811a985aa356..32d61151ccd8 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1791,9 +1791,9 @@ export default { }, qbo: { import: 'Import', - importDescription: 'Choose which coding configurations are imported from QuickBooks Online to Expensify', + importDescription: 'Choose which coding configurations are imported from QuickBooks Online to Expensify.', classes: 'Classes', - accounts: 'Chart of Accounts', + accounts: 'Chart of accounts', locations: 'Locations', taxes: 'Taxes', customers: 'Customers/Projects', @@ -1806,11 +1806,11 @@ export default { accountsSwitchTitle: 'Enable newly imported Chart of Accounts.', accountsSwitchDescription: 'New categories imported from QuickBooks Online to Expensify will be either enabled or disabled by default.', classesDescription: 'Choose whether to import classes, and see where classes are displayed.', - customersDescription: 'Choose whether to import Customers/Projects and see where customers/projects are displayed.', + customersDescription: 'Choose whether to import customers/projects and see where customers/projects are displayed.', locationsDescription: 'Choose whether to import locations, and see where locations are displayed.', taxesDescription: 'Choose whether to import tax rates and tax defaults from your accounting integration.', locationsAdditionalDescription: - 'Locations are imported as Tags. This limits exporting expense reports as Vendor Bills or Checks to QuickBooks Online. To unlock these export options, either disable. Locations import or upgrade to the Control Plan to export Locations encoded as a Report Field.', + 'Locations are imported as Tags. This limits exporting expense reports as Vendor Bills or Checks to QuickBooks Online. To unlock these export options, either disable Locations import or upgrade to the Control Plan to export Locations encoded as a Report Field.', }, type: { free: 'Free', diff --git a/src/languages/es.ts b/src/languages/es.ts index 944067173c8a..beabab01f15d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1818,26 +1818,26 @@ export default { }, qbo: { import: 'Importación', - importDescription: 'Elija qué configuraciones de codificación se importan de QuickBooks Online a Expensify', + importDescription: 'Elige que configuraciónes de codificación son importadas desde QuickBooks Online a Expensify.', classes: 'Clases', - locations: 'Ubicaciones', - accounts: 'Catálogo de cuentas', + accounts: 'Plan de cuentas', + locations: 'Lugares', + taxes: 'Impuestos', customers: 'Clientes/Proyectos', imported: 'Importado', - taxes: 'Impuestos', displayedAs: 'Mostrado como', notImported: 'No importado', - importedAsTags: 'Importado, mostrado como etiquetas', - importedAsReportFields: 'Importado, mostrado como campos de informe', - accountsDescription: 'El plan de cuentas se importa como categorías cuando se conecta a una integración contable; esto no se puede desactivar.', - accountsSwitchTitle: 'Habilite el plan de cuentas recién importado.', - accountsSwitchDescription: 'Las nuevas categorías importadas de QuickBooks Online a Expensify estarán habilitadas o deshabilitadas de forma predeterminada.', - classesDescription: 'Elija si desea importar clases y vea dónde se muestran las clases.', - customersDescription: 'Elija si desea importar Clientes/Proyectos y ver dónde se muestran los clientes/proyectos.', - locationsDescription: 'Elija si desea importar ubicaciones y vea dónde se muestran las ubicaciones.', - taxesDescription: 'Elija si desea importar tasas impositivas y valores predeterminados de impuestos desde su integración contable.', + importedAsTags: 'Importado, mostrado como etiqueta', + importedAsReportFields: 'Importado, mostrado como campo de informe', + accountsDescription: 'Los planes de cuentas se importan como categorías cuando está conectado con una integración de contaduría, esto no se puede desactivar.', + accountsSwitchTitle: 'Habilita el plan de cuentas recien importado', + accountsSwitchDescription: 'Las nuevas categorías importadas desde QuickBooks Online a Expensify serán activadas o desactivadas por defecto.', + classesDescription: 'Elige si quieres importar las clases y donde las clases son mostradas.', + customersDescription: 'Elige si queres importar clientes/proyectos y donde los clientes/proyectos son mostrados.', + locationsDescription: 'Elige si quieres importar lugares y donde los lugares son mostrados.', + taxesDescription: 'Elige si quires importar las tasas de impuestos y los impuestos por defecto de tu integración de contaduría.', locationsAdditionalDescription: - 'Las ubicaciones se importan como etiquetas. Esto limita la exportación de informes de gastos como facturas de proveedores o cheques a QuickBooks Online. Para desbloquear estas opciones de exportación, deshabilite. Las ubicaciones se importan o actualizan al Plan de control para exportar ubicaciones codificadas como un campo de informe.', + 'Los lugares son importados como Etiquegas. Esto limita a exportar los informes de gastos como Factura del Proveedor o Cheques a Quicbooks Online. Para desbloquear estas opciones de exportación desactiva la importación de Lugares o cambia al Plan Control para exportar Lugares como Campos de Informes.', }, type: { free: 'Gratis', From b4d845f242e599fb762809c0ad262cf4fef16d95 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 25 Mar 2024 14:39:40 +0200 Subject: [PATCH 14/31] updated booleans and rename methods to function execution --- ...fAccounts.ts => UpdatePolicyConnectionConfigParams.ts} | 4 ++-- src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 4 ++-- src/libs/actions/Policy.ts | 2 +- .../workspace/accounting/qbo/QuickbooksClassesPage.tsx | 2 +- .../workspace/accounting/qbo/QuickbooksCustomersPage.tsx | 2 +- .../workspace/accounting/qbo/QuickbooksImportPage.tsx | 8 ++++---- .../workspace/accounting/qbo/QuickbooksLocationsPage.tsx | 2 +- .../workspace/accounting/qbo/QuickbooksTaxesPage.tsx | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) rename src/libs/API/parameters/{UpdateWorkspaceAccountingChartOfAccounts.ts => UpdatePolicyConnectionConfigParams.ts} (57%) diff --git a/src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts b/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts similarity index 57% rename from src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts rename to src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts index 1f26f409fc34..0e5475f1a27d 100644 --- a/src/libs/API/parameters/UpdateWorkspaceAccountingChartOfAccounts.ts +++ b/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts @@ -1,4 +1,4 @@ -type UpdateWorkspaceAccountingChartOfAccounts = { +type UpdatePolicyConnectionConfigParams = { policyID: string; connectionName: string; settingName: string; @@ -6,4 +6,4 @@ type UpdateWorkspaceAccountingChartOfAccounts = { idempotencyKey: string; }; -export default UpdateWorkspaceAccountingChartOfAccounts; +export default UpdatePolicyConnectionConfigParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index ca0fa5581ee8..667bbb588155 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -195,5 +195,5 @@ export type {default as DeletePolicyTagsParams} from './DeletePolicyTagsParams'; export type {default as SetPolicyCustomTaxNameParams} from './SetPolicyCustomTaxNameParams'; export type {default as SetPolicyForeignCurrencyDefaultParams} from './SetPolicyForeignCurrencyDefaultParams'; export type {default as SetPolicyCurrencyDefaultParams} from './SetPolicyCurrencyDefaultParams'; -export type {default as UpdateWorkspaceAccountingChartOfAccounts} from './UpdateWorkspaceAccountingChartOfAccounts'; +export type {default as UpdatePolicyConnectionConfigParams} from './UpdatePolicyConnectionConfigParams'; export type {default as RenamePolicyTaxParams} from './RenamePolicyTaxParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index f2156ce21973..477929a052b3 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -183,7 +183,7 @@ const WRITE_COMMANDS = { ACCEPT_JOIN_REQUEST: 'AcceptJoinRequest', DECLINE_JOIN_REQUEST: 'DeclineJoinRequest', CREATE_POLICY_TAX: 'CreatePolicyTax', - UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION: 'UpdateWorkspaceConnectionsConfiguration', + UPDATE_POLICY_CONNECTION_CONFIG: 'UpdatePolicyConnectionConfig', SET_POLICY_TAXES_ENABLED: 'SetPolicyTaxesEnabled', DELETE_POLICY_TAXES: 'DeletePolicyTaxes', UPDATE_POLICY_TAX_VALUE: 'UpdatePolicyTaxValue', @@ -382,7 +382,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.RENAME_POLICY_TAX]: Parameters.RenamePolicyTaxParams; [WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_UNIT]: Parameters.SetPolicyDistanceRatesUnitParams; [WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_DEFAULT_CATEGORY]: Parameters.SetPolicyDistanceRatesDefaultCategoryParams; - [WRITE_COMMANDS.UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION]: Parameters.UpdateWorkspaceAccountingChartOfAccounts; + [WRITE_COMMANDS.UPDATE_POLICY_CONNECTION_CONFIG]: Parameters.UpdatePolicyConnectionConfigParams; [WRITE_COMMANDS.UPDATE_POLICY_DISTANCE_RATE_VALUE]: Parameters.UpdatePolicyDistanceRateValueParams; [WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_ENABLED]: Parameters.SetPolicyDistanceRatesEnabledParams; [WRITE_COMMANDS.DELETE_POLICY_DISTANCE_RATES]: Parameters.DeletePolicyDistanceRatesParams; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 167860c75100..462bec8917aa 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3485,7 +3485,7 @@ function updatePolicyConnectionConfig(policyID: string, connectionName: string, }, ]; - API.write(WRITE_COMMANDS.UPDATE_WORKSPACE_CONNECTIONS_CONFIGURATION, parameters, {optimisticData, failureData, successData}); + API.write(WRITE_COMMANDS.UPDATE_POLICY_CONNECTION_CONFIG, parameters, {optimisticData, failureData, successData}); } function navigateWhenEnableFeature(policyID: string, featureRoute: Route) { diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index 28312260197b..c61702a92d7e 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -19,7 +19,7 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {syncClasses, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = syncClasses !== 'NONE' && syncClasses !== false; + const isSwitchOn = Boolean(syncClasses && syncClasses !== 'NONE'); const isReportFieldsSelected = syncClasses === 'REPORT_FIELD'; return ( Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), - hasError: Boolean(policy?.errors?.syncAccounts), - title: syncAccounts, - pendingAction: pendingFields?.syncAccounts, + hasError: Boolean(policy?.errors?.enableNewCategories), + title: enableNewCategories, + pendingAction: pendingFields?.enableNewCategories, }, { description: translate('workspace.qbo.classes'), diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index eb44cf751196..baf54ef2bfe5 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -23,7 +23,7 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { const theme = useTheme(); const policyID = policy?.id ?? ''; const {syncLocations, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = syncLocations !== 'NONE' && syncLocations !== false; + const isSwitchOn = Boolean(syncLocations && syncLocations !== 'NONE'); const isReportFieldsSelected = syncLocations === 'REPORT_FIELD'; return ( Date: Mon, 25 Mar 2024 15:01:26 +0200 Subject: [PATCH 15/31] fix native ui and warning --- src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 4c9ebe589201..cc2f44747a36 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -73,9 +73,9 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { > - {translate('workspace.qbo.importDescription')} + {translate('workspace.qbo.importDescription')} {sections.map((section) => ( - + Date: Mon, 25 Mar 2024 15:08:11 +0200 Subject: [PATCH 16/31] prettier --- src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index cc2f44747a36..da7229ded9ac 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -75,7 +75,10 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { {translate('workspace.qbo.importDescription')} {sections.map((section) => ( - + Date: Tue, 26 Mar 2024 15:33:17 +0200 Subject: [PATCH 17/31] updates after design review --- .../qbo/QuickbooksChartOfAccountsPage.tsx | 23 ++++++++----------- .../accounting/qbo/QuickbooksClassesPage.tsx | 7 +----- .../qbo/QuickbooksCustomersPage.tsx | 7 +----- .../qbo/QuickbooksLocationsPage.tsx | 16 +------------ .../accounting/qbo/QuickbooksTaxesPage.tsx | 7 +----- 5 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index cf91db5f6d33..5d9c3c0dbc62 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -27,21 +27,10 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { > - - {translate('workspace.qbo.accountsDescription')} - - + {translate('workspace.qbo.accountsDescription')} + {translate('workspace.qbo.accountsSwitchTitle')} - - {translate('workspace.qbo.accountsSwitchDescription')} - @@ -53,6 +42,14 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { + + + {translate('workspace.qbo.accountsSwitchDescription')} + + ); diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index c61702a92d7e..b22e98252eb7 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -29,12 +29,7 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { > - - {translate('workspace.qbo.classesDescription')} - + {translate('workspace.qbo.classesDescription')} {translate('workspace.qbo.import')} diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index 693d84bc3808..078ea466b929 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -29,12 +29,7 @@ function QuickbooksCustomersPage({policy}: WithPolicyProps) { > - - {translate('workspace.qbo.customersDescription')} - + {translate('workspace.qbo.customersDescription')} {translate('workspace.qbo.import')} diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index baf54ef2bfe5..07df8aa1a036 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -1,8 +1,6 @@ import React from 'react'; import {View} from 'react-native'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import Icon from '@components/Icon'; -import * as Expensicons from '@components/Icon/Expensicons'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -10,7 +8,6 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; @@ -20,7 +17,6 @@ import * as Policy from '@userActions/Policy'; function QuickbooksLocationsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const theme = useTheme(); const policyID = policy?.id ?? ''; const {syncLocations, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncLocations && syncLocations !== 'NONE'); @@ -33,12 +29,7 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { > - - {translate('workspace.qbo.locationsDescription')} - + {translate('workspace.qbo.locationsDescription')} {translate('workspace.qbo.import')} @@ -64,11 +55,6 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { )} - {translate('workspace.qbo.locationsAdditionalDescription')} diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index 825c970ef5c8..8cb4a532c17f 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -27,12 +27,7 @@ function QuickbooksTaxesPage({policy}: WithPolicyProps) { > - - {translate('workspace.qbo.taxesDescription')} - + {translate('workspace.qbo.taxesDescription')} {translate('workspace.qbo.import')} From 40b55ebcf1a1467b0ebfef2c167f505982b08340 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 26 Mar 2024 16:24:54 +0200 Subject: [PATCH 18/31] design review updates --- .../accounting/qbo/QuickbooksChartOfAccountsPage.tsx | 9 ++------- .../workspace/accounting/qbo/QuickbooksLocationsPage.tsx | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index 5d9c3c0dbc62..028c1d5922b8 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -28,7 +28,7 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { {translate('workspace.qbo.accountsDescription')} - + {translate('workspace.qbo.accountsSwitchTitle')} @@ -43,12 +43,7 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { - - {translate('workspace.qbo.accountsSwitchDescription')} - + {translate('workspace.qbo.accountsSwitchDescription')} diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index 07df8aa1a036..9fa36c615208 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -55,7 +55,7 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { )} - {translate('workspace.qbo.locationsAdditionalDescription')} + {translate('workspace.qbo.locationsAdditionalDescription')} From 5ee42273ea1fe5f34c9443cea999437df7a86543 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 2 Apr 2024 14:45:51 +0300 Subject: [PATCH 19/31] updates based on new stack implementation --- .../WorkspaceSettingsModalStackNavigator.tsx | 5 +++++ .../Navigation/AppNavigator/ModalStackNavigators/index.tsx | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx index 14153809bc86..08b26f80eefe 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx @@ -75,6 +75,11 @@ function WorkspaceSettingsModalStackNavigator() { name={SCREENS.WORKSPACE.DISTANCE_RATES} getComponent={() => require('@pages/workspace/distanceRates/PolicyDistanceRatesPage').default as React.ComponentType} /> + require('@pages/workspace/accounting/WorkspaceAccountingPage').default as React.ComponentType} + /> ); } diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 55c58290b1cd..e31a78d96290 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -258,6 +258,12 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/ExitSurvey/ExitSurveyReasonPage').default as React.ComponentType, [SCREENS.SETTINGS.EXIT_SURVEY.RESPONSE]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyResponsePage').default as React.ComponentType, [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyConfirmPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksImportPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksCustomersPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksTaxesPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksLocationsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksClassesPage').default as React.ComponentType, [SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_FREQUENCY]: () => require('../../../../pages/workspace/workflows/WorkspaceAutoReportingFrequencyPage').default as React.ComponentType, [SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET]: () => require('../../../../pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage').default as React.ComponentType, From 9717dfb0fc68b3a436fd7c6fcc1769529105cb4c Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 2 Apr 2024 14:47:04 +0300 Subject: [PATCH 20/31] prettier --- .../WorkspaceSettingsModalStackNavigator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx index 08b26f80eefe..bafce9f42128 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx @@ -75,7 +75,7 @@ function WorkspaceSettingsModalStackNavigator() { name={SCREENS.WORKSPACE.DISTANCE_RATES} getComponent={() => require('@pages/workspace/distanceRates/PolicyDistanceRatesPage').default as React.ComponentType} /> - require('@pages/workspace/accounting/WorkspaceAccountingPage').default as React.ComponentType} From 6694dc28e6f1ff1c363d58d07c063fce986aa4a0 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Wed, 3 Apr 2024 15:09:05 +0300 Subject: [PATCH 21/31] Export date page - initial --- src/libs/Navigation/types.ts | 6 -- src/libs/WorkspacesSettingsUtils.ts | 5 ++ .../qbo/QuickbooksChartOfAccountsPage.tsx | 53 +++++++++----- .../accounting/qbo/QuickbooksClassesPage.tsx | 68 ++++++++++------- .../qbo/QuickbooksCustomersPage.tsx | 67 ++++++++++------- .../accounting/qbo/QuickbooksImportPage.tsx | 50 ++++++++----- .../qbo/QuickbooksLocationsPage.tsx | 73 +++++++++++-------- .../accounting/qbo/QuickbooksTaxesPage.tsx | 49 ++++++++----- 8 files changed, 230 insertions(+), 141 deletions(-) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 4c92ca58459e..3a1f2319e261 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -648,12 +648,6 @@ type WorkspacesCentralPaneNavigatorParamList = { [SCREENS.WORKSPACE.ACCOUNTING]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { - policyID: string; - }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: { - policyID: string; - }; }; type FullScreenNavigatorParamList = { diff --git a/src/libs/WorkspacesSettingsUtils.ts b/src/libs/WorkspacesSettingsUtils.ts index 30820fc0c48b..addc5ac8261b 100644 --- a/src/libs/WorkspacesSettingsUtils.ts +++ b/src/libs/WorkspacesSettingsUtils.ts @@ -287,6 +287,10 @@ function getOwnershipChecksDisplayText( return {title, text, buttonText}; } +function hasAccessToAccountingFeatures(policy: Policy | null, canUseAccountingIntegrations?: boolean) { + return policy?.role === CONST.POLICY.ROLE.ADMIN && policy?.areConnectionsEnabled && canUseAccountingIntegrations; +} + export { getBrickRoadForPolicy, getWorkspacesBrickRoads, @@ -297,5 +301,6 @@ export { getChatTabBrickRoad, getUnitTranslationKey, getOwnershipChecksDisplayText, + hasAccessToAccountingFeatures, }; export type {BrickRoad}; diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index 028c1d5922b8..61916543d1e0 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {View} from 'react-native'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -7,17 +8,23 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); + const {canUseAccountingIntegrations} = usePermissions(); const policyID = policy?.id ?? ''; const {enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - - {translate('workspace.qbo.accountsDescription')} - + + + + {translate('workspace.qbo.accountsDescription')} + + + {translate('workspace.qbo.accountsSwitchTitle')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} + /> + + + - {translate('workspace.qbo.accountsSwitchTitle')} + {translate('workspace.qbo.accountsSwitchDescription')} - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} - /> - - - - - {translate('workspace.qbo.accountsSwitchDescription')} - - + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index b22e98252eb7..1d61ec85052f 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {View} from 'react-native'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -8,11 +9,15 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksClassesPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -21,40 +26,51 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { const {syncClasses, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncClasses && syncClasses !== 'NONE'); const isReportFieldsSelected = syncClasses === 'REPORT_FIELD'; + const {canUseAccountingIntegrations} = usePermissions(); + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); + return ( - - - {translate('workspace.qbo.classesDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.classesDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - + + )} + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index 078ea466b929..f42375f957a1 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {View} from 'react-native'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -8,11 +9,15 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksCustomersPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -21,40 +26,50 @@ function QuickbooksCustomersPage({policy}: WithPolicyProps) { const {syncCustomers, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncCustomers && syncCustomers !== 'NONE'); const isReportFieldsSelected = syncCustomers === 'REPORT_FIELD'; + const {canUseAccountingIntegrations} = usePermissions(); + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - - {translate('workspace.qbo.customersDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.customersDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - + + )} + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index da7229ded9ac..f0897d6d2cfe 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -6,16 +7,20 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); + const {canUseAccountingIntegrations} = usePermissions(); const quickbooksOnlineConfigTitles = { DEFAULT: translate('workspace.qbo.imported'), true: translate('workspace.qbo.imported'), @@ -24,6 +29,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { TAG: translate('workspace.qbo.importedAsTags'), REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), }; + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); const policyID = policy?.id ?? ''; const {syncClasses, syncCustomers, syncLocations, syncTaxes, enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; @@ -71,24 +77,32 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { shouldEnableMaxHeight testID={QuickbooksImportPage.displayName} > - - - {translate('workspace.qbo.importDescription')} - {sections.map((section) => ( - - - - ))} - + + + + {translate('workspace.qbo.importDescription')} + {sections.map((section) => ( + + + + ))} + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index 9fa36c615208..767aad6f7df3 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {View} from 'react-native'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -8,11 +9,15 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksLocationsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -21,43 +26,53 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { const {syncLocations, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncLocations && syncLocations !== 'NONE'); const isReportFieldsSelected = syncLocations === 'REPORT_FIELD'; + const {canUseAccountingIntegrations} = usePermissions(); + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - - {translate('workspace.qbo.locationsDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.locationsDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - - {translate('workspace.qbo.locationsAdditionalDescription')} - - + + )} + + {translate('workspace.qbo.locationsAdditionalDescription')} + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index 8cb4a532c17f..cde5d179dcbb 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {View} from 'react-native'; +import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -7,11 +8,15 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; +import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; +import Navigation from '@navigation/Navigation'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksTaxesPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -19,30 +24,40 @@ function QuickbooksTaxesPage({policy}: WithPolicyProps) { const policyID = policy?.id ?? ''; const {syncTaxes, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncTaxes && syncTaxes !== 'NONE'); + const {canUseAccountingIntegrations} = usePermissions(); + const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - - {translate('workspace.qbo.taxesDescription')} - - - {translate('workspace.qbo.import')} - - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} - /> + + + + {translate('workspace.qbo.taxesDescription')} + + + {translate('workspace.qbo.import')} - - - + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + + ); } From d8e225e824c14e552fccfccdc37f911865a5dcb7 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 4 Apr 2024 16:13:22 +0300 Subject: [PATCH 22/31] add wrappers for not showing page --- src/libs/WorkspacesSettingsUtils.ts | 5 - .../accounting/WorkspaceAccountingPage.tsx | 2 +- .../qbo/QuickbooksChartOfAccountsPage.tsx | 73 +++++++------- .../accounting/qbo/QuickbooksClassesPage.tsx | 87 ++++++++--------- .../qbo/QuickbooksCustomersPage.tsx | 87 ++++++++--------- .../accounting/qbo/QuickbooksImportPage.tsx | 69 +++++++------- .../qbo/QuickbooksLocationsPage.tsx | 94 +++++++++---------- .../accounting/qbo/QuickbooksTaxesPage.tsx | 69 +++++++------- 8 files changed, 226 insertions(+), 260 deletions(-) diff --git a/src/libs/WorkspacesSettingsUtils.ts b/src/libs/WorkspacesSettingsUtils.ts index addc5ac8261b..30820fc0c48b 100644 --- a/src/libs/WorkspacesSettingsUtils.ts +++ b/src/libs/WorkspacesSettingsUtils.ts @@ -287,10 +287,6 @@ function getOwnershipChecksDisplayText( return {title, text, buttonText}; } -function hasAccessToAccountingFeatures(policy: Policy | null, canUseAccountingIntegrations?: boolean) { - return policy?.role === CONST.POLICY.ROLE.ADMIN && policy?.areConnectionsEnabled && canUseAccountingIntegrations; -} - export { getBrickRoadForPolicy, getWorkspacesBrickRoads, @@ -301,6 +297,5 @@ export { getChatTabBrickRoad, getUnitTranslationKey, getOwnershipChecksDisplayText, - hasAccessToAccountingFeatures, }; export type {BrickRoad}; diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx index 7c2245514839..f96ee9608145 100644 --- a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -11,7 +11,7 @@ function WorkspaceAccountingPage() { shouldEnableMaxHeight testID={WorkspaceAccountingPage.displayName} > - + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index 61916543d1e0..d3668b875c8c 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -8,60 +7,56 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; -import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import CONST from '@src/CONST'; function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const {canUseAccountingIntegrations} = usePermissions(); const policyID = policy?.id ?? ''; const {enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - + - - - {translate('workspace.qbo.accountsDescription')} - + + + + {translate('workspace.qbo.accountsDescription')} + + + {translate('workspace.qbo.accountsSwitchTitle')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} + /> + + + - {translate('workspace.qbo.accountsSwitchTitle')} + {translate('workspace.qbo.accountsSwitchDescription')} - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} - /> - - - - - {translate('workspace.qbo.accountsSwitchDescription')} - - - - + + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index 1d61ec85052f..82c9e229cb6c 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -9,15 +8,14 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; -import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import CONST from '@src/CONST'; function QuickbooksClassesPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -26,52 +24,49 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { const {syncClasses, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncClasses && syncClasses !== 'NONE'); const isReportFieldsSelected = syncClasses === 'REPORT_FIELD'; - const {canUseAccountingIntegrations} = usePermissions(); - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - + - - - {translate('workspace.qbo.classesDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.classesDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - - - + + )} + + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index f42375f957a1..8ad65c445ba4 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -9,15 +8,14 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; -import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import CONST from '@src/CONST'; function QuickbooksCustomersPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -26,51 +24,48 @@ function QuickbooksCustomersPage({policy}: WithPolicyProps) { const {syncCustomers, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncCustomers && syncCustomers !== 'NONE'); const isReportFieldsSelected = syncCustomers === 'REPORT_FIELD'; - const {canUseAccountingIntegrations} = usePermissions(); - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - + - - - {translate('workspace.qbo.customersDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.customersDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - - - + + )} + + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index f0897d6d2cfe..2a212232e5a9 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -7,20 +6,18 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; function QuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const {canUseAccountingIntegrations} = usePermissions(); const quickbooksOnlineConfigTitles = { DEFAULT: translate('workspace.qbo.imported'), true: translate('workspace.qbo.imported'), @@ -29,7 +26,6 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { TAG: translate('workspace.qbo.importedAsTags'), REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), }; - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); const policyID = policy?.id ?? ''; const {syncClasses, syncCustomers, syncLocations, syncTaxes, enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; @@ -72,38 +68,37 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { ]; return ( - - + - - - {translate('workspace.qbo.importDescription')} - {sections.map((section) => ( - - - - ))} - - - + + + + {translate('workspace.qbo.importDescription')} + {sections.map((section) => ( + + + + ))} + + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index 767aad6f7df3..b88d8bbdc800 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -9,15 +8,14 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; -import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import CONST from '@src/CONST'; function QuickbooksLocationsPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -26,54 +24,52 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { const {syncLocations, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncLocations && syncLocations !== 'NONE'); const isReportFieldsSelected = syncLocations === 'REPORT_FIELD'; - const {canUseAccountingIntegrations} = usePermissions(); - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); + return ( - - + - - - {translate('workspace.qbo.locationsDescription')} - - - {translate('workspace.qbo.import')} + + + + {translate('workspace.qbo.locationsDescription')} + + + {translate('workspace.qbo.import')} + + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + /> + + - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + {isSwitchOn && ( + + - - - - {isSwitchOn && ( - - - - )} - - {translate('workspace.qbo.locationsAdditionalDescription')} - - - - + + )} + + {translate('workspace.qbo.locationsAdditionalDescription')} + + + + + ); } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index cde5d179dcbb..0ff5bc892b16 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {View} from 'react-native'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -8,15 +7,14 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; -import {hasAccessToAccountingFeatures} from '@libs/WorkspacesSettingsUtils'; -import Navigation from '@navigation/Navigation'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import variables from '@styles/variables'; import * as Policy from '@userActions/Policy'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import CONST from '@src/CONST'; function QuickbooksTaxesPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); @@ -24,41 +22,38 @@ function QuickbooksTaxesPage({policy}: WithPolicyProps) { const policyID = policy?.id ?? ''; const {syncTaxes, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; const isSwitchOn = Boolean(syncTaxes && syncTaxes !== 'NONE'); - const {canUseAccountingIntegrations} = usePermissions(); - const hasAccess = hasAccessToAccountingFeatures(policy, canUseAccountingIntegrations); return ( - - + - - - {translate('workspace.qbo.taxesDescription')} - - - {translate('workspace.qbo.import')} - - - - Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} - /> + + + + {translate('workspace.qbo.taxesDescription')} + + + {translate('workspace.qbo.import')} - - - - - + + + Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} + /> + + + + + + + ); } From 2d373156600a6206f929b76a3b26e04960fe47ca Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 4 Apr 2024 16:33:45 +0300 Subject: [PATCH 23/31] resolve c+ comments --- src/CONST.ts | 9 +++++++++ src/ROUTES.ts | 12 +++++------ src/SCREENS.ts | 12 +++++------ .../ModalStackNavigators/index.tsx | 12 +++++------ .../FULL_SCREEN_TO_RHP_MAPPING.ts | 12 +++++------ src/libs/Navigation/linkingConfig/config.ts | 12 +++++------ src/libs/Navigation/types.ts | 12 +++++------ .../accounting/qbo/QuickbooksImportPage.tsx | 20 ++++++++++--------- src/types/onyx/Policy.ts | 2 +- 9 files changed, 57 insertions(+), 46 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 2b3cc7c09708..cc636390d954 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1183,6 +1183,15 @@ const CONST = { EXPENSIFY_EMAIL_DOMAIN: '@expensify.com', }, + INTEGRATION_ENTITY_MAP_TYPES: { + DEFAULT: 'DEFAULT', + NONE: 'NONE', + TAG: 'TAG', + REPORT_FIELD: 'REPORT_FIELD', + NOT_IMPORTED: 'NOT IMPORTED', + IMPORTED: 'IMPORTED', + }, + ACCOUNT_ID: { ACCOUNTING: Number(Config?.EXPENSIFY_ACCOUNT_ID_ACCOUNTING ?? 9645353), ADMIN: Number(Config?.EXPENSIFY_ACCOUNT_ID_ADMIN ?? -1), diff --git a/src/ROUTES.ts b/src/ROUTES.ts index b5c916e88e02..346bc66ebec7 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -669,27 +669,27 @@ const ROUTES = { route: 'r/:reportID/transaction/:transactionID/receipt', getRoute: (reportID: string, transactionID: string) => `r/${reportID}/transaction/${transactionID}/receipt` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_IMPORT: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_IMPORT: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/accounts', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/accounts` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CLASSES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/classes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/classes` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CUSTOMERS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/customers', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/customers` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_LOCATIONS: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/locations', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/locations` as const, }, - WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES: { + WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_TAXES: { route: 'settings/workspaces/:policyID/accounting/quickbooks-online/import/taxes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/quickbooks-online/import/taxes` as const, }, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index f62e62715ad6..3e9dcf05fa7c 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -247,12 +247,12 @@ const SCREENS = { DISTANCE_RATES: 'Distance_Rates', CREATE_DISTANCE_RATE: 'Create_Distance_Rate', DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings', - QUICKBOOKSONLINE_IMPORT: 'Workspace_Accounting_QuickbooksOnline_Import', - QUICKBOOKSONLINE_CHART_OF_ACCOUNTS: 'Workspace_Accounting_QuickbooksOnline_Import_Chart_Of_Accounts', - QUICKBOOKSONLINE_CLASSES: 'Workspace_Accounting_QuickbooksOnline_Import_Classes', - QUICKBOOKSONLINE_CUSTOMERS: 'Workspace_Accounting_QuickbooksOnline_Import_Customers', - QUICKBOOKSONLINE_LOCATIONS: 'Workspace_Accounting_QuickbooksOnline_Import_Locations', - QUICKBOOKSONLINE_TAXES: 'Workspace_Accounting_QuickbooksOnline_Import_Taxes', + QUICKBOOKS_ONLINE_IMPORT: 'Workspace_Accounting_Quickbooks_Online_Import', + QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS: 'Workspace_Accounting_Quickbooks_Online_Import_Chart_Of_Accounts', + QUICKBOOKS_ONLINE_CLASSES: 'Workspace_Accounting_Quickbooks_Online_Import_Classes', + QUICKBOOKS_ONLINE_CUSTOMERS: 'Workspace_Accounting_Quickbooks_Online_Import_Customers', + QUICKBOOKS_ONLINE_LOCATIONS: 'Workspace_Accounting_Quickbooks_Online_Import_Locations', + QUICKBOOKS_ONLINE_TAXES: 'Workspace_Accounting_Quickbooks_Online_Import_Taxes', DISTANCE_RATE_DETAILS: 'Distance_Rate_Details', DISTANCE_RATE_EDIT: 'Distance_Rate_Edit', }, diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index e31a78d96290..c1eaa6182be3 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -258,12 +258,12 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/ExitSurvey/ExitSurveyReasonPage').default as React.ComponentType, [SCREENS.SETTINGS.EXIT_SURVEY.RESPONSE]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyResponsePage').default as React.ComponentType, [SCREENS.SETTINGS.EXIT_SURVEY.CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/ExitSurveyConfirmPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksImportPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksCustomersPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksTaxesPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksLocationsPage').default as React.ComponentType, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksClassesPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_IMPORT]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksImportPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CUSTOMERS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksCustomersPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_TAXES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksTaxesPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_LOCATIONS]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksLocationsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CLASSES]: () => require('../../../../pages/workspace/accounting/qbo/QuickbooksClassesPage').default as React.ComponentType, [SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_FREQUENCY]: () => require('../../../../pages/workspace/workflows/WorkspaceAutoReportingFrequencyPage').default as React.ComponentType, [SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET]: () => require('../../../../pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage').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 5452a95fa7ba..50d1516fc9be 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -20,12 +20,12 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial> = { SCREENS.WORKSPACE.WORKFLOWS_PAYER, ], [SCREENS.WORKSPACE.ACCOUNTING]: [ - SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT, - SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS, - SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES, - SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES, - SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS, - SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_IMPORT, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CLASSES, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_TAXES, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_LOCATIONS, + SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CUSTOMERS, ], [SCREENS.WORKSPACE.TAXES]: [ SCREENS.WORKSPACE.TAXES_SETTINGS, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index dffed8c0d055..37fb4d80007f 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -232,12 +232,12 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.CURRENCY]: { path: ROUTES.WORKSPACE_PROFILE_CURRENCY.route, }, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_IMPORT.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.route}, - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_IMPORT]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_IMPORT.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CLASSES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CLASSES.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CUSTOMERS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CUSTOMERS.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_LOCATIONS]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_LOCATIONS.route}, + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_TAXES]: {path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_TAXES.route}, [SCREENS.WORKSPACE.DESCRIPTION]: { path: ROUTES.WORKSPACE_PROFILE_DESCRIPTION.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 3a1f2319e261..53395915f9ae 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -246,22 +246,22 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_IMPORT]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_IMPORT]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CHART_OF_ACCOUNTS]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_LOCATIONS]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_LOCATIONS]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CLASSES]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CLASSES]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_CUSTOMERS]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_CUSTOMERS]: { policyID: string; }; - [SCREENS.WORKSPACE.QUICKBOOKSONLINE_TAXES]: { + [SCREENS.WORKSPACE.QUICKBOOKS_ONLINE_TAXES]: { policyID: string; }; [SCREENS.GET_ASSISTANCE]: { diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 2a212232e5a9..98c01c1d4cf4 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -19,12 +19,14 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const quickbooksOnlineConfigTitles = { - DEFAULT: translate('workspace.qbo.imported'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.DEFAULT]: translate('workspace.qbo.imported'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.IMPORTED]: translate('workspace.qbo.imported'), true: translate('workspace.qbo.imported'), false: translate('workspace.qbo.notImported'), - NONE: translate('workspace.qbo.notImported'), - TAG: translate('workspace.qbo.importedAsTags'), - REPORT_FIELD: translate('workspace.qbo.importedAsReportFields'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.NOT_IMPORTED]: translate('workspace.qbo.notImported'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE]: translate('workspace.qbo.notImported'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: translate('workspace.qbo.importedAsTags'), + [CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD]: translate('workspace.qbo.importedAsReportFields'), }; const policyID = policy?.id ?? ''; const {syncClasses, syncCustomers, syncLocations, syncTaxes, enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; @@ -32,35 +34,35 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { const sections = [ { description: translate('workspace.qbo.accounts'), - action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), hasError: Boolean(policy?.errors?.enableNewCategories), title: enableNewCategories, pendingAction: pendingFields?.enableNewCategories, }, { description: translate('workspace.qbo.classes'), - action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CLASSES.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CLASSES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncClasses), title: syncClasses, pendingAction: pendingFields?.syncClasses, }, { description: translate('workspace.qbo.customers'), - action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_CUSTOMERS.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CUSTOMERS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncCustomers), title: syncCustomers, pendingAction: pendingFields?.syncCustomers, }, { description: translate('workspace.qbo.locations'), - action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_LOCATIONS.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_LOCATIONS.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncLocations), title: syncLocations, pendingAction: pendingFields?.syncLocations, }, { description: translate('workspace.qbo.taxes'), - action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKSONLINE_TAXES.getRoute(policyID)), + action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_TAXES.getRoute(policyID)), hasError: Boolean(policy?.errors?.syncTaxes), title: syncTaxes, pendingAction: pendingFields?.syncTaxes, diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 0565620c8566..86e087e1cab1 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -141,7 +141,7 @@ type QBOConnectionData = { vendors: Vendor[]; }; -type IntegrationEntityMap = 'NONE' | 'DEFAULT' | 'TAG' | 'REPORT_FIELD' | false | true; +type IntegrationEntityMap = (typeof CONST.INTEGRATION_ENTITY_MAP_TYPES)[keyof typeof CONST.INTEGRATION_ENTITY_MAP_TYPES] | false | true; /** * User configuration for the QuickBooks Online accounting integration. From 1e59910562bd2464525c9b9ed5d03f92a9eab7d7 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 4 Apr 2024 17:44:47 +0300 Subject: [PATCH 24/31] remove color --- src/pages/workspace/accounting/WorkspaceAccountingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx index f96ee9608145..7c2245514839 100644 --- a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -11,7 +11,7 @@ function WorkspaceAccountingPage() { shouldEnableMaxHeight testID={WorkspaceAccountingPage.displayName} > - + ); } From 3ca396fcaad84d16d2181351c76d50a2807f2184 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Mon, 8 Apr 2024 14:08:51 +0300 Subject: [PATCH 25/31] resolve comments --- .../accounting/qbo/QuickbooksClassesPage.tsx | 13 ++++++++++--- .../accounting/qbo/QuickbooksCustomersPage.tsx | 13 ++++++++++--- .../accounting/qbo/QuickbooksLocationsPage.tsx | 13 ++++++++++--- .../accounting/qbo/QuickbooksTaxesPage.tsx | 11 +++++++++-- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index 82c9e229cb6c..f875389fee4e 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -22,8 +22,8 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {syncClasses, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = Boolean(syncClasses && syncClasses !== 'NONE'); - const isReportFieldsSelected = syncClasses === 'REPORT_FIELD'; + const isSwitchOn = Boolean(syncClasses && syncClasses !== CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE); + const isReportFieldsSelected = syncClasses === CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD; return ( @@ -48,7 +48,14 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncClasses', isSwitchOn ? 'NONE' : 'TAG')} + onToggle={() => + Policy.updatePolicyConnectionConfig( + policyID, + 'quickbooksOnline', + 'syncClasses', + isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, + ) + } /> diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index 8ad65c445ba4..34ec496d870f 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -22,8 +22,8 @@ function QuickbooksCustomersPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {syncCustomers, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = Boolean(syncCustomers && syncCustomers !== 'NONE'); - const isReportFieldsSelected = syncCustomers === 'REPORT_FIELD'; + const isSwitchOn = Boolean(syncCustomers && syncCustomers !== CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE); + const isReportFieldsSelected = syncCustomers === CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD; return ( Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncCustomers', isSwitchOn ? 'NONE' : 'TAG')} + onToggle={() => + Policy.updatePolicyConnectionConfig( + policyID, + 'quickbooksOnline', + 'syncCustomers', + isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, + ) + } /> diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index b88d8bbdc800..6bc530998827 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -22,8 +22,8 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {syncLocations, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = Boolean(syncLocations && syncLocations !== 'NONE'); - const isReportFieldsSelected = syncLocations === 'REPORT_FIELD'; + const isSwitchOn = Boolean(syncLocations && syncLocations !== CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE); + const isReportFieldsSelected = syncLocations === CONST.INTEGRATION_ENTITY_MAP_TYPES.REPORT_FIELD; return ( @@ -48,7 +48,14 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncLocations', isSwitchOn ? 'NONE' : 'TAG')} + onToggle={() => + Policy.updatePolicyConnectionConfig( + policyID, + 'quickbooksOnline', + 'syncLocations', + isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, + ) + } /> diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index 0ff5bc892b16..4a5eda0d6a25 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -21,7 +21,7 @@ function QuickbooksTaxesPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {syncTaxes, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; - const isSwitchOn = Boolean(syncTaxes && syncTaxes !== 'NONE'); + const isSwitchOn = Boolean(syncTaxes && syncTaxes !== CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE); return ( Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'syncTaxes', isSwitchOn ? 'NONE' : 'TAG')} + onToggle={() => + Policy.updatePolicyConnectionConfig( + policyID, + 'quickbooksOnline', + 'syncTaxes', + isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, + ) + } /> From b4d73c1e63ec3372fa49647b52aca7c285b91e6b Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 9 Apr 2024 10:24:02 +0300 Subject: [PATCH 26/31] remove true false from types --- src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx | 6 ++---- src/types/onyx/Policy.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 98c01c1d4cf4..0d44901f91f2 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -21,8 +21,6 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { const quickbooksOnlineConfigTitles = { [CONST.INTEGRATION_ENTITY_MAP_TYPES.DEFAULT]: translate('workspace.qbo.imported'), [CONST.INTEGRATION_ENTITY_MAP_TYPES.IMPORTED]: translate('workspace.qbo.imported'), - true: translate('workspace.qbo.imported'), - false: translate('workspace.qbo.notImported'), [CONST.INTEGRATION_ENTITY_MAP_TYPES.NOT_IMPORTED]: translate('workspace.qbo.notImported'), [CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE]: translate('workspace.qbo.notImported'), [CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG]: translate('workspace.qbo.importedAsTags'), @@ -36,7 +34,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { description: translate('workspace.qbo.accounts'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), hasError: Boolean(policy?.errors?.enableNewCategories), - title: enableNewCategories, + title: enableNewCategories ? CONST.INTEGRATION_ENTITY_MAP_TYPES.IMPORTED : CONST.INTEGRATION_ENTITY_MAP_TYPES.NOT_IMPORTED, pendingAction: pendingFields?.enableNewCategories, }, { @@ -89,7 +87,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { pendingAction={section.pendingAction} > Date: Tue, 9 Apr 2024 14:44:22 +0300 Subject: [PATCH 27/31] resolve c+ comments --- src/CONST.ts | 11 ++++++++++- .../parameters/UpdatePolicyConnectionConfigParams.ts | 7 +++++-- src/libs/actions/Policy.ts | 4 ++-- .../accounting/qbo/QuickbooksChartOfAccountsPage.tsx | 11 +++++++++-- .../accounting/qbo/QuickbooksClassesPage.tsx | 3 +-- .../accounting/qbo/QuickbooksCustomersPage.tsx | 3 +-- .../workspace/accounting/qbo/QuickbooksImportPage.tsx | 2 +- .../accounting/qbo/QuickbooksLocationsPage.tsx | 3 +-- .../workspace/accounting/qbo/QuickbooksTaxesPage.tsx | 3 +-- src/types/onyx/Policy.ts | 2 +- 10 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index cc636390d954..57c449cc85a0 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1188,9 +1188,18 @@ const CONST = { NONE: 'NONE', TAG: 'TAG', REPORT_FIELD: 'REPORT_FIELD', - NOT_IMPORTED: 'NOT IMPORTED', + NOT_IMPORTED: 'NOT_IMPORTED', IMPORTED: 'IMPORTED', }, + QUICK_BOOKS_ONLINE: 'quickbooksOnline', + + QUICK_BOOKS_IMPORTS: { + SYNC_CLASSES: 'syncClasses', + ENABLE_NEW_CATEGORIES: 'enableNewCategories', + SYNC_CUSTOMERS: 'syncCustomers', + SYNC_LOCATIONS: 'syncLocations', + SYNC_TAXES: 'syncTaxes', + }, ACCOUNT_ID: { ACCOUNTING: Number(Config?.EXPENSIFY_ACCOUNT_ID_ACCOUNTING ?? 9645353), diff --git a/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts b/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts index 0e5475f1a27d..be062435eaa4 100644 --- a/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts +++ b/src/libs/API/parameters/UpdatePolicyConnectionConfigParams.ts @@ -1,8 +1,11 @@ +import type {ValueOf} from 'type-fest'; +import type CONST from '@src/CONST'; + type UpdatePolicyConnectionConfigParams = { policyID: string; connectionName: string; - settingName: string; - settingValue: string | boolean; + settingName: ValueOf; + settingValue: ValueOf; idempotencyKey: string; }; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 5ff4016867e5..6c20f8046db4 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -3608,8 +3608,8 @@ function openPolicyDistanceRatesPage(policyID?: string) { API.read(READ_COMMANDS.OPEN_POLICY_DISTANCE_RATES_PAGE, params); } -function updatePolicyConnectionConfig(policyID: string, connectionName: string, settingName: string, settingValue: string | boolean) { - const parameters = {policyID, connectionName, settingName, settingValue, idempotencyKey: settingName}; +function updatePolicyConnectionConfig(policyID: string, settingName: ValueOf, settingValue: ValueOf) { + const parameters = {policyID, connectionName: CONST.QUICK_BOOKS_ONLINE, settingName, settingValue, idempotencyKey: settingName}; const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index d3668b875c8c..13cceb6ad57c 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -21,6 +21,7 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { const styles = useThemeStyles(); const policyID = policy?.id ?? ''; const {enableNewCategories, pendingFields} = policy?.connections?.quickbooksOnline?.config ?? {}; + const isSwitchOn = Boolean(enableNewCategories && enableNewCategories !== CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE); return ( @@ -44,8 +45,14 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { Policy.updatePolicyConnectionConfig(policyID, 'quickbooksOnline', 'enableNewCategories', !enableNewCategories)} + isOn={isSwitchOn} + onToggle={() => + Policy.updatePolicyConnectionConfig( + policyID, + CONST.QUICK_BOOKS_IMPORTS.ENABLE_NEW_CATEGORIES, + isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, + ) + } /> diff --git a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx index f875389fee4e..f8c631b31476 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksClassesPage.tsx @@ -51,8 +51,7 @@ function QuickbooksClassesPage({policy}: WithPolicyProps) { onToggle={() => Policy.updatePolicyConnectionConfig( policyID, - 'quickbooksOnline', - 'syncClasses', + CONST.QUICK_BOOKS_IMPORTS.SYNC_CLASSES, isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, ) } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx index 34ec496d870f..27fde14081e7 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksCustomersPage.tsx @@ -50,8 +50,7 @@ function QuickbooksCustomersPage({policy}: WithPolicyProps) { onToggle={() => Policy.updatePolicyConnectionConfig( policyID, - 'quickbooksOnline', - 'syncCustomers', + CONST.QUICK_BOOKS_IMPORTS.SYNC_CUSTOMERS, isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, ) } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx index 0d44901f91f2..531b413c9d08 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksImportPage.tsx @@ -34,7 +34,7 @@ function QuickbooksImportPage({policy}: WithPolicyProps) { description: translate('workspace.qbo.accounts'), action: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS.getRoute(policyID)), hasError: Boolean(policy?.errors?.enableNewCategories), - title: enableNewCategories ? CONST.INTEGRATION_ENTITY_MAP_TYPES.IMPORTED : CONST.INTEGRATION_ENTITY_MAP_TYPES.NOT_IMPORTED, + title: enableNewCategories, pendingAction: pendingFields?.enableNewCategories, }, { diff --git a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx index 6bc530998827..21da79587c0c 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksLocationsPage.tsx @@ -51,8 +51,7 @@ function QuickbooksLocationsPage({policy}: WithPolicyProps) { onToggle={() => Policy.updatePolicyConnectionConfig( policyID, - 'quickbooksOnline', - 'syncLocations', + CONST.QUICK_BOOKS_IMPORTS.SYNC_LOCATIONS, isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, ) } diff --git a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx index 4a5eda0d6a25..293d6518baa0 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksTaxesPage.tsx @@ -48,8 +48,7 @@ function QuickbooksTaxesPage({policy}: WithPolicyProps) { onToggle={() => Policy.updatePolicyConnectionConfig( policyID, - 'quickbooksOnline', - 'syncTaxes', + CONST.QUICK_BOOKS_IMPORTS.SYNC_TAXES, isSwitchOn ? CONST.INTEGRATION_ENTITY_MAP_TYPES.NONE : CONST.INTEGRATION_ENTITY_MAP_TYPES.TAG, ) } diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index c48341770191..77fc2a1929e0 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -171,7 +171,7 @@ type QBOConnectionConfig = OnyxCommon.OnyxValueWithOfflineFeedback<{ exportDate: string; lastConfigurationTime: number; syncTax: boolean; - enableNewCategories: boolean; + enableNewCategories: IntegrationEntityMap; errors?: OnyxCommon.Errors; errorFields?: OnyxCommon.ErrorFields; export: { From 6355d8c38fe21db97dd1a9f94eadcf54985f4366 Mon Sep 17 00:00:00 2001 From: narefyev91 Date: Tue, 9 Apr 2024 18:05:35 +0300 Subject: [PATCH 28/31] Update src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx Co-authored-by: Eugene Voloshchak --- .../workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx index 13cceb6ad57c..593e5f9dc00a 100644 --- a/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/qbo/QuickbooksChartOfAccountsPage.tsx @@ -67,6 +67,6 @@ function QuickbooksChartOfAccountsPage({policy}: WithPolicyProps) { ); } -QuickbooksChartOfAccountsPage.displayName = 'QuickbooksChartOfAccountsConfigurationPage'; +QuickbooksChartOfAccountsPage.displayName = 'QuickbooksChartOfAccountsPage'; export default withPolicy(QuickbooksChartOfAccountsPage); From 08bbde158466df349a9c455955d2516203845a4c Mon Sep 17 00:00:00 2001 From: narefyev91 Date: Tue, 9 Apr 2024 18:05:48 +0300 Subject: [PATCH 29/31] Update src/pages/workspace/accounting/WorkspaceAccountingPage.tsx Co-authored-by: Eugene Voloshchak --- src/pages/workspace/accounting/WorkspaceAccountingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx index 7c2245514839..e3b3bf1d3d05 100644 --- a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -3,7 +3,7 @@ import {View} from 'react-native'; import ScreenWrapper from '@components/ScreenWrapper'; import withPolicy from '@pages/workspace/withPolicy'; -// Fake page will be removed after normal on will be merged +// Fake page will be removed after normal one will be merged function WorkspaceAccountingPage() { return ( Date: Tue, 9 Apr 2024 19:59:24 +0300 Subject: [PATCH 30/31] merge updates --- .../WorkspaceSettingsModalStackNavigator.tsx | 5 ----- src/libs/Navigation/linkingConfig/config.ts | 3 --- src/libs/Navigation/types.ts | 3 --- src/pages/workspace/accounting/WorkspaceAccountingPage.tsx | 4 +++- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx index 25a140d76079..2dce4247c7ae 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/WorkspaceSettingsModalStackNavigator.tsx @@ -82,11 +82,6 @@ function WorkspaceSettingsModalStackNavigator() { name={SCREENS.WORKSPACE.DISTANCE_RATES} getComponent={() => require('@pages/workspace/distanceRates/PolicyDistanceRatesPage').default as React.ComponentType} /> - require('@pages/workspace/accounting/WorkspaceAccountingPage').default as React.ComponentType} - /> ); } diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 79d857c2c2a2..f7cdc54335ab 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -656,9 +656,6 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.INVOICES]: { path: ROUTES.WORKSPACE_INVOICES.route, }, - [SCREENS.WORKSPACE.ACCOUNTING]: { - path: ROUTES.WORKSPACE_ACCOUNTING.route, - }, [SCREENS.WORKSPACE.TRAVEL]: { path: ROUTES.WORKSPACE_TRAVEL.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index ccbd53b5b144..00e722e76b5d 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -621,9 +621,6 @@ type WorkspacesCentralPaneNavigatorParamList = { [SCREENS.WORKSPACE.TRAVEL]: { policyID: string; }; - [SCREENS.WORKSPACE.ACCOUNTING]: { - policyID: string; - }; [SCREENS.WORKSPACE.MEMBERS]: { policyID: string; }; diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx index 2c87e8803be6..b09a41f8d180 100644 --- a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -18,6 +18,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; // import useWaitForNavigation from '@hooks/useWaitForNavigation'; import useWindowDimensions from '@hooks/useWindowDimensions'; +import Navigation from '@navigation/Navigation'; import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; import FeatureEnabledAccessOrNotFoundWrapper from '@pages/workspace/FeatureEnabledAccessOrNotFoundWrapper'; import PaidPolicyAccessOrNotFoundWrapper from '@pages/workspace/PaidPolicyAccessOrNotFoundWrapper'; @@ -25,6 +26,7 @@ import withPolicy from '@pages/workspace/withPolicy'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import type {AnchorPosition} from '@styles/index'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; function WorkspaceAccountingPage({policy}: WithPolicyProps) { const theme = useTheme(); @@ -141,7 +143,7 @@ function WorkspaceAccountingPage({policy}: WithPolicyProps) { shouldShowRightIcon: true, title: translate('workspace.accounting.import'), wrapperStyle: [styles.sectionMenuItemTopDescription], - onPress: () => {}, + onPress: () => Navigation.navigate(ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_IMPORT.getRoute(policyID)), }, { icon: Expensicons.Send, From 03c74520b7b3bae127ef1ad21a71271278204904 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Tue, 9 Apr 2024 20:11:45 +0300 Subject: [PATCH 31/31] prettier --- src/pages/workspace/accounting/WorkspaceAccountingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx index b09a41f8d180..6fada466e2bb 100644 --- a/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx +++ b/src/pages/workspace/accounting/WorkspaceAccountingPage.tsx @@ -163,7 +163,7 @@ function WorkspaceAccountingPage({policy}: WithPolicyProps) { }, ]), ], - [translate, theme.spinner, isSyncInProgress, overflowMenu, threeDotsMenuPosition, styles.popoverMenuIcon, threeDotsMenuContainerRef, styles.sectionMenuItemTopDescription], + [styles.sectionMenuItemTopDescription, styles.popoverMenuIcon, translate, isSyncInProgress, theme.spinner, overflowMenu, threeDotsMenuPosition, policyID], ); const headerThreeDotsMenuItems: ThreeDotsMenuProps['menuItems'] = [