Skip to content

Commit 02b8ad2

Browse files
authored
Merge pull request Expensify#75599 from mananjadhav/fix/mj-70484-remove-violation-on-edit
feat: remove violation on transaction edit
2 parents eab06e3 + ce8d9e2 commit 02b8ad2

3 files changed

Lines changed: 88 additions & 0 deletions

File tree

src/libs/Violations/ViolationsUtils.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import DateUtils from '@libs/DateUtils';
1010
import {isReceiptError} from '@libs/ErrorUtils';
1111
import Parser from '@libs/Parser';
1212
import {getDistanceRateCustomUnitRate, getPerDiemRateCustomUnitRate, getSortedTagKeys, isDefaultTagName, isTaxTrackingEnabled} from '@libs/PolicyUtils';
13+
import {isCurrentUserSubmitter} from '@libs/ReportUtils';
1314
import * as TransactionUtils from '@libs/TransactionUtils';
1415
import {isViolationDismissed, shouldShowViolation} from '@libs/TransactionUtils';
1516
import CONST from '@src/CONST';
@@ -232,6 +233,8 @@ const ViolationsUtils = {
232233
hasDependentTags: boolean,
233234
isInvoiceTransaction: boolean,
234235
isSelfDM?: boolean,
236+
iouReport?: OnyxEntry<Report> | null,
237+
isFromExpenseReport?: boolean,
235238
): OnyxUpdate {
236239
const isScanning = TransactionUtils.isScanning(updatedTransaction);
237240
const isScanRequest = TransactionUtils.isScanRequest(updatedTransaction);
@@ -246,6 +249,14 @@ const ViolationsUtils = {
246249

247250
let newTransactionViolations = [...transactionViolations];
248251

252+
// Remove AUTO_REPORTED_REJECTED_EXPENSE violation when the submitter edits the expense
253+
if (iouReport && isFromExpenseReport && isCurrentUserSubmitter(iouReport)) {
254+
const hasRejectedExpenseViolation = newTransactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE);
255+
if (hasRejectedExpenseViolation) {
256+
newTransactionViolations = newTransactionViolations.filter((violation) => violation.name !== CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE);
257+
}
258+
}
259+
249260
const shouldShowSmartScanFailedError = isScanRequest && updatedTransaction.receipt?.state === CONST.IOU.RECEIPT_STATE.SCAN_FAILED;
250261
const hasSmartScanFailedError = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.SMARTSCAN_FAILED);
251262
if (shouldShowSmartScanFailedError && !hasSmartScanFailedError) {

src/libs/actions/IOU.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4704,16 +4704,19 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
47044704
const hasModifiedReimbursable = 'reimbursable' in transactionChanges;
47054705
const hasModifiedTaxCode = 'taxCode' in transactionChanges;
47064706
const hasModifiedDate = 'date' in transactionChanges;
4707+
const hasModifiedMerchant = 'merchant' in transactionChanges;
47074708

47084709
const isInvoice = isInvoiceReportReportUtils(iouReport);
47094710
if (
4711+
transactionID &&
47104712
policy &&
47114713
isPaidGroupPolicy(policy) &&
47124714
!isInvoice &&
47134715
updatedTransaction &&
47144716
(hasModifiedTag ||
47154717
hasModifiedCategory ||
47164718
hasModifiedComment ||
4719+
hasModifiedMerchant ||
47174720
hasModifiedDistanceRate ||
47184721
hasModifiedDate ||
47194722
hasModifiedCurrency ||
@@ -4737,6 +4740,8 @@ function getUpdateMoneyRequestParams(params: GetUpdateMoneyRequestParamsType): U
47374740
hasDependentTags(policy, policyTagList ?? {}),
47384741
isInvoice,
47394742
isSelfDM(iouReport),
4743+
iouReport,
4744+
isFromExpenseReport,
47404745
);
47414746
optimisticData.push(violationsOnyxData);
47424747
failureData.push({

tests/actions/IOUTest.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6983,6 +6983,78 @@ describe('actions/IOU', () => {
69836983
});
69846984
});
69856985

6986+
describe('updateMoneyRequestAmountAndCurrency', () => {
6987+
it('removes AUTO_REPORTED_REJECTED_EXPENSE violation when the submitter edits the expense', async () => {
6988+
const transactionID = 'txn1';
6989+
const transactionThreadReportID = 'thread1';
6990+
const expenseReportID = 'report1';
6991+
const policyID = '42';
6992+
const TEST_USER_ACCOUNT_ID = 1;
6993+
const TEST_USER_LOGIN = 'test@test.com';
6994+
6995+
const expenseReport: Report = {
6996+
...createRandomReport(1, undefined),
6997+
reportID: expenseReportID,
6998+
type: CONST.REPORT.TYPE.EXPENSE,
6999+
ownerAccountID: TEST_USER_ACCOUNT_ID,
7000+
policyID,
7001+
};
7002+
7003+
const transactionThread: Report = {
7004+
...createRandomReport(2, undefined),
7005+
reportID: transactionThreadReportID,
7006+
parentReportID: expenseReportID,
7007+
parentReportActionID: 'parentAction',
7008+
type: CONST.REPORT.TYPE.CHAT,
7009+
};
7010+
7011+
const transaction: Transaction = {
7012+
...createRandomTransaction(3),
7013+
transactionID,
7014+
reportID: expenseReportID,
7015+
amount: 10000,
7016+
currency: CONST.CURRENCY.USD,
7017+
};
7018+
7019+
const policy: Policy = {
7020+
...createRandomPolicy(Number(policyID)),
7021+
id: policyID,
7022+
type: CONST.POLICY.TYPE.CORPORATE,
7023+
};
7024+
7025+
await Onyx.set(ONYXKEYS.SESSION, {accountID: TEST_USER_ACCOUNT_ID, email: TEST_USER_LOGIN});
7026+
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${expenseReportID}`, expenseReport);
7027+
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`, transactionThread);
7028+
await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, transaction);
7029+
await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`, [
7030+
{
7031+
name: CONST.VIOLATIONS.AUTO_REPORTED_REJECTED_EXPENSE,
7032+
type: CONST.VIOLATION_TYPES.WARNING,
7033+
},
7034+
]);
7035+
await waitForBatchedUpdates();
7036+
7037+
updateMoneyRequestAmountAndCurrency({
7038+
transactionID,
7039+
transactionThreadReportID,
7040+
amount: 20000,
7041+
currency: CONST.CURRENCY.USD,
7042+
taxAmount: 0,
7043+
taxCode: '',
7044+
policy,
7045+
policyTagList: {},
7046+
policyCategories: {},
7047+
transactions: {},
7048+
transactionViolations: {},
7049+
});
7050+
7051+
await waitForBatchedUpdates();
7052+
7053+
const updatedViolations = await getOnyxValue(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`);
7054+
expect(updatedViolations).toEqual([]);
7055+
});
7056+
});
7057+
69867058
describe('cancelPayment', () => {
69877059
const amount = 10000;
69887060
const comment = '💸💸💸💸';

0 commit comments

Comments
 (0)