From 78ad7d79be1af9a7241e2812993f3227853b0752 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 17 Oct 2025 18:02:04 +0300 Subject: [PATCH 1/3] Central billing account menu --- src/ROUTES.ts | 4 + src/SCREENS.ts | 1 + src/languages/en.ts | 2 + src/languages/es.ts | 2 + ...hangePolicyUberBillingAccountPageParams.ts | 6 + src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 2 + .../ModalStackNavigators/index.tsx | 1 + .../RELATIONS/WORKSPACE_TO_RHP.ts | 1 + src/libs/Navigation/linkingConfig/config.ts | 3 + src/libs/Navigation/types.ts | 4 + src/libs/actions/Policy/Policy.ts | 37 ++++ .../ChangeReceiptBillingAccountPage.tsx | 168 ++++++++++++++++++ .../WorkspaceReceiptPartnersPage.tsx | 19 +- src/types/onyx/Policy.ts | 4 + 15 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 src/libs/API/parameters/ChangePolicyUberBillingAccountPageParams.ts create mode 100644 src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 9f6dc71f55a0..bb54b133d106 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -2277,6 +2277,10 @@ const ROUTES = { return getUrlWithBackToParam(`workspaces/${policyID}/receipt-partners/${integration}/invite`, backTo); }, }, + WORKSPACE_RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT: { + route: 'workspaces/:policyID/receipt-partners/:integration/billing-account', + getRoute: (policyID: string, integration: string) => `workspaces/${policyID}/receipt-partners/${integration}/billing-account` as const, + }, WORKSPACE_RECEIPT_PARTNERS_INVITE_EDIT: { route: 'workspaces/:policyID/receipt-partners/:integration/invite/edit', getRoute: (policyID: string | undefined, integration: string, backTo?: string) => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 7256a7ca151b..c669b6f24988 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -673,6 +673,7 @@ const SCREENS = { RECEIPT_PARTNERS: 'Workspace_Receipt_Partners', RECEIPT_PARTNERS_INVITE: 'Workspace_Receipt_Partners_Invite', RECEIPT_PARTNERS_INVITE_EDIT: 'Workspace_Receipt_Partners_Invite_Edit', + RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT: 'Workspace_Receipt_Partners_Change_Billing_Account', RULES: 'Policy_Rules', REPORTS_DEFAULT_TITLE: 'Reports_Default_Title', RULES_AUTO_APPROVE_REPORTS_UNDER: 'Rules_Auto_Approve_Reports_Under', diff --git a/src/languages/en.ts b/src/languages/en.ts index 6e4bc573c03f..377b2034c855 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -3640,6 +3640,8 @@ const translations = { [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'Pending', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Suspended', }, + centralBillingAccount: 'Central billing account', + centralBillingDescription: 'Choose where to import all Uber receipts.', invitationFailure: 'Failed to invite member to Uber for Business', autoInvite: 'Invite new workspace members to Uber for Business', autoRemove: 'Deactivate removed workspace members from Uber for Business', diff --git a/src/languages/es.ts b/src/languages/es.ts index 0cb7f88b7c40..489620c1c7e3 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -3638,6 +3638,8 @@ ${amount} para ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'Pendiente', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Suspendido', }, + centralBillingAccount: 'Cuenta de facturación central', + centralBillingDescription: 'Elija dónde importar todos los recibos de Uber', invitationFailure: 'Error al invitar miembro a Uber for Business', autoInvite: 'Invitar a nuevos miembros del espacio de trabajo a Uber para Empresas', autoRemove: 'Desactivar miembros del espacio de trabajo eliminados de Uber para Empresas', diff --git a/src/libs/API/parameters/ChangePolicyUberBillingAccountPageParams.ts b/src/libs/API/parameters/ChangePolicyUberBillingAccountPageParams.ts new file mode 100644 index 000000000000..f7b7c4dcfd2f --- /dev/null +++ b/src/libs/API/parameters/ChangePolicyUberBillingAccountPageParams.ts @@ -0,0 +1,6 @@ +type ChangePolicyUberBillingAccountPageParams = { + policyID: string; + email: string; +}; + +export default ChangePolicyUberBillingAccountPageParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index bd7756c9e3ea..6594e89f1d4c 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -71,6 +71,7 @@ export type {default as RequestReplacementExpensifyCardParams} from './RequestRe export type {default as RequestUnlinkValidationLinkParams} from './RequestUnlinkValidationLinkParams'; export type {default as RequestAccountValidationLinkParams} from './RequestAccountValidationLinkParams'; export type {default as ResolveActionableMentionWhisperParams} from './ResolveActionableMentionWhisperParams'; +export type {default as ChangePolicyUberBillingAccountPageParams} from './ChangePolicyUberBillingAccountPageParams'; export type {default as ResolveActionableReportMentionWhisperParams} from './ResolveActionableReportMentionWhisperParams'; export type {default as RevealExpensifyCardDetailsParams} from './RevealExpensifyCardDetailsParams'; export type {default as SearchForReportsParams} from './SearchForReportsParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index c89be5ee2bd0..ddd5e9cf3cea 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -52,6 +52,7 @@ const WRITE_COMMANDS = { CHRONOS_REMOVE_OOO_EVENT: 'Chronos_RemoveOOOEvent', MAKE_DEFAULT_PAYMENT_METHOD: 'MakeDefaultPaymentMethod', TOGGLE_WORKSPACE_UBER_AUTO_INVITE: 'ToggleWorkspaceUberAutoInvite', + SET_WORKSPACE_UBER_CENTRAL_BILL: 'SetWorkspaceUberCentralBill', TOGGLE_WORKSPACE_UBER_AUTO_REMOVE: 'ToggleWorkspaceUberAutoRemove', ADD_PAYMENT_CARD: 'AddPaymentCard', ADD_PAYMENT_CARD_SCA: 'AddPaymentCardSCA', @@ -543,6 +544,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.CARD_DEACTIVATE]: Parameters.CardDeactivateParams; [WRITE_COMMANDS.MAKE_DEFAULT_PAYMENT_METHOD]: Parameters.MakeDefaultPaymentMethodParams; [WRITE_COMMANDS.TOGGLE_WORKSPACE_UBER_AUTO_INVITE]: Parameters.TogglePolicyUberAutoInvitePageParams; + [WRITE_COMMANDS.SET_WORKSPACE_UBER_CENTRAL_BILL]: Parameters.ChangePolicyUberBillingAccountPageParams; [WRITE_COMMANDS.TOGGLE_WORKSPACE_UBER_AUTO_REMOVE]: Parameters.TogglePolicyUberAutoRemovePageParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD]: Parameters.AddPaymentCardParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD_SCA]: Parameters.AddPaymentCardParams; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 41afa2aada1d..5f42bc543c9d 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -759,6 +759,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/perDiem/EditPerDiemCurrencyPage').default, [SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE]: () => require('../../../../pages/workspace/receiptPartners/InviteReceiptPartnerPolicyPage').default, [SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE_EDIT]: () => require('../../../../pages/workspace/receiptPartners/EditInviteReceiptPartnerPolicyPage').default, + [SCREENS.WORKSPACE.RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT]: () => require('../../../../pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage').default, }); const TwoFactorAuthenticatorStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 57cd421ed921..5cea72f6439e 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -269,6 +269,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { [SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE]: { path: ROUTES.WORKSPACE_RECEIPT_PARTNERS_INVITE.route, }, + [SCREENS.WORKSPACE.RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT]: { + path: ROUTES.WORKSPACE_RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT.route, + }, [SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE_EDIT]: { path: ROUTES.WORKSPACE_RECEIPT_PARTNERS_INVITE_EDIT.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 7d39784efc79..081c02a76662 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1958,6 +1958,10 @@ type WorkspaceSplitNavigatorParamList = { integration: string; backTo?: Routes; }; + [SCREENS.WORKSPACE.RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT]: { + policyID: string; + integration: string; + }; [SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE_EDIT]: { policyID: string; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index e92931ac51dc..81416a67c66d 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -9,6 +9,7 @@ import * as API from '@libs/API'; import type { AddBillingCardAndRequestWorkspaceOwnerChangeParams, AddPaymentCardParams, + ChangePolicyUberBillingAccountPageParams, CreateWorkspaceFromIOUPaymentParams, CreateWorkspaceParams, DeleteWorkspaceAvatarParams, @@ -3011,6 +3012,41 @@ function togglePolicyUberAutoInvite(policyID: string | undefined, enabled: boole API.write(WRITE_COMMANDS.TOGGLE_WORKSPACE_UBER_AUTO_INVITE, params, {optimisticData, successData, failureData}); } +function changePolicyUberBillingAccount(policyID: string | undefined, email: string, oldEmail: string) { + if (!policyID) { + Log.warn('changePolicyUberBillingAccount invalid params', {policyID}); + return; + } + + const optimisticData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: { + receiptPartners: {uber: {centralBillingAccountEmail: email, pendingFields: {centralBillingAccountEmail: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}}}, + }, + }, + ]; + const successData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {pendingFields: null}}}, + }, + ]; + const failureData: OnyxUpdate[] = [ + { + key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, + onyxMethod: Onyx.METHOD.MERGE, + value: {receiptPartners: {uber: {centralBillingAccountEmail: oldEmail, pendingFields: null}}}, + }, + ]; + + const params: ChangePolicyUberBillingAccountPageParams = {policyID, email}; + + API.write(WRITE_COMMANDS.SET_WORKSPACE_UBER_CENTRAL_BILL, params, {optimisticData, successData, failureData}); +} + function togglePolicyUberAutoRemove(policyID: string | undefined, enabled: boolean) { if (!policyID) { Log.warn('togglePolicyUberAutoRemove invalid params', {policyID}); @@ -6393,6 +6429,7 @@ export { enablePolicyReportFields, enablePolicyTaxes, enablePolicyWorkflows, + changePolicyUberBillingAccount, enableDistanceRequestTax, enablePolicyInvoicing, openPolicyMoreFeaturesPage, diff --git a/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx b/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx new file mode 100644 index 000000000000..e57634c77574 --- /dev/null +++ b/src/pages/workspace/receiptPartners/ChangeReceiptBillingAccountPage.tsx @@ -0,0 +1,168 @@ +import React, {useCallback, useEffect, useMemo, useState} from 'react'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import * as Expensicons from '@components/Icon/Expensicons'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SelectionList from '@components/SelectionListWithSections'; +import InviteMemberListItem from '@components/SelectionListWithSections/InviteMemberListItem'; +import Text from '@components/Text'; +import useDebouncedState from '@hooks/useDebouncedState'; +import useLocalize from '@hooks/useLocalize'; +import useNetwork from '@hooks/useNetwork'; +import useOnyx from '@hooks/useOnyx'; +import usePolicy from '@hooks/usePolicy'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {changePolicyUberBillingAccount, clearErrors} from '@libs/actions/Policy/Policy'; +import {canUseTouchScreen} from '@libs/DeviceCapabilities'; +import {formatPhoneNumber} from '@libs/LocalePhoneNumber'; +import Navigation from '@libs/Navigation/Navigation'; +import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; +import {formatMemberForList, getHeaderMessage, getSearchValueForPhoneOrEmail, sortAlphabetically} from '@libs/OptionsListUtils'; +import type {MemberForList} from '@libs/OptionsListUtils'; +import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils'; +import {isDeletedPolicyEmployee} from '@libs/PolicyUtils'; +import tokenizedSearch from '@libs/tokenizedSearch'; +import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; +import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type SCREENS from '@src/SCREENS'; + +type ChangeReceiptBillingAccountPagePageProps = PlatformStackScreenProps; + +function ChangeReceiptBillingAccountPage({route}: ChangeReceiptBillingAccountPagePageProps) { + const styles = useThemeStyles(); + const {translate, localeCompare} = useLocalize(); + const {isOffline} = useNetwork(); + const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(''); + const [selectedOption, setSelectedOption] = useState(''); + const [countryCode] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false}); + + const policyID = route.params?.policyID; + const integration = route.params?.integration; + const policy = usePolicy(policyID); + const integrations = policy?.receiptPartners; + const centralBillingAccountEmail = integration ? integrations?.[integration]?.centralBillingAccountEmail : undefined; + + const shouldShowTextInput = policy?.employeeList && Object.keys(policy.employeeList).length >= CONST.STANDARD_LIST_ITEM_LIMIT; + const textInputLabel = shouldShowTextInput ? translate('common.search') : undefined; + const workspaceMembers = useMemo(() => { + let membersList: MemberForList[] = []; + if (!policy?.employeeList) { + return membersList; + } + + Object.entries(policy.employeeList).forEach(([email, policyEmployee]) => { + if (isDeletedPolicyEmployee(policyEmployee, isOffline)) { + return; + } + + const personalDetail = getPersonalDetailByEmail(email); + if (personalDetail) { + const memberForList = formatMemberForList({ + text: personalDetail?.displayName ?? email, + alternateText: email, + login: email, + accountID: personalDetail?.accountID, + icons: [ + { + source: personalDetail?.avatar ?? Expensicons.FallbackAvatar, + name: formatPhoneNumber(email), + type: CONST.ICON_TYPE_AVATAR, + id: personalDetail?.accountID, + }, + ], + reportID: '', + keyForList: email, + isSelected: email === selectedOption || personalDetail?.login === selectedOption, + }); + + membersList.push(memberForList); + } + }); + + membersList = sortAlphabetically(membersList, 'text', localeCompare); + + return membersList; + }, [isOffline, policy?.employeeList, localeCompare, selectedOption]); + + const sections = useMemo(() => { + if (workspaceMembers.length === 0) { + return []; + } + + let membersToDisplay = workspaceMembers; + + // Apply search filter if there's a search term + if (debouncedSearchTerm) { + const searchValue = getSearchValueForPhoneOrEmail(debouncedSearchTerm, countryCode).toLowerCase(); + membersToDisplay = tokenizedSearch(workspaceMembers, searchValue, (option) => [option.text ?? '', option.alternateText ?? '']); + } + + return [ + { + title: undefined, + data: membersToDisplay, + shouldShow: true, + }, + ]; + }, [workspaceMembers, countryCode, debouncedSearchTerm]); + + useEffect(() => { + if (!centralBillingAccountEmail) { + return; + } + setSelectedOption(centralBillingAccountEmail); + }, [centralBillingAccountEmail]); + + const toggleOption = useCallback( + (option: MemberForList) => { + if (!centralBillingAccountEmail) { + return; + } + clearErrors(policyID); + setSelectedOption(option.login); + + changePolicyUberBillingAccount(policyID, option.login, centralBillingAccountEmail); + Navigation.goBack(); + }, + [policyID, centralBillingAccountEmail], + ); + + const headerMessage = useMemo(() => { + const searchValue = debouncedSearchTerm.trim().toLowerCase(); + + return getHeaderMessage(sections?.at(0)?.data.length !== 0, false, searchValue); + }, [debouncedSearchTerm, sections]); + + return ( + + + + {translate('workspace.receiptPartners.uber.centralBillingDescription')} + + + + ); +} + +ChangeReceiptBillingAccountPage.displayName = 'ChangeReceiptBillingAccountPage'; + +export default ChangeReceiptBillingAccountPage; diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index d9e500c691f9..56b49266be70 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -7,6 +7,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; import * as Illustrations from '@components/Icon/Illustrations'; import MenuItem from '@components/MenuItem'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; @@ -52,6 +53,7 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps const integrations = policy?.receiptPartners; const isAutoRemove = !!integrations?.uber?.autoRemove; const isAutoInvite = !!integrations?.uber?.autoInvite; + const centralBillingAccountEmail = !!integrations?.uber?.centralBillingAccountEmail; // Track focus and connection change to route to the invite flow once after successful connection const prevIsUberConnected = usePrevious(isUberConnected); @@ -306,11 +308,26 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps /> + {centralBillingAccountEmail && ( + + + Navigation.navigate( + ROUTES.WORKSPACE_RECEIPT_PARTNERS_CHANGE_BILLING_ACCOUNT.getRoute(policyID, CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER), + ) + } + /> + + )} Navigation.navigate(ROUTES.WORKSPACE_RECEIPT_PARTNERS_INVITE_EDIT.getRoute(policyID, CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER))} /> diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index a6b8b10f176f..7ec634fe8c80 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -148,6 +148,10 @@ type UberReceiptPartner = { * name of the organization in uber */ organizationName?: string; + /** + * account to import the receipts to + */ + centralBillingAccountEmail?: string; /** * Mapping of workspace member email to Uber employee status From 677560c875a3d75febfa6c87b3090723f47aad9f Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 17 Oct 2025 18:04:45 +0300 Subject: [PATCH 2/3] Clean up --- .../workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index 56b49266be70..e7eed1418fdd 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -327,7 +327,7 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps title={translate('workspace.receiptPartners.uber.manageInvites')} shouldShowRightIcon icon={Expensicons.Mail} - style={[styles.sectionMenuItemTopDescription, styles.mbn3]} + style={[styles.sectionMenuItemTopDescription, styles.mbn3, !centralBillingAccountEmail && styles.mt6]} onPress={() => Navigation.navigate(ROUTES.WORKSPACE_RECEIPT_PARTNERS_INVITE_EDIT.getRoute(policyID, CONST.POLICY.RECEIPT_PARTNERS.NAME.UBER))} /> From a29e1f64371e006f86f742b6423bb66ef68ac33f Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 17 Oct 2025 18:19:10 +0300 Subject: [PATCH 3/3] translations --- src/languages/de.ts | 2 ++ src/languages/es.ts | 2 +- src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 2 ++ 9 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index f8c01cd6052c..7c113532792a 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -3664,6 +3664,8 @@ ${amount} für ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'Ausstehend', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Gesperrt', }, + centralBillingAccount: 'Zentrales Abrechnungskonto', + centralBillingDescription: 'Wählen Sie, wohin alle Uber-Belege importiert werden sollen.', invitationFailure: 'Der Teilnehmer konnte nicht zu Uber for Business eingeladen werden.', autoInvite: 'Neue Workspace-Mitglieder zu Uber for Business einladen', autoRemove: 'Entfernte Workspace-Mitglieder von Uber for Business deaktivieren', diff --git a/src/languages/es.ts b/src/languages/es.ts index 489620c1c7e3..631ab8f7ef37 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -3639,7 +3639,7 @@ ${amount} para ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Suspendido', }, centralBillingAccount: 'Cuenta de facturación central', - centralBillingDescription: 'Elija dónde importar todos los recibos de Uber', + centralBillingDescription: 'Elija dónde importar todos los recibos de Uber.', invitationFailure: 'Error al invitar miembro a Uber for Business', autoInvite: 'Invitar a nuevos miembros del espacio de trabajo a Uber para Empresas', autoRemove: 'Desactivar miembros del espacio de trabajo eliminados de Uber para Empresas', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 624d168d6b5d..384fbecb5de4 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -3666,6 +3666,8 @@ ${amount} pour ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'En attente', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Suspendu', }, + centralBillingAccount: 'Compte de facturation central', + centralBillingDescription: 'Choisir où importer tous les reçus Uber.', invitationFailure: "Impossible d'inviter un membre sur Uber for Business.", autoInvite: "Inviter de nouveaux membres de l'espace de travail sur Uber", autoRemove: "Désactiver les membres supprimés de l'espace de travail sur Uber", diff --git a/src/languages/it.ts b/src/languages/it.ts index 23aa7eabf9be..9ab775c093e2 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -3673,6 +3673,8 @@ ${amount} per ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'In attesa', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Sospeso', }, + centralBillingAccount: 'Conto di fatturazione centrale', + centralBillingDescription: 'Scegli dove importare tutte le ricevute Uber.', invitationFailure: 'Impossibile inviare il membro a Uber for Business', autoInvite: "Invita nuovi membri dell'area di lavoro su Uber for Business", autoRemove: "Disattiva i membri dell'area di lavoro rimossi da Uber for Business", diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 6e02bf29146a..11a18811248e 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -3652,6 +3652,8 @@ ${date} - ${merchant}に${amount}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: '保留中', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: '停止中', }, + centralBillingAccount: '中央請求アカウント', + centralBillingDescription: 'Uberの領収書をすべてインポートする場所を選択してください。', invitationFailure: 'メンバーを Uber for Business に招待できません。', autoInvite: 'Uber for Business に新しいワークスペースメンバーを招待する', autoRemove: 'Uber for Business から削除されたワークスペースメンバーを非アクティブ化する', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 7a3ac792d48d..221f6eca1875 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -3674,6 +3674,8 @@ ${amount} voor ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'In behandeling', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Opgeschort', }, + centralBillingAccount: 'Central faktureringskonto', + centralBillingDescription: 'Vælg, hvor alle Uber-kvitteringer skal importeres.', invitationFailure: 'Kan geen lid uitnodigen voor Uber for Business', autoInvite: 'Nodig nieuwe werkruimteleden uit voor Uber for Business', autoRemove: 'Deactiveer verwijderde werkruimteleden van Uber for Business', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index f37109fb7f05..61437badde3c 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -3666,6 +3666,8 @@ ${amount} dla ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'Oczekujące', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Zawieszone', }, + centralBillingAccount: 'Centralne konto rozliczeniowe', + centralBillingDescription: 'Wybierz, gdzie importować wszystkie paragony z Ubera.', invitationFailure: 'Nie można zaprosić członka do Ubera dla Firm.', autoInvite: 'Zaproś nowych członków przestrzeni roboczej do Ubera dla Firm', autoRemove: 'Dezaktywuj usuniętych członków przestrzeni roboczej w Uberze dla Firm', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index e3dbec596e3c..17ef6c98d5fe 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -3665,6 +3665,8 @@ ${amount} para ${merchant} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: 'Pendente', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: 'Suspenso', }, + centralBillingAccount: 'Conta de cobrança central', + centralBillingDescription: 'Escolha onde importar todos os recibos do Uber.', invitationFailure: 'Não é possível convidar um membro para o Uber for Business', autoInvite: 'Convidar novos membros do espaço de trabalho para o Uber for Business', autoRemove: 'Desativar membros removidos do espaço de trabalho do Uber for Business', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 511468f9f580..534f70c1d058 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -3614,6 +3614,8 @@ ${merchant}的${amount} - ${date}`, [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.LINKED_PENDING_APPROVAL]: '待处理', [CONST.POLICY.RECEIPT_PARTNERS.UBER_EMPLOYEE_STATUS.SUSPENDED]: '已暂停', }, + centralBillingAccount: '中央结算账户', + centralBillingDescription: '选择导入所有 Uber 收据的位置', invitationFailure: '无法邀请会员加入 Uber for Business。', autoInvite: '邀请新工作区成员加入 Uber for Business', autoRemove: '停用已从 Uber for Business 移除的工作区成员',