Advertisement
zavyalov79

Untitled

Aug 29th, 2023
1,683
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.25 KB | None | 0 0
  1. require 'workbook'
  2.  
  3. class Teck::Report
  4.   def initialize
  5.     protocol_id = Configuration.find_by(name: 'TECK_PROTOCOL_ID')&.value
  6.     protocol = ::Health::Protocol.find(protocol_id.to_i) if protocol_id
  7.     @cognitive_assessment = protocol.assessments.find { |assessment| assessment.assessment_type_cognitive? }
  8.  
  9.     clinic_admin_id = Configuration.find_by(name: 'TECK_CLINIC_ADMIN_ID')&.value
  10.     @clinic_admin = ::Health::ClinicAdmin.find(clinic_admin_id.to_i) if clinic_admin_id
  11.   end
  12.  
  13.  
  14.   def report!
  15.     return if @clinic_admin.nil? || @cognitive_assessment.nil?
  16.  
  17.  
  18.         book = Workbook::Book.new()
  19.         book.title = 'Teck Report'
  20.  
  21.         patients.find_each do |patient|
  22.             patient_sessions = sessions_scope.where(admin_user_id: patient.id)
  23.  
  24.             next if patient_sessions.empty?
  25.  
  26.           sheet = Workbook::Sheet.new
  27.           sheet.name = patient.client_id
  28.           table = sheet.table
  29.  
  30.           table << csv_titles
  31.           patient_sessions.each do |patient_session|
  32.             report_data = Report::Renderer::Pilot::TeckRenderer.new(patient_session.protocol_session_uuid).report_data
  33.             row = [patient_session.completed_at.strftime("%b #{patient_session.completed_at.day.ordinalize}, %Y")]
  34.  
  35.             tests.each do |test|
  36.                 percentile = report_data.find{ |data| data[:test_id] == test.id }[:score_data][:adjusted_percentile]
  37.                 row << (percentile * 100).round(2)
  38.             end
  39.             table << row
  40.           end
  41.  
  42.           sheet.table.each do |row|
  43.             row.each do |cell|
  44.               cell.format[:width] = 20
  45.             end
  46.           end
  47.  
  48.           book.push sheet
  49.         end
  50.  
  51.         tmp_filename = 'teck_report.xls'
  52.         tmp_file = book.write_to_xls("tmp/#{tmp_filename}")
  53.  
  54.         media_file = MediaFile.find_or_create_by(name: 'TECK Report', admin_user_id: 1)
  55.         media_file.update!(
  56.           asset: File.open(tmp_file),
  57.           asset_file_name: tmp_filename,
  58.           allow_others_to_copy: NO,
  59.           public: false,
  60.           category: :admin_report
  61.         )
  62.         File.delete("tmp/#{tmp_filename}")
  63.  
  64.         media_file.path
  65.   end
  66.  
  67.   private
  68.  
  69.   def tests
  70.     @tests ||= @cognitive_assessment.tests
  71.   end
  72.  
  73.   def csv_titles
  74.     @csv_titles ||= ['Date'] + tests.map(&:name)
  75.   end
  76.  
  77.   def sessions_scope
  78.     BatchSession.status_complete.where(batch_id: @cognitive_assessment.id).order(:completed_at)
  79.   end
  80.  
  81.   def patients
  82.     @clinic_admin.patients
  83.   end
  84. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement