Skip to content

Commit

Permalink
#4 - Ajustado classes que utilizam associaçoes has_many para utilizar…
Browse files Browse the repository at this point in the history
… a definição da associação a partir do helper criado 'has_many'
  • Loading branch information
Brunomm committed Nov 18, 2016
1 parent e1b1dce commit 8e8cda1
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 214 deletions.
29 changes: 3 additions & 26 deletions lib/br_nfe/product/nfe/cobranca/fatura.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,37 +40,14 @@ def valor_liquido
@valor_liquido || calculate_valor_liquido
end

attr_accessor :duplicatas
def duplicatas
arry = [@duplicatas].flatten.reject(&:blank?)
arry_ok = arry.select{|v| v.is_a?(BrNfe.duplicata_product_class) }
arry.select!{|v| v.is_a?(Hash) }
arry.map{ |hash| arry_ok.push(BrNfe.duplicata_product_class.new(hash)) }
@duplicatas = arry_ok
@duplicatas
end

validate :duplicatas_validations
validates :duplicatas, length: {maximum: 120}
has_many :duplicatas, 'BrNfe.duplicata_product_class',
validations: :invalid_duplicata,
length: {maximum: 120}

private
def calculate_valor_liquido
valor_original.to_f - valor_desconto.to_f
end

############################ DUPLICATAS ############################
# Adiciona os erros das duplicatas no objeto
#
def duplicatas_validations
duplicatas.select(&:invalid?).each_with_index do |duplicata, i|
add_duplicata_errors(duplicata, i+1)
end
end
def add_duplicata_errors(duplicata, index)
duplicata.errors.full_messages.each do |message|
errors.add(:base, :invalid_duplicata, {index: index, error_message: message})
end
end
end
end
end
Expand Down
35 changes: 3 additions & 32 deletions lib/br_nfe/product/nfe_autorizacao.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,9 @@ class NfeAutorizacao < BrNfe::Product::Base
# <b>Max: </b> _50_
# <b>Default: </b> _[]_
#
attr_accessor :notas_fiscais
def notas_fiscais
arry = [@notas_fiscais].flatten.compact.reject(&:blank?)
arry_ok = arry.select{|v| v.is_a?(BrNfe.nota_fiscal_product_class) }
arry.select!{|v| v.is_a?(Hash) }
arry.map{ |hash| arry_ok.push(BrNfe.nota_fiscal_product_class.new(hash)) }
@notas_fiscais = arry_ok
@notas_fiscais
end

def initialize(attributes = {})
self.notas_fiscais = []
super
end

validates :notas_fiscais, length: {minimum: 1, maximum: 50}
validate :notas_fiscais_valdiations
has_many :notas_fiscais, 'BrNfe.nota_fiscal_product_class',
validations: :invalid_invoice,
length: {minimum: 1, maximum: 50}

# URL que será setada no atribto xmlns do XML;
# Ex:
Expand Down Expand Up @@ -75,21 +61,6 @@ def ssl_version
def xml_builder
render_xml 'nfe_autorizacao'
end

private

# Adiciona os erros das notas fiscais no objeto
#
def notas_fiscais_valdiations
notas_fiscais.select(&:invalid?).each_with_index do |nf, i|
add_nf_errors(nf)
end
end
def add_nf_errors(nf)
nf.errors.full_messages.each do |message|
errors.add(:base, :invalid_invoice, {number: nf.numero_nf, nf_message: message})
end
end
end
end
end
35 changes: 9 additions & 26 deletions lib/br_nfe/product/nota_fiscal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -368,15 +368,11 @@ def fatura=(value)
# <b>Max: </b> _100_
# <b>Default: </b> _[]_
#
attr_accessor :pagamentos
def pagamentos
arry = [@pagamentos].flatten.reject(&:blank?)
arry_ok = arry.select{|v| v.is_a?(BrNfe.pagamento_product_class) }
arry.select!{|v| v.is_a?(Hash) }
arry.map{ |hash| arry_ok.push(BrNfe.pagamento_product_class.new(hash)) }
@pagamentos = arry_ok
@pagamentos
end
has_many :pagamentos, 'BrNfe.pagamento_product_class',
validations: :invalid_pagamento,
length: {maximum: 100},
validations_condition: :nfce?,
length_condition: :nfce?

def default_values
{
Expand Down Expand Up @@ -439,10 +435,10 @@ def default_values
validate :transporte_validation, if: :transporte
validate :fatura_validation, if: :fatura

with_options if: :nfce? do |record|
record.validates :pagamentos, length: {maximum: 100}
record.validate :pagamentos_validations
end
# with_options if: :nfce? do |record|
# record.validates :pagamentos, length: {maximum: 100}
# record.validate :pagamentos_validations
# end

with_options if: :endereco_retirada do |record|
record.validates :endereco_retirada_cpf_cnpj, presence: true
Expand Down Expand Up @@ -543,19 +539,6 @@ def fatura_force_instance
@fatura = BrNfe.fatura_product_class.new unless @fatura.is_a?(BrNfe.fatura_product_class)
@fatura
end
############################ PAGAMENTOS ############################
# Adiciona os erros dos pagamentos no objeto
#
def pagamentos_validations
pagamentos.select(&:invalid?).each_with_index do |pagamento, i|
add_pagamento_errors(pagamento, i+1)
end
end
def add_pagamento_errors(pagamento, index)
pagamento.errors.full_messages.each do |message|
errors.add(:base, :invalid_pagamento, {index: index, error_message: message})
end
end

###############################################################################################
# | Código | AAMM da | CNPJ do | Modelo | Série | Número | Cód. tipo | Código | DV |
Expand Down
2 changes: 1 addition & 1 deletion lib/config/locales/br_nfe/en/product/nfe_autorizacao.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ en:
errors:
models:
br_nfe/product/nfe_autorizacao:
invalid_invoice: 'Invoice %{number}: %{nf_message}'
invalid_invoice: 'Invoice %{index}: %{error_message}'
attributes:
notas_fiscais:
too_long: 'exceeded the maximum limit of %{count} invoices'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pt-BR:
errors:
models:
br_nfe/product/nfe_autorizacao:
invalid_invoice: 'Nota fiscal %{number}: %{nf_message}'
invalid_invoice: 'Nota fiscal %{index}: %{error_message}'
attributes:
notas_fiscais:
too_long: 'excedeu o limite máximo de %{count} notas fiscais'
Expand Down
57 changes: 4 additions & 53 deletions test/br_nfe/product/nfe/cobranca/fatura_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,10 @@
subject { FactoryGirl.build(:product_cobranca_fatura) }
let(:duplicata) { FactoryGirl.build(:product_cobranca_duplicata) }

describe "Validations" do
describe '#duplicatas' do
it 'Deve ter no máximo 5 duplicatas' do
MiniTest::Spec.string_for_validation_length = [BrNfe.duplicata_product_class.new]
must validate_length_of(:duplicatas).is_at_most(120)
MiniTest::Spec.string_for_validation_length = 'x'
end

it "Se tiver mais que 1 duplicata e pelo menos 1 deles não for válido deve adiiconar o erro do duplicata no objeto" do
duplicata.stubs(:valid?).returns(true)
duplicata2 = duplicata.dup
duplicata2.errors.add(:base, 'Erro do duplicata 2')
duplicata2.stubs(:valid?).returns(false)
duplicata3 = duplicata.dup
duplicata3.errors.add(:base, 'Erro do duplicata 3')
duplicata3.stubs(:valid?).returns(false)
subject.duplicatas = [duplicata, duplicata2, duplicata3]

must_be_message_error :base, :invalid_duplicata, {index: 2, error_message: 'Erro do duplicata 2'}
must_be_message_error :base, :invalid_duplicata, {index: 3, error_message: 'Erro do duplicata 3'}, false
end
end
describe '#duplicatas' do
it { must_validate_length_has_many(:duplicatas, BrNfe.duplicata_product_class, {maximum: 120}) }
it { must_validates_has_many(:duplicatas, BrNfe.duplicata_product_class, :invalid_duplicata) }
it { must_have_many(:duplicatas, BrNfe.duplicata_product_class, {numero_duplicata: 'XXL9999', total: 500.10}) }
end

describe '#valor_liquido' do
Expand All @@ -40,35 +22,4 @@
subject.valor_liquido.must_equal 90.0
end
end

describe '#duplicatas' do
it "deve inicializar o objeto com um Array" do
subject.class.new.duplicatas.must_be_kind_of Array
end
it "deve aceitar apenas objetos da class Hash ou Veiculo" do
dup_hash = {numero_duplicata: 'XXL9877', total: 15.47}
subject.duplicatas = [duplicata, 1, 'string', nil, {}, [], :symbol, dup_hash, true]
subject.duplicatas.size.must_equal 2
subject.duplicatas[0].must_equal duplicata

subject.duplicatas[1].numero_duplicata.must_equal 'XXL9877'
subject.duplicatas[1].total.must_equal 15.47
end
it "posso adicionar notas fiscais com <<" do
new_object = subject.class.new
new_object.duplicatas << duplicata
new_object.duplicatas << 1
new_object.duplicatas << nil
new_object.duplicatas << {numero_duplicata: 'XXL9999', total: 22.30}
new_object.duplicatas << {numero_duplicata: 'XXL1111', total: 80.0}

new_object.duplicatas.size.must_equal 3
new_object.duplicatas[0].must_equal duplicata

new_object.duplicatas[1].numero_duplicata.must_equal 'XXL9999'
new_object.duplicatas[1].total.must_equal 22.30
new_object.duplicatas[2].numero_duplicata.must_equal 'XXL1111'
new_object.duplicatas[2].total.must_equal 80.0
end
end
end
53 changes: 4 additions & 49 deletions test/br_nfe/product/nfe_autorizacao_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,10 @@
subject.stubs(:gateway).returns(gateway)
end

context 'validations' do
describe '#notas_fiscais' do
it 'Deve ter no mínimo 1 e no máximo 50 notas fiscais' do
MiniTest::Spec.string_for_validation_length = [BrNfe::Product::NotaFiscal.new]
must validate_length_of(:notas_fiscais).is_at_most(50).is_at_least(1)
MiniTest::Spec.string_for_validation_length = ''
end

it "Se tiver mais que 1 NF-e e pelo menos 1 delas não for válida deve adiiconar o erro da NF no objeto" do
nota_fiscal.stubs(:valid?).returns(true)
nf2 = FactoryGirl.build(:product_nota_fiscal, numero_nf: 356)
nf2.errors.add(:base, 'Erro da Nota fiscal')
nf2.stubs(:valid?).returns(false)
subject.notas_fiscais = [nota_fiscal, nf2]

must_be_message_error :base, :invalid_invoice, {number: 356, nf_message: 'Erro da Nota fiscal'}
end
end
describe '#notas_fiscais' do
it { must_validate_length_has_many(:notas_fiscais, BrNfe.nota_fiscal_product_class, {minimum: 1, maximum: 50}) }
it { must_validates_has_many(:notas_fiscais, BrNfe.nota_fiscal_product_class, :invalid_invoice) }
it { must_have_many(:notas_fiscais, BrNfe.nota_fiscal_product_class, {codigo_nf: '1233', serie: '1'}) }
end

it 'o método #url_xmlns deve pegar o valor do método url_xmlns_autorizacao do gateway ' do
Expand All @@ -49,37 +35,6 @@
subject.gateway_xml_version.must_equal :v3_20
end

describe '#notas_fiscais' do
it "deve inicializar o objeto com um Array" do
subject.class.new.instance_variable_get(:@notas_fiscais).must_be_kind_of Array
end
it "deve aceitar apenas objetos da class Hash ou NotaFiscal" do
nf_hash = {serie: 1, numero_nf: 1146}
subject.notas_fiscais = [nota_fiscal, 1, 'string', nil, {}, [], :symbol, nf_hash, true]
subject.notas_fiscais.size.must_equal 2
subject.notas_fiscais[0].must_equal nota_fiscal

subject.notas_fiscais[1].serie.must_equal 1
subject.notas_fiscais[1].numero_nf.must_equal 1146
end
it "posso adicionar notas fiscais com <<" do
new_object = subject.class.new
new_object.notas_fiscais << nota_fiscal
new_object.notas_fiscais << 1
new_object.notas_fiscais << nil
new_object.notas_fiscais << {serie: 500, numero_nf: 223}
new_object.notas_fiscais << {serie: 700, numero_nf: 800}

new_object.notas_fiscais.size.must_equal 3
new_object.notas_fiscais[0].must_equal nota_fiscal

new_object.notas_fiscais[1].serie.must_equal 500
new_object.notas_fiscais[1].numero_nf.must_equal 223
new_object.notas_fiscais[2].serie.must_equal 700
new_object.notas_fiscais[2].numero_nf.must_equal 800
end
end

# describe '#xml_builder' do
# it "deve renderizar para o xml nfe_autorizacao" do
# subject.expects(:render_xml).with('nfe_autorizacao').returns('<ok>1</ok>')
Expand Down
37 changes: 12 additions & 25 deletions test/br_nfe/product/nota_fiscal_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -147,32 +147,19 @@
end

describe '#pagamentos' do
before do
MiniTest::Spec.string_for_validation_length = [BrNfe.pagamento_product_class.new]
end
after do
MiniTest::Spec.string_for_validation_length = 'x'
end
context 'Deve aplicar a validação dos pagamentos se for uma NFC-e' do
before { subject.modelo_nf = '65' }
it 'Deve ter no máximo 100 pagamentos' do
must validate_length_of(:pagamentos).is_at_most(100)
end

it "Se tiver mais que 1 pagamento e pelo menos 1 deles não for válido deve adiiconar o erro do pagamento no objeto" do
pagamento.stubs(:valid?).returns(true)
pagamento2 = pagamento.dup
pagamento2.errors.add(:base, 'Erro do pagamento 2')
pagamento2.stubs(:valid?).returns(false)
pagamento3 = pagamento.dup
pagamento3.errors.add(:base, 'Erro do pagamento 3')
pagamento3.stubs(:valid?).returns(false)
subject.pagamentos = [pagamento, pagamento2, pagamento3]
it { must_validate_length_has_many(:pagamentos,
BrNfe.pagamento_product_class,
maximum: 100,
condition: :nfce?
)}

it { must_validates_has_many(:pagamentos,
BrNfe.pagamento_product_class,
:invalid_pagamento,
condition: :nfce?
)}

must_be_message_error :base, :invalid_pagamento, {index: 2, error_message: 'Erro do pagamento 2'}
must_be_message_error :base, :invalid_pagamento, {index: 3, error_message: 'Erro do pagamento 3'}, false
end
end
it { must_have_many(:pagamentos, BrNfe.pagamento_product_class, {forma_pagamento: '1', total: 350.00}) }
context 'Não deve aplicar a validação dos pagamentos se for uma NF-e' do
before { subject.modelo_nf = '55' }
it 'Não deve validar o máximo de 100 pagamentos' do
Expand Down
16 changes: 15 additions & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,11 @@ def must_validate_length_has_many attribute, class_name, *args
MiniTest::Spec.string_for_validation_length = 'x'
end

def must_validates_has_many attribute, class_name, translation
def must_validates_has_many attribute, class_name, translation, *args
options = {
condition: false
}.merge(args.extract_options!)

object1 = class_name.new
object2 = class_name.new
object3 = class_name.new
Expand All @@ -184,8 +188,18 @@ def must_validates_has_many attribute, class_name, translation

subject.send("#{attribute}=", [object1, object2, object3])

if options[:condition]
subject.stubs(options[:condition]).returns(true)
end

must_be_message_error :base, translation, {index: 2, error_message: 'Erro do object 2'}
must_be_message_error :base, translation, {index: 3, error_message: 'Erro do object 3'}, false

if options[:condition]
subject.stubs(options[:condition]).returns(false)
wont_be_message_error :base, translation, {index: 2, error_message: 'Erro do object 2'}
wont_be_message_error :base, translation, {index: 3, error_message: 'Erro do object 3'}, false
end
end

def must_have_many attribute, class_name, attrs={}
Expand Down

0 comments on commit 8e8cda1

Please sign in to comment.