diff --git a/plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb b/plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb index 9b2a0fa..dd96ea3 100644 --- a/plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb +++ b/plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb @@ -1,3 +1,5 @@ +include ShoppingCartPlugin::CartHelper + class ShoppingCartPluginMyprofileController < MyProfileController append_view_path File.join(File.dirname(__FILE__) + '/../views') @@ -13,4 +15,27 @@ class ShoppingCartPluginMyprofileController < MyProfileController end end + def reports + utc_string = ' 00:00:00 UTC' + @from = params[:from] ? Time.parse(params[:from] + utc_string) : Time.now.utc.at_beginning_of_month + @to = params[:to] ? Time.parse(params[:to] + utc_string) : Time.now.utc + @status = !params[:filter_status].blank? ? params[:filter_status].to_i : nil + + condition = 'created_at >= ? AND created_at <= ?' + condition_parameters = [@from, @to+1.day] + if @status + condition += ' AND status == ?' + condition_parameters << @status + end + + conditions = [condition] + condition_parameters + @orders = profile.orders.find(:all, :conditions => conditions) + end + + def update_order_status + order = ShoppingCartPlugin::PurchaseOrder.find(params[:order_id].to_i) + order.status = params[:order_status].to_i + order.save! + redirect_to :action => 'reports', :from => params[:context_from], :to => params[:context_to], :filter_status => params[:context_status] + end end diff --git a/plugins/shopping_cart/lib/shopping_cart_plugin.rb b/plugins/shopping_cart/lib/shopping_cart_plugin.rb index e084e9b..fedb6a8 100644 --- a/plugins/shopping_cart/lib/shopping_cart_plugin.rb +++ b/plugins/shopping_cart/lib/shopping_cart_plugin.rb @@ -45,8 +45,14 @@ class ShoppingCartPlugin < Noosfero::Plugin end def control_panel_buttons + buttons = [] if context.profile.enterprise? - { :title => 'Shopping cart', :icon => 'shopping_cart_icon', :url => {:controller => 'shopping_cart_plugin_myprofile', :action => 'edit'} } + buttons << { :title => 'Shopping cart', :icon => 'shopping_cart_icon', :url => {:controller => 'shopping_cart_plugin_myprofile', :action => 'edit'} } end + if context.profile.enterprise? && context.profile.shopping_cart + buttons << { :title => 'Purchase reports', :icon => 'shopping-cart-purchase-report', :url => {:controller => 'shopping_cart_plugin_myprofile', :action => 'reports'} } + end + + buttons end end diff --git a/plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb b/plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb index d7b927a..a7fa0a7 100644 --- a/plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb +++ b/plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb @@ -54,8 +54,6 @@ module ShoppingCartPlugin::CartHelper '' end - private - def float_to_currency_cart(value, environment) number_to_currency(value, :unit => environment.currency_unit, :separator => environment.currency_separator, :delimiter => environment.currency_delimiter, :format => "%u %n") end diff --git a/plugins/shopping_cart/public/images/control-panel/purchase-report.png b/plugins/shopping_cart/public/images/control-panel/purchase-report.png new file mode 100644 index 0000000..024324a Binary files /dev/null and b/plugins/shopping_cart/public/images/control-panel/purchase-report.png differ diff --git a/plugins/shopping_cart/public/images/control-panel/purchase-report.svg b/plugins/shopping_cart/public/images/control-panel/purchase-report.svg new file mode 100644 index 0000000..4a869ba --- /dev/null +++ b/plugins/shopping_cart/public/images/control-panel/purchase-report.svg @@ -0,0 +1,648 @@ + + + + diff --git a/plugins/shopping_cart/public/style.css b/plugins/shopping_cart/public/style.css index d077fb5..4b79273 100644 --- a/plugins/shopping_cart/public/style.css +++ b/plugins/shopping_cart/public/style.css @@ -168,3 +168,31 @@ label.error { padding-left: .5em; vertical-align: top; } + +.controller-profile_editor a.control-panel-shopping-cart-purchase-report {background-image: url(images/control-panel/purchase-report.png)} +.controller-profile_editor .msie6 a.control-panel-shopping-cart-purchase-report {background-image: url(images/control-panel/purchase-report.gif)} +.controller-profile_editor a.control-panel-shopping-cart {background-image: url(/images/control-panel/shopping-cart.png)} +.controller-profile_editor .msie6 a.control-panel-shopping-cart {background-image: url(/images/control-panel/shopping-cart.gif)} + +.action-shopping_cart_plugin_myprofile-reports td.order-info { + padding: 0px; + height: auto; +} + +.action-shopping_cart_plugin_myprofile-reports .customer-details, +.action-shopping_cart_plugin_myprofile-reports .order-products { + list-style-position: inside; + float: left; + width: 49%; + margin: 0px; + padding: 10px 0px; +} + +.action-shopping_cart_plugin_myprofile-reports .order-products { + float: right; +} + +.action-shopping_cart_plugin_myprofile-reports .customer-details li, +.action-shopping_cart_plugin_myprofile-reports .order-products li { + padding-left: 5px; +} diff --git a/plugins/shopping_cart/test/functional/shopping_cart_plugin_myprofile_controller_test.rb b/plugins/shopping_cart/test/functional/shopping_cart_plugin_myprofile_controller_test.rb index cdb3da2..ae87820 100644 --- a/plugins/shopping_cart/test/functional/shopping_cart_plugin_myprofile_controller_test.rb +++ b/plugins/shopping_cart/test/functional/shopping_cart_plugin_myprofile_controller_test.rb @@ -6,6 +6,8 @@ class ShoppingCartPluginMyprofileController; def rescue_action(e) raise e end; e class ShoppingCartPluginMyprofileControllerTest < Test::Unit::TestCase + TIME_FORMAT = '%Y-%m-%d' + def setup @controller = ShoppingCartPluginMyprofileController.new @request = ActionController::TestRequest.new @@ -59,4 +61,36 @@ class ShoppingCartPluginMyprofileControllerTest < Test::Unit::TestCase enterprise.reload assert enterprise.shopping_cart_delivery_price == price end + + should 'filter the reports correctly' do + another_enterprise = fast_create(Enterprise) + po1 = ShoppingCartPlugin::PurchaseOrder.create!(:seller => enterprise, :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED) + po2 = ShoppingCartPlugin::PurchaseOrder.create!(:seller => enterprise, :status => ShoppingCartPlugin::PurchaseOrder::Status::SHIPPED) + po3 = ShoppingCartPlugin::PurchaseOrder.create!(:seller => enterprise, :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED) + po3.created_at = 1.year.ago + po3.save! + po4 = ShoppingCartPlugin::PurchaseOrder.create!(:seller => another_enterprise, :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED) + + post :reports, + :profile => enterprise.identifier, + :from => (Time.now - 1.day).strftime(TIME_FORMAT), + :to => (Time.now + 1.day).strftime(TIME_FORMAT), + :filter_status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED + + assert_includes assigns(:orders), po1 + assert_not_includes assigns(:orders), po2 + assert_not_includes assigns(:orders), po3 + assert_not_includes assigns(:orders), po4 + end + + should 'be able to update the order status' do + po = ShoppingCartPlugin::PurchaseOrder.create!(:seller => enterprise, :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED) + + post :update_order_status, + :profile => enterprise.identifier, + :order_id => po.id, + :order_status => ShoppingCartPlugin::PurchaseOrder::Status::CONFIRMED + po.reload + assert_equal ShoppingCartPlugin::PurchaseOrder::Status::CONFIRMED, po.status + end end diff --git a/plugins/shopping_cart/views/shopping_cart_plugin_myprofile/reports.html.erb b/plugins/shopping_cart/views/shopping_cart_plugin_myprofile/reports.html.erb new file mode 100644 index 0000000..3f913ae --- /dev/null +++ b/plugins/shopping_cart/views/shopping_cart_plugin_myprofile/reports.html.erb @@ -0,0 +1,109 @@ +
<%= _("No results.") %>
+<% else %> +<%= _('Date') %> | +<%= _('Customer') %> | +<%= _('Purchase value') %> | +<%= _('Status')%> | ++ |
---|---|---|---|---|
<%= order.created_at.strftime("%Y-%m-%d")%> | +<%= order.customer_name %> | +<%= float_to_currency_cart(order.products_list.sum {|id, qp| qp[:price]*qp[:quantity]}, environment) %> | ++ <% form_tag :action => 'update_order_status' do %> + <%= hidden_field_tag(:order_id, order.id) + + hidden_field_tag(:context_from, @from) + + hidden_field_tag(:context_to, @to) + + hidden_field_tag(:context_status, @status) + + select_tag( :order_status, options_from_collection_for_select(status_collection, :first, :last, order.status), + :onchange => "if(confirm(#{_('Are you sure about changing this order status?').to_json}))" + + " this.form.submit(); else this.selectedIndex = #{order.status}" ) + %> + <% end %> + | ++ |