conekta-tiempometa 2.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +124 -0
  5. data/Dockerfile +44 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +182 -0
  9. data/Rakefile +1 -0
  10. data/conekta.gemspec +29 -0
  11. data/lib/conekta/address.rb +5 -0
  12. data/lib/conekta/card.rb +21 -0
  13. data/lib/conekta/charge.rb +25 -0
  14. data/lib/conekta/conekta_object.rb +109 -0
  15. data/lib/conekta/customer.rb +82 -0
  16. data/lib/conekta/customer_info.rb +5 -0
  17. data/lib/conekta/destination.rb +17 -0
  18. data/lib/conekta/details.rb +5 -0
  19. data/lib/conekta/discount_line.rb +19 -0
  20. data/lib/conekta/error.rb +99 -0
  21. data/lib/conekta/error_details.rb +14 -0
  22. data/lib/conekta/event.rb +9 -0
  23. data/lib/conekta/line_item.rb +21 -0
  24. data/lib/conekta/list.rb +59 -0
  25. data/lib/conekta/log.rb +10 -0
  26. data/lib/conekta/method.rb +4 -0
  27. data/lib/conekta/operations/create.rb +19 -0
  28. data/lib/conekta/operations/create_member.rb +40 -0
  29. data/lib/conekta/operations/custom_action.rb +13 -0
  30. data/lib/conekta/operations/delete.rb +45 -0
  31. data/lib/conekta/operations/find.rb +21 -0
  32. data/lib/conekta/operations/update.rb +11 -0
  33. data/lib/conekta/operations/where.rb +30 -0
  34. data/lib/conekta/order.rb +87 -0
  35. data/lib/conekta/payee.rb +66 -0
  36. data/lib/conekta/payment_method.rb +4 -0
  37. data/lib/conekta/payment_source.rb +17 -0
  38. data/lib/conekta/payout.rb +7 -0
  39. data/lib/conekta/payout_method.rb +17 -0
  40. data/lib/conekta/plan.rb +16 -0
  41. data/lib/conekta/refund.rb +6 -0
  42. data/lib/conekta/requestor.rb +80 -0
  43. data/lib/conekta/resource.rb +54 -0
  44. data/lib/conekta/return.rb +12 -0
  45. data/lib/conekta/shipping_contact.rb +19 -0
  46. data/lib/conekta/shipping_line.rb +20 -0
  47. data/lib/conekta/subscription.rb +25 -0
  48. data/lib/conekta/tax_line.rb +19 -0
  49. data/lib/conekta/token.rb +8 -0
  50. data/lib/conekta/transfer.rb +7 -0
  51. data/lib/conekta/util.rb +136 -0
  52. data/lib/conekta/version.rb +3 -0
  53. data/lib/conekta/webhook.rb +12 -0
  54. data/lib/conekta/webhook_log.rb +4 -0
  55. data/lib/conekta.rb +101 -0
  56. data/lib/ssl_data/ca_bundle.crt +3955 -0
  57. data/locales/en.yml +9 -0
  58. data/locales/es.yml +10 -0
  59. data/readme_files/banner.png +0 -0
  60. data/readme_files/conekta-badge.png +0 -0
  61. data/readme_files/ruby-badge.png +0 -0
  62. data/spec/conekta/1.0.0/.DS_Store +0 -0
  63. data/spec/conekta/1.0.0/card_spec.rb +40 -0
  64. data/spec/conekta/1.0.0/charge_spec.rb +152 -0
  65. data/spec/conekta/1.0.0/customer_spec.rb +147 -0
  66. data/spec/conekta/1.0.0/error_spec.rb +69 -0
  67. data/spec/conekta/1.0.0/event_spec.rb +26 -0
  68. data/spec/conekta/1.0.0/log_spec.rb +20 -0
  69. data/spec/conekta/1.0.0/payout_spec.rb +60 -0
  70. data/spec/conekta/1.0.0/plan_spec.rb +53 -0
  71. data/spec/conekta/1.0.0/token_spec.rb +5 -0
  72. data/spec/conekta/1.0.0/webhook_spec.rb +36 -0
  73. data/spec/conekta/2.0.0/customer_spec.rb +77 -0
  74. data/spec/conekta/2.0.0/discount_line_spec.rb +49 -0
  75. data/spec/conekta/2.0.0/error_spec.rb +61 -0
  76. data/spec/conekta/2.0.0/line_item_spec.rb +53 -0
  77. data/spec/conekta/2.0.0/list_spec.rb +29 -0
  78. data/spec/conekta/2.0.0/order_spec.rb +291 -0
  79. data/spec/conekta/2.0.0/payee_spec.rb +55 -0
  80. data/spec/conekta/2.0.0/shipping_contact_spec.rb +60 -0
  81. data/spec/conekta/2.0.0/shipping_line_spec.rb +53 -0
  82. data/spec/conekta/2.0.0/source_spec.rb +31 -0
  83. data/spec/conekta/2.0.0/tax_line_spec.rb +44 -0
  84. data/spec/conekta/2.0.0/transfer_spec.rb +59 -0
  85. data/spec/conekta_spec.rb +29 -0
  86. data/spec/spec_helper.rb +14 -0
  87. data/spec/support/fixtures/orders.json +1127 -0
  88. data/spec/support/shared_context.rb +49 -0
  89. metadata +229 -0
@@ -0,0 +1,82 @@
1
+ module Conekta
2
+ class Customer < Resource
3
+ include Conekta::Operations::Find
4
+ include Conekta::Operations::Where
5
+ include Conekta::Operations::Create
6
+ include Conekta::Operations::Delete
7
+ include Conekta::Operations::Update
8
+ include Conekta::Operations::CustomAction
9
+ include Conekta::Operations::CreateMember
10
+
11
+ attr_accessor :livemode, :name, :email, :phone, :default_shipping_contact_id,
12
+ :referrer, :account_age,
13
+ :paid_transactions, :first_paid_at, :corporate, :default_payment_source_id,
14
+ :shipping_contacts, :subscription, :payment_sources, :cards
15
+
16
+ def initialize(id=nil)
17
+ @id = id
18
+ @payment_sources ||= List.new("PaymentSource", {})
19
+ @shipping_contacts ||= List.new("ShippingContacts", {})
20
+ super(id)
21
+ end
22
+
23
+ def load_from(response=nil)
24
+ if response
25
+ super
26
+ end
27
+
28
+ customer = self
29
+
30
+ if Conekta.api_version == "2.0.0"
31
+ submodels = [:payment_sources, :shipping_contacts]
32
+ create_submodels_lists(customer, submodels)
33
+ else
34
+ submodels = [:cards]
35
+
36
+ submodels.each do |submodel|
37
+ self.send(submodel).each do |k,v|
38
+ if !v.respond_to? :deleted or !v.deleted
39
+ v.create_attr('customer', customer)
40
+
41
+ self.send(submodel).set_val(k,v)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ if self.respond_to? :subscription and self.subscription
48
+ self.subscription.create_attr('customer', customer)
49
+ end
50
+ end
51
+
52
+ def create_card(params)
53
+ self.create_member_with_relation('cards', params, self)
54
+ end
55
+
56
+ def create_payment_source(params)
57
+ self.create_member_with_relation('payment_sources', params, self)
58
+ end
59
+
60
+ def create_offline_recurrent_reference(params)
61
+ self.create_member_with_relation('payment_sources', params, self)
62
+ end
63
+
64
+ def create_subscription(params)
65
+ self.create_member('subscription', params)
66
+ end
67
+
68
+ def create_shipping_contact(params)
69
+ self.create_member_with_relation('shipping_contacts', params, self)
70
+ end
71
+
72
+ def create_submodels_lists(customer, submodels)
73
+ submodels.each do |submodel|
74
+ self.send(submodel).each do |k, v|
75
+ v.create_attr('customer', customer)
76
+
77
+ self.send(submodel).set_val(k,v)
78
+ end if self.respond_to?(submodel) && !self.send(submodel).nil?
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,5 @@
1
+ module Conekta
2
+ class CustomerInfo < Resource
3
+ attr_accessor :email, :phone, :name, :corporate
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module Conekta
2
+ class Destination < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ def _url
8
+ ensure_id
9
+
10
+ self.payee._url + self.class._url + "/" + id
11
+ end
12
+
13
+ def delete
14
+ self.delete_member('payee','destinations')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module Conekta
2
+ class Details < Resource
3
+ attr_accessor :name, :description, :unit_price, :quantity, :sku, :category
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ module Conekta
2
+ class DiscountLine < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :code, :amount, :type, :parent_id
8
+
9
+ def _url
10
+ ensure_id
11
+
12
+ "#{self.order._url}#{self.class._url}/#{id}"
13
+ end
14
+
15
+ def delete
16
+ self.delete_member('order', 'discount_lines')
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,99 @@
1
+ module Conekta
2
+ class Error < StandardError
3
+ attr_reader :message, :type, :log_id, :details, :data
4
+
5
+ def initialize(options={})
6
+ @type = options["type"]
7
+ @log_id = options["log_id"]
8
+ if options["details"]
9
+ @details = options["details"].collect{|details|
10
+ Conekta::ErrorDetails.new(details)
11
+ }
12
+ else
13
+ temp_details = Conekta::ErrorDetails.new({
14
+ "message" => options["message_to_purchaser"],
15
+ "debug_message" => options["message"],
16
+ "param" => options["param"]
17
+ })
18
+ @details = [temp_details]
19
+ end
20
+ @message = @details.first.debug_message
21
+ @data = options["data"]
22
+
23
+ super
24
+ end
25
+
26
+ def class_name
27
+ self.class.name.split('::')[-1]
28
+ end
29
+
30
+ def self.error_handler(response, http_status)
31
+ if http_status.to_s.empty? || http_status == 0
32
+ NoConnectionError.new({
33
+ "details" => [
34
+ {
35
+ "debug_message" => I18n.t(
36
+ 'error.requestor.connection',
37
+ { base: Conekta.api_base, locale: :en }
38
+ ),
39
+ "message" => I18n.t(
40
+ 'error.requestor.connection_purchaser',
41
+ { locale: Conekta.locale.to_sym }
42
+ ),
43
+ "code" => "error.requestor.connection"
44
+ }
45
+ ]
46
+ })
47
+ else
48
+ case http_status
49
+ when -1, 0
50
+ NoConnectionError.new(response)
51
+ when 400
52
+ MalformedRequestError.new(response)
53
+ when 401
54
+ AuthenticationError.new(response)
55
+ when 402
56
+ ProcessingError.new(response)
57
+ when 404
58
+ ResourceNotFoundError.new(response)
59
+ when 409
60
+ VersionConflictError.new(response)
61
+ when 422
62
+ ParameterValidationError.new(response)
63
+ when 428
64
+ PreconditionRequiredError.new(response)
65
+ when 500
66
+ ApiError.new(response)
67
+ else
68
+ Error.new(response)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ class ApiError < Error
74
+ end
75
+
76
+ class NoConnectionError < Error
77
+ end
78
+
79
+ class AuthenticationError < Error
80
+ end
81
+
82
+ class ParameterValidationError < Error
83
+ end
84
+
85
+ class ProcessingError < Error
86
+ end
87
+
88
+ class ResourceNotFoundError < Error
89
+ end
90
+
91
+ class VersionConflictError < Error
92
+ end
93
+
94
+ class PreconditionRequiredError < Error
95
+ end
96
+
97
+ class MalformedRequestError < Error
98
+ end
99
+ end
@@ -0,0 +1,14 @@
1
+ module Conekta
2
+ class ErrorDetails < ConektaObject
3
+ attr_reader :debug_message, :message, :param, :code
4
+
5
+ def initialize(options={})
6
+ load_from(options)
7
+ @debug_message = options["debug_message"]
8
+ @message = options["message"]
9
+ @param = options["param"]
10
+ @code = options["code"]
11
+ super()
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Conekta
2
+ class Event < Resource
3
+ include Conekta::Operations::Where
4
+ include Conekta::Operations::Find
5
+
6
+ attr_accessor :data, :livemode, :webhook_status, :created_at, :type
7
+
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Conekta
2
+ class LineItem < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :name, :description, :unit_price, :quantity,
8
+ :sku, :shippable, :tags, :brand, :type,
9
+ :parent_id
10
+
11
+ def _url
12
+ ensure_id
13
+
14
+ "#{self.order._url}#{self.class._url}/#{id}"
15
+ end
16
+
17
+ def delete
18
+ self.delete_member('order','line_items')
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ module Conekta
2
+ class List < ConektaObject
3
+ attr_reader :elements_type, :params, :has_more, :total
4
+
5
+ def initialize(elements_type, params)
6
+ super()
7
+ @elements_type = elements_type
8
+ @params = (params || {})
9
+ @total = 0
10
+ end
11
+
12
+ def add_element(element)
13
+ element =
14
+ Conekta::Util.convert_to_conekta_object(element['object'], element)
15
+
16
+ self[@total] = element
17
+ self.values[@total] = element
18
+ @total = @total + 1
19
+
20
+ self
21
+ end
22
+
23
+ def next(options={})
24
+ if self.size > 0
25
+ @params["next"] = self.last.id
26
+ end
27
+
28
+ @params["previous"] = nil
29
+
30
+ move_cursor(options[:limit])
31
+ end
32
+
33
+ def previous(options={})
34
+ if self.size > 0
35
+ @params["previous"] = self.first.id
36
+ end
37
+
38
+ @params["next"] = nil
39
+
40
+ move_cursor(options[:limit])
41
+ end
42
+
43
+ def load_from(response)
44
+ @has_more = response["has_more"]
45
+ @total = response["total"]
46
+ self.map{|key, _| self.unset_key(key) }
47
+ super(response["data"])
48
+ end
49
+
50
+ private
51
+
52
+ def move_cursor(limit)
53
+ @params["limit"] = limit if !limit.nil? && !limit.to_s.empty?
54
+ _url = Util.types[@elements_type.downcase]._url
55
+ response = Requestor.new.request(:get, _url, @params)
56
+ self.load_from(response)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,10 @@
1
+ module Conekta
2
+ class Log < Resource
3
+ include Conekta::Operations::Where
4
+ include Conekta::Operations::Find
5
+
6
+ attr_accessor :method, :url, :status, :version, :ip_address, :related,
7
+ :request_body, :response_body, :request_headers,
8
+ :response_headers, :created_at, :query_string
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module Conekta
2
+ class Method < Resource
3
+ end
4
+ end
@@ -0,0 +1,19 @@
1
+ module Conekta
2
+ module Operations
3
+ module Create
4
+ module ClassMethods
5
+ def create(api_key, params)
6
+ _url = Util.types[self.class_name.downcase]._url
7
+ response = Requestor.new(api_key).request(:post, _url, params)
8
+ instance = self.new
9
+ instance.load_from(response)
10
+ instance.api_key = api_key
11
+ instance
12
+ end
13
+ end
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,40 @@
1
+ module Conekta
2
+ module Operations
3
+ module CreateMember
4
+ def create_member(api_key, member, params)
5
+ _url = [self._url, member].join('/')
6
+ member = member.to_sym
7
+ response = Requestor.new(api_key).request(:post, _url, params)
8
+
9
+ if self.send(member) &&
10
+ (self.send(member).class.class_name == "ConektaObject" ||
11
+ self.send(member).class.class_name == "List")
12
+ arr = []
13
+
14
+ if self.send(member).class.class_name == "List"
15
+ self.send(member).add_element(response)
16
+ else
17
+ self.method(member).call.values.each do |_,v|
18
+ arr << v.to_hash
19
+ end
20
+
21
+ arr << response
22
+ self.send(member).load_from(arr)
23
+ self.load_from
24
+ end
25
+
26
+ instances = self.send(member)
27
+ instance = instances.last
28
+ else
29
+ instance = Util.types[member.to_s].new()
30
+ instance.load_from(response)
31
+ self.create_attr(member.to_s, instance)
32
+ self.set_val(member.to_sym, instance)
33
+ self.load_from
34
+ end
35
+
36
+ instance
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ module Conekta
2
+ module Operations
3
+ module CustomAction
4
+ def custom_action(method, action=nil, params=nil)
5
+ _url = action ? [self._url, action].join('/') : self._url
6
+ response = Requestor.new.request(method, _url, params)
7
+
8
+ self.load_from(response)
9
+ self
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,45 @@
1
+ module Conekta
2
+ module Operations
3
+ module Delete
4
+ def delete
5
+ self.custom_action(:delete, nil, nil)
6
+ self
7
+ end
8
+ def delete_member(parent, member)
9
+ self.custom_action(:delete, nil, nil)
10
+
11
+ parent = parent.to_sym
12
+ member = member.to_sym
13
+ obj = self.method(parent).call.method(member).call
14
+
15
+ if obj.class.class_name == "ConektaObject"
16
+ self.method(parent).call.method(member).call.each do |(k, v)|
17
+ if v.id == self.id
18
+ self.method(parent).call.method(member).call[k] = nil
19
+ # Shift hash array
20
+ shift = false
21
+ self.method(parent).call.method(member).call.each_with_index do |v,i|
22
+ if shift
23
+ self.method(parent).call.method(member).call.set_val(i-1,v[1])
24
+ self.method(parent).call.method(member).call[i-1] = v[1]
25
+ end
26
+ if v[1] == nil
27
+ shift = true
28
+ end
29
+ end
30
+ n_members = self.method(parent).call.method(member).call.count
31
+ last_index = n_members - 1
32
+ # Remove last member because the hash array was shifted
33
+ self.method(parent).call.method(member).call.unset_key(last_index)
34
+ self.method(parent).call.method(member).call.delete(last_index)
35
+ break
36
+ end
37
+ end
38
+ else
39
+ self.create_attr(member.to_s, nil)
40
+ end
41
+ self
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ module Conekta
2
+ module Operations
3
+ module Find
4
+ module ClassMethods
5
+ def find(api_key, id)
6
+ instance = self.new(id)
7
+ response = Requestor.new(api_key).request(:get, instance._url)
8
+ instance.load_from(response)
9
+ instance.api_key = api_key
10
+ instance
11
+ end
12
+
13
+ # <b>DEPRECATED:</b> Please use <tt>find</tt> instead.
14
+ alias_method :retrieve, :find
15
+ end
16
+ def self.included(base)
17
+ base.extend(ClassMethods)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module Conekta
2
+ module Operations
3
+ module Update
4
+ def update(api_key,params)
5
+ response = Requestor.new(api_key).request(:put, self._url, params)
6
+ self.load_from(response)
7
+ self
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ module Operations
3
+ module Where
4
+
5
+ def self.handle_type_of_paging(response, class_name, params)
6
+ if response.kind_of?(Hash) && response["object"] == "list"
7
+ List.new(class_name, params)
8
+ else
9
+ ConektaObject.new
10
+ end
11
+ end
12
+
13
+ module ClassMethods
14
+ def where(params=nil)
15
+ _url = Util.types[self.class_name.downcase]._url
16
+ response = Requestor.new.request(:get, _url, params)
17
+ instance = ::Conekta::Operations::Where.handle_type_of_paging(response, self.class_name, params)
18
+ instance.load_from(response)
19
+ instance
20
+ end
21
+
22
+ # <b>DEPRECATED:</b> Please use <tt>where</tt> instead.
23
+ alias_method :all, :where
24
+ end
25
+ def self.included(base)
26
+ base.extend(ClassMethods)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,87 @@
1
+ module Conekta
2
+ class Order < Resource
3
+ include Conekta::Operations::Find
4
+ include Conekta::Operations::Where
5
+ include Conekta::Operations::Create
6
+ include Conekta::Operations::Update
7
+ include Conekta::Operations::CreateMember
8
+ include Conekta::Operations::CustomAction
9
+
10
+ attr_accessor :livemode, :amount, :payment_status, :customer_id, :currency,
11
+ :metadata, :created_at, :updated_at, :tax_lines, :line_items,
12
+ :shipping_lines, :discount_lines, :shipping_contact, :charges,
13
+ :api_key
14
+
15
+ def initialize(id=nil)
16
+ @id = id
17
+ @line_items ||= List.new("LineItem", {})
18
+ @tax_lines ||= List.new("TaxLine", {})
19
+ @shipping_lines ||= List.new("ShippingLine", {})
20
+ @discount_lines ||= List.new("DiscountLine", {})
21
+ @charges ||= List.new("Charge", {})
22
+ super(id)
23
+ end
24
+
25
+ def load_from(response = nil)
26
+ if response
27
+ super
28
+ end
29
+
30
+ order = self
31
+ submodels = [:line_items, :tax_lines, :shipping_lines, :discount_lines,
32
+ :charges]
33
+ create_submodels_lists(order, submodels)
34
+ end
35
+
36
+ #Attribute accessors
37
+ def create_line_item(params)
38
+ self.create_member_with_relation(api_key, 'line_items', params, self)
39
+ end
40
+
41
+ def create_tax_line(params)
42
+ self.create_member_with_relation(api_key, 'tax_lines', params, self)
43
+ end
44
+
45
+ def create_shipping_line(params)
46
+ self.create_member_with_relation(api_key, 'shipping_lines', params, self)
47
+ end
48
+
49
+ def create_discount_line(params)
50
+ self.create_member_with_relation(api_key, 'discount_lines', params, self)
51
+ end
52
+
53
+ def create_charge(params)
54
+ self.create_member(api_key, 'charges', params)
55
+ end
56
+
57
+ def create_shipping_contact(params)
58
+ self.update(shipping_contact: params).shipping_contact
59
+ end
60
+
61
+ #State transitions
62
+ def authorize_capture(params={})
63
+ custom_action(:post, 'capture', params)
64
+ end
65
+
66
+ def void(params={})
67
+ custom_action(:post, 'void', params)
68
+ end
69
+
70
+ def refund(params={})
71
+ custom_action(:post, 'refund', params)
72
+ end
73
+
74
+ private
75
+
76
+ def create_submodels_lists(order, submodels)
77
+ submodels.each do |submodel|
78
+ self.send(submodel).each do |k, v|
79
+ v.create_attr('order', order)
80
+
81
+ self.send(submodel).set_val(k,v)
82
+ end if self.respond_to?(submodel) && !self.send(submodel).nil?
83
+ end
84
+ end
85
+
86
+ end
87
+ end