Skip to content

Commit 00ddfe5

Browse files
Merge pull request Expensify#84453 from Expensify/neil-marcellini/add-modifiedDistance-violation
Add increased distance violation display
2 parents b1ed132 + fc0310d commit 00ddfe5

21 files changed

Lines changed: 235 additions & 8 deletions

File tree

src/CONST/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6398,6 +6398,7 @@ const CONST = {
63986398
MISSING_TAG: 'missingTag',
63996399
MODIFIED_AMOUNT: 'modifiedAmount',
64006400
MODIFIED_DATE: 'modifiedDate',
6401+
INCREASED_DISTANCE: 'increasedDistance',
64016402
PROHIBITED_EXPENSE: 'prohibitedExpense',
64026403
NON_EXPENSIWORKS_EXPENSE: 'nonExpensiworksExpense',
64036404
OVER_AUTO_APPROVAL_LIMIT: 'overAutoApprovalLimit',

src/components/ReportActionItem/MoneyRequestReceiptView.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ function MoneyRequestReceiptView({
243243
const shouldShowReceiptEmptyState = (isDisplayedInWideRHP || !isInvoice) && !hasReceipt && !!transactionToCheck && !doesTransactionHaveReceipt;
244244
const isMarkAsCash = parentReport && currentUserLogin ? isMarkAsCashActionForTransaction(currentUserLogin, parentReport, transactionViolations, policy) : false;
245245

246+
const routeDistanceMeters = transaction?.comment?.customUnit?.routeDistanceMeters;
247+
const distanceUnit = transaction?.comment?.customUnit?.distanceUnit;
248+
246249
const [receiptImageViolations, receiptViolations] = useMemo(() => {
247250
const imageViolations = [];
248251
const allViolations = [];
@@ -255,15 +258,26 @@ function MoneyRequestReceiptView({
255258
if (isReceiptFieldViolation || isReceiptImageViolation || isRTERViolation) {
256259
const cardID = violation.data?.cardID;
257260
const card = cardID ? cardList?.[cardID] : undefined;
258-
const violationMessage = ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, card, isMarkAsCash);
261+
const violationMessage = ViolationsUtils.getViolationTranslation(
262+
violation,
263+
translate,
264+
canEdit,
265+
undefined,
266+
companyCardPageURL,
267+
connectionLink,
268+
card,
269+
isMarkAsCash,
270+
routeDistanceMeters,
271+
distanceUnit,
272+
);
259273
allViolations.push(violationMessage);
260274
if (isReceiptImageViolation || isRTERViolation) {
261275
imageViolations.push(violationMessage);
262276
}
263277
}
264278
}
265279
return [imageViolations, allViolations];
266-
}, [transactionViolations, translate, canEdit, companyCardPageURL, connectionLink, cardList, isMarkAsCash]);
280+
}, [transactionViolations, translate, canEdit, companyCardPageURL, connectionLink, cardList, isMarkAsCash, routeDistanceMeters, distanceUnit]);
267281

268282
const receiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.RECEIPT_REQUIRED);
269283
const itemizedReceiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.ITEMIZED_RECEIPT_REQUIRED);

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,18 @@ function MoneyRequestView({
598598
.map((violation) => {
599599
const cardID = violation.data?.cardID;
600600
const card = cardID ? cardList?.[cardID] : undefined;
601-
return ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, card, isMarkAsCash);
601+
return ViolationsUtils.getViolationTranslation(
602+
violation,
603+
translate,
604+
canEdit,
605+
undefined,
606+
companyCardPageURL,
607+
connectionLink,
608+
card,
609+
isMarkAsCash,
610+
transaction?.comment?.customUnit?.routeDistanceMeters,
611+
transaction?.comment?.customUnit?.distanceUnit,
612+
);
602613
})
603614
.join('. ')}.`;
604615
}
@@ -1155,6 +1166,8 @@ function MoneyRequestView({
11551166
canEdit={canEdit}
11561167
companyCardPageURL={companyCardPageURL}
11571168
connectionLink={connectionLink}
1169+
routeDistanceMeters={transaction?.comment?.customUnit?.routeDistanceMeters}
1170+
distanceUnit={transaction?.comment?.customUnit?.distanceUnit}
11581171
/>
11591172
)}
11601173
</View>

src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,18 @@ function TransactionPreviewContent({
132132
const isMarkAsCash = parentReport && currentUserLogin ? isMarkAsCashActionForTransaction(currentUserLogin, parentReport, violations, policy) : false;
133133

134134
const violationMessage = firstViolation
135-
? ViolationsUtils.getViolationTranslation(firstViolation, translate, canEdit, undefined, companyCardPageURL, connectionLink, card, isMarkAsCash)
135+
? ViolationsUtils.getViolationTranslation(
136+
firstViolation,
137+
translate,
138+
canEdit,
139+
undefined,
140+
companyCardPageURL,
141+
connectionLink,
142+
card,
143+
isMarkAsCash,
144+
transaction?.comment?.customUnit?.routeDistanceMeters,
145+
transaction?.comment?.customUnit?.distanceUnit,
146+
)
136147
: undefined;
137148

138149
const previewText = useMemo(

src/components/ViolationMessages.tsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
77
import ViolationsUtils, {filterReceiptViolations} from '@libs/Violations/ViolationsUtils';
88
import ONYXKEYS from '@src/ONYXKEYS';
99
import type {TransactionViolation} from '@src/types/onyx';
10+
import type {Unit} from '@src/types/onyx/Policy';
1011
import Text from './Text';
1112

1213
type ViolationMessagesProps = {
@@ -18,9 +19,22 @@ type ViolationMessagesProps = {
1819
canEdit: boolean;
1920
companyCardPageURL?: string;
2021
connectionLink?: string;
22+
routeDistanceMeters?: number;
23+
distanceUnit?: Unit;
2124
};
2225

23-
export default function ViolationMessages({violations, isLast, containerStyle, textStyle, canEdit, companyCardPageURL, connectionLink, isMarkAsCash}: ViolationMessagesProps) {
26+
export default function ViolationMessages({
27+
violations,
28+
isLast,
29+
containerStyle,
30+
textStyle,
31+
canEdit,
32+
companyCardPageURL,
33+
connectionLink,
34+
isMarkAsCash,
35+
routeDistanceMeters,
36+
distanceUnit,
37+
}: ViolationMessagesProps) {
2438
const styles = useThemeStyles();
2539
const {translate} = useLocalize();
2640
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST);
@@ -32,9 +46,23 @@ export default function ViolationMessages({violations, isLast, containerStyle, t
3246
filteredViolations.map((violation) => {
3347
const cardID = violation.data?.cardID;
3448
const card = cardID ? cardList?.[cardID] : undefined;
35-
return [violation.name, ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, card, isMarkAsCash)];
49+
return [
50+
violation.name,
51+
ViolationsUtils.getViolationTranslation(
52+
violation,
53+
translate,
54+
canEdit,
55+
undefined,
56+
companyCardPageURL,
57+
connectionLink,
58+
card,
59+
isMarkAsCash,
60+
routeDistanceMeters,
61+
distanceUnit,
62+
),
63+
];
3664
}),
37-
[canEdit, translate, filteredViolations, companyCardPageURL, connectionLink, cardList, isMarkAsCash],
65+
[canEdit, translate, filteredViolations, companyCardPageURL, connectionLink, cardList, isMarkAsCash, routeDistanceMeters, distanceUnit],
3866
);
3967

4068
return (

src/hooks/useViolations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const violationNameToField: Record<ViolationName, (violation: TransactionViolati
3232
missingTag: () => 'tag',
3333
modifiedAmount: () => 'amount',
3434
modifiedDate: () => 'date',
35+
increasedDistance: () => 'waypoints',
3536
nonExpensiworksExpense: () => 'merchant',
3637
overAutoApprovalLimit: () => 'amount',
3738
overCategoryLimit: () => 'amount',

src/languages/de.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import type {
8686
UpdateRoleParams,
8787
UpgradeSuccessMessageParams,
8888
UserIsAlreadyMemberParams,
89+
ViolationsIncreasedDistanceParams,
8990
ViolationsMissingTagParams,
9091
ViolationsModifiedAmountParams,
9192
ViolationsProhibitedExpenseParams,
@@ -7933,6 +7934,8 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
79337934
}
79347935
},
79357936
modifiedDate: 'Datum weicht vom gescannten Beleg ab',
7937+
increasedDistance: ({formattedRouteDistance}: ViolationsIncreasedDistanceParams) =>
7938+
formattedRouteDistance ? `Die Entfernung übersteigt die berechnete Route von ${formattedRouteDistance}` : 'Entfernung übersteigt die berechnete Route',
79367939
nonExpensiworksExpense: 'Nicht-Expensiworks-Ausgabe',
79377940
overAutoApprovalLimit: (formattedLimit: string) => `Ausgabe überschreitet das Auto-Genehmigungslimit von ${formattedLimit}`,
79387941
overCategoryLimit: (formattedLimit: string) => `Betrag über dem Kategorie-Limit von ${formattedLimit}/Person`,

src/languages/en.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import type {
7474
UpdateRoleParams,
7575
UpgradeSuccessMessageParams,
7676
UserIsAlreadyMemberParams,
77+
ViolationsIncreasedDistanceParams,
7778
ViolationsMissingTagParams,
7879
ViolationsModifiedAmountParams,
7980
ViolationsProhibitedExpenseParams,
@@ -7922,6 +7923,8 @@ const translations = {
79227923
}
79237924
},
79247925
modifiedDate: 'Date differs from scanned receipt',
7926+
increasedDistance: ({formattedRouteDistance}: ViolationsIncreasedDistanceParams) =>
7927+
formattedRouteDistance ? `Distance exceeds the calculated route of ${formattedRouteDistance}` : 'Distance exceeds the calculated route',
79257928
nonExpensiworksExpense: 'Non-Expensiworks expense',
79267929
overAutoApprovalLimit: (formattedLimit: string) => `Expense exceeds auto-approval limit of ${formattedLimit}`,
79277930
overCategoryLimit: (formattedLimit: string) => `Amount over ${formattedLimit}/person category limit`,

src/languages/es.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8195,6 +8195,8 @@ ${amount} para ${merchant} - ${date}`,
81958195
}
81968196
},
81978197
modifiedDate: 'Fecha difiere del recibo escaneado',
8198+
increasedDistance: ({formattedRouteDistance}) =>
8199+
formattedRouteDistance ? `La distancia supera la ruta calculada de ${formattedRouteDistance}` : 'La distancia supera la ruta calculada',
81988200
nonExpensiworksExpense: 'Gasto no proviene de Expensiworks',
81998201
overAutoApprovalLimit: (formattedLimit) => `Importe supera el límite de aprobación automática${formattedLimit ? ` de ${formattedLimit}` : ''}`,
82008202
overCategoryLimit: (formattedLimit) => `Importe supera el límite para la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`,

src/languages/fr.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import type {
8686
UpdateRoleParams,
8787
UpgradeSuccessMessageParams,
8888
UserIsAlreadyMemberParams,
89+
ViolationsIncreasedDistanceParams,
8990
ViolationsMissingTagParams,
9091
ViolationsModifiedAmountParams,
9192
ViolationsProhibitedExpenseParams,
@@ -7958,6 +7959,8 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
79587959
}
79597960
},
79607961
modifiedDate: 'La date diffère du reçu scanné',
7962+
increasedDistance: ({formattedRouteDistance}: ViolationsIncreasedDistanceParams) =>
7963+
formattedRouteDistance ? `La distance dépasse l'itinéraire calculé de ${formattedRouteDistance}` : "La distance dépasse l'itinéraire calculé",
79617964
nonExpensiworksExpense: 'Dépense non Expensiworks',
79627965
overAutoApprovalLimit: (formattedLimit: string) => `La dépense dépasse la limite d’auto-approbation de ${formattedLimit}`,
79637966
overCategoryLimit: (formattedLimit: string) => `Montant dépassant la limite de catégorie de ${formattedLimit}/personne`,

0 commit comments

Comments
 (0)