From 290dbfa48b462d5557ced7c9b9548014224258d3 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Thu, 25 Jun 2020 08:46:11 +0200 Subject: [PATCH] Upstream sync --- .../public/medical_releases_controller.rb | 57 +++- app/models/medical_release.rb | 14 +- app/views/contract_templates/_form.html.erb | 4 +- .../acquired_media_releases/new.html.erb | 16 +- .../public/location_releases/new.html.erb | 22 +- .../public/material_releases/new.html.erb | 16 +- .../public/medical_releases/new.html.erb | 102 +++++++ config/locales/en.yml | 59 +++- config/locales/es.yml | 81 +++++- ...dd_guardians_fields_to_medical_releases.rb | 25 ++ db/structure.sql | 26 +- spec/factories/projects.rb | 1 + .../user_manages_contract_templates_spec.rb | 12 + ...r_managing_acquired_media_releases_spec.rb | 55 ++++ .../user_managing_location_releases_spec.rb | 62 ++++- .../user_managing_material_releases_spec.rb | 124 ++++++++- .../user_managing_medical_releases_spec.rb | 254 ++++++++++++++++++ 17 files changed, 855 insertions(+), 75 deletions(-) create mode 100644 db/migrate/20200622180507_add_guardians_fields_to_medical_releases.rb diff --git a/app/controllers/public/medical_releases_controller.rb b/app/controllers/public/medical_releases_controller.rb index 097a607..084298c 100644 --- a/app/controllers/public/medical_releases_controller.rb +++ b/app/controllers/public/medical_releases_controller.rb @@ -45,6 +45,9 @@ class Public::MedicalReleasesController < Public::BaseController .require(:medical_release) .permit( person_params, + guardian_params, + second_guardian_params, + :minor, :signature_base64, :locale, :contract_template, @@ -60,17 +63,49 @@ class Public::MedicalReleasesController < Public::BaseController end def person_params - [ - :person_first_name, - :person_last_name, - :person_phone, - :person_email, - :person_address_street1, - :person_address_street2, - :person_address_city, - :person_address_state, - :person_address_zip, - :person_address_country, + %i[ + person_first_name + person_last_name + person_phone + person_email + person_address_street1 + person_address_street2 + person_address_city + person_address_state + person_address_zip + person_address_country + ] + end + + def guardian_params + %i[ + guardian_first_name + guardian_last_name + guardian_phone + guardian_email + guardian_photo + guardian_address_street1 + guardian_address_street2 + guardian_address_city + guardian_address_state + guardian_address_zip + guardian_address_country + ] + end + + def second_guardian_params + %i[ + guardian_2_first_name + guardian_2_last_name + guardian_2_phone + guardian_2_email + guardian_2_photo + guardian_2_address_street1 + guardian_2_address_street2 + guardian_2_address_city + guardian_2_address_state + guardian_2_address_zip + guardian_2_address_country ] end diff --git a/app/models/medical_release.rb b/app/models/medical_release.rb index 4967ef9..62f08b9 100644 --- a/app/models/medical_release.rb +++ b/app/models/medical_release.rb @@ -7,6 +7,10 @@ class MedicalRelease < ApplicationRecord include Signable include Syncable include PersonName + include GuardianPhotoable + include SecondGuardianPhotoable + include GuardianName + include SecondGuardianName NUMBER_OF_CUSTOM_FIELDS = 15 @@ -31,6 +35,12 @@ class MedicalRelease < ApplicationRecord acts_as_taggable_on :internal_tags, :tags + # These validations apply to releases being signed by a minor + with_options if: :minor? do + validates :guardian_email, email: true, allow_blank: true + validates :guardian_2_email, email: true, allow_blank: true + end + # These validations apply to releases created natively by the system (i.e. not imported from elsewhere) with_options on: :native do validates :signature, attached: true @@ -63,10 +73,6 @@ class MedicalRelease < ApplicationRecord false end - def minor? - false - end - def contract_file_name "#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}" end diff --git a/app/views/contract_templates/_form.html.erb b/app/views/contract_templates/_form.html.erb index 18bdc7e..821fddf 100644 --- a/app/views/contract_templates/_form.html.erb +++ b/app/views/contract_templates/_form.html.erb @@ -2,10 +2,10 @@ <%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
<%= form.text_field :name, wrapper_class: "col-sm-6" %> - <%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(appearance talent misc), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical) } }, class: "form-control custom-select" %> + <%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(appearance talent misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical) } }, class: "form-control custom-select" %>
- <%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", help: "Leave at $0.00 for no-fee", wrapper_class: "col-sm-6" %> + <%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", wrapper_class: "col-sm-6" %>
<% end %> diff --git a/app/views/public/acquired_media_releases/new.html.erb b/app/views/public/acquired_media_releases/new.html.erb index a61ddea..0f034f1 100644 --- a/app/views/public/acquired_media_releases/new.html.erb +++ b/app/views/public/acquired_media_releases/new.html.erb @@ -18,7 +18,7 @@ <%= form.text_field :name, required: true, wrapper_class: "col-12" %>
- <%= form.text_area :description, wrapper_class: "col-12" %> + <%= form.text_area :description, required: true, wrapper_class: "col-12" %>
<%= form.form_group :categories, label: { text: "Licensed property type" } do %> <% AcquiredMediaRelease::CATEGORIES.each do |category| %> @@ -31,14 +31,14 @@ <%= card_field_set_tag t(".personal_info.heading") do %>
- <%= form.text_field :person_first_name, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_last_name, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_title, wrapper_class: "col-sm-6" %> - <%= form.phone_field :person_phone, wrapper_class: "col-sm-6", label: 'Phone' %> - <%= form.email_field :person_email, wrapper_class: "col-sm-6", label: 'Email' %> - <%= form.text_field :person_fax, wrapper_class: "col-sm-6", label: 'Fax' %> + <%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_title, required: true, wrapper_class: "col-sm-6" %> + <%= form.phone_field :person_phone, required: true, wrapper_class: "col-sm-6", label: 'Phone' %> + <%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6", label: 'Email' %> + <%= form.text_field :person_fax, required: true, wrapper_class: "col-sm-6", label: 'Fax' %>
- <%= render "shared/address_fields", form: form, subject: "person" %> + <%= render "shared/address_fields", form: form, required: true, subject: "person" %> <% end %>
diff --git a/app/views/public/location_releases/new.html.erb b/app/views/public/location_releases/new.html.erb index b93ffa0..c688ecc 100644 --- a/app/views/public/location_releases/new.html.erb +++ b/app/views/public/location_releases/new.html.erb @@ -17,21 +17,21 @@
<%= form.text_field :name, required: true, wrapper_class: "col-12" %>
- <%= render "shared/address_fields", form: form, subject: "" %> + <%= render "shared/address_fields", form: form, required: true, subject: "" %> <% end %>
<%= card_field_set_tag t(".contact_info.heading") do %>
- <%= form.text_field :person_first_name, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_last_name, wrapper_class: "col-sm-6" %> - <%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %> - <%= form.email_field :person_email, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_company, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_title, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.phone_field :person_phone, required: true, wrapper_class: "col-sm-6" %> + <%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_company, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_title, required: true, wrapper_class: "col-sm-6" %>
- <%= render "shared/address_fields", form: form, subject: "person" %> + <%= render "shared/address_fields", form: form, required: true, subject: "person" %> <% end %>
@@ -39,9 +39,9 @@ <%= card_field_set_tag t(".filming_info.heading") do %>
- <%= form.text_field :filming_started_on, wrapper_class: "col-sm-6", class: "datepicker-control", readonly: true %> - <%= form.text_field :filming_ended_on, wrapper_class: "col-sm-6", class: "datepicker-control", readonly: true %> - <%= form.text_field :filming_hours, wrapper_class: "col-sm-12" %> + <%= form.text_field :filming_started_on, required: true, wrapper_class: "col-sm-6", class: "datepicker-control", readonly: true %> + <%= form.text_field :filming_ended_on, required: true, wrapper_class: "col-sm-6", class: "datepicker-control", readonly: true %> + <%= form.text_field :filming_hours, required: true, wrapper_class: "col-sm-12" %>
<% end %> diff --git a/app/views/public/material_releases/new.html.erb b/app/views/public/material_releases/new.html.erb index bfd565f..565ac57 100644 --- a/app/views/public/material_releases/new.html.erb +++ b/app/views/public/material_releases/new.html.erb @@ -18,20 +18,20 @@ <%= form.text_field :name, required: true, wrapper_class: "col-12" %>
- <%= form.text_area :description, placeholder: true, wrapper_class: "col-sm-12", rows: 6 %> + <%= form.text_area :description, required: true, placeholder: true, wrapper_class: "col-sm-12", rows: 6 %>
<% end %> <%= card_field_set_tag t(".contact_info.heading") do %>
- <%= form.text_field :person_first_name, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_last_name, wrapper_class: "col-sm-6" %> - <%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %> - <%= form.email_field :person_email, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_company, wrapper_class: "col-sm-6" %> - <%= form.text_field :person_title, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %> + <%= form.phone_field :person_phone, required: true, wrapper_class: "col-sm-6" %> + <%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_company, required: true, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_title, required: true, wrapper_class: "col-sm-6" %>
- <%= render "shared/address_fields", form: form, subject: "person" %> + <%= render "shared/address_fields", form: form, subject: "person", required: true %> <% end %> <%= card_field_set_tag t(".photo.heading") do %> diff --git a/app/views/public/medical_releases/new.html.erb b/app/views/public/medical_releases/new.html.erb index bebb04b..7f4dd2f 100644 --- a/app/views/public/medical_releases/new.html.erb +++ b/app/views/public/medical_releases/new.html.erb @@ -13,6 +13,17 @@ <% end %>
+ + <% unless @contract_template.guardian_clause.blank? %> + <%= form.form_group :minor do %> + <%= form.check_box :minor, label: t("helpers.label.medical_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %> + <% end %> + + <%= card_field_set_tag t(".guardian_clause.heading") do %> +

<%= @contract_template.guardian_clause %>

+ <% end %> +
+ <% end %> <% if (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).map {|n| @contract_template.public_send("question_#{n}_text").presence }.compact.any? %> <%= card_field_set_tag t(".questionnaire.heading") do %> @@ -44,6 +55,97 @@ <%= render "shared/photos_dropzone_fields", form: form, release: @medical_release %> <% end %> + <% unless @contract_template.guardian_clause.blank? %> +
!@medical_release.minor?) %>" data-ujs-target="guardian-fields"> + <%= card_field_set_tag t(".guardian_info.heading") do %> +
+ <%= form.text_field :guardian_first_name, required: @medical_release.minor?, wrapper_class: "col-sm-3" %> + <%= form.text_field :guardian_last_name, required: @medical_release.minor?, wrapper_class: "col-sm-3" %> + <%= form.phone_field :guardian_phone, required: @medical_release.minor?, wrapper_class: "col-sm-6" %> +
+
+ <%= form.text_field :guardian_email, required: @medical_release.minor?, wrapper_class: "col-sm-6" %> +
+ <%= render "shared/address_fields", form: form, subject: "guardian", required: @medical_release.minor? %> + <% end %> + +
+ + <%= card_field_set_tag t(".guardian_photo.heading") do %> +
<%= t ".guardian_photo.instructions" %>
+
+
+
+ <%= t ".photo.no_photo" %> +
+
+
+ <% if @medical_release.guardian_photo.attached? %> + <%= javascript_tag nonce: true do %> + App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@medical_release.guardian_photo.variant(auto_orient: true, resize: '200x200')) %>"); + <% end %> + <% end %> +
+ <%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if @medical_release.guardian_photo.attached? %> + <%= form.file_field :guardian_photo, required: @medical_release.minor?, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @medical_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %> +
+ <%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-photo" } %> +
+

+ <%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %>
+ <%= t ".photo.warning" %> +

+
+ <% end %> + +
+ + <%= card_field_set_tag t(".guardian_2_info.heading") do %> +
+ <%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %> + <%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %> + <%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %> +
+
+ <%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %> +
+ <%= render "shared/address_fields", form: form, subject: "guardian_2" %> + <% end %> + +
+ + <%= card_field_set_tag t(".guardian_2_photo.heading") do %> +
<%= t ".guardian_2_photo.instructions" %>
+
+
+
+ <%= t ".photo.no_photo" %> +
+
+
+ <% if @medical_release.guardian_2_photo.attached? %> + <%= javascript_tag nonce: true do %> + App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@medical_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>"); + <% end %> + <% end %> +
+ <%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if @medical_release.guardian_2_photo.attached? %> + <%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, accept: @medical_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %> +
+ <%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-2-photo" } %> +
+

+ <%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %>
+ <%= t ".photo.warning" %> +

+
+ <% end %> + +
+ +
+ <% end %> + <%= card_field_set_tag t(".signature.heading") do %> <%= render "shared/signature_fields", form: form %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 13104a0..22f5b35 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -309,6 +309,9 @@ en: notice: The release has been updated helpers: help: + contract_template: + fee: Leave at $0.00 for no-fee + guardian_clause: Leave blank if not required for this contract video: audio_only_edl_file: If you do not upload an Audio Only EDL, the software will not generate a BiG Music Cue Sheet. edl_file: Please follow our directions on exporting the All Tracks EDL. Failure to do so could result in inaccurate and incomplete reporting. @@ -397,6 +400,40 @@ en: person_name: Name person_phone: Phone number person_title: Title + medical_release: + guardian_2_address_city: Guardian 2 city + guardian_2_address_country: Guardian 2 country + guardian_2_address_state: Guardian 2 state + guardian_2_address_street1: Guardian 2 address + guardian_2_address_street2: Guardian 2 address (Line 2) + guardian_2_address_zip: Guardian 2 zip code + guardian_2_email: Guardian 2 email + guardian_2_first_name: Guardian 2 first name + guardian_2_last_name: Guardian 2 last name + guardian_2_phone: Guardian 2 phone + guardian_address_city: Guardian city + guardian_address_country: Guardian country + guardian_address_state: Guardian state + guardian_address_street1: Guardian address + guardian_address_street2: Guardian address (Line 2) + guardian_address_zip: Guardian zip code + guardian_email: Guardian email + guardian_first_name: Guardian first name + guardian_last_name: Guardian last name + guardian_phone: Guardian phone + minor: Is the person a minor? + person_address_city: City + person_address_country: Country + person_address_state: State + person_address_street1: Address + person_address_street2: Address (Line 2) + person_address_zip: Zip code + person_date_of_birth: Date of birth + person_email: Email address + person_first_name: First name + person_last_name: Last name + person_name: Name + person_phone: Phone number music_release: person_address: Address person_address_city: City @@ -664,7 +701,7 @@ en: destroy: alert: The misc release has been deleted index: - actions: + actions: search: Search empty: Misc Releases will appear here table_headers: @@ -902,6 +939,20 @@ en: notice: Your release has been signed. Thank you! new: cancel: Cancel + guardian_2_info: + heading: Second Guardian Information (if company requires) + guardian_2_photo: + heading: Second Guardian Photo + instructions: > + Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! + guardian_clause: + heading: Guardian Clause + guardian_info: + heading: Guardian Information + guardian_photo: + heading: Guardian Photo + instructions: > + Lastly, it's time for guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! instructions_html: > Below is the medical release form. After scrolling down and reading the medical release form, please enter your personal information, take a photo, and press the "Submit Release" button. legal: @@ -910,13 +961,17 @@ en: heading: Personal Information instructions: Now, enter your personal information. photo: + camera_instructions_html: Click Take Photo to Turn ON Camera heading: Photos + no_photo: No photo yet + take_photo: Take Photo + warning: If your photo appears sideways, it will be autocorrected when you submit your release. questionnaire: heading: Questionnaire signature: heading: Signature misc_releases: - create: + create: notice: Your release has been signed. Thank you! new: cancel: Cancel diff --git a/config/locales/es.yml b/config/locales/es.yml index 6ce2858..b2087b9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -114,18 +114,22 @@ es: errors_helper: failure_message: "Los siguientes errores han impedido que se presente este %{model_name}:" helpers: + help: + contract_template: + fee: Leave at $0.00 for no-fee (ES) + guardian_clause: Leave blank if not required for this contract (ES) label: appearance_release: - guardian_2_address_city: Second guardian city (ES) - guardian_2_address_country: Second guardian country (ES) - guardian_2_address_state: Second guardian state (ES) - guardian_2_address_street1: Second guardian address (ES) - guardian_2_address_street2: Second guardian address (Line 2) (ES) - guardian_2_address_zip: Second guardian zip code (ES) - guardian_2_email: Second guardian email (ES) - guardian_2_first_name: Second guardian first name (ES) - guardian_2_last_name: Second guardian last name (ES) - guardian_2_phone: Second guardian phone (ES) + guardian_2_address_city: Guardian 2 city (ES) + guardian_2_address_country: Guardian 2 country (ES) + guardian_2_address_state: Guardian 2 state (ES) + guardian_2_address_street1: Guardian 2 address (ES) + guardian_2_address_street2: Guardian 2 address (Line 2) (ES) + guardian_2_address_zip: Guardian 2 zip code (ES) + guardian_2_email: Guardian 2 email (ES) + guardian_2_first_name: Guardian 2 first name (ES) + guardian_2_last_name: Guardian 2 last name (ES) + guardian_2_phone: Guardian 2 phone (ES) guardian_address_city: Guardian city (ES) guardian_address_country: Guardian country (ES) guardian_address_state: Guardian state (ES) @@ -143,6 +147,40 @@ es: person_email: Dirección de correo electrónico person_name: Nómbre person_phone: Número de teléfono + medical_release: + guardian_2_address_city: Guardian 2 city (ES) + guardian_2_address_country: Guardian 2 country (ES) + guardian_2_address_state: Guardian 2 state (ES) + guardian_2_address_street1: Guardian 2 address (ES) + guardian_2_address_street2: Guardian 2 address (Line 2) (ES) + guardian_2_address_zip: Guardian 2 zip code (ES) + guardian_2_email: Guardian 2 email (ES) + guardian_2_first_name: "" + guardian_2_last_name: "" + guardian_2_phone: "" + guardian_address_city: Guardian City (ES) + guardian_address_country: Guardian country (ES) + guardian_address_state: Guardian State (ES) + guardian_address_street1: Guardian address (ES) + guardian_address_street2: Guardian address (line 2) (ES) + guardian_address_zip: Guardian ZIP (ES) + guardian_email: Guardian email (ES) + guardian_first_name: Guardian First name (ES) + guardian_last_name: Guardian Last name (ES) + guardian_phone: Guardian Phone (ES) + minor: El firmante es un menor + person_address_city: Person City (ES) + person_address_country: Country (ES) + person_address_state: Person State (ES) + person_address_street1: Person Address (ES) + person_address_street2: Person Address (line 2) (ES) + person_address_zip: Person ZIP (ES) + person_date_of_birth: Date of birth (ES) + person_email: Email address (ES) + person_first_name: First name (ES) + person_last_name: Last name (ES) + person_name: Name (ES) + person_phone: Phone number (ES) project: client_name: Nómbre del cliente del proyecto description: Descripción del proyecto @@ -179,7 +217,7 @@ es: new: cancel: Cancelar guardian_2_info: - heading: Second Guardian Information (ES) + heading: Second Guardian Information (if company requires) (ES) guardian_2_photo: heading: Second Guardian Photo (ES) instructions: > @@ -214,6 +252,27 @@ es: new: photo: heading: Photos (ES) + medical_releases: + new: + guardian_2_info: + heading: Second Guardian Information (if company requires) (ES) + guardian_2_photo: + heading: Second Guardian Photo (ES) + instructions: > + (ES) Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! (ES) + guardian_clause: + heading: Guardian Clause (ES) + guardian_info: + heading: Gurdian Information (ES) + guardian_photo: + heading: Guardian Photo (ES) + instructions: > + (ES) Lastly, it's time for guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! (ES) + photo: + camera_instructions_html: Haga clic en Take Photo para encender la cámara + no_photo: No hay foto todavía + take_photo: Take Photo (ES) + warning: Si su foto aparece de lado, se corregirá automáticamente cuando actualizar la autorización talent_releases: new: guardian_clause: diff --git a/db/migrate/20200622180507_add_guardians_fields_to_medical_releases.rb b/db/migrate/20200622180507_add_guardians_fields_to_medical_releases.rb new file mode 100644 index 0000000..a4d3314 --- /dev/null +++ b/db/migrate/20200622180507_add_guardians_fields_to_medical_releases.rb @@ -0,0 +1,25 @@ +class AddGuardiansFieldsToMedicalReleases < ActiveRecord::Migration[6.0] + def change + add_column :medical_releases, :minor, :boolean, default: false + add_column :medical_releases, :guardian_first_name, :string + add_column :medical_releases, :guardian_last_name, :string + add_column :medical_releases, :guardian_email, :string + add_column :medical_releases, :guardian_phone, :string + add_column :medical_releases, :guardian_address_street1, :string + add_column :medical_releases, :guardian_address_street2, :string + add_column :medical_releases, :guardian_address_city, :string + add_column :medical_releases, :guardian_address_state, :string + add_column :medical_releases, :guardian_address_zip, :string + add_column :medical_releases, :guardian_address_country, :string + add_column :medical_releases, :guardian_2_first_name, :string + add_column :medical_releases, :guardian_2_last_name, :string + add_column :medical_releases, :guardian_2_email, :string + add_column :medical_releases, :guardian_2_phone, :string + add_column :medical_releases, :guardian_2_address_street1, :string + add_column :medical_releases, :guardian_2_address_street2, :string + add_column :medical_releases, :guardian_2_address_city, :string + add_column :medical_releases, :guardian_2_address_state, :string + add_column :medical_releases, :guardian_2_address_zip, :string + add_column :medical_releases, :guardian_2_address_country, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index 051cc35..0a9c5d0 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1024,7 +1024,28 @@ CREATE TABLE public.medical_releases ( question_12_answer text, question_13_answer text, question_14_answer text, - question_15_answer text + question_15_answer text, + minor boolean DEFAULT false, + guardian_first_name character varying, + guardian_last_name character varying, + guardian_email character varying, + guardian_phone character varying, + guardian_address_street1 character varying, + guardian_address_street2 character varying, + guardian_address_city character varying, + guardian_address_state character varying, + guardian_address_zip character varying, + guardian_address_country character varying, + guardian_2_first_name character varying, + guardian_2_last_name character varying, + guardian_2_email character varying, + guardian_2_phone character varying, + guardian_2_address_street1 character varying, + guardian_2_address_street2 character varying, + guardian_2_address_city character varying, + guardian_2_address_state character varying, + guardian_2_address_zip character varying, + guardian_2_address_country character varying ); @@ -3790,6 +3811,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20200616124214'), ('20200619081446'), ('20200619085823'), -('20200619134853'); +('20200619134853'), +('20200622180507'); diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index c720785..dcbe930 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -16,6 +16,7 @@ FactoryBot.define do appearance_release: true, location_release: true, material_release: true, + medical_release: true, music_release: true, talent_release: true, video_analysis: true, diff --git a/spec/features/user_manages_contract_templates_spec.rb b/spec/features/user_manages_contract_templates_spec.rb index a81b0a4..094c8bd 100644 --- a/spec/features/user_manages_contract_templates_spec.rb +++ b/spec/features/user_manages_contract_templates_spec.rb @@ -28,6 +28,18 @@ RSpec.feature 'User manages contract templates', type: :feature do expect(page).to have_content('The release template has been created') end + scenario 'medical release template has a guardian clause field' do + visit new_project_contract_template_path(project) + + fill_in 'Name', with: 'My Release Template' + select 'Medical Release', from: 'Release type' + fill_hidden guardian_clause_field, with: 'Guardian clause text' + click_on 'Create Release Template' + + expect(page).to have_content('The release template has been created') + expect(ContractTemplate.last.guardian_clause.body.to_s).to match /Guardian clause text/ + end + scenario 'preview new talent release template without guardian clause' do visit new_project_contract_template_path(project) select 'Talent Release', from: 'Release type' diff --git a/spec/features/user_managing_acquired_media_releases_spec.rb b/spec/features/user_managing_acquired_media_releases_spec.rb index 6018c3a..267b955 100644 --- a/spec/features/user_managing_acquired_media_releases_spec.rb +++ b/spec/features/user_managing_acquired_media_releases_spec.rb @@ -20,6 +20,17 @@ feature "User managing acquired_media releases" do by "filling out the form" do fill_in acquired_media_name_field, with: "Jane Doe" acquired_media_category_fields + fill_in acquried_media_description_field, with: "Description" + fill_in acquried_media_owner_first_name, with: "Jane" + fill_in acquried_media_owner_last_name, with: "Doe" + fill_in acquired_media_person_title, with: "Ms." + fill_in acquired_media_person_phone, with: "555-5555-5555" + fill_in acquired_media_person_email, with: "person@example.com" + fill_in acquired_media_person_fax, with: "FAX" + fill_in acquired_media_person_address_street_1, with: "Street 1" + fill_in acquired_media_person_address_city, with: "City" + fill_in acquired_media_person_address_state, with: "State" + fill_in acquired_media_release_person_address_zip, with: "ZIP" draw_signature file_fixture("signature.png"), "acquired_media_release_signature_base64" end @@ -220,6 +231,50 @@ feature "User managing acquired_media releases" do "acquired_media_release[name]" end + def acquried_media_description_field + "acquired_media_release[description]" + end + + def acquried_media_owner_first_name + "acquired_media_release[person_first_name]" + end + + def acquried_media_owner_last_name + "acquired_media_release[person_last_name]" + end + + def acquired_media_person_title + "acquired_media_release[person_title]" + end + + def acquired_media_person_phone + "acquired_media_release[person_phone]" + end + + def acquired_media_person_email + "acquired_media_release[person_email]" + end + + def acquired_media_person_fax + "acquired_media_release[person_fax]" + end + + def acquired_media_person_address_street_1 + "acquired_media_release[person_address_street1]" + end + + def acquired_media_person_address_city + "acquired_media_release[person_address_city]" + end + + def acquired_media_person_address_state + "acquired_media_release[person_address_state]" + end + + def acquired_media_release_person_address_zip + "acquired_media_release[person_address_zip]" + end + def acquired_media_category_fields find(:css, "#acquired_media_release_categories_video_footage").set(true) find(:css, "#acquired_media_release_categories_still_photograph").set(true) diff --git a/spec/features/user_managing_location_releases_spec.rb b/spec/features/user_managing_location_releases_spec.rb index 0f72f5a..d10bb8e 100644 --- a/spec/features/user_managing_location_releases_spec.rb +++ b/spec/features/user_managing_location_releases_spec.rb @@ -19,11 +19,20 @@ feature "User managing location releases" do by "filling out the form" do fill_in location_name_field, with: "Benny's Burritos" + fill_in location_address_street_1, with: "Location's street address" + fill_in location_address_city, with: "Location's city" + fill_in location_address_state, with: "Location's state" + fill_in location_address_zip, with: "Location's zip" fill_in person_first_name_field, with: "Jane" fill_in person_last_name_field, with: "Doe" fill_in person_phone_field, with: "555-555-5555" fill_in person_email_field, with: "jane.doe@test.com" + fill_in person_company_field, with: "BIG" + fill_in person_title_field, with: "Ms." fill_in person_address_street1_field, with: "100 Broadway" + fill_in person_address_city, with: "Person's City" + fill_in person_address_state, with: "Person's State" + fill_in person_address_zip, with: "Person's Zip" fill_in filming_hours_field, with: "04:00 - 22:00" draw_signature file_fixture("signature.png"), "location_release_signature_base64" end @@ -39,11 +48,20 @@ feature "User managing location releases" do visit new_account_project_contract_template_location_release_path(project.account, project, contract_template) fill_in location_name_field, with: "Benny's Burritos" + fill_in location_address_street_1, with: "Location's street address" + fill_in location_address_city, with: "Location's city" + fill_in location_address_state, with: "Location's state" + fill_in location_address_zip, with: "Location's zip" fill_in person_first_name_field, with: "Jane" fill_in person_last_name_field, with: "Doe" fill_in person_phone_field, with: "555-555-5555" fill_in person_email_field, with: "jane.doe@test.com" + fill_in person_company_field, with: "BIG" + fill_in person_title_field, with: "Ms." fill_in person_address_street1_field, with: "100 Broadway" + fill_in person_address_city, with: "Person's City" + fill_in person_address_state, with: "Person's State" + fill_in person_address_zip, with: "Person's Zip" fill_in filming_hours_field, with: "04:00 - 22:00" draw_signature file_fixture("signature.png"), "location_release_signature_base64" @@ -235,6 +253,22 @@ feature "User managing location releases" do "location_release[name]" end + def location_address_street_1 + "location_release[address_street1]" + end + + def location_address_city + "location_release[address_city]" + end + + def location_address_state + "location_release[address_state]" + end + + def location_address_zip + "location_release[address_zip]" + end + def contract_field "location_release[contract]" end @@ -247,18 +281,38 @@ feature "User managing location releases" do "location_release[person_last_name]" end - def person_email_field - "location_release[person_email]" - end - def person_address_street1_field "location_release[person_address_street1]" end + def person_address_city + "location_release[person_address_city]" + end + + def person_address_state + "location_release[person_address_state]" + end + + def person_address_zip + "location_release[person_address_zip]" + end + def person_phone_field "location_release[person_phone]" end + def person_email_field + "location_release[person_email]" + end + + def person_company_field + "location_release[person_company]" + end + + def person_title_field + "location_release[person_title]" + end + def filming_hours_field "location_release[filming_hours]" end diff --git a/spec/features/user_managing_material_releases_spec.rb b/spec/features/user_managing_material_releases_spec.rb index a58a9eb..1f966b2 100644 --- a/spec/features/user_managing_material_releases_spec.rb +++ b/spec/features/user_managing_material_releases_spec.rb @@ -17,16 +17,12 @@ feature "User managing material releases" do visit new_account_project_contract_template_material_release_path(project.account, project, contract_template) - by "filling out the form" do - fill_in material_name_field, with: "Pepsi Logo" - fill_in person_first_name_field, with: "Jane" - fill_in person_last_name_field, with: "Doe" - draw_signature file_fixture("signature.png"), "material_release_signature_base64" - end + fill_all_fields + draw_signature file_fixture("signature.png"), "material_release_signature_base64" click_button submit_release_button - expect(page).to have_content("Your release was successfully submitted. Thank you.") + expect(page).to have_content success_submit_message end scenario "creating a release with photos", js: true do @@ -34,17 +30,60 @@ feature "User managing material releases" do visit new_account_project_contract_template_material_release_path(project.account, project, contract_template) - fill_in material_name_field, with: "Pepsi Logo" - fill_in person_first_name_field, with: "Jane" - fill_in person_last_name_field, with: "Doe" + fill_all_fields draw_signature file_fixture("signature.png"), "material_release_signature_base64" - drop_file Rails.root.join(file_fixture("material_photo.png")), type: :dropzone + click_button submit_release_button - expect(page).to have_content("Your release was successfully submitted. Thank you.") + expect(page).to have_content success_submit_message expect(MaterialRelease.last.photos.attached?).to eq true end + + scenario "creating release is possible only after filling all fields", js: true do + contract_template = create(:contract_template, project: project) + + visit new_account_project_contract_template_material_release_path(project.account, project, contract_template) + + fill_in material_name_field, with: "Pepsi Logo" + expect_failed_client_side_validation + + fill_in material_description_field, with: "Description text" + expect_failed_client_side_validation + + fill_in person_first_name_field, with: "Jane" + expect_failed_client_side_validation + + fill_in person_last_name_field, with: "Doe" + expect_failed_client_side_validation + + fill_in person_phone_field, with: "2229929229" + expect_failed_client_side_validation + + fill_in person_email_field, with: "mail@mail.com" + expect_failed_client_side_validation + + fill_in person_company_field, with: "Company" + expect_failed_client_side_validation + + fill_in person_title_field, with: "Mr." + expect_failed_client_side_validation + + fill_in person_address_street1_field, with: "Street 1 address" + expect_failed_client_side_validation + + fill_in person_city_field, with: "City" + expect_failed_client_side_validation + + fill_in person_state_field, with: "State" + expect_failed_client_side_validation + + fill_in person_zip_field, with: "ZIP" + draw_signature file_fixture("signature.png"), "material_release_signature_base64" + + click_button submit_release_button + expect(page).to have_content success_submit_message + end end context "when signed in" do @@ -216,6 +255,10 @@ feature "User managing material releases" do "material_release[name]" end + def material_description_field + "material_release[description]" + end + def person_first_name_field "material_release[person_first_name]" end @@ -224,6 +267,38 @@ feature "User managing material releases" do "material_release[person_last_name]" end + def person_phone_field + "material_release[person_phone]" + end + + def person_email_field + "material_release[person_email]" + end + + def person_company_field + "material_release[person_company]" + end + + def person_title_field + "material_release[person_title]" + end + + def person_address_street1_field + "material_release[person_address_street1]" + end + + def person_city_field + "material_release[person_address_city]" + end + + def person_state_field + "material_release[person_address_state]" + end + + def person_zip_field + "material_release[person_address_zip]" + end + def have_photo(filename) have_selector("img[src*='#{filename}']") end @@ -282,4 +357,29 @@ feature "User managing material releases" do select "Other", from: "Restriction" fill_in "Describe other restrictions", with: "Test" end + + def fill_all_fields + fill_in material_name_field, with: "Pepsi Logo" + fill_in material_description_field, with: "Description text" + fill_in person_first_name_field, with: "Jane" + fill_in person_last_name_field, with: "Doe" + fill_in person_phone_field, with: "2229929229" + fill_in person_email_field, with: "mail@mail.com" + fill_in person_company_field, with: "Company" + fill_in person_title_field, with: "Mr." + fill_in person_address_street1_field, with: "Street 1 address" + fill_in person_city_field, with: "City" + fill_in person_state_field, with: "State" + fill_in person_zip_field, with: "ZIP" + end + + def success_submit_message + 'Your release was successfully submitted. Thank you.' + end + + def expect_failed_client_side_validation + draw_signature file_fixture("signature.png"), "material_release_signature_base64" + click_button submit_release_button + expect(page).not_to have_content success_submit_message + end end diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb index a42a1d6..59510fb 100644 --- a/spec/features/user_managing_medical_releases_spec.rb +++ b/spec/features/user_managing_medical_releases_spec.rb @@ -4,6 +4,125 @@ feature "User managing medical releases" do let(:current_user) { create(:user) } let(:project) { create(:project, members: current_user, account: current_user.primary_account) } + context "when signed out" do + scenario 'creating a release for an adult', js: true do + allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) + + project = create(:project, members: current_user, account: current_user.primary_account) + contract_template = create(:contract_template, project: project) + + visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) + + fill_in person_first_name_field, with: 'Jane' + fill_in person_last_name_field, with: 'Doe' + fill_in_person_address_fields + fill_in person_phone_field, with: '555-555-5555' + fill_in person_email_field, with: 'jane.doe@test.com' + drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone + draw_signature file_fixture("signature.png"), "medical_release_signature_base64" + + expect do + click_button submit_release_button + end.to change(MedicalRelease, :count).by(1) + + expect(page).to have_content(successful_submission_message) + end + + scenario 'creating a release for a minor', js: true do + allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) + + project = create(:project, members: current_user, account: current_user.primary_account) + contract_template = create(:contract_template, project: project) + + visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) + + expect(page).not_to have_content guardian_information_heading.upcase + expect(page).not_to have_content guardian_photo_heading.upcase + + page.check person_is_minor_checkbox + expect(page).to have_content guardian_information_heading.upcase + expect(page).to have_content guardian_photo_heading.upcase + expect(page).to have_content guardian_email_field.titleize + + fill_in guardian_first_name_field, with: 'Guardian' + fill_in guardian_last_name_field, with: 'Name' + fill_in guardian_phone_field, with: '001101' + fill_in person_first_name_field, with: 'Jane' + fill_in person_last_name_field, with: 'Doe' + fill_in_person_address_fields + fill_in person_phone_field, with: '555-555-5555' + fill_in person_email_field, with: 'jane.doe@test.com' + drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' + + fill_in guardian_email_field, with: 'invalid@email' + click_button submit_release_button + expect(page).to have_content email_validation_error_for('Guardian') + + fill_in guardian_email_field, with: 'valid@email.com' + fill_in_guardian_address_fields + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' + click_button submit_release_button + + expect(page).to have_content(successful_submission_message) + end + + scenario 'creating a release for a minor with two guardians', js: true do + allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) + + project = create(:project, members: current_user, account: current_user.primary_account) + contract_template = create(:contract_template, project: project) + + visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) + + expect(page).not_to have_content guardian_2_information_heading.upcase + expect(page).not_to have_content guardian_2_photo_heading.upcase + + page.check person_is_minor_checkbox + expect(page).to have_content guardian_information_heading.upcase + expect(page).to have_content guardian_photo_heading.upcase + expect(page).to have_content guardian_email_field.titleize + + expect(page).to have_content guardian_2_information_heading.upcase + expect(page).to have_content guardian_2_photo_heading.upcase + expect(page).to have_content guardian_2_email_field.titleize + expect(page).to have_content guardian_2_phone_field.titleize + expect(page).to have_content guardian_2_address_street1_field.titleize + + fill_in guardian_first_name_field, with: 'Guardian' + fill_in guardian_last_name_field, with: 'Name' + fill_in guardian_phone_field, with: '001101' + fill_in person_first_name_field, with: 'Jane' + fill_in person_last_name_field, with: 'Doe' + fill_in_person_address_fields + fill_in person_phone_field, with: '555-555-5555' + fill_in person_email_field, with: 'jane.doe@test.com' + drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' + + fill_in guardian_email_field, with: 'invalid@email' + click_button submit_release_button + expect(page).to have_content email_validation_error_for('Guardian') + + fill_in guardian_email_field, with: 'valid@email.com' + fill_in_guardian_address_fields + attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all + draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' + + fill_in guardian_2_first_name_field, with: 'Second' + fill_in guardian_2_last_name_field, with: 'Guardian' + fill_in guardian_2_phone_field, with: '999' + + click_button submit_release_button + + expect(page).to have_content(successful_submission_message) + expect(MedicalRelease.last.guardian_2_first_name).to eq 'Second' + end + end + context "when signed in as account manager" do before do sign_in current_user @@ -142,4 +261,139 @@ feature "User managing medical releases" do def view_release_pdf_link_for(release) ['Download', href: medical_release_contracts_path(release, format: 'pdf')] end + + def person_first_name_field + "medical_release[person_first_name]" + end + + def person_last_name_field + "medical_release[person_last_name]" + end + + def person_email_field + "medical_release[person_email]" + end + + def person_phone_field + "medical_release[person_phone]" + end + + def submit_release_button + t 'shared.submit_release_short' + end + + def successful_submission_message + "Your release was successfully submitted. Thank you." + end + + def fill_in_person_address_fields + fill_in person_address_street1_field, with: "123 Test Lane" + fill_in person_address_city_field, with: "New York" + fill_in person_address_state_field, with: "NY" + fill_in person_address_zip_field, with: '1000' + end + + def fill_in_guardian_address_fields + fill_in guardian_address_street1_field, with: "124 Test Lane" + fill_in guardian_address_city_field, with: "New York" + fill_in guardian_address_state_field, with: "NY" + fill_in guardian_address_zip_field, with: '1000' + end + + def person_address_street1_field + t('helpers.label.medical_release.person_address_street1') + end + + def person_address_city_field + t('helpers.label.medical_release.person_address_city') + end + + def person_address_state_field + t('helpers.label.medical_release.person_address_state') + end + + def person_address_zip_field + t('helpers.label.medical_release.person_address_zip') + end + + + def guardian_first_name_field + t('helpers.label.medical_release.guardian_first_name') + end + + def guardian_last_name_field + t('helpers.label.medical_release.guardian_last_name') + end + + def guardian_phone_field + t('helpers.label.medical_release.guardian_phone') + end + + def guardian_email_field + t('helpers.label.medical_release.guardian_email') + end + + def guardian_address_street1_field + t('helpers.label.medical_release.guardian_address_street1') + end + + def guardian_address_city_field + t('helpers.label.medical_release.guardian_address_city') + end + + def guardian_address_state_field + t('helpers.label.medical_release.guardian_address_state') + end + + def guardian_address_zip_field + t('helpers.label.medical_release.guardian_address_zip') + end + + def guardian_photo_field + 'medical_release[guardian_photo]' + end + + def person_is_minor_checkbox + 'medical_release_minor' + end + + def guardian_2_first_name_field + t('helpers.label.medical_release.guardian_2_first_name') + end + + def guardian_2_last_name_field + t('helpers.label.medical_release.guardian_2_last_name') + end + + def guardian_2_phone_field + t('helpers.label.medical_release.guardian_2_phone') + end + + def guardian_2_email_field + t('helpers.label.medical_release.guardian_2_email') + end + + def guardian_2_address_street1_field + t('helpers.label.medical_release.guardian_2_address_street1') + end + + def email_validation_error_for(prefix) + "#{prefix} email is not an email" + end + + def guardian_photo_heading + t 'public.medical_releases.new.guardian_photo.heading' + end + + def guardian_information_heading + t 'public.medical_releases.new.guardian_info.heading' + end + + def guardian_2_photo_heading + t 'public.medical_releases.new.guardian_2_photo.heading' + end + + def guardian_2_information_heading + t 'public.medical_releases.new.guardian_2_info.heading' + end end