fe 0.0.3 → 0.0.4

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 (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