Skip to content

Commit

Permalink
#4 - Adicionado informações de Pagamento e Cobrança para NFC-e e NF-e…
Browse files Browse the repository at this point in the history
…. Criado as tags para Cobrança e Pagamento
  • Loading branch information
Brunomm committed Nov 8, 2016
1 parent aaaa216 commit 10ac181
Show file tree
Hide file tree
Showing 23 changed files with 843 additions and 35 deletions.
83 changes: 50 additions & 33 deletions lib/br_nfe.rb
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,12 @@ def self.only_number(value)

module Product
extend ActiveSupport::Autoload
module Cobranca
extend ActiveSupport::Autoload
autoload :Fatura
autoload :Duplicata
autoload :Pagamento
end
module Transporte
extend ActiveSupport::Autoload
autoload :Base
Expand Down Expand Up @@ -213,45 +219,56 @@ module Gateway
mattr_accessor :condicao_pagamento_class
@@condicao_pagamento_class = BrNfe::CondicaoPagamento

# Definição de classes padrões para NFS-e
mattr_accessor :emitente_service_class
@@emitente_service_class = BrNfe::Service::Emitente
mattr_accessor :destinatario_service_class
@@destinatario_service_class = BrNfe::Service::Destinatario
mattr_accessor :intermediario_service_class
@@intermediario_service_class = BrNfe::Service::Intermediario
mattr_accessor :rps_class
@@rps_class = BrNfe::Service::Rps
mattr_accessor :service_item_class
@@service_item_class = BrNfe::Service::Item

# Definição de classes padrões para NF-e
mattr_accessor :destinatario_product_class
@@destinatario_product_class = BrNfe::Product::Destinatario
mattr_accessor :emitente_product_class
@@emitente_product_class = BrNfe::Product::Emitente
mattr_accessor :nota_fiscal_product_class
@@nota_fiscal_product_class = BrNfe::Product::NotaFiscal

############################ TRANSPORTE ############################
mattr_accessor :transporte_product_class
@@transporte_product_class = BrNfe::Product::Transporte::Base

mattr_accessor :veiculo_product_class
@@veiculo_product_class = BrNfe::Product::Transporte::Veiculo

mattr_accessor :volume_transporte_product_class
@@volume_transporte_product_class = BrNfe::Product::Transporte::Volume

mattr_accessor :transportador_product_class
@@transportador_product_class = BrNfe::Product::Transporte::Transportador

mattr_accessor :client_wsdl_log
@@client_wsdl_log = false

mattr_accessor :client_wsdl_pretty_print_xml
@@client_wsdl_pretty_print_xml = false

#################################################################################
################### DEFINIÇÃO DE CLASSES PADRÕES PARA NFS-e #####################
mattr_accessor :emitente_service_class
@@emitente_service_class = BrNfe::Service::Emitente
mattr_accessor :destinatario_service_class
@@destinatario_service_class = BrNfe::Service::Destinatario
mattr_accessor :intermediario_service_class
@@intermediario_service_class = BrNfe::Service::Intermediario
mattr_accessor :rps_class
@@rps_class = BrNfe::Service::Rps
mattr_accessor :service_item_class
@@service_item_class = BrNfe::Service::Item

#################################################################################
################### DEFINIÇÃO DE CLASSES PADRÕES PARA NF-E ######################
mattr_accessor :destinatario_product_class
@@destinatario_product_class = BrNfe::Product::Destinatario
mattr_accessor :emitente_product_class
@@emitente_product_class = BrNfe::Product::Emitente
mattr_accessor :nota_fiscal_product_class
@@nota_fiscal_product_class = BrNfe::Product::NotaFiscal

############################# COBRANÇA #############################
mattr_accessor :duplicata_product_class
@@duplicata_product_class = BrNfe::Product::Cobranca::Duplicata
mattr_accessor :fatura_product_class
@@fatura_product_class = BrNfe::Product::Cobranca::Fatura
mattr_accessor :pagamento_product_class
@@pagamento_product_class = BrNfe::Product::Cobranca::Pagamento

############################ TRANSPORTE ############################
mattr_accessor :transporte_product_class
@@transporte_product_class = BrNfe::Product::Transporte::Base

mattr_accessor :veiculo_product_class
@@veiculo_product_class = BrNfe::Product::Transporte::Veiculo

mattr_accessor :volume_transporte_product_class
@@volume_transporte_product_class = BrNfe::Product::Transporte::Volume

mattr_accessor :transportador_product_class
@@transportador_product_class = BrNfe::Product::Transporte::Transportador


def self.setup
yield self
end
Expand Down
2 changes: 2 additions & 0 deletions lib/br_nfe/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,7 @@ module Constants
'TO', # Tocantins
'EX' # Exterior
]

FORMAS_PAGAMENTO = [1, 2, 3, 4, 5, 10, 11, 12, 13, 99, '1', '2', '3', '4', '5', '01', '02', '03', '04', '05', '10', '11', '12', '13', '99']
end
end
36 changes: 36 additions & 0 deletions lib/br_nfe/product/cobranca/duplicata.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module BrNfe
module Product
module Cobranca
class Duplicata < BrNfe::ActiveModelBase
# Número da duplicata
#
# <b>Type: </b> _String_
# <b>Max: </b> _60_
# <b>Required: </b> _No_
# <b>Exemplo: </b> _DUP646498_
#
attr_accessor :numero_duplicata

# Valor da duplicata
#
# <b>Type: </b> _Float_
# <b>Required: </b> _No_
# <b>Exemplo: </b> _1500.50_
#
attr_accessor :total

# Data do vencimento da duplicata
#
# <b>Type: </b> _Date_
# <b>Required: </b> _Yes_
# <b>Exemplo: </b> _Date.tomorrow_
#
attr_accessor :vencimento

validates :total, presence: true
validates :total, numericality: {greater_than_or_equal_to: 0.0}
validates :numero_duplicata, length: {maximum: 60}
end
end
end
end
76 changes: 76 additions & 0 deletions lib/br_nfe/product/cobranca/fatura.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
module BrNfe
module Product
module Cobranca
class Fatura < BrNfe::ActiveModelBase
# Número da fatura
#
# <b>Type: </b> _String_
# <b>Max: </b> _60_
# <b>Required: </b> _No_
# <b>Exemplo: </b> _FAT646498_
#
attr_accessor :numero_fatura

# Valor original da fatura
#
# <b>Type: </b> _Float_
# <b>Required: </b> _No_
# <b>Exemplo: </b> _1500.50_
#
attr_accessor :valor_original

# Valor do desconto da fatura
#
# <b>Type: </b> _Float_
# <b>Required: </b> _No_
# <b>Exemplo: </b> _100.25_
#
attr_accessor :valor_desconto

# Valor do liquido da fatura
#
# <b>Type: </b> _Float_
# <b>Required: </b> _No_
# <b>Default: </b> _Auto_
# <b>Exemplo: </b> _1400.25_
#
attr_accessor :valor_liquido
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}

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
end
87 changes: 87 additions & 0 deletions lib/br_nfe/product/cobranca/pagamento.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
module BrNfe
module Product
module Cobranca
class Pagamento < BrNfe::ActiveModelBase
# Forma de pagamento
# 01=Dinheiro
# 02=Cheque
# 03=Cartão de Crédito
# 04=Cartão de Débito
# 05=Crédito Loja
# 10=Vale Alimentação
# 11=Vale Refeição
# 12=Vale Presente
# 13=Vale Combustível
# 99=Outros
#
# <b>Type: </b> _Number_
# <b>Size: </b> _2_
# <b>Required: </b> _Yes_
# <b>Exemplo: </b> _1_ ou _'01'_
#
attr_accessor :forma_pagamento

# Valor do pagamento
#
# <b>Type: </b> _Float_
# <b>Required: </b> _Yes_
# <b>Exemplo: </b> _1500.50_
#
attr_accessor :total

# CNPJ da Credenciadora de cartão de crédito e/ou débito
# Informar o CNPJ da Credenciadora de cartão de crédito / débito
#
# <b>Type: </b> _String_
# <b>Required: </b> _Yes_ (if forma_pagamento IN [3, 4] )
# <b>Exemplo: </b> _12.123.456/0001-88_ ou _12345678901234_
#
attr_accessor :cartao_cnpj
def cartao_cnpj
return unless @cartao_cnpj.present?
BrNfe::Helper::CpfCnpj.new(@cartao_cnpj).sem_formatacao
end

# Bandeira da operadora de cartão de crédito e/ou débito
# 01=Visa
# 02=Mastercard
# 03=American Express
# 04=Sorocred
# 99=Outros
#
# <b>Type: </b> _Number_
# <b>Required: </b> _Yes_ (if forma_pagamento IN [3, 4] )
# <b>Exemplo: </b> _1_ ou _'02'_
#
attr_accessor :cartao_bandeira

# Número de autorização da operação cartão de crédito e/ou débito.
# Identifica o número da autorização da transação da operação com
# cartão de crédito e/ou débito
#
# <b>Type: </b> _String_
# <b>Required: </b> _Yes_ (if forma_pagamento IN [3, 4] )
# <b>Exemplo: </b> _'9799844646'_
#
attr_accessor :cartao_autorizacao

validates :forma_pagamento, :total, presence: true
validates :forma_pagamento, inclusion: {in: BrNfe::Constants::FORMAS_PAGAMENTO}
validates :total, numericality: {greater_than_or_equal_to: 0.0}

with_options if: :cartao? do |record|
record.validates :cartao_cnpj, :cartao_bandeira, :cartao_autorizacao, presence: true
record.validates :cartao_cnpj, length: {maximum: 14}
record.validates :cartao_autorizacao, length: {maximum: 20}
record.validates :cartao_bandeira, inclusion: {in: [1, 2, 3, 4, 99, '1', '2', '3', '4', '01', '02', '03', '04', '99']}
end


def cartao?
forma_pagamento.to_i.in?([3, 4])
end

end
end
end
end
5 changes: 5 additions & 0 deletions lib/br_nfe/product/nf_xml_value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,11 @@ def nf_xml_value_placa placa, xml_version=:v3_10
def nf_xml_value_RNTC rntc, xml_version=:v3_10
nf_xml_value_text rntc, 20
end

def nf_xml_fixed_code code, options={}, xml_version=:v3_10
options = {size: 2}.merge(options)
"#{code.to_i}".rjust(options[:size], '0')
end
private

def only_numbers value, options={}
Expand Down
Loading

0 comments on commit 10ac181

Please sign in to comment.