theseus/app/controllers/letter/queues_controller.rb
2026-01-22 15:55:04 -05:00

154 lines
4.6 KiB
Ruby

class Letter::QueuesController < ApplicationController
before_action :set_letter_queue, only: %i[ show edit update destroy batch ]
skip_after_action :verify_authorized
# GET /letter/queues or /letter/queues.json
def index
authorize Letter::Queue, policy_class: Letter::QueuePolicy
@letter_queues = policy_scope(Letter::Queue, policy_scope_class: Letter::QueuePolicy::Scope)
end
# GET /letter/queues/1 or /letter/queues/1.json
def show
@letters = @letter_queue.letters.queued
@batches = @letter_queue.letter_batches
end
# GET /letter/queues/new
def new
@letter_queue = Letter::Queue.new
end
# GET /letter/queues/1/edit
def edit
end
# POST /letter/queues or /letter/queues.json
def create
@letter_queue = letter_queue_class.new(letter_queue_params.merge(user: current_user))
respond_to do |format|
if @letter_queue.save
format.html { redirect_to @letter_queue, notice: "Queue was successfully created." }
format.json { render :show, status: :created, location: @letter_queue }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @letter_queue.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /letter/queues/1 or /letter/queues/1.json
def update
respond_to do |format|
if @letter_queue.update(letter_queue_params)
format.html { redirect_to @letter_queue, notice: "Queue was successfully updated." }
format.json { render :show, status: :ok, location: @letter_queue }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @letter_queue.errors, status: :unprocessable_entity }
end
end
end
# DELETE /letter/queues/1 or /letter/queues/1.json
def destroy
@letter_queue.destroy!
respond_to do |format|
format.html { redirect_to letter_queues_path, status: :see_other, notice: "Queue was successfully destroyed." }
format.json { head :no_content }
end
end
def batch
authorize @letter_queue
unless @letter_queue.letters.any?
flash[:error] = "no letters?"
redirect_to @letter_queue
return
end
limit = params[:limit].presence&.to_i
batch = @letter_queue.make_batch(user: current_user, limit:)
User::UpdateTasksJob.perform_later(current_user)
flash[:success] = "now do something with it!"
redirect_to process_letter_batch_path(batch, uft: @letter_queue.user_facing_title, template: @letter_queue.template)
end
def mark_printed_instants_mailed
authorize Letter::Queue
# Find all letters with "printed" status in any instant letter queue
printed_letters = Letter.joins(:queue)
.where(letter_queues: { type: "Letter::InstantQueue" })
.where(aasm_state: "printed")
if printed_letters.empty?
flash[:notice] = "No printed letters found in instant queues."
redirect_to letter_queues_path
return
end
# Mark all printed letters as mailed
marked_count = 0
failed_letters = []
printed_letters.each do |letter|
begin
letter.mark_mailed!
marked_count += 1
rescue => e
failed_letters << "#{letter.public_id} (#{e.message})"
end
end
# Update user tasks after marking letters as mailed
User::UpdateTasksJob.perform_later(current_user) if marked_count > 0
if failed_letters.any?
flash[:alert] = "Marked #{marked_count} letters as mailed, but failed to mark #{failed_letters.count} letters: #{failed_letters.join(", ")}"
else
flash[:success] = "Successfully marked #{marked_count} letters as mailed from instant queues."
end
redirect_to letter_queues_path
end
private
# Use callbacks to share common setup or constraints between actions.
def set_letter_queue
@letter_queue = Letter::Queue.find_by!(slug: params[:id])
end
def letter_queue_class
type = params[:letter_queue]&.dig(:type) || params[:letter_instant_queue]&.dig(:type)
case type
when "Letter::InstantQueue"
Letter::InstantQueue
else
Letter::Queue
end
end
# Only allow a list of trusted parameters through.
def letter_queue_params
params.require(:letter_queue).permit(
:name,
:type,
:letter_height,
:letter_width,
:letter_weight,
:letter_processing_category,
:letter_mailer_id_id,
:letter_return_address_id,
:letter_return_address_name,
:user_facing_title,
:template,
:postage_type,
:usps_payment_account_id,
:include_qr_code,
:letter_mailing_date,
tags: [],
)
end
end