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

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

https://github.com/fig/spree
Ruby | 155 lines | 115 code | 31 blank | 9 comment | 12 complexity | 0577e8d5e64ab33c7c9dfd30b22072cc MD5 | raw file
Possible License(s): BSD-3-Clause
  1. module Spree
  2. module Admin
  3. class OrdersController < Spree::Admin::BaseController
  4. before_action :initialize_order_events
  5. before_action :load_order, only: [:edit, :update, :cancel, :resume, :approve, :resend, :open_adjustments, :close_adjustments, :cart]
  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. params[:q][:completed_at_not_null] = '' unless @show_only_completed
  13. # As date params are deleted if @show_only_completed, store
  14. # the original date so we can restore them into the params
  15. # after the search
  16. created_at_gt = params[:q][:created_at_gt]
  17. created_at_lt = params[:q][:created_at_lt]
  18. params[:q].delete(:inventory_units_shipment_id_null) if params[:q][:inventory_units_shipment_id_null] == '0'
  19. if params[:q][:created_at_gt].present?
  20. params[:q][:created_at_gt] = begin
  21. Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day
  22. rescue
  23. ''
  24. end
  25. end
  26. if params[:q][:created_at_lt].present?
  27. params[:q][:created_at_lt] = begin
  28. Time.zone.parse(params[:q][:created_at_lt]).end_of_day
  29. rescue
  30. ''
  31. end
  32. end
  33. if @show_only_completed
  34. params[:q][:completed_at_gt] = params[:q].delete(:created_at_gt)
  35. params[:q][:completed_at_lt] = params[:q].delete(:created_at_lt)
  36. end
  37. @search = Spree::Order.preload(:user).accessible_by(current_ability, :index).ransack(params[:q])
  38. # lazy loading other models here (via includes) may result in an invalid query
  39. # e.g. SELECT DISTINCT DISTINCT "spree_orders".id, "spree_orders"."created_at" AS alias_0 FROM "spree_orders"
  40. # see https://github.com/spree/spree/pull/3919
  41. @orders = @search.result(distinct: true).
  42. page(params[:page]).
  43. per(params[:per_page] || Spree::Config[:admin_orders_per_page])
  44. # Restore dates
  45. params[:q][:created_at_gt] = created_at_gt
  46. params[:q][:created_at_lt] = created_at_lt
  47. end
  48. def new
  49. @order = Spree::Order.create(order_params)
  50. redirect_to cart_admin_order_url(@order)
  51. end
  52. def edit
  53. can_not_transition_without_customer_info
  54. @order.refresh_shipment_rates(ShippingMethod::DISPLAY_ON_BACK_END) unless @order.completed?
  55. end
  56. def cart
  57. @order.refresh_shipment_rates(ShippingMethod::DISPLAY_ON_BACK_END) unless @order.completed?
  58. if @order.shipments.shipped.exists?
  59. redirect_to edit_admin_order_url(@order)
  60. end
  61. end
  62. def update
  63. if @order.update_attributes(params[:order]) && @order.line_items.present?
  64. @order.update_with_updater!
  65. unless @order.completed?
  66. # Jump to next step if order is not completed.
  67. redirect_to admin_order_customer_path(@order) and return
  68. end
  69. else
  70. @order.errors.add(:line_items, Spree.t('errors.messages.blank')) if @order.line_items.empty?
  71. end
  72. render action: :edit
  73. end
  74. def cancel
  75. @order.canceled_by(try_spree_current_user)
  76. flash[:success] = Spree.t(:order_canceled)
  77. redirect_back fallback_location: spree.edit_admin_order_url(@order)
  78. end
  79. def resume
  80. @order.resume!
  81. flash[:success] = Spree.t(:order_resumed)
  82. redirect_back fallback_location: spree.edit_admin_order_url(@order)
  83. end
  84. def approve
  85. @order.approved_by(try_spree_current_user)
  86. flash[:success] = Spree.t(:order_approved)
  87. redirect_back fallback_location: spree.edit_admin_order_url(@order)
  88. end
  89. def resend
  90. OrderMailer.confirm_email(@order.id, true).deliver_later
  91. flash[:success] = Spree.t(:order_email_resent)
  92. redirect_back fallback_location: spree.edit_admin_order_url(@order)
  93. end
  94. def open_adjustments
  95. adjustments = @order.all_adjustments.closed
  96. adjustments.update_all(state: 'open')
  97. flash[:success] = Spree.t(:all_adjustments_opened)
  98. respond_with(@order) { |format| format.html { redirect_back fallback_location: spree.admin_order_adjustments_url(@order) } }
  99. end
  100. def close_adjustments
  101. adjustments = @order.all_adjustments.open
  102. adjustments.update_all(state: 'closed')
  103. flash[:success] = Spree.t(:all_adjustments_closed)
  104. respond_with(@order) { |format| format.html { redirect_back fallback_location: spree.admin_order_adjustments_url(@order) } }
  105. end
  106. private
  107. def order_params
  108. params[:created_by_id] = try_spree_current_user.try(:id)
  109. params.permit(:created_by_id, :user_id, :store_id)
  110. end
  111. def load_order
  112. @order = Spree::Order.includes(:adjustments).find_by!(number: params[:id])
  113. authorize! action, @order
  114. end
  115. # Used for extensions which need to provide their own custom event links on the order details view.
  116. def initialize_order_events
  117. @order_events = %w{approve cancel resume}
  118. end
  119. def model_class
  120. Spree::Order
  121. end
  122. end
  123. end
  124. end