Implantação da função de controle de consolidaçoes pagas e pendentes

This commit is contained in:
2026-06-17 15:49:24 -03:00
parent 292ac31c66
commit e9def7e21a
17 changed files with 526 additions and 12 deletions

View File

@@ -4,8 +4,12 @@ class ConsolidacoesController < ApplicationController
before_action :set_consolidacao,
only: %i[show edit update destroy finalizar arquivar reativar wizard
registrar_pagamento cancelar_pagamento
preview_holerite gerar_pdf_relatorio gerar_pdf_holerite]
# Formas de pagamento aceitas (o select da UI usa esta mesma lista).
FORMAS_PAGAMENTO = %w[pix transferencia dinheiro].freeze
# GET /consolidacoes — lista com filtros
def index
authorize Consolidacao
@@ -27,6 +31,10 @@ class ConsolidacoesController < ApplicationController
if params[:vehicle].present?
@consolidacoes = @consolidacoes.where('vehicle_ids @> ?', [params[:vehicle]].to_json)
end
if %w[pago pendente parcial].include?(params[:pagamento])
@consolidacoes = @consolidacoes.public_send("pagamento_#{params[:pagamento]}")
end
end
# GET /consolidacoes/new
@@ -144,6 +152,37 @@ class ConsolidacoesController < ApplicationController
redirect_to arquivadas_consolidacoes_path, notice: 'Consolidação excluída permanentemente.'
end
# POST /consolidacoes/:id/registrar_pagamento
# Marca 1 motorista (param consolidacao_motorista_id) ou TODOS os pendentes.
def registrar_pagamento
authorize @consolidacao, :registrar_pagamento?
return pagamento_indisponivel unless @consolidacao.finalizada?
forma = params[:forma_pagamento].presence_in(FORMAS_PAGAMENTO) || 'pix'
alvos = motoristas_alvo.select { |cm| !cm.pago? }
alvos.each do |cm|
cm.marcar_pago!(current_user, forma: forma)
NotificacaoService.notificar_pagamento(@consolidacao, cm)
end
auditar!(:registrar_pagamento, @consolidacao,
dados_novos: { motoristas: alvos.map(&:motorista_nome), forma: forma })
redirect_to @consolidacao, notice: pagamento_notice(alvos.size, :pago)
end
# POST /consolidacoes/:id/cancelar_pagamento — estorna 1 motorista ou TODOS.
def cancelar_pagamento
authorize @consolidacao, :cancelar_pagamento?
alvos = motoristas_alvo.select(&:pago?)
alvos.each { |cm| cm.cancelar_pagamento!(current_user) }
auditar!(:cancelar_pagamento, @consolidacao,
dados_novos: { motoristas: alvos.map(&:motorista_nome) })
redirect_to @consolidacao, notice: pagamento_notice(alvos.size, :estornado)
end
# ── FASE 7 — PDFs ────────────────────────────────────────────
# GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X
@@ -166,9 +205,11 @@ class ConsolidacoesController < ApplicationController
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?
cm = @consolidacao.consolidacao_motoristas.find_by(motorista_nome: motorista)
pdf = Pdf::HoleritePdf.new(consolidacao: @consolidacao, motorista: motorista,
user_motorista: user_mot, app_host: ENV['APP_HOST'])
user_motorista: user_mot, app_host: ENV['APP_HOST'],
pago_em: cm&.pago_em, forma_pagamento: cm&.forma_pagamento)
auditar!(:editar, @consolidacao, dados_novos: { pdf: 'holerite', motorista: motorista })
send_data pdf.render,
@@ -204,6 +245,26 @@ class ConsolidacoesController < ApplicationController
@consolidacao = Consolidacao.find(params[:id])
end
# Um motorista específico (consolidacao_motorista_id) ou todos da consolidação.
def motoristas_alvo
if params[:consolidacao_motorista_id].present?
[@consolidacao.consolidacao_motoristas.find(params[:consolidacao_motorista_id])]
else
@consolidacao.consolidacao_motoristas.to_a
end
end
def pagamento_indisponivel
redirect_to @consolidacao, alert: 'Só é possível registrar pagamento de uma consolidação finalizada.'
end
def pagamento_notice(qtd, acao)
return 'Nenhuma alteração: motoristas já estavam no estado solicitado.' if qtd.zero?
verbo = acao == :pago ? 'marcado(s) como pago(s)' : 'com pagamento estornado'
"#{qtd} motorista(s) #{verbo}."
end
def preparar_form_new
@motoristas = Entrega.motoristas_ativos
@veiculos = Entrega.veiculos_unicos