Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 30 additions & 3 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1446,6 +1446,26 @@ const ROUTES = {
return `workspaces/${policyID}/accounting/quickbooks-desktop/advanced/autosync` as const;
},
},
POLICY_ACCOUNTING_CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC: {
route: 'workspaces/:policyID/accounting/quickbooks-desktop/card-reconciliation/autosync',
getRoute: (policyID?: string) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC route');
}

return `workspaces/${policyID}/accounting/quickbooks-desktop/card-reconciliation/autosync` as const;
},
},
POLICY_ACCOUNTING_CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC: {
route: 'workspaces/:policyID/accounting/sage-intacct/card-reconciliation/autosync',
getRoute: (policyID?: string) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC route');
}

return `workspaces/${policyID}/accounting/sage-intacct/card-reconciliation/autosync` as const;
},
},
POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_ACCOUNTING_METHOD: {
route: 'workspaces/:policyID/accounting/quickbooks-desktop/advanced/autosync/accounting-method',
getRoute: (policyID?: string) => {
Expand Down Expand Up @@ -1734,7 +1754,13 @@ const ROUTES = {
},
WORKSPACE_ACCOUNTING_CARD_RECONCILIATION: {
route: 'workspaces/:policyID/accounting/:connection/card-reconciliation',
getRoute: (policyID: string, connection?: ValueOf<typeof CONST.POLICY.CONNECTIONS.ROUTE>) => `workspaces/${policyID}/accounting/${connection as string}/card-reconciliation` as const,
getRoute: (policyID?: string, connection?: ValueOf<typeof CONST.POLICY.CONNECTIONS.ROUTE>) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_ACCOUNTING_CARD_RECONCILIATION route');
}

return `workspaces/${policyID}/accounting/${connection as string}/card-reconciliation` as const;
},
},
WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS: {
route: 'workspaces/:policyID/accounting/:connection/card-reconciliation/account',
Expand Down Expand Up @@ -3178,11 +3204,12 @@ const ROUTES = {
},
POLICY_ACCOUNTING_SAGE_INTACCT_AUTO_SYNC: {
route: 'workspaces/:policyID/accounting/sage-intacct/advanced/autosync',
getRoute: (policyID: string | undefined) => {
getRoute: (policyID: string | undefined, backTo?: string) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_SAGE_INTACCT_AUTO_SYNC route');
}
return `workspaces/${policyID}/accounting/sage-intacct/advanced/autosync` as const;
// eslint-disable-next-line no-restricted-syntax
Comment thread
daledah marked this conversation as resolved.
return getUrlWithBackToParam(`workspaces/${policyID}/accounting/sage-intacct/advanced/autosync` as const, backTo);
},
},
POLICY_ACCOUNTING_SAGE_INTACCT_ACCOUNTING_METHOD: {
Expand Down
2 changes: 2 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,8 @@ const SCREENS = {
SAGE_INTACCT_ACCOUNTING_METHOD: 'Policy_Accounting_Sage_Intacct_Accounting_Method',
SAGE_INTACCT_PAYMENT_ACCOUNT: 'Policy_Accounting_Sage_Intacct_Payment_Account',
CARD_RECONCILIATION: 'Policy_Accounting_Card_Reconciliation',
CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC: 'Policy_Accounting_Card_Reconciliation_Quickbooks_Desktop_Auto_Sync',
CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC: 'Policy_Accounting_Card_Reconciliation_Sage_Intacct_Auto_Sync',
RECONCILIATION_ACCOUNT_SETTINGS: 'Policy_Accounting_Reconciliation_Account_Settings',
},
INITIAL: 'Workspace_Initial',
Expand Down
4 changes: 2 additions & 2 deletions src/components/ConnectionLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ function ConnectionLayout({
}: ConnectionLayoutProps) {
const {translate} = useLocalize();

const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`);
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
const isConnectionEmpty = isEmpty(policy?.connections?.[connectionName]);

const renderSelectionContent = useMemo(
Expand All @@ -130,7 +130,7 @@ function ConnectionLayout({
policyID={policyID}
accessVariants={accessVariants}
featureName={featureName}
shouldBeBlocked={!!shouldBeBlocked || shouldBlockByConnection}
shouldBeBlocked={!!shouldBeBlocked && shouldBlockByConnection}
>
<ScreenWrapper
enableEdgeToEdgeBottomSafeAreaPadding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,10 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
[SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PAYMENT_ACCOUNT]: () =>
require<ReactComponentModule>('../../../../pages/workspace/accounting/intacct/advanced/SageIntacctPaymentAccountPage').default,
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: () => require<ReactComponentModule>('../../../../pages/workspace/accounting/reconciliation/CardReconciliationPage').default,
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC]: () =>
require<ReactComponentModule>('../../../../pages/workspace/accounting/reconciliation/CardReconciliationQuickbooksDesktopAutoSyncPage').default,
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC]: () =>
require<ReactComponentModule>('../../../../pages/workspace/accounting/reconciliation/CardReconciliationSageIntacctAutoSyncPage').default,
[SCREENS.WORKSPACE.ACCOUNTING.RECONCILIATION_ACCOUNT_SETTINGS]: () =>
require<ReactComponentModule>('../../../../pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage').default,
[SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_FREQUENCY]: () => require<ReactComponentModule>('../../../../pages/workspace/workflows/WorkspaceAutoReportingFrequencyPage').default,
Expand Down
6 changes: 6 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,12 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_ACCOUNTING_METHOD]: {path: ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ACCOUNTING_METHOD.route},
[SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PAYMENT_ACCOUNT]: {path: ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PAYMENT_ACCOUNT.route},
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: {path: ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.route},
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC]: {
path: ROUTES.POLICY_ACCOUNTING_CARD_RECONCILIATION_QUICKBOOKS_DESKTOP_AUTO_SYNC.route,
},
[SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC]: {
path: ROUTES.POLICY_ACCOUNTING_CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC.route,
},
[SCREENS.WORKSPACE.ACCOUNTING.RECONCILIATION_ACCOUNT_SETTINGS]: {path: ROUTES.WORKSPACE_ACCOUNTING_RECONCILIATION_ACCOUNT_SETTINGS.route},
[SCREENS.WORKSPACE.DESCRIPTION]: {
path: ROUTES.WORKSPACE_OVERVIEW_DESCRIPTION.route,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,76 +1,10 @@
import {CONST as COMMON_CONST} from 'expensify-common';
import React, {useCallback} from 'react';
import ConnectionLayout from '@components/ConnectionLayout';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import {updateSageIntacctAutoSync} from '@libs/actions/connections/SageIntacct';
import {getLatestErrorField} from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import {settingsPendingAction} from '@libs/PolicyUtils';
import React from 'react';
import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections';
import withPolicyConnections from '@pages/workspace/withPolicyConnections';
import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow';
import {clearSageIntacctErrorField} from '@userActions/Policy/Policy';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ROUTES from '@src/ROUTES';
import SageIntacctAutoSyncPageBase from './SageIntacctAutoSyncPageBase';

function SageIntacctAutoSyncPage({policy}: WithPolicyConnectionsProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const policyID = policy?.id;
const config = policy?.connections?.intacct?.config;
const {autoSync, pendingFields} = config ?? {};
const accountingMethod = config?.export?.accountingMethod ?? COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.CASH;
const pendingAction = settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC], pendingFields) ?? settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.ACCOUNTING_METHOD], pendingFields);

const goBack = useCallback(() => {
Navigation.goBack(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ADVANCED.getRoute(policyID));
}, [policyID]);

return (
<ConnectionLayout
displayName={SageIntacctAutoSyncPage.displayName}
headerTitle="common.settings"
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
policyID={policyID}
featureName={CONST.POLICY.MORE_FEATURES.ARE_CATEGORIES_ENABLED}
contentContainerStyle={styles.pb2}
titleStyle={styles.ph5}
connectionName={CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT}
onBackButtonPress={goBack}
>
<ToggleSettingOptionRow
key={translate('workspace.sageIntacct.autoSync')}
title={translate('workspace.sageIntacct.autoSync')}
subtitle={translate('workspace.sageIntacct.autoSyncDescription')}
switchAccessibilityLabel={translate('workspace.sageIntacct.autoSyncDescription')}
isActive={!!autoSync?.enabled}
wrapperStyle={[styles.pv2, styles.mh5]}
shouldPlaceSubtitleBelowSwitch
onToggle={() => updateSageIntacctAutoSync(policyID, !autoSync?.enabled)}
pendingAction={settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED], pendingFields)}
errors={getLatestErrorField(config ?? {}, CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED)}
onCloseError={() => clearSageIntacctErrorField(policyID, CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED)}
/>
{!!autoSync?.enabled && (
<OfflineWithFeedback pendingAction={pendingAction}>
<MenuItemWithTopDescription
title={
accountingMethod === COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.ACCRUAL
? translate(`workspace.sageIntacct.accountingMethods.values.${COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.ACCRUAL}` as TranslationPaths)
: translate(`workspace.sageIntacct.accountingMethods.values.${COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.CASH}` as TranslationPaths)
}
description={translate('workspace.sageIntacct.accountingMethods.label')}
shouldShowRightIcon
onPress={() => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ACCOUNTING_METHOD.getRoute(policyID))}
/>
</OfflineWithFeedback>
)}
</ConnectionLayout>
);
return <SageIntacctAutoSyncPageBase policy={policy} />;
}

SageIntacctAutoSyncPage.displayName = 'SageIntacctAutoSyncPage';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import {CONST as COMMON_CONST} from 'expensify-common';
import React, {useCallback} from 'react';
import type {OnyxEntry} from 'react-native-onyx';
import ConnectionLayout from '@components/ConnectionLayout';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import {updateSageIntacctAutoSync} from '@libs/actions/connections/SageIntacct';
import {getLatestErrorField} from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import {settingsPendingAction} from '@libs/PolicyUtils';
import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow';
import {clearSageIntacctErrorField} from '@userActions/Policy/Policy';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ROUTES from '@src/ROUTES';
import type {Route} from '@src/ROUTES';
import type {Policy} from '@src/types/onyx';

type SageIntacctAutoSyncPageBaseParams = {
policy: OnyxEntry<Policy>;
navigateBackTo?: Route;
};

function SageIntacctAutoSyncPageBase({policy, navigateBackTo}: SageIntacctAutoSyncPageBaseParams) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const policyID = policy?.id;
const config = policy?.connections?.intacct?.config;
const {autoSync, pendingFields} = config ?? {};
const accountingMethod = config?.export?.accountingMethod ?? COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.CASH;
const pendingAction = settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC], pendingFields) ?? settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.ACCOUNTING_METHOD], pendingFields);

const goBack = useCallback(() => {
Navigation.goBack(navigateBackTo ?? ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ADVANCED.getRoute(policyID));
}, [navigateBackTo, policyID]);

return (
<ConnectionLayout
displayName={SageIntacctAutoSyncPageBase.displayName}
headerTitle="common.settings"
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
policyID={policyID}
featureName={CONST.POLICY.MORE_FEATURES.ARE_CATEGORIES_ENABLED}
contentContainerStyle={styles.pb2}
titleStyle={styles.ph5}
connectionName={CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT}
onBackButtonPress={goBack}
shouldBeBlocked={false}
>
<ToggleSettingOptionRow
key={translate('workspace.sageIntacct.autoSync')}
title={translate('workspace.sageIntacct.autoSync')}
subtitle={translate('workspace.sageIntacct.autoSyncDescription')}
switchAccessibilityLabel={translate('workspace.sageIntacct.autoSyncDescription')}
isActive={!!autoSync?.enabled}
wrapperStyle={[styles.pv2, styles.mh5]}
shouldPlaceSubtitleBelowSwitch
onToggle={() => updateSageIntacctAutoSync(policyID, !autoSync?.enabled)}
pendingAction={settingsPendingAction([CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED], pendingFields)}
errors={getLatestErrorField(config ?? {}, CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED)}
onCloseError={() => clearSageIntacctErrorField(policyID, CONST.SAGE_INTACCT_CONFIG.AUTO_SYNC_ENABLED)}
/>
{!!autoSync?.enabled && (
<OfflineWithFeedback pendingAction={pendingAction}>
<MenuItemWithTopDescription
title={
accountingMethod === COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.ACCRUAL
? translate(`workspace.sageIntacct.accountingMethods.values.${COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.ACCRUAL}` as TranslationPaths)
: translate(`workspace.sageIntacct.accountingMethods.values.${COMMON_CONST.INTEGRATIONS.ACCOUNTING_METHOD.CASH}` as TranslationPaths)
}
description={translate('workspace.sageIntacct.accountingMethods.label')}
shouldShowRightIcon
onPress={() => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ACCOUNTING_METHOD.getRoute(policyID))}
/>
</OfflineWithFeedback>
)}
</ConnectionLayout>
);
}

SageIntacctAutoSyncPageBase.displayName = 'SageIntacctAutoSyncPageBase';

export default SageIntacctAutoSyncPageBase;
Loading
Loading