Correção de horario e implantação da geração de Romaneio
This commit is contained in:
115
spec/services/romaneios/importador_spec.rb
Normal file
115
spec/services/romaneios/importador_spec.rb
Normal file
@@ -0,0 +1,115 @@
|
||||
require 'rails_helper'
|
||||
|
||||
# As regras de reconciliação — é onde mora o risco da funcionalidade: errar aqui
|
||||
# significa ou perder a correção que o operador fez à mão, ou imprimir um endereço
|
||||
# velho que o SimpliRoute já corrigiu.
|
||||
RSpec.describe Romaneios::Importador do
|
||||
let(:romaneio) { create(:romaneio) }
|
||||
|
||||
def linha_do_plano(nf:, nome: 'FULANO', endereco: 'RUA A, 1', telefones: '(11) 1111-1111',
|
||||
veiculo: 'GADE_001', ordem: 1)
|
||||
{ veiculo: veiculo, ordem: ordem, motorista: '', nota_fiscal: nf, nome: nome,
|
||||
endereco: endereco, telefones: telefones, aparelho: '', tracking_id: '',
|
||||
titulo: "NF #{nf} - #{nome}" }
|
||||
end
|
||||
|
||||
def importar(linhas)
|
||||
described_class.new(romaneio: romaneio, linhas: linhas, origem: 'planilha').aplicar!
|
||||
end
|
||||
|
||||
it 'insere as paradas novas e cria a folha de cada veículo' do
|
||||
resultado = importar([linha_do_plano(nf: '1'),
|
||||
linha_do_plano(nf: '2', veiculo: 'GADE_002', ordem: 1)])
|
||||
|
||||
expect(resultado.novos).to eq(2)
|
||||
expect(romaneio.romaneio_linhas.count).to eq(2)
|
||||
expect(romaneio.romaneio_veiculos.pluck(:veiculo)).to contain_exactly('GADE_001', 'GADE_002')
|
||||
end
|
||||
|
||||
it 'PRESERVA o campo que o operador editou e atualiza os demais' do
|
||||
importar([linha_do_plano(nf: '1', nome: 'FULANO', endereco: 'RUA A, 1')])
|
||||
linha = romaneio.romaneio_linhas.first
|
||||
linha.telefones = '(11) 99999-0000'
|
||||
linha.marcar_editado!('telefones')
|
||||
linha.save!
|
||||
|
||||
resultado = importar([linha_do_plano(nf: '1', nome: 'FULANO DE TAL',
|
||||
endereco: 'RUA B, 2', telefones: '(11) 1111-1111')])
|
||||
|
||||
linha.reload
|
||||
expect(linha.telefones).to eq('(11) 99999-0000') # intocado: tem edição humana
|
||||
expect(linha.endereco).to eq('RUA B, 2') # o plano manda no resto
|
||||
expect(resultado.preservados).to eq(1)
|
||||
expect(resultado.atualizados).to eq(1)
|
||||
end
|
||||
|
||||
it 'faz veículo e ordem seguirem o plano mesmo numa linha editada' do
|
||||
importar([linha_do_plano(nf: '1', veiculo: 'GADE_001', ordem: 1)])
|
||||
linha = romaneio.romaneio_linhas.first
|
||||
linha.marcar_editado!('nome')
|
||||
linha.save!
|
||||
|
||||
importar([linha_do_plano(nf: '1', veiculo: 'GADE_009', ordem: 7)])
|
||||
|
||||
expect(linha.reload.veiculo).to eq('GADE_009')
|
||||
expect(linha.ordem).to eq(7)
|
||||
end
|
||||
|
||||
it 'APAGA a parada que saiu do plano sem edição humana' do
|
||||
importar([linha_do_plano(nf: '1'), linha_do_plano(nf: '2', ordem: 2)])
|
||||
|
||||
resultado = importar([linha_do_plano(nf: '1')])
|
||||
|
||||
expect(romaneio.romaneio_linhas.pluck(:nota_fiscal)).to eq(['1'])
|
||||
expect(resultado.saidos).to eq(1)
|
||||
end
|
||||
|
||||
it 'GUARDA (sem apagar) a parada que saiu do plano mas tinha edição' do
|
||||
importar([linha_do_plano(nf: '1'), linha_do_plano(nf: '2', ordem: 2)])
|
||||
editada = romaneio.romaneio_linhas.find_by(nota_fiscal: '2')
|
||||
editada.marcar_editado!('endereco')
|
||||
editada.save!
|
||||
|
||||
importar([linha_do_plano(nf: '1')])
|
||||
|
||||
expect(editada.reload.removido_em).to be_present
|
||||
expect(romaneio.linhas_vigentes.pluck(:nota_fiscal)).to eq(['1'])
|
||||
end
|
||||
|
||||
it 'devolve a parada guardada para a folha quando ela volta ao plano' do
|
||||
importar([linha_do_plano(nf: '1'), linha_do_plano(nf: '2', ordem: 2)])
|
||||
editada = romaneio.romaneio_linhas.find_by(nota_fiscal: '2')
|
||||
editada.marcar_editado!('endereco')
|
||||
editada.save!
|
||||
importar([linha_do_plano(nf: '1')])
|
||||
|
||||
importar([linha_do_plano(nf: '1'), linha_do_plano(nf: '2', ordem: 2)])
|
||||
|
||||
expect(editada.reload.removido_em).to be_nil
|
||||
end
|
||||
|
||||
it 'descarta a NF repetida no plano e reporta, em vez de duplicar a parada' do
|
||||
resultado = importar([linha_do_plano(nf: '1', nome: 'PRIMEIRO'),
|
||||
linha_do_plano(nf: '1', nome: 'SEGUNDO', ordem: 2)])
|
||||
|
||||
expect(romaneio.romaneio_linhas.count).to eq(1)
|
||||
expect(romaneio.romaneio_linhas.first.nome).to eq('PRIMEIRO')
|
||||
expect(resultado.duplicados).to eq(1)
|
||||
end
|
||||
|
||||
it 'não colide duas paradas sem NF (a chave cai para o digest do título)' do
|
||||
sem_nf = linha_do_plano(nf: '').merge(titulo: 'PONTO DE APOIO')
|
||||
outra = linha_do_plano(nf: '', endereco: 'RUA Z, 9', ordem: 2).merge(titulo: 'OUTRO PONTO')
|
||||
|
||||
expect { importar([sem_nf, outra]) }.not_to raise_error
|
||||
expect(romaneio.romaneio_linhas.count).to eq(2)
|
||||
end
|
||||
|
||||
it 'apaga a folha do veículo que sumiu do plano' do
|
||||
importar([linha_do_plano(nf: '1'), linha_do_plano(nf: '2', veiculo: 'GADE_002')])
|
||||
|
||||
importar([linha_do_plano(nf: '1')])
|
||||
|
||||
expect(romaneio.romaneio_veiculos.pluck(:veiculo)).to eq(['GADE_001'])
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user