Fases 7 e 8 — PDFs Prawn + QR + Painel Motorista + Notificações
This commit is contained in:
@@ -99,7 +99,8 @@ class ConsolidacoesController < ApplicationController
|
||||
|
||||
if @consolidacao.finalizar!(current_user)
|
||||
auditar!(:finalizar, @consolidacao)
|
||||
redirect_to @consolidacao, notice: 'Consolidação finalizada com sucesso!'
|
||||
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.'
|
||||
@@ -114,6 +115,49 @@ class ConsolidacoesController < ApplicationController
|
||||
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
|
||||
|
||||
39
app/controllers/motorista/dashboard_controller.rb
Normal file
39
app/controllers/motorista/dashboard_controller.rb
Normal file
@@ -0,0 +1,39 @@
|
||||
# app/controllers/motorista/dashboard_controller.rb
|
||||
module Motorista
|
||||
class DashboardController < ApplicationController
|
||||
before_action :garantir_motorista
|
||||
|
||||
# GET /motorista
|
||||
def index
|
||||
nome = current_user.nome
|
||||
|
||||
# Card 1 — Valor ESTIMADO (mês atual): entregas pagas × preco_entrega
|
||||
entregas_mes = Entrega.pagas.da_conta_gade
|
||||
.do_motorista(nome)
|
||||
.no_periodo(Date.current.beginning_of_month, Date.current)
|
||||
.count
|
||||
@valor_estimado = entregas_mes * Configuracao.preco_entrega
|
||||
@entregas_mes = entregas_mes
|
||||
|
||||
# Card 2 — Valor CONSOLIDADO: soma das consolidações finalizadas
|
||||
@minhas_consolidacoes = Consolidacao.ativas
|
||||
.joins(:consolidacao_motoristas)
|
||||
.where(consolidacao_motoristas: { motorista_nome: nome })
|
||||
.recentes
|
||||
.distinct
|
||||
|
||||
@valor_consolidado = ConsolidacaoMotorista
|
||||
.joins(:consolidacao)
|
||||
.where(motorista_nome: nome,
|
||||
consolidacoes: { status: :finalizada, deleted_at: nil })
|
||||
.sum(:valor_total)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def garantir_motorista
|
||||
return if current_user.motorista?
|
||||
redirect_to dashboard_path, alert: 'Área exclusiva dos motoristas.'
|
||||
end
|
||||
end
|
||||
end
|
||||
44
app/controllers/motorista/sessoes_controller.rb
Normal file
44
app/controllers/motorista/sessoes_controller.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
# app/controllers/motorista/sessoes_controller.rb
|
||||
#
|
||||
# Login do motorista por PIN de 4 dígitos ou por QR Code (token do holerite).
|
||||
# Não usa Devise password — fluxo simplificado para público de baixo nível técnico.
|
||||
#
|
||||
module Motorista
|
||||
class SessoesController < ApplicationController
|
||||
skip_before_action :authenticate_user!
|
||||
layout 'application'
|
||||
|
||||
# GET /motorista/login — tela com teclado de PIN
|
||||
def new; end
|
||||
|
||||
# POST /motorista/login — valida PIN
|
||||
def create
|
||||
pin = params[:pin].to_s.strip
|
||||
user = User.motorista.ativos.find_by(pin_code: pin)
|
||||
|
||||
if pin.length == 4 && user
|
||||
sign_in(user)
|
||||
AuditoriaLog.registrar(user: user, acao: :login, entidade: 'User',
|
||||
entidade_id: user.id, request: request)
|
||||
redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome.split.first}!"
|
||||
else
|
||||
flash.now[:alert] = 'PIN não encontrado. Confira os 4 números e tente de novo.'
|
||||
render :new, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
# GET /motorista/acesso/:token — login via QR Code do holerite
|
||||
def acesso_qr
|
||||
user = User.motorista.ativos.find_by(login_token: params[:token])
|
||||
|
||||
if user
|
||||
sign_in(user)
|
||||
AuditoriaLog.registrar(user: user, acao: :login, entidade: 'User',
|
||||
entidade_id: user.id, dados_novos: { via: 'qr_code' }, request: request)
|
||||
redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome.split.first}!"
|
||||
else
|
||||
redirect_to motorista_login_path, alert: 'QR Code inválido ou expirado. Entre com seu PIN.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user