Grande correção do filtro de veiculos na area de consolidação
This commit is contained in:
@@ -39,6 +39,12 @@ FactoryBot.define do
|
||||
sequence(:motorista_nome) { |n| "Motorista #{n}" }
|
||||
end
|
||||
|
||||
factory :consolidacao_veiculo do
|
||||
association :consolidacao
|
||||
sequence(:motorista_nome) { |n| "Motorista #{n}" }
|
||||
sequence(:vehicle) { |n| "GADE_#{format('%03d', n)}" }
|
||||
end
|
||||
|
||||
factory :consolidacao_entrega do
|
||||
association :consolidacao
|
||||
sequence(:tracking_id) { |n| "TRK-#{n}" }
|
||||
|
||||
@@ -232,4 +232,85 @@ RSpec.describe Consolidacao, type: :model do
|
||||
expect(Consolidacao.arquivadas).to include(arquivada)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#sincronizar_veiculos! (via recalcular_motorista!)' do
|
||||
let(:consolidacao) { create(:consolidacao) }
|
||||
|
||||
before { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'A') }
|
||||
|
||||
it 'cria uma linha por veículo classificado, somando o valor do veículo' do
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', tipo: :entrega_normal, valor_aplicado: 15)
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', tipo: :bonus, valor_aplicado: 10)
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_2', tipo: :entrega_normal, valor_aplicado: 20)
|
||||
|
||||
consolidacao.recalcular_motorista!('A')
|
||||
|
||||
veics = consolidacao.consolidacao_veiculos.where(motorista_nome: 'A').order(:vehicle)
|
||||
expect(veics.map(&:vehicle)).to eq(%w[GADE_1 GADE_2])
|
||||
expect(veics.find_by(vehicle: 'GADE_1').valor_total).to eq(25)
|
||||
expect(veics.find_by(vehicle: 'GADE_2').valor_total).to eq(20)
|
||||
end
|
||||
|
||||
it 'remove o veículo aberto que ficou sem pilares, mas preserva o fechado' do
|
||||
e1 = create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', valor_aplicado: 15)
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_2', valor_aplicado: 20)
|
||||
consolidacao.recalcular_motorista!('A')
|
||||
consolidacao.consolidacao_veiculos.find_by(vehicle: 'GADE_2').fechar!(create(:gerente))
|
||||
|
||||
e1.destroy
|
||||
consolidacao.recalcular_motorista!('A')
|
||||
|
||||
veics = consolidacao.consolidacao_veiculos.where(motorista_nome: 'A')
|
||||
expect(veics.pluck(:vehicle)).to contain_exactly('GADE_2') # GADE_1 (aberto e vazio) removido
|
||||
end
|
||||
end
|
||||
|
||||
describe 'gate: veículo arquivado libera a finalização' do
|
||||
let(:consolidacao) { create(:consolidacao) }
|
||||
|
||||
before { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'A') }
|
||||
|
||||
it 'desconta as elegíveis do veículo arquivado' do
|
||||
allow(consolidacao).to receive(:entregas_elegiveis_count).with('A').and_return(3)
|
||||
allow(consolidacao).to receive(:entregas_elegiveis_count_veiculo).with('A', 'GADE_2').and_return(1)
|
||||
|
||||
# 2 classificadas (GADE_1). Falta 1 (GADE_2) => incompleto.
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', tracking_id: 'T1')
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', tracking_id: 'T2', tipo: :bonus)
|
||||
expect(consolidacao.motorista_completo?('A')).to be false
|
||||
|
||||
# Arquiva GADE_2 (o carro sem classificar): total cai p/ 2 => completo.
|
||||
cv = consolidacao.consolidacao_veiculos.create!(motorista_nome: 'A', vehicle: 'GADE_2')
|
||||
cv.arquivar!(create(:gerente))
|
||||
expect(consolidacao.motorista_completo?('A')).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe '#finalizar! fecha os veículos ainda abertos' do
|
||||
let(:consolidacao) { create(:consolidacao) }
|
||||
let(:gerente) { create(:gerente) }
|
||||
|
||||
before { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'A') }
|
||||
|
||||
it 'consolida os veículos abertos ao finalizar' do
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
|
||||
vehicle: 'GADE_1', valor_aplicado: 15)
|
||||
consolidacao.recalcular_motorista!('A')
|
||||
cv = consolidacao.consolidacao_veiculos.find_by(vehicle: 'GADE_1')
|
||||
expect(cv).not_to be_fechado
|
||||
|
||||
allow(consolidacao).to receive(:todas_entregas_classificadas?).and_return(true)
|
||||
consolidacao.finalizar!(gerente)
|
||||
|
||||
expect(cv.reload).to be_fechado
|
||||
expect(cv.fechado_por).to eq(gerente.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
74
spec/models/consolidacao_veiculo_spec.rb
Normal file
74
spec/models/consolidacao_veiculo_spec.rb
Normal file
@@ -0,0 +1,74 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe ConsolidacaoVeiculo, type: :model do
|
||||
let(:consolidacao) { create(:consolidacao) }
|
||||
|
||||
describe 'validações' do
|
||||
it 'exige motorista_nome e vehicle' do
|
||||
expect(build(:consolidacao_veiculo, motorista_nome: nil)).not_to be_valid
|
||||
expect(build(:consolidacao_veiculo, vehicle: nil)).not_to be_valid
|
||||
end
|
||||
|
||||
it 'não permite o mesmo veículo duas vezes para o mesmo motorista' do
|
||||
create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
|
||||
dup = build(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
|
||||
expect(dup).not_to be_valid
|
||||
end
|
||||
end
|
||||
|
||||
describe '#recalcular_valor (before_save)' do
|
||||
before do
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
|
||||
vehicle: 'GADE_1', tipo: :entrega_normal, valor_aplicado: 15)
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
|
||||
vehicle: 'GADE_1', tipo: :desconto, valor_aplicado: 5)
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
|
||||
vehicle: 'GADE_2', tipo: :entrega_normal, valor_aplicado: 99)
|
||||
end
|
||||
|
||||
it 'soma só os pilares do veículo e trata desconto como negativo' do
|
||||
cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_1')
|
||||
expect(cv.valor_total).to eq(10) # 15 - 5 (GADE_2 fica de fora)
|
||||
end
|
||||
|
||||
it 'o bucket "(sem veículo)" casa pilares com vehicle NULL/vazio' do
|
||||
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
|
||||
vehicle: nil, tipo: :bonus, valor_aplicado: 7)
|
||||
cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao',
|
||||
vehicle: ConsolidacaoVeiculo::SEM_VEICULO)
|
||||
expect(cv.valor_total).to eq(7)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'fechamento e arquivamento' do
|
||||
let(:gerente) { create(:gerente) }
|
||||
|
||||
it 'fecha e reabre registrando quem/quando' do
|
||||
cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
|
||||
expect(cv).not_to be_fechado
|
||||
|
||||
cv.fechar!(gerente)
|
||||
cv.reload
|
||||
expect(cv).to be_fechado
|
||||
expect(cv.fechado_por).to eq(gerente.id)
|
||||
expect(cv.fechado_em).to be_present
|
||||
|
||||
cv.reabrir!(gerente)
|
||||
expect(cv.reload).not_to be_fechado
|
||||
end
|
||||
|
||||
it 'arquiva e desarquiva, e os escopos separam os estados' do
|
||||
aberto = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
|
||||
fechado = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'B', vehicle: 'GADE_2')
|
||||
arquivado = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'C', vehicle: 'GADE_3')
|
||||
fechado.fechar!(gerente)
|
||||
arquivado.arquivar!(gerente)
|
||||
|
||||
expect(ConsolidacaoVeiculo.fechados).to include(fechado)
|
||||
expect(ConsolidacaoVeiculo.fechados).not_to include(aberto)
|
||||
expect(ConsolidacaoVeiculo.abertos).to include(aberto)
|
||||
expect(ConsolidacaoVeiculo.ativos).not_to include(arquivado)
|
||||
expect(ConsolidacaoVeiculo.arquivados).to contain_exactly(arquivado)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user