Alteração Para uso dos Usuarios
This commit is contained in:
@@ -5,7 +5,7 @@ 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
|
||||
preview_extrato gerar_pdf_relatorio gerar_pdf_extrato
|
||||
gerar_pdf_financeiro]
|
||||
|
||||
# Formas de pagamento aceitas (o select da UI usa esta mesma lista).
|
||||
@@ -234,13 +234,22 @@ class ConsolidacoesController < ApplicationController
|
||||
forma = params[:forma_pagamento].presence_in(FORMAS_PAGAMENTO) || 'pix'
|
||||
alvos = motoristas_alvo.select { |cm| !cm.pago? }
|
||||
|
||||
# NF obrigatória por motorista. Se faltar para qualquer alvo, aborta sem
|
||||
# marcar nenhum (a NF vai pro painel do motorista e pro Extrato).
|
||||
notas = nf_por_motorista(alvos)
|
||||
if notas.nil?
|
||||
return redirect_to @consolidacao,
|
||||
alert: 'Informe o número da Nota Fiscal de cada motorista antes de marcar como pago.'
|
||||
end
|
||||
|
||||
alvos.each do |cm|
|
||||
cm.marcar_pago!(current_user, forma: forma)
|
||||
cm.marcar_pago!(current_user, forma: forma, nota_fiscal: notas[cm.id])
|
||||
NotificacaoService.notificar_pagamento(@consolidacao, cm)
|
||||
end
|
||||
|
||||
auditar!(:registrar_pagamento, @consolidacao,
|
||||
dados_novos: { motoristas: alvos.map(&:motorista_nome), forma: forma })
|
||||
dados_novos: { motoristas: alvos.map(&:motorista_nome), forma: forma,
|
||||
notas_fiscais: alvos.map { |cm| [cm.motorista_nome, notas[cm.id]] }.to_h })
|
||||
redirect_to @consolidacao, notice: pagamento_notice(alvos.size, :pago)
|
||||
end
|
||||
|
||||
@@ -285,27 +294,28 @@ class ConsolidacoesController < ApplicationController
|
||||
disposition: 'attachment'
|
||||
end
|
||||
|
||||
# GET /consolidacoes/:id/gerar_pdf_holerite?motorista=X
|
||||
def gerar_pdf_holerite
|
||||
autorizar_holerite!(params[:motorista])
|
||||
# GET /consolidacoes/:id/gerar_pdf_extrato?motorista=X
|
||||
def gerar_pdf_extrato
|
||||
autorizar_extrato!(params[:motorista])
|
||||
motorista = params[:motorista]
|
||||
user_mot = buscar_user_motorista(motorista)
|
||||
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'],
|
||||
pago_em: cm&.pago_em, forma_pagamento: cm&.forma_pagamento)
|
||||
auditar!(:editar, @consolidacao, dados_novos: { pdf: 'holerite', motorista: motorista })
|
||||
pdf = Pdf::ExtratoPdf.new(consolidacao: @consolidacao, motorista: motorista,
|
||||
user_motorista: user_mot, app_host: ENV['APP_HOST'],
|
||||
pago_em: cm&.pago_em, forma_pagamento: cm&.forma_pagamento,
|
||||
nota_fiscal: cm&.nota_fiscal)
|
||||
auditar!(:editar, @consolidacao, dados_novos: { pdf: 'extrato', motorista: motorista })
|
||||
|
||||
send_data pdf.render,
|
||||
filename: "holerite_#{motorista.parameterize}_#{@consolidacao.id}.pdf",
|
||||
filename: "extrato_#{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
|
||||
# GET /consolidacoes/:id/preview_extrato?motorista=X — preview HTML antes do PDF
|
||||
def preview_extrato
|
||||
authorize @consolidacao, :show?
|
||||
@motorista = params[:motorista]
|
||||
@entregas = @consolidacao.consolidacao_entregas.where(motorista_nome: @motorista)
|
||||
@@ -319,7 +329,7 @@ class ConsolidacoesController < ApplicationController
|
||||
# Acha o User motorista pelo nome para gerar o QR Code de acesso. O
|
||||
# motorista_nome vem dos dados externos de entrega e o users.nome é digitado
|
||||
# no admin — então toleramos diferenças de caixa e de espaços (extras/duplos).
|
||||
# Sem isso, qualquer divergência deixava user_mot nil e o QR sumia do holerite.
|
||||
# Sem isso, qualquer divergência deixava user_mot nil e o QR sumia do extrato.
|
||||
def buscar_user_motorista(nome)
|
||||
exato = User.motorista.find_by('LOWER(nome) = ?', nome.to_s.downcase.strip)
|
||||
return exato if exato
|
||||
@@ -332,9 +342,9 @@ class ConsolidacoesController < ApplicationController
|
||||
nome.to_s.strip.downcase.gsub(/\s+/, ' ')
|
||||
end
|
||||
|
||||
# Staff (show?) baixa qualquer holerite. O motorista baixa só o PRÓPRIO — o PDF
|
||||
# Staff (show?) baixa qualquer extrato. O motorista baixa só o PRÓPRIO — o PDF
|
||||
# já é filtrado pelo nome dele, então não há vazamento de dados de terceiros.
|
||||
def autorizar_holerite!(motorista_nome)
|
||||
def autorizar_extrato!(motorista_nome)
|
||||
if current_user.motorista?
|
||||
raise Pundit::NotAuthorizedError unless motorista_nome.to_s.casecmp?(current_user.nome.to_s)
|
||||
skip_authorization
|
||||
@@ -356,6 +366,18 @@ class ConsolidacoesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# Mapeia { cm.id => "numero da NF" } a partir de params[:notas_fiscais].
|
||||
# Retorna nil se a NF de QUALQUER alvo estiver em branco (pagamento bloqueado).
|
||||
def nf_por_motorista(alvos)
|
||||
informadas = params[:notas_fiscais] || {}
|
||||
alvos.each_with_object({}) do |cm, mapa|
|
||||
nf = informadas[cm.id.to_s].to_s.strip
|
||||
return nil if nf.blank?
|
||||
|
||||
mapa[cm.id] = nf
|
||||
end
|
||||
end
|
||||
|
||||
def pagamento_indisponivel
|
||||
redirect_to @consolidacao, alert: 'Só é possível registrar pagamento de uma consolidação finalizada.'
|
||||
end
|
||||
|
||||
@@ -100,11 +100,10 @@ class DashboardController < ApplicationController
|
||||
# Valor estimado total
|
||||
@valor_estimado = (@entregas_pagas * config[:entrega]).round(2)
|
||||
|
||||
# Por motorista (top 10)
|
||||
# Por motorista (todos)
|
||||
@motoristas = pagas.group(:driver)
|
||||
.count
|
||||
.sort_by { |_, v| -v }
|
||||
.first(10)
|
||||
.map do |driver, qtd|
|
||||
{
|
||||
nome: driver,
|
||||
@@ -214,9 +213,9 @@ class DashboardController < ApplicationController
|
||||
{ label: cfg[:label], valor: valor }
|
||||
end
|
||||
|
||||
# Custo por motorista (top 10)
|
||||
# Custo por motorista (todos)
|
||||
@fin_por_motorista = cms.group(:motorista_nome).sum(:valor_total)
|
||||
.sort_by { |_, v| -v }.first(10)
|
||||
.sort_by { |_, v| -v }
|
||||
end
|
||||
|
||||
# `pagas` já vem filtrado por checkout no período. Agrupa pela DATA REAL
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# app/controllers/motorista/sessoes_controller.rb
|
||||
#
|
||||
# Login do motorista por PIN de 4 dígitos ou por QR Code (token do holerite).
|
||||
# Login do motorista por PIN de 4 dígitos ou por QR Code (token do extrato).
|
||||
# Não usa Devise password — fluxo simplificado para público de baixo nível técnico.
|
||||
#
|
||||
module Motorista
|
||||
@@ -44,7 +44,7 @@ module Motorista
|
||||
redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome.split.first}!"
|
||||
end
|
||||
|
||||
# GET /motorista/acesso/:token — abre o login a partir do QR Code do holerite.
|
||||
# GET /motorista/acesso/:token — abre o login a partir do QR Code do extrato.
|
||||
# SEGURANÇA: o QR apenas identifica o motorista; ele ainda precisa digitar o
|
||||
# PIN de 4 dígitos para entrar (antes o QR logava direto, sem PIN).
|
||||
def acesso_qr
|
||||
|
||||
Reference in New Issue
Block a user