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 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' } 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