Skip to content

Commit

Permalink
Sudhir/appeals 43851 (#21613)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
samasudhirreddy authored May 17, 2024
1 parent 34641ca commit 8181165
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 27 deletions.
2 changes: 2 additions & 0 deletions app/models/case_distribution_lever.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ class CaseDistributionLever < ApplicationRecord
#{Constants.DISTRIBUTION.ama_direct_review_start_distribution_prior_to_goals}
#{Constants.DISTRIBUTION.ama_hearing_case_affinity_days}
#{Constants.DISTRIBUTION.cavc_affinity_days}
#{Constants.DISTRIBUTION.cavc_aod_affinity_days}
#{Constants.DISTRIBUTION.ama_hearing_case_aod_affinity_days}
#{Constants.DISTRIBUTION.ama_evidence_submission_docket_time_goals}
#{Constants.DISTRIBUTION.ama_hearings_docket_time_goals}
).freeze
Expand Down
102 changes: 87 additions & 15 deletions app/models/concerns/distribution_scopes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,52 +55,124 @@ def ready_for_distribution
def genpop_base_query
join_distribution_tasks
.with_original_appeal_and_judge_task
.include_aod_motions
end

def genpop_with_case_distribution_lever
genpop_cavc_affinity_days_query = generate_genpop_cavc_affinity_days_lever_query
genpop_cavc_aod_affinity_days_query = generate_genpop_cavc_aod_affinity_days_lever_query

result = genpop_cavc_affinity_days_query.or(genpop_cavc_aod_affinity_days_query)

if FeatureToggle.enabled?(:acd_cases_tied_to_judges_no_longer_with_board)
result = result.or(
genpop_base_query
.where("original_judge_task.assigned_to_id in (?)", HearingRequestDistributionQuery.ineligible_judges_id_cache)
)
end

if FeatureToggle.enabled?(:acd_exclude_from_affinity)
result = result.or(
genpop_base_query
.where("original_judge_task.assigned_to_id in (?)", JudgeTeam.judges_with_exclude_appeals_from_affinity)
)
end

result
end

def generate_genpop_cavc_affinity_days_lever_query
if case_affinity_days_lever_value_is_selected?(CaseDistributionLever.cavc_affinity_days)
genpop
elsif CaseDistributionLever.cavc_affinity_days == Constants.ACD_LEVERS.infinite
genpop_base_query
.ama_non_aod_appeals
.where(
"appeals.stream_type != ? OR original_judge_task.assigned_to_id in (?)",
"appeals.stream_type != ? OR distribution_task.assigned_at <= ?",
Constants.AMA_STREAM_TYPES.court_remand,
exclude_affinity_and_ineligible_judge_ids
CaseDistributionLever.cavc_affinity_days.days.ago
)
elsif CaseDistributionLever.cavc_affinity_days == Constants.ACD_LEVERS.infinite
genpop_base_query
.ama_non_aod_appeals
.where("appeals.stream_type != ?", Constants.AMA_STREAM_TYPES.court_remand)
elsif CaseDistributionLever.cavc_affinity_days == Constants.ACD_LEVERS.omit
genpop_base_query
.ama_non_aod_appeals
end
end

def generate_genpop_cavc_aod_affinity_days_lever_query
if case_affinity_days_lever_value_is_selected?(CaseDistributionLever.cavc_aod_affinity_days)
genpop_base_query
.ama_aod_appeals
.where(
"appeals.stream_type != ? OR distribution_task.assigned_at < ?",
Constants.AMA_STREAM_TYPES.court_remand,
CaseDistributionLever.cavc_aod_affinity_days.days.ago
)
elsif CaseDistributionLever.cavc_aod_affinity_days == Constants.ACD_LEVERS.infinite
genpop_base_query
.ama_aod_appeals
.where("appeals.stream_type != ?", Constants.AMA_STREAM_TYPES.court_remand)
elsif CaseDistributionLever.cavc_aod_affinity_days == Constants.ACD_LEVERS.omit
genpop_base_query
.ama_aod_appeals
end
end

def non_genpop_with_case_distribution_lever(judge)
non_genpop_cavc_affinity_days_query = generate_non_genpop_cavc_affinity_days_lever_query(judge)
non_genpop_cavc_aod_affinity_days_query = generate_non_genpop_cavc_aod_affinity_days_lever_query(judge)

non_genpop_cavc_affinity_days_query.or(non_genpop_cavc_aod_affinity_days_query)
end

def generate_non_genpop_cavc_affinity_days_lever_query(judge)
if case_affinity_days_lever_value_is_selected?(CaseDistributionLever.cavc_affinity_days)
non_genpop_for_judge(judge)
.ama_non_aod_appeals
elsif CaseDistributionLever.cavc_affinity_days == Constants.ACD_LEVERS.infinite
genpop_base_query
.ama_non_aod_appeals
.where(original_judge_task: { assigned_to_id: judge&.id },
appeals: { stream_type: Constants.AMA_STREAM_TYPES.court_remand })
elsif CaseDistributionLever.cavc_affinity_days == Constants.ACD_LEVERS.omit
genpop_base_query.none
genpop_base_query.ama_non_aod_appeals.none
end
end

def generate_non_genpop_cavc_aod_affinity_days_lever_query(judge)
if case_affinity_days_lever_value_is_selected?(CaseDistributionLever.cavc_aod_affinity_days)
non_genpop_for_judge(judge, CaseDistributionLever.cavc_aod_affinity_days)
.ama_non_aod_appeals
elsif CaseDistributionLever.cavc_aod_affinity_days == Constants.ACD_LEVERS.infinite
genpop_base_query
.ama_non_aod_appeals
.where(original_judge_task: { assigned_to_id: judge&.id },
appeals: { stream_type: Constants.AMA_STREAM_TYPES.court_remand })
elsif CaseDistributionLever.cavc_aod_affinity_days == Constants.ACD_LEVERS.omit
genpop_base_query.ama_non_aod_appeals.none
end
end

def genpop
genpop_base_query
.where(
"appeals.stream_type != ? OR distribution_task.assigned_at <= ? OR original_judge_task.assigned_to_id in (?)",
"appeals.stream_type != ? OR distribution_task.assigned_at <= ?",
Constants.AMA_STREAM_TYPES.court_remand,
CaseDistributionLever.cavc_affinity_days.days.ago,
exclude_affinity_and_ineligible_judge_ids
CaseDistributionLever.cavc_affinity_days.days.ago
)
end

def ama_non_aod_hearing_appeals
where("advance_on_docket_motions.person_id IS NULL")
.where("people.date_of_birth > ?", 75.years.ago)
def ama_non_aod_appeals
where("people.date_of_birth > ? or people.date_of_birth is null", 75.years.ago)
.group("appeals.id")
.having("count(case when advance_on_docket_motions.granted "\
"\n and advance_on_docket_motions.created_at > appeals.established_at then 1 end) = ?", 0)
end

def ama_aod_hearing_appeals
where("advance_on_docket_motions.person_id IS NOT NULL")
def ama_aod_appeals
where("advance_on_docket_motions.created_at > appeals.established_at")
.where("advance_on_docket_motions.granted = ?", true)
.or(where("people.date_of_birth <= ?", 75.years.ago))
end

Expand All @@ -117,9 +189,9 @@ def with_original_appeal_and_judge_task

# docket.rb
# Within the first 21 days, the appeal should be distributed only to the issuing judge.
def non_genpop_for_judge(judge)
def non_genpop_for_judge(judge, lever_days = CaseDistributionLever.cavc_affinity_days)
genpop_base_query
.where("distribution_task.assigned_at > ?", CaseDistributionLever.cavc_affinity_days.days.ago)
.where("distribution_task.assigned_at > ?", lever_days.days.ago)
.where(original_judge_task: { assigned_to_id: judge&.id })
end

Expand Down
16 changes: 8 additions & 8 deletions app/queries/hearing_request_distribution_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,13 @@ def generate_ama_not_genpop_non_aod_hearing_query(base_relation)
base_relation
.most_recent_hearings
.tied_to_distribution_judge(judge)
.ama_non_aod_hearing_appeals
.ama_non_aod_appeals
.affinitized_ama_affinity_cases(CaseDistributionLever.ama_hearing_case_affinity_days)
elsif CaseDistributionLever.ama_hearing_case_affinity_days == Constants.ACD_LEVERS.infinite
base_relation
.most_recent_hearings
.tied_to_distribution_judge(judge)
.ama_non_aod_hearing_appeals
.ama_non_aod_appeals
elsif CaseDistributionLever.ama_hearing_case_affinity_days == Constants.ACD_LEVERS.omit
base_relation
.most_recent_hearings
Expand All @@ -112,13 +112,13 @@ def generate_ama_not_genpop_aod_hearing_query(base_relation)
base_relation
.most_recent_hearings
.tied_to_distribution_judge(judge)
.ama_aod_hearing_appeals
.ama_aod_appeals
.affinitized_ama_affinity_cases(CaseDistributionLever.ama_hearing_case_aod_affinity_days)
elsif CaseDistributionLever.ama_hearing_case_aod_affinity_days == Constants.ACD_LEVERS.infinite
base_relation
.most_recent_hearings
.tied_to_distribution_judge(judge)
.ama_aod_hearing_appeals
.ama_aod_appeals
elsif CaseDistributionLever.ama_hearing_case_aod_affinity_days == Constants.ACD_LEVERS.omit
base_relation
.most_recent_hearings
Expand All @@ -135,7 +135,7 @@ def generate_ama_only_genpop_non_aod_hearing_query(base_relation)
base_relation
.most_recent_hearings
.join_distribution_tasks
.ama_non_aod_hearing_appeals
.ama_non_aod_appeals
.expired_ama_affinity_cases(CaseDistributionLever.ama_hearing_case_affinity_days)
elsif CaseDistributionLever.ama_hearing_case_affinity_days == Constants.ACD_LEVERS.infinite
base_relation
Expand All @@ -147,7 +147,7 @@ def generate_ama_only_genpop_non_aod_hearing_query(base_relation)
.most_recent_hearings
.join_distribution_tasks
.with_held_hearings
.ama_non_aod_hearing_appeals
.ama_non_aod_appeals
end

query
Expand All @@ -159,7 +159,7 @@ def generate_ama_only_genpop_aod_hearing_query(base_relation)
base_relation
.most_recent_hearings
.join_distribution_tasks
.ama_aod_hearing_appeals
.ama_aod_appeals
.expired_ama_affinity_cases(CaseDistributionLever.ama_hearing_case_aod_affinity_days)
elsif CaseDistributionLever.ama_hearing_case_aod_affinity_days == Constants.ACD_LEVERS.infinite
base_relation
Expand All @@ -171,7 +171,7 @@ def generate_ama_only_genpop_aod_hearing_query(base_relation)
.most_recent_hearings
.join_distribution_tasks
.with_held_hearings
.ama_aod_hearing_appeals
.ama_aod_appeals
end

query
Expand Down
2 changes: 2 additions & 0 deletions spec/models/case_distribution_lever_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
ama_direct_review_start_distribution_prior_to_goals
ama_hearing_case_affinity_days
cavc_affinity_days
cavc_aod_affinity_days
ama_hearing_case_aod_affinity_days
ama_evidence_submission_docket_time_goals
ama_hearings_docket_time_goals]
end
Expand Down
7 changes: 3 additions & 4 deletions spec/models/docket_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,11 @@

context "when called for ready is true and judge is passed" do
let(:judge) { judge_decision_review_task.assigned_to }
subject { DirectReviewDocket.new.appeals(ready: true, judge: judge) }

subject { DirectReviewDocket.new.appeals(ready: true, priority: false, judge: judge) }

it "returns non priority appeals" do
expect(subject).to include appeal
expect(subject).to include denied_aod_motion_appeal
expect(subject).to include inapplicable_aod_motion_appeal
expect(subject).to match_array([appeal, denied_aod_motion_appeal, inapplicable_aod_motion_appeal])
end
end
end
Expand Down

0 comments on commit 8181165

Please sign in to comment.