Fases 7 e 8 — PDFs Prawn + QR + Painel Motorista + Notificações

This commit is contained in:
2026-06-11 18:31:38 -03:00
parent 90ed705ed8
commit 8b3d4bc87f
21 changed files with 942 additions and 23 deletions

View 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

View 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