Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a0076bb
Support multiple conditions on an expense default rule
Krishna2323 Oct 15, 2026
f707380
Fix the condition text, validation and duplicate prompt for multi-con…
Krishna2323 Oct 15, 2026
6bbcb67
Support category, tag and amount in expense default rules
Krishna2323 Oct 15, 2026
6668c23
Follow the existing picker patterns for the new rule condition and am…
Krishna2323 Oct 15, 2026
1c24c39
Require a tag before offering the tag condition
Krishna2323 Oct 15, 2026
f92c9e2
Require a tag before offering the tag condition
Krishna2323 Oct 15, 2026
f8b9603
Gate the category condition row on a category to match
Krishna2323 Oct 15, 2026
0634260
Keep a deleted category or tag listed in the condition pickers
Krishna2323 Oct 15, 2026
4c2cd5b
remove unused translations keys.
Krishna2323 Oct 15, 2026
5289f2f
Remove dead exports left by the category tax default deletion
Krishna2323 Oct 15, 2026
5cee48a
Preview every condition, and rename the merchant-only rule API
Krishna2323 Oct 15, 2026
d7fdd05
fix knip check.
Krishna2323 Oct 15, 2026
34f595f
Merge remote-tracking branch 'upstream/main' into krishna2323/issue-1…
Krishna2323 Oct 19, 2026
82e33fc
update translations.
Krishna2323 Oct 19, 2026
00eb6e9
Merge remote-tracking branch 'upstream/main' into krishna2323/issue-1…
Krishna2323 Oct 20, 2026
b972724
Fix the category settings expense default flow
Krishna2323 Oct 20, 2026
e13a245
Open a rule that also fires when an expense is edited
Krishna2323 Oct 20, 2026
27db57e
Rewrite a renamed category inside the rules that match on it
Krishna2323 Oct 20, 2026
66f63ad
Pass the coding rules through the inline category rename in tests
Krishna2323 Oct 20, 2026
c483c29
Merge remote-tracking branch 'upstream/main' into krishna2323/issue-1…
Krishna2323 Oct 20, 2026
10be6f0
Merge remote-tracking branch 'upstream/main' into krishna2323/issue-1…
Krishna2323 Oct 21, 2026
468f4b9
Stop rewriting a renamed category inside the rules that match on it
Krishna2323 Oct 21, 2026
7bdbc49
Tell a contains rule apart from an exact match in the rules table
Krishna2323 Oct 21, 2026
a3c1518
Keep the rule being edited when picking a category
Krishna2323 Oct 22, 2026
1e9243e
Stop offering a rule that is being deleted
Krishna2323 Oct 22, 2026
483a907
Compare every condition when skipping imported duplicates
Krishna2323 Oct 22, 2026
11041f9
Merge branch 'main' into krishna2323/issue-102277-expense-defaults
Krishna2323 Oct 22, 2026
d0d4d6b
Translate the new merchant condition strings
Krishna2323 Oct 22, 2026
55333e5
Stop predicting a category's tax on the client
Krishna2323 Oct 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/eslint/eslint.seatbelt.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -1709,8 +1709,8 @@
"../../src/pages/workspace/rules/ExpenseReportRulesSection.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 3
"../../src/pages/workspace/rules/FlagForReviewRules/FlagForReviewRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1
"../../src/pages/workspace/rules/IndividualExpenseRulesSectionRevamp.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1
"../../src/pages/workspace/rules/MerchantRules/ExpenseDefaultRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1
"../../src/pages/workspace/rules/MerchantRules/ExpenseDefaultTypePage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1
"../../src/pages/workspace/rules/MerchantRules/MerchantRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1
"../../src/pages/workspace/rules/MerchantTypeRules/MerchantTypeRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1
"../../src/pages/workspace/rules/RulesNewPage.tsx" "@typescript-eslint/no-deprecated/MenuItem" 1
"../../src/pages/workspace/rules/SpendRules/SpendRulePageBase.tsx" "@typescript-eslint/no-deprecated/MenuItemWithTopDescription" 1
Expand Down
6 changes: 1 addition & 5 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4918,11 +4918,6 @@ const CONST = {
MERCHANTS: 'merchants',
MERCHANT_TYPES: 'merchantTypes',
},
/** What an expense default rule matches on, chosen before the editor opens and kept in its draft. */
EXPENSE_DEFAULT_RULE_TYPE: {
MERCHANT: 'merchant',
CATEGORY: 'category',
},
DEFAULT_REPORT_NAME_PATTERN: '{report:type} {report:startdate}',
DEFAULT_FIELD_LIST_TYPE: 'formula',
DEFAULT_FIELD_LIST_TARGET: 'expense',
Expand Down Expand Up @@ -9351,6 +9346,7 @@ const CONST = {
EXPENSE_DEFAULT: {
/** Expense fields a `Set` action can write to */
FIELD: {
AMOUNT: 'amount',
BILLABLE: 'billable',
CATEGORY: 'category',
COMMENT: 'comment',
Expand Down
56 changes: 38 additions & 18 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,14 @@ const ENABLE_GLOBAL_REIMBURSEMENTS_ENTRY_SCREENS = [
SCREENS.SETTINGS.WALLET.ROOT,
] as const;

// Every step of the expense default editor is reachable from the workspace Rules flow and from category settings,
// which enters through its own dynamic route, so each step has to accept both as an entry.
const EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS = [
SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW,
SCREENS.WORKSPACE.DYNAMIC_CATEGORY_TAX_RULE_NEW,
SCREENS.WORKSPACE.DYNAMIC_CATEGORY_TAX_RULE_EDIT,
] as const;

const DYNAMIC_ROUTES = {
VERIFY_ACCOUNT: {
path: 'verify-account',
Expand Down Expand Up @@ -1101,10 +1109,6 @@ const DYNAMIC_ROUTES = {
path: 'gl-code',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS],
},
WORKSPACE_CATEGORY_DEFAULT_TAX_RATE: {
path: 'tax-rate',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS],
},
WORKSPACE_CATEGORY_FLAG_AMOUNTS_OVER: {
path: 'flag-amounts',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS],
Expand Down Expand Up @@ -1169,48 +1173,60 @@ const DYNAMIC_ROUTES = {
},
RULES_MERCHANT_MERCHANT_TO_MATCH_FROM_EXPENSE: {
path: 'rule-merchant-to-match',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_MATCH_TYPE_FROM_EXPENSE: {
path: 'rule-match-type',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_MERCHANT_TO_MATCH],
},
RULES_MERCHANT_MERCHANT_FROM_EXPENSE: {
path: 'rule-merchant',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_CATEGORY_FROM_EXPENSE: {
path: 'rule-category',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_TAG_FROM_EXPENSE: {
path: 'rule-tag/:orderWeight',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
getRoute: (orderWeight: number) => `rule-tag/${orderWeight}` as const,
},
RULES_MERCHANT_TAX_FROM_EXPENSE: {
path: 'rule-tax',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW, SCREENS.WORKSPACE.DYNAMIC_CATEGORY_TAX_RULE_NEW, SCREENS.WORKSPACE.DYNAMIC_CATEGORY_TAX_RULE_EDIT],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_VENDOR_FROM_EXPENSE: {
path: 'rule-vendor',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_DESCRIPTION_FROM_EXPENSE: {
path: 'rule-description',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_REIMBURSABLE_FROM_EXPENSE: {
path: 'rule-reimbursable',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_BILLABLE_FROM_EXPENSE: {
path: 'rule-billable',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_AMOUNT_FROM_EXPENSE: {
path: 'rule-amount',
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_CATEGORY_TO_MATCH_FROM_EXPENSE: {
path: 'rule-category-to-match',
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_TAG_TO_MATCH_FROM_EXPENSE: {
path: 'rule-tag-to-match',
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
RULES_MERCHANT_PREVIEW_MATCHES_FROM_EXPENSE: {
path: 'rule-matches',
entryScreens: [SCREENS.WORKSPACE.DYNAMIC_RULES_MERCHANT_NEW],
entryScreens: EXPENSE_DEFAULT_RULE_STEP_ENTRY_SCREENS,
},
NOTIFICATION_PREFERENCES: {
// `reportID` is intentionally carried as a distinct path param (`notificationReportID`) rather than
Expand Down Expand Up @@ -4424,10 +4440,6 @@ const ROUTES = {
route: 'workspaces/:policyID/rules/new',
getRoute: (policyID: string, categoryName?: string) => `workspaces/${policyID}/rules/new${getOptionalCategoryNameQuery(categoryName)}` as const,
},
RULES_EXPENSE_DEFAULT_TYPE: {
route: 'workspaces/:policyID/rules/expense-defaults/new',
getRoute: (policyID: string) => `workspaces/${policyID}/rules/expense-defaults/new` as const,
},
RULES_MERCHANT_NEW: {
route: 'workspaces/:policyID/rules/merchant-rules/new',
getRoute: (policyID: string, categoryName?: string) => `workspaces/${policyID}/rules/merchant-rules/new${getOptionalCategoryNameQuery(categoryName)}` as const,
Expand Down Expand Up @@ -4515,6 +4527,10 @@ const ROUTES = {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/billable',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/billable` as const,
},
RULES_MERCHANT_AMOUNT: {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/amount',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/amount` as const,
},
RULES_MERCHANT_EDIT: {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID',
getRoute: (policyID: string, ruleID: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID}` as const,
Expand All @@ -4529,6 +4545,10 @@ const ROUTES = {
getRoute: (policyID: string, ruleID?: string, categoryName?: string) =>
`workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/category-to-match${getOptionalCategoryNameQuery(categoryName)}` as const,
},
RULES_TAG_TO_MATCH: {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/tag-to-match',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/tag-to-match` as const,
},
RULES_CATEGORY_TAX_EDIT: {
route: 'workspaces/:policyID/rules/category-tax-rules/edit/:categoryName',
getRoute: (policyID: string, categoryName: string) => `workspaces/${policyID}/rules/category-tax-rules/edit/${encodeURIComponent(categoryName)}` as const,
Expand Down
7 changes: 5 additions & 2 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,6 @@ const SCREENS = {
DYNAMIC_CATEGORY_PAYROLL_CODE: 'Dynamic_Category_Payroll_Code',
DYNAMIC_CATEGORY_GL_CODE: 'Dynamic_Category_GL_Code',
DYNAMIC_CATEGORY_SETTINGS: 'Dynamic_Category_Settings',
DYNAMIC_CATEGORY_DEFAULT_TAX_RATE: 'Dynamic_Category_Default_Tax_Rate',
DYNAMIC_CATEGORY_FLAG_AMOUNTS_OVER: 'Dynamic_Category_Flag_Amounts_Over',
DYNAMIC_EXPENSE_LIMIT_TYPE_SELECTOR: 'Dynamic_Expense_Limit_Type_Selector',
DYNAMIC_IMPORTED_MEMBERS_ROLE: 'Dynamic_Imported_Members_Role',
Expand Down Expand Up @@ -1027,7 +1026,6 @@ const SCREENS = {
RULES_CUSTOM: 'Rules_Custom',
RULES_PROHIBITED_DEFAULT: 'Rules_Prohibited_Default',
RULES_NEW: 'Rules_New',
RULES_EXPENSE_DEFAULT_TYPE: 'Rules_Expense_Default_Type',
RULES_MERCHANT_NEW: 'Rules_Merchant_New',
RULES_MERCHANT_IMPORT: 'Rules_Merchant_Import',
RULES_MERCHANT_IMPORTED: 'Rules_Merchant_Imported',
Expand Down Expand Up @@ -1061,8 +1059,10 @@ const SCREENS = {
RULES_MERCHANT_DESCRIPTION: 'Rules_Merchant_Description',
RULES_MERCHANT_REIMBURSABLE: 'Rules_Merchant_Reimbursable',
RULES_MERCHANT_BILLABLE: 'Rules_Merchant_Billable',
RULES_MERCHANT_AMOUNT: 'Rules_Merchant_Amount',
RULES_MERCHANT_PREVIEW_MATCHES: 'Rules_Merchant_Preview_Matches',
RULES_CATEGORY_TO_MATCH: 'Rules_Category_To_Match',
RULES_TAG_TO_MATCH: 'Rules_Tag_To_Match',
RULES_CATEGORY_TAX_EDIT: 'Rules_Category_Tax_Edit',
RULES_MERCHANT_EDIT: 'Rules_Merchant_Edit',
DYNAMIC_RULES_MERCHANT_NEW: 'Dynamic_Rules_Merchant_New',
Expand All @@ -1076,6 +1076,9 @@ const SCREENS = {
DYNAMIC_RULES_MERCHANT_DESCRIPTION: 'Dynamic_Rules_Merchant_Description',
DYNAMIC_RULES_MERCHANT_REIMBURSABLE: 'Dynamic_Rules_Merchant_Reimbursable',
DYNAMIC_RULES_MERCHANT_BILLABLE: 'Dynamic_Rules_Merchant_Billable',
DYNAMIC_RULES_MERCHANT_AMOUNT: 'Dynamic_Rules_Merchant_Amount',
DYNAMIC_RULES_CATEGORY_TO_MATCH: 'Dynamic_Rules_Category_To_Match',
DYNAMIC_RULES_TAG_TO_MATCH: 'Dynamic_Rules_Tag_To_Match',
DYNAMIC_RULES_MERCHANT_PREVIEW_MATCHES: 'Dynamic_Rules_Merchant_Preview_Matches',
RULES_SPEND_MERCHANTS: 'Rules_Spend_Merchants',
RULES_SPEND_MERCHANT_EDIT: 'Rules_Spend_Merchant_Edit',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ function FieldAutoSelector({
if (!transactionID || iouCategory || !shouldShowCategories || enabledCategories.length !== 1 || !isCategoryRequired) {
return;
}
setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy, getCurrencyDecimals, isMovingTransactionFromTrackExpense);
setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy, isMovingTransactionFromTrackExpense);
// Keep 'transaction' out to ensure that we auto select the option only once
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [shouldShowCategories, policyCategories, isCategoryRequired, policy?.id, getCurrencyDecimals]);
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useMerchantRuleSuggestion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ function useMerchantRuleSuggestion(reportID: string | undefined, policyID: strin
// Built here rather than only on press, so an offer that would apply nothing never appears. Clearing a field is
// still an edit worth recording, but the rule it would make sets that field to empty, which changes nothing.
const draft = suggestion && transaction ? getMerchantRuleDraftFromTransaction(transaction, fields, policy, editedTagLevels) : undefined;
const hasUpdatesToApply = !!draft && Object.keys(draft).some((key) => key !== INPUT_IDS.MERCHANT_TO_MATCH && key !== INPUT_IDS.RULE_TYPE);
const hasUpdatesToApply = !!draft && Object.keys(draft).some((key) => key !== INPUT_IDS.MERCHANT_TO_MATCH);

// A rule matches on merchant, so an expense without one (a receipt still scanning) can't seed one. Nor can an
// offer with nothing recorded, which is how an expense reads once its fields are cleared.
Expand Down
8 changes: 1 addition & 7 deletions src/hooks/useParticipantSubmission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -394,13 +394,7 @@ function useParticipantSubmission({
const policyDistance = Object.values(policy?.customUnits ?? {}).find((customUnit) => customUnit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE);
const defaultCategory = isDistanceRequest(transaction) && policyDistance?.defaultCategory ? policyDistance?.defaultCategory : '';
const category = isMovingTransactionFromTrackExpense ? (transaction?.category ?? '') : defaultCategory;
setMoneyRequestCategory(
transaction.transactionID,
category,
isMovingTransactionFromTrackExpense ? movingPolicy : undefined,
getCurrencyDecimals,
isMovingTransactionFromTrackExpense,
);
setMoneyRequestCategory(transaction.transactionID, category, isMovingTransactionFromTrackExpense ? movingPolicy : undefined, isMovingTransactionFromTrackExpense);

if (shouldUpdateTransactionReportID) {
setTransactionReport(transaction.transactionID, {reportID: transactionReportID}, true);
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useUpdateTransactionCategory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ function useUpdateTransactionCategory({
return;
}

setMoneyRequestCategory(transactionID, category, policy, getCurrencyDecimals);
setMoneyRequestCategory(transactionID, category, policy);
};

return {updateCategory, isDraftUpdate: !isSplitUpdate && !isExistingExpenseUpdate};
Expand Down
26 changes: 5 additions & 21 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8584,18 +8584,8 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
thenApplyFollowingDefaults: 'Wenden Sie dann die folgenden Standardwerte an:',
vendorUnavailable: 'Anbieter nicht verfügbar',
confirmErrorCategory: 'Bitte wählen Sie eine Kategorie aus',
confirmErrorCategoryTax: 'Bitte wählen Sie einen Steuersatz aus',
confirmErrorCondition: 'Bitte geben Sie einen Händler ein',
confirmErrorConditionAndDefault: 'Geben Sie einen Händler ein und wenden Sie mindestens eine Standardeinstellung an',
turnOnTaxesFirstTitle: 'Schalten Sie zuerst Steuern ein',
turnOnTaxesFirstPrompt: 'Kategorienregeln legen einen Standardsteuersatz fest. Aktivieren Sie Steuern in Ihren Workspace-Einstellungen, um sie zu verwenden.',
categoryRulesApplyGoingForwardTitle: 'Kategorienregeln gelten ab jetzt',
categoryRulesApplyGoingForwardPrompt: 'Ein Standardsatz für Steuern gilt für neue Ausgaben in dieser Kategorie. Bereits vorhandene Ausgaben werden nicht geändert.',
confirmErrorCategoryTaxMoveIsWorkspaceDefault:
'Der ausgewählte Steuersatz ist jetzt die Voreinstellung für Ihren Workspace, daher ist diese Regel nicht mehr gültig. Wählen Sie einen anderen Steuersatz.',
addTaxRateFirstTitle: 'Fügen Sie zuerst einen Steuersatz hinzu',
addTaxRateFirstPrompt:
'Kategorienregeln legen einen standardmäßigen Steuersatz fest. Fügen Sie einen anderen Steuersatz als den Standard Ihres Arbeitsbereichs hinzu, um sie zu verwenden.',
confirmErrorCondition: 'Bitte fügen Sie mindestens eine Bedingung hinzu',
confirmErrorConditionAndDefault: 'Fügen Sie mindestens eine Bedingung hinzu und wenden Sie mindestens eine Voreinstellung an',
createRuleFromExpenseAction: 'Regel erstellen',
createRuleFromExpensePrompt: 'um Ihre Änderungen auf alle Ausgaben anzuwenden, die Ihren Kriterien entsprechen.',
},
Expand Down Expand Up @@ -8926,9 +8916,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
findRule: 'Regel suchen',
rename: 'Umbenennen',
update: 'Aktualisieren',
merchantIs: (merchant: string) => `Händler ist „${merchant}“`,
merchantTypeIs: (merchantType: string) => `Händlertyp ist „${merchantType}"`,
categoryIs: (category: string) => `Kategorie ist „${category}“`,
tagIs: (tag: string) => `Tag ist „${tag}“`,
merchantContains: (merchant: string) => `Händler enthält „${merchant}“`,
merchantExactlyMatches: (merchant: string) => `Händler stimmt genau mit „${merchant}“ überein`,
},
merchantTypeRule: {merchantType: 'Händlerart', saveRule: 'Regel speichern', confirmErrorCategory: 'Bitte wählen Sie eine Kategorie aus.'},
requireFieldsTable: {
Expand Down Expand Up @@ -8998,14 +8990,6 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
cta: 'KI-Regel hinzufügen',
},
categoriesDisabledEmptyState: {title: 'Kategorien sind nicht aktiviert', subtitle: 'Aktivieren Sie Kategorien, um Ihre Ausgaben besser zu kontrollieren.'},
expenseDefaultType: {
title: 'Standardspesen übernehmen',
subtitle: 'Worauf soll diese Regel angewendet werden?',
merchant: 'Händler',
merchantDescription: 'Felder bei Ausgaben eines bestimmten Händlers aktualisieren',
category: 'Kategorie',
categoryDescription: 'Legen Sie einen Standardsteuersatz für eine bestimmte Kategorie fest',
},
taxesDisabledEmptyState: {
title: 'Steuern sind nicht aktiviert',
subtitle: 'Aktivieren Sie Steuern, um anfallende Steuern zu dokumentieren und zurückzufordern.',
Expand Down
Loading
Loading