diff --git a/src/libs/actions/Policy/DistanceRate.ts b/src/libs/actions/Policy/DistanceRate.ts index a56cc3d576e97..f740002c71d81 100644 --- a/src/libs/actions/Policy/DistanceRate.ts +++ b/src/libs/actions/Policy/DistanceRate.ts @@ -17,7 +17,7 @@ import {getDistanceRateCustomUnit, goBackWhenEnableFeature, removePendingFieldsF import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {Policy, Report} from '@src/types/onyx'; +import type {Policy, Report, Transaction, TransactionViolation} from '@src/types/onyx'; import type {ErrorFields} from '@src/types/onyx/OnyxCommon'; import type {Attributes, CustomUnit, Rate} from '@src/types/onyx/Policy'; import type {OnyxData} from '@src/types/onyx/Request'; @@ -62,6 +62,29 @@ Onyx.connect({ }, }); +let allTransactions: NonNullable> = {}; +Onyx.connect({ + key: ONYXKEYS.COLLECTION.TRANSACTION, + waitForCollectionCallback: true, + callback: (value) => { + if (!value) { + allTransactions = {}; + return; + } + + allTransactions = value; + }, +}); + +let transactionViolations: OnyxCollection; +Onyx.connect({ + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + waitForCollectionCallback: true, + callback: (value) => { + transactionViolations = value; + }, +}); + /** * Takes array of customUnitRates and removes pendingFields and errorFields from each rate - we don't want to send those via API */ @@ -550,6 +573,36 @@ function deletePolicyDistanceRates(policyID: string, customUnit: CustomUnit, rat }, ]; + const transactions = Object.values(allTransactions ?? {}).filter((transaction) => transaction?.comment?.customUnit?.customUnitID === customUnit.customUnitID); + const optimisticTransactionsViolations: OnyxUpdate[] = []; + + transactions.forEach((transaction) => { + const currentTransactionViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`] ?? []; + if (currentTransactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY)) { + return; + } + optimisticTransactionsViolations.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`, + value: [ + ...currentTransactionViolations, + { + type: CONST.VIOLATION_TYPES.VIOLATION, + name: CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY, + showInReview: true, + }, + ], + }); + }); + + const failureTransactionsViolations: OnyxUpdate[] = transactions.map((transaction) => { + const currentTransactionViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`]; + return {onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`, value: currentTransactionViolations}; + }); + + optimisticData.push(...optimisticTransactionsViolations); + failureData.push(...failureTransactionsViolations); + const params: DeletePolicyDistanceRatesParams = { policyID, customUnitID: customUnit.customUnitID,