Adição do botão de entrega manual

This commit is contained in:
2026-06-25 11:35:41 -03:00
parent 022aac2616
commit 0c5b5bcbe6
22 changed files with 615 additions and 67 deletions

View File

@@ -46,4 +46,32 @@ RSpec.describe ConsolidacaoMotorista, type: :model do
expect(cm.valor_total).to eq(20)
end
end
describe 'arquivamento (reversível)' do
let(:consolidacao) { create(:consolidacao) }
let(:gerente) { create(:gerente) }
let(:cm) { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao') }
it 'arquivar!/desarquivar! alternam arquivado? e registram quem arquivou' do
expect(cm.arquivado?).to be false
cm.arquivar!(gerente)
expect(cm.reload.arquivado?).to be true
expect(cm.arquivado_por).to eq(gerente.id)
expect(cm.arquivado_em).to be_present
cm.desarquivar!(gerente)
expect(cm.reload.arquivado?).to be false
expect(cm.arquivado_em).to be_nil
end
it 'scopes ativos/arquivados separam corretamente' do
ativo = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Ativo')
arquivado = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Arquivado')
arquivado.arquivar!(gerente)
expect(ConsolidacaoMotorista.ativos).to include(ativo)
expect(ConsolidacaoMotorista.ativos).not_to include(arquivado)
expect(ConsolidacaoMotorista.arquivados).to contain_exactly(arquivado)
end
end
end

View File

@@ -141,6 +141,86 @@ RSpec.describe Consolidacao, type: :model do
end
end
describe '#adicionar_apontamento_manual! (100% manual, sem rastreio)' do
let(:consolidacao) { create(:consolidacao) }
let(:user) { create(:gerente) }
before { allow(ConsolidacaoEntrega).to receive(:valor_para).and_return(15.0) }
it 'cria pilares manuais com nf/obs, inclui o motorista e soma o valor' do
consolidacao.adicionar_apontamento_manual!(
motorista: 'Motorista A', tipos: %w[entrega_normal bonus],
nf: '12345', obs: 'UBS Sacomã', user: user
)
cm = consolidacao.consolidacao_motoristas.find_by(motorista_nome: 'Motorista A')
expect(cm).to be_present
pilares = consolidacao.consolidacao_entregas.where(motorista_nome: 'Motorista A')
expect(pilares.count).to eq(2)
expect(pilares.all?(&:manual?)).to be true
expect(pilares.map(&:nf_manual).uniq).to eq(['12345'])
expect(pilares.map(&:obs_manual).uniq).to eq(['UBS Sacomã'])
# Mesmo tracking_id sintético agrupa os pilares como UMA entrega.
expect(pilares.map(&:tracking_id).uniq.size).to eq(1)
expect(cm.reload.valor_total).to eq(30.0)
end
it 'não conta no gate (manual) mas exige motorista e ao menos um tipo' do
allow(consolidacao).to receive(:entregas_elegiveis_count).and_return(0)
consolidacao.adicionar_apontamento_manual!(motorista: 'Motorista A', tipos: %w[entrega_normal], user: user)
expect(consolidacao.classificadas_count('Motorista A')).to eq(0)
expect { consolidacao.adicionar_apontamento_manual!(motorista: '', tipos: %w[entrega_normal], user: user) }
.to raise_error(ArgumentError)
expect { consolidacao.adicionar_apontamento_manual!(motorista: 'X', tipos: [], user: user) }
.to raise_error(ArgumentError)
end
it 'usa valor_extra para a Extraordinária quando informado' do
consolidacao.adicionar_apontamento_manual!(
motorista: 'B', tipos: %w[extraordinaria], valor_extra: 99.0, user: user
)
pilar = consolidacao.consolidacao_entregas.find_by(motorista_nome: 'B', tipo: :extraordinaria)
expect(pilar.valor_aplicado).to eq(99.0)
end
end
describe 'arquivamento de motorista (reversível)' do
let(:consolidacao) { create(:consolidacao) }
let(:gerente) { create(:gerente) }
before do
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'A',
tipo: :entrega_normal, valor_aplicado: 20)
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'B',
tipo: :entrega_normal, valor_aplicado: 30)
@cm_a = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'A')
@cm_b = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'B')
end
it 'tira o motorista arquivado do total e do gate, e restaura ao desarquivar' do
consolidacao.update_column(:valor_total, consolidacao.consolidacao_motoristas.ativos.sum(:valor_total))
expect(consolidacao.reload.valor_total).to eq(50)
@cm_a.arquivar!(gerente)
consolidacao.recalcular_motorista!('A')
expect(@cm_a.reload).to be_arquivado
expect(consolidacao.reload.valor_total).to eq(30) # só B conta
expect(ConsolidacaoMotorista.ativos).to contain_exactly(@cm_b)
expect(ConsolidacaoMotorista.arquivados).to contain_exactly(@cm_a)
# Gate ignora o motorista arquivado (A estava sem classificação completa).
allow(consolidacao).to receive(:entregas_elegiveis_count).and_return(0)
allow(consolidacao).to receive(:entregas_elegiveis_count).with('B').and_return(1)
expect(consolidacao.todas_entregas_classificadas?).to be true
@cm_a.desarquivar!(gerente)
consolidacao.recalcular_motorista!('A')
expect(consolidacao.reload.valor_total).to eq(50)
end
end
describe 'escopos de soft delete' do
it 'separa ativas de arquivadas' do
ativa = create(:consolidacao)