spree_mercado_pago_payment_method 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/app/assets/javascripts/admin/spree_mercado_pago_payment_method.js +1 -0
  2. data/app/assets/javascripts/store/spree_mercado_pago_payment_method.js +1 -0
  3. data/app/assets/stylesheets/admin/spree_mercado_pago_payment_method.css +3 -0
  4. data/app/assets/stylesheets/store/spree_mercado_pago_payment_method.css +3 -0
  5. data/app/controllers/spree/checkout_controller_decorator.rb +29 -0
  6. data/app/controllers/spree/mercado_pago_controller.rb +47 -0
  7. data/app/models/payment_method/mercado_pago.rb +33 -0
  8. data/app/models/spree_mercado_pago_client.rb +102 -0
  9. data/app/views/spree/admin/payments/source_forms/_mercadopago.html.erb +1 -0
  10. data/app/views/spree/admin/payments/source_views/_mercadopago.html.erb +1 -0
  11. data/app/views/spree/checkout/mercado_pago_error.html.erb +0 -0
  12. data/app/views/spree/checkout/payment/_mercadopago.html.erb +1 -0
  13. data/app/views/spree/mercado_pago/failure.html.erb +1 -0
  14. data/app/views/spree/mercado_pago/pending.html.erb +1 -0
  15. data/app/views/spree/mercado_pago/success.html.erb +1 -0
  16. data/config/locales/en.yml +13 -0
  17. data/config/locales/es.yml +14 -0
  18. data/config/routes.rb +8 -0
  19. data/lib/generators/spree_mercado_pago_payment_method/install/install_generator.rb +29 -0
  20. data/lib/spree_mercado_pago_payment_method.rb +3 -0
  21. data/lib/spree_mercado_pago_payment_method/engine.rb +23 -0
  22. data/lib/tasks/mercado_user.rake +6 -0
  23. data/spec/controllers/spree/checkout_controller_spec.rb +57 -0
  24. data/spec/controllers/spree/mercado_pago_controller_spec.rb +90 -0
  25. data/spec/dummy/README.rdoc +261 -0
  26. data/spec/dummy/Rakefile +7 -0
  27. data/spec/dummy/app/assets/javascripts/admin/all.js +12 -0
  28. data/spec/dummy/app/assets/javascripts/store/all.js +12 -0
  29. data/spec/dummy/app/assets/stylesheets/admin/all.css +11 -0
  30. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  31. data/spec/dummy/app/assets/stylesheets/store/all.css +11 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  33. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/spec/dummy/config.ru +4 -0
  36. data/spec/dummy/config/application.rb +74 -0
  37. data/spec/dummy/config/boot.rb +6 -0
  38. data/spec/dummy/config/database.yml +11 -0
  39. data/spec/dummy/config/environment.rb +7 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +67 -0
  42. data/spec/dummy/config/environments/test.rb +37 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/custom_user.rb +1 -0
  45. data/spec/dummy/config/initializers/inflections.rb +15 -0
  46. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  47. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  48. data/spec/dummy/config/initializers/session_store.rb +8 -0
  49. data/spec/dummy/config/initializers/spree.rb +14 -0
  50. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/spec/dummy/config/locales/en.yml +5 -0
  52. data/spec/dummy/config/routes.rb +3 -0
  53. data/spec/dummy/config/spree.yml +2 -0
  54. data/spec/dummy/db/migrate/20121121030140_spree_zero_nine_zero.spree.rb +392 -0
  55. data/spec/dummy/db/migrate/20121121030141_create_indexes_for_inventory_units.spree.rb +7 -0
  56. data/spec/dummy/db/migrate/20121121030142_add_count_on_hand_to_variants_and_products.spree.rb +50 -0
  57. data/spec/dummy/db/migrate/20121121030143_change_taxons_to_nested_set.spree.rb +47 -0
  58. data/spec/dummy/db/migrate/20121121030144_move_to_configurable_gateways.spree.rb +55 -0
  59. data/spec/dummy/db/migrate/20121121030145_add_open_id_authentication_tables.spree.rb +16 -0
  60. data/spec/dummy/db/migrate/20121121030146_add_openid_field_to_users.spree.rb +27 -0
  61. data/spec/dummy/db/migrate/20121121030147_change_preference_value_type.spree.rb +11 -0
  62. data/spec/dummy/db/migrate/20121121030148_create_billing_integrations.spree.rb +13 -0
  63. data/spec/dummy/db/migrate/20121121030149_charge_refactoring.spree.rb +40 -0
  64. data/spec/dummy/db/migrate/20121121030150_add_some_indexes.spree.rb +12 -0
  65. data/spec/dummy/db/migrate/20121121030151_checkout_state_machine.spree.rb +6 -0
  66. data/spec/dummy/db/migrate/20121121030152_state_for_shipments.spree.rb +6 -0
  67. data/spec/dummy/db/migrate/20121121030153_make_state_events_polymorphic.spree.rb +13 -0
  68. data/spec/dummy/db/migrate/20121121030154_ship_address_id_for_checkouts.spree.rb +6 -0
  69. data/spec/dummy/db/migrate/20121121030155_shipping_method_id_for_checkouts.spree.rb +6 -0
  70. data/spec/dummy/db/migrate/20121121030156_creditcard_last_four_digits.spree.rb +15 -0
  71. data/spec/dummy/db/migrate/20121121030157_populate_legacy_shipment_state.spree.rb +16 -0
  72. data/spec/dummy/db/migrate/20121121030158_add_cost_price.spree.rb +6 -0
  73. data/spec/dummy/db/migrate/20121121030159_shipment_id_for_inventory_units.spree.rb +26 -0
  74. data/spec/dummy/db/migrate/20121121030160_cim_fields_for_creditcards.spree.rb +7 -0
  75. data/spec/dummy/db/migrate/20121121030161_create_return_authorizations.spree.rb +13 -0
  76. data/spec/dummy/db/migrate/20121121030162_add_return_authorization_to_inventory_units.spree.rb +6 -0
  77. data/spec/dummy/db/migrate/20121121030163_create_trackers.spree.rb +11 -0
  78. data/spec/dummy/db/migrate/20121121030164_creditcard_id_for_creditcard_txns.spree.rb +6 -0
  79. data/spec/dummy/db/migrate/20121121030165_original_creditcard_txn_id_for_creditcard_txns.spree.rb +6 -0
  80. data/spec/dummy/db/migrate/20121121030166_add_test_mode_to_billing_integration.spree.rb +7 -0
  81. data/spec/dummy/db/migrate/20121121030167_create_payment_methods.spree.rb +17 -0
  82. data/spec/dummy/db/migrate/20121121030168_polymorphic_payments.spree.rb +43 -0
  83. data/spec/dummy/db/migrate/20121121030169_change_payments_payment_method_to_belongs_to.spree.rb +12 -0
  84. data/spec/dummy/db/migrate/20121121030170_assign_creditcard_txns_to_payment.spree.rb +24 -0
  85. data/spec/dummy/db/migrate/20121121030171_sti_for_transactions.spree.rb +16 -0
  86. data/spec/dummy/db/migrate/20121121030172_drop_billing_integrations.spree.rb +17 -0
  87. data/spec/dummy/db/migrate/20121121030173_deleted_at_for_payment_methods.spree.rb +15 -0
  88. data/spec/dummy/db/migrate/20121121030174_add_adjustments_index.spree.rb +7 -0
  89. data/spec/dummy/db/migrate/20121121030175_add_alt_text_to_images.spree.rb +6 -0
  90. data/spec/dummy/db/migrate/20121121030176_fix_existing_coupon_credits.spree.rb +14 -0
  91. data/spec/dummy/db/migrate/20121121030177_add_display_to_payment_methods.spree.rb +6 -0
  92. data/spec/dummy/db/migrate/20121121030178_add_addresses_checkouts_indexes.spree.rb +9 -0
  93. data/spec/dummy/db/migrate/20121121030179_add_icon_to_taxons.spree.rb +18 -0
  94. data/spec/dummy/db/migrate/20121121030180_add_description_to_taxons.spree.rb +12 -0
  95. data/spec/dummy/db/migrate/20121121030181_index_for_shipments_number.spree.rb +6 -0
  96. data/spec/dummy/db/migrate/20121121030182_add_index_on_users_persistence_token.spree.rb +8 -0
  97. data/spec/dummy/db/migrate/20121121030183_add_default_to_tax_categories.spree.rb +6 -0
  98. data/spec/dummy/db/migrate/20121121030184_add_display_to_shipping_methods.spree.rb +6 -0
  99. data/spec/dummy/db/migrate/20121121030185_rename_payment_method_display.spree.rb +6 -0
  100. data/spec/dummy/db/migrate/20121121030186_rename_preferences_field.spree.rb +6 -0
  101. data/spec/dummy/db/migrate/20121121030187_add_guest_flag.spree.rb +8 -0
  102. data/spec/dummy/db/migrate/20121121030188_drop_order_token.spree.rb +10 -0
  103. data/spec/dummy/db/migrate/20121121030189_payments_state_and_assigned_to_order_only.spree.rb +15 -0
  104. data/spec/dummy/db/migrate/20121121030190_create_address_keys_for_order.spree.rb +7 -0
  105. data/spec/dummy/db/migrate/20121121030191_payment_total_for_orders.spree.rb +6 -0
  106. data/spec/dummy/db/migrate/20121121030192_shipping_method_id_for_orders.spree.rb +6 -0
  107. data/spec/dummy/db/migrate/20121121030193_add_shipment_and_payment_state.spree.rb +7 -0
  108. data/spec/dummy/db/migrate/20121121030194_refactor_adjustments.spree.rb +30 -0
  109. data/spec/dummy/db/migrate/20121121030195_response_code_and_avs_response_for_payments.spree.rb +7 -0
  110. data/spec/dummy/db/migrate/20121121030196_change_guest_flag_to_anonymous.spree.rb +8 -0
  111. data/spec/dummy/db/migrate/20121121030197_email_for_orders.spree.rb +6 -0
  112. data/spec/dummy/db/migrate/20121121030198_create_mail_methods.spree.rb +11 -0
  113. data/spec/dummy/db/migrate/20121121030199_rename_frozen_to_locked.spree.rb +6 -0
  114. data/spec/dummy/db/migrate/20121121030200_move_special_instructions_to_orders.spree.rb +11 -0
  115. data/spec/dummy/db/migrate/20121121030201_create_log_entries.spree.rb +12 -0
  116. data/spec/dummy/db/migrate/20121121030202_migrate_transactions_to_payment_state.spree.rb +99 -0
  117. data/spec/dummy/db/migrate/20121121030203_delete_in_progress_orders.spree.rb +20 -0
  118. data/spec/dummy/db/migrate/20121121030204_migrate_checkout_to_orders.spree.rb +24 -0
  119. data/spec/dummy/db/migrate/20121121030205_remove_shipped_state.spree.rb +13 -0
  120. data/spec/dummy/db/migrate/20121121030206_prevent_nil_payment_total.spree.rb +9 -0
  121. data/spec/dummy/db/migrate/20121121030207_prevent_nil_email.spree.rb +10 -0
  122. data/spec/dummy/db/migrate/20121121030208_generate_anonymous_users.spree.rb +21 -0
  123. data/spec/dummy/db/migrate/20121121030209_update_order_state.spree.rb +13 -0
  124. data/spec/dummy/db/migrate/20121121030210_cleanup_legacy_tables.spree.rb +12 -0
  125. data/spec/dummy/db/migrate/20121121030211_remove_number_and_cvv_from_credicard.spree.rb +12 -0
  126. data/spec/dummy/db/migrate/20121121030212_drop_anonymous_field_for_user.spree.rb +12 -0
  127. data/spec/dummy/db/migrate/20121121030213_renamed_rma_cancelled_state.spree.rb +10 -0
  128. data/spec/dummy/db/migrate/20121121030214_fix_problematic_index_names.spree.rb +14 -0
  129. data/spec/dummy/db/migrate/20121121030215_add_position_to_variants.spree.rb +6 -0
  130. data/spec/dummy/db/migrate/20121121030216_add_next_state_to_state_events.spree.rb +6 -0
  131. data/spec/dummy/db/migrate/20121121030217_add_position_to_option_types.spree.rb +6 -0
  132. data/spec/dummy/db/migrate/20121121030218_remove_trailing_slashes_in_taxon_permalinks.spree.rb +20 -0
  133. data/spec/dummy/db/migrate/20121121030219_create_activators.spree.rb +15 -0
  134. data/spec/dummy/db/migrate/20121121030220_eligible_for_adjustments.spree.rb +6 -0
  135. data/spec/dummy/db/migrate/20121121030221_namespace_top_level_models.spree.rb +67 -0
  136. data/spec/dummy/db/migrate/20121121030222_migrate_namespaced_polymorphic_models.spree.rb +53 -0
  137. data/spec/dummy/db/migrate/20121121030223_make_adjustments_polymorphic.spree.rb +10 -0
  138. data/spec/dummy/db/migrate/20121121030224_add_company_to_addresses.spree.rb +6 -0
  139. data/spec/dummy/db/migrate/20121121030225_add_inc_tax_to_tax_rates.spree.rb +6 -0
  140. data/spec/dummy/db/migrate/20121121030226_rename_inc_price_attribute.spree.rb +6 -0
  141. data/spec/dummy/db/migrate/20121121030227_add_default_tax_zone.spree.rb +6 -0
  142. data/spec/dummy/db/migrate/20121121030228_associate_shipping_methods_and_shipping_categories.spree.rb +8 -0
  143. data/spec/dummy/db/migrate/20121121030229_add_match_rules_to_shipping_methods.spree.rb +8 -0
  144. data/spec/dummy/db/migrate/20121121030230_new_preferences.spree.rb +49 -0
  145. data/spec/dummy/db/migrate/20121121030231_rename_state_events_to_state_changes.spree.rb +10 -0
  146. data/spec/dummy/db/migrate/20121121030232_add_deleted_at_to_tax_category.spree.rb +6 -0
  147. data/spec/dummy/db/migrate/20121121030233_migrate_images_from_products_to_variants.spree.rb +38 -0
  148. data/spec/dummy/db/migrate/20121121030234_rename_attachment_size_to_attachment_file_size.spree.rb +6 -0
  149. data/spec/dummy/db/migrate/20121121030235_increase_scale_of_tax_rate_amount.spree.rb +10 -0
  150. data/spec/dummy/db/migrate/20121121030236_create_tokenized_permissions_table.spree.rb +17 -0
  151. data/spec/dummy/db/migrate/20121121030237_convert_sales_tax_to_default_tax.spree.rb +10 -0
  152. data/spec/dummy/db/migrate/20121121030238_rename_creditcards_to_credit_cards.spree.rb +12 -0
  153. data/spec/dummy/db/migrate/20121121030239_add_deleted_at_to_spree_shipping_methods.spree.rb +6 -0
  154. data/spec/dummy/db/migrate/20121121030240_remove_credit_total_from_orders.spree.rb +6 -0
  155. data/spec/dummy/db/migrate/20121121030241_add_counter_cache_to_zone_members.spree.rb +15 -0
  156. data/spec/dummy/db/migrate/20121121030242_add_tax_rate_label.spree.rb +6 -0
  157. data/spec/dummy/db/migrate/20121121030243_add_toggle_tax_rate_display.spree.rb +6 -0
  158. data/spec/dummy/db/migrate/20121121030244_add_lock_version_to_variant.spree.rb +6 -0
  159. data/spec/dummy/db/migrate/20121121030245_remove_not_null_constraint_from_products_on_hand.spree.rb +12 -0
  160. data/spec/dummy/db/migrate/20121121030246_create_users.spree_auth.rb +30 -0
  161. data/spec/dummy/db/migrate/20121121030247_rename_columns_for_devise.spree_auth.rb +38 -0
  162. data/spec/dummy/db/migrate/20121121030248_convert_user_remember_field.spree_auth.rb +12 -0
  163. data/spec/dummy/db/migrate/20121121030249_add_reset_password_sent_at_to_spree_users.spree_auth.rb +9 -0
  164. data/spec/dummy/db/migrate/20121121030250_make_users_email_index_unique.spree_auth.rb +10 -0
  165. data/spec/dummy/db/schema.rb +548 -0
  166. data/spec/dummy/db/seeds.rb +11 -0
  167. data/spec/dummy/db/spree_development.sqlite3 +0 -0
  168. data/spec/dummy/db/spree_test.sqlite3 +0 -0
  169. data/spec/dummy/log/development.log +1439 -0
  170. data/spec/dummy/log/test.log +37662 -0
  171. data/spec/dummy/public/404.html +26 -0
  172. data/spec/dummy/public/422.html +26 -0
  173. data/spec/dummy/public/500.html +25 -0
  174. data/spec/dummy/public/favicon.ico +0 -0
  175. data/spec/dummy/script/rails +6 -0
  176. data/spec/fixtures/authenticated.json +7 -0
  177. data/spec/fixtures/preferences_created.json +41 -0
  178. data/spec/models/spree_mercado_pago_client_spec.rb +131 -0
  179. data/spec/spec_helper.rb +95 -0
  180. metadata +524 -0
@@ -0,0 +1 @@
1
+ //= require admin/spree_core
@@ -0,0 +1 @@
1
+ //= require store/spree_core
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require admin/spree_core
3
+ */
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require store/spree_core
3
+ */
@@ -0,0 +1,29 @@
1
+ # -*- encoding : utf-8 -*-
2
+ Spree::CheckoutController.class_eval do
3
+ before_filter :redirect_to_mercado_pago_if_needed, :only => [:update]
4
+
5
+ def redirect_to_mercado_pago_if_needed
6
+ return unless params[:state] == "payment"
7
+
8
+ selected_method_id = params[:order][:payments_attributes].first[:payment_method_id]
9
+ @payment_method = Spree::PaymentMethod.find(selected_method_id)
10
+
11
+ if @payment_method && @payment_method.kind_of?(PaymentMethod::MercadoPago)
12
+ @order.update_attributes(object_params)
13
+
14
+ back_urls = {
15
+ success: spree.mercado_pago_success_url(order_number: @order.number),
16
+ pending: spree.mercado_pago_pending_url(order_number: @order.number),
17
+ failure: spree.mercado_pago_failure_url(order_number: @order.number)
18
+ }
19
+
20
+ m = SpreeMercadoPagoClient.new(@order, back_urls)
21
+
22
+ if m.authenticate && m.send_data
23
+ redirect_to m.redirect_url
24
+ else
25
+ render :action => :mercado_pago_error
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rest_client'
3
+
4
+ module Spree
5
+ class MercadoPagoController < Spree::BaseController
6
+ before_filter :get_order
7
+
8
+ def success
9
+ advance_state
10
+ end
11
+
12
+ def pending
13
+ advance_state
14
+ end
15
+
16
+ def failure
17
+ end
18
+
19
+ private
20
+ def correct_order_state
21
+ (@order.state == 'payment' || @order.state == 'complete') &&
22
+ @order.payment_method &&
23
+ (@order.payment_method.type == "PaymentMethod::MercadoPago")
24
+ end
25
+
26
+ def advance_state
27
+ @order.update_attributes( { :state => "complete", :completed_at => Time.now },
28
+ :without_protection => true)
29
+ end
30
+
31
+ def get_order
32
+ user = spree_current_user
33
+ order_no = params[:order_number]
34
+ @order = Order.where(number: order_no).where(user_id: user.id).first
35
+
36
+ unless @order && correct_order_state
37
+ if @order.present?
38
+ redirect_to checkout_state_path(@order.state)
39
+ else
40
+ flash[:error] = I18n.t(:mp_invalid_order)
41
+ redirect_to root_path
42
+ end
43
+ return
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class PaymentMethod::MercadoPago < Spree::PaymentMethod
3
+ attr_accessible :preferred_client_id, :preferred_client_secret
4
+
5
+ preference :client_id, :integer
6
+ preference :client_secret, :string
7
+
8
+ def payment_profiles_supported?
9
+ false
10
+ end
11
+
12
+ def actions
13
+ %w{capture void}
14
+ end
15
+
16
+ # Indicates whether its possible to capture the payment
17
+ def can_capture?(payment)
18
+ ['checkout', 'pending'].include?(payment.state)
19
+ end
20
+
21
+ # Indicates whether its possible to void the payment.
22
+ def can_void?(payment)
23
+ payment.state != 'void'
24
+ end
25
+
26
+ def capture(*args)
27
+ ActiveMerchant::Billing::Response.new(true, "", {}, {})
28
+ end
29
+
30
+ def void(*args)
31
+ ActiveMerchant::Billing::Response.new(true, "", {}, {})
32
+ end
33
+ end
@@ -0,0 +1,102 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rest_client'
3
+
4
+ class SpreeMercadoPagoClient
5
+ # These three includes are because of the user of line_item_description from
6
+ # ProductsHelper
7
+ include ActionView::Helpers::TextHelper
8
+ include ActionView::Helpers::SanitizeHelper
9
+ include Spree::ProductsHelper
10
+
11
+ attr_reader :errors
12
+ attr_reader :auth_response
13
+ attr_reader :preferences_response
14
+
15
+ def initialize(order, callbacks)
16
+ unless callbacks[:success] && callbacks[:pending] && callbacks[:failure]
17
+ raise "Url callbacks where not specified"
18
+ end
19
+
20
+ @order = order
21
+ @callbacks = callbacks
22
+ @errors = []
23
+ config_options
24
+ end
25
+
26
+ def authenticate
27
+ response = send_authentication_request
28
+
29
+ if response.code != 200
30
+ @auth_response = nil
31
+ @errors << I18n.t(:mp_authentication_error)
32
+ else
33
+ @errors = []
34
+ @auth_response = ActiveSupport::JSON.decode(response)
35
+ end
36
+
37
+ @auth_response
38
+ end
39
+
40
+ def send_data
41
+ response = send_preferences_request
42
+
43
+ if response.code != 201
44
+ @preferences_response = nil
45
+ @errors << I18n.t(:mp_preferences_setup_error)
46
+ else
47
+ @errors = []
48
+ @preferences_response = ActiveSupport::JSON.decode(response)
49
+ end
50
+
51
+ @preferences_response
52
+ end
53
+
54
+ def redirect_url
55
+ @preferences_response["init_point"] if @preferences_response.present?
56
+ end
57
+
58
+ private
59
+ def send_authentication_request
60
+ client_id = @order.payment_method.preferred_client_id
61
+ client_secret = @order.payment_method.preferred_client_secret
62
+
63
+ response = RestClient.post(
64
+ 'https://api.mercadolibre.com/oauth/token',
65
+ {:grant_type => 'client_credentials', :client_id => client_id, :client_secret => client_secret},
66
+ :content_type=> "application/x-www-form-urlencoded", :accept => 'application/json'
67
+ )
68
+ end
69
+
70
+ def send_preferences_request
71
+ RestClient.post(
72
+ mp_preferences_url(@auth_response["access_token"]),
73
+ @options.to_json,
74
+ :content_type=> 'application/json', :accept => 'application/json'
75
+ )
76
+ end
77
+
78
+ def mp_preferences_url(token)
79
+ "https://api.mercadolibre.com/checkout/preferences?access_token=#{token}"
80
+ end
81
+
82
+ def config_options
83
+ @options = Hash.new
84
+ @options[:external_reference] = @order.number
85
+ @options[:back_urls] = {
86
+ :success => @callbacks[:success],
87
+ :pending => @callbacks[:pending],
88
+ :failure => @callbacks[:failure]
89
+ }
90
+ @options[:items] = Array.new
91
+
92
+ @order.line_items.each do |li|
93
+ h = {
94
+ :title => line_item_description(li.variant),
95
+ :unit_price => li.price.to_f,
96
+ :quantity => li.quantity,
97
+ :currency_id => "ARS"
98
+ }
99
+ @options[:items] << h
100
+ end
101
+ end
102
+ end
@@ -0,0 +1 @@
1
+ <!-- Source form -->
@@ -0,0 +1 @@
1
+ <!-- Source view -->
@@ -0,0 +1 @@
1
+ <img src="http://imgmp.mlstatic.com/org-img/banners/ar/medios/575X40.jpg" title="MercadoPago - Medios de pago" alt="MercadoPago - Medios de pago" width="575" height="40"/>
@@ -0,0 +1 @@
1
+ <%= simple_format(I18n.t(:mp_payment_failure)) %>
@@ -0,0 +1 @@
1
+ <%= simple_format(I18n.t(:mp_payment_pending)) %>
@@ -0,0 +1 @@
1
+ <%= simple_format(I18n.t(:mp_payment_success)) %>
@@ -0,0 +1,13 @@
1
+ en:
2
+ mp_authentication_error: "It was not possible to authenticate with Mercado Pago"
3
+ mp_preferences_setup_error: "Couldn't send order preferences to Mercado Pago"
4
+ mp_payment_success:
5
+ Your payent with Mercado Pago was successful.
6
+
7
+ Please take into account that this payment may take some hours to reflect
8
+ on this site.
9
+ mp_payment_failure: "Your payment could not be processed by Mercado Pago"
10
+ mp_payment_pending:
11
+ Your order has been placed but your payment is still pending we will ship
12
+ your order and contact you as soon as the payment is processed"
13
+ mp_invalid_order: "The specified order is invalid"
@@ -0,0 +1,14 @@
1
+ es:
2
+ mp_authentication_error: "Hubo un error al realizar la autenticación con Mercado Pago"
3
+ mp_preferences_setup_error: "Hubo un error al enviar sus pedido a Mercado Pago"
4
+ mp_payment_success:
5
+ Su pago con Mercado Pago se ha efectuado con éxito.
6
+
7
+ Por favor tenga en cuenta que el estado de su pago puede tardar
8
+ algunas horas en reflejarse en este sitio.
9
+ mp_payment_failure: "Su pago no pudo ser procesado por Mercado Pago"
10
+ mp_payment_pending:
11
+ Su orden fue procesada con éxito aunque su pago aún se encuentra pendiente.
12
+
13
+ En cuanto su pago se concrete su pedido será finalizado.
14
+ mp_invalid_order: "La órden especificada es inválida"
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ # -*- encoding : utf-8 -*-
2
+ Spree::Core::Engine.routes.draw do
3
+ scope "/mercado_pago", controller: :mercado_pago do
4
+ get :success, as: :mercado_pago_success
5
+ get :pending, as: :mercado_pago_pending
6
+ get :failure, as: :mercado_pago_failure
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ module SpreeMercadoPagoPaymentMethod
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ def add_javascripts
6
+ append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_mercado_pago_payment_method\n"
7
+ append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_mercado_pago_payment_method\n"
8
+ end
9
+
10
+ def add_stylesheets
11
+ inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_mercado_pago_payment_method\n", :before => /\*\//, :verbose => true
12
+ inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_mercado_pago_payment_method\n", :before => /\*\//, :verbose => true
13
+ end
14
+
15
+ def add_migrations
16
+ run 'bundle exec rake railties:install:migrations FROM=spree_mercado_pago_payment_method'
17
+ end
18
+
19
+ def run_migrations
20
+ res = ask 'Would you like to run the migrations now? [Y/n]'
21
+ if res == '' || res.downcase == 'y'
22
+ run 'bundle exec rake db:migrate'
23
+ else
24
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spree_core'
3
+ require 'spree_mercado_pago_payment_method/engine'
@@ -0,0 +1,23 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spree_core'
3
+
4
+ module SpreeMercadoPagoPaymentMethod
5
+ class Engine < Rails::Engine
6
+
7
+ def self.activate
8
+ Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c|
9
+ Rails.application.config.cache_classes ? require(c) : load(c)
10
+ end
11
+
12
+ Dir.glob(File.join(File.dirname(__FILE__), "../../app/overrides/*.rb")) do |c|
13
+ Rails.application.config.cache_classes ? require(c) : load(c)
14
+ end
15
+ end
16
+
17
+ initializer "spree_payment_network.register.payment_methods" do |app|
18
+ app.config.spree.payment_methods += [PaymentMethod::MercadoPago]
19
+ end
20
+
21
+ config.to_prepare &method(:activate).to_proc
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
2
+ namespace :mercado_pago do
3
+ desc "Creates test user using MP API"
4
+ task :test_user => :environment do
5
+ end
6
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::CheckoutController do
4
+
5
+ let(:order) do
6
+ mock_model(
7
+ Spree::Order,
8
+ :checkout_allowed? => true,
9
+ :user => nil,
10
+ :email => nil,
11
+ :completed? => false,
12
+ :update_attributes => true,
13
+ :payment? => false,
14
+ :insufficient_stock_lines => [],
15
+ :coupon_code => nil
16
+ ).as_null_object
17
+ end
18
+
19
+ before(:each) do
20
+ user = double("User", :last_incomplete_spree_order => nil)
21
+ order.stub(:user => user)
22
+ controller.stub :current_order => order
23
+ controller.stub(:spree_current_user => user)
24
+ end
25
+
26
+ context "Using Mercado Pago payment method" do
27
+ let(:order_attributes) { { payments_attributes: [{payment_method_id: "fake_id"}] } }
28
+
29
+ before(:each) do
30
+ payment_method = double("PaymentMethod::MercadoPago")
31
+ payment_method.should_receive(:kind_of?).with(PaymentMethod::MercadoPago) { true }
32
+ Spree::PaymentMethod.should_receive(:find) { payment_method }
33
+ end
34
+
35
+ it "redirects to m.redirect_url on success" do
36
+ client = double("client")
37
+ client.should_receive(:authenticate) { true }
38
+ client.should_receive(:send_data) { true }
39
+ client.should_receive(:redirect_url) { "http://www.example.com" }
40
+ SpreeMercadoPagoClient.should_receive(:new) { client }
41
+
42
+ spree_post :update, {state: "payment", order: order_attributes }
43
+ response.should redirect_to("http://www.example.com")
44
+ end
45
+
46
+ it "renders mercado_pago_error.html.erb on error" do
47
+ client = double("client")
48
+ client.should_receive(:authenticate) { false }
49
+ client.stub(:send_data) { true }
50
+ client.stub(:redirect_url) { "http://www.example.com" }
51
+ SpreeMercadoPagoClient.should_receive(:new) { client }
52
+
53
+ spree_post :update, {state: "payment", order: order_attributes }
54
+ response.should render_template("mercado_pago_error")
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,90 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Spree::MercadoPagoController do
5
+ it "doesn't affect current order if there is one (session[:order_id])"
6
+
7
+ context "Logged out user" do
8
+ it "redirects to login and back again"
9
+ end
10
+
11
+ context "Logged in user" do
12
+ let(:user) { create(:user) }
13
+ let(:payment_method) { create(:payment_method, type: "PaymentMethod::MercadoPago") }
14
+ let(:order) do
15
+ order = create(:order, user: user, state: "payment")
16
+ create(:payment, payment_method: payment_method, order: order)
17
+ order
18
+ end
19
+
20
+ before { controller.stub(:spree_current_user => user) }
21
+ before do
22
+ order.payment.should_not be_nil
23
+ order.payment_method.should_not be_nil
24
+ order.payment_method.type.should eq("PaymentMethod::MercadoPago")
25
+ end
26
+
27
+ describe "#success" do
28
+ context "with valid order" do
29
+ before do
30
+ spree_get :success, { order_number: order.number }
31
+ end
32
+
33
+ it { response.should be_success }
34
+ it { assigns(:order).should_not be_nil }
35
+ it { assigns(:order).state.should eq("complete") }
36
+ it { assigns(:order).id.should eq(order.id)}
37
+ it { assigns(:order).payment.state.should eq("pending") }
38
+ end
39
+
40
+ context "with invalid order" do
41
+ before { spree_get :success }
42
+
43
+ it { response.should redirect_to(spree.root_path) }
44
+ it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
45
+ end
46
+ end
47
+
48
+ describe "#pending" do
49
+ context "with valid order" do
50
+ before do
51
+ spree_get :pending, { order_number: order.number }
52
+ end
53
+
54
+ it { response.should be_success }
55
+ it { assigns(:order).should_not be_nil }
56
+ it { assigns(:order).state.should eq("complete") }
57
+ it { assigns(:order).id.should eq(order.id)}
58
+ it { assigns(:order).payment.state.should eq("pending") }
59
+ end
60
+
61
+ context "with invalid order" do
62
+ before { spree_get :pending }
63
+
64
+ it { response.should redirect_to(spree.root_path) }
65
+ it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
66
+ end
67
+ end
68
+
69
+ describe "#failure" do
70
+ context "with valid order" do
71
+ before do
72
+ spree_get :failure, { order_number: order.number }
73
+ end
74
+
75
+ it { response.should be_success }
76
+ it { assigns(:order).should_not be_nil }
77
+ it { assigns(:order).state.should eq("payment") }
78
+ it { assigns(:order).id.should eq(order.id)}
79
+ it { assigns(:order).payment.state.should eq("pending") }
80
+ end
81
+
82
+ context "with invalid order" do
83
+ before { spree_get :failure }
84
+
85
+ it { response.should redirect_to(spree.root_path) }
86
+ it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
87
+ end
88
+ end
89
+ end
90
+ end