spree_mercado_pago_payment_method 0.0.2

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.
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