Advertisement
andrey_zavyalov

Untitled

Mar 6th, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. require 'progress_bar'
  2. require 'csv'
  3.  
  4. def calc_score_data(score)
  5. user_details = score.admin_user.details
  6. gender = user_details.gender
  7. birthdate = user_details.birthdate.to_date
  8. age = CbsDatetime.calc_age(birthdate, score.created_at) if birthdate
  9. norm_opts = Experiment::Healthcare.demographic_options(age, gender)
  10. feature_nm = Experiment::Healthcare.feature_for(score)
  11.  
  12. score.score_data(**norm_opts)[feature_nm]
  13. end
  14.  
  15.  
  16. def session_info(session, admin, q_batches, tests)
  17. patient = session.admin_user
  18. batch = session.batch
  19. completed_at = session.completed_at.humanize_date
  20.  
  21. row = [patient.client_id, batch.name]
  22. if true
  23. protocol_session_uuid = session.protocol_session_uuid
  24. protocol_session = ::Health::ProtocolSession.find_by(user_id: patient.id, session_uuid: protocol_session_uuid) if protocol_session_uuid
  25. row << protocol_session&.protocol&.name || 'N/A'
  26.  
  27. if protocol_session.created_by_schedule?
  28. row << 'YES'
  29.  
  30. sessions = ::Health::ProtocolSession.created_by_schedule.where(user_id: protocol_session.user_id, protocol_id: protocol_session.protocol_id).
  31. where("id <= ?", protocol_session.id)
  32.  
  33. row << sessions.count
  34. else
  35. row << 'NO'
  36. row << 'N/A'
  37. end
  38. end
  39. row << completed_at
  40.  
  41. if batch.assessment_type_questionnaire?
  42. row << 'N/A'
  43. renderer = Report::Renderer::BaseRenderer.renderer(session, {filename: :xxx, template: :xxx, user: patient})
  44. score_summary = renderer.score_summary(session.becomes(::Health::AssessmentReport))
  45.  
  46. q_batches.each do |q_batch|
  47. sleep 0.05
  48. row << (q_batch.id == batch.id ? score_summary : 'N/A')
  49. end
  50. else
  51. row << session.test_scores.count
  52. row += Array.new(q_batches.count){ 'N/A' }
  53. end
  54.  
  55. if batch.assessment_type_cognitive?
  56. tests.each do |test|
  57. sleep 0.05
  58. score = session.test_scores.find_by(test_id: test.id)
  59. if score
  60. score_data = calc_score_data(score)
  61. adjusted_standard = score_data[:adjusted_standard].to_f.round(2)
  62. adjusted_percentile = (score_data[:adjusted_percentile].to_f * 100).round(2)
  63.  
  64. row += [adjusted_percentile, adjusted_standard]
  65. else
  66. row += ['N/A', 'N/A']
  67. end
  68. end
  69. else
  70. row += Array.new(tests.count * 2){ 'N/A' }
  71. end
  72.  
  73. row
  74. end
  75.  
  76. def data_exists?(csv_data, session)
  77. client_id = session.admin_user.client_id
  78. batch_name = session.batch.name
  79. completed_at = session.completed_at.humanize_date
  80.  
  81. csv_data.select{ |csv| csv[0] == client_id && csv[1] == batch_name && csv[3] == completed_at }.any?
  82. end
  83.  
  84. def data_pull(clinic_admin_id, filename, start_date=nil, end_date=nil)
  85. filename = Rails.root.join('tmp', filename)
  86. tmp_filename = 'tmp/cs-152.txt'
  87. tmp_file = File.open(tmp_filename, 'a+')
  88. csv_data = File.read(tmp_filename) if File.exist?(tmp_filename)
  89. csv_data = if csv_data
  90. csv_data.split("\n").compact.map(&:to_i)
  91. end
  92. csv_data ||= []
  93.  
  94. admin = AdminUser.find clinic_admin_id
  95. practitioners = AdminUser.role_researcher.where(belongs_to_admin_user_id: admin.id)
  96. patients = AdminUser.role_user.where(belongs_to_admin_user_id: [admin.id] + practitioners.ids)
  97.  
  98.  
  99. sessions = BatchSession.includes(:admin_user, :batch).status_complete.where(admin_user_id: patients.ids).order(:completed_at)
  100. sessions = sessions.where('completed_at >= ?', start_date) if start_date
  101. sessions = sessions.where('completed_at <= ?', end_date) if end_date
  102. test_ids = TestScore.where(batch_session_id: sessions.ids).map(&:test_id).uniq
  103. tests = Test.where(id: test_ids).order(:id)
  104. q_batches = Batch.where(id: sessions.pluck(:batch_id)).assessment_type_questionnaire.order(:id)
  105.  
  106. CSV.open(filename, 'a+') do |csv|
  107. row = ['Client ID', 'Assessment']
  108. row << 'Protocol Name'
  109. row << 'Scheduled?'
  110. row << 'Assessment Number As Part of the Schedule'
  111. row << 'Date of Completion'
  112. row << 'Number of Tasks completed'
  113. row += q_batches.map { |batch| "#{batch.description} Score"}
  114. tests.each do |test|
  115. row += ["#{test.name} - Percentile", "#{test.name} - Score"]
  116. end
  117. csv << row
  118.  
  119. progress_bar = ProgressBar.new(sessions.count)
  120. sessions.find_each do |session|
  121. if csv_data.exclude?(session.id)
  122. csv << session_info(session, admin, q_batches, tests)
  123. tmp_file.puts session.id
  124. sleep 0.5
  125. end
  126. progress_bar.increment!
  127. end
  128. end
  129. end
  130.  
  131. start_date = Date.parse('1 Feb 2024').beginning_of_day
  132. end_date = Date.parse('29 Feb 2024').end_of_day
  133.  
  134. data_pull(331613, 'CS-152.csv',start_date, end_date)
  135.  
  136. media_file = MediaFile.create!(
  137. name: 'CS-1370',
  138. admin_user_id: 1,
  139. asset: File.open('tmp/CS-152.csv'),
  140. asset_file_name: 'CS-152.csv',
  141. allow_others_to_copy: NO,
  142. public: false,
  143. category: :admin_report
  144. )
  145. media_file.path
  146.  
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement