fe 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -1
  3. data/Rakefile +22 -13
  4. data/app/assets/javascripts/application.js.erb +1 -0
  5. data/app/assets/javascripts/fe/admin.js +1 -4
  6. data/app/assets/javascripts/fe/{qe.admin.js → fe.admin.js} +15 -0
  7. data/app/assets/javascripts/fe/{qe.common.js → fe.common.js} +0 -0
  8. data/app/assets/javascripts/fe/{qe.public.js → fe.public.js} +115 -27
  9. data/app/assets/javascripts/fe/rails.extra.js +6 -0
  10. data/app/assets/stylesheets/fe/{qe.screen.css.scss.erb → fe.screen.css.scss.erb} +12 -18
  11. data/app/controllers/fe/admin/elements_controller.rb +4 -4
  12. data/app/controllers/fe/admin/email_templates_controller.rb +10 -4
  13. data/app/controllers/fe/admin/question_pages_controller.rb +3 -3
  14. data/app/controllers/fe/admin/question_sheets_controller.rb +6 -5
  15. data/app/controllers/fe/applications_controller.rb +183 -0
  16. data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +5 -2
  17. data/app/controllers/fe/concerns/answer_sheets_controller_concern.rb +10 -6
  18. data/app/controllers/fe/concerns/application_controller_concern.rb +34 -0
  19. data/app/controllers/fe/payments_controller.rb +184 -0
  20. data/app/controllers/fe/reference_pages_controller.rb +41 -0
  21. data/app/controllers/fe/reference_sheets_controller.rb +1 -1
  22. data/app/controllers/fe/references_controller.rb +74 -0
  23. data/app/controllers/fe/submit_pages_controller.rb +22 -0
  24. data/app/helpers/fe/application_helper.rb +14 -5
  25. data/app/mailers/fe/notifier.rb +1 -1
  26. data/app/models/fe/address.rb +3 -0
  27. data/app/models/fe/answer_pages_presenter.rb +1 -1
  28. data/app/models/fe/answer_sheet.rb +6 -2
  29. data/app/models/fe/answer_sheet_question_sheet.rb +1 -1
  30. data/app/models/fe/application.rb +58 -0
  31. data/app/models/fe/choice_field.rb +1 -1
  32. data/app/models/fe/concerns/answer_concern.rb +10 -11
  33. data/app/models/fe/concerns/answer_pages_presenter_concern.rb +16 -7
  34. data/app/models/fe/concerns/answer_sheet_concern.rb +10 -16
  35. data/app/models/fe/concerns/choice_field_concern.rb +21 -10
  36. data/app/models/fe/condition.rb +1 -1
  37. data/app/models/fe/current_address.rb +12 -0
  38. data/app/models/fe/date_field.rb +3 -3
  39. data/app/models/fe/element.rb +66 -9
  40. data/app/models/fe/email_address.rb +7 -0
  41. data/app/models/fe/email_template.rb +1 -1
  42. data/app/models/fe/option.rb +1 -1
  43. data/app/models/fe/option_group.rb +1 -1
  44. data/app/models/fe/page.rb +13 -4
  45. data/app/models/fe/page_element.rb +13 -1
  46. data/app/models/fe/page_link.rb +1 -1
  47. data/app/models/fe/paragraph.rb +1 -1
  48. data/app/models/fe/payment.rb +32 -7
  49. data/app/models/fe/payment_question.rb +1 -1
  50. data/app/models/fe/person.rb +33 -0
  51. data/app/models/fe/phone_number.rb +5 -0
  52. data/app/models/fe/presenter.rb +3 -2
  53. data/app/models/fe/question.rb +7 -7
  54. data/app/models/fe/question_grid.rb +1 -2
  55. data/app/models/fe/question_set.rb +1 -1
  56. data/app/models/fe/question_sheet.rb +9 -3
  57. data/app/models/fe/reference_question.rb +2 -2
  58. data/app/models/fe/reference_sheet.rb +28 -4
  59. data/app/models/fe/section.rb +1 -1
  60. data/app/models/fe/state_chooser.rb +1 -1
  61. data/app/models/fe/text_field.rb +3 -3
  62. data/app/models/fe/user.rb +3 -0
  63. data/app/models/staff.rb +120 -0
  64. data/app/views/fe/admin/elements/_errors.html.erb +11 -1
  65. data/app/views/fe/admin/elements/create.js.erb +3 -3
  66. data/app/views/fe/admin/elements/destroy.js.erb +2 -2
  67. data/app/views/fe/admin/elements/drop.js.erb +1 -1
  68. data/app/views/fe/admin/elements/duplicate.js.erb +1 -1
  69. data/app/views/fe/admin/elements/edit.js.erb +1 -1
  70. data/app/views/fe/admin/elements/error.js.erb +1 -1
  71. data/app/views/fe/admin/elements/new.js.erb +3 -3
  72. data/app/views/fe/admin/elements/update.js.erb +2 -2
  73. data/app/views/fe/admin/email_templates/edit.html.erb +9 -9
  74. data/app/views/fe/admin/email_templates/index.html.erb +3 -3
  75. data/app/views/fe/admin/email_templates/new.html.erb +2 -2
  76. data/app/views/fe/admin/panels/_advanced_options.html.erb +28 -1
  77. data/app/views/fe/admin/panels/_common_fields.html.erb +1 -1
  78. data/app/views/fe/admin/panels/_condition.html.erb +1 -1
  79. data/app/views/fe/admin/panels/_insert.html.erb +13 -13
  80. data/app/views/fe/admin/panels/_nav_controls.html.erb +4 -4
  81. data/app/views/fe/admin/panels/_page.html.erb +2 -2
  82. data/app/views/fe/admin/panels/_pages_list.html.erb +4 -4
  83. data/app/views/fe/admin/panels/_prop_attachment_field.html.erb +1 -1
  84. data/app/views/fe/admin/panels/_prop_choice_field.html.erb +10 -10
  85. data/app/views/fe/admin/panels/_prop_date_field.html.erb +1 -1
  86. data/app/views/fe/admin/panels/_prop_element.html.erb +7 -7
  87. data/app/views/fe/admin/panels/_prop_page.html.erb +2 -2
  88. data/app/views/fe/admin/panels/_prop_paragraph.html.erb +1 -1
  89. data/app/views/fe/admin/panels/_prop_payment_question.html.erb +1 -0
  90. data/app/views/fe/admin/panels/_prop_question_grid.html.erb +2 -2
  91. data/app/views/fe/admin/panels/_prop_question_grid_with_total.html.erb +1 -1
  92. data/app/views/fe/admin/panels/_prop_reference_question.html.erb +2 -2
  93. data/app/views/fe/admin/panels/_prop_section.html.erb +1 -1
  94. data/app/views/fe/admin/panels/_prop_sheet.html.erb +9 -9
  95. data/app/views/fe/admin/panels/_prop_text_field.html.erb +10 -10
  96. data/app/views/fe/admin/question_pages/_element.html.erb +5 -5
  97. data/app/views/fe/admin/question_pages/_element_show.html.erb +1 -1
  98. data/app/views/fe/admin/question_pages/_errors.html.erb +10 -1
  99. data/app/views/fe/admin/question_pages/_question_page.html.erb +3 -3
  100. data/app/views/fe/admin/question_pages/create.js.erb +3 -3
  101. data/app/views/fe/admin/question_pages/destroy.js.erb +3 -3
  102. data/app/views/fe/admin/question_pages/edit.js.erb +1 -1
  103. data/app/views/fe/admin/question_pages/show.js.erb +3 -2
  104. data/app/views/fe/admin/question_pages/show_panel.js.erb +1 -1
  105. data/app/views/fe/admin/question_sheets/_errors.html.erb +11 -1
  106. data/app/views/fe/admin/question_sheets/edit.js.erb +1 -1
  107. data/app/views/fe/admin/question_sheets/error.js.erb +1 -1
  108. data/app/views/fe/admin/question_sheets/index.html.erb +8 -8
  109. data/app/views/fe/admin/question_sheets/new.html.erb +1 -1
  110. data/app/views/fe/admin/question_sheets/show.html.erb +18 -18
  111. data/app/views/fe/admin/question_sheets/update.js.erb +1 -1
  112. data/app/views/fe/answer_pages/_answer_page.html.erb +27 -30
  113. data/app/views/fe/answer_pages/_element.html.erb +5 -1
  114. data/app/views/fe/answer_pages/update.js.erb +1 -1
  115. data/app/views/fe/answer_sheets/_answer_sheet.html.erb +16 -14
  116. data/app/views/fe/answer_sheets/_element.html.erb +1 -1
  117. data/app/views/fe/answer_sheets/_incomplete.html.erb +8 -8
  118. data/app/views/fe/answer_sheets/_page_link.html.erb +2 -2
  119. data/app/views/fe/answer_sheets/_pages_list.html.erb +4 -4
  120. data/app/views/fe/answer_sheets/_title.html.erb +1 -1
  121. data/app/views/fe/answer_sheets/edit.html.erb +59 -53
  122. data/app/views/fe/answer_sheets/incomplete.js.erb +2 -2
  123. data/app/views/fe/answer_sheets/send_reference_invite.js.erb +1 -1
  124. data/app/views/fe/application/_logout.html.erb +1 -0
  125. data/app/views/fe/payment_pages/_credit.html.erb +47 -0
  126. data/app/views/fe/payment_pages/_mail.html.erb +27 -0
  127. data/app/views/fe/payment_pages/_payment.html.erb +6 -0
  128. data/app/views/fe/payment_pages/_staff.html.erb +25 -0
  129. data/app/views/fe/payment_pages/_staff_results.html.erb +17 -0
  130. data/app/views/fe/payment_pages/edit.html.erb +75 -0
  131. data/app/views/fe/payment_pages/staff_search.js.erb +2 -0
  132. data/app/views/fe/payments/_credit.html.erb +47 -0
  133. data/app/views/fe/payments/_errors.html.erb +1 -0
  134. data/app/views/fe/payments/_payment.html.erb +13 -0
  135. data/app/views/fe/payments/_staff.html.erb +21 -0
  136. data/app/views/fe/payments/_staff_results.html.erb +18 -0
  137. data/app/views/fe/payments/approve.js.erb +3 -0
  138. data/app/views/fe/payments/create.js.erb +19 -0
  139. data/app/views/fe/payments/destroy.js.erb +7 -0
  140. data/app/views/fe/payments/edit.html.erb +56 -0
  141. data/app/views/fe/payments/error.js.erb +3 -0
  142. data/app/views/fe/payments/no_access.html.erb +7 -0
  143. data/app/views/fe/payments/staff_search.js.erb +1 -0
  144. data/app/views/fe/payments/update.html.erb +24 -0
  145. data/app/views/fe/questions/{_acceptance.html.erb → fe/_acceptance.html.erb} +0 -0
  146. data/app/views/fe/questions/{_attachment_field.html.erb → fe/_attachment_field.html.erb} +2 -2
  147. data/app/views/fe/questions/{_checkbox_field.html.erb → fe/_checkbox_field.html.erb} +1 -1
  148. data/app/views/fe/questions/{_country.html.erb → fe/_country.html.erb} +1 -1
  149. data/app/views/fe/questions/{_date_field.html.erb → fe/_date_field.html.erb} +0 -0
  150. data/app/views/fe/questions/{_date_field_mmyy.html.erb → fe/_date_field_mmyy.html.erb} +0 -0
  151. data/app/views/fe/questions/{_drop_down_field.html.erb → fe/_drop_down_field.html.erb} +1 -1
  152. data/app/views/fe/questions/fe/_paragraph.html.erb +1 -0
  153. data/app/views/fe/questions/fe/_payment_question.html.erb +70 -0
  154. data/app/views/fe/questions/{_question_grid.html.erb → fe/_question_grid.html.erb} +7 -7
  155. data/app/views/fe/questions/{_question_grid_with_total.html.erb → fe/_question_grid_with_total.html.erb} +1 -1
  156. data/app/views/fe/questions/{_questions.html.erb → fe/_questions.html.erb} +2 -2
  157. data/app/views/fe/questions/{_radio_button_field.html.erb → fe/_radio_button_field.html.erb} +13 -11
  158. data/app/views/fe/questions/{_rating.html.erb → fe/_rating.html.erb} +0 -0
  159. data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -0
  160. data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -0
  161. data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -0
  162. data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -0
  163. data/app/views/fe/questions/fe/_reference_question.html.erb +38 -0
  164. data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -0
  165. data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -0
  166. data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -0
  167. data/app/views/fe/questions/fe/_section.html.erb +1 -0
  168. data/app/views/fe/questions/{_state_chooser.html.erb → fe/_state_chooser.html.erb} +0 -0
  169. data/app/views/fe/questions/{_text_area_field.html.erb → fe/_text_area_field.html.erb} +0 -0
  170. data/app/views/fe/questions/{_text_field.html.erb → fe/_text_field.html.erb} +0 -0
  171. data/app/views/fe/questions/{_yes_no.html.erb → fe/_yes_no.html.erb} +6 -6
  172. data/app/views/fe/questions/{_yes_no_field.erb → fe/_yes_no_field.erb} +1 -1
  173. data/app/views/fe/reference_pages/_reference.html.erb +31 -0
  174. data/app/views/fe/reference_pages/edit.html.erb +24 -0
  175. data/app/views/fe/reference_sheets/done.html.erb +2 -0
  176. data/app/views/fe/reference_sheets/submitted.js.erb +1 -0
  177. data/app/views/fe/references/edit.html.erb +8 -0
  178. data/app/views/fe/references/send_invite.js.erb +7 -0
  179. data/app/views/fe/references/show.html.erb +18 -0
  180. data/app/views/fe/references/submit.js.erb +3 -0
  181. data/app/views/fe/submit_pages/_errors.html.erb +1 -0
  182. data/app/views/fe/submit_pages/_thankyou.html.erb +2 -0
  183. data/app/views/fe/submit_pages/edit.html.erb +36 -0
  184. data/app/views/fe/submit_pages/error.js.erb +1 -0
  185. data/app/views/fe/submit_pages/submit.js.erb +3 -0
  186. data/app/views/layouts/fe/application.html.erb +30 -13
  187. data/app/views/layouts/fe/{qe.admin.html.erb → fe.admin.html.erb} +1 -1
  188. data/config/locales/en.yml +37 -0
  189. data/config/routes.rb +69 -27
  190. data/db/migrate/20131003041856_core.rb +4 -4
  191. data/db/migrate/20131003044518_create_email_templates.rb +1 -1
  192. data/db/migrate/20140623153424_create_fe_people.rb +12 -0
  193. data/db/migrate/20140624180246_create_fe_addresses.rb +20 -0
  194. data/db/migrate/20140624182216_create_create_fe_phone_numbers.rb +16 -0
  195. data/db/migrate/20140625160545_create_fe_users.rb +12 -0
  196. data/db/migrate/20140808202507_add_conditional_type_to_elements.rb +5 -0
  197. data/db/migrate/20140808203609_add_conditional_answer_to_elements.rb +5 -0
  198. data/db/migrate/20140828045339_create_payments.rb +13 -0
  199. data/db/migrate/20141103204704_remove_short_value_column.rb +5 -0
  200. data/db/migrate/20141109154522_move_conditional_ids_used_for_choice_field_to_their_own_column.rb +7 -0
  201. data/db/seeds.rb +7 -0
  202. data/lib/fe.rb +1 -1
  203. data/lib/fe/engine.rb +46 -1
  204. data/lib/fe/version.rb +1 -1
  205. data/lib/tasks/fe_tasks.rake +14 -0
  206. data/spec/controllers/fe/admin/elements_controller_spec.rb +1 -1
  207. data/spec/controllers/fe/admin/email_templates_controller_spec.rb +1 -1
  208. data/spec/controllers/fe/admin/question_pages_controller_spec.rb +1 -1
  209. data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +1 -1
  210. data/spec/controllers/fe/answer_pages_controller_spec.rb +1 -1
  211. data/spec/controllers/fe/answer_sheets_controller_spec.rb +1 -1
  212. data/spec/controllers/fe/reference_sheets_controller_spec.rb +1 -1
  213. data/spec/dummy/README.rdoc +28 -0
  214. data/spec/dummy/Rakefile +6 -0
  215. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  216. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  217. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  218. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  219. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  220. data/spec/dummy/bin/bundle +3 -0
  221. data/spec/dummy/bin/rails +4 -0
  222. data/spec/dummy/bin/rake +4 -0
  223. data/spec/dummy/config.ru +4 -0
  224. data/spec/dummy/config/application.rb +29 -0
  225. data/spec/dummy/config/boot.rb +5 -0
  226. data/spec/dummy/config/database.yml +25 -0
  227. data/spec/dummy/config/environment.rb +5 -0
  228. data/spec/dummy/config/environments/development.rb +37 -0
  229. data/spec/dummy/config/environments/production.rb +82 -0
  230. data/spec/dummy/config/environments/test.rb +39 -0
  231. data/spec/dummy/config/initializers/assets.rb +8 -0
  232. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  233. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  234. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  235. data/spec/dummy/config/initializers/inflections.rb +16 -0
  236. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  237. data/spec/dummy/config/initializers/session_store.rb +3 -0
  238. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  239. data/spec/dummy/config/locales/en.yml +23 -0
  240. data/spec/dummy/config/routes.rb +56 -0
  241. data/spec/dummy/config/secrets.yml +22 -0
  242. data/spec/dummy/db/schema.rb +203 -0
  243. data/spec/dummy/db/test.sqlite3 +0 -0
  244. data/spec/dummy/log/test.log +440 -0
  245. data/spec/dummy/public/404.html +67 -0
  246. data/spec/dummy/public/422.html +67 -0
  247. data/spec/dummy/public/500.html +66 -0
  248. data/spec/dummy/public/favicon.ico +0 -0
  249. data/spec/factories/answer_sheet_question_sheets.rb +4 -0
  250. data/spec/factories/answer_sheets.rb +1 -1
  251. data/spec/factories/applications.rb +7 -0
  252. data/spec/factories/elements.rb +19 -0
  253. data/spec/factories/fe_addresses.rb +14 -0
  254. data/spec/factories/fe_email_addresses.rb +7 -0
  255. data/spec/factories/fe_people.rb +10 -0
  256. data/spec/factories/fe_phone_numbers.rb +7 -0
  257. data/spec/factories/page.rb +9 -0
  258. data/spec/factories/page_elements.rb +5 -0
  259. data/spec/factories/payments.rb +7 -0
  260. data/spec/factories/question_sheet.rb +10 -0
  261. data/spec/models/fe/answer_sheet_question_sheet_spec.rb +3 -3
  262. data/spec/models/fe/answer_spec.rb +5 -5
  263. data/spec/models/fe/application_spec.rb +8 -0
  264. data/spec/models/fe/attachment_field_spec.rb +1 -1
  265. data/spec/models/fe/choice_field_spec.rb +29 -2
  266. data/spec/models/fe/condition_spec.rb +5 -5
  267. data/spec/models/fe/date_field_spec.rb +9 -9
  268. data/spec/models/fe/element_spec.rb +139 -9
  269. data/spec/models/fe/email_template_spec.rb +2 -2
  270. data/spec/models/fe/option_group_spec.rb +1 -1
  271. data/spec/models/fe/option_spec.rb +1 -1
  272. data/spec/models/fe/page_element_spec.rb +3 -3
  273. data/spec/models/fe/page_link_spec.rb +1 -1
  274. data/spec/models/fe/page_spec.rb +43 -11
  275. data/spec/models/fe/paragraph_spec.rb +4 -4
  276. data/spec/models/fe/payment_question_spec.rb +65 -0
  277. data/spec/models/fe/person_spec.rb +4 -0
  278. data/spec/models/fe/question_grid_spec.rb +1 -1
  279. data/spec/models/fe/question_grid_with_total_spec.rb +1 -1
  280. data/spec/models/fe/question_set_spec.rb +1 -1
  281. data/spec/models/fe/question_sheet_spec.rb +5 -5
  282. data/spec/models/fe/question_spec.rb +13 -12
  283. data/spec/models/fe/reference_question_spec.rb +4 -4
  284. data/spec/models/fe/reference_sheet_spec.rb +8 -8
  285. data/spec/models/fe/section_spec.rb +1 -1
  286. data/spec/models/fe/state_chooser_spec.rb +1 -1
  287. data/spec/models/fe/text_field_spec.rb +3 -3
  288. data/spec/{spec_helper.rb → rails_helper.rb} +3 -3
  289. data/spec/support/database.txt +3 -3
  290. metadata +261 -75
  291. data/app/views/fe/questions/_paragraph.html.erb +0 -1
  292. data/app/views/fe/questions/_reference_discipler.html.erb +0 -1
  293. data/app/views/fe/questions/_reference_friend.html.erb +0 -1
  294. data/app/views/fe/questions/_reference_parent.html.erb +0 -1
  295. data/app/views/fe/questions/_reference_peer.html.erb +0 -1
  296. data/app/views/fe/questions/_reference_question.html.erb +0 -38
  297. data/app/views/fe/questions/_reference_roommate.html.erb +0 -1
  298. data/app/views/fe/questions/_reference_spiritual.html.erb +0 -1
  299. data/app/views/fe/questions/_reference_staff.html.erb +0 -1
  300. data/app/views/fe/questions/_section.html.erb +0 -1
  301. data/lib/generators/fe/install_generator.rb +0 -132
  302. data/lib/tasks/qe_tasks.rake +0 -4
  303. data/spec/models/fe/answer_sheet_spec.rb +0 -8
@@ -50,4 +50,4 @@ module Fe
50
50
  end
51
51
 
52
52
  end
53
- end
53
+ end
@@ -0,0 +1,12 @@
1
+ class Fe::CurrentAddress < Fe::Address
2
+
3
+ def save(*)
4
+ self.address_type = "current"
5
+ super
6
+ end
7
+
8
+ def save!(*)
9
+ self.address_type = "current"
10
+ super
11
+ end
12
+ end
@@ -42,11 +42,11 @@ module Fe
42
42
  # which view to render this element?
43
43
  def ptemplate
44
44
  if self.style == 'mmyy'
45
- 'date_field_mmyy'
45
+ 'fe/date_field_mmyy'
46
46
  else
47
- 'date_field'
47
+ 'fe/date_field'
48
48
  end
49
49
  end
50
50
 
51
51
  end
52
- end
52
+ end
@@ -9,7 +9,11 @@ module Fe
9
9
 
10
10
  belongs_to :choice_field,
11
11
  :class_name => "Fe::ChoiceField",
12
- :foreign_key => "conditional_id"
12
+ :foreign_key => "choice_field_id"
13
+
14
+ belongs_to :question_sheet, :foreign_key => "related_question_sheet_id"
15
+
16
+ belongs_to :conditional, :polymorphic => true
13
17
 
14
18
  self.inheritance_column = :kind
15
19
 
@@ -27,6 +31,8 @@ module Fe
27
31
  # validates_length_of :label, :maximum => 255, :allow_nil => true
28
32
 
29
33
  before_validation :set_defaults, :on => :create
34
+ before_save :set_conditional_element
35
+ after_save :update_any_previous_conditional_elements
30
36
 
31
37
  # HUMANIZED_ATTRIBUTES = {
32
38
  # :slug => "Variable"
@@ -54,8 +60,29 @@ module Fe
54
60
  end
55
61
  end
56
62
 
63
+ # assume each element is on a question sheet only once to make things simpler. if not, just take the first one
64
+ def previous_element(question_sheet)
65
+ page_element = page_elements.joins(page: :question_sheet).where("#{Fe::QuestionSheet.table_name}.id" => question_sheet.id).first
66
+ #binding.pry if page_element.nil?
67
+ return unless page_element
68
+ index = page_element.page.elements.index(self)
69
+ if index > 0 && prev_el = page_element.page.elements[index-1]
70
+ return prev_el
71
+ end
72
+ end
73
+
57
74
  def required?(answer_sheet = nil)
58
- required == true
75
+ if answer_sheet &&
76
+ self.question_grid.nil? &&
77
+ (prev_el = previous_element(answer_sheet.question_sheet)) &&
78
+ prev_el.is_a?(Fe::Question) &&
79
+ prev_el.class != Fe::QuestionGrid &&
80
+ prev_el.conditional_match(answer_sheet)
81
+
82
+ return false
83
+ else
84
+ required == true
85
+ end
59
86
  end
60
87
 
61
88
  def position(page = nil)
@@ -80,7 +107,7 @@ module Fe
80
107
  if page
81
108
  page.id
82
109
  else
83
- pages.first.id
110
+ pages.first.try(:id)
84
111
  end
85
112
  end
86
113
 
@@ -98,10 +125,10 @@ module Fe
98
125
  def duplicate(page, parent = nil)
99
126
  new_element = self.class.new(self.attributes.except('id', 'created_at', 'updated_at'))
100
127
  case parent.class.to_s
101
- when Fe::ChoiceField
102
- new_element.conditional_id = parent.id
103
- when Fe::QuestionGrid, Fe::QuestionGridWithTotal
128
+ when "Fe::QuestionGrid", "Fe::QuestionGridWithTotal"
104
129
  new_element.question_grid_id = parent.id
130
+ when "Fe::ChoiceField"
131
+ new_element.choice_field_id = parent.id
105
132
  end
106
133
  new_element.save(:validate => false)
107
134
  Fe::PageElement.create(:element => new_element, :page => page) unless parent
@@ -124,14 +151,45 @@ module Fe
124
151
  end
125
152
 
126
153
  def reuseable?
127
- (self.is_a?(Question) || self.is_a?(Fe::QuestionGrid) || self.is_a?(Fe::QuestionGridWithTotal))
154
+ (self.is_a?(Fe::Question) || self.is_a?(Fe::QuestionGrid) || self.is_a?(Fe::QuestionGridWithTotal))
155
+ end
156
+
157
+ def conditional_match(answer_sheet)
158
+ displayed_response = display_response(answer_sheet)
159
+ return false unless displayed_response && conditional_answer
160
+ (displayed_response.split(',') & conditional_answer.split(',')).length > 0
128
161
  end
129
162
 
130
163
  def self.max_label_length
131
164
  @@max_label_length ||= Fe::Element.columns.find{ |c| c.name == "label" }.limit
132
165
  end
133
166
 
167
+ def set_conditional_element
168
+ case conditional_type
169
+ when "Fe::Element"
170
+ pages.reload.each do |page|
171
+ index = page.elements.index(self)
172
+ if index && index < page.elements.length - 1
173
+ self.conditional_id = page.elements[index+1].id
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ def update_any_previous_conditional_elements
180
+ pages.reload.each do |page|
181
+ index = page.elements.index(self)
182
+ if index && index > 0
183
+ prev_el = page.elements[index-1]
184
+ if prev_el.conditional_type == "Fe::Element"
185
+ prev_el.update_attribute(:conditional_id, id)
186
+ end
187
+ end
188
+ end
189
+ end
190
+
134
191
  protected
192
+
135
193
  def set_defaults
136
194
  if self.content.blank?
137
195
  case self.class.to_s
@@ -159,6 +217,5 @@ module Fe
159
217
  end
160
218
  end
161
219
  end
162
-
163
220
  end
164
- end
221
+ end
@@ -0,0 +1,7 @@
1
+ require 'validates_email_format_of'
2
+ class Fe::EmailAddress < ActiveRecord::Base
3
+ belongs_to :person
4
+ validates :email, :email_format => { :message => "doesn't look right." }
5
+
6
+ self.table_name = "email_addresses"
7
+ end
@@ -4,4 +4,4 @@ module Fe
4
4
 
5
5
  validates_presence_of :name
6
6
  end
7
- end
7
+ end
@@ -7,4 +7,4 @@ module Fe
7
7
  @value = value
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -7,4 +7,4 @@ module Fe
7
7
  @group = group
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -52,6 +52,10 @@ module Fe
52
52
  # false
53
53
  # end
54
54
 
55
+ def has_questions?
56
+ questions.present? || question_grids.present? || question_grid_with_totals.present?
57
+ end
58
+
55
59
  def questions_before_position(position)
56
60
  self.elements.where(["#{Fe::PageElement.table_name}.position < ?", position])
57
61
  end
@@ -62,7 +66,7 @@ module Fe
62
66
  end
63
67
 
64
68
  def copy_to(question_sheet)
65
- new_page = Fe::Page.new(self.attributes)
69
+ new_page = Fe::Page.new(self.attributes.merge(id: nil))
66
70
  new_page.question_sheet_id = question_sheet.id
67
71
  new_page.save(:validate => false)
68
72
  self.elements.each do |element|
@@ -75,7 +79,13 @@ module Fe
75
79
  end
76
80
 
77
81
  def complete?(answer_sheet)
78
- all_elements.all? {|e| !e.required?(answer_sheet) || e.has_response?(answer_sheet)}
82
+ return true if question_sheet.hidden_pages(answer_sheet).include?(self)
83
+ prev_el = nil
84
+ all_elements.all? {|e|
85
+ complete = !e.required? || (prev_el && prev_el.conditional == e && !prev_el.conditional_match(answer_sheet)) || e.has_response?(answer_sheet)
86
+ prev_el = e
87
+ complete
88
+ }
79
89
  end
80
90
 
81
91
  def started?(answer_sheet)
@@ -96,6 +106,5 @@ module Fe
96
106
  def self.untitled_labels(sheet)
97
107
  sheet ? sheet.pages.where("label like 'Page %'").map {|p| p.label} : []
98
108
  end
99
-
100
109
  end
101
- end
110
+ end
@@ -5,5 +5,17 @@ module Fe
5
5
  acts_as_list :scope => :page_id
6
6
  belongs_to :page
7
7
  belongs_to :element
8
+
9
+ after_save :save_element
10
+ before_create :set_position
11
+
12
+ def set_position
13
+ self.position ||= (page.page_elements.last.try(:position) + 1) || page.elements.last.try(:position) || 0
14
+ end
15
+
16
+ # need conditional callbacks run
17
+ def save_element
18
+ element.save!
19
+ end
8
20
  end
9
- end
21
+ end
@@ -12,4 +12,4 @@ module Fe
12
12
  end
13
13
 
14
14
  end
15
- end
15
+ end
@@ -7,4 +7,4 @@ module Fe
7
7
  class Paragraph < Element
8
8
  validates_presence_of :content, :on => :update
9
9
  end
10
- end
10
+ end
@@ -2,16 +2,21 @@ module Fe
2
2
  class Payment < ActiveRecord::Base
3
3
  self.table_name = self.table_name.sub('fe_', Fe.table_name_prefix)
4
4
 
5
- attr_accessor :first_name, :last_name, :address, :city, :state, :zip, :card_number, :payment_type,
5
+ attr_accessor :first_name, :last_name, :address, :city, :state, :zip, :card_number,
6
6
  :expiration_month, :expiration_year, :security_code, :staff_first, :staff_last, :card_type
7
7
 
8
+ belongs_to :application, class_name: Fe.answer_sheet_class
9
+
8
10
  scope :non_denied, -> { where("(status <> 'Denied' AND status <> 'Errored') OR status is null") }
9
11
 
10
- belongs_to :answer_sheet, class_name: Fe.answer_sheet_class
12
+ after_save :check_app_complete
13
+
14
+ validate :credit_card_validation
15
+ validate :staff_email_present_if_staff_payment
11
16
 
12
- after_save :check_answer_sheet_complete
17
+ def answer_sheet() application; end
13
18
 
14
- def validate
19
+ def credit_card_validation
15
20
  if credit?
16
21
  errors.add_on_empty([:first_name, :last_name, :address, :city, :state, :zip, :card_number,
17
22
  :expiration_month, :expiration_year, :security_code])
@@ -19,7 +24,26 @@ module Fe
19
24
  end
20
25
  end
21
26
 
22
- def check_answer_sheet_complete
27
+ # TODO move all staff methods to decorators as per instructions from Josh
28
+ def staff_email_present_if_staff_payment
29
+ if staff? && !payment_account_no.include?('/') # Don't try to validate chart fields
30
+ staff = Staff.find_by(accountNo: payment_account_no)
31
+ unless staff
32
+ errors.add(:base, "We couldn't find a staff member with that account number")
33
+ return false
34
+ end
35
+
36
+ unless staff.email.present?
37
+ errors.add(:base, "The staff member you've picked doesn't have an address on file for us to send the request to.")
38
+ end
39
+ end
40
+ end
41
+
42
+ def to_s
43
+ "#{payment_type}: #{amount} on #{created_at}"
44
+ end
45
+
46
+ def check_app_complete
23
47
  if self.approved?
24
48
  self.answer_sheet.complete
25
49
  end
@@ -39,14 +63,15 @@ module Fe
39
63
 
40
64
  def approve!
41
65
  self.status = 'Approved'
66
+ self.auth_code ||= card_number[-4..-1] if card_number.present?
42
67
  self.save!
43
68
  end
44
69
 
45
70
  def get_card_type
46
71
  card = ActiveMerchant::Billing::CreditCard.new(:number => card_number)
47
72
  card.valid?
48
- card.type
73
+ card.brand
49
74
  end
50
75
  end
51
76
 
52
- end
77
+ end
@@ -19,4 +19,4 @@ module Fe
19
19
  end
20
20
 
21
21
  end
22
- end
22
+ end
@@ -0,0 +1,33 @@
1
+ module Fe
2
+ class Person < ActiveRecord::Base
3
+ belongs_to :user, :foreign_key => "fk_ssmUserId" # TODO need to migrate person columns to be more rails-like
4
+ has_one :current_address, -> { where("address_type = 'current'") }, :class_name => "Fe::Address"
5
+ has_many :email_addresses, :foreign_key => "person_id", :class_name => '::EmailAddress', dependent: :destroy
6
+ has_many :phone_numbers, :foreign_key => "person_id", :class_name => '::PhoneNumber', dependent: :destroy
7
+ has_one :current_address, -> { where("address_type = 'current'") }, :foreign_key => "person_id", :class_name => '::Fe::Address'
8
+ has_one :permanent_address, -> { where("address_type = 'permanent'") }, :foreign_key => "person_id", :class_name => '::Fe::Address'
9
+ has_one :emergency_address1, -> { where("address_type = 'emergency1'") }, :foreign_key => "person_id", :class_name => 'Fe::Address'
10
+ has_many :addresses, :foreign_key => "person_id", dependent: :destroy
11
+ has_one :application, :foreign_key => "applicant_id"
12
+
13
+ def emergency_address
14
+ emergency_address1
15
+ end
16
+ def emergency_address=(address)
17
+ self.emergency_address1 = address
18
+ end
19
+
20
+ def create_emergency_address
21
+ Address.create(:person_id => self.id, :address_type => 'emergency1')
22
+ end
23
+
24
+ def create_current_address
25
+ Address.create(:person_id => self.id, :address_type => 'current')
26
+ end
27
+
28
+ def create_permanent_address
29
+ Address.create(:person_id => self.id, :address_type => 'permanent')
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,5 @@
1
+ class Fe::PhoneNumber < ActiveRecord::Base
2
+ belongs_to :person
3
+
4
+ self.table_name = "phone_numbers"
5
+ end
@@ -4,7 +4,8 @@ module Fe
4
4
  include ActionView::Helpers::TagHelper # link_to
5
5
  # include ActionView::Helpers::UrlHelper # url_for
6
6
  include ActionController::UrlFor # named routes
7
- include ActionController::RecordIdentifier # dom_id
7
+ #include ActionController::RecordIdentifier # dom_id
8
+ include ActionView::RecordIdentifier
8
9
  include Rails.application.routes.url_helpers
9
10
  attr_accessor :controller # so we can be lazy
10
11
 
@@ -20,4 +21,4 @@ module Fe
20
21
  @controller.env
21
22
  end
22
23
  end
23
- end
24
+ end
@@ -10,7 +10,7 @@
10
10
 
11
11
  module Fe
12
12
  class Question < Element
13
- include ActionController::RecordIdentifier # dom_id
13
+ include ActionView::RecordIdentifier # dom_id
14
14
  has_many :conditions,
15
15
  :class_name => "Condition",
16
16
  :foreign_key => "toggle_id",
@@ -79,7 +79,7 @@ module Fe
79
79
  end
80
80
 
81
81
  def locked?(params, answer_sheet, presenter)
82
- return true unless params['controller'] == 'answer_pages' && params['action'] == 'edit'
82
+ return true unless ['fe/answer_pages', 'fe/reference_sheets'].include?(params['controller']) && params['action'] == 'edit'
83
83
  if self.object_name == 'person.current_address' && ['address1','address2','city','zip','email','state','country'].include?(self.attribute_name)
84
84
  # Billing Address
85
85
  return false
@@ -140,7 +140,7 @@ module Fe
140
140
 
141
141
  # try to find answer from external object
142
142
  if !object_name.blank? and !attribute_name.blank?
143
- obj = object_name == 'answer_sheet' ? answer_sheet : eval("answer_sheet." + object_name)
143
+ obj = %w(answer_sheet application reference).include?(object_name) ? answer_sheet : eval("answer_sheet." + object_name)
144
144
  if obj.nil? or eval("obj." + attribute_name + ".nil?")
145
145
  []
146
146
  else
@@ -148,7 +148,7 @@ module Fe
148
148
  end
149
149
  else
150
150
  #answer_sheet.answers_by_question[id] || []
151
- Fe::Answer.where(:answer_sheet_id => answer_sheet.id, :question_id => self.id)
151
+ Fe::Answer.where(:answer_sheet_id => answer_sheet.id, :question_id => self.id).to_a
152
152
  end
153
153
  end
154
154
 
@@ -157,7 +157,7 @@ module Fe
157
157
  values = Array.wrap(values)
158
158
  if !object_name.blank? and !attribute_name.blank?
159
159
  # if eval("answer_sheet." + object_name).present?
160
- object = object_name == 'answer_sheet' ? answer_sheet : eval("answer_sheet." + object_name)
160
+ object = %w(answer_sheet application).include?(object_name) ? answer_sheet : eval("answer_sheet." + object_name)
161
161
  unless object.present?
162
162
  if object_name.include?('.')
163
163
  objects = object_name.split('.')
@@ -249,8 +249,8 @@ module Fe
249
249
  end
250
250
 
251
251
  def required?(answer_sheet = nil)
252
- super || (answer_sheet && choice_field && choice_field.has_answer?('1', answer_sheet))
252
+ super
253
253
  end
254
254
 
255
255
  end
256
- end
256
+ end