ipay-rails 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 35ba17ba2403ae0545acb523d6b4fcffffa578599e18b950b2eea3efdf4a81d8
4
+ data.tar.gz: f135122f5fde950e484eba758fcac8c715166f7859f92bde3b82cfc6012e6112
5
+ SHA512:
6
+ metadata.gz: 6b90e6fa9bd1975988f53907860cde417eb1b4aca8b911d340f2fc9ddd8429197b21576a50cb34e5fb9b58ea1b66d0e46f062dbdb007ebc7ddd41c7e12276fb6
7
+ data.tar.gz: 3149b219da39c2486df588218250a7215d11d8692c742b3fab6a3e3ae9d1ef5a1ae988629ef25f09a89b630c52e086a2942487e32546f46435c373eb45cf0ebe
@@ -0,0 +1,8 @@
1
+ require 'ipay/utilities/hash'
2
+ require 'ipay/utilities/array'
3
+ require 'ipay/utilities/string'
4
+ require 'ipay/client'
5
+ require 'ipay/version'
6
+
7
+ module Ipay
8
+ end
@@ -0,0 +1,47 @@
1
+ require 'ipay/utilities/hash'
2
+ require 'ipay/utilities/array'
3
+ require 'ipay/utilities/string'
4
+ require 'ipay/setup'
5
+ require 'ipay/request'
6
+
7
+ module Ipay
8
+ class Client
9
+ def initialize(username=nil, apikey=nil, debug=false)
10
+ @setup = Ipay::Setup.new(username, apikey, debug)
11
+ end
12
+
13
+ def get(url, params = {}, options = { format: :formated })
14
+ request = Ipay::Request.new(@setup.host, @setup.path)
15
+ request.get(url, params, options)
16
+ end
17
+
18
+ def post(url, params = {}, options = { format: :formated })
19
+ request = Ipay::Request.new(@setup.host, @setup.path)
20
+ request.post(url, params, options)
21
+ end
22
+
23
+ def put(url, params={}, options = { format: :formated })
24
+ request = Ipay::Request.new(@setup.host, @setup.path)
25
+ request.put(url, params, options)
26
+ end
27
+
28
+ def delete(url, params={}, options = { format: :formated })
29
+ request = Ipay::Request.new(@setup.host, @setup.path)
30
+ request.delete(url, params, options)
31
+ end
32
+
33
+ def register_order(params = {}, options = { format: :formated })
34
+ request = Ipay::Request.new(@setup.host, @setup.path)
35
+ params[:userName] = @setup.username
36
+ params[:password] = @setup.password
37
+ request.post_register_order('register.do', params, options)
38
+ end
39
+
40
+ def get_order_status(params = {}, options = { format: :formated })
41
+ request = Ipay::Request.new(@setup.host, @setup.path)
42
+ params[:userName] = @setup.username
43
+ params[:password] = @setup.password
44
+ request.get('getOrderStatusExtended.do', params, options)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ module Ipay
2
+ module Formatters
3
+ class UnderscoreFormatter
4
+ attr_accessor :original_content, :formatted_content
5
+
6
+ def initialize
7
+ @original_content = ''
8
+ end
9
+ def call(options={})
10
+ original_content = options[:content]
11
+ @formatted_content = original_content.deep_underscore_keys
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,83 @@
1
+ module Ipay
2
+ class Orders < Ipay::Record
3
+ # @param id [ Integer ]
4
+ # @return [ Hash ]
5
+ def find(id)
6
+ client.get("invoices/#{id}")
7
+ end
8
+
9
+ # Returs all invoices
10
+ # @param params [ Hash ]
11
+ # - start [ Integer ]
12
+ # - limit [ Integer ]
13
+ # - order_direction [ String ]
14
+ # - order_field [ string ]
15
+ # - metadata [ Boolean ]
16
+ # - id [ Integer ]
17
+ # - date [ String ]
18
+ # - due_date [ String ]
19
+ # - status [ String ]
20
+ # - client_name [ String ]
21
+ # - client_identification [ String ]
22
+ # - number_template_full_number
23
+ # @return [ Array ]
24
+ def list(params = {})
25
+ client.get('invoices', params)
26
+ end
27
+
28
+ # Creates a invoice
29
+ # @param params [ Hash ]
30
+ # - date [ String ]
31
+ # - due_date [ String ]
32
+ # - price_list [ Array ]
33
+ # - currency [ Array ]
34
+ # - payments [ Array ]
35
+ # - client [ Integer ] or [ Hash ]
36
+ # - items [ Array ]
37
+ # - observations [ Array ]
38
+ # - anotations [ Array ]
39
+ # - terms_conditions [ Array ]
40
+ # - status [ String ]
41
+ # - number_template [ String ]
42
+ # - retenctions [ Array ]
43
+ # - seller [ String ]
44
+ # @return [ Hash ]
45
+ def create(params)
46
+ #sanitize_params = params.deep_camel_case_lower_keys
47
+ client.post('register.do', params)
48
+ end
49
+
50
+ # Creates a invoice
51
+ # @param params [ Hash ]
52
+ # - date [ String ]
53
+ # - due_date [ String ]
54
+ # - price_list [ Array ]
55
+ # - currency [ Array ]
56
+ # - payments [ Array ]
57
+ # - client [ Integer ] or [ Hash ]
58
+ # - items [ Array ]
59
+ # - observations [ Array ]
60
+ # - anotations [ Array ]
61
+ # - terms_conditions [ Array ]
62
+ # - status [ String ]
63
+ # - number_template [ String ]
64
+ # - retenctions [ Array ]
65
+ # - seller [ String ]
66
+ # @return [ Hash ]
67
+ def update(id, params)
68
+ sanitize_params = params.deep_camel_case_lower_keys
69
+ client.put("invoices/#{id}", sanitize_params)
70
+ end
71
+
72
+ # @param id [ Integer ]
73
+ # @param params [ Hash ]
74
+ # - emails [ Array ]
75
+ # - send_copy_to_user [ Boolean ]
76
+ # - invoiceType [ String ]
77
+ # @return [ Hash ]
78
+ def send_by_email(id, params)
79
+ sanitize_params = params.deep_camel_case_lower_keys
80
+ client.post("invoices/#{id}/email", sanitize_params)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,9 @@
1
+ module Ipay
2
+ class Record
3
+ attr_reader :client
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,99 @@
1
+ require 'ipay/response'
2
+ module Ipay
3
+ class Request
4
+ attr_accessor :path, :session
5
+
6
+ def initialize(host, path)
7
+ @path = path
8
+ @session = Faraday.new url: host
9
+ end
10
+
11
+ def get(url, params = {}, options = { format: :formated })
12
+ params = URI.encode_www_form(params)
13
+
14
+ response = @session.get do |req|
15
+ req.url "#{@path}#{url}?#{params}"
16
+ end
17
+ response_of_request(response, options)
18
+ end
19
+
20
+ def post(url, params = {}, options = { format: :formated })
21
+ params = JSON.generate(params)
22
+ response = @session.post do |req|
23
+ req.url "#{ @path }#{ url }"
24
+ req.headers['Content-Type'] = 'application/json'
25
+ req.headers['Accept'] = 'application/json'
26
+ req.body = params
27
+ end
28
+ response_of_request(response, options)
29
+ end
30
+
31
+ def put(url, params={}, options = { format: :formated })
32
+ params = JSON.generate(params)
33
+ response = @session.put do |req|
34
+ req.url "#{ @path }#{ url }"
35
+ req.body = params
36
+ end
37
+ response_of_request(response, options)
38
+ end
39
+
40
+ def delete(url, params={}, options = { format: :formated })
41
+ params = JSON.generate(params)
42
+ response = @session.delete do |req|
43
+ req.url "#{ @path }#{ url }"
44
+ req.body = params
45
+ end
46
+ response_of_request(response, options)
47
+ end
48
+
49
+ def post_register_order(url, params = {}, options = { format: :formated })
50
+ iva_amount = params[:iva_amount]
51
+ params.delete(:iva_amount)
52
+ response = @session.post do |req|
53
+ req.url "#{ @path }#{ url }"
54
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
55
+ req.headers['Accept'] = 'application/json'
56
+ req.body = URI.encode_www_form(params) + "&jsonParams={ \"installments\": 1, \"IVA.amount\": #{iva_amount} }"
57
+ end
58
+ response_of_request(response, options)
59
+ end
60
+
61
+ private
62
+
63
+ def response_of_request(response, options = { format: :formated })
64
+ cast_error(response, options) unless response.status == 200 || response.status == 201
65
+
66
+ raise_invalid_format options[:format]
67
+
68
+ return response if options[:format] == :raw
69
+
70
+ Ipay::Response.new(response.body).call
71
+ end
72
+
73
+ def cast_error(response, options = { format: :formated })
74
+ raise_invalid_format options[:format]
75
+
76
+ return response if options[:format] == :raw
77
+
78
+ message = response.body.empty? ? response.body : Ipay::Response.new(response.body).call['message']
79
+
80
+ error_map = {
81
+ 500 => 'Sever error! Something were wrong in the server.',
82
+ 400 => "Bad request!, #{ message }",
83
+ 401 => 'Authentication error!',
84
+ 402 => 'Required payment!',
85
+ 403 => 'Restricted access!',
86
+ 404 => 'Not found!',
87
+ 405 => 'Operation does not allowed!',
88
+ }
89
+ raise StandardError, "Status: #{ response.status }. Error: #{ error_map[response.status] }"
90
+ end
91
+
92
+ def raise_invalid_format(format)
93
+ return if %i[formated raw].include?(format)
94
+ return if format.nil?
95
+
96
+ raise StandardError, "#{format} is not a valid format, valid_formats[:formated, :raw]"
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,19 @@
1
+ require 'ipay/formatters/underscore_formatter'
2
+ module Ipay
3
+ class Response
4
+ attr_reader :body, :formatter
5
+
6
+ def initialize(body, formatter_class_name='UnderscoreFormatter')
7
+ @body = JSON.parse(body)
8
+ @formatter = Object.const_get("Ipay::Formatters::#{ formatter_class_name }").new
9
+ end
10
+
11
+ def call(options={})
12
+ if options[:none]
13
+ JSON.parse(body)
14
+ else
15
+ formatter.call(content: body)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ require 'faraday'
2
+ require 'json'
3
+ require 'base64'
4
+
5
+ module Ipay
6
+ class Setup
7
+ attr_accessor :host, :path, :password, :username, :debug
8
+
9
+ def initialize(username=nil, password=nil, debug=false)
10
+ @host = 'https://eco.credibanco.com/'
11
+ if debug
12
+ @host = 'https://ecouat.credibanco.com/'
13
+ end
14
+
15
+ @path = 'payment/rest/'
16
+
17
+ @debug = debug
18
+
19
+ raise Error, 'You must provide a iPay Password' if not password
20
+ raise Error, 'You must provide a iPay USERNAME' if not username
21
+ @password = password
22
+ @username = username
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ class Array
2
+ def deep_camel_case_lower_keys
3
+ [].tap { |array|
4
+ self.each { |item| array << item.deep_camel_case_lower_keys if item.is_a? Hash }
5
+ }
6
+ end
7
+
8
+ def deep_underscore_keys
9
+ [].tap { |array|
10
+ self.each { |item| array << item.deep_underscore_keys if item.is_a? Hash }
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ class Hash
2
+ def deep_camel_case_lower_keys(hash=self)
3
+ {}.tap { |h|
4
+ hash.each { |key, value| h[camel_case_lower_key(key)] = map_value(value, :deep_camel_case_lower_keys) }
5
+ }
6
+ end
7
+
8
+ def deep_underscore_keys(hash=self)
9
+ {}.tap { |h|
10
+ hash.each { |key, value| h[underscore_key(key)] = map_value(value, :deep_underscore_keys) }
11
+ }
12
+ end
13
+
14
+ private
15
+
16
+ def underscore_key(key)
17
+ key.to_s.underscore.to_sym
18
+ end
19
+
20
+ def camel_case_lower_key(key)
21
+ key.to_s.split('_').inject([]){ |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join.to_sym
22
+ end
23
+
24
+ def map_value(thing, method)
25
+ case thing
26
+ when Hash
27
+ __send__(method, thing)
28
+ when Array
29
+ thing.map { |v| map_value(v, method) }
30
+ else
31
+ thing
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ class String
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
6
+ tr("-", "_").
7
+ downcase
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Ipay
2
+ VERSION = '1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ipay-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Caxtor
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: jazz_fingers
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '13.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '13.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.9.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.9.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.7'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.7'
125
+ description: REST API Client for iPay payment gateway
126
+ email:
127
+ - caxtorapp@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - lib/ipay.rb
133
+ - lib/ipay/client.rb
134
+ - lib/ipay/formatters/underscore_formatter.rb
135
+ - lib/ipay/orders.rb
136
+ - lib/ipay/record.rb
137
+ - lib/ipay/request.rb
138
+ - lib/ipay/response.rb
139
+ - lib/ipay/setup.rb
140
+ - lib/ipay/utilities/array.rb
141
+ - lib/ipay/utilities/hash.rb
142
+ - lib/ipay/utilities/string.rb
143
+ - lib/ipay/version.rb
144
+ homepage:
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubygems_version: 3.1.2
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: REST API Client for iPay payment gateway
167
+ test_files: []