ccls-ccls_engine 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. data/README.rdoc +182 -0
  2. data/app/models/abstract.rb +181 -0
  3. data/app/models/abstract_search.rb +50 -0
  4. data/app/models/abstract_validations.rb +324 -0
  5. data/app/models/address.rb +70 -0
  6. data/app/models/address_type.rb +15 -0
  7. data/app/models/addressing.rb +147 -0
  8. data/app/models/aliquot.rb +44 -0
  9. data/app/models/aliquot_sample_format.rb +13 -0
  10. data/app/models/analysis.rb +14 -0
  11. data/app/models/bc_request.rb +20 -0
  12. data/app/models/candidate_control.rb +101 -0
  13. data/app/models/context.rb +23 -0
  14. data/app/models/context_data_source.rb +4 -0
  15. data/app/models/county.rb +16 -0
  16. data/app/models/data_source.rb +24 -0
  17. data/app/models/diagnosis.rb +23 -0
  18. data/app/models/document_type.rb +16 -0
  19. data/app/models/document_version.rb +27 -0
  20. data/app/models/enrollment.rb +78 -0
  21. data/app/models/enrollment_validations.rb +167 -0
  22. data/app/models/follow_up.rb +16 -0
  23. data/app/models/follow_up_type.rb +18 -0
  24. data/app/models/gift_card.rb +22 -0
  25. data/app/models/gift_card_search.rb +137 -0
  26. data/app/models/home_exposure_response.rb +24 -0
  27. data/app/models/homex_outcome.rb +75 -0
  28. data/app/models/hospital.rb +22 -0
  29. data/app/models/icf_master_id.rb +30 -0
  30. data/app/models/icf_master_tracker.rb +217 -0
  31. data/app/models/icf_master_tracker_change.rb +9 -0
  32. data/app/models/icf_master_tracker_update.rb +50 -0
  33. data/app/models/ineligible_reason.rb +26 -0
  34. data/app/models/instrument.rb +26 -0
  35. data/app/models/instrument_type.rb +17 -0
  36. data/app/models/instrument_version.rb +28 -0
  37. data/app/models/interview.rb +122 -0
  38. data/app/models/interview_method.rb +17 -0
  39. data/app/models/interview_outcome.rb +16 -0
  40. data/app/models/language.rb +28 -0
  41. data/app/models/live_birth_data_update.rb +142 -0
  42. data/app/models/operational_event.rb +99 -0
  43. data/app/models/operational_event_type.rb +31 -0
  44. data/app/models/organization.rb +28 -0
  45. data/app/models/patient.rb +63 -0
  46. data/app/models/patient_validations.rb +118 -0
  47. data/app/models/person.rb +28 -0
  48. data/app/models/phone_number.rb +105 -0
  49. data/app/models/phone_type.rb +15 -0
  50. data/app/models/project.rb +39 -0
  51. data/app/models/project_outcome.rb +19 -0
  52. data/app/models/race.rb +31 -0
  53. data/app/models/refusal_reason.rb +23 -0
  54. data/app/models/sample.rb +168 -0
  55. data/app/models/sample_kit.rb +14 -0
  56. data/app/models/sample_outcome.rb +16 -0
  57. data/app/models/sample_temperature.rb +14 -0
  58. data/app/models/sample_type.rb +37 -0
  59. data/app/models/search.rb +195 -0
  60. data/app/models/section.rb +18 -0
  61. data/app/models/state.rb +25 -0
  62. data/app/models/study_subject.rb +237 -0
  63. data/app/models/study_subject_abstracts.rb +47 -0
  64. data/app/models/study_subject_addresses.rb +34 -0
  65. data/app/models/study_subject_associations.rb +38 -0
  66. data/app/models/study_subject_duplicates.rb +111 -0
  67. data/app/models/study_subject_enrollments.rb +17 -0
  68. data/app/models/study_subject_homex_outcome.rb +22 -0
  69. data/app/models/study_subject_identifier.rb +153 -0
  70. data/app/models/study_subject_interviews.rb +25 -0
  71. data/app/models/study_subject_languages.rb +21 -0
  72. data/app/models/study_subject_operational_events.rb +66 -0
  73. data/app/models/study_subject_patient.rb +177 -0
  74. data/app/models/study_subject_pii.rb +74 -0
  75. data/app/models/study_subject_races.rb +25 -0
  76. data/app/models/study_subject_search.rb +260 -0
  77. data/app/models/study_subject_validations.rb +116 -0
  78. data/app/models/subject_language.rb +11 -0
  79. data/app/models/subject_race.rb +11 -0
  80. data/app/models/subject_relationship.rb +21 -0
  81. data/app/models/subject_type.rb +22 -0
  82. data/app/models/tracing_status.rb +20 -0
  83. data/app/models/transfer.rb +40 -0
  84. data/app/models/unit.rb +14 -0
  85. data/app/models/vital_status.rb +19 -0
  86. data/app/models/zip_code.rb +36 -0
  87. data/config/abstract_fields.yml +1038 -0
  88. data/config/abstract_sections.yml +77 -0
  89. data/config/home_exposure_response_fields.yml +583 -0
  90. data/config/icf_master_tracker_update.yml +56 -0
  91. data/config/live_birth_data_update.yml +56 -0
  92. data/config/shared_use_db.yml +4 -0
  93. data/generators/ccls_engine/USAGE +2 -0
  94. data/generators/ccls_engine/ccls_engine_generator.rb +123 -0
  95. data/generators/ccls_engine/templates/autotest_ccls_engine.rb +3 -0
  96. data/generators/ccls_engine/templates/ccls_engine.rake +12 -0
  97. data/generators/ccls_engine/templates/fixtures/address_types.yml +30 -0
  98. data/generators/ccls_engine/templates/fixtures/context_data_sources.yml +54 -0
  99. data/generators/ccls_engine/templates/fixtures/contexts.yml +19 -0
  100. data/generators/ccls_engine/templates/fixtures/data_sources.yml +40 -0
  101. data/generators/ccls_engine/templates/fixtures/diagnoses.yml +40 -0
  102. data/generators/ccls_engine/templates/fixtures/document_types.yml +65 -0
  103. data/generators/ccls_engine/templates/fixtures/document_versions.csv +155 -0
  104. data/generators/ccls_engine/templates/fixtures/follow_up_types.yml +16 -0
  105. data/generators/ccls_engine/templates/fixtures/hospitals.yml +114 -0
  106. data/generators/ccls_engine/templates/fixtures/ineligible_reasons.yml +35 -0
  107. data/generators/ccls_engine/templates/fixtures/instrument_types.yml +26 -0
  108. data/generators/ccls_engine/templates/fixtures/instrument_versions.yml +22 -0
  109. data/generators/ccls_engine/templates/fixtures/instruments.yml +22 -0
  110. data/generators/ccls_engine/templates/fixtures/interview_methods.yml +30 -0
  111. data/generators/ccls_engine/templates/fixtures/interview_outcomes.yml +31 -0
  112. data/generators/ccls_engine/templates/fixtures/languages.yml +34 -0
  113. data/generators/ccls_engine/templates/fixtures/operational_event_types.yml +141 -0
  114. data/generators/ccls_engine/templates/fixtures/organizations.yml +198 -0
  115. data/generators/ccls_engine/templates/fixtures/people.yml +130 -0
  116. data/generators/ccls_engine/templates/fixtures/phone_types.yml +30 -0
  117. data/generators/ccls_engine/templates/fixtures/project_outcomes.yml +25 -0
  118. data/generators/ccls_engine/templates/fixtures/projects.yml +59 -0
  119. data/generators/ccls_engine/templates/fixtures/races.yml +52 -0
  120. data/generators/ccls_engine/templates/fixtures/refusal_reasons.yml +55 -0
  121. data/generators/ccls_engine/templates/fixtures/sample_outcomes.yml +36 -0
  122. data/generators/ccls_engine/templates/fixtures/sample_temperatures.yml +16 -0
  123. data/generators/ccls_engine/templates/fixtures/sample_types.yml +147 -0
  124. data/generators/ccls_engine/templates/fixtures/sections.yml +31 -0
  125. data/generators/ccls_engine/templates/fixtures/states.yml +363 -0
  126. data/generators/ccls_engine/templates/fixtures/subject_relationships.yml +46 -0
  127. data/generators/ccls_engine/templates/fixtures/subject_types.yml +30 -0
  128. data/generators/ccls_engine/templates/fixtures/tracing_statuses.yml +30 -0
  129. data/generators/ccls_engine/templates/fixtures/units.yml +13 -0
  130. data/generators/ccls_engine/templates/fixtures/vital_statuses.yml +28 -0
  131. data/generators/ccls_engine/templates/functional/roles_controller_test.rb +142 -0
  132. data/generators/ccls_engine/templates/functional/sessions_controller_test.rb +19 -0
  133. data/generators/ccls_engine/templates/functional/users_controller_test.rb +94 -0
  134. data/generators/ccls_engine/templates/images/sort_down.png +0 -0
  135. data/generators/ccls_engine/templates/images/sort_up.png +0 -0
  136. data/generators/ccls_engine/templates/initializer.rb +28 -0
  137. data/generators/ccls_engine/templates/javascripts/ccls_engine.js +24 -0
  138. data/generators/ccls_engine/templates/javascripts/jquery-ui.js +763 -0
  139. data/generators/ccls_engine/templates/javascripts/jquery.js +154 -0
  140. data/generators/ccls_engine/templates/javascripts/jrails.js +1 -0
  141. data/generators/ccls_engine/templates/migrations/create_user_invitations.rb +18 -0
  142. data/generators/ccls_engine/templates/migrations/create_users.rb +33 -0
  143. data/generators/ccls_engine/templates/migrations/drop_user_invitations.rb +18 -0
  144. data/generators/ccls_engine/templates/stylesheets/ccls_engine.css +180 -0
  145. data/generators/ccls_engine/templates/stylesheets/user.css +35 -0
  146. data/generators/ccls_engine/templates/stylesheets/users.css +23 -0
  147. data/generators/ccls_engine/templates/unit/core_extension_test.rb +18 -0
  148. data/generators/ccls_engine/templates/unit/role_test.rb +30 -0
  149. data/generators/ccls_engine/templates/unit/user_test.rb +321 -0
  150. data/lib/ccls-ccls_engine.rb +1 -0
  151. data/lib/ccls_engine.rb +135 -0
  152. data/lib/ccls_engine/action_view_extension.rb +3 -0
  153. data/lib/ccls_engine/action_view_extension/base.rb +53 -0
  154. data/lib/ccls_engine/action_view_extension/form_builder.rb +39 -0
  155. data/lib/ccls_engine/active_record_extension.rb +2 -0
  156. data/lib/ccls_engine/active_record_extension/base.rb +70 -0
  157. data/lib/ccls_engine/active_record_shared.rb +8 -0
  158. data/lib/ccls_engine/assertions.rb +69 -0
  159. data/lib/ccls_engine/autotest.rb +54 -0
  160. data/lib/ccls_engine/ccls_user.rb +117 -0
  161. data/lib/ccls_engine/core_extension.rb +14 -0
  162. data/lib/ccls_engine/date_and_time_formats.rb +30 -0
  163. data/lib/ccls_engine/factories.rb +880 -0
  164. data/lib/ccls_engine/factory_test_helper.rb +276 -0
  165. data/lib/ccls_engine/helper.rb +112 -0
  166. data/lib/ccls_engine/icf_master_tracker_update_test_helper.rb +121 -0
  167. data/lib/ccls_engine/live_birth_data_update_test_helper.rb +110 -0
  168. data/lib/ccls_engine/package_test_helper.rb +49 -0
  169. data/lib/ccls_engine/shared_database.rb +20 -0
  170. data/lib/ccls_engine/tasks.rb +1 -0
  171. data/lib/ccls_engine/test_tasks.rb +52 -0
  172. data/lib/ccls_engine/translation_table.rb +86 -0
  173. data/lib/shared_migration.rb +5 -0
  174. data/lib/surveyor/survey_extensions.rb +125 -0
  175. data/lib/tasks/application.rake +286 -0
  176. data/lib/tasks/calnet_authenticated.rake +6 -0
  177. data/lib/tasks/common_lib.rake +7 -0
  178. data/lib/tasks/database.rake +288 -0
  179. data/lib/tasks/documentation.rake +71 -0
  180. data/lib/tasks/homex_import.rake +723 -0
  181. data/lib/tasks/odms_import.rake +1116 -0
  182. data/lib/tasks/simply_authorized.rake +6 -0
  183. data/lib/tasks/ucb_ccls_engine_tasks.rake +4 -0
  184. data/lib/tasks/use_db.rake +4 -0
  185. data/rails/init.rb +4 -0
  186. data/test/unit/ccls/abstract_search_test.rb +150 -0
  187. data/test/unit/ccls/abstract_test.rb +674 -0
  188. data/test/unit/ccls/address_test.rb +155 -0
  189. data/test/unit/ccls/address_type_test.rb +25 -0
  190. data/test/unit/ccls/addressing_test.rb +466 -0
  191. data/test/unit/ccls/aliquot_sample_format_test.rb +20 -0
  192. data/test/unit/ccls/aliquot_test.rb +156 -0
  193. data/test/unit/ccls/analysis_test.rb +31 -0
  194. data/test/unit/ccls/bc_request_test.rb +43 -0
  195. data/test/unit/ccls/candidate_control_test.rb +712 -0
  196. data/test/unit/ccls/context_data_source_test.rb +26 -0
  197. data/test/unit/ccls/context_test.rb +40 -0
  198. data/test/unit/ccls/core_extension_test.rb +17 -0
  199. data/test/unit/ccls/county_test.rb +34 -0
  200. data/test/unit/ccls/data_source_test.rb +41 -0
  201. data/test/unit/ccls/diagnosis_test.rb +51 -0
  202. data/test/unit/ccls/document_type_test.rb +35 -0
  203. data/test/unit/ccls/document_version_test.rb +68 -0
  204. data/test/unit/ccls/enrollment_test.rb +575 -0
  205. data/test/unit/ccls/follow_up_test.rb +23 -0
  206. data/test/unit/ccls/follow_up_type_test.rb +34 -0
  207. data/test/unit/ccls/gift_card_search_test.rb +153 -0
  208. data/test/unit/ccls/gift_card_test.rb +40 -0
  209. data/test/unit/ccls/home_exposure_response_test.rb +83 -0
  210. data/test/unit/ccls/homex_outcome_test.rb +199 -0
  211. data/test/unit/ccls/hospital_test.rb +102 -0
  212. data/test/unit/ccls/icf_master_id_test.rb +30 -0
  213. data/test/unit/ccls/icf_master_tracker_change_test.rb +14 -0
  214. data/test/unit/ccls/icf_master_tracker_test.rb +132 -0
  215. data/test/unit/ccls/icf_master_tracker_update_test.rb +176 -0
  216. data/test/unit/ccls/ineligible_reason_test.rb +48 -0
  217. data/test/unit/ccls/instrument_test.rb +62 -0
  218. data/test/unit/ccls/instrument_type_test.rb +39 -0
  219. data/test/unit/ccls/instrument_version_test.rb +71 -0
  220. data/test/unit/ccls/interview_method_test.rb +44 -0
  221. data/test/unit/ccls/interview_outcome_test.rb +34 -0
  222. data/test/unit/ccls/interview_test.rb +298 -0
  223. data/test/unit/ccls/language_test.rb +47 -0
  224. data/test/unit/ccls/live_birth_data_update_test.rb +358 -0
  225. data/test/unit/ccls/operational_event_test.rb +187 -0
  226. data/test/unit/ccls/operational_event_type_test.rb +51 -0
  227. data/test/unit/ccls/organization_test.rb +64 -0
  228. data/test/unit/ccls/patient_test.rb +538 -0
  229. data/test/unit/ccls/person_test.rb +55 -0
  230. data/test/unit/ccls/phone_number_test.rb +244 -0
  231. data/test/unit/ccls/phone_type_test.rb +32 -0
  232. data/test/unit/ccls/project_outcome_test.rb +34 -0
  233. data/test/unit/ccls/project_test.rb +60 -0
  234. data/test/unit/ccls/race_test.rb +37 -0
  235. data/test/unit/ccls/refusal_reason_test.rb +52 -0
  236. data/test/unit/ccls/role_test.rb +26 -0
  237. data/test/unit/ccls/sample_kit_test.rb +35 -0
  238. data/test/unit/ccls/sample_outcome_test.rb +34 -0
  239. data/test/unit/ccls/sample_temperature_test.rb +25 -0
  240. data/test/unit/ccls/sample_test.rb +363 -0
  241. data/test/unit/ccls/sample_type_test.rb +58 -0
  242. data/test/unit/ccls/section_test.rb +34 -0
  243. data/test/unit/ccls/state_test.rb +31 -0
  244. data/test/unit/ccls/study_subject_abstracts_test.rb +115 -0
  245. data/test/unit/ccls/study_subject_addresses_test.rb +93 -0
  246. data/test/unit/ccls/study_subject_duplicates_test.rb +407 -0
  247. data/test/unit/ccls/study_subject_enrollments_test.rb +65 -0
  248. data/test/unit/ccls/study_subject_homex_outcome_test.rb +64 -0
  249. data/test/unit/ccls/study_subject_identifier_test.rb +439 -0
  250. data/test/unit/ccls/study_subject_interviews_test.rb +26 -0
  251. data/test/unit/ccls/study_subject_languages_test.rb +142 -0
  252. data/test/unit/ccls/study_subject_operational_events_test.rb +53 -0
  253. data/test/unit/ccls/study_subject_patient_test.rb +249 -0
  254. data/test/unit/ccls/study_subject_pii_test.rb +278 -0
  255. data/test/unit/ccls/study_subject_races_test.rb +203 -0
  256. data/test/unit/ccls/study_subject_search_test.rb +704 -0
  257. data/test/unit/ccls/study_subject_test.rb +770 -0
  258. data/test/unit/ccls/subject_language_test.rb +43 -0
  259. data/test/unit/ccls/subject_race_test.rb +35 -0
  260. data/test/unit/ccls/subject_relationship_test.rb +43 -0
  261. data/test/unit/ccls/subject_type_test.rb +40 -0
  262. data/test/unit/ccls/tracing_status_test.rb +32 -0
  263. data/test/unit/ccls/transfer_test.rb +81 -0
  264. data/test/unit/ccls/translation_table_test.rb +40 -0
  265. data/test/unit/ccls/unit_test.rb +21 -0
  266. data/test/unit/ccls/user_test.rb +156 -0
  267. data/test/unit/ccls/vital_status_test.rb +36 -0
  268. data/test/unit/ccls/zip_code_test.rb +55 -0
  269. metadata +633 -0
@@ -0,0 +1,70 @@
1
+ # Address for a study_subject
2
+ # Actually, this may be used for things other than subjects
3
+ class Address < ActiveRecordShared
4
+
5
+ default_scope :order => 'created_at DESC'
6
+
7
+ has_many :interviews
8
+ has_one :addressing
9
+ has_one :study_subject, :through => :addressing
10
+ belongs_to :address_type
11
+
12
+ validate :address_type_matches_line
13
+
14
+ validates_presence_of :address_type_id
15
+ validates_presence_of :address_type, :if => :address_type_id
16
+
17
+ validates_presence_of :line_1
18
+ validates_length_of :line_1, :maximum => 250, :allow_blank => true
19
+ validates_length_of :line_2, :maximum => 250, :allow_blank => true
20
+ validates_length_of :unit, :maximum => 250, :allow_blank => true
21
+ validates_presence_of :city
22
+ validates_length_of :city, :maximum => 250, :allow_blank => true
23
+ validates_presence_of :state
24
+ validates_length_of :state, :maximum => 250, :allow_blank => true
25
+ validates_presence_of :zip
26
+ validates_length_of :zip, :maximum => 10, :allow_blank => true
27
+
28
+ # this needs to be unique, but is only used during importing
29
+ validates_uniqueness_of :external_address_id, :allow_blank => true
30
+
31
+ validates_format_of :zip,
32
+ :with => /\A\s*\d{5}(-)?(\d{4})?\s*\z/,
33
+ :message => "should be 12345, 123451234 or 12345-1234", :allow_blank => true
34
+
35
+ # Would it be better to do this before_validation?
36
+ before_save :format_zip, :if => :zip_changed?
37
+
38
+ # Returns a string with the city, state and zip
39
+ def csz
40
+ "#{self.city}, #{self.state} #{self.zip}"
41
+ end
42
+
43
+ protected
44
+
45
+ # Determine if the address is a PO Box and then
46
+ # require that the address type NOT be a residence.
47
+ def address_type_matches_line
48
+ # It is inevitable that this will match too much
49
+ # Pobox Street?
50
+ if(( line_1 =~ /p.*o.*box/i ) &&
51
+ ( address_type_id.to_s == '1' )) # 1 is 'residence'
52
+ errors.add(:address_type_id,
53
+ "must not be residence with PO Box")
54
+ end
55
+ end
56
+
57
+ # Simply squish the zip removing leading and trailing spaces.
58
+ # zip MUST be a string or this won't work. Will always be
59
+ # a string when sent from a form.
60
+ def format_zip
61
+ # zip was nil during import and skipping validations
62
+ self.zip.squish! unless zip.nil?
63
+ # convert to 12345-1234
64
+ if !self.zip.nil? and self.zip.length > 5
65
+ old = self.zip.gsub(/\D/,'')
66
+ self.zip = "#{old[0..4]}-#{old[5..8]}"
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,15 @@
1
+ # The type of address (home,work,residence,pobox,etc.)
2
+ class AddressType < ActiveRecordShared
3
+
4
+ acts_as_list
5
+ default_scope :order => :position
6
+
7
+ acts_like_a_hash
8
+ has_many :addresses
9
+
10
+ # Returns the key
11
+ def to_s
12
+ self.key
13
+ end
14
+
15
+ end
@@ -0,0 +1,147 @@
1
+ # Rich join of Subject and Address
2
+ class Addressing < ActiveRecordShared
3
+
4
+ belongs_to :study_subject
5
+ belongs_to :address
6
+ belongs_to :data_source
7
+
8
+ # TODO test this. Also may not need current_user now.
9
+ # This works in the console and such, but ActiveScaffold tries
10
+ # to use it in a join, but it is in a different database so fails.
11
+ # May be able to make it work in AS, but need to fiddle.
12
+ # belongs_to :verified_by, :foreign_key => 'verified_by_uid',
13
+ # :class_name => 'User', :primary_key => 'uid'
14
+
15
+ delegate :is_other?, :to => :data_source, :allow_nil => true, :prefix => true
16
+ delegate :address_type, :address_type_id,
17
+ :line_1,:line_2,:unit,:city,:state,:zip,:csz,:county,
18
+ :to => :address, :allow_nil => true
19
+
20
+ attr_accessor :current_user
21
+
22
+ # flag used in study_subject's nested attributes for addressing
23
+ # to not reject if address fields are blank.
24
+ attr_accessor :address_required
25
+
26
+ validates_length_of :why_invalid, :maximum => 250, :allow_blank => true
27
+ validates_presence_of :why_invalid, :if => :is_not_valid?
28
+ validates_length_of :how_verified, :maximum => 250, :allow_blank => true
29
+ validates_presence_of :how_verified, :if => :is_verified?
30
+ validates_complete_date_for :valid_from, :allow_nil => true
31
+ validates_complete_date_for :valid_to, :allow_nil => true
32
+
33
+ validates_presence_of :data_source_other, :if => :data_source_is_other?
34
+
35
+
36
+
37
+
38
+ attr_protected :study_subject_id, :study_subject
39
+
40
+
41
+
42
+
43
+ validates_inclusion_of :current_address, :is_valid,
44
+ :address_at_diagnosis,
45
+ :in => YNDK.valid_values, :allow_nil => true
46
+
47
+
48
+ named_scope :current, :conditions => [
49
+ 'current_address IS NOT NULL AND current_address != 2'
50
+ ]
51
+
52
+ named_scope :historic, :conditions => [
53
+ 'current_address IS NULL OR current_address = 2'
54
+ ]
55
+
56
+ # Don't do the rejections here.
57
+ accepts_nested_attributes_for :address
58
+
59
+ attr_accessor :subject_moved
60
+
61
+ after_save :create_subject_moved_event, :if => :subject_moved
62
+
63
+ before_save :set_verifier,
64
+ :if => :is_verified?,
65
+ :unless => :is_verified_was
66
+
67
+ before_save :nullify_verifier,
68
+ :unless => :is_verified?,
69
+ :if => :is_verified_was
70
+
71
+ after_create :check_state_for_eligibilty
72
+
73
+ # Returns boolean of comparison of is_valid == 2 or 999
74
+ # Rails SHOULD convert incoming string params to integer.
75
+ def is_not_valid?
76
+ # [2,999].include?(is_valid.to_i)
77
+ [2,999].include?(is_valid)
78
+ end
79
+
80
+ protected
81
+
82
+ # Set verified time and user if given
83
+ def set_verifier
84
+ self.verified_on = Time.now
85
+ self.verified_by_uid = current_user.try(:uid)||''
86
+ end
87
+
88
+ # Unset verified time and user
89
+ def nullify_verifier
90
+ self.verified_on = nil
91
+ self.verified_by_uid = nil
92
+ end
93
+
94
+ def check_state_for_eligibilty
95
+ if( state != 'CA' && study_subject &&
96
+ ( hxe = study_subject.enrollments.find_by_project_id(Project['HomeExposures'].id) ) &&
97
+ address_type == AddressType['residence'] )
98
+
99
+ # This is an after_save so using 1 NOT 0
100
+ ineligible_reason = if( study_subject.residence_addresses_count == 1 )
101
+ IneligibleReason['newnonCA']
102
+ else
103
+ IneligibleReason['moved']
104
+ end
105
+
106
+ hxe.update_attributes(
107
+ :is_eligible => YNDK[:no],
108
+ :ineligible_reason => ineligible_reason
109
+ )
110
+
111
+ oet = OperationalEventType['ineligible']
112
+ if( oet.blank? )
113
+ errors.add(:base,"OperationalEventType['ineligible'] not found")
114
+ raise ActiveRecord::RecordNotSaved
115
+ end
116
+
117
+ OperationalEvent.create!(
118
+ :enrollment => hxe,
119
+ :operational_event_type => oet,
120
+ :occurred_on => Date.today,
121
+ :description => ineligible_reason.to_s
122
+ )
123
+
124
+ end
125
+ end
126
+
127
+ # this will actually create an event on creation as well
128
+ # if attributes match
129
+ def create_subject_moved_event
130
+ # subject_moved will most likely be a string 'true' or 'false'
131
+ # as it will really only come as a hash value from a view.
132
+ # .true? is a common_lib#object method.
133
+ if subject_moved.true? &&
134
+ current_address == YNDK[:no] &&
135
+ current_address_was != YNDK[:no] &&
136
+ address.address_type == AddressType['residence']
137
+ ccls_enrollment = study_subject.enrollments.find_or_create_by_project_id(
138
+ Project['ccls'].id)
139
+ OperationalEvent.create!(
140
+ :enrollment => ccls_enrollment,
141
+ :operational_event_type => OperationalEventType['subject_moved'],
142
+ :occurred_on => Date.today
143
+ )
144
+ end
145
+ end
146
+
147
+ end
@@ -0,0 +1,44 @@
1
+ # == requires
2
+ # * sample_id
3
+ # * unit_id
4
+ # * owner_id
5
+ class Aliquot < ActiveRecordShared
6
+
7
+ belongs_to :sample
8
+ belongs_to :unit
9
+ belongs_to :aliquot_sample_format
10
+ belongs_to :owner, :class_name => "Organization"
11
+ has_many :transfers
12
+
13
+ validates_presence_of :sample
14
+ validates_presence_of :unit
15
+ validates_presence_of :owner
16
+ validates_length_of :location, :maximum => 250, :allow_blank => true
17
+ validates_length_of :mass, :maximum => 250, :allow_blank => true
18
+
19
+ # Create a #Transfer for the given #Aliquot from the
20
+ # current owner(#Organization) to the given #Organization.
21
+ def transfer_to(organization)
22
+ org = Organization.find(organization)
23
+ # I don't think that the transaction is necessary
24
+ # but I also don't think that it will hurt.
25
+ Aliquot.transaction do
26
+ # wrap this in a transaction because
27
+ # we don't want the aliquot.owner being
28
+ # out of sync with the last transfer.to
29
+ self.transfer.to(org).save!
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ # Begin building the #Transfer from the current
36
+ # owner(#Organization)
37
+ def transfer
38
+ Transfer.new({
39
+ :aliquot_id => self.id,
40
+ :from_organization_id => self.owner_id
41
+ })
42
+ end
43
+
44
+ end
@@ -0,0 +1,13 @@
1
+ # == requires
2
+ # * description (unique and >3 chars)
3
+ class AliquotSampleFormat < ActiveRecordShared
4
+
5
+ acts_as_list
6
+ default_scope :order => :position
7
+
8
+ acts_like_a_hash
9
+
10
+ has_many :aliquots
11
+ has_many :samples
12
+
13
+ end
@@ -0,0 +1,14 @@
1
+ # don't know exactly
2
+ class Analysis < ActiveRecordShared
3
+ #
4
+ # TODO remove the habtm and replace it with hmt SubjectAnalyses ?
5
+ #
6
+ has_and_belongs_to_many :study_subjects
7
+
8
+ belongs_to :analyst, :class_name => 'Person'
9
+ belongs_to :analytic_file_creator, :class_name => 'Person'
10
+ belongs_to :project
11
+
12
+ acts_like_a_hash
13
+
14
+ end
@@ -0,0 +1,20 @@
1
+ class BcRequest < ActiveRecordShared
2
+
3
+ belongs_to :study_subject
4
+ attr_protected :study_subject_id, :study_subject
5
+
6
+ validates_length_of :request_type, :maximum => 250, :allow_blank => true
7
+ validates_length_of :status, :maximum => 250, :allow_blank => true
8
+ validates_length_of :notes, :maximum => 65000, :allow_blank => true
9
+
10
+ # validates_inclusion_of :status, :in => statuses
11
+
12
+ def self.statuses
13
+ %w( active waitlist pending complete )
14
+ end
15
+
16
+ def to_s
17
+ ( study_subject ) ? study_subject.studyid : self
18
+ end
19
+
20
+ end
@@ -0,0 +1,101 @@
1
+ class CandidateControl < ActiveRecordShared
2
+
3
+ belongs_to :study_subject
4
+ attr_protected :study_subject_id, :study_subject
5
+
6
+ validates_presence_of :first_name
7
+ validates_presence_of :last_name
8
+ validates_presence_of :dob
9
+ validates_inclusion_of :reject_candidate, :in => [true, false]
10
+ validates_presence_of :rejection_reason, :if => :reject_candidate
11
+ validates_length_of :related_patid, :is => 4, :allow_blank => true
12
+ validates_length_of :state_registrar_no, :maximum => 25, :allow_blank => true
13
+ validates_length_of :local_registrar_no, :maximum => 25, :allow_blank => true
14
+
15
+ validates_length_of :first_name, :middle_name, :last_name,
16
+ :birth_county, :birth_type, :mother_maiden_name,
17
+ :rejection_reason, :maximum => 250, :allow_blank => true
18
+
19
+ # validates_inclusion_of :sex, :in => %w( M F DK )
20
+ validates_inclusion_of :sex, :in => valid_sex_values
21
+
22
+
23
+ validates_inclusion_of :mother_hispanicity_id, :father_hispanicity_id,
24
+ :in => YNODK.valid_values, :allow_nil => true
25
+ validates_inclusion_of :mom_is_biomom, :dad_is_biodad,
26
+ :in => YNDK.valid_values, :allow_nil => true
27
+
28
+
29
+ # Returns string containing candidates's first, middle and last name
30
+ def full_name
31
+ [first_name, middle_name, last_name].delete_if(&:blank?).join(' ')
32
+ end
33
+
34
+ # Returns string containing candidates's mother's first, middle and last name
35
+ def mother_full_name
36
+ [mother_first_name, mother_middle_name, mother_last_name].delete_if(&:blank?).join(' ')
37
+ end
38
+
39
+ def create_study_subjects(case_subject,grouping = '6')
40
+ next_orderno = case_subject.next_control_orderno(grouping)
41
+
42
+ CandidateControl.transaction do
43
+
44
+ # Use a block so can assign all attributes without concern for attr_protected
45
+ child = StudySubject.new do |s|
46
+ s.subject_type = SubjectType['Control']
47
+ s.vital_status = VitalStatus['living']
48
+ s.sex = sex
49
+ s.mom_is_biomom = mom_is_biomom
50
+ s.dad_is_biodad = dad_is_biodad
51
+ s.mother_hispanicity_id = mother_hispanicity_id
52
+ s.father_hispanicity_id = father_hispanicity_id
53
+ s.birth_type = birth_type
54
+ s.mother_yrs_educ = mother_yrs_educ
55
+ s.father_yrs_educ = father_yrs_educ
56
+ s.birth_county = birth_county
57
+ s.hispanicity_id = (
58
+ ( [mother_hispanicity_id,father_hispanicity_id].include?(1) ) ? 1 : nil )
59
+ s.first_name = first_name
60
+ s.middle_name = middle_name
61
+ s.last_name = last_name
62
+ s.dob = dob
63
+ s.mother_first_name = mother_first_name
64
+ s.mother_middle_name = mother_middle_name
65
+ s.mother_last_name = mother_last_name
66
+ s.mother_maiden_name = mother_maiden_name
67
+ s.mother_race_id = mother_race_id
68
+ s.father_race_id = father_race_id
69
+
70
+ s.case_control_type = grouping
71
+ s.state_registrar_no = state_registrar_no
72
+ s.local_registrar_no = local_registrar_no
73
+ s.orderno = next_orderno
74
+ s.matchingid = case_subject.subjectid
75
+ s.patid = case_subject.patid
76
+ s.is_matched = true
77
+ end
78
+ child.save!
79
+ child.assign_icf_master_id
80
+
81
+
82
+ # TODO May have to set is_matched for both the Case and Control here [#217]
83
+ # We will default it to null and add logic to set it to true for both the new control and their related case when a new control is added to study_subjects from candidate_controls.
84
+ case_subject.update_attributes!(:is_matched => true)
85
+
86
+
87
+ # NOTE this may require passing info
88
+ # that is in the candidate_control record, but not in the child subject
89
+ # mother_hispanicity_id (actually this is now)
90
+ # worst case scenario is just create the full mother here
91
+ # rather than through the child.
92
+ child.create_mother # ({ .... })
93
+
94
+ self.study_subject_id = child.id
95
+ self.assigned_on = Date.today
96
+ self.save!
97
+ end
98
+ self
99
+ end
100
+
101
+ end
@@ -0,0 +1,23 @@
1
+ # == requires
2
+ # * description (unique and >3 chars)
3
+ class Context < ActiveRecordShared
4
+
5
+ acts_as_list
6
+ default_scope :order => :position
7
+
8
+ acts_like_a_hash
9
+
10
+ has_many :units
11
+ # has_many :people
12
+
13
+ has_many :context_data_sources
14
+ has_many :data_sources, :through => :context_data_sources
15
+
16
+ validates_length_of :notes, :maximum => 65000, :allow_blank => true
17
+
18
+ # Returns description
19
+ def to_s
20
+ description
21
+ end
22
+
23
+ end