From 50ed265eec62ac550d596f73fc1c1df51bb81f2e Mon Sep 17 00:00:00 2001 From: Craig Reese <109101548+craigrva@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:03:59 -0500 Subject: [PATCH] APPEALS-25418: AOJ Remand Returned Legacy Appeals (#22312) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Calvin/APPEALS-43852-cavc-levers (#21441) * enabled cavc affinity levers in UI * updated rspec * [APPEALS-43849]Update CAVC Affinity Implementation for AMA Dockets to… (#21456) * [APPEALS-43849]Update CAVC Affinity Implementation for AMA Dockets to Account for Omit/Infinity * Affinity rules applied to non genpop * Addressed comments * Addressed comments * fixed rubocop issues + added clarity to where clause --------- Co-authored-by: Calvin * APPEALS-44956: Add AppealAffinity model and database table (#21526) * add migration for appeal_affinities * add AppealAffinity model and associations, update migration for new column * update index to be unique * add factory, add tests * add factory traits to appeal and case for appeal affinities * add combination trait to appeal factory * add appeal_affinity to skipped associations in ETL reporting * add a validation, test * Craig/appeals 44958 (#21564) * add new job, update affinity model validation and after save hook * add update from push job * fix job extending distribution scopes * add with appeal affinities to distribution scopes * typo * add error handling, add test file * add distributed case factory, refactor naming in job * fix factories, added tests * fix migration for null affinity start date column * fixes, added tests * more test updates * add return in job if no query results, tests for no query results * add test for after_save hook adding dist task instructions * set start dist job to queue affinity job after running * fix update job and start dist job spec * queue affinity update job from push job * code clarity * fix judge in seed file * remove comment, fix hearing factory, disable some seeds for testing * add more tests * test refactor * update appeals for dist query to add affinity start, add seed file, fix hearing factory, add stat to dist factory * disable new seed on reset * update seed file with vet names, add another seed category * fix distirbuted case factory? * actually fix GHA runs * lint, test fixes * change constants in new job * [Appeals 43850] Update Legacy Docket Queries to Account for the Previous Decision Judge and Type Action (#21556) * test changes for seans ticket * test changes * added joins to all required methods * fixed lint * fixed column ambiguity errors * cleaned up naming scheme * Documentation for JOIN_PREVIOUS_APPEALS constant --------- Co-authored-by: Calvin * APPEALS-44959: Modify affinity date checks to use appeal_affinity (#21611) * swap distribution queries from distribution_task to appeal_affinities * update seed files to use appeal affinities instead of distribution task * clean up seed file method names * add missing Timecop.return in ama affinity case seed * fix name of a method in a seed file * remove references to distribution task in distribution scopes * fix push priority job tests * fix naming of args in one of the seed files * fix user seed, fix date format in distribution task instructions * fix tests for date format update * APPEALS-44187: Factory Bot Additions (#21438) * AC1: values for bfddec and bfmpro * AC2: case issues updated to '3' * AC3-4: attorney and judge additions * ac 5: bfdpdcn addition * AC6: case type action addition * ac7: new folder match to original * ac8: case issues set to original * AC 3/4: added associations to original * ac3/4: updated logic to handle no args * ac3/4: return sattyid * ac7:updating folder assignment * ac7: added bfkey to except block * ac7/8: update to case issue list and validations dismissed * removed byebug * ac7: added 'ticknum' to except * lint fixes * lint fixes * lint fixes * lint fixes * nested trait into form_9 factory * new addtions * added .save to case issues * resolving correspondent and titrnum associations * fixed bfdc typo * factory additions * added ssn to associated corr. * removed transient and added .save * added after create to corr factory * veteran lookup check prior to create * committing missed 'end' * moved over veteran create to case fact. * move corr. association field to case fact. * lint issues + corres. save * Calvin/APPEALS-44957-rake-affinity (#21577) * grabbed receipt dates from distributed cases * refactored for functionality + added method to grab appeals that match * using receipt date, get all related appeals * added update/creation plus cleaned prior imple. * gets most recent distributed case receipt_date * skips if receipt_date is nil for performance * if appeal affinity is nil, it will now be updated * created spec file * fixed non ready appeals * updated query to match new AC * removing comment * testing for each docket * updated spec file * added new tests to rspec * updated start date to receipt date instead of Time.now * fixed date/time rspec errors * added rails logger to know when rake task has finished * added tag for rails log * removed nonpriority dockets for direct_review and evidence_submission * fixed lint issue * fixed flaky spec test * limits distributed cases query to within the last week * APPEALS-46016: Add Affinity Start Date to the Explain Page (#21660) * add affinity start date to explain page * add feature test to verify dates display * Sudhir/appeals 43851 (#21613) * Implement CAVC + AOD Affinity Lever for AMA Dockets * addressed comments * addressed comments * Addressed comments * added cavc_aod_affinity in case distribution lever model * addressed comments * addressed comments * updated specs * Updated specs * specs changes reverted * ama_aod and ama_non_aod queries updated * change the assertion in docket spec * Craig/appeals 46196 (#21689) * fix query, tested locally * add basic test to verify csv downloads aren't broken * APPEALS-43851: Add test to validate CAVC+AOD behavior on hearing docket appeals affinities (#21678) * add test to validate cavc+aod on hearing docket appeals * lint, test case_docket_spec fix * modify case_docket_spec again * more test fix testing * attempt to fix test again * test removing prev appeals from nonpriority queries * more test tests * feature toggle change in test * reorder new portions of query * remove unused portions of queries in case_docket * revert unneeded change to query order * revert unneeded change to query order * update rake task and spec (#21731) * APPEALS-46325: Add Seeds for AOD Appeals and Update Dates to Match CAVC (#21730) * add aod hearing cases to ama affinity cases seed * fix lever spec * APPEALS-45148: Hook to clear saved affinity date (#21623) * initial imp. idea * AC1: check for affinity_start_date on assignment * AC2/3: update affinity start date w/ instr. * updates to naming, instructions, and hook logic * updates after review * rspec coverage and addtional condition * removed unused identifier * removed reduntant 'self's * added update on actual AA record * updated to save aa record and addtional rspec * added change to assignment on no record test * check for assignment * addd update to 'on_hold' status * public method to handle legacy affinity appeals * added .reload to :with_affinity_appeal * added .reload to :ready_for_distribution * updates to pass explain_spec * switched boolean values * typo * readujsted order on :create for affinity appeal * removed after(:create) * testing rspec by readding after :create * reloading in assertation * addressing lint errors * fix seeds/users_spec * add case dist lever to new tests (#21776) * fix tests, add lever to factory, fix dist scopes (#21779) * fix rubocop warning * Acd/appeals 43853 43854 (#21971) * Calvin/appeals 43853 (#21723) * initial updates * removing unnecessary variable * focused in on priority * removing non priority stuff * added general comments * added BFAC and AOD to cavc aod lever query * adding judge vacols id to query * aod affinity_start_date filter initial changes * fixed sorting * fixed rubocop issues * updated filter method * error handling * added ineligibility to queries for PREV_DECIDING_JUDGE * fixed SQL query + added comments * added exclude from affinity check into the case docket queries * error handling + fixing sql queries * rejects appeals without affinity_start_dates and nonmatching judges * fixing rubocop offenses * fixed inconsistencies between methods * fixed conditions for rejecting appeals * refactored cavc aod affinity filter to make it much easier to read * refactored code to account for AC6 * error handling for empty exclude from affinity * reverted next if block to old logic to ensure it works * added PREV_DEC_JUDGE is not null * case.rb factory changes * added more options to legacy_cavc_appeal creation * cleaned up code for simpler reading * fix for aod legacy cavc creation * added tied to option to legacy cavc appeal factory * limits are now handled correctly in query * replaced return false to next if, as return false was causing unexpected behavior * fix rspecs + one edge case * added cavc aod lever creation to rspecs * removed bfac and aod from nonpriority query * cavc aod appeals w/excluded judges are now properly being filtered * refactored excluded judges check * added to old query to fix rspec errors * modified case factory bot * query now handles when prev_deciding_judge is nil * removed unnecessary condition * fixed case factory to now have tied_to attatched to orig appeal * fixed next if block within filter * handles omit scenarios + correctly rejects with next * working on rspec (still failing) * fix for ineligble VLJ when infinite * fixed rspec suite for cavc aod filters * fixed omit scenario in cavc aod affinity filter * consolidation & readability refactor * rubocop fixes * fixed spec error * Implement CAVC Affinity for Legacy Docket (#21706) * Implement CAVC Affinity for Legacy Docket * addressed comments * Added BFAC in the query * code changes for affinitty date * Added affinity code * code refactor and removed non priority code changes * fixed syntax change * Addressed comments * refactor cavc affinity filter * refactored code * code refactor * code refactor * Updated existing specs * code refactor * Added new rspecs * code refactor and added test cases * code refactor * added test cases * fixes push_priority_spec * fixed rubocop issues * rubocop issue fixed * refactored code to make it easier to understand * refactored + fixed rspec and lint errors --------- Co-authored-by: Calvin Co-authored-by: calvincostaBAH <108481161+calvincostaBAH@users.noreply.github.com> * basic creation of legacy affinity cases seed data * bug fixes, added bfcorlid with veterans, fully runs now * added new appeals for affinity_and_tied_to_judge * made data have realistic bfcorlids * changes document sequence to use less digits * added new file numbers for tied_to cases to make them easier to identify --------- Co-authored-by: samasudhirreddy <108430298+samasudhirreddy@users.noreply.github.com> * APPEALS-50692: Update Appeals Ready to Distribute CSV to include CAVC remand original judge (#22070) * CSV download functional * add tests, fix CSV query in CaseDocket * fix lint * Calvin/appeals 44313 (#22119) * initial seed data file * added legacy cavc and cavc aod affinity cases * update * fixed tied to for legacy appeals * added AOD versions of appeals * small lint fixes * ensured AOD cases for legacy hearings with exluded or ineligible judge * added vacols staff record creation for users without it * APPEALS-47741: Update the UpdateAppealAffinityDatesJob to add appeal_affinity records for Legacy Appeals (#22023) * AC1: changes and respective tests * adjustements after refactoring * identifier mismatch * name update * name update * added appeal affinity filter * updated comment * remove byebug * update rspec to handle hash input * added no start date test case * updated process method test * removed 'todo' comment * dried up query string * aligned conditions * update to hash quotations * update to hash quotations * added legacy to priority receipt dates from dist. * moved append to resulting list * added legacy receipt date to push job hash * uncomment call to legacy * updated dist.id to @dist_id * uncomment call to process legacy appeals * handling update to legacy docket type * current rspec status * fixed typo * fix rspec * legacy spec additions * legacy spec additions * added legacy dist. case factory * removed vacols_judge ref * updates for spec * final review * removed comment * rubocop fixes * fix rubocop warnings (#22225) * Fix rubocop and tests (#22231) * APPEALS-52222: Add seed data file for AOJ remand return feature development (#22245) * added initial seed file * refactor create_correspondent * Calvin/appeals 52551 (#22293) * age_of_n_oldest_priority_appeals_available_to_judge time out changes * fixed timeout issue for distribute_priority_appeals * fixed lint errors * Craig/case docket optimization (#22294) * age_of_n_oldest_priority_appeals_available_to_judge time out changes * fixed timeout issue for distribute_priority_appeals * optimize case docket priority distribution methods * fix das deprecation distribution spec --------- Co-authored-by: Calvin * Combination/appeals 50951 50966 50980 (#22250) * [APPEALS-50951]: Class Created for LegacyAojDocket * draft PR * aoj_case_docket initial work * initial aoj case docket creation * added missing method to aoj_case_docket * updated legacy docket spec to remove any AOJ data * fixed lint error * moving aoj appeal repository file to the correct folder * set up aoj Appeal Repository file * remove unnecessary rubocop disable * LegacyAojDocket * rspec for aoj appeal repository * updated push_priority_appeals_to_judges_job_spec.rb * remove byebug * fixing some rubocop errors * fixed aoj_legacy_docket_spec * fixed most errors in push_priority_to_judges_job_spec * rubocop ignores/fixes * Added count code in aoj legacy docket * fixed last push_priority spec error * removed unnecessary methods and reworked rspecs * fix update_appeal_affinity method for both CaseDocket and AojCaseDocket * remove unneccessary code * remove duplicate methods * resolved comments * removed unwanted code * remove age_of_n_oldest_genpop_priority_appeals from aoj * removed bfhines mentions * remove bfhines from update_appeal_affinity_dates_query * remove bfhines testing from rspec --------- Co-authored-by: samasudhirreddy Co-authored-by: Sean Parker Co-authored-by: Craig Reese * Update admin_ui_spec.rb for CAVC levers being enabled * Appeals-43900: Update Distribution Levers Seed Values to Enable in UI (#22249) * init. commit * updated test with data staged * updates to test implementation * removed rspec factory declarations * removed blank space * updated seed values for aoj seeds * updated tests * seeds typo * seeds typo * added passing class methods * review response + updates to spec * updated name error * updated context name * lint fixes * APPEALS-50870: Add New Factory Trait to VACOLS/ Case for AOJ w/ Previous Appeal (#22248) * add legacy_aoj_appeal factory * add tests to vacols/case model for aoj appeal factory * add comments to factory * kick tests * skip flaky distribution_spec.rb tests * update appeals ready to distribute CSV query for AOJ docket * update admin_ui tests for AOJ levers being enabled * Combination/appeals 43899 43901 43902 (#22429) * initial aoj_cavc affinity lever work * added seed data for aoj cavc lever * initial testing for aoj_cavc * updated rspecs + seed data * updated JOIN_PREVIOUS_APPEAL constant * updated spec files to include aoj cavc lever + fix linting * lint fix * rename aoj_cavc_affinity trait * added lever to related rspecs * Added Aoj Aod affinity days in distribute appeals * Aoj_aod affinity lever * removed bfac stuff * Added seed data and test cases * fixed typo errors * updated JOIN_PREVIOUS_APPEAL * fix for binding query with variables * removed altering of bfkey in the aoj_case_docket_spec test * update lever name and add to related rspecs * one more update for lever name * added lever to related rspecs * edited rspec tests * skip flaky test * fixed query santizing with variables + added infinite lever error handling * added tests for when both aoj levers are infinite * fixed parenthesis for age_of_n method * Added 2 additional appeal with cavc * Updated dates --------- Co-authored-by: Calvin Co-authored-by: calvincostaBAH <108481161+calvincostaBAH@users.noreply.github.com> * APPEALS-53993: Update Implementation of Legacy Appeals with Hearing Held (#22473) * implement new hearing requirement and test * first pass at seed data for testing * add new case to test and seed, fix typo and comments * update for new 8.2.1.1 requirement * fix rubocop warning * fix error in seed file * add new affinity scenario to seed data * make some seed methods private * fix rubocop warnings * rspec addition for aoj (#22405) * initial aoj_cavc affinity lever work * added seed data for aoj cavc lever * initial testing for aoj_cavc * rspec addition for aoj * updated rspecs + seed data * updated JOIN_PREVIOUS_APPEAL constant * updated spec files to include aoj cavc lever + fix linting * lint fix * rename aoj_cavc_affinity trait * aoj affinity lever imp. * added lever to related rspecs * seeds * Added Aoj Aod affinity days in distribute appeals * Aoj_aod affinity lever * removed bfac stuff * Added seed data and test cases * fixed typo errors * updated JOIN_PREVIOUS_APPEAL * fix for binding query with variables * removed altering of bfkey in the aoj_case_docket_spec test * update lever name and add to related rspecs * one more update for lever name * added lever to related rspecs * edited rspec tests * update to add lever to all related rspecs * update JOIN_PREVIOUS_APPEALS constant * skip flaky test * lint fixes, spec fixes, and implementation updates * seed updates * fixed query santizing with variables + added infinite lever error handling * added tests for when both aoj levers are infinite * rspec fixes on query * changing rspec lever test to use nonpriority method call * updated variable name * skipped flaky test * fix method naming * refactored age_of_n_nonpriority method * fixed parenthesis for age_of_n method * Added 2 additional appeal with cavc * Updated dates * updates to age_of_n_oldest_nonpriority method * updates to fixx issue on lever set to infinite * replaced num with judge.vacols_attorney_id * rubocop fixes * spec and update on missing parenthesis * lint error --------- Co-authored-by: Calvin Co-authored-by: calvincostaBAH <108481161+calvincostaBAH@users.noreply.github.com> Co-authored-by: samasudhirreddy Co-authored-by: Craig Reese * Update testing CSV files with affinity start date and original judge columns (#22498) * affinity start date column * original judges column for legacy and ama appeals * remove unnecessary rubocop disable * swap judge_mem_id with original_judge variables for better clarity * Calvin/appeals 53712 (#22490) * initial aoj_cavc affinity lever work * added seed data for aoj cavc lever * initial testing for aoj_cavc * updated rspecs + seed data * updated JOIN_PREVIOUS_APPEAL constant * updated spec files to include aoj cavc lever + fix linting * lint fix * rename aoj_cavc_affinity trait * added lever to related rspecs * Added Aoj Aod affinity days in distribute appeals * Aoj_aod affinity lever * removed bfac stuff * Added seed data and test cases * fixed typo errors * updated JOIN_PREVIOUS_APPEAL * fix for binding query with variables * removed altering of bfkey in the aoj_case_docket_spec test * update lever name and add to related rspecs * one more update for lever name * added lever to related rspecs * edited rspec tests * skip flaky test * fixed query santizing with variables + added infinite lever error handling * added tests for when both aoj levers are infinite * fixed parenthesis for age_of_n method * Added 2 additional appeal with cavc * Updated dates * aoj_cavc seed data for testing * made changes based on craigs comments * fixed small name issues * lint fix --------- Co-authored-by: samasudhirreddy * Seed Data for Testing AOJ AOD Affinity Lever (#22501) * Seed Data for Testing AOJ AOD Affinity Lever * Name changes to Genpop * fixed lint issue and addressed comments * typo error fixed * uncommented code * Added back 2 additional appeals with Cavc * Isaiah/appeals 43895 (#22536) * initial aoj_cavc affinity lever work * added seed data for aoj cavc lever * initial testing for aoj_cavc * rspec addition for aoj * updated rspecs + seed data * updated JOIN_PREVIOUS_APPEAL constant * updated spec files to include aoj cavc lever + fix linting * lint fix * rename aoj_cavc_affinity trait * aoj affinity lever imp. * added lever to related rspecs * seeds * Added Aoj Aod affinity days in distribute appeals * Aoj_aod affinity lever * removed bfac stuff * Added seed data and test cases * fixed typo errors * updated JOIN_PREVIOUS_APPEAL * fix for binding query with variables * removed altering of bfkey in the aoj_case_docket_spec test * update lever name and add to related rspecs * one more update for lever name * added lever to related rspecs * edited rspec tests * update to add lever to all related rspecs * update JOIN_PREVIOUS_APPEALS constant * skip flaky test * lint fixes, spec fixes, and implementation updates * seed updates * fixed query santizing with variables + added infinite lever error handling * added tests for when both aoj levers are infinite * rspec fixes on query * changing rspec lever test to use nonpriority method call * updated variable name * skipped flaky test * fix method naming * refactored age_of_n_nonpriority method * fixed parenthesis for age_of_n method * Added 2 additional appeal with cavc * Updated dates * updates to age_of_n_oldest_nonpriority method * updates to fixx issue on lever set to infinite * replaced num with judge.vacols_attorney_id * rubocop fixes * spec and update on missing parenthesis * lint error * seed adjustments * compiled updates to seed * removed repeating methods and rearranged methods * lint fix * adjustments to seeds * seed updates * seed updates --------- Co-authored-by: Calvin Co-authored-by: calvincostaBAH <108481161+calvincostaBAH@users.noreply.github.com> Co-authored-by: samasudhirreddy * SeanP/APPEALS-55085: Add columns to distribution_stats for new AOJ legacy docket (#22655) * aoj_legacy_stats and aoj_legacy_priority_stats to distribution_stats table, including tests * run make migrate to drop unnecessary local table * add distribtuion stats to serializer in lower environments (#22559) * Calvin/appeals 53978 (#22612) * initial code changes + rspec fixes * lint fixes and reorganized code * added a skip to aoj_legacy distribution stats (must add back later) * fixed remaining rspecs by adding to stats * lint fix * removing guard clauses * removed flaky test * Update dist controller tests for addition of distribution_stats to the serializer * Initial commit of Affinity_date_count (#22609) * Initial commit of Affinity_date_count * added code in aoj legacy docket * affinity_date_count methods for legacy docket and aoj legacy docket * addressed comments * refactored affinity_date_count methods and added filters * Added rspecs and code refator * robocop fixed * Addressed comments and updated test cases * Lint issue fixed * Initial commit of Affinity_date_count * added code in aoj legacy docket * affinity_date_count methods for legacy docket and aoj legacy docket * addressed comments * refactored affinity_date_count methods and added filters * Added rspecs and code refator * robocop fixed * Addressed comments and updated test cases * Lint issue fixed * Updated in and out affinity date window for both aoj and non aoj * Addressed comments * Fixed lint issue * refactored affinity date count logic and rspecs * fixed priority and non priority affinity count query + rspecs * lint issue fixed * fixed nonpriority affinity date count method * added comments + new method for nonpriority --------- Co-authored-by: Calvin * APPEALS-55609: Cache case distribution lever values at beginning of PPJ or other distribution (#22654) * method additions for cache writeouts * moved cache methods to distribution.rb * updates to the imp. * added conditional on assignment * changed order of conditional * rspec addition & revised expiration for cache * updates to point of method call * updates to cache imp. * modified removal and name of cache * updates following review * update to rspec * chained rspec method to call original * rspec fixes for aoj_case_docket * chained method count to receive * cleared cache on case docket spec * fix case factory defining correspondent twice * Calvin/appeals 57225 (#22777) * added test cases for infinite and omit levers with desired outcomes * add check for hearing date to levers being infinite * fix lint * adding method to aoj case docket * updated rspecs * added cache clearing * refactored spec tests * fixed rspec expectations * fixed use of double update --------- Co-authored-by: Craig Reese <109101548+craigrva@users.noreply.github.com> Co-authored-by: Craig Reese * Migrate databases after Rails upgrade * APPEALS-57350, APPEALS-57391: Fix distribution statistics affinity_date_count methods (#22955) * add metabase to m1 docker compose * rename metabase container and specify a version * add script for initial metabase setup * script output formatting * add metabase directory * move to a dockerfile, implement VACOLS to setup script * add metabase to original docker-compose * add step to initialize metabase in demo startup * update demo startup.sh to initialize metabase with absolute path * add make command for local metabase setup * fix makefile syntax error * update scripts to work in AWS * update demo script to use apt-get instead of yum * update demo script to use dns for vacols-db * fix vacols DB docker DNS name * Distribution stats error (#22773) * Distribution stats error * Added test cases affinity date count * Addressed comments and refactor genpop_by_affinity_start_date method using the OR condition * Addressed comments * add distribtuion stats to serializer in lower environments --------- Co-authored-by: Craig Reese <109101548+craigrva@users.noreply.github.com> Co-authored-by: Craig Reese * APPEALS-57391: Distribution statistics method affinity_date_count does not return accurate counts for the Hearing docket (#22827) * added method for method chaining onto scope * chained to scope * updated affinity_date_count method and added rspec * added missed 'self' * changes for pasaing test * updates to spec and affinity_date_count * test updates * rubocop fixes * rubocop fixes * removed unused methods --------- Co-authored-by: Craig Reese <109101548+craigrva@users.noreply.github.com> * Update test files for combining the branches --------- Co-authored-by: samasudhirreddy <108430298+samasudhirreddy@users.noreply.github.com> Co-authored-by: Isaiah Saucedo * Fixed appeals ready for distribution query when no prev_deciding_judge exists * rebased hotfix/APPEALS-58200 changes to feature branch (#23067) * rebased hotfix/APPEALS-58200 changes to feature branch * added aoj_case_docket changes * updated docket coordinator spec to include levers * Update ReturnLegacyAppealsToBoardJob to use AojLegacyDocket (#22975) * tie return_legacy_appeals_to_board_job to AojLegacyDockets * remove duplicate test * testing aoj case docket appeals * Rails logger * getting legacy_aoj_appeal tests to work * select PREV_TYPE_ACTION * remove Rails logger * change constant in self.ready_to_distribute_appeals to include hearing judge * APPEALS-60079: Hearing held before most recent Remand Judge distributing correctly when lever is set to infinite (#23115) * update infinite lever checks to use deciding instead of hearing judge * fix bug in seed data with user css_id lengths * Craig/appeals 60680 (#23177) * add test scenario and update assertions for SMR changes * update test assertions for hearing after decision checks * code change for tying cases with a nil previous deciding judge * updated seed veteran names for new scenarios --------- Co-authored-by: calvincostaBAH <108481161+calvincostaBAH@users.noreply.github.com> Co-authored-by: samasudhirreddy <108430298+samasudhirreddy@users.noreply.github.com> Co-authored-by: Calvin Co-authored-by: seanrpa <155660052+seanrpa@users.noreply.github.com> Co-authored-by: Isaiah Saucedo Co-authored-by: samasudhirreddy Co-authored-by: Sean Parker --- .../return_legacy_appeals_to_board_job.rb | 2 +- app/jobs/update_appeal_affinity_dates_job.rb | 2 + app/models/case_distribution_lever.rb | 21 +- .../concerns/by_docket_date_distribution.rb | 2 + app/models/concerns/distribution_scopes.rb | 42 +- app/models/distribution.rb | 2 + app/models/docket.rb | 23 +- app/models/docket_coordinator.rb | 3 +- app/models/dockets/aoj_legacy_docket.rb | 106 ++ app/models/dockets/hearing_request_docket.rb | 35 + app/models/dockets/legacy_docket.rb | 20 +- app/models/legacy_appeal.rb | 4 + app/models/vacols/aoj_case_docket.rb | 934 +++++++++++ app/models/vacols/case_docket.rb | 88 +- app/queries/appeals_distributed.rb | 25 +- ...als_non_priority_ready_for_distribution.rb | 2 +- app/queries/appeals_ready_for_distribution.rb | 6 +- app/repositories/aoj_appeal_repository.rb | 120 ++ app/repositories/appeal_repository.rb | 8 + app/serializers/distribution_serializer.rb | 1 + db/etl_schema.rb | 4 +- ...cy_priority_stats_to_distribution_stats.rb | 8 + db/schema.rb | 48 +- db/seeds/aoj_remand_return_legacy_appeals.rb | 931 +++++++++++ db/seeds/case_distribution_levers.rb | 10 +- db/seeds/cavc_affinity_levers_test_data.rb | 16 +- .../distributions_controller_spec.rb | 10 +- spec/factories/case_distribution_lever.rb | 78 + spec/factories/distribution.rb | 15 +- spec/factories/vacols/case.rb | 93 ++ .../case_distribution_levers/admin_ui_spec.rb | 21 +- .../jobs/incomplete_distributions_job_spec.rb | 3 + ...ush_priority_appeals_to_judges_job_spec.rb | 145 +- ...return_legacy_appeals_to_board_job_spec.rb | 12 + .../update_appeal_affinity_dates_job_spec.rb | 23 +- spec/lib/tasks/affinity_start_date_spec.rb | 2 +- spec/models/case_distribution_lever_spec.rb | 29 +- .../by_docket_date_distribution_spec.rb | 3 + spec/models/distribution_spec.rb | 13 +- spec/models/docket_coordinator_spec.rb | 5 + spec/models/docket_spec.rb | 46 + spec/models/dockets/aoj_legacy_docket_spec.rb | 332 ++++ .../dockets/hearing_request_docket_spec.rb | 37 + spec/models/dockets/legacy_docket_spec.rb | 87 +- spec/models/vacols/aoj_case_docket_spec.rb | 1463 +++++++++++++++++ spec/models/vacols/case_docket_spec.rb | 160 +- spec/models/vacols/case_spec.rb | 116 ++ .../appeals_ready_for_distribution_spec.rb | 12 +- .../aoj_appeal_repository_spec.rb | 100 ++ .../distribution_serializer_spec.rb | 25 + 50 files changed, 5071 insertions(+), 222 deletions(-) create mode 100644 app/models/dockets/aoj_legacy_docket.rb create mode 100644 app/models/vacols/aoj_case_docket.rb create mode 100644 app/repositories/aoj_appeal_repository.rb create mode 100644 db/migrate/20240829153134_add_aoj_legacy_priority_stats_to_distribution_stats.rb create mode 100644 db/seeds/aoj_remand_return_legacy_appeals.rb create mode 100644 spec/models/dockets/aoj_legacy_docket_spec.rb create mode 100644 spec/models/vacols/aoj_case_docket_spec.rb create mode 100644 spec/repositories/aoj_appeal_repository_spec.rb create mode 100644 spec/serializers/distribution_serializer_spec.rb diff --git a/app/jobs/return_legacy_appeals_to_board_job.rb b/app/jobs/return_legacy_appeals_to_board_job.rb index a5ee1baba90..b2407736cd9 100644 --- a/app/jobs/return_legacy_appeals_to_board_job.rb +++ b/app/jobs/return_legacy_appeals_to_board_job.rb @@ -52,7 +52,7 @@ def filter_appeals(appeals, moved_appeals) end def eligible_and_moved_appeals - appeals = LegacyDocket.new.appeals_tied_to_non_ssc_avljs + appeals = LegacyDocket.new.appeals_tied_to_non_ssc_avljs + AojLegacyDocket.new.appeals_tied_to_non_ssc_avljs moved_appeals = move_qualifying_appeals(appeals) [appeals, moved_appeals] end diff --git a/app/jobs/update_appeal_affinity_dates_job.rb b/app/jobs/update_appeal_affinity_dates_job.rb index 6af56da9621..644c66277e7 100644 --- a/app/jobs/update_appeal_affinity_dates_job.rb +++ b/app/jobs/update_appeal_affinity_dates_job.rb @@ -157,6 +157,8 @@ def process_legacy_appeals_which_need_affinity_updates(receipt_date_hashes_array legacy_appeals_hash = VACOLS::CaseDocket.update_appeal_affinity_dates_query(receipt_date_hash[:priority], receipt_date_hash[:receipt_date]) + legacy_appeals_hash += VACOLS::AojCaseDocket.update_appeal_affinity_dates_query(receipt_date_hash[:priority], + receipt_date_hash[:receipt_date]) legacy_appeals_to_update_adjusted_for_affinity = legacy_appeals_with_no_appeal_affinities(legacy_appeals_hash) create_or_update_appeal_affinities(legacy_appeals_to_update_adjusted_for_affinity, receipt_date_hash[:priority]) end diff --git a/app/models/case_distribution_lever.rb b/app/models/case_distribution_lever.rb index a2ab54e3a9b..e892af1f302 100644 --- a/app/models/case_distribution_lever.rb +++ b/app/models/case_distribution_lever.rb @@ -28,6 +28,9 @@ class CaseDistributionLever < ApplicationRecord #{Constants.DISTRIBUTION.ama_hearing_start_distribution_prior_to_goals} #{Constants.DISTRIBUTION.ama_evidence_submission_start_distribution_prior_to_goals} #{Constants.DISTRIBUTION.nonsscavlj_number_of_appeals_to_move} + #{Constants.DISTRIBUTION.aoj_affinity_days} + #{Constants.DISTRIBUTION.aoj_aod_affinity_days} + #{Constants.DISTRIBUTION.aoj_cavc_affinity_days} ).freeze FLOAT_LEVERS = %W( @@ -186,10 +189,20 @@ def snapshot snapshot_hash end + def clear_distribution_lever_cache + lever_items = CaseDistributionLever.all.map(&:item) + + # Loop through each lever item and delete the corresponding cache + lever_items.each do |item| + cache_key = "#{item}_distribution_lever_cache" + Rails.cache.delete(cache_key) + end + end + private def method_missing_value(name) - lever = find_by_item(name).try(:value) + lever = check_distribution_lever_cache(name) begin if INTEGER_LEVERS.include?(name) Integer(lever) @@ -247,5 +260,11 @@ def update_radio_options(lever, options) lever["options"] = options end + + def check_distribution_lever_cache(name) + Rails.cache.fetch("#{name}_distribution_lever_cache", expires_in: 2.minutes) do + find_by_item(name).try(:value) + end + end end end diff --git a/app/models/concerns/by_docket_date_distribution.rb b/app/models/concerns/by_docket_date_distribution.rb index 593c8322a91..2e40b021a40 100644 --- a/app/models/concerns/by_docket_date_distribution.rb +++ b/app/models/concerns/by_docket_date_distribution.rb @@ -60,6 +60,8 @@ def distribute_nonpriority_appeals_from_all_dockets_by_age_to_limit(limit, style # rubocop:disable Metrics/MethodLength, Metrics/AbcSize def ama_statistics docket_counts = { + aoj_legacy_priority_stats: {}, + aoj_legacy_stats: {}, direct_review_priority_stats: {}, direct_review_stats: {}, evidence_submission_priority_stats: {}, diff --git a/app/models/concerns/distribution_scopes.rb b/app/models/concerns/distribution_scopes.rb index 81ea761fa56..03eab5c626c 100644 --- a/app/models/concerns/distribution_scopes.rb +++ b/app/models/concerns/distribution_scopes.rb @@ -162,12 +162,23 @@ def genpop end def genpop_by_affinity_start_date - with_appeal_affinities + query = "" + cavc_aod_affinity_days = CaseDistributionLever.cavc_aod_affinity_days + cavc_affinity_days = CaseDistributionLever.cavc_affinity_days + + result = with_appeal_affinities .with_original_appeal_and_judge_task - .where( - "appeal_affinities.affinity_start_date <= ?", - CaseDistributionLever.cavc_affinity_days.days.ago - ) + + if case_affinity_days_lever_value_is_selected?(cavc_affinity_days) + query += "appeal_affinities.affinity_start_date <= '#{cavc_affinity_days.days.ago}'" + end + + if case_affinity_days_lever_value_is_selected?(cavc_aod_affinity_days) + cavc_aod_query = "appeal_affinities.affinity_start_date <= '#{cavc_aod_affinity_days.days.ago}'" + query += query.present? ? " OR #{cavc_aod_query}" : cavc_aod_query + end + + query.present? ? result.where(query) : result end def ama_non_aod_appeals @@ -204,11 +215,26 @@ def non_genpop_for_judge(judge, lever_days = CaseDistributionLever.cavc_affinity end def non_genpop_by_affinity_start_date - with_appeal_affinities + query = "" + cavc_aod_affinity_days = CaseDistributionLever.cavc_aod_affinity_days + cavc_affinity_days = CaseDistributionLever.cavc_affinity_days + + result = with_appeal_affinities .with_original_appeal_and_judge_task - .where("appeal_affinities.affinity_start_date > ? or appeal_affinities.affinity_start_date is null", - CaseDistributionLever.cavc_affinity_days.days.ago) .where.not(original_judge_task: { assigned_to_id: nil }) + + if case_affinity_days_lever_value_is_selected?(cavc_affinity_days) + query += "appeal_affinities.affinity_start_date > '#{cavc_affinity_days.days.ago}' or "\ + "appeal_affinities.affinity_start_date is null" + end + + if case_affinity_days_lever_value_is_selected?(cavc_aod_affinity_days) + cavc_aod_query = "appeal_affinities.affinity_start_date > '#{cavc_aod_affinity_days.days.ago}' or "\ + "appeal_affinities.affinity_start_date is null" + query += query.present? ? " OR #{cavc_aod_query}" : cavc_aod_query + end + + query.present? ? result.where(query) : result end def ordered_by_distribution_ready_date diff --git a/app/models/distribution.rb b/app/models/distribution.rb index 8c483b511ee..626f44c4eea 100644 --- a/app/models/distribution.rb +++ b/app/models/distribution.rb @@ -45,6 +45,8 @@ def distribute!(limit = nil) update!(status: "completed", completed_at: Time.zone.now, statistics: completed_statistics(ama_stats)) record_distribution_stats(ama_stats) + + CaseDistributionLever.clear_distribution_lever_cache end rescue StandardError => error process_error(error) diff --git a/app/models/docket.rb b/app/models/docket.rb index b830e5fcf41..7cfba2a626e 100644 --- a/app/models/docket.rb +++ b/app/models/docket.rb @@ -14,7 +14,7 @@ def docket_type # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity # :reek:LongParameterList - def appeals(priority: nil, genpop: nil, ready: nil, judge: nil) + def appeals(priority: nil, genpop: nil, ready: nil, judge: nil, not_affinity: nil) fail "'ready for distribution' value cannot be false" if ready == false scope = docket_appeals @@ -26,7 +26,7 @@ def appeals(priority: nil, genpop: nil, ready: nil, judge: nil) if ready scope = scope.ready_for_distribution scope = adjust_for_genpop(scope, genpop, judge) if judge.present? && !use_by_docket_date? - scope = adjust_for_affinity(scope, judge) if judge.present? && FeatureToggle.enabled?(:acd_exclude_from_affinity) + scope = adjust_for_affinity(scope, not_affinity, judge) if FeatureToggle.enabled?(:acd_exclude_from_affinity) end return scoped_for_priority(scope) if priority == true @@ -36,9 +36,9 @@ def appeals(priority: nil, genpop: nil, ready: nil, judge: nil) scope.order("appeals.receipt_date") end - def ready_priority_nonpriority_appeals(priority: false, ready: true, judge: nil, genpop: nil) + def ready_priority_nonpriority_appeals(priority: false, ready: true, judge: nil, genpop: nil, not_affinity: nil) priority_status = priority ? PRIORITY : NON_PRIORITY - appeals = appeals(priority: priority, ready: ready, genpop: genpop, judge: judge) + appeals = appeals(priority: priority, ready: ready, genpop: genpop, judge: judge, not_affinity: not_affinity) lever_item = "disable_ama_#{priority_status}_#{docket_type.downcase}" docket_type_lever = CaseDistributionLever.find_by_item(lever_item) docket_type_lever_value = docket_type_lever ? CaseDistributionLever.public_send(lever_item) : nil @@ -98,9 +98,10 @@ def age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) def age_of_oldest_priority_appeal @age_of_oldest_priority_appeal ||= if use_by_docket_date? - ready_priority_nonpriority_appeals(priority: true, ready: true).limit(1).first&.receipt_date + ready_priority_nonpriority_appeals(priority: true, ready: true, not_affinity: true).limit(1).first&.receipt_date else - ready_priority_nonpriority_appeals(priority: true, ready: true).limit(1).first&.ready_for_distribution_at + ready_priority_nonpriority_appeals(priority: true, ready: true, not_affinity: true) + .limit(1).first&.ready_for_distribution_at end end @@ -209,8 +210,14 @@ def adjust_for_genpop(scope, genpop, judge) (genpop == "not_genpop") ? scope.non_genpop_for_judge(judge) : scope.genpop end - def adjust_for_affinity(scope, judge) - scope.genpop_with_case_distribution_lever.or(scope.non_genpop_with_case_distribution_lever(judge)) + def adjust_for_affinity(scope, not_affinity, judge = nil) + if judge.present? + scope.genpop_with_case_distribution_lever.or(scope.non_genpop_with_case_distribution_lever(judge)) + elsif not_affinity + scope + else + scope.genpop_with_case_distribution_lever + end end def scoped_for_priority(scope) diff --git a/app/models/docket_coordinator.rb b/app/models/docket_coordinator.rb index 1d01a87dc8e..09ad2385f81 100644 --- a/app/models/docket_coordinator.rb +++ b/app/models/docket_coordinator.rb @@ -6,7 +6,8 @@ def dockets legacy: LegacyDocket.new, direct_review: DirectReviewDocket.new, evidence_submission: EvidenceSubmissionDocket.new, - hearing: HearingRequestDocket.new + hearing: HearingRequestDocket.new, + aoj_legacy: AojLegacyDocket.new } @dockets ||= all_dockets diff --git a/app/models/dockets/aoj_legacy_docket.rb b/app/models/dockets/aoj_legacy_docket.rb new file mode 100644 index 00000000000..965a469f396 --- /dev/null +++ b/app/models/dockets/aoj_legacy_docket.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +class AojLegacyDocket < LegacyDocket + def ready_to_distribute_appeals + LegacyAppeal.aoj_appeal_repository.ready_to_distribute_appeals + end + + # rubocop:disable Metrics/CyclomaticComplexity + def count(priority: nil, ready: nil) + counts_by_priority_and_readiness.inject(0) do |sum, row| + next sum unless (priority.nil? || (priority ? 1 : 0) == row["priority"]) && + (ready.nil? || (ready ? 1 : 0) == row["ready"]) + + sum + row["n"] + end + end + # rubocop:enable Metrics/CyclomaticComplexity + + def genpop_priority_count + LegacyAppeal.aoj_appeal_repository.genpop_priority_count + end + + def not_genpop_priority_count + LegacyAppeal.aoj_appeal_repository.not_genpop_priority_count + end + + def ready_priority_appeal_ids + LegacyAppeal.aoj_appeal_repository.priority_ready_appeal_vacols_ids + end + + def oldest_priority_appeal_days_waiting + return 0 if age_of_oldest_priority_appeal.nil? + + (Time.zone.now.to_date - age_of_oldest_priority_appeal.to_date).to_i + end + + def age_of_oldest_priority_appeal + @age_of_oldest_priority_appeal ||= + if use_by_docket_date? + LegacyAppeal.aoj_appeal_repository.age_of_oldest_priority_appeal_by_docket_date + else + LegacyAppeal.aoj_appeal_repository.age_of_oldest_priority_appeal + end + end + + def age_of_n_oldest_priority_appeals_available_to_judge(judge, num) + LegacyAppeal.aoj_appeal_repository.age_of_n_oldest_priority_appeals_available_to_judge(judge, num) + end + + def age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) + LegacyAppeal.aoj_appeal_repository.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) + end + + def distribute_priority_appeals(distribution, style: "push", genpop: "any", limit: 1) + return [] unless should_distribute?(distribution, style: style, genpop: genpop) + + LegacyAppeal.aoj_appeal_repository.distribute_priority_appeals(distribution.judge, genpop, limit).map do |record| + next unless existing_distribution_case_may_be_redistributed?(record["bfkey"], distribution) + + dist_case = new_distributed_case(distribution, record, docket_type, genpop, true) + save_dist_case(dist_case) + dist_case + end.compact + end + + # rubocop:disable Metrics/ParameterLists + def distribute_nonpriority_appeals(distribution, + style: "push", + genpop: "any", + range: nil, + limit: 1, + bust_backlog: false) + return [] unless should_distribute?(distribution, style: style, genpop: genpop) + + return [] if !range.nil? && range <= 0 + + LegacyAppeal.aoj_appeal_repository.distribute_nonpriority_appeals( + distribution.judge, genpop, range, limit, bust_backlog + ).map do |record| + next unless existing_distribution_case_may_be_redistributed?(record["bfkey"], distribution) + + dist_case = new_distributed_case(distribution, record, docket_type, genpop, false) + save_dist_case(dist_case) + dist_case + end.compact + end + # rubocop:enable Metrics/ParameterLists + + def priority_appeals_affinity_date_count(in_window) + LegacyAppeal.aoj_appeal_repository.priority_appeals_affinity_date_count(in_window).size + end + + def non_priority_appeals_affinity_date_count(in_window) + LegacyAppeal.aoj_appeal_repository.non_priority_appeals_affinity_date_count(in_window).size + end + + def appeals_tied_to_non_ssc_avljs + LegacyAppeal.aoj_appeal_repository.appeals_tied_to_non_ssc_avljs + end + + private + + def counts_by_priority_and_readiness + @counts_by_priority_and_readiness ||= LegacyAppeal.aoj_appeal_repository.docket_counts_by_priority_and_readiness + end +end diff --git a/app/models/dockets/hearing_request_docket.rb b/app/models/dockets/hearing_request_docket.rb index 1ff92b33313..d891de56aa7 100644 --- a/app/models/dockets/hearing_request_docket.rb +++ b/app/models/dockets/hearing_request_docket.rb @@ -106,4 +106,39 @@ def self.limit_only_genpop_appeals(appeals_array, limit) # appeals is a 2x2 array containing 4 cases overall and we will end up distributing 4 cases rather than 2. # Instead, reinstate the limit here by filtering out the newest cases end + + # used for distribution_stats + # :reek:ControlParameter + # :reek:FeatureEnvy + # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Style/ConditionalAssignment\ + def affinity_date_count(in_window, priority) + scope = docket_appeals + .joins(:hearings) + .genpop_base_query + .ready_for_distribution + .with_held_hearings + + non_aod_lever = CaseDistributionLever.ama_hearing_case_affinity_days + aod_lever = CaseDistributionLever.ama_hearing_case_aod_affinity_days + + return scope.none if priority && aod_lever&.is_a?(String) + return scope.none if !priority && non_aod_lever&.is_a?(String) + + if in_window + scope = priority ? affinitized_scope(scope, aod_lever) : affinitized_scope(scope, non_aod_lever) + else + scope = priority ? expired_scope(scope, aod_lever) : expired_scope(scope, non_aod_lever) + end + + priority ? scoped_for_priority(scope).ids.size : scope.nonpriority.ids.size + end + # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Style/ConditionalAssignment + + def affinitized_scope(scope, lever) + lever.is_a?(Integer) ? scope.affinitized_ama_affinity_cases(lever) : scope + end + + def expired_scope(scope, lever) + lever.is_a?(Integer) ? scope.expired_ama_affinity_cases(lever) : scope + end end diff --git a/app/models/dockets/legacy_docket.rb b/app/models/dockets/legacy_docket.rb index 44d332291f5..9e9b425715a 100644 --- a/app/models/dockets/legacy_docket.rb +++ b/app/models/dockets/legacy_docket.rb @@ -149,10 +149,24 @@ def distribute_nonpriority_appeals(distribution, end # rubocop:enable Metrics/ParameterLists + def priority_appeals_affinity_date_count(in_window) + LegacyAppeal.repository.priority_appeals_affinity_date_count(in_window).size + end + + def non_priority_appeals_affinity_date_count(_in_window) + "N/A for legacy appeals which are nonpriority and non-AOJ" + end + # used for distribution_stats - # change parameters to in_window, priority once implemented - def affinity_date_count(*) - "not implemented" + # in_window refers to all cases with an appeal affinity still in their affinity window + # Out-of-window (in_window == false) refers to all other cases including cases that are + # out of their affinity window, tied_to, or genpop. + def affinity_date_count(in_window, priority) + if priority + priority_appeals_affinity_date_count(in_window) + else + non_priority_appeals_affinity_date_count(in_window) + end end private diff --git a/app/models/legacy_appeal.rb b/app/models/legacy_appeal.rb index be859405409..6d30eab2ca4 100644 --- a/app/models/legacy_appeal.rb +++ b/app/models/legacy_appeal.rb @@ -1119,6 +1119,10 @@ def repository AppealRepository end + def aoj_appeal_repository + AojAppealRepository + end + # Wraps the closure of appeals in a transaction # add additional code inside the transaction by passing a block def close(appeal: nil, appeals: nil, user:, closed_on:, disposition:) diff --git a/app/models/vacols/aoj_case_docket.rb b/app/models/vacols/aoj_case_docket.rb new file mode 100644 index 00000000000..e7aa028fb28 --- /dev/null +++ b/app/models/vacols/aoj_case_docket.rb @@ -0,0 +1,934 @@ +# frozen_string_literal: true + +class VACOLS::AojCaseDocket < VACOLS::CaseDocket # rubocop:disable Metrics/ClassLength + # :nocov: + self.table_name = "brieff" + + LOCK_READY_APPEALS = " + select BFCURLOC from BRIEFF + where BRIEFF.BFMPRO = 'ACT' and BRIEFF.BFCURLOC in ('81', '83') + for update + " + + # Distribution should be blocked by pending mail, with the exception of: + # + # 02 - Congressional interest + # 05 - Evidence or argument (because the attorney will pick this up) + # 08 - Motion to advance on the docket + # 13 - Status inquiry + + JOIN_MAIL_BLOCKS_DISTRIBUTION = " + left join ( + select BRIEFF.BFKEY MAILKEY, + (case when nvl(MAIL.CNT, 0) > 0 then 1 else 0 end) MAIL_BLOCKS_DISTRIBUTION + from BRIEFF + + left join ( + select MLFOLDER, count(*) CNT + from MAIL + where MLCOMPDATE is null and MLTYPE not in ('02', '05', '08', '13') + group by MLFOLDER + ) MAIL + on MAIL.MLFOLDER = BRIEFF.BFKEY + ) + on MAILKEY = BFKEY + " + + # Distribution should be blocked by a pending diary of one of the following types: + # + # EXT - Extension request + # HCL - Hearing clarification + # POA - Power of attorney clarification + + JOIN_DIARY_BLOCKS_DISTRIBUTION = " + left join ( + select BRIEFF.BFKEY DIARYKEY, + (case when nvl(DIARIES.CNT, 0) > 0 then 1 else 0 end) DIARY_BLOCKS_DISTRIBUTION + from BRIEFF + + left join ( + select TSKTKNM, count(*) CNT + from ASSIGN + where TSKDCLS is null and TSKACTCD in ('EXT', 'HCL', 'POA') + group by TSKTKNM + ) DIARIES + on DIARIES.TSKTKNM = BRIEFF.BFKEY + ) + on DIARYKEY = BFKEY + " + FROM_READY_APPEALS = " + from BRIEFF + #{VACOLS::Case::JOIN_AOD} + #{JOIN_MAIL_BLOCKS_DISTRIBUTION} + #{JOIN_DIARY_BLOCKS_DISTRIBUTION} + + inner join FOLDER on FOLDER.TICKNUM = BRIEFF.BFKEY + where BRIEFF.BFMPRO = 'ACT' + and BRIEFF.BFCURLOC in ('81', '83') + and BRIEFF.BFBOX is null + and BRIEFF.BFAC = '3' + and BRIEFF.BFD19 is not null + and MAIL_BLOCKS_DISTRIBUTION = 0 + and DIARY_BLOCKS_DISTRIBUTION = 0 + " + + SELECT_READY_APPEALS = " + select BFKEY, BFD19, BFCORLID, BFDLOOUT, BFMPRO, BFCURLOC, BFAC, BFHINES, TINUM, TITRNUM, AOD, + BFMEMID, BFDPDCN + #{FROM_READY_APPEALS} + " + + # this version of the query should not be used during distribution it is only intended for reporting usage + SELECT_READY_APPEALS_ADDITIONAL_COLS = " + select BFKEY, BFD19, BFDLOOUT, BFMPRO, BFCURLOC, BFAC, BFHINES, TINUM, TITRNUM, AOD, BFMEMID, BFDPDCN, + BFCORKEY, BFCORLID + #{FROM_READY_APPEALS} + " + + JOIN_PREVIOUS_APPEALS = " + left join ( + select B.BFKEY as PREV_BFKEY, B.BFCORLID as PREV_BFCORLID, B.BFDDEC as PREV_BFDDEC, + B.BFMEMID as PREV_DECIDING_JUDGE, B.BFAC as PREV_TYPE_ACTION, F.TINUM as PREV_TINUM, + F.TITRNUM as PREV_TITRNUM + from BRIEFF B + inner join FOLDER F on F.TICKNUM = B.BFKEY + + where B.BFMPRO = 'HIS' + ) PREV_APPEAL + on PREV_APPEAL.PREV_BFKEY != BRIEFF.BFKEY and PREV_APPEAL.PREV_BFCORLID = BRIEFF.BFCORLID + and PREV_APPEAL.PREV_TINUM = BRIEFF.TINUM and PREV_APPEAL.PREV_TITRNUM = BRIEFF.TITRNUM + and PREV_APPEAL.PREV_BFDDEC = BRIEFF.BFDPDCN + " + + SELECT_PRIORITY_APPEALS = " + select BFKEY, BFDLOOUT, BFAC, AOD, VLJ, PREV_TYPE_ACTION, PREV_DECIDING_JUDGE, HEARING_DATE, BFDPDCN + from ( + select BFKEY, BFDLOOUT, BFAC, AOD, BFDPDCN, + VLJ_HEARINGS.VLJ, VLJ_HEARINGS.HEARING_DATE, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS} + order by BFDLOOUT + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + ) + " + + SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19 = " + select BFKEY, BFD19, BFDLOOUT, BFAC, AOD, VLJ, PREV_TYPE_ACTION, PREV_DECIDING_JUDGE, HEARING_DATE, BFDPDCN + from ( + select BFKEY, BFD19, BFDLOOUT, BFAC, AOD, BFDPDCN, + VLJ_HEARINGS.VLJ, VLJ_HEARINGS.HEARING_DATE, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS} + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + order by BFD19 + ) + " + + SELECT_NONPRIORITY_APPEALS = " + select BFKEY, BFDLOOUT, AOD, VLJ, DOCKET_INDEX, PREV_TYPE_ACTION, PREV_DECIDING_JUDGE, HEARING_DATE, BFDPDCN + from ( + select BFKEY, BFDLOOUT, AOD, rownum DOCKET_INDEX, BFDPDCN, + VLJ_HEARINGS.VLJ, VLJ_HEARINGS.HEARING_DATE, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS} + order by case when substr(TINUM, 1, 2) between '00' and '29' then 1 else 0 end, TINUM + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + ) + " + + SELECT_NONPRIORITY_APPEALS_ORDER_BY_BFD19 = " + select BFKEY, BFD19, BFDLOOUT, AOD, VLJ, BFAC, DOCKET_INDEX, PREV_TYPE_ACTION, PREV_DECIDING_JUDGE, + HEARING_DATE, BFDPDCN + from ( + select BFKEY, BFD19, BFDLOOUT, AOD, BFAC, rownum DOCKET_INDEX, BFDPDCN, + VLJ_HEARINGS.VLJ, VLJ_HEARINGS.HEARING_DATE, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS} + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + order by BFD19 + ) + " + + # selects both priority and non-priority appeals that are ready to distribute + SELECT_READY_TO_DISTRIBUTE_APPEALS_ORDER_BY_BFD19 = " + select APPEALS.BFKEY, APPEALS.TINUM, APPEALS.BFD19, APPEALS.BFDLOOUT, + case when APPEALS.PREV_TYPE_ACTION = '7' or APPEALS.AOD = 1 then 1 else 0 end PRIORITY, + APPEALS.VLJ, APPEALS.PREV_DECIDING_JUDGE, APPEALS.HEARING_DATE, APPEALS.PREV_BFDDEC + from ( + select BRIEFF.BFKEY, BRIEFF.TINUM, BFD19, BFDLOOUT, BFAC, AOD, + case when BFHINES is null or BFHINES <> 'GP' then VLJ_HEARINGS.VLJ end VLJ + , PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + , VLJ_HEARINGS.HEARING_DATE HEARING_DATE + , PREV_APPEAL.PREV_BFDDEC PREV_BFDDEC + , PREV_APPEAL.PREV_TYPE_ACTION + from ( + #{SELECT_READY_APPEALS} + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + order by BFD19 + ) APPEALS + " + + # this query should not be used during distribution it is only intended for reporting usage + SELECT_READY_TO_DISTRIBUTE_APPEALS_ORDER_BY_BFD19_ADDITIONAL_COLS = " + select APPEALS.BFKEY, APPEALS.TINUM, APPEALS.BFD19, APPEALS.BFDLOOUT, APPEALS.AOD, APPEALS.BFCORLID, + CORRES.SNAMEF, CORRES.SNAMEL, CORRES.SSN, + STAFF.SNAMEF as VLJ_NAMEF, STAFF.SNAMEL as VLJ_NAMEL, + case when APPEALS.PREV_TYPE_ACTION = '7' then 1 else 0 end CAVC, PREV_TYPE_ACTION, + PREV_DECIDING_JUDGE + from ( + select BFKEY, BRIEFF.TINUM, BFD19, BFDLOOUT, BFAC, BFCORKEY, AOD, BFCORLID, + VLJ_HEARINGS.VLJ, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS_ADDITIONAL_COLS} + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + order by BFD19 + ) APPEALS + left join CORRES on APPEALS.BFCORKEY = CORRES.STAFKEY + left join STAFF on APPEALS.VLJ = STAFF.SATTYID + order by BFD19 + " + + # rubocop:disable Metrics/MethodLength + def self.counts_by_priority_and_readiness + query = <<-SQL + select count(*) N, PRIORITY, READY + from ( + select case when BFAC = '3' and (PREV_APPEAL.PREV_TYPE_ACTION = '7' or nvl(AOD_DIARIES.CNT, 0) + nvl(AOD_HEARINGS.CNT, 0) > 0) then 1 else 0 end as PRIORITY, + case when BFCURLOC in ('81', '83') and MAIL_BLOCKS_DISTRIBUTION = 0 and DIARY_BLOCKS_DISTRIBUTION = 0 + then 1 else 0 end as READY, TITRNUM, TINUM + from BRIEFF + inner join FOLDER on FOLDER.TICKNUM = BRIEFF.BFKEY + #{JOIN_MAIL_BLOCKS_DISTRIBUTION} + #{JOIN_DIARY_BLOCKS_DISTRIBUTION} + left join ( + select B.BFKEY as PREV_BFKEY, B.BFCORLID as PREV_BFCORLID, B.BFDDEC as PREV_BFDDEC, + B.BFMEMID as PREV_DECIDING_JUDGE, B.BFAC as PREV_TYPE_ACTION, F.TINUM as PREV_TINUM, + F.TITRNUM as PREV_TITRNUM + from BRIEFF B + inner join FOLDER F on F.TICKNUM = B.BFKEY + + where B.BFMPRO = 'HIS' and B.BFMEMID not in ('000', '888', '999') and B.BFATTID is not null + ) PREV_APPEAL + on PREV_APPEAL.PREV_BFKEY != BRIEFF.BFKEY and PREV_APPEAL.PREV_BFCORLID = BRIEFF.BFCORLID + and PREV_APPEAL.PREV_TINUM = TINUM and PREV_APPEAL.PREV_TITRNUM = TITRNUM + and PREV_APPEAL.PREV_BFDDEC = BRIEFF.BFDPDCN + left join ( + select TSKTKNM, count(*) CNT + from ASSIGN + where TSKACTCD in ('B', 'B1', 'B2') + group by TSKTKNM + ) AOD_DIARIES on AOD_DIARIES.TSKTKNM = BFKEY + left join ( + select FOLDER_NR, count(*) CNT + from HEARSCHED + where HEARING_TYPE IN ('C', 'T', 'V', 'R') + AND AOD IN ('G', 'Y') + group by FOLDER_NR + ) AOD_HEARINGS on AOD_HEARINGS.FOLDER_NR = BFKEY + where BFMPRO <> 'HIS' and BFD19 is not null and BFAC = '3' + ) + group by PRIORITY, READY + SQL + + connection.exec_query(query).to_a + end + # rubocop:enable Metrics/MethodLength + + def self.genpop_priority_count + query = <<-SQL + #{SELECT_PRIORITY_APPEALS} + where (VLJ is null or VLJ != PREV_DECIDING_JUDGE or #{ineligible_judges_sattyid_cache}) and (PREV_TYPE_ACTION = '7' or AOD = '1') + SQL + + filter_genpop_appeals_for_affinity(query).size + end + + def self.not_genpop_priority_count + query = <<-SQL + #{SELECT_PRIORITY_APPEALS} + where VLJ is not null and (PREV_TYPE_ACTION = '7' or AOD = '1') + SQL + + connection.exec_query(query).to_a.size + end + + # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/AbcSize + def self.age_of_n_oldest_priority_appeals_available_to_judge(judge, num) + aoj_cavc_affinity_lever_value = CaseDistributionLever.aoj_cavc_affinity_days + aoj_aod_affinity_lever_value = CaseDistributionLever.aoj_aod_affinity_days + + judge_sattyid = judge.vacols_attorney_id + excluded_judges_attorney_ids = excluded_judges_sattyids + + priority_aoj_cdl_query = generate_priority_aoj_case_distribution_lever_query(aoj_cavc_affinity_lever_value) + priority_cdl_aoj_aod_query = generate_priority_case_distribution_lever_aoj_aod_query(aoj_aod_affinity_lever_value) + + conn = connection + + query = if aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.infinite && + aoj_aod_affinity_lever_value == Constants.ACD_LEVERS.infinite + <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where ((VLJ = ? or #{ineligible_judges_sattyid_cache} or VLJ is null) + and (PREV_TYPE_ACTION = '7' or AOD = '1') + or ((PREV_DECIDING_JUDGE = ? or #{ineligible_judges_sattyid_cache(true)} + or #{vacols_judges_with_exclude_appeals_from_affinity(excluded_judges_attorney_ids)}) + and (#{priority_aoj_cdl_query} or #{priority_cdl_aoj_aod_query}))) + SQL + else + <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where (VLJ = ? or #{ineligible_judges_sattyid_cache} or VLJ is null) + and (PREV_TYPE_ACTION = '7' or AOD = '1') + or #{priority_aoj_cdl_query} + or #{priority_cdl_aoj_aod_query} + SQL + end + + fmtd_query = if aoj_cavc_affinity_lever_value != Constants.ACD_LEVERS.infinite && + aoj_aod_affinity_lever_value != Constants.ACD_LEVERS.infinite + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + judge.vacols_attorney_id, + judge.vacols_attorney_id + ]) + else + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + judge.vacols_attorney_id + ]) + end + + appeals = conn.exec_query(fmtd_query).to_a + + aoj_cavc_affinity_filter(appeals, judge_sattyid, aoj_cavc_affinity_lever_value, excluded_judges_attorney_ids) + aoj_aod_affinity_filter(appeals, judge_sattyid, aoj_aod_affinity_lever_value, excluded_judges_attorney_ids) + + appeals.sort_by { |appeal| appeal[:bfd19] } if use_by_docket_date? + + appeals = appeals.first(num) unless num.nil? # {Reestablishes the limit} + + appeals.map { |appeal| appeal["bfd19"] } + end + + def self.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) + aoj_affinity_lever_value = CaseDistributionLever.aoj_affinity_days + + judge_sattyid = judge.vacols_attorney_id + excluded_judges_attorney_ids = excluded_judges_sattyids + + nonpriority_cdl_aoj_query = generate_nonpriority_case_distribution_lever_aoj_query(aoj_affinity_lever_value) + conn = connection + + query = if aoj_affinity_lever_value == Constants.ACD_LEVERS.infinite + <<-SQL + #{SELECT_NONPRIORITY_APPEALS_ORDER_BY_BFD19} + where ((VLJ = ? or #{ineligible_judges_sattyid_cache} or VLJ is null) + and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + or ((PREV_DECIDING_JUDGE = ? or #{ineligible_judges_sattyid_cache(true)} + or #{vacols_judges_with_exclude_appeals_from_affinity(excluded_judges_attorney_ids)}) + or #{nonpriority_cdl_aoj_query})) + SQL + else + <<-SQL + #{SELECT_NONPRIORITY_APPEALS_ORDER_BY_BFD19} + where ((VLJ = ? or #{ineligible_judges_sattyid_cache} or VLJ is null) + and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + or #{nonpriority_cdl_aoj_query}) + SQL + end + + fmtd_query = sanitize_sql_array([ + query, + judge.vacols_attorney_id, + judge.vacols_attorney_id + ]) + + appeals = conn.exec_query(fmtd_query).to_a + + aoj_affinity_filter(appeals, judge_sattyid, aoj_affinity_lever_value, excluded_judges_attorney_ids) + + appeals.sort_by { |appeal| appeal[:bfd19] } if use_by_docket_date? + + appeals = appeals.first(num) unless num.nil? # {Reestablishes the limit} + + appeals.map { |appeal| appeal["bfd19"] } + end + + # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/AbcSize + def self.age_of_oldest_priority_appeal + query = <<-SQL + #{SELECT_PRIORITY_APPEALS} + where (PREV_TYPE_ACTION = '7' or AOD = '1') and rownum <= ? + SQL + + fmtd_query = sanitize_sql_array([query, 1]) + + connection.exec_query(fmtd_query).to_a.first&.fetch("bfdloout") + end + + def self.age_of_oldest_priority_appeal_by_docket_date + query = <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where (PREV_TYPE_ACTION = '7' or AOD = '1') and rownum <= ? + SQL + + fmtd_query = sanitize_sql_array([query, 1]) + + connection.exec_query(fmtd_query).to_a.first&.fetch("bfd19") + end + + def self.priority_hearing_cases_for_judge_count(judge) + query = <<-SQL + #{SELECT_PRIORITY_APPEALS} + where (VLJ = ? or #{ineligible_judges_sattyid_cache}) and (PREV_TYPE_ACTION = '7' or AOD = '1') + SQL + + fmtd_query = sanitize_sql_array([ + query, + judge.vacols_attorney_id + ]) + connection.exec_query(fmtd_query).count + end + + def self.nonpriority_hearing_cases_for_judge_count(judge) + query = <<-SQL + #{SELECT_NONPRIORITY_APPEALS} + where (VLJ = ? or #{ineligible_judges_sattyid_cache}) + and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + SQL + + fmtd_query = sanitize_sql_array([ + query, + judge.vacols_attorney_id + ]) + connection.exec_query(fmtd_query).count + end + + def self.priority_ready_appeal_vacols_ids + connection.exec_query(SELECT_PRIORITY_APPEALS).to_a.map { |appeal| appeal["bfkey"] } + end + + def self.ready_to_distribute_appeals + query = <<-SQL + #{SELECT_READY_TO_DISTRIBUTE_APPEALS_ORDER_BY_BFD19_ADDITIONAL_COLS} + SQL + + fmtd_query = sanitize_sql_array([query]) + connection.exec_query(fmtd_query).to_a + end + + # rubocop:disable Metrics/MethodLength + def self.update_appeal_affinity_dates_query(priority, date) + priority_condition = if priority + "and (PREV_TYPE_ACTION = '7' or AOD = '1')" + else + "and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0')" + end + + query = <<-SQL + select APPEALS.BFKEY, APPEALS.TINUM, APPEALS.BFD19, APPEALS.BFDLOOUT, APPEALS.AOD, APPEALS.BFCORLID, + CORRES.SNAMEF, CORRES.SNAMEL, CORRES.SSN, + STAFF.SNAMEF as VLJ_NAMEF, STAFF.SNAMEL as VLJ_NAMEL, + case when APPEALS.PREV_TYPE_ACTION = '7' then 1 else 0 end CAVC, APPEALS.PREV_TYPE_ACTION, + APPEALS.PREV_DECIDING_JUDGE + from ( + select BFKEY, BRIEFF.TINUM, BFD19, BFDLOOUT, BFAC, BFCORKEY, AOD, BFCORLID, + VLJ_HEARINGS.VLJ, + PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, + PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE + from ( + #{SELECT_READY_APPEALS_ADDITIONAL_COLS} + ) BRIEFF + #{JOIN_ASSOCIATED_VLJS_BY_HEARINGS} + #{JOIN_PREVIOUS_APPEALS} + order by BFD19 + ) APPEALS + left join CORRES on APPEALS.BFCORKEY = CORRES.STAFKEY + left join STAFF on APPEALS.VLJ = STAFF.STAFKEY + where APPEALS.BFD19 <= TO_DATE('#{date}', 'YYYY-MM-DD HH24:MI:SS') + #{priority_condition} + order by BFD19 + SQL + + fmtd_query = sanitize_sql_array([query]) + connection.exec_query(fmtd_query).to_a + end + + # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/ParameterLists, Metrics/AbcSize + + def self.distribute_nonpriority_appeals(judge, genpop, range, limit, bust_backlog, dry_run = false) + fail(DocketNumberCentennialLoop, COPY::MAX_LEGACY_DOCKET_NUMBER_ERROR_MESSAGE) if Time.zone.now.year >= 2030 + + aoj_affinity_lever_value = CaseDistributionLever.aoj_affinity_days + + nonpriority_cdl_aoj_query = generate_nonpriority_case_distribution_lever_aoj_query(aoj_affinity_lever_value) + + if use_by_docket_date? + query = <<-SQL + #{SELECT_NONPRIORITY_APPEALS_ORDER_BY_BFD19} + where ((((VLJ = ? or #{ineligible_judges_sattyid_cache}) and 1 = ?) or (VLJ is null and 1 = ?)) + and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + or #{nonpriority_cdl_aoj_query}) + and (DOCKET_INDEX <= ? or 1 = ?) + SQL + else + # Docket numbers begin with the two digit year. The Board of Veterans Appeals was created in 1930. + # Although there are no new legacy appeals after 2019, an old appeal can be reopened through a finding + # of clear and unmistakable error, which would result in a brand new docket number being assigned. + # An updated docket number format will need to be in place for legacy appeals by 2030 in order + # to ensure that docket numbers are sorted correctly. + + # When requesting to bust the backlog of cases tied to a judge, distribute enough cases to get down to 30 while + # still respecting the enforced limit on how many cases can be distributed + if bust_backlog + number_of_hearings_over_limit = nonpriority_hearing_cases_for_judge_count(judge) - HEARING_BACKLOG_LIMIT + limit = (number_of_hearings_over_limit > 0) ? [number_of_hearings_over_limit, limit].min : 0 + end + + query = <<-SQL + #{SELECT_NONPRIORITY_APPEALS} + where ((((VLJ = ? or #{ineligible_judges_sattyid_cache}) and 1 = ?) or (VLJ is null and 1 = ?)) + and ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + or #{nonpriority_cdl_aoj_query}) + and (DOCKET_INDEX <= ? or 1 = ?) + SQL + end + + fmtd_query = if aoj_affinity_lever_value == Constants.ACD_LEVERS.infinite + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + (genpop == "any" || genpop == "not_genpop") ? 1 : 0, + (genpop == "any" || genpop == "only_genpop") ? 1 : 0, + range, + range.nil? ? 1 : 0 + ]) + else + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + (genpop == "any" || genpop == "not_genpop") ? 1 : 0, + (genpop == "any" || genpop == "only_genpop") ? 1 : 0, + judge.vacols_attorney_id, + range, + range.nil? ? 1 : 0 + ]) + end + + distribute_appeals(fmtd_query, judge, limit, dry_run) + end + + def self.distribute_priority_appeals(judge, genpop, limit, dry_run = false) + aoj_cavc_affinity_lever_value = CaseDistributionLever.aoj_cavc_affinity_days + aoj_aod_affinity_lever_value = CaseDistributionLever.aoj_aod_affinity_days + excluded_judges_attorney_ids = excluded_judges_sattyids + + priority_aoj_cdl_query = generate_priority_aoj_case_distribution_lever_query(aoj_cavc_affinity_lever_value) + priority_cdl_aoj_aod_query = generate_priority_case_distribution_lever_aoj_aod_query(aoj_aod_affinity_lever_value) + + query = if use_by_docket_date? && aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.infinite && + aoj_aod_affinity_lever_value == Constants.ACD_LEVERS.infinite + <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where (((VLJ = ? or #{ineligible_judges_sattyid_cache}) and 1 = ?) or (VLJ is null and 1 = ?) + and (PREV_TYPE_ACTION = '7' or AOD = '1') + or ((PREV_DECIDING_JUDGE = ? or #{ineligible_judges_sattyid_cache(true)} + or #{vacols_judges_with_exclude_appeals_from_affinity(excluded_judges_attorney_ids)}) + and (#{priority_aoj_cdl_query} or #{priority_cdl_aoj_aod_query}))) + SQL + elsif use_by_docket_date? + <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where ((VLJ = ? or #{ineligible_judges_sattyid_cache}) and 1 = ?) or (VLJ is null and 1 = ?) + and (PREV_TYPE_ACTION = '7' or AOD = '1') + or #{priority_aoj_cdl_query} or #{priority_cdl_aoj_aod_query} + SQL + else + <<-SQL + #{SELECT_PRIORITY_APPEALS} + where ((VLJ = ? or #{ineligible_judges_sattyid_cache}) and 1 = ?) or (VLJ is null and 1 = ?) + and (PREV_TYPE_ACTION = '7' or AOD = '1') + or #{priority_aoj_cdl_query} or #{priority_cdl_aoj_aod_query} + SQL + end + + fmtd_query = if aoj_cavc_affinity_lever_value != Constants.ACD_LEVERS.infinite && + aoj_aod_affinity_lever_value != Constants.ACD_LEVERS.infinite + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + (genpop == "any" || genpop == "not_genpop") ? 1 : 0, + (genpop == "any" || genpop == "only_genpop") ? 1 : 0, + judge.vacols_attorney_id, + judge.vacols_attorney_id + ]) + else + sanitize_sql_array([ + query, + judge.vacols_attorney_id, + (genpop == "any" || genpop == "not_genpop") ? 1 : 0, + (genpop == "any" || genpop == "only_genpop") ? 1 : 0, + judge.vacols_attorney_id + ]) + end + + distribute_appeals(fmtd_query, judge, limit, dry_run) + end + + # :nocov: + def self.distribute_appeals(query, judge, limit, dry_run) + aoj_cavc_affinity_lever_value = CaseDistributionLever.aoj_cavc_affinity_days + aoj_aod_affinity_lever_value = CaseDistributionLever.aoj_aod_affinity_days + aoj_affinity_lever_value = CaseDistributionLever.aoj_affinity_days + excluded_judges_attorney_ids = excluded_judges_sattyids + judge_sattyid = judge.vacols_attorney_id + + conn = connection + + conn.transaction do + if dry_run + dry_appeals = conn.exec_query(query).to_a + + aoj_affinity_filter(dry_appeals, judge_sattyid, aoj_affinity_lever_value, excluded_judges_attorney_ids) + + aoj_cavc_affinity_filter(dry_appeals, judge_sattyid, aoj_cavc_affinity_lever_value, excluded_judges_attorney_ids) # rubocop:disable Layout/LineLength + + aoj_aod_affinity_filter(dry_appeals, judge_sattyid, aoj_aod_affinity_lever_value, + excluded_judges_attorney_ids) + + dry_appeals + else + conn.execute(LOCK_READY_APPEALS) unless FeatureToggle.enabled?(:acd_disable_legacy_lock_ready_appeals) + + appeals = conn.exec_query(query).to_a + return appeals if appeals.empty? + + aoj_affinity_filter(appeals, judge_sattyid, aoj_affinity_lever_value, excluded_judges_attorney_ids) + + aoj_cavc_affinity_filter(appeals, judge_sattyid, aoj_cavc_affinity_lever_value, excluded_judges_attorney_ids) + + aoj_aod_affinity_filter(appeals, judge_sattyid, aoj_aod_affinity_lever_value, + excluded_judges_attorney_ids) + + appeals.sort_by { |appeal| appeal[:bfd19] } if use_by_docket_date? + + appeals = appeals.first(limit) unless limit.nil? # {Reestablishes the limit} + + vacols_ids = appeals.map { |appeal| appeal["bfkey"] } + location = if FeatureToggle.enabled?(:legacy_das_deprecation, user: RequestStore.store[:current_user]) + LegacyAppeal::LOCATION_CODES[:caseflow] + else + judge.vacols_uniq_id + end + VACOLS::Case.batch_update_vacols_location(location, vacols_ids) + appeals + end + end + end + # rubocop:enable Metrics/AbcSize + + def self.generate_nonpriority_case_distribution_lever_aoj_query(aoj_affinity_lever_value) + if case_affinity_days_lever_value_is_selected?(aoj_affinity_lever_value) || + aoj_affinity_lever_value == Constants.ACD_LEVERS.omit + "((PREV_DECIDING_JUDGE = ? or PREV_DECIDING_JUDGE is null or PREV_DECIDING_JUDGE is not null) + and AOD = '0' and PREV_TYPE_ACTION <> '7' )" + elsif aoj_affinity_lever_value == Constants.ACD_LEVERS.infinite + "(AOD = '0' and PREV_TYPE_ACTION <> '7')" + else + "VLJ = ?" + end + end + + def self.generate_priority_aoj_case_distribution_lever_query(aoj_cavc_affinity_lever_value) + if case_affinity_days_lever_value_is_selected?(aoj_cavc_affinity_lever_value) || + aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.omit + "((PREV_DECIDING_JUDGE = ? or PREV_DECIDING_JUDGE is null or PREV_DECIDING_JUDGE is not null) + and AOD = '0' and PREV_TYPE_ACTION = '7')" + elsif aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.infinite + "(AOD = '0' and PREV_TYPE_ACTION = '7')" + else + "VLJ = ?" + end + end + + def self.generate_priority_case_distribution_lever_aoj_aod_query(aoj_aod_affinity_lever_value) + if case_affinity_days_lever_value_is_selected?(aoj_aod_affinity_lever_value) || + aoj_aod_affinity_lever_value == Constants.ACD_LEVERS.omit + "((PREV_DECIDING_JUDGE = ? or PREV_DECIDING_JUDGE is null or PREV_DECIDING_JUDGE is not null) + and AOD = '1')" + elsif aoj_aod_affinity_lever_value == Constants.ACD_LEVERS.infinite + "(AOD = '1')" + else + "VLJ = ?" + end + end + + def self.filter_genpop_appeals_for_affinity(query) + aoj_cavc_affinity_lever_value = CaseDistributionLever.aoj_cavc_affinity_days + aoj_aod_affinity_lever_value = CaseDistributionLever.aoj_aod_affinity_days + aoj_affinity_lever_value = CaseDistributionLever.aoj_affinity_days + excluded_judges_attorney_ids = excluded_judges_sattyids + + conn = connection + + appeals = conn.exec_query(query).to_a + + aoj_affinity_filter(appeals, nil, aoj_affinity_lever_value, excluded_judges_attorney_ids) + + aoj_cavc_affinity_filter(appeals, nil, aoj_cavc_affinity_lever_value, excluded_judges_attorney_ids) + + aoj_aod_affinity_filter(appeals, nil, aoj_aod_affinity_lever_value, + excluded_judges_attorney_ids) + + appeals + end + + # rubocop:disable Metrics/AbcSize + def self.aoj_affinity_filter(appeals, judge_sattyid, lever_value, excluded_judges_attorney_ids) + appeals.reject! do |appeal| + # {will skip if not AOJ AOD || if AOJ AOD being distributed to tied_to judge || if not tied to any judge} + next if tied_to_or_not_aoj_nonpriority?(appeal, judge_sattyid) + + if not_distributing_to_tied_judge?(appeal, judge_sattyid) + next if ineligible_judges_sattyids&.include?(appeal["vlj"]) + + next (appeal["vlj"] != judge_sattyid) + end + + if appeal_has_hearing_after_previous_decision?(appeal) + next if appeal["vlj"] == judge_sattyid + next true if !ineligible_judges_sattyids.include?(appeal["vlj"]) + end + + next true if appeal["prev_deciding_judge"].nil? && !ineligible_judges_sattyids.include?(appeal["vlj"]) + + next if ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney_ids) + + if case_affinity_days_lever_value_is_selected?(lever_value) + next if appeal["prev_deciding_judge"] == judge_sattyid + + reject_due_to_affinity?(appeal, lever_value) + elsif lever_value == Constants.ACD_LEVERS.infinite + next if deciding_judge_ineligible_with_no_hearings_after_decision(appeal) || appeal["prev_deciding_judge"].nil? + + appeal["prev_deciding_judge"] != judge_sattyid + elsif lever_value == Constants.ACD_LEVERS.omit + appeal["prev_deciding_judge"] == appeal["vlj"] + end + end + end + + def self.aoj_cavc_affinity_filter(appeals, judge_sattyid, aoj_cavc_affinity_lever_value, excluded_judges_attorney_ids) + appeals.reject! do |appeal| + next if tied_to_or_not_cavc?(appeal, judge_sattyid) + + if not_distributing_to_tied_judge?(appeal, judge_sattyid) + next if ineligible_judges_sattyids.include?(appeal["vlj"]) + + next (appeal["vlj"] != judge_sattyid) + end + + if appeal_has_hearing_after_previous_decision?(appeal) + next if appeal["vlj"] == judge_sattyid + next true if !ineligible_judges_sattyids.include?(appeal["vlj"]) + end + + next true if appeal["prev_deciding_judge"].nil? && !ineligible_judges_sattyids.include?(appeal["vlj"]) + + next if ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney_ids) + + if case_affinity_days_lever_value_is_selected?(aoj_cavc_affinity_lever_value) + next if appeal["prev_deciding_judge"] == judge_sattyid + + reject_due_to_affinity?(appeal, aoj_cavc_affinity_lever_value) + elsif aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.infinite + next if deciding_judge_ineligible_with_no_hearings_after_decision(appeal) || appeal["prev_deciding_judge"].nil? + + appeal["prev_deciding_judge"] != judge_sattyid + elsif aoj_cavc_affinity_lever_value == Constants.ACD_LEVERS.omit + appeal["prev_deciding_judge"] == appeal["vlj"] + end + end + end + + def self.aoj_aod_affinity_filter(appeals, judge_sattyid, lever_value, excluded_judges_attorney_ids) + appeals.reject! do |appeal| + # {will skip if not AOJ AOD || if AOJ AOD being distributed to tied_to judge || if not tied to any judge} + next if tied_to_or_not_aoj_aod?(appeal, judge_sattyid) + + if not_distributing_to_tied_judge?(appeal, judge_sattyid) + next if ineligible_judges_sattyids&.include?(appeal["vlj"]) + + next (appeal["vlj"] != judge_sattyid) + end + + if appeal_has_hearing_after_previous_decision?(appeal) + next if appeal["vlj"] == judge_sattyid + next true if !ineligible_judges_sattyids.include?(appeal["vlj"]) + end + + next true if appeal["prev_deciding_judge"].nil? && !ineligible_judges_sattyids.include?(appeal["vlj"]) + + next if ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney_ids) + + if case_affinity_days_lever_value_is_selected?(lever_value) + next if appeal["prev_deciding_judge"] == judge_sattyid + + reject_due_to_affinity?(appeal, lever_value) + elsif lever_value == Constants.ACD_LEVERS.infinite + next if deciding_judge_ineligible_with_no_hearings_after_decision(appeal) || appeal["prev_deciding_judge"].nil? + + appeal["prev_deciding_judge"] != judge_sattyid + elsif lever_value == Constants.ACD_LEVERS.omit + appeal["prev_deciding_judge"] == appeal["vlj"] + end + end + end + # rubocop:enable Metrics/AbcSize + + def self.tied_to_or_not_aoj_nonpriority?(appeal, judge_sattyid) + (appeal["prev_type_action"] == "7" || appeal["aod"] == 1) || + (appeal["prev_type_action"] != "7" && appeal["aod"] == 0 && + !appeal["vlj"].blank? && + (appeal["vlj"] == appeal["prev_deciding_judge"] || appeal["prev_deciding_judge"].nil?) && + appeal["vlj"] == judge_sattyid) || + (appeal["vlj"].nil? && appeal["prev_deciding_judge"].nil?) + end + + def self.tied_to_or_not_cavc?(appeal, judge_sattyid) + (appeal["prev_type_action"] != "7" || appeal["aod"] != 0) || + (appeal["prev_type_action"] == "7" && appeal["aod"] == 0 && + !appeal["vlj"].blank? && + (appeal["vlj"] == appeal["prev_deciding_judge"] || appeal["prev_deciding_judge"].nil?) && + appeal["vlj"] == judge_sattyid) || + (appeal["vlj"].nil? && appeal["prev_deciding_judge"].nil?) + end + + def self.tied_to_or_not_aoj_aod?(appeal, judge_sattyid) + (appeal["aod"] != 1) || + (appeal["aod"] == 1 && + !appeal["vlj"].blank? && + (appeal["vlj"] == appeal["prev_deciding_judge"] || appeal["prev_deciding_judge"].nil?) && + appeal["vlj"] == judge_sattyid) || + (appeal["vlj"].nil? && appeal["prev_deciding_judge"].nil?) + end + + def self.ineligible_judges_sattyids + Rails.cache.fetch("case_distribution_ineligible_judges")&.pluck(:sattyid)&.reject(&:blank?) || [] + end + + def self.excluded_judges_sattyids + VACOLS::Staff.where(sdomainid: JudgeTeam.active + .where(exclude_appeals_from_affinity: true) + .flat_map(&:judge).compact.pluck(:css_id))&.pluck(:sattyid) + end + # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/ParameterLists, Metrics/MethodLength + + # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity + def self.priority_appeals_affinity_date_count(in_window) + conn = connection + aoj_cavc_affinity_lever_value = CaseDistributionLever.aoj_cavc_affinity_days + aoj_aod_affinity_lever_value = CaseDistributionLever.aoj_aod_affinity_days + + query = <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + where (PREV_TYPE_ACTION = '7' or AOD = '1') + SQL + + fmtd_query = sanitize_sql_array([query]) + + appeals = conn.exec_query(fmtd_query).to_a + if in_window + appeals.select! do |appeal| + if appeal["prev_type_action"] == "7" && appeal["aod"] == "0" + reject_due_to_affinity?(appeal, aoj_cavc_affinity_lever_value) + else + reject_due_to_affinity?(appeal, aoj_aod_affinity_lever_value) + end + end + else + appeals.reject! do |appeal| + if appeal["prev_type_action"] == "7" && appeal["aod"] == "0" + reject_due_to_affinity?(appeal, aoj_cavc_affinity_lever_value) + else + reject_due_to_affinity?(appeal, aoj_aod_affinity_lever_value) + end + end + end + appeals + end + # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity + + def self.non_priority_appeals_affinity_date_count(in_window) + conn = connection + aoj_affinity_lever_value = CaseDistributionLever.aoj_affinity_days + + query = <<-SQL + #{SELECT_NONPRIORITY_APPEALS_ORDER_BY_BFD19} + where ((PREV_TYPE_ACTION is null or PREV_TYPE_ACTION <> '7') and AOD = '0') + SQL + + fmtd_query = sanitize_sql_array([query]) + + appeals = conn.exec_query(fmtd_query).to_a + + if in_window + appeals.select! do |appeal| + reject_due_to_affinity?(appeal, aoj_affinity_lever_value) && !appeal["prev_deciding_judge"].nil? && + appeal["prev_deciding_judge"] != appeal["vlj"] + end + else + appeals.reject! do |appeal| + reject_due_to_affinity?(appeal, aoj_affinity_lever_value) && !appeal["prev_deciding_judge"].nil? && + appeal["prev_deciding_judge"] != appeal["vlj"] + end + end + appeals + end + + def self.appeals_tied_to_non_ssc_avljs + query = <<-SQL + with non_ssc_avljs as ( + #{VACOLS::Staff::NON_SSC_AVLJS} + ) + #{SELECT_READY_TO_DISTRIBUTE_APPEALS_ORDER_BY_BFD19} + where APPEALS.VLJ in (select * from non_ssc_avljs) + and ( + APPEALS.PREV_DECIDING_JUDGE is null or + ( + APPEALS.PREV_DECIDING_JUDGE = APPEALS.VLJ + AND APPEALS.HEARING_DATE <= APPEALS.PREV_BFDDEC + ) + ) + order by BFD19 + SQL + + fmtd_query = sanitize_sql_array([query]) + connection.exec_query(fmtd_query).to_a + end +end diff --git a/app/models/vacols/case_docket.rb b/app/models/vacols/case_docket.rb index 65c08422380..c24a0f148a7 100644 --- a/app/models/vacols/case_docket.rb +++ b/app/models/vacols/case_docket.rb @@ -71,7 +71,7 @@ class DocketNumberCentennialLoop < StandardError; end where BRIEFF.BFMPRO = 'ACT' and BRIEFF.BFCURLOC in ('81', '83') and BRIEFF.BFBOX is null - and BRIEFF.BFAC is not null + and BRIEFF.BFAC <> '3' and BRIEFF.BFD19 is not null and MAIL_BLOCKS_DISTRIBUTION = 0 and DIARY_BLOCKS_DISTRIBUTION = 0 @@ -115,7 +115,8 @@ class DocketNumberCentennialLoop < StandardError; end F.TITRNUM as PREV_TITRNUM from BRIEFF B inner join FOLDER F on F.TICKNUM = B.BFKEY - where B.BFMPRO = 'HIS' and B.BFMEMID not in ('000', '888', '999') and B.BFATTID is not null + + where B.BFMPRO = 'HIS' ) PREV_APPEAL on PREV_APPEAL.PREV_BFKEY != BRIEFF.BFKEY and PREV_APPEAL.PREV_BFCORLID = BRIEFF.BFCORLID and PREV_APPEAL.PREV_TINUM = BRIEFF.TINUM and PREV_APPEAL.PREV_TITRNUM = BRIEFF.TITRNUM @@ -279,7 +280,7 @@ def self.counts_by_priority_and_readiness query = <<-SQL select count(*) N, PRIORITY, READY from ( - select case when BFAC = '7' or nvl(AOD_DIARIES.CNT, 0) + nvl(AOD_HEARINGS.CNT, 0) > 0 then 1 else 0 end as PRIORITY, + select case when BFAC <> '3' and (BFAC = '7' or nvl(AOD_DIARIES.CNT, 0) + nvl(AOD_HEARINGS.CNT, 0) > 0) then 1 else 0 end as PRIORITY, case when BFCURLOC in ('81', '83') and MAIL_BLOCKS_DISTRIBUTION = 0 and DIARY_BLOCKS_DISTRIBUTION = 0 then 1 else 0 end as READY from BRIEFF @@ -310,10 +311,10 @@ def self.counts_by_priority_and_readiness def self.genpop_priority_count query = <<-SQL #{SELECT_PRIORITY_APPEALS} - where VLJ is null or #{ineligible_judges_sattyid_cache} + where VLJ is null or VLJ != PREV_DECIDING_JUDGE or #{ineligible_judges_sattyid_cache} SQL - connection.exec_query(query).to_a.size + filter_genpop_appeals_for_affinity(query).size end def self.not_genpop_priority_count @@ -617,7 +618,7 @@ def self.update_appeal_affinity_dates_query(priority, date) PREV_DECIDING_JUDGE from ( select BFKEY, BRIEFF.TINUM, BFD19, BFDLOOUT, BFAC, BFCORKEY, AOD, BFCORLID, - case when BFHINES is null or BFHINES <> 'GP' then VLJ_HEARINGS.VLJ end VLJ, + VLJ_HEARINGS.VLJ, PREV_APPEAL.PREV_TYPE_ACTION PREV_TYPE_ACTION, PREV_APPEAL.PREV_DECIDING_JUDGE PREV_DECIDING_JUDGE from ( @@ -784,6 +785,22 @@ def self.distribute_appeals(query, judge, limit, dry_run) end # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/ParameterLists + def self.filter_genpop_appeals_for_affinity(query) + cavc_affinity_lever_value = CaseDistributionLever.cavc_affinity_days + cavc_aod_affinity_lever_value = CaseDistributionLever.cavc_aod_affinity_days + excluded_judges_attorney_ids = excluded_judges_sattyids + + conn = connection + + appeals = conn.exec_query(query).to_a + + cavc_affinity_filter(appeals, nil, cavc_affinity_lever_value, excluded_judges_attorney_ids) + cavc_aod_affinity_filter(appeals, nil, cavc_aod_affinity_lever_value, + excluded_judges_attorney_ids) + + appeals + end + def self.generate_priority_case_distribution_lever_query(cavc_affinity_lever_value) if case_affinity_days_lever_value_is_selected?(cavc_affinity_lever_value) || cavc_affinity_lever_value == Constants.ACD_LEVERS.omit @@ -828,6 +845,8 @@ def self.cavc_affinity_filter(appeals, judge_sattyid, cavc_affinity_lever_value, next true if !ineligible_judges_sattyids.include?(appeal["vlj"]) end + next true if appeal["prev_deciding_judge"].nil? && !ineligible_judges_sattyids.include?(appeal["vlj"]) + next if ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney_ids) if case_affinity_days_lever_value_is_selected?(cavc_affinity_lever_value) @@ -835,7 +854,7 @@ def self.cavc_affinity_filter(appeals, judge_sattyid, cavc_affinity_lever_value, reject_due_to_affinity?(appeal, cavc_affinity_lever_value) elsif cavc_affinity_lever_value == Constants.ACD_LEVERS.infinite - next if hearing_judge_ineligible_with_no_hearings_after_decision(appeal) + next if deciding_judge_ineligible_with_no_hearings_after_decision(appeal) || appeal["prev_deciding_judge"].nil? appeal["prev_deciding_judge"] != judge_sattyid elsif cavc_affinity_lever_value == Constants.ACD_LEVERS.omit @@ -860,6 +879,8 @@ def self.cavc_aod_affinity_filter(appeals, judge_sattyid, cavc_aod_affinity_leve next true if !ineligible_judges_sattyids.include?(appeal["vlj"]) end + next true if appeal["prev_deciding_judge"].nil? && !ineligible_judges_sattyids.include?(appeal["vlj"]) + next if ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney_ids) if case_affinity_days_lever_value_is_selected?(cavc_aod_affinity_lever_value) @@ -867,7 +888,7 @@ def self.cavc_aod_affinity_filter(appeals, judge_sattyid, cavc_aod_affinity_leve reject_due_to_affinity?(appeal, cavc_aod_affinity_lever_value) elsif cavc_aod_affinity_lever_value == Constants.ACD_LEVERS.infinite - next if hearing_judge_ineligible_with_no_hearings_after_decision(appeal) + next if deciding_judge_ineligible_with_no_hearings_after_decision(appeal) || appeal["prev_deciding_judge"].nil? appeal["prev_deciding_judge"] != judge_sattyid elsif cavc_aod_affinity_lever_value == Constants.ACD_LEVERS.omit @@ -915,14 +936,14 @@ def self.ineligible_or_excluded_deciding_judge?(appeal, excluded_judges_attorney end def self.reject_due_to_affinity?(appeal, lever) - VACOLS::Case.find_by(bfkey: appeal["bfkey"])&.appeal_affinity&.affinity_start_date.nil? || - (VACOLS::Case.find_by(bfkey: appeal["bfkey"]) - .appeal_affinity - .affinity_start_date > lever.to_i.days.ago) + appeal_affinity = VACOLS::Case.find_by(bfkey: appeal["bfkey"])&.appeal_affinity + appeal_affinity&.affinity_start_date.nil? || + (appeal_affinity.affinity_start_date > lever.to_i.days.ago) end - def self.hearing_judge_ineligible_with_no_hearings_after_decision(appeal) - ineligible_judges_sattyids&.include?(appeal["vlj"]) && !appeal_has_hearing_after_previous_decision?(appeal) + def self.deciding_judge_ineligible_with_no_hearings_after_decision(appeal) + ineligible_judges_sattyids&.include?(appeal["prev_deciding_judge"]) && + !appeal_has_hearing_after_previous_decision?(appeal) end def self.ineligible_judges_sattyids @@ -989,5 +1010,44 @@ def self.case_affinity_days_lever_value_is_selected?(lever_value) true end + + # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize + def self.priority_appeals_affinity_date_count(in_window) + conn = connection + cavc_affinity_lever_value = CaseDistributionLever.cavc_affinity_days + cavc_aod_affinity_lever_value = CaseDistributionLever.cavc_aod_affinity_days + + query = <<-SQL + #{SELECT_PRIORITY_APPEALS_ORDER_BY_BFD19} + SQL + + fmtd_query = sanitize_sql_array([query]) + + appeals = conn.exec_query(fmtd_query).to_a + + if in_window + appeals.select! do |appeal| + if appeal["bfac"] == "7" && appeal["aod"] == 0 + reject_due_to_affinity?(appeal, cavc_affinity_lever_value) + elsif appeal["bfac"] == "7" && appeal["aod"] == 1 + reject_due_to_affinity?(appeal, cavc_aod_affinity_lever_value) + elsif appeal["bfac"] != "7" + false + end + end + else + appeals.reject! do |appeal| + if appeal["bfac"] == "7" && appeal["aod"] == 0 + reject_due_to_affinity?(appeal, cavc_affinity_lever_value) + elsif appeal["bfac"] == "7" && appeal["aod"] == 1 + reject_due_to_affinity?(appeal, cavc_aod_affinity_lever_value) + elsif appeal["bfac"] != "7" + false + end + end + end + appeals + end + # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize end # rubocop:enable Metrics/ClassLength diff --git a/app/queries/appeals_distributed.rb b/app/queries/appeals_distributed.rb index d0e002cdf69..079a57b6db2 100644 --- a/app/queries/appeals_distributed.rb +++ b/app/queries/appeals_distributed.rb @@ -10,9 +10,11 @@ class AppealsDistributed receipt_date: "Receipt Date", ready_for_distribution_at: "Ready for Distribution at", distributed_at: "Distributed At", + original_judge: "Original Judge", hearing_judge: "Hearing Judge", veteran_file_number: "Veteran File number", - veteran_name: "Veteran" + veteran_name: "Veteran", + affinity_start_date: "Affinity Start Date" }.freeze def self.generate_rows(record) @@ -73,9 +75,11 @@ def self.ama_appeal(appeal, distributed_cases) receipt_date: appeal.receipt_date, ready_for_distribution_at: distributed_case.ready_at, distributed_at: distributed_case.created_at, + original_judge: appeal.cavc? ? ama_cavc_original_deciding_judge(appeal) : nil, hearing_judge: hearing_judge, veteran_file_number: appeal.veteran_file_number, - veteran_name: appeal.veteran&.name.to_s + veteran_name: appeal.veteran&.name.to_s, + affinity_start_date: appeal.appeal_affinity&.affinity_start_date } end @@ -94,11 +98,16 @@ def self.normalize_vacols_date(datetime) end # For each Legacy appeal get its distributed case and use ActiveRecord relationships to get fields + # rubocop:disable Metrics/AbcSize, Metrics/MethodLength def self.legacy_appeal(case_record, aod, distributed_cases) distributed_case = distributed_cases.filter { |dc| dc.case_id == case_record.bfkey }.first correspondent_record = case_record.correspondent folder_record = case_record.folder + judge_mem_id = VACOLS::Case.includes(:folder).where(folder: { tinum: folder_record.tinum }, + bfddec: case_record.bfdpdcn).first.bfmemid + original_judge = VACOLS::Staff.find_by(sattyid: judge_mem_id) veteran_name = FullName.new(correspondent_record.snamef, nil, correspondent_record.snamel).to_s + appeal_affinity = case_record.appeal_affinity { docket_number: folder_record.tinum, @@ -108,9 +117,19 @@ def self.legacy_appeal(case_record, aod, distributed_cases) receipt_date: normalize_vacols_date(case_record.bfd19), ready_for_distribution_at: distributed_case.ready_at, distributed_at: distributed_case.created_at, + original_judge: original_judge&.sdomainid, hearing_judge: case_record.case_hearings.first&.staff&.sdomainid, veteran_file_number: correspondent_record.ssn || case_record.bfcorlid, - veteran_name: veteran_name + veteran_name: veteran_name, + affinity_start_date: appeal_affinity&.affinity_start_date } end + # rubocop:enable Metrics/AbcSize, Metrics/MethodLength + + def self.ama_cavc_original_deciding_judge(appeal) + source_appeal_id = CavcRemand.find_by(remand_appeal: appeal).source_appeal_id + + Task.find_by(appeal_id: source_appeal_id, appeal_type: Appeal.name, type: JudgeDecisionReviewTask.name) + &.assigned_to&.css_id + end end diff --git a/app/queries/appeals_non_priority_ready_for_distribution.rb b/app/queries/appeals_non_priority_ready_for_distribution.rb index 24808e25c0e..3fb11dcce2e 100644 --- a/app/queries/appeals_non_priority_ready_for_distribution.rb +++ b/app/queries/appeals_non_priority_ready_for_distribution.rb @@ -45,7 +45,7 @@ def self.ready_appeals # appeals = docket.ready_to_distribute_appeals.select { |appeal| appeal["aod"] == 0 } # legacy_rows(appeals, docket, sym) else - appeals = docket.ready_priority_nonpriority_appeals(priority: false, ready: true) + appeals = docket.ready_priority_nonpriority_appeals(priority: false, ready: true, not_affinity: true) ama_rows(appeals, docket, sym) end end diff --git a/app/queries/appeals_ready_for_distribution.rb b/app/queries/appeals_ready_for_distribution.rb index 4a757857ef6..15585a5190c 100644 --- a/app/queries/appeals_ready_for_distribution.rb +++ b/app/queries/appeals_ready_for_distribution.rb @@ -45,7 +45,7 @@ def self.ready_appeals docket_coordinator.dockets .flat_map do |sym, docket| appeals = docket.ready_to_distribute_appeals - if sym == :legacy + if [:legacy, :aoj_legacy].include?(sym) legacy_rows(appeals, sym) else ama_rows(appeals, docket, sym) @@ -150,11 +150,15 @@ def self.ama_cavc_original_deciding_judge(appeal) end def self.legacy_original_deciding_judge(appeal) + return if appeal["prev_deciding_judge"].nil? + staff = VACOLS::Staff.find_by(sattyid: appeal["prev_deciding_judge"]) staff&.sdomainid || appeal["prev_deciding_judge"] end def self.legacy_original_deciding_judge_name(appeal) + return nil if appeal["prev_deciding_judge"].nil? + staff = VACOLS::Staff.find_by(sattyid: appeal["prev_deciding_judge"]) FullName.new(staff["snamef"], nil, staff["snamel"]).to_s if !staff.nil? end diff --git a/app/repositories/aoj_appeal_repository.rb b/app/repositories/aoj_appeal_repository.rb new file mode 100644 index 00000000000..c1009d4434b --- /dev/null +++ b/app/repositories/aoj_appeal_repository.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +class AojAppealRepository < AppealRepository + # :nocov: + + class << self + def docket_counts_by_priority_and_readiness + MetricsService.record("VACOLS: docket_counts_by_priority_and_readiness", + name: "docket_counts_by_priority_and_readiness", + service: :vacols) do + VACOLS::AojCaseDocket.counts_by_priority_and_readiness + end + end + + def genpop_priority_count + MetricsService.record("VACOLS: genpop_priority_count", + name: "genpop_priority_count", + service: :vacols) do + VACOLS::AojCaseDocket.genpop_priority_count + end + end + + def not_genpop_priority_count + MetricsService.record("VACOLS: not_genpop_priority_count", + name: "not_genpop_priority_count", + service: :vacols) do + VACOLS::AojCaseDocket.not_genpop_priority_count + end + end + + def priority_ready_appeal_vacols_ids + MetricsService.record("VACOLS: priority_ready_appeal_vacols_ids", + name: "priority_ready_appeal_vacols_ids", + service: :vacols) do + VACOLS::AojCaseDocket.priority_ready_appeal_vacols_ids + end + end + + def age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) + MetricsService.record("VACOLS: age_of_n_oldest_nonpriority_appeals_available_to_judge", + name: "age_of_n_oldest_nonpriority_appeals_available_to_judge", + service: :vacols) do + VACOLS::AojCaseDocket.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, num) + end + end + + def age_of_oldest_priority_appeal + MetricsService.record("VACOLS: age_of_oldest_priority_appeal", + name: "age_of_oldest_priority_appeal", + service: :vacols) do + VACOLS::AojCaseDocket.age_of_oldest_priority_appeal + end + end + + def age_of_oldest_priority_appeal_by_docket_date + MetricsService.record("VACOLS: age_of_oldest_priority_appeal", + name: "age_of_oldest_priority_appeal", + service: :vacols) do + VACOLS::AojCaseDocket.age_of_oldest_priority_appeal_by_docket_date + end + end + + def age_of_n_oldest_priority_appeals_available_to_judge(judge, num) + MetricsService.record("VACOLS: age_of_n_oldest_priority_appeals_available_to_judge", + name: "age_of_n_oldest_priority_appeals_available_to_judge", + service: :vacols) do + VACOLS::AojCaseDocket.age_of_n_oldest_priority_appeals_available_to_judge(judge, num) + end + end + + def distribute_priority_appeals(judge, genpop, limit) + MetricsService.record("VACOLS: distribute_priority_appeals", + name: "distribute_priority_appeals", + service: :vacols) do + VACOLS::AojCaseDocket.distribute_priority_appeals(judge, genpop, limit) + end + end + + def distribute_nonpriority_appeals(judge, genpop, range, limit, bust_backlog) + MetricsService.record("VACOLS: distribute_nonpriority_appeals", + name: "distribute_nonpriority_appeals", + service: :vacols) do + VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, genpop, range, limit, bust_backlog) + end + end + + def ready_to_distribute_appeals + MetricsService.record("VACOLS: ready_to_distribute_appeals", + name: "ready_to_distribute_appeals", + service: :vacols) do + VACOLS::AojCaseDocket.ready_to_distribute_appeals + end + end + + def priority_appeals_affinity_date_count(in_window) + MetricsService.record("VACOLS: priority_appeals_affinity_date_count", + name: "priority_appeals_affinity_date_count", + service: :vacols) do + VACOLS::AojCaseDocket.priority_appeals_affinity_date_count(in_window) + end + end + + def non_priority_appeals_affinity_date_count(in_window) + MetricsService.record("VACOLS: non_priority_appeals_affinity_date_count", + name: "non_priority_appeals_affinity_date_count", + service: :vacols) do + VACOLS::AojCaseDocket.non_priority_appeals_affinity_date_count(in_window) + end + end + + def appeals_tied_to_non_ssc_avljs + MetricsService.record("VACOLS: appeals_tied_to_non_ssc_avljs", + name: "appeals_tied_to_non_ssc_avljs", + service: :vacols) do + VACOLS::AojCaseDocket.appeals_tied_to_non_ssc_avljs + end + end + end + # :nocov: +end diff --git a/app/repositories/appeal_repository.rb b/app/repositories/appeal_repository.rb index a5385e95883..984ca39e409 100644 --- a/app/repositories/appeal_repository.rb +++ b/app/repositories/appeal_repository.rb @@ -881,6 +881,14 @@ def loc_63_appeals end end + def priority_appeals_affinity_date_count(in_window) + MetricsService.record("VACOLS: priority_appeals_affinity_date_count", + name: "priority_appeals_affinity_date_count", + service: :vacols) do + VACOLS::CaseDocket.priority_appeals_affinity_date_count(in_window) + end + end + private # NOTE: this should be called within a transaction where you are closing an appeal diff --git a/app/serializers/distribution_serializer.rb b/app/serializers/distribution_serializer.rb index 8e56968cda7..004b18585ab 100644 --- a/app/serializers/distribution_serializer.rb +++ b/app/serializers/distribution_serializer.rb @@ -5,6 +5,7 @@ class DistributionSerializer attribute :distributed_cases_count attributes :id, :created_at, :updated_at, :status + attribute :distribution_stats, if: proc { !Rails.in_upper_env? } def as_json serializable_hash[:data][:attributes] diff --git a/db/etl_schema.rb b/db/etl_schema.rb index e7cbfc58989..29c81a2b524 100644 --- a/db/etl_schema.rb +++ b/db/etl_schema.rb @@ -2,8 +2,8 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# This file is the source Rails uses to define your schema when running `rails -# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. diff --git a/db/migrate/20240829153134_add_aoj_legacy_priority_stats_to_distribution_stats.rb b/db/migrate/20240829153134_add_aoj_legacy_priority_stats_to_distribution_stats.rb new file mode 100644 index 00000000000..f95391323f9 --- /dev/null +++ b/db/migrate/20240829153134_add_aoj_legacy_priority_stats_to_distribution_stats.rb @@ -0,0 +1,8 @@ +class AddAojLegacyPriorityStatsToDistributionStats < ActiveRecord::Migration[6.0] + def change + safety_assured do + add_column :distribution_stats, :aoj_legacy_priority_stats, :json, comment: "Priority statistics for AOJ Legacy Docket" + add_column :distribution_stats, :aoj_legacy_stats, :json, comment: "Statistics for AOJ Legacy Docket" + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 05cf81425a5..fffcd4b074f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,15 +2,15 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# This file is the source Rails uses to define your schema when running `rails -# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2024_08_28_165652) do +ActiveRecord::Schema.define(version: 2024_08_29_153134) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -729,6 +729,8 @@ end create_table "distribution_stats", comment: "A database table to store a snapshot of variables used during a case distribution event", force: :cascade do |t| + t.json "aoj_legacy_priority_stats", comment: "Priority statistics for AOJ Legacy Docket" + t.json "aoj_legacy_stats", comment: "Statistics for AOJ Legacy Docket" t.datetime "created_at", null: false t.json "direct_review_priority_stats", comment: "Priority statistics for Direct Review Docket" t.json "direct_review_stats", comment: "Statistics for Direct Review Docket" @@ -2144,46 +2146,6 @@ t.index ["vbms_communication_package_id"], name: "index_vbms_distributions_on_vbms_communication_package_id" end - create_table "vbms_ext_claim", primary_key: "CLAIM_ID", id: :decimal, precision: 38, force: :cascade do |t| - t.string "ALLOW_POA_ACCESS", limit: 5 - t.decimal "CLAIMANT_PERSON_ID", precision: 38 - t.datetime "CLAIM_DATE" - t.string "CLAIM_SOJ", limit: 25 - t.integer "CONTENTION_COUNT" - t.datetime "CREATEDDT", null: false - t.string "EP_CODE", limit: 25 - t.datetime "ESTABLISHMENT_DATE" - t.datetime "EXPIRATIONDT" - t.string "INTAKE_SITE", limit: 25 - t.datetime "LASTUPDATEDT", null: false - t.string "LEVEL_STATUS_CODE", limit: 25 - t.datetime "LIFECYCLE_STATUS_CHANGE_DATE" - t.string "LIFECYCLE_STATUS_NAME", limit: 50 - t.string "ORGANIZATION_NAME", limit: 100 - t.string "ORGANIZATION_SOJ", limit: 25 - t.string "PAYEE_CODE", limit: 25 - t.string "POA_CODE", limit: 25 - t.integer "PREVENT_AUDIT_TRIG", limit: 2, default: 0, null: false - t.string "PRE_DISCHARGE_IND", limit: 5 - t.string "PRE_DISCHARGE_TYPE_CODE", limit: 10 - t.string "PRIORITY", limit: 10 - t.string "PROGRAM_TYPE_CODE", limit: 10 - t.string "RATING_SOJ", limit: 25 - t.string "SERVICE_TYPE_CODE", limit: 10 - t.string "SUBMITTER_APPLICATION_CODE", limit: 25 - t.string "SUBMITTER_ROLE_CODE", limit: 25 - t.datetime "SUSPENSE_DATE" - t.string "SUSPENSE_REASON_CODE", limit: 25 - t.string "SUSPENSE_REASON_COMMENTS", limit: 1000 - t.decimal "SYNC_ID", precision: 38, null: false - t.string "TEMPORARY_CLAIM_SOJ", limit: 25 - t.string "TYPE_CODE", limit: 25 - t.decimal "VERSION", precision: 38, null: false - t.decimal "VETERAN_PERSON_ID", precision: 15 - t.index ["CLAIM_ID"], name: "claim_id_index" - t.index ["LEVEL_STATUS_CODE"], name: "level_status_code_index" - end - create_table "vbms_uploaded_documents", force: :cascade do |t| t.bigint "appeal_id", comment: "Appeal/LegacyAppeal ID; use as FK to appeals/legacy_appeals" t.string "appeal_type", comment: "'Appeal' or 'LegacyAppeal'" diff --git a/db/seeds/aoj_remand_return_legacy_appeals.rb b/db/seeds/aoj_remand_return_legacy_appeals.rb new file mode 100644 index 00000000000..630c93a73d3 --- /dev/null +++ b/db/seeds/aoj_remand_return_legacy_appeals.rb @@ -0,0 +1,931 @@ +# frozen_string_literal: true + +module Seeds + class AojRemandReturnLegacyAppeals < Base + def initialize + RequestStore[:current_user] = User.system_user + initialize_ssn + end + + def seed! + create_aoj_cavc_affinity_cases + create_aoj_aod_affinity_cases + create_aoj_affinity_cases + end + + private + + def initialize_ssn + @ssn ||= 210_000_000 + # n is (@file_number + 1) because @file_number is incremented before using it in factories in calling methods + while VACOLS::Correspondent.find_by(ssn: format("%09d", n: @ssn + 1)) + @ssn += 1000 + end + end + + def create_correspondent(options = {}) + @ssn += 1 unless options[:ssn] + + params = { + stafkey: @ssn, + ssn: @ssn, + susrtyp: "VETERAN", + ssalut: nil, + snamef: !options[:snamef].nil? ? options[:snamef] : Faker::Name.first_name, + snamemi: Faker::Name.initials(number: 1), + snamel: !options[:snamel].nil? ? options[:snamel] : Faker::Name.last_name, + saddrst1: Faker::Address.street_name.first(20), + saddrcty: Faker::Address.city.first(20), + saddrstt: Faker::Address.state_abbr, + saddrzip: Faker::Address.zip, + staduser: "FAKEUSER", + stadtime: 10.years.ago.to_datetime, + sdob: 50.years.ago, + sgender: Faker::Gender.short_binary_type + } + + correspondent = VACOLS::Correspondent.find_by(ssn: options[:ssn] || @ssn) || create(:correspondent, params.merge(options)) + + unless Veteran.find_by(ssn: @ssn) + create( + :veteran, + first_name: correspondent.snamef, + last_name: correspondent.snamel, + name_suffix: correspondent.ssalut, + ssn: correspondent.ssn, + participant_id: correspondent.ssn, + file_number: correspondent.ssn + ) + end + + correspondent + end + + def create_aoj_cavc_affinity_cases + create_cases_for_aoj_cavc_affinity_days_lever + create_cases_for_aoj_cavc_affinity_days_lever_excluded_judge + create_cases_for_aoj_cavc_affinity_days_lever_ineligible_judge + create_cases_for_aoj_cavc_with_hearing_after_decision + end + + def create_aoj_aod_affinity_cases + create_cases_for_aoj_aod_affinty_days_lever + create_cases_for_aoj_aod_affinty_days_lever_excluded_judge + create_cases_for_aoj_aod_affinity_days_lever_ineligible_judge + create_cases_for_aoj_aod_with_hearing_after_decision + end + + def create_aoj_affinity_cases + create_cases_for_aoj_affinity_days_lever + create_cases_for_aoj_affinity_days_lever_excluded_judge + create_cases_for_aoj_affinity_days_lever_ineligible_judge + create_cases_for_aoj_with_hearing_after_decision + end + + def affinity_judge + @affinity_judge ||= VACOLS::Staff.find_by_sdomainid("BVAGSPORER") + end + + def tied_to_judge + @tied_to_judge ||= VACOLS::Staff.find_by_sdomainid("BVABDANIEL") + end + + def affinity_and_tied_to_judge + @affinity_and_tied_to_judge ||= VACOLS::Staff.find_by_sdomainid("BVAEEMARD") + end + + def excluded_judge + @excluded_judge ||= find_or_create_active_excluded_judge("EXCL_JUDGE", "Excluded FromAffinity Judge") + end + + def ineligible_judge + @ineligible_judge ||= find_or_create_ineligible_judge("INEL_JUDGE", "Ineligible Vacols Judge") + end + + def attorney + @attorney ||= find_or_create_attorney("AFF_ATTY", "Affinity Cases Attorney") + end + + def other_judge + @other_judge ||= find_or_create_other_judge("OTHER_JUDGE", "Other Affinity Judge") + end + + def find_or_create_ineligible_judge(sdomainid, full_name) + VACOLS::Staff.find_by_sdomainid(sdomainid) || ( + user = create(:user, :judge, :with_inactive_vacols_judge_record, css_id: sdomainid, full_name: full_name) + VACOLS::Staff.find_by_sdomainid(user.css_id)) + end + + def find_or_create_active_excluded_judge(sdomainid, full_name) + VACOLS::Staff.find_by_sdomainid(sdomainid) || ( + user = create(:user, :judge_with_appeals_excluded_from_affinity, + :with_vacols_judge_record, css_id: sdomainid, full_name: full_name) + VACOLS::Staff.find_by_sdomainid(user.css_id)) + end + + def find_or_create_attorney(sdomainid, full_name) + VACOLS::Staff.find_by_sdomainid(sdomainid) || ( + user = create(:user, :with_vacols_attorney_record, css_id: sdomainid, full_name: full_name) + VACOLS::Staff.find_by_sdomainid(user.css_id)) + end + + def find_or_create_other_judge(sdomainid, full_name) + VACOLS::Staff.find_by_sdomainid(sdomainid) || ( + user = create(:user, :judge, :with_vacols_judge_record, css_id: sdomainid, full_name: full_name) + VACOLS::Staff.find_by_sdomainid(user.css_id)) + end + + def create_cases_for_aoj_cavc_affinity_days_lever + # cavc affinity cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, tied_to: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, tied_to: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, tied_to: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + # hearing held with previous decision where judge is not the same + a1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a1.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + b1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b1.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + a2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: a2.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + a3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: a3.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + a4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a4.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + b2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b2.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + a5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: a5.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + a6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: a6.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + b3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: b3.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + b4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b4.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + b5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b5.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + b6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: b6.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, appeal_affinity: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, appeal_affinity: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, appeal_affinity: false, cavc: true) + + # hearing held but no previous deciding judge + a7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoDecidingJudge").ssn}S", judge: tied_to_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a7.bfcorlid, bfac: "7").update(bfmemid: nil) + a8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoDecidingJudge").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a8.bfcorlid, bfac: "7").update(bfmemid: nil) + + # no hearing held, no previous deciding judge + a9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, cavc: true) + VACOLS::Case.where(bfcorlid: a9.bfcorlid, bfac: "7").update(bfmemid: nil) + a10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, cavc: true) + VACOLS::Case.where(bfcorlid: a10.bfcorlid, bfac: "7").update(bfmemid: nil) + + b18 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b18.bfcorlid, bfac: "7").update(bfmemid: nil) + b19 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b19.bfcorlid, bfac: "7").update(bfmemid: nil) + end + + def create_cases_for_aoj_cavc_affinity_days_lever_excluded_judge + # excluded judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, tied_to: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + # hearing held with previous decision where judge is not the same + a11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a11.bfcorlid, bfac: "7").update(bfmemid: excluded_judge.sattyid) + + b7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b7.bfcorlid, bfac: "7").update(bfmemid: excluded_judge.sattyid) + + a12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: a12.bfcorlid, bfac: "7").update(bfmemid: excluded_judge.sattyid) + + a13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: a13.bfcorlid, bfac: "7").update(bfmemid: excluded_judge.sattyid) + + b8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b8.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + b9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b9.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + b10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b10.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, appeal_affinity: false, cavc: true) + end + + def create_cases_for_aoj_cavc_affinity_days_lever_ineligible_judge + # ineligible judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, tied_to: false, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + # hearing held with previous decision where judge is not the same + a14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a14.bfcorlid, bfac: "7").update(bfmemid: ineligible_judge.sattyid) + + b11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b11.bfcorlid, bfac: "7").update(bfmemid: ineligible_judge.sattyid) + + a15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: a15.bfcorlid, bfac: "7").update(bfmemid: ineligible_judge.sattyid) + + a16 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: a16.bfcorlid, bfac: "7").update(bfmemid: ineligible_judge.sattyid) + + b12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b12.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + b13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b13.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + b14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b14.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + b15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b15.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + + b16 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b16.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + b17 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: b17.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, appeal_affinity: false, cavc: true) + # hearing held but no previous deciding judge + a17 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoDecidingJudge").ssn}S", judge: ineligible_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: a17.bfcorlid, bfac: "7").update(bfmemid: nil) + end + + def create_cases_for_aoj_cavc_with_hearing_after_decision + h1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h1.bfcorlid, bfac: "7").update(bfmemid: nil) + h2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h2.bfcorlid, bfac: "7").update(bfmemid: nil) + h3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h3.bfcorlid, bfac: "7").update(bfmemid: nil) + + h4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h4.bfcorlid, bfac: "7").update(bfmemid: nil) + h5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h5.bfcorlid, bfac: "7").update(bfmemid: nil) + h6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h6.bfcorlid, bfac: "7").update(bfmemid: nil) + + h7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h7.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + h8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h8.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + h9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h9.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + h10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h10.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + h11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h11.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + h12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h12.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + h13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h13.bfcorlid, bfac: "7").update(bfmemid: affinity_judge.sattyid) + h14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h14.bfcorlid, bfac: "7").update(bfmemid: affinity_and_tied_to_judge.sattyid) + h15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: h15.bfcorlid, bfac: "7").update(bfmemid: tied_to_judge.sattyid) + + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop90Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 90.days.ago, cavc: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 60.days.ago, cavc: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop25Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago, cavc: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + + def create_cases_for_aoj_aod_affinty_days_lever + # aoj aod affinity cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "30DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 30.days.ago, cavc: true) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 60.days.ago, cavc: true) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca1 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca1.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb1 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb1.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca2 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca2.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca3 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca3.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca4 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca4.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb2 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb2.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ca5 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca5.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ca6 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca6.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb3 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: cb3.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb4 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb4.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb5 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb5.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb6 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: cb6.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, appeal_affinity: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, appeal_affinity: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, appeal_affinity: false) + # hearing held but no previous deciding judge + ca7 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoDecidingJudge").ssn}S", judge: tied_to_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca7.bfcorlid, bfac: "1").update(bfmemid: nil) + + ca8 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoDecidingJudge").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca8.bfcorlid, bfac: "1").update(bfmemid: nil) + + # no hearing held, no previous deciding judge + ca9 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false) + VACOLS::Case.where(bfcorlid: ca9.bfcorlid, bfac: "1").update(bfmemid: nil) + + ca10 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false) + VACOLS::Case.where(bfcorlid: ca10.bfcorlid, bfac: "1").update(bfmemid: nil) + + cb18 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb18.bfcorlid, bfac: "1").update(bfmemid: nil) + + cb19 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb19.bfcorlid, bfac: "1").update(bfmemid: nil) + end + + def create_cases_for_aoj_aod_affinty_days_lever_excluded_judge + # excluded judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca11 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca11.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + cb7 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb7.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + ca12 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca12.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + ca13 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca13.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + cb8 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb8.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb9 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb9.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb10 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb10.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, appeal_affinity: false) + end + + def create_cases_for_aoj_aod_affinity_days_lever_ineligible_judge + # ineligible judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca14 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca14.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + cb11 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb11.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + ca15 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca15.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + ca16 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca16.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + cb12 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb12.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb13 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb13.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb14 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb14.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb15 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb15.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb16 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb16.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb17 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb17.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, appeal_affinity: false) + # hearing held but no previous deciding judge + ca17 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoDecidingJudge").ssn}S", judge: ineligible_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca17.bfcorlid, bfac: "1").update(bfmemid: nil) + end + + def create_cases_for_aoj_aod_with_hearing_after_decision + ch1 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch1.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch2 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch2.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch3 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch3.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch4 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch4.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch5 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch5.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch6 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch6.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch7 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch7.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch8 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch8.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch9 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch9.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + ch10 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch10.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch11 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch11.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch12 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch12.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + ch13 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch13.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch14 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch14.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch15 = create(:legacy_aoj_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch15.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + create(:legacy_cavc_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop90Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 90.days.ago) + create(:legacy_cavc_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 60.days.ago) + create(:legacy_cavc_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop25Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_cavc_appeal, :aod, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + end + + def create_cases_for_aoj_affinity_days_lever + # aoj affinity cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "30DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 30.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 60.days.ago, cavc: true) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca1.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb1.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca2.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca3.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ca4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca4.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb2.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ca5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca5.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ca6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca6.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: cb3.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb4.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb5.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: cb6.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoAppealAffinity").ssn}S", judge: tied_to_judge, attorney: attorney, appeal_affinity: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoAppealAffinity").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, appeal_affinity: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "NoAppealAffinity").ssn}S", judge: affinity_judge, attorney: attorney, appeal_affinity: false) + # hearing held but no previous deciding judge + ca7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "NoDecidingJudge").ssn}S", judge: tied_to_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca7.bfcorlid, bfac: "1").update(bfmemid: nil) + + ca8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "NoDecidingJudge").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca8.bfcorlid, bfac: "1").update(bfmemid: nil) + + caa8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "NoDecidingJudge").ssn}S", judge: affinity_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: caa8.bfcorlid, bfac: "1").update(bfmemid: nil) + + # no hearing held, no previous deciding judge + ca9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false) + VACOLS::Case.where(bfcorlid: ca9.bfcorlid, bfac: "1").update(bfmemid: nil) + + ca10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false) + VACOLS::Case.where(bfcorlid: ca10.bfcorlid, bfac: "1").update(bfmemid: nil) + + cb18 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb18.bfcorlid, bfac: "1").update(bfmemid: nil) + + cb19 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb19.bfcorlid, bfac: "1").update(bfmemid: nil) + end + + def create_cases_for_aoj_affinity_days_lever_excluded_judge + # excluded judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca11.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + cb7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb7.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + ca12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca12.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + ca13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca13.bfcorlid, bfac: "1").update(bfmemid: excluded_judge.sattyid) + + cb8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb8.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb9.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb10.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "25DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "3DaysAffinity").ssn}S", judge: excluded_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "NoAppealAffinity").ssn}S", judge: excluded_judge, attorney: attorney, appeal_affinity: false) + end + + def create_cases_for_aoj_affinity_days_lever_ineligible_judge + # ineligible judge cases: + # no hearing held but has previous decision + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, tied_to: false) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + # hearing held with previous decision where judge is not the same + ca14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "60DaysAffinity").ssn}S", judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca14.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + cb11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "25DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb11.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + ca15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "3DaysAffinity").ssn}S", judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca15.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + ca16 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToIneligibleUser", snamel: "NoAppealAffinity").ssn}S", judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca16.bfcorlid, bfac: "1").update(bfmemid: ineligible_judge.sattyid) + + cb12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb12.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb13.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 25.days.ago) + VACOLS::Case.where(bfcorlid: cb14.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + cb15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb15.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + cb16 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb16.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + cb17 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: cb17.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + # hearing held with previous decision where judge is same (THIS IS TIED TO) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "60DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "25DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 25.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "3DaysAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago) + create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoAppealAffinity").ssn}S", judge: ineligible_judge, attorney: attorney, appeal_affinity: false) + # hearing held but no previous deciding judge + ca17 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToIneligibleJudge", snamel: "NoDecidingJudge").ssn}S", judge: ineligible_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca17.bfcorlid, bfac: "1").update(bfmemid: nil) + end + + def create_cases_for_aoj_with_hearing_after_decision + ch1 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch1.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch2 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch2.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch3 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch3.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch4 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch4.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch5 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch5.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch6 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch6.bfcorlid, bfac: "1").update(bfmemid: nil) + + ch7 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAEEMARD", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_and_tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch7.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch8 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVABDANIEL", snamel: "60DaysAffinityAfterDec").ssn}S", judge: tied_to_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch8.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch9 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToBVAGSPORER", snamel: "60DaysAffinityAfterDec").ssn}S", judge: affinity_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch9.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + ch10 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch10.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch11 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch11.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch12 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "TiedToExcludedJudge", snamel: "60DaysAffinityAfterDec").ssn}S", judge: excluded_judge, attorney: attorney, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch12.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + ch13 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAGSPORER", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch13.bfcorlid, bfac: "1").update(bfmemid: affinity_judge.sattyid) + + ch14 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVAEEMARD", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch14.bfcorlid, bfac: "1").update(bfmemid: affinity_and_tied_to_judge.sattyid) + + ch15 = create(:legacy_aoj_appeal, bfcorlid: "#{create_correspondent(snamef: "AffinityToBVABDANIEL", snamel: "3DaysAffinityAfterDec").ssn}S", judge: ineligible_judge, attorney: attorney, affinity_start_date: 3.days.ago, hearing_after_decision: true) + VACOLS::Case.where(bfcorlid: ch15.bfcorlid, bfac: "1").update(bfmemid: tied_to_judge.sattyid) + + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop90Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 90.days.ago) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop60Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 60.days.ago) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop25Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 25.days.ago) + create(:legacy_cavc_appeal, bfcorlid: "#{create_correspondent(snamef: "Genpop3Days", snamel: "AffinityStartDate").ssn}S", judge: affinity_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + end + end +end diff --git a/db/seeds/case_distribution_levers.rb b/db/seeds/case_distribution_levers.rb index c83ba6d1f88..9bdec3f3bf8 100644 --- a/db/seeds/case_distribution_levers.rb +++ b/db/seeds/case_distribution_levers.rb @@ -348,13 +348,13 @@ def levers title: Constants.DISTRIBUTION.aoj_affinity_days_title, description: "Sets the number of days an appeal respects the affinity to the deciding judge for Legacy AOJ Remand Returned appeals with no hearing held before distributing the appeal to any available judge.", data_type: Constants.ACD_LEVERS.data_types.radio, - value: "60", + value: "14", unit: Constants.ACD_LEVERS.days, options: [ { item: Constants.ACD_LEVERS.value, data_type: Constants.ACD_LEVERS.data_types.number, - value: 60, + value: 14, text: "Attempt distribution to current judge for max of:", unit: Constants.ACD_LEVERS.days, selected: true @@ -374,7 +374,7 @@ def levers unit: "" } ], - is_disabled_in_ui: true, + is_disabled_in_ui: false, min_value: 0, max_value: 999, algorithms_used: [Constants.ACD_LEVERS.algorithms.docket], @@ -412,7 +412,7 @@ def levers unit: "" } ], - is_disabled_in_ui: true, + is_disabled_in_ui: false, min_value: 0, max_value: 999, algorithms_used: [Constants.ACD_LEVERS.algorithms.docket], @@ -450,7 +450,7 @@ def levers unit: "" } ], - is_disabled_in_ui: true, + is_disabled_in_ui: false, min_value: 0, max_value: 999, algorithms_used: [Constants.ACD_LEVERS.algorithms.docket], diff --git a/db/seeds/cavc_affinity_levers_test_data.rb b/db/seeds/cavc_affinity_levers_test_data.rb index 49bfd4a1bff..e045ef2527d 100644 --- a/db/seeds/cavc_affinity_levers_test_data.rb +++ b/db/seeds/cavc_affinity_levers_test_data.rb @@ -507,8 +507,8 @@ def create_legacy_cavc_cases_with_new_hearings # no original hearing, decided by BVADCREMIN, no new hearing => affintiy to BVADCREMIN create(:legacy_cavc_appeal, bfd19: 5.years.ago, bfcorlid: "#{create_veteran_for_bvadcremin_judge("AffinityToCremin").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvadcremin.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), tied_to: false, affinity_start_date: 3.days.ago) - # original hearing held by SPORER, no original deciding judge, no new hearing => genpop - c9 = create(:legacy_cavc_appeal, bfd19: 5.years.ago, bfcorlid: "#{create_veteran_for_genpop("Genpop").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvagsporer.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), tied_to: true) + # original hearing held by SPORER, no original deciding judge, no new hearing => tied to SPORER + c9 = create(:legacy_cavc_appeal, bfd19: 5.years.ago, bfcorlid: "#{create_veteran_for_bvagsporer_judge("TiedToSporer").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvagsporer.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), tied_to: true) c9.update!(bfmemid: nil) # no original hearing, no original deciding judge, no new hearing => genpop @@ -843,9 +843,9 @@ def create_cases_for_cavc_affinty_days_lever create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvaeemard_judge("TiedToEmard").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), appeal_affinity: false) # hearing held but no previous deciding judge - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvabdaniel.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvabdaniel_judge("TiedToDaniel").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvabdaniel.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)) .update!(bfmemid: nil) - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvaeemard_judge("TiedToEmard").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)) .update!(bfmemid: nil) # no hearing held, no previous deciding judge @@ -901,7 +901,7 @@ def create_cases_for_cavc_affinity_days_lever_ineligible_judge create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), affinity_start_date: 3.days.ago) create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), appeal_affinity: false) # hearing held but no previous deciding judge - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)).update!(bfmemid: nil) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id)).update!(bfmemid: nil) end def create_cases_for_cavc_aod_affinty_days_lever @@ -935,9 +935,9 @@ def create_cases_for_cavc_aod_affinty_days_lever create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvaeemard_judge("TiedToEmard").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true, affinity_start_date: 3.days.ago) create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvaeemard_judge("TiedToEmard").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true, appeal_affinity: false) # hearing held but no previous deciding judge - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvabdaniel.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvabdaniel_judge("TiedToDaniel").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvabdaniel.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) .update!(bfmemid: nil) - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_bvaeemard_judge("TiedToEmard").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvaeemard.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) .update!(bfmemid: nil) # no hearing held, no previous deciding judge create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_bvagsporer.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true, tied_to: false) @@ -983,7 +983,7 @@ def create_cases_for_cavc_aod_affinity_days_lever_ineligible_judge create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true, affinity_start_date: 3.days.ago) create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true, appeal_affinity: false) # hearing held but no previous deciding judge - create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_genpop().file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) + create(:legacy_cavc_appeal, bfcorlid: "#{create_veteran_for_inactivejudge_judge("TiedToInactiveJudge").file_number}S", judge: VACOLS::Staff.find_by(sdomainid: judge_inactivejudge.css_id), attorney: VACOLS::Staff.find_by(sdomainid: attorney.css_id), aod: true) .update!(bfmemid: nil) end end diff --git a/spec/controllers/distributions_controller_spec.rb b/spec/controllers/distributions_controller_spec.rb index 5726992859c..4b4a6745a3f 100644 --- a/spec/controllers/distributions_controller_spec.rb +++ b/spec/controllers/distributions_controller_spec.rb @@ -42,7 +42,9 @@ expect(response.status).to eq 200 body = JSON.parse(response.body) - expect(body["distribution"].keys).to match_array(%w[id created_at updated_at status distributed_cases_count]) + expect(body["distribution"].keys).to match_array( + %w[id created_at updated_at status distributed_cases_count distribution_stats] + ) end context "but is not the logged in user" do @@ -67,7 +69,7 @@ body = JSON.parse(response.body) expect(body["errors"]).to eq nil expect(body["distribution"].keys).to match_array( - %w[id created_at updated_at status distributed_cases_count] + %w[id created_at updated_at status distributed_cases_count distribution_stats] ) end end @@ -116,7 +118,9 @@ body = JSON.parse(response.body) expect(body["distribution"]["id"]).to eq distribution.id - expect(body["distribution"].keys).to match_array(%w[id created_at updated_at status distributed_cases_count]) + expect(body["distribution"].keys).to match_array( + %w[id created_at updated_at status distributed_cases_count distribution_stats] + ) end end end diff --git a/spec/factories/case_distribution_lever.rb b/spec/factories/case_distribution_lever.rb index 442dc8b23c9..86ccde2314f 100644 --- a/spec/factories/case_distribution_lever.rb +++ b/spec/factories/case_distribution_lever.rb @@ -234,6 +234,84 @@ lever_group_order { 3003 } end + trait :aoj_affinity_days do + item { "aoj_affinity_days" } + title { "AOJ Affinity Days" } + description do + "Sets the number of days an appeal respects the affinity to the deciding judge for Legacy "\ + "AOJ Remand Returned appeals with no hearing held before distributing the appeal to any available judge." + end + data_type { "radio" } + value { "14" } + unit { "days" } + options do + [{ item: "value", + data_type: "number", + value: 14, + text: "Attempt distribution to current judge for max of:", + unit: "days", + selected: true }, + { item: "infinite", value: "infinite", text: "Always distribute to current judge" }, + { item: "omit", value: "omit", text: "Omit variable from distribution rules" }] + end + algorithms_used { %w[docket proportion] } + lever_group { "affinity" } + lever_group_order { 3003 } + end + + trait :aoj_cavc_affinity_days do + item { "aoj_cavc_affinity_days" } + title { "AOJ CAVC Affinity Days" } + description do + "Sets the number of days AOJ appeals that were CAVC at some time respect the affinity before the "\ + "appeal is distributed to any available judge. This applies to any AOJ + CAVC appeal with no hearing "\ + "held, or those with a hearing held when the remanding judge is not the hearing judge." + end + data_type { "radio" } + value { "21" } + unit { "days" } + options do + [{ item: "value", + data_type: "number", + value: 21, + text: "Attempt distribution to current judge for max of:", + unit: "days", + selected: true }, + { item: "infinite", value: "infinite", text: "Always distribute to current judge" }, + { item: "omit", value: "omit", text: "Omit variable from distribution rules" }] + end + algorithms_used { %w[docket proportion] } + lever_group { "affinity" } + lever_group_order { 3003 } + end + + trait :aoj_aod_affinity_days do + item { "aoj_aod_affinity_days" } + title { "AOJ AOD Affinity Days" } + description do + "Sets the number of days legacy remand Returned appeals that are also AOD (and may or may not have been CAVC "\ + "at one time) respect the affinity before distributing the appeal to any available jduge. Affects appeals "\ + "with hearing held when the remanding judge is not the hearing judge, or any legacy AOD + AOD appeal with "\ + "no hearing held (whether or not it had been CAVC at one time)." + end + data_type { "radio" } + value { "14" } + unit { "days" } + options do + [{ item: "value", + data_type: "number", + value: 14, + text: "Attempt distribution to current judge for max of:", + unit: "days", + selected: true }, + { item: "infinite", value: "infinite", text: "Always distribute to current judge" }, + { item: "omit", value: "omit", text: "Omit variable from distribution rules" }] + end + algorithms_used { %w[docket proportion] } + lever_group { "affinity" } + lever_group_order { 3003 } + end + trait :ama_hearing_case_aod_affinity_days do item { "ama_hearing_case_aod_affinity_days" } title { "AMA Hearing Case AOD Affinity Days" } diff --git a/spec/factories/distribution.rb b/spec/factories/distribution.rb index 5783213b392..d993fe19cad 100644 --- a/spec/factories/distribution.rb +++ b/spec/factories/distribution.rb @@ -4,10 +4,15 @@ factory :distribution do association :judge, factory: :user + # This trait requires all case distribution levers to exist in the database trait :completed do completed_at { Time.zone.now } + with_stats + after(:create) do |distribution| - distribution.update(status: :completed, statistics: { batch_size: distribution.distributed_cases.count }) + distribution.update(status: :completed, + statistics: { batch_size: distribution.distributed_cases.count, + info: "See related row in distribution_stats for additional stats" }) end end @@ -22,5 +27,13 @@ trait :last_month do completed_at { 35.days.ago } end + + trait :with_stats do + after(:create) do |distribution| + distribution.instance_variable_set(:@appeals, []) if distribution.instance_variable_get(:@appeals).nil? + + distribution.send(:record_distribution_stats, distribution.send(:ama_statistics)) + end + end end end diff --git a/spec/factories/vacols/case.rb b/spec/factories/vacols/case.rb index 1f06c8e1b87..b73697a5d8a 100644 --- a/spec/factories/vacols/case.rb +++ b/spec/factories/vacols/case.rb @@ -414,6 +414,99 @@ end end end + + # The judge and attorney should be the VACOLS::Staff records of those users + # This factory uses the :aod trait to mark it AOD instead of a transient attribute + # Pass `tied_to: false` to create an original appeal without a previous hearing + factory :legacy_aoj_appeal do + transient do + judge { nil } + attorney { nil } + cavc { false } + appeal_affinity { true } + affinity_start_date { 60.days.ago } + tied_to { true } + hearing_after_decision { false } + end + + status_active + type_post_remand + + bfdpdcn { 2.months.ago } + bfcurloc { "81" } + + after(:create) do |new_case, evaluator| + original_judge = evaluator.judge || create(:user, :judge, :with_vacols_judge_record).vacols_staff + original_attorney = evaluator.attorney || create(:user, :with_vacols_attorney_record).vacols_staff + + new_case.correspondent.update!(ssn: new_case.bfcorlid.chomp("S")) unless new_case.correspondent.ssn + + veteran = Veteran.find_by_file_number_or_ssn(new_case.correspondent.ssn) + + if veteran + new_case.correspondent.update!(snamef: veteran.first_name, snamel: veteran.last_name) + else + create( + :veteran, + first_name: new_case.correspondent.snamef, + last_name: new_case.correspondent.snamel, + name_suffix: new_case.correspondent.ssalut, + ssn: new_case.correspondent.ssn, + file_number: new_case.correspondent.ssn + ) + end + + # Build these instead of create so the folder after_create hooks don't execute and create another case + # until the original case has been created and the associations saved + original_folder = build( + :folder, + new_case.folder.attributes.except!("ticknum", "tidrecv", "tidcls", "tiaduser", + "tiadtime", "tikeywrd", "tiread2", "tioctime", "tiocuser", + "tidktime", "tidkuser") + ) + + original_issues = new_case.case_issues.map do |issue| + build( + :case_issue, + issue.attributes.except("isskey", "issaduser", "issadtime", "issmduser", "issmdtime", "issdcls"), + issdc: "3" + ) + end + + original_case = create( + :case, + :status_complete, + :disposition_remanded, + bfac: evaluator.cavc ? "7" : "1", + bfcorkey: new_case.bfcorkey, + bfcorlid: new_case.bfcorlid, + bfdnod: new_case.bfdnod, + bfdsoc: new_case.bfdsoc, + bfd19: new_case.bfd19, + bfcurloc: "99", + bfddec: new_case.bfdpdcn, + bfmemid: original_judge.sattyid, + bfattid: original_attorney.sattyid, + folder: original_folder, + correspondent: new_case.correspondent, + case_issues: original_issues + ) + + if evaluator.tied_to + create( + :case_hearing, + :disposition_held, + folder_nr: original_case.bfkey, + hearing_date: evaluator.hearing_after_decision ? original_case.bfddec + 1.month : original_case.bfddec - 1.month, # rubocop:disable Layout/LineLength + user: User.find_by_css_id(original_judge.sdomainid) + ) + end + + if evaluator.appeal_affinity + create(:appeal_affinity, appeal: new_case, affinity_start_date: evaluator.affinity_start_date) + end + end + end end end end diff --git a/spec/feature/case_distribution_levers/admin_ui_spec.rb b/spec/feature/case_distribution_levers/admin_ui_spec.rb index cb7a08c526d..3b81fce8b7e 100644 --- a/spec/feature/case_distribution_levers/admin_ui_spec.rb +++ b/spec/feature/case_distribution_levers/admin_ui_spec.rb @@ -9,20 +9,15 @@ User.authenticate!(user: user) end - let(:disabled_lever_list) do - [ - Constants.DISTRIBUTION.aoj_affinity_days, - Constants.DISTRIBUTION.aoj_aod_affinity_days, - Constants.DISTRIBUTION.aoj_cavc_affinity_days - ] - end - let(:enabled_lever_list) do [ Constants.DISTRIBUTION.ama_hearing_case_affinity_days, Constants.DISTRIBUTION.ama_hearing_case_aod_affinity_days, Constants.DISTRIBUTION.cavc_aod_affinity_days, - Constants.DISTRIBUTION.cavc_affinity_days + Constants.DISTRIBUTION.cavc_affinity_days, + Constants.DISTRIBUTION.aoj_affinity_days, + Constants.DISTRIBUTION.aoj_aod_affinity_days, + Constants.DISTRIBUTION.aoj_cavc_affinity_days ] end @@ -59,16 +54,10 @@ EMPTY_ERROR_MESSAGE = "Please enter a value greater than or equal to 0" - step "enabled and disabled levers display correctly" do + step "enabled levers display correctly" do # From affinity_days_levers_spec.rb option_list = [Constants.ACD_LEVERS.omit, Constants.ACD_LEVERS.infinite, Constants.ACD_LEVERS.value] - disabled_lever_list.each do |disabled_lever| - option_list.each do |option| - expect(find("##{disabled_lever}-#{option}", visible: false)).to be_disabled - end - end - enabled_lever_list.each do |enabled_lever| option_list.each do |option| expect(find("##{enabled_lever}-#{option}", visible: false)).not_to be_disabled diff --git a/spec/jobs/incomplete_distributions_job_spec.rb b/spec/jobs/incomplete_distributions_job_spec.rb index ac26004e172..d013282664d 100644 --- a/spec/jobs/incomplete_distributions_job_spec.rb +++ b/spec/jobs/incomplete_distributions_job_spec.rb @@ -12,6 +12,9 @@ create(:case_distribution_lever, :batch_size_per_attorney) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) create(:case_distribution_lever, :ama_hearing_case_affinity_days) create(:case_distribution_lever, :ama_hearing_case_aod_affinity_days) create(:case_distribution_lever, :ama_direct_review_start_distribution_prior_to_goals) diff --git a/spec/jobs/push_priority_appeals_to_judges_job_spec.rb b/spec/jobs/push_priority_appeals_to_judges_job_spec.rb index 3c2602cb8a8..94d2a50364c 100644 --- a/spec/jobs/push_priority_appeals_to_judges_job_spec.rb +++ b/spec/jobs/push_priority_appeals_to_judges_job_spec.rb @@ -2,6 +2,7 @@ describe PushPriorityAppealsToJudgesJob, :all_dbs do before do + FeatureToggle.enable!(:acd_distribute_by_docket_date) allow_any_instance_of(Docket).to receive(:calculate_days_for_time_goal_with_prior_to_goal).and_return(20) create(:case_distribution_lever, :request_more_cases_minimum) @@ -10,6 +11,9 @@ create(:case_distribution_lever, :batch_size_per_attorney) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) create(:case_distribution_lever, :ama_hearing_case_affinity_days) create(:case_distribution_lever, :ama_hearing_case_aod_affinity_days) create(:case_distribution_lever, :ama_direct_review_start_distribution_prior_to_goals) @@ -27,11 +31,9 @@ def to_judge_hash(arr) .to receive(:distribute_genpop_priority_appeals).and_return([]) end - after { FeatureToggle.disable!(:acd_distribute_by_docket_date) } - subject { described_class.perform_now } - it "using Automatic Case Distribution module" do + it "using Automatic Case Distribution module", skip: "Automatic Case Distribution is deprecated" do expect_any_instance_of(PushPriorityAppealsToJudgesJob) .to receive(:distribute_non_genpop_priority_appeals).and_return([]) @@ -39,7 +41,6 @@ def to_judge_hash(arr) end it "using By Docket Date Distribution module" do - FeatureToggle.enable!(:acd_distribute_by_docket_date) expect_any_instance_of(PushPriorityAppealsToJudgesJob) .to_not receive(:distribute_non_genpop_priority_appeals).and_return([]) @@ -73,7 +74,7 @@ def to_judge_hash(arr) :aod, bfkey: ready_priority_bfkey, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago, @@ -108,7 +109,7 @@ def to_judge_hash(arr) vacols_case = create( :case, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago, @@ -143,7 +144,7 @@ def to_judge_hash(arr) :case, :aod, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "not ready", bfdloout: 3.days.ago, @@ -176,7 +177,7 @@ def to_judge_hash(arr) :aod, bfkey: ready_priority_bfkey2, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago, @@ -261,7 +262,7 @@ def to_judge_hash(arr) let(:judges) { create_list(:user, 5, :judge, :with_vacols_judge_record) } let(:judge_distributions_this_month) { (0..4).to_a } let!(:legacy_priority_cases) do - (1..5).map do |i| + (1..4).map do |i| vacols_case = create( :case, :aod, @@ -285,8 +286,33 @@ def to_judge_hash(arr) vacols_case end end + let!(:aoj_legacy_priority_cases) do + (1..4).map do |i| + vacols_case = create( + :case, + :aod, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: i.months.ago, + folder: build( + :folder, + tinum: "1801#{format('%03d', index: i)}", + titrnum: "123456789S" + ) + ) + create( + :case_hearing, + :disposition_held, + folder_nr: vacols_case.bfkey, + hearing_date: 5.days.ago.to_date + ) + vacols_case + end + end let!(:ready_priority_hearing_cases) do - (1..5).map do |i| + (1..4).map do |i| appeal = create(:appeal, :advanced_on_docket_due_to_age, :ready_for_distribution, @@ -299,7 +325,7 @@ def to_judge_hash(arr) end end let!(:ready_priority_evidence_cases) do - (1..5).map do |i| + (1..4).map do |i| appeal = create(:appeal, :type_cavc_remand, :cavc_ready_for_distribution, @@ -312,7 +338,7 @@ def to_judge_hash(arr) end end let!(:ready_priority_direct_cases) do - (1..5).map do |i| + (1..4).map do |i| appeal = create(:appeal, :with_post_intake_tasks, :advanced_on_docket_due_to_age, @@ -322,15 +348,14 @@ def to_judge_hash(arr) appeal end end - - let(:priority_count) { Appeal.count { |a| a.aod? || a.cavc? } + legacy_priority_cases.count } + let(:priority_count) { Appeal.count { |a| a.aod? || a.cavc? } + legacy_priority_cases.count + aoj_legacy_priority_cases.count } # rubocop:disable Layout/LineLength let(:priority_target) { (priority_count + judge_distributions_this_month.sum) / judges.count } before do ready_priority_evidence_cases.each { |appeal| appeal.update(receipt_date: 1.month.ago) } end - context "using Automatic Case Distribution module" do + context "using Automatic Case Distribution module", skip: "Automatic Case Distribution is deprecated" do it "should distribute ready priority appeals to the judges" do expect(subject.count).to eq judges.count @@ -340,7 +365,8 @@ def to_judge_hash(arr) expect(distributed_cases.map(&:priority).uniq.compact).to match_array [true] expect(distributed_cases.map(&:genpop).uniq.compact).to match_array [true] expect(distributed_cases.pluck(:docket).uniq).to match_array(Constants::AMA_DOCKETS.keys.unshift("legacy")) - expect(distributed_cases.group(:docket).count.values.uniq).to match_array [5] + + expect(distributed_cases.group(:docket).count.values.uniq).to match_array [4] end it "distributes cases to each judge based on their priority target" do @@ -366,9 +392,6 @@ def to_judge_hash(arr) end context "using By Docket Date Distribution module" do - before { FeatureToggle.enable!(:acd_distribute_by_docket_date) } - after { FeatureToggle.disable!(:acd_distribute_by_docket_date) } - it "should distribute ready priority appeals to the judges" do expect(subject.count).to eq judges.count @@ -378,7 +401,7 @@ def to_judge_hash(arr) expect(distributed_cases.map(&:priority).uniq.compact).to match_array [true] expect(distributed_cases.map(&:genpop).uniq.compact).to match_array [true] expect(distributed_cases.pluck(:docket).uniq).to match_array(Constants::AMA_DOCKETS.keys.unshift("legacy")) - expect(distributed_cases.group(:docket).count.values.uniq).to match_array [5] + expect(distributed_cases.group(:docket).count.values.uniq).to match_array [4, 8] end it "distributes cases to each judge based on their priority target" do @@ -432,6 +455,30 @@ def to_judge_hash(arr) ) end end + let!(:aoj_legacy_priority_case) do + create( + :case, + :aod, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: 1.month.ago, + folder: build( + :folder, + tinum: "1801000", + titrnum: "123456789S" + ) + ).tap do |vacols_case| + create( + :case_hearing, + :disposition_held, + folder_nr: vacols_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: judge.vacols_attorney_id + ) + end + end let!(:ready_priority_hearing_case) do appeal = FactoryBot.create(:appeal, :advanced_on_docket_due_to_age, @@ -489,7 +536,7 @@ def to_judge_hash(arr) subject { job.generate_report } before do - FeatureToggle.disable!(:acd_distribute_by_docket_date) + FeatureToggle.enable!(:acd_distribute_by_docket_date) job.instance_variable_set(:@tied_distributions, distributed_cases) job.instance_variable_set(:@genpop_distributions, distributed_cases) job.instance_variable_set(:@distributions, distributed_cases) @@ -501,51 +548,10 @@ def to_judge_hash(arr) after { FeatureToggle.disable!(:acd_distribute_by_docket_date) } - it "using Automatic Case Distribution module" do - today = Time.zone.now.to_date - legacy_days_waiting = (today - legacy_priority_case.bfdloout.to_date).to_i - direct_review_days_waiting = (today - ready_priority_direct_case.ready_for_distribution_at.to_date).to_i - evidence_submission_days_waiting = (today - ready_priority_evidence_case.ready_for_distribution_at.to_date).to_i - hearing_days_waiting = (today - ready_priority_hearing_case.ready_for_distribution_at.to_date).to_i - excluded_judges = JudgeTeam.judges_with_exclude_appeals_from_affinity.pluck(:css_id) - - [ - "*Number of cases tied to judges distributed*: 10", - "*Number of general population cases distributed*: 10", - "Priority Target: 6", - "*Age of oldest legacy case*: #{legacy_days_waiting} days", - "*Age of oldest direct_review case*: #{direct_review_days_waiting} days", - "*Age of oldest evidence_submission case*: #{evidence_submission_days_waiting} days", - "*Age of oldest hearing case*: #{hearing_days_waiting} days", - "", - "*Total Number of appeals _not_ distributed*: 4", - "*Number of legacy appeals _not_ distributed*: 1", - "*Number of direct_review appeals _not_ distributed*: 1", - "*Number of evidence_submission appeals _not_ distributed*: 1", - "*Number of hearing appeals _not_ distributed*: 1", - "*Number of Legacy Hearing Non Genpop appeals _not_ distributed*: 1", - "", - "*Number of legacy appeals in affinity date window*: not implemented", - "*Number of legacy appeals out of affinity date window*: not implemented", - "*Number of direct_review appeals in affinity date window*: 0", - "*Number of direct_review appeals out of affinity date window*: 0", - "*Number of evidence_submission appeals in affinity date window*: 0", - "*Number of evidence_submission appeals out of affinity date window*: 0", - "*Number of hearing appeals in affinity date window*: 0", - "*Number of hearing appeals out of affinity date window*: 0", - "", - "*Debugging information*", - "*Excluded Judges*: #{excluded_judges}", - "Previous monthly distributions {judge_id=>count}: #{previous_distributions}" - ].each_with_index do |line, index| - expect(subject[index]).to eq line - end - end - it "using By Docket Date Distribution module" do - FeatureToggle.enable!(:acd_distribute_by_docket_date) today = Time.zone.now.to_date legacy_days_waiting = (today - legacy_priority_case.bfd19.to_date).to_i + aoj_legacy_days_waiting = (today - aoj_legacy_priority_case.bfd19.to_date).to_i direct_review_days_waiting = (today - ready_priority_direct_case.receipt_date).to_i evidence_submission_days_waiting = (today - ready_priority_evidence_case.receipt_date).to_i hearing_days_waiting = (today - ready_priority_hearing_case.receipt_date).to_i @@ -558,22 +564,26 @@ def to_judge_hash(arr) "*Age of oldest direct_review case*: #{direct_review_days_waiting} days", "*Age of oldest evidence_submission case*: #{evidence_submission_days_waiting} days", "*Age of oldest hearing case*: #{hearing_days_waiting} days", + "*Age of oldest aoj_legacy case*: #{aoj_legacy_days_waiting} days", "", - "*Total Number of appeals _not_ distributed*: 4", + "*Total Number of appeals _not_ distributed*: 5", "*Number of legacy appeals _not_ distributed*: 1", "*Number of direct_review appeals _not_ distributed*: 1", "*Number of evidence_submission appeals _not_ distributed*: 1", "*Number of hearing appeals _not_ distributed*: 1", + "*Number of aoj_legacy appeals _not_ distributed*: 1", "*Number of Legacy Hearing Non Genpop appeals _not_ distributed*: 1", "", - "*Number of legacy appeals in affinity date window*: not implemented", - "*Number of legacy appeals out of affinity date window*: not implemented", + "*Number of legacy appeals in affinity date window*: 0", + "*Number of legacy appeals out of affinity date window*: 1", "*Number of direct_review appeals in affinity date window*: 0", "*Number of direct_review appeals out of affinity date window*: 0", "*Number of evidence_submission appeals in affinity date window*: 0", "*Number of evidence_submission appeals out of affinity date window*: 0", - "*Number of hearing appeals in affinity date window*: 0", + "*Number of hearing appeals in affinity date window*: 1", "*Number of hearing appeals out of affinity date window*: 0", + "*Number of aoj_legacy appeals in affinity date window*: 1", + "*Number of aoj_legacy appeals out of affinity date window*: 0", "", "*Debugging information*", "*Excluded Judges*: #{excluded_judges}", @@ -1177,6 +1187,7 @@ def to_judge_hash(arr) allow_any_instance_of(SlackService).to receive(:send_notification) { |_, first_arg| slack_msg = first_arg } allow_any_instance_of(described_class).to receive(:distribute_non_genpop_priority_appeals).and_raise(error_msg) + allow_any_instance_of(described_class).to receive(:distribute_genpop_priority_appeals).and_raise(error_msg) allow(Raven).to receive(:capture_exception) { @raven_called = true } described_class.perform_now diff --git a/spec/jobs/return_legacy_appeals_to_board_job_spec.rb b/spec/jobs/return_legacy_appeals_to_board_job_spec.rb index 7c82e696fe9..523552bdf05 100644 --- a/spec/jobs/return_legacy_appeals_to_board_job_spec.rb +++ b/spec/jobs/return_legacy_appeals_to_board_job_spec.rb @@ -80,6 +80,18 @@ end end + context "aoj case docket is called" do + let!(:non_ssc_avlj_user_1) { create(:user, :non_ssc_avlj_user).vacols_staff } + let!(:legacy_aoj_appeal) { create(:legacy_aoj_appeal, judge: non_ssc_avlj_user_1) } + + before { Seeds::CaseDistributionLevers.new.seed! } + + it "runs eligible and moved appeals with AOJ Dockets" do + described_class.perform_now + expect(legacy_aoj_appeal.reload.bfcurloc).to eq("63") + end + end + describe "#non_ssc_avljs" do let(:job) { described_class.new } diff --git a/spec/jobs/update_appeal_affinity_dates_job_spec.rb b/spec/jobs/update_appeal_affinity_dates_job_spec.rb index e68f298cf32..bb513249e69 100644 --- a/spec/jobs/update_appeal_affinity_dates_job_spec.rb +++ b/spec/jobs/update_appeal_affinity_dates_job_spec.rb @@ -21,7 +21,7 @@ end context "#latest_receipt_dates" do - before { create(:case_distribution_lever, :request_more_cases_minimum) } + before { Seeds::CaseDistributionLevers.new.seed! } let(:judge) { create(:user, :judge, :with_vacols_judge_record) } let(:distribution_requested) { create(:distribution, :completed, judge: judge) } @@ -197,8 +197,23 @@ end end + context "#process_legacy_appeals_which_need_affinity_updates" do + let(:hashes_array) do + [{ docket: "hearing", priority: true, receipt_date: Time.zone.now }, + { docket: "direct_review", priority: true, receipt_date: Time.zone.now }, + { docket: "legacy", priority: true, receipt_date: Time.zone.now }] + end + + subject { described_class.new.send(:process_legacy_appeals_which_need_affinity_updates, hashes_array) } + + it "processes only legacy appeals" do + expect_any_instance_of(described_class).to receive(:create_or_update_appeal_affinities).exactly(1).times + subject + end + end + context "#create_or_update_appeal_affinties" do - before { create(:case_distribution_lever, :request_more_cases_minimum) } + before { Seeds::CaseDistributionLevers.new.seed! } let(:judge) { create(:user, :judge, :with_vacols_judge_record) } let(:distribution) { create(:distribution, :completed, judge: judge) } @@ -228,7 +243,7 @@ end context "#legacy_appeals_with_no_appeal_affinities" do - before { create(:case_distribution_lever, :request_more_cases_minimum) } + before { Seeds::CaseDistributionLevers.new.seed! } let(:judge) { create(:user, :judge, :with_vacols_judge_record) } let(:distribution) { create(:distribution, :completed, judge: judge) } @@ -280,7 +295,7 @@ end context "full run" do - before { create(:case_distribution_lever, :request_more_cases_minimum) } + before { Seeds::CaseDistributionLevers.new.seed! } let!(:judge) { create(:user, :judge, :with_vacols_judge_record) } let!(:previous_distribution) { create(:distribution, :completed, :this_month, judge: judge) } diff --git a/spec/lib/tasks/affinity_start_date_spec.rb b/spec/lib/tasks/affinity_start_date_spec.rb index 2332a9a6a65..d23d3a6cfaf 100644 --- a/spec/lib/tasks/affinity_start_date_spec.rb +++ b/spec/lib/tasks/affinity_start_date_spec.rb @@ -3,7 +3,7 @@ describe "affinity_start_date" do include_context "rake" - before { create(:case_distribution_lever, :request_more_cases_minimum) } + before { Seeds::CaseDistributionLevers.new.seed! } let!(:judge) { create(:user, :judge, :with_vacols_judge_record) } let!(:distribution) { create(:distribution, :completed, :this_month, judge: judge) } diff --git a/spec/models/case_distribution_lever_spec.rb b/spec/models/case_distribution_lever_spec.rb index 2940f835bbd..a87a6156427 100644 --- a/spec/models/case_distribution_lever_spec.rb +++ b/spec/models/case_distribution_lever_spec.rb @@ -18,7 +18,10 @@ ama_hearing_docket_time_goals ama_hearing_start_distribution_prior_to_goals ama_evidence_submission_start_distribution_prior_to_goals - nonsscavlj_number_of_appeals_to_move] + nonsscavlj_number_of_appeals_to_move + aoj_affinity_days + aoj_aod_affinity_days + aoj_cavc_affinity_days] end let!(:float_levers) do %w[maximum_direct_review_proportion minimum_legacy_proportion nod_adjustment] @@ -106,6 +109,30 @@ end end + context ".aoj_affinity_days" do + it "only returns value with aoj affinity days" do + aoj_affinity_days = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_affinity_days) + + expect(aoj_affinity_days.value.to_i).to eq(CaseDistributionLever.aoj_affinity_days) + end + end + + context ".aoj_cavc_affinity_days" do + it "only returns value with aoj cavc affinity" do + aoj_cavc_affinity_days = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_cavc_affinity_days) + + expect(aoj_cavc_affinity_days.value.to_i).to eq(CaseDistributionLever.aoj_cavc_affinity_days) + end + end + + context ".aoj_aod_affinity_days" do + it "only returns value with aoj aod affinity" do + aoj_aod_affinity_days = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_aod_affinity_days) + + expect(aoj_aod_affinity_days.value.to_i).to eq(CaseDistributionLever.aoj_aod_affinity_days) + end + end + context "constants" do it "should match array of INTEGER Levers" do expect(CaseDistributionLever::INTEGER_LEVERS).to match_array(integer_levers) diff --git a/spec/models/concerns/by_docket_date_distribution_spec.rb b/spec/models/concerns/by_docket_date_distribution_spec.rb index 92a5e108434..721dc87f845 100644 --- a/spec/models/concerns/by_docket_date_distribution_spec.rb +++ b/spec/models/concerns/by_docket_date_distribution_spec.rb @@ -39,6 +39,9 @@ def judge_legacy_tasks create(:case_distribution_lever, :disable_legacy_priority) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) end # used to put {num} ambiguous objects into an array to mock the return array from requested_distribution diff --git a/spec/models/distribution_spec.rb b/spec/models/distribution_spec.rb index 2d3cdf5a64d..28cb9222a27 100644 --- a/spec/models/distribution_spec.rb +++ b/spec/models/distribution_spec.rb @@ -16,6 +16,9 @@ create(:case_distribution_lever, :nod_adjustment) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) create(:case_distribution_lever, :ama_hearing_case_affinity_days) create(:case_distribution_lever, :ama_hearing_case_aod_affinity_days) create(:case_distribution_lever, :ama_direct_review_docket_time_goals) @@ -186,7 +189,7 @@ new_distribution.distribute! end - it "updates status to error if an error is thrown and sends slack notification" do + it "updates status to error if an error is thrown and sends slack notification", skip: "flaky" do allow(new_distribution).to receive(:num_oldest_priority_appeals_for_judge_by_docket).and_raise(StandardError) expect_any_instance_of(SlackService).to receive(:send_notification).exactly(1).times @@ -224,5 +227,13 @@ expect(new_distribution.reload.status).to eq "completed" end end + + context "distribution lever cache" do + it "caches lever properly" do + expect(CaseDistributionLever).to receive(:check_distribution_lever_cache).at_least(:once).and_call_original + new_distribution.distribute! + expect(Rails.cache.exist?("aoj_affinity_days_distribution_lever_cache")).to be false + end + end end end diff --git a/spec/models/docket_coordinator_spec.rb b/spec/models/docket_coordinator_spec.rb index 57d167b4a36..2867a80fef9 100644 --- a/spec/models/docket_coordinator_spec.rb +++ b/spec/models/docket_coordinator_spec.rb @@ -5,6 +5,11 @@ create(:case_distribution_lever, :ama_hearing_case_affinity_days) create(:case_distribution_lever, :ama_direct_review_start_distribution_prior_to_goals) create(:case_distribution_lever, :ama_direct_review_docket_time_goals) + create(:case_distribution_lever, :cavc_affinity_days) + create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) create(:case_distribution_lever, :minimum_legacy_proportion) create(:case_distribution_lever, :maximum_direct_review_proportion) create(:case_distribution_lever, :nod_adjustment) diff --git a/spec/models/docket_spec.rb b/spec/models/docket_spec.rb index 052be3f5602..cd0260405b8 100644 --- a/spec/models/docket_spec.rb +++ b/spec/models/docket_spec.rb @@ -8,10 +8,15 @@ create(:case_distribution_lever, :ama_evidence_submission_docket_time_goals) create(:case_distribution_lever, :ama_hearing_docket_time_goals) create(:case_distribution_lever, :ama_hearing_start_distribution_prior_to_goals) + create(:case_distribution_lever, :ama_hearing_case_affinity_days) + create(:case_distribution_lever, :ama_hearing_case_aod_affinity_days) create(:case_distribution_lever, :ama_direct_review_start_distribution_prior_to_goals) create(:case_distribution_lever, :ama_evidence_submission_review_start_distribution_prior_to_goals) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) create(:case_distribution_lever, :request_more_cases_minimum) create(:case_distribution_lever, :disable_ama_non_priority_direct_review) end @@ -85,6 +90,19 @@ end end + describe "affinity_date_count" do + context "when case distribution lever value is infinite" do + subject { DirectReviewDocket.new.affinity_date_count(true, true) } + before do + CaseDistributionLever.find_by(item: "cavc_affinity_days").update(value: "infinite") + end + + it "Does not raise an error and return results" do + expect(subject).to eq(1) + end + end + end + context "appeals" do context "when no options given" do subject { DirectReviewDocket.new.appeals } @@ -129,6 +147,7 @@ context "when acd_exclude_from_affinity flag is enabled" do before { FeatureToggle.enable!(:acd_exclude_from_affinity) } + after { FeatureToggle.disable!(:acd_exclude_from_affinity) } context "when called for ready is true and judge is passed" do let(:judge) { judge_decision_review_task.assigned_to } @@ -337,6 +356,33 @@ it "counts genpop priority appeals" do expect(subject).to eq(3) end + + context "when acd_exclude_from_affinity flag is enabled" do + before { FeatureToggle.enable!(:acd_exclude_from_affinity) } + after { FeatureToggle.disable!(:acd_exclude_from_affinity) } + let(:docket) { HearingRequestDocket.new } + let!(:cavc_appeal2) do + create(:appeal, + :type_cavc_remand, + :cavc_ready_for_distribution, + :with_appeal_affinity, + docket_type: Constants.AMA_DOCKETS.hearing, + affinity_start_date: 2.days.ago) + end + let!(:cavc_appeal3) do + create(:appeal, + :type_cavc_remand, + :cavc_ready_for_distribution, + :with_appeal_affinity, + docket_type: Constants.AMA_DOCKETS.hearing, + affinity_start_date: 80.days.ago) + end + subject { docket.genpop_priority_count } + + it "correctly filters out appeals within affinity window" do + expect(subject).to eq(1) + end + end end context "ready_priority_nonpriority_appeals" do diff --git a/spec/models/dockets/aoj_legacy_docket_spec.rb b/spec/models/dockets/aoj_legacy_docket_spec.rb new file mode 100644 index 00000000000..38ec3998675 --- /dev/null +++ b/spec/models/dockets/aoj_legacy_docket_spec.rb @@ -0,0 +1,332 @@ +# frozen_string_literal: true + +describe AojLegacyDocket do + before do + create(:case_distribution_lever, :request_more_cases_minimum) + create(:case_distribution_lever, :nod_adjustment) + create(:case_distribution_lever, :disable_legacy_non_priority) + create(:case_distribution_lever, :disable_legacy_priority) + create(:case_distribution_lever, :cavc_affinity_days) + create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) + end + + let(:docket) do + AojLegacyDocket.new + end + + let(:counts_by_priority_and_readiness) do + [ + { "n" => 1, "ready" => 1, "priority" => 1 }, + { "n" => 2, "ready" => 0, "priority" => 1 }, + { "n" => 4, "ready" => 1, "priority" => 0 }, + { "n" => 8, "ready" => 0, "priority" => 0 } + ] + end + + context "#docket_type" do + it "is legacy" do + expect(subject.docket_type).to eq "legacy" + end + end + + context "#genpop_priority_count" do + it "calls AojAppealRepository.genpop_priority_count" do + expect(AojAppealRepository).to receive(:genpop_priority_count) + subject.genpop_priority_count + end + end + + context "#ready_priority_appeal_ids" do + it "calls AojAppealRepository.priority_ready_appeal_vacols_ids" do + expect(AojAppealRepository).to receive(:priority_ready_appeal_vacols_ids) + subject.ready_priority_appeal_ids + end + end + + context "#count" do + before do + allow(LegacyAppeal.aoj_appeal_repository).to receive(:docket_counts_by_priority_and_readiness) + .and_return(counts_by_priority_and_readiness) + end + + it "correctly aggregates the docket counts" do + expect(docket.count).to eq(15) + expect(docket.count(ready: true)).to eq(5) + expect(docket.count(priority: false)).to eq(12) + expect(docket.count(ready: false, priority: true)).to eq(2) + end + end + + context "#oldest_priority_appeals_days_waiting" do + subject { docket.oldest_priority_appeal_days_waiting } + + context "when there is no oldest priority appeal" do + it "returns zero" do + expect(docket).to receive(:age_of_oldest_priority_appeal).and_return(nil) + expect(subject).to eq 0 + end + end + + context "when there is an oldest priority appeal" do + let(:start_time) { Time.zone.local(2020, 1, 1) } + let(:number_of_days) { 10 } + let(:end_time) { start_time + number_of_days.days } + + before { Timecop.freeze(end_time) } + + it "returns the age in days" do + expect(docket).to receive(:age_of_oldest_priority_appeal) + .and_return(start_time) + .exactly(2).times + + expect(subject).to eq number_of_days + end + end + end + + context "#age_of_n_oldest_priority_appeals_available_to_judge" do + let(:judge) { create(:user, :with_vacols_judge_record) } + subject { AojLegacyDocket.new.age_of_n_oldest_priority_appeals_available_to_judge(judge, 3) } + + it "returns the receipt_date(BFD19) field of the oldest legacy priority appeals ready for distribution" do + appeal = create_priority_distributable_legacy_appeal_not_tied_to_judge + expect(subject).to eq([appeal.bfd19]) + end + end + + context "#age_of_n_oldest_nonpriority_appeals_available_to_judge" do + let(:judge) { create(:user, :with_vacols_judge_record) } + subject { AojLegacyDocket.new.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, 3) } + + it "returns the receipt_date(BFD19) field of the oldest legacy nonpriority appeals ready for distribution" do + appeal = create_nonpriority_distributable_legacy_appeal_not_tied_to_judge + expect(subject).to eq([appeal.bfd19]) + end + end + + context "#age_of_oldest_priority_appeal" do + context "use_by_docket_date is true" do + before { FeatureToggle.enable!(:acd_distribute_by_docket_date) } + after { FeatureToggle.disable!(:acd_distribute_by_docket_date) } + subject { AojLegacyDocket.new.age_of_oldest_priority_appeal } + it "returns the receipt_date(BFD19) field of the oldest legacy priority appeals ready for distribution" do + appeal = create_priority_distributable_legacy_appeal_not_tied_to_judge + expect(subject).to eq(appeal.bfd19.to_date) + end + end + + context "use by_docket_date is false" do + subject { AojLegacyDocket.new.age_of_oldest_priority_appeal } + it "returns the receipt_date(BFDLOOUT) field of the oldest legacy priority appeals ready for distribution" do + appeal = create_priority_distributable_legacy_appeal_not_tied_to_judge + expect(subject).to eq(appeal.bfdloout) + end + end + end + + context "#distribute_priority_appeals" do + let(:judge) { create(:user, :judge, :with_vacols_judge_record) } + let(:genpop) { "any" } # this isn't significant here I don't think + let(:style) { "push" } # .. + let(:limit) { 1 } # .. + let(:distribution) { Distribution.create!(judge: judge) } + subject { docket.distribute_priority_appeals(distribution) } + + context "when should_distribute? returns false, blocking distribution" do + it "returns an empty array" do + expect(docket).to receive(:should_distribute?) + .with(distribution, genpop: genpop, style: style) + .and_return(false) + expect(subject).to eq [] + subject + end + end + + context "when should_distribute? allows distribution" do + let!(:some_cases) { create_list(:case, 2, :type_post_remand) } + + # AojAppealRepository doesn't do much but call VACOLS::AojCaseDocket.distribute_appeals, + # for which we have good coverage. Just unit-test our part here: + it "uses AojAppealRepository's distribute_priority_appeals method and returns VACOLS cases" do + expect(docket).to receive(:should_distribute?) + .with(distribution, genpop: genpop, style: style) + .and_return(true) + expect(AojAppealRepository).to receive(:distribute_priority_appeals) + .with(judge, genpop, limit) + .and_return(some_cases) + + expect(subject.size).to eq some_cases.size + end + end + end + + context "#distribute_nonpriority_appeals" do + let(:judge) { create(:user, :judge, :with_vacols_judge_record) } + let(:genpop) { "any" } # this isn't significant here I don't think + let(:style) { "push" } # .. + let(:limit) { 1 } # .. + let(:range) { nil } + let(:bust_backlog) { false } + let(:distribution) { Distribution.create!(judge: judge) } + subject { docket.distribute_nonpriority_appeals(distribution, range: range) } + + context "when should_distribute? returns false, blocking distribution" do + before do + expect(docket).to receive(:should_distribute?).and_return(false) + end + + it "returns an empty array" do + expect(subject).to eq [] + end + end + + context "when range is zero or less" do + let(:range) { 0 } + it "returns an empty array" do + expect(subject).to eq [] + expect(AojAppealRepository).not_to receive(:distribute_nonpriority_appeals) + end + end + + context "when should_distribute? returns true and range is nil or >= 0" do + let(:two_cases_as_hashes) do + cases = create_list(:case, 2) + i = 0 + cases.map do |kase| + { bfkey: kase.bfkey, bfdloout: kase.bfdloout, vlj: judge.css_id, docket_index: i += 1 }.stringify_keys + end + end + + it "calls AojAppealRepository.distribute_nonpriority_appeals and returns cases" do + expect(AojAppealRepository).to receive(:distribute_nonpriority_appeals) + .with(judge, genpop, range, limit, bust_backlog) + .and_return(two_cases_as_hashes) + + expect(subject.size).to eq 2 + end + end + end + + context "#affinity_date_count" do + before do + create_priority_distributable_legacy_appeal_not_tied_to_judge + create_aoj_aod_cavc_ready_priority_case_1 + create_aoj_aod_cavc_ready_priority_case_2 + create_aoj_cavc_ready_priority_case + create_nonpriority_aoj_ready_case + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123456") + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123457") + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123458") + end + + context "when priority is true" do + context "with in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(true, true)).to eq(2) + end + end + + context "with out in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(false, true)).to eq(2) + end + end + end + + context "when priority is false" do + context "with in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(true, false)).to eq(1) + end + end + + context "with out in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(false, false)).to eq(3) + end + end + end + end + # {priority out of window} + def create_priority_distributable_legacy_appeal_not_tied_to_judge + create( + :case, + :aod, + bfkey: "12345", + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: 3.days.ago + ) + end + + # {nonpriority out of window} + def create_nonpriority_distributable_legacy_appeal_not_tied_to_judge(bfkey = "12345") + create( + :case, + bfkey: bfkey, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: 3.days.ago + ) + end + + # {nonpriority in window} + def create_nonpriority_aoj_ready_case + create( + :legacy_aoj_appeal, + affinity_start_date: 2.days.ago, + tied_to: false, + bfkey: "122222", + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: 3.days.ago + ) + end + + # {priority in window} + def create_aoj_aod_cavc_ready_priority_case_1 + create(:legacy_aoj_appeal, + :aod, + affinity_start_date: 1.day.ago, + cavc: true, + bfd19: 11.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end + + # {priority out of window} + def create_aoj_aod_cavc_ready_priority_case_2 + create(:legacy_aoj_appeal, + :aod, + affinity_start_date: 2.months.ago, + cavc: true, + bfd19: 11.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end + + # {priority out of window} + def create_aoj_cavc_ready_priority_case + create(:legacy_aoj_appeal, + affinity_start_date: 1.month.ago, + cavc: true, + bfd19: 11.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end +end diff --git a/spec/models/dockets/hearing_request_docket_spec.rb b/spec/models/dockets/hearing_request_docket_spec.rb index 971ac83d2b6..b920efabb99 100644 --- a/spec/models/dockets/hearing_request_docket_spec.rb +++ b/spec/models/dockets/hearing_request_docket_spec.rb @@ -376,6 +376,43 @@ end end + context "#affinity_date_count" do + let!(:hearing_judge) do + create(:user, :judge, :with_vacols_judge_record) + end + let!(:hearing_docket_appeal) do + create(:appeal, :hearing_docket, :held_hearing_and_ready_to_distribute, + :with_appeal_affinity, tied_judge: hearing_judge) + end + let!(:aod_hearing_docket_appeal) do + create(:appeal, :hearing_docket, :advanced_on_docket_due_to_age, :held_hearing_and_ready_to_distribute, + :with_appeal_affinity, tied_judge: hearing_judge) + end + let!(:hearing_lever) do + create(:case_distribution_lever, :ama_hearing_case_affinity_days) + end + let!(:aod_hearing_lever) do + create(:case_distribution_lever, :ama_hearing_case_aod_affinity_days) + end + let!(:hearing_request_instance) { HearingRequestDocket.new } + + context "for nonpriority" do + subject { hearing_request_instance.affinity_date_count(true, false) } + + it "correctly accounts for affinities to judges based on most recently held hearing" do + expect(subject).to eq(1) + end + end + + context "for priority" do + subject { hearing_request_instance.affinity_date_count(true, true) } + + it "correctly accounts for affinities to judges based on most recently held hearing" do + expect(subject).to eq(1) + end + end + end + context "#distribute_appeals" do let!(:requesting_judge_no_attorneys) { create(:user, :judge, :with_vacols_judge_record) } let!(:requesting_judge_with_attorneys) { create(:user, :judge, :with_vacols_judge_record) } diff --git a/spec/models/dockets/legacy_docket_spec.rb b/spec/models/dockets/legacy_docket_spec.rb index 83ccb4d00bd..a73884360cf 100644 --- a/spec/models/dockets/legacy_docket_spec.rb +++ b/spec/models/dockets/legacy_docket_spec.rb @@ -8,6 +8,9 @@ create(:case_distribution_lever, :disable_legacy_priority) create(:case_distribution_lever, :cavc_affinity_days) create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) end let(:docket) do @@ -356,28 +359,104 @@ end end + context "#affinity_date_count" do + before do + create_priority_distributable_legacy_appeal_not_tied_to_judge + create_aod_cavc_ready_priority_case_1 + create_aod_cavc_ready_priority_case_2 + create_cavc_ready_priority_case + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123456") + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123457") + create_nonpriority_distributable_legacy_appeal_not_tied_to_judge("123458") + end + + context "when priority is true" do + context "with in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(true, true)).to eq(1) + end + end + + context "with out in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(false, true)).to eq(3) + end + end + end + + context "when priority is false" do + context "with in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(true, false)) + .to eq("N/A for legacy appeals which are nonpriority and non-AOJ") + end + end + + context "with out in window affinity" do + it "returns affinity date count" do + expect(docket.affinity_date_count(false, false)) + .to eq("N/A for legacy appeals which are nonpriority and non-AOJ") + end + end + end + end + def create_priority_distributable_legacy_appeal_not_tied_to_judge create( :case, :aod, bfkey: "12345", bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago ) end - def create_nonpriority_distributable_legacy_appeal_not_tied_to_judge + def create_nonpriority_distributable_legacy_appeal_not_tied_to_judge(bfkey = "12345") create( :case, - bfkey: "12345", + bfkey: bfkey, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago ) end + + def create_aod_cavc_ready_priority_case_1 + create(:case, + :aod, + :with_appeal_affinity, + bfd19: 11.months.ago, + bfac: "7", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end + + def create_aod_cavc_ready_priority_case_2 + create(:case, + :aod, + :with_appeal_affinity, + affinity_start_date: 2.months.ago, + bfd19: 11.months.ago, + bfac: "7", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end + + def create_cavc_ready_priority_case + create(:case, + :with_appeal_affinity, + affinity_start_date: 1.month.ago, + bfd19: 11.months.ago, + bfac: "7", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago) + end end diff --git a/spec/models/vacols/aoj_case_docket_spec.rb b/spec/models/vacols/aoj_case_docket_spec.rb new file mode 100644 index 00000000000..c45a3677356 --- /dev/null +++ b/spec/models/vacols/aoj_case_docket_spec.rb @@ -0,0 +1,1463 @@ +# frozen_string_literal: true + +describe VACOLS::AojCaseDocket, :all_dbs do + before do + FeatureToggle.enable!(:test_facols) + FeatureToggle.enable!(:acd_disable_legacy_lock_ready_appeals) + FeatureToggle.enable!(:acd_distribute_by_docket_date) + FeatureToggle.enable!(:acd_cases_tied_to_judges_no_longer_with_board) + FeatureToggle.enable!(:acd_exclude_from_affinity) + create(:case_distribution_lever, :aoj_cavc_affinity_days) + create(:case_distribution_lever, :cavc_affinity_days) + create(:case_distribution_lever, :cavc_aod_affinity_days) + create(:case_distribution_lever, :aoj_aod_affinity_days) + create(:case_distribution_lever, :aoj_affinity_days) + end + + after do + FeatureToggle.disable!(:test_facols) + end + + let!(:nod_stage_appeal) { create(:case, bfmpro: "ADV") } + + let(:judge) { create(:user) } + let!(:vacols_judge) { create(:staff, :judge_role, sdomainid: judge.css_id) } + + let(:another_judge) { create(:user) } + let!(:another_vacols_judge) { create(:staff, :judge_role, sdomainid: another_judge.css_id) } + + let(:inactive_judge) { create(:user, :inactive) } + let!(:inactive_vacols_judge) { create(:staff, :judge_role, svlj: "V", sdomainid: inactive_judge.css_id) } + + let(:caseflow_attorney) { create(:user) } + let!(:vacols_attorney) { create(:staff, :attorney_role, sdomainid: caseflow_attorney.css_id) } + + let(:nonpriority_ready_case_bfbox) { nil } + let(:nonpriority_ready_case_docket_number) { "1801001" } + let!(:nonpriority_ready_case) do + create(:case, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: 3.days.ago, + bfbox: nonpriority_ready_case_bfbox, + folder: build(:folder, tinum: nonpriority_ready_case_docket_number, titrnum: "123456789S")) + end + + let(:original_docket_number) { nonpriority_ready_case_docket_number } + let(:original_judge) { judge.vacols_attorney_id } + let!(:original) do + create(:case, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "HIS", + bfcurloc: "99", + bfattid: "111", + bfmemid: original_judge, + folder: build(:folder, tinum: original_docket_number, titrnum: "123456789S")) + end + + let(:another_nonpriority_ready_case_docket_number) { "1801002" } + let!(:another_nonpriority_ready_case) do + create( + :case, + bfd19: 11.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago, + folder: build(:folder, tinum: another_nonpriority_ready_case_docket_number, titrnum: "123456789S") + ).tap { |vacols_case| create(:mail, :blocking, :completed, mlfolder: vacols_case.bfkey) } + end + + let(:third_nonpriority_ready_case_docket_number) { "1801005" } + let(:third_nonpriority_ready_case) do + create(:case, + bfd19: 10.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 1.day.ago, + folder: build(:folder, tinum: third_nonpriority_ready_case_docket_number, titrnum: "123456789S")) + end + let(:inactive_original_judge) { inactive_judge.vacols_attorney_id } + let(:inactive_original_case) do + create(:case, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "HIS", + bfcurloc: "99", + bfattid: "111", + bfmemid: inactive_original_judge, + folder: build(:folder, tinum: third_nonpriority_ready_case_docket_number, titrnum: "123456789S")) + end + + let!(:nonpriority_unready_case) do + create(:case, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "57", + bfdloout: 1.day.ago) + end + + let(:aod_ready_case_bfbox) { nil } + let(:aod_ready_case_docket_number) { "1801003" } + let(:aod_ready_case_ready_time) { 3.days.ago } + let!(:aod_ready_case) do + create(:case, + :aod, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81", + bfdloout: aod_ready_case_ready_time, + bfbox: aod_ready_case_bfbox, + folder: build(:folder, tinum: aod_ready_case_docket_number, titrnum: "123456789S")) + end + + # {Priority Ready} + let(:postcavc_ready_case_docket_number) { "1801004" } + let!(:postcavc_ready_case) do + create(:case, + :aod, + bfd19: 11.months.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "83", + bfdloout: 2.days.ago, + folder: build(:folder, tinum: postcavc_ready_case_docket_number, titrnum: "123456789S")) + end + + # {Priority Unready} + let!(:aod_case_unready_due_to_location) do + create(:case, + :aod, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "55") + end + + # {Priority Unready} + let!(:aod_case_unready_due_to_blocking_mail) do + create(:case, + :aod, + bfd19: 1.year.ago, + bfac: "3", + bfmpro: "ACT", + bfcurloc: "81").tap { |vacols_case| create(:mail, :blocking, :incomplete, mlfolder: vacols_case.bfkey) } + end + + context ".counts_by_priority_and_readiness" do + subject { VACOLS::AojCaseDocket.counts_by_priority_and_readiness } + it "creates counts grouped by priority and readiness" do + expect(subject).to match_array([ + { "n" => 2, "priority" => 1, "ready" => 0 }, + { "n" => 2, "priority" => 1, "ready" => 1 }, + { "n" => 1, "priority" => 0, "ready" => 0 }, + { "n" => 2, "priority" => 0, "ready" => 1 } + ]) + end + end + + context ".genpop_priority_count" do + subject { VACOLS::AojCaseDocket.genpop_priority_count } + it "counts genpop priority appeals" do + expect(subject).to eq(2) + end + + context "with affinitized appeals" do + let!(:aoj_aod_cavc_ready_case_within_affinity) do + create(:legacy_aoj_appeal, + :aod, + cavc: true, + judge: vacols_judge, + attorney: vacols_attorney, + tied_to: false, + affinity_start_date: 3.days.ago) + end + + let!(:aoj_aod_ready_case_within_affinity) do + create(:legacy_aoj_appeal, + :aod, + judge: vacols_judge, + attorney: vacols_attorney, + tied_to: false, + affinity_start_date: 3.days.ago) + end + + let!(:aoj_cavc_ready_case_within_affinity) do + create(:legacy_aoj_appeal, + cavc: true, + judge: vacols_judge, + attorney: vacols_attorney, + tied_to: false, + affinity_start_date: 3.days.ago) + end + + it "correctly filters out appeals based on the lever filters" do + expect(subject).to eq(2) + end + end + end + + context ".age_of_oldest_priority_appeal" do + subject { VACOLS::AojCaseDocket.age_of_oldest_priority_appeal } + + it "returns the oldest priority appeal ready at date" do + expect(subject).to eq(aod_ready_case.bfdloout) + end + + context "when an appeal is tied to a judge" do + let(:original_docket_number) { aod_ready_case_docket_number } + let!(:hearing) do + create(:case_hearing, + :disposition_held, + folder_nr: original.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: judge.vacols_attorney_id) + end + + it "does not affect the results of the call" do + expect(subject).to eq(aod_ready_case.bfdloout) + end + end + end + + context ".nonpriority_hearing_cases_for_judge_count" do + subject { VACOLS::AojCaseDocket.nonpriority_hearing_cases_for_judge_count(judge) } + + let(:hearing_judge) { judge.vacols_attorney_id } + let(:first_case) { nonpriority_ready_case } + let(:second_case) { another_nonpriority_ready_case } + let(:third_case) { third_nonpriority_ready_case } + + before do + create( + :case_hearing, + :disposition_held, + folder_nr: first_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: hearing_judge + ) + + create( + :case_hearing, + :disposition_held, + folder_nr: second_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: hearing_judge + ) + end + + context "when there are only priority cases linked to the judge" do + let(:first_case) { aod_ready_case } + let(:second_case) { aod_ready_case } + + it "returns no cases" do + expect(subject).to eq 0 + end + end + + context "when there are only non priority cases linked to another judge" do + let(:hearing_judge) { another_judge.vacols_attorney_id } + + it "returns no cases" do + expect(subject).to eq 0 + end + end + + context "when there are ready non priority hearings linked to the judge" do + it "returns the number of ready non priority hearings" do + expect(subject).to eq 2 + end + end + + context "when there are ready non priority hearings linked to the judge and inactive judge" do + before do + FeatureToggle.enable!(:acd_cases_tied_to_judges_no_longer_with_board) + third_nonpriority_ready_case + inactive_original_case + create( + :case_hearing, + :disposition_held, + folder_nr: third_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: inactive_judge.vacols_attorney_id + ) + end + + it "returns the number of ready non priority hearings" do + allow(Rails.cache).to receive(:fetch).with("case_distribution_ineligible_judges") + .and_return([{ sattyid: inactive_vacols_judge.sattyid }]) + allow(DatabaseRequestCounter).to receive(:increment_counter).and_return(3) + + expect(subject).to eq 3 + end + end + end + + context ".distribute_nonpriority_appeals" do + let(:genpop) { "any" } + let(:range) { nil } + let(:limit) { 10 } + let(:bust_backlog) { false } + + before do + FeatureToggle.enable!(:acd_cases_tied_to_judges_no_longer_with_board) + nonpriority_ready_case.reload + another_nonpriority_ready_case.reload + third_nonpriority_ready_case.reload + end + + subject { VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, genpop, range, limit, bust_backlog) } + + it "distributes ready genpop cases" do + expect(subject.count).to eq(3) + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + + it "does not distribute non-ready or priority cases" do + expect(nonpriority_unready_case.reload.bfcurloc).to eq("57") + expect(aod_ready_case.reload.bfcurloc).to eq("81") + expect(postcavc_ready_case.reload.bfcurloc).to eq("83") + end + + context "when limited" do + let(:limit) { 1 } + it "only distributes cases to the limit" do + expect(subject.count).to eq(1) + expect(subject.first["bfkey"]).to eq nonpriority_ready_case.bfkey + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when range is specified" do + let(:range) { 1 } + + # We do not provide a range if this feature toggle is enabled + before { FeatureToggle.disable!(:acd_distribute_by_docket_date) } + + context "when the docket number is pre-y2k", skip: "flaky" do + let(:another_nonpriority_ready_case_docket_number) { "9901002" } + it "correctly orders the docket", skip: "flaky" do + expect(subject.count).to eq(1) + expect(subject.first["bfkey"]).to eq another_nonpriority_ready_case.bfkey + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + end + + context "when a case is tied to a judge by a hearing on a prior appeal" do + let(:hearing_judge) { judge.vacols_attorney_id } + let(:another_hearing_judge) { another_judge.vacols_attorney_id } + let!(:hearing) do + create(:case_hearing, + :disposition_held, + folder_nr: original.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: hearing_judge) + end + + let!(:another_hearing) do + create(:case_hearing, + :disposition_held, + folder_nr: another_nonpriority_ready_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: another_hearing_judge) + end + + context "when genpop is no" do + let(:genpop) { "not_genpop" } + it "distributes the case" do + expect(subject.count).to eq(1) + expect(subject.first["bfkey"]).to eq nonpriority_ready_case.bfkey + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when genpop is any" do + it "distributes the case" do + expect(subject.count).to eq(2) + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + + context "when genpop is yes" do + let(:genpop) { "only_genpop" } + it "does distribute the case only tied to inactive judge" do + expect(subject.count).to eq(1) + expect(subject.first["bfkey"]).to eq third_nonpriority_ready_case.bfkey + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when bust backlog is specified" do + let(:limit) { 2 } + let(:bust_backlog) { true } + let(:another_hearing_judge) { judge.vacols_attorney_id } + + # We don't use bust backlog if this feature toggle is enabled + before { FeatureToggle.disable!(:acd_distribute_by_docket_date) } + + context "when the judge does not have 30 cases in their backlog" do + it "does not distribute any appeals" do + expect(subject.count).to eq(0) + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when the judge's backlog is full" do + let(:number_of_cases_over_backlog) { 1 } + + before do + allow(VACOLS::AojCaseDocket).to receive(:nonpriority_hearing_cases_for_judge_count).with(judge) + .and_return(VACOLS::AojCaseDocket::HEARING_BACKLOG_LIMIT + number_of_cases_over_backlog) + end + + it "only distributes the one case to get back down to 30", skip: "flaky" do + expect(subject.count).to eq(number_of_cases_over_backlog) + expect(subject.first["bfkey"]).to eq nonpriority_ready_case.bfkey + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(another_nonpriority_ready_case.reload.bfcurloc).to eq("83") + end + end + end + end + + context "when the case is set aside for a specialty case team" do + let(:nonpriority_ready_case_bfbox) { "01" } + + it "does not distribute the case" do + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + end + end + + context "when the case has pending mail" do + let(:mltype) { "01" } + let!(:mail) { create(:mail, mlfolder: nonpriority_ready_case.bfkey, mltype: mltype) } + + it "does not distribute the case" do + expect(subject.count).to eq(2) + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + end + + context "when the mail should not block distribution" do + let(:mltype) { "02" } + + it "distributes the case" do + expect(subject.count).to eq(3) + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + + context "when the case has a pending diary" do + let(:code) { "POA" } + let!(:diary) { create(:diary, tsktknm: nonpriority_ready_case.bfkey, tskactcd: code) } + + it "does not distribute the case" do + expect(subject.count).to eq(2) + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + end + + context "when the diary should not block distribution" do + let(:code) { "IHP" } + + it "distributes the case" do + expect(subject.count).to eq(3) + expect(nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(third_nonpriority_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + end + + context ".distribute_priority_appeals" do + let(:genpop) { "any" } + let(:limit) { 10 } + + subject { VACOLS::AojCaseDocket.distribute_priority_appeals(judge, genpop, limit) } + + it "distributes ready genpop cases" do + expect(subject.count).to eq(2) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + + it "does not distribute non-ready or nonpriority cases" do + expect(aod_case_unready_due_to_location.reload.bfcurloc).to eq("55") + expect(nonpriority_ready_case.reload.bfcurloc).to eq("81") + end + + context "when limited" do + let(:limit) { 1 } + it "only distributes cases to the limit" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when a case is tied to a judge by a hearing on a prior appeal" do + let(:original_docket_number) { aod_ready_case_docket_number } + let(:hearing_judge) { judge.vacols_attorney_id } + let(:another_hearing_judge) { another_judge.vacols_attorney_id } + let!(:hearing) do + create(:case_hearing, + :disposition_held, + folder_nr: original.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: hearing_judge) + end + + let!(:another_hearing) do + create(:case_hearing, + :disposition_held, + folder_nr: postcavc_ready_case.bfkey, + hearing_date: 5.days.ago.to_date, + board_member: another_hearing_judge) + end + + context "when genpop is no" do + let(:genpop) { "not_genpop" } + it "distributes the case" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq("83") + end + + context "when limit is nil" do + let(:limit) { nil } + let(:another_hearing_judge) { judge.vacols_attorney_id } + + it "distributes all cases tied to the judge" do + expect(subject.count).to eq(2) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + + context "when genpop is any" do + it "distributes the case" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq("83") + end + end + + context "when genpop is yes" do + let(:genpop) { "only_genpop" } + it "does not distribute the case" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + expect(postcavc_ready_case.reload.bfcurloc).to eq("83") + end + end + end + + context "when an aod case is tied to the same judge as last decided the case" do + let(:original_docket_number) { aod_ready_case_docket_number } + let(:genpop) { "not_genpop" } + + context "when distributing genpop cases" do + let(:genpop) { "only_genpop" } + + context "when a placeholder judge code is used" do + let(:original_judge) { "000" } + + it "distributes the case" do + subject + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + + context "when the case has been made genpop" do + before do + aod_ready_case.update(bfhines: "GP") + end + + it "distributes the case" do + subject + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + end + + context "when the case is set aside for a specialty case team" do + let(:aod_ready_case_bfbox) { "01" } + + it "does not distribute the case" do + expect(aod_ready_case.reload.bfcurloc).to eq("81") + end + end + + context "when the case has pending mail" do + let(:mltype) { "01" } + let!(:mail) { create(:mail, mlfolder: aod_ready_case.bfkey, mltype: mltype) } + + it "does not distribute the case" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq("81") + end + + context "when the mail should not block distribution" do + let(:mltype) { "02" } + + it "distributes the case" do + expect(subject.count).to eq(2) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + + context "when the case has a pending diary" do + let(:code) { "POA" } + let!(:diary) { create(:diary, tsktknm: aod_ready_case.bfkey, tskactcd: code) } + + it "does not distribute the case" do + expect(subject.count).to eq(1) + expect(aod_ready_case.reload.bfcurloc).to eq("81") + end + + context "when the diary should not block distribution" do + let(:code) { "IHP" } + + it "distributes the case" do + expect(subject.count).to eq(2) + expect(aod_ready_case.reload.bfcurloc).to eq(judge.vacols_uniq_id) + end + end + end + end + + context "legacy_das_deprecation FeatureToggle enabled" do + before do + FeatureToggle.enable!(:legacy_das_deprecation) + end + + after do + FeatureToggle.disable!(:legacy_das_deprecation) + end + + it "sets the case location to 'CASEFLOW'" do + VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, "any", nil, 2, false) + expect(nonpriority_ready_case.reload.bfcurloc).to eq(LegacyAppeal::LOCATION_CODES[:caseflow]) + end + end + + # rubocop:disable Layout/LineLength + context "when CaseDistributionLever" do + before do + VACOLS::Case.where(bfcurloc: %w[81 83]).map { |c| c.update!(bfcurloc: "testing") } + end + + def create_case_hearing(orig_case, hearing_judge) + create(:case_hearing, :disposition_held, folder_nr: (orig_case.bfkey.to_i - 1).to_s, + hearing_date: Time.zone.today, user: hearing_judge) + end + + let(:aff_judge_caseflow) { create(:user) } + let!(:aff_judge) { create(:staff, :judge_role, sdomainid: aff_judge_caseflow.css_id) } + + let(:other_judge_caseflow) { create(:user) } + let!(:other_judge) { create(:staff, :judge_role, sdomainid: other_judge_caseflow.css_id) } + + let(:tied_judge_caseflow) { create(:user) } + let!(:tied_judge) { create(:staff, :judge_role, sdomainid: tied_judge_caseflow.css_id) } + + let(:inel_judge_caseflow) { create(:user) } + let!(:inel_judge) { create(:staff, :judge_role, svlj: "V", sdomainid: inel_judge_caseflow.css_id) } + + let(:excl_judge_caseflow) { create(:user, :judge_with_appeals_excluded_from_affinity) } + let!(:excl_judge) { create(:staff, :judge_role, sdomainid: excl_judge_caseflow.css_id) } + + let(:attorney_caseflow) { create(:user) } + let!(:attorney) { create(:staff, :attorney_role, sdomainid: attorney_caseflow.css_id) } + + context ".aoj_affinity_days lever is active" do + # aoj affinity cases: + # no hearing held but has previous decision + let!(:c1) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, tied_to: false) + end + let!(:c2) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + end + let!(:c3) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + end + # hearing held with previous decision where judge is not the same + let!(:c4) do + c4 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c4.bfcorlid, bfkey: (c4.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c4 + end + let!(:c5) do + c5 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: c5.bfcorlid, bfkey: (c5.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c5 + end + let!(:c6) do + c6 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: c6.bfcorlid, bfkey: (c6.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c6 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c7) { create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney) } + let!(:c8) do + create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, affinity_start_date: 3.days.ago) + end + let!(:c9) { create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, appeal_affinity: false) } + # hearing held but no previous deciding judge where hearing judge is active + let!(:c10) do + c10 = create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c10.bfcorlid, bfkey: (c10.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c10 + end + # no hearing held, no previous deciding judge + let!(:c11) do + c11 = create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false) + VACOLS::Case.where(bfcorlid: c11.bfcorlid, bfkey: (c11.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c11 + end + # excluded judge cases: + # no hearing held but has previous decision + let!(:c12) { create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, tied_to: false) } + let!(:c13) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + end + let!(:c14) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + end + # hearing held with previous decision where judge is not the same + let!(:c15) do + c15 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c15.bfcorlid, bfkey: (c15.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c15 + end + let!(:c16) do + c16 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: c16.bfcorlid, bfkey: (c16.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c16 + end + let!(:c17) do + c17 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: c17.bfcorlid, bfkey: (c17.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c17 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c18) { create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney) } + let!(:c19) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, affinity_start_date: 3.days.ago) + end + let!(:c20) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, appeal_affinity: false) + end + # ineligible judge cases: + # no hearing held but has previous decision + let!(:c21) { create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, tied_to: false) } + let!(:c22) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago) + end + let!(:c23) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, appeal_affinity: false) + end + # hearing held with previous decision where judge is not the same + let!(:c24) do + c24 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c24.bfcorlid, bfkey: (c24.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c24 + end + let!(:c25) do + c25 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: c25.bfcorlid, bfkey: (c25.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c25 + end + let!(:c26) do + c26 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: c26.bfcorlid, bfkey: (c26.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c26 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c27) { create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney) } + let!(:c28) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago) + end + let!(:c29) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false) + end + # hearing held but no previous deciding judge + let!(:c30) do + c30 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c30.bfcorlid, bfkey: (c30.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c30 + end + # hearing held with previous decision where judge is not the same but hearing judge is ineligible + let!(:c31) do + c31 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c31.bfcorlid, bfkey: (c31.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c31 + end + let!(:c32) do + c32 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: c32.bfcorlid, bfkey: (c32.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c32 + end + let!(:c33) do + c33 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: c33.bfcorlid, bfkey: (c33.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c33 + end + # hearing held by excluded judge with no previous decision (tied to excl judge) + let!(:c34) do + c34 = create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: c34.bfcorlid, bfkey: (c34.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c34 + end + + it "distributes aoj cases correctly based on lever value", :aggregate_failures do + IneligibleJudgesJob.new.perform_now + aoj_lever = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_affinity_days) + + # {FOR LEVER BEING A VALUE:} + aoj_lever.update!(value: 14) + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, "any", 100, nil, false, true).map { |c| c["bfkey"] }.sort) + .to match_array([c1, c4, c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31] + .map { |c| c["bfkey"].to_i.to_s }.sort) + # {FOR LEVER BEING INFINITE:} + aoj_lever.update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache + expect( + VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, "any", 100, nil, false, true).map { |c| c["bfkey"] }.sort + ) + .to match_array([c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30] + .map { |c| c["bfkey"].to_i.to_s }.sort) + expect( + VACOLS::AojCaseDocket.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge, 100).count + ) + .to eq(17) + + # ensure that excluded judge recieves their tied cases which would not go to default judge + expect(VACOLS::AojCaseDocket.distribute_nonpriority_appeals(excl_judge_caseflow, "any", 100, nil, false, true) + .map { |c| c["bfkey"] }.sort) + .to match_array([ + c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c34 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + # {FOR LEVER BEING OMIT:} + aoj_lever.update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_nonpriority_appeals(judge, "any", 100, nil, false, true).map { |c| c["bfkey"] }.sort) + .to match_array([ + c1, c2, c3, c4, c5, c6, c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31, c32, c33 + ] + .map { |c| c["bfkey"].to_i.to_s }.sort) + end + end + + context ".aoj_cavc_affinity_days lever is active" do + # cavc affinity cases: + # no hearing held but has previous decision + let!(:c1) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, tied_to: false, cavc: true) + end + let!(:c2) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c3) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + # hearing held with previous decision where judge is not the same + let!(:c4) do + c4 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c4.bfcorlid, bfkey: (c4.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c4 + end + let!(:c5) do + c5 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: c5.bfcorlid, bfkey: (c5.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c5 + end + let!(:c6) do + c6 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: c6.bfcorlid, bfkey: (c6.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + c6 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c7) { create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, cavc: true) } + let!(:c8) do + create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c9) { create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, appeal_affinity: false, cavc: true) } + # hearing held but no previous deciding judge + let!(:c10) do + c10 = create(:legacy_aoj_appeal, judge: tied_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c10.bfcorlid, bfkey: (c10.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c10 + end + # no hearing held, no previous deciding judge where hearing judge is active + let!(:c11) do + c11 = create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, cavc: true) + VACOLS::Case.where(bfcorlid: c11.bfcorlid, bfkey: (c11.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c11 + end + # excluded judge cases: + # no hearing held but has previous decision + let!(:c12) { create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, tied_to: false, cavc: true) } + let!(:c13) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c14) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + # hearing held with previous decision where judge is not the same + let!(:c15) do + c15 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c15.bfcorlid, bfkey: (c15.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c15 + end + let!(:c16) do + c16 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: c16.bfcorlid, bfkey: (c16.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c16 + end + let!(:c17) do + c17 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: c17.bfcorlid, bfkey: (c17.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + c17 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c18) { create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, cavc: true) } + let!(:c19) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c20) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, appeal_affinity: false, cavc: true) + end + # ineligible judge cases: + # no hearing held but has previous decision + let!(:c21) { create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, tied_to: false, cavc: true) } + let!(:c22) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c23) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + # hearing held with previous decision where judge is not the same + let!(:c24) do + c24 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c24.bfcorlid, bfkey: (c24.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c24 + end + let!(:c25) do + c25 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, + affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: c25.bfcorlid, bfkey: (c25.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c25 + end + let!(:c26) do + c26 = create(:legacy_aoj_appeal, judge: other_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: c26.bfcorlid, bfkey: (c26.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + c26 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:c27) { create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, cavc: true) } + let!(:c28) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c29) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false, cavc: true) + end + # hearing held but no previous deciding judge + let!(:c30) do + c30 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c30.bfcorlid, bfkey: (c30.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c30 + end + # hearing held with previous decision where judge is not the same but hearing judge is ineligible + let!(:c31) do + c31 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c31.bfcorlid, bfkey: (c31.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c31 + end + let!(:c32) do + c32 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago, cavc: true) + VACOLS::Case.where(bfcorlid: c32.bfcorlid, bfkey: (c32.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c32 + end + let!(:c33) do + c33 = create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false, cavc: true) + VACOLS::Case.where(bfcorlid: c33.bfcorlid, bfkey: (c33.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + c33 + end + # hearing held by excluded judge with no previous decision (tied to excl judge) + let!(:c34) do + c34 = create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, cavc: true) + VACOLS::Case.where(bfcorlid: c34.bfcorlid, bfkey: (c34.bfkey.to_i + 1).to_s).update(bfmemid: nil) + c34 + end + + it "distributes CAVC cases correctly based on lever value", :aggregate_failures do + IneligibleJudgesJob.new.perform_now + aoj_cavc_lever = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_cavc_affinity_days) + + # {FOR LEVER BEING A VALUE:} + aoj_cavc_lever.update!(value: 14) + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([c1, c4, c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31] + .map { |c| c["bfkey"].to_i.to_s }.sort) + # {FOR LEVER BEING INFINITE:} + aoj_cavc_lever.update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache + expect( + VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort + ) + .to match_array([c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30] + .map { |c| c["bfkey"].to_i.to_s }.sort) + + # ensure that excluded judge recieves their tied cases which would not go to default judge + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(excl_judge_caseflow, "any", 100, true) + .map { |c| c["bfkey"] }.sort) + .to match_array([ + c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c34 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + # {FOR LEVER BEING OMIT:} + aoj_cavc_lever.update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([ + c1, c2, c3, c4, c5, c6, c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31, c32, c33 + ] + .map { |c| c["bfkey"].to_i.to_s }.sort) + end + end + + context ".aoj_aod_affinity_days lever is active" do + # aoj aod affinity cases: + # no hearing held but has previous decision + let!(:ca1) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false) } + let!(:ca2) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca3) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + # hearing held with previous decision where judge is not the same + let!(:ca4) do + ca4 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca4.bfcorlid, bfkey: (ca4.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + ca4 + end + let!(:ca5) do + ca5 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca5.bfcorlid, bfkey: (ca5.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + ca5 + end + let!(:ca6) do + ca6 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca6.bfcorlid, bfkey: (ca6.bfkey.to_i + 1).to_s).update(bfmemid: aff_judge.sattyid) + ca6 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:ca7) { create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney) } + let!(:ca8) { create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, affinity_start_date: 3.days.ago) } + let!(:ca9) { create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, appeal_affinity: false) } + # hearing held but no previous deciding judge where hearing judge is active + let!(:ca10) do + ca10 = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca10.bfcorlid, bfkey: (ca10.bfkey.to_i + 1).to_s).update(bfmemid: nil) + ca10 + end + # no hearing held, no previous deciding judge + let!(:ca11) do + ca11 = create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false) + VACOLS::Case.where(bfcorlid: ca11.bfcorlid, bfkey: (ca11.bfkey.to_i + 1).to_s).update(bfmemid: nil) + ca11 + end + # excluded judge cases: + # no hearing held but has previous decision + let!(:ca12) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false) } + let!(:ca13) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca14) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + # hearing held with previous decision where judge is not the same + let!(:ca15) do + ca15 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca15.bfcorlid, bfkey: (ca15.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + ca15 + end + let!(:ca16) do + ca16 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca16.bfcorlid, bfkey: (ca16.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + ca16 + end + let!(:ca17) do + ca17 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca17.bfcorlid, bfkey: (ca17.bfkey.to_i + 1).to_s).update(bfmemid: excl_judge.sattyid) + ca17 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:ca18) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney) } + let!(:ca19) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, affinity_start_date: 3.days.ago) } + let!(:ca20) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, appeal_affinity: false) } + # ineligible judge cases: + # no hearing held but has previous decision + let!(:ca21) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false) } + let!(:ca22) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca23) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + # hearing held with previous decision where judge is not the same + let!(:ca24) do + ca24 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca24.bfcorlid, bfkey: (ca24.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + ca24 + end + let!(:ca25) do + ca25 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca25.bfcorlid, bfkey: (ca25.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + ca25 + end + let!(:ca26) do + ca26 = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca26.bfcorlid, bfkey: (ca26.bfkey.to_i + 1).to_s).update(bfmemid: inel_judge.sattyid) + ca26 + end + # hearing held with previous decision where judge is same (THIS IS TIED TO) + let!(:ca27) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney) } + let!(:ca28) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago) } + let!(:ca29) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, appeal_affinity: false) } + # hearing held but no previous deciding judge + let!(:ca30) do + ca30 = create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca30.bfcorlid, bfkey: (ca30.bfkey.to_i + 1).to_s).update(bfmemid: nil) + ca30 + end + # hearing held with previous decision where judge is not the same but hearing judge is ineligible + let!(:ca31) do + ca31 = create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca31.bfcorlid, bfkey: (ca31.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + ca31 + end + let!(:ca32) do + ca32 = create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, affinity_start_date: 3.days.ago) + VACOLS::Case.where(bfcorlid: ca32.bfcorlid, bfkey: (ca32.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + ca32 + end + let!(:ca33) do + ca33 = create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, appeal_affinity: false) + VACOLS::Case.where(bfcorlid: ca33.bfcorlid, bfkey: (ca33.bfkey.to_i + 1).to_s).update(bfmemid: other_judge.sattyid) + ca33 + end + # hearing held by excluded judge with no previous decision (tied to excl judge) + let!(:ca34) do + ca34 = create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney) + VACOLS::Case.where(bfcorlid: ca34.bfcorlid, bfkey: (ca34.bfkey.to_i + 1).to_s).update(bfmemid: nil) + ca34 + end + + it "distributes AOJ AOD cases correctly based on lever value", :aggregate_failures do + IneligibleJudgesJob.new.perform_now + aoj_aod_lever = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_aod_affinity_days) + + # {FOR LEVER HAVING A VALUE:} + aoj_aod_lever.update!(value: 14) + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([ + ca1, ca4, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, ca25, + ca26, ca27, ca28, ca29, ca30, ca31 + ] + .map { |c| c["bfkey"].to_i.to_s }.sort) + + # {FOR LEVER BEING INFINITE:} + aoj_aod_lever.update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30] + .map { |c| c["bfkey"].to_i.to_s }.sort) + + # ensure that excluded judge recieves their tied cases which would not go to default judge + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(excl_judge_caseflow, "any", 100, true) + .map { |c| c["bfkey"] }.sort) + .to match_array([ + ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30, ca34 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + # {FOR LEVER BEING OMIT:} + aoj_aod_lever.update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([ + ca1, ca2, ca3, ca4, ca5, ca6, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, + ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33 + ] + .map { |c| c["bfkey"].to_i.to_s }.sort) + end + end + + context "aoj_cavc_affinity_days and aoj_aod_affinity_days levers are both set to infinite" do + # aoj aod affinity cases: + # no hearing held but has previous decision + let!(:ca1) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false) } + let!(:ca2) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca3) { create(:legacy_aoj_appeal, :aod, judge: aff_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + # excluded judge cases: + # no hearing held but has previous decision + let!(:ca12) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false) } + let!(:ca13) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca14) { create(:legacy_aoj_appeal, :aod, judge: excl_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + # ineligible judge cases: + # no hearing held but has previous decision + let!(:ca21) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false) } + let!(:ca22) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false, affinity_start_date: 3.days.ago) } + let!(:ca23) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: false, appeal_affinity: false) } + + # cavc affinity cases: + # no hearing held but has previous decision + let!(:c1) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, tied_to: false, cavc: true) + end + let!(:c2) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c3) do + create(:legacy_aoj_appeal, judge: aff_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + # excluded judge cases: + # no hearing held but has previous decision + let!(:c12) { create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, tied_to: false, cavc: true) } + let!(:c13) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c14) do + create(:legacy_aoj_appeal, judge: excl_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + # ineligible judge cases: + # no hearing held but has previous decision + let!(:c21) { create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, tied_to: false, cavc: true) } + let!(:c22) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, affinity_start_date: 3.days.ago, cavc: true) + end + let!(:c23) do + create(:legacy_aoj_appeal, judge: inel_judge, attorney: attorney, + tied_to: false, appeal_affinity: false, cavc: true) + end + + it "successfully runs without timing out" do + IneligibleJudgesJob.new.perform_now + aoj_aod_lever = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_aod_affinity_days) + aoj_cavc_lever = CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_cavc_affinity_days) + + aoj_aod_lever.update!(value: "infinite") + aoj_cavc_lever.update!(value: "infinite") + expect(VACOLS::AojCaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) + .to match_array([ca12, ca13, ca14, ca21, ca22, ca23, c12, c13, c14, c21, c22, c23] + .map { |c| c["bfkey"].to_i.to_s }.sort) + end + end + + context "for cases where a hearing has been held after the original decision date" do + let(:new_hearing_judge) { create(:user, :judge, :with_vacols_judge_record) } + + # original hearing held by tied_judge, decided by tied_judge, new hearing held by new_hearing_judge + let!(:case_1) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + create_case_hearing(original_case, new_hearing_judge) + c + end + # original hearing held by tied_judge, decided by other_judge, new hearing held by new_hearing_judge + let!(:case_2) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: other_judge.sattyid) + create_case_hearing(original_case, new_hearing_judge) + c + end + # no original hearing, decided by other_judge, new hearing held by new_hearing_judge + let!(:case_3) do + c = create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, tied_to: false) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + create_case_hearing(original_case, new_hearing_judge) + c + end + # original hearing held by tied_judge, no original deciding judge, new hearing held by new_hearing_judge + let!(:case_4) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: nil) + create_case_hearing(original_case, new_hearing_judge) + c + end + # no original hearing, no original deciding judge, new hearing held by new_hearing_judge + let!(:case_5) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: false) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: nil) + create_case_hearing(original_case, new_hearing_judge) + c + end + # original hearing held by tied_judge, decided by tied_judge, no new hearing + let!(:case_6) { create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) } + # original hearing held by tied_judge, decided by other_judge, no new hearing + let!(:case_7) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, + attorney: attorney, tied_to: true, affinity_start_date: 3.days.ago) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: other_judge.sattyid) + c + end + # no original hearing, decided by other_judge, no new hearing + let!(:case_8) do + create(:legacy_aoj_appeal, :aod, judge: other_judge, attorney: attorney, tied_to: false, + affinity_start_date: 3.days.ago) + end + # original hearing held by tied_judge, no original deciding judge, no new hearing + let!(:case_9) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: nil) + c + end + # no original hearing, no original deciding judge, no new hearing + let!(:case_10) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: false) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + original_case.update!(bfmemid: nil) + c + end + # original hearing held by tied_judge, decided by tied_judge, new hearing held by inel_judge + # this should have affinity to the original deciding judge because new hearing judge is ineligible + let!(:case_11) do + c = create(:legacy_aoj_appeal, :aod, + judge: tied_judge, attorney: attorney, tied_to: true, affinity_start_date: Time.zone.now) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + create_case_hearing(original_case, inel_judge_caseflow) + c + end + # original hearing held by inel_judge, decided by inel_judge, no new hearing + let!(:case_12) { create(:legacy_aoj_appeal, :aod, judge: inel_judge, attorney: attorney, tied_to: true) } + # original hearing held by tied_judge, decided by tied_judge, new hearing held by inel_judge + # this would have affinity to the original deciding judge but is out of affinity window + let!(:case_13) do + c = create(:legacy_aoj_appeal, :aod, judge: tied_judge, attorney: attorney, tied_to: true) + original_case = VACOLS::Case.find_by(bfcorlid: c.bfcorlid, bfkey: (c.bfkey.to_i + 1).to_s) + create_case_hearing(original_case, inel_judge_caseflow) + c + end + + it "considers cases tied to a judge if they held a hearing after the previous case was decided", :aggregate_failures do + IneligibleJudgesJob.perform_now + + tied_judge_cases = VACOLS::AojCaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) + other_judge_cases = VACOLS::AojCaseDocket.distribute_priority_appeals(other_judge_caseflow, "any", 100, true) + new_hearing_judge_cases = VACOLS::AojCaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) + + expect(new_hearing_judge_cases.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_1, case_2, case_3, case_4, case_5, case_10, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(tied_judge_cases.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_6, case_9, case_10, case_11, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(other_judge_cases.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_7, case_8, case_10, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + # For case distribution levers set to infinite + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_affinity_days).update!(value: "infinite") + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_aod_affinity_days).update!(value: "infinite") + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_cavc_affinity_days).update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache + + new_hrng_judge_infinite = VACOLS::AojCaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) + tied_judge_infinite = VACOLS::AojCaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) + other_judge_infinite = VACOLS::AojCaseDocket.distribute_priority_appeals(other_judge_caseflow, "any", 100, true) + + expect(new_hrng_judge_infinite.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_1, case_2, case_3, case_4, case_5, case_10, case_12 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(tied_judge_infinite.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_6, case_9, case_10, case_11, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(other_judge_infinite.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_7, case_8, case_10, case_12 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + # For case distribution levers set to omit + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_affinity_days).update!(value: "omit") + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_aod_affinity_days).update!(value: "omit") + CaseDistributionLever.find_by_item(Constants.DISTRIBUTION.aoj_cavc_affinity_days).update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache + + new_hearing_judge_omit = VACOLS::AojCaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) + tied_judge_omit = VACOLS::AojCaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) + other_judge_omit = VACOLS::AojCaseDocket.distribute_priority_appeals(other_judge_caseflow, "any", 100, true) + + expect(new_hearing_judge_omit.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_1, case_2, case_3, case_4, case_5, case_7, case_8, case_10, case_11, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(tied_judge_omit.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_6, case_7, case_8, case_9, case_10, case_11, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + + expect(other_judge_omit.map { |c| c["bfkey"] }.sort) + .to match_array([ + case_7, case_8, case_10, case_11, case_12, case_13 + ].map { |c| c["bfkey"].to_i.to_s }.sort) + end + end + end + # rubocop:enable Layout/LineLength +end diff --git a/spec/models/vacols/case_docket_spec.rb b/spec/models/vacols/case_docket_spec.rb index 073668e37f6..986330d1ab7 100644 --- a/spec/models/vacols/case_docket_spec.rb +++ b/spec/models/vacols/case_docket_spec.rb @@ -26,12 +26,15 @@ let(:inactive_judge) { create(:user, :inactive) } let!(:inactive_vacols_judge) { create(:staff, :judge_role, svlj: "V", sdomainid: inactive_judge.css_id) } + let(:caseflow_attorney) { create(:user) } + let!(:vacols_attorney) { create(:staff, :attorney_role, sdomainid: caseflow_attorney.css_id) } + let(:nonpriority_ready_case_bfbox) { nil } let(:nonpriority_ready_case_docket_number) { "1801001" } let!(:nonpriority_ready_case) do create(:case, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: 3.days.ago, @@ -69,7 +72,7 @@ let(:third_nonpriority_ready_case) do create(:case, bfd19: 10.months.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "83", bfdloout: 1.day.ago, @@ -103,7 +106,7 @@ create(:case, :aod, bfd19: 1.year.ago, - bfac: "3", + bfac: "1", bfmpro: "ACT", bfcurloc: "81", bfdloout: aod_ready_case_ready_time, @@ -160,6 +163,36 @@ end end + context ".genpop_priority_count" do + subject { VACOLS::CaseDocket.genpop_priority_count } + it "counts genpop priority appeals" do + expect(subject).to eq(2) + end + + context "with affinitized appeals" do + let!(:aod_cavc_ready_case_within_affinity) do + create(:legacy_cavc_appeal, + judge: vacols_judge, + attorney: vacols_attorney, + aod: true, + tied_to: false, + affinity_start_date: 3.days.ago) + end + + let!(:cavc_ready_case_within_affinity) do + create(:legacy_cavc_appeal, + judge: vacols_judge, + attorney: vacols_attorney, + tied_to: false, + affinity_start_date: 3.days.ago) + end + + it "correctly filters out appeals based on the lever filters" do + expect(subject).to eq(2) + end + end + end + context ".age_of_n_oldest_genpop_priority_appeals" do subject { VACOLS::CaseDocket.age_of_n_oldest_genpop_priority_appeals(2) } it "returns the sorted ages of the n oldest priority appeals" do @@ -743,7 +776,7 @@ create(:legacy_cavc_appeal, judge: tied_judge, attorney: attorney, affinity_start_date: 3.days.ago) end let!(:c9) { create(:legacy_cavc_appeal, judge: tied_judge, attorney: attorney, appeal_affinity: false) } - # hearing held but no previous deciding judge + # hearing held but no previous deciding judge where hearing judge is active let!(:c10) do c10 = create(:legacy_cavc_appeal, judge: tied_judge, attorney: attorney) c10.update!(bfmemid: nil) @@ -828,12 +861,35 @@ let!(:c29) do create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false) end - # hearing held but no previous deciding judge + # hearing held but no previous deciding judge where hearing judge is ineligible let!(:c30) do c30 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney) c30.update!(bfmemid: nil) c30 end + # hearing held with previous decision where judge is not the same but hearing judge is ineligible + let!(:c31) do + c31 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney) + c31.update!(bfmemid: other_judge.sattyid) + c31 + end + let!(:c32) do + c32 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, + affinity_start_date: 3.days.ago) + c32.update!(bfmemid: other_judge.sattyid) + c32 + end + let!(:c33) do + c33 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, appeal_affinity: false) + c33.update!(bfmemid: other_judge.sattyid) + c33 + end + # hearing held by excluded judge with no previous decision (tied to excl judge) + let!(:c34) do + c34 = create(:legacy_cavc_appeal, judge: excl_judge, attorney: attorney) + c34.update!(bfmemid: nil) + c34 + end it "distributes CAVC cases correctly based on lever value", :aggregate_failures do IneligibleJudgesJob.new.perform_now @@ -841,24 +897,40 @@ # {FOR LEVER BEING A VALUE:} cavc_lever.update!(value: 14) + CaseDistributionLever.clear_distribution_lever_cache expect(VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) .to match_array( - [c1, c4, c10, c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30] + [c1, c4, c11, c12, c13, c14, c15, c16, c17, c21, c22, + c23, c24, c25, c26, c27, c28, c29, c30, c31] .map { |c| (c["bfkey"].to_i + 1).to_s }.sort ) # {FOR LEVER BEING INFINITE:} cavc_lever.update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache expect( VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort ) - .to match_array([c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30] - .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) + .to match_array( + [c11, c12, c13, c14, c15, c16, c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30] + .map { |c| (c["bfkey"].to_i + 1).to_s }.sort + ) + + # ensure that excluded judge recieves their tied cases which would not go to default judge + expect(VACOLS::CaseDocket.distribute_priority_appeals(excl_judge_caseflow, "any", 100, true) + .map { |c| c["bfkey"] }.sort) + .to match_array([ + c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, + c25, c26, c27, c28, c29, c30, c34 + ] + .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) + # {FOR LEVER BEING OMIT:} cavc_lever.update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache expect(VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) .to match_array([ - c1, c2, c3, c4, c5, c6, c10, c11, c12, c13, c14, c15, c16, - c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30 + c1, c2, c3, c4, c5, c6, c11, c12, c13, c14, c15, c16, + c17, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31, c32, c33 ] .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) end @@ -902,7 +974,7 @@ let!(:ca9) do create(:legacy_cavc_appeal, judge: tied_judge, attorney: attorney, aod: true, appeal_affinity: false) end - # hearing held but no previous deciding judge + # hearing held but no previous deciding judge where hearing judge is active let!(:ca10) do ca10 = create(:legacy_cavc_appeal, judge: tied_judge, attorney: attorney, aod: true) ca10.update!(bfmemid: nil) @@ -988,12 +1060,35 @@ let!(:ca29) do create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, aod: true, appeal_affinity: false) end - # hearing held but no previous deciding judge + # hearing held but no previous deciding judge where hearing judge is ineligible let!(:ca30) do ca30 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, aod: true) ca30.update!(bfmemid: nil) ca30 end + # hearing held with previous decision where judge is not the same but hearing judge is ineligible + let!(:ca31) do + ca31 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, aod: true) + ca31.update!(bfmemid: other_judge.sattyid) + ca31 + end + let!(:ca32) do + ca32 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, aod: true, + affinity_start_date: 3.days.ago) + ca32.update!(bfmemid: other_judge.sattyid) + ca32 + end + let!(:ca33) do + ca33 = create(:legacy_cavc_appeal, judge: inel_judge, attorney: attorney, aod: true, appeal_affinity: false) + ca33.update!(bfmemid: other_judge.sattyid) + ca33 + end + # hearing held by excluded judge with no previous decision (tied to excl judge) + let!(:ca34) do + ca34 = create(:legacy_cavc_appeal, judge: excl_judge, attorney: attorney, aod: true) + ca34.update!(bfmemid: nil) + ca34 + end it "distributes CAVC AOD cases correctly based on lever value", :aggregate_failures do IneligibleJudgesJob.new.perform_now @@ -1001,25 +1096,39 @@ # {FOR LEVER HAVING A VALUE:} cavc_aod_lever.update!(value: 14) + CaseDistributionLever.clear_distribution_lever_cache expect(VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) .to match_array([ - ca1, ca4, ca10, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, ca25, - ca26, ca27, ca28, ca29, ca30 + ca1, ca4, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, ca25, + ca26, ca27, ca28, ca29, ca30, ca31 ] .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) # {FOR LEVER BEING INFINITE:} cavc_aod_lever.update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache expect(VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) - .to match_array( - [ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30] - .map { |c| (c["bfkey"].to_i + 1).to_s }.sort - ) + .to match_array([ + ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, ca23, ca24, + ca25, ca26, ca27, ca28, ca29, ca30 + ] + .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) + + # ensure that excluded judge recieves their tied cases which would not go to default judge + expect(VACOLS::CaseDocket.distribute_priority_appeals(excl_judge_caseflow, "any", 100, true) + .map { |c| c["bfkey"] }.sort) + .to match_array([ + ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24, + ca25, ca26, ca27, ca28, ca29, ca30, ca34 + ] + .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) + # {FOR LEVER BEING OMIT:} cavc_aod_lever.update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache expect(VACOLS::CaseDocket.distribute_priority_appeals(judge, "any", 100, true).map { |c| c["bfkey"] }.sort) .to match_array([ - ca1, ca2, ca3, ca4, ca5, ca6, ca10, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, - ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30 + ca1, ca2, ca3, ca4, ca5, ca6, ca11, ca12, ca13, ca14, ca15, ca16, ca17, ca21, ca22, + ca23, ca24, ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33 ] .map { |c| (c["bfkey"].to_i + 1).to_s }.sort) end @@ -1114,13 +1223,14 @@ def create_case_hearing(original_case, hearing_judge) IneligibleJudgesJob.perform_now # For case distribution levers set to a value + CaseDistributionLever.clear_distribution_lever_cache new_hearing_judge_cases = VACOLS::CaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) tied_judge_cases = VACOLS::CaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) other_judge_cases = VACOLS::CaseDocket.distribute_priority_appeals(other_judge_caseflow, "any", 100, true) expect(new_hearing_judge_cases.map { |c| c["bfkey"] }.sort) .to match_array([ - case_1, case_2, case_3, case_4, case_5, case_9, case_10, case_12, case_13 + case_1, case_2, case_3, case_4, case_5, case_10, case_12, case_13 ].map { |c| (c["bfkey"].to_i + 1).to_s }.sort) expect(tied_judge_cases.map { |c| c["bfkey"] }.sort) @@ -1130,12 +1240,13 @@ def create_case_hearing(original_case, hearing_judge) expect(other_judge_cases.map { |c| c["bfkey"] }.sort) .to match_array([ - case_7, case_8, case_9, case_10, case_12, case_13 + case_7, case_8, case_10, case_12, case_13 ].map { |c| (c["bfkey"].to_i + 1).to_s }.sort) # For case distribution levers set to infinite CaseDistributionLever.find_by(item: "cavc_affinity_days").update!(value: "infinite") CaseDistributionLever.find_by(item: "cavc_aod_affinity_days").update!(value: "infinite") + CaseDistributionLever.clear_distribution_lever_cache new_hrng_judge_infinite = VACOLS::CaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) tied_judge_infinite = VACOLS::CaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) @@ -1159,6 +1270,7 @@ def create_case_hearing(original_case, hearing_judge) # For case distribution levers set to omit CaseDistributionLever.find_by(item: "cavc_affinity_days").update!(value: "omit") CaseDistributionLever.find_by(item: "cavc_aod_affinity_days").update!(value: "omit") + CaseDistributionLever.clear_distribution_lever_cache new_hearing_judge_omit = VACOLS::CaseDocket.distribute_priority_appeals(new_hearing_judge, "any", 100, true) tied_judge_omit = VACOLS::CaseDocket.distribute_priority_appeals(tied_judge_caseflow, "any", 100, true) @@ -1166,7 +1278,7 @@ def create_case_hearing(original_case, hearing_judge) expect(new_hearing_judge_omit.map { |c| c["bfkey"] }.sort) .to match_array([ - case_1, case_2, case_3, case_4, case_5, case_7, case_8, case_9, case_10, case_11, case_12, case_13 + case_1, case_2, case_3, case_4, case_5, case_7, case_8, case_10, case_11, case_12, case_13 ].map { |c| (c["bfkey"].to_i + 1).to_s }.sort) expect(tied_judge_omit.map { |c| c["bfkey"] }.sort) @@ -1176,7 +1288,7 @@ def create_case_hearing(original_case, hearing_judge) expect(other_judge_omit.map { |c| c["bfkey"] }.sort) .to match_array([ - case_7, case_8, case_9, case_10, case_11, case_12, case_13 + case_7, case_8, case_10, case_11, case_12, case_13 ].map { |c| (c["bfkey"].to_i + 1).to_s }.sort) end end diff --git a/spec/models/vacols/case_spec.rb b/spec/models/vacols/case_spec.rb index 4f6c1f6e2b2..98751ea06ec 100644 --- a/spec/models/vacols/case_spec.rb +++ b/spec/models/vacols/case_spec.rb @@ -159,4 +159,120 @@ end end end + + describe "Factory" do + describe "legacy_aoj_appeal" do + def check_common_assertions(new_case, original_case) # rubocop:disable Metrics/AbcSize + expect(original_case.attributes.except!(*not_shared_brieff_attributes)) + .to eq(new_case.attributes.except!(*not_shared_brieff_attributes)) + expect(original_folder.attributes.except!(*not_shared_folder_attributes)) + .to eq(new_folder.attributes.except!(*not_shared_folder_attributes)) + + expect(original_case.bfddec).to eq new_case.bfdpdcn + expect(original_case.bfmpro).to eq "HIS" + expect(original_case.bfcurloc).to eq "99" + expect(new_case.bfmpro).to eq "ACT" + expect(new_case.bfac).to eq "3" + expect(new_case.bfcurloc).to eq "81" + end + + let(:params) { {} } + let(:traits) { [] } + let!(:new_case) { create(:legacy_aoj_appeal, *traits, params) } + let!(:original_case) { VACOLS::Case.where(bfcorlid: new_case.bfcorlid).where.not(bfkey: new_case.bfkey).first } + let(:new_folder) { new_case.folder } + let(:original_folder) { original_case.folder } + + let(:not_shared_brieff_attributes) do + %w[bfkey bfmpro bfac bfcurloc bfddec bfdpdcn bfattid bfmemid bfdc bfdrodec bfcallup] + end + let(:not_shared_folder_attributes) do + %w[tidrecv tidcls tiaduser tiadtime tikeywrd tiread2 tioctime tiocuser tidktime tidkuser ticknum] + end + + describe "when provided no extra params", :aggregate_failures do + it "creates a new and original appeal with correct shared attributes" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(VACOLS::Note.find_by(tsktknm: new_case.bfkey, tskactcd: "B")).to be nil + expect(original_case.case_hearings.count).to eq 1 + expect(new_case.appeal_affinity).to be_truthy + end + end + + describe "when provided only AOD trait", :aggregate_failures do + let(:traits) { [:aod] } + + it "creates a new and original appeal with correct shared attributes" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(VACOLS::Note.find_by(tsktknm: new_case.bfkey, tskactcd: "B")).to be_truthy + end + end + + describe "when provided only CAVC param", :aggregate_failures do + let(:params) { { cavc: true } } + + it "creates a new and original appeal with correct shared attributes" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "7" + end + end + + describe "when provided AOD trait and CAVC param", :aggregate_failures do + let(:traits) { [:aod] } + let(:params) { { cavc: true } } + + it "creates a new and original appeal with correct shared attributes" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "7" + expect(VACOLS::Note.find_by(tsktknm: new_case.bfkey, tskactcd: "B")).to be_truthy + end + end + + describe "when tied to is false" do + let(:params) { { tied_to: false } } + + it "does not create a hearing on the original case" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(original_case.case_hearings.count).to eq 0 + end + end + + describe "when appeal affinity is false" do + let(:params) { { appeal_affinity: false } } + + it "does not create an appeal affinity" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(new_case.appeal_affinity).to be nil + end + end + + describe "when affinity start date is nil" do + let(:params) { { affinity_start_date: nil } } + + it "creates appeal_affinity with nil start date" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(new_case.appeal_affinity.affinity_start_date).to be nil + end + end + + describe "when a judge and attorney are provided" do + let(:params) { { judge: judge, attorney: attorney } } + let(:judge) { create(:user, :judge, :with_vacols_judge_record).vacols_staff } + let(:attorney) { create(:user, :with_vacols_attorney_record).vacols_staff } + + it "ties the original case/ hearing to the judge and attorney" do + check_common_assertions(new_case, original_case) + expect(original_case.bfac).to eq "1" + expect(original_case.bfattid).to eq attorney.sattyid + expect(original_case.bfmemid).to eq judge.sattyid + expect(original_case.case_hearings.first.board_member).to eq judge.sattyid + end + end + end + end end diff --git a/spec/queries/appeals_ready_for_distribution_spec.rb b/spec/queries/appeals_ready_for_distribution_spec.rb index f0874fcd01e..f1de95ac78b 100644 --- a/spec/queries/appeals_ready_for_distribution_spec.rb +++ b/spec/queries/appeals_ready_for_distribution_spec.rb @@ -18,6 +18,8 @@ create_realistic_cavc_case(Constants.AMA_DOCKETS.evidence_submission) end let!(:ama_cavc_hearing_appeal) { create_realistic_cavc_case(Constants.AMA_DOCKETS.hearing) } + + # below legacy cases are selected by VACOLS::CaseDocket let!(:not_ready_legacy_original_appeal) do create(:case_with_form_9, :type_original, :travel_board_hearing_requested) end @@ -36,9 +38,17 @@ VACOLS::Case.find_by(bfcorlid: original.bfcorlid, bfmpro: "ACT") end + # below legacy cases are selected by VACOLS::AojCaseDocket + let!(:legacy_aoj_appeal_no_hearing) do + create(:legacy_aoj_appeal, judge: original_deciding_judge.vacols_staff, tied_to: false) + end + let!(:legacy_aoj_appeal_with_hearing) do + create(:legacy_aoj_appeal, judge: original_deciding_judge.vacols_staff) + end + it "selects all ready to distribute appeals for all dockets and generates the CSV" do expect { described_class.process }.not_to raise_error - expect(described_class.ready_appeals.size).to eq 10 + expect(described_class.ready_appeals.size).to eq 12 end end diff --git a/spec/repositories/aoj_appeal_repository_spec.rb b/spec/repositories/aoj_appeal_repository_spec.rb new file mode 100644 index 00000000000..9c5feb55958 --- /dev/null +++ b/spec/repositories/aoj_appeal_repository_spec.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +describe AojAppealRepository, :all_dbs do + let(:correspondent_record) do + OpenStruct.new( + snamef: "Phil", + snamemi: "J", + snamel: "Johnston", + sspare1: "Johnston", + sspare2: "Chris", + sspare3: "M", + susrtyp: "Brother", + sfnod: 100.days.ago + ) + end + + let(:folder_record) do + OpenStruct.new( + tivbms: "Y", + tinum: "13 11-265", + tiread2: "2012091234" + ) + end + + let(:case_record) do + OpenStruct.new( + bfkey: "123C", + bfcorlid: "VBMS-ID", + bfac: "3", + bfso: "Q", + bfpdnum: "INSURANCE-LOAN-NUMBER", + bfdrodec: 11.days.ago, + bfdnod: 10.days.ago, + bfdsoc: 9.days.ago, + bfd19: 8.days.ago, + bfssoc1: 7.days.ago, + bfssoc2: 6.days.ago, + bfha: "6", + bfhr: "1", + bfregoff: "DSUSER", + bfdc: "9", + bfddec: 1.day.ago, + correspondent: correspondent_record, + folder: folder_record, + case_issues: [{ + issdesc: "Issue Description", + issdc: "1", + issprog: "Issue Program" + }] + ) + end + + context ".set_vacols_values" do + before do + Timecop.freeze(Time.utc(2015, 1, 1, 12, 0, 0)) + allow_any_instance_of(LegacyAppeal).to receive(:check_and_load_vacols_data!).and_return(nil) + end + + subject do + appeal = LegacyAppeal.new + AojAppealRepository.set_vacols_values( + appeal: appeal, + case_record: case_record + ) + end + + it do + is_expected.to have_attributes( + vbms_id: "VBMS-ID", + type: "Post Remand", + file_type: "VBMS", + veteran_first_name: "Phil", + veteran_middle_initial: "J", + veteran_last_name: "Johnston", + appellant_first_name: "Chris", + appellant_middle_initial: "M", + appellant_last_name: "Johnston", + appellant_relationship: "Brother", + insurance_loan_number: "INSURANCE-LOAN-NUMBER", + notification_date: AojAppealRepository.normalize_vacols_date(11.days.ago), + nod_date: AojAppealRepository.normalize_vacols_date(10.days.ago), + soc_date: AojAppealRepository.normalize_vacols_date(9.days.ago), + form9_date: AojAppealRepository.normalize_vacols_date(8.days.ago), + ssoc_dates: [ + AojAppealRepository.normalize_vacols_date(7.days.ago), + AojAppealRepository.normalize_vacols_date(6.days.ago) + ], + notice_of_death_date: AojAppealRepository.normalize_vacols_date(100.days.ago), + hearing_request_type: :central_office, + hearing_requested: true, + hearing_held: true, + regional_office_key: "DSUSER", + disposition: "Withdrawn", + decision_date: AojAppealRepository.normalize_vacols_date(1.day.ago), + docket_number: "13 11-265", + citation_number: "2012091234" + ) + end + end +end diff --git a/spec/serializers/distribution_serializer_spec.rb b/spec/serializers/distribution_serializer_spec.rb new file mode 100644 index 00000000000..a75da26a1de --- /dev/null +++ b/spec/serializers/distribution_serializer_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +describe DistributionSerializer, :all_dbs do + let(:judge) { create(:user, :judge, :with_vacols_judge_record) } + let(:distribution) { create(:distribution, :completed, judge: judge) } + + before { Seeds::CaseDistributionLevers.new.seed! } + + subject { DistributionSerializer.new(distribution).as_json } + + context "when in higher environments" do + before { Rails.env = "prod" } + after { Rails.env = "test" } + + it "does not incude associated distribution_stats" do + expect(subject[:distribution_stats]).to be nil + end + end + + context "when in lower environments" do + it "includes associated distribution_stats" do + expect(subject[:distribution_stats]).to_not be nil + end + end +end