fat_zebra 2.0.13 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. checksums.yaml +5 -13
  2. data/.rubocop.yml +42 -0
  3. data/.travis.yml +9 -2
  4. data/Gemfile +1 -1
  5. data/{README.markdown → README.md} +19 -20
  6. data/Rakefile +2 -12
  7. data/fat_zebra.gemspec +27 -0
  8. data/lib/fat_zebra/api_operation/delete.rb +38 -0
  9. data/lib/fat_zebra/api_operation/find.rb +23 -0
  10. data/lib/fat_zebra/api_operation/save.rb +62 -0
  11. data/lib/fat_zebra/api_operation/search.rb +32 -0
  12. data/lib/fat_zebra/api_operation/void.rb +52 -0
  13. data/lib/fat_zebra/api_resource.rb +135 -0
  14. data/lib/fat_zebra/bank_account.rb +21 -0
  15. data/lib/fat_zebra/batch.rb +56 -0
  16. data/lib/fat_zebra/card.rb +22 -0
  17. data/lib/fat_zebra/config.rb +65 -25
  18. data/lib/fat_zebra/customer.rb +27 -0
  19. data/lib/fat_zebra/direct_credit.rb +27 -0
  20. data/lib/fat_zebra/direct_debit.rb +27 -0
  21. data/lib/fat_zebra/errors.rb +18 -4
  22. data/lib/fat_zebra/fat_zebra_object.rb +179 -0
  23. data/lib/fat_zebra/information.rb +25 -0
  24. data/lib/fat_zebra/payment_plan.rb +62 -0
  25. data/lib/fat_zebra/purchase.rb +99 -0
  26. data/lib/fat_zebra/refund.rb +25 -0
  27. data/lib/fat_zebra/request/multipart/epilogue.rb +23 -0
  28. data/lib/fat_zebra/request/multipart/file_io.rb +40 -0
  29. data/lib/fat_zebra/request/multipart/param.rb +37 -0
  30. data/lib/fat_zebra/request/multipart/part.rb +28 -0
  31. data/lib/fat_zebra/request/multipart/stream.rb +55 -0
  32. data/lib/fat_zebra/request.rb +162 -0
  33. data/lib/fat_zebra/util.rb +70 -0
  34. data/lib/fat_zebra/validation.rb +47 -0
  35. data/lib/fat_zebra/version.rb +1 -1
  36. data/lib/fat_zebra/web_hook.rb +23 -0
  37. data/lib/fat_zebra.rb +51 -55
  38. data/spec/cassettes/FatZebra_BankAccount/_create/1_1_1.yml +57 -0
  39. data/spec/cassettes/FatZebra_BankAccount/_create/1_1_2.yml +57 -0
  40. data/spec/cassettes/FatZebra_BankAccount/_create/validations/1_1_3_1.yml +57 -0
  41. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_1.yml +172 -0
  42. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_2.yml +172 -0
  43. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_3.yml +172 -0
  44. data/spec/cassettes/FatZebra_Batch/_create/1_1_1.yml +58 -0
  45. data/spec/cassettes/FatZebra_Batch/_create/1_1_2.yml +58 -0
  46. data/spec/cassettes/FatZebra_Batch/_create/validations/1_1_3_1.yml +57 -0
  47. data/spec/cassettes/FatZebra_Batch/_create/with_file/1_1_1_1.yml +58 -0
  48. data/spec/cassettes/FatZebra_Batch/_create/with_file/1_1_1_2.yml +58 -0
  49. data/spec/cassettes/FatZebra_Batch/_create/with_path/1_1_2_1.yml +58 -0
  50. data/spec/cassettes/FatZebra_Batch/_create/with_path/1_1_2_2.yml +58 -0
  51. data/spec/cassettes/FatZebra_Batch/_find/1_2_1.yml +109 -0
  52. data/spec/cassettes/FatZebra_Batch/_find/1_2_2.yml +109 -0
  53. data/spec/cassettes/FatZebra_Batch/_result/1_4_1.yml +160 -0
  54. data/spec/cassettes/FatZebra_Batch/_search/1_3_1.yml +54 -0
  55. data/spec/cassettes/FatZebra_Batch/_search/1_3_2.yml +54 -0
  56. data/spec/cassettes/FatZebra_Batch/_search/1_3_3.yml +54 -0
  57. data/spec/cassettes/FatZebra_Card/_create/1_1_1.yml +55 -0
  58. data/spec/cassettes/FatZebra_Card/_create/1_1_2.yml +55 -0
  59. data/spec/cassettes/FatZebra_Card/_create/1_1_3.yml +55 -0
  60. data/spec/cassettes/FatZebra_Card/_create/1_1_4.yml +55 -0
  61. data/spec/cassettes/FatZebra_Card/_create/1_1_5.yml +55 -0
  62. data/spec/cassettes/FatZebra_Card/_create/1_1_6.yml +55 -0
  63. data/spec/cassettes/FatZebra_Card/_create/validations/1_1_7_1.yml +56 -0
  64. data/spec/cassettes/FatZebra_Card/_update/1_2_1.yml +105 -0
  65. data/spec/cassettes/FatZebra_Card/_update/1_2_2.yml +105 -0
  66. data/spec/cassettes/FatZebra_Card/_update/1_2_3.yml +105 -0
  67. data/spec/cassettes/FatZebra_Card/_update/validations/1_2_4_1.yml +55 -0
  68. data/spec/cassettes/FatZebra_Customer/_create/1_1_1.yml +59 -0
  69. data/spec/cassettes/FatZebra_Customer/_create/1_1_2.yml +59 -0
  70. data/spec/cassettes/FatZebra_Customer/_create/1_1_3.yml +59 -0
  71. data/spec/cassettes/FatZebra_Customer/_create/1_1_4.yml +59 -0
  72. data/spec/cassettes/FatZebra_Customer/_create/1_1_5.yml +59 -0
  73. data/spec/cassettes/FatZebra_Customer/_create/1_1_6.yml +59 -0
  74. data/spec/cassettes/FatZebra_Customer/_create/validations/1_1_7_1.yml +56 -0
  75. data/spec/cassettes/FatZebra_Customer/_delete/1_4_1.yml +113 -0
  76. data/spec/cassettes/FatZebra_Customer/_delete/1_5_1.yml +113 -0
  77. data/spec/cassettes/FatZebra_Customer/_find/1_2_1.yml +111 -0
  78. data/spec/cassettes/FatZebra_Customer/_find/1_2_2.yml +111 -0
  79. data/spec/cassettes/FatZebra_Customer/_find/1_3_1.yml +111 -0
  80. data/spec/cassettes/FatZebra_Customer/_find/1_3_2.yml +111 -0
  81. data/spec/cassettes/FatZebra_Customer/_search/1_2_1.yml +56 -0
  82. data/spec/cassettes/FatZebra_Customer/_search/1_2_2.yml +56 -0
  83. data/spec/cassettes/FatZebra_Customer/_search/1_2_3.yml +56 -0
  84. data/spec/cassettes/FatZebra_Customer/_update/1_3_1.yml +114 -0
  85. data/spec/cassettes/FatZebra_Customer/_update/1_3_2.yml +114 -0
  86. data/spec/cassettes/FatZebra_Customer/_update/1_4_1.yml +114 -0
  87. data/spec/cassettes/FatZebra_Customer/_update/1_4_2.yml +114 -0
  88. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_1.yml +56 -0
  89. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_2.yml +56 -0
  90. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_3.yml +56 -0
  91. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_4.yml +56 -0
  92. data/spec/cassettes/FatZebra_DirectCredit/_create/validations/1_1_5_1.yml +59 -0
  93. data/spec/cassettes/FatZebra_DirectCredit/_delete/1_4_1.yml +109 -0
  94. data/spec/cassettes/FatZebra_DirectCredit/_find/1_2_1.yml +107 -0
  95. data/spec/cassettes/FatZebra_DirectCredit/_find/1_2_2.yml +107 -0
  96. data/spec/cassettes/FatZebra_DirectCredit/_search/1_3_1.yml +160 -0
  97. data/spec/cassettes/FatZebra_DirectCredit/_search/1_3_2.yml +160 -0
  98. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_1.yml +56 -0
  99. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_2.yml +56 -0
  100. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_3.yml +56 -0
  101. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_4.yml +56 -0
  102. data/spec/cassettes/FatZebra_DirectDebit/_create/validations/1_1_5_1.yml +59 -0
  103. data/spec/cassettes/FatZebra_DirectDebit/_delete/1_4_1.yml +109 -0
  104. data/spec/cassettes/FatZebra_DirectDebit/_find/1_2_1.yml +107 -0
  105. data/spec/cassettes/FatZebra_DirectDebit/_find/1_2_2.yml +107 -0
  106. data/spec/cassettes/FatZebra_DirectDebit/_search/1_3_1.yml +160 -0
  107. data/spec/cassettes/FatZebra_DirectDebit/_search/1_3_2.yml +160 -0
  108. data/spec/cassettes/FatZebra_Information/_ping/1_1_1.yml +54 -0
  109. data/spec/cassettes/FatZebra_Information/_ping/1_1_2.yml +54 -0
  110. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_7_1.yml +238 -0
  111. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_7_2.yml +238 -0
  112. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_8_1.yml +238 -0
  113. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_8_2.yml +238 -0
  114. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_1.yml +118 -0
  115. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_2.yml +118 -0
  116. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_3.yml +118 -0
  117. data/spec/cassettes/FatZebra_PaymentPlan/_create/validations/1_1_4_1.yml +55 -0
  118. data/spec/cassettes/FatZebra_PaymentPlan/_delete/1_5_1.yml +172 -0
  119. data/spec/cassettes/FatZebra_PaymentPlan/_destroy/1_6_1.yml +172 -0
  120. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_1.yml +175 -0
  121. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_2.yml +175 -0
  122. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_3.yml +175 -0
  123. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_6_1.yml +178 -0
  124. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_6_2.yml +178 -0
  125. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_7_1.yml +178 -0
  126. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_7_2.yml +178 -0
  127. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_1.yml +172 -0
  128. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_2.yml +172 -0
  129. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_3.yml +172 -0
  130. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_4_1.yml +178 -0
  131. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_4_2.yml +178 -0
  132. data/spec/cassettes/FatZebra_Purchase/_capture/1_5_1.yml +111 -0
  133. data/spec/cassettes/FatZebra_Purchase/_capture/1_5_2.yml +111 -0
  134. data/spec/cassettes/FatZebra_Purchase/_capture/1_6_1.yml +111 -0
  135. data/spec/cassettes/FatZebra_Purchase/_capture/1_6_2.yml +111 -0
  136. data/spec/cassettes/FatZebra_Purchase/_create/1_1_1.yml +57 -0
  137. data/spec/cassettes/FatZebra_Purchase/_create/1_1_10.yml +57 -0
  138. data/spec/cassettes/FatZebra_Purchase/_create/1_1_11.yml +57 -0
  139. data/spec/cassettes/FatZebra_Purchase/_create/1_1_12.yml +57 -0
  140. data/spec/cassettes/FatZebra_Purchase/_create/1_1_2.yml +57 -0
  141. data/spec/cassettes/FatZebra_Purchase/_create/1_1_3.yml +57 -0
  142. data/spec/cassettes/FatZebra_Purchase/_create/1_1_4.yml +57 -0
  143. data/spec/cassettes/FatZebra_Purchase/_create/1_1_5.yml +57 -0
  144. data/spec/cassettes/FatZebra_Purchase/_create/1_1_6.yml +57 -0
  145. data/spec/cassettes/FatZebra_Purchase/_create/1_1_7.yml +57 -0
  146. data/spec/cassettes/FatZebra_Purchase/_create/1_1_8.yml +57 -0
  147. data/spec/cassettes/FatZebra_Purchase/_create/1_1_9.yml +57 -0
  148. data/spec/cassettes/FatZebra_Purchase/_find/1_2_1.yml +109 -0
  149. data/spec/cassettes/FatZebra_Purchase/_find/1_2_2.yml +109 -0
  150. data/spec/cassettes/FatZebra_Purchase/_find/1_2_3.yml +109 -0
  151. data/spec/cassettes/FatZebra_Purchase/_find/1_4_1.yml +109 -0
  152. data/spec/cassettes/FatZebra_Purchase/_find/1_4_2.yml +109 -0
  153. data/spec/cassettes/FatZebra_Purchase/_find/1_4_3.yml +109 -0
  154. data/spec/cassettes/FatZebra_Purchase/_refund/1_4_1.yml +111 -0
  155. data/spec/cassettes/FatZebra_Purchase/_refund/1_4_2.yml +111 -0
  156. data/spec/cassettes/FatZebra_Purchase/_refund/1_5_1.yml +111 -0
  157. data/spec/cassettes/FatZebra_Purchase/_refund/1_5_2.yml +111 -0
  158. data/spec/cassettes/FatZebra_Purchase/_search/1_3_1.yml +170 -0
  159. data/spec/cassettes/FatZebra_Purchase/_search/1_3_2.yml +170 -0
  160. data/spec/cassettes/FatZebra_Purchase/_search/1_3_3.yml +170 -0
  161. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_1.yml +164 -0
  162. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_2.yml +165 -0
  163. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_3.yml +164 -0
  164. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_1.yml +54 -0
  165. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_2.yml +54 -0
  166. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_3.yml +54 -0
  167. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_1.yml +613 -0
  168. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_2.yml +615 -0
  169. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_3.yml +617 -0
  170. data/spec/cassettes/FatZebra_Purchase/_void/1_6_1.yml +111 -0
  171. data/spec/cassettes/FatZebra_Purchase/_void/1_6_2.yml +111 -0
  172. data/spec/cassettes/FatZebra_Purchase/_void/1_6_3.yml +111 -0
  173. data/spec/cassettes/FatZebra_Purchase/_void/1_7_1.yml +111 -0
  174. data/spec/cassettes/FatZebra_Purchase/_void/1_7_2.yml +111 -0
  175. data/spec/cassettes/FatZebra_Purchase/_void/1_7_3.yml +111 -0
  176. data/spec/cassettes/FatZebra_Refund/_create/1_1_1.yml +111 -0
  177. data/spec/cassettes/FatZebra_Refund/_create/1_1_2.yml +111 -0
  178. data/spec/cassettes/FatZebra_Refund/_create/1_1_3.yml +111 -0
  179. data/spec/cassettes/FatZebra_Refund/_create/1_1_4.yml +111 -0
  180. data/spec/cassettes/FatZebra_Refund/_create/1_1_5.yml +111 -0
  181. data/spec/cassettes/FatZebra_Refund/_create/1_1_6.yml +111 -0
  182. data/spec/cassettes/FatZebra_Refund/_create/1_1_7.yml +111 -0
  183. data/spec/cassettes/FatZebra_Refund/_create/1_1_8.yml +111 -0
  184. data/spec/cassettes/FatZebra_Refund/_create/1_1_9.yml +111 -0
  185. data/spec/cassettes/FatZebra_Refund/_find/1_2_1.yml +163 -0
  186. data/spec/cassettes/FatZebra_Refund/_find/1_2_2.yml +163 -0
  187. data/spec/cassettes/FatZebra_Refund/_search/1_3_1.yml +281 -0
  188. data/spec/cassettes/FatZebra_Refund/_search/1_3_2.yml +281 -0
  189. data/spec/cassettes/FatZebra_Refund/_void/1_4_1.yml +165 -0
  190. data/spec/cassettes/FatZebra_Refund/_void/1_4_2.yml +165 -0
  191. data/spec/cassettes/FatZebra_Refund/_void/1_4_3.yml +165 -0
  192. data/spec/cassettes/FatZebra_WebHook/_create/1_1_1.yml +57 -0
  193. data/spec/cassettes/FatZebra_WebHook/_create/1_1_2.yml +57 -0
  194. data/spec/cassettes/FatZebra_WebHook/_create/1_1_3.yml +57 -0
  195. data/spec/cassettes/FatZebra_WebHook/_create/validations/1_1_4_1.yml +56 -0
  196. data/spec/cassettes/FatZebra_WebHook/_delete/1_4_1.yml +111 -0
  197. data/spec/cassettes/FatZebra_WebHook/_search/1_2_1.yml +222 -0
  198. data/spec/cassettes/FatZebra_WebHook/_search/1_2_2.yml +224 -0
  199. data/spec/cassettes/FatZebra_WebHook/_update/1_3_1.yml +112 -0
  200. data/spec/cassettes/FatZebra_WebHook/_update/1_3_2.yml +112 -0
  201. data/spec/fixtures/batch_test.csv +4 -0
  202. data/spec/lib/fat_zebra/bank_account_spec.rb +34 -0
  203. data/spec/lib/fat_zebra/batch_spec.rb +59 -0
  204. data/spec/lib/fat_zebra/card_spec.rb +41 -0
  205. data/spec/lib/fat_zebra/config_spec.rb +52 -0
  206. data/spec/lib/fat_zebra/customer_spec.rb +53 -0
  207. data/spec/lib/fat_zebra/direct_credit_spec.rb +53 -0
  208. data/spec/lib/fat_zebra/direct_debit_spec.rb +53 -0
  209. data/spec/lib/fat_zebra/fat_zebra_object_spec.rb +116 -0
  210. data/spec/lib/fat_zebra/information_spec.rb +13 -0
  211. data/spec/lib/fat_zebra/payment_plan_spec.rb +94 -0
  212. data/spec/lib/fat_zebra/purchase_spec.rb +92 -0
  213. data/spec/lib/fat_zebra/refund_spec.rb +72 -0
  214. data/spec/lib/fat_zebra/util_spec.rb +24 -0
  215. data/spec/lib/fat_zebra/validation_spec.rb +22 -0
  216. data/spec/lib/fat_zebra/web_hook_spec.rb +50 -0
  217. data/spec/spec_helper.rb +49 -3
  218. data/spec/support/payloads.rb +43 -0
  219. metadata +238 -65
  220. data/FatZebra.gemspec +0 -31
  221. data/lib/fat_zebra/constants.rb +0 -2
  222. data/lib/fat_zebra/gateway.rb +0 -292
  223. data/lib/fat_zebra/models/base.rb +0 -33
  224. data/lib/fat_zebra/models/card.rb +0 -49
  225. data/lib/fat_zebra/models/purchase.rb +0 -185
  226. data/lib/fat_zebra/models/refund.rb +0 -46
  227. data/lib/fat_zebra/models/response.rb +0 -33
  228. data/lib/rest-client/request_ext.rb +0 -15
  229. data/spec/config_spec.rb +0 -37
  230. data/spec/gateway_spec.rb +0 -120
  231. data/spec/models/purchase_spec.rb +0 -55
  232. data/spec/models/refund_spec.rb +0 -9
  233. data/spec/models/response_spec.rb +0 -25
@@ -1,292 +0,0 @@
1
- module FatZebra
2
- class Gateway
3
- attr_accessor :username, :token, :gateway_server, :options
4
-
5
- DEFAULT_OPTIONS = {:secure => true, :version => API_VERSION}
6
-
7
- class << self
8
- def configure(config)
9
- g = Gateway.new(config.username, config.token, config.gateway || GATEWAY_SERVER)
10
- g.options ||= {}
11
- g.options[:test_mode] = config.test_mode
12
- g.options.merge!(config.options || {})
13
- g.proxy = g.options[:proxy]
14
-
15
- g
16
- end
17
- end
18
-
19
- # Initializes a new gateway object
20
- #
21
- # @param [String] merchants username
22
- # @param [String] merchants token for authentication
23
- # @param [String] the server for the gateway, defaults to 'gateway.fatzebra.com.au'
24
- # @param [Hash] the options for the gateway connection (e.g. secure, version etc)
25
- #
26
- # @return FatZebra::Gateway instance
27
- def initialize(username, token, gateway_server = GATEWAY_SERVER, options = {})
28
- self.username = username
29
- self.token = token
30
- self.gateway_server = gateway_server
31
- self.options = DEFAULT_OPTIONS.merge(options)
32
- self.proxy = self.options[:proxy]
33
-
34
- require_field :username, :token, :gateway_server
35
- end
36
-
37
- # Set the proxy for RestClient
38
- #
39
- # @param [String] val the proxy
40
- #
41
- # @return Nil
42
- def proxy=(val)
43
- self.options[:proxy] = val
44
- end
45
-
46
- # Get the proxy set for RestClient
47
- #
48
- # @return [String] the proxy set for RestClient
49
- def proxy
50
- self.options[:proxy]
51
- end
52
-
53
- # Performs a purchase transaction against the gateway
54
- #
55
- # amount - the amount as an integer e.g. (1.00 * 100).to_i
56
- # card_data - a hash of the card data (example: {:card_holder => "John Smith", :number => "...", :expiry => "...", :cvv => "123"} or {:token => "abcdefg1"})
57
- # card_holder - the card holders name
58
- # card_number - the customers credit card number
59
- # card_expiry - the customers card expiry date (as Date or string [mm/yyyy])
60
- # cvv - the credit card verification value (cvv, cav, csc etc)
61
- # reference - a reference for the purchase
62
- # customer_ip - the customers IP address (for fraud prevention)
63
- # currency - the currency of the transaction, ISO 4217 code (http://en.wikipedia.org/wiki/ISO_4217)
64
- #
65
- # Returns a new FatZebra::Models::Response (purchase) object
66
- def purchase(amount, card_data, reference, customer_ip, currency = "AUD")
67
- warn "[DEPRECATED] Gateway#purchase is deprecated, please use Purchase.create instead" unless options[:silence]
68
- Models::Purchase.create(amount, card_data, reference, customer_ip, currency)
69
- end
70
-
71
- # Retrieves purchases specified by the options hash
72
- #
73
- # @param [Hash] options for lookup
74
- # includes:
75
- # - id (unique purchase ID)
76
- # - reference (merchant reference)
77
- # - from (Date)
78
- # - to (Date)
79
- # - offset (defaults to 0) - for pagination
80
- # - limit (defaults to 10) for pagination
81
- # @return [Array<Purchase>] array of purchases
82
- # @deprecated Please use Purchase.find(options) instead
83
- def purchases(options = {})
84
- warn "[DEPRECATED] Gateway#purchases is deprecated, please use Purchase.find instead" unless options[:silence]
85
- Models::Purchase.find(options)
86
- end
87
-
88
- # Public: Performs an authorization transaction against the gateway
89
- # Note: Successful transactions must then be captured for funds to settle.
90
- #
91
- # amount - the amount as an integer e.g. (1.00 * 100).to_i
92
- # card_number - the customers credit card number
93
- # card_expiry - the customers card expiry date
94
- # cvv - the credit card verification value (cvv, cav, csc etc)
95
- # reference - a reference for the purchase
96
- # customer_ip - the customers IP address (for fraud prevention)
97
- #
98
- # Returns a new FatZebra::Models::Purchase object
99
- def authorize(amount, card_number, card_expiry, cvv, reference, customer_ip)
100
- raise "Sorry we haven't compelted this functionality yet."
101
- end
102
-
103
- # Public: Captures a pre-authorized transaction
104
- #
105
- # transaction_id - the authorization ID
106
- # amount - the amount to capture, as an integer
107
- #
108
- # Returns a new FatZebra::Models::Purchase object
109
- def capture(transaction_id, amount)
110
- raise "Sorry we haven't compelted this functionality yet."
111
- end
112
-
113
- # Refunds a transaction
114
- #
115
- # @param [String] the ID of the original transaction to be refunded
116
- # @param [Integer] the amount to be refunded, as an integer
117
- # @param [String] the reference for the refund
118
- #
119
- # @return [Refund] refund result object
120
- # @deprecated Please use Refund.create or Purchase#refund instead
121
- def refund(transaction_id, amount, reference)
122
- warn "[DEPRECATED] Gateway#refund is deprecated, please use Refund.create or Purchase#refund instead`" unless options[:silence]
123
- Models::Refund.create(transaction_id, amount, reference)
124
- end
125
-
126
- # Pings the Fat Zebra service
127
- #
128
- # @param [String] the data to be echoed back
129
- #
130
- # @return true if reply is valid, false if the request times out, or otherwise
131
- def ping(nonce = SecureRandom.hex)
132
- begin
133
- response = RestClient.get(build_url("ping") + "?echo=#{nonce}")
134
- response = JSON.parse(response)
135
-
136
- response["echo"] == nonce
137
- rescue => e
138
- return false
139
- end
140
- end
141
-
142
- # Tokenizes a credit card
143
- #
144
- # @param [String] the credit card holder name
145
- # @param [String] the card number
146
- # @param [String] the credit card expiry date (mm/yyyy)
147
- # @param [String] the card CVV
148
- #
149
- # @return Response
150
- # @deprecated Please use Card.create instead
151
- def tokenize(card_holder, card_number, expiry, cvv)
152
- warn "[DEPRECATED] Gateway#tokenize is deprecated, please use Card.create instead" unless options[:silence]
153
- Models::Card.create(card_holder, card_number, expiry, cvv)
154
- end
155
-
156
- # Public: Performs the HTTP(s) request and returns a response object, handing errors etc
157
- #
158
- # method - the request method (:post or :get)
159
- # resource - the resource for the request
160
- # data - a hash of the data for the request
161
- #
162
- # Returns hash of response data
163
- def make_request(method, resource, data = nil)
164
- resource = get_resource(resource, method, data)
165
-
166
- if [:post, :put, :patch].include?(method)
167
- data[:test] = options[:test_mode] if options[:test_mode]
168
- payload = data.to_json
169
- else
170
- payload = {}
171
- end
172
-
173
- headers = options[:headers] || {}
174
-
175
- if method == :get
176
- resource.send(method, headers) do |response, request, result, &block|
177
- handle_response(response)
178
- end
179
- else
180
- # Add in test flag is test mode...
181
- resource.send(method, payload, headers) do |response, request, result, &block|
182
- handle_response(response)
183
- end
184
- end
185
- end
186
-
187
- private
188
- # Private: Extracts the date value from a Date/DateTime value
189
- #
190
- # value - the string or date value to extract the value from
191
- #
192
- # Returns date string as MM/YYYY
193
- def extract_date(value)
194
- return nil if value.nil?
195
-
196
- if value.is_a?(String)
197
- return value
198
- elsif value.respond_to?(:strftime)
199
- return value.strftime("%m/%Y")
200
- end
201
- end
202
-
203
- # Private: Verifies a require field is present and has a value
204
- #
205
- # fields - array of fields required to be present
206
- #
207
- # Returns nil
208
- # Raises InvalidArgumentError if field is missing
209
- def require_field(*fields)
210
- fields.each do |field|
211
- val = self.send(field)
212
- raise InvalidArgumentError, "Parameter #{field} is required", caller if (val.nil? || val.to_s.length == 0)
213
- end
214
- end
215
-
216
- # Public: Builds the URL for the request
217
- # If data is provided it will append as name/value pairs for a get request
218
- #
219
- # resource - the resource to append to the URL (e.g. purchases for https://something.com/purchases)
220
- # data (optional) - a hash of the data name value pairs - if nil it will be ignored
221
- #
222
- # Returns the URL as a string
223
- def build_url(resource, data = nil)
224
- proto = case options[:secure]
225
- when true
226
- "https://"
227
- when false
228
- "http://"
229
- end
230
- version = options[:version]
231
- if version.nil?
232
- url = "#{proto}#{self.gateway_server}/#{resource}"
233
- else
234
- url = "#{proto}#{self.gateway_server}/v#{version}/#{resource}"
235
- end
236
-
237
- unless data.nil?
238
- url = url + "?" +
239
- data.map do |key, value|
240
- "#{key}=#{value}" # TODO: URL Encode this
241
- end.join("&")
242
- end
243
-
244
- url
245
- end
246
-
247
- # Public: Builds a new RestClient resource object
248
- #
249
- # uri - the full URI for the request
250
- # method - the method for the request - either :post or :get
251
- # data - the data for the request - only required for :get methods
252
- #
253
- # Returns a new RestClient resource
254
- def get_resource(uri, method = :post, data = nil)
255
- url = build_url(uri, (method == :get ? data : nil))
256
- ssl_options = options[:secure] ? {
257
- :ssl_ca_file => File.expand_path(File.dirname(__FILE__) + "/../../vendor/cacert.pem"),
258
- :verify_ssl => OpenSSL::SSL::VERIFY_PEER
259
- } : {}
260
-
261
- opts = {:user => self.username, :password => self.token, proxy: self.options[:proxy]}
262
- if method == :get
263
- url = build_url(uri, data)
264
- else
265
- url = build_url(uri)
266
- end
267
-
268
- RestClient::Resource.new(url, opts.merge(ssl_options))
269
- end
270
-
271
- def handle_response(response)
272
- case response.code
273
- when 201
274
- JSON.parse(response)
275
- when 200
276
- JSON.parse(response)
277
- when 422
278
- JSON.parse(response)
279
- when 400
280
- raise RequestError, "Bad Data"
281
- when 401
282
- raise RequestError, "Unauthorized, please check your username and token"
283
- when 404
284
- raise RequestError, "Requested Resource not found"
285
- when 500
286
- raise RequestError, "Server Error, please check with Gateway"
287
- when 501
288
- raise RequestError, "Problem processing your request - please check your data"
289
- end
290
- end
291
- end
292
- end
@@ -1,33 +0,0 @@
1
- module FatZebra
2
- module Models
3
- class Base
4
- @@attributes = []
5
- def self.attribute(*values)
6
- @@attributes ||= []
7
- values.each do |val|
8
- @@attributes << val
9
- end
10
- attr_accessor *values
11
- end
12
-
13
- def initialize(attrs = {})
14
- attrs.each do |key, val|
15
- self.send("#{key}=", val) if self.respond_to?("#{key}=")
16
- end
17
-
18
- self.raw = attrs if self.respond_to?(:raw=)
19
- end
20
-
21
- def inspect
22
- inspection = @@attributes.collect { |name|
23
- "#{name}: #{instance_variable_get("@#{name}")}"
24
- }.compact.join(", ")
25
- "#<#{self.class} #{inspection}>"
26
- end
27
-
28
- def to_s
29
- inspect
30
- end
31
- end
32
- end
33
- end
@@ -1,49 +0,0 @@
1
- module FatZebra
2
- module Models
3
- class Card < Base
4
- attribute :token, :card_holder, :card_number, :card_expiry, :transaction_count, :raw
5
-
6
- def successful; true; end
7
-
8
- class << self
9
- # Tokenizes a credit card
10
- #
11
- # @param [String] the credit card holder name
12
- # @param [String] the card number
13
- # @param [String] the credit card expiry date (mm/yyyy)
14
- # @param [String] the card CVV
15
- # @param [Hash] optional any additional data which should be merged into the request
16
- #
17
- # @return Response
18
- def create(card_holder, card_number, expiry, cvv, optional = {})
19
- params = {
20
- :card_holder => card_holder,
21
- :card_number => card_number,
22
- :card_expiry => expiry,
23
- :cvv => cvv
24
- }
25
-
26
- params.merge!(optional)
27
-
28
- response = FatZebra.gateway.make_request(:post, "credit_cards", params)
29
- Response.new(response, :card)
30
- end
31
-
32
- # Update the credit card expiry date
33
- #
34
- # @param [String] token the credit card token
35
- # @param [String] expiry the new expiry date (format: mm/yyyy)
36
- #
37
- # @return [Response]
38
- def update_expiry(token, expiry)
39
- params = {
40
- card_expiry: expiry
41
- }
42
-
43
- response = FatZebra.gateway.make_request(:put, "credit_cards/#{token}", params)
44
- Response.new(response, :card)
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,185 +0,0 @@
1
- module FatZebra
2
- module Models
3
- class Purchase < Base
4
- attribute :id, :amount, :reference, :message, :authorization, :transaction_id, :card_number,
5
- :card_holder, :card_expiry, :authorized, :successful, :card_token, :currency, :raw, :captured, :captured_amount,
6
- :response_code, :rrn, :cvv_match, :fraud_result, :fraud_messages, :settlement_date, :transaction_date, :metadata
7
-
8
- # Refunds the current transaction
9
- #
10
- # @param [Integer] amount the amount to be refunded
11
- # @param [String] reference the refund reference
12
- #
13
- # @return Response (Refund) object
14
- def refund(amount, reference)
15
- Refund.create(self.id, amount, reference)
16
- end
17
-
18
- # Captures an authorization
19
- #
20
- # @param [Integer] amount the amount to capture. (Optional)
21
- #
22
- # @return [Response] Purchase response object
23
- def capture(amount = nil)
24
- if amount.nil?
25
- params = {}
26
- else
27
- params = {
28
- :amount => amount
29
- }
30
- end
31
- response = FatZebra.gateway.make_request(:post, "purchases/#{self.id}/capture", params)
32
- resp = Response.new(response)
33
-
34
- if resp.successful && resp.purchase.successful
35
- self.captured_amount = amount || self.amount
36
- return true
37
- else
38
- raise StandardError, "Unable to capture purchase - #{resp.errors.join(',')}"
39
- end
40
- end
41
-
42
- # Returns the record as a Hash
43
- #
44
- # @return [Hash]
45
- def to_hash
46
- {
47
- id: self.id,
48
- amount: self.amount,
49
- reference: self.reference,
50
- message: self.message,
51
- authorization: self.authorization,
52
- card_number: self.card_number,
53
- card_holder: self.card_holder,
54
- card_expiry: self.card_expiry,
55
- card_token: self.card_token,
56
- currency: self.currency,
57
- authorized: self.authorized,
58
- successful: self.successful,
59
- captured: self.captured,
60
- captured_amount: self.captured_amount,
61
- response_code: self.response_code,
62
- cvv_match: self.cvv_match,
63
- rrn: self.rrn,
64
- fraud_result: self.fraud_result,
65
- fraud_messages: self.fraud_messages,
66
- settlement_date: self.settlement_date,
67
- transaction_date: self.transaction_date,
68
- metadata: self.metadata || {}
69
- }
70
- end
71
-
72
- class << self
73
- # Performs a purchase transaction against the gateway
74
- #
75
- # @param [Integer] amount the amount as an integer e.g. (1.00 * 100).to_i
76
- # @param [Hash] card_data a hash of the card data (example: {:card_holder => "John Smith", :number => "...", :expiry => "...", :cvv => "123"} or {:token => "abcdefg1"})
77
- # @option card_data [String] card_holder the card holders name
78
- # @option card_data [String] card_number the customers credit card number
79
- # @option card_data [Date] expiry the customers card expiry date (as Date or string [mm/yyyy])
80
- # @option card_data [String] cvv the credit card verification value (cvv, cav, csc etc)
81
- # @param [String] reference a reference for the purchase
82
- # @param [String] customer_ip the customers IP address (for fraud prevention)
83
- # @param [String] currency currency code ("AUD", "USD", etc)
84
- # @param [Hash] optional any optional parameters to be included in the payload
85
- #
86
- # @return [Response] response (purchase) object
87
- def create(amount, card_data, reference, customer_ip, currency = 'AUD', optional = {})
88
- params = {
89
- :amount => amount,
90
- :card_holder => card_data.delete(:card_holder),
91
- :card_number => card_data.delete(:number),
92
- :card_expiry => extract_date(card_data.delete(:expiry)),
93
- :cvv => card_data.delete(:cvv),
94
- :card_token => card_data.delete(:token),
95
- :reference => reference,
96
- :customer_ip => customer_ip,
97
- :currency => currency
98
- }
99
-
100
- params.delete_if {|_, value| value.nil? } # If token is nil, remove, otherwise, remove card values
101
- params.merge!(optional)
102
- validate_params!(params)
103
- response = FatZebra.gateway.make_request(:post, 'purchases', params)
104
- Response.new(response)
105
- end
106
-
107
- # Retrieves purchases specified by the options hash
108
- #
109
- # @param [Hash] options for lookup
110
- # @option options [String] id the unique purchase ID
111
- # @option options [String] reference the merchant reference
112
- # @option options [DateTime] from the start date to search from
113
- # @option options [DateTime] to the end date time to search to
114
- # @option options [Integer] offset the start page for pagination
115
- # @option options [Integer] limit the maximum number of records to return in the query. Maximum 10
116
- #
117
- # @return [Array<Purchase>] array of purchases
118
- def find(options = {})
119
- id = options.delete(:id)
120
- options.merge!({:offets => 0, :limit => 10})
121
-
122
- # Format dates for the request
123
- options[:from] = options[:from].strftime('%Y%m%dT%H%M') if options[:from]
124
- options[:to] = options[:to].strftime('%Y%m%dT%H%M') if options[:to]
125
-
126
-
127
- if id.nil?
128
- response = FatZebra.gateway.make_request(:get, 'purchases', options)
129
- if response['successful']
130
- purchases = []
131
- response['response'].each do |purchase|
132
- purchases << Purchase.new(purchase)
133
- end
134
-
135
- purchases.size == 1 ? purchases.first : purchases
136
- else
137
- # TODO: This should raise a defined exception
138
- raise StandardError, "Unable to query purchases, #{response['errors'].inspect}"
139
- end
140
- else
141
- response = FatZebra.gateway.make_request(:get, "purchases/#{id}.json")
142
- if response['successful']
143
- Purchase.new(response['response'])
144
- else
145
- raise StandardError, "Unable to query purchases - #{response['errors'].inspect}"
146
- end
147
- end
148
- end
149
-
150
- private
151
- # Private: Extracts the date value from a Date/DateTime value
152
- #
153
- # value - the string or date value to extract the value from
154
- #
155
- # Returns date string as MM/YYYY
156
- def extract_date(value)
157
- return nil if value.nil?
158
-
159
- if value.is_a?(String)
160
- return value
161
- elsif value.respond_to?(:strftime)
162
- return value.strftime('%m/%Y')
163
- end
164
- end
165
-
166
- # Private: Validates the parameters provided meet the gateway requirements
167
- #
168
- # params - the parameter hash to be validated
169
- #
170
- # Returns nil
171
- # Raises FatZebra::RequestError if errors are present.
172
- def validate_params!(params)
173
- @errors = []
174
- @errors << 'number or token must be provided' unless params[:card_number].present? || params[:card_token].present? || params[:wallet].present?
175
- @errors << 'amount must be provided' unless params[:amount].present? && params[:amount].to_f >= 0
176
- @errors << 'expiry must be provided' unless params[:card_token].present? || params[:card_expiry].present? || params[:wallet].present?
177
- @errors << 'reference must be provided' unless params[:reference].present?
178
- @errors << 'customer_ip must be provided' unless params[:customer_ip].present?
179
-
180
- raise FatZebra::RequestError.new("The following errors prevent the transaction from being submitted: #{@errors.to_sentence}") if @errors.any?
181
- end
182
- end
183
- end
184
- end
185
- end
@@ -1,46 +0,0 @@
1
- module FatZebra
2
- module Models
3
- class Refund < Base
4
- attribute :amount, :reference, :refunded, :id, :message, :transaction_id, :original_transaction_id, :transaction_date, :settlement_date,
5
- :response_code, :message, :rrn, :authorisation, :raw
6
-
7
- # Returns the original transaction for this refund
8
- #
9
- # @return Purchase
10
- def original_transaction
11
- @original_transaction ||= Purchase.find(self.original_transaction_id)
12
- end
13
-
14
- # Indicates if the refund was successful or not
15
- #
16
- # @return Boolean
17
- def successful
18
- self.refunded == "Approved"
19
- end
20
- alias successful? successful
21
-
22
- class << self
23
- # Refunds a transaction
24
- #
25
- # @param [String] the ID of the original transaction to be refunded
26
- # @param [Integer] the amount to be refunded, as an integer
27
- # @param [String] the reference for the refund
28
- # @param [Hash] optional optional parameters to be included in the request
29
- #
30
- # @return [Refund] refund result object
31
- def create(transaction_id, amount, reference, optional = {})
32
- params = {
33
- :transaction_id => transaction_id,
34
- :amount => amount,
35
- :reference => reference
36
- }
37
-
38
- params.merge!(optional)
39
-
40
- response = FatZebra.gateway.make_request(:post, "refunds", params)
41
- Response.new(response, :refund)
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,33 +0,0 @@
1
- module FatZebra
2
- module Models
3
- class Response
4
- attr_accessor :successful, :result, :errors, :test, :raw
5
- def initialize(response, type = :purchase)
6
- self.raw = response.dup unless response.nil?
7
- self.test = response["test"]
8
- self.successful = response["successful"]
9
- self.errors = response["errors"]
10
-
11
- case type
12
- when :purchase
13
- self.result = Purchase.new(response["response"])
14
- alias purchase result
15
- when :refund
16
- self.result = Refund.new(response["response"])
17
- alias refund result
18
- when :card
19
- self.result = Card.new(response["response"])
20
- alias card result
21
- end
22
- end
23
-
24
- def successful?
25
- self.successful
26
- end
27
-
28
- def test?
29
- self.test
30
- end
31
- end
32
- end
33
- end
@@ -1,15 +0,0 @@
1
- module RestClientExt
2
- module ProxyRequest
3
- def net_http_class
4
- if RestClient.proxy
5
- proxy_uri = URI.parse(RestClient.proxy)
6
- Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
7
- elsif @args[:proxy]
8
- proxy_uri = URI.parse(@args[:proxy])
9
- Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
10
- else
11
- Net::HTTP
12
- end
13
- end
14
- end
15
- end
data/spec/config_spec.rb DELETED
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe FatZebra::Config do
4
- it "should configure with a block" do
5
- FatZebra.configure do
6
- username "TEST"
7
- token "TEST"
8
- sandbox true
9
- end
10
-
11
- FatZebra.config.username.should == "TEST"
12
- FatZebra.config.token.should == "TEST"
13
- FatZebra.config.sandbox.should be_true
14
- end
15
-
16
- it "should configure from a hash" do
17
- config = FatZebra.configure(:username => "TEST", :token => "TEST", :sandbox => true)
18
- config.username.should == 'TEST'
19
- end
20
-
21
- it "should prepare a new gateway when configured" do
22
- FatZebra.configure do
23
- username "TEST"
24
- token "TEST"
25
- test_mode true
26
- sandbox true
27
- options :headers => {"A" => "B"}
28
- end
29
-
30
- FatZebra.gateway.should_not be_nil
31
- end
32
-
33
- it "should raise an error when trying to access the gateway before it is configured" do
34
- FatZebra.config = nil
35
- lambda { FatZebra.gateway }.should raise_exception(FatZebra::GatewayError)
36
- end
37
- end