From 0f1ad0ca2fbfdc1f791f0119957ff2b27418ec8f Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Mon, 26 Aug 2024 23:18:51 +0530 Subject: [PATCH 1/6] feat: add new apis --- src/libs/API/types.ts | 3 ++ src/libs/actions/connections/Xero.ts | 55 +++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 943cf8febc1e..e0ec009efeb4 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -340,6 +340,9 @@ const WRITE_COMMANDS = { UPDATE_XERO_IMPORT_TAX_RATES: 'UpdateXeroImportTaxRates', UPDATE_XERO_TENANT_ID: 'UpdateXeroTenantID', UPDATE_XERO_MAPPING: 'UpdateXeroMappings', + UPDATE_XERO_IMPORT_CUSTOMERS: 'UpdateXeroImportCustomers', + UPDATE_XERO_ENABLE_NEW_CATEGORIES: 'UpdateXeroEnableNewCategories', + UPDATE_XERO_AUTO_SYNC: 'UpdateXeroAutoSync', } as const; type WriteCommand = ValueOf; diff --git a/src/libs/actions/connections/Xero.ts b/src/libs/actions/connections/Xero.ts index fa08dec2e391..f9a8fac2bcd9 100644 --- a/src/libs/actions/connections/Xero.ts +++ b/src/libs/actions/connections/Xero.ts @@ -185,4 +185,57 @@ function updateXeroMappings(policyID: string, mappingValue: Partial, + oldImportCustomers?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(importCustomers), + idempotencyKey: String(CONST.XERO_CONFIG.IMPORT_CUSTOMERS), + }; + + const {optimisticData, failureData, successData} = prepareXeroOptimisticData(policyID, CONST.XERO_CONFIG.IMPORT_CUSTOMERS, importCustomers, oldImportCustomers); + + API.write(WRITE_COMMANDS.UPDATE_XERO_IMPORT_CUSTOMERS, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroEnableNewCategories( + policyID: string, + enableNewCategories: Partial, + oldEnableNewCategories?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(enableNewCategories), + idempotencyKey: String(CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES), + }; + + const {optimisticData, failureData, successData} = prepareXeroOptimisticData(policyID, CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES, enableNewCategories, oldEnableNewCategories); + + API.write(WRITE_COMMANDS.UPDATE_XERO_ENABLE_NEW_CATEGORIES, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroAutoSync(policyID: string, autoSync: Partial, oldAutoSync?: Partial) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(autoSync), + idempotencyKey: String(CONST.XERO_CONFIG.AUTO_SYNC), + }; + + const {optimisticData, failureData, successData} = prepareXeroOptimisticData(policyID, CONST.XERO_CONFIG.AUTO_SYNC, autoSync, oldAutoSync); + + API.write(WRITE_COMMANDS.UPDATE_XERO_AUTO_SYNC, parameters, {optimisticData, failureData, successData}); +} + +export { + getXeroSetupLink, + getTrackingCategories, + updateXeroImportTrackingCategories, + updateXeroImportTaxRates, + updateXeroTenantID, + updateXeroMappings, + updateXeroImportCustomers, + updateXeroEnableNewCategories, +}; From d24e628291cbd0a9064c525c655e7cbd42b68f01 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 3 Sep 2024 20:33:36 +0530 Subject: [PATCH 2/6] feat: added api types --- src/libs/API/types.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 8991f11101e5..552a628aa86a 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -351,6 +351,13 @@ const WRITE_COMMANDS = { UPDATE_XERO_IMPORT_CUSTOMERS: 'UpdateXeroImportCustomers', UPDATE_XERO_ENABLE_NEW_CATEGORIES: 'UpdateXeroEnableNewCategories', UPDATE_XERO_AUTO_SYNC: 'UpdateXeroAutoSync', + UPDATE_XERO_EXPORT_BILL_STATUS: 'UpdateXeroExportBillStatus', + UPDATE_XERO_EXPORT_BILL_DATE: 'UpdateXeroExportBillDate', + UPDATE_XERO_EXPORT_EXPORTER: 'UpdateXeroExportExporter', + UPDATE_XERO_EXPORT_NON_REIMBURSABLE_ACCOUNT: 'UpdateXeroExportNonReimbursableAccount', + UPDATE_XERO_SYNC_INVOICE_COLLECTIONS_ACCOUNT_ID: 'UpdateXeroSyncInvoiceCollectionsAccountID', + UPDATE_XERO_SYNC_SYNC_REIMBURSED_REPORTS: 'UpdateXeroSyncSyncReimbursedReports', + UPDATE_XERO_SYNC_REIMBURSEMENT_ACCOUNT_ID: 'UpdateXeroSyncReimbursementAccountID', SET_COMPANY_CARD_FEED_NAME: 'SetFeedName', DELETE_COMPANY_CARD_FEED: 'RemoveFeed', SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability', @@ -713,6 +720,17 @@ type WriteCommandParameters = { [WRITE_COMMANDS.UPDATE_XERO_IMPORT_TAX_RATES]: Parameters.UpdateXeroGenericTypeParams; [WRITE_COMMANDS.UPDATE_XERO_MAPPING]: Parameters.UpdateXeroGenericTypeParams; [WRITE_COMMANDS.UPDATE_XERO_IMPORT_TRACKING_CATEGORIES]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_IMPORT_CUSTOMERS]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_ENABLE_NEW_CATEGORIES]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_AUTO_SYNC]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_AUTO_SYNC]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_EXPORT_BILL_STATUS]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_EXPORT_BILL_DATE]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_EXPORT_EXPORTER]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_EXPORT_NON_REIMBURSABLE_ACCOUNT]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_SYNC_INVOICE_COLLECTIONS_ACCOUNT_ID]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_SYNC_SYNC_REIMBURSED_REPORTS]: Parameters.UpdateXeroGenericTypeParams; + [WRITE_COMMANDS.UPDATE_XERO_SYNC_REIMBURSEMENT_ACCOUNT_ID]: Parameters.UpdateXeroGenericTypeParams; }; const READ_COMMANDS = { From 66ad3f4d735e3e7093d1931fd731c1885c605f04 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 3 Sep 2024 20:42:00 +0530 Subject: [PATCH 3/6] feat: added api calls for xero export --- src/libs/actions/connections/Xero.ts | 165 +++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/src/libs/actions/connections/Xero.ts b/src/libs/actions/connections/Xero.ts index f9a8fac2bcd9..fbdd7f28a7ff 100644 --- a/src/libs/actions/connections/Xero.ts +++ b/src/libs/actions/connections/Xero.ts @@ -47,6 +47,21 @@ function createXeroPendingFields( + settingName: TSettingName, + settingValue: Partial, + pendingValue: OnyxCommon.PendingAction, +) { + if (!isObject(settingValue)) { + return {[settingName]: pendingValue}; + } + + return Object.keys(settingValue).reduce>((acc, setting) => { + acc[setting] = pendingValue; + return acc; + }, {}); +} + function createXeroErrorFields( settingName: TSettingName, settingValue: Partial, @@ -62,6 +77,21 @@ function createXeroErrorFields( + settingName: TSettingName, + settingValue: Partial, + errorValue: OnyxCommon.Errors | null, +) { + if (!isObject(settingValue)) { + return {[settingName]: errorValue}; + } + + return Object.keys(settingValue).reduce((acc, setting) => { + acc[setting] = errorValue; + return acc; + }, {}); +} + function prepareXeroOptimisticData( policyID: string, settingName: TSettingName, @@ -124,6 +154,72 @@ function prepareXeroOptimisticData( + policyID: string, + settingName: TSettingName, + settingValue: Partial, + oldSettingValue?: Partial | null, +) { + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + export: { + [settingName]: settingValue ?? null, + }, + pendingFields: createXeroExportPendingFields(settingName, settingValue, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE), + errorFields: createXeroExportErrorFields(settingName, settingValue, null), + }, + }, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + export: { + [settingName]: oldSettingValue ?? null, + }, + pendingFields: createXeroExportPendingFields(settingName, settingValue, null), + errorFields: createXeroExportErrorFields(settingName, settingValue, ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')), + }, + }, + }, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + pendingFields: createXeroExportPendingFields(settingName, settingValue, null), + errorFields: createXeroExportErrorFields(settingName, settingValue, null), + }, + }, + }, + }, + }, + ]; + + return {optimisticData, failureData, successData}; +} + function updateXeroImportTrackingCategories( policyID: string, importTrackingCategories: Partial, @@ -229,6 +325,70 @@ function updateXeroAutoSync(policyID: string, autoSync: Partial, + oldBillStatus?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(billStatus), + idempotencyKey: String(CONST.XERO_CONFIG.BILL_STATUS), + }; + + const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData(policyID, CONST.XERO_CONFIG.BILL_STATUS, billStatus, oldBillStatus); + + API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_BILL_STATUS, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroExportBillExporter( + policyID: string, + exporter: Partial, + oldExporter?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(exporter), + idempotencyKey: String(CONST.XERO_CONFIG.EXPORTER), + }; + + const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData(policyID, CONST.XERO_CONFIG.EXPORTER, exporter, oldExporter); + + API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_EXPORTER, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroExportBillDate( + policyID: string, + billDate: Partial, + oldBillDate?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(billDate), + idempotencyKey: String(CONST.XERO_CONFIG.BILL_DATE), + }; + + const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData(policyID, CONST.XERO_CONFIG.BILL_DATE, billDate, oldBillDate); + + API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_BILL_DATE, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroExportNonReimbursableAccount( + policyID: string, + nonReimbursableAccount: Partial, + oldNonReimbursableAccount?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(nonReimbursableAccount), + idempotencyKey: String(CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT), + }; + + const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData(policyID, CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT, nonReimbursableAccount, oldNonReimbursableAccount); + + API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_NON_REIMBURSABLE_ACCOUNT, parameters, {optimisticData, failureData, successData}); +} + export { getXeroSetupLink, getTrackingCategories, @@ -238,4 +398,9 @@ export { updateXeroMappings, updateXeroImportCustomers, updateXeroEnableNewCategories, + updateXeroAutoSync, + updateXeroExportBillStatus, + updateXeroExportBillExporter, + updateXeroExportBillDate, + updateXeroExportNonReimbursableAccount }; From d00e8483d51a11736a0a38612d9f9a9978d243b0 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 3 Sep 2024 21:33:03 +0530 Subject: [PATCH 4/6] feat: added sync commands --- src/libs/actions/connections/Xero.ts | 161 ++++++++++++++++++++++++++- 1 file changed, 159 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/connections/Xero.ts b/src/libs/actions/connections/Xero.ts index fbdd7f28a7ff..a0f0d18ba2e4 100644 --- a/src/libs/actions/connections/Xero.ts +++ b/src/libs/actions/connections/Xero.ts @@ -62,6 +62,21 @@ function createXeroExportPendingFields( + settingName: TSettingName, + settingValue: Partial, + pendingValue: OnyxCommon.PendingAction, +) { + if (!isObject(settingValue)) { + return {[settingName]: pendingValue}; + } + + return Object.keys(settingValue).reduce>((acc, setting) => { + acc[setting] = pendingValue; + return acc; + }, {}); +} + function createXeroErrorFields( settingName: TSettingName, settingValue: Partial, @@ -92,6 +107,21 @@ function createXeroExportErrorFields( + settingName: TSettingName, + settingValue: Partial, + errorValue: OnyxCommon.Errors | null, +) { + if (!isObject(settingValue)) { + return {[settingName]: errorValue}; + } + + return Object.keys(settingValue).reduce((acc, setting) => { + acc[setting] = errorValue; + return acc; + }, {}); +} + function prepareXeroOptimisticData( policyID: string, settingName: TSettingName, @@ -220,6 +250,72 @@ function prepareXeroExportOptimisticData( + policyID: string, + settingName: TSettingName, + settingValue: Partial, + oldSettingValue?: Partial | null, +) { + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + sync: { + [settingName]: settingValue ?? null, + }, + pendingFields: createXeroSyncPendingFields(settingName, settingValue, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE), + errorFields: createXeroSyncErrorFields(settingName, settingValue, null), + }, + }, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + sync: { + [settingName]: oldSettingValue ?? null, + }, + pendingFields: createXeroSyncPendingFields(settingName, settingValue, null), + errorFields: createXeroSyncErrorFields(settingName, settingValue, ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')), + }, + }, + }, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + xero: { + config: { + pendingFields: createXeroSyncPendingFields(settingName, settingValue, null), + errorFields: createXeroSyncErrorFields(settingName, settingValue, null), + }, + }, + }, + }, + }, + ]; + + return {optimisticData, failureData, successData}; +} + function updateXeroImportTrackingCategories( policyID: string, importTrackingCategories: Partial, @@ -384,11 +480,69 @@ function updateXeroExportNonReimbursableAccount( idempotencyKey: String(CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT), }; - const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData(policyID, CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT, nonReimbursableAccount, oldNonReimbursableAccount); + const {optimisticData, failureData, successData} = prepareXeroExportOptimisticData( + policyID, + CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT, + nonReimbursableAccount, + oldNonReimbursableAccount, + ); API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_NON_REIMBURSABLE_ACCOUNT, parameters, {optimisticData, failureData, successData}); } +function updateXeroSyncInvoiceCollectionsAccountID( + policyID: string, + invoiceCollectionsAccountID: Partial, + oldInvoiceCollectionsAccountID?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(invoiceCollectionsAccountID), + idempotencyKey: String(CONST.XERO_CONFIG.INVOICE_COLLECTIONS_ACCOUNT_ID), + }; + + const {optimisticData, failureData, successData} = prepareXeroSyncOptimisticData( + policyID, + CONST.XERO_CONFIG.INVOICE_COLLECTIONS_ACCOUNT_ID, + invoiceCollectionsAccountID, + oldInvoiceCollectionsAccountID, + ); + + API.write(WRITE_COMMANDS.UPDATE_XERO_SYNC_INVOICE_COLLECTIONS_ACCOUNT_ID, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroSyncReimbursementAccountID( + policyID: string, + reimbursementAccountID: Partial, + oldReimbursementAccountID?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(reimbursementAccountID), + idempotencyKey: String(CONST.XERO_CONFIG.REIMBURSEMENT_ACCOUNT_ID), + }; + + const {optimisticData, failureData, successData} = prepareXeroSyncOptimisticData(policyID, CONST.XERO_CONFIG.REIMBURSEMENT_ACCOUNT_ID, reimbursementAccountID, oldReimbursementAccountID); + + API.write(WRITE_COMMANDS.UPDATE_XERO_SYNC_REIMBURSEMENT_ACCOUNT_ID, parameters, {optimisticData, failureData, successData}); +} + +function updateXeroSyncSyncReimbursedReports( + policyID: string, + syncReimbursedReports: Partial, + oldSyncReimbursedReports?: Partial, +) { + const parameters: UpdateXeroGenericTypeParams = { + policyID, + settingValue: JSON.stringify(syncReimbursedReports), + idempotencyKey: String(CONST.XERO_CONFIG.SYNC_REIMBURSED_REPORTS), + }; + + const {optimisticData, failureData, successData} = prepareXeroSyncOptimisticData(policyID, CONST.XERO_CONFIG.SYNC_REIMBURSED_REPORTS, syncReimbursedReports, oldSyncReimbursedReports); + + API.write(WRITE_COMMANDS.UPDATE_XERO_SYNC_SYNC_REIMBURSED_REPORTS, parameters, {optimisticData, failureData, successData}); +} + export { getXeroSetupLink, getTrackingCategories, @@ -402,5 +556,8 @@ export { updateXeroExportBillStatus, updateXeroExportBillExporter, updateXeroExportBillDate, - updateXeroExportNonReimbursableAccount + updateXeroExportNonReimbursableAccount, + updateXeroSyncInvoiceCollectionsAccountID, + updateXeroSyncSyncReimbursedReports, + updateXeroSyncReimbursementAccountID, }; From 99deae8438a55fdfbf4c48377743ec9834763deb Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Tue, 3 Sep 2024 21:58:10 +0530 Subject: [PATCH 5/6] refactor: replace the commands --- src/libs/actions/connections/Xero.ts | 4 ++-- .../xero/advanced/XeroAdvancedPage.tsx | 20 ++++--------------- .../XeroBillPaymentAccountSelectorPage.tsx | 12 ++--------- .../XeroInvoiceAccountSelectorPage.tsx | 12 ++--------- .../xero/export/XeroBankAccountSelectPage.tsx | 12 ++--------- .../XeroPreferredExporterSelectPage.tsx | 10 ++-------- .../export/XeroPurchaseBillDateSelectPage.tsx | 10 ++-------- .../XeroPurchaseBillStatusSelectorPage.tsx | 11 +++++----- .../xero/import/XeroChartOfAccountsPage.tsx | 12 ++--------- .../import/XeroCustomerConfigurationPage.tsx | 12 ++--------- 10 files changed, 25 insertions(+), 90 deletions(-) diff --git a/src/libs/actions/connections/Xero.ts b/src/libs/actions/connections/Xero.ts index a0f0d18ba2e4..2fc2560805aa 100644 --- a/src/libs/actions/connections/Xero.ts +++ b/src/libs/actions/connections/Xero.ts @@ -437,7 +437,7 @@ function updateXeroExportBillStatus( API.write(WRITE_COMMANDS.UPDATE_XERO_EXPORT_BILL_STATUS, parameters, {optimisticData, failureData, successData}); } -function updateXeroExportBillExporter( +function updateXeroExportExporter( policyID: string, exporter: Partial, oldExporter?: Partial, @@ -554,7 +554,7 @@ export { updateXeroEnableNewCategories, updateXeroAutoSync, updateXeroExportBillStatus, - updateXeroExportBillExporter, + updateXeroExportExporter, updateXeroExportBillDate, updateXeroExportNonReimbursableAccount, updateXeroSyncInvoiceCollectionsAccountID, diff --git a/src/pages/workspace/accounting/xero/advanced/XeroAdvancedPage.tsx b/src/pages/workspace/accounting/xero/advanced/XeroAdvancedPage.tsx index 287163ae69cc..0bc946c8d149 100644 --- a/src/pages/workspace/accounting/xero/advanced/XeroAdvancedPage.tsx +++ b/src/pages/workspace/accounting/xero/advanced/XeroAdvancedPage.tsx @@ -4,7 +4,6 @@ import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getCurrentXeroOrganizationName, settingsPendingAction} from '@libs/PolicyUtils'; @@ -12,6 +11,7 @@ import * as PolicyUtils from '@libs/PolicyUtils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import {updateXeroAutoSync, updateXeroSyncSyncReimbursedReports} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -59,14 +59,12 @@ function XeroAdvancedPage({policy}: WithPolicyConnectionsProps) { wrapperStyle={styles.mv3} isActive={!!autoSync?.enabled} onToggle={() => - Connections.updatePolicyXeroConnectionConfig( + updateXeroAutoSync( policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.AUTO_SYNC, { enabled: !autoSync?.enabled, }, - {enabled: autoSync?.enabled ?? null}, + {enabled: autoSync?.enabled ?? undefined}, ) } pendingAction={settingsPendingAction([CONST.XERO_CONFIG.ENABLED], pendingFields)} @@ -81,17 +79,7 @@ function XeroAdvancedPage({policy}: WithPolicyConnectionsProps) { shouldPlaceSubtitleBelowSwitch wrapperStyle={styles.mv3} isActive={!!sync?.syncReimbursedReports} - onToggle={() => - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.SYNC, - { - syncReimbursedReports: !sync?.syncReimbursedReports, - }, - {syncReimbursedReports: sync?.syncReimbursedReports ?? null}, - ) - } + onToggle={() => updateXeroSyncSyncReimbursedReports(policyID, !sync?.syncReimbursedReports, sync?.syncReimbursedReports)} pendingAction={settingsPendingAction([CONST.XERO_CONFIG.SYNC_REIMBURSED_REPORTS], pendingFields)} errors={ErrorUtils.getLatestErrorField(xeroConfig ?? {}, CONST.XERO_CONFIG.SYNC_REIMBURSED_REPORTS)} onCloseError={() => Policy.clearXeroErrorField(policyID, CONST.XERO_CONFIG.SYNC_REIMBURSED_REPORTS)} diff --git a/src/pages/workspace/accounting/xero/advanced/XeroBillPaymentAccountSelectorPage.tsx b/src/pages/workspace/accounting/xero/advanced/XeroBillPaymentAccountSelectorPage.tsx index 0e940435816a..df197b15778c 100644 --- a/src/pages/workspace/accounting/xero/advanced/XeroBillPaymentAccountSelectorPage.tsx +++ b/src/pages/workspace/accounting/xero/advanced/XeroBillPaymentAccountSelectorPage.tsx @@ -8,13 +8,13 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getXeroBankAccounts, settingsPendingAction} from '@libs/PolicyUtils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import variables from '@styles/variables'; +import {updateXeroSyncReimbursementAccountID} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -42,15 +42,7 @@ function XeroBillPaymentAccountSelectorPage({policy}: WithPolicyConnectionsProps const updateAccount = useCallback( ({value}: SelectorType) => { - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.SYNC, - { - reimbursementAccountID: value, - }, - {reimbursementAccountID: reimbursementAccountID ?? null}, - ); + updateXeroSyncReimbursementAccountID(policyID, value, reimbursementAccountID); Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_ADVANCED.getRoute(policyID)); }, [policyID, reimbursementAccountID], diff --git a/src/pages/workspace/accounting/xero/advanced/XeroInvoiceAccountSelectorPage.tsx b/src/pages/workspace/accounting/xero/advanced/XeroInvoiceAccountSelectorPage.tsx index de3b4be0b656..d3bf2c894039 100644 --- a/src/pages/workspace/accounting/xero/advanced/XeroInvoiceAccountSelectorPage.tsx +++ b/src/pages/workspace/accounting/xero/advanced/XeroInvoiceAccountSelectorPage.tsx @@ -8,13 +8,13 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getXeroBankAccounts, settingsPendingAction} from '@libs/PolicyUtils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import variables from '@styles/variables'; +import {updateXeroSyncInvoiceCollectionsAccountID} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -42,15 +42,7 @@ function XeroInvoiceAccountSelectorPage({policy}: WithPolicyConnectionsProps) { const updateAccount = useCallback( ({value}: SelectorType) => { - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.SYNC, - { - invoiceCollectionsAccountID: value, - }, - {invoiceCollectionsAccountID: invoiceCollectionsAccountID ?? null}, - ); + updateXeroSyncInvoiceCollectionsAccountID(policyID, value, invoiceCollectionsAccountID); Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_ADVANCED.getRoute(policyID)); }, [policyID, invoiceCollectionsAccountID], diff --git a/src/pages/workspace/accounting/xero/export/XeroBankAccountSelectPage.tsx b/src/pages/workspace/accounting/xero/export/XeroBankAccountSelectPage.tsx index 4dfd2e92bd0c..040b89a436e6 100644 --- a/src/pages/workspace/accounting/xero/export/XeroBankAccountSelectPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroBankAccountSelectPage.tsx @@ -8,7 +8,6 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getXeroBankAccounts} from '@libs/PolicyUtils'; @@ -16,6 +15,7 @@ import * as PolicyUtils from '@libs/PolicyUtils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import variables from '@styles/variables'; +import {updateXeroExportNonReimbursableAccount} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -46,15 +46,7 @@ function XeroBankAccountSelectPage({policy}: WithPolicyConnectionsProps) { const updateBankAccount = useCallback( ({value}: SelectorType) => { if (initiallyFocusedOptionKey !== value) { - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.EXPORT, - { - nonReimbursableAccount: value, - }, - {nonReimbursableAccount: config?.export?.nonReimbursableAccount ?? null}, - ); + updateXeroExportNonReimbursableAccount(policyID, value, config?.export?.nonReimbursableAccount); } Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT.getRoute(policyID)); }, diff --git a/src/pages/workspace/accounting/xero/export/XeroPreferredExporterSelectPage.tsx b/src/pages/workspace/accounting/xero/export/XeroPreferredExporterSelectPage.tsx index 7cbe523f859b..23d178c725fe 100644 --- a/src/pages/workspace/accounting/xero/export/XeroPreferredExporterSelectPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroPreferredExporterSelectPage.tsx @@ -8,13 +8,13 @@ import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import {getAdminEmployees, isExpensifyTeam} from '@libs/PolicyUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import {updateXeroExportExporter} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -67,13 +67,7 @@ function XeroPreferredExporterSelectPage({policy}: WithPolicyConnectionsProps) { const selectExporter = useCallback( (row: CardListItem) => { if (row.value !== config?.export?.exporter) { - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.EXPORT, - {exporter: row.value}, - {exporter: config?.export?.exporter ?? null}, - ); + updateXeroExportExporter(policyID, row.value, config?.export?.exporter); } Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT.getRoute(policyID)); }, diff --git a/src/pages/workspace/accounting/xero/export/XeroPurchaseBillDateSelectPage.tsx b/src/pages/workspace/accounting/xero/export/XeroPurchaseBillDateSelectPage.tsx index 57b37f13d648..b52eab4cfa32 100644 --- a/src/pages/workspace/accounting/xero/export/XeroPurchaseBillDateSelectPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroPurchaseBillDateSelectPage.tsx @@ -8,12 +8,12 @@ import type {SelectorType} from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import {updateXeroExportBillDate} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -47,13 +47,7 @@ function XeroPurchaseBillDateSelectPage({policy}: WithPolicyConnectionsProps) { const selectExportDate = useCallback( (row: MenuListItem) => { if (row.value !== config?.export?.billDate) { - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.EXPORT, - {billDate: row.value}, - {billDate: config?.export?.billDate ?? null}, - ); + updateXeroExportBillDate(policyID, row.value, config?.export?.billDate); } Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_EXPORT_PURCHASE_BILL_DATE_SELECT.getRoute(policyID)); }, diff --git a/src/pages/workspace/accounting/xero/export/XeroPurchaseBillStatusSelectorPage.tsx b/src/pages/workspace/accounting/xero/export/XeroPurchaseBillStatusSelectorPage.tsx index d1902f8a3c46..bf656da26fda 100644 --- a/src/pages/workspace/accounting/xero/export/XeroPurchaseBillStatusSelectorPage.tsx +++ b/src/pages/workspace/accounting/xero/export/XeroPurchaseBillStatusSelectorPage.tsx @@ -9,12 +9,12 @@ import type {SelectorType} from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import {updateXeroExportBillStatus} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -52,14 +52,13 @@ function XeroPurchaseBillStatusSelectorPage({policy}: WithPolicyConnectionsProps return; } if (row.value !== invoiceStatus) { - Connections.updatePolicyXeroConnectionConfig( + updateXeroExportBillStatus( policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.EXPORT, { - billStatus: {...config?.export?.billStatus, purchase: row.value}, + ...config?.export?.billStatus, + purchase: row.value, }, - {billStatus: config?.export?.billStatus ?? null}, + config?.export?.billStatus, ); } Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_BILL_STATUS_SELECTOR.getRoute(policyID)); diff --git a/src/pages/workspace/accounting/xero/import/XeroChartOfAccountsPage.tsx b/src/pages/workspace/accounting/xero/import/XeroChartOfAccountsPage.tsx index 20a6e24eb105..692c892e164e 100644 --- a/src/pages/workspace/accounting/xero/import/XeroChartOfAccountsPage.tsx +++ b/src/pages/workspace/accounting/xero/import/XeroChartOfAccountsPage.tsx @@ -6,13 +6,13 @@ import Switch from '@components/Switch'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import {settingsPendingAction} from '@libs/PolicyUtils'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import variables from '@styles/variables'; +import {updateXeroEnableNewCategories} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; @@ -59,15 +59,7 @@ function XeroChartOfAccountsPage({policy}: WithPolicyProps) { switchAccessibilityLabel={translate('workspace.xero.accountsSwitchDescription')} shouldPlaceSubtitleBelowSwitch isActive={!!xeroConfig?.enableNewCategories} - onToggle={() => - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES, - !xeroConfig?.enableNewCategories, - xeroConfig?.enableNewCategories, - ) - } + onToggle={() => updateXeroEnableNewCategories(policyID, !xeroConfig?.enableNewCategories, xeroConfig?.enableNewCategories)} pendingAction={settingsPendingAction([CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES], xeroConfig?.pendingFields)} errors={ErrorUtils.getLatestErrorField(xeroConfig ?? {}, CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES)} onCloseError={() => Policy.clearXeroErrorField(policyID, CONST.XERO_CONFIG.ENABLE_NEW_CATEGORIES)} diff --git a/src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx b/src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx index 29c7125213d1..25e9af97ebba 100644 --- a/src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx +++ b/src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx @@ -3,12 +3,12 @@ import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Connections from '@libs/actions/connections'; import * as ErrorUtils from '@libs/ErrorUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; import type {WithPolicyProps} from '@pages/workspace/withPolicy'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import {updateXeroImportCustomers} from '@userActions/connections/Xero'; import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; @@ -42,15 +42,7 @@ function XeroCustomerConfigurationPage({policy}: WithPolicyProps) { /> } isActive={isSwitchOn} - onToggle={() => - Connections.updatePolicyXeroConnectionConfig( - policyID, - CONST.POLICY.CONNECTIONS.NAME.XERO, - CONST.XERO_CONFIG.IMPORT_CUSTOMERS, - !xeroConfig?.importCustomers, - xeroConfig?.importCustomers, - ) - } + onToggle={() => updateXeroImportCustomers(policyID, !xeroConfig?.importCustomers, xeroConfig?.importCustomers)} errors={ErrorUtils.getLatestErrorField(xeroConfig ?? {}, CONST.XERO_CONFIG.IMPORT_CUSTOMERS)} onCloseError={() => Policy.clearXeroErrorField(policyID, CONST.XERO_CONFIG.IMPORT_CUSTOMERS)} pendingAction={PolicyUtils.settingsPendingAction([CONST.XERO_CONFIG.IMPORT_CUSTOMERS], xeroConfig?.pendingFields)} From 6afdbba5522d4cd1e752929b579240031e123ba0 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Mon, 9 Sep 2024 04:35:16 +0530 Subject: [PATCH 6/6] fix: update string values --- src/libs/actions/connections/Xero.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/connections/Xero.ts b/src/libs/actions/connections/Xero.ts index 2fc2560805aa..1d16efe56984 100644 --- a/src/libs/actions/connections/Xero.ts +++ b/src/libs/actions/connections/Xero.ts @@ -444,7 +444,7 @@ function updateXeroExportExporter( ) { const parameters: UpdateXeroGenericTypeParams = { policyID, - settingValue: JSON.stringify(exporter), + settingValue: exporter, idempotencyKey: String(CONST.XERO_CONFIG.EXPORTER), }; @@ -460,7 +460,7 @@ function updateXeroExportBillDate( ) { const parameters: UpdateXeroGenericTypeParams = { policyID, - settingValue: JSON.stringify(billDate), + settingValue: billDate, idempotencyKey: String(CONST.XERO_CONFIG.BILL_DATE), }; @@ -476,7 +476,7 @@ function updateXeroExportNonReimbursableAccount( ) { const parameters: UpdateXeroGenericTypeParams = { policyID, - settingValue: JSON.stringify(nonReimbursableAccount), + settingValue: nonReimbursableAccount, idempotencyKey: String(CONST.XERO_CONFIG.NON_REIMBURSABLE_ACCOUNT), }; @@ -497,7 +497,7 @@ function updateXeroSyncInvoiceCollectionsAccountID( ) { const parameters: UpdateXeroGenericTypeParams = { policyID, - settingValue: JSON.stringify(invoiceCollectionsAccountID), + settingValue: invoiceCollectionsAccountID, idempotencyKey: String(CONST.XERO_CONFIG.INVOICE_COLLECTIONS_ACCOUNT_ID), }; @@ -518,7 +518,7 @@ function updateXeroSyncReimbursementAccountID( ) { const parameters: UpdateXeroGenericTypeParams = { policyID, - settingValue: JSON.stringify(reimbursementAccountID), + settingValue: reimbursementAccountID, idempotencyKey: String(CONST.XERO_CONFIG.REIMBURSEMENT_ACCOUNT_ID), };