Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'progress_bar'
- require 'csv'
- def calc_score_data(score)
- user_details = score.admin_user.details
- gender = user_details.gender
- birthdate = user_details.birthdate.to_date
- age = CbsDatetime.calc_age(birthdate, score.created_at) if birthdate
- norm_opts = Experiment::Healthcare.demographic_options(age, gender)
- feature_nm = Experiment::Healthcare.feature_for(score)
- score.score_data(**norm_opts)[feature_nm]
- end
- def session_info(session, admin, q_batches, tests)
- patient = session.admin_user
- batch = session.batch
- completed_at = session.completed_at.humanize_date
- row = [patient.client_id, batch.name]
- if true
- protocol_session_uuid = session.protocol_session_uuid
- protocol_session = ::Health::ProtocolSession.find_by(user_id: patient.id, session_uuid: protocol_session_uuid) if protocol_session_uuid
- row << protocol_session&.protocol&.name || 'N/A'
- if protocol_session.created_by_schedule?
- row << 'YES'
- sessions = ::Health::ProtocolSession.created_by_schedule.where(user_id: protocol_session.user_id, protocol_id: protocol_session.protocol_id).
- where("id <= ?", protocol_session.id)
- row << sessions.count
- else
- row << 'NO'
- row << 'N/A'
- end
- end
- row << completed_at
- if batch.assessment_type_questionnaire?
- row << 'N/A'
- renderer = Report::Renderer::BaseRenderer.renderer(session, {filename: :xxx, template: :xxx, user: patient})
- score_summary = renderer.score_summary(session.becomes(::Health::AssessmentReport))
- q_batches.each do |q_batch|
- sleep 0.05
- row << (q_batch.id == batch.id ? score_summary : 'N/A')
- end
- else
- row << session.test_scores.count
- row += Array.new(q_batches.count){ 'N/A' }
- end
- if batch.assessment_type_cognitive?
- tests.each do |test|
- sleep 0.05
- score = session.test_scores.find_by(test_id: test.id)
- if score
- score_data = calc_score_data(score)
- adjusted_standard = score_data[:adjusted_standard].to_f.round(2)
- adjusted_percentile = (score_data[:adjusted_percentile].to_f * 100).round(2)
- row += [adjusted_percentile, adjusted_standard]
- else
- row += ['N/A', 'N/A']
- end
- end
- else
- row += Array.new(tests.count * 2){ 'N/A' }
- end
- row
- end
- def data_exists?(csv_data, session)
- client_id = session.admin_user.client_id
- batch_name = session.batch.name
- completed_at = session.completed_at.humanize_date
- csv_data.select{ |csv| csv[0] == client_id && csv[1] == batch_name && csv[3] == completed_at }.any?
- end
- def data_pull(clinic_admin_id, filename, start_date=nil, end_date=nil)
- filename = Rails.root.join('tmp', filename)
- tmp_filename = 'tmp/cs-152.txt'
- tmp_file = File.open(tmp_filename, 'a+')
- csv_data = File.read(tmp_filename) if File.exist?(tmp_filename)
- csv_data = if csv_data
- csv_data.split("\n").compact.map(&:to_i)
- end
- csv_data ||= []
- admin = AdminUser.find clinic_admin_id
- practitioners = AdminUser.role_researcher.where(belongs_to_admin_user_id: admin.id)
- patients = AdminUser.role_user.where(belongs_to_admin_user_id: [admin.id] + practitioners.ids)
- sessions = BatchSession.includes(:admin_user, :batch).status_complete.where(admin_user_id: patients.ids).order(:completed_at)
- sessions = sessions.where('completed_at >= ?', start_date) if start_date
- sessions = sessions.where('completed_at <= ?', end_date) if end_date
- test_ids = TestScore.where(batch_session_id: sessions.ids).map(&:test_id).uniq
- tests = Test.where(id: test_ids).order(:id)
- q_batches = Batch.where(id: sessions.pluck(:batch_id)).assessment_type_questionnaire.order(:id)
- CSV.open(filename, 'a+') do |csv|
- row = ['Client ID', 'Assessment']
- row << 'Protocol Name'
- row << 'Scheduled?'
- row << 'Assessment Number As Part of the Schedule'
- row << 'Date of Completion'
- row << 'Number of Tasks completed'
- row += q_batches.map { |batch| "#{batch.description} Score"}
- tests.each do |test|
- row += ["#{test.name} - Percentile", "#{test.name} - Score"]
- end
- csv << row
- progress_bar = ProgressBar.new(sessions.count)
- sessions.find_each do |session|
- if csv_data.exclude?(session.id)
- csv << session_info(session, admin, q_batches, tests)
- tmp_file.puts session.id
- sleep 0.5
- end
- progress_bar.increment!
- end
- end
- end
- start_date = Date.parse('1 Feb 2024').beginning_of_day
- end_date = Date.parse('29 Feb 2024').end_of_day
- data_pull(331613, 'CS-152.csv',start_date, end_date)
- media_file = MediaFile.create!(
- name: 'CS-1370',
- admin_user_id: 1,
- asset: File.open('tmp/CS-152.csv'),
- asset_file_name: 'CS-152.csv',
- allow_others_to_copy: NO,
- public: false,
- category: :admin_report
- )
- media_file.path
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement