Skip to content

Commit fc05e8f

Browse files
authored
Add new page for auto-config
Signed-off-by: GitHub <[email protected]>
1 parent 210db71 commit fc05e8f

File tree

13 files changed

+212
-12
lines changed

13 files changed

+212
-12
lines changed

src/CONST.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,6 +1848,11 @@ const CONST = {
18481848
NETSUITE_ADD_CUSTOM_SEGMENT_STEP_NAMES: ['1', '2,', '3', '4', '5', '6,'],
18491849
},
18501850

1851+
NETSUITE_ACCOUNTING_METHODS: {
1852+
ACCRUAL: 'ACCRUAL',
1853+
CASH: 'CASH',
1854+
},
1855+
18511856
NETSUITE_CUSTOM_FIELD_SUBSTEP_INDEXES: {
18521857
CUSTOM_LISTS: {
18531858
CUSTOM_LIST_PICKER: 0,

src/ROUTES.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,14 @@ const ROUTES = {
16261626
getRoute: (policyID: string, expenseType: ValueOf<typeof CONST.NETSUITE_EXPENSE_TYPE>) =>
16271627
`settings/workspaces/${policyID}/connections/netsuite/advanced/custom-form-id/${expenseType}` as const,
16281628
},
1629+
POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC: {
1630+
route: 'settings/workspaces/:policyID/connections/netsuite/advanced/autosync',
1631+
getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/autosync` as const,
1632+
},
1633+
POLICY_ACCOUNTING_NETSUITE_ACCOUNTING_METHOD: {
1634+
route: 'settings/workspaces/:policyID/connections/netsuite/advanced/autosync/accounting-method',
1635+
getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/advanced/autosync/accounting-method` as const,
1636+
},
16291637
POLICY_ACCOUNTING_SAGE_INTACCT_PREREQUISITES: {
16301638
route: 'settings/workspaces/:policyID/accounting/sage-intacct/prerequisites',
16311639
getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/sage-intacct/prerequisites` as const,

src/SCREENS.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ const SCREENS = {
405405
NETSUITE_JOURNAL_ENTRY_APPROVAL_LEVEL_SELECT: 'Policy_Accounting_NetSuite_Journal_Entry_Approval_Level_Select',
406406
NETSUITE_APPROVAL_ACCOUNT_SELECT: 'Policy_Accounting_NetSuite_Approval_Account_Select',
407407
NETSUITE_CUSTOM_FORM_ID: 'Policy_Accounting_NetSuite_Custom_Form_ID',
408+
NETSUITE_AUTO_SYNC: 'Policy_Accounting_NetSuite_Auto_Sync',
409+
NETSUITE_ACCOUNTING_METHOD: 'Policy_Accounting_NetSuite_Accounting_Method',
408410
SAGE_INTACCT_PREREQUISITES: 'Policy_Accounting_Sage_Intacct_Prerequisites',
409411
ENTER_SAGE_INTACCT_CREDENTIALS: 'Policy_Enter_Sage_Intacct_Credentials',
410412
EXISTING_SAGE_INTACCT_CONNECTIONS: 'Policy_Existing_Sage_Intacct_Connections',

src/components/SelectionScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ function SelectionScreen<T = string>({
159159
sectionListStyle={!!sections.length && [styles.flexGrow0]}
160160
shouldSingleExecuteRowSelect={shouldSingleExecuteRowSelect}
161161
shouldUpdateFocusedIndex={shouldUpdateFocusedIndex}
162+
isAlternateTextMultilineSupported
162163
>
163164
<ErrorMessageRow
164165
errors={errors}

src/languages/en.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ const translations = {
461461
dropMessage: 'Drop your file here',
462462
ignore: 'Ignore',
463463
enabled: 'Enabled',
464+
disabled: 'Disabled',
464465
import: 'Import',
465466
offlinePrompt: "You can't take this action right now.",
466467
outstanding: 'Outstanding',
@@ -2834,6 +2835,18 @@ const translations = {
28342835
[CONST.NETSUITE_REPORTS_APPROVAL_LEVEL.REPORTS_APPROVED_BOTH]: 'Supervisor and accounting approved',
28352836
},
28362837
},
2838+
accountingMethods: {
2839+
label: 'When to Export',
2840+
description: 'Choose when to export the expenses:',
2841+
values: {
2842+
[CONST.NETSUITE_ACCOUNTING_METHODS.ACCRUAL]: 'Accrual',
2843+
[CONST.NETSUITE_ACCOUNTING_METHODS.CASH]: 'Cash',
2844+
},
2845+
alternateText: {
2846+
[CONST.NETSUITE_ACCOUNTING_METHODS.ACCRUAL]: 'Out of pocket expenses will export when final approved',
2847+
[CONST.NETSUITE_ACCOUNTING_METHODS.CASH]: 'Out of pocket expenses will export when paid',
2848+
},
2849+
},
28372850
exportVendorBillsTo: {
28382851
label: 'Vendor bill approval level',
28392852
description: 'Once a vendor bill is approved in Expensify and exported to NetSuite, you can set an additional level of approval in NetSuite prior to posting.',
@@ -3829,6 +3842,7 @@ const translations = {
38293842
exportDate: 'Export date',
38303843
defaultVendor: 'Default vendor',
38313844
autoSync: 'Auto-sync',
3845+
autoSyncDescription: 'Sync NetSuite and Expensify automatically, every day. Export finalized report in realtime',
38323846
reimbursedReports: 'Sync reimbursed reports',
38333847
cardReconciliation: 'Card reconciliation',
38343848
reconciliationAccount: 'Reconciliation account',

src/languages/es.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ const translations = {
451451
dropTitle: 'Suéltalo',
452452
dropMessage: 'Suelta tu archivo aquí',
453453
enabled: 'Habilitado',
454+
disabled: 'Desactivada',
454455
ignore: 'Ignorar',
455456
import: 'Importar',
456457
offlinePrompt: 'No puedes realizar esta acción ahora mismo.',
@@ -2871,6 +2872,18 @@ const translations = {
28712872
[CONST.NETSUITE_REPORTS_APPROVAL_LEVEL.REPORTS_APPROVED_BOTH]: 'Aprobado por supervisor y contabilidad',
28722873
},
28732874
},
2875+
accountingMethods: {
2876+
label: 'Cuándo Exportar',
2877+
description: 'Elige cuándo exportar los gastos:',
2878+
values: {
2879+
[CONST.NETSUITE_ACCOUNTING_METHODS.ACCRUAL]: 'Devengo',
2880+
[CONST.NETSUITE_ACCOUNTING_METHODS.CASH]: 'Efectivo',
2881+
},
2882+
alternateText: {
2883+
[CONST.NETSUITE_ACCOUNTING_METHODS.ACCRUAL]: 'Los gastos personales se exportarán cuando sean aprobados definitivamente',
2884+
[CONST.NETSUITE_ACCOUNTING_METHODS.CASH]: 'Los gastos personales se exportarán cuando sean pagados',
2885+
},
2886+
},
28742887
exportVendorBillsTo: {
28752888
label: 'Nivel de aprobación de facturas de proveedores',
28762889
description:
@@ -3834,6 +3847,7 @@ const translations = {
38343847
exportDate: 'Fecha de exportación',
38353848
defaultVendor: 'Proveedor predeterminado',
38363849
autoSync: 'Autosincronización',
3850+
autoSyncDescription: 'Sincroniza NetSuite y Expensify automáticamente, todos los días. Exporta el informe finalizado en tiempo real',
38373851
reimbursedReports: 'Sincronizar informes reembolsados',
38383852
cardReconciliation: 'Conciliación de tarjetas',
38393853
reconciliationAccount: 'Cuenta de conciliación',

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,9 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
475475
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_APPROVAL_ACCOUNT_SELECT]: () =>
476476
require<ReactComponentModule>('../../../../pages/workspace/accounting/netsuite/advanced/NetSuiteApprovalAccountSelectPage').default,
477477
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_CUSTOM_FORM_ID]: () => require<ReactComponentModule>('../../../../pages/workspace/accounting/netsuite/advanced/NetSuiteCustomFormIDPage').default,
478+
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_AUTO_SYNC]: () => require<ReactComponentModule>('../../../../pages/workspace/accounting/netsuite/advanced/NetSuiteAutoSyncPage').default,
479+
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_ACCOUNTING_METHOD]: () =>
480+
require<ReactComponentModule>('../../../../pages/workspace/accounting/netsuite/advanced/NetSuiteAccountingMethodPage').default,
478481
[SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PREREQUISITES]: () => require<ReactComponentModule>('../../../../pages/workspace/accounting/intacct/SageIntacctPrerequisitesPage').default,
479482
[SCREENS.WORKSPACE.ACCOUNTING.ENTER_SAGE_INTACCT_CREDENTIALS]: () =>
480483
require<ReactComponentModule>('../../../../pages/workspace/accounting/intacct/EnterSageIntacctCredentialsPage').default,

src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = {
124124
SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_JOURNAL_ENTRY_APPROVAL_LEVEL_SELECT,
125125
SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_APPROVAL_ACCOUNT_SELECT,
126126
SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_CUSTOM_FORM_ID,
127+
SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_AUTO_SYNC,
128+
SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_ACCOUNTING_METHOD,
127129
SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PREREQUISITES,
128130
SCREENS.WORKSPACE.ACCOUNTING.ENTER_SAGE_INTACCT_CREDENTIALS,
129131
SCREENS.WORKSPACE.ACCOUNTING.EXISTING_SAGE_INTACCT_CONNECTIONS,

src/libs/Navigation/linkingConfig/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,12 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
529529
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_CUSTOM_FORM_ID]: {
530530
path: ROUTES.POLICY_ACCOUNTING_NETSUITE_CUSTOM_FORM_ID.route,
531531
},
532+
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_AUTO_SYNC]: {
533+
path: ROUTES.POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC.route,
534+
},
535+
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_ACCOUNTING_METHOD]: {
536+
path: ROUTES.POLICY_ACCOUNTING_NETSUITE_ACCOUNTING_METHOD.route,
537+
},
532538
[SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_PREREQUISITES]: {path: ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREREQUISITES.route},
533539
[SCREENS.WORKSPACE.ACCOUNTING.ENTER_SAGE_INTACCT_CREDENTIALS]: {path: ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ENTER_CREDENTIALS.route},
534540
[SCREENS.WORKSPACE.ACCOUNTING.EXISTING_SAGE_INTACCT_CONNECTIONS]: {path: ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXISTING_CONNECTIONS.route},
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import React, {useCallback, useMemo} from 'react';
2+
import {View} from 'react-native';
3+
import type {ValueOf} from 'type-fest';
4+
import RadioListItem from '@components/SelectionList/RadioListItem';
5+
import type {ListItem} from '@components/SelectionList/types';
6+
import SelectionScreen from '@components/SelectionScreen';
7+
import type {SelectorType} from '@components/SelectionScreen';
8+
import Text from '@components/Text';
9+
import useLocalize from '@hooks/useLocalize';
10+
import useThemeStyles from '@hooks/useThemeStyles';
11+
import Navigation from '@navigation/Navigation';
12+
import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections';
13+
import withPolicyConnections from '@pages/workspace/withPolicyConnections';
14+
import CONST from '@src/CONST';
15+
import ROUTES from '@src/ROUTES';
16+
17+
type MenuListItem = ListItem & {
18+
value: ValueOf<typeof CONST.NETSUITE_ACCOUNTING_METHODS>;
19+
};
20+
21+
function NetSuiteAccountingMethodPage({policy}: WithPolicyConnectionsProps) {
22+
const {translate} = useLocalize();
23+
const policyID = policy?.id ?? '-1';
24+
const styles = useThemeStyles();
25+
const config = policy?.connections?.netsuite.options.config;
26+
const accountingMehtod = config?.accountingMehtod ?? CONST.NETSUITE_ACCOUNTING_METHODS.CASH;
27+
const data: MenuListItem[] = Object.values(CONST.NETSUITE_ACCOUNTING_METHODS).map((accountingMehtodType) => ({
28+
value: accountingMehtodType,
29+
text: translate(`workspace.netsuite.advancedConfig.accountingMethods.values.${accountingMehtodType}`),
30+
alternateText: translate(`workspace.netsuite.advancedConfig.accountingMethods.alternateText.${accountingMehtodType}`),
31+
keyForList: accountingMehtodType,
32+
isSelected: accountingMehtod === accountingMehtodType,
33+
}));
34+
35+
const headerContent = useMemo(
36+
() => (
37+
<View>
38+
<Text style={[styles.ph5, styles.pb5]}>{translate('workspace.netsuite.advancedConfig.accountingMethods.description')}</Text>
39+
</View>
40+
),
41+
[translate, styles.pb5, styles.ph5],
42+
);
43+
44+
const selectExpenseReportApprovalLevel = useCallback(
45+
(row: MenuListItem) => {
46+
// if (row.value !== config?.syncOptions.exportReportsTo) {
47+
// Connections.updateNetSuiteExportReportsTo(policyID, row.value, config?.syncOptions.exportReportsTo ?? CONST.NETSUITE_REPORTS_APPROVAL_LEVEL.REPORTS_APPROVED_NONE);
48+
// }
49+
Navigation.goBack(ROUTES.POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC.getRoute(policyID));
50+
},
51+
[config?.syncOptions.exportReportsTo, policyID],
52+
);
53+
54+
return (
55+
<SelectionScreen
56+
displayName={NetSuiteAccountingMethodPage.displayName}
57+
title="workspace.netsuite.advancedConfig.accountingMethods.label"
58+
headerContent={headerContent}
59+
sections={[{data}]}
60+
listItem={RadioListItem}
61+
onSelectRow={(selection: SelectorType) => selectExpenseReportApprovalLevel(selection as MenuListItem)}
62+
initiallyFocusedOptionKey={data.find((mode) => mode.isSelected)?.keyForList}
63+
policyID={policyID}
64+
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
65+
featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED}
66+
onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING_NETSUITE_AUTO_SYNC.getRoute(policyID))}
67+
connectionName={CONST.POLICY.CONNECTIONS.NAME.NETSUITE}
68+
/>
69+
);
70+
}
71+
72+
NetSuiteAccountingMethodPage.displayName = 'NetSuiteExpenseReportApprovalLevelSelectPage';
73+
74+
export default withPolicyConnections(NetSuiteAccountingMethodPage);

0 commit comments

Comments
 (0)