From b42a1c457b67df4ba17b1ae4478f0fe96002284a Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 29 Jun 2026 23:32:11 +0100 Subject: [PATCH 01/35] define export pages --- src/ROUTES.ts | 20 ++++ src/SCREENS.ts | 5 + .../ModalStackNavigators/index.tsx | 7 ++ .../RELATIONS/WORKSPACE_TO_RHP.ts | 4 + src/libs/Navigation/linkingConfig/config.ts | 5 + src/libs/Navigation/types.ts | 15 +++ .../export/RilletCompanyCardAccountPage.tsx | 101 ++++++++++++++++++ .../RilletDefaultCompanyCardVendorPage.tsx | 101 ++++++++++++++++++ .../rillet/export/RilletExportPage.tsx | 101 ++++++++++++++++++ .../export/RilletPreferredExporterPage.tsx | 101 ++++++++++++++++++ .../export/RilletVendorBillDatePage.tsx | 101 ++++++++++++++++++ 11 files changed, 561 insertions(+) create mode 100644 src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx create mode 100644 src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx create mode 100644 src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx create mode 100644 src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx create mode 100644 src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index b6ac99b830b1..e11e60274ed4 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -4001,6 +4001,26 @@ const ROUTES = { route: 'workspaces/:policyID/accounting/rillet/import', getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/import` as const, }, + POLICY_ACCOUNTING_RILLET_EXPORT: { + route: 'workspaces/:policyID/accounting/rillet/export', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export` as const, + }, + POLICY_ACCOUNTING_RILLET_PREFERRED_EXPORTER: { + route: 'workspaces/:policyID/accounting/rillet/export/preferred-exporter', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/preferred-exporter` as const, + }, + POLICY_ACCOUNTING_RILLET_VENDOR_BILL: { + route: 'workspaces/:policyID/accounting/rillet/export/vendor-bill', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/vendor-bill` as const, + }, + POLICY_ACCOUNTING_RILLET_COMPANY_CARD_ACCOUNT: { + route: 'workspaces/:policyID/accounting/rillet/export/company-card-account', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/company-card-account` as const, + }, + POLICY_ACCOUNTING_RILLET_DEFAULT_COMPANY_CARD_VENDOR: { + route: 'workspaces/:policyID/accounting/rillet/export/default-company-card-vendor', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/default-company-card-vendor` as const, + }, ADD_EXISTING_EXPENSE: { route: 'search/r/:reportID/add-existing-expense/:backToReport?', getRoute: (reportID: string | undefined, backToReport?: string) => `search/r/${reportID}/add-existing-expense/${backToReport ?? ''}` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index c5067157909f..42afbe51a5ef 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -665,6 +665,11 @@ const SCREENS = { RILLET_EXISTING_CONNECTIONS: 'Policy_Accounting_Rillet_Existing_Connections', RILLET_SUBSIDIARY_SELECTOR: 'Policy_Accounting_Rillet_Subsidiary_Selector', RILLET_IMPORT: 'Policy_Accounting_Rillet_Import', + RILLET_EXPORT: 'Policy_Accounting_Rillet_Export', + RILLET_PREFERRED_EXPORTER: 'Policy_Accounting_Rillet_Preferred_Exporter', + RILLET_VENDOR_BILL: 'Policy_Accounting_Rillet_Vendor_Bill', + RILLET_COMPANY_CARD_ACCOUNT: 'Policy_Accounting_Rillet_Company_Card_Account', + RILLET_DEFAULT_COMPANY_CARD_VENDOR: 'Policy_Accounting_Rillet_Default_Company_Card_Vendor', CARD_RECONCILIATION: 'Policy_Accounting_Card_Reconciliation', CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC: 'Policy_Accounting_Card_Reconciliation_Sage_Intacct_Auto_Sync', DYNAMIC_RECONCILIATION_ACCOUNT_SETTINGS: 'Dynamic_Policy_Accounting_Reconciliation_Account_Settings', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 05d9b9338d5d..07bb12e5c680 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -914,6 +914,13 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/accounting/rillet/RilletExistingConnectionsPage').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_SUBSIDIARY_SELECTOR]: () => require('../../../../pages/workspace/accounting/rillet/RilletSubsidiarySelector').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_IMPORT]: () => require('../../../../pages/workspace/accounting/rillet/import/RilletImportPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXPORT]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletExportPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletPreferredExporterPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletVendorBillDatePage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: () => + require('../../../../pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_DEFAULT_COMPANY_CARD_VENDOR]: () => + require('../../../../pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage').default, [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: () => require('../../../../pages/workspace/accounting/reconciliation/CardReconciliationPage').default, [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC]: () => require('../../../../pages/workspace/accounting/reconciliation/CardReconciliationSageIntacctAutoSyncPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 1fc75043d660..84fcb4bd029c 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -199,6 +199,10 @@ const WORKSPACE_TO_RHP: Partial['config'] = { [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXISTING_CONNECTIONS]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_EXISTING_CONNECTIONS.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_SUBSIDIARY_SELECTOR]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_SUBSIDIARY_SELECTOR.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_IMPORT.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXPORT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_PREFERRED_EXPORTER.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_VENDOR_BILL.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_COMPANY_CARD_ACCOUNT.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_DEFAULT_COMPANY_CARD_VENDOR]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_DEFAULT_COMPANY_CARD_VENDOR.route}, [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: {path: ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.route}, [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC]: { path: ROUTES.POLICY_ACCOUNTING_CARD_RECONCILIATION_SAGE_INTACCT_AUTO_SYNC.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 5f13dc2069fc..1419d241bac0 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1204,6 +1204,21 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.ACCOUNTING.RILLET_IMPORT]: { policyID: string; }; + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXPORT]: { + policyID: string; + }; + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: { + policyID: string; + }; + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: { + policyID: string; + }; + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: { + policyID: string; + }; + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_DEFAULT_COMPANY_CARD_VENDOR]: { + policyID: string; + }; [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: { policyID: string; connection: ValueOf; diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx new file mode 100644 index 000000000000..f690cba7df34 --- /dev/null +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import {View} from 'react-native'; +import ConnectionLayout from '@components/ConnectionLayout'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import CONST from '@src/CONST'; + +function RilletImportPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id; + const rilletConfig = policy?.connections?.rillet?.config; + const rilletData = policy?.connections?.rillet?.data; + + return ( + + {}} + disabled + /> + policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + /> + + + {translate('workspace.rillet.dimensionsImport')} + + {rilletData?.fields.map((field) => ( + + policyID && + updateRilletFieldMapping( + policyID, + field.id, + rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding.fieldMappings[field.id], + ) + } + pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + /> + ))} + {!!rilletData?.taxRates.length && ( + <> + + policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + /> + + )} + + ); +} + +export default withPolicyConnections(RilletImportPage); diff --git a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx new file mode 100644 index 000000000000..f690cba7df34 --- /dev/null +++ b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import {View} from 'react-native'; +import ConnectionLayout from '@components/ConnectionLayout'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import CONST from '@src/CONST'; + +function RilletImportPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id; + const rilletConfig = policy?.connections?.rillet?.config; + const rilletData = policy?.connections?.rillet?.data; + + return ( + + {}} + disabled + /> + policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + /> + + + {translate('workspace.rillet.dimensionsImport')} + + {rilletData?.fields.map((field) => ( + + policyID && + updateRilletFieldMapping( + policyID, + field.id, + rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding.fieldMappings[field.id], + ) + } + pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + /> + ))} + {!!rilletData?.taxRates.length && ( + <> + + policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + /> + + )} + + ); +} + +export default withPolicyConnections(RilletImportPage); diff --git a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx new file mode 100644 index 000000000000..f690cba7df34 --- /dev/null +++ b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import {View} from 'react-native'; +import ConnectionLayout from '@components/ConnectionLayout'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import CONST from '@src/CONST'; + +function RilletImportPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id; + const rilletConfig = policy?.connections?.rillet?.config; + const rilletData = policy?.connections?.rillet?.data; + + return ( + + {}} + disabled + /> + policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + /> + + + {translate('workspace.rillet.dimensionsImport')} + + {rilletData?.fields.map((field) => ( + + policyID && + updateRilletFieldMapping( + policyID, + field.id, + rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding.fieldMappings[field.id], + ) + } + pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + /> + ))} + {!!rilletData?.taxRates.length && ( + <> + + policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + /> + + )} + + ); +} + +export default withPolicyConnections(RilletImportPage); diff --git a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx new file mode 100644 index 000000000000..f690cba7df34 --- /dev/null +++ b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import {View} from 'react-native'; +import ConnectionLayout from '@components/ConnectionLayout'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import CONST from '@src/CONST'; + +function RilletImportPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id; + const rilletConfig = policy?.connections?.rillet?.config; + const rilletData = policy?.connections?.rillet?.data; + + return ( + + {}} + disabled + /> + policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + /> + + + {translate('workspace.rillet.dimensionsImport')} + + {rilletData?.fields.map((field) => ( + + policyID && + updateRilletFieldMapping( + policyID, + field.id, + rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding.fieldMappings[field.id], + ) + } + pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + /> + ))} + {!!rilletData?.taxRates.length && ( + <> + + policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + /> + + )} + + ); +} + +export default withPolicyConnections(RilletImportPage); diff --git a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx new file mode 100644 index 000000000000..f690cba7df34 --- /dev/null +++ b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import {View} from 'react-native'; +import ConnectionLayout from '@components/ConnectionLayout'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {getLatestErrorField} from '@libs/ErrorUtils'; +import {settingsPendingAction} from '@libs/PolicyUtils'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import CONST from '@src/CONST'; + +function RilletImportPage({policy}: WithPolicyConnectionsProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const policyID = policy?.id; + const rilletConfig = policy?.connections?.rillet?.config; + const rilletData = policy?.connections?.rillet?.data; + + return ( + + {}} + disabled + /> + policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} + /> + + + {translate('workspace.rillet.dimensionsImport')} + + {rilletData?.fields.map((field) => ( + + policyID && + updateRilletFieldMapping( + policyID, + field.id, + rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding.fieldMappings[field.id], + ) + } + pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} + /> + ))} + {!!rilletData?.taxRates.length && ( + <> + + policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} + /> + + )} + + ); +} + +export default withPolicyConnections(RilletImportPage); From a95101fd3cc89a6a73982c093f046da0841b45f3 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 30 Jun 2026 00:13:09 +0100 Subject: [PATCH 02/35] safer ts --- .../accounting/rillet/import/RilletImportPage.tsx | 10 +++++----- src/types/onyx/Policy.ts | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx b/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx index f690cba7df34..38e959296a9f 100644 --- a/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx +++ b/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx @@ -63,14 +63,14 @@ function RilletImportPage({policy}: WithPolicyConnectionsProps) { switchAccessibilityLabel={field.name} shouldPlaceSubtitleBelowSwitch wrapperStyle={[styles.mv3, styles.mh5]} - isActive={rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG} + isActive={rilletConfig?.coding?.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG} onToggle={() => policyID && updateRilletFieldMapping( policyID, field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], + rilletConfig?.coding?.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding?.fieldMappings[field.id], ) } pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} @@ -86,8 +86,8 @@ function RilletImportPage({policy}: WithPolicyConnectionsProps) { switchAccessibilityLabel={translate('workspace.taxes.taxRates')} shouldPlaceSubtitleBelowSwitch wrapperStyle={[styles.mv3, styles.mh5]} - isActive={rilletConfig?.coding.syncTaxRates ?? false} - onToggle={() => policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} + isActive={rilletConfig?.coding?.syncTaxRates ?? false} + onToggle={() => policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding?.syncTaxRates, rilletConfig?.coding?.syncTaxRates)} pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 116e90bee163..01bde8e3cc8f 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -1847,16 +1847,16 @@ type RilletConnectionsConfig = OnyxCommon.OnyxValueWithOfflineFeedback< enableNewCategories: boolean; /** Coding settings */ - coding: RilletCoding; + coding?: RilletCoding; /** Export settings */ - export: RilletExport; + export?: RilletExport; /** Auto-sync settings */ autoSync?: RilletAutoSync; /** Sync settings */ - sync: RilletSync; + sync?: RilletSync; /** Collection of errors coming from BE */ errors?: OnyxCommon.Errors; From 627ba1e34167b4e90986da10d8d9952e42537b6f Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 30 Jun 2026 01:18:48 +0100 Subject: [PATCH 03/35] add RilletExportPage --- src/CONST/index.ts | 14 ++ src/ROUTES.ts | 6 +- src/SCREENS.ts | 2 +- src/languages/en.ts | 40 +++++ .../ModalStackNavigators/index.tsx | 2 +- .../RELATIONS/WORKSPACE_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 2 +- .../rillet/export/RilletExportPage.tsx | 138 +++++++++--------- src/pages/workspace/accounting/utils.tsx | 2 +- src/types/onyx/Policy.ts | 20 +-- 11 files changed, 146 insertions(+), 84 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 81c6cd413f5f..8d65059883fb 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -3363,6 +3363,20 @@ const CONST = { TAG: 'TAG', }, + RILLET_EXPORT_REIMBURSABLE: { + VENDOR_BILL: 'VENDOR_BILL', + }, + + RILLET_EXPORT_COMPANY_CARD: { + CREDIT_CARD: 'CREDIT_CARD', + }, + + RILLET_EXPORT_DATE: { + LAST_EXPENSE: 'LAST_EXPENSE', + REPORT_EXPORTED: 'REPORT_EXPORTED', + REPORT_SUBMITTED: 'REPORT_SUBMITTED', + }, + UPDATE_PERSONAL_BANK_ACCOUNT: { PAGE_NAME: { LEGAL_NAME: 'legal-name', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index e11e60274ed4..782749ce08d6 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -4009,9 +4009,9 @@ const ROUTES = { route: 'workspaces/:policyID/accounting/rillet/export/preferred-exporter', getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/preferred-exporter` as const, }, - POLICY_ACCOUNTING_RILLET_VENDOR_BILL: { - route: 'workspaces/:policyID/accounting/rillet/export/vendor-bill', - getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/vendor-bill` as const, + POLICY_ACCOUNTING_RILLET_VENDOR_BILL_DATE: { + route: 'workspaces/:policyID/accounting/rillet/export/vendor-bill-date', + getRoute: (policyID: string) => `workspaces/${policyID}/accounting/rillet/export/vendor-bill-date` as const, }, POLICY_ACCOUNTING_RILLET_COMPANY_CARD_ACCOUNT: { route: 'workspaces/:policyID/accounting/rillet/export/company-card-account', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 42afbe51a5ef..a8d16e532478 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -667,7 +667,7 @@ const SCREENS = { RILLET_IMPORT: 'Policy_Accounting_Rillet_Import', RILLET_EXPORT: 'Policy_Accounting_Rillet_Export', RILLET_PREFERRED_EXPORTER: 'Policy_Accounting_Rillet_Preferred_Exporter', - RILLET_VENDOR_BILL: 'Policy_Accounting_Rillet_Vendor_Bill', + RILLET_VENDOR_BILL_DATE: 'Policy_Accounting_Rillet_Vendor_Bill_Date', RILLET_COMPANY_CARD_ACCOUNT: 'Policy_Accounting_Rillet_Company_Card_Account', RILLET_DEFAULT_COMPANY_CARD_VENDOR: 'Policy_Accounting_Rillet_Default_Company_Card_Vendor', CARD_RECONCILIATION: 'Policy_Accounting_Card_Reconciliation', diff --git a/src/languages/en.ts b/src/languages/en.ts index 31bef2e14302..f19dfd2f41d6 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5558,6 +5558,46 @@ const translations = { enableNewAccountsTitle: 'Enable newly imported accounts', enableNewAccountsDescription: 'New Rillet accounts will be available as categories.', dimensionsImport: 'All Rillet dimensions import as tags', + exportDescription: 'Configure how Expensify data exports to Rillet.', + exportReimbursable: { + label: 'Export reimbursable expenses as', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Vendor bills', + }, + }, + }, + exportDate: { + label: 'Vendor bill date', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Date of last expense', + description: 'Date of the most recent expense on the report.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Export date', + description: 'Date the report was exported to Rillet..', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Submitted date', + description: 'Date the report was submitted for approval.', + }, + }, + }, + exportCompanyCard: { + label: 'Export company card expenses as', + values: { + [CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: { + label: 'Credit cards', + }, + }, + }, + defaultCompanyCardVendor: { + label: 'Default company card vendor', + }, + companyCardAccount: { + label: 'Company card account', + }, }, type: { free: 'Free', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 07bb12e5c680..b9fe8d1f7225 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -916,7 +916,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/accounting/rillet/import/RilletImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXPORT]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletExportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletPreferredExporterPage').default, - [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletVendorBillDatePage').default, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL_DATE]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletVendorBillDatePage').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: () => require('../../../../pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage').default, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_DEFAULT_COMPANY_CARD_VENDOR]: () => diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 84fcb4bd029c..18d33bd6a858 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -201,7 +201,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { [SCREENS.WORKSPACE.ACCOUNTING.RILLET_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_IMPORT.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_EXPORT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_PREFERRED_EXPORTER.route}, - [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_VENDOR_BILL.route}, + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL_DATE]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_VENDOR_BILL_DATE.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_COMPANY_CARD_ACCOUNT.route}, [SCREENS.WORKSPACE.ACCOUNTING.RILLET_DEFAULT_COMPANY_CARD_VENDOR]: {path: ROUTES.POLICY_ACCOUNTING_RILLET_DEFAULT_COMPANY_CARD_VENDOR.route}, [SCREENS.WORKSPACE.ACCOUNTING.CARD_RECONCILIATION]: {path: ROUTES.WORKSPACE_ACCOUNTING_CARD_RECONCILIATION.route}, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 1419d241bac0..ee724eaa7525 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1210,7 +1210,7 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.ACCOUNTING.RILLET_PREFERRED_EXPORTER]: { policyID: string; }; - [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL]: { + [SCREENS.WORKSPACE.ACCOUNTING.RILLET_VENDOR_BILL_DATE]: { policyID: string; }; [SCREENS.WORKSPACE.ACCOUNTING.RILLET_COMPANY_CARD_ACCOUNT]: { diff --git a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx index f690cba7df34..479963addb64 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx @@ -1,28 +1,39 @@ import React from 'react'; import {View} from 'react-native'; import ConnectionLayout from '@components/ConnectionLayout'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; -import {settingsPendingAction} from '@libs/PolicyUtils'; +import Navigation from '@libs/Navigation/Navigation'; +import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; -function RilletImportPage({policy}: WithPolicyConnectionsProps) { +function RilletExportPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id; + const policyOwner = policy?.owner; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; + const exporter = rilletConfig?.export?.exporter ?? policyOwner; + const exportReimbursable = rilletConfig?.export?.reimbursable ?? CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL; + const exportDate = rilletConfig?.export?.exportDate ?? CONST.RILLET_EXPORT_DATE.LAST_EXPENSE; + const exportCompanyCard = rilletConfig?.export?.companyCard ?? CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD; + const defaultCompanyCardVendor = rilletData?.vendors?.find((vendor) => vendor.id === rilletConfig?.export?.defaultVendorID); + const companyCardAccount = rilletData?.accounts?.find((account) => account.code === rilletConfig?.export?.creditCardAccountCode); return ( - {}} - disabled - /> - policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - /> - - {translate('workspace.rillet.dimensionsImport')} + {translate('workspace.rillet.exportDescription')} - {rilletData?.fields.map((field) => ( - - policyID && - updateRilletFieldMapping( - policyID, - field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], - ) + + (policyID ? Navigation.navigate(ROUTES.POLICY_ACCOUNTING_RILLET_PREFERRED_EXPORTER.getRoute(policyID)) : undefined)} + shouldShowRightIcon + brickRoadIndicator={areSettingsInErrorFields([CONST.RILLET_CONFIG.EXPORTER], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + + + {}} + interactive={false} + brickRoadIndicator={areSettingsInErrorFields([CONST.RILLET_CONFIG.REIMBURSABLE], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + + (policyID ? Navigation.navigate(ROUTES.POLICY_ACCOUNTING_RILLET_VENDOR_BILL_DATE.getRoute(policyID)) : undefined)} + shouldShowRightIcon + brickRoadIndicator={areSettingsInErrorFields([CONST.RILLET_CONFIG.EXPORT_DATE], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + + + {}} + interactive={false} + brickRoadIndicator={areSettingsInErrorFields([CONST.RILLET_CONFIG.COMPANY_CARD], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + + (policyID ? Navigation.navigate(ROUTES.POLICY_ACCOUNTING_RILLET_DEFAULT_COMPANY_CARD_VENDOR.getRoute(policyID)) : undefined)} + shouldShowRightIcon + brickRoadIndicator={areSettingsInErrorFields([CONST.RILLET_CONFIG.DEFAULT_VENDORID], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + + + (policyID ? Navigation.navigate(ROUTES.POLICY_ACCOUNTING_RILLET_COMPANY_CARD_ACCOUNT.getRoute(policyID)) : undefined)} + shouldShowRightIcon + brickRoadIndicator={ + areSettingsInErrorFields([CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE], rilletConfig?.errorFields) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined } - pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} /> - ))} - {!!rilletData?.taxRates.length && ( - <> - - policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - /> - - )} + ); } -export default withPolicyConnections(RilletImportPage); +export default withPolicyConnections(RilletExportPage); diff --git a/src/pages/workspace/accounting/utils.tsx b/src/pages/workspace/accounting/utils.tsx index f41ac14a5745..052c2cd80f14 100644 --- a/src/pages/workspace/accounting/utils.tsx +++ b/src/pages/workspace/accounting/utils.tsx @@ -406,7 +406,7 @@ function getAccountingIntegrationData( CONST.RILLET_CONFIG.SYNC_TAX_RATES, ...(policy?.connections?.rillet?.data?.fields.map((field) => `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`) ?? []), ], - onExportPagePress: () => null, + onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID)), subscribedExportSettings: [ CONST.RILLET_CONFIG.EXPORTER, CONST.RILLET_CONFIG.EXPORT_DATE, diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 01bde8e3cc8f..aed6a9dc3972 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -1710,22 +1710,22 @@ type RilletBankAccount = { */ type RilletConnectionData = { /** Collection of subsidiaries. */ - subsidiaries: RilletSubsidiary[]; + subsidiaries?: RilletSubsidiary[]; /** Collection of accounts. */ - accounts: RilletAccount[]; + accounts?: RilletAccount[]; /** Collection of custom fields. */ - fields: RilletField[]; + fields?: RilletField[]; /** Collection of tax rates. */ - taxRates: RilletTaxRate[]; + taxRates?: RilletTaxRate[]; /** Collection of vendors. */ - vendors: RilletVendor[]; + vendors?: RilletVendor[]; /** Collection of bank accounts. */ - bankAccounts: RilletBankAccount[]; + bankAccounts?: RilletBankAccount[]; }; /** @@ -1735,7 +1735,7 @@ type RilletCoding = { /** * Mapping of Rillet field IDs to their configured mapping behavior. */ - fieldMappings: Record>; + fieldMappings?: Record>; /** Whether tax rates should be synchronized from Rillet. */ syncTaxRates: boolean; @@ -1752,17 +1752,17 @@ type RilletCodingOfflineFeedbackKeys = keyof Omit /** * Available dates that can be used as the export date. */ -type RilletExportDate = 'LAST_EXPENSE' | 'REPORT_EXPORTED' | 'REPORT_SUBMITTED'; +type RilletExportDate = ValueOf; /** * Export strategy for reimbursable expenses. */ -type RilletExportReimbursable = 'VENDOR_BILL'; +type RilletExportReimbursable = ValueOf; /** * Export strategy for company card expenses. */ -type RilletExportCompanyCard = 'CREDIT_CARD'; +type RilletExportCompanyCard = ValueOf; /** * Export configuration for sending accounting data to Rillet. From 9f0b9b302f9cdae58b277a82bcb761a7648b010c Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 30 Jun 2026 01:21:03 +0100 Subject: [PATCH 04/35] lint + ts --- .../accounting/rillet/export/RilletExportPage.tsx | 3 --- .../accounting/rillet/import/RilletImportPage.tsx | 10 +++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx index 479963addb64..1f6fba5c064f 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx @@ -6,13 +6,10 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; -import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; diff --git a/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx b/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx index 38e959296a9f..71926650ac27 100644 --- a/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx +++ b/src/pages/workspace/accounting/rillet/import/RilletImportPage.tsx @@ -56,21 +56,21 @@ function RilletImportPage({policy}: WithPolicyConnectionsProps) { {translate('workspace.rillet.dimensionsImport')} - {rilletData?.fields.map((field) => ( + {rilletData?.fields?.map((field) => ( policyID && updateRilletFieldMapping( policyID, field.id, - rilletConfig?.coding?.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding?.fieldMappings[field.id], + rilletConfig?.coding?.fieldMappings?.[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, + rilletConfig?.coding?.fieldMappings?.[field.id], ) } pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} @@ -78,7 +78,7 @@ function RilletImportPage({policy}: WithPolicyConnectionsProps) { onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} /> ))} - {!!rilletData?.taxRates.length && ( + {!!rilletData?.taxRates?.length && ( <> Date: Wed, 1 Jul 2026 01:36:10 +0100 Subject: [PATCH 05/35] add RilletPreferredExporterPage --- .../export/RilletPreferredExporterPage.tsx | 158 +++++++++--------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx index f690cba7df34..79727dcba95a 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx @@ -1,101 +1,99 @@ +import isEmpty from 'lodash/isEmpty'; import React from 'react'; import {View} from 'react-native'; -import ConnectionLayout from '@components/ConnectionLayout'; +import type {ListItem} from '@components/SelectionList/types'; +import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; +import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; -import {settingsPendingAction} from '@libs/PolicyUtils'; -import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import Navigation from '@libs/Navigation/Navigation'; +import {getAdminEmployees, isExpensifyTeam, settingsPendingAction} from '@libs/PolicyUtils'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; + +type ExporterListItem = ListItem & { + value: string; +}; -function RilletImportPage({policy}: WithPolicyConnectionsProps) { +function RilletPreferredExporterPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id; + const policyOwner = policy?.owner; const rilletConfig = policy?.connections?.rillet?.config; - const rilletData = policy?.connections?.rillet?.data; + const exporter = rilletConfig?.export?.exporter ?? policyOwner; + const exporters = getAdminEmployees(policy); + const {login: currentUserLogin} = useCurrentUserPersonalDetails(); + const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; + + const data: ExporterListItem[] = + policyOwner && isEmpty(exporters) + ? [ + { + value: policyOwner, + text: policyOwner, + keyForList: policyOwner, + isSelected: exporter === policyOwner, + }, + ] + : (exporters?.reduce((options, exporterItem) => { + if (!exporterItem.email) { + return options; + } + + // Don't show guides if the current user is not a guide themselves or an Expensify employee + if (isExpensifyTeam(exporterItem.email) && !isExpensifyTeam(policyOwner) && !isExpensifyTeam(currentUserLogin)) { + return options; + } + + options.push({ + value: exporterItem.email, + text: exporterItem.email, + keyForList: exporterItem.email, + isSelected: exporter === exporterItem.email, + }); + return options; + }, []) ?? []); + + const headerContent = ( + + {translate('workspace.accounting.exportPreferredExporterNote')} + {translate('workspace.accounting.exportPreferredExporterSubNote')} + + ); + + const selectExporter = (item: ExporterListItem) => { + if (item.value !== exporter && policyID) { + // updateRilletExporter(policyID, item.value, exporter); + } + Navigation.goBack(backPath); + }; return ( - Navigation.goBack(backPath)} connectionName={CONST.POLICY.CONNECTIONS.NAME.RILLET} - > - {}} - disabled - /> - policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - /> - - - {translate('workspace.rillet.dimensionsImport')} - - {rilletData?.fields.map((field) => ( - - policyID && - updateRilletFieldMapping( - policyID, - field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], - ) - } - pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - /> - ))} - {!!rilletData?.taxRates.length && ( - <> - - policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - /> - - )} - + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.EXPORTER], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig, CONST.RILLET_CONFIG.EXPORTER)} + errorRowStyles={[styles.ph5, styles.pv3]} + onClose={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.EXPORTER)} + /> ); } -export default withPolicyConnections(RilletImportPage); +export default withPolicyConnections(RilletPreferredExporterPage); From 9e9b9d29e8833a4702856f4816123b9ad0bbdcd8 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:00:14 +0100 Subject: [PATCH 06/35] add RilletVendorBillDatePage --- .../export/RilletVendorBillDatePage.tsx | 130 +++++++----------- src/types/onyx/Policy.ts | 1 + 2 files changed, 52 insertions(+), 79 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx index f690cba7df34..83643d4ad452 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx @@ -1,101 +1,73 @@ import React from 'react'; import {View} from 'react-native'; -import ConnectionLayout from '@components/ConnectionLayout'; +import type {ListItem} from '@components/SelectionList/types'; +import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; +import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; -import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; +import type {RilletExportDate} from '@src/types/onyx/Policy'; + +type ExportDateListItem = ListItem & { + value: RilletExportDate; +}; -function RilletImportPage({policy}: WithPolicyConnectionsProps) { +function RilletVendorBillDatePage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; - const rilletData = policy?.connections?.rillet?.data; + const exportDate = rilletConfig?.export?.exportDate ?? CONST.RILLET_EXPORT_DATE.LAST_EXPENSE; + const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; + + const data: ExportDateListItem[] = Object.values(CONST.RILLET_EXPORT_DATE).map((exportDateItem) => ({ + value: exportDateItem, + text: translate(`workspace.rillet.exportDate.values.${exportDateItem}.label`), + alternateText: translate(`workspace.rillet.exportDate.values.${exportDateItem}.description`), + keyForList: exportDateItem, + isSelected: exportDate === exportDateItem, + })); + + const headerContent = ( + + {translate('workspace.rillet.exportDate.description')} + + ); + + const selectExportDate = (item: ExportDateListItem) => { + if (item.value !== exportDate && policyID) { + // updateRilletExportDate(policyID, item.value, exportDate); + } + Navigation.goBack(backPath); + }; return ( - Navigation.goBack(backPath)} connectionName={CONST.POLICY.CONNECTIONS.NAME.RILLET} - > - {}} - disabled - /> - policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - /> - - - {translate('workspace.rillet.dimensionsImport')} - - {rilletData?.fields.map((field) => ( - - policyID && - updateRilletFieldMapping( - policyID, - field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], - ) - } - pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - /> - ))} - {!!rilletData?.taxRates.length && ( - <> - - policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - /> - - )} - + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.EXPORT_DATE], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig, CONST.RILLET_CONFIG.EXPORT_DATE)} + errorRowStyles={[styles.ph5, styles.pv3]} + onClose={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.EXPORT_DATE)} + /> ); } -export default withPolicyConnections(RilletImportPage); +export default withPolicyConnections(RilletVendorBillDatePage); diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index aed6a9dc3972..3d9b6cecf5e1 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -2865,4 +2865,5 @@ export type { ZenefitsConnectionConfig, Vendor, AgentRule, + RilletExportDate, }; From 0132e5d3a053237d650fd57b561b4baf80045321 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:15:16 +0100 Subject: [PATCH 07/35] add RilletDefaultCompanyCardVendorPage --- .../RilletDefaultCompanyCardVendorPage.tsx | 129 +++++++----------- src/types/onyx/Policy.ts | 1 + 2 files changed, 52 insertions(+), 78 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx index f690cba7df34..5fbb27dc2643 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx @@ -1,101 +1,74 @@ import React from 'react'; import {View} from 'react-native'; -import ConnectionLayout from '@components/ConnectionLayout'; +import type {ListItem} from '@components/SelectionList/types'; +import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; +import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; -import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; +import type {RilletVendor} from '@src/types/onyx/Policy'; + +type VendorListItem = ListItem & { + value: RilletVendor['id']; +}; -function RilletImportPage({policy}: WithPolicyConnectionsProps) { +function RilletDefaultCompanyCardVendorPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; + const defaultCompanyCardVendorID = rilletConfig?.export?.defaultVendorID; + const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; + + const data: VendorListItem[] = + rilletData?.vendors?.map((vendorItem) => ({ + value: vendorItem.id, + text: vendorItem.name, + keyForList: vendorItem.id, + isSelected: defaultCompanyCardVendorID === vendorItem.id, + })) ?? []; + + const headerContent = ( + + {translate('workspace.rillet.defaultCompanyCardVendor.description')} + + ); + + const selectDefaultVendor = (item: VendorListItem) => { + if (item.value !== defaultCompanyCardVendorID && policyID) { + // updateRilletDefaultVendor(policyID, item.value, defaultCompanyCardVendorID); + } + Navigation.goBack(backPath); + }; return ( - Navigation.goBack(backPath)} connectionName={CONST.POLICY.CONNECTIONS.NAME.RILLET} - > - {}} - disabled - /> - policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - /> - - - {translate('workspace.rillet.dimensionsImport')} - - {rilletData?.fields.map((field) => ( - - policyID && - updateRilletFieldMapping( - policyID, - field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], - ) - } - pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - /> - ))} - {!!rilletData?.taxRates.length && ( - <> - - policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - /> - - )} - + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.DEFAULT_VENDORID], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig, CONST.RILLET_CONFIG.DEFAULT_VENDORID)} + errorRowStyles={[styles.ph5, styles.pv3]} + onClose={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.DEFAULT_VENDORID)} + /> ); } -export default withPolicyConnections(RilletImportPage); +export default withPolicyConnections(RilletDefaultCompanyCardVendorPage); diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 3d9b6cecf5e1..7142b6c4ca03 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -2866,4 +2866,5 @@ export type { Vendor, AgentRule, RilletExportDate, + RilletVendor, }; From dabddf46df217f24580693e0f5949556d171d203 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:24:14 +0100 Subject: [PATCH 08/35] add RilletCompanyCardAccountPage --- .../export/RilletCompanyCardAccountPage.tsx | 129 +++++++----------- src/types/onyx/Policy.ts | 1 + 2 files changed, 52 insertions(+), 78 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index f690cba7df34..3fb855bb8e4f 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -1,101 +1,74 @@ import React from 'react'; import {View} from 'react-native'; -import ConnectionLayout from '@components/ConnectionLayout'; +import type {ListItem} from '@components/SelectionList/types'; +import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField, updateRilletEnableNewCategories, updateRilletFieldMapping, updateRilletSyncTaxRates} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; +import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; -import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; +import type {RilletAccount} from '@src/types/onyx/Policy'; + +type AccountListItem = ListItem & { + value: RilletAccount['id']; +}; -function RilletImportPage({policy}: WithPolicyConnectionsProps) { +function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; + const companyCardAccount = rilletData?.accounts?.find((account) => account.code === rilletConfig?.export?.creditCardAccountCode); + const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; + + const data: AccountListItem[] = + rilletData?.accounts?.map((accountItem) => ({ + value: accountItem.id, + text: accountItem.name, + keyForList: accountItem.id, + isSelected: companyCardAccount?.id === accountItem.id, + })) ?? []; + + const headerContent = ( + + {translate('workspace.rillet.companyCardAccount.description')} + + ); + + const selectDefaultVendor = (item: AccountListItem) => { + if (item.value !== companyCardAccount?.id && policyID) { + // updateRilletCreditCardAccount(policyID, item.value, companyCardAccount?.id); + } + Navigation.goBack(backPath); + }; return ( - Navigation.goBack(backPath)} connectionName={CONST.POLICY.CONNECTIONS.NAME.RILLET} - > - {}} - disabled - /> - policyID && updateRilletEnableNewCategories(policyID, !rilletConfig?.enableNewCategories, rilletConfig?.enableNewCategories)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.ENABLE_NEW_CATEGORIES)} - /> - - - {translate('workspace.rillet.dimensionsImport')} - - {rilletData?.fields.map((field) => ( - - policyID && - updateRilletFieldMapping( - policyID, - field.id, - rilletConfig?.coding.fieldMappings[field.id] === CONST.RILLET_MAPPING_VALUE.TAG ? CONST.RILLET_MAPPING_VALUE.NONE : CONST.RILLET_MAPPING_VALUE.TAG, - rilletConfig?.coding.fieldMappings[field.id], - ) - } - pendingAction={settingsPendingAction([`${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - onCloseError={() => policyID && clearRilletErrorField(policyID, `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${field.id}`)} - /> - ))} - {!!rilletData?.taxRates.length && ( - <> - - policyID && updateRilletSyncTaxRates(policyID, !rilletConfig?.coding.syncTaxRates, rilletConfig?.coding.syncTaxRates)} - pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.SYNC_TAX_RATES], rilletConfig?.pendingFields)} - errors={getLatestErrorField(rilletConfig ?? {}, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - onCloseError={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.SYNC_TAX_RATES)} - /> - - )} - + pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE], rilletConfig?.pendingFields)} + errors={getLatestErrorField(rilletConfig, CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE)} + errorRowStyles={[styles.ph5, styles.pv3]} + onClose={() => policyID && clearRilletErrorField(policyID, CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE)} + /> ); } -export default withPolicyConnections(RilletImportPage); +export default withPolicyConnections(RilletCompanyCardAccountPage); diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 7142b6c4ca03..edf35ea5c5ef 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -2867,4 +2867,5 @@ export type { AgentRule, RilletExportDate, RilletVendor, + RilletAccount, }; From a24abe10c90a451aa6abdaa2daa8261254b842d2 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:24:27 +0100 Subject: [PATCH 09/35] add translate keys --- src/languages/en.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/languages/en.ts b/src/languages/en.ts index ae5f97c099bd..955df09abd7f 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5578,6 +5578,7 @@ const translations = { }, exportDate: { label: 'Vendor bill date', + description: 'Use this date when exporting reports to Rillet.', values: { [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { label: 'Date of last expense', @@ -5603,9 +5604,11 @@ const translations = { }, defaultCompanyCardVendor: { label: 'Default company card vendor', + description: "Choose a default Rillet vendor for expenses that don't match automatically.", }, companyCardAccount: { label: 'Company card account', + description: 'Choose where to export company card transactions.', }, }, type: { From 3bc329717cfbc3fe35f64c339441f69088a800db Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:40:24 +0100 Subject: [PATCH 10/35] define export API params --- .../API/parameters/UpdateRilletCreditCardAccountParams.ts | 8 ++++++++ .../API/parameters/UpdateRilletDefaultVendorParams.ts | 8 ++++++++ src/libs/API/parameters/UpdateRilletExportDateParams.ts | 8 ++++++++ src/libs/API/parameters/UpdateRilletExporterParams.ts | 6 ++++++ src/libs/API/parameters/index.ts | 4 ++++ src/libs/API/types.ts | 8 ++++++++ 6 files changed, 42 insertions(+) create mode 100644 src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts create mode 100644 src/libs/API/parameters/UpdateRilletDefaultVendorParams.ts create mode 100644 src/libs/API/parameters/UpdateRilletExportDateParams.ts create mode 100644 src/libs/API/parameters/UpdateRilletExporterParams.ts diff --git a/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts b/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts new file mode 100644 index 000000000000..8583e588f4cd --- /dev/null +++ b/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts @@ -0,0 +1,8 @@ +import type {RilletAccount} from '@src/types/onyx/Policy'; + +type UpdateRilletCreditCardAccountParams = { + policyID: string; + creditCardAccountID: RilletAccount['id']; +}; + +export default UpdateRilletCreditCardAccountParams; diff --git a/src/libs/API/parameters/UpdateRilletDefaultVendorParams.ts b/src/libs/API/parameters/UpdateRilletDefaultVendorParams.ts new file mode 100644 index 000000000000..4b89f1712a91 --- /dev/null +++ b/src/libs/API/parameters/UpdateRilletDefaultVendorParams.ts @@ -0,0 +1,8 @@ +import type {RilletVendor} from '@src/types/onyx/Policy'; + +type UpdateRilletDefaultVendorParams = { + policyID: string; + vendorID: RilletVendor['id']; +}; + +export default UpdateRilletDefaultVendorParams; diff --git a/src/libs/API/parameters/UpdateRilletExportDateParams.ts b/src/libs/API/parameters/UpdateRilletExportDateParams.ts new file mode 100644 index 000000000000..97d10e999b33 --- /dev/null +++ b/src/libs/API/parameters/UpdateRilletExportDateParams.ts @@ -0,0 +1,8 @@ +import type {RilletExportDate} from '@src/types/onyx/Policy'; + +type UpdateRilletExportDateParams = { + policyID: string; + value: RilletExportDate; +}; + +export default UpdateRilletExportDateParams; diff --git a/src/libs/API/parameters/UpdateRilletExporterParams.ts b/src/libs/API/parameters/UpdateRilletExporterParams.ts new file mode 100644 index 000000000000..897917fb7cd4 --- /dev/null +++ b/src/libs/API/parameters/UpdateRilletExporterParams.ts @@ -0,0 +1,6 @@ +type UpdateRilletExporterParams = { + policyID: string; + email: string; +}; + +export default UpdateRilletExporterParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index e08a41bfecc2..924b038ab951 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -38,6 +38,10 @@ export type {default as SyncPolicyToRilletParams} from './SyncPolicyToRilletPara export type {default as UpdateRilletSubsidiaryParams} from './UpdateRilletSubsidiaryParams'; export type {default as UpdateRilletGenericTypeParams} from './UpdateRilletGenericTypeParams'; export type {default as UpdateRilletFieldMappingParams} from './UpdateRilletFieldMappingParams'; +export type {default as UpdateRilletCreditCardAccountParams} from './UpdateRilletCreditCardAccountParams'; +export type {default as UpdateRilletDefaultVendorParams} from './UpdateRilletDefaultVendorParams'; +export type {default as UpdateRilletExportDateParams} from './UpdateRilletExportDateParams'; +export type {default as UpdateRilletExporterParams} from './UpdateRilletExporterParams'; export type {default as UpdateNetSuiteAccountingMethodParams} from './UpdateNetSuiteAccountingMethodParams'; export type {default as UpdateQuickbooksOnlineAccountingMethodParams} from './UpdateQuickbooksOnlineAccountingMethodParams'; export type {default as UpdateXeroAccountingMethodParams} from './UpdateXeroAccountingMethodParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 2d848ed76a2d..92a5f5c9f811 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -506,6 +506,10 @@ const WRITE_COMMANDS = { UPDATE_RILLET_ENABLE_NEW_CATEGORIES: 'UpdateRilletEnableNewCategories', UPDATE_RILLET_SYNC_TAX_RATES: 'UpdateRilletSyncTaxRates', UPDATE_RILLET_FIELD_MAPPING: 'UpdateRilletFieldMapping', + UPDATE_RILLET_CREDIT_CARD_ACCOUNT: 'UpdateRilletCreditCardAccount', + UPDATE_RILLET_DEFAULT_VENDOR: 'UpdateRilletDefaultVendor', + UPDATE_RILLET_EXPORT_DATE: 'UpdateRilletExportDate', + UPDATE_RILLET_EXPORTER: 'UpdateRilletExporter', SET_PROMO_CODE: 'User_SetPromoCode', REQUEST_TAX_EXEMPTION: 'RequestTaxExemption', EXPORT_SEARCH_ITEMS_TO_CSV: 'ExportSearchToCSV', @@ -1114,6 +1118,10 @@ type WriteCommandParameters = { [WRITE_COMMANDS.UPDATE_RILLET_ENABLE_NEW_CATEGORIES]: Parameters.UpdateRilletGenericTypeParams; [WRITE_COMMANDS.UPDATE_RILLET_SYNC_TAX_RATES]: Parameters.UpdateRilletGenericTypeParams; [WRITE_COMMANDS.UPDATE_RILLET_FIELD_MAPPING]: Parameters.UpdateRilletFieldMappingParams; + [WRITE_COMMANDS.UPDATE_RILLET_CREDIT_CARD_ACCOUNT]: Parameters.UpdateRilletCreditCardAccountParams; + [WRITE_COMMANDS.UPDATE_RILLET_DEFAULT_VENDOR]: Parameters.UpdateRilletDefaultVendorParams; + [WRITE_COMMANDS.UPDATE_RILLET_EXPORT_DATE]: Parameters.UpdateRilletExportDateParams; + [WRITE_COMMANDS.UPDATE_RILLET_EXPORTER]: Parameters.UpdateRilletExporterParams; [WRITE_COMMANDS.UPGRADE_TO_CORPORATE]: Parameters.UpgradeToCorporateParams; [WRITE_COMMANDS.DOWNGRADE_TO_TEAM]: Parameters.DowngradeToTeamParams; From a3ecb00ebfa0c6fdddb5c78a12d58bc563b1ae51 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:47:10 +0100 Subject: [PATCH 11/35] add prepareRilletExportOptimisticData --- src/libs/actions/connections/Rillet.ts | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index c667d0a5fd07..e956ea712af8 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -261,6 +261,81 @@ function prepareRilletFieldMappingOptimisticData( return {optimisticData, successData, failureData}; } +function prepareRilletExportOptimisticData( + policyID: string, + settingName: TSettingName, + settingValue: Partial, + oldSettingValue: Partial | null, +) { + const optimisticData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + rillet: { + config: { + export: { + [settingName]: settingValue ?? null, + }, + pendingFields: { + [settingName]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + errorFields: { + [settingName]: null, + }, + }, + }, + }, + }, + }, + ]; + + const successData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + rillet: { + config: { + pendingFields: { + [settingName]: null, + }, + }, + }, + }, + }, + }, + ]; + + const failureData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + value: { + connections: { + rillet: { + config: { + export: { + [settingName]: oldSettingValue ?? null, + }, + pendingFields: { + [settingName]: null, + }, + errorFields: { + [settingName]: getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + }, + }, + }, + }, + }, + }, + ]; + + return {optimisticData, successData, failureData}; +} + function updateRilletSubsidiary(policyID: string, subsidiaryID: Connections['rillet']['config']['subsidiaryID'], oldSubsidiaryID?: Connections['rillet']['config']['subsidiaryID']) { const onyxData = prepareRilletOptimisticData(policyID, CONST.RILLET_CONFIG.SUBSIDIARY_ID, subsidiaryID, oldSubsidiaryID ?? null); const params: UpdateRilletSubsidiaryParams = { From 2d6f34b8b36b07c67230c0f1fdf9d6e8c85a95cf Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 02:58:13 +0100 Subject: [PATCH 12/35] fix ts --- src/libs/actions/connections/Rillet.ts | 44 ++++++++++++-------------- src/types/onyx/Policy.ts | 3 ++ 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index e956ea712af8..dc30b80e58f4 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -7,7 +7,7 @@ import {WRITE_COMMANDS} from '@libs/API/types'; import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {Connections} from '@src/types/onyx/Policy'; +import type {RilletCoding, RilletConnectionsConfig, RilletExport} from '@src/types/onyx/Policy'; function connectToRillet(policyID: string, apiKey: string) { const optimisticData: Array> = [ @@ -34,11 +34,11 @@ function clearRilletErrorField(policyID: string, fieldName: string) { }); } -function prepareRilletOptimisticData( +function prepareRilletOptimisticData( policyID: string, settingName: TSettingName, - settingValue: Partial, - oldSettingValue: Partial | null, + settingValue: Partial, + oldSettingValue: Partial | null, ) { const optimisticData: Array> = [ { @@ -105,11 +105,11 @@ function prepareRilletOptimisticData( +function prepareRilletCodingOptimisticData( policyID: string, settingName: TSettingName, - settingValue: Partial, - oldSettingValue: Partial | null, + settingValue: Partial, + oldSettingValue: Partial | null, ) { const optimisticData: Array> = [ { @@ -182,9 +182,9 @@ function prepareRilletCodingOptimisticData, - oldMapping: ValueOf | null, + fieldID: keyof RilletCoding['fieldMappings'], + mapping: ValueOf, + oldMapping: ValueOf | null, ) { const fieldOfflineFeedbackKey = `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${fieldID}`; @@ -261,11 +261,11 @@ function prepareRilletFieldMappingOptimisticData( return {optimisticData, successData, failureData}; } -function prepareRilletExportOptimisticData( +function prepareRilletExportOptimisticData( policyID: string, settingName: TSettingName, - settingValue: Partial, - oldSettingValue: Partial | null, + settingValue: Partial, + oldSettingValue: Partial | null, ) { const optimisticData: Array> = [ { @@ -336,7 +336,7 @@ function prepareRilletExportOptimisticData, - oldMapping?: ValueOf, + fieldID: keyof RilletCoding['fieldMappings'], + mapping: ValueOf, + oldMapping?: ValueOf, ) { const onyxData = prepareRilletFieldMappingOptimisticData(policyID, fieldID, mapping, oldMapping ?? null); const parameters: UpdateRilletFieldMappingParams = { diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index edf35ea5c5ef..0cdf280e9e8f 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -2868,4 +2868,7 @@ export type { RilletExportDate, RilletVendor, RilletAccount, + RilletCoding, + RilletConnectionsConfig, + RilletExport, }; From 841542311bde5a07d3b2cf2aa72285470e2bb44d Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 03:14:45 +0100 Subject: [PATCH 13/35] add export API calls --- src/libs/actions/connections/Rillet.ts | 60 +++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index dc30b80e58f4..ee439ad0ef09 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -2,7 +2,16 @@ import Onyx from 'react-native-onyx'; import type {OnyxUpdate} from 'react-native-onyx'; import {ValueOf} from 'type-fest'; import {write} from '@libs/API'; -import type {ConnectPolicyToRilletParams, UpdateRilletFieldMappingParams, UpdateRilletGenericTypeParams, UpdateRilletSubsidiaryParams} from '@libs/API/parameters'; +import type { + ConnectPolicyToRilletParams, + UpdateRilletCreditCardAccountParams, + UpdateRilletDefaultVendorParams, + UpdateRilletExportDateParams, + UpdateRilletExporterParams, + UpdateRilletFieldMappingParams, + UpdateRilletGenericTypeParams, + UpdateRilletSubsidiaryParams, +} from '@libs/API/parameters'; import {WRITE_COMMANDS} from '@libs/API/types'; import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils'; import CONST from '@src/CONST'; @@ -384,4 +393,51 @@ function updateRilletFieldMapping( write(WRITE_COMMANDS.UPDATE_RILLET_FIELD_MAPPING, parameters, onyxData); } -export {connectToRillet, clearRilletErrorField, updateRilletSubsidiary, updateRilletEnableNewCategories, updateRilletSyncTaxRates, updateRilletFieldMapping}; +function updateRilletExporter(policyID: string, email: RilletExport['exporter'], oldEmail?: RilletExport['exporter']) { + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.EXPORTER, email, oldEmail ?? null); + const parameters: UpdateRilletExporterParams = { + policyID, + email, + }; + write(WRITE_COMMANDS.UPDATE_RILLET_EXPORTER, parameters, onyxData); +} + +function updateRilletExportDate(policyID: string, value: RilletExport['exportDate'], oldValue?: RilletExport['exportDate']) { + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.EXPORT_DATE, value, oldValue ?? null); + const parameters: UpdateRilletExportDateParams = { + policyID, + value, + }; + write(WRITE_COMMANDS.UPDATE_RILLET_EXPORT_DATE, parameters, onyxData); +} + +function updateRilletDefaultVendor(policyID: string, vendorID: RilletExport['defaultVendorID'], oldVendorID?: RilletExport['defaultVendorID']) { + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.DEFAULT_VENDORID, vendorID, oldVendorID ?? null); + const parameters: UpdateRilletDefaultVendorParams = { + policyID, + vendorID, + }; + write(WRITE_COMMANDS.UPDATE_RILLET_DEFAULT_VENDOR, parameters, onyxData); +} + +function updateRilletCreditCardAccount(policyID: string, creditCardAccountID: RilletExport['creditCardAccountCode'], oldCreditCardAccountID?: RilletExport['creditCardAccountCode']) { + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.DEFAULT_VENDORID, creditCardAccountID, oldCreditCardAccountID ?? null); + const parameters: UpdateRilletCreditCardAccountParams = { + policyID, + creditCardAccountID, + }; + write(WRITE_COMMANDS.UPDATE_RILLET_CREDIT_CARD_ACCOUNT, parameters, onyxData); +} + +export { + connectToRillet, + clearRilletErrorField, + updateRilletSubsidiary, + updateRilletEnableNewCategories, + updateRilletSyncTaxRates, + updateRilletFieldMapping, + updateRilletExporter, + updateRilletExportDate, + updateRilletDefaultVendor, + updateRilletCreditCardAccount, +}; From a8991a2c126a298db4ecdc3181ffe9b13592aff9 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 03:16:52 +0100 Subject: [PATCH 14/35] wire API calls on value change --- .../accounting/rillet/export/RilletCompanyCardAccountPage.tsx | 4 ++-- .../rillet/export/RilletDefaultCompanyCardVendorPage.tsx | 4 ++-- .../accounting/rillet/export/RilletPreferredExporterPage.tsx | 4 ++-- .../accounting/rillet/export/RilletVendorBillDatePage.tsx | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 3fb855bb8e4f..2f745d3d23e2 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -5,7 +5,7 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField, updateRilletCreditCardAccount} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; @@ -44,7 +44,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { const selectDefaultVendor = (item: AccountListItem) => { if (item.value !== companyCardAccount?.id && policyID) { - // updateRilletCreditCardAccount(policyID, item.value, companyCardAccount?.id); + updateRilletCreditCardAccount(policyID, item.value, companyCardAccount?.id); } Navigation.goBack(backPath); }; diff --git a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx index 5fbb27dc2643..05321aef33c5 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx @@ -5,7 +5,7 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField, updateRilletDefaultVendor} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; @@ -44,7 +44,7 @@ function RilletDefaultCompanyCardVendorPage({policy}: WithPolicyConnectionsProps const selectDefaultVendor = (item: VendorListItem) => { if (item.value !== defaultCompanyCardVendorID && policyID) { - // updateRilletDefaultVendor(policyID, item.value, defaultCompanyCardVendorID); + updateRilletDefaultVendor(policyID, item.value, defaultCompanyCardVendorID); } Navigation.goBack(backPath); }; diff --git a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx index 79727dcba95a..1376dec82e74 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx @@ -7,7 +7,7 @@ import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField, updateRilletExporter} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getAdminEmployees, isExpensifyTeam, settingsPendingAction} from '@libs/PolicyUtils'; @@ -69,7 +69,7 @@ function RilletPreferredExporterPage({policy}: WithPolicyConnectionsProps) { const selectExporter = (item: ExporterListItem) => { if (item.value !== exporter && policyID) { - // updateRilletExporter(policyID, item.value, exporter); + updateRilletExporter(policyID, item.value, exporter); } Navigation.goBack(backPath); }; diff --git a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx index 83643d4ad452..237ed3933c28 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx @@ -5,7 +5,7 @@ import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {clearRilletErrorField} from '@libs/actions/connections/Rillet'; +import {clearRilletErrorField, updateRilletExportDate} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; @@ -43,7 +43,7 @@ function RilletVendorBillDatePage({policy}: WithPolicyConnectionsProps) { const selectExportDate = (item: ExportDateListItem) => { if (item.value !== exportDate && policyID) { - // updateRilletExportDate(policyID, item.value, exportDate); + updateRilletExportDate(policyID, item.value, exportDate); } Navigation.goBack(backPath); }; From bc8d147e98cf07c83785ea51a50e5d5f53217675 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 03:21:10 +0100 Subject: [PATCH 15/35] use correct field for optimisitc data --- src/libs/actions/connections/Rillet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index ee439ad0ef09..9293e9163820 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -421,7 +421,7 @@ function updateRilletDefaultVendor(policyID: string, vendorID: RilletExport['def } function updateRilletCreditCardAccount(policyID: string, creditCardAccountID: RilletExport['creditCardAccountCode'], oldCreditCardAccountID?: RilletExport['creditCardAccountCode']) { - const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.DEFAULT_VENDORID, creditCardAccountID, oldCreditCardAccountID ?? null); + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE, creditCardAccountID, oldCreditCardAccountID ?? null); const parameters: UpdateRilletCreditCardAccountParams = { policyID, creditCardAccountID, From 5704806a264007479b1c27394a7b4cc0da52fd3c Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Wed, 1 Jul 2026 03:35:01 +0100 Subject: [PATCH 16/35] fix ts --- src/libs/actions/connections/Rillet.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index 9293e9163820..f9b618838b51 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -191,9 +191,9 @@ function prepareRilletCodingOptimisticData, - oldMapping: ValueOf | null, + fieldID: keyof NonNullable, + mapping: ValueOf>, + oldMapping: ValueOf> | null, ) { const fieldOfflineFeedbackKey = `${CONST.RILLET_CONFIG.FIELD_MAPPING_PREFIX}${fieldID}`; @@ -380,9 +380,9 @@ function updateRilletSyncTaxRates(policyID: string, syncTaxRates: RilletCoding[' function updateRilletFieldMapping( policyID: string, - fieldID: keyof RilletCoding['fieldMappings'], - mapping: ValueOf, - oldMapping?: ValueOf, + fieldID: keyof NonNullable, + mapping: ValueOf>, + oldMapping?: ValueOf>, ) { const onyxData = prepareRilletFieldMappingOptimisticData(policyID, fieldID, mapping, oldMapping ?? null); const parameters: UpdateRilletFieldMappingParams = { From df30699cb35629c230aeef51c33d0ebc4509698a Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 2 Jul 2026 22:03:35 +0100 Subject: [PATCH 17/35] fix access control --- .../accounting/rillet/export/RilletCompanyCardAccountPage.tsx | 2 +- .../rillet/export/RilletDefaultCompanyCardVendorPage.tsx | 2 +- .../workspace/accounting/rillet/export/RilletExportPage.tsx | 3 ++- .../accounting/rillet/export/RilletPreferredExporterPage.tsx | 2 +- .../accounting/rillet/export/RilletVendorBillDatePage.tsx | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 2f745d3d23e2..969a4f86cbcd 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -52,7 +52,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { return ( {translate('workspace.rillet.exportDescription')} diff --git a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx index 1376dec82e74..7c0f4f11c3a2 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx @@ -77,7 +77,7 @@ function RilletPreferredExporterPage({policy}: WithPolicyConnectionsProps) { return ( Date: Thu, 2 Jul 2026 22:15:43 +0100 Subject: [PATCH 18/35] update api params for UpdateRilletCreditCardAccount --- .../UpdateRilletCreditCardAccountParams.ts | 2 +- src/libs/actions/connections/Rillet.ts | 6 +++--- .../export/RilletCompanyCardAccountPage.tsx | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts b/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts index 8583e588f4cd..eef03ba2be18 100644 --- a/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts +++ b/src/libs/API/parameters/UpdateRilletCreditCardAccountParams.ts @@ -2,7 +2,7 @@ import type {RilletAccount} from '@src/types/onyx/Policy'; type UpdateRilletCreditCardAccountParams = { policyID: string; - creditCardAccountID: RilletAccount['id']; + creditCardAccountCode: RilletAccount['code']; }; export default UpdateRilletCreditCardAccountParams; diff --git a/src/libs/actions/connections/Rillet.ts b/src/libs/actions/connections/Rillet.ts index 658b0abd4074..42598725f80d 100644 --- a/src/libs/actions/connections/Rillet.ts +++ b/src/libs/actions/connections/Rillet.ts @@ -415,11 +415,11 @@ function updateRilletDefaultVendor(policyID: string, vendorID: RilletExport['def write(WRITE_COMMANDS.UPDATE_RILLET_DEFAULT_VENDOR, parameters, onyxData); } -function updateRilletCreditCardAccount(policyID: string, creditCardAccountID: RilletExport['creditCardAccountCode'], oldCreditCardAccountID?: RilletExport['creditCardAccountCode']) { - const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE, creditCardAccountID, oldCreditCardAccountID ?? null); +function updateRilletCreditCardAccount(policyID: string, creditCardAccountCode: RilletExport['creditCardAccountCode'], oldCreditCardAccountCode?: RilletExport['creditCardAccountCode']) { + const onyxData = prepareRilletExportOptimisticData(policyID, CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE, creditCardAccountCode, oldCreditCardAccountCode ?? null); const parameters: UpdateRilletCreditCardAccountParams = { policyID, - creditCardAccountID, + creditCardAccountCode, }; write(WRITE_COMMANDS.UPDATE_RILLET_CREDIT_CARD_ACCOUNT, parameters, onyxData); } diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 969a4f86cbcd..652f9e08c04a 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -16,7 +16,7 @@ import ROUTES from '@src/ROUTES'; import type {RilletAccount} from '@src/types/onyx/Policy'; type AccountListItem = ListItem & { - value: RilletAccount['id']; + value: RilletAccount['code']; }; function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { @@ -25,15 +25,15 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; - const companyCardAccount = rilletData?.accounts?.find((account) => account.code === rilletConfig?.export?.creditCardAccountCode); + const creditCardAccountCode = rilletConfig?.export?.creditCardAccountCode; const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; const data: AccountListItem[] = rilletData?.accounts?.map((accountItem) => ({ - value: accountItem.id, + value: accountItem.code, text: accountItem.name, - keyForList: accountItem.id, - isSelected: companyCardAccount?.id === accountItem.id, + keyForList: accountItem.code, + isSelected: creditCardAccountCode === accountItem.code, })) ?? []; const headerContent = ( @@ -43,8 +43,8 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { ); const selectDefaultVendor = (item: AccountListItem) => { - if (item.value !== companyCardAccount?.id && policyID) { - updateRilletCreditCardAccount(policyID, item.value, companyCardAccount?.id); + if (item.value !== creditCardAccountCode && policyID) { + updateRilletCreditCardAccount(policyID, item.value, creditCardAccountCode); } Navigation.goBack(backPath); }; @@ -60,7 +60,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { headerContent={headerContent} onSelectRow={selectDefaultVendor} shouldSingleExecuteRowSelect - initiallyFocusedOptionKey={companyCardAccount?.id} + initiallyFocusedOptionKey={creditCardAccountCode} onBackButtonPress={() => Navigation.goBack(backPath)} connectionName={CONST.POLICY.CONNECTIONS.NAME.RILLET} pendingAction={settingsPendingAction([CONST.RILLET_CONFIG.CREDIT_CARD_ACCOUNTCODE], rilletConfig?.pendingFields)} From cef5fe3c9074feb511f7c825653d8c39d4197e96 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:08:10 +0100 Subject: [PATCH 19/35] filter company card accounts --- src/CONST/index.ts | 17 +++++++++++++++++ .../export/RilletCompanyCardAccountPage.tsx | 19 +++++++++++++------ src/types/onyx/Policy.ts | 4 ++-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index b7180315a144..4da4b44afec8 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -3376,6 +3376,23 @@ const CONST = { REPORT_SUBMITTED: 'REPORT_SUBMITTED', }, + RILLET_ACCOUNT_STATUS: { + ACTIVE: 'ACTIVE', + INACTIVE: 'INACTIVE', + }, + + RILLET_ACCOUNT_TYPE: { + ASSET: 'ASSET', + LIABILITY: 'LIABILITY', + EQUITY: 'EQUITY', + EXPENSE: 'EXPENSE', + INCOME: 'INCOME', + }, + + RILLET_ACCOUNT_SUBTYPE: { + CREDIT_CARD: 'Credit Card', + }, + UPDATE_PERSONAL_BANK_ACCOUNT: { PAGE_NAME: { LEGAL_NAME: 'legal-name', diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 652f9e08c04a..8bd07e7fd71d 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -29,12 +29,19 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { const backPath = policyID ? ROUTES.POLICY_ACCOUNTING_RILLET_EXPORT.getRoute(policyID) : undefined; const data: AccountListItem[] = - rilletData?.accounts?.map((accountItem) => ({ - value: accountItem.code, - text: accountItem.name, - keyForList: accountItem.code, - isSelected: creditCardAccountCode === accountItem.code, - })) ?? []; + rilletData?.accounts + ?.filter( + (accountItem) => + accountItem.type === CONST.RILLET_ACCOUNT_TYPE.LIABILITY && + accountItem.subtype === CONST.RILLET_ACCOUNT_SUBTYPE.CREDIT_CARD && + accountItem.status === CONST.RILLET_ACCOUNT_STATUS.ACTIVE, + ) + .map((accountItem) => ({ + value: accountItem.code, + text: accountItem.name, + keyForList: accountItem.code, + isSelected: creditCardAccountCode === accountItem.code, + })) ?? []; const headerContent = ( diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index c8a9503f7d0f..9937896d64e7 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -1567,12 +1567,12 @@ type RilletSubsidiary = { /** * Supported account statuses in Rillet. */ -type RilletAccountStatus = 'ACTIVE' | 'INACTIVE'; +type RilletAccountStatus = ValueOf; /** * Supported chart of account categories in Rillet. */ -type RilletAccountType = 'ASSET' | 'LIABILITY' | 'EQUITY' | 'EXPENSE' | 'INCOME'; +type RilletAccountType = ValueOf; /** * A chart of accounts entry in Rillet. From e4d4a2f0e1686a0843f6c48c1474d792d82d64f8 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Thu, 2 Jul 2026 23:17:23 +0100 Subject: [PATCH 20/35] add missed screen --- src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 8f2411b09994..8ea807da69b2 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -205,6 +205,7 @@ const WORKSPACE_TO_RHP: Partial Date: Thu, 2 Jul 2026 23:27:27 +0100 Subject: [PATCH 21/35] add Rillet exporter path --- src/libs/PolicyUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index fc3e911bef02..452dec4c2d1d 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -2734,6 +2734,7 @@ function getConnectionExporters(policy: OnyxInputOrEntry): Array Date: Thu, 2 Jul 2026 23:28:01 +0100 Subject: [PATCH 22/35] update comment --- src/libs/ReportActionsUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 773be9d41a38..badfc068342f 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2796,7 +2796,7 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url = nonReimbursableUrls.at(0)?.substring(0, SALESFORCE_EXPENSES_URL_PREFIX.length + 3) ?? ''; break; case CONST.EXPORT_LABELS.RILLET: - // TODO Test in R3 https://github.com/Expensify/App/issues/94848 + // s77rt TODO Test in R3 https://github.com/Expensify/App/issues/94848 url = ''; break; default: From 6a77f891f99f1c6d5382521949269249be015dd5 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:02:50 +0100 Subject: [PATCH 23/35] add empty list content --- src/languages/en.ts | 4 +++ .../export/RilletCompanyCardAccountPage.tsx | 26 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index bee421141bcb..c5c936b08c6e 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5581,6 +5581,10 @@ const translations = { subsidiarySelectDescription: "Choose the subsidiary in Rillet that you'd like to import data from.", noSubsidiariesFound: 'No subsidiaries found', noSubsidiariesFoundDescription: 'Please add a subsidiary in Rillet and sync the connection again', + noVendorsFound: 'No vendors found', + noVendorsFoundDescription: 'Please add vendors in Rillet and sync the connection again', + noAccountsFound: 'No accounts found', + noAccountsFoundDescription: 'Please add accounts in Rillet and sync the connection again', accountTypesDescription: 'Your Rillet accounts will import as categories.', enableNewAccountsTitle: 'Enable newly imported accounts', enableNewAccountsDescription: 'New Rillet accounts will be available as categories.', diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 8bd07e7fd71d..02dcf6dac9f1 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -1,20 +1,29 @@ -import React from 'react'; -import {View} from 'react-native'; +import BlockingView from '@components/BlockingViews/BlockingView'; import type {ListItem} from '@components/SelectionList/types'; import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; + +import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; + import {clearRilletErrorField, updateRilletCreditCardAccount} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; + import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; + +import variables from '@styles/variables'; + import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {RilletAccount} from '@src/types/onyx/Policy'; +import React from 'react'; +import {View} from 'react-native'; + type AccountListItem = ListItem & { value: RilletAccount['code']; }; @@ -22,6 +31,7 @@ type AccountListItem = ListItem & { function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); + const illustrations = useMemoizedLazyIllustrations(['Telescope']); const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; @@ -49,6 +59,17 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { ); + const listEmptyContent = ( + + ); + const selectDefaultVendor = (item: AccountListItem) => { if (item.value !== creditCardAccountCode && policyID) { updateRilletCreditCardAccount(policyID, item.value, creditCardAccountCode); @@ -65,6 +86,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { title="workspace.rillet.companyCardAccount.label" data={data} headerContent={headerContent} + listEmptyContent={listEmptyContent} onSelectRow={selectDefaultVendor} shouldSingleExecuteRowSelect initiallyFocusedOptionKey={creditCardAccountCode} From d41a24bbf7c63fed75c30f85e3978c404e7c383a Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:09:38 +0100 Subject: [PATCH 24/35] add empty list content --- .../RilletDefaultCompanyCardVendorPage.tsx | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx index 4abf29c45e2d..81f306ebc6f5 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletDefaultCompanyCardVendorPage.tsx @@ -1,20 +1,29 @@ -import React from 'react'; -import {View} from 'react-native'; +import BlockingView from '@components/BlockingViews/BlockingView'; import type {ListItem} from '@components/SelectionList/types'; import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; + +import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; + import {clearRilletErrorField, updateRilletDefaultVendor} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; + import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; + +import variables from '@styles/variables'; + import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {RilletVendor} from '@src/types/onyx/Policy'; +import React from 'react'; +import {View} from 'react-native'; + type VendorListItem = ListItem & { value: RilletVendor['id']; }; @@ -22,6 +31,7 @@ type VendorListItem = ListItem & { function RilletDefaultCompanyCardVendorPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); + const illustrations = useMemoizedLazyIllustrations(['Telescope']); const policyID = policy?.id; const rilletConfig = policy?.connections?.rillet?.config; const rilletData = policy?.connections?.rillet?.data; @@ -42,6 +52,17 @@ function RilletDefaultCompanyCardVendorPage({policy}: WithPolicyConnectionsProps ); + const listEmptyContent = ( + + ); + const selectDefaultVendor = (item: VendorListItem) => { if (item.value !== defaultCompanyCardVendorID && policyID) { updateRilletDefaultVendor(policyID, item.value, defaultCompanyCardVendorID); @@ -58,6 +79,7 @@ function RilletDefaultCompanyCardVendorPage({policy}: WithPolicyConnectionsProps title="workspace.rillet.defaultCompanyCardVendor.label" data={data} headerContent={headerContent} + listEmptyContent={listEmptyContent} onSelectRow={selectDefaultVendor} shouldSingleExecuteRowSelect initiallyFocusedOptionKey={defaultCompanyCardVendorID} From 0d192617001f7a759753fc93a0c2e6a4c9aa7440 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:14:41 +0100 Subject: [PATCH 25/35] style --- .../accounting/rillet/export/RilletExportPage.tsx | 9 +++++++-- .../rillet/export/RilletPreferredExporterPage.tsx | 11 ++++++++--- .../rillet/export/RilletVendorBillDatePage.tsx | 9 +++++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx index 36bed5aa4a51..1cf17b707469 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletExportPage.tsx @@ -1,18 +1,23 @@ -import React from 'react'; -import {View} from 'react-native'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import Text from '@components/Text'; + import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; + import Navigation from '@libs/Navigation/Navigation'; import {areSettingsInErrorFields, settingsPendingAction} from '@libs/PolicyUtils'; + import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; + import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import React from 'react'; +import {View} from 'react-native'; + function RilletExportPage({policy}: WithPolicyConnectionsProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); diff --git a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx index 7c0f4f11c3a2..bef0e2d5e258 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletPreferredExporterPage.tsx @@ -1,21 +1,26 @@ -import isEmpty from 'lodash/isEmpty'; -import React from 'react'; -import {View} from 'react-native'; import type {ListItem} from '@components/SelectionList/types'; import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; + import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; + import {clearRilletErrorField, updateRilletExporter} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getAdminEmployees, isExpensifyTeam, settingsPendingAction} from '@libs/PolicyUtils'; + import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; + import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import isEmpty from 'lodash/isEmpty'; +import React from 'react'; +import {View} from 'react-native'; + type ExporterListItem = ListItem & { value: string; }; diff --git a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx index 2ea24ab3afa3..1df39cd19f1d 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletVendorBillDatePage.tsx @@ -1,20 +1,25 @@ -import React from 'react'; -import {View} from 'react-native'; import type {ListItem} from '@components/SelectionList/types'; import SelectionScreen from '@components/SelectionScreen'; import Text from '@components/Text'; + import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; + import {clearRilletErrorField, updateRilletExportDate} from '@libs/actions/connections/Rillet'; import {getLatestErrorField} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import {settingsPendingAction} from '@libs/PolicyUtils'; + import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; + import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {RilletExportDate} from '@src/types/onyx/Policy'; +import React from 'react'; +import {View} from 'react-native'; + type ExportDateListItem = ListItem & { value: RilletExportDate; }; From 9917fa3ff1378b26e6493f03c3515e4a4cf4000d Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 6 Jul 2026 12:38:42 +0100 Subject: [PATCH 26/35] fix typo --- src/languages/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index acbe798c6177..6d33f2e36ab1 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5611,7 +5611,7 @@ const translations = { }, [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { label: 'Export date', - description: 'Date the report was exported to Rillet..', + description: 'Date the report was exported to Rillet.', }, [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { label: 'Submitted date', From 166b90ec90675b85e1f7f7c2c4118c073b266940 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 6 Jul 2026 12:43:35 +0100 Subject: [PATCH 27/35] fix callback name --- .../accounting/rillet/export/RilletCompanyCardAccountPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx index 02dcf6dac9f1..8d797969cdae 100644 --- a/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx +++ b/src/pages/workspace/accounting/rillet/export/RilletCompanyCardAccountPage.tsx @@ -70,7 +70,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { /> ); - const selectDefaultVendor = (item: AccountListItem) => { + const selectCreditCardAccount = (item: AccountListItem) => { if (item.value !== creditCardAccountCode && policyID) { updateRilletCreditCardAccount(policyID, item.value, creditCardAccountCode); } @@ -87,7 +87,7 @@ function RilletCompanyCardAccountPage({policy}: WithPolicyConnectionsProps) { data={data} headerContent={headerContent} listEmptyContent={listEmptyContent} - onSelectRow={selectDefaultVendor} + onSelectRow={selectCreditCardAccount} shouldSingleExecuteRowSelect initiallyFocusedOptionKey={creditCardAccountCode} onBackButtonPress={() => Navigation.goBack(backPath)} From 99d7150646b1ba32f8b1158360fe52548157586c Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Mon, 6 Jul 2026 12:45:06 +0100 Subject: [PATCH 28/35] safer access --- src/libs/PolicyUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 0f52a341113d..6e7b67da431b 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -2739,7 +2739,7 @@ function getConnectionExporters(policy: OnyxInputOrEntry): Array Date: Mon, 6 Jul 2026 21:01:33 +0100 Subject: [PATCH 29/35] translate --- src/languages/de.ts | 38 +++++++++++++++++++++++++++----------- src/languages/es.ts | 24 ++++++++++++++++++++---- src/languages/fr.ts | 38 +++++++++++++++++++++++++++----------- src/languages/it.ts | 38 +++++++++++++++++++++++++++----------- src/languages/ja.ts | 35 ++++++++++++++++++++++++----------- src/languages/nl.ts | 35 ++++++++++++++++++++++++----------- src/languages/pl.ts | 35 ++++++++++++++++++++++++----------- src/languages/pt-BR.ts | 38 +++++++++++++++++++++++++++----------- src/languages/zh-hans.ts | 31 ++++++++++++++++++++----------- 9 files changed, 220 insertions(+), 92 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index e8e226e98548..4a9937a1d914 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5528,6 +5527,23 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU enableNewAccountsDescription: 'Neue Rillet-Konten werden als Kategorien verfügbar sein.', dimensionsImport: 'Alle Rillet-Dimensionen werden als Tags importiert', importDescription: 'Wählen Sie, welche Buchungskonfigurationen aus Rillet importiert werden sollen.', + noVendorsFound: 'Keine Anbieter gefunden', + noVendorsFoundDescription: 'Bitte fügen Sie Lieferanten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', + noAccountsFound: 'Keine Konten gefunden', + noAccountsFoundDescription: 'Bitte fügen Sie Konten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', + exportDescription: 'Konfigurieren Sie, wie Expensify-Daten nach Rillet exportiert werden.', + exportReimbursable: {label: 'Erstattungsfähige Ausgaben exportieren als', values: {label: 'Lieferantenrechnungen'}}, + exportDate: { + label: 'Rechnungsdatum des Lieferanten', + description: 'Verwenden Sie dieses Datum beim Exportieren von Berichten nach Rillet.', + values: {label: 'Eingereichtes Datum', description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.'}, + }, + exportCompanyCard: {label: 'Firmenkartenausgaben exportieren als', values: {label: 'Kreditkarten'}}, + defaultCompanyCardVendor: { + label: 'Standardanbieter für Firmenkarten', + description: 'Wählen Sie einen standardmäßigen Rillet-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.', + }, + companyCardAccount: {label: 'Firmenkartenkonto', description: 'Wählen Sie aus, wohin die Firmenkartentransaktionen exportiert werden sollen.'}, }, type: { free: 'Kostenlos', diff --git a/src/languages/es.ts b/src/languages/es.ts index b77c9aed0f3d..3b8848ec94e5 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1,6 +1,3 @@ -import CONST from '@src/CONST'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -12,12 +9,14 @@ import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import CONST from '@src/CONST'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import type en from './en'; import type {ConciergeBrokenCardConnectionParams, PaidElsewhereParams, RemoveCopilotAccessConfirmationParams, UnsupportedFormulaValueErrorParams} from './params'; import type {TranslationDeepObject} from './types'; - const translations: TranslationDeepObject = { common: { count: 'Contar', @@ -5363,6 +5362,23 @@ ${amount} para ${merchant} - ${date}`, enableNewAccountsDescription: 'Las nuevas cuentas de Rillet estarán disponibles como categorías.', dimensionsImport: 'Todas las dimensiones de Rillet se importan como etiquetas', importDescription: 'Elige qué configuraciones de codificación quieres importar desde Rillet.', + noVendorsFound: 'No se encontraron proveedores', + noVendorsFoundDescription: 'Por favor, añade proveedores en Rillet y sincroniza la conexión de nuevo', + noAccountsFound: 'No se encontraron cuentas', + noAccountsFoundDescription: 'Por favor, añade cuentas en Rillet y sincroniza la conexión de nuevo', + exportDescription: 'Configura cómo se exportan los datos de Expensify a Rillet.', + exportReimbursable: {label: 'Exportar gastos reembolsables como', values: {label: 'Facturas de proveedor'}}, + exportDate: { + label: 'Fecha de factura del proveedor', + description: 'Usa esta fecha al exportar informes a Rillet.', + values: {label: 'Fecha de envío', description: 'Fecha en que se envió el informe para su aprobación.'}, + }, + exportCompanyCard: {label: 'Exportar gastos de tarjetas de empresa como', values: {label: 'Tarjetas de crédito'}}, + defaultCompanyCardVendor: { + label: 'Proveedor predeterminado de la tarjeta de empresa', + description: 'Elige un proveedor Rillet predeterminado para los gastos que no se asignen automáticamente.', + }, + companyCardAccount: {label: 'Cuenta de tarjeta de empresa', description: 'Elige dónde exportar las transacciones de las tarjetas de la empresa.'}, }, type: { free: 'Gratis', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index f7b0f49d535f..d50c52ff51b0 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5540,6 +5539,23 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. enableNewAccountsDescription: 'Les nouveaux comptes Rillet seront disponibles en tant que catégories.', dimensionsImport: 'Toutes les dimensions Rillet sont importées en tant que tags', importDescription: 'Choisissez quelles configurations de codage importer depuis Rillet.', + noVendorsFound: 'Aucun fournisseur trouvé', + noVendorsFoundDescription: 'Veuillez ajouter des fournisseurs dans Rillet et synchroniser de nouveau la connexion', + noAccountsFound: 'Aucun compte trouvé', + noAccountsFoundDescription: 'Veuillez ajouter des comptes dans Rillet et synchroniser à nouveau la connexion', + exportDescription: 'Configurez comment les données Expensify sont exportées vers Rillet.', + exportReimbursable: {label: 'Exporter les dépenses remboursables en tant que', values: {label: 'Factures fournisseurs'}}, + exportDate: { + label: 'Date de la facture fournisseur', + description: 'Utiliser cette date lors de l’exportation des notes de frais vers Rillet.', + values: {label: 'Date de soumission', description: 'Date à laquelle la note de frais a été soumise pour approbation.'}, + }, + exportCompanyCard: {label: 'Exporter les dépenses de carte d’entreprise en tant que', values: {label: 'Cartes de crédit'}}, + defaultCompanyCardVendor: { + label: 'Fournisseur de carte entreprise par défaut', + description: 'Choisissez un fournisseur Rillet par défaut pour les dépenses qui ne correspondent pas automatiquement.', + }, + companyCardAccount: {label: 'Compte de carte d’entreprise', description: 'Choisissez où exporter les transactions de carte d’entreprise.'}, }, type: { free: 'Gratuit', diff --git a/src/languages/it.ts b/src/languages/it.ts index 490bb3b5b612..327bee710585 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5512,6 +5511,23 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. enableNewAccountsDescription: 'I nuovi conti Rillet saranno disponibili come categorie.', dimensionsImport: 'Tutte le dimensioni Rillet vengono importate come tag', importDescription: 'Scegli quali configurazioni di codifica importare da Rillet.', + noVendorsFound: 'Nessun fornitore trovato', + noVendorsFoundDescription: 'Aggiungi fornitori in Rillet e sincronizza di nuovo la connessione', + noAccountsFound: 'Nessun conto trovato', + noAccountsFoundDescription: 'Aggiungi degli account in Rillet e sincronizza di nuovo la connessione', + exportDescription: 'Configura come i dati di Expensify vengono esportati in Rillet.', + exportReimbursable: {label: 'Esporta le spese rimborsabili come', values: {label: 'Fatture fornitori'}}, + exportDate: { + label: 'Data fattura fornitore', + description: 'Usa questa data quando esporti i report su Rillet.', + values: {label: 'Data di invio', description: 'Data in cui il report è stato inviato per l’approvazione.'}, + }, + exportCompanyCard: {label: 'Esporta le spese della carta aziendale come', values: {label: 'Carte di credito'}}, + defaultCompanyCardVendor: { + label: 'Fornitore predefinito della carta aziendale', + description: 'Scegli un fornitore Rillet predefinito per le spese che non vengono abbinate automaticamente.', + }, + companyCardAccount: {label: 'Conto carta aziendale', description: 'Scegli dove esportare le transazioni delle carte aziendali.'}, }, type: { free: 'Gratis', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index e9fbdcd7f319..213df1d32612 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5455,6 +5454,20 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO enableNewAccountsDescription: '新しい Rillet アカウントは、カテゴリとして利用できるようになります。', dimensionsImport: 'すべての Rillet ディメンションがタグとしてインポートされます', importDescription: 'Rillet からインポートするコーディング構成を選択してください。', + noVendorsFound: '取引先が見つかりません', + noVendorsFoundDescription: 'Rillet にベンダーを追加して、もう一度接続を同期してください', + noAccountsFound: 'アカウントが見つかりません', + noAccountsFoundDescription: 'Rillet で口座を追加して、もう一度同期してください', + exportDescription: 'Expensify のデータを Rillet にエクスポートする方法を設定します。', + exportReimbursable: {label: '返金対象経費の書き出し形式', values: {label: '仕入先請求書'}}, + exportDate: { + label: '仕入先の請求書日', + description: 'レポートを Rillet にエクスポートするときは、この日付を使用します。', + values: {label: '提出日', description: 'レポートが承認申請のために提出された日付です。'}, + }, + exportCompanyCard: {label: '会社カード経費のエクスポート形式', values: {label: 'クレジットカード'}}, + defaultCompanyCardVendor: {label: 'デフォルトの会社カードベンダー', description: '自動的に一致しない経費に使用する既定の Rillet ベンダーを選択してください。'}, + companyCardAccount: {label: '会社カード口座', description: '会社カード取引のエクスポート先を選択してください。'}, }, type: { free: '無料', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c3db42b0e6dc..5551bc1146b1 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5502,6 +5501,20 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ enableNewAccountsDescription: 'Nieuwe Rillet-rekeningen zijn beschikbaar als categorieën.', dimensionsImport: 'Alle Rillet-dimensies worden als tags geïmporteerd', importDescription: 'Kies welke codeerconfiguraties je uit Rillet wilt importeren.', + noVendorsFound: 'Geen leveranciers gevonden', + noVendorsFoundDescription: 'Voeg leveranciers toe in Rillet en synchroniseer de verbinding opnieuw', + noAccountsFound: 'Geen accounts gevonden', + noAccountsFoundDescription: 'Voeg alsjeblieft rekeningen toe in Rillet en synchroniseer de verbinding opnieuw', + exportDescription: 'Stel in hoe Expensify-gegevens worden geëxporteerd naar Rillet.', + exportReimbursable: {label: 'Vergoedbare uitgaven exporteren als', values: {label: 'Leveranciersfacturen'}}, + exportDate: { + label: 'Factuurdatum leverancier', + description: 'Gebruik deze datum bij het exporteren van rapporten naar Rillet.', + values: {label: 'Datum van indiening', description: 'Datum waarop het rapport ter goedkeuring is ingediend.'}, + }, + exportCompanyCard: {label: 'Bedrijfspaskosten exporteren als', values: {label: 'Creditcards'}}, + defaultCompanyCardVendor: {label: 'Standaard leverancier bedrijfspas', description: 'Kies een standaard Rillet-leverancier voor uitgaven die niet automatisch worden gekoppeld.'}, + companyCardAccount: {label: 'Bedrijfskaartrekening', description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.'}, }, type: { free: 'Gratis', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 8fb91dccd585..26e096567c09 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5488,6 +5487,20 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy enableNewAccountsDescription: 'Nowe konta Rillet będą dostępne jako kategorie.', dimensionsImport: 'Wszystkie wymiary Rillet są importowane jako tagi', importDescription: 'Wybierz, które konfiguracje kodowania zaimportować z Rillet.', + noVendorsFound: 'Nie znaleziono dostawców', + noVendorsFoundDescription: 'Dodaj proszę dostawców w Rillet i zsynchronizuj połączenie ponownie', + noAccountsFound: 'Nie znaleziono kont', + noAccountsFoundDescription: 'Dodaj proszę konta w Rillet i zsynchronizuj połączenie ponownie', + exportDescription: 'Skonfiguruj sposób eksportowania danych Expensify do Rillet.', + exportReimbursable: {label: 'Eksportuj wydatki podlegające zwrotowi jako', values: {label: 'Faktury od dostawców'}}, + exportDate: { + label: 'Data rachunku od dostawcy', + description: 'Użyj tej daty podczas eksportowania raportów do Rillet.', + values: {label: 'Data wysłania', description: 'Data przesłania raportu do zatwierdzenia.'}, + }, + exportCompanyCard: {label: 'Eksportuj wydatki z firmowej karty jako', values: {label: 'Karty kredytowe'}}, + defaultCompanyCardVendor: {label: 'Domyślny dostawca karty firmowej', description: 'Wybierz domyślnego dostawcę Rillet dla wydatków, które nie dopasują się automatycznie.'}, + companyCardAccount: {label: 'Konto karty firmowej', description: 'Wybierz miejsce eksportu transakcji z kart firmowych.'}, }, type: { free: 'Darmowy', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index d90d7b581719..dfe8567231d6 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5493,6 +5492,23 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS enableNewAccountsDescription: 'Novas contas Rillet estarão disponíveis como categorias.', dimensionsImport: 'Todas as dimensões Rillet são importadas como tags', importDescription: 'Escolha quais configurações de codificação importar do Rillet.', + noVendorsFound: 'Nenhum fornecedor encontrado', + noVendorsFoundDescription: 'Adicione fornecedores no Rillet e sincronize a conexão novamente', + noAccountsFound: 'Nenhuma conta encontrada', + noAccountsFoundDescription: 'Adicione contas no Rillet e sincronize a conexão novamente', + exportDescription: 'Configure como os dados do Expensify são exportados para o Rillet.', + exportReimbursable: {label: 'Exportar despesas reembolsáveis como', values: {label: 'Faturas de fornecedores'}}, + exportDate: { + label: 'Data da fatura do fornecedor', + description: 'Use esta data ao exportar relatórios para o Rillet.', + values: {label: 'Data de envio', description: 'Data em que o relatório foi enviado para aprovação.'}, + }, + exportCompanyCard: {label: 'Exportar despesas de cartão corporativo como', values: {label: 'Cartões de crédito'}}, + defaultCompanyCardVendor: { + label: 'Fornecedor padrão do cartão corporativo', + description: 'Escolha um fornecedor Rillet padrão para despesas que não forem correspondidas automaticamente.', + }, + companyCardAccount: {label: 'Conta de cartão corporativo', description: 'Escolha para onde exportar as transações do cartão corporativo.'}, }, type: { free: 'Grátis', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 0b431dcae029..75f88b8a49f0 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5350,6 +5349,16 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM enableNewAccountsDescription: '新的 Rillet 账户将可作为类别使用。', dimensionsImport: '所有 Rillet 维度将作为标签导入', importDescription: '选择要从 Rillet 导入的编码配置。', + noVendorsFound: '未找到供应商', + noVendorsFoundDescription: '请在 Rillet 中添加供应商,然后再次同步连接', + noAccountsFound: '未找到账户', + noAccountsFoundDescription: '请在 Rillet 中添加账户并重新同步连接', + exportDescription: '配置 Expensify 数据导出到 Rillet 的方式。', + exportReimbursable: {label: '将可报销费用导出为', values: {label: '供应商账单'}}, + exportDate: {label: '供应商账单日期', description: '将报表导出到 Rillet 时使用此日期。', values: {label: '提交日期', description: '报表提交审批的日期。'}}, + exportCompanyCard: {label: '导出公司卡费用为', values: {label: '信用卡'}}, + defaultCompanyCardVendor: {label: '默认公司卡供应商', description: '为未自动匹配的报销选择一个默认的 Rillet 供应商。'}, + companyCardAccount: {label: '公司卡账户', description: '选择公司卡交易的导出位置。'}, }, type: { free: '免费', From a9275784656b464f6349c656f73dd3e2d8042c01 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 08:24:07 +0100 Subject: [PATCH 30/35] Revert "translate" This reverts commit e9173f9c5a2ed2c4f1a4589a3e2c04ba793f1a1d. --- src/languages/de.ts | 38 +++++++++++--------------------------- src/languages/es.ts | 24 ++++-------------------- src/languages/fr.ts | 38 +++++++++++--------------------------- src/languages/it.ts | 38 +++++++++++--------------------------- src/languages/ja.ts | 35 +++++++++++------------------------ src/languages/nl.ts | 35 +++++++++++------------------------ src/languages/pl.ts | 35 +++++++++++------------------------ src/languages/pt-BR.ts | 38 +++++++++++--------------------------- src/languages/zh-hans.ts | 31 +++++++++++-------------------- 9 files changed, 92 insertions(+), 220 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 4a9937a1d914..e8e226e98548 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5527,23 +5528,6 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU enableNewAccountsDescription: 'Neue Rillet-Konten werden als Kategorien verfügbar sein.', dimensionsImport: 'Alle Rillet-Dimensionen werden als Tags importiert', importDescription: 'Wählen Sie, welche Buchungskonfigurationen aus Rillet importiert werden sollen.', - noVendorsFound: 'Keine Anbieter gefunden', - noVendorsFoundDescription: 'Bitte fügen Sie Lieferanten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', - noAccountsFound: 'Keine Konten gefunden', - noAccountsFoundDescription: 'Bitte fügen Sie Konten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', - exportDescription: 'Konfigurieren Sie, wie Expensify-Daten nach Rillet exportiert werden.', - exportReimbursable: {label: 'Erstattungsfähige Ausgaben exportieren als', values: {label: 'Lieferantenrechnungen'}}, - exportDate: { - label: 'Rechnungsdatum des Lieferanten', - description: 'Verwenden Sie dieses Datum beim Exportieren von Berichten nach Rillet.', - values: {label: 'Eingereichtes Datum', description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.'}, - }, - exportCompanyCard: {label: 'Firmenkartenausgaben exportieren als', values: {label: 'Kreditkarten'}}, - defaultCompanyCardVendor: { - label: 'Standardanbieter für Firmenkarten', - description: 'Wählen Sie einen standardmäßigen Rillet-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.', - }, - companyCardAccount: {label: 'Firmenkartenkonto', description: 'Wählen Sie aus, wohin die Firmenkartentransaktionen exportiert werden sollen.'}, }, type: { free: 'Kostenlos', diff --git a/src/languages/es.ts b/src/languages/es.ts index 3b8848ec94e5..b77c9aed0f3d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1,3 +1,6 @@ +import CONST from '@src/CONST'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,14 +12,12 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import CONST from '@src/CONST'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import type en from './en'; import type {ConciergeBrokenCardConnectionParams, PaidElsewhereParams, RemoveCopilotAccessConfirmationParams, UnsupportedFormulaValueErrorParams} from './params'; import type {TranslationDeepObject} from './types'; + const translations: TranslationDeepObject = { common: { count: 'Contar', @@ -5362,23 +5363,6 @@ ${amount} para ${merchant} - ${date}`, enableNewAccountsDescription: 'Las nuevas cuentas de Rillet estarán disponibles como categorías.', dimensionsImport: 'Todas las dimensiones de Rillet se importan como etiquetas', importDescription: 'Elige qué configuraciones de codificación quieres importar desde Rillet.', - noVendorsFound: 'No se encontraron proveedores', - noVendorsFoundDescription: 'Por favor, añade proveedores en Rillet y sincroniza la conexión de nuevo', - noAccountsFound: 'No se encontraron cuentas', - noAccountsFoundDescription: 'Por favor, añade cuentas en Rillet y sincroniza la conexión de nuevo', - exportDescription: 'Configura cómo se exportan los datos de Expensify a Rillet.', - exportReimbursable: {label: 'Exportar gastos reembolsables como', values: {label: 'Facturas de proveedor'}}, - exportDate: { - label: 'Fecha de factura del proveedor', - description: 'Usa esta fecha al exportar informes a Rillet.', - values: {label: 'Fecha de envío', description: 'Fecha en que se envió el informe para su aprobación.'}, - }, - exportCompanyCard: {label: 'Exportar gastos de tarjetas de empresa como', values: {label: 'Tarjetas de crédito'}}, - defaultCompanyCardVendor: { - label: 'Proveedor predeterminado de la tarjeta de empresa', - description: 'Elige un proveedor Rillet predeterminado para los gastos que no se asignen automáticamente.', - }, - companyCardAccount: {label: 'Cuenta de tarjeta de empresa', description: 'Elige dónde exportar las transacciones de las tarjetas de la empresa.'}, }, type: { free: 'Gratis', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index d50c52ff51b0..f7b0f49d535f 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5539,23 +5540,6 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. enableNewAccountsDescription: 'Les nouveaux comptes Rillet seront disponibles en tant que catégories.', dimensionsImport: 'Toutes les dimensions Rillet sont importées en tant que tags', importDescription: 'Choisissez quelles configurations de codage importer depuis Rillet.', - noVendorsFound: 'Aucun fournisseur trouvé', - noVendorsFoundDescription: 'Veuillez ajouter des fournisseurs dans Rillet et synchroniser de nouveau la connexion', - noAccountsFound: 'Aucun compte trouvé', - noAccountsFoundDescription: 'Veuillez ajouter des comptes dans Rillet et synchroniser à nouveau la connexion', - exportDescription: 'Configurez comment les données Expensify sont exportées vers Rillet.', - exportReimbursable: {label: 'Exporter les dépenses remboursables en tant que', values: {label: 'Factures fournisseurs'}}, - exportDate: { - label: 'Date de la facture fournisseur', - description: 'Utiliser cette date lors de l’exportation des notes de frais vers Rillet.', - values: {label: 'Date de soumission', description: 'Date à laquelle la note de frais a été soumise pour approbation.'}, - }, - exportCompanyCard: {label: 'Exporter les dépenses de carte d’entreprise en tant que', values: {label: 'Cartes de crédit'}}, - defaultCompanyCardVendor: { - label: 'Fournisseur de carte entreprise par défaut', - description: 'Choisissez un fournisseur Rillet par défaut pour les dépenses qui ne correspondent pas automatiquement.', - }, - companyCardAccount: {label: 'Compte de carte d’entreprise', description: 'Choisissez où exporter les transactions de carte d’entreprise.'}, }, type: { free: 'Gratuit', diff --git a/src/languages/it.ts b/src/languages/it.ts index 327bee710585..490bb3b5b612 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5511,23 +5512,6 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. enableNewAccountsDescription: 'I nuovi conti Rillet saranno disponibili come categorie.', dimensionsImport: 'Tutte le dimensioni Rillet vengono importate come tag', importDescription: 'Scegli quali configurazioni di codifica importare da Rillet.', - noVendorsFound: 'Nessun fornitore trovato', - noVendorsFoundDescription: 'Aggiungi fornitori in Rillet e sincronizza di nuovo la connessione', - noAccountsFound: 'Nessun conto trovato', - noAccountsFoundDescription: 'Aggiungi degli account in Rillet e sincronizza di nuovo la connessione', - exportDescription: 'Configura come i dati di Expensify vengono esportati in Rillet.', - exportReimbursable: {label: 'Esporta le spese rimborsabili come', values: {label: 'Fatture fornitori'}}, - exportDate: { - label: 'Data fattura fornitore', - description: 'Usa questa data quando esporti i report su Rillet.', - values: {label: 'Data di invio', description: 'Data in cui il report è stato inviato per l’approvazione.'}, - }, - exportCompanyCard: {label: 'Esporta le spese della carta aziendale come', values: {label: 'Carte di credito'}}, - defaultCompanyCardVendor: { - label: 'Fornitore predefinito della carta aziendale', - description: 'Scegli un fornitore Rillet predefinito per le spese che non vengono abbinate automaticamente.', - }, - companyCardAccount: {label: 'Conto carta aziendale', description: 'Scegli dove esportare le transazioni delle carte aziendali.'}, }, type: { free: 'Gratis', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 213df1d32612..e9fbdcd7f319 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5454,20 +5455,6 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO enableNewAccountsDescription: '新しい Rillet アカウントは、カテゴリとして利用できるようになります。', dimensionsImport: 'すべての Rillet ディメンションがタグとしてインポートされます', importDescription: 'Rillet からインポートするコーディング構成を選択してください。', - noVendorsFound: '取引先が見つかりません', - noVendorsFoundDescription: 'Rillet にベンダーを追加して、もう一度接続を同期してください', - noAccountsFound: 'アカウントが見つかりません', - noAccountsFoundDescription: 'Rillet で口座を追加して、もう一度同期してください', - exportDescription: 'Expensify のデータを Rillet にエクスポートする方法を設定します。', - exportReimbursable: {label: '返金対象経費の書き出し形式', values: {label: '仕入先請求書'}}, - exportDate: { - label: '仕入先の請求書日', - description: 'レポートを Rillet にエクスポートするときは、この日付を使用します。', - values: {label: '提出日', description: 'レポートが承認申請のために提出された日付です。'}, - }, - exportCompanyCard: {label: '会社カード経費のエクスポート形式', values: {label: 'クレジットカード'}}, - defaultCompanyCardVendor: {label: 'デフォルトの会社カードベンダー', description: '自動的に一致しない経費に使用する既定の Rillet ベンダーを選択してください。'}, - companyCardAccount: {label: '会社カード口座', description: '会社カード取引のエクスポート先を選択してください。'}, }, type: { free: '無料', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 5551bc1146b1..c3db42b0e6dc 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5501,20 +5502,6 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ enableNewAccountsDescription: 'Nieuwe Rillet-rekeningen zijn beschikbaar als categorieën.', dimensionsImport: 'Alle Rillet-dimensies worden als tags geïmporteerd', importDescription: 'Kies welke codeerconfiguraties je uit Rillet wilt importeren.', - noVendorsFound: 'Geen leveranciers gevonden', - noVendorsFoundDescription: 'Voeg leveranciers toe in Rillet en synchroniseer de verbinding opnieuw', - noAccountsFound: 'Geen accounts gevonden', - noAccountsFoundDescription: 'Voeg alsjeblieft rekeningen toe in Rillet en synchroniseer de verbinding opnieuw', - exportDescription: 'Stel in hoe Expensify-gegevens worden geëxporteerd naar Rillet.', - exportReimbursable: {label: 'Vergoedbare uitgaven exporteren als', values: {label: 'Leveranciersfacturen'}}, - exportDate: { - label: 'Factuurdatum leverancier', - description: 'Gebruik deze datum bij het exporteren van rapporten naar Rillet.', - values: {label: 'Datum van indiening', description: 'Datum waarop het rapport ter goedkeuring is ingediend.'}, - }, - exportCompanyCard: {label: 'Bedrijfspaskosten exporteren als', values: {label: 'Creditcards'}}, - defaultCompanyCardVendor: {label: 'Standaard leverancier bedrijfspas', description: 'Kies een standaard Rillet-leverancier voor uitgaven die niet automatisch worden gekoppeld.'}, - companyCardAccount: {label: 'Bedrijfskaartrekening', description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.'}, }, type: { free: 'Gratis', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 26e096567c09..8fb91dccd585 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5487,20 +5488,6 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy enableNewAccountsDescription: 'Nowe konta Rillet będą dostępne jako kategorie.', dimensionsImport: 'Wszystkie wymiary Rillet są importowane jako tagi', importDescription: 'Wybierz, które konfiguracje kodowania zaimportować z Rillet.', - noVendorsFound: 'Nie znaleziono dostawców', - noVendorsFoundDescription: 'Dodaj proszę dostawców w Rillet i zsynchronizuj połączenie ponownie', - noAccountsFound: 'Nie znaleziono kont', - noAccountsFoundDescription: 'Dodaj proszę konta w Rillet i zsynchronizuj połączenie ponownie', - exportDescription: 'Skonfiguruj sposób eksportowania danych Expensify do Rillet.', - exportReimbursable: {label: 'Eksportuj wydatki podlegające zwrotowi jako', values: {label: 'Faktury od dostawców'}}, - exportDate: { - label: 'Data rachunku od dostawcy', - description: 'Użyj tej daty podczas eksportowania raportów do Rillet.', - values: {label: 'Data wysłania', description: 'Data przesłania raportu do zatwierdzenia.'}, - }, - exportCompanyCard: {label: 'Eksportuj wydatki z firmowej karty jako', values: {label: 'Karty kredytowe'}}, - defaultCompanyCardVendor: {label: 'Domyślny dostawca karty firmowej', description: 'Wybierz domyślnego dostawcę Rillet dla wydatków, które nie dopasują się automatycznie.'}, - companyCardAccount: {label: 'Konto karty firmowej', description: 'Wybierz miejsce eksportu transakcji z kart firmowych.'}, }, type: { free: 'Darmowy', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index dfe8567231d6..d90d7b581719 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5492,23 +5493,6 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS enableNewAccountsDescription: 'Novas contas Rillet estarão disponíveis como categorias.', dimensionsImport: 'Todas as dimensões Rillet são importadas como tags', importDescription: 'Escolha quais configurações de codificação importar do Rillet.', - noVendorsFound: 'Nenhum fornecedor encontrado', - noVendorsFoundDescription: 'Adicione fornecedores no Rillet e sincronize a conexão novamente', - noAccountsFound: 'Nenhuma conta encontrada', - noAccountsFoundDescription: 'Adicione contas no Rillet e sincronize a conexão novamente', - exportDescription: 'Configure como os dados do Expensify são exportados para o Rillet.', - exportReimbursable: {label: 'Exportar despesas reembolsáveis como', values: {label: 'Faturas de fornecedores'}}, - exportDate: { - label: 'Data da fatura do fornecedor', - description: 'Use esta data ao exportar relatórios para o Rillet.', - values: {label: 'Data de envio', description: 'Data em que o relatório foi enviado para aprovação.'}, - }, - exportCompanyCard: {label: 'Exportar despesas de cartão corporativo como', values: {label: 'Cartões de crédito'}}, - defaultCompanyCardVendor: { - label: 'Fornecedor padrão do cartão corporativo', - description: 'Escolha um fornecedor Rillet padrão para despesas que não forem correspondidas automaticamente.', - }, - companyCardAccount: {label: 'Conta de cartão corporativo', description: 'Escolha para onde exportar as transações do cartão corporativo.'}, }, type: { free: 'Grátis', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 75f88b8a49f0..0b431dcae029 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -1,3 +1,13 @@ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -9,16 +19,6 @@ * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,6 +63,7 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; + type StateValue = { stateISO: string; stateName: string; @@ -5349,16 +5350,6 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM enableNewAccountsDescription: '新的 Rillet 账户将可作为类别使用。', dimensionsImport: '所有 Rillet 维度将作为标签导入', importDescription: '选择要从 Rillet 导入的编码配置。', - noVendorsFound: '未找到供应商', - noVendorsFoundDescription: '请在 Rillet 中添加供应商,然后再次同步连接', - noAccountsFound: '未找到账户', - noAccountsFoundDescription: '请在 Rillet 中添加账户并重新同步连接', - exportDescription: '配置 Expensify 数据导出到 Rillet 的方式。', - exportReimbursable: {label: '将可报销费用导出为', values: {label: '供应商账单'}}, - exportDate: {label: '供应商账单日期', description: '将报表导出到 Rillet 时使用此日期。', values: {label: '提交日期', description: '报表提交审批的日期。'}}, - exportCompanyCard: {label: '导出公司卡费用为', values: {label: '信用卡'}}, - defaultCompanyCardVendor: {label: '默认公司卡供应商', description: '为未自动匹配的报销选择一个默认的 Rillet 供应商。'}, - companyCardAccount: {label: '公司卡账户', description: '选择公司卡交易的导出位置。'}, }, type: { free: '免费', From f74d08a2a461348de1de523e8656697142a0eabc Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 12:40:42 +0100 Subject: [PATCH 31/35] translate --- src/languages/de.ts | 51 +++++++++++++++++++++++++++++++--------- src/languages/es.ts | 37 +++++++++++++++++++++++++---- src/languages/fr.ts | 51 +++++++++++++++++++++++++++++++--------- src/languages/it.ts | 51 +++++++++++++++++++++++++++++++--------- src/languages/ja.ts | 48 ++++++++++++++++++++++++++++--------- src/languages/nl.ts | 48 ++++++++++++++++++++++++++++--------- src/languages/pl.ts | 48 ++++++++++++++++++++++++++++--------- src/languages/pt-BR.ts | 51 +++++++++++++++++++++++++++++++--------- src/languages/zh-hans.ts | 48 ++++++++++++++++++++++++++++--------- 9 files changed, 341 insertions(+), 92 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 7696b34267a8..1d22d512ca9b 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5531,6 +5530,36 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU enableNewAccountsDescription: 'Neue Rillet-Konten werden als Kategorien verfügbar sein.', dimensionsImport: 'Alle Rillet-Dimensionen werden als Tags importiert', importDescription: 'Wählen Sie, welche Buchungskonfigurationen aus Rillet importiert werden sollen.', + noVendorsFound: 'Keine Anbieter gefunden', + noVendorsFoundDescription: 'Bitte fügen Sie Lieferanten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', + noAccountsFound: 'Keine Konten gefunden', + noAccountsFoundDescription: 'Bitte fügen Sie Konten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', + exportDescription: 'Konfigurieren Sie, wie Expensify-Daten nach Rillet exportiert werden.', + exportReimbursable: {label: 'Erstattungsfähige Ausgaben exportieren als', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Lieferantenrechnungen'}}}, + exportDate: { + label: 'Rechnungsdatum des Lieferanten', + description: 'Verwenden Sie dieses Datum beim Exportieren von Berichten nach Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Datum der letzten Ausgabe', + description: 'Datum der letzten im Bericht erfassten Ausgabe.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Exportdatum', + description: 'Datum, an dem der Bericht nach Rillet exportiert wurde.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Einreichungsdatum', + description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.', + }, + }, + }, + exportCompanyCard: {label: 'Firmenkartenausgaben exportieren als', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Kreditkarten'}}}, + defaultCompanyCardVendor: { + label: 'Standardanbieter für Firmenkarten', + description: 'Wählen Sie einen standardmäßigen Rillet-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.', + }, + companyCardAccount: {label: 'Firmenkartenkonto', description: 'Wählen Sie aus, wohin die Firmenkartentransaktionen exportiert werden sollen.'}, }, type: { free: 'Kostenlos', diff --git a/src/languages/es.ts b/src/languages/es.ts index c75e04868bdf..a6b340631067 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1,6 +1,3 @@ -import CONST from '@src/CONST'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -12,12 +9,14 @@ import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import CONST from '@src/CONST'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import type en from './en'; import type {ConciergeBrokenCardConnectionParams, PaidElsewhereParams, RemoveCopilotAccessConfirmationParams, UnsupportedFormulaValueErrorParams} from './params'; import type {TranslationDeepObject} from './types'; - const translations: TranslationDeepObject = { common: { count: 'Contar', @@ -5366,6 +5365,36 @@ ${amount} para ${merchant} - ${date}`, enableNewAccountsDescription: 'Las nuevas cuentas de Rillet estarán disponibles como categorías.', dimensionsImport: 'Todas las dimensiones de Rillet se importan como etiquetas', importDescription: 'Elige qué configuraciones de codificación quieres importar desde Rillet.', + noVendorsFound: 'No se encontraron proveedores', + noVendorsFoundDescription: 'Por favor, añade proveedores en Rillet y sincroniza la conexión de nuevo', + noAccountsFound: 'No se encontraron cuentas', + noAccountsFoundDescription: 'Por favor, añade cuentas en Rillet y sincroniza la conexión de nuevo', + exportDescription: 'Configura cómo se exportan los datos de Expensify a Rillet.', + exportReimbursable: {label: 'Exportar gastos reembolsables como', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Facturas de proveedor'}}}, + exportDate: { + label: 'Fecha de factura del proveedor', + description: 'Usa esta fecha al exportar informes a Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Fecha del último gasto', + description: 'Fecha del gasto más reciente del informe.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Fecha de exportación', + description: 'Fecha en que se exportó el informe a Rillet.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Fecha de envío', + description: 'Fecha en que se envió el informe para su aprobación.', + }, + }, + }, + exportCompanyCard: {label: 'Exportar gastos de tarjetas de empresa como', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Tarjetas de crédito'}}}, + defaultCompanyCardVendor: { + label: 'Proveedor predeterminado de la tarjeta de empresa', + description: 'Elige un proveedor Rillet predeterminado para los gastos que no se asignen automáticamente.', + }, + companyCardAccount: {label: 'Cuenta de tarjeta de empresa', description: 'Elige dónde exportar las transacciones de las tarjetas de la empresa.'}, }, type: { free: 'Gratis', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 0106e99c1ccd..c27aab615ceb 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5543,6 +5542,36 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. enableNewAccountsDescription: 'Les nouveaux comptes Rillet seront disponibles en tant que catégories.', dimensionsImport: 'Toutes les dimensions Rillet sont importées en tant que tags', importDescription: 'Choisissez quelles configurations de codage importer depuis Rillet.', + noVendorsFound: 'Aucun fournisseur trouvé', + noVendorsFoundDescription: 'Veuillez ajouter des fournisseurs dans Rillet et synchroniser de nouveau la connexion', + noAccountsFound: 'Aucun compte trouvé', + noAccountsFoundDescription: 'Veuillez ajouter des comptes dans Rillet et synchroniser à nouveau la connexion', + exportDescription: 'Configurez comment les données Expensify sont exportées vers Rillet.', + exportReimbursable: {label: 'Exporter les dépenses remboursables en tant que', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Factures fournisseurs'}}}, + exportDate: { + label: 'Date de la facture fournisseur', + description: 'Utiliser cette date lors de l’exportation des notes de frais vers Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Date de la dernière dépense', + description: 'Date de la dépense la plus récente figurant dans le rapport.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: "Date d'exportation", + description: "Date d'exportation du rapport vers Rillet.", + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Date de soumission', + description: 'Date de soumission du rapport pour approbation.', + }, + }, + }, + exportCompanyCard: {label: 'Exporter les dépenses de carte d’entreprise en tant que', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Cartes de crédit'}}}, + defaultCompanyCardVendor: { + label: 'Fournisseur de carte entreprise par défaut', + description: 'Choisissez un fournisseur Rillet par défaut pour les dépenses qui ne correspondent pas automatiquement.', + }, + companyCardAccount: {label: 'Compte de carte d’entreprise', description: 'Choisissez où exporter les transactions de carte d’entreprise.'}, }, type: { free: 'Gratuit', diff --git a/src/languages/it.ts b/src/languages/it.ts index 414bf984174e..a327cea2e451 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5515,6 +5514,36 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. enableNewAccountsDescription: 'I nuovi conti Rillet saranno disponibili come categorie.', dimensionsImport: 'Tutte le dimensioni Rillet vengono importate come tag', importDescription: 'Scegli quali configurazioni di codifica importare da Rillet.', + noVendorsFound: 'Nessun fornitore trovato', + noVendorsFoundDescription: 'Aggiungi fornitori in Rillet e sincronizza di nuovo la connessione', + noAccountsFound: 'Nessun conto trovato', + noAccountsFoundDescription: 'Aggiungi degli account in Rillet e sincronizza di nuovo la connessione', + exportDescription: 'Configura come i dati di Expensify vengono esportati in Rillet.', + exportReimbursable: {label: 'Esporta le spese rimborsabili come', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Fatture fornitori'}}}, + exportDate: { + label: 'Data fattura fornitore', + description: 'Usa questa data quando esporti i report su Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: "Data dell'ultima spesa", + description: 'Data della spesa più recente riportata nel report.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Data di esportazione', + description: 'Data di esportazione del report a Rillet.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Data di invio', + description: "Data di invio del report per l'approvazione.", + }, + }, + }, + exportCompanyCard: {label: 'Esporta le spese della carta aziendale come', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Carte di credito'}}}, + defaultCompanyCardVendor: { + label: 'Fornitore predefinito della carta aziendale', + description: 'Scegli un fornitore Rillet predefinito per le spese che non vengono abbinate automaticamente.', + }, + companyCardAccount: {label: 'Conto carta aziendale', description: 'Scegli dove esportare le transazioni delle carte aziendali.'}, }, type: { free: 'Gratis', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index faab54802e7f..de30f203daab 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5458,6 +5457,33 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO enableNewAccountsDescription: '新しい Rillet アカウントは、カテゴリとして利用できるようになります。', dimensionsImport: 'すべての Rillet ディメンションがタグとしてインポートされます', importDescription: 'Rillet からインポートするコーディング構成を選択してください。', + noVendorsFound: '取引先が見つかりません', + noVendorsFoundDescription: 'Rillet にベンダーを追加して、もう一度接続を同期してください', + noAccountsFound: 'アカウントが見つかりません', + noAccountsFoundDescription: 'Rillet で口座を追加して、もう一度同期してください', + exportDescription: 'Expensify のデータを Rillet にエクスポートする方法を設定します。', + exportReimbursable: {label: '返金対象経費の書き出し形式', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: '仕入先請求書'}}}, + exportDate: { + label: '仕入先の請求書日', + description: 'レポートを Rillet にエクスポートするときは、この日付を使用します。', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: '最終支出日', + description: 'レポートに記載されている最新の支出日。', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'エクスポート日', + description: 'レポートがRilletにエクスポートされた日付。', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: '提出日', + description: 'レポートが承認のために提出された日付。', + }, + }, + }, + exportCompanyCard: {label: '会社カード経費のエクスポート形式', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'クレジットカード'}}}, + defaultCompanyCardVendor: {label: 'デフォルトの会社カードベンダー', description: '自動的に一致しない経費に使用する既定の Rillet ベンダーを選択してください。'}, + companyCardAccount: {label: '会社カード口座', description: '会社カード取引のエクスポート先を選択してください。'}, }, type: { free: '無料', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 5e971515d9e6..1b3297eb9ff5 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5505,6 +5504,33 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ enableNewAccountsDescription: 'Nieuwe Rillet-rekeningen zijn beschikbaar als categorieën.', dimensionsImport: 'Alle Rillet-dimensies worden als tags geïmporteerd', importDescription: 'Kies welke codeerconfiguraties je uit Rillet wilt importeren.', + noVendorsFound: 'Geen leveranciers gevonden', + noVendorsFoundDescription: 'Voeg leveranciers toe in Rillet en synchroniseer de verbinding opnieuw', + noAccountsFound: 'Geen accounts gevonden', + noAccountsFoundDescription: 'Voeg alsjeblieft rekeningen toe in Rillet en synchroniseer de verbinding opnieuw', + exportDescription: 'Stel in hoe Expensify-gegevens worden geëxporteerd naar Rillet.', + exportReimbursable: {label: 'Vergoedbare uitgaven exporteren als', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Leveranciersfacturen'}}}, + exportDate: { + label: 'Factuurdatum leverancier', + description: 'Gebruik deze datum bij het exporteren van rapporten naar Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Datum van de laatste uitgave', + description: 'Datum van de meest recente uitgave op het rapport.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Exportdatum', + description: 'Datum waarop het rapport naar Rillet is geëxporteerd.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Inleverdatum', + description: 'Datum waarop het rapport ter goedkeuring is ingediend.', + }, + }, + }, + exportCompanyCard: {label: 'Bedrijfspaskosten exporteren als', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Creditcards'}}}, + defaultCompanyCardVendor: {label: 'Standaard leverancier bedrijfspas', description: 'Kies een standaard Rillet-leverancier voor uitgaven die niet automatisch worden gekoppeld.'}, + companyCardAccount: {label: 'Bedrijfskaartrekening', description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.'}, }, type: { free: 'Gratis', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index d9fb9910d3d2..2a78aad14939 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5491,6 +5490,33 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy enableNewAccountsDescription: 'Nowe konta Rillet będą dostępne jako kategorie.', dimensionsImport: 'Wszystkie wymiary Rillet są importowane jako tagi', importDescription: 'Wybierz, które konfiguracje kodowania zaimportować z Rillet.', + noVendorsFound: 'Nie znaleziono dostawców', + noVendorsFoundDescription: 'Dodaj proszę dostawców w Rillet i zsynchronizuj połączenie ponownie', + noAccountsFound: 'Nie znaleziono kont', + noAccountsFoundDescription: 'Dodaj proszę konta w Rillet i zsynchronizuj połączenie ponownie', + exportDescription: 'Skonfiguruj sposób eksportowania danych Expensify do Rillet.', + exportReimbursable: {label: 'Eksportuj wydatki podlegające zwrotowi jako', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Faktury od dostawców'}}}, + exportDate: { + label: 'Data rachunku od dostawcy', + description: 'Użyj tej daty podczas eksportowania raportów do Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Data ostatniego wydatku', + description: 'Data ostatniego wydatku w raporcie.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Data eksportu', + description: 'Data wyeksportowania raportu do Rillet.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Data przesłania', + description: 'Data przesłania raportu do zatwierdzenia.', + }, + }, + }, + exportCompanyCard: {label: 'Eksportuj wydatki z firmowej karty jako', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Karty kredytowe'}}}, + defaultCompanyCardVendor: {label: 'Domyślny dostawca karty firmowej', description: 'Wybierz domyślnego dostawcę Rillet dla wydatków, które nie dopasują się automatycznie.'}, + companyCardAccount: {label: 'Konto karty firmowej', description: 'Wybierz miejsce eksportu transakcji z kart firmowych.'}, }, type: { free: 'Darmowy', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7969f43fd0e7..16e8f7e128e4 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5496,6 +5495,36 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS enableNewAccountsDescription: 'Novas contas Rillet estarão disponíveis como categorias.', dimensionsImport: 'Todas as dimensões Rillet são importadas como tags', importDescription: 'Escolha quais configurações de codificação importar do Rillet.', + noVendorsFound: 'Nenhum fornecedor encontrado', + noVendorsFoundDescription: 'Adicione fornecedores no Rillet e sincronize a conexão novamente', + noAccountsFound: 'Nenhuma conta encontrada', + noAccountsFoundDescription: 'Adicione contas no Rillet e sincronize a conexão novamente', + exportDescription: 'Configure como os dados do Expensify são exportados para o Rillet.', + exportReimbursable: {label: 'Exportar despesas reembolsáveis como', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Faturas de fornecedores'}}}, + exportDate: { + label: 'Data da fatura do fornecedor', + description: 'Use esta data ao exportar relatórios para o Rillet.', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: 'Data da última despesa', + description: 'Data da despesa mais recente no relatório.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: 'Data de exportação', + description: 'Data em que o relatório foi exportado para o Rillet.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: 'Data de envio', + description: 'Data em que o relatório foi enviado para aprovação.', + }, + }, + }, + exportCompanyCard: {label: 'Exportar despesas de cartão corporativo como', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: 'Cartões de crédito'}}}, + defaultCompanyCardVendor: { + label: 'Fornecedor padrão do cartão corporativo', + description: 'Escolha um fornecedor Rillet padrão para despesas que não forem correspondidas automaticamente.', + }, + companyCardAccount: {label: 'Conta de cartão corporativo', description: 'Escolha para onde exportar as transações do cartão corporativo.'}, }, type: { free: 'Grátis', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index c356f29f4cf1..5e19efabc54b 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -1,13 +1,3 @@ -import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; -import StringUtils from '@libs/StringUtils'; - -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import type OriginalMessage from '@src/types/onyx/OriginalMessage'; -import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; - -import type {ValueOf} from 'type-fest'; - /** * _____ __ __ * / ___/__ ___ ___ _______ _/ /____ ___/ / @@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest'; * - Improve the prompts in prompts/translation, or * - Improve context annotations in src/languages/en.ts */ +import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow'; +import StringUtils from '@libs/StringUtils'; + +import CONST from '@src/CONST'; +import type {Country} from '@src/CONST'; +import type OriginalMessage from '@src/types/onyx/OriginalMessage'; +import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage'; + +import type {ValueOf} from 'type-fest'; + import {CONST as COMMON_CONST, Str} from 'expensify-common'; import startCase from 'lodash/startCase'; @@ -63,7 +63,6 @@ import type { YourPlanPriceParams, } from './params'; import type {TranslationDeepObject} from './types'; - type StateValue = { stateISO: string; stateName: string; @@ -5353,6 +5352,33 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM enableNewAccountsDescription: '新的 Rillet 账户将可作为类别使用。', dimensionsImport: '所有 Rillet 维度将作为标签导入', importDescription: '选择要从 Rillet 导入的编码配置。', + noVendorsFound: '未找到供应商', + noVendorsFoundDescription: '请在 Rillet 中添加供应商,然后再次同步连接', + noAccountsFound: '未找到账户', + noAccountsFoundDescription: '请在 Rillet 中添加账户并重新同步连接', + exportDescription: '配置 Expensify 数据导出到 Rillet 的方式。', + exportReimbursable: {label: '将可报销费用导出为', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: '供应商账单'}}}, + exportDate: { + label: '供应商账单日期', + description: '将报表导出到 Rillet 时使用此日期。', + values: { + [CONST.RILLET_EXPORT_DATE.LAST_EXPENSE]: { + label: '最新支出日期', + description: '报告中最近一次支出的日期.', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_EXPORTED]: { + label: '导出日期', + description: '报告导出至 Rillet 的日期。', + }, + [CONST.RILLET_EXPORT_DATE.REPORT_SUBMITTED]: { + label: '提交日期', + description: '报告提交审批的日期。', + }, + }, + }, + exportCompanyCard: {label: '导出公司卡费用为', values: {[CONST.RILLET_EXPORT_COMPANY_CARD.CREDIT_CARD]: {label: '信用卡'}}}, + defaultCompanyCardVendor: {label: '默认公司卡供应商', description: '为未自动匹配的报销选择一个默认的 Rillet 供应商。'}, + companyCardAccount: {label: '公司卡账户', description: '选择公司卡交易的导出位置。'}, }, type: { free: '免费', From a134640de100ccec336e931a9ad28f01822b54ec Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:38:09 +0100 Subject: [PATCH 32/35] add Rillet non-reimbursable url --- src/libs/ReportActionsUtils.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 4b258002de8b..ad0484bf32af 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -50,6 +50,7 @@ import clone from 'lodash/clone'; import isEmpty from 'lodash/isEmpty'; import Onyx from 'react-native-onyx'; +import type EnvironmentType from './Environment/getEnvironment/types'; import type {MessageElementBase, MessageTextElement} from './MessageElement'; import type {getReportName} from './ReportNameUtils'; import type {OptimisticIOUReportAction, PartialReportAction} from './ReportUtils'; @@ -59,6 +60,7 @@ import {getDecodedCategoryName} from './CategoryUtils'; import {convertAmountToDisplayString, convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithExplicitCurrency, convertToShortDisplayString} from './CurrencyUtils'; import DateUtils from './DateUtils'; import {getEnvironmentURL, getOldDotEnvironmentURL} from './Environment/Environment'; +import getEnvironment from './Environment/getEnvironment'; import getBase62ReportID from './getBase62ReportID'; import {isReportMessageAttachment} from './isReportMessageAttachment'; import {toLocaleOrdinal} from './LocaleDigitUtils'; @@ -154,6 +156,8 @@ Onyx.connectWithoutView({ let environmentURL: string; getEnvironmentURL().then((url: string) => (environmentURL = url)); +let environment: EnvironmentType; +getEnvironment().then((env) => (environment = env)); let oldDotEnvironmentURL: string; getOldDotEnvironmentURL().then((url: string) => (oldDotEnvironmentURL = url)); @@ -179,6 +183,12 @@ const SALESFORCE_EXPENSES_URL_PREFIX = 'https://login.salesforce.com/'; */ const QBO_EXPENSES_URL = 'https://qbo.intuit.com/app/expenses'; +/* + * Url to the Rillet non reimbursable expenses list + */ +const RILLET_SANDBOX_NON_REIMBURSABLE_EXPENSES_URL = 'https://sandbox.rillet.io/accounts-payable/charges'; +const RILLET_NON_REIMBURSABLE_EXPENSES_URL = 'https://app.rillet.io/accounts-payable/charges'; + const POLICY_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG)); const MEMBER_CHANGE_ARRAY = new Set([ @@ -2804,8 +2814,7 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url = nonReimbursableUrls.at(0)?.substring(0, SALESFORCE_EXPENSES_URL_PREFIX.length + 3) ?? ''; break; case CONST.EXPORT_LABELS.RILLET: - // s77rt TODO Test in R3 https://github.com/Expensify/App/issues/94848 - url = ''; + url = environment === CONST.ENVIRONMENT.PRODUCTION ? RILLET_NON_REIMBURSABLE_EXPENSES_URL : RILLET_SANDBOX_NON_REIMBURSABLE_EXPENSES_URL; break; default: url = QBO_EXPENSES_URL; From ec2ce24eb6550179a9c5c975beca82d0cdab5c7b Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 20:13:05 +0100 Subject: [PATCH 33/35] Revert "add Rillet non-reimbursable url" This reverts commit a134640de100ccec336e931a9ad28f01822b54ec. --- src/libs/ReportActionsUtils.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index ad0484bf32af..4b258002de8b 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -50,7 +50,6 @@ import clone from 'lodash/clone'; import isEmpty from 'lodash/isEmpty'; import Onyx from 'react-native-onyx'; -import type EnvironmentType from './Environment/getEnvironment/types'; import type {MessageElementBase, MessageTextElement} from './MessageElement'; import type {getReportName} from './ReportNameUtils'; import type {OptimisticIOUReportAction, PartialReportAction} from './ReportUtils'; @@ -60,7 +59,6 @@ import {getDecodedCategoryName} from './CategoryUtils'; import {convertAmountToDisplayString, convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithExplicitCurrency, convertToShortDisplayString} from './CurrencyUtils'; import DateUtils from './DateUtils'; import {getEnvironmentURL, getOldDotEnvironmentURL} from './Environment/Environment'; -import getEnvironment from './Environment/getEnvironment'; import getBase62ReportID from './getBase62ReportID'; import {isReportMessageAttachment} from './isReportMessageAttachment'; import {toLocaleOrdinal} from './LocaleDigitUtils'; @@ -156,8 +154,6 @@ Onyx.connectWithoutView({ let environmentURL: string; getEnvironmentURL().then((url: string) => (environmentURL = url)); -let environment: EnvironmentType; -getEnvironment().then((env) => (environment = env)); let oldDotEnvironmentURL: string; getOldDotEnvironmentURL().then((url: string) => (oldDotEnvironmentURL = url)); @@ -183,12 +179,6 @@ const SALESFORCE_EXPENSES_URL_PREFIX = 'https://login.salesforce.com/'; */ const QBO_EXPENSES_URL = 'https://qbo.intuit.com/app/expenses'; -/* - * Url to the Rillet non reimbursable expenses list - */ -const RILLET_SANDBOX_NON_REIMBURSABLE_EXPENSES_URL = 'https://sandbox.rillet.io/accounts-payable/charges'; -const RILLET_NON_REIMBURSABLE_EXPENSES_URL = 'https://app.rillet.io/accounts-payable/charges'; - const POLICY_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG)); const MEMBER_CHANGE_ARRAY = new Set([ @@ -2814,7 +2804,8 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url = nonReimbursableUrls.at(0)?.substring(0, SALESFORCE_EXPENSES_URL_PREFIX.length + 3) ?? ''; break; case CONST.EXPORT_LABELS.RILLET: - url = environment === CONST.ENVIRONMENT.PRODUCTION ? RILLET_NON_REIMBURSABLE_EXPENSES_URL : RILLET_SANDBOX_NON_REIMBURSABLE_EXPENSES_URL; + // s77rt TODO Test in R3 https://github.com/Expensify/App/issues/94848 + url = ''; break; default: url = QBO_EXPENSES_URL; From 83173d86fda1997b6bd662ab9139031f99a331a8 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 20:14:05 +0100 Subject: [PATCH 34/35] add Rillet non-reimbursable url (2) --- src/libs/ReportActionsUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 4b258002de8b..823133daccd5 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2804,8 +2804,8 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url = nonReimbursableUrls.at(0)?.substring(0, SALESFORCE_EXPENSES_URL_PREFIX.length + 3) ?? ''; break; case CONST.EXPORT_LABELS.RILLET: - // s77rt TODO Test in R3 https://github.com/Expensify/App/issues/94848 - url = ''; + const nonReimbursableUrl = nonReimbursableUrls.at(0) ?? ''; + url = nonReimbursableUrl.substring(0, nonReimbursableUrl.lastIndexOf('/')); break; default: url = QBO_EXPENSES_URL; From 0cfe6fd711d2dc183e89ac2482da69f2d3a78280 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:22:27 +0100 Subject: [PATCH 35/35] lint --- src/libs/ReportActionsUtils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 823133daccd5..08365d5dbb6d 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2804,8 +2804,7 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url = nonReimbursableUrls.at(0)?.substring(0, SALESFORCE_EXPENSES_URL_PREFIX.length + 3) ?? ''; break; case CONST.EXPORT_LABELS.RILLET: - const nonReimbursableUrl = nonReimbursableUrls.at(0) ?? ''; - url = nonReimbursableUrl.substring(0, nonReimbursableUrl.lastIndexOf('/')); + url = nonReimbursableUrls.at(0)?.substring(0, nonReimbursableUrls.at(0)?.lastIndexOf('/')) ?? ''; break; default: url = QBO_EXPENSES_URL;