tray-checkout 0.0.1 → 0.1.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/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,7 @@
1
+ == Version 0.1.0
2
+ - Support to v1 API version.
3
+ - A lot refactories.
4
+
1
5
  == Version 0.0.1
2
6
  - First stable version.
3
7
 
data/README.rdoc CHANGED
@@ -19,28 +19,41 @@ Tray Checkout API
19
19
  transaction = Tray::Checkout::Transaction.new
20
20
 
21
21
  Getting an existing transaction:
22
- txn = transaction.get("522045453u5uu32e0u8014f060uuu5uu")
23
- txn[:success] # => true
24
- txn[:transaction_token] # => "522045453u5uu32e0u8014f060uuu5uu"
25
- txn[:transaction_id] # => 501
26
- txn[:status] # => :waiting_payment
27
- txn[:payment_method] # => :boleto
28
- txn[:price_payment] # => 213.21
29
- txn[:price_seller] # => 199.19
30
- txn[:split] # => 1
31
- txn[:payment][:url_payment] # => "http://checkout.sandbox.tray.com.br/payment/billet/u9uuu8731319u59u3073u9011uu6u6uu"
32
- txn[:date_transaction].strftime("%d/%m/%Y") # => "03/12/2012"
22
+ response = transaction.get("522045453u5uu32e0u8014f060uuu5uu")
23
+ response.success? # => true
24
+
25
+ # Transaction
26
+ response.transaction[:token] # => "522045453u5uu32e0u8014f060uuu5uu"
27
+ response.transaction[:id] # => 501
28
+ response.transaction[:status] # => :waiting_payment
29
+ response.transaction[:status_name] # => "Aguardando Pagamento"
30
+ response.transaction[:price_payment] # => 213.21
31
+ response.transaction[:price_seller] # => 199.19
32
+ response.transaction[:split] # => 1
33
+ response.transaction[:date_transaction].strftime("%d/%m/%Y") # => "03/12/2012"
34
+
35
+ # Payment
36
+ response.payment[:method] # => :boleto
37
+ response.payment[:method_name] # => "Boleto Bancario"
38
+ response.payment[:price] # => 213.21
39
+ response.payment[:split] # => 1
40
+ response.payment[:url] # => "http://checkout.sandbox.tray.com.br/payment/billet/u9uuu8731319u59u3073u9011uu6u6uu"
41
+
42
+ # Customer
43
+ response.customer[:name] # => "Pedro Bonamides"
44
+ response.customer[:email] # => "pedro@bo.com.br"
45
+ response.customer[:cpf] # => "18565842673"
33
46
 
34
47
  When the transaction is not found:
35
- txn = transaction.get("xxxxx00000yyyy")
36
- txn[:success] # => false
37
- txn[:transaction_id] # => nil
38
- txn[:errors].first[:code] # => "003042"
39
- txn[:errors].first[:message] # => "Transação não encontrada"
48
+ response = transaction.get("xxxxx00000yyyy")
49
+ response.success? # => false
50
+ response.transaction[:id] # => nil
51
+ response[:errors].first[:code] # => "003042"
52
+ response[:errors].first[:message] # => "Transação não encontrada"
40
53
 
41
54
  Creating a successful transaction:
42
- txn = transaction.create(
43
- token_account: "949u5uu9ef36f7u",
55
+ response = transaction.create(
56
+ token_account: "123u5uu9ef36f7u",
44
57
  customer: {
45
58
  name: "Pedro Bonamides",
46
59
  cpf: "18565842673",
@@ -48,12 +61,12 @@ Creating a successful transaction:
48
61
  sex: :male,
49
62
  marital_status: :single,
50
63
  contacts: [
51
- { contact_type: :home,
52
- number_contact: "1142360873"
64
+ { type: :home,
65
+ number: "1142360873"
53
66
  }
54
67
  ],
55
68
  addresses: [
56
- { address_type: :billing,
69
+ { type: :billing,
57
70
  street: "Avenida Pedro Alvares Cabral",
58
71
  number: "123",
59
72
  neighborhood: "Parque Ibirapuera",
@@ -68,39 +81,54 @@ Creating a successful transaction:
68
81
  shipping_type: "Sedex",
69
82
  shipping_price: 13.94,
70
83
  url_notification: "http://prodis.blog.br/tray_notification"
84
+ products: [
85
+ { code: "LOGO-8278",
86
+ quantity: 2,
87
+ price_unit: 100.99,
88
+ description: "Logo Prodis"
89
+ },
90
+ { code: "877",
91
+ quantity: 1,
92
+ price_unit: 10.00,
93
+ description: "Outro produto"
94
+ }
95
+ ]
71
96
  },
72
- transaction_product: [
73
- { code: "LOGO-8278",
74
- quantity: 2,
75
- price_unit: 100.99,
76
- description: "Logo Prodis"
77
- },
78
- { code: "877",
79
- quantity: 1,
80
- price_unit: 10.00,
81
- description: "Outro produto"
82
- }
83
- ],
84
97
  payment: {
85
- payment_method: :mastercard,
98
+ method: :mastercard,
86
99
  split: 3,
87
- card_name: "ZEFINHA NOCEGA",
88
- card_number: "5105105105105100",
89
- card_expdate_month: "09",
90
- card_expdate_year: "2015",
91
- card_cvv: "123"
100
+ card: {
101
+ name: "ZEFINHA NOCEGA",
102
+ number: "5105105105105100",
103
+ expdate_month: "09",
104
+ expdate_year: "2015",
105
+ cvv: "123"
106
+ }
92
107
  }
93
108
  )
94
- txn[:success] # => true
95
- txn[:transaction_token] # => "87654321u5uu92e4u09876543uuu5uu"
96
- txn[:transaction_id] # => 503
97
- txn[:status] # => :approved
98
- txn[:status_name] # => "Aprovada"
99
- txn[:payment_method] # => :mastercard
100
- txn[:payment_method_name] # => "Mastercard"
101
- txn[:price_payment] # => 213.21
102
- txn[:price_seller] # => 199.19
103
- txn[:date_payment].strftime("%d/%m/%Y") # => "05/12/2012"
109
+ response.success? # => true
110
+
111
+ # Transaction
112
+ response.transaction[:token] # => "87654321u5uu92e4u09876543uuu5uu"
113
+ response.transaction[:id] # => 503
114
+ response.transaction[:status] # => :approved
115
+ response.transaction[:status_name] # => "Aprovada"
116
+ response.transaction[:price_payment] # => 213.21
117
+ response.transaction[:price_seller] # => 199.19
118
+ response.transaction[:split] # => 3
119
+ response.transaction[:date_transaction].strftime("%d/%m/%Y") # => "05/12/2012"
120
+
121
+ # Payment
122
+ response.payment[:method] # => :mastercard
123
+ response.payment[:method_name] # => "Mastercard"
124
+ response.payment[:price] # => 213.21
125
+ response.payment[:split] # => 3
126
+ response.payment[:url] # => "http://checkout.sandbox.tray.com.br/payment/billet/u9uuu8731319u59u3073u9011uu6u6uu"
127
+
128
+ # Customer
129
+ response.customer[:name] # => "Pedro Bonamides"
130
+ response.customer[:email] # => "pedro@bo.com.br"
131
+ response.customer[:cpf] # => "18565842673"
104
132
 
105
133
 
106
134
  == Author
@@ -1,21 +1,15 @@
1
1
  # encoding: UTF-8
2
2
  class Hash
3
- def symbolize_all_keys!
4
- symbolize_all_keys_in self
5
- end
6
-
7
- private
8
-
9
- def symbolize_all_keys_in(hash)
10
- case
11
- when hash.is_a?(Array)
12
- hash.each { |value| symbolize_all_keys_in(value) }
13
- when hash.is_a?(Hash)
14
- hash.symbolize_keys!
3
+ def symbolize_all_keys
4
+ {}.tap do |results|
5
+ self.each do |key, value|
6
+ if value.is_a?(Array)
7
+ symbolized_value = value.map { |item| item.is_a?(Hash) ? item.symbolize_all_keys : item }
8
+ else
9
+ symbolized_value = value.is_a?(Hash) ? value.symbolize_all_keys : value
10
+ end
15
11
 
16
- hash.each_value do |value|
17
- value.symbolize_keys! if value.is_a?(Hash)
18
- symbolize_all_keys_in(value)
12
+ results[(key.to_sym rescue key)] = symbolized_value
19
13
  end
20
14
  end
21
15
  end
@@ -1,98 +1,15 @@
1
1
  # encoding: UTF-8
2
- require 'active_support/core_ext'
3
-
4
2
  module Tray
5
3
  module Checkout
6
4
  class Parser
7
5
  def response(xml)
8
- create_response_from(xml)
9
- success? ? data : errors
10
- end
11
-
12
- def payment_params!(params)
13
- customer_params_types! params[:customer]
14
- payment_params_types! params[:payment]
15
-
16
- params
17
- end
18
-
19
- private
20
-
21
- def customer_params_types!(customer)
22
- return unless customer
23
- customer[:gender] = SEX[customer[:sex]] if customer[:sex]
24
- customer[:relationship] = MARITAL_STATUS[customer[:marital_status]] if customer[:marital_status]
25
- contacts_params_types! customer[:contacts]
26
- addresses_params_types! customer[:addresses]
27
- end
28
-
29
- def payment_params_types!(payment)
30
- return unless payment
31
- payment[:payment_method_id] = PAYMENT_METHOD[payment[:payment_method]] if payment[:payment_method]
32
- end
33
-
34
- def contacts_params_types!(contacts)
35
- return unless contacts
36
-
37
- contacts.each do |contact|
38
- contact[:type_contact] = CONTACT_TYPE[contact[:contact_type]] if contact[:contact_type]
39
- end
40
- end
41
-
42
- def addresses_params_types!(addresses)
43
- return unless addresses
44
-
45
- addresses.each do |address|
46
- address[:type_address] = ADDRESS_TYPE[address[:address_type]] if address[:address_type]
47
- end
6
+ response_parser = ResponseParser.new(xml)
7
+ response_parser.parse
48
8
  end
49
9
 
50
- def create_response_from(xml)
51
- @response = Hash.from_xml(xml).symbolize_all_keys![:transaction]
52
- end
53
-
54
- def success?
55
- @response[:message_response][:message] == "success"
56
- end
57
-
58
- def data
59
- data_response = @response[:data_response][:transaction]
60
- transaction_response_types! data_response
61
- payment_response_types! data_response
62
- date_to_time! data_response
63
- data_response[:success] = true
64
- data_response
65
- end
66
-
67
- def transaction_response_types!(transaction)
68
- transaction[:payment_method] = PAYMENT_METHOD.invert[transaction[:payment_method_id]]
69
- transaction[:status] = TRANSACTION_STATUS.invert[transaction[:status_id]]
70
- end
71
-
72
- def payment_response_types!(transaction)
73
- payment = transaction[:payment]
74
- payment[:payment_method] = PAYMENT_METHOD.invert[payment[:payment_method_id]]
75
- end
76
-
77
- def errors
78
- error_response = @response[:error_response]
79
-
80
- if error_response[:validation_errors]
81
- error_response[:errors] = error_response.delete(:validation_errors)
82
- end
83
-
84
- error_response[:success] = false
85
- error_response
86
- end
87
-
88
- def date_to_time!(hash)
89
- hash.each do |key, value|
90
- date_to_time!(value) if value.is_a?(Hash)
91
-
92
- if key.to_s.starts_with?("date_") && value
93
- hash[key] = (value.to_time rescue value) || value
94
- end
95
- end
10
+ def transaction_params(params)
11
+ transaction_params_parser = Tray::Checkout::TransactionParamsParser.new(params)
12
+ transaction_params_parser.parse
96
13
  end
97
14
  end
98
15
  end
@@ -0,0 +1,19 @@
1
+ # encoding: UTF-8
2
+ module Tray
3
+ module Checkout
4
+ class Response
5
+ attr_accessor :transaction,
6
+ :payment,
7
+ :customer,
8
+ :success,
9
+ :errors
10
+
11
+ alias :success? :success
12
+
13
+ def initialize
14
+ @success = false
15
+ @errors = []
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: UTF-8
2
+ require 'active_support/core_ext'
3
+
4
+ module Tray
5
+ module Checkout
6
+ class ResponseParser
7
+ def initialize(xml)
8
+ @xml = xml
9
+ end
10
+
11
+ def parse
12
+ response = Response.new
13
+ response.success = success?
14
+
15
+ if response.success?
16
+ response.transaction = transaction
17
+ response.payment = payment
18
+ response.customer = customer
19
+ else
20
+ response.errors = errors
21
+ end
22
+
23
+ response
24
+ end
25
+
26
+ private
27
+
28
+ def response_hash
29
+ @response_hash ||= create_response_hash
30
+ end
31
+
32
+ def create_response_hash
33
+ Hash.from_xml(@xml).symbolize_all_keys[:transaction]
34
+ end
35
+
36
+ def success?
37
+ response_hash[:message_response][:message] == "success"
38
+ end
39
+
40
+ def transaction
41
+ data_clone = data.clone
42
+ data_clone.delete(:payment)
43
+ data_clone.delete(:customer)
44
+ data_clone
45
+ end
46
+
47
+ def payment
48
+ data[:payment]
49
+ end
50
+
51
+ def customer
52
+ data[:customer]
53
+ end
54
+
55
+ def data
56
+ @data ||= create_data_response
57
+ end
58
+
59
+ def create_data_response
60
+ data_response = response_hash[:data_response][:transaction]
61
+ transaction_map! data_response
62
+ payment_map! data_response
63
+ customer_map! data_response
64
+ date_to_time! data_response
65
+ data_response
66
+ end
67
+
68
+ def transaction_map!(transaction)
69
+ transaction[:status] = TRANSACTION_STATUS.invert[transaction.delete(:status_id)]
70
+ transaction[:id] = transaction.delete(:transaction_id)
71
+ transaction[:token] = transaction.delete(:transaction_token)
72
+ transaction[:affiliates] = transaction.delete(:transaction_affiliates)
73
+ end
74
+
75
+ def payment_map!(transaction)
76
+ payment = transaction[:payment]
77
+ payment[:method] = PAYMENT_METHOD.invert[payment.delete(:payment_method_id)]
78
+ payment[:method_name] = payment.delete(:payment_method_name)
79
+ payment[:price] = payment.delete(:price_payment)
80
+ payment[:response] = payment.delete(:payment_response)
81
+ payment[:url] = payment.delete(:url_payment)
82
+ end
83
+
84
+ def customer_map!(transaction)
85
+ customer = transaction[:customer]
86
+ customer[:contacts].each do |contact|
87
+ contact[:type] = CONTACT_TYPE.invert[contact.delete(:type_contact)]
88
+ contact[:id] = contact.delete(:contact_id)
89
+ contact[:number] = contact.delete(:value)
90
+ end
91
+ end
92
+
93
+ def date_to_time!(hash)
94
+ hash.each do |key, value|
95
+ date_to_time!(value) if value.is_a?(Hash)
96
+
97
+ if key.to_s.starts_with?("date_") && value
98
+ hash[key] = (value.to_time rescue value) || value
99
+ end
100
+ end
101
+ end
102
+
103
+ def errors
104
+ error_response = response_hash[:error_response]
105
+
106
+ if error_response[:validation_errors]
107
+ error_response[:errors] = error_response.delete(:validation_errors)
108
+ end
109
+
110
+ error_response[:errors]
111
+ end
112
+ end
113
+ end
114
+ end
@@ -2,20 +2,24 @@
2
2
  module Tray
3
3
  module Checkout
4
4
  class Transaction
5
- URL = "http://api.sandbox.checkout.tray.com.br/api/transactions"
5
+ URL = "http://api.sandbox.checkout.tray.com.br/api/v1/transactions"
6
6
 
7
7
  def get(token)
8
- response = web_service.request!("#{URL}/get_by_token", { token: token })
9
- parser.response(response)
8
+ request("get_by_token", { token: token })
10
9
  end
11
10
 
12
11
  def create(params)
13
- response = web_service.request!("#{URL}/pay_complete", parser.payment_params!(params))
14
- parser.response(response)
12
+ request("pay_complete", parser.transaction_params(params))
15
13
  end
16
14
 
17
15
  private
18
16
 
17
+ def request(path, params)
18
+ xml = web_service.request!("#{URL}/#{path}", params)
19
+ #puts xml
20
+ parser.response(xml)
21
+ end
22
+
19
23
  def web_service
20
24
  @web_service ||= Tray::Checkout::WebService.new
21
25
  end
@@ -0,0 +1,55 @@
1
+ # encoding: UTF-8
2
+ module Tray
3
+ module Checkout
4
+ class TransactionParamsParser
5
+ def initialize(params)
6
+ @params = params.clone
7
+ end
8
+
9
+ def parse
10
+ customer_map! @params[:customer]
11
+ payment_map! @params[:payment]
12
+ products_map! @params
13
+ @params
14
+ end
15
+
16
+ private
17
+
18
+ def customer_map!(customer)
19
+ return unless customer
20
+ customer[:gender] = SEX[customer[:sex]] if customer[:sex]
21
+ customer[:relationship] = MARITAL_STATUS[customer[:marital_status]] if customer[:marital_status]
22
+ contacts_map! customer[:contacts]
23
+ addresses_map! customer[:addresses]
24
+ end
25
+
26
+ def payment_map!(payment)
27
+ return unless payment
28
+ payment[:payment_method_id] = PAYMENT_METHOD[payment[:method]] if payment[:method]
29
+ payment[:card].each { |key, value| payment["card_#{key}".to_sym] = value } if payment[:card]
30
+ end
31
+
32
+ def contacts_map!(contacts)
33
+ return unless contacts
34
+
35
+ contacts.each do |contact|
36
+ contact[:type_contact] = CONTACT_TYPE[contact[:type]] if contact[:type]
37
+ contact[:number_contact] = contact.delete(:number)
38
+ end
39
+ end
40
+
41
+ def addresses_map!(addresses)
42
+ return unless addresses
43
+
44
+ addresses.each do |address|
45
+ address[:type_address] = ADDRESS_TYPE[address[:type]] if address[:type]
46
+ end
47
+ end
48
+
49
+ def products_map!(params)
50
+ return unless params[:transaction]
51
+ params[:transaction_product] = params[:transaction].delete(:products)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  module Tray
3
3
  module Checkout
4
- VERSION = "0.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
6
6
  end
7
7
 
data/lib/tray-checkout.rb CHANGED
@@ -4,5 +4,8 @@ require 'tray/checkout'
4
4
  require 'tray/checkout/constants'
5
5
  require 'tray/checkout/hash'
6
6
  require 'tray/checkout/parser'
7
+ require 'tray/checkout/response'
8
+ require 'tray/checkout/response_parser'
7
9
  require 'tray/checkout/transaction'
10
+ require 'tray/checkout/transaction_params_parser'
8
11
  require 'tray/checkout/web_service'
@@ -8,6 +8,7 @@ end
8
8
  def body_for(response)
9
9
  case response
10
10
  when :get_success_boleto,
11
+ :get_success_mastercard,
11
12
  :get_failure_not_found,
12
13
  :create_success_boleto,
13
14
  :create_success_mastercard,
@@ -1,3 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
1
2
  <transaction>
2
3
  <message_response>
3
4
  <message>error</message>