Correção de itens que estão fora do plano valores no dash principal
This commit is contained in:
@@ -218,3 +218,66 @@ RSpec.describe 'Dashboard — aba Consolidado do ranking de motoristas', type: :
|
||||
expect(painel_consolidado).to include('Nenhuma consolidação finalizada neste período')
|
||||
end
|
||||
end
|
||||
|
||||
# Tela "Entregas em aberto" — o que há por trás do card "N pendentes".
|
||||
#
|
||||
# Em aberto = nem concluída nem falhada, pela data PLANEJADA (é o único recorte
|
||||
# sem checkout). Tem que usar o MESMO recorte do card, senão o número do
|
||||
# dashboard leva a uma lista que não bate com ele.
|
||||
RSpec.describe 'Dashboard — entregas em aberto', type: :request do
|
||||
include_context 'espelho de rastreio'
|
||||
|
||||
let(:inicio) { '2026-08-01' }
|
||||
let(:fim) { '2026-08-14' }
|
||||
|
||||
before { sign_in create(:gerente) }
|
||||
|
||||
def abrir_pendentes
|
||||
get dashboard_pendentes_path, params: { inicio: inicio, fim: fim }
|
||||
expect(response).to have_http_status(:ok)
|
||||
response.body
|
||||
end
|
||||
|
||||
it 'lista só o que está em aberto dentro do período' do
|
||||
semear([
|
||||
# Em aberto no período — a única que deve aparecer.
|
||||
{ reference_id: 85_382, driver: nil, status: 'pending',
|
||||
planned_date: Time.zone.local(2026, 8, 3, 8, 0), checkout: nil },
|
||||
# Fechadas: não são "em aberto", mesmo planejadas no período.
|
||||
{ reference_id: 85_383, driver: 'CARLOS', status: 'completed',
|
||||
planned_date: Time.zone.local(2026, 8, 4, 8, 0), checkout: Time.zone.local(2026, 8, 4, 10, 0) },
|
||||
{ reference_id: 85_384, driver: 'CARLOS', status: 'failed',
|
||||
planned_date: Time.zone.local(2026, 8, 5, 8, 0), checkout: Time.zone.local(2026, 8, 5, 10, 0) },
|
||||
# Em aberto, mas planejada FORA do período.
|
||||
{ reference_id: 85_385, driver: nil, status: 'pending',
|
||||
planned_date: Time.zone.local(2026, 9, 2, 8, 0), checkout: nil }
|
||||
])
|
||||
|
||||
corpo = abrir_pendentes
|
||||
expect(corpo).to include('85382')
|
||||
expect(corpo).not_to include('85383')
|
||||
expect(corpo).not_to include('85384')
|
||||
expect(corpo).not_to include('85385')
|
||||
end
|
||||
|
||||
# Sem nenhuma tabela gade_entregas_* no banco de teste, toda NF é "fora da
|
||||
# operação" — que é exatamente o caso real da NF 85382 que motivou a tela.
|
||||
it 'marca a NF que não está em nenhuma planilha de operação' do
|
||||
semear([{ reference_id: 85_382, driver: nil, status: 'pending',
|
||||
planned_date: Time.zone.local(2026, 8, 3, 8, 0), checkout: nil }])
|
||||
|
||||
expect(abrir_pendentes).to include('fora da operação')
|
||||
end
|
||||
|
||||
it 'o card do dashboard aponta para esta tela com o mesmo período' do
|
||||
create(:configuracao, chave: 'preco_entrega', valor: '10.0')
|
||||
semear([{ reference_id: 85_382, driver: nil, status: 'pending',
|
||||
planned_date: Time.zone.local(2026, 8, 3, 8, 0), checkout: nil }])
|
||||
|
||||
get dashboard_path, params: { inicio: inicio, fim: fim }
|
||||
# O href sai HTML-escapado (&) e a ordem dos params varia — confere o
|
||||
# caminho e o período separadamente.
|
||||
expect(response.body).to include(dashboard_pendentes_path)
|
||||
expect(response.body).to match(%r{/dashboard/pendentes\?[^"]*inicio=2026-08-01})
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,11 +6,11 @@ RSpec.describe Analytics::NotasForaOperacao do
|
||||
# Visitas já filtradas pelo SQL (NFs que não estão em nenhuma gade_entregas_*).
|
||||
let(:visitas) do
|
||||
[
|
||||
row(nf: 100, status: 'failed', driver: 'Carlos', checkout: '2026-08-10 09:00:00', title: 'NF 100 - FULANO (Avulsa)'),
|
||||
row(nf: 100, status: 'completed', driver: 'Carlos', checkout: '2026-08-12 09:00:00', title: 'NF 100 - FULANO (Avulsa)'),
|
||||
row(nf: 101, status: 'completed', driver: 'Pedro', checkout: '2026-08-11 09:00:00', title: 'INCLUSÃO'),
|
||||
row(nf: 102, status: 'failed', driver: 'Pedro', checkout: '2026-08-13 09:00:00', title: 'INCLUSÃO', obs: 'ÓBITO'),
|
||||
row(nf: 103, status: 'pending', driver: 'Marcos', planned: '2026-08-20', title: nil)
|
||||
row(nf: 100, status: 'failed', driver: 'Carlos', sts: 'STS PENHA', checkout: '2026-08-10 09:00:00'),
|
||||
row(nf: 100, status: 'completed', driver: 'Carlos', sts: 'STS PENHA', checkout: '2026-08-12 09:00:00'),
|
||||
row(nf: 101, status: 'completed', driver: 'Pedro', sts: 'STS PENHA', checkout: '2026-08-11 09:00:00'),
|
||||
row(nf: 102, status: 'failed', driver: 'Pedro', sts: 'STS SAPOPEMBA', checkout: '2026-08-13 09:00:00', obs: 'ÓBITO'),
|
||||
row(nf: 103, status: 'pending', driver: nil, sts: 'STS SAPOPEMBA', planned: '2026-08-20')
|
||||
]
|
||||
end
|
||||
|
||||
@@ -23,18 +23,55 @@ RSpec.describe Analytics::NotasForaOperacao do
|
||||
expect(fora.pendentes).to eq(1)
|
||||
end
|
||||
|
||||
it 'agrupa por plano de origem (Avulsa x INCLUSÃO)' do
|
||||
expect(fora.por_plano).to contain_exactly(
|
||||
{ nome: 'INCLUSÃO', total: 2 },
|
||||
{ nome: 'NF 100 - FULANO (Avulsa)', total: 1 },
|
||||
{ nome: 'SEM PLANO IDENTIFICADO', total: 1 }
|
||||
)
|
||||
end
|
||||
|
||||
it 'ordena a listagem da visita mais recente para a mais antiga' do
|
||||
expect(fora.listagem.map { |r| r['reference_id'] }).to eq([102, 100, 101, 103])
|
||||
end
|
||||
|
||||
it 'traduz o resultado da última visita' do
|
||||
linha = fora.linhas.find { |r| r['reference_id'] == 103 }
|
||||
expect(fora.resultado(linha)).to eq('Em aberto')
|
||||
expect(fora.sucesso?(linha)).to be(false)
|
||||
end
|
||||
|
||||
# Regressão do dado real (24/08/2026): `title` traz "NF 89096 - KAIQUE TAUAN DA
|
||||
# SILVA" — o destinatário, não o plano. Agrupar por ele daria um grupo por NF.
|
||||
context 'quando o espelho só tem `title` (destinatário)' do
|
||||
let(:visitas) do
|
||||
[
|
||||
row(nf: 100, status: 'completed', driver: 'Thiago', sts: 'STS PENHA', checkout: '2026-08-12 09:00:00', title: 'NF 100 - KAIQUE TAUAN DA SILVA'),
|
||||
row(nf: 101, status: 'pending', driver: nil, sts: 'STS PENHA', planned: '2026-08-03', title: 'NF 101 - MARIA APARECIDA')
|
||||
]
|
||||
end
|
||||
|
||||
it 'não trata o título como plano' do
|
||||
expect(fora.plano(fora.linhas.first)).to be_nil
|
||||
expect(fora.titulo(fora.linhas.first)).to start_with('NF ')
|
||||
expect(fora.plano_identificado?).to be(false)
|
||||
end
|
||||
|
||||
it 'cai para o agrupamento por unidade' do
|
||||
rotulo, grupos = fora.agrupamento
|
||||
expect(rotulo).to eq('Unidade')
|
||||
expect(grupos).to eq([{ nome: 'STS PENHA', total: 2 }])
|
||||
end
|
||||
end
|
||||
|
||||
context 'quando o espelho traz o plano' do
|
||||
let(:visitas) do
|
||||
[
|
||||
row(nf: 100, status: 'completed', driver: 'Carlos', sts: 'STS PENHA', checkout: '2026-08-12 09:00:00', notes: '(Avulsa)'),
|
||||
row(nf: 101, status: 'completed', driver: 'Pedro', sts: 'STS PENHA', checkout: '2026-08-11 09:00:00', notes: 'INCLUSÃO'),
|
||||
row(nf: 102, status: 'failed', driver: 'Pedro', sts: 'STS PENHA', checkout: '2026-08-13 09:00:00', notes: 'INCLUSÃO')
|
||||
]
|
||||
end
|
||||
|
||||
it 'separa (Avulsa) de INCLUSÃO' do
|
||||
rotulo, grupos = fora.agrupamento
|
||||
expect(rotulo).to eq('Plano')
|
||||
expect(grupos).to eq([{ nome: 'INCLUSÃO', total: 2 }, { nome: '(Avulsa)', total: 1 }])
|
||||
end
|
||||
end
|
||||
|
||||
# NOT IN com NULL na subquery devolve zero linhas — por isso cada SELECT da
|
||||
# união precisa filtrar nota_fiscal IS NOT NULL.
|
||||
it 'protege o NOT IN contra nota_fiscal NULL' do
|
||||
@@ -55,13 +92,14 @@ RSpec.describe Analytics::NotasForaOperacao do
|
||||
it 'não quebra e informa vazio' do
|
||||
expect(fora.total).to eq(0)
|
||||
expect(fora.any?).to be(false)
|
||||
expect(fora.por_plano).to eq([])
|
||||
expect(fora.agrupamento.last).to eq([])
|
||||
end
|
||||
end
|
||||
|
||||
def row(nf:, status:, driver:, checkout: nil, planned: nil, title: nil, obs: nil)
|
||||
def row(nf:, status:, driver:, sts: nil, checkout: nil, planned: nil, title: nil, notes: nil, obs: nil)
|
||||
{ 'reference_id' => nf, 'status' => status, 'driver' => driver,
|
||||
'checkout' => checkout, 'planned_date' => planned, 'observation' => obs,
|
||||
'contact_name' => nil, 'title' => title, 'notes' => nil, 'comments' => nil, 'route_id' => nil }
|
||||
'contact_name' => sts, 'title' => title, 'notes' => notes,
|
||||
'comments' => nil, 'route_id' => nil }
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user