Criação da visão geral da consolidação por motorista e Estilização

This commit is contained in:
2026-08-26 15:15:44 -03:00
parent cd99a22553
commit 7a8ec1bc16
14 changed files with 508 additions and 525 deletions

View File

@@ -14,9 +14,9 @@ RSpec.describe 'Painel do motorista — contabilização das entregas sem sucess
include ActiveSupport::Testing::TimeHelpers
include_context 'espelho de rastreio'
# O painel não aceita filtro de período (é sempre "do dia 1º até hoje"), então
# congelamos a data: sem isso o spec quebraria sozinho ao rodar no dia 1º, com
# as datas semeadas caindo fora do mês corrente.
# O painel abre no MÊS CORRENTE (a estimativa vai até hoje), então congelamos a
# data: sem isso o spec quebraria sozinho ao rodar no dia 1º, com as datas
# semeadas caindo fora do mês corrente.
let(:hoje) { Date.new(2026, 8, 20) }
let(:preco) { 10.0 }
let(:nome) { 'JOSE DA SILVA' }

View File

@@ -1,8 +1,9 @@
require 'rails_helper'
# Rotas do relatório "total por motorista": quem entra, o que a tela mostra e o
# PDF. O drill-down (?motorista=) é o que responde "de onde vem esse valor".
RSpec.describe 'Totais por motorista', type: :request do
# Modo de visualização "Por motorista" (/consolidacoes?visao=motoristas) e o
# painel do motorista: quem entra, o que a tela soma e o drill-down que responde
# "de onde vem esse valor".
RSpec.describe 'Visão por motorista', type: :request do
def consolidacao_finalizada(motorista:, valor:, nome: 'Fechamento Junho')
c = create(:consolidacao, nome: nome, status: :finalizada,
data_inicio: Date.new(2026, 6, 1), data_fim: Date.new(2026, 6, 30))
@@ -13,39 +14,49 @@ RSpec.describe 'Totais por motorista', type: :request do
let(:periodo) { { inicio: '2026-06-01', fim: '2026-06-30' } }
describe 'admin — /consolidacoes/totais' do
it 'exige login' do
get totais_consolidacoes_path
expect(response).to redirect_to(new_user_session_path)
end
describe 'admin — /consolidacoes?visao=motoristas' do
it 'bloqueia motorista (Pundit)' do
sign_in create(:motorista)
get totais_consolidacoes_path
get consolidacoes_path(visao: 'motoristas')
expect(response).to redirect_to(root_path)
end
it 'mostra o total do motorista no período' do
it 'soma o total do motorista no período' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
sign_in create(:gerente)
get totais_consolidacoes_path(periodo)
get consolidacoes_path(periodo.merge(visao: 'motoristas'))
expect(response).to have_http_status(:ok)
expect(response.body).to include('Carlos')
expect(response.body).to include('R$ 120,00')
end
it 'abre a composição do motorista clicado' do
it 'abre a composição do motorista clicado' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
consolidacao_finalizada(motorista: 'Pedro', valor: 90.0, nome: 'Fechamento do Pedro')
sign_in create(:gerente)
get consolidacoes_path(periodo.merge(visao: 'motoristas'))
expect(response.body).not_to include('O que forma esse valor')
get consolidacoes_path(periodo.merge(visao: 'motoristas', detalhe: 'Carlos'))
expect(response.body).to include('O que forma esse valor')
expect(response.body).to include('Fechamento Junho')
expect(response.body).not_to include('Fechamento do Pedro')
end
it 'a visão lista continua sendo o padrão' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
sign_in create(:gerente)
get totais_consolidacoes_path(periodo.merge(motorista: 'Carlos'))
get consolidacoes_path
expect(response.body).to include('Composição de Carlos')
expect(response.body).to include('Fechamento Junho')
expect(response.body).not_to include('Total do período')
end
it 'gera o PDF' do
it 'gera o PDF do período' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
sign_in create(:gerente)
@@ -56,17 +67,18 @@ RSpec.describe 'Totais por motorista', type: :request do
end
end
describe 'motorista — /motorista/totais' do
it 'mostra o total dele e as consolidações que o compõem' do
describe 'motorista — painel' do
it 'mostra o total fechado do período e os fechamentos que o compõem' do
motorista = create(:motorista, nome: 'Carlos')
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
consolidacao_finalizada(motorista: 'Pedro', valor: 999.0, nome: 'Fechamento do Pedro')
sign_in motorista
get motorista_totais_path(periodo)
get motorista_dashboard_path(periodo)
expect(response).to have_http_status(:ok)
expect(response.body).to include('Fechamento Junho')
expect(response.body).to include('R$ 120,00')
expect(response.body).not_to include('Fechamento do Pedro')
end
@@ -83,7 +95,7 @@ RSpec.describe 'Totais por motorista', type: :request do
it 'não é acessível por quem não é motorista' do
sign_in create(:gerente)
get motorista_totais_path
get motorista_totais_pdf_path(periodo)
expect(response).to redirect_to(dashboard_path)
end
end

View File

@@ -1,7 +1,7 @@
require 'rails_helper'
# Trava a conta do relatório "total por motorista" — a mesma que alimenta
# /consolidacoes/totais (admin) e /motorista/totais (motorista). As duas telas
# Trava a conta do modo de visualização "Por motorista" — a mesma que alimenta
# /consolidacoes?visao=motoristas (admin) e o painel do motorista. As duas telas
# usam ESTE service justamente para não poderem divergir.
RSpec.describe Analytics::TotaisPorMotorista do
let(:inicio) { Date.new(2026, 6, 1) }
@@ -37,13 +37,21 @@ RSpec.describe Analytics::TotaisPorMotorista do
expect(totais.total_consolidacoes).to eq(3)
end
it 'inclui rascunhos quando pedido' do
it 'respeita o filtro de status (o mesmo select da lista)' do
consolidar(motorista: 'Carlos', valor: 100.0)
consolidar(motorista: 'Carlos', valor: 40.0, status: :rascunho)
com_rascunho = described_class.new(inicio: inicio, fim: fim, incluir_rascunhos: true)
expect(totais.total_geral).to eq(100.0)
expect(com_rascunho.total_geral).to eq(140.0)
expect(totais.total_geral).to eq(100.0) # default: só finalizadas
expect(described_class.new(inicio: inicio, fim: fim, status: 'todos').total_geral).to eq(140.0)
expect(described_class.new(inicio: inicio, fim: fim, status: 'rascunho').total_geral).to eq(40.0)
end
it 'busca parcial por nome do motorista (campo de busca da tela)' do
consolidar(motorista: 'Carlos Matheus', valor: 100.0)
consolidar(motorista: 'Pedro Martins', valor: 30.0)
achou = described_class.new(inicio: inicio, fim: fim, busca: 'matheus')
expect(achou.linhas.map { |l| l[:motorista] }).to eq(['Carlos Matheus'])
end
it 'separa pago de a receber' do