Criação da visão geral da consolidação por motorista
This commit is contained in:
@@ -40,6 +40,47 @@ class ConsolidacoesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# GET /consolidacoes/totais?inicio=&fim=&motorista=&rascunhos=1
|
||||
#
|
||||
# "Quanto cada motorista somou no período". A lista de consolidações mostra um
|
||||
# card por CONSOLIDAÇÃO, mas o pagamento é por MOTORISTA: para saber quanto um
|
||||
# motorista fechou no mês era preciso abrir consolidação por consolidação e
|
||||
# somar à mão. Aqui o total vem pronto e, clicando no motorista (?motorista=),
|
||||
# a tela abre as consolidações que compõem aquele valor.
|
||||
def totais
|
||||
authorize Consolidacao, :index?
|
||||
|
||||
@inicio, @fim = periodo_totais
|
||||
@incluir_rascunhos = params[:rascunhos] == '1'
|
||||
@motorista = params[:motorista].presence
|
||||
@totais = Analytics::TotaisPorMotorista.new(
|
||||
inicio: @inicio, fim: @fim, incluir_rascunhos: @incluir_rascunhos
|
||||
)
|
||||
# Drill-down: as consolidações do motorista clicado (a tabela geral continua
|
||||
# na tela, então o service é montado sem recorte de motorista).
|
||||
@detalhe = @motorista ? @totais.consolidacoes_de(@motorista) : nil
|
||||
end
|
||||
|
||||
# GET /consolidacoes/totais_pdf — o mesmo relatório em PDF. Com ?motorista=
|
||||
# sai só o extrato daquele motorista (com espaço de assinatura).
|
||||
def totais_pdf
|
||||
authorize Consolidacao, :index?
|
||||
|
||||
inicio, fim = periodo_totais
|
||||
totais = Analytics::TotaisPorMotorista.new(
|
||||
inicio: inicio, fim: fim,
|
||||
motorista: params[:motorista].presence,
|
||||
incluir_rascunhos: params[:rascunhos] == '1'
|
||||
)
|
||||
|
||||
nome = params[:motorista].presence&.parameterize(separator: '_')
|
||||
arquivo = ['totais', nome, inicio.strftime('%Y%m%d'), fim.strftime('%Y%m%d')].compact.join('_')
|
||||
send_data Pdf::TotaisMotoristaPdf.new(totais: totais, detalhar: params[:detalhar] != '0').render,
|
||||
filename: "#{arquivo}.pdf",
|
||||
type: 'application/pdf',
|
||||
disposition: 'attachment'
|
||||
end
|
||||
|
||||
# GET /consolidacoes/new
|
||||
def new
|
||||
authorize Consolidacao
|
||||
@@ -449,6 +490,24 @@ class ConsolidacoesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
# Período do relatório de totais. Default: o MÊS CORRENTE INTEIRO — o fim é o
|
||||
# último dia do mês, não "hoje", porque o recorte exige a consolidação inteira
|
||||
# dentro da faixa (Consolidacao.no_periodo) e um fechamento que vai até 31/08
|
||||
# sumiria da tela até o dia 31 chegar.
|
||||
def periodo_totais
|
||||
inicio = parse_data_totais(params[:inicio]) || Date.current.beginning_of_month
|
||||
fim = parse_data_totais(params[:fim]) || Date.current.end_of_month
|
||||
inicio, fim = fim, inicio if fim < inicio
|
||||
[inicio, fim]
|
||||
end
|
||||
|
||||
def parse_data_totais(str)
|
||||
return nil if str.blank?
|
||||
Date.parse(str)
|
||||
rescue ArgumentError, TypeError
|
||||
nil
|
||||
end
|
||||
|
||||
# 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).
|
||||
|
||||
@@ -54,8 +54,60 @@ module Motorista
|
||||
.includes(:consolidacao)
|
||||
end
|
||||
|
||||
# GET /motorista/totais?inicio=&fim=
|
||||
#
|
||||
# "Quanto eu fechei neste período e de onde vem esse valor". O card do painel
|
||||
# mostra só o total acumulado; aqui o motorista escolhe o período, vê o total
|
||||
# FECHADO (consolidações finalizadas) e a lista de consolidações que compõem
|
||||
# o valor — a mesma conta que o admin vê em /consolidacoes/totais, montada
|
||||
# pelo mesmo service para os dois números não poderem divergir.
|
||||
def totais
|
||||
@inicio, @fim = periodo_totais
|
||||
@totais = totais_do_periodo
|
||||
@consolidacoes = @totais.consolidacoes_de(current_user.nome)
|
||||
end
|
||||
|
||||
# GET /motorista/totais/pdf — o extrato do período em PDF (com assinatura),
|
||||
# para o motorista guardar ou mandar por WhatsApp.
|
||||
def totais_pdf
|
||||
inicio, fim = periodo_totais
|
||||
totais = Analytics::TotaisPorMotorista.new(
|
||||
inicio: inicio, fim: fim, motorista: current_user.nome
|
||||
)
|
||||
|
||||
arquivo = ['meu_total', current_user.nome.parameterize(separator: '_'),
|
||||
inicio.strftime('%Y%m%d'), fim.strftime('%Y%m%d')].join('_')
|
||||
send_data Pdf::TotaisMotoristaPdf.new(totais: totais).render,
|
||||
filename: "#{arquivo}.pdf",
|
||||
type: 'application/pdf',
|
||||
disposition: 'attachment'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def totais_do_periodo
|
||||
Analytics::TotaisPorMotorista.new(
|
||||
inicio: @inicio, fim: @fim, motorista: current_user.nome
|
||||
)
|
||||
end
|
||||
|
||||
# Default: mês corrente INTEIRO (fim = último dia do mês). O recorte pede a
|
||||
# consolidação inteira dentro da faixa, então terminar em "hoje" esconderia
|
||||
# um fechamento que vai até o fim do mês. Mesma regra do relatório do admin.
|
||||
def periodo_totais
|
||||
inicio = parse_data(params[:inicio]) || Date.current.beginning_of_month
|
||||
fim = parse_data(params[:fim]) || Date.current.end_of_month
|
||||
inicio, fim = fim, inicio if fim < inicio
|
||||
[inicio, fim]
|
||||
end
|
||||
|
||||
def parse_data(str)
|
||||
return nil if str.blank?
|
||||
Date.parse(str)
|
||||
rescue ArgumentError, TypeError
|
||||
nil
|
||||
end
|
||||
|
||||
def garantir_motorista
|
||||
return if current_user.motorista?
|
||||
redirect_to dashboard_path, alert: 'Área exclusiva dos motoristas.'
|
||||
|
||||
Reference in New Issue
Block a user