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
|
||||
|
||||
@@ -79,10 +79,28 @@ class DashboardController < ApplicationController
|
||||
@consolidacoes_abertas = @consolidacoes_mes.where(status: :rascunho).count
|
||||
@consolidacoes_fechadas = @consolidacoes_mes.where(status: :finalizada).count
|
||||
|
||||
# Pagamentos: pago vs pendente entre as consolidações FINALIZADAS do período
|
||||
# (medido por motorista — fonte: consolidacao_motoristas).
|
||||
carregar_dados_pagamentos
|
||||
|
||||
# Histórico estimado mais recente
|
||||
@historico_recente = HistoricoEstimado.order(created_at: :desc).limit(5)
|
||||
end
|
||||
|
||||
def carregar_dados_pagamentos
|
||||
finalizadas = @consolidacoes_mes.where(status: :finalizada)
|
||||
cms = ConsolidacaoMotorista.where(consolidacao_id: finalizadas.select(:id))
|
||||
|
||||
@pag_pago_qtd = cms.pagos.count
|
||||
@pag_pend_qtd = cms.pendentes.count
|
||||
@pag_pago_valor = cms.pagos.sum(:valor_total)
|
||||
@pag_pend_valor = cms.pendentes.sum(:valor_total)
|
||||
|
||||
@tabela_pagamentos = finalizadas.recentes.map do |c|
|
||||
{ consolidacao: c, status: c.status_pagamento, pago: c.valor_pago, pendente: c.valor_pendente }
|
||||
end
|
||||
end
|
||||
|
||||
def build_grafico_diario(entregas, preco_entrega)
|
||||
dias = (@periodo_inicio..@periodo_fim).to_a
|
||||
|
||||
|
||||
@@ -27,6 +27,17 @@ module Motorista
|
||||
.where(motorista_nome: nome,
|
||||
consolidacoes: { status: :finalizada, deleted_at: nil })
|
||||
.sum(:valor_total)
|
||||
|
||||
# Aviso in-app: pagamentos confirmados nos últimos 7 dias (notificação na
|
||||
# própria página do motorista, além de WhatsApp/email).
|
||||
@pagamentos_recentes = ConsolidacaoMotorista
|
||||
.joins(:consolidacao)
|
||||
.where(motorista_nome: nome,
|
||||
consolidacoes: { status: :finalizada, deleted_at: nil })
|
||||
.where.not(pago_em: nil)
|
||||
.where('pago_em >= ?', 7.days.ago)
|
||||
.order(pago_em: :desc)
|
||||
.includes(:consolidacao)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user