aprova_facil 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in correios.gemspec
4
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,279 @@
1
+ Aprova Fácil
2
+ ------------
3
+
4
+ Gem para integração com Gateway Aprova Fácil da [Cobrebem](https://www.cobrebemx.com.br).
5
+
6
+ COMO USAR
7
+ ---------
8
+
9
+ ### Configuração
10
+
11
+ O primeiro passo é instalar a gem.
12
+
13
+ ```ruby
14
+ gem install aprova_facil
15
+ ```
16
+
17
+ Depois de instalar, você precisará informar seus dados.
18
+
19
+ ```ruby
20
+ AprovaFacil::Config.usuario = '<usuario>' # usuário fornecido pela Cobrebem
21
+ ```
22
+
23
+ No caso de um abiente de teste ou desenvolvimento também é possível passar o parâmetro
24
+
25
+ ```ruby
26
+ AprovaFacil::Config.teste = true
27
+ ```
28
+
29
+ Efetuando uma aprovação
30
+ -----------------------
31
+
32
+ Para efetuar uma compra é necessário preencher uma instância da classe CartaoCredito,
33
+ segue abaixo os dados básicos para uma aprovação.
34
+
35
+ ```ruby
36
+ cartao = AprovaFacil::CartaoCredito.new(
37
+ :valor => 25.00,
38
+ :numero_cartao => '4073020000000002',
39
+ :codigo_seguranca => '123',
40
+ :mes_validade => '10',
41
+ :ano_validade => '14',
42
+ :bandeira => AprovaFacil::CartaoCredito::Bandeira::VISA
43
+ :ip_comprador => '192.168.1.1',
44
+ :nome_portador => 'Ford Prefect'
45
+ )
46
+ ```
47
+
48
+ ### Outros atributos disponíveis
49
+
50
+ <table>
51
+ <tr>
52
+ <th>Atributo</th>
53
+ <th>Descrição</th>
54
+ <th>Obrigatório?</th>
55
+ <th>Valor padrão</th>
56
+ </tr>
57
+ <tr>
58
+ <td>:documento</td>
59
+ <td>Número do documento do sistema</td>
60
+ <td>Não</td>
61
+ <td></td>
62
+ </tr>
63
+ <tr>
64
+ <td>:valor</td>
65
+ <td>Valor da transação</td>
66
+ <td>Sim</td>
67
+ <td>0.00</td>
68
+ </tr>
69
+ <tr>
70
+ <td>:numero_cartao</td>
71
+ <td>Número do cartão</td>
72
+ <td>Sim</td>
73
+ <td></td>
74
+ </tr>
75
+ <tr>
76
+ <td>:codigo_seguranca</td>
77
+ <td>Código de segurança do cartão</td>
78
+ <td>Sim</td>
79
+ <td></td>
80
+ </tr>
81
+ <tr>
82
+ <td>:mes_validade</td>
83
+ <td>Mês de validade do cartão</td>
84
+ <td>Sim</td>
85
+ <td></td>
86
+ </tr>
87
+ <tr>
88
+ <td>:ano_validade</td>
89
+ <td>Ano de validade do cartão</td>
90
+ <td>Sim</td>
91
+ <td></td>
92
+ </tr>
93
+ <tr>
94
+ <td>:ip_comprador</td>
95
+ <td>Ip do comprador</td>
96
+ <td>Sim</td>
97
+ <td></td>
98
+ </tr>
99
+ <tr>
100
+ <td>:parcelas</td>
101
+ <td>Quantidade de parcelas</td>
102
+ <td>Não</td>
103
+ <td>01</td>
104
+ </tr>
105
+ <tr>
106
+ <td>:bandeira</td>
107
+ <td>Bandeira, veja abaixo</td>
108
+ <td>Não</td>
109
+ <td>VISA</td>
110
+ </tr>
111
+ <tr>
112
+ <td>:nome_portador</td>
113
+ <td>Nome do portador do cartão</td>
114
+ <td>Não</td>
115
+ <td></td>
116
+ </tr>
117
+ <tr>
118
+ <td>:cpf_portador</td>
119
+ <td>CPF do portador do cartão</td>
120
+ <td>Não</td>
121
+ <td></td>
122
+ </tr>
123
+ <tr>
124
+ <td>:data_nascimento</td>
125
+ <td>Data de nascimento do portador do cartão</td>
126
+ <td>Não</td>
127
+ <td></td>
128
+ </tr>
129
+ <tr>
130
+ <td>:nome_mae</td>
131
+ <td>Nome da mão do portador do cartão</td>
132
+ <td>Não</td>
133
+ <td></td>
134
+ </tr>
135
+ <tr>
136
+ <td>:parcelamento_administradora</td>
137
+ <td>Informa se será parcelado pela loja ou pela adminsitrador</td>
138
+ <td>Não</td>
139
+ <td>True</td>
140
+ </tr>
141
+ </table>
142
+
143
+ ### Bandeiras
144
+
145
+ ```ruby
146
+ AprovaFacil::CartaoCredito::Bandeira::VISA
147
+ AprovaFacil::CartaoCredito::Bandeira::MASTERCARD
148
+ AprovaFacil::CartaoCredito::Bandeira::DINERS
149
+ AprovaFacil::CartaoCredito::Bandeira::AMEX
150
+ AprovaFacil::CartaoCredito::Bandeira::HIPERCARD
151
+ AprovaFacil::CartaoCredito::Bandeira::JCB
152
+ AprovaFacil::CartaoCredito::Bandeira::SOROCRED
153
+ AprovaFacil::CartaoCredito::Bandeira::AURA
154
+ ```
155
+
156
+ Após criar o cartão deve ser solicidade uma aprovação.
157
+
158
+ ```ruby
159
+ aprova_facil = AprovaFacil.new
160
+ resultado = aprova_facil.aprovar(cartao)
161
+ ```
162
+
163
+ ### Resultados
164
+
165
+ ```ruby
166
+ :aprovada # True ou false
167
+ :resultado # Descrição do resultado do pedido
168
+ :codigo_autorizacao # Código de autorização retornado pela administradora do cartão.
169
+ :transacao # ID da transação do Aprova Fácil.
170
+ :cartao_mascarado # Número do cartão de crédito mascarado. Eg. 444433******1111
171
+ :numero_documento # ID do pedido.
172
+ ```
173
+
174
+ Captura
175
+ -------
176
+
177
+ Entende­se  por   captura   o processo de confirmação de uma transação, o que caracteriza a venda 
178
+ efetivada, sendo realizado assim, o débito no cartão de crédito do cliente.
179
+ De acordo com os padrões ISO 8583, todas as transações aprovadas pelas Administradoras de
180
+ Cartões de Crédito devem ser capturadas (confirmadas) pela aplicação do Lojista.
181
+ Caso a transação não seja capturada (confirmada) pela aplicação do Lojista, no prazo estipulado
182
+ pelas Administradoras de Cartões Crédito,  a mesma será automaticamente desfeita, não havendo assim o
183
+ débito  efetivo  no  cartão  de  crédito  do  cliente,  essa  informação  será  exibida   no  campo  
184
+ “Data  Hora Cancelamento”do Extrato do Aprova Fácil.
185
+
186
+ ```ruby
187
+ aprova_facil = AprovaFacil.new
188
+ resultado = aprova_facil.capturar('123123123') # Numero da transação
189
+ ```
190
+
191
+ ### Resultados
192
+
193
+ ```ruby
194
+ :capturado # True ou false
195
+ :resultado # Descrição da captura
196
+ ```
197
+
198
+ Cancelamento
199
+ ------------
200
+
201
+ O cancelamento de uma transação somente poderá ser realizado quando a mesma for aprovada pela
202
+ Administradora e confirmada pelo lojista. Por isso, para que o Aprova Fácil possa realizar o 
203
+ cancelamento, este deve ser  solicitado no mesmo dia em que a transação foi processada, 
204
+ ou seja, foi confirmada pela Administradora.
205
+
206
+ ```ruby
207
+ aprova_facil = AprovaFacil.new
208
+ resultado = aprova_facil.cancelar('123123') # Numero da transação
209
+ ```
210
+
211
+ ### Resultados
212
+
213
+ ```ruby
214
+ :cancelado # true ou false
215
+ :resultado # Descrição do cancelamento
216
+ :nsu_Cancelamento # Número de cancelamento da Administradora
217
+ ```
218
+
219
+ Recorrencia
220
+ -----------
221
+
222
+ A recorrência de transações é utilizada, quando se deseja efetuar novos débitos em um cartão de
223
+ crédito, seja esta de qualquer  periodicidade; é possível alterar  o valor  do débito a cada cobrança, se
224
+ necessário.
225
+ O processo de "re­cobrança" em uma recorrência, se difere do processo de "re­cobrança" em um
226
+ agendamento. A re­cobrança em uma recorrência é comandada pela aplicação do lojista, nesse caso, deve
227
+ ser  informado apenas o número que identifica a última transação aprovada e confirmada, sendo este,
228
+ representado pelo parâmetro "Transacao".
229
+
230
+ ```ruby
231
+ aprova_facil = AprovaFacil.new
232
+ resultado = aprova_facil.recobrar('123123', 25.00)
233
+ ```
234
+
235
+ Assinatura do método de recobrança.
236
+
237
+ ```ruby
238
+ def recobrar(transacao, valor, parcelas = '01', parcelamento_admin = true )
239
+ ```
240
+
241
+ ### Resultados
242
+
243
+ ```ruby
244
+ :aprovada # True ou false
245
+ :resultado # Descrição   da   aprovação   do resultado do pedido
246
+ :codigo_autorizacao # Código   de   autorização   retornado pela Administradora  do  cartão  de crédito
247
+ :transacao # ID da transação Aprova Fáci
248
+ :cartao_mascarado # Número   mascarado   do   Cartão   de Crédito Eg. 444433******1111
249
+ :numero_documento # ID do pedido da companhia
250
+ ```
251
+
252
+ AUTOR:
253
+ ------
254
+
255
+ Bruno Frank Silva Cordeiro bfscordeiro (at) gmail (dot) com
256
+
257
+ LICENÇA:
258
+ --------
259
+
260
+ (The MIT License)
261
+
262
+ Permission is hereby granted, free of charge, to any person obtaining
263
+ a copy of this software and associated documentation files (the
264
+ 'Software'), to deal in the Software without restriction, including
265
+ without limitation the rights to use, copy, modify, merge, publish,
266
+ distribute, sublicense, and/or sell copies of the Software, and to
267
+ permit persons to whom the Software is furnished to do so, subject to
268
+ the following conditions:
269
+
270
+ The above copyright notice and this permission notice shall be
271
+ included in all copies or substantial portions of the Software.
272
+
273
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
274
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
275
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
276
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
277
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
278
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
279
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ require 'rake/testtask'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ # just 'rake test'
6
+ Rake::TestTask.new do |t|
7
+ t.libs << 'lib'
8
+ t.libs << 'test'
9
+ t.pattern = 'test/**/*_test.rb'
10
+ t.verbose = true
11
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'aprova_facil/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "aprova_facil"
7
+ s.version = AprovaFacil::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Bruno Frank"]
10
+ s.email = ["bfscordeiro@gmail.com"]
11
+ s.homepage = "https://github.com/brunofrank/aprova_facil"
12
+ s.summary = %q{Gem para integração de aplicação Ruby com o gateway de pagamento Aprova Fácil da Cobre Bem.}
13
+ s.description = %q{Gem para integração de aplicação Ruby com o gateway de pagamento Aprova Fácil da Cobre Bem.}
14
+
15
+ s.rubyforge_project = "aprova_facil"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
@@ -0,0 +1,147 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ class AprovaFacil
4
+ class MissingEnvironmentException < StandardError; end
5
+ class MissingConfigurationException < StandardError; end
6
+
7
+ URL = 'https://www.aprovafacil.com/cgi-bin/APFW/'
8
+ URL_TEST = 'https://teste.aprovafacil.com/cgi-bin/APFW/'
9
+
10
+ COMPRAR = 'APC'
11
+ CAPTURAR = 'CAP'
12
+ CANCELAR = 'CAN'
13
+
14
+ # Método usado para efetuar cobraças recorrentes
15
+ def recobrar(transacao, valor, parcelas = '01', parcelamento_admin = true )
16
+ request_url = url(COMPRAR)
17
+ request_params = {
18
+ 'TransacaoAnterior' => transacao,
19
+ 'ValorDocumento' => valor,
20
+ 'QuantidadeParcelas' => '%02d' % parcelas,
21
+ 'ParcelamentoAdministrador' => parcelamento_admin ? 'S' : 'N'
22
+ }
23
+ xml_response = commit(request_url, request_params)
24
+ treat_apc_response(xml_response)
25
+ end
26
+
27
+ def aprovar(cartao_credito)
28
+ if cartao_credito.valid?
29
+ request_url = url(COMPRAR)
30
+ request_params = cartao_credito.to_params
31
+ xml_response = commit(request_url, request_params)
32
+ treat_apc_response(xml_response)
33
+ else
34
+ {:aprovada => false, :resultado => cartao_credito.errors.join('\\n')}
35
+ end
36
+ end
37
+
38
+ def capturar(transacao)
39
+ request_url = url(CAPTURAR)
40
+ request_params = {'Transacao' => transacao}
41
+ xml_response = commit(request_url, request_params)
42
+ request_result = {}
43
+ if xml_response
44
+ response = REXML::Document.new(xml_response)
45
+ response.elements.each 'ResultadoCAP' do |resultado|
46
+ resultado.elements.each 'ResultadoSolicitacaoConfirmacao' do |resultado|
47
+ request_result[:capturado] = !resultado.text.match(/Confirmado/).nil?
48
+ request_result[:resultado] = resultado.text
49
+ end
50
+ end
51
+ else
52
+ request_result[:capturado] = false
53
+ request_result[:resultado] = 'Erro ­ Erro desconhecido'
54
+ end
55
+
56
+ request_result
57
+ end
58
+
59
+ def cancelar(transacao)
60
+ request_url = url(CANCELAR)
61
+ request_params = {'Transacao' => transacao}
62
+ xml_response = commit(request_url, request_params)
63
+ request_result = {}
64
+ if xml_response
65
+ response = REXML::Document.new(xml_response)
66
+ response.elements.each 'ResultadoCAN' do |resultado|
67
+ resultado.elements.each 'ResultadoSolicitacaoCancelamento' do |resultado|
68
+ request_result[:cancelado] = !resultado.text.match(/Cancelado/).nil? or !resultado.text.match(/Cancelamento/).nil?
69
+ request_result[:resultado] = resultado.text
70
+ end
71
+
72
+ resultado.elements.each 'NSUCancelamento' do |nsu_Cancelamento|
73
+ request_result[:nsu_Cancelamento] = !nsu_Cancelamento.text
74
+ end
75
+ end
76
+ else
77
+ request_result[:cancelado] = false
78
+ request_result[:resultado] = 'Erro ­ Erro desconhecido'
79
+ end
80
+
81
+ request_result
82
+ end
83
+
84
+ private
85
+
86
+ def url(metodo)
87
+ url = AprovaFacil::Config.teste? ? URL_TEST.clone : URL.clone
88
+ url << AprovaFacil::Config.usuario
89
+ url << '/'
90
+ url << metodo
91
+ end
92
+
93
+ def commit(url, request_params)
94
+ request_params.merge!({
95
+ 'ResponderEmUTF8' => 'S'
96
+ })
97
+
98
+ uri = URI.parse(url)
99
+ http = Net::HTTP.new(uri.host, uri.port)
100
+ http.use_ssl = true
101
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
102
+
103
+ request = Net::HTTP::Post.new(uri.path)
104
+ request.form_data = request_params
105
+ response = http.start {|r| r.request request }
106
+ response.body
107
+ rescue Exception
108
+ nil
109
+ end
110
+
111
+ def treat_apc_response(xml_response)
112
+ request_result = {}
113
+ if xml_response
114
+ response = REXML::Document.new(xml_response)
115
+ response.elements.each 'ResultadoAPC' do |resultado|
116
+ resultado.elements.each 'TransacaoAprovada' do |aprovada|
117
+ request_result[:aprovada] = aprovada.text == 'True' ? true : false
118
+ end
119
+
120
+ resultado.elements.each 'ResultadoSolicitacaoAprovacao' do |resultado|
121
+ request_result[:resultado] = resultado.text
122
+ end
123
+
124
+ resultado.elements.each 'CodigoAutorizacao' do |codigo_autorizacao|
125
+ request_result[:codigo_autorizacao] = codigo_autorizacao.text
126
+ end
127
+
128
+ resultado.elements.each 'Transacao' do |transacao|
129
+ request_result[:transacao] = transacao.text
130
+ end
131
+
132
+ resultado.elements.each 'CartaoMascarado' do |cartao_mascarado|
133
+ request_result[:cartao_mascarado] = cartao_mascarado.text
134
+ end
135
+
136
+ resultado.elements.each 'NumeroDocumento' do |numero_documento|
137
+ request_result[:numero_documento] = numero_documento.text
138
+ end
139
+ end
140
+ else
141
+ request_result[:aprovada] = false
142
+ request_result[:resultado] = 'Erro ­ Erro desconhecido'
143
+ end
144
+
145
+ request_result
146
+ end
147
+ end
@@ -0,0 +1,102 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ class AprovaFacil
4
+
5
+ class CartaoCredito
6
+
7
+ module Bandeira
8
+ VISA = 'VISA'
9
+ MASTERCARD = 'MASTERCARD'
10
+ DINERS = 'DINERS'
11
+ AMEX = 'AMEX'
12
+ HIPERCARD = 'HIPERCARD'
13
+ JCB = 'JCB'
14
+ SOROCRED = 'SOROCRED'
15
+ AURA = 'AURA'
16
+ end
17
+
18
+ attr_accessor :documento, :valor, :parcelas, :numero_cartao, :codigo_seguranca,
19
+ :mes_validade, :ano_validade, :pre_autorizacao, :ip_comprador,
20
+ :nome_portador, :bandeira, :cpf_portador, :data_nascimento,
21
+ :nome_mae, :parcelamento_administradora, :errors
22
+
23
+ def initialize(options={})
24
+ @documento = options[:documento]
25
+ @valor = options[:valor]
26
+ @parcelas = options[:parcelas] || 1
27
+ @numero_cartao = options[:numero_cartao]
28
+ @codigo_seguranca = options[:codigo_seguranca]
29
+ @mes_validade = options[:mes_validade]
30
+ @ano_validade = options[:ano_validade]
31
+ @pre_autorizacao = options[:pre_autorizacao] || false
32
+ @ip_comprador = options[:ip_comprador]
33
+ @nome_portador = options[:nome_portador]
34
+ @bandeira = options[:bandeira] || Bandeira::VISA
35
+ @cpf_portador = options[:cpf_portador]
36
+ @data_nascimento = options[:data_nascimento]
37
+ @nome_mae = options[:nome_mae]
38
+ @parcelamento_administradora = options[:parcelamento_administradora] || true
39
+ @transacao_anterior = options[:transacao_anterior]
40
+
41
+ @errors = []
42
+ end
43
+
44
+ def valid?
45
+ errors.clear
46
+ errors << {:valor => 'deve ser informado'} if valor.nil? or !valor.kind_of?(Float) or valor == 0
47
+
48
+ if parcelas.nil? or (parcelas.kind_of?(Integer) and parcelas == 0)
49
+ errors << {:parcelas => 'deve ser informado'}
50
+ end
51
+
52
+ errors << {:numero_cartao => 'deve ser informado'} if numero_cartao.nil? or numero_cartao.empty?
53
+
54
+ if mes_validade.nil? or mes_validade.empty?
55
+ errors << {:mes_validade => 'deve ser informado'}
56
+ elsif mes_validade.size != 2 or mes_validade.match(/\D/)
57
+ errors << {:mes_validade => 'deve ser informado'}
58
+ end
59
+
60
+ if ano_validade.nil? or ano_validade.empty?
61
+ errors << {:ano_validade => 'deve ser informado'}
62
+ elsif ano_validade.size != 2 or ano_validade.match(/\D/)
63
+ errors << {:ano_validade => 'deve ter 2 dígitos numéricos'}
64
+ end
65
+
66
+ if codigo_seguranca.nil? or codigo_seguranca.empty?
67
+ errors << {:codigo_seguranca => 'deve ser informado'}
68
+ elsif codigo_seguranca.match(/\D/)
69
+ errors << {:codigo_seguranca => 'deve até apenas dígitos numéricos'}
70
+ end
71
+
72
+ if ip_comprador.nil? or ip_comprador.empty?
73
+ errors << {:ip_comprador => 'deve ser informado'}
74
+ elsif !ip_comprador.match(/\d+\.\d+\.\d+\.\d+/)
75
+ errors << {:ip_comprador => 'Dese Tem que ser no formato 000.000.000.000'}
76
+ end
77
+
78
+ errors.size == 0
79
+ end
80
+
81
+ def to_params
82
+ params = {}
83
+ params['NumeroDocumento'] = documento[0, 50] if self.documento
84
+ params['ValorDocumento'] = valor
85
+ params['QuantidadeParcelas'] = '%02d' % parcelas
86
+ params['NumeroCartao'] = numero_cartao
87
+ params['MesValidade'] = '%02d' % mes_validade
88
+ params['AnoValidade'] = '%02d' % ano_validade
89
+ params['CodigoSeguranc'] = codigo_seguranca
90
+ params['PreAutorizacao'] = pre_autorizacao ? 'S' : 'N'
91
+ params['EnderecoIPComprado'] = ip_comprador
92
+ params['NomePortadorCarta'] = nome_portador if nome_portador
93
+ params['Bandeira'] = bandeira
94
+ params['CPFPortadorCartao'] = cpf_portador.gsub /\D/, '' if cpf_portador
95
+ params['DataNascimentoPortadorCartao'] = data_nascimento.strftime('%Y%m%d') if data_nascimento and data_nascimento.kind_of?(Date)
96
+ params['NomeMaePortadorCarta'] = nome_mae if nome_mae
97
+ params['ParcelamentoAdministrador'] = parcelamento_administradora ? 'S' : 'N'
98
+
99
+ params
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ class AprovaFacil
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,26 @@
1
+ require "net/https"
2
+ require "uri"
3
+ require 'aprova_facil/cartao_credito'
4
+ require 'aprova_facil/aprova_facil'
5
+ require "rexml/document"
6
+ $, = '-' # mudando o separador padrão
7
+
8
+ class AprovaFacil
9
+ class Config
10
+ def self.usuario
11
+ @usuario
12
+ end
13
+
14
+ def self.usuario=(usuario)
15
+ @usuario = usuario
16
+ end
17
+
18
+ def self.teste?
19
+ @test || false
20
+ end
21
+
22
+ def self.teste=(test)
23
+ @test = test
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+ require 'digest/sha1'
3
+
4
+ class AprovaFacilTest < TestHelper
5
+
6
+ def setup
7
+ @aprova_facil = AprovaFacil.new
8
+ end
9
+
10
+ def test_aprovar
11
+ resultado = nil
12
+ 3.times.each do
13
+ resultado = @aprova_facil.aprovar cartao
14
+ break if resultado[:aprovada]
15
+ end
16
+
17
+ assert_equal true, resultado[:aprovada]
18
+ assert_not_nil resultado[:resultado]
19
+ assert_not_nil resultado[:codigo_autorizacao]
20
+ assert_not_nil resultado[:transacao]
21
+ assert_equal @cartao_mascarado, resultado[:cartao_mascarado]
22
+ end
23
+
24
+ def test_aprovar_cartao_invalido
25
+ cartao_invalido = cartao('502')
26
+ resultado = nil
27
+ 3.times.each do
28
+ resultado = @aprova_facil.aprovar cartao_invalido
29
+ break if !resultado[:aprovada]
30
+ end
31
+
32
+ assert_equal false, resultado[:aprovada]
33
+ end
34
+
35
+ def test_recobrar
36
+ resultado = nil
37
+ 3.times.each do
38
+ resultado = @aprova_facil.aprovar cartao
39
+ break if resultado[:aprovada]
40
+ end
41
+ assert_equal true, resultado[:aprovada]
42
+
43
+ resultado = @aprova_facil.capturar resultado[:transacao]
44
+ assert_equal true, resultado[:capturado]
45
+
46
+ 3.times.each do
47
+ resultado = @aprova_facil.recobrar resultado[:transacao], 25.00
48
+ break if resultado[:aprovada]
49
+ end
50
+
51
+ assert_equal true, resultado[:aprovada]
52
+ end
53
+
54
+ def test_recobrar_transacao_invalida
55
+ resultado = @aprova_facil.recobrar '123123', 25.00
56
+
57
+ assert_equal false, resultado[:aprovada]
58
+ end
59
+
60
+ def test_capturar
61
+ resultado = @aprova_facil.capturar '123123123123'
62
+
63
+ assert_equal true, resultado[:capturado]
64
+ end
65
+
66
+ def test_cancelar
67
+ resultado = @aprova_facil.cancelar '123123123123'
68
+
69
+ assert_equal true, resultado[:cancelado]
70
+ end
71
+
72
+ def test_get_url
73
+ metodo = AprovaFacil::COMPRAR
74
+ expected_url = AprovaFacil::URL_TEST.clone
75
+ expected_url << AprovaFacil::Config.usuario + '/'
76
+
77
+ url = @aprova_facil.send(:url, metodo)
78
+ assert_equal url, expected_url + metodo
79
+
80
+ metodo = AprovaFacil::CAPTURAR
81
+ url = @aprova_facil.send(:url, metodo)
82
+ assert_equal url, expected_url + metodo
83
+
84
+ metodo = AprovaFacil::CANCELAR
85
+ url = @aprova_facil.send(:url, metodo)
86
+ assert_equal url, expected_url + metodo
87
+ end
88
+
89
+ private
90
+ def cartao(codigo_seguranca = '123')
91
+ numero_cartao = '4073020000000002'
92
+ @cartao_mascarado = mascara_cartao(numero_cartao.clone)
93
+ AprovaFacil::CartaoCredito.new(
94
+ :valor => 25.00,
95
+ :numero_cartao => numero_cartao,
96
+ :codigo_seguranca => codigo_seguranca,
97
+ :mes_validade => '10',
98
+ :ano_validade => '14',
99
+ :ip_comprador => '192.168.1.1',
100
+ :nome_portador => 'Bruno Frank Silva Cordeiro'
101
+ )
102
+ end
103
+
104
+ def mascara_cartao(cartao)
105
+ cartao[6] = '*'
106
+ cartao[7] = '*'
107
+ cartao[8] = '*'
108
+ cartao[9] = '*'
109
+ cartao[10] = '*'
110
+ cartao[11] = '*'
111
+ cartao
112
+ end
113
+ end
@@ -0,0 +1,128 @@
1
+ require 'test_helper'
2
+
3
+ class CartaoCreditoTest < TestHelper
4
+
5
+ def setup
6
+ @cartao = AprovaFacil::CartaoCredito.new(
7
+ :valor => 25.00,
8
+ :numero_cartao => '4073020000000002',
9
+ :codigo_seguranca => '123',
10
+ :mes_validade => '10',
11
+ :ano_validade => '14',
12
+ :ip_comprador => '192.168.1.1',
13
+ :nome_portador => 'Bruno Frank Silva'
14
+ )
15
+ end
16
+
17
+ def test_order_create
18
+ assert_not_nil @cartao
19
+ end
20
+
21
+ def test_validations
22
+ assert @cartao.valid?
23
+ end
24
+
25
+ def test_validation_valor
26
+ cartao = @cartao.clone
27
+
28
+ cartao.valor = 0
29
+ assert_equal false, cartao.valid?
30
+
31
+ cartao.valor = nil
32
+ assert_equal false, cartao.valid?
33
+
34
+ cartao.valor = 25.00
35
+ assert cartao.valid?
36
+ end
37
+
38
+ def test_validation_parcelas
39
+ cartao = @cartao.clone
40
+
41
+ cartao.parcelas = nil
42
+ assert_equal false, cartao.valid?
43
+
44
+ cartao.parcelas = 0
45
+ assert_equal false, cartao.valid?
46
+
47
+ cartao.parcelas = 1
48
+ assert cartao.valid?
49
+ end
50
+
51
+ def test_validation_numero_cartao
52
+ cartao = @cartao.clone
53
+
54
+ cartao.numero_cartao = nil
55
+ assert_equal false, cartao.valid?
56
+
57
+ # Numero Cartão em branco
58
+ cartao.numero_cartao = ''
59
+ assert_equal false, cartao.valid?
60
+
61
+ cartao.numero_cartao = '4073020000000002'
62
+ assert cartao.valid?
63
+ end
64
+
65
+ def test_validation_mes_validade
66
+ cartao = @cartao.clone
67
+
68
+ cartao.mes_validade = nil
69
+ assert_equal false, cartao.valid?
70
+
71
+ cartao.mes_validade = '1'
72
+ assert_equal false, cartao.valid?
73
+
74
+ cartao.mes_validade = '123'
75
+ assert_equal false, cartao.valid?
76
+
77
+ cartao.mes_validade = 'aa'
78
+ assert_equal false, cartao.valid?
79
+
80
+ cartao.mes_validade = '10'
81
+ assert cartao.valid?
82
+ end
83
+
84
+ def test_validation_ano_validade
85
+ cartao = @cartao.clone
86
+
87
+ cartao.ano_validade = nil
88
+ assert_equal false, cartao.valid?
89
+
90
+ cartao.ano_validade = '1'
91
+ assert_equal false, cartao.valid?
92
+
93
+ cartao.ano_validade = '123'
94
+ assert_equal false, cartao.valid?
95
+
96
+ cartao.ano_validade = 'aa'
97
+ assert_equal false, cartao.valid?
98
+
99
+ cartao.ano_validade = '14'
100
+ assert cartao.valid?
101
+ end
102
+
103
+ def test_validation_codigo_seguranca
104
+ cartao = @cartao.clone
105
+
106
+ cartao.codigo_seguranca = nil
107
+ assert_equal false, cartao.valid?
108
+
109
+ cartao.codigo_seguranca = 'aaa'
110
+ assert_equal false, cartao.valid?
111
+
112
+ cartao.codigo_seguranca = '123'
113
+ assert cartao.valid?
114
+ end
115
+
116
+ def test_validation_ip_comprador
117
+ cartao = @cartao.clone
118
+
119
+ cartao.ip_comprador = nil
120
+ assert_equal false, cartao.valid?
121
+
122
+ cartao.ip_comprador = '123'
123
+ assert_equal false, cartao.valid?
124
+
125
+ cartao.ip_comprador = '192.168.1.1'
126
+ assert cartao.valid?
127
+ end
128
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'aprova_facil'
4
+
5
+ class TestHelper < Test::Unit::TestCase
6
+ end
7
+
8
+ AprovaFacil::Config.usuario = 'bfscordeiro'
9
+ AprovaFacil::Config.teste = true
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aprova_facil
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
+ platform: ruby
7
+ authors:
8
+ - Bruno Frank
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-16 00:00:00 -03:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: "Gem para integra\xC3\xA7\xC3\xA3o de aplica\xC3\xA7\xC3\xA3o Ruby com o gateway de pagamento Aprova F\xC3\xA1cil da Cobre Bem."
18
+ email:
19
+ - bfscordeiro@gmail.com
20
+ executables: []
21
+
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - .gitignore
28
+ - Gemfile
29
+ - MIT-LICENSE
30
+ - README.markdown
31
+ - Rakefile
32
+ - aprova_facil.gemspec
33
+ - lib/aprova_facil.rb
34
+ - lib/aprova_facil/aprova_facil.rb
35
+ - lib/aprova_facil/cartao_credito.rb
36
+ - lib/aprova_facil/version.rb
37
+ - test/aprova_facil_test.rb
38
+ - test/cartao_credito_test.rb
39
+ - test/test_helper.rb
40
+ has_rdoc: true
41
+ homepage: https://github.com/brunofrank/aprova_facil
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ requirements: []
62
+
63
+ rubyforge_project: aprova_facil
64
+ rubygems_version: 1.6.2
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: "Gem para integra\xC3\xA7\xC3\xA3o de aplica\xC3\xA7\xC3\xA3o Ruby com o gateway de pagamento Aprova F\xC3\xA1cil da Cobre Bem."
68
+ test_files:
69
+ - test/aprova_facil_test.rb
70
+ - test/cartao_credito_test.rb
71
+ - test/test_helper.rb