# frozen_string_literal: true module Brcobranca module Boleto # Banco HSBC class Hsbc < Base validates_inclusion_of :carteira, in: %w[CNR CSB], message: 'não existente para este banco.' validates_length_of :agencia, maximum: 4, message: 'deve ser menor ou igual a 4 dígitos.' validates_length_of :nosso_numero, maximum: 13, message: 'deve ser menor ou igual a 13 dígitos.' validates_length_of :conta_corrente, maximum: 7, message: 'deve ser menor ou igual a 7 dígitos.' # Nova instancia do Hsbc # @param (see Brcobranca::Boleto::Base#initialize) def initialize(campos = {}) campos = { carteira: 'CNR' }.merge!(campos) super(campos) end # Codigo do banco emissor (3 dígitos sempre) # # @return [String] 3 caracteres numéricos. def banco '399' end # Número seqüencial utilizado para identificar o boleto. # @return [String] 13 caracteres numéricos. def nosso_numero=(valor) @nosso_numero = valor.to_s.rjust(13, '0') if valor end # Nosso número para exibir no boleto. # @return [String] # @example # boleto.nosso_numero_boleto #=> "0000000004042847" def nosso_numero_boleto case carteira when 'CNR' if data_vencimento.is_a?(Date) self.codigo_servico = '4' dia = data_vencimento.day.to_s.rjust(2, '0') mes = data_vencimento.month.to_s.rjust(2, '0') ano = data_vencimento.year.to_s[2..3] data = "#{dia}#{mes}#{ano}" parte_1 = "#{nosso_numero}#{nosso_numero.modulo11(mapeamento: { 10 => 0 })}#{codigo_servico}" soma = parte_1.to_i + conta_corrente.to_i + data.to_i "#{parte_1}#{soma.to_s.modulo11(mapeamento: { 10 => 0 })}" else errors.add(:data_vencimento, 'não é uma data.') raise Brcobranca::BoletoInvalido, self end when 'CSB' @nosso_numero else raise Brcobranca::NaoImplementado, 'Tipo de carteira não implementado.' # TODO: - Verificar outras carteiras. # self.codigo_servico = "5" # parte_1 = "#{self.nosso_numero}#{self.nosso_numero.modulo11(mapeamento: { 10 => 0 })}#{self.codigo_servico}" # soma = parte_1.to_i + self.conta_corrente.to_i # numero = "#{parte_1}#{soma.to_s.modulo11(mapeamento: { 10 => 0 })}" # numero end end # Número do convênio/contrato do cliente para exibir no boleto. # @return [String] # @example # boleto.agencia_conta_boleto #=> "0061900" def agencia_conta_boleto conta_corrente end # Segunda parte do código de barras. # # Montagem é baseada no tipo de carteira e na presença da data de vencimento
# OBS: Somente as carteiras CNR/CSB estão implementadas.
# # @return [String] 25 caracteres numéricos. # @raise [Brcobranca::NaoImplementado] Caso a carteira informada não for CNR/CSB. def codigo_barras_segunda_parte case carteira when 'CNR' dias_julianos = data_vencimento.to_juliano "#{conta_corrente}#{nosso_numero}#{dias_julianos}2" when 'CSB' raise Brcobranca::NaoImplementado, 'Nosso número não definido.' unless @nosso_numero "#{nosso_numero}#{agencia}#{conta_corrente}001" else raise Brcobranca::NaoImplementado, 'Tipo de carteira não implementado.' end end end end end