Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
43e3799
show rule sin rhp
luacmartins Apr 10, 2026
bc8d5d1
fix prettier
luacmartins Apr 10, 2026
e209cc9
add copy
luacmartins Apr 10, 2026
fdee625
resolve conflicts
luacmartins Apr 14, 2026
04630c6
reoderd ui
luacmartins Apr 14, 2026
4961e4c
fix matching rule
luacmartins Apr 14, 2026
bd87017
move rule code to SpendRuleUtils
luacmartins Apr 14, 2026
64689e0
clean up code
luacmartins Apr 14, 2026
d1db040
update conditional
luacmartins Apr 14, 2026
a7e4c79
update copy
luacmartins Apr 14, 2026
da3a6cb
fix copy
luacmartins Apr 14, 2026
8f14057
fix prettier
luacmartins Apr 14, 2026
880ee0d
fix type
luacmartins Apr 14, 2026
00dc7ed
limit to two lines per type
luacmartins Apr 14, 2026
e20dcc5
rm right icon
luacmartins Apr 14, 2026
235155a
apply copy
luacmartins Apr 14, 2026
d31b00b
resolve conflicts
luacmartins Apr 15, 2026
09fe527
update truncate limit
luacmartins Apr 15, 2026
2a148e7
Merge branch 'main' into cmartins-ruleSummary
luacmartins Apr 17, 2026
4c99568
address comments
luacmartins Apr 17, 2026
be08333
fix depencency
luacmartins Apr 17, 2026
40f26b1
resolve conflicts
luacmartins Apr 20, 2026
ebc51d5
move utils method
luacmartins Apr 20, 2026
319f7df
add summary to wallet page
luacmartins Apr 20, 2026
345406b
show summary in wallet
luacmartins Apr 20, 2026
9ad1963
dry navigate function
luacmartins Apr 20, 2026
6044c39
gst
luacmartins Apr 20, 2026
5decf07
fix api calls
luacmartins Apr 20, 2026
d695575
flatten routes
luacmartins Apr 20, 2026
8341ea8
fix prettier
luacmartins Apr 20, 2026
7a283e8
fix spell
luacmartins Apr 20, 2026
0be3bcb
fix eslint
luacmartins Apr 20, 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
4 changes: 4 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,10 @@ const ROUTES = {
route: 'settings/wallet/card/:cardID?',
getRoute: (cardID: string) => `settings/wallet/card/${cardID}` as const,
},
SETTINGS_WALLET_EXPENSIFY_CARD_SPEND_RULES: {
route: 'settings/wallet/expensify-card/spend-rules/:policyID/:ruleID',
getRoute: (policyID: string, ruleID?: string) => `settings/wallet/expensify-card/spend-rules/${policyID}/${ruleID ?? 'new'}` as const,
},
SETTINGS_WALLET_PERSONAL_CARD_DETAILS: {
route: 'settings/wallet/personal-card/:cardID',
getRoute: (cardID: string | undefined) => {
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ const SCREENS = {
PERSONAL_CARD_ADD_NEW: 'Settings_Wallet_PersonalCard_New',
PERSONAL_CARD_WARNING: 'Settings_Wallet_PersonalCard_Warning',
PERSONAL_CARD_UPGRADE: 'Settings_Wallet_PersonalCard_Upgrade',
EXPENSIFY_CARD_SPEND_RULES: 'Settings_Wallet_ExpensifyCard_SpendRules',
},

EXIT_SURVEY: {
Expand Down
28 changes: 27 additions & 1 deletion src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2533,6 +2533,8 @@ ${amount} für ${merchant} – ${date}`,
frozenByAdminNeedsUnfreezePrefix: 'Diese Karte wurde von ',
frozenByAdminNeedsUnfreezeSuffix: ' gesperrt. Bitte kontaktiere einen Admin, um sie zu entsperren.',
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Diese Karte wurde von ${person} gesperrt. Bitte kontaktiere einen Admin, um sie zu entsperren.`,
spendRules: 'Ausgaberichtlinien',
editSpendRules: 'Ausgaberegeln bearbeiten',
},
workflowsPage: {
workflowTitle: 'Ausgaben',
Expand Down Expand Up @@ -6891,7 +6893,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
currencyMismatchTitle: 'Währungsinkonsistenz',
currencyMismatchPrompt: 'Um einen Höchstbetrag festzulegen, wählen Sie Karten aus, die in derselben Währung abgerechnet werden.',
reviewSelectedCards: 'Ausgewählte Karten prüfen',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}, +${count} weitere`,
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => (count > 0 ? `${summary}, +${count} weitere` : summary),
confirmErrorApplyAtLeastOneSpendRuleToOneCard: 'Wenden Sie mindestens eine Ausgabenregel auf eine Karte an',
confirmErrorCardRequired: 'Feld „Karte“ ist erforderlich',
confirmErrorApplyAtLeastOneSpendRule: 'Wenden Sie mindestens eine Ausgabenregel an',
Expand Down Expand Up @@ -6926,6 +6928,30 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
editRuleTitle: 'Regel bearbeiten',
deleteRule: 'Regel löschen',
deleteRuleConfirmation: 'Sind Sie sicher, dass Sie diese Regel löschen möchten?',
summaryMerchants: ({
merchants,
hiddenCount,
shownCount,
action,
}: {
merchants: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Blockiert' : 'Erlaubt'} ${shownCount > 1 ? 'Händler' : 'Händler'}: ${merchants}${hiddenCount > 0 ? `, +${hiddenCount} weitere` : ''}`,
summaryCategories: ({
categories,
hiddenCount,
shownCount,
action,
}: {
categories: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Blockiert' : 'Erlaubt'} ${shownCount > 1 ? 'Kategorien' : 'Kategorie'}: ${categories}${hiddenCount > 0 ? `, +${hiddenCount} weitere` : ''}`,
},
},
planTypePage: {
Expand Down
28 changes: 27 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2528,6 +2528,8 @@ const translations = {
getPhysicalCard: 'Get physical card',
reportFraud: 'Report virtual card fraud',
reportTravelFraud: 'Report travel card fraud',
spendRules: 'Spend rules',
editSpendRules: 'Edit spend rules',
reviewTransaction: 'Review transaction',
suspiciousBannerTitle: 'Suspicious transaction',
suspiciousBannerDescription: 'We noticed suspicious transactions on your card. Tap below to review.',
Expand Down Expand Up @@ -6901,7 +6903,31 @@ const translations = {
currencyMismatchTitle: 'Currency mismatch',
currencyMismatchPrompt: 'To set a max amount, select cards that settle in the same currency.',
reviewSelectedCards: 'Review selected cards',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}, +${count} more`,
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => (count > 0 ? `${summary}, +${count} more` : summary),
summaryMerchants: ({
merchants,
hiddenCount,
shownCount,
action,
}: {
merchants: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Blocked' : 'Allowed'} ${shownCount > 1 ? 'merchants' : 'merchant'}: ${merchants}${hiddenCount > 0 ? `, +${hiddenCount} more` : ''}`,
summaryCategories: ({
categories,
hiddenCount,
shownCount,
action,
}: {
categories: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Blocked' : 'Allowed'} ${shownCount > 1 ? 'categories' : 'category'}: ${categories}${hiddenCount > 0 ? `, +${hiddenCount} more` : ''}`,
confirmErrorApplyAtLeastOneSpendRuleToOneCard: 'Apply at least one spend rule to one card',
confirmErrorCardRequired: 'Card is a required field',
confirmErrorApplyAtLeastOneSpendRule: 'Apply at least one spend rule',
Expand Down
8 changes: 7 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2343,6 +2343,8 @@ const translations: TranslationDeepObject<typeof en> = {
getPhysicalCard: 'Obtener tarjeta física',
reportFraud: 'Reportar fraude con la tarjeta virtual',
reportTravelFraud: 'Reportar fraude con la tarjeta de viaje',
spendRules: 'Reglas de gasto',
editSpendRules: 'Editar reglas de gasto',
reviewTransaction: 'Revisar transacción',
suspiciousBannerTitle: 'Transacción sospechosa',
suspiciousBannerDescription: 'Hemos detectado una transacción sospechosa en la tarjeta. Haz click abajo para revisarla.',
Expand Down Expand Up @@ -6775,7 +6777,11 @@ ${amount} para ${merchant} - ${date}`,
currencyMismatchTitle: 'Moneda no coincide',
currencyMismatchPrompt: 'Para establecer un importe máximo, selecciona tarjetas que se liquiden en la misma moneda.',
reviewSelectedCards: 'Revisar tarjetas seleccionadas',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}, +${count} más`,
summaryMoreCount: ({summary, count}) => (count > 0 ? `${summary}, +${count} más` : summary),
summaryMerchants: ({merchants, hiddenCount, shownCount, action}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloqueados' : 'Permitidos'} ${shownCount > 1 ? 'comerciantes' : 'comerciante'}: ${merchants}${hiddenCount > 0 ? `, +${hiddenCount} más` : ''}`,
summaryCategories: ({categories, hiddenCount, shownCount, action}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloqueados' : 'Permitidos'} ${shownCount > 1 ? 'categorías' : 'categoría'}: ${categories}${hiddenCount > 0 ? `, +${hiddenCount} más` : ''}`,
confirmErrorApplyAtLeastOneSpendRuleToOneCard: 'Aplica al menos una regla de gasto a una tarjeta',
confirmErrorCardRequired: 'La tarjeta es un campo obligatorio',
confirmErrorApplyAtLeastOneSpendRule: 'Aplica al menos una regla de gasto',
Expand Down
28 changes: 27 additions & 1 deletion src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2539,6 +2539,8 @@ ${amount} pour ${merchant} - ${date}`,
frozenByAdminNeedsUnfreezePrefix: 'Cette carte a été gelée par ',
frozenByAdminNeedsUnfreezeSuffix: '. Veuillez contacter un administrateur pour la dégeler.',
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Cette carte a été gelée par ${person}. Veuillez contacter un administrateur pour la dégeler.`,
spendRules: 'Règles de dépense',
editSpendRules: 'Modifier les règles de dépenses',
},
workflowsPage: {
workflowTitle: 'Dépense',
Expand Down Expand Up @@ -6913,7 +6915,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
currencyMismatchTitle: 'Incompatibilité de devise',
currencyMismatchPrompt: 'Pour définir un montant maximal, sélectionnez des cartes qui sont réglées dans la même devise.',
reviewSelectedCards: 'Examiner les cartes sélectionnées',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}, +${count} de plus`,
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => (count > 0 ? `${summary}, +${count} de plus` : summary),
confirmErrorApplyAtLeastOneSpendRuleToOneCard: 'Appliquez au moins une règle de dépense à une carte',
confirmErrorCardRequired: 'La carte est un champ obligatoire',
confirmErrorApplyAtLeastOneSpendRule: 'Appliquez au moins une règle de dépense',
Expand Down Expand Up @@ -6948,6 +6950,30 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
editRuleTitle: 'Modifier la règle',
deleteRule: 'Supprimer la règle',
deleteRuleConfirmation: 'Êtes-vous sûr de vouloir supprimer cette règle ?',
summaryMerchants: ({
merchants,
hiddenCount,
shownCount,
action,
}: {
merchants: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloqué' : 'Autorisé'} ${shownCount > 1 ? 'commerçants' : 'commerçant'}: ${merchants}${hiddenCount > 0 ? `, +${hiddenCount} de plus` : ''}`,
summaryCategories: ({
categories,
hiddenCount,
shownCount,
action,
}: {
categories: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloqué' : 'Autorisé'} ${shownCount > 1 ? 'catégories' : 'catégorie'}: ${categories}${hiddenCount > 0 ? `, +${hiddenCount} de plus` : ''}`,
},
},
planTypePage: {
Expand Down
28 changes: 27 additions & 1 deletion src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2528,6 +2528,8 @@ ${amount} per ${merchant} - ${date}`,
frozenByAdminNeedsUnfreezePrefix: 'Questa carta è stata bloccata da ',
frozenByAdminNeedsUnfreezeSuffix: '. Contatta un amministratore per sbloccarla.',
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Questa carta è stata bloccata da ${person}. Contatta un amministratore per sbloccarla.`,
spendRules: 'Regole di spesa',
editSpendRules: 'Modifica regole di spesa',
},
workflowsPage: {
workflowTitle: 'Spesa',
Expand Down Expand Up @@ -6876,7 +6878,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
currencyMismatchTitle: 'Valuta non corrispondente',
currencyMismatchPrompt: 'Per impostare un importo massimo, seleziona carte che si regolano nella stessa valuta.',
reviewSelectedCards: 'Controlla le carte selezionate',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}, +${count} altro`,
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => (count > 0 ? `${summary}, +${count} altri` : summary),
confirmErrorApplyAtLeastOneSpendRuleToOneCard: 'Applica almeno una regola di spesa a una carta',
confirmErrorCardRequired: 'Il campo Carta è obbligatorio',
confirmErrorApplyAtLeastOneSpendRule: 'Applica almeno una regola di spesa',
Expand Down Expand Up @@ -6911,6 +6913,30 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
editRuleTitle: 'Modifica regola',
deleteRule: 'Elimina regola',
deleteRuleConfirmation: 'Sei sicuro di voler eliminare questa regola?',
summaryMerchants: ({
merchants,
hiddenCount,
shownCount,
action,
}: {
merchants: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloccato' : 'Consentito'} ${shownCount > 1 ? 'esercenti' : 'esercente'}: ${merchants}${hiddenCount > 0 ? `, +${hiddenCount} in più` : ''}`,
summaryCategories: ({
categories,
hiddenCount,
shownCount,
action,
}: {
categories: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'Bloccato' : 'Consentito'} ${shownCount > 1 ? 'categorie' : 'categoria'}: ${categories}${hiddenCount > 0 ? `, +${hiddenCount} in più` : ''}`,
},
},
planTypePage: {
Expand Down
28 changes: 27 additions & 1 deletion src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2503,6 +2503,8 @@ ${date} の ${merchant} への ${amount}`,
frozenByAdminNeedsUnfreezePrefix: 'このカードは',
frozenByAdminNeedsUnfreezeSuffix: 'によって一時停止されました。解除するには管理者に連絡してください。',
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `このカードは${person}によって一時停止されました。解除するには管理者に連絡してください。`,
spendRules: '支出ルール',
editSpendRules: '支出ルールを編集',
},
workflowsPage: {
workflowTitle: '支出',
Expand Down Expand Up @@ -6800,7 +6802,7 @@ ${reportName}
currencyMismatchTitle: '通貨の不一致',
currencyMismatchPrompt: '上限金額を設定するには、同じ通貨で清算されるカードを選択してください。',
reviewSelectedCards: '選択したカードを確認',
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => `${summary}、ほか +${count} 件`,
summaryMoreCount: ({summary, count}: {summary: string; count: number}) => (count > 0 ? `${summary}、ほか+${count}件` : summary),
confirmErrorApplyAtLeastOneSpendRuleToOneCard: '少なくとも1つの支出ルールを1枚のカードに適用してください',
confirmErrorCardRequired: 'カードは必須項目です',
confirmErrorApplyAtLeastOneSpendRule: '少なくとも 1 つの支出ルールを適用してください',
Expand Down Expand Up @@ -6835,6 +6837,30 @@ ${reportName}
editRuleTitle: 'ルールを編集',
deleteRule: 'ルールを削除',
deleteRuleConfirmation: 'このルールを削除してもよろしいですか?',
summaryMerchants: ({
merchants,
hiddenCount,
shownCount,
action,
}: {
merchants: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'ブロック済み' : '許可されています'} ${shownCount > 1 ? '加盟店' : '加盟店'}: ${merchants}${hiddenCount > 0 ? `、ほか +${hiddenCount} 件` : ''}`,
summaryCategories: ({
categories,
hiddenCount,
shownCount,
action,
}: {
categories: string;
hiddenCount: number;
shownCount: number;
action: ValueOf<typeof CONST.SPEND_RULES.ACTION>;
}) =>
`${action === CONST.SPEND_RULES.ACTION.BLOCK ? 'ブロック済み' : '許可されています'} ${shownCount > 1 ? 'カテゴリ' : 'カテゴリ'}: ${categories}${hiddenCount > 0 ? `、ほか +${hiddenCount} 件` : ''}`,
},
},
planTypePage: {
Expand Down
Loading
Loading