Implantação da função de controle de consolidaçoes pagas e pendentes
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user