diff --git a/README.rdoc b/README.rdoc
index 00c2dcce8..8c7bffec7 100644
--- a/README.rdoc
+++ b/README.rdoc
@@ -13,9 +13,6 @@ Gem para emissão de bloquetos de cobrança para bancos brasileiros
== Bancos Disponíveis
-* Banco Banespa
- * COB
-
* Banco do Brasil
* TODAS AS CARTEIRAS PRESENTES NA DOCUMENTAÇÃO
@@ -41,6 +38,10 @@ Gem para emissão de bloquetos de cobrança para bancos brasileiros
* Banco SICREDI
+* Banco Santander by Ronaldo Araujo - https://github.com/ronaldoaraujo
+ * Sem registro
+ * Com registro
+
== Retornos Disponíveis
* CBR643
diff --git a/lib/brcobranca.rb b/lib/brcobranca.rb
index 5aa617eeb..6c7136da3 100755
--- a/lib/brcobranca.rb
+++ b/lib/brcobranca.rb
@@ -103,7 +103,8 @@ module Boleto
autoload :Bradesco, 'brcobranca/boleto/bradesco'
autoload :Unibanco, 'brcobranca/boleto/unibanco'
autoload :Caixa, 'brcobranca/boleto/caixa'
- autoload :Sicredi, 'brcobranca/boleto/sicredi'
+ autoload :Sicredi, 'brcobranca/boleto/sicredi'
+ autoload :Santander, 'brcobranca/boleto/santander'
# Módulos para classes de template
module Template
diff --git a/lib/brcobranca/arquivos/logos/santander.jpg b/lib/brcobranca/arquivos/logos/santander.jpg
new file mode 100644
index 000000000..3ec68c0fd
Binary files /dev/null and b/lib/brcobranca/arquivos/logos/santander.jpg differ
diff --git a/lib/brcobranca/boleto/santander.rb b/lib/brcobranca/boleto/santander.rb
new file mode 100755
index 000000000..3eb2b069d
--- /dev/null
+++ b/lib/brcobranca/boleto/santander.rb
@@ -0,0 +1,94 @@
+# -*- encoding: utf-8 -*-
+# @author Kivanio Barbosa
+# @author Ronaldo Araujo
+module Brcobranca
+ module Boleto
+ class Santander < Base # Banco Santander
+
+ # Usado somente em carteiras especiais com registro para complementar o número do cocumento
+ attr_reader :seu_numero
+
+ validates_length_of :agencia, :maximum => 4, :message => "deve ser menor ou igual a 4 dígitos."
+ validates_length_of :convenio, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos."
+ validates_length_of :numero_documento, :maximum => 8, :message => "deve ser menor ou igual a 8 dígitos."
+ validates_length_of :conta_corrente, :maximum => 5, :message => "deve ser menor ou igual a 5 dígitos."
+ validates_length_of :seu_numero, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos."
+
+ # Nova instancia do Santander
+ # @param (see Brcobranca::Boleto::Base#initialize)
+ def initialize(campos={})
+ campos = {:carteira => "102"}.merge!(campos)
+ super(campos)
+ end
+
+ # Codigo do banco emissor (3 dígitos sempre)
+ #
+ # @return [String] 3 caracteres numéricos.
+ def banco
+ "033"
+ end
+
+ # Número do convênio/contrato do cliente junto ao banco.
+ # @return [String] 5 caracteres numéricos.
+ def convenio=(valor)
+ @convenio = valor.to_s.rjust(5,'0') unless valor.nil?
+ end
+
+ # Conta corrente
+ # @return [String] 5 caracteres numéricos.
+ def conta_corrente=(valor)
+ @conta_corrente = valor.to_s.rjust(5,'0') unless valor.nil?
+ end
+
+ # Número seqüencial utilizado para identificar o boleto.
+ # @return [String] 8 caracteres numéricos.
+ def numero_documento=(valor)
+ @numero_documento = valor.to_s.rjust(8,'0') unless valor.nil?
+ end
+
+ # Número seqüencial utilizado para identificar o boleto.
+ # @return [String] 7 caracteres numéricos.
+ def seu_numero=(valor)
+ @seu_numero = valor.to_s.rjust(7,'0') unless valor.nil?
+ end
+
+ # Dígito verificador do nosso número.
+ # @return [String] 1 caracteres numéricos.
+ def nosso_numero_dv
+ nosso_numero = self.numero_documento.to_s.rjust(12,'0') unless self.numero_documento.nil?
+ nosso_numero.modulo11_2to9
+ end
+
+ # Nosso número para exibir no boleto.
+ # @return [String]
+ # @example
+ # boleto.nosso_numero_boleto #=> "000090002720-7"
+ def nosso_numero_boleto
+ nosso_numero = self.numero_documento.to_s.rjust(12,'0') unless self.numero_documento.nil?
+ "#{nosso_numero}-#{self.nosso_numero_dv}"
+ end
+
+ # Agência + codigo do cedente do cliente para exibir no boleto.
+ # @return [String]
+ # @example
+ # boleto.agencia_conta_boleto #=> "0059/1899775"
+ def agencia_conta_boleto
+ "#{self.agencia}/#{self.convenio}"
+ end
+
+ # Segunda parte do código de barras.
+ # 9(01) | Fixo 9
+ # 9(07) | Convenio
+ # 9(05) | Fixo 00000
+ # 9(08) | Nosso Numero
+ # 9(01) | IOF
+ # 9(03) | Carteira de cobrança
+ #
+ # @return [String] 25 caracteres numéricos.
+ def codigo_barras_segunda_parte
+ "9#{self.convenio}00000#{self.numero_documento}0#{self.carteira}"
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/spec/brcobranca/santander_spec.rb b/spec/brcobranca/santander_spec.rb
new file mode 100755
index 000000000..61c735d8d
--- /dev/null
+++ b/spec/brcobranca/santander_spec.rb
@@ -0,0 +1,153 @@
+# -*- encoding: utf-8 -*-
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe Brcobranca::Boleto::Santander do
+ before(:each) do
+ @valid_attributes = {
+ :especie_documento => "DS",
+ :moeda => "9",
+ :data_documento => Date.today,
+ :dias_vencimento => 1,
+ :aceite => "N",
+ :quantidade => 1,
+ :valor => 25.0,
+ :local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO",
+ :cedente => "Kivanio Barbosa",
+ :documento_cedente => "12345678912",
+ :sacado => "Claudio Pozzebom",
+ :sacado_documento => "12345678900",
+ :agencia => "0059",
+ :conta_corrente => "53678",
+ :convenio => 1899775,
+ :numero_documento => "90000267"
+ }
+ end
+
+ it "Criar nova instancia com atributos padrões" do
+ boleto_novo = Brcobranca::Boleto::Santander.new
+ boleto_novo.banco.should eql("033")
+ boleto_novo.especie_documento.should eql("DM")
+ boleto_novo.especie.should eql("R$")
+ boleto_novo.moeda.should eql("9")
+ boleto_novo.data_documento.should eql(Date.today)
+ boleto_novo.dias_vencimento.should eql(1)
+ boleto_novo.data_vencimento.should eql(Date.today + 1)
+ boleto_novo.aceite.should eql("S")
+ boleto_novo.quantidade.should eql(1)
+ boleto_novo.valor.should eql(0.0)
+ boleto_novo.valor_documento.should eql(0.0)
+ boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
+ boleto_novo.carteira.should eql("102")
+ end
+
+ it "Criar nova instancia com atributos válidos" do
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.banco.should eql("033")
+ boleto_novo.especie_documento.should eql("DS")
+ boleto_novo.especie.should eql("R$")
+ boleto_novo.moeda.should eql("9")
+ boleto_novo.data_documento.should eql(Date.today)
+ boleto_novo.dias_vencimento.should eql(1)
+ boleto_novo.data_vencimento.should eql(Date.today + 1)
+ boleto_novo.aceite.should eql("N")
+ boleto_novo.quantidade.should eql(1)
+ boleto_novo.valor.should eql(25.0)
+ boleto_novo.valor_documento.should eql(25.0)
+ boleto_novo.local_pagamento.should eql("QUALQUER BANCO ATÉ O VENCIMENTO")
+ boleto_novo.cedente.should eql("Kivanio Barbosa")
+ boleto_novo.documento_cedente.should eql("12345678912")
+ boleto_novo.sacado.should eql("Claudio Pozzebom")
+ boleto_novo.sacado_documento.should eql("12345678900")
+ boleto_novo.conta_corrente.should eql("53678")
+ boleto_novo.agencia.should eql("0059")
+ boleto_novo.convenio.should eql("1899775")
+ boleto_novo.numero_documento.should eql("90000267")
+ boleto_novo.carteira.should eql("102")
+ end
+
+ it "Gerar boleto" do
+ @valid_attributes[:data_documento] = Date.parse("2011/10/08")
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.codigo_barras_segunda_parte.should eql("9189977500000900002670102")
+ boleto_novo.codigo_barras.should eql("03391511500000025009189977500000900002670102")
+ boleto_novo.codigo_barras.linha_digitavel.should eql("03399.18997 77500.000904 00026.701029 1 51150000002500")
+
+ @valid_attributes[:valor] = 54.00
+ @valid_attributes[:numero_documento] = "90002720"
+ @valid_attributes[:data_documento] = Date.parse("2012/09/07")
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.codigo_barras_segunda_parte.should eql("9189977500000900027200102")
+ boleto_novo.codigo_barras.should eql("03391545000000054009189977500000900027200102")
+ boleto_novo.codigo_barras.linha_digitavel.should eql("03399.18997 77500.000904 00272.001025 1 54500000005400")
+ end
+
+ it "Não permitir gerar boleto com atributos inválido" do
+ boleto_novo = Brcobranca::Boleto::Santander.new
+ lambda { boleto_novo.codigo_barras }.should raise_error(Brcobranca::BoletoInvalido)
+ boleto_novo.errors.count.should eql(3)
+ end
+
+ it "Montar agencia_conta_corrente_dv" do
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.agencia_conta_boleto.should eql("0059/1899775")
+ end
+
+ it "Montar nosso_numero_dv" do
+ @valid_attributes[:numero_documento] = "566612457800"
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.nosso_numero_dv.should eql(2)
+
+ @valid_attributes[:numero_documento] = "90002720"
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.nosso_numero_dv.should eql(7)
+ end
+
+ it "Montar nosso_numero_boleto" do
+ @valid_attributes[:numero_documento] = "566612457800"
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.nosso_numero_boleto.should eql("566612457800-2")
+
+ @valid_attributes[:numero_documento] = "90002720"
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+ boleto_novo.nosso_numero_boleto.should eql("000090002720-7")
+ end
+
+ it "Busca logotipo do banco" do
+ boleto_novo = Brcobranca::Boleto::Santander.new
+ File.exist?(boleto_novo.logotipo).should be_true
+ File.stat(boleto_novo.logotipo).zero?.should be_false
+ end
+
+ it "Gerar boleto nos formatos válidos com método to_" do
+ @valid_attributes[:data_documento] = Date.parse("2009/08/13")
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+
+ %w| pdf jpg tif png ps |.each do |format|
+ file_body=boleto_novo.send("to_#{format}".to_sym)
+ tmp_file=Tempfile.new("foobar." << format)
+ tmp_file.puts file_body
+ tmp_file.close
+ File.exist?(tmp_file.path).should be_true
+ File.stat(tmp_file.path).zero?.should be_false
+ File.delete(tmp_file.path).should eql(1)
+ File.exist?(tmp_file.path).should be_false
+ end
+ end
+
+ it "Gerar boleto nos formatos válidos" do
+ @valid_attributes[:data_documento] = Date.parse("2009/08/13")
+ boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
+
+ %w| pdf jpg tif png ps |.each do |format|
+ file_body=boleto_novo.to(format)
+ tmp_file=Tempfile.new("foobar." << format)
+ tmp_file.puts file_body
+ tmp_file.close
+ File.exist?(tmp_file.path).should be_true
+ File.stat(tmp_file.path).zero?.should be_false
+ File.delete(tmp_file.path).should eql(1)
+ File.exist?(tmp_file.path).should be_false
+ end
+ end
+
+end
\ No newline at end of file