PageRenderTime 1337ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/backend/app/controllers/spree/admin/orders_controller.rb

https://github.com/jsqu99/spree
Ruby | 131 lines | 96 code | 24 blank | 11 comment | 13 complexity | b272c4b818d3bda181356ab6f4c7c319 MD5 | raw file
  1. module Spree
  2. module Admin
  3. class OrdersController < Spree::Admin::BaseController
  4. before_filter :initialize_order_events
  5. before_filter :load_order, :only => [:edit, :update, :fire, :resend, :open_adjustments, :close_adjustments]
  6. respond_to :html
  7. def index
  8. params[:q] ||= {}
  9. params[:q][:completed_at_not_null] ||= '1' if Spree::Config[:show_only_complete_orders_by_default]
  10. @show_only_completed = params[:q][:completed_at_not_null] == '1'
  11. params[:q][:s] ||= @show_only_completed ? 'completed_at desc' : 'created_at desc'
  12. # As date params are deleted if @show_only_completed, store
  13. # the original date so we can restore them into the params
  14. # after the search
  15. created_at_gt = params[:q][:created_at_gt]
  16. created_at_lt = params[:q][:created_at_lt]
  17. params[:q].delete(:inventory_units_shipment_id_null) if params[:q][:inventory_units_shipment_id_null] == "0"
  18. if !params[:q][:created_at_gt].blank?
  19. params[:q][:created_at_gt] = Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day rescue ""
  20. end
  21. if !params[:q][:created_at_lt].blank?
  22. params[:q][:created_at_lt] = Time.zone.parse(params[:q][:created_at_lt]).end_of_day rescue ""
  23. end
  24. if @show_only_completed
  25. params[:q][:completed_at_gt] = params[:q].delete(:created_at_gt)
  26. params[:q][:completed_at_lt] = params[:q].delete(:created_at_lt)
  27. end
  28. @search = Order.accessible_by(current_ability, :index).ransack(params[:q])
  29. # lazyoading other models here (via includes) may result in an invalid query
  30. # e.g. SELECT DISTINCT DISTINCT "spree_orders".id, "spree_orders"."created_at" AS alias_0 FROM "spree_orders"
  31. # see https://github.com/spree/spree/pull/3919
  32. @orders = @search.result(distinct: true).
  33. page(params[:page]).
  34. per(params[:per_page] || Spree::Config[:orders_per_page])
  35. # Restore dates
  36. params[:q][:created_at_gt] = created_at_gt
  37. params[:q][:created_at_lt] = created_at_lt
  38. end
  39. def new
  40. @order = Order.create
  41. @order.created_by = try_spree_current_user
  42. @order.save
  43. redirect_to edit_admin_order_url(@order)
  44. end
  45. def edit
  46. unless @order.complete?
  47. @order.refresh_shipment_rates
  48. end
  49. end
  50. def update
  51. if @order.update_attributes(params[:order]) && @order.line_items.present?
  52. @order.update!
  53. unless @order.complete?
  54. # Jump to next step if order is not complete.
  55. redirect_to admin_order_customer_path(@order) and return
  56. end
  57. else
  58. @order.errors.add(:line_items, Spree.t('errors.messages.blank')) if @order.line_items.empty?
  59. end
  60. render :action => :edit
  61. end
  62. def fire
  63. # TODO - possible security check here but right now any admin can before any transition (and the state machine
  64. # itself will make sure transitions are not applied in the wrong state)
  65. event = params[:e]
  66. if @order.state_events.include?(event.to_sym) && @order.send("#{event}")
  67. flash[:success] = Spree.t(:order_updated)
  68. else
  69. flash[:error] = Spree.t(:cannot_perform_operation)
  70. end
  71. rescue Spree::Core::GatewayError => ge
  72. flash[:error] = "#{ge.message}"
  73. ensure
  74. redirect_to :back
  75. end
  76. def resend
  77. OrderMailer.confirm_email(@order.id, true).deliver
  78. flash[:success] = Spree.t(:order_email_resent)
  79. redirect_to :back
  80. end
  81. def open_adjustments
  82. adjustments = @order.adjustments.where(:state => 'closed')
  83. adjustments.update_all(:state => 'open')
  84. flash[:success] = Spree.t(:all_adjustments_opened)
  85. respond_with(@order) { |format| format.html { redirect_to :back } }
  86. end
  87. def close_adjustments
  88. adjustments = @order.adjustments.where(:state => 'open')
  89. adjustments.update_all(:state => 'closed')
  90. flash[:success] = Spree.t(:all_adjustments_closed)
  91. respond_with(@order) { |format| format.html { redirect_to :back } }
  92. end
  93. private
  94. def load_order
  95. @order = Order.includes(:adjustments).find_by_number!(params[:id])
  96. authorize! action, @order
  97. end
  98. # Used for extensions which need to provide their own custom event links on the order details view.
  99. def initialize_order_events
  100. @order_events = %w{cancel resume}
  101. end
  102. def model_class
  103. Spree::Order
  104. end
  105. end
  106. end
  107. end