Skip to content

Commit

Permalink
Merge pull request #56348 from FitseTLT/fix-missing-field-copy-from-n…
Browse files Browse the repository at this point in the history
…on-editable-side

Fix - 1:1 Submit expense - Scan failure should not ask receiver to enter information
  • Loading branch information
mountiny authored Feb 20, 2025
2 parents ac3b408 + 866ce5b commit 6d5c89f
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import {getCleanedTagName} from '@libs/PolicyUtils';
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
import {getOriginalMessage, getReportAction, isMessageDeleted, isMoneyRequestAction as isMoneyRequestActionReportActionsUtils} from '@libs/ReportActionsUtils';
import {
canEditMoneyRequest,
getTransactionDetails,
getWorkspaceIcon,
isPaidGroupPolicy,
Expand Down Expand Up @@ -248,7 +249,8 @@ function MoneyRequestPreviewContent({
}
const firstViolation = violations?.at(0);
if (firstViolation) {
const violationMessage = ViolationsUtils.getViolationTranslation(firstViolation, translate);
const canEdit = isMoneyRequestAction && canEditMoneyRequest(action, transaction);
const violationMessage = ViolationsUtils.getViolationTranslation(firstViolation, translate, canEdit);
const violationsCount = violations?.filter((v) => v.type === CONST.VIOLATION_TYPES.VIOLATION).length ?? 0;
const isTooLong = violationsCount > 1 || violationMessage.length > 15;
const hasViolationsAndFieldErrors = violationsCount > 0 && hasFieldErrors;
Expand Down
31 changes: 24 additions & 7 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -300,15 +300,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
const fieldChecks: Partial<Record<ViolationField, {isError: boolean; translationPath: TranslationPaths}>> = {
amount: {
isError: transactionAmount === 0,
translationPath: 'common.error.enterAmount',
translationPath: canEditAmount ? 'common.error.enterAmount' : 'common.error.missingAmount',
},
merchant: {
isError: !isSettled && !isCancelled && isPolicyExpenseChat && isEmptyMerchant,
translationPath: 'common.error.enterMerchant',
translationPath: canEditMerchant ? 'common.error.enterMerchant' : 'common.error.missingMerchantName',
},
date: {
isError: transactionDate === '',
translationPath: 'common.error.enterDate',
translationPath: canEditDate ? 'common.error.enterDate' : 'common.error.missingDate',
},
};

Expand All @@ -329,13 +329,29 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
const firstViolation = violations.at(0);

if (firstViolation) {
return ViolationsUtils.getViolationTranslation(firstViolation, translate);
return ViolationsUtils.getViolationTranslation(firstViolation, translate, canEdit);
}
}

return '';
},
[transactionAmount, isSettled, isCancelled, isPolicyExpenseChat, isEmptyMerchant, transactionDate, readonly, hasErrors, hasViolations, translate, getViolationsForField],
[
transactionAmount,
isSettled,
isCancelled,
isPolicyExpenseChat,
isEmptyMerchant,
transactionDate,
readonly,
hasErrors,
hasViolations,
translate,
getViolationsForField,
canEditAmount,
canEditDate,
canEditMerchant,
canEdit,
],
);

const distanceRequestFields = (
Expand Down Expand Up @@ -397,15 +413,15 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
const isReceiptFieldViolation = receiptFieldViolationNames.includes(violation.name);
const isReceiptImageViolation = receiptImageViolationNames.includes(violation.name);
if (isReceiptFieldViolation || isReceiptImageViolation) {
const violationMessage = ViolationsUtils.getViolationTranslation(violation, translate);
const violationMessage = ViolationsUtils.getViolationTranslation(violation, translate, canEdit);
allViolations.push(violationMessage);
if (isReceiptImageViolation) {
imageViolations.push(violationMessage);
}
}
}
return [imageViolations, allViolations];
}, [transactionViolations, translate]);
}, [transactionViolations, translate, canEdit]);

const receiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.RECEIPT_REQUIRED);
const customRulesViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_RULES);
Expand Down Expand Up @@ -798,6 +814,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
containerStyle={[styles.mt1]}
textStyle={[styles.ph0]}
isLast
canEdit={canEdit}
/>
)}
</View>
Expand Down
9 changes: 6 additions & 3 deletions src/components/ViolationMessages.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ import ViolationsUtils from '@libs/Violations/ViolationsUtils';
import type {TransactionViolation} from '@src/types/onyx';
import Text from './Text';

type ViolationMessagesProps = {violations: TransactionViolation[]; isLast?: boolean; containerStyle?: StyleProp<ViewStyle>; textStyle?: StyleProp<TextStyle>};
type ViolationMessagesProps = {violations: TransactionViolation[]; isLast?: boolean; containerStyle?: StyleProp<ViewStyle>; textStyle?: StyleProp<TextStyle>; canEdit: boolean};

export default function ViolationMessages({violations, isLast, containerStyle, textStyle}: ViolationMessagesProps) {
export default function ViolationMessages({violations, isLast, containerStyle, textStyle, canEdit}: ViolationMessagesProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const violationMessages = useMemo(() => violations.map((violation) => [violation.name, ViolationsUtils.getViolationTranslation(violation, translate)]), [translate, violations]);
const violationMessages = useMemo(
() => violations.map((violation) => [violation.name, ViolationsUtils.getViolationTranslation(violation, translate, canEdit)]),
[canEdit, translate, violations],
);

return (
<View style={[styles.mtn1, isLast ? styles.mb2 : styles.mb1, containerStyle, styles.gap1]}>
Expand Down
5 changes: 4 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,9 @@ const translations = {
invalidCharacter: 'Invalid character.',
enterMerchant: 'Enter a merchant name.',
enterAmount: 'Enter an amount.',
missingMerchantName: 'Missing merchant name',
missingAmount: 'Missing amount',
missingDate: 'Missing date',
enterDate: 'Enter a date.',
invalidTimeRange: 'Please enter a time using the 12-hour clock format (e.g., 2:30 PM).',
pleaseCompleteForm: 'Please complete the form above to continue.',
Expand Down Expand Up @@ -5451,7 +5454,7 @@ const translations = {
adminBrokenConnectionError: 'Receipt pending due to broken bank connection. Please resolve in ',
memberBrokenConnectionError: 'Receipt pending due to broken bank connection. Please ask a workspace admin to resolve.',
markAsCashToIgnore: 'Mark as cash to ignore and request payment.',
smartscanFailed: 'Receipt scanning failed. Enter details manually.',
smartscanFailed: ({canEdit = true}) => `Receipt scanning failed.${canEdit ? ' Enter details manually.' : ''}`,
someTagLevelsRequired: ({tagName}: ViolationsTagOutOfPolicyParams = {}) => `Missing ${tagName ?? 'Tag'}`,
tagOutOfPolicy: ({tagName}: ViolationsTagOutOfPolicyParams = {}) => `${tagName ?? 'Tag'} no longer valid`,
taxAmountChanged: 'Tax amount was modified',
Expand Down
5 changes: 4 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,9 @@ const translations = {
enterMerchant: 'Introduce un comerciante.',
enterAmount: 'Introduce un importe.',
enterDate: 'Introduce una fecha.',
missingMerchantName: 'Falta el nombre del comerciante',
missingAmount: 'Falta el importe',
missingDate: 'Falta la fecha',
invalidTimeRange: 'Por favor, introduce una hora entre 1 y 12 (por ejemplo, 2:30 PM).',
pleaseCompleteForm: 'Por favor complete el formulario de arriba para continuar.',
pleaseSelectOne: 'Seleccione una de las opciones.',
Expand Down Expand Up @@ -5969,7 +5972,7 @@ const translations = {
adminBrokenConnectionError: 'Recibo pendiente debido a una conexión bancaria rota. Por favor, resuélvelo en ',
memberBrokenConnectionError: 'Recibo pendiente debido a una conexión bancaria rota. Por favor, pide a un administrador del espacio de trabajo que lo resuelva.',
markAsCashToIgnore: 'Márcalo como efectivo para ignorar y solicitar el pago.',
smartscanFailed: 'No se pudo escanear el recibo. Introduce los datos manualmente',
smartscanFailed: ({canEdit = true}) => `No se pudo escanear el recibo.${canEdit ? ' Introduce los datos manualmente.' : ''}`,
someTagLevelsRequired: ({tagName}: ViolationsTagOutOfPolicyParams = {}) => `Falta ${tagName ?? 'Tag'}`,
tagOutOfPolicy: ({tagName}: ViolationsTagOutOfPolicyParams = {}) => `La etiqueta ${tagName ? `${tagName} ` : ''}ya no es válida`,
taxAmountChanged: 'El importe del impuesto fue modificado',
Expand Down
4 changes: 2 additions & 2 deletions src/libs/Violations/ViolationsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ const ViolationsUtils = {
* possible values could be either translation keys that resolve to strings or translation keys that resolve to
* functions.
*/
getViolationTranslation(violation: TransactionViolation, translate: LocaleContextProps['translate']): string {
getViolationTranslation(violation: TransactionViolation, translate: LocaleContextProps['translate'], canEdit = true): string {
const {
brokenBankConnection = false,
isAdmin = false,
Expand Down Expand Up @@ -380,7 +380,7 @@ const ViolationsUtils = {
rterType,
});
case 'smartscanFailed':
return translate('violations.smartscanFailed');
return translate('violations.smartscanFailed', {canEdit});
case 'someTagLevelsRequired':
return translate('violations.someTagLevelsRequired', {tagName});
case 'tagOutOfPolicy':
Expand Down

0 comments on commit 6d5c89f

Please sign in to comment.