diff --git a/src/languages/de.ts b/src/languages/de.ts index 4afeb1eaeb6a..53014d39d94a 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -441,6 +441,8 @@ const translations: TranslationDeepObject = { member: 'Mitglied', auditor: 'Prüfer', role: 'Rolle', + roleCannotBeChanged: (workflowsLinkPage: string) => + `Die Rolle kann nicht geändert werden, da dieses Mitglied ein zahler in diesem Arbeitsbereich ist.`, currency: 'Währung', groupCurrency: 'Gruppenwährung', rate: 'Bewerten', diff --git a/src/languages/en.ts b/src/languages/en.ts index d949fc1f7e49..48e8c1b64eb7 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -453,6 +453,7 @@ const translations = { member: 'Member', auditor: 'Auditor', role: 'Role', + roleCannotBeChanged: (workflowsLinkPage: string) => `Role can't be changed because this member is a payer on this workspace.`, currency: 'Currency', groupCurrency: 'Group currency', rate: 'Rate', diff --git a/src/languages/es.ts b/src/languages/es.ts index 16ff85278323..d151dd2f80f2 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -274,6 +274,7 @@ const translations: TranslationDeepObject = { success: 'Éxito', auditor: 'Auditor', role: 'Role', + roleCannotBeChanged: (workflowsLinkPage: string) => `El rol no se puede cambiar porque este miembro es un pagador en este espacio de trabajo.`, currency: 'Divisa', groupCurrency: 'Moneda del grupo', rate: 'Tarifa', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 2be85924b63e..018ffbec2553 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: 'Membre', auditor: 'Auditeur', role: 'Rôle', + roleCannotBeChanged: (workflowsLinkPage: string) => `Le rôle ne peut pas être modifié car ce membre est un payeur dans cet espace de travail.`, currency: 'Devise', groupCurrency: 'Devise du groupe', rate: 'Taux', diff --git a/src/languages/it.ts b/src/languages/it.ts index 670faea918b5..b7b2ab5ca29c 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -441,6 +441,8 @@ const translations: TranslationDeepObject = { member: 'Membro', auditor: 'Revisore', role: 'Ruolo', + roleCannotBeChanged: (workflowsLinkPage: string) => + `Il ruolo non può essere modificato perché questo membro è un pagatore in questo spazio di lavoro.`, currency: 'Valuta', groupCurrency: 'Valuta del gruppo', rate: 'Valuta', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 52c19d6c30bb..f651db1ba135 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: 'メンバー', auditor: '監査人', role: '役割', + roleCannotBeChanged: (workflowsLinkPage: string) => `このメンバーはこのワークスペースの支払者であるため、役割を変更できません。`, currency: '通貨', groupCurrency: 'グループ通貨', rate: '評価', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c0be40bdc02b..e103116679a0 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: 'Lid', auditor: 'Auditor', role: 'Rol', + roleCannotBeChanged: (workflowsLinkPage: string) => `De rol kan niet worden gewijzigd omdat dit lid een betaler is in deze werkruimte.`, currency: 'Valuta', groupCurrency: 'Groepsvaluta', rate: 'Beoordeling', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index ae74d4324f69..13aa1c25d391 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: 'Członek', auditor: 'Audytor', role: 'Rola', + roleCannotBeChanged: (workflowsLinkPage: string) => `Nie można zmienić roli, ponieważ ten członek jest płatnikiem w tym obszarze roboczym.`, currency: 'Waluta', groupCurrency: 'Waluta grupy', rate: 'Oceń', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 4404d1376b69..1839a74e36a4 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: 'Membro', auditor: 'Auditor', role: 'Função', + roleCannotBeChanged: (workflowsLinkPage: string) => `A função não pode ser alterada porque este membro é um pagador neste espaço de trabalho.`, currency: 'Moeda', groupCurrency: 'Moeda do grupo', rate: 'Avaliar', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index eccc5d8496a5..0daa0c37c274 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -441,6 +441,7 @@ const translations: TranslationDeepObject = { member: '成员', auditor: '审计员', role: '角色', + roleCannotBeChanged: (workflowsLinkPage: string) => `该角色无法更改,因为此成员是此工作区中的付款人。`, currency: '货币', groupCurrency: '群组货币', rate: '评分', diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index b40cc6019e73..8cb39c736044 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -659,8 +659,10 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers const hasAtLeastOneNonAuditorRole = selectedEmployeesRoles.some((role) => role !== CONST.POLICY.ROLE.AUDITOR); const hasAtLeastOneNonMemberRole = selectedEmployeesRoles.some((role) => role !== CONST.POLICY.ROLE.USER); const hasAtLeastOneNonAdminRole = selectedEmployeesRoles.some((role) => role !== CONST.POLICY.ROLE.ADMIN); + const isReimbursementEnabled = policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES; + const hasAtLeastOnePayer = isReimbursementEnabled && policy?.achAccount?.reimburser ? selectedEmployees.includes(policy?.achAccount?.reimburser) : false; - if (hasAtLeastOneNonMemberRole) { + if (hasAtLeastOneNonMemberRole && !hasAtLeastOnePayer) { options.push(memberOption); } @@ -668,7 +670,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers options.push(adminOption); } - if (hasAtLeastOneNonAuditorRole && isControlPolicy(policy)) { + if (hasAtLeastOneNonAuditorRole && isControlPolicy(policy) && !hasAtLeastOnePayer) { options.push(auditorOption); } diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx index fa1e9281379b..0b58a15adbbc 100644 --- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx @@ -19,6 +19,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import {useCompanyCardFeedIcons} from '@hooks/useCompanyCardIcons'; import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useEnvironment from '@hooks/useEnvironment'; import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -84,6 +85,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const illustrations = useThemeIllustrations(); const companyCardFeedIcons = useCompanyCardFeedIcons(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const {environmentURL} = useEnvironment(); const [cardFeeds] = useCardFeeds(policyID); const [cardList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}`, {canBeMissing: true}); const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true}); @@ -106,9 +108,10 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const policyOwnerDisplayName = formatPhoneNumber(getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? ''; const hasMultipleFeeds = Object.keys(getCompanyFeeds(cardFeeds, false, true)).length > 0; const {cardList: assignableCards, ...workspaceCards} = getAllCardsForWorkspace(workspaceAccountID, cardList, cardFeeds, expensifyCardSettings); + const workspaceWorkflowsPageURL = `${environmentURL}/${ROUTES.WORKSPACE_WORKFLOWS.getRoute(policyID)}`; const isSMSLogin = Str.isSMSLogin(memberLogin); const phoneNumber = getPhoneNumber(details); - const isReimburser = policy?.achAccount?.reimburser === memberLogin; + const isReimburser = policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES && policy?.achAccount?.reimburser === memberLogin; const {isAccountLocked, showLockedAccountModal} = useContext(LockedAccountContext); const {approvalWorkflows} = convertPolicyEmployeesToApprovalWorkflows({ @@ -340,9 +343,12 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS_ROLE.getRoute(policyID, accountID))} + hintText={isReimburser ? translate('common.roleCannotBeChanged', workspaceWorkflowsPageURL) : undefined} + shouldRenderHintAsHTML /> {isControlPolicy(policy) && ( <>