diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index 148a6d8444fd..d46a4f650ab5 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -8,7 +8,7 @@ import * as CurrencyUtils from '@libs/CurrencyUtils'; import DateUtils from '@libs/DateUtils'; import {isReceiptError} from '@libs/ErrorUtils'; import Parser from '@libs/Parser'; -import {getDistanceRateCustomUnitRate, getSortedTagKeys} from '@libs/PolicyUtils'; +import {getDistanceRateCustomUnitRate, getPerDiemRateCustomUnitRate, getSortedTagKeys} from '@libs/PolicyUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -292,8 +292,10 @@ const ViolationsUtils = { const customUnitRateID = updatedTransaction?.comment?.customUnit?.customUnitRateID; if (customUnitRateID && customUnitRateID.length > 0) { - const distanceRateCustomRate = getDistanceRateCustomUnitRate(policy, customUnitRateID); - if (distanceRateCustomRate) { + const isPerDiem = TransactionUtils.isPerDiemRequest(updatedTransaction); + const customRate = isPerDiem ? getPerDiemRateCustomUnitRate(policy, customUnitRateID) : getDistanceRateCustomUnitRate(policy, customUnitRateID); + + if (customRate) { newTransactionViolations = reject(newTransactionViolations, {name: CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY}); } else { newTransactionViolations.push({ diff --git a/tests/unit/ViolationUtilsTest.ts b/tests/unit/ViolationUtilsTest.ts index 507b875f7f62..c37fb24b60bd 100644 --- a/tests/unit/ViolationUtilsTest.ts +++ b/tests/unit/ViolationUtilsTest.ts @@ -175,6 +175,45 @@ describe('getViolationsOnyxData', () => { }); }); + describe('per diem rate validation', () => { + beforeEach(() => { + transactionViolations = [customUnitOutOfPolicyViolation]; + + const customUnitRateID = 'per_diem_rate_id'; + transaction.comment = { + ...transaction.comment, + customUnit: { + ...(transaction?.comment?.customUnit ?? {}), + customUnitRateID, + }, + }; + transaction.iouRequestType = CONST.IOU.REQUEST_TYPE.PER_DIEM; + policy.customUnits = { + perDiemUnitId: { + customUnitID: 'perDiemUnitId', + defaultCategory: '', + enabled: true, + name: CONST.CUSTOM_UNITS.NAME_PER_DIEM_INTERNATIONAL, + rates: { + [customUnitRateID]: { + currency: 'USD', + customUnitRateID, + enabled: true, + name: 'Spain', + rate: 0, + }, + }, + }, + }; + }); + + it('should remove the customUnitOutOfPolicy violation if the per diem rate is valid for the policy', () => { + const result = ViolationsUtils.getViolationsOnyxData(transaction, transactionViolations, policy, policyTags, policyCategories, false, false); + + expect(result.value).not.toContainEqual(customUnitOutOfPolicyViolation); + }); + }); + describe('controlPolicyViolations', () => { beforeEach(() => { policy.type = 'corporate';