app/controllers/plugins/ecommerce/front/checkout_controller.rb in camaleon_ecommerce-1.1 vs app/controllers/plugins/ecommerce/front/checkout_controller.rb in camaleon_ecommerce-1.2
- old
+ new
@@ -1,24 +1,16 @@
-=begin
- Camaleon CMS is a content management system
- Copyright (C) 2015 by Owen Peredo Diaz
- Email: owenperedo@gmail.com
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Affero General Public License (GPLv3) for more details.
-=end
class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontController
before_action :commerce_authenticate
before_action :set_cart
before_action :set_payment, only: [:pay_by_stripe, :pay_by_bank_transfer, :pay_by_credit_card, :pay_by_authorize_net, :pay_by_paypal]
def index
unless @cart.product_items.count > 0
flash[:notice] = t('plugins.ecommerce.messages.cart_no_products', default: 'Not exist products in your cart')
return redirect_to action: :cart_index
end
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout')]
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout')]
end
def step_address
@cart.set_meta("billing_address", params[:order][:billing_address])
@cart.set_meta("shipping_address", params[:order][:shipping_address])
@@ -52,11 +44,11 @@
end
end
def cart_index
@products = @cart.product_items.decorate
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.shopping_cart', default: 'Shopping cart')]
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.shopping_cart', default: 'Shopping cart')]
end
def res_coupon
code = params[:code].to_s.downcase
res = @cart.discount_for(code)
@@ -71,81 +63,87 @@
# params[cart]: product_id, qty
def cart_add
data = params[:cart]
qty = data[:qty].to_f rescue 0
product = current_site.products.find(data[:product_id]).decorate
- unless product.can_added?(qty)
- flash[:error] = t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_title, qty: product.the_qty_real, default: 'There is not enough products "%{product}" (%{qty})')
+ unless product.valid_variation?(params[:variation_id])
+ flash[:error] = t('plugins.ecommerce.messages.missing_variation', default: 'Invalid Product Variation')
+ return redirect_to action: :cart_index
+ end
+
+ unless product.can_added?(qty, params[:variation_id])
+ flash[:error] = t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_variation_title(params[:variation_id]), qty: product.the_qty_real(params[:variation_id]), default: 'There is not enough products "%{product}" (Available %{qty})')
return redirect_to :back
end
- @cart.add_product(product, qty)
+ @cart.add_product(product, qty, params[:variation_id])
flash[:notice] = t('plugins.ecommerce.messages.added_product_in_cart', default: 'Product added into cart')
redirect_to action: :cart_index
end
def cart_update
errors = []
- params[:products].each do |data|
- product = @cart.products.find(data[:product_id]).decorate
+ params[:product_items].each do |data|
+ item = @cart.product_items.find(data[:item_id])
+ product = item.product.decorate
qty = data[:qty].to_f
- if product.can_added?(qty)
- @cart.add_product(product, qty)
+ if product.can_added?(qty, item.variation_id)
+ @cart.add_product(product, qty, item.variation_id)
else
- errors << t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_title, qty: product.the_qty_real, default: 'There is not enough products "%{product}" (%{qty})')
+ errors << t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_variation_title(item.variation_id), qty: product.the_qty_real(item.variation_id), default: 'There is not enough products "%{product}" (Available %{qty})')
end
end
flash[:error] = errors.join('<br>') if errors.present?
flash[:notice] = t('plugins.ecommerce.messages.cart_updated', default: 'Shopping cart updated') unless errors.present?
redirect_to action: :cart_index
end
def cart_remove
- @cart.remove_product(params[:product_id])
+ @cart.product_items.find(params[:product_item_id]).destroy
flash[:notice] = t('plugins.ecommerce.messages.cart_deleted', default: 'Product removed from your shopping cart')
redirect_to action: :cart_index
end
def cancel_order
- # @cart = current_site.orders.find_by_slug(params[:order])
@cart.update({status: 'canceled', kind: 'order', closed_at: Time.now})
flash[:notice] = t('plugins.ecommerce.messages.canceled_order', default: "Canceled Order")
redirect_to plugins_ecommerce_orders_url
end
- # pay by stripe
def pay_by_stripe
- require 'stripe'
- Stripe.api_key = @payment.options[:stripe_id]
- customer = Stripe::Customer.create(:email => params[:stripeEmail], :source => params[:stripeToken])
- begin
- charge = Stripe::Charge.create(
- :customer => customer.id,
- :amount => commerce_to_cents(@cart.total_amount),
- :description => "Payment Products: #{@cart.products_title}",
- :currency => commerce_current_currency
+ result = Plugins::Ecommerce::CartService.new(current_site, @cart).
+ pay_with_stripe(payment_method: @payment,
+ email: params[:stripeEmail],
+ stripe_token: params[:stripeToken],
)
- @cart.set_meta("payment_data", params)
+ if result[:error].present?
+ flash[:error] = result[:error]
+ if result[:payment_error]
+ flash[:payment_error] = true
+ end
+ redirect_to :back
+ else
mark_order_like_received(@cart)
redirect_to plugins_ecommerce_orders_url
- rescue Stripe::CardError => e
- flash[:error] = e.message
- flash[:payment_error] = true
- redirect_to :back
- rescue => e
- flash[:error] = e.message
- redirect_to :back
end
end
def pay_by_bank_transfer
@cart.set_meta("payment_data", params[:details])
mark_order_like_received(@cart, 'bank_pending')
redirect_to plugins_ecommerce_orders_url
end
def pay_by_authorize_net
- res = payment_pay_by_credit_card_authorize_net(@cart, @payment)
+ res = Plugins::Ecommerce::CartService.new(current_site, @cart).
+ pay_with_authorize_net(payment_method: @payment, ip: request.remote_ip,
+ first_name: params[:firstName],
+ last_name: params[:lastName],
+ number: params[:cardNumber],
+ exp_month: params[:expMonth],
+ exp_year: params[:expYear],
+ cvc: params[:cvCode],
+ )
if res[:error].present?
flash[:error] = res[:error]
flash[:payment_error] = true
redirect_to :back
else
@@ -153,11 +151,10 @@
redirect_to plugins_ecommerce_orders_url
end
end
def success_paypal
- # @cart = current_site.carts.find_by_slug(params[:order])
@cart.set_meta('payment_data', {token: params[:token], PayerID: params[:PayerID]})
mark_order_like_received(@cart)
redirect_to plugins_ecommerce_orders_url
end
@@ -165,51 +162,21 @@
# @cart = current_site.orders.find_by_slug(params[:order])
redirect_to plugins_ecommerce_orders_url
end
def pay_by_paypal
- billing_address = @cart.get_meta("billing_address")
- ActiveMerchant::Billing::Base.mode = @payment.options[:paypal_sandbox].to_s.to_bool ? :test : :production
- paypal_options = {
- :login => @payment.options[:paypal_login],
- :password => @payment.options[:paypal_password],
- :signature => @payment.options[:paypal_signature]
- }
- @gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
- @options = {
- brand_name: current_site.name,
- items: [{number: @cart.slug, name: "Buy Products from #{current_site.the_title}: #{@cart.products_title}", amount: commerce_to_cents(@cart.total_amount)}],
- :order_id => @cart.slug,
- :currency => current_site.currency_code,
- :email => @cart.user.email,
- :billing_address => {:name => "#{billing_address[:first_name]} #{billing_address[:last_name]}",
- :address1 => billing_address[:address1],
- :address2 => billing_address[:address2],
- :city => billing_address[:city],
- :state => billing_address[:state],
- :country => billing_address[:country],
- :zip => billing_address[:zip]
- },
- :description => "Buy Products from #{current_site.the_title}: #{@cart.total_amount}",
- :ip => request.remote_ip,
- :return_url => plugins_ecommerce_checkout_success_paypal_url(order: @cart.slug),
- :cancel_return_url => plugins_ecommerce_checkout_cancel_paypal_url(order: @cart.slug)
- }
- response = @gateway.setup_purchase(commerce_to_cents(@cart.total_amount), @options)
- redirect_to @gateway.redirect_url_for(response.token)
+ result = Plugins::Ecommerce::CartService.new(current_site, @cart).
+ pay_with_paypal(payment_method: @payment, ip: request.remote_ip, return_url: plugins_ecommerce_checkout_success_paypal_url(order: @cart.slug), cancel_return_url: plugins_ecommerce_checkout_cancel_paypal_url(order: @cart.slug))
+ redirect_to result[:redirect_url]
end
private
def set_cart
- @cart = current_site.carts.set_user(current_user).first_or_create(name: "Cart by #{current_user.id}").decorate
+ @cart = Plugins::Ecommerce::UserCartService.new(current_site, current_user).get_cart
end
- def commerce_to_cents(money)
- (money*100).round
- end
-
def set_bread
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout'), url_for(action: :cart_index)]
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout'), url_for(action: :cart_index)]
end
def set_payment
@payment = current_site.payment_methods.actives.where(id: params[:payment][:payment_id]).first
@cart.update_column(:payment_method_id, @payment.id)