# -*- encoding: utf-8 -*- module Bbrcobranca module Remessa class Pagamento include Bbrcobranca::Validations # REQUERIDO: nosso numero attr_accessor :nosso_numero # REQUERIDO: data do vencimento do boleto attr_accessor :data_vencimento # REQUERIDO: data de emissao do boleto attr_accessor :data_emissao # REQUERIDO: valor do boleto attr_accessor :valor # REQUERIDO: documento do sacado (cliente) attr_accessor :documento_sacado # REQUERIDO: nome do sacado (cliente) attr_accessor :nome_sacado # REQUERIDO: endereco do sacado (cliente) attr_accessor :endereco_sacado # REQUERIDO: bairro do sacado (cliente) attr_accessor :bairro_sacado # REQUERIDO: CEP do sacado (cliente) attr_accessor :cep_sacado # REQUERIDO: cidade do sacado (cliente) attr_accessor :cidade_sacado # REQUERIDO: UF do sacado (cliente) attr_accessor :uf_sacado # REQUERIDO: Código da ocorrência attr_accessor :identificacao_ocorrencia # OPCIONAL: nome do avalista attr_accessor :nome_avalista # OPCIONAL: documento do avalista attr_accessor :documento_avalista # OPCIONAL: codigo da 1a instrucao attr_accessor :cod_primeira_instrucao # OPCIONAL: codigo da 2a instrucao attr_accessor :cod_segunda_instrucao # OPCIONAL: valor da mora ao dia attr_accessor :valor_mora # OPCIONAL: data limite para o desconto attr_accessor :data_desconto # OPCIONAL: valor a ser concedido de desconto attr_accessor :valor_desconto # OPCIONAL: codigo do desconto (para CNAB240) attr_accessor :cod_desconto # OPCIONAL: valor do IOF attr_accessor :valor_iof # OPCIONAL: valor do abatimento attr_accessor :valor_abatimento # OPCIONAL: Número do Documento de Cobrança - Número adotado e controlado pelo Cliente, # para identificar o título de cobrança. # Informação utilizada para referenciar a identificação do documento objeto de cobrança. # Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice, # no caso de cobrança de seguros, etc attr_accessor :numero # OPCIONAL: Número utilizado para controle do beneficiário/cedente attr_accessor :documento # OPCIONAL: data limite para o desconto attr_accessor :data_segundo_desconto # OPCIONAL: valor a ser concedido de desconto attr_accessor :valor_segundo_desconto # OPCIONAL: espécie do título attr_accessor :especie_titulo # OPCIONAL: código da multa attr_accessor :codigo_multa # OPCIONAL: Percentual multa por atraso % attr_accessor :percentual_multa # OPCIONAL: Data para cobrança de multa attr_accessor :data_multa # OPCIONAL: tipo de mora (diário, mensal) attr_accessor :tipo_mora # OPCIONAL: Data para cobrança de mora attr_accessor :data_mora # OPCIONAL: codigo dos juros attr_accessor :codigo_juros # OPCIONAL: codigo do protesto attr_accessor :codigo_protesto # OPCIONAL: dias para protesto attr_accessor :dias_protesto # OPCIONAL: codigo baixa attr_accessor :codigo_baixa # OPCIONAL: dias para baixa attr_accessor :dias_baixa # OPCIONAL: Número da Parcela attr_accessor :parcela validates_presence_of :nosso_numero, :data_vencimento, :valor, :documento_sacado, :nome_sacado, :endereco_sacado, :cep_sacado, :cidade_sacado, :uf_sacado, message: 'não pode estar em branco.' validates_length_of :uf_sacado, is: 2, message: 'deve ter 2 dígitos.' validates_length_of :cep_sacado, is: 8, message: 'deve ter 8 dígitos.' validates_length_of :cod_desconto, is: 1, message: 'deve ter 1 dígito.' validates_length_of :especie_titulo, is: 2, message: 'deve ter 2 dígitos.', allow_blank: true validates_length_of :identificacao_ocorrencia, is: 2, message: 'deve ter 2 dígitos.' # Nova instancia da classe Pagamento # # @param campos [Hash] # def initialize(campos = {}) padrao = { data_emissao: Date.current, data_segundo_desconto:'00-00-00', tipo_mora: "3", valor_mora: 0.0, valor_desconto: 0.0, valor_segundo_desconto: 0.0, valor_iof: 0.0, valor_abatimento: 0.0, nome_avalista: '', cod_desconto: '0', especie_titulo: '01', identificacao_ocorrencia: '01', codigo_multa: '0', percentual_multa: 0.0, parcela: '01', codigo_protesto: '3', dias_protesto: '00', codigo_baixa: '0', dias_baixa: '000', cod_primeira_instrucao: '00', cod_segunda_instrucao: '00' } campos = padrao.merge!(campos) campos.each do |campo, valor| send "#{campo}=", valor end yield self if block_given? end # Formata a data de desconto de acordo com o formato passado # # @return [String] # def formata_data_desconto(formato = '%d%m%y') data_desconto.strftime(formato) rescue if formato == '%d%m%y' '000000' else '00000000' end end # Formata a data de segundo desconto de acordo com o formato passado # # @return [String] # def formata_data_segundo_desconto(formato = '%d%m%y') data_segundo_desconto.strftime(formato) rescue if formato == '%d%m%y' '000000' else '00000000' end end # Formata a valor do percentual da multa # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # # @return [String] # def formata_percentual_multa(tamanho = 4) format_value(percentual_multa, tamanho) end # Formata a data de cobrança da multa # # @return [String] # def formata_data_multa(formato = '%d%m%y') data_multa.strftime(formato) rescue if formato == '%d%m%y' '000000' else '00000000' end end # Formata o campo valor # referentes as casas decimais # exe. R$199,90 => 0000000019990 # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor(tamanho = 13) format_value(valor, tamanho) end def documento_ou_numero documento.present? ? documento : numero end def formata_documento_ou_numero(tamanho = 25, caracter = ' ') doc = documento_ou_numero.to_s.gsub(/[^0-9A-Za-z ]/, '') doc.rjust(tamanho, caracter)[0...tamanho] end # Formata o campo valor da mora # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_mora(tamanho = 13) format_value(valor_mora, tamanho) end # Formata o campo valor da multa # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_multa(tamanho = 6) format_value(percentual_multa, tamanho) end # Formata o campo valor do desconto # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_desconto(tamanho = 13) format_value(valor_desconto, tamanho) end # Formata o campo valor do segundo desconto # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_segundo_desconto(tamanho = 13) format_value(valor_segundo_desconto, tamanho) end # Formata o campo valor do IOF # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_iof(tamanho = 13) format_value(valor_iof, tamanho) end # Formata o campo valor do IOF # # @param tamanho [Integer] # quantidade de caracteres a ser retornado # def formata_valor_abatimento(tamanho = 13) format_value(valor_abatimento, tamanho) end # Retorna a identificacao do pagador # Se for pessoa fisica (CPF com 11 digitos) é 1 # Se for juridica (CNPJ com 14 digitos) é 2 # def identificacao_sacado(zero = true) Bbrcobranca::Util::Empresa.new(documento_sacado, zero).tipo end # Retorna a identificacao do avalista # Se for pessoa fisica (CPF com 11 digitos) é 1 # Se for juridica (CNPJ com 14 digitos) é 2 # def identificacao_avalista(zero = true) return '0' if documento_avalista.nil? Bbrcobranca::Util::Empresa.new(documento_avalista, zero).tipo end private def format_value(value, tamanho) raise ValorInvalido, 'Deve ser um Float' unless value.to_s =~ /\./ sprintf('%.2f', value).delete('.').rjust(tamanho, '0') end end end end