@@ -27,13 +27,14 @@ import getIsNarrowLayout from '@libs/getIsNarrowLayout';
2727import { translateLocal } from '@libs/Localize' ;
2828import Log from '@libs/Log' ;
2929import enhanceParameters from '@libs/Network/enhanceParameters' ;
30+ import { hasEnabledOptions } from '@libs/OptionsListUtils' ;
3031import { getPolicy , goBackWhenEnableFeature } from '@libs/PolicyUtils' ;
31- import { getAllPolicyReports } from '@libs/ReportUtils' ;
32+ import { getAllPolicyReports , pushTransactionViolationsOnyxData } from '@libs/ReportUtils' ;
3233import { resolveEnableFeatureConflicts } from '@userActions/RequestConflictUtils' ;
3334import { getFinishOnboardingTaskOnyxData } from '@userActions/Task' ;
3435import CONST from '@src/CONST' ;
3536import ONYXKEYS from '@src/ONYXKEYS' ;
36- import type { Policy , PolicyCategories , PolicyCategory , RecentlyUsedCategories , Report } from '@src/types/onyx' ;
37+ import type { Policy , PolicyCategories , PolicyCategory , PolicyTagLists , RecentlyUsedCategories , Report , TransactionViolations } from '@src/types/onyx' ;
3738import type { ApprovalRule , ExpenseRule , MccGroup } from '@src/types/onyx/Policy' ;
3839import type { PolicyCategoryExpenseLimitType } from '@src/types/onyx/PolicyCategory' ;
3940import type { OnyxData } from '@src/types/onyx/Request' ;
@@ -301,7 +302,12 @@ function buildOptimisticPolicyRecentlyUsedCategories(policyID?: string, category
301302 return lodashUnion ( [ category ] , policyRecentlyUsedCategories ) ;
302303}
303304
304- function setWorkspaceCategoryEnabled ( policyID : string , categoriesToUpdate : Record < string , { name : string ; enabled : boolean } > ) {
305+ function setWorkspaceCategoryEnabled (
306+ policyID : string ,
307+ categoriesToUpdate : Record < string , { name : string ; enabled : boolean } > ,
308+ policyTagLists : PolicyTagLists = { } ,
309+ allTransactionViolations : OnyxCollection < TransactionViolations > = { } ,
310+ ) {
305311 const policyCategories = allPolicyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } ;
306312 const optimisticPolicyCategoriesData = {
307313 ...Object . keys ( categoriesToUpdate ) . reduce < PolicyCategories > ( ( acc , key ) => {
@@ -367,6 +373,7 @@ function setWorkspaceCategoryEnabled(policyID: string, categoriesToUpdate: Recor
367373 ] ,
368374 } ;
369375
376+ pushTransactionViolationsOnyxData ( onyxData , policyID , policyTagLists , policyCategories , allTransactionViolations , { } , optimisticPolicyCategoriesData ) ;
370377 appendSetupCategoriesOnboardingData ( onyxData ) ;
371378
372379 const parameters = {
@@ -861,7 +868,12 @@ function setPolicyCategoryGLCode(policyID: string, categoryName: string, glCode:
861868 API . write ( WRITE_COMMANDS . UPDATE_POLICY_CATEGORY_GL_CODE , parameters , onyxData ) ;
862869}
863870
864- function setWorkspaceRequiresCategory ( policyID : string , requiresCategory : boolean ) {
871+ function setWorkspaceRequiresCategory (
872+ policyID : string ,
873+ requiresCategory : boolean ,
874+ policyTagLists : PolicyTagLists = { } ,
875+ allTransactionViolations : OnyxCollection < TransactionViolations > = { } ,
876+ ) {
865877 const onyxData : OnyxData = {
866878 optimisticData : [
867879 {
@@ -907,6 +919,9 @@ function setWorkspaceRequiresCategory(policyID: string, requiresCategory: boolea
907919 ] ,
908920 } ;
909921
922+ pushTransactionViolationsOnyxData ( onyxData , policyID , policyTagLists , allPolicyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } , allTransactionViolations , {
923+ requiresCategory,
924+ } as Partial < Policy > ) ;
910925 const parameters = {
911926 policyID,
912927 requiresCategory,
@@ -936,13 +951,22 @@ function clearCategoryErrors(policyID: string, categoryName: string) {
936951 } ) ;
937952}
938953
939- function deleteWorkspaceCategories ( policyID : string , categoryNamesToDelete : string [ ] ) {
954+ function deleteWorkspaceCategories (
955+ policyID : string ,
956+ categoryNamesToDelete : string [ ] ,
957+ policyTagLists : PolicyTagLists = { } ,
958+ transactionViolations : OnyxCollection < TransactionViolations > = { } ,
959+ ) {
940960 const policyCategories = allPolicyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } ;
941961 const optimisticPolicyCategoriesData = categoryNamesToDelete . reduce < Record < string , Partial < PolicyCategory > > > ( ( acc , categoryName ) => {
942962 acc [ categoryName ] = { pendingAction : CONST . RED_BRICK_ROAD_PENDING_ACTION . DELETE , enabled : false } ;
943963 return acc ;
944964 } , { } ) ;
945965
966+ const shouldDisableRequiresCategory = ! hasEnabledOptions (
967+ Object . values ( policyCategories ) . filter ( ( category ) => ! categoryNamesToDelete . includes ( category . name ) && category . pendingAction !== CONST . RED_BRICK_ROAD_PENDING_ACTION . DELETE ) ,
968+ ) ;
969+
946970 const onyxData : OnyxData = {
947971 optimisticData : [
948972 {
@@ -977,6 +1001,8 @@ function deleteWorkspaceCategories(policyID: string, categoryNamesToDelete: stri
9771001 ] ,
9781002 } ;
9791003
1004+ const optimisticPolicyData : Partial < Policy > = shouldDisableRequiresCategory ? { requiresCategory : false } : { } ;
1005+ pushTransactionViolationsOnyxData ( onyxData , policyID , policyTagLists , policyCategories , transactionViolations , optimisticPolicyData , optimisticPolicyCategoriesData ) ;
9801006 appendSetupCategoriesOnboardingData ( onyxData ) ;
9811007
9821008 const parameters = {
@@ -987,7 +1013,13 @@ function deleteWorkspaceCategories(policyID: string, categoryNamesToDelete: stri
9871013 API . write ( WRITE_COMMANDS . DELETE_WORKSPACE_CATEGORIES , parameters , onyxData ) ;
9881014}
9891015
990- function enablePolicyCategories ( policyID : string , enabled : boolean , shouldGoBack = true ) {
1016+ function enablePolicyCategories (
1017+ policyID : string ,
1018+ enabled : boolean ,
1019+ policyTagLists : PolicyTagLists = { } ,
1020+ allTransactionViolations : OnyxCollection < TransactionViolations > = { } ,
1021+ shouldGoBack = true ,
1022+ ) {
9911023 const onyxUpdatesToDisableCategories : OnyxUpdate [ ] = [ ] ;
9921024 if ( ! enabled ) {
9931025 onyxUpdatesToDisableCategories . push (
@@ -1050,6 +1082,22 @@ function enablePolicyCategories(policyID: string, enabled: boolean, shouldGoBack
10501082 ] ,
10511083 } ;
10521084
1085+ const policyUpdate : Partial < Policy > = {
1086+ areCategoriesEnabled : enabled ,
1087+ requiresCategory : enabled ,
1088+ pendingFields : {
1089+ areCategoriesEnabled : CONST . RED_BRICK_ROAD_PENDING_ACTION . UPDATE ,
1090+ } ,
1091+ } ;
1092+
1093+ const policyCategories = allPolicyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } ;
1094+
1095+ const policyCategoriesUpdate : Record < string , Partial < PolicyCategory > > = Object . fromEntries (
1096+ Object . entries ( policyCategories ) . map ( ( [ categoryName ] ) => [ categoryName , { name : categoryName , enabled} ] ) ,
1097+ ) ;
1098+
1099+ pushTransactionViolationsOnyxData ( onyxData , policyID , policyTagLists , policyCategories , allTransactionViolations , policyUpdate , policyCategoriesUpdate ) ;
1100+
10531101 if ( onyxUpdatesToDisableCategories . length > 0 ) {
10541102 onyxData . optimisticData ?. push ( ...onyxUpdatesToDisableCategories ) ;
10551103 }
0 commit comments