Skip to content

Commit

Permalink
update API for QBD
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhenjaHorbach committed Oct 10, 2024
1 parent 9cbda7e commit cd6e9ba
Show file tree
Hide file tree
Showing 4 changed files with 194 additions and 21 deletions.
186 changes: 184 additions & 2 deletions src/libs/actions/connections/QuickbooksDesktop.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,46 @@
import isObject from 'lodash/isObject';
import type {OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import * as API from '@libs/API';
import type {ConnectPolicyToQuickBooksDesktopParams} from '@libs/API/parameters';
import type {ConnectPolicyToQuickBooksDesktopParams, UpdateManyPolicyConnectionConfigurationsParams, UpdatePolicyConnectionConfigParams} from '@libs/API/parameters';
import type UpdateQuickbooksDesktopGenericTypeParams from '@libs/API/parameters/UpdateQuickbooksDesktopGenericTypeParams';
import {SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
import * as ErrorUtils from '@libs/ErrorUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type * as OnyxCommon from '@src/types/onyx/OnyxCommon';
import type {Connections} from '@src/types/onyx/Policy';
import type {DeepPartial} from './index';

function createPendingFields<TSettingName extends keyof Connections['quickbooksDesktop']['config']['export']>(
settingName: TSettingName,
settingValue: Partial<Connections['quickbooksDesktop']['config']['export'][TSettingName]>,
pendingValue: OnyxCommon.PendingAction,
) {
if (!isObject(settingValue)) {
return {[settingName]: pendingValue};
}

return Object.keys(settingValue).reduce<Record<string, OnyxCommon.PendingAction>>((acc, setting) => {
acc[setting] = pendingValue;
return acc;
}, {});
}

function createErrorFields<TSettingName extends keyof Connections['quickbooksDesktop']['config']['export']>(
settingName: TSettingName,
settingValue: Partial<Connections['quickbooksDesktop']['config']['export'][TSettingName]>,
errorValue: OnyxCommon.Errors | null,
) {
if (!isObject(settingValue)) {
return {[settingName]: errorValue};
}

return Object.keys(settingValue).reduce<OnyxCommon.ErrorFields>((acc, setting) => {
acc[setting] = errorValue;
return acc;
}, {});
}

function buildOnyxDataForQuickbooksConfiguration<TSettingName extends keyof Connections['quickbooksDesktop']['config']>(
policyID: string,
Expand Down Expand Up @@ -87,6 +120,155 @@ function buildOnyxDataForQuickbooksConfiguration<TSettingName extends keyof Conn
};
}

// TODO: [QBD] Should be removed to use the new QBD API
// We use DeepPartial to allow partial updates to the config object
function updateManyExportConnectionConfigs<TConfigUpdate extends DeepPartial<Connections['quickbooksDesktop']['config']['export']>>(
policyID: string,
configUpdate: TConfigUpdate,
configCurrentData: TConfigUpdate,
) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
export: {
...configUpdate,
},
pendingFields: Object.fromEntries(Object.keys(configUpdate).map((settingName) => [settingName, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE])),
errorFields: Object.fromEntries(Object.keys(configUpdate).map((settingName) => [settingName, null])),
},
},
},
},
},
];

const failureData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
export: {
...configCurrentData,
},
pendingFields: Object.fromEntries(Object.keys(configUpdate).map((settingName) => [settingName, null])),
errorFields: Object.fromEntries(
Object.keys(configUpdate).map((settingName) => [settingName, ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')]),
),
},
},
},
},
},
];

const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
pendingFields: Object.fromEntries(Object.keys(configUpdate).map((settingName) => [settingName, null])),
errorFields: Object.fromEntries(Object.keys(configUpdate).map((settingName) => [settingName, null])),
},
},
},
},
},
];

const parameters: UpdateManyPolicyConnectionConfigurationsParams = {
policyID,
connectionName: CONST.POLICY.CONNECTIONS.NAME.QBD,
configUpdate: JSON.stringify({export: configUpdate}),
idempotencyKey: Object.keys(configUpdate).join(','),
};
API.write(WRITE_COMMANDS.UPDATE_MANY_POLICY_CONNECTION_CONFIGS, parameters, {optimisticData, failureData, successData});
}

// TODO: [QBD] Should be removed to use the new QBD API
function updateExportConnectionConfig<TSettingName extends keyof Connections['quickbooksDesktop']['config']['export']>(
policyID: string,
settingName: TSettingName,
settingValue: Partial<Connections['quickbooksDesktop']['config']['export'][TSettingName]>,
oldSettingValue?: Partial<Connections['quickbooksDesktop']['config']['export'][TSettingName]>,
) {
const optimisticData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
export: {
[settingName]: settingValue ?? null,
},
pendingFields: createPendingFields(settingName, settingValue, CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE),
errorFields: createErrorFields(settingName, settingValue, null),
},
},
},
},
},
];

const failureData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
export: {
[settingName]: oldSettingValue ?? null,
},
pendingFields: createPendingFields(settingName, settingValue, null),
errorFields: createErrorFields(settingName, settingValue, ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')),
},
},
},
},
},
];

const successData: OnyxUpdate[] = [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
value: {
connections: {
[CONST.POLICY.CONNECTIONS.NAME.QBD]: {
config: {
pendingFields: createPendingFields(settingName, settingValue, null),
errorFields: createErrorFields(settingName, settingValue, null),
},
},
},
},
},
];

const parameters: UpdatePolicyConnectionConfigParams = {
policyID,
connectionName: CONST.POLICY.CONNECTIONS.NAME.QBD,
settingName: String('export'),
settingValue: JSON.stringify({[settingName]: settingValue}),
idempotencyKey: String('export'),
};
API.write(WRITE_COMMANDS.UPDATE_POLICY_CONNECTION_CONFIG, parameters, {optimisticData, failureData, successData});
}

function getQuickbooksDesktopCodatSetupLink(policyID: string) {
const params: ConnectPolicyToQuickBooksDesktopParams = {policyID};

Expand All @@ -109,4 +291,4 @@ function updateQuickbooksDesktopMarkChecksToBePrinted<TSettingValue extends Conn
API.write(WRITE_COMMANDS.UPDATE_QUICKBOOKS_DESKTOP_MARK_CHECKS_TO_BE_PRINTED, parameters, onyxData);
}

export {updateQuickbooksDesktopMarkChecksToBePrinted, getQuickbooksDesktopCodatSetupLink};
export {updateQuickbooksDesktopMarkChecksToBePrinted, updateExportConnectionConfig, getQuickbooksDesktopCodatSetupLink, updateManyExportConnectionConfigs};
2 changes: 2 additions & 0 deletions src/libs/actions/connections/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,8 @@ function isConnectionInProgress(connectionSyncProgress: OnyxEntry<PolicyConnecti
);
}

export type {DeepPartial};

export {
removePolicyConnection,
updatePolicyConnectionConfig,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Connections from '@libs/actions/connections/index';
import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop';
import * as ErrorUtils from '@libs/ErrorUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
import Navigation from '@navigation/Navigation';
Expand Down Expand Up @@ -70,13 +70,7 @@ function QuickbooksDesktopOutOfPocketExpenseAccountSelectPage({policy}: WithPoli
const selectExportAccount = useCallback(
(row: CardListItem) => {
if (row.value.id !== qbdConfig?.export?.reimbursableAccount) {
Connections.updatePolicyConnectionConfig(
policyID,
CONST.POLICY.CONNECTIONS.NAME.QBD,
'export',
{[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: row.value.id},
{[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: qbdConfig?.export?.reimbursableAccount},
);
QuickbooksDesktop.updateExportConnectionConfig(policyID, CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT, row.value.id, qbdConfig?.export?.reimbursableAccount);
}
Navigation.goBack(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT_OUT_OF_POCKET_EXPENSES.getRoute(policyID));
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type {SelectorType} from '@components/SelectionScreen';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Connections from '@libs/actions/connections';
import * as QuickbooksDesktop from '@libs/actions/connections/QuickbooksDesktop';
import * as ErrorUtils from '@libs/ErrorUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
import Navigation from '@navigation/Navigation';
Expand Down Expand Up @@ -67,20 +67,15 @@ function QuickbooksDesktopOutOfPocketExpenseEntitySelectPage({policy}: WithPolic
const selectExportEntity = useCallback(
(row: MenuItem) => {
if (row.value !== reimbursable) {
Connections.updateManyPolicyConnectionConfigs(
QuickbooksDesktop.updateManyExportConnectionConfigs(
policyID,
CONST.POLICY.CONNECTIONS.NAME.QBD,
{
export: {
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: row.value,
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: row.accounts.at(0)?.id ?? '',
},
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: row.value,
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: row.accounts.at(0)?.id ?? '',
},
{
export: {
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: reimbursable,
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: qbdConfig?.export?.reimbursableAccount,
},
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE]: reimbursable,
[CONST.QUICKBOOKS_DESKTOP_CONFIG.REIMBURSABLE_ACCOUNT]: qbdConfig?.export?.reimbursableAccount,
},
);
}
Expand Down

0 comments on commit cd6e9ba

Please sign in to comment.