Skip to content

Commit

Permalink
added connect and sync commands
Browse files Browse the repository at this point in the history
  • Loading branch information
s77rt committed Jan 20, 2025
1 parent 8b40710 commit 0c271e5
Show file tree
Hide file tree
Showing 18 changed files with 129 additions and 69 deletions.
2 changes: 2 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2712,6 +2712,8 @@ const CONST = {
NETSUITE_SYNC_EXPENSIFY_REIMBURSED_REPORTS: 'netSuiteSyncExpensifyReimbursedReports',
NETSUITE_SYNC_IMPORT_VENDORS_TITLE: 'netSuiteImportVendorsTitle',
NETSUITE_SYNC_IMPORT_CUSTOM_LISTS_TITLE: 'netSuiteImportCustomListsTitle',
NSQS_SYNC_CONNECTION: 'nsqsSyncConnection',
// s77rt get NSQS sync stages
SAGE_INTACCT_SYNC_CHECK_CONNECTION: 'intacctCheckConnection',
SAGE_INTACCT_SYNC_IMPORT_TITLE: 'intacctImportTitle',
SAGE_INTACCT_SYNC_IMPORT_DATA: 'intacctImportData',
Expand Down
6 changes: 6 additions & 0 deletions src/libs/API/parameters/ConnectPolicyToNSQSParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type ConnectPolicyToNSQSParams = {
policyID: string;
// s77rt: ask for the connect params
};

export default ConnectPolicyToNSQSParams;
6 changes: 6 additions & 0 deletions src/libs/API/parameters/SyncPolicyToNSQSParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type SyncPolicyToNSQSParams = {
policyID: string;
idempotencyKey: string;
};

export default SyncPolicyToNSQSParams;
6 changes: 0 additions & 6 deletions src/libs/API/parameters/UpdateNSQSApprovalAccount.ts

This file was deleted.

6 changes: 6 additions & 0 deletions src/libs/API/parameters/UpdateNSQSApprovalAccountParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type UpdateNSQSApprovalAccountParams = {
policyID: string;
value: string;
};

export default UpdateNSQSApprovalAccountParams;
6 changes: 0 additions & 6 deletions src/libs/API/parameters/UpdateNSQSAutoSync.ts

This file was deleted.

6 changes: 6 additions & 0 deletions src/libs/API/parameters/UpdateNSQSAutoSyncParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type UpdateNSQSAutoSyncParams = {
policyID: string;
enabled: boolean;
};

export default UpdateNSQSAutoSyncParams;
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type {ValueOf} from 'type-fest';
import type CONST from '@src/CONST';

type UpdateNSQSCustomersMapping = {
type UpdateNSQSCustomersMappingParams = {
policyID: string;
mapping: ValueOf<typeof CONST.NSQS_INTEGRATION_ENTITY_MAP_TYPES>;
};

export default UpdateNSQSCustomersMapping;
export default UpdateNSQSCustomersMappingParams;
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type {ValueOf} from 'type-fest';
import type CONST from '@src/CONST';

type UpdateNSQSExportDate = {
type UpdateNSQSExportDateParams = {
policyID: string;
value: ValueOf<typeof CONST.NSQS_CONFIG.EXPORT_DATE>;
};

export default UpdateNSQSExportDate;
export default UpdateNSQSExportDateParams;
6 changes: 0 additions & 6 deletions src/libs/API/parameters/UpdateNSQSExporter.ts

This file was deleted.

6 changes: 6 additions & 0 deletions src/libs/API/parameters/UpdateNSQSExporterParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type UpdateNSQSExporterParams = {
policyID: string;
email: string;
};

export default UpdateNSQSExporterParams;
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type {ValueOf} from 'type-fest';
import type CONST from '@src/CONST';

type UpdateNSQSProjectsMapping = {
type UpdateNSQSProjectsMappingParams = {
policyID: string;
mapping: ValueOf<typeof CONST.NSQS_INTEGRATION_ENTITY_MAP_TYPES>;
};

export default UpdateNSQSProjectsMapping;
export default UpdateNSQSProjectsMappingParams;
14 changes: 8 additions & 6 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -277,12 +277,14 @@ export type {default as RequestExpensifyCardLimitIncreaseParams} from './Request
export type {default as UpdateNetSuiteGenericTypeParams} from './UpdateNetSuiteGenericTypeParams';
export type {default as CancelBillingSubscriptionParams} from './CancelBillingSubscriptionParams';
export type {default as UpdateNetSuiteCustomFormIDParams} from './UpdateNetSuiteCustomFormIDParams';
export type {default as UpdateNSQSCustomersMapping} from './UpdateNSQSCustomersMapping';
export type {default as UpdateNSQSProjectsMapping} from './UpdateNSQSProjectsMapping';
export type {default as UpdateNSQSExporter} from './UpdateNSQSExporter';
export type {default as UpdateNSQSExportDate} from './UpdateNSQSExportDate';
export type {default as UpdateNSQSAutoSync} from './UpdateNSQSAutoSync';
export type {default as UpdateNSQSApprovalAccount} from './UpdateNSQSApprovalAccount';
export type {default as ConnectPolicyToNSQSParams} from './ConnectPolicyToNSQSParams';
export type {default as SyncPolicyToNSQSParams} from './SyncPolicyToNSQSParams';
export type {default as UpdateNSQSCustomersMappingParams} from './UpdateNSQSCustomersMappingParams';
export type {default as UpdateNSQSProjectsMappingParams} from './UpdateNSQSProjectsMappingParams';
export type {default as UpdateNSQSExporterParams} from './UpdateNSQSExporterParams';
export type {default as UpdateNSQSExportDateParams} from './UpdateNSQSExportDateParams';
export type {default as UpdateNSQSAutoSyncParams} from './UpdateNSQSAutoSyncParams';
export type {default as UpdateNSQSApprovalAccountParams} from './UpdateNSQSApprovalAccountParams';
export type {default as UpdateSageIntacctGenericTypeParams} from './UpdateSageIntacctGenericTypeParams';
export type {default as UpdateNetSuiteCustomersJobsParams} from './UpdateNetSuiteCustomersJobsParams';
export type {default as CopyExistingPolicyConnectionParams} from './CopyExistingPolicyConnectionParams';
Expand Down
16 changes: 10 additions & 6 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ const WRITE_COMMANDS = {
UPDATE_NETSUITE_APPROVAL_ACCOUNT: 'UpdateNetSuiteApprovalAccount',
UPDATE_NETSUITE_CUSTOM_FORM_ID_OPTIONS_REIMBURSABLE: 'UpdateNetSuiteCustomFormIDOptionsReimbursable',
UPDATE_NETSUITE_CUSTOM_FORM_ID_OPTIONS_NON_REIMBURSABLE: 'UpdateNetSuiteCustomFormIDOptionsNonReimbursable',
CONNECT_POLICY_TO_NSQS: 'ConnectPolicyToNSQS',
UPDATE_NSQS_CUSTOMERS_MAPPING: 'UpdateNSQSCustomersMapping',
UPDATE_NSQS_PROJECTS_MAPPING: 'UpdateNSQSProjectsMapping',
UPDATE_NSQS_EXPORTER: 'UpdateNSQSExporter',
Expand Down Expand Up @@ -854,12 +855,13 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.UPDATE_NETSUITE_APPROVAL_ACCOUNT]: Parameters.UpdateNetSuiteGenericTypeParams<'value', string>;
[WRITE_COMMANDS.UPDATE_NETSUITE_CUSTOM_FORM_ID_OPTIONS_REIMBURSABLE]: Parameters.UpdateNetSuiteCustomFormIDParams;
[WRITE_COMMANDS.UPDATE_NETSUITE_CUSTOM_FORM_ID_OPTIONS_NON_REIMBURSABLE]: Parameters.UpdateNetSuiteCustomFormIDParams;
[WRITE_COMMANDS.UPDATE_NSQS_CUSTOMERS_MAPPING]: Parameters.UpdateNSQSCustomersMapping;
[WRITE_COMMANDS.UPDATE_NSQS_PROJECTS_MAPPING]: Parameters.UpdateNSQSProjectsMapping;
[WRITE_COMMANDS.UPDATE_NSQS_EXPORTER]: Parameters.UpdateNSQSExporter;
[WRITE_COMMANDS.UPDATE_NSQS_EXPORT_DATE]: Parameters.UpdateNSQSExportDate;
[WRITE_COMMANDS.UPDATE_NSQS_AUTO_SYNC]: Parameters.UpdateNSQSAutoSync;
[WRITE_COMMANDS.UPDATE_NSQS_APPROVAL_ACCOUNT]: Parameters.UpdateNSQSApprovalAccount;
[WRITE_COMMANDS.CONNECT_POLICY_TO_NSQS]: Parameters.ConnectPolicyToNSQSParams;
[WRITE_COMMANDS.UPDATE_NSQS_CUSTOMERS_MAPPING]: Parameters.UpdateNSQSCustomersMappingParams;
[WRITE_COMMANDS.UPDATE_NSQS_PROJECTS_MAPPING]: Parameters.UpdateNSQSProjectsMappingParams;
[WRITE_COMMANDS.UPDATE_NSQS_EXPORTER]: Parameters.UpdateNSQSExporterParams;
[WRITE_COMMANDS.UPDATE_NSQS_EXPORT_DATE]: Parameters.UpdateNSQSExportDateParams;
[WRITE_COMMANDS.UPDATE_NSQS_AUTO_SYNC]: Parameters.UpdateNSQSAutoSyncParams;
[WRITE_COMMANDS.UPDATE_NSQS_APPROVAL_ACCOUNT]: Parameters.UpdateNSQSApprovalAccountParams;
[WRITE_COMMANDS.UPDATE_SAGE_INTACCT_ENTITY]: Parameters.UpdateSageIntacctGenericTypeParams<'entity', string>;
[WRITE_COMMANDS.UPDATE_SAGE_INTACCT_BILLABLE]: Parameters.UpdateSageIntacctGenericTypeParams<'enabled', boolean>;
[WRITE_COMMANDS.UPDATE_SAGE_INTACCT_DEPARTMENT_MAPPING]: Parameters.UpdateSageIntacctGenericTypeParams<'mapping', SageIntacctMappingValue>;
Expand Down Expand Up @@ -922,6 +924,7 @@ const READ_COMMANDS = {
SYNC_POLICY_TO_QUICKBOOKS_ONLINE: 'SyncPolicyToQuickbooksOnline',
SYNC_POLICY_TO_XERO: 'SyncPolicyToXero',
SYNC_POLICY_TO_NETSUITE: 'SyncPolicyToNetSuite',
SYNC_POLICY_TO_NSQS: 'SyncPolicyToNSQS',
SYNC_POLICY_TO_SAGE_INTACCT: 'SyncPolicyToSageIntacct',
SYNC_POLICY_TO_QUICKBOOKS_DESKTOP: 'SyncPolicyToQuickbooksDesktop',
OPEN_REIMBURSEMENT_ACCOUNT_PAGE: 'OpenReimbursementAccountPage',
Expand Down Expand Up @@ -986,6 +989,7 @@ type ReadCommandParameters = {
[READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_ONLINE]: Parameters.SyncPolicyToQuickbooksOnlineParams;
[READ_COMMANDS.SYNC_POLICY_TO_XERO]: Parameters.SyncPolicyToXeroParams;
[READ_COMMANDS.SYNC_POLICY_TO_NETSUITE]: Parameters.SyncPolicyToNetSuiteParams;
[READ_COMMANDS.SYNC_POLICY_TO_NSQS]: Parameters.SyncPolicyToNSQSParams;
[READ_COMMANDS.SYNC_POLICY_TO_SAGE_INTACCT]: Parameters.SyncPolicyToNetSuiteParams;
[READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_DESKTOP]: Parameters.SyncPolicyToQuickbooksDesktopParams;
[READ_COMMANDS.OPEN_REIMBURSEMENT_ACCOUNT_PAGE]: Parameters.OpenReimbursementAccountPageParams;
Expand Down
23 changes: 22 additions & 1 deletion src/libs/actions/connections/NSQS.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,33 @@
import Onyx, {OnyxUpdate} from 'react-native-onyx';

Check failure on line 1 in src/libs/actions/connections/NSQS.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Imports "OnyxUpdate" are only used as type
import {PartialDeep, ValueOf} from 'type-fest';
import * as API from '@libs/API';
import {ConnectPolicyToNSQSParams} from '@libs/API/parameters';
import {WRITE_COMMANDS} from '@libs/API/types';
import * as ErrorUtils from '@libs/ErrorUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import {Connections} from '@src/types/onyx/Policy';

function connectPolicyToNSQS(policyID: string) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policyID}`,
value: {
stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.NSQS_SYNC_CONNECTION,
connectionName: CONST.POLICY.CONNECTIONS.NAME.NSQS,
timestamp: new Date().toISOString(),
},
},
];

const params: ConnectPolicyToNSQSParams = {
policyID,
};

API.write(WRITE_COMMANDS.CONNECT_POLICY_TO_NSQS, params, {optimisticData});
}

function buildOnyxDataForNSQSConfiguration<TSettingName extends keyof Connections['nsqs']['config']>(
policyID: string,
settingName: TSettingName,
Expand Down Expand Up @@ -161,4 +182,4 @@ function updateNSQSApprovalAccount(policyID: string, value: string, oldValue: st
API.write(WRITE_COMMANDS.UPDATE_NSQS_APPROVAL_ACCOUNT, params, onyxData);
}

export {updateNSQSCustomersMapping, updateNSQSProjectsMapping, updateNSQSExporter, updateNSQSExportDate, updateNSQSAutoSync, updateNSQSApprovalAccount};
export {connectPolicyToNSQS, updateNSQSCustomersMapping, updateNSQSProjectsMapping, updateNSQSExporter, updateNSQSExportDate, updateNSQSAutoSync, updateNSQSApprovalAccount};
3 changes: 3 additions & 0 deletions src/libs/actions/connections/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,9 @@ function getSyncConnectionParameters(connectionName: PolicyConnectionName) {
case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: {
return {readCommand: READ_COMMANDS.SYNC_POLICY_TO_NETSUITE, stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.NETSUITE_SYNC_CONNECTION};
}
case CONST.POLICY.CONNECTIONS.NAME.NSQS: {
return {readCommand: READ_COMMANDS.SYNC_POLICY_TO_NSQS, stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.NSQS_SYNC_CONNECTION};
}
case CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT: {
return {readCommand: READ_COMMANDS.SYNC_POLICY_TO_SAGE_INTACCT, stageInProgress: CONST.POLICY.CONNECTIONS.SYNC_STAGE_NAME.SAGE_INTACCT_SYNC_CHECK_CONNECTION};
}
Expand Down
73 changes: 42 additions & 31 deletions src/pages/workspace/accounting/nsqs/NSQSSetupPage.tsx
Original file line number Diff line number Diff line change
@@ -1,62 +1,73 @@
import React, {useRef} from 'react';
import type {ComponentType, ForwardedRef} from 'react';
import React, {useCallback} from 'react';
import {View} from 'react-native';
import ConnectionLayout from '@components/ConnectionLayout';
import FormProvider from '@components/Form/FormProvider';
import InputWrapper from '@components/Form/InputWrapper';
import InteractiveStepSubHeader from '@components/InteractiveStepSubHeader';
import type {InteractiveStepSubHeaderHandle} from '@components/InteractiveStepSubHeader';
import {FormInputErrors, FormOnyxValues} from '@components/Form/types';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import Text from '@components/Text';
import TextInput from '@components/TextInput';
import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useLocalize from '@hooks/useLocalize';
import useSubStep from '@hooks/useSubStep';
import type {SubStepProps} from '@hooks/useSubStep/types';
import useThemeStyles from '@hooks/useThemeStyles';
import {isAuthenticationError} from '@libs/actions/connections';
import {connectPolicyToNSQS} from '@libs/actions/connections/NSQS';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections';
import withPolicyConnections from '@pages/workspace/withPolicyConnections';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import INPUT_IDS from '@src/types/form/NSQSOAuth2Form';
import {isEmptyObject} from '@src/types/utils/EmptyObject';

function NSQSSetupPage({policy}: WithPolicyConnectionsProps) {
const policyID = policy?.id ?? '-1';
const styles = useThemeStyles();
const {translate} = useLocalize();
const {inputCallbackRef} = useAutoFocusInput();

const shouldPageBeBlocked = !isEmptyObject(policy?.connections?.[CONST.POLICY.CONNECTIONS.NAME.NSQS]) && !isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.NSQS);
return (
// s77rt: do not use ConnectionLayout here. Just a regular ScreenWrapper
<ConnectionLayout
displayName={NSQSSetupPage.displayName}
headerTitle="workspace.nsqs.setup.title"
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.CONTROL]}
policyID={policyID}
featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED}
contentContainerStyle={[styles.flex1]}
titleStyle={styles.ph5}
connectionName={CONST.POLICY.CONNECTIONS.NAME.NSQS}
onBackButtonPress={() =>
Navigation.goBack(
ROUTES.WORKSPACE_ACCOUNTING_MULTI_CONNECTION_SELECTOR.getRoute(policyID, CONST.POLICY.CONNECTIONS.MULTI_CONNECTIONS_MAPPING[CONST.POLICY.CONNECTIONS.NAME.NSQS]),
)
const validate = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.NSQS_OAUTH2_FORM>) => {
const errors: FormInputErrors<typeof ONYXKEYS.FORMS.NSQS_OAUTH2_FORM> = {};
if (!values[INPUT_IDS.NSQS_ACCOUNT_ID]) {
ErrorUtils.addErrorMessage(errors, INPUT_IDS.NSQS_ACCOUNT_ID, translate('common.error.fieldRequired'));
}
shouldIncludeSafeAreaPaddingBottom
shouldLoadForEmptyConnection={isEmptyObject(policy?.connections?.[CONST.POLICY.CONNECTIONS.NAME.NSQS])}
shouldBeBlocked={shouldPageBeBlocked}
return errors;
},
[translate],
);

const connectPolicy = useCallback(
(formValues: FormOnyxValues<typeof ONYXKEYS.FORMS.NSQS_OAUTH2_FORM>) => {
// s77rt use formValues
connectPolicyToNSQS(policyID);
Navigation.dismissModal();
},
[policyID],
);

return (
<ScreenWrapper
includeSafeAreaPaddingBottom
shouldEnableMaxHeight
testID={NSQSSetupPage.displayName}
>
<HeaderWithBackButton
title={translate('workspace.nsqs.setup.title')}
onBackButtonPress={() =>
Navigation.goBack(
ROUTES.WORKSPACE_ACCOUNTING_MULTI_CONNECTION_SELECTOR.getRoute(policyID, CONST.POLICY.CONNECTIONS.MULTI_CONNECTIONS_MAPPING[CONST.POLICY.CONNECTIONS.NAME.NSQS]),
)
}
/>
<View style={[styles.flexGrow1, styles.ph5, styles.pt3]}>
<FormProvider
formID={ONYXKEYS.FORMS.NSQS_OAUTH2_FORM}
style={styles.flexGrow1}
// validate={() => null}
onSubmit={() => null}
validate={validate}
onSubmit={connectPolicy}
submitButtonText={translate('workspace.accounting.setup')}
enabledWhenOffline
shouldValidateOnBlur
shouldValidateOnChange
>
Expand All @@ -72,7 +83,7 @@ function NSQSSetupPage({policy}: WithPolicyConnectionsProps) {
/>
</FormProvider>
</View>
</ConnectionLayout>
</ScreenWrapper>
);
}

Expand Down
7 changes: 6 additions & 1 deletion src/types/onyx/Policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1119,7 +1119,12 @@ type NSQSConnectionConfig = OnyxCommon.OnyxValueWithOfflineFeedback<{
exporter: string;
exportDate: ValueOf<typeof CONST.NSQS_EXPORT_DATE>;
credentials: {
accountID: string;
// s77rt double check the field names (camel case)
accessToken: string;
companyID: string;
expires: string;
scope: string;
tokenType: string;
};
isConfigured: boolean;
approvalAccount: string;
Expand Down

0 comments on commit 0c271e5

Please sign in to comment.