Skip to content
Merged
Show file tree
Hide file tree
Changes from 45 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
019c7bf
add policy change log
luacmartins May 4, 2026
70fe56e
Merge branch 'main' into cmartins-ecardpolicychangelog
luacmartins May 7, 2026
9793421
update add message
luacmartins May 7, 2026
63a1501
add remove case
luacmartins May 7, 2026
fb62a4d
add update case
luacmartins May 7, 2026
8278d8f
add types
luacmartins May 7, 2026
031af8f
rm pre
luacmartins May 7, 2026
e6d23fd
rename category function
luacmartins May 7, 2026
418297f
update remove case
luacmartins May 7, 2026
a74f5fa
update vars
luacmartins May 7, 2026
52bf786
fix prettier
luacmartins May 7, 2026
66d00a5
rm unused import
luacmartins May 7, 2026
666d76a
fix operator
luacmartins May 7, 2026
5692919
fix amounts
luacmartins May 7, 2026
8c02dd9
fix same amount case
luacmartins May 7, 2026
ec0ff21
add copy
luacmartins May 7, 2026
ac3d0d1
fix types
luacmartins May 7, 2026
3c53c06
fix ts
luacmartins May 7, 2026
36922f9
resolve conflicts
luacmartins May 22, 2026
6efc086
fix amount format
luacmartins May 22, 2026
22995f3
update amount format
luacmartins May 22, 2026
14e26be
fix bugs
luacmartins May 22, 2026
bf96110
fix quote
luacmartins May 22, 2026
b7b6e8a
fix bugs
luacmartins May 22, 2026
b3f161e
fix card guard
luacmartins May 22, 2026
51ed30a
apply copy change
luacmartins May 22, 2026
a520de1
dry code
luacmartins May 22, 2026
b415276
Merge branch 'main' into cmartins-ecardpolicychangelog
luacmartins May 26, 2026
27db4af
rename functions
luacmartins May 26, 2026
8b4e2bd
create util file, add tests
luacmartins May 26, 2026
fcd3de0
finish refactoring new util file
luacmartins May 26, 2026
b3553f7
reafactor pushDiffs
luacmartins May 26, 2026
fa26ffe
update copy
luacmartins May 26, 2026
ce4e638
rm joinFilters
luacmartins May 26, 2026
00573dd
Merge branch 'main' into cmartins-ecardpolicychangelog
luacmartins May 26, 2026
44a17bd
resolve conflicts
luacmartins May 27, 2026
2c1df68
fix spanish copy
luacmartins May 27, 2026
72f1ddc
update plural rules
luacmartins May 27, 2026
82d8bdd
apply translations
luacmartins May 27, 2026
acd0acf
update tests
luacmartins May 27, 2026
eaecdea
fix locale copy
luacmartins May 27, 2026
b330a24
update copy
luacmartins May 27, 2026
5427ca9
add currency type
luacmartins May 27, 2026
35b113a
add comment
luacmartins May 27, 2026
93a3c64
address comments
luacmartins May 28, 2026
51e3b8e
Merge branch 'main' into cmartins-ecardpolicychangelog
luacmartins May 29, 2026
f6bb1b4
update language files, types
luacmartins May 29, 2026
ee635e2
fix types
luacmartins May 29, 2026
8350698
create cardID type, fix Onyx import lint
luacmartins May 29, 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
3 changes: 3 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1638,6 +1638,7 @@ const CONST = {
ADD_CUSTOM_UNIT_RATE: 'POLICYCHANGELOG_ADD_CUSTOM_UNIT_RATE',
ADD_EMPLOYEE: 'POLICYCHANGELOG_ADD_EMPLOYEE',
ADD_CARD_FEED: 'POLICYCHANGELOG_ADD_CARD_FEED',
ADD_EXPENSIFY_CARD_RULE: 'POLICYCHANGELOG_ADD_EXPENSIFY_CARD_RULE',
ADD_INTEGRATION: 'POLICYCHANGELOG_ADD_INTEGRATION',
ADD_REPORT_FIELD: 'POLICYCHANGELOG_ADD_REPORT_FIELD',
ADD_TAG: 'POLICYCHANGELOG_ADD_TAG',
Expand All @@ -1663,6 +1664,7 @@ const CONST = {
INDIVIDUAL_BUDGET_NOTIFICATION: 'POLICYCHANGELOG_INDIVIDUAL_BUDGET_NOTIFICATION',
INVITE_TO_ROOM: 'POLICYCHANGELOG_INVITETOROOM',
REMOVE_FROM_ROOM: 'POLICYCHANGELOG_REMOVEFROMROOM',
REMOVE_EXPENSIFY_CARD_RULE: 'POLICYCHANGELOG_REMOVE_EXPENSIFY_CARD_RULE',
LEAVE_ROOM: 'POLICYCHANGELOG_LEAVEROOM',
REPLACE_CATEGORIES: 'POLICYCHANGELOG_REPLACE_CATEGORIES',
SET_AUTO_REIMBURSEMENT: 'POLICYCHANGELOG_SET_AUTOREIMBURSEMENT',
Expand All @@ -1689,6 +1691,7 @@ const CONST = {
UPDATE_DEFAULT_TITLE_ENFORCED: 'POLICYCHANGELOG_UPDATE_DEFAULT_TITLE_ENFORCED',
UPDATE_DISABLED_FIELDS: 'POLICYCHANGELOG_UPDATE_DISABLED_FIELDS',
UPDATE_EMPLOYEE: 'POLICYCHANGELOG_UPDATE_EMPLOYEE',
UPDATE_EXPENSIFY_CARD_RULE: 'POLICYCHANGELOG_UPDATE_EXPENSIFY_CARD_RULE',
UPDATE_FIELD: 'POLICYCHANGELOG_UPDATE_FIELD',
UPDATE_ADDRESS: 'POLICYCHANGELOG_UPDATE_ADDRESS',
UPDATE_FEATURE_ENABLED: 'POLICYCHANGELOG_UPDATE_FEATURE_ENABLED',
Expand Down
39 changes: 39 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7811,6 +7811,45 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
addedReportField: (fieldType: string, fieldName?: string, defaultValue?: string) =>
`${fieldType}-Berichtsfeld „${fieldName}“${defaultValue ? ` mit Standardwert „${defaultValue}“` : ''} hinzugefügt`,
updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'aktiviert' : 'deaktiviert'} die Anforderung für Firmenkartenkäufe`,
expensifyCardRule: {
actionVerb: {block: 'blockiert', allow: 'erlaubt'},
amountOperator: {over: 'über', under: 'unter'},
amountFilter: ({operator, amount}: {operator: string; amount: string}) => `Beträge ${operator} ${amount}`,
theCard: 'die Karte',
multipleCards: ({count}: {count: number}) => `${count} Karten`,
addRule: ({verb, filters, cards}: {verb: string; filters: string; cards: string}) => {
let text = verb;
if (filters !== '') {
text += ` ${filters}`;
}
text += ` auf ${cards}`;
return text;
},
removeRule: ({cards}: {cards: string}) => `Ausgaberegel von ${cards} entfernt`,
restrictionVerb: {block: 'Block', allow: 'nur zulassen'},
update: {
modeChange: ({fromAction, toAction, cards}: {fromAction: string; toAction: string; cards: string}) => `Ausgaberegel von ${fromAction} zu ${toAction} auf ${cards} geändert`,
appliedToAdditionalCards: ({count}: {count: number}) => ({
one: 'Ausgaberegel auf 1 weitere Karte angewendet',
other: `Ausgaberegel auf ${count} weitere Karten angewendet`,
}),
phraseVerb: {added: 'hinzugefügt', removed: 'entfernt', changed: 'geändert', set: 'festlegen', applied: 'Angewendet'},
bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} Händler: „${value}“` : `Händler: „${value}“`),
bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `${adjective} Händler von „${oldValue}“ in „${newValue}“ geändert` : `Händler von „${oldValue}“ zu „${newValue}“`,
bodySpendCategory: ({adjective, value}: {adjective: string; value: string}) =>
adjective !== '' ? `${adjective} Ausgabenkategorie „${value}“` : `Ausgabenkategorie „${value}“`,
bodySpendCategoryChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `Ausgabenkategorie (${adjective}) von „${oldValue}“ in „${newValue}“ geändert` : `Ausgabenkategorie von „${oldValue}“ zu „${newValue}“`,
bodyMaxAmount: 'Höchstbetrag',
bodyMaxAmountSet: ({value}: {value: string}) => `Maximalbetrag bis ${value}`,
bodyMaxAmountChange: ({oldValue, newValue}: {oldValue: string; newValue: string}) => `Maximalbetrag von ${oldValue} auf ${newValue}`,
bodyAppliedToAdditionalCards: ({count}: {count: number}) => `Ausgabenregel für ${count} zusätzliche Karten`,
bodyRemovedFromCards: ({cards}: {cards: string}) => `Ausgaberegel von ${cards}`,
composeOnCards: ({content, cards}: {content: string; cards: string}) => `${content} auf ${cards}`,
composeFromCards: ({content, cards}: {content: string; cards: string}) => `${content} von ${cards}`,
},
},
},
roomMembersPage: {
memberNotFound: 'Mitglied nicht gefunden.',
Expand Down
59 changes: 59 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7512,6 +7512,65 @@ const translations = {
updatedCardFeedLiability: (feedName: string, enabled: boolean) => `${enabled ? 'enabled' : 'disabled'} cardholders to delete card transactions for card feed "${feedName}"`,
updatedCardFeedStatementPeriod: (feedName: string, newValue?: string, previousValue?: string) =>
`changed card feed "${feedName}" statement period end day${newValue ? ` to "${newValue}"` : ''}${previousValue ? ` (previously "${previousValue}")` : ''}`,
expensifyCardRule: {
actionVerb: {
block: 'blocked',
allow: 'allowed',
},
amountOperator: {
over: 'over',
under: 'under',
},
amountFilter: ({operator, amount}: {operator: string; amount: string}) => `amounts ${operator} ${amount}`,
theCard: 'the card',
multipleCards: ({count}: {count: number}) => ({
Comment thread
JS00001 marked this conversation as resolved.
Comment thread
luacmartins marked this conversation as resolved.
one: '1 card',
other: `${count} cards`,
}),
addRule: ({verb, filters, cards}: {verb: string; filters: string; cards: string}) => {
let text = verb;
if (filters !== '') {
text += ` ${filters}`;
}
text += ` on ${cards}`;
return text;
},
removeRule: ({cards}: {cards: string}) => `removed spend rule from ${cards}`,
restrictionVerb: {
block: 'block',
allow: 'only allow',
},
update: {
modeChange: ({fromAction, toAction, cards}: {fromAction: string; toAction: string; cards: string}) => `changed spend rule from ${fromAction} to ${toAction} on ${cards}`,
appliedToAdditionalCards: ({count}: {count: number}) => ({
Comment thread
cead22 marked this conversation as resolved.
one: 'applied spend rule to 1 additional card',
other: `applied spend rule to ${count} additional cards`,
}),
phraseVerb: {
added: 'added',
removed: 'removed',
changed: 'changed',
set: 'set',
applied: 'applied',
},
bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} merchant '${value}'` : `merchant '${value}'`),
bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `${adjective} merchant from '${oldValue}' to '${newValue}'` : `merchant from '${oldValue}' to '${newValue}'`,
bodySpendCategory: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} spend category '${value}'` : `spend category '${value}'`),
bodySpendCategoryChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `${adjective} spend category from '${oldValue}' to '${newValue}'` : `spend category from '${oldValue}' to '${newValue}'`,
bodyMaxAmount: 'max amount',
bodyMaxAmountSet: ({value}: {value: string}) => `max amount to ${value}`,
bodyMaxAmountChange: ({oldValue, newValue}: {oldValue: string; newValue: string}) => `max amount from ${oldValue} to ${newValue}`,
bodyAppliedToAdditionalCards: ({count}: {count: number}) => ({
Comment thread
JS00001 marked this conversation as resolved.
Comment thread
luacmartins marked this conversation as resolved.
one: 'spend rule to 1 additional card',
other: `spend rule to ${count} additional cards`,
}),
bodyRemovedFromCards: ({cards}: {cards: string}) => `spend rule from ${cards}`,
composeOnCards: ({content, cards}: {content: string; cards: string}) => `${content} on ${cards}`,
composeFromCards: ({content, cards}: {content: string; cards: string}) => `${content} from ${cards}`,
},
},
preventSelfApproval: (oldValue: string, newValue: string) =>
`updated "Prevent self-approval" to "${newValue === 'true' ? 'Enabled' : 'Disabled'}" (previously "${oldValue === 'true' ? 'Enabled' : 'Disabled'}")`,
updateMonthlyOffset: (oldValue: string, newValue: string) => {
Expand Down
39 changes: 39 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7305,6 +7305,45 @@ ${amount} para ${merchant} - ${date}`,
`${enabled ? 'habilitó' : 'deshabilitó'} que los titulares de tarjetas eliminen transacciones de la fuente de tarjetas "${feedName}"`,
updatedCardFeedStatementPeriod: (feedName: string, newValue?: string, previousValue?: string) =>
`cambió el día de cierre del período de estado de cuenta de la fuente de tarjetas "${feedName}"${newValue ? ` a "${newValue}"` : ''}${previousValue ? ` (previamente "${previousValue}")` : ''}`,
expensifyCardRule: {
actionVerb: {block: 'bloqueado', allow: 'permitido'},
amountOperator: {over: 'más de', under: 'debajo'},
amountFilter: ({operator, amount}: {operator: string; amount: string}) => `cantidades ${operator} ${amount}`,
theCard: 'la tarjeta',
multipleCards: ({count}: {count: number}) => `${count} tarjetas`,
addRule: ({verb, filters, cards}: {verb: string; filters: string; cards: string}) => {
let text = verb;
if (filters !== '') {
text += ` ${filters}`;
}
text += ` en ${cards}`;
return text;
},
removeRule: ({cards}: {cards: string}) => `eliminó la regla de gasto de ${cards}`,
restrictionVerb: {block: 'bloquear', allow: 'permitir solo'},
update: {
modeChange: ({fromAction, toAction, cards}: {fromAction: string; toAction: string; cards: string}) => `cambió la regla de gasto de ${fromAction} a ${toAction} en ${cards}`,
appliedToAdditionalCards: ({count}: {count: number}) => ({
one: 'aplicó la regla de gasto a 1 tarjeta adicional',
other: `aplicó la regla de gasto a ${count} tarjetas adicionales`,
}),
phraseVerb: {added: 'añadido', removed: 'eliminado', changed: 'cambió', set: 'establecer', applied: 'aplicado'},
bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} comercio «${value}»` : `comercio «${value}»`),
bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `${adjective} del comerciante de '${oldValue}' a '${newValue}'` : `comercio de '${oldValue}' a '${newValue}'`,
bodySpendCategory: ({adjective, value}: {adjective: string; value: string}) =>
adjective !== '' ? `Categoría de gasto ${adjective} «${value}»` : `categoría de gasto «${value}»`,
bodySpendCategoryChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `Categoría de gasto ${adjective} de '${oldValue}' a '${newValue}'` : `categoría de gasto de '${oldValue}' a '${newValue}'`,
bodyMaxAmount: 'importe máximo',
bodyMaxAmountSet: ({value}: {value: string}) => `importe máximo hasta ${value}`,
bodyMaxAmountChange: ({oldValue, newValue}: {oldValue: string; newValue: string}) => `importe máximo de ${oldValue} a ${newValue}`,
bodyAppliedToAdditionalCards: ({count}: {count: number}) => `regla de gasto para ${count} tarjetas adicionales`,
bodyRemovedFromCards: ({cards}: {cards: string}) => `regla de gasto de ${cards}`,
composeOnCards: ({content, cards}: {content: string; cards: string}) => `${content} en ${cards}`,
composeFromCards: ({content, cards}: {content: string; cards: string}) => `${content} de ${cards}`,
},
},
preventSelfApproval: (oldValue, newValue) =>
`actualizó "Evitar la autoaprobación" a "${newValue === 'true' ? 'Habilitada' : 'Deshabilitada'}" (previamente "${oldValue === 'true' ? 'Habilitada' : 'Deshabilitada'}")`,
setReceiptRequiredAmount: (newValue) => `estableció el importe requerido del recibo en "${newValue}"`,
Expand Down
40 changes: 40 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7841,6 +7841,46 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
addedReportField: (fieldType: string, fieldName?: string, defaultValue?: string) =>
`a ajouté le champ de note de frais ${fieldType} « ${fieldName} »${defaultValue ? ` avec la valeur par défaut « ${defaultValue} »` : ''}`,
updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'activé' : 'désactivé'} l’exigence d’achats par carte d’entreprise`,
expensifyCardRule: {
actionVerb: {block: 'bloqué', allow: 'autorisé'},
amountOperator: {over: 'terminé', under: 'sous'},
amountFilter: ({operator, amount}: {operator: string; amount: string}) => `montants ${operator} ${amount}`,
theCard: 'la carte',
multipleCards: ({count}: {count: number}) => `${count} cartes`,
addRule: ({verb, filters, cards}: {verb: string; filters: string; cards: string}) => {
let text = verb;
if (filters !== '') {
text += ` ${filters}`;
}
text += ` sur ${cards}`;
return text;
},
removeRule: ({cards}: {cards: string}) => `a supprimé la règle de dépense de ${cards}`,
restrictionVerb: {block: 'bloquer', allow: 'autoriser uniquement'},
update: {
modeChange: ({fromAction, toAction, cards}: {fromAction: string; toAction: string; cards: string}) =>
`a modifié la règle de dépense de ${fromAction} à ${toAction} sur ${cards}`,
appliedToAdditionalCards: ({count}: {count: number}) => ({
one: 'règle de dépense appliquée à 1 carte supplémentaire',
other: `règle de dépense appliquée à ${count} cartes supplémentaires`,
}),
phraseVerb: {added: 'ajouté', removed: 'supprimé', changed: 'modifié', set: 'définir', applied: 'appliqué'},
bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} commerçant « ${value} »` : `commerçant « ${value} »`),
bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `${adjective} marchand de « ${oldValue} » à « ${newValue} »` : `commerçant de « ${oldValue} » à « ${newValue} »`,
bodySpendCategory: ({adjective, value}: {adjective: string; value: string}) =>
adjective !== '' ? `Catégorie de dépense ${adjective} « ${value} »` : `catégorie de dépense « ${value} »`,
bodySpendCategoryChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) =>
adjective !== '' ? `Catégorie de dépense ${adjective} de « ${oldValue} » à « ${newValue} »` : `catégorie de dépense de « ${oldValue} » à « ${newValue} »`,
bodyMaxAmount: 'montant maximal',
bodyMaxAmountSet: ({value}: {value: string}) => `montant maximum à ${value}`,
bodyMaxAmountChange: ({oldValue, newValue}: {oldValue: string; newValue: string}) => `montant maximal de ${oldValue} à ${newValue}`,
bodyAppliedToAdditionalCards: ({count}: {count: number}) => `règle de dépense pour ${count} cartes supplémentaires`,
bodyRemovedFromCards: ({cards}: {cards: string}) => `règle de dépense provenant de ${cards}`,
composeOnCards: ({content, cards}: {content: string; cards: string}) => `${content} sur ${cards}`,
composeFromCards: ({content, cards}: {content: string; cards: string}) => `${content} de ${cards}`,
},
},
},
roomMembersPage: {
memberNotFound: 'Membre introuvable.',
Expand Down
Loading
Loading