diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 94d41064bc85..639f13a0cf68 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -2846,6 +2846,7 @@ const CONST = { NON_REIMBURSABLE_EXPENSES_EXPORT_DESTINATION: 'nonreimbursableExpensesExportDestination', DEFAULT_VENDOR: 'defaultVendor', TRAVEL_INVOICING_PAYABLE_ACCOUNT: 'travelInvoicingPayableAccountID', + TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE: 'travelInvoicingJournalPostingPreference', REIMBURSABLE_PAYABLE_ACCOUNT: 'reimbursablePayableAccount', PAYABLE_ACCT: 'payableAcct', JOURNAL_POSTING_PREFERENCE: 'journalPostingPreference', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 3db413fbb79e..c1f8e6e2dff9 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -2038,6 +2038,10 @@ const ROUTES = { route: 'workspaces/:policyID/accounting/netsuite/export/travel-invoicing/payable-account', getRoute: (policyID: string) => `workspaces/${policyID}/accounting/netsuite/export/travel-invoicing/payable-account` as const, }, + POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT: { + route: 'workspaces/:policyID/accounting/netsuite/export/travel-invoicing/journal-posting-preference', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/netsuite/export/travel-invoicing/journal-posting-preference` as const, + }, POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_SELECT: { route: 'workspaces/:policyID/accounting/quickbooks-desktop/export/company-card-expense-account/card-select', getRoute: (policyID?: string, backTo?: string) => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 9ed276e2313c..ffdd2e13f6c3 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -560,6 +560,7 @@ const SCREENS = { QUICKBOOKS_ONLINE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT: 'Workspace_Accounting_Quickbooks_Online_Travel_Invoicing_Payable_Account_Select', NETSUITE_TRAVEL_INVOICING_CONFIGURATION: 'Workspace_Accounting_NetSuite_Travel_Invoicing_Configuration', NETSUITE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT: 'Workspace_Accounting_NetSuite_Travel_Invoicing_Payable_Account_Select', + NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT: 'Workspace_Accounting_NetSuite_Travel_Invoicing_Journal_Posting_Preference_Select', DYNAMIC_QUICKBOOKS_ONLINE_EXPORT_OUT_OF_POCKET_EXPENSES: 'Dynamic_Workspace_Accounting_Quickbooks_Online_Export_Out_Of_Pocket_Expenses', DYNAMIC_QUICKBOOKS_ONLINE_EXPORT_OUT_OF_POCKET_EXPENSES_SELECT: 'Dynamic_Workspace_Accounting_Quickbooks_Online_Export_Out_Of_Pocket_Expenses_Select', DYNAMIC_QUICKBOOKS_ONLINE_EXPORT_OUT_OF_POCKET_EXPENSES_ACCOUNT_SELECT: 'Dynamic_Workspace_Accounting_Quickbooks_Online_Export_Out_Of_Pocket_Expenses_Account_Select', diff --git a/src/languages/de.ts b/src/languages/de.ts index fdb762e2e214..386c9c0764ad 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -4799,8 +4799,8 @@ ${amount} für ${merchant} – ${date}`, journalPostingPreference: { label: 'Bevorzugte Verbuchung von Journalbuchungen', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Einzelner, aufgeschlüsselter Eintrag für jeden Bericht', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Einzelner Eintrag für jede Ausgabe', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Einzelner Eintrag für jede Ausgabe', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Einzelner, aufgegliederter Eintrag für jeden Bericht', }, }, invoiceItem: { diff --git a/src/languages/en.ts b/src/languages/en.ts index cac02cf645e0..c91df9d5c7a1 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4867,8 +4867,8 @@ const translations = { journalPostingPreference: { label: 'Journal entries posting preference', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Single, itemized entry for each report', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Single entry for each expense', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Single entry for each expense', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Single, itemized entry for each report', }, }, invoiceItem: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 8c7ab6cbfab2..356dadd65efb 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4696,8 +4696,8 @@ ${amount} para ${merchant} - ${date}`, journalPostingPreference: { label: 'Preferencia de registro de asientos contables', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Entrada única y detallada para cada informe', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Entrada única para cada gasto individual', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Entrada única para cada gasto individual', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Entrada única y detallada para cada informe', }, }, invoiceItem: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 055ebb274408..19ac00f8cd2a 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -4809,8 +4809,8 @@ ${amount} pour ${merchant} - ${date}`, journalPostingPreference: { label: 'Préférence de comptabilisation des écritures de journal', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Saisie unique et détaillée pour chaque note de frais', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Une seule entrée pour chaque dépense', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Saisie unique pour chaque dépense', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Entrée unique et détaillée pour chaque rapport', }, }, invoiceItem: { diff --git a/src/languages/it.ts b/src/languages/it.ts index ad13a9a37379..abde14c36084 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -4784,8 +4784,8 @@ ${amount} per ${merchant} - ${date}`, journalPostingPreference: { label: 'Preferenze di registrazione delle scritture contabili', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Voce singola, con dettagli per ogni report', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Voce singola per ogni spesa', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Voce singola per ogni spesa', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Voce singola e dettagliata per ogni report', }, }, invoiceItem: { diff --git a/src/languages/ja.ts b/src/languages/ja.ts index f9e27c2a1c63..df36562af33e 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -4740,8 +4740,8 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' journalPostingPreference: { label: '仕訳の記帳設定', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: '各レポートごとの単一の項目別エントリ', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: '各経費につき1件の入力', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: '各経費につき1件の入力', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: '各レポートごとの単一の明細エントリ', }, }, invoiceItem: { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 0945290861e6..cb5f43ddbdf8 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -4774,8 +4774,8 @@ ${amount} voor ${merchant} - ${date}`, journalPostingPreference: { label: 'Voorkeur voor het boeken van journaalposten', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Enkele, uitgesplitste boeking voor elk rapport', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Eén boeking per uitgave', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Enkele boeking per uitgave', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Enkele, uitgesplitste boeking per rapport', }, }, invoiceItem: { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index d8d87c255a50..646b582eda7b 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -4767,8 +4767,8 @@ ${amount} dla ${merchant} - ${date}`, journalPostingPreference: { label: 'Preferencje księgowania zapisów w dzienniku', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Pojedynczy, wyszczególniony wpis dla każdego raportu', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Pojedynczy wpis dla każdego wydatku', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Pojedynczy wpis dla każdego wydatku', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Pojedyncza, wyszczególniona pozycja dla każdego raportu', }, }, invoiceItem: { diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 110bed9e070b..4f841435ce3b 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -4770,8 +4770,8 @@ ${amount} para ${merchant} - ${date}`, journalPostingPreference: { label: 'Preferência de lançamento de lançamentos contábeis', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Lançamento único, detalhado, para cada relatório', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Lançamento único para cada despesa', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: 'Lançamento único para cada despesa', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: 'Lançamento único e detalhado para cada relatório', }, }, invoiceItem: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 4edd3b28c64c..a0605e412e1e 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -4660,8 +4660,8 @@ ${amount},商户:${merchant} - 日期:${date}`, journalPostingPreference: { label: '日记账分录过账偏好', values: { - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: '每个报表使用单独的分项条目', - [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: '每笔报销一条记录', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE]: '每笔报销仅一条记录', + [CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_TOTAL_LINE]: '每份报表使用单一分项明细记录', }, }, invoiceItem: { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 4ee7028f38b4..0da730f400cd 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -625,6 +625,8 @@ const SettingsModalStackNavigator = createModalStackNavigator('../../../../pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingConfigurationPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT]: () => require('../../../../pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingPayableAccountSelectPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT]: () => + require('../../../../pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage').default, [SCREENS.WORKSPACE.ACCOUNTING.DYNAMIC_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT]: () => require('../../../../pages/workspace/accounting/qbd/export/DynamicQuickbooksDesktopCompanyCardExpenseAccountSelectPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_COMPANY_CARD_SELECT]: () => diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index db8478ad8163..b32dad6d232e 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -54,6 +54,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT]: { path: ROUTES.POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT.route, }, + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT]: { + path: ROUTES.POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT.route, + }, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_ADVANCED]: { path: ROUTES.WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_ADVANCED.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index d12e07fc74db..cbe6ae92f2f7 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -785,6 +785,9 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_PAYABLE_ACCOUNT_SELECT]: { policyID: string; }; + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT]: { + policyID: string; + }; [SCREENS.WORKSPACE.ACCOUNTING.DYNAMIC_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT_SELECT]: { policyID: string; }; diff --git a/src/libs/actions/connections/NetSuiteCommands.ts b/src/libs/actions/connections/NetSuiteCommands.ts index 07a8fed8c52e..698ebb1c46f6 100644 --- a/src/libs/actions/connections/NetSuiteCommands.ts +++ b/src/libs/actions/connections/NetSuiteCommands.ts @@ -1071,6 +1071,21 @@ function updateNetSuiteTravelInvoicingPayableAccount(policyID: string, accountID API.write(WRITE_COMMANDS.UPDATE_MANY_POLICY_CONNECTION_CONFIGS, parameters, onyxData); } +function updateNetSuiteTravelInvoicingJournalPostingPreference( + policyID: string, + postingPreference: ValueOf, + oldPostingPreference?: ValueOf, +) { + const onyxData = updateNetSuiteOnyxData(policyID, CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE, postingPreference, oldPostingPreference); + const parameters: UpdateManyPolicyConnectionConfigurationsParams = { + policyID, + connectionName: CONST.POLICY.CONNECTIONS.NAME.NETSUITE, + configUpdate: JSON.stringify({[CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE]: postingPreference}), + idempotencyKey: CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE, + }; + API.write(WRITE_COMMANDS.UPDATE_MANY_POLICY_CONNECTION_CONFIGS, parameters, onyxData); +} + export { connectPolicyToNetSuite, updateNetSuiteTokens, @@ -1111,4 +1126,5 @@ export { updateNetSuiteCustomersJobsMapping, updateNetSuiteAccountingMethod, updateNetSuiteTravelInvoicingPayableAccount, + updateNetSuiteTravelInvoicingJournalPostingPreference, }; diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx index 98d80893b7ea..b8afb277e40c 100644 --- a/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx +++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage.tsx @@ -146,7 +146,7 @@ function NetSuiteExportConfigurationPage({policy}: WithPolicyConnectionsProps) { title: travelPayableAccount?.name, description: translate('workspace.common.travelInvoicing'), onPress: !policyID ? undefined : () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_CONFIGURATION.getRoute(policyID)), - subscribedSettings: [CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_PAYABLE_ACCOUNT], + subscribedSettings: [CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_PAYABLE_ACCOUNT, CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE], shouldHide: !isTravelInvoicingEnabled, }, { diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingConfigurationPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingConfigurationPage.tsx index 65c100d96d87..2cc0a32a660c 100644 --- a/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingConfigurationPage.tsx +++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingConfigurationPage.tsx @@ -24,6 +24,7 @@ type NetSuiteSectionType = { }; const payableAccountSetting = [CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_PAYABLE_ACCOUNT]; +const journalPostingPreferenceSetting = [CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE]; function NetSuiteTravelInvoicingConfigurationPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); @@ -50,6 +51,21 @@ function NetSuiteTravelInvoicingConfigurationPage({policy}: WithPolicyConnection pendingAction: settingsPendingAction(payableAccountSetting, config?.pendingFields), brickRoadIndicator: areSettingsInErrorFields(payableAccountSetting, config?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, + { + title: config?.travelInvoicingJournalPostingPreference + ? translate(`workspace.netsuite.journalPostingPreference.values.${config.travelInvoicingJournalPostingPreference}`) + : translate(`workspace.netsuite.journalPostingPreference.values.${CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE}`), + description: translate('workspace.netsuite.journalPostingPreference.label'), + onPress: () => { + if (!policyID) { + return; + } + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE_SELECT.getRoute(policyID)); + }, + subscribedSettings: journalPostingPreferenceSetting, + pendingAction: settingsPendingAction(journalPostingPreferenceSetting, config?.pendingFields), + brickRoadIndicator: areSettingsInErrorFields(journalPostingPreferenceSetting, config?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, + }, ]; return ( diff --git a/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage.tsx b/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage.tsx new file mode 100644 index 000000000000..a6fa98ddbf41 --- /dev/null +++ b/src/pages/workspace/accounting/netsuite/export/NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage.tsx @@ -0,0 +1,69 @@ +import type {ValueOf} from 'type-fest'; +import type {ListItem} from '@components/SelectionList/types'; +import SelectionScreen from '@components/SelectionScreen'; +import type {SelectorType} from '@components/SelectionScreen'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {updateNetSuiteTravelInvoicingJournalPostingPreference} from '@libs/actions/connections/NetSuiteCommands'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import Navigation from '@navigation/Navigation'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import {clearNetSuiteErrorField} from '@userActions/Policy/Policy'; +import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; + +type MenuListItem = ListItem & { + value: ValueOf; +}; + +function NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id ?? String(CONST.DEFAULT_NUMBER_ID); + const config = policy?.connections?.netsuite?.options.config; + + const selectedValue = + Object.values(CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE).find((value) => value === config?.travelInvoicingJournalPostingPreference) ?? + CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE.JOURNALS_POSTING_INDIVIDUAL_LINE; + + const data: MenuListItem[] = Object.values(CONST.NETSUITE_JOURNAL_POSTING_PREFERENCE).map((postingPreference) => ({ + value: postingPreference, + text: translate(`workspace.netsuite.journalPostingPreference.values.${postingPreference}`), + keyForList: postingPreference, + isSelected: selectedValue === postingPreference, + })); + + const goBack = () => { + Navigation.goBack(ROUTES.POLICY_ACCOUNTING_NETSUITE_TRAVEL_INVOICING_CONFIGURATION.getRoute(policyID)); + }; + + const selectPostingPreference = (row: MenuListItem) => { + if (row.value !== config?.travelInvoicingJournalPostingPreference) { + updateNetSuiteTravelInvoicingJournalPostingPreference(policyID, row.value, config?.travelInvoicingJournalPostingPreference); + } + goBack(); + }; + + return ( + selectPostingPreference(selection as MenuListItem)} + initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList} + policyID={policyID} + accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} + featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED} + onBackButtonPress={goBack} + connectionName={CONST.POLICY.CONNECTIONS.NAME.NETSUITE} + pendingAction={settingsPendingAction([CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE], config?.pendingFields)} + errors={getLatestErrorField(config, CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE)} + errorRowStyles={[styles.ph5, styles.pv3]} + onClose={() => clearNetSuiteErrorField(policyID, CONST.NETSUITE_CONFIG.TRAVEL_INVOICING_JOURNAL_POSTING_PREFERENCE)} + /> + ); +} + +export default withPolicyConnections(NetSuiteTravelInvoicingJournalPostingPreferenceSelectPage); diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 9434b771fb98..8448fd36bf76 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -1086,6 +1086,9 @@ type NetSuiteConnectionConfig = OnyxCommon.OnyxValueWithOfflineFeedback< /** The payable account to use for Expensify Travel expenses when exporting to NetSuite */ travelInvoicingPayableAccountID?: string; + /** Whether Travel Invoicing JEs post as individual entries per expense or a single grouped entry */ + travelInvoicingJournalPostingPreference?: NetSuiteJournalPostingPreferences; + /** The provincial tax account for tax line items in NetSuite (only for Canadian Subsidiaries) */ provincialTaxPostingAccount?: string;