diff --git a/decidim-proposals/app/commands/decidim/proposals/publish_proposal.rb b/decidim-proposals/app/commands/decidim/proposals/publish_proposal.rb
index 14ceb0f259bea..62734765da8ad 100644
--- a/decidim-proposals/app/commands/decidim/proposals/publish_proposal.rb
+++ b/decidim-proposals/app/commands/decidim/proposals/publish_proposal.rb
@@ -27,6 +27,7 @@ def call
increment_scores
send_notification
send_notification_to_participatory_space
+ send_publication_notification
end
broadcast(:ok, @proposal)
@@ -87,6 +88,17 @@ def send_notification_to_participatory_space
)
end
+ def send_publication_notification
+ Decidim::EventsManager.publish(
+ event: "decidim.events.proposals.author_confirmation_proposal_event",
+ event_class: Decidim::Proposals::AuthorConfirmationProposalEvent,
+ resource: @proposal,
+ affected_users: [@proposal.creator_identity],
+ extra: { force_email: true },
+ force_send: true
+ )
+ end
+
def coauthors_followers
@coauthors_followers ||= @proposal.authors.flat_map(&:followers)
end
diff --git a/decidim-proposals/app/events/decidim/proposals/author_confirmation_proposal_event.rb b/decidim-proposals/app/events/decidim/proposals/author_confirmation_proposal_event.rb
new file mode 100644
index 0000000000000..d79f2ea713065
--- /dev/null
+++ b/decidim-proposals/app/events/decidim/proposals/author_confirmation_proposal_event.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Proposals
+ class AuthorConfirmationProposalEvent < Decidim::Events::SimpleEvent
+ def self.model_name
+ ActiveModel::Name.new(self, nil, I18n.t("decidim.events.proposals.author_confirmation_proposal_event.email_subject"))
+ end
+
+ def resource_title
+ decidim_sanitize_translated(resource.title)
+ end
+ end
+ end
+end
diff --git a/decidim-proposals/config/locales/en.yml b/decidim-proposals/config/locales/en.yml
index d341325d17f7e..89c83e40cfab3 100644
--- a/decidim-proposals/config/locales/en.yml
+++ b/decidim-proposals/config/locales/en.yml
@@ -290,6 +290,11 @@ en:
email_outro: You have received this notification because you are the author of the note.
email_subject: "%{author_name} has replied your private note in %{resource_title}."
notification_title: %{author_name} %{author_nickname} has replied your private note in %{resource_title}. Check it out at the admin panel.
+ author_confirmation_proposal_event:
+ email_intro: 'Your proposal " %{resource_title} " was successfully received and is now public. Thank you for participating ! You can view it here:'
+ email_outro: You received this notification because you are the author of the proposal. You can unfollow it by visiting the proposal page (" %{resource_title} ") and clicking on " Unfollow ".
+ email_subject: Your proposal has been published!
+ notification_title: Your proposal %{resource_title} is now live.
coauthor_accepted_invite:
notification_title: %{coauthor_name} has accepted your invitation to become a co-author of the proposal %{resource_title}.
coauthor_invited:
diff --git a/decidim-proposals/config/locales/fr.yml b/decidim-proposals/config/locales/fr.yml
index ff9cb35abbe81..1201960391885 100644
--- a/decidim-proposals/config/locales/fr.yml
+++ b/decidim-proposals/config/locales/fr.yml
@@ -259,6 +259,11 @@ fr:
email_outro: Vous avez reçu cette notification parce que vous êtes l'auteur/autrice de la note.
email_subject: "%{author_name} a répondu à votre note privée dans %{resource_title}."
notification_title: %{author_name} %{author_nickname} a répondu à votre note privée dans %{resource_title}. Consultez-la sur le panneau d'administration.
+ author_confirmation_proposal_event:
+ email_intro: 'Votre proposition « %{resource_title} » a été reçue avec succès et est maintenant publique. Merci pour votre participation ! Vous pouvez la consulter ici :'
+ email_outro: Vous recevez cette notification car vous êtes l’auteur de la proposition. Vous pouvez vous désabonner en visitant la page de la proposition (« %{resource_title} ») et en cliquant sur « Ne plus suivre ».
+ email_subject: Votre proposition a été publiée !
+ notification_title: Votre proposition %{resource_title} est maintenant en ligne.
coauthor_accepted_invite:
notification_title: %{coauthor_name} a accepté votre invitation à devenir co-auteur de la proposition %{resource_title}.
coauthor_invited:
diff --git a/decidim-proposals/spec/commands/decidim/proposals/publish_proposal_spec.rb b/decidim-proposals/spec/commands/decidim/proposals/publish_proposal_spec.rb
index 8f0a42e008b39..1c50bc22771de 100644
--- a/decidim-proposals/spec/commands/decidim/proposals/publish_proposal_spec.rb
+++ b/decidim-proposals/spec/commands/decidim/proposals/publish_proposal_spec.rb
@@ -61,6 +61,17 @@ module Proposals
}
)
+ expect(Decidim::EventsManager)
+ .to receive(:publish)
+ .with(
+ event: "decidim.events.proposals.author_confirmation_proposal_event",
+ event_class: Decidim::Proposals::AuthorConfirmationProposalEvent,
+ resource: kind_of(Decidim::Proposals::Proposal),
+ affected_users: [proposal_draft.creator_identity],
+ extra: { force_email: true },
+ force_send: true
+ )
+
subject.call
end
end
diff --git a/decidim-proposals/spec/events/decidim/proposals/author_confirmation_proposal_event_spec.rb b/decidim-proposals/spec/events/decidim/proposals/author_confirmation_proposal_event_spec.rb
new file mode 100644
index 0000000000000..25b2157600232
--- /dev/null
+++ b/decidim-proposals/spec/events/decidim/proposals/author_confirmation_proposal_event_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+module Decidim
+ module Proposals
+ describe AuthorConfirmationProposalEvent do
+ let(:resource) { create(:proposal) }
+ let(:participatory_process) { create(:participatory_process, organization:) }
+ let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) }
+ let(:event_name) { "decidim.events.proposals.author_confirmation_proposal_event" }
+
+ include_context "when a simple event"
+
+ it_behaves_like "a simple event"
+
+ describe "resource_title" do
+ it "returns the proposal title" do
+ expect(subject.resource_title).to eq(decidim_sanitize_translated(resource.title))
+ end
+ end
+ end
+ end
+end