diff --git a/app/mailers/dashboard/mailer.rb b/app/mailers/dashboard/mailer.rb index 91b0dbd2d..e7cbc9a36 100644 --- a/app/mailers/dashboard/mailer.rb +++ b/app/mailers/dashboard/mailer.rb @@ -6,8 +6,25 @@ class Dashboard::Mailer < ApplicationMailer mail to: proposal.author.email, subject: proposal.title end + def new_actions_notification_rake_published(proposal, new_actions_ids) + @proposal = proposal + @new_actions = get_new_actions(new_actions_ids) + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_published.subject") + end + + def new_actions_notification_rake_created(proposal, new_actions_ids) + @proposal = proposal + @new_actions = get_new_actions(new_actions_ids) + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_created.subject") + end + def new_actions_notification_on_create(proposal) @proposal = proposal mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_on_create.subject") end + + private + def get_new_actions(new_actions_ids) + Dashboard::Action.where(id: new_actions_ids) + end end diff --git a/app/models/dashboard/action.rb b/app/models/dashboard/action.rb index 2e9a68f88..e88c5a714 100644 --- a/app/models/dashboard/action.rb +++ b/app/models/dashboard/action.rb @@ -93,7 +93,10 @@ class Dashboard::Action < ActiveRecord::Base actions_for_today = get_actions_for_today(proposal) actions_for_yesterday = get_actions_for_yesterday(proposal) - new_actions = actions_for_today - actions_for_yesterday + actions_for_today_ids = actions_for_today.pluck(:id) + actions_for_yesterday_ids = actions_for_yesterday.pluck(:id) + + actions_for_today_ids - actions_for_yesterday_ids end private diff --git a/app/views/dashboard/mailer/new_actions_notification_rake_created.html.erb b/app/views/dashboard/mailer/new_actions_notification_rake_created.html.erb new file mode 100644 index 000000000..ff6f3d817 --- /dev/null +++ b/app/views/dashboard/mailer/new_actions_notification_rake_created.html.erb @@ -0,0 +1,73 @@ + + +

<%= t("mailers.new_actions_notification_rake_created.hi", name: @proposal.author.name) %>

+ +

+ <%= t("mailers.new_actions_notification_rake_created.introduction", + created_at_day: @proposal.created_at.day, + created_at_month: @proposal.created_at.strftime("%B"), + title: @proposal.title) %> +

+

+ <%= t("mailers.new_actions_notification_rake_created.text_1", + link_to_published: link_to(proposal_dashboard_url(@proposal), + proposal_dashboard_url(@proposal))).html_safe %> +

+

<%= t("mailers.new_actions_notification_rake_created.text_2") %>

+
+

<%= t("mailers.new_actions_notification_rake_created.text_3") %>

+ +
+ + <% first_resource = @new_actions.resources.first %> + <% if first_resource.present? %> + <%= t("mailers.new_actions_notification_rake_created.new_resource") %> + +
+ <% end %> + + <% first_proposed_action = @new_actions.proposed_actions.first %> + <% if first_proposed_action.present? %> +

<%= t("mailers.new_actions_notification_rake_created.text_4") %>

+ +
+ <% end %> + + <% if @new_actions.proposed_actions.count > 1 %> + <% second_proposed_action = @new_actions.proposed_actions.second %> +

<%= t("mailers.new_actions_notification_rake_created.text_5") %>

+ +
+ <% end %> + +

<%= t("mailers.new_actions_notification_rake_created.footer_text") %>

+ +
+ + + + + + +
+ <%= link_to proposal_dashboard_url(@proposal), + style: "font-family: 'Open Sans',arial,sans-serif; background: #3700fd; + border-radius: 6px; color: #fff !important; font-weight: bold; + padding: 17px 20px; text-align: center; text-decoration: none; + font-size: 20px; min-width: 200px; display: inline-block;", + target: "_blank" do %> + <%= t("mailers.new_actions_notification_rake_created.dashboard_button") %> + <% end %> +
+ + diff --git a/app/views/dashboard/mailer/new_actions_notification_rake_published.html.erb b/app/views/dashboard/mailer/new_actions_notification_rake_published.html.erb new file mode 100644 index 000000000..daea3d0a6 --- /dev/null +++ b/app/views/dashboard/mailer/new_actions_notification_rake_published.html.erb @@ -0,0 +1,74 @@ + + +

<%= t("mailers.new_actions_notification_rake_published.hi", name: @proposal.author.name) %>

+

+ <%= t("mailers.new_actions_notification_rake_published.introduction", + published_at_day: @proposal.published_at.day, + published_at_month: @proposal.published_at.strftime("%B"), + title: @proposal.title) %> +

+
+ <% first_resource = @new_actions.resources.first %> + <% if first_resource.present? %> +

<%= t("mailers.new_actions_notification_rake_published.text_1", votes_count: @proposal.cached_votes_up) %>

+
+

<%= t("mailers.new_actions_notification_rake_published.text_2") %>

+
+

<%= t("mailers.new_actions_notification_rake_published.new_resource") %>

+ +
+ <% end %> + + <% limit_to_archive_proposal = @proposal.created_at.to_date + + Setting["months_to_archive_proposals"].to_i.months %> +

+ <%= t("mailers.new_actions_notification_rake_published.text_3", + days_count: (limit_to_archive_proposal - Date.today).to_i, + max_votes_count: Setting["votes_for_proposal_success"]) %> +

+ + <% first_proposed_action = @new_actions.proposed_actions.first %> + <% if first_proposed_action.present? %> +

<%= t("mailers.new_actions_notification_rake_published.text_4") %>

+ +
+ <% end %> + + <% if @new_actions.proposed_actions.count > 1 %> + <% second_proposed_action = @new_actions.proposed_actions.second %> +

<%= t("mailers.new_actions_notification_rake_published.text_5") %>

+ +
+ <% end %> + +

<%= t("mailers.new_actions_notification_rake_published.footer_text") %>

+ +
+ + + + + + +
+ <%= link_to proposal_dashboard_url(@proposal), + style: "font-family: 'Open Sans',arial,sans-serif; background: #3700fd; + border-radius: 6px; color: #fff !important; font-weight: bold; + padding: 17px 20px; text-align: center; text-decoration: none; + font-size: 20px; min-width: 200px; display: inline-block;", + target: "_blank" do %> + <%= t("mailers.new_actions_notification_rake_published.dashboard_button") %> + <% end %> +
+ + diff --git a/config/locales/en/mailers.yml b/config/locales/en/mailers.yml index 253d25214..d2ac7287b 100644 --- a/config/locales/en/mailers.yml +++ b/config/locales/en/mailers.yml @@ -77,6 +77,30 @@ en: hi: "Dear user," thanks: "Thank you again for participating." sincerely: "Sincererly" + new_actions_notification_rake_created: + subject: "More news about your citizen proposal in Decide Madrid" + hi: "Hello %{name}," + new_resource: "NEW UNLOCKED RESOURCE" + introduction: "As you know, on the %{created_at_day} day of the %{created_at_month} you created the proposal in draft mode %{title} on the Decide Madrid platform." + text_1: "Whenever you want you can publish on this link: %{link_to_published}. If you're still not sure..." + text_2: "Seize this moment! Learn, add other people with the same interests and prepare the diffusion that you will need when you publish your proposal definitively." + text_3: "And to accompany you in this challenge, here are the news..." + text_4: "Take a look at this NEW recommended ACTION:" + text_5: "The next action we recommend is:" + footer_text: "As always, enter the Proposals Panel and we will tell you in detail how to use these resources and how to get the most out of it." + dashboard_button: "Go ahead, discover them!" + new_actions_notification_rake_published: + subject: "More news about your citizen proposal in Decide Madrid" + hi: "Hello %{name}," + new_resource: "NEW UNLOCKED RESOURCE" + introduction: "As you know, on the %{published_at_day} day of the %{published_at_month} you published the proposal %{title} on the Decide Madrid platform." + text_1: "Well, you've got %{votes_count} support so far Congratulations!" + text_2: "And so, you have a new resource available to help you keep moving forward." + text_3: "You are missing %{days_count} days before your proposal gets the %{max_votes_count} supports and goes to referendum. Cheer up and keep spreading. Are you short of ideas?" + text_4: "NEW RECOMMENDED DIFFUSION ACTION" + text_5: "There's more yet, see the following action:" + footer_text: "As always, enter the Proposals Panel and we will tell you in detail how to use these resources and how to get the most out of it." + dashboard_button: "Go ahead, discover them!" new_actions_notification_on_create: subject: "Your draft citizen proposal in Decide Madrid is created" hi: "Hi %{name}!" diff --git a/config/locales/es/mailers.yml b/config/locales/es/mailers.yml index ef7dfb7b6..5d26c0ac7 100644 --- a/config/locales/es/mailers.yml +++ b/config/locales/es/mailers.yml @@ -77,6 +77,30 @@ es: hi: "Estimado/a usuario/a" thanks: "Gracias de nuevo por tu participación." sincerely: "Atentamente" + new_actions_notification_rake_created: + subject: "Más novedades de tu propuesta ciudadana en Decide Madrid" + hi: "Hola %{name}," + new_resource: "NUEVO RECURSO DESBLOQUEADO" + introduction: "Como sabes, el día %{created_at_day} del %{created_at_month} creaste la propuesta en modo borrador %{title} en la plataforma Decide Madrid." + text_1: "Cuando quieras puedes publicar en este enlace: %{link_to_published}. Si aún no lo tienes claro…" + text_2: "¡aprovecha este momento! Aprende, suma a otras personas con los mismos intereses y prepara la difusión que necesitarás al publicar tu propuesta definitivamente." + text_3: "Y para acompañarte en este reto, aquí van las novedades..." + text_4: "Échale un vistazo a esta NUEVA ACCIÓN recomendada:" + text_5: "La siguiente acción que te recomendamos es:" + footer_text: "Como siempre, entra en el Panel de propuestas y te contamos detalladamente cómo utilizar estos recursos y cómo sacarle el máximo partido." + dashboard_button: "Adelante, ¡descúbrelos!" + new_actions_notification_rake_published: + subject: "Más novedades de tu propuesta ciudadana en Decide Madrid" + hi: "Hola %{name}," + new_resource: "NUEVO RECURSO DESBLOQUEADO" + introduction: "Como sabes, el día %{published_at_day} del %{published_at_month} publicaste la propuesta %{title} en la plataforma Decide Madrid." + text_1: "Pues bien, has conseguido %{votes_count} apoyos hasta este momento ¡Felicidades!" + text_2: "Y por eso, tienes disponible un nuevo recurso para ayudarte a seguir avanzando." + text_3: "Te faltan %{days_count} días para que tu propuesta consiga los %{max_votes_count} apoyos y que vaya a referéndum. Ánimo y sigue difundiendo. ¿Te faltan ideas?" + text_4: "NUEVA ACCIÓN DE DIFUSIÓN RECOMENDADA" + text_5: "Aún hay más, consulta la siguiente acción:" + footer_text: "Como siempre, entra en el Panel de propuestas y te contamos detalladamente cómo utilizar estos recursos y cómo sacarle el máximo partido." + dashboard_button: "Adelante, ¡descúbrelos!" new_actions_notification_on_create: subject: "Tu borrador de propuesta ciudadana en Decide Madrid está creado" hi: "Hola %{name}!" diff --git a/config/schedule.rb b/config/schedule.rb index f4c03fd61..16420a765 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -26,3 +26,7 @@ end every 1.day, at: '5:00 am' do rake "-s sitemap:refresh" end + +every 1.day, at: '7:00 am' do + rake "dashboards:send_notifications" +end diff --git a/lib/tasks/dashboards.rake b/lib/tasks/dashboards.rake new file mode 100644 index 000000000..44a3954f8 --- /dev/null +++ b/lib/tasks/dashboards.rake @@ -0,0 +1,18 @@ +namespace :dashboards do + + desc "Send to user notifications from new actions availability on dashboard" + task send_notifications: :environment do + Proposal.not_archived.each do |proposal| + new_actions_ids = Dashboard::Action.detect_new_actions(proposal) + + if new_actions_ids.present? + if proposal.published? + Dashboard::Mailer.new_actions_notification_rake_published(proposal, new_actions_ids).deliver_later + else + Dashboard::Mailer.new_actions_notification_rake_created(proposal, new_actions_ids).deliver_later + end + end + end + end + +end diff --git a/spec/lib/tasks/dashboards_spec.rb b/spec/lib/tasks/dashboards_spec.rb new file mode 100644 index 000000000..434f2b249 --- /dev/null +++ b/spec/lib/tasks/dashboards_spec.rb @@ -0,0 +1,83 @@ +require "rails_helper" +require "rake" + +describe "Dashboards Rake" do + + describe "#send_notifications" do + + before do + Rake.application.rake_require "tasks/dashboards" + Rake::Task.define_task(:environment) + ActionMailer::Base.deliveries.clear + end + + let :run_rake_task do + Rake::Task["dashboards:send_notifications"].reenable + Rake.application.invoke_task "dashboards:send_notifications" + end + + describe "Not send notifications to proposal author" do + + let!(:action) { create(:dashboard_action, :proposed_action, :active, day_offset: 1) } + let!(:resource) { create(:dashboard_action, :resource, :active, day_offset: 1) } + + it "when there are not news actions actived for published proposals" do + create(:proposal) + action.update(published_proposal: true) + resource.update(published_proposal: true) + + expect {run_rake_task}.to change { ActionMailer::Base.deliveries.count }.by(0) + end + + it "when there are not news actions actived for draft proposals" do + create(:proposal, :draft) + action.update(published_proposal: false) + resource.update(published_proposal: false) + + expect {run_rake_task}.to change { ActionMailer::Base.deliveries.count }.by(0) + end + + it "when there are news actions actived for archived proposals" do + create(:proposal, :archived) + action.update(day_offset: 0, published_proposal: true) + resource.update(day_offset: 0, published_proposal: true) + + expect {run_rake_task}.to change { ActionMailer::Base.deliveries.count }.by(0) + end + + end + + describe "Send notifications to proposal author" do + let!(:action) { create(:dashboard_action, :proposed_action, :active, day_offset: 0) } + let!(:resource) { create(:dashboard_action, :resource, :active, day_offset: 0) } + + it " when there are news actions actived for published proposals" do + proposal = create(:proposal) + action.update(published_proposal: true) + resource.update(published_proposal: true) + + run_rake_task + email = open_last_email + + expect(email).to deliver_from("CONSUL ") + expect(email).to deliver_to(proposal.author) + expect(email).to have_subject("More news about your citizen proposal in Decide Madrid") + end + + it "when there are news actions actived for draft proposals" do + proposal = create(:proposal, :draft) + action.update(published_proposal: false) + resource.update(published_proposal: false) + + run_rake_task + email = open_last_email + + expect(email).to deliver_from("CONSUL ") + expect(email).to deliver_to(proposal.author) + expect(email).to have_subject("More news about your citizen proposal in Decide Madrid") + end + end + + end + +end diff --git a/spec/mailers/dashboard/mailer_spec.rb b/spec/mailers/dashboard/mailer_spec.rb index d4d3a660e..d407138a0 100644 --- a/spec/mailers/dashboard/mailer_spec.rb +++ b/spec/mailers/dashboard/mailer_spec.rb @@ -2,6 +2,83 @@ require "rails_helper" describe Dashboard::Mailer do + let!(:action) { create(:dashboard_action, :proposed_action, :active, + day_offset: 0, + published_proposal: true) } + let!(:resource) { create(:dashboard_action, :resource, :active, + day_offset: 0, + published_proposal: true) } + + describe "#new_actions_notification rake task" do + + before do + Rake.application.rake_require "tasks/dashboards" + Rake::Task.define_task(:environment) + ActionMailer::Base.deliveries.clear + end + + let :run_rake_task do + Rake::Task["dashboards:send_notifications"].reenable + Rake.application.invoke_task "dashboards:send_notifications" + end + + describe "#new_actions_notification_rake_created" do + let!(:proposal) { create(:proposal, :draft) } + + it "sends emails when detect new actions for draft proposal" do + action.update(published_proposal: false) + resource.update(published_proposal: false) + run_rake_task + + email = open_last_email + + expect(email).to deliver_from("CONSUL ") + expect(email).to deliver_to(proposal.author) + expect(email).to have_subject("More news about your citizen proposal in Decide Madrid") + expect(email).to have_body_text("Hello #{proposal.author.name},") + expect(email).to have_body_text("As you know, on the #{proposal.created_at.day} day of the #{proposal.created_at.strftime("%B")} you created the proposal in draft mode #{proposal.title} on the Decide Madrid platform.") + expect(email).to have_body_text("Whenever you want you can publish on this link:") + expect(email).to have_body_text("Seize this moment! Learn, add other people with the same interests and prepare the diffusion that you will need when you publish your proposal definitively.") + expect(email).to have_body_text("And to accompany you in this challenge, here are the news...") + expect(email).to have_body_text("NEW UNLOCKED RESOURCE") + expect(email).to have_body_text("#{resource.title}") + expect(email).to have_body_text("Take a look at this NEW recommended ACTION:") + expect(email).to have_body_text("#{action.title}") + expect(email).to have_body_text("#{action.description}") + expect(email).to have_body_text("As always, enter the Proposals Panel and we will tell you in detail how to use these resources and how to get the most out of it.") + expect(email).to have_body_text("Go ahead, discover them!") + end + end + + describe "#new_actions_notification_rake_published" do + let!(:proposal) { create(:proposal) } + + it "sends emails when detect new actions for proposal" do + run_rake_task + + email = open_last_email + + expect(email).to deliver_from("CONSUL ") + expect(email).to deliver_to(proposal.author) + expect(email).to have_subject("More news about your citizen proposal in Decide Madrid") + expect(email).to have_body_text("Hello #{proposal.author.name},") + expect(email).to have_body_text("As you know, on the #{proposal.published_at.day} day of the #{proposal.published_at.strftime("%B")} you published the proposal #{proposal.title} on the Decide Madrid platform.") + expect(email).to have_body_text("And so, you have a new resource available to help you keep moving forward.") + expect(email).to have_body_text("NEW UNLOCKED RESOURCE") + expect(email).to have_body_text("#{resource.title}") + + limit_to_archive_proposal = proposal.created_at.to_date + Setting["months_to_archive_proposals"].to_i.months + days_count = (limit_to_archive_proposal - Date.today).to_i + expect(email).to have_body_text("You are missing #{days_count} days before your proposal gets the #{Setting["votes_for_proposal_success"]} supports and goes to referendum. Cheer up and keep spreading. Are you short of ideas?") + expect(email).to have_body_text("NEW RECOMMENDED DIFFUSION ACTION") + expect(email).to have_body_text("#{action.title}") + expect(email).to have_body_text("#{action.description}") + expect(email).to have_body_text("As always, enter the Proposals Panel and we will tell you in detail how to use these resources and how to get the most out of it.") + expect(email).to have_body_text("Go ahead, discover them!") + end + end + end + describe "#new_actions_notification_on_create" do before do @@ -9,12 +86,6 @@ describe Dashboard::Mailer do end let!(:proposal) { build(:proposal, :draft) } - let!(:action) { create(:dashboard_action, :proposed_action, :active, - day_offset: 0, - published_proposal: true) } - let!(:resource) { create(:dashboard_action, :resource, :active, - day_offset: 0, - published_proposal: true) } it "sends emails when detect new actions when create a proposal" do action.update(published_proposal: false) diff --git a/spec/mailers/previews/dashboard_mailer_preview.rb b/spec/mailers/previews/dashboard_mailer_preview.rb index 5e6ce05f4..8cf2f99c3 100644 --- a/spec/mailers/previews/dashboard_mailer_preview.rb +++ b/spec/mailers/previews/dashboard_mailer_preview.rb @@ -4,6 +4,20 @@ class DashboardMailerPreview < ActionMailer::Preview Dashboard::Mailer.forward(proposal) end + # http://localhost:3000/rails/mailers/dashboard_mailer/new_actions_notification_rake_published + def new_actions_notification_rake_published + proposal = Proposal.where(published: true).first + new_actions_ids = Dashboard::Action.limit(1).id + Dashboard::Mailer.new_actions_notification(proposal, [new_actions_ids]) + end + + # http://localhost:3000/rails/mailers/dashboard_mailer/new_actions_notification_rake_created + def new_actions_notification_rake_created + proposal = Proposal.where(published: false).first + new_actions_ids = Dashboard::Action.limit(1).id + Dashboard::Mailer.new_actions_notification(proposal, [new_actions_ids]) + end + # http://localhost:3000/rails/mailers/dashboard_mailer/new_actions_notification_on_create def new_actions_notification_on_create proposal = Proposal.first diff --git a/spec/models/dashboard/action_spec.rb b/spec/models/dashboard/action_spec.rb index ca813cd06..bf9a85110 100644 --- a/spec/models/dashboard/action_spec.rb +++ b/spec/models/dashboard/action_spec.rb @@ -275,8 +275,8 @@ describe Dashboard::Action do let!(:resource) { create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: true) } it "when proposal has been created today and day_offset is valid only for today" do - expect(described_class.detect_new_actions(proposal)).to include(resource) - expect(described_class.detect_new_actions(proposal)).to include(action) + expect(described_class.detect_new_actions(proposal)).to include(resource.id) + expect(described_class.detect_new_actions(proposal)).to include(action.id) end it "when proposal has received a new vote today" do @@ -285,8 +285,8 @@ describe Dashboard::Action do resource.update(required_supports: 0) create(:vote, voter: proposal.author, votable: proposal) - expect(described_class.detect_new_actions(proposal)).to include(action) - expect(described_class.detect_new_actions(proposal)).not_to include(resource) + expect(described_class.detect_new_actions(proposal)).to include(action.id) + expect(described_class.detect_new_actions(proposal)).not_to include(resource.id) end end @@ -298,8 +298,8 @@ describe Dashboard::Action do let!(:resource) { create(:dashboard_action, :resource, :active, day_offset: 0, published_proposal: false) } it "when day_offset field is valid for today and invalid for yesterday" do - expect(described_class.detect_new_actions(proposal)).to include(resource) - expect(described_class.detect_new_actions(proposal)).to include(action) + expect(described_class.detect_new_actions(proposal)).to include(resource.id) + expect(described_class.detect_new_actions(proposal)).to include(action.id) end it "when proposal has received a new vote today" do @@ -308,8 +308,8 @@ describe Dashboard::Action do resource.update(required_supports: 2) create(:vote, voter: proposal.author, votable: proposal) - expect(described_class.detect_new_actions(proposal)).to include(action) - expect(described_class.detect_new_actions(proposal)).not_to include(resource) + expect(described_class.detect_new_actions(proposal)).to include(action.id) + expect(described_class.detect_new_actions(proposal)).not_to include(resource.id) end end