# app/controllers/consolidacoes_controller.rb class ConsolidacoesController < ApplicationController include Auditavel before_action :set_consolidacao, only: %i[show edit update destroy finalizar arquivar wizard] # GET /consolidacoes — lista com filtros def index authorize Consolidacao @consolidacoes = Consolidacao.ativas.recentes.includes(:criador) # Filtros @consolidacoes = @consolidacoes.where(status: params[:status]) if params[:status].present? @consolidacoes = @consolidacoes.where('nome ILIKE ?', "%#{params[:nome]}%") if params[:nome].present? @consolidacoes = @consolidacoes.where('data_inicio >= ?', params[:inicio]) if params[:inicio].present? @consolidacoes = @consolidacoes.where('data_fim <= ?', params[:fim]) if params[:fim].present? if params[:motorista].present? ids = ConsolidacaoMotorista.where('motorista_nome ILIKE ?', "%#{params[:motorista]}%") .pluck(:consolidacao_id) @consolidacoes = @consolidacoes.where(id: ids) end if params[:route_id].present? @consolidacoes = @consolidacoes.where('route_ids @> ?', [params[:route_id]].to_json) end end # GET /consolidacoes/new def new authorize Consolidacao @consolidacao = Consolidacao.new( data_inicio: Date.current.beginning_of_month, data_fim: Date.current ) @motoristas = Entrega.motoristas_ativos @rotas = Entrega.rotas_unicas end # POST /consolidacoes def create authorize Consolidacao @consolidacao = Consolidacao.new(consolidacao_params.merge(created_by: current_user.id)) motoristas = Array(params[:motoristas]).reject(&:blank?) if motoristas.empty? @consolidacao.errors.add(:base, 'Selecione ao menos um motorista') preparar_form_new return render :new, status: :unprocessable_entity end ActiveRecord::Base.transaction do @consolidacao.save! motoristas.each do |nome| @consolidacao.consolidacao_motoristas.create!(motorista_nome: nome) end end auditar!(:criar, @consolidacao, dados_novos: @consolidacao.attributes) redirect_to wizard_consolidacao_path(@consolidacao), notice: 'Consolidação criada! Selecione o motorista para validar.' rescue ActiveRecord::RecordInvalid preparar_form_new render :new, status: :unprocessable_entity end # GET /consolidacoes/:id — visão geral def show authorize @consolidacao @motoristas = @consolidacao.consolidacao_motoristas.order(:motorista_nome) end # GET /consolidacoes/:id/wizard — PASSO 1: selecionar motorista def wizard authorize @consolidacao, :update? @motoristas = @consolidacao.consolidacao_motoristas.order(:motorista_nome).map do |cm| total = Entrega.contar_pagas( inicio: @consolidacao.data_inicio, fim: @consolidacao.data_fim, motorista: cm.motorista_nome ) classificadas = @consolidacao.consolidacao_entregas .where(motorista_nome: cm.motorista_nome) .count { registro: cm, total: total, classificadas: classificadas, completo: total.positive? && classificadas >= total } end end # POST /consolidacoes/:id/finalizar def finalizar authorize @consolidacao, :update? if @consolidacao.finalizar!(current_user) auditar!(:finalizar, @consolidacao) NotificacaoService.notificar_finalizacao(@consolidacao) # WhatsApp/email aos motoristas redirect_to @consolidacao, notice: 'Consolidação finalizada! Motoristas notificados.' else redirect_to wizard_consolidacao_path(@consolidacao), alert: 'Não é possível finalizar: existem entregas não classificadas.' end end # POST /consolidacoes/:id/arquivar def arquivar authorize @consolidacao, :destroy? @consolidacao.arquivar!(current_user) auditar!(:arquivar, @consolidacao) redirect_to consolidacoes_path, notice: 'Consolidação arquivada.' end # ── FASE 7 — PDFs ──────────────────────────────────────────── # GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X def gerar_pdf_relatorio authorize @consolidacao, :show? motorista = params[:motorista] pdf = Pdf::RelatorioMotoristaPdf.new(consolidacao: @consolidacao, motorista: motorista) auditar!(:editar, @consolidacao, dados_novos: { pdf: 'relatorio', motorista: motorista }) send_data pdf.render, filename: "relatorio_#{motorista.parameterize}_#{@consolidacao.id}.pdf", type: 'application/pdf', disposition: 'attachment' end # GET /consolidacoes/:id/gerar_pdf_holerite?motorista=X def gerar_pdf_holerite authorize @consolidacao, :show? motorista = params[:motorista] user_mot = User.motorista.find_by('LOWER(nome) = ?', motorista.to_s.downcase) user_mot&.regenerar_login_token! if user_mot&.login_token.blank? pdf = Pdf::HoleritePdf.new(consolidacao: @consolidacao, motorista: motorista, user_motorista: user_mot, app_host: ENV['APP_HOST']) auditar!(:editar, @consolidacao, dados_novos: { pdf: 'holerite', motorista: motorista }) send_data pdf.render, filename: "holerite_#{motorista.parameterize}_#{@consolidacao.id}.pdf", type: 'application/pdf', disposition: 'attachment' end # GET /consolidacoes/:id/preview_holerite?motorista=X — preview HTML antes do PDF def preview_holerite authorize @consolidacao, :show? @motorista = params[:motorista] @entregas = @consolidacao.consolidacao_entregas.where(motorista_nome: @motorista) @resumo = @entregas.group(:tipo).count @total = @entregas.sum { |e| e.desconto? ? -e.valor_aplicado : e.valor_aplicado } render layout: false # renderiza dentro do modal (Turbo Frame) end private def set_consolidacao @consolidacao = Consolidacao.find(params[:id]) end def preparar_form_new @motoristas = Entrega.motoristas_ativos @rotas = Entrega.rotas_unicas end def consolidacao_params params.require(:consolidacao).permit(:nome, :data_inicio, :data_fim, route_ids: []) end end