conekta 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG +9 -1
  4. data/Gemfile +1 -0
  5. data/README.md +68 -46
  6. data/lib/conekta.rb +20 -1
  7. data/lib/conekta/address.rb +1 -0
  8. data/lib/conekta/card.rb +17 -3
  9. data/lib/conekta/charge.rb +7 -0
  10. data/lib/conekta/conekta_object.rb +25 -8
  11. data/lib/conekta/customer.rb +55 -4
  12. data/lib/conekta/destination.rb +29 -0
  13. data/lib/conekta/discount_line.rb +32 -0
  14. data/lib/conekta/error.rb +35 -37
  15. data/lib/conekta/error_list.rb +33 -0
  16. data/lib/conekta/event.rb +4 -1
  17. data/lib/conekta/fiscal_entity.rb +37 -0
  18. data/lib/conekta/line_item.rb +30 -0
  19. data/lib/conekta/list.rb +59 -0
  20. data/lib/conekta/log.rb +4 -0
  21. data/lib/conekta/operations/create_member.rb +20 -10
  22. data/lib/conekta/operations/custom_action.rb +1 -1
  23. data/lib/conekta/operations/delete.rb +3 -1
  24. data/lib/conekta/operations/where.rb +11 -2
  25. data/lib/conekta/order.rb +90 -0
  26. data/lib/conekta/payee.rb +4 -0
  27. data/lib/conekta/payment_source.rb +30 -0
  28. data/lib/conekta/payout_method.rb +12 -3
  29. data/lib/conekta/plan.rb +5 -0
  30. data/lib/conekta/refund.rb +2 -0
  31. data/lib/conekta/requestor.rb +14 -4
  32. data/lib/conekta/resource.rb +26 -4
  33. data/lib/conekta/return.rb +25 -0
  34. data/lib/conekta/shipping_contact.rb +32 -0
  35. data/lib/conekta/shipping_line.rb +33 -0
  36. data/lib/conekta/subscription.rb +17 -3
  37. data/lib/conekta/tax_line.rb +30 -0
  38. data/lib/conekta/token.rb +2 -0
  39. data/lib/conekta/util.rb +37 -3
  40. data/lib/conekta/version.rb +1 -1
  41. data/lib/conekta/webhook.rb +2 -0
  42. data/spec/conekta/1.0.0/.DS_Store +0 -0
  43. data/spec/conekta/1.0.0/card_spec.rb +40 -0
  44. data/spec/conekta/{charge_spec.rb → 1.0.0/charge_spec.rb} +1 -0
  45. data/spec/conekta/{customer_spec.rb → 1.0.0/customer_spec.rb} +3 -2
  46. data/spec/conekta/{error_spec.rb → 1.0.0/error_spec.rb} +3 -1
  47. data/spec/conekta/{event_spec.rb → 1.0.0/event_spec.rb} +1 -0
  48. data/spec/conekta/{log_spec.rb → 1.0.0/log_spec.rb} +1 -0
  49. data/spec/conekta/{payout_spec.rb → 1.0.0/payout_spec.rb} +1 -0
  50. data/spec/conekta/{plan_spec.rb → 1.0.0/plan_spec.rb} +1 -0
  51. data/spec/conekta/{token_spec.rb → 1.0.0/token_spec.rb} +1 -0
  52. data/spec/conekta/{webhook_spec.rb → 1.0.0/webhook_spec.rb} +1 -0
  53. data/spec/conekta/2.0.0/customer_spec.rb +49 -0
  54. data/spec/conekta/2.0.0/discount_line_spec.rb +49 -0
  55. data/spec/conekta/2.0.0/error_list_spec.rb +45 -0
  56. data/spec/conekta/2.0.0/fiscal_entity_spec.rb +67 -0
  57. data/spec/conekta/2.0.0/line_item_spec.rb +53 -0
  58. data/spec/conekta/2.0.0/list_spec.rb +29 -0
  59. data/spec/conekta/2.0.0/order_spec.rb +327 -0
  60. data/spec/conekta/{payee_spec.rb → 2.0.0/payee_spec.rb} +1 -1
  61. data/spec/conekta/2.0.0/shipping_contact_spec.rb +60 -0
  62. data/spec/conekta/2.0.0/shipping_line_spec.rb +53 -0
  63. data/spec/conekta/2.0.0/source_spec.rb +31 -0
  64. data/spec/conekta/2.0.0/tax_line_spec.rb +44 -0
  65. data/spec/conekta_spec.rb +6 -0
  66. data/spec/spec_helper.rb +11 -0
  67. data/spec/support/fixtures/orders.json +2394 -0
  68. data/spec/support/shared_context.rb +49 -0
  69. metadata +62 -21
@@ -0,0 +1,29 @@
1
+ module Conekta
2
+ class Destination < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :payee_id, :created_at, :type, :currency,
8
+ :last4, :account_holder_name, :bank
9
+
10
+ def _url
11
+ if (id.nil? || id.to_s.empty?)
12
+ exception = Error.new({
13
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
14
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
15
+ })
16
+ if Conekta.api_version == "2.0.0"
17
+ error_list = Conekta::ErrorList.new
18
+ error_list.details << exception
19
+ exception = error_list
20
+ end
21
+ raise exception
22
+ end
23
+ self.payee._url + self.class._url + "/" + id
24
+ end
25
+ def delete
26
+ self.delete_member('payee','destinations')
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
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
+ if (id.nil? || id.to_s.empty?)
11
+ exception = Error.new({
12
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
13
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
14
+ })
15
+
16
+ if Conekta.api_version == "2.0.0"
17
+ error_list = Conekta::ErrorList.new
18
+ error_list.details << exception
19
+ exception = error_list
20
+ end
21
+
22
+ raise exception
23
+ end
24
+
25
+ "#{self.order._url}#{self.class._url}/#{id}"
26
+ end
27
+
28
+ def delete
29
+ self.delete_member('order', 'discount_lines')
30
+ end
31
+ end
32
+ end
data/lib/conekta/error.rb CHANGED
@@ -1,49 +1,47 @@
1
1
  module Conekta
2
2
  class Error < Exception
3
- attr_reader :message
4
- attr_reader :message_to_purchaser
3
+ attr_reader :message, :message_to_purchaser, :param, :code
4
+ # NEW FIELDS
5
+ attr_reader :validation_error, :custom_message
6
+ # <b>DEPRECATED</b>.
5
7
  attr_reader :type
6
- attr_reader :code
7
- attr_reader :param
8
+
8
9
 
9
- def initialize(message=nil, message_to_purchaser=nil, type=nil, code=nil, param=nil)
10
- @message = message
11
- @message_to_purchaser = message_to_purchaser
12
- @type = type
13
- @code = code
14
- @param = param
10
+ def initialize(options={})
11
+ @message = options["message"]
12
+ @message_to_purchaser = options["message_to_purchaser"]
13
+ @param = options["param"]
14
+ @code = options["code"]
15
+ @validation_error = options["validation_error"]
16
+ @validation_error = options["custom_message"]
17
+ @type = options["type"]
15
18
  end
16
19
  def class_name
17
20
  self.class.name.split('::')[-1]
18
21
  end
19
- def self.error_handler(resp, code)
20
- if resp.instance_of?(Hash)
21
- @message = resp["message"] if resp.has_key?('message')
22
- @message_to_purchaser = resp["message_to_purchaser"] if resp.has_key?('message_to_purchaser')
23
- @type = resp["type"] if resp.has_key?('type')
24
- @code = resp["code"] if resp.has_key?('code')
25
- @param = resp["param"] if resp.has_key?('param')
26
- end
27
- if code == nil or code == 0 or code == nil or code == ""
28
- raise NoConnectionError.new(
29
- I18n.t('error.requestor.connection', { base: Conekta.api_base, locale: :en }),
30
- I18n.t('error.requestor.connection_purchaser', { locale: Conekta.locale.to_sym }))
31
- end
32
- case code
33
- when 400
34
- raise MalformedRequestError.new(@message, @message_to_purchaser, @type, @code, @params)
35
- when 401
36
- raise AuthenticationError.new(@message, @message_to_purchaser, @type, @code, @params)
37
- when 402
38
- raise ProcessingError.new(@message, @message_to_purchaser, @type, @code, @params)
39
- when 404
40
- raise ResourceNotFoundError.new(@message, @message_to_purchaser, @type, @code, @params)
41
- when 422
42
- raise ParameterValidationError.new(@message, @message_to_purchaser, @type, @code, @params)
43
- when 500
44
- raise ApiError.new(@message, @message_to_purchaser, @type, @code, @params)
22
+ def self.error_handler(response, http_status)
23
+ if http_status.to_s.empty? || http_status == 0
24
+ NoConnectionError.new({
25
+ "message" => I18n.t('error.requestor.connection', { base: Conekta.api_base, locale: :en }),
26
+ "message_to_purchaser" => I18n.t('error.requestor.connection_purchaser', { locale: Conekta.locale.to_sym })
27
+ })
45
28
  else
46
- raise Error.new(@message, @message_to_purchaser, @type, @code, @params)
29
+ case http_status
30
+ when 400
31
+ MalformedRequestError.new(response)
32
+ when 401
33
+ AuthenticationError.new(response)
34
+ when 402
35
+ ProcessingError.new(response)
36
+ when 404
37
+ ResourceNotFoundError.new(response)
38
+ when 422
39
+ ParameterValidationError.new(response)
40
+ when 500
41
+ ApiError.new(response)
42
+ else
43
+ Error.new(response)
44
+ end
47
45
  end
48
46
  end
49
47
  end
@@ -0,0 +1,33 @@
1
+ module Conekta
2
+ class ErrorList < Exception
3
+ attr_accessor :details
4
+
5
+ def initialize
6
+ @details = []
7
+ end
8
+
9
+ def self.error_handler(response, http_status)
10
+ exception = nil
11
+ if response.instance_of?(Hash)
12
+ if response.has_key?("details")
13
+ error_list = ErrorList.new
14
+ response["details"].each do |error|
15
+ error_list.details << self.build_error(error, http_status)
16
+ end
17
+ error_list.details << self.build_error(nil, nil) if error_list.details.empty?
18
+ exception = error_list
19
+ end
20
+ end
21
+
22
+ exception ||= self.build_error(response, http_status)
23
+
24
+ raise exception
25
+ end
26
+
27
+ private
28
+
29
+ def self.build_error(response, http_status)
30
+ Error.error_handler(response, http_status)
31
+ end
32
+ end
33
+ end
data/lib/conekta/event.rb CHANGED
@@ -2,5 +2,8 @@ module Conekta
2
2
  class Event < Resource
3
3
  include Conekta::Operations::Where
4
4
  include Conekta::Operations::Find
5
+
6
+ attr_accessor :data, :livemode, :webhook_status, :created_at, :type
7
+
5
8
  end
6
- end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Conekta
2
+ class FiscalEntity < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :tax_id, :company_name, :phone, :email, :created_at,
8
+ :parent_id, :default
9
+
10
+ def _url
11
+ if (id.nil? || id.to_s.empty?)
12
+ exception = Error.new({
13
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
14
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
15
+ })
16
+
17
+ if Conekta.api_version == "2.0.0"
18
+ error_list = Conekta::ErrorList.new
19
+ error_list.details << exception
20
+ exception = error_list
21
+ end
22
+
23
+ raise exception
24
+ end
25
+
26
+ self.send(parent)._url + "/fiscal_entities/" + id
27
+ end
28
+
29
+ def parent
30
+ self.respond_to?(:order) ? "order" : "customer"
31
+ end
32
+
33
+ def delete
34
+ self.delete_member(parent,'fiscal_entities')
35
+ end
36
+ end
37
+ end
@@ -1,4 +1,34 @@
1
1
  module Conekta
2
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
+ if (id.nil? || id.to_s.empty?)
13
+ exception = Error.new({
14
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
15
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
16
+ })
17
+
18
+ if Conekta.api_version == "2.0.0"
19
+ error_list = Conekta::ErrorList.new
20
+ error_list.details << exception
21
+ exception = error_list
22
+ end
23
+
24
+ raise exception
25
+ end
26
+
27
+ "#{self.order._url}#{self.class._url}/#{id}"
28
+ end
29
+
30
+ def delete
31
+ self.delete_member('order','line_items')
32
+ end
3
33
  end
4
34
  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
data/lib/conekta/log.rb CHANGED
@@ -2,5 +2,9 @@ module Conekta
2
2
  class Log < Resource
3
3
  include Conekta::Operations::Where
4
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
5
9
  end
6
10
  end
@@ -2,19 +2,28 @@ module Conekta
2
2
  module Operations
3
3
  module CreateMember
4
4
  def create_member(member, params)
5
- _url = [self._url, member].join('/')
6
- member = member.to_sym
5
+ _url = [self._url, member].join('/')
6
+ member = member.to_sym
7
7
  response = Requestor.new.request(:post, _url, params)
8
8
 
9
- if self.method(member).call and self.method(member).call.class.class_name == "ConektaObject"
9
+ if self.send(member) &&
10
+ (self.send(member).class.class_name == "ConektaObject" ||
11
+ self.send(member).class.class_name == "List")
10
12
  arr = []
11
- self.method(member).call.values.each do |_,v|
12
- arr << v.to_hash
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
13
24
  end
14
- arr << response
15
- self.method(member).call.load_from(arr)
16
- self.load_from
17
- instances = self.method(member).call
25
+
26
+ instances = self.send(member)
18
27
  instance = instances.last
19
28
  else
20
29
  instance = Util.types[member.to_s].new()
@@ -23,8 +32,9 @@ module Conekta
23
32
  self.set_val(member.to_sym, instance)
24
33
  self.load_from
25
34
  end
35
+
26
36
  instance
27
37
  end
28
38
  end
29
39
  end
30
- end
40
+ end
@@ -2,7 +2,7 @@ module Conekta
2
2
  module Operations
3
3
  module CustomAction
4
4
  def custom_action(method, action=nil, params=nil)
5
- _url = action ? [self._url, action].join('/') : self._url
5
+ _url = action ? [self._url, action].join('/') : self._url
6
6
  response = Requestor.new.request(method, _url, params)
7
7
 
8
8
  self.load_from(response)
@@ -7,9 +7,11 @@ module Conekta
7
7
  end
8
8
  def delete_member(parent, member)
9
9
  self.custom_action(:delete, nil, nil)
10
+
10
11
  parent = parent.to_sym
11
12
  member = member.to_sym
12
- obj = self.method(parent).call.method(member).call
13
+ obj = self.method(parent).call.method(member).call
14
+
13
15
  if obj.class.class_name == "ConektaObject"
14
16
  self.method(parent).call.method(member).call.each do |(k, v)|
15
17
  if v.id == self.id
@@ -1,11 +1,20 @@
1
1
  module Conekta
2
2
  module Operations
3
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
+
4
13
  module ClassMethods
5
14
  def where(params=nil)
6
- instance = ConektaObject.new
7
15
  _url = Util.types[self.class_name.downcase]._url
8
16
  response = Requestor.new.request(:get, _url, params)
17
+ instance = ::Conekta::Operations::Where.handle_type_of_paging(response, self.class_name, params)
9
18
  instance.load_from(response)
10
19
  instance
11
20
  end
@@ -18,4 +27,4 @@ module Conekta
18
27
  end
19
28
  end
20
29
  end
21
- end
30
+ end
@@ -0,0 +1,90 @@
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, :status, :customer_id, :currency, :capture,
11
+ :metadata, :created_at, :updated_at, :tax_lines, :line_items,
12
+ :shipping_lines, :discount_lines, :shipping_contact, :fiscal_entity,
13
+ :charges, :returns
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
+ @returns ||= List.new("Return", {})
23
+ super(id)
24
+ end
25
+
26
+ def load_from(response = nil)
27
+ if response
28
+ super
29
+ end
30
+
31
+ order = self
32
+ submodels = [:line_items, :tax_lines, :shipping_lines, :discount_lines,
33
+ :charges, :returns]
34
+ create_submodels_lists(order, submodels)
35
+
36
+ if self.respond_to?(:fiscal_entity) && self.fiscal_entity
37
+ self.fiscal_entity.create_attr('order', order)
38
+ end
39
+ end
40
+
41
+ def create_line_item(params)
42
+ self.create_member('line_items', params)
43
+ end
44
+
45
+ def create_tax_line(params)
46
+ self.create_member('tax_lines', params)
47
+ end
48
+
49
+ def create_shipping_line(params)
50
+ self.create_member('shipping_lines', params)
51
+ end
52
+
53
+ def create_discount_line(params)
54
+ self.create_member('discount_lines', params)
55
+ end
56
+
57
+ def create_charge(params)
58
+ self.create_member('charges', params)
59
+ end
60
+
61
+ def create_return(params)
62
+ self.create_member('returns', params)
63
+ end
64
+
65
+ def create_fiscal_entity(params)
66
+ self.update(fiscal_entity: params).fiscal_entity
67
+ end
68
+
69
+ def create_shipping_contact(params)
70
+ self.update(shipping_contact: params).shipping_contact
71
+ end
72
+
73
+ def capture_order
74
+ custom_action(:put, 'capture')
75
+ end
76
+
77
+ private
78
+
79
+ def create_submodels_lists(order, submodels)
80
+ submodels.each do |submodel|
81
+ self.send(submodel).each do |k, v|
82
+ v.create_attr('order', order)
83
+
84
+ self.send(submodel).set_val(k,v)
85
+ end if self.respond_to?(submodel) && !self.send(submodel).nil?
86
+ end
87
+ end
88
+
89
+ end
90
+ end