Class: Piggybak::OrdersController

Inherits:
ApplicationController
  • Object
show all
Defined in:
app/controllers/piggybak/orders_controller.rb

Instance Method Summary collapse

Instance Method Details

#cancelObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/controllers/piggybak/orders_controller.rb', line 106

def cancel
  order = Piggybak::Order.where(id: params[:id]).first

  if can?(:cancel, order)
    order.recorded_changer = current_user.id
    order.disable_order_notes = true

    order.line_items.each do |line_item|
      if line_item.line_item_type != "payment"
        line_item.mark_for_destruction
      end
    end
    order.update_attribute(:total, 0.00)
    order.update_attribute(:to_be_cancelled, true)

    OrderNote.create(:order_id => order.id, :note => "Order set to cancelled. Line items, shipments, tax removed.", :user_id => current_user.id)
    
    flash[:notice] = "Order #{order.id} set to cancelled. Order is now in unbalanced state."
  else
    flash[:error] = "You do not have permission to cancel this order."
  end

  redirect_to rails_admin.edit_path('Piggybak::Order', order.id)
end

#downloadObject



84
85
86
87
88
89
90
91
92
# File 'app/controllers/piggybak/orders_controller.rb', line 84

def download
  @order = Piggybak::Order.where(id: params[:id]).first

  if can?(:download, @order)
    render :layout => false
  else
    render "no_access"
  end
end

#emailObject



94
95
96
97
98
99
100
101
102
103
104
# File 'app/controllers/piggybak/orders_controller.rb', line 94

def email
  order = Piggybak::Order.where(id: params[:id]).first

  if can?(:email, order)
    Piggybak::Notifier.order_notification(order).deliver
    flash[:notice] = "Email notification sent."
    OrderNote.create(:order_id => order.id, :note => "Email confirmation manually sent.", :user_id => current_user.id)
  end

  redirect_to rails_admin.edit_path('Piggybak::Order', order.id)
end

#geodataObject



146
147
148
149
150
151
152
153
# File 'app/controllers/piggybak/orders_controller.rb', line 146

def geodata
  countries = ::Piggybak::Country.all.includes(:states)
  data = countries.inject({}) do |h, country|
    h["country_#{country.id}"] = country.states
    h
  end
  render :json => { :countries => data }
end

#listObject



80
81
82
# File 'app/controllers/piggybak/orders_controller.rb', line 80

def list
  redirect_to main_app.root_url if current_user.nil?
end

#receiptObject



69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/piggybak/orders_controller.rb', line 69

def receipt
  response.headers['Cache-Control'] = 'no-cache'

  if !session.has_key?(:last_order)
    redirect_to main_app.root_url 
    return
  end

  @order = Piggybak::Order.where(id: session[:last_order]).first
end

#shippingObject

AJAX Actions from checkout



132
133
134
135
136
137
# File 'app/controllers/piggybak/orders_controller.rb', line 132

def shipping
  cart = Piggybak::Cart.new(request.cookies["cart"])
  cart.set_extra_data(params)
  shipping_methods = Piggybak::ShippingMethod.lookup_methods(cart)
  render :json => shipping_methods
end

#submitObject



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/controllers/piggybak/orders_controller.rb', line 3

def submit
  response.headers['Cache-Control'] = 'no-cache'
  @cart = Piggybak::Cart.new(request.cookies["cart"])

  if request.post?
    logger = Logger.new("#{Rails.root}/#{Piggybak.config.logging_file}")

    begin
      ActiveRecord::Base.transaction do
        @order = Piggybak::Order.new(orders_params)
        @order.create_payment_shipment

        if Piggybak.config.logging
          clean_params = params[:order].clone
          clean_params[:line_items_attributes].each do |k, li_attr|
            if li_attr[:line_item_type] == "payment" && li_attr.has_key?(:payment_attributes)
              if li_attr[:payment_attributes].has_key?(:number)
                li_attr[:payment_attributes][:number] = li_attr[:payment_attributes][:number].mask_cc_number
              end
              if li_attr[:payment_attributes].has_key?(:verification_value)
                li_attr[:payment_attributes][:verification_value] = li_attr[:payment_attributes][:verification_value].mask_csv
              end
            end
          end
          logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order received with params #{clean_params.inspect}" 
        end
        @order.initialize_user(current_user)

        @order.ip_address = request.remote_ip 
        @order.user_agent = request.user_agent  
        @order.add_line_items(@cart)

        if Piggybak.config.logging
          logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order contains: #{cookies["cart"]} for user #{current_user ? current_user.email : 'guest'}"
        end

        if @order.save
          if Piggybak.config.logging
            logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order saved: #{@order.inspect}"
          end

          cookies["cart"] = { :value => '', :path => '/' }
          session[:last_order] = @order.id
          redirect_to piggybak.receipt_url 
        else
          if Piggybak.config.logging
            logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order failed to save #{@order.errors.full_messages} with #{@order.inspect}."
          end
          raise Exception, @order.errors.full_messages
        end
      end
    rescue Exception => e
      if Piggybak.config.logging
        logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order exception: #{e.inspect}"
      end
      if @order.errors.empty?
        @order.errors[:base] << "Your order could not go through. Please try again."
      end
    end
  else
    @order = Piggybak::Order.new
    @order.create_payment_shipment
    @order.initialize_user(current_user)
  end
end

#taxObject



139
140
141
142
143
144
# File 'app/controllers/piggybak/orders_controller.rb', line 139

def tax
  cart = Piggybak::Cart.new(request.cookies["cart"])
  cart.set_extra_data(params)
  total_tax = Piggybak::TaxMethod.calculate_tax(cart)
  render :json => { :tax => total_tax }
end