Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

APPEALS-44876 Work order job file #21504

Merged
merged 4 commits into from
May 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ gem "sass-rails", "~> 5.0"
# Error reporting to Sentry
gem "sentry-raven"
gem "shoryuken", "3.1.11"
gem "spreadsheet", "~> 1.3"
gem "statsd-instrument"
gem "stringex", require: false
# catch problematic migrations at development/test time
Expand Down Expand Up @@ -116,9 +117,9 @@ group :test, :development, :demo do
gem "rails-erd"
gem "rb-readline"
gem "rspec"
gem "rspec-rails"
# For CircleCI test metadata analysis
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rubocop", "= 0.83", require: false
gem "rubocop-performance"
gem "rubocop-rails"
Expand Down
6 changes: 6 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1596,6 +1596,7 @@ GEM
aws-eventstream (~> 1, >= 1.0.2)
backport (1.2.0)
benchmark-ips (2.7.2)
bigdecimal (3.1.7)
bootsnap (1.7.5)
msgpack (~> 1.0)
bourbon (4.2.7)
Expand Down Expand Up @@ -2050,6 +2051,7 @@ GEM
rake (>= 0.8.1)
ruby-graphviz (1.2.4)
ruby-oci8 (2.2.7)
ruby-ole (1.2.13.1)
ruby-plsql (0.8.0)
ruby-prof (1.4.1)
ruby-progressbar (1.13.0)
Expand Down Expand Up @@ -2113,6 +2115,9 @@ GEM
thor (~> 0.19, >= 0.19.4)
tilt (~> 2.0)
yard (~> 0.9)
spreadsheet (1.3.1)
bigdecimal
ruby-ole
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
Expand Down Expand Up @@ -2280,6 +2285,7 @@ DEPENDENCIES
single_cov
sniffybara!
solargraph
spreadsheet (~> 1.3)
sql_tracker
statsd-instrument
stringex
Expand Down
94 changes: 94 additions & 0 deletions app/jobs/hearings/work_order_file_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# frozen_string_literal: true

class Hearings::WorkOrderFileJob < CaseflowJob
queue_with_priority :low_priority

def perform(work_order)
work_book = create_spreadsheet(work_order)
file_location(work_book, work_order[:work_order_name])
# upload to s3
end

private

def create_spreadsheet(work_order)
workbook = Spreadsheet::Workbook.new
worksheet = workbook.create_worksheet

worksheet.row(0).concat ["Work Order", work_order[:work_order_name]]
worksheet.row(2).concat ["Return Date", work_order[:return_date]]
worksheet.row(4).concat ["Contractor Name", work_order[:contractor]]

create_table(work_order[:hearings], worksheet)
workbook
end

def file_location(workbook, work_order_name)
file_name = "BVA-#{work_order_name}.xls"
file_path = File.join(Rails.root, "tmp", file_name)
workbook.write(file_path)
end

def create_table(hearings_data, worksheet)
jimfoley25 marked this conversation as resolved.
Show resolved Hide resolved
setup_worksheet_header(worksheet)
hearings = fetch_hearings(hearings_data)
populate_table_data(hearings, worksheet)
end

def setup_worksheet_header(worksheet)
header_format = Spreadsheet::Format.new weight: :bold, border: :thin
columns = ["DOCKET NUMBER", "FIRST NAME", "LAST NAME", "TYPES", "HEARING DATE", "RO", "VLJ", "APPEAL TYPE"]
set_border_format(worksheet.row(6), header_format)
worksheet.row(6).concat(columns)
end

def fetch_hearings(hearings_data)
Hearing.includes(:appeal).where(id: hearings_data.pluck(:hearing_id))
end

def populate_table_data(hearings, worksheet)
table_data = hearings.map do |hearing|
format_hearing_data(hearing)
end
append_table_data_to_worksheet(table_data, worksheet)
end

def format_hearing_data(hearing)
appeal = hearing.appeal
hearing_date = format_hearing_date(appeal)
[
appeal.docket_number,
hearing.appellant_first_name,
hearing.appellant_last_name,
appeal.type,
hearing_date,
hearing.regional_office.name,
hearing.judge.full_name,
appeal_type(appeal)
]
end

def format_hearing_date(appeal)
if appeal.hearing_day_if_schedueled.present?
appeal.hearing_day_if_schedueled.strftime("%m/%d/%Y")
else
""
end
end

def appeal_type(appeal)
appeal.is_a?(LegacyAppeal) ? "Legacy" : "AMA"
end

def append_table_data_to_worksheet(table_data, worksheet)
table_data.each_with_index do |row, index|
worksheet.row(7 + index).replace(row)
end
end

def set_border_format(row, row_format)
(0..7).each do |col_index|
row.set_format(col_index, row_format)
end
end
end
69 changes: 69 additions & 0 deletions spec/jobs/hearings/work_order_file_job_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# frozen_string_literal: true

describe Hearings::WorkOrderFileJob, type: :job do
include ActiveJob::TestHelper

let(:hearing) { create(:hearing) }
let(:work_order) do
{
work_order_name: "#12347767",
return_date: "02/12/2024",
contractor: "Contractor Name",
hearings: [{ hearing_id: hearing.id, hearing_type: hearing.class.to_s }]
}
end
let(:file_path) { File.join(Rails.root, "tmp", "BVA-#{work_order[:work_order_name]}.xls") }

subject { described_class.perform_now(work_order) }

it "temporarily saves a xls file in the work order" do
jimfoley25 marked this conversation as resolved.
Show resolved Hide resolved
expect(File.exist?(file_path)).to eq false
subject
expect(File.exist?(file_path)).to eq true
File.delete(file_path)
end

describe "Excel file content" do
let(:work_order_file) { Spreadsheet.open(file_path) }
before do
subject
work_order_file
end

after do
File.delete(file_path) if File.exist?(file_path)
end

it "reads the data correctly" do
expect(work_order_file.worksheet(0).row(0)).to eq(["Work Order", work_order[:work_order_name]])
expect(work_order_file.worksheet(0).row(2)).to eq(["Return Date", work_order[:return_date]])
expect(work_order_file.worksheet(0).row(4)).to eq(["Contractor Name", work_order[:contractor]])
end

it "reads the table header correctly" do
expect(work_order_file.worksheet(0).row(6)).to eq([
"DOCKET NUMBER",
"FIRST NAME",
"LAST NAME",
"TYPES",
"HEARING DATE",
"RO",
"VLJ",
"APPEAL TYPE"
])
end

it "reads the table data rows correctly" do
expect(work_order_file.worksheet(0).row(7)).to eq([
hearing.appeal.docket_number,
hearing.appellant_first_name,
hearing.appellant_last_name,
hearing.appeal.type,
hearing.appeal.hearing_day_if_schedueled.strftime("%m/%d/%Y"),
hearing.regional_office.name,
hearing.judge.full_name,
"AMA"
])
end
end
end
Loading