Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'workbook'
- class Teck::Report
- def initialize
- protocol_id = Configuration.find_by(name: 'TECK_PROTOCOL_ID')&.value
- protocol = ::Health::Protocol.find(protocol_id.to_i) if protocol_id
- @cognitive_assessment = protocol.assessments.find { |assessment| assessment.assessment_type_cognitive? }
- clinic_admin_id = Configuration.find_by(name: 'TECK_CLINIC_ADMIN_ID')&.value
- @clinic_admin = ::Health::ClinicAdmin.find(clinic_admin_id.to_i) if clinic_admin_id
- end
- def report!
- return if @clinic_admin.nil? || @cognitive_assessment.nil?
- book = Workbook::Book.new()
- book.title = 'Teck Report'
- patients.find_each do |patient|
- patient_sessions = sessions_scope.where(admin_user_id: patient.id)
- next if patient_sessions.empty?
- sheet = Workbook::Sheet.new
- sheet.name = patient.client_id
- table = sheet.table
- table << csv_titles
- patient_sessions.each do |patient_session|
- report_data = Report::Renderer::Pilot::TeckRenderer.new(patient_session.protocol_session_uuid).report_data
- row = [patient_session.completed_at.strftime("%b #{patient_session.completed_at.day.ordinalize}, %Y")]
- tests.each do |test|
- percentile = report_data.find{ |data| data[:test_id] == test.id }[:score_data][:adjusted_percentile]
- row << (percentile * 100).round(2)
- end
- table << row
- end
- sheet.table.each do |row|
- row.each do |cell|
- cell.format[:width] = 20
- end
- end
- book.push sheet
- end
- tmp_filename = 'teck_report.xls'
- tmp_file = book.write_to_xls("tmp/#{tmp_filename}")
- media_file = MediaFile.find_or_create_by(name: 'TECK Report', admin_user_id: 1)
- media_file.update!(
- asset: File.open(tmp_file),
- asset_file_name: tmp_filename,
- allow_others_to_copy: NO,
- public: false,
- category: :admin_report
- )
- File.delete("tmp/#{tmp_filename}")
- media_file.path
- end
- private
- def tests
- @tests ||= @cognitive_assessment.tests
- end
- def csv_titles
- @csv_titles ||= ['Date'] + tests.map(&:name)
- end
- def sessions_scope
- BatchSession.status_complete.where(batch_id: @cognitive_assessment.id).order(:completed_at)
- end
- def patients
- @clinic_admin.patients
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement