Aggiunge pulsante per fermare un invio email in corso.
CI / scan_ruby (push) Failing after 14m2s
CI / scan_js (push) Successful in 12m13s
CI / lint (push) Failing after 11m23s

Permette di annullare i destinatari ancora in coda mantenendo le email già inviate.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-18 00:49:57 +02:00
co-authored by Cursor
parent 765ee51eeb
commit d98c3e87a8
7 changed files with 70 additions and 1 deletions
+15 -1
View File
@@ -1,6 +1,6 @@
class MailingsController < ApplicationController
before_action :require_current_project!
before_action :set_mailing, only: %i[show edit update destroy queue test_send test_preview refresh_recipients update_recipients preview]
before_action :set_mailing, only: %i[show edit update destroy queue cancel test_send test_preview refresh_recipients update_recipients preview]
before_action :load_form_collections, only: %i[new create edit update]
def index
@@ -139,6 +139,20 @@ class MailingsController < ApplicationController
redirect_to @mailing, alert: e.message
end
def cancel
unless @mailing.sending?
redirect_to @mailing, alert: "Solo un invio in corso può essere fermato."
return
end
pending = @mailing.pending_count + @mailing.queued_count
@mailing.cancel_send!
redirect_to dashboard_mailings_path,
notice: "Invio fermato. #{@mailing.sent_count} già inviate, #{pending} annullate in coda."
rescue StandardError => e
redirect_to @mailing, alert: e.message
end
def test_send
assign_test_preview
to = @test_to.to_s.strip
+15
View File
@@ -72,6 +72,10 @@ class Mailing < ApplicationRecord
status == "sent"
end
def cancelled?
status == "cancelled"
end
def editable?
draft?
end
@@ -187,6 +191,17 @@ class Mailing < ApplicationRecord
update!(status: "sent", completed_at: Time.current, next_send_at: nil)
end
def cancel_send!
raise "Solo un invio in corso può essere fermato" unless sending?
transaction do
mailing_recipients.where(status: %w[pending queued]).find_each do |recipient|
recipient.update!(status: "skipped", skip_reason: "invio annullato")
end
update!(status: "cancelled", next_send_at: nil, completed_at: Time.current)
end
end
private
def send_window_order
+7
View File
@@ -47,10 +47,13 @@ class MailingRecipient < ApplicationRecord
def deliver!
with_lock do
return if status.in?(%w[sent skipped])
return abort_delivery!("invio annullato") unless mailing.sending?
update!(status: "queued")
end
return unless mailing.sending?
html = rendered_html
subject_line = rendered_subject_line
CampaignMailer.outreach(self, html: html, subject: subject_line).deliver_now
@@ -63,6 +66,10 @@ class MailingRecipient < ApplicationRecord
private
def abort_delivery!(reason)
update!(status: "skipped", skip_reason: reason)
end
def record_success!(subject_line)
transaction do
update!(status: "sent", sent_at: Time.current, rendered_subject: subject_line, error_message: nil)
@@ -30,4 +30,11 @@
<% elsif mailing.pending_count.positive? %>
<p class="mt-3 text-xs text-zinc-500">Prossima email in lavorazione.</p>
<% end %>
<% if mailing.sending? %>
<div class="mt-4 border-t border-zinc-100 pt-4 dark:border-zinc-800">
<%= button_to "Ferma invio", cancel_mailing_path(mailing), method: :post,
class: btn_danger,
form: { data: { turbo_confirm: "Fermare l'invio? Restano inviate #{mailing.sent_count} email, #{mailing.pending_count + mailing.queued_count} in coda verranno annullate." } } %>
</div>
<% end %>
</div>
+4
View File
@@ -30,6 +30,10 @@
<% if @mailing.editable? %>
<%= link_to "Modifica contenuto", edit_mailing_path(@mailing), class: btn_secondary %>
<%= button_to "Aggiorna lista", refresh_recipients_mailing_path(@mailing), method: :post, class: btn_secondary %>
<% elsif @mailing.sending? %>
<%= button_to "Ferma invio", cancel_mailing_path(@mailing), method: :post,
class: btn_danger,
form: { data: { turbo_confirm: "Fermare l'invio? Le #{@mailing.sent_count} già inviate restano, #{@mailing.pending_count + @mailing.queued_count} in coda verranno annullate." } } %>
<% end %>
</div>
</div>