Skip to content

Commit

Permalink
#4 - Criado método belongs_to e aplicado em algumas classes que utili…
Browse files Browse the repository at this point in the history
…zam esse tipo de associação.
  • Loading branch information
Brunomm committed Nov 19, 2016
1 parent 8e8cda1 commit ae6f359
Show file tree
Hide file tree
Showing 10 changed files with 190 additions and 520 deletions.
43 changes: 43 additions & 0 deletions lib/br_nfe/active_model/associations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,49 @@ def define_objects_validation_for_has_many attr_name, options
end
end
end

def belongs_to attr_name, class_name, *args
options = {null: true}.merge(args.extract_options!)

define_method attr_name do |&block|
block.call(send("#{attr_name}_force_instance")) if block
if instance_variable_get("@#{attr_name}").is_a?(eval(class_name))
instance_variable_get("@#{attr_name}")
else
if options[:null] then nil else send("#{attr_name}_force_instance") end
end
end

define_method "#{attr_name}=" do |value|
if value.is_a?(eval(class_name))
instance_variable_set("@#{attr_name}", value)
elsif value.is_a?(Hash)
send("#{attr_name}_force_instance").assign_attributes(value)
elsif value.blank?
instance_variable_set("@#{attr_name}", nil)
end
end

define_method "#{attr_name}_force_instance" do
instance_variable_set("@#{attr_name}", eval(class_name).new) unless instance_variable_get("@#{attr_name}").is_a?(eval(class_name))
instance_variable_get("@#{attr_name}")
end
end

def validate_belongs_to attr_name, *args
options = {message: "invalid_#{attr_name}".to_sym}
options.merge!(args.extract_options!)
if options[:if]
validate "#{attr_name}_validation", if: lambda{|rec| rec.send(attr_name) && rec.send(options[:if]) }
else
validate "#{attr_name}_validation", if: attr_name
end
define_method "#{attr_name}_validation" do
if send(attr_name).invalid?
send(attr_name).errors.full_messages.each { |msg| errors.add(:base, options[:message], {error_message: msg}) }
end
end
end
end
end
end
Expand Down
68 changes: 5 additions & 63 deletions lib/br_nfe/product/nfe/transporte/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,7 @@ def retencao_valor_icms
# <b>Required: </b> _No_ (Yes if forma_transporte == :veiculo)
# <b>Default: </b> _nil_
#
def veiculo
yield(veiculo_force_instance) if block_given?
@veiculo.is_a?(BrNfe.veiculo_product_class) ? @veiculo : nil
end
def veiculo=(value)
if value.is_a?(BrNfe.veiculo_product_class)
@veiculo = value
elsif value.is_a?(Hash)
veiculo_force_instance.assign_attributes(value)
elsif value.blank?
@veiculo = nil
end
end
belongs_to :veiculo, 'BrNfe.veiculo_product_class'

# Identificação da balsa (v2.0)
#
Expand Down Expand Up @@ -187,19 +175,8 @@ def veiculo=(value)
# <b>Required: </b> _No_
# <b>Default: </b> _nil_
#
def transportador
yield(transportador_force_instance) if block_given?
@transportador.is_a?(BrNfe.transportador_product_class) ? @transportador : nil
end
def transportador=(value)
if value.is_a?(BrNfe.transportador_product_class)
@transportador = value
elsif value.is_a?(Hash)
transportador_force_instance.assign_attributes(value)
elsif value.blank?
@transportador = nil
end
end
belongs_to :transportador, 'BrNfe.transportador_product_class'


def default_values
{
Expand All @@ -211,11 +188,11 @@ def default_values
validates :modalidade_frete, inclusion: [0, '0', 1, '1', 2, '2', 9, '9']
validates :forma_transporte, presence: true
validates :forma_transporte, inclusion: [:veiculo, :balsa, :vagao]
validate :transportador_validation, if: :transportador
validate_belongs_to :transportador

with_options if: :forma_transporte_veiculo? do |record|
record.validates :veiculo, presence: true
record.validate :veiculo_validation
record.validate_belongs_to :veiculo
end
validates :identificacao_balsa, presence: true, if: :forma_transporte_balsa?
validates :identificacao_vagao, presence: true, if: :forma_transporte_vagao?
Expand Down Expand Up @@ -251,41 +228,6 @@ def forma_transporte_vagao?
def calculate_retencao_valor_icms
((retencao_aliquota.to_f/100.0)*retencao_base_calculo_icms.to_f).round(2)
end

############################ VEÍCULO DE TRANSPORTE ############################
# Utilizado para validar se o veículo está valido.
# Só irá validar caso o veículo de entrega seja preenchido.
#
def veiculo_validation
if veiculo.try(:invalid?)
veiculo.errors.full_messages.each { |msg| errors.add(:base, "Veículo: #{msg}") }
end
end
# Instancía um veículo e seta na variavel @veiculo.
# É utilizado quando setar o veículo em forma da Hash ou Block
# Pois nesse caso deve sempre ter um objeto instanciado para setar os valores.
#
def veiculo_force_instance
@veiculo = BrNfe.veiculo_product_class.new unless @veiculo.is_a?(BrNfe.veiculo_product_class)
@veiculo
end
############################## TRANSPORTADOR ##############################
# Utilizado para validar se o transportador está valido.
# Só irá validar caso o transportador da entrega seja preenchido.
#
def transportador_validation
if transportador.invalid?
transportador.errors.full_messages.each { |msg| errors.add(:base, :invalid_transportador, {error_message: msg}) }
end
end
# Instancía um transportador e seta na variavel @transportador.
# É utilizado quando setar o transportador em forma da Hash ou Block
# Pois nesse caso deve sempre ter um objeto instanciado para setar os valores.
#
def transportador_force_instance
@transportador = BrNfe.transportador_product_class.new unless @transportador.is_a?(BrNfe.transportador_product_class)
@transportador
end
end
end
end
Expand Down
145 changes: 11 additions & 134 deletions lib/br_nfe/product/nota_fiscal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -221,20 +221,8 @@ def consumidor_final
# <b>Required: </b> _No_
# <b>Default: </b> _nil_
#
def endereco_retirada
yield(endereco_retirada_force_instance) if block_given?
@endereco_retirada.is_a?(BrNfe.endereco_class) ? @endereco_retirada : nil
end
def endereco_retirada=(value)
if value.is_a?(BrNfe.endereco_class)
@endereco_retirada = value
elsif value.is_a?(Hash)
endereco_retirada_force_instance.assign_attributes(value)
elsif value.blank?
@endereco_retirada = nil
end
end

belongs_to :endereco_retirada, 'BrNfe.endereco_class'

# CPF ou CNPJ do local de retirada da mercadoria.
# Só é obrigatório se o endereco_retirada for preenchido
#
Expand All @@ -256,20 +244,8 @@ def endereco_retirada_cpf_cnpj
# <b>Required: </b> _No_
# <b>Default: </b> _nil_
#
def endereco_entrega
yield(endereco_entrega_force_instance) if block_given?
@endereco_entrega.is_a?(BrNfe.endereco_class) ? @endereco_entrega : nil
end
def endereco_entrega=(value)
if value.is_a?(BrNfe.endereco_class)
@endereco_entrega = value
elsif value.is_a?(Hash)
endereco_entrega_force_instance.assign_attributes(value)
elsif value.blank?
@endereco_entrega = nil
end
end

belongs_to :endereco_entrega, 'BrNfe.endereco_class'

# CPF ou CNPJ do local de entrega da mercadoria.
# Só é obrigatório se o endereco_entrega for preenchido
#
Expand Down Expand Up @@ -304,19 +280,7 @@ def autorizados_download_xml
# <b>Required: </b> _No_
# <b>Default: </b> _nil_
#
def transporte
yield(transporte_force_instance) if block_given?
@transporte.is_a?(BrNfe.transporte_product_class) ? @transporte : nil
end
def transporte=(value)
if value.is_a?(BrNfe.transporte_product_class)
@transporte = value
elsif value.is_a?(Hash)
transporte_force_instance.assign_attributes(value)
elsif value.blank?
@transporte = nil
end
end
belongs_to :transporte, 'BrNfe.transporte_product_class'

# Dados da cobrança da NF-e
# Fatura e Duplicatas da Nota Fiscal
Expand All @@ -331,20 +295,8 @@ def transporte=(value)
# <b>Default: </b> _nil_
# <b>Exemplo: </b> _BrNfe::Product::Nfe::Cobranca::Fatura.new(numero_fatura: 'FAT646498'...)_
#
def fatura
yield(fatura_force_instance) if block_given?
@fatura.is_a?(BrNfe.fatura_product_class) ? @fatura : nil
end
def fatura=(value)
if value.is_a?(BrNfe.fatura_product_class)
@fatura = value
elsif value.is_a?(Hash)
fatura_force_instance.assign_attributes(value)
elsif value.blank?
@fatura = nil
end
end

belongs_to :fatura, 'BrNfe.fatura_product_class'

# Array com as informações dos pagamentos
# IMPORTANTE: Utilizado apenas para NFC-e
#
Expand Down Expand Up @@ -432,24 +384,19 @@ def default_values

validates :autorizados_download_xml, length: { maximum: 10 }

validate :transporte_validation, if: :transporte
validate :fatura_validation, if: :fatura
validate_belongs_to :transporte
validate_belongs_to :fatura

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

validate_belongs_to :endereco_retirada
with_options if: :endereco_retirada do |record|
record.validates :endereco_retirada_cpf_cnpj, presence: true
record.validates :endereco_retirada_cpf_cnpj, length: {maximum: 14}
record.validate :endereco_retirada_validation
end

validate_belongs_to :endereco_entrega
with_options if: :endereco_entrega do |record|
record.validates :endereco_entrega_cpf_cnpj, presence: true
record.validates :endereco_entrega_cpf_cnpj, length: {maximum: 14}
record.validate :endereco_entrega_validation
end


Expand All @@ -470,76 +417,6 @@ def emitente_class
BrNfe.emitente_product_class
end

################################ ENDEREÇO DE RETIRADA ################################
# Utilizado para validar se o endereço de retirada está valido.
# Só irá validar caso o endereço de retirada seja preenchidp.
#
def endereco_retirada_validation
if endereco_retirada.invalid?
endereco_retirada.errors.full_messages.each { |msg| errors.add(:base, "Endereço de retirada: #{msg}") }
end
end
# Instancía um endereço de retirada e seta na variavé @endereco_retirada.
# É utilizado quando setar o endereço em forma da Hash ou Block
#
def endereco_retirada_force_instance
@endereco_retirada = BrNfe.endereco_class.new unless @endereco_retirada.is_a?(BrNfe.endereco_class)
@endereco_retirada
end

################################ ENDEREÇO DE ENTREGA ################################
# Utilizado para validar se o endereço de entrega está valido.
# Só irá validar caso o endereço de entrega seja preenchidp.
#
def endereco_entrega_validation
if endereco_entrega.invalid?
endereco_entrega.errors.full_messages.each { |msg| errors.add(:base, "Endereço de entrega: #{msg}") }
end
end
# Instancía um endereço de entrega e seta na variavé @endereco_entrega.
# É utilizado quando setar o endereço em forma da Hash ou Block
#
def endereco_entrega_force_instance
@endereco_entrega = BrNfe.endereco_class.new unless @endereco_entrega.is_a?(BrNfe.endereco_class)
@endereco_entrega
end

############################## TRANSPORTE ##############################
# Utilizado para validar se o transporte está valido.
# Só irá validar caso o transporte da entrega seja preenchido.
#
def transporte_validation
if transporte.invalid?
transporte.errors.full_messages.each { |msg| errors.add(:base, :invalid_transporte, {error_message: msg}) }
end
end
# Instancía um transporte e seta na variavel @transporte.
# É utilizado quando setar o transporte em forma da Hash ou Block
# Pois nesse caso deve sempre ter um objeto instanciado para setar os valores.
#
def transporte_force_instance
@transporte = BrNfe.transporte_product_class.new unless @transporte.is_a?(BrNfe.transporte_product_class)
@transporte
end

############################## FATURA ##############################
# Utilizado para validar se a fatura está valido.
# Só irá validar caso a fatura da entrega seja preenchido.
#
def fatura_validation
if fatura.invalid?
fatura.errors.full_messages.each { |msg| errors.add(:base, :invalid_fatura, {error_message: msg}) }
end
end
# Instancía uma fatura e seta na variavel @fatura.
# É utilizado quando setar a fatura em forma da Hash ou Block
# Pois nesse caso deve sempre ter um objeto instanciado para setar os valores.
#
def fatura_force_instance
@fatura = BrNfe.fatura_product_class.new unless @fatura.is_a?(BrNfe.fatura_product_class)
@fatura
end

###############################################################################################
# | Código | AAMM da | CNPJ do | Modelo | Série | Número | Cód. tipo | Código | DV |
# | da UF | emissão | Emitente | | | da NF-e | emissão | Numérico | |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ en:
errors:
models:
br_nfe/product/nfe/transporte/base:
invalid_veiculo: 'Vehicle: %{error_message}'
invalid_reboque: 'Reboque %{index}: %{error_message}'
invalid_volume: 'Volume %{index}: %{error_message}'
invalid_transportador: 'Shipping company: %{error_message}'
2 changes: 2 additions & 0 deletions lib/config/locales/br_nfe/en/product/nota_fiscal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ en:
invalid_transporte: 'Transport: %{error_message}'
invalid_fatura: 'Billing Invoice: %{error_message}'
invalid_pagamento: 'Payment %{index}: %{error_message}'
invalid_endereco_retirada: 'Withdrawal address: %{error_message}'
invalid_endereco_entrega: 'Delivery address: %{error_message}'
attributes:
autorizados_download_xml:
too_long: "exceeded the maximum limit of %{count} CPF/CNPJ's"
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ pt-BR:
br_nfe/product/nfe/transporte/base:
invalid_reboque: 'Reboque %{index}: %{error_message}'
invalid_volume: 'Volume %{index}: %{error_message}'
invalid_transportador: 'Transportadora: %{error_message}'
invalid_transportador: 'Transportadora: %{error_message}'
invalid_veiculo: 'Veículo: %{error_message}'
2 changes: 2 additions & 0 deletions lib/config/locales/br_nfe/pt-BR/product/nota_fiscal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ pt-BR:
invalid_transporte: 'Transporte: %{error_message}'
invalid_fatura: 'Fatura: %{error_message}'
invalid_pagamento: 'Pagamento %{index}: %{error_message}'
invalid_endereco_retirada: 'Endereço de retirada: %{error_message}'
invalid_endereco_entrega: 'Endereço de entrega: %{error_message}'
attributes:
autorizados_download_xml:
too_long: 'excedeu o limite máximo de %{count} CPF/CNPJ'
Loading

0 comments on commit ae6f359

Please sign in to comment.