diff --git a/app/models/acquired_media_release.rb b/app/models/acquired_media_release.rb index 0c6d2cf..d7519fc 100644 --- a/app/models/acquired_media_release.rb +++ b/app/models/acquired_media_release.rb @@ -18,7 +18,7 @@ class AcquiredMediaRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name file_infos_count] + %i[name file_infos_count owner_info] end end diff --git a/app/models/concerns/csv_exportable.rb b/app/models/concerns/csv_exportable.rb index 3b03f59..69ac758 100644 --- a/app/models/concerns/csv_exportable.rb +++ b/app/models/concerns/csv_exportable.rb @@ -3,8 +3,8 @@ module CsvExportable extend ActiveSupport::Concern - COMMON_HEADERS = %i[approved? notes tags signed_at].freeze - COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze + COMMON_HEADERS = %i[approved notes tags signed_at].freeze + COMMON_VALUES = %w[approved? clean_notes clean_tags signed_on].freeze included do class << self @@ -29,11 +29,20 @@ module CsvExportable private + def owner_info + compact_contact_info(name: person_name, address: person_address, phone: person_phone, email: person_email) + end + def contact_info + owner_info + end + + def compact_contact_info(name: nil, address: nil, phone: nil, email: nil) contact_info = '' - contact_info += "#{person_address}; " if person_address.present? - contact_info += "P: #{person_phone}; " if person_phone.present? - contact_info += "E: #{person_email}" if person_email.present? + contact_info += "#{name}; " if name.present? + contact_info += "#{address}; " if address.present? + contact_info += "P: #{phone}; " if phone.present? + contact_info += "E: #{email}" if email.present? contact_info.delete_suffix '; ' end diff --git a/app/models/location_release.rb b/app/models/location_release.rb index 266ea07..fa17056 100644 --- a/app/models/location_release.rb +++ b/app/models/location_release.rb @@ -16,7 +16,7 @@ class LocationRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name address] + %i[location_info owner_info amendment_signed_column] end end @@ -67,6 +67,18 @@ class LocationRelease < ApplicationRecord true end + def location_info + compact_contact_info(name: name, address: address) + end + + def amendment_signed_column + if amendment_signable? + amendment_signed? + else + I18n.t('location_releases.csv.no_amendment_clause') + end + end + private def end_date_after_start_date diff --git a/app/models/material_release.rb b/app/models/material_release.rb index 258a33a..4e41649 100644 --- a/app/models/material_release.rb +++ b/app/models/material_release.rb @@ -20,7 +20,7 @@ class MaterialRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name] + %i[name owner_info] end end diff --git a/app/views/acquired_media_releases/_acquired_media_release.html.erb b/app/views/acquired_media_releases/_acquired_media_release.html.erb index 2ebcc67..ab0f400 100644 --- a/app/views/acquired_media_releases/_acquired_media_release.html.erb +++ b/app/views/acquired_media_releases/_acquired_media_release.html.erb @@ -18,6 +18,9 @@ <%= fa_icon("warning", text: t(".no_media"), class: "text-danger") %> <% end %> + + <%= contact_info_for(acquired_media_release.contact_person) %> + <%= notes_preview acquired_media_release.notes.order_by_recent %> diff --git a/app/views/acquired_media_releases/index.html.erb b/app/views/acquired_media_releases/index.html.erb index 3bbc09c..38c41dd 100644 --- a/app/views/acquired_media_releases/index.html.erb +++ b/app/views/acquired_media_releases/index.html.erb @@ -29,6 +29,7 @@ <%= t '.table_headers.approved'%> <%= AcquiredMediaRelease.human_attribute_name(:name) %> <%= t(".table_headers.file_infos_count") %> + <%= t(".table_headers.owner_info") %> <%= t(".table_headers.notes") %> <%= t(".table_headers.tags") %> <%= t(".table_headers.signed_at") %> diff --git a/app/views/material_releases/_material_release.html.erb b/app/views/material_releases/_material_release.html.erb index 1db1c17..44c1b00 100644 --- a/app/views/material_releases/_material_release.html.erb +++ b/app/views/material_releases/_material_release.html.erb @@ -18,6 +18,9 @@ <%= material_release.name %> + + <%= contact_info_for(material_release.contact_person) %> + <%= notes_preview material_release.notes.order_by_recent %> diff --git a/app/views/material_releases/index.html.erb b/app/views/material_releases/index.html.erb index bca39db..eaf63df 100644 --- a/app/views/material_releases/index.html.erb +++ b/app/views/material_releases/index.html.erb @@ -29,10 +29,10 @@ <%= t '.table_headers.approved'%> <%= MaterialRelease.human_attribute_name(:name) %> + <%= t(".table_headers.owner_info") %> <%= t(".table_headers.notes") %> <%= t(".table_headers.tags") %> - <%= t(".table_headers.signed_at") %> - + <%= t(".table_headers.signed_at") %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 77285d3..955a672 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -65,6 +65,7 @@ en: file_infos_count: No. Files name: Name notes: Notes + owner_info: Owner Info signed_at: Date Signed tags: Tags new: @@ -826,6 +827,8 @@ en: location_releases: create: notice: The location release has been created + csv: + no_amendment_clause: No amendment clause destroy: alert: The location release has been deleted edit: @@ -849,6 +852,7 @@ en: empty: Location Releases will appear here table_headers: amendment_signed: Amendment + amendment_signed_column: Amendment approved: Approved location_info: Location Info notes: Notes @@ -903,6 +907,7 @@ en: approved: Approved name: Name notes: Notes + owner_info: Owner Info signed_at: Date Signed tags: Tags material_release: @@ -927,7 +932,6 @@ en: empty: Medical releases will appear here table_headers: approved: Approved - approved?: Approved contact_info: Contact info name: Person name notes: Notes diff --git a/config/locales/es.yml b/config/locales/es.yml index b87f3aa..2df8430 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -16,9 +16,11 @@ es: heading: Guardian Photo index: table_headers: + approved: Appproved (ES) file_infos_count: No. Files (ES) name: Name (ES) notes: Notes (ES) + owner_info: Owner Info (ES) signed_at: Date Signed (ES) tags: Tags (ES) activerecord: @@ -64,6 +66,7 @@ es: index: imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES) table_headers: + approved: Approved (ES) contact_info: "" name: "" notes: "" @@ -402,6 +405,8 @@ es: update: Approve (ES) update: 'Actualizar %{model}' location_releases: + csv: + no_amendment_clause: No amendment clause (ES) form: photos: dropzone_label: Tap to take a photo of the Property (optional) (ES) @@ -409,6 +414,8 @@ es: table_headers: address: Address (ES) amendment_signed: Amendment (ES) + amendment_signed_column: Amendment signed (ES) + approved: Approved (ES) notes: Notes (ES) signed_at: Date Signed (ES) tags: Tags (ES) @@ -434,8 +441,10 @@ es: heading: Guardian Photo index: table_headers: + approved: Approved (ES) name: Name (ES) notes: Notes (ES) + owner_info: Owner Info signed_at: Date Signed (ES) tags: Tags (ES) medical_releases: @@ -444,7 +453,6 @@ es: index: table_headers: approved: Approved (ES) - approved?: Approved (ES) contact_info: Contact info (ES) name: Person name (ES) notes: Notes (ES) @@ -458,6 +466,7 @@ es: misc_releases: index: table_headers: + approved: Approved (ES) contact_info: Contact info (ES) name: Person name (ES) notes: Notes (ES) @@ -466,6 +475,7 @@ es: music_releases: index: table_headers: + approved: Approved (ES) composers_count: No. Composers (ES) file_infos_count: No. Files (ES) name: Name (ES) @@ -627,6 +637,7 @@ es: heading: Guardian Photo (ES) index: table_headers: + approved: Approved (ES) email: Email (ES) name: Name (ES) notes: Notes (ES) diff --git a/db/structure.sql b/db/structure.sql index 6a85008..e62fb76 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9,20 +9,6 @@ SET xmloption = content; SET client_min_messages = warning; SET row_security = off; --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -- -- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: - -- @@ -1479,6 +1465,7 @@ CREATE TABLE public.settings ( -- CREATE SEQUENCE public.settings_id_seq + AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1514,6 +1501,7 @@ CREATE TABLE public.taggings ( -- CREATE SEQUENCE public.taggings_id_seq + AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1544,6 +1532,7 @@ CREATE TABLE public.tags ( -- CREATE SEQUENCE public.tags_id_seq + AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE diff --git a/spec/factories/acquired_media_releases.rb b/spec/factories/acquired_media_releases.rb index 952f049..b45c57e 100644 --- a/spec/factories/acquired_media_releases.rb +++ b/spec/factories/acquired_media_releases.rb @@ -4,6 +4,22 @@ FactoryBot.define do name "Test Acquired Media Release" + trait :with_address do + person_address_street1 "St1" + person_address_street2 "St2" + person_address_city "City" + person_address_state "State" + person_address_zip "123" + person_address_country "US" + end + + trait :with_owner_info do + person_first_name "Jane" + person_last_name "Doe" + person_phone "100-555-1001" + person_email "owner@email.com" + end + trait :native do signature do path = Rails.root.join("spec", "fixtures", "files", "signature.png") diff --git a/spec/factories/material_releases.rb b/spec/factories/material_releases.rb index 164979f..c5ebb17 100644 --- a/spec/factories/material_releases.rb +++ b/spec/factories/material_releases.rb @@ -4,10 +4,20 @@ FactoryBot.define do name "Test Materials" + trait :with_address do + person_address_street1 "St1" + person_address_street2 "St2" + person_address_city "City" + person_address_state "State" + person_address_zip "123" + person_address_country "US" + end + trait :native do person_first_name "Jane" person_last_name "Doe" person_phone "100-555-1001" + person_email "owner@email.com" signature do path = Rails.root.join("spec", "fixtures", "files", "signature.png") diff --git a/spec/features/user_managing_acquired_media_releases_spec.rb b/spec/features/user_managing_acquired_media_releases_spec.rb index 61ac8c8..0d4484d 100644 --- a/spec/features/user_managing_acquired_media_releases_spec.rb +++ b/spec/features/user_managing_acquired_media_releases_spec.rb @@ -165,6 +165,24 @@ feature "User managing acquired_media releases" do sign_in current_user end + scenario "index table shows owner info" do + release = create(:acquired_media_release, :with_owner_info, :with_address, project: project) + + visit project_acquired_media_releases_path(project) + + expect(page).to have_content owner_info_table_header + + expect(page).to have_content release.person_first_name + expect(page).to have_content release.person_last_name + expect(page).to have_content release.person_phone + expect(page).to have_content release.person_email + expect(page).to have_content release.person_address_street1 + expect(page).to have_content release.person_address_city + expect(page).to have_content release.person_address_state + expect(page).to have_content release.person_address_zip + expect(page).to have_content release.person_address_country + end + scenario "creating a release for an adult", js: true do visit new_project_acquired_media_release_path(project) @@ -262,62 +280,63 @@ feature "User managing acquired_media releases" do end scenario "creating, updating, destroying a release", js: true do - release_data = { - name: "Test Acquired Media Release", - applicable_media: ApplicableMedium.last.label, - territory: Territory.last.label, - term: Term.last.label, - restriction: Restriction.first.label, - restriction_text: "Not available in China", - } + resize_window_to(1_000, 1_000) do + release_data = { + name: "Test Acquired Media Release", + applicable_media: ApplicableMedium.last.label, + territory: Territory.last.label, + term: Term.last.label, + restriction: Restriction.first.label, + restriction_text: "Not available in China", + } - sign_in current_user - visit new_project_acquired_media_release_path(project) + sign_in current_user + visit new_project_acquired_media_release_path(project) - by "attaching only a contract" do - attach_file contract_field, Rails.root.join(file_fixture("contract.pdf")), visible: false - click_button create_release_button + by "attaching only a contract" do + attach_file contract_field, Rails.root.join(file_fixture("contract.pdf")), visible: false + click_button create_release_button - expect(page).to have_invalid_field(acquired_media_name_field) - end - - by "attaching files" do - drop_file Rails.root.join(file_fixture("video_file.mp4")), type: "file-info-dropzone" - click_button create_release_button - - expect(page).to have_invalid_field(acquired_media_name_field) - end - - by "filling out the remaining information" do - fill_in_release_fields release_data - click_button create_release_button - - expect(page).to have_content(create_release_notice) - expect(page).to have_content("1") - - click_on "Manage" - expect(page).to have_link("Download") - end - - it_also "updates an existing release" do - click_link "Edit" - - within ".dropzone" do - expect(page).to have_filename("video_file.mp4") + expect(page).to have_invalid_field(acquired_media_name_field) end - expect(page).to have_filled_in_data(release_data) + by "attaching files" do + drop_file Rails.root.join(file_fixture("video_file.mp4")), type: "file-info-dropzone" + click_button create_release_button - fill_in_release_fields name: "New name" - drop_file Rails.root.join(file_fixture("person_photo.png")), type: "file-info-dropzone" - click_button update_release_button + expect(page).to have_invalid_field(acquired_media_name_field) + end - expect(page).to have_content(update_release_notice) - expect(page).to have_content("New name") - expect(page).to have_content("2") - end + by "filling out the remaining information" do + fill_in_release_fields release_data + click_button create_release_button - it_also "deletes an existing release" do + expect(page).to have_content(create_release_notice) + expect(page).to have_content("1") + + click_on "Manage" + expect(page).to have_link("Download") + end + + it_also "updates an existing release" do + click_link "Edit" + + within ".dropzone" do + expect(page).to have_filename("video_file.mp4") + end + + expect(page).to have_filled_in_data(release_data) + + fill_in_release_fields name: "New name" + drop_file Rails.root.join(file_fixture("person_photo.png")), type: "file-info-dropzone" + click_button update_release_button + + expect(page).to have_content(update_release_notice) + expect(page).to have_content("New name") + expect(page).to have_content("2") + end + + it_also "deletes an existing release" do click_button "Manage" accept_alert do click_link "Delete" @@ -325,6 +344,7 @@ feature "User managing acquired_media releases" do expect(page).not_to have_content("New name") end + end end scenario "viewing the contract PDF for an adult" do @@ -836,4 +856,8 @@ feature "User managing acquired_media releases" do def successful_import_message t 'acquired_media_releases.create.notice' end + + def owner_info_table_header + t 'acquired_media_releases.index.table_headers.owner_info' + end end diff --git a/spec/features/user_managing_material_releases_spec.rb b/spec/features/user_managing_material_releases_spec.rb index b98f5d6..594d20a 100644 --- a/spec/features/user_managing_material_releases_spec.rb +++ b/spec/features/user_managing_material_releases_spec.rb @@ -185,6 +185,24 @@ feature "User managing material releases" do sign_in current_user end + scenario "index table shows owner info" do + release = create(:material_release, :native, :with_address, project: project) + + visit project_material_releases_path(project) + + expect(page).to have_content owner_info_table_header + + expect(page).to have_content release.person_first_name + expect(page).to have_content release.person_last_name + expect(page).to have_content release.person_phone + expect(page).to have_content release.person_email + expect(page).to have_content release.person_address_street1 + expect(page).to have_content release.person_address_city + expect(page).to have_content release.person_address_state + expect(page).to have_content release.person_address_zip + expect(page).to have_content release.person_address_country + end + scenario "creating a release for and adult", js: true do visit new_project_material_release_path(project) @@ -813,4 +831,8 @@ feature "User managing material releases" do def signature_field 'material_release_signature_base64' end + + def owner_info_table_header + t 'material_releases.index.table_headers.owner_info' + end end diff --git a/spec/jobs/generate_contracts_zip_job_spec.rb b/spec/jobs/generate_contracts_zip_job_spec.rb index 3d3ee5f..68bf43e 100644 --- a/spec/jobs/generate_contracts_zip_job_spec.rb +++ b/spec/jobs/generate_contracts_zip_job_spec.rb @@ -25,6 +25,31 @@ describe GenerateContractsZipJob do end describe ".perform_now" do + shared_examples "generates ZIP containig CSV file with all releases data" do + it "generates ZIP containing CSV file with all releases data for all release types" do + lowercase_plural = subject.constantize.model_name.plural + GenerateContractsZipJob.perform_now(project, download, subject, project.public_send(lowercase_plural).ids) + + generated_zip = download.file.blob.download + csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv" + Zip::InputStream.open(StringIO.new(generated_zip)) do |io| + while entry = io.get_next_entry + next unless entry.name == csv_file_name + + csv_file = entry.get_input_stream.read + + release_class = Object.const_get subject + release_headers = release_class.csv_headers + + release_headers.each do |header| + expect(csv_file).to match header + expect(csv_file).not_to match translation_missing + end + end + end + end + end + it "updates a download record and creates attachment for it" do GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids) @@ -35,36 +60,60 @@ describe GenerateContractsZipJob do expect(download.file).to be_attached end - it "generates ZIP containing CSV file with all releases data for all release types" do - release_types = %w[AcquiredMediaRelease AppearanceRelease LocationRelease MaterialRelease MedicalRelease MiscRelease MusicRelease TalentRelease] - create_releases_for_all_types + context "generates ZIP for acquired media releases" do + let(:release) { create(:acquired_media_release_with_contract_template, :native, project: project) } + subject { 'AcquiredMediaRelease' } - release_types.each do |type| - lowercase_plural = type.constantize.model_name.plural - GenerateContractsZipJob.perform_now(project, download, type, project.public_send(lowercase_plural).ids) + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - generated_zip = download.file.blob.download - csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv" - Zip::InputStream.open(StringIO.new(generated_zip)) do |io| - while entry = io.get_next_entry - next unless entry.name == csv_file_name + context "generates ZIP for appearance releases" do + let(:release) { create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe") } + subject { 'AppearanceRelease' } - csv_file = entry.get_input_stream.read + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - release_class = Object.const_get type - release_headers = release_class.csv_headers + context "generates ZIP for location releases" do + let(:release) { create(:location_release_with_contract_template, :native, project: project) } + subject { 'LocationRelease' } - release_headers.each do |header| - expect(csv_file).to match header - end - end + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - dummy_zip_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.zip" - if File.exist?(file_fixture(dummy_zip_file_name)) - File.delete(file_fixture(dummy_zip_file_name)) - end - end - end + context "generates ZIP for material releases" do + let(:release) { create(:material_release_with_contract_template, :native, project: project) } + subject { 'MaterialRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for medical releases" do + let(:release) { create(:medical_release_with_contract_template, :native, project: project) } + subject { 'MedicalRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for misc releases" do + let(:release) { create(:misc_release_with_contract_template, :native, project: project) } + subject { 'MiscRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for music releases" do + let(:release) { create(:music_release_with_contract_template, project: project) } + subject { 'MusicRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for talent releases" do + let(:release) { create(:talent_release_with_contract_template, :native, project: project) } + subject { 'TalentRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" end context "When there are errors" do @@ -88,21 +137,16 @@ describe GenerateContractsZipJob do # Delete the file created in fixture. # Or the tests will fail on next run due to already existing files in existing zip. path = Rails.root.join("spec", "fixtures", "files") - if File.exists? "#{path}/my-video-project_appearance-releases.zip" - File.delete("#{path}/my-video-project_appearance-releases.zip") + releases = %w[acquired-media appearance location material medical misc music talent] + releases.each do |release| + if File.exists? "#{path}/my-video-project_#{release}-releases.zip" + File.delete("#{path}/my-video-project_#{release}-releases.zip") + end end end private - - def create_releases_for_all_types - create(:acquired_media_release_with_contract_template, :native, project: project) - create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe") - create(:location_release_with_contract_template, :native, project: project) - create(:material_release_with_contract_template, :native, project: project) - create(:medical_release_with_contract_template, :native, project: project) - create(:misc_release_with_contract_template, :native, project: project) - create(:music_release_with_contract_template, project: project) - create(:talent_release_with_contract_template, :native, project: project) + def translation_missing + /translation missing/ end end