diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 7fef732a5435..824e9bc637a9 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1441,7 +1441,6 @@ const CONST = { ANCHORED_FIELD_DROPDOWNS: 'anchoredFieldDropdowns', COMPANY_AGENTS: 'companyAgents', RESIZABLE_TABLE_COLUMNS: 'resizableTableColumns', - DESCRIBE_RULE: 'describeRule', TRAVEL_APPROVAL: 'travelApproval', }, BUTTON_STATES: { @@ -10605,7 +10604,6 @@ const CONST = { NEW_RULE_MENU_ITEM_FLAG_FOR_REVIEW: 'WorkspaceRules-NewRuleMenuItem-FlagForReview', NEW_RULE_MENU_ITEM_REQUIRE_FIELDS: 'WorkspaceRules-NewRuleMenuItem-RequireFields', NEW_RULE_MENU_ITEM_APPLY_EXPENSE_DEFAULTS: 'WorkspaceRules-NewRuleMenuItem-ApplyExpenseDefaults', - NEW_RULE_MENU_ITEM_CREATE_AGENT_RULE: 'WorkspaceRules-NewRuleMenuItem-CreateAgentRule', REQUIRE_RECEIPTS_SAVE: 'WorkspaceRules-RequireReceiptsSave', REQUIRE_FIELDS_SAVE: 'WorkspaceRules-RequireFieldsSave', FLAG_RECEIPT_LINE_ITEMS_SAVE: 'WorkspaceRules-FlagReceiptLineItemsSave', diff --git a/src/languages/de.ts b/src/languages/de.ts index c5b27180bcea..4dbbdfa7feec 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -8897,11 +8897,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc applyExpenseDefaultsDescription: 'Felder automatisch aktualisieren', flagForReview: 'Zur Überprüfung markieren', flagForReviewDescription: 'Benachrichtigen, wenn Ihre Bedingungen erfüllt sind', - requireFields: 'Feldanforderungen festlegen', - requireFieldsShort: 'Felder vorschreiben', + requireFields: 'Felder vorschreiben', requireFieldsDescription: 'Belege, Kategorien usw.', - createAgentRule: 'Agentenregel beschreiben', - createAgentRuleDescription: 'Erstellen Sie flexible Regeln, die ausgeführt werden, wenn Sie sie benötigen.', describeItBelow: 'Oder beschreiben Sie sie einfach unten', describeRulePlaceholder: 'Alle Ausgaben über 2.000 $ blockieren', selectTemplateOrDescribe: 'Wählen Sie eine Vorlage aus oder beschreiben Sie eine Regel, um fortzufahren', diff --git a/src/languages/el.ts b/src/languages/el.ts index 45893f913c62..afcad2cc8343 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -8985,13 +8985,10 @@ ${reportName}`, restrictCardSpendDescription: 'Μπλοκάρετε ή περιορίστε τις δαπάνες στο σημείο πώλησης', flagForReview: 'Σημείωση για έλεγχο', flagForReviewDescription: 'Ειδοποίηση όταν πληρούνται οι προϋποθέσεις σας', - requireFields: 'Ορίστε απαιτήσεις πεδίου', - requireFieldsShort: 'Απαίτηση πεδίων', + requireFields: 'Απαίτηση πεδίων', requireFieldsDescription: 'Αποδείξεις, κατηγορίες κ.λπ.', applyExpenseDefaults: 'Εφαρμογή προεπιλογών δαπανών', applyExpenseDefaultsDescription: 'Αυτόματη ενημέρωση πεδίων', - createAgentRule: 'Περιγράψτε τον κανόνα πράκτορα', - createAgentRuleDescription: 'Δημιουργήστε ευέλικτους κανόνες που εκτελούνται όταν τους χρειάζεστε.', describeItBelow: 'Ή απλώς περιγράψτε τον παρακάτω', describeRulePlaceholder: 'Αποκλεισμός όλων των δαπανών άνω των 2.000 $', selectTemplateOrDescribe: 'Επιλέξτε ένα πρότυπο ή περιγράψτε έναν κανόνα για να συνεχίσετε', diff --git a/src/languages/en.ts b/src/languages/en.ts index 4969be101380..840499d9a95e 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -9261,13 +9261,10 @@ const translations = { restrictCardSpendDescription: 'Block or limit spend at the point of sale', flagForReview: 'Flag for review', flagForReviewDescription: 'Notify when your conditions are met', - requireFields: 'Set field requirements', - requireFieldsShort: 'Require fields', + requireFields: 'Require fields', requireFieldsDescription: 'Receipts, categories, etc.', applyExpenseDefaults: 'Apply expense defaults', applyExpenseDefaultsDescription: 'Update fields automatically', - createAgentRule: 'Describe agent rule', - createAgentRuleDescription: 'Create flexible rules that run when you need.', describeItBelow: 'Or just describe it below', describeRulePlaceholder: 'Block all spend above $2,000', selectTemplateOrDescribe: 'Select a template or describe a rule to continue', diff --git a/src/languages/es.ts b/src/languages/es.ts index a9183e8f3bd2..7bbc9a7afd73 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8905,11 +8905,8 @@ ${reportName}`, applyExpenseDefaultsDescription: 'Actualizar campos automáticamente', flagForReview: 'Marcar para revisión', flagForReviewDescription: 'Notificar cuando se cumplan tus condiciones', - requireFields: 'Configurar requisitos de campos', - requireFieldsShort: 'Exigir campos', + requireFields: 'Exigir campos', requireFieldsDescription: 'Recibos, categorías, etc.', - createAgentRule: 'Describir regla de agente', - createAgentRuleDescription: 'Crea reglas flexibles que se ejecuten cuando las necesites.', describeItBelow: 'O simplemente descríbela abajo', describeRulePlaceholder: 'Bloquear todos los gastos superiores a $2,000', selectTemplateOrDescribe: 'Selecciona una plantilla o describe una regla para continuar', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b71f4b1501ea..e96fc2acf4fe 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -8920,11 +8920,8 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e applyExpenseDefaultsDescription: 'Mettre à jour les champs automatiquement', flagForReview: 'Marquer pour examen', flagForReviewDescription: 'Avertir lorsque vos conditions sont remplies', - requireFields: 'Définir les exigences des champs', - requireFieldsShort: 'Exiger des champs', + requireFields: 'Exiger des champs', requireFieldsDescription: 'Reçus, catégories, etc.', - createAgentRule: 'Décrire la règle de l’agent', - createAgentRuleDescription: 'Créez des règles flexibles qui s’exécutent quand vous en avez besoin.', describeItBelow: 'Ou décrivez-la simplement ci-dessous', describeRulePlaceholder: 'Bloquer toutes les dépenses supérieures à 2 000 $', selectTemplateOrDescribe: 'Sélectionnez un modèle ou décrivez une règle pour continuer', diff --git a/src/languages/it.ts b/src/languages/it.ts index a5de51647749..20ca21d53200 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -8851,11 +8851,8 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, applyExpenseDefaultsDescription: 'Aggiorna i campi automaticamente', flagForReview: 'Contrassegna per revisione', flagForReviewDescription: 'Avvisa quando le tue condizioni sono soddisfatte', - requireFields: 'Imposta i requisiti del campo', - requireFieldsShort: 'Richiedi campi', + requireFields: 'Richiedi campi', requireFieldsDescription: 'Ricevute, categorie, ecc.', - createAgentRule: 'Descrivi regola agente', - createAgentRuleDescription: 'Crea regole flessibili che vengono eseguite quando ne hai bisogno.', describeItBelow: 'Oppure descrivila qui sotto', describeRulePlaceholder: 'Blocca tutte le spese superiori a 2.000 $', selectTemplateOrDescribe: 'Seleziona un modello o descrivi una regola per continuare', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 675616d4fbdf..5eb27fc9d60d 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -8736,11 +8736,8 @@ ${reportName}`, applyExpenseDefaultsDescription: 'フィールドを自動で更新する', flagForReview: '確認のためにフラグを付ける', flagForReviewDescription: '条件が満たされたときに通知する', - requireFields: 'フィールドの必須条件を設定', - requireFieldsShort: '必須フィールド', + requireFields: '必須フィールド', requireFieldsDescription: '領収書、カテゴリなど', - createAgentRule: 'エージェントルールの説明', - createAgentRuleDescription: '必要なときに実行される柔軟なルールを作成できます。', describeItBelow: 'または、下で説明してください', describeRulePlaceholder: '2,000ドルを超えるすべての支出をブロック', selectTemplateOrDescribe: '続行するには、テンプレートを選択するかルールを説明してください', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 47c159219060..1010e0f11446 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -8825,11 +8825,8 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, applyExpenseDefaultsDescription: 'Velden automatisch bijwerken', flagForReview: 'Markeren voor controle', flagForReviewDescription: 'Melding wanneer aan je voorwaarden is voldaan', - requireFields: 'Veldvereisten instellen', - requireFieldsShort: 'Velden verplichten', + requireFields: 'Velden verplichten', requireFieldsDescription: 'Bonnen, categorieën, enz.', - createAgentRule: 'Agentregel beschrijven', - createAgentRuleDescription: 'Maak flexibele regels die worden uitgevoerd wanneer jij dat nodig hebt.', describeItBelow: 'Of beschrijf hem hieronder', describeRulePlaceholder: 'Blokkeer alle uitgaven boven $2.000', selectTemplateOrDescribe: 'Selecteer een sjabloon of beschrijf een regel om door te gaan', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index a2728eb2528b..f610d1ccdcff 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -8852,11 +8852,8 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, applyExpenseDefaultsDescription: 'Aktualizuj pola automatycznie', flagForReview: 'Oznacz do przejrzenia', flagForReviewDescription: 'Powiadamiaj, gdy Twoje warunki zostaną spełnione', - requireFields: 'Ustaw wymagania pola', - requireFieldsShort: 'Wymagaj pól', + requireFields: 'Wymagaj pól', requireFieldsDescription: 'Paragony, kategorie itp.', - createAgentRule: 'Opisz regułę agenta', - createAgentRuleDescription: 'Twórz elastyczne reguły, które uruchamiają się wtedy, gdy ich potrzebujesz.', describeItBelow: 'Lub po prostu opisz ją poniżej', describeRulePlaceholder: 'Blokuj wszystkie wydatki powyżej 2000 $', selectTemplateOrDescribe: 'Wybierz szablon lub opisz regułę, aby kontynuować', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 4aa38a9e051d..f07ace524398 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -8829,11 +8829,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, applyExpenseDefaultsDescription: 'Atualizar campos automaticamente', flagForReview: 'Marcar para revisão', flagForReviewDescription: 'Notificar quando suas condições forem atendidas', - requireFields: 'Definir requisitos de campo', - requireFieldsShort: 'Exigir campos', + requireFields: 'Exigir campos', requireFieldsDescription: 'Recibos, categorias etc.', - createAgentRule: 'Descrever regra do agente', - createAgentRuleDescription: 'Crie regras flexíveis que sejam executadas quando você precisar.', describeItBelow: 'Ou simplesmente descreva abaixo', describeRulePlaceholder: 'Bloquear todos os gastos acima de $2.000', selectTemplateOrDescribe: 'Selecione um modelo ou descreva uma regra para continuar', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 80bfcf78395d..75c49df9bdd1 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -8517,11 +8517,8 @@ ${reportName}`, applyExpenseDefaultsDescription: '自动更新字段', flagForReview: '标记以供审核', flagForReviewDescription: '满足你的条件时发送通知', - requireFields: '设置字段要求', - requireFieldsShort: '必填字段', + requireFields: '必填字段', requireFieldsDescription: '收据、类别等', - createAgentRule: '描述代理规则', - createAgentRuleDescription: '创建可按需运行的灵活规则。', describeItBelow: '或者直接在下方描述', describeRulePlaceholder: '阻止所有超过 2,000 美元的支出', selectTemplateOrDescribe: '请选择模板或描述规则以继续', diff --git a/src/pages/workspace/rules/DescribeRuleButton.tsx b/src/pages/workspace/rules/DescribeRuleButton.tsx index 4aee47c5d369..da5d70730afd 100644 --- a/src/pages/workspace/rules/DescribeRuleButton.tsx +++ b/src/pages/workspace/rules/DescribeRuleButton.tsx @@ -4,7 +4,6 @@ import Button from '@components/Button'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import {clearNewRulePrompt} from '@userActions/Policy/Rules'; @@ -45,13 +44,8 @@ type DescribeRuleButtonProps = { function DescribeRuleButton(props: DescribeRuleButtonProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); - const {isBetaEnabled} = usePermissions(); const [isModalVisible, setIsModalVisible] = useState(false); - if (!isBetaEnabled(CONST.BETAS.DESCRIBE_RULE)) { - return null; - } - const openModal = () => { clearNewRulePrompt(); if (props.onPress) { diff --git a/src/pages/workspace/rules/RulesNewPage.tsx b/src/pages/workspace/rules/RulesNewPage.tsx index 0123104667b0..512a0ebfb59b 100644 --- a/src/pages/workspace/rules/RulesNewPage.tsx +++ b/src/pages/workspace/rules/RulesNewPage.tsx @@ -7,7 +7,6 @@ import Text from '@components/Text'; import useConfirmModal from '@hooks/useConfirmModal'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -50,13 +49,11 @@ function RulesNewPage({route}: RulesNewPageProps) { const {policyID, categoryName} = route.params; const {translate} = useLocalize(); const styles = useThemeStyles(); - const illustrations = useMemoizedLazyIllustrations(['CardReaderAlt', 'Flag', 'CheckboxText', 'ReportReceipt', 'AiBot']); + const illustrations = useMemoizedLazyIllustrations(['CardReaderAlt', 'Flag', 'CheckboxText', 'ReportReceipt']); const isCategorySettingsFlow = route.name === SCREENS.WORKSPACE.DYNAMIC_CATEGORY_RULES_NEW; const isCategoryScopedCreate = isCategorySettingsFlow || !!categoryName; const policy = usePolicy(policyID); const {showConfirmModal} = useConfirmModal(); - const {isBetaEnabled} = usePermissions(); - const isDescribeRuleBetaEnabled = isBetaEnabled(CONST.BETAS.DESCRIBE_RULE); // From category settings the only expense default is the category's tax rate, so the type chooser is skipped. It // can't be set without a rate to pick, so that case gets the chooser's explainer instead of an empty picker. @@ -101,7 +98,7 @@ function RulesNewPage({route}: RulesNewPageProps) { { key: 'requireFields', icon: illustrations.CheckboxText, - title: translate(isDescribeRuleBetaEnabled ? 'workspace.rules.newRule.requireFieldsShort' : 'workspace.rules.newRule.requireFields'), + title: translate('workspace.rules.newRule.requireFields'), description: translate('workspace.rules.newRule.requireFieldsDescription'), onPress: () => Navigation.navigate( @@ -121,25 +118,11 @@ function RulesNewPage({route}: RulesNewPageProps) { // Only category settings can scope the editor to its category, so a category passed any other way drops it. isWorkspaceOnly: !isCategorySettingsFlow, }, - // The describe section drafts an agent rule when it cannot build a standard rule. Therefore it replaces this option. - ...(isDescribeRuleBetaEnabled - ? [] - : [ - { - key: 'createAgentRule', - icon: illustrations.AiBot, - title: translate('workspace.rules.newRule.createAgentRule'), - description: translate('workspace.rules.newRule.createAgentRuleDescription'), - onPress: () => Navigation.navigate(ROUTES.RULES_AGENT_NEW.getRoute(policyID)), - sentryLabel: CONST.SENTRY_LABEL.WORKSPACE.RULES.NEW_RULE_MENU_ITEM_CREATE_AGENT_RULE, - isWorkspaceOnly: true, - }, - ]), ]; const visibleNewRuleOptions = isCategoryScopedCreate ? newRuleOptions.filter((option) => !option.isWorkspaceOnly) : newRuleOptions; // The describe section cannot scope a rule to a category. Therefore it shows only when New rule opens from the workspace Rules page. - const shouldShowDescribeSection = isDescribeRuleBetaEnabled && !isCategoryScopedCreate; + const shouldShowDescribeSection = !isCategoryScopedCreate; const newRuleMenuItems = visibleNewRuleOptions.map((option) => ( { @@ -53,11 +52,6 @@ jest.mock('@hooks/useLocalize', () => translate: (key: string) => key, })), ); -jest.mock('@hooks/usePermissions', () => - jest.fn(() => ({ - isBetaEnabled: (beta: string) => beta === jest.requireActual<{default: typeof CONST}>('@src/CONST').default.BETAS.DESCRIBE_RULE && mockIsDescribeRuleBetaEnabled, - })), -); jest.mock('@hooks/usePolicy', () => jest.fn()); jest.mock('@hooks/useTheme', () => jest.fn(() => ({icon: '#000'}))); jest.mock('@components/Icon', () => () => null); @@ -221,7 +215,6 @@ describe('New rule describe section', () => { beforeEach(() => { jest.clearAllMocks(); mockPrompt = ''; - mockIsDescribeRuleBetaEnabled = true; writeSpy = jest.spyOn(API, 'write').mockImplementation(() => Promise.resolve()); setAdminPolicy(); }); @@ -234,7 +227,7 @@ describe('New rule describe section', () => { }); it('shows the four templates and then the describe section', async () => { - // Given an admin with the describeRule beta on the New rule page + // Given an admin on the New rule page await renderRulesNewPage(); // When the admin looks at the options @@ -244,7 +237,7 @@ describe('New rule describe section', () => { const expectedOptionNames = [ 'workspace.rules.newRule.restrictCardSpend', 'workspace.rules.newRule.flagForReview', - 'workspace.rules.newRule.requireFieldsShort', + 'workspace.rules.newRule.requireFields', 'workspace.rules.newRule.applyExpenseDefaults', ]; expect(options).toHaveLength(expectedOptionNames.length); @@ -286,7 +279,7 @@ describe('New rule describe section', () => { }); it('hides the describe section when New rule opens for a category', async () => { - // Given an admin with the describeRule beta who opens New rule for a category, which the describe section cannot scope a rule to + // Given an admin who opens New rule for a category, which the describe section cannot scope a rule to await renderRulesNewPage('Meals'); // Then New rule lists only the rule types, without the describe section @@ -295,34 +288,6 @@ describe('New rule describe section', () => { expect(screen.getByText('workspace.rules.newRule.subtitle')).toBeOnTheScreen(); }); - it('keeps Describe agent rule in place of the describe section without the beta', async () => { - // Given an admin without the describeRule beta, who must see the New rule options that exist without the feature - mockIsDescribeRuleBetaEnabled = false; - await renderRulesNewPage(); - - // When the admin looks at the options - const options = screen.getAllByRole('button'); - - // Then the four rule types come first and Describe agent rule comes last, with no describe section - const expectedOptionNames = [ - 'workspace.rules.newRule.restrictCardSpend', - 'workspace.rules.newRule.flagForReview', - 'workspace.rules.newRule.requireFields', - 'workspace.rules.newRule.applyExpenseDefaults', - 'workspace.rules.newRule.createAgentRule', - ]; - expect(options).toHaveLength(expectedOptionNames.length); - for (const [index, name] of expectedOptionNames.entries()) { - expect(options.at(index)).toHaveAccessibleName(name); - } - - expect(screen.queryByText('workspace.rules.newRule.describeItBelow')).toBeNull(); - - // And Describe agent rule opens the agent rule page - fireEvent.press(screen.getByLabelText('workspace.rules.newRule.createAgentRule')); - expect(Navigation.navigate).toHaveBeenCalledWith(ROUTES.RULES_AGENT_NEW.getRoute(POLICY_ID)); - }); - it('seeds the draft of the generated rule type and opens its editor', async () => { // Given the admin described a flag for review rule in the describe section, so the request lets Concierge pick the rule type await renderRulesNewPage();