correção de bugs na area de Dashbord

This commit is contained in:
2026-08-21 01:12:47 -03:00
parent cebd6e2dcd
commit 4965931c13
7 changed files with 361 additions and 41 deletions

View File

@@ -120,3 +120,101 @@ RSpec.describe 'Dashboard — contabilização de falhas', type: :request do
expect(corpo).to include('R$ 30,00') # total estimado do período
end
end
# Trava a ABA "CONSOLIDADO" do card de motoristas.
#
# O card tem duas abas sobre o mesmo ranking e elas mostram números diferentes de
# propósito: "Estimado" = atendidas × preço; "Consolidado" = o que realmente foi
# fechado (com bônus/desconto/retirada) + a quantidade de entregas do fechamento.
# Confundir as duas é justamente o que este spec impede.
RSpec.describe 'Dashboard — aba Consolidado do ranking de motoristas', type: :request do
include_context 'espelho de rastreio'
let(:inicio) { '2026-08-01' }
let(:fim) { '2026-08-14' }
before do
create(:configuracao, chave: 'preco_entrega', valor: '10.0')
sign_in create(:gerente)
end
# Só o conteúdo da aba consolidada: a aba estimada renderiza o MESMO markup
# (moeda + "N entregas"), então asserção no body inteiro passaria por acidente.
def painel_consolidado
get dashboard_path, params: { inicio: inicio, fim: fim }
expect(response).to have_http_status(:ok)
Nokogiri::HTML(response.body).at_css('#ranking-painel-consolidado').text
end
# cria as entregas ANTES do motorista: ConsolidacaoMotorista#recalcular_valor
# (before_save) soma as consolidacao_entregas do mesmo nome — sem elas o
# valor_total nasceria zerado.
def consolidar!(nome, linhas, consolidacao)
linhas.each { |l| create(:consolidacao_entrega, { consolidacao: consolidacao, motorista_nome: nome }.merge(l)) }
create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: nome)
end
let(:consolidacao) do
create(:consolidacao, status: :finalizada,
data_inicio: Date.new(2026, 8, 1), data_fim: Date.new(2026, 8, 14))
end
it 'mostra o valor fechado e a quantidade exata de entregas de cada motorista' do
# JOSE: 2 entregas (TRK-A e TRK-B). TRK-A tem DOIS pilares (normal + bônus),
# então são 3 linhas para 2 entregas — é o caso que quebra se alguém contar
# linhas em vez de tracking_id distinto.
consolidar!('JOSE DA SILVA', [
{ tracking_id: 'TRK-A', tipo: :entrega_normal, valor_aplicado: 10.0 },
{ tracking_id: 'TRK-A', tipo: :bonus, valor_aplicado: 5.0 },
{ tracking_id: 'TRK-B', tipo: :entrega_normal, valor_aplicado: 10.0 }
], consolidacao)
consolidar!('MARIA SOUZA', [
{ tracking_id: 'TRK-C', tipo: :entrega_normal, valor_aplicado: 10.0 }
], consolidacao)
texto = painel_consolidado
expect(texto).to include('JOSE DA SILVA')
expect(texto).to include('R$ 25,00') # 10 + 5 + 10, valor REAL do fechamento
expect(texto).to include('2 entregas') # e NÃO 3: TRK-A conta uma vez só
expect(texto).to include('MARIA SOUZA')
expect(texto).to include('R$ 10,00')
expect(texto).to include('1 entregas')
end
it 'subtrai o desconto do valor fechado' do
consolidar!('JOSE DA SILVA', [
{ tracking_id: 'TRK-A', tipo: :entrega_normal, valor_aplicado: 10.0 },
{ tracking_id: 'TRK-A', tipo: :desconto, valor_aplicado: 4.0 }
], consolidacao)
expect(painel_consolidado).to include('R$ 6,00')
end
it 'não lista motorista arquivado, que saiu do fechamento' do
consolidar!('JOSE DA SILVA', [
{ tracking_id: 'TRK-A', tipo: :entrega_normal, valor_aplicado: 10.0 }
], consolidacao)
cm = consolidar!('MARIA SOUZA', [
{ tracking_id: 'TRK-C', tipo: :entrega_normal, valor_aplicado: 10.0 }
], consolidacao)
cm.arquivar!(nil)
texto = painel_consolidado
expect(texto).to include('JOSE DA SILVA')
expect(texto).not_to include('MARIA SOUZA')
end
it 'ignora consolidação em rascunho — só entra o que foi finalizado' do
rascunho = create(:consolidacao, status: :rascunho,
data_inicio: Date.new(2026, 8, 1), data_fim: Date.new(2026, 8, 14))
consolidar!('JOSE DA SILVA', [
{ tracking_id: 'TRK-A', tipo: :entrega_normal, valor_aplicado: 10.0 }
], rascunho)
expect(painel_consolidado).to include('Nenhuma consolidação finalizada neste período')
end
end

View File

@@ -0,0 +1,107 @@
require 'rails_helper'
# Trava a CONTABILIZAÇÃO DAS ENTREGAS SEM SUCESSO no painel do MOTORISTA.
#
# O painel do motorista ficou para trás quando o dashboard administrativo passou
# a usar `atendidas` (ver spec/requests/dashboard_spec.rb): continuava em `pagas`
# (só concluídas) e no eixo `planned_date`. O motorista via um valor MENOR do que
# ia receber — e a diferença só aparecia no fechamento, sem explicação.
#
# ⚠️ Sem sucesso TEM checkout: o motorista foi ao local e fechou a visita com
# motivo de insucesso. O deslocamento teve custo, a empresa paga, e o checkout é
# o eixo de data correto também para essas.
RSpec.describe 'Painel do motorista — contabilização das entregas sem sucesso', type: :request do
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.
let(:hoje) { Date.new(2026, 8, 20) }
let(:preco) { 10.0 }
let(:nome) { 'JOSE DA SILVA' }
before do
travel_to(hoje)
create(:configuracao, chave: 'preco_entrega', valor: preco.to_s)
sign_in create(:motorista, nome: nome)
end
after { travel_back }
def abrir_painel
get motorista_dashboard_path
expect(response).to have_http_status(:ok)
response.body
end
it 'soma a entrega sem sucesso ao valor estimado' do
semear([
{ driver: nome, vehicle: 'GADE_001', status: 'completed',
planned_date: Time.zone.local(2026, 8, 5, 8, 0), checkout: Time.zone.local(2026, 8, 5, 10, 0) },
{ driver: nome, vehicle: 'GADE_001', status: 'failed',
planned_date: Time.zone.local(2026, 8, 6, 8, 0), checkout: Time.zone.local(2026, 8, 6, 11, 0) }
])
corpo = abrir_painel
# 2 atendidas × R$ 10,00 — com a base antiga (`pagas`) seria 1 e R$ 10,00.
expect(corpo).to include('2 entregas atendidas')
expect(corpo).to include('1 entregues · 1 sem sucesso')
expect(corpo).to include('R$ 20,00')
end
it 'conta a sem sucesso pela data do CHECKOUT, não pela planejada' do
# Planejada em 31/07 (fora do mês), fechada em 01/08 (dentro) → entra.
semear([
{ driver: nome, vehicle: 'GADE_002', status: 'failed',
planned_date: Time.zone.local(2026, 7, 31, 8, 0), checkout: Time.zone.local(2026, 8, 1, 9, 0) }
])
corpo = abrir_painel
expect(corpo).to include('1 entregas atendidas')
expect(corpo).to include('0 entregues · 1 sem sucesso')
end
it 'exclui a sem sucesso planejada no mês mas com checkout fora' do
# O espelho do caso acima: planejada em 10/08 (dentro), fechada em 01/09
# (fora) → não entra. Com o eixo antigo (planned_date) entrava.
semear([
{ driver: nome, vehicle: 'GADE_003', status: 'failed',
planned_date: Time.zone.local(2026, 8, 10, 8, 0), checkout: Time.zone.local(2026, 9, 1, 9, 0) }
])
corpo = abrir_painel
expect(corpo).to include('0 entregas atendidas')
expect(corpo).to include('0 entregues · 0 sem sucesso')
end
it 'não conta a entrega pendente, que ainda não tem checkout' do
semear([
{ driver: nome, vehicle: 'GADE_004', status: 'pending',
planned_date: Time.zone.local(2026, 8, 7, 8, 0), checkout: nil }
])
corpo = abrir_painel
expect(corpo).to include('0 entregas atendidas')
expect(corpo).to include('0 entregues · 0 sem sucesso')
end
it 'não mistura a entrega sem sucesso de outro motorista' do
semear([
{ driver: nome, vehicle: 'GADE_005', status: 'completed',
planned_date: Time.zone.local(2026, 8, 4, 8, 0), checkout: Time.zone.local(2026, 8, 4, 10, 0) },
{ driver: 'MARIA SOUZA', vehicle: 'GADE_006', status: 'failed',
planned_date: Time.zone.local(2026, 8, 4, 8, 0), checkout: Time.zone.local(2026, 8, 4, 15, 0) }
])
corpo = abrir_painel
expect(corpo).to include('1 entregas atendidas')
expect(corpo).to include('1 entregues · 0 sem sucesso')
expect(corpo).to include('R$ 10,00')
end
end