diff --git a/Gemfile.lock b/Gemfile.lock index a79ae3a26e..2e5e808e92 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,7 +23,7 @@ GIT GIT remote: git://github.com/eaterprises/spree_paypal_express.git - revision: ec7fd298f117fe6c598070dc0e7a38887b9bcbc4 + revision: 7dd46e6e549d82c4d603f685a7cb7fbb4af0d973 branch: 1-1-stable specs: spree_paypal_express (1.1.0) @@ -129,7 +129,7 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) acts_as_list (0.1.4) - addressable (2.2.8) + addressable (2.3.2) andand (1.3.3) ansi (1.4.2) arel (3.0.2) @@ -145,15 +145,15 @@ GEM multi_json (~> 1.0) builder (3.0.4) cancan (1.6.7) - capybara (1.1.2) + capybara (1.1.3) mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) selenium-webdriver (~> 2.0) xpath (~> 0.1.4) - childprocess (0.3.2) - ffi (~> 1.0.6) + childprocess (0.3.6) + ffi (~> 1.0, >= 1.0.6) cocaine (0.4.2) coderay (1.0.7) coffee-rails (3.2.2) @@ -196,7 +196,7 @@ GEM faker (1.0.1) i18n (~> 0.4) ffaker (1.12.1) - ffi (1.0.11) + ffi (1.1.5) haml (3.1.6) highline (1.6.11) hike (1.2.1) @@ -215,7 +215,7 @@ GEM railties (>= 3.0.0) kgio (2.7.4) libv8 (3.3.10.4) - libwebsocket (0.1.3) + libwebsocket (0.1.5) addressable mail (2.4.4) i18n (>= 0.4.0) @@ -295,15 +295,14 @@ GEM activesupport (>= 3.0) railties (>= 3.0) rspec (~> 2.10.0) - rubyzip (0.9.8) + rubyzip (0.9.9) sass (3.1.19) sass-rails (3.2.5) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) - selenium-webdriver (2.22.2) + selenium-webdriver (2.25.0) childprocess (>= 0.2.5) - ffi (~> 1.0) libwebsocket (~> 0.1.3) multi_json (~> 1.0) rubyzip @@ -321,13 +320,13 @@ GEM libv8 (~> 3.3.10) thor (0.16.0) tilt (1.3.3) - treetop (1.4.11) + treetop (1.4.12) polyglot polyglot (>= 0.3.1) truncate_html (0.5.5) turn (0.8.3) ansi - tzinfo (0.3.33) + tzinfo (0.3.34) uglifier (1.2.4) execjs (>= 0.3.0) multi_json (>= 1.0.2) diff --git a/app/assets/javascripts/store/products.js b/app/assets/javascripts/store/products.js index 3e972161a6..0dabff5f4d 100644 --- a/app/assets/javascripts/store/products.js +++ b/app/assets/javascripts/store/products.js @@ -10,6 +10,15 @@ $(document).ready(function() { // Product page with master price only $(".add-to-cart input.title:not(#quantity):not(.max_quantity)").change(products_update_price_without_variant).change(); + + // Product page other + $("#distributor_id").change(function() { + var distributor_html = distributors[$(this).val()]; + if(!distributor_html) { + distributor_html = 'When you select a distributor for your order, their address and pickup times will be displayed here.'; + } + $("#product-distributor-details .distributor-details").html(distributor_html); + }); }); diff --git a/app/assets/stylesheets/store/openfoodweb.css.scss b/app/assets/stylesheets/store/openfoodweb.css.scss index a3cb0a29f1..24c0b1fd5a 100644 --- a/app/assets/stylesheets/store/openfoodweb.css.scss +++ b/app/assets/stylesheets/store/openfoodweb.css.scss @@ -128,8 +128,8 @@ ul.product-listing { } -/* Supplier and distributor description */ -.supplier-description, .distributor-description { +/* Enterprise description */ +.enterprise-description { margin-bottom: 2em; } @@ -144,6 +144,19 @@ ul.product-listing { } +/* Distributor details on product details page */ +fieldset#product-distributor-details { + float: right; + margin-top: 0; + width: 250px; + @extend #shipping; +} + +#product-variants { + float: none; +} + + /* Add to cart form on product details page */ #cart-form { .error-distributor { diff --git a/app/controllers/admin/distributors_controller.rb b/app/controllers/admin/distributors_controller.rb deleted file mode 100644 index 21d561a1ea..0000000000 --- a/app/controllers/admin/distributors_controller.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Admin - class DistributorsController < ResourceController - before_filter :load_distributor_set, :only => :index - before_filter :load_countries, :except => :index - - def bulk_update - @distributor_set = DistributorSet.new(params[:distributor_set]) - if @distributor_set.save - redirect_to main_app.admin_distributors_path, :notice => 'Distributor collection times updated.' - else - render :index - end - end - - private - def load_distributor_set - @distributor_set = DistributorSet.new :distributors => collection - end - - def load_countries - @countries = Spree::Country.order(:name) - end - - def collection - super.order(:name) - end - end -end diff --git a/app/controllers/admin/enterprises_controller.rb b/app/controllers/admin/enterprises_controller.rb new file mode 100644 index 0000000000..08f6e2133f --- /dev/null +++ b/app/controllers/admin/enterprises_controller.rb @@ -0,0 +1,30 @@ +module Admin + class EnterprisesController < ResourceController + before_filter :load_enterprise_set, :only => :index + before_filter :load_countries, :except => :index + + helper 'spree/products' + + def bulk_update + @enterprise_set = EnterpriseSet.new(params[:enterprise_set]) + if @enterprise_set.save + redirect_to main_app.admin_enterprises_path, :notice => 'Distributor collection times updated.' + else + render :index + end + end + + private + def load_enterprise_set + @enterprise_set = EnterpriseSet.new :enterprises => collection + end + + def load_countries + @countries = Spree::Country.order(:name) + end + + def collection + super.order('is_primary_producer DESC, is_distributor ASC, name') + end + end +end diff --git a/app/controllers/admin/suppliers_controller.rb b/app/controllers/admin/suppliers_controller.rb deleted file mode 100644 index 63eb594bf3..0000000000 --- a/app/controllers/admin/suppliers_controller.rb +++ /dev/null @@ -1,16 +0,0 @@ -module Admin - class SuppliersController < ResourceController - before_filter :load_data, :except => [:index] - - helper 'spree/products' - - private - def load_data - @countries = Spree::Country.order(:name) - end - - def collection - super.order(:name) - end - end -end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 73238eaef2..b5bcef894e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,10 +9,9 @@ class ApplicationController < ActionController::Base @cms_site = Cms::Site.where(:identifier => 'open-food-web').first end - def load_data_for_sidebar - @suppliers = Supplier.all - @distributors = Distributor.with_active_products_on_hand.by_name + @suppliers = Enterprise.is_primary_producer + @distributors = Enterprise.is_distributor.with_distributed_active_products_on_hand.by_name end end diff --git a/app/controllers/distributors_controller.rb b/app/controllers/distributors_controller.rb deleted file mode 100644 index 97c6d81691..0000000000 --- a/app/controllers/distributors_controller.rb +++ /dev/null @@ -1,35 +0,0 @@ -class DistributorsController < BaseController - def show - options = {:distributor_id => params[:id]} - options.merge(params.reject { |k,v| k == :id }) - - @distributor = Distributor.find params[:id] - - @searcher = Spree::Config.searcher_class.new(options) - @products = @searcher.retrieve_products - end - - def select - distributor = Distributor.find params[:id] - - order = current_order(true) - - if order.can_change_distributor? - order.distributor = distributor - order.save! - end - - redirect_to distributor - end - - def deselect - order = current_order(true) - - if order.can_change_distributor? - order.distributor = nil - order.save! - end - - redirect_to root_path - end -end diff --git a/app/controllers/enterprises_controller.rb b/app/controllers/enterprises_controller.rb new file mode 100644 index 0000000000..1b05eaf1c3 --- /dev/null +++ b/app/controllers/enterprises_controller.rb @@ -0,0 +1,53 @@ +class EnterprisesController < BaseController + def index + @enterprises = Enterprise.all + end + + def suppliers + @suppliers = Enterprise.is_primary_producer + end + + def distributors + @distributors = Enterprise.is_distributor + + respond_to do |format| + format.js do + @distributor_details = Hash[@distributors.map { |d| [d.id, render_to_string(:partial => 'enterprises/distributor_details', :locals => {:distributor => d})] }] + end + end + end + + def show + options = {:enterprise_id => params[:id]} + options.merge(params.reject { |k,v| k == :id }) + + @enterprise = Enterprise.find params[:id] + + @searcher = Spree::Config.searcher_class.new(options) + @products = @searcher.retrieve_products + end + + def select_distributor + distributor = Enterprise.is_distributor.find params[:id] + + order = current_order(true) + + if order.can_change_distributor? + order.distributor = distributor + order.save! + end + + redirect_to distributor + end + + def deselect_distributor + order = current_order(true) + + if order.can_change_distributor? + order.distributor = nil + order.save! + end + + redirect_to root_path + end +end diff --git a/app/controllers/spree/admin/reports_controller_decorator.rb b/app/controllers/spree/admin/reports_controller_decorator.rb index b4d6585ec2..ed5e9f5b8f 100644 --- a/app/controllers/spree/admin/reports_controller_decorator.rb +++ b/app/controllers/spree/admin/reports_controller_decorator.rb @@ -1,25 +1,29 @@ require 'csv' require 'open_food_web/order_and_distributor_report' require 'open_food_web/group_buy_report' +require 'open_food_web/order_grouper' Spree::Admin::ReportsController.class_eval do Spree::Admin::ReportsController::AVAILABLE_REPORTS.merge!({:orders_and_distributors => {:name => "Orders And Distributors", :description => "Orders with distributor details"}}) Spree::Admin::ReportsController::AVAILABLE_REPORTS.merge!({:group_buys => {:name => "Group Buys", :description => "Orders by supplier and variant"}}) + Spree::Admin::ReportsController::AVAILABLE_REPORTS.merge!({:bulk_coop => {:name => "Bulk Co-Op", :description => "Reports for Bulk Co-Op orders"}}) + Spree::Admin::ReportsController::AVAILABLE_REPORTS.merge!({:payments => {:name => "Payment Reports", :description => "Reports for Payments"}}) + Spree::Admin::ReportsController::AVAILABLE_REPORTS.merge!({:order_cycles => {:name => "Order Cycle Reports", :description => "Reports for Order Cycles"}}) def orders_and_distributors params[:q] = {} unless params[:q] - if params[:q][:created_at_gt].blank? - params[:q][:created_at_gt] = Time.zone.now.beginning_of_month + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month else - params[:q][:created_at_gt] = Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month end - if params[:q] && !params[:q][:created_at_lt].blank? - params[:q][:created_at_lt] = Time.zone.parse(params[:q][:created_at_lt]).end_of_day rescue "" + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]).end_of_day rescue "" end - params[:q][:meta_sort] ||= "created_at.desc" + params[:q][:meta_sort] ||= "completed_at.desc" @search = Spree::Order.complete.search(params[:q]) orders = @search.result @@ -39,21 +43,21 @@ Spree::Admin::ReportsController.class_eval do def group_buys params[:q] = {} unless params[:q] - if params[:q][:created_at_gt].blank? - params[:q][:created_at_gt] = Time.zone.now.beginning_of_month + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month else - params[:q][:created_at_gt] = Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month end - if params[:q] && !params[:q][:created_at_lt].blank? - params[:q][:created_at_lt] = Time.zone.parse(params[:q][:created_at_lt]).end_of_day rescue "" + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]).end_of_day rescue "" end - params[:q][:meta_sort] ||= "created_at.desc" + params[:q][:meta_sort] ||= "completed_at.desc" @search = Spree::Order.complete.search(params[:q]) orders = @search.result - @distributors = Distributor.all + @distributors = Enterprise.is_distributor @report = OpenFoodWeb::GroupBuyReport.new orders unless params[:csv] @@ -67,4 +71,458 @@ Spree::Admin::ReportsController.class_eval do end end + def bulk_coop + params[:q] = {} unless params[:q] + + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month + else + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month + end + + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]).end_of_day rescue "" + end + params[:q][:meta_sort] ||= "completed_at.desc" + + @search = Spree::Order.complete.search(params[:q]) + orders = @search.result + line_items = orders.map { |o| o.line_items }.flatten + + @distributors = Enterprise.is_distributor + @report_type = params[:report_type] + + case params[:report_type] + when "bulk_coop_supplier_report" + + header = ["Supplier", "Product", "Unit Size", "Variant", "Weight", "Sum Total", "Sum Max Total", "Units Required", "Remainder"] + + columns = [ proc { |lis| lis.first.variant.product.supplier.name }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| lis.first.variant.options_text }, + proc { |lis| lis.first.variant.weight || 0 }, + proc { |lis| lis.sum { |li| li.quantity } }, + proc { |lis| lis.sum { |li| li.max_quantity || 0 } }, + proc { |lis| "" }, + proc { |lis| "" } ] + + rules = [ { group_by: proc { |li| li.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |li| li.variant.product }, + sort_by: proc { |product| product.name }, + summary_columns: [ proc { |lis| lis.first.variant.product.supplier.name }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| "" }, + proc { |lis| "" }, + proc { |lis| lis.sum { |li| (li.quantity || 0) * (li.variant.weight || 0) } }, + proc { |lis| lis.sum { |li| (li.max_quantity || 0) * (li.variant.weight || 0) } }, + proc { |lis| ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor }, + proc { |lis| lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max) * (li.variant.weight || 0) } - ( ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor * (lis.first.variant.product.group_buy_unit_size || 0) ) } ] }, + { group_by: proc { |li| li.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + when "bulk_coop_allocation" + + header = ["Customer", "Product", "Unit Size", "Variant", "Weight", "Sum Total", "Sum Max Total", "Total Allocated", "Remainder"] + + columns = [ proc { |lis| lis.first.order.bill_address.firstname + " " + lis.first.order.bill_address.lastname }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| lis.first.variant.options_text }, + proc { |lis| lis.first.variant.weight || 0 }, + proc { |lis| lis.sum { |li| li.quantity } }, + proc { |lis| lis.sum { |li| li.max_quantity || 0 } }, + proc { |lis| "" }, + proc { |lis| "" } ] + + rules = [ { group_by: proc { |li| li.variant.product }, + sort_by: proc { |product| product.name }, + summary_columns: [ proc { |lis| lis.first.order.bill_address.firstname + " " + lis.first.order.bill_address.lastname }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| "" }, + proc { |lis| "" }, + proc { |lis| lis.sum { |li| li.quantity * (li.variant.weight || 0) } }, + proc { |lis| lis.sum { |li| (li.max_quantity || 0) * (li.variant.weight || 0) } }, + proc { |lis| ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor * (lis.first.variant.product.group_buy_unit_size || 0) }, + proc { |lis| lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } - ( ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor * (lis.first.variant.product.group_buy_unit_size || 0) ) } ] }, + { group_by: proc { |li| li.variant }, + sort_by: proc { |variant| variant.options_text } }, + { group_by: proc { |li| li.order }, + sort_by: proc { |order| order.to_s } } ] + + when "bulk_coop_packing_sheets" + + header = ["Customer", "Product", "Variant", "Sum Total"] + + columns = [ proc { |lis| lis.first.order.bill_address.firstname + " " + lis.first.order.bill_address.lastname }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.options_text }, + proc { |lis| lis.sum { |li| li.quantity } } ] + + rules = [ { group_by: proc { |li| li.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |li| li.variant }, + sort_by: proc { |variant| variant.options_text } }, + { group_by: proc { |li| li.order }, + sort_by: proc { |order| order.to_s } } ] + + when "bulk_coop_customer_payments" + + header = ["Customer", "Date of Order", "Total Cost", "Amount Owing", "Amount Paid"] + + columns = [ proc { |lis| lis.first.order.bill_address.firstname + " " + lis.first.order.bill_address.lastname }, + proc { |lis| lis.first.order.completed_at.to_s }, + proc { |lis| lis.map { |li| li.order }.uniq.sum { |o| o.total } }, + proc { |lis| lis.map { |li| li.order }.uniq.sum { |o| o.outstanding_balance } }, + proc { |lis| lis.map { |li| li.order }.uniq.sum { |o| o.payment_total } } ] + + rules = [ { group_by: proc { |li| li.order }, + sort_by: proc { |order| order.completed_at } } ] + + else # List all line items + + header = ["Supplier", "Product", "Unit Size", "Variant", "Weight", "Sum Total", "Sum Max Total", "Units Required", "Remainder"] + + columns = [ proc { |lis| lis.first.variant.product.supplier.name }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| lis.first.variant.options_text }, + proc { |lis| lis.first.variant.weight || 0 }, + proc { |lis| lis.sum { |li| li.quantity } }, + proc { |lis| lis.sum { |li| li.max_quantity || 0 } }, + proc { |lis| "" }, + proc { |lis| "" } ] + + rules = [ { group_by: proc { |li| li.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |li| li.variant.product }, + sort_by: proc { |product| product.name }, + summary_columns: [ proc { |lis| lis.first.variant.product.supplier.name }, + proc { |lis| lis.first.variant.product.name }, + proc { |lis| lis.first.variant.product.group_buy_unit_size || 0.0 }, + proc { |lis| "" }, + proc { |lis| "" }, + proc { |lis| lis.sum { |li| li.quantity * (li.variant.weight || 0) } }, + proc { |lis| lis.sum { |li| (li.max_quantity || 0) * (li.variant.weight || 0) } }, + proc { |lis| ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor }, + proc { |lis| lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } - ( ( (lis.first.variant.product.group_buy_unit_size || 0).zero? ? 0 : ( lis.sum { |li| ( [li.max_quantity || 0, li.quantity || 0].max ) * (li.variant.weight || 0) } / lis.first.variant.product.group_buy_unit_size ) ).floor * (lis.first.variant.product.group_buy_unit_size || 0) ) } ] }, + { group_by: proc { |li| li.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + end + + order_grouper = OpenFoodWeb::OrderGrouper.new rules, columns + + @header = header + @table = order_grouper.table(line_items) + csv_file_name = "bulk_coop.csv" + + render_report(@header, @table, params[:csv], csv_file_name) + end + + def payments + params[:q] = {} unless params[:q] + + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month + else + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month + end + + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]).end_of_day rescue "" + end + params[:q][:meta_sort] ||= "completed_at.desc" + + @search = Spree::Order.complete.search(params[:q]) + orders = @search.result + payments = orders.map { |o| o.payments.select { |payment| payment.completed? } }.flatten # Only select completed payments + + @distributors = Enterprise.is_distributor + @report_type = params[:report_type] + + case params[:report_type] + when "payments_by_payment_type" + table_items = payments + + header = ["Payment State", "Distributor", "Payment Type", "Total ($)"] + + columns = [ proc { |payments| payments.first.order.payment_state }, + proc { |payments| payments.first.order.distributor.name }, + proc { |payments| payments.first.payment_method.name }, + proc { |payments| payments.sum { |payment| payment.amount } } ] + + rules = [ { group_by: proc { |payment| payment.order.payment_state }, + sort_by: proc { |payment_state| payment_state } }, + { group_by: proc { |payment| payment.order.distributor }, + sort_by: proc { |distributor| distributor.name } }, + { group_by: proc { |payment| payment.payment_method }, + sort_by: proc { |method| method.name } } ] + + when "itemised_payment_totals" + table_items = orders + + header = ["Payment State", "Distributor", "Product Total ($)", "Shipping Total ($)", "Outstanding Balance ($)", "Total ($)"] + + columns = [ proc { |orders| orders.first.payment_state }, + proc { |orders| orders.first.distributor.name }, + proc { |orders| orders.sum { |o| o.item_total } }, + proc { |orders| orders.sum { |o| o.ship_total } }, + proc { |orders| orders.sum { |o| o.outstanding_balance } }, + proc { |orders| orders.sum { |o| o.total } } ] + + rules = [ { group_by: proc { |order| order.payment_state }, + sort_by: proc { |payment_state| payment_state } }, + { group_by: proc { |order| order.distributor }, + sort_by: proc { |distributor| distributor.name } } ] + + when "payment_totals" + table_items = orders + + header = ["Payment State", "Distributor", "Product Total ($)", "Shipping Total ($)", "Total ($)", "EFT ($)", "PayPal ($)", "Outstanding Balance ($)"] + + columns = [ proc { |orders| orders.first.payment_state }, + proc { |orders| orders.first.distributor.name }, + proc { |orders| orders.sum { |o| o.item_total } }, + proc { |orders| orders.sum { |o| o.ship_total } }, + proc { |orders| orders.sum { |o| o.total } }, + proc { |orders| orders.sum { |o| o.payments.select { |payment| payment.completed? && (payment.payment_method.name.to_s.include? "EFT") }.sum { |payment| payment.amount } } }, + proc { |orders| orders.sum { |o| o.payments.select { |payment| payment.completed? && (payment.payment_method.name.to_s.include? "PayPal") }.sum{ |payment| payment.amount } } }, + proc { |orders| orders.sum { |o| o.outstanding_balance } } ] + + rules = [ { group_by: proc { |order| order.payment_state }, + sort_by: proc { |payment_state| payment_state } }, + { group_by: proc { |order| order.distributor }, + sort_by: proc { |distributor| distributor.name } } ] + + else + table_items = payments + + header = ["Payment State", "Distributor", "Payment Type", "Total ($)"] + + columns = [ proc { |payments| payments.first.order.payment_state }, + proc { |payments| payments.first.order.distributor.name }, + proc { |payments| payments.first.payment_method.name }, + proc { |payments| payments.sum { |payment| payment.amount } } ] + + rules = [ { group_by: proc { |payment| payment.order.payment_state }, + sort_by: proc { |payment_state| payment_state } }, + { group_by: proc { |payment| payment.order.distributor }, + sort_by: proc { |distributor| distributor.name } }, + { group_by: proc { |payment| payment.payment_method }, + sort_by: proc { |method| method.name } } ] + + end + + order_grouper = OpenFoodWeb::OrderGrouper.new rules, columns + + @header = header + @table = order_grouper.table(table_items) + csv_file_name = "payments.csv" + + render_report(@header, @table, params[:csv], csv_file_name) + + end + + def order_cycles + params[:q] = {} unless params[:q] + + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month + else + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]).beginning_of_day rescue Time.zone.now.beginning_of_month + end + + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]).end_of_day rescue "" + end + params[:q][:meta_sort] ||= "completed_at.desc" + + @search = Spree::Order.complete.search(params[:q]) + orders = @search.result + line_items = orders.map { |o| o.line_items }.flatten + #payments = orders.map { |o| o.payments.select { |payment| payment.completed? } }.flatten # Only select completed payments + + @distributors = Enterprise.is_distributor + @report_type = params[:report_type] + + case params[:report_type] + when "order_cycle_supplier_totals" + table_items = line_items + @include_blank = 'All' + + header = ["Supplier", "Product", "Variant", "Amount", "Cost per Unit", "Total Cost", "Status", "Incoming Transport"] + + columns = [ proc { |line_items| line_items.first.variant.product.supplier.name }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.first.variant.price }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "" }, + proc { |line_items| "incoming transport" } ] + + rules = [ { group_by: proc { |line_item| line_item.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |line_item| line_item.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |line_item| line_item.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + when "order_cycle_supplier_totals_by_distributor" + table_items = line_items + @include_blank = 'All' + + header = ["Supplier", "Product", "Variant", "To Distributor", "Amount", "Cost per Unit", "Total Cost", "Shipping Method"] + + columns = [ proc { |line_items| line_items.first.variant.product.supplier.name }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| line_items.first.order.distributor.name }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.first.variant.price }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "shipping method" } ] + + rules = [ { group_by: proc { |line_item| line_item.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |line_item| line_item.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |line_item| line_item.variant }, + sort_by: proc { |variant| variant.options_text }, + summary_columns: [ proc { |line_items| line_items.first.variant.product.supplier.name }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| "TOTAL" }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.first.variant.price }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "" } ] }, + { group_by: proc { |line_item| line_item.order.distributor }, + sort_by: proc { |distributor| distributor.name } } ] + + when "order_cycle_distributor_totals_by_supplier" + table_items = line_items + @include_blank = 'All' + + header = ["Distributor", "Supplier", "Product", "Variant", "Amount", "Cost per Unit", "Total Cost", "Total Shipping Cost", "Shipping Method"] + + columns = [ proc { |line_items| line_items.first.order.distributor.name }, + proc { |line_items| line_items.first.variant.product.supplier.name }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.first.variant.price }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "" }, + proc { |line_items| "shipping method" } ] + + rules = [ { group_by: proc { |line_item| line_item.order.distributor }, + sort_by: proc { |distributor| distributor.name }, + summary_columns: [ proc { |line_items| line_items.first.order.distributor.name }, + proc { |line_items| "TOTAL" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| line_items.map { |li| li.order }.uniq.sum { |o| o.ship_total } }, + proc { |line_items| "" } ] }, + { group_by: proc { |line_item| line_item.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |line_item| line_item.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |line_item| line_item.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + when "order_cycle_customer_totals" + table_items = line_items + @include_blank = 'All' + + header = ["Distributor", "Customer", "Email", "Phone", "Product", "Variant", "Amount", "Item ($)", "Ship ($)", "Total ($)", "Paid?", "Packed?", "Shipped?"] + + columns = [ proc { |line_items| line_items.first.order.distributor.name }, + proc { |line_items| line_items.first.order.bill_address.firstname + " " + line_items.first.order.bill_address.lastname }, + proc { |line_items| line_items.first.order.email }, + proc { |line_items| line_items.first.order.bill_address.phone }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| "" } ] + + rules = [ { group_by: proc { |line_item| line_item.order.distributor }, + sort_by: proc { |distributor| distributor.name } }, + { group_by: proc { |line_item| line_item.order }, + sort_by: proc { |order| order.bill_address.lastname + " " + order.bill_address.firstname }, + summary_columns: [ proc { |line_items| line_items.first.order.distributor.name }, + proc { |line_items| line_items.first.order.bill_address.firstname + " " + line_items.first.order.bill_address.lastname }, + proc { |line_items| line_items.first.order.email }, + proc { |line_items| line_items.first.order.bill_address.phone }, + proc { |line_items| "TOTAL" }, + proc { |line_items| "" }, + proc { |line_items| "" }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| line_items.map { |li| li.order }.uniq.sum { |o| o.ship_total } }, + proc { |line_items| line_items.map { |li| li.order }.uniq.sum { |o| o.total } }, + proc { |line_items| line_items.map { |li| li.order.paid? }.all? { |paid| paid == true } ? "Yes" : "No" }, + proc { |line_items| "" }, + proc { |line_items| "" } ] }, + { group_by: proc { |line_item| line_item.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |line_item| line_item.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + else + table_items = line_items + @include_blank = 'All' + + header = ["Supplier", "Product", "Variant", "Amount", "Cost per Unit", "Total Cost", "Status", "Incoming Transport"] + + columns = [ proc { |line_items| line_items.first.variant.product.supplier.name }, + proc { |line_items| line_items.first.variant.product.name }, + proc { |line_items| line_items.first.variant.options_text }, + proc { |line_items| line_items.sum { |li| li.quantity } }, + proc { |line_items| line_items.first.variant.price }, + proc { |line_items| line_items.sum { |li| li.quantity * li.variant.price } }, + proc { |line_items| "" }, + proc { |line_items| "incoming transport" } ] + + rules = [ { group_by: proc { |line_item| line_item.variant.product.supplier }, + sort_by: proc { |supplier| supplier.name } }, + { group_by: proc { |line_item| line_item.variant.product }, + sort_by: proc { |product| product.name } }, + { group_by: proc { |line_item| line_item.variant }, + sort_by: proc { |variant| variant.options_text } } ] + + end + + order_grouper = OpenFoodWeb::OrderGrouper.new rules, columns + + @header = header + @table = order_grouper.table(table_items) + csv_file_name = "order_cycles.csv" + + render_report(@header, @table, params[:csv], csv_file_name) + + end + + def render_report (header, table, create_csv, csv_file_name) + unless create_csv + render :html => table + else + csv_string = CSV.generate do |csv| + csv << header + table.each { |row| csv << row } + end + send_data csv_string, :filename => csv_file_name + end + end end diff --git a/app/controllers/spree/home_controller_decorator.rb b/app/controllers/spree/home_controller_decorator.rb index f82db2ff50..7eb3e3e351 100644 --- a/app/controllers/spree/home_controller_decorator.rb +++ b/app/controllers/spree/home_controller_decorator.rb @@ -1,7 +1,7 @@ require 'open_food_web/split_products_by_distributor' Spree::HomeController.class_eval do - include DistributorsHelper + include EnterprisesHelper include OpenFoodWeb::SplitProductsByDistributor respond_override :index => { :html => { :success => lambda { diff --git a/app/controllers/spree/orders_controller_decorator.rb b/app/controllers/spree/orders_controller_decorator.rb index 6b9a708d1c..90b851fbaf 100644 --- a/app/controllers/spree/orders_controller_decorator.rb +++ b/app/controllers/spree/orders_controller_decorator.rb @@ -3,7 +3,7 @@ Spree::OrdersController.class_eval do after_filter :populate_variant_attributes, :only => :populate def populate_order_distributor - @distributor = params[:distributor_id].present? ? Distributor.find(params[:distributor_id]) : nil + @distributor = params[:distributor_id].present? ? Enterprise.is_distributor.find(params[:distributor_id]) : nil if populate_valid? @distributor order = current_order(true) diff --git a/app/controllers/spree/products_controller_decorator.rb b/app/controllers/spree/products_controller_decorator.rb index 17d134c2d9..913b7f4dee 100644 --- a/app/controllers/spree/products_controller_decorator.rb +++ b/app/controllers/spree/products_controller_decorator.rb @@ -1,7 +1,7 @@ require 'open_food_web/split_products_by_distributor' Spree::ProductsController.class_eval do - include DistributorsHelper + include EnterprisesHelper include OpenFoodWeb::SplitProductsByDistributor respond_override :index => { :html => { :success => lambda { diff --git a/app/controllers/spree/taxons_controller_decorator.rb b/app/controllers/spree/taxons_controller_decorator.rb index 0fb7517995..1d0fe7a7a5 100644 --- a/app/controllers/spree/taxons_controller_decorator.rb +++ b/app/controllers/spree/taxons_controller_decorator.rb @@ -1,7 +1,7 @@ require 'open_food_web/split_products_by_distributor' Spree::TaxonsController.class_eval do - include DistributorsHelper + include EnterprisesHelper include OpenFoodWeb::SplitProductsByDistributor respond_override :show => { :html => { :success => lambda { diff --git a/app/controllers/suppliers_controller.rb b/app/controllers/suppliers_controller.rb deleted file mode 100644 index 3b76225449..0000000000 --- a/app/controllers/suppliers_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -class SuppliersController < BaseController - def index - @suppliers = Supplier.all - end - - def show - options = {:supplier_id => params[:id]} - options.merge(params.reject { |k,v| k == :id }) - - @supplier = Supplier.find params[:id] - - @searcher = Spree::Config.searcher_class.new(options) - @products = @searcher.retrieve_products - end -end diff --git a/app/helpers/distributors_helper.rb b/app/helpers/enterprises_helper.rb similarity index 80% rename from app/helpers/distributors_helper.rb rename to app/helpers/enterprises_helper.rb index c641807e99..fb8a9a13bc 100644 --- a/app/helpers/distributors_helper.rb +++ b/app/helpers/enterprises_helper.rb @@ -1,4 +1,4 @@ -module DistributorsHelper +module EnterprisesHelper def current_distributor @current_distributor ||= current_order(false).andand.distributor end diff --git a/app/models/distributor.rb b/app/models/distributor.rb deleted file mode 100644 index 1bc2d274c5..0000000000 --- a/app/models/distributor.rb +++ /dev/null @@ -1,31 +0,0 @@ -class Distributor < ActiveRecord::Base - belongs_to :pickup_address, :foreign_key => 'pickup_address_id', :class_name => 'Spree::Address' - has_many :orders, :class_name => 'Spree::Order' - - has_many :product_distributions, :dependent => :destroy - has_many :products, :through => :product_distributions - - accepts_nested_attributes_for :pickup_address - - validates_presence_of :name, :pickup_address - validates_associated :pickup_address - - scope :by_name, order('name') - scope :with_active_products_on_hand, lambda { joins(:products).where('spree_products.deleted_at IS NULL AND spree_products.available_on <= ? AND spree_products.count_on_hand > 0', Time.now).select('distinct(distributors.*)') } - - after_initialize :initialize_country - before_validation :set_unused_address_fields - - def initialize_country - self.pickup_address ||= Spree::Address.new - self.pickup_address.country = Spree::Country.find_by_id(Spree::Config[:default_country_id]) if self.pickup_address.new_record? - end - - def set_unused_address_fields - pickup_address.firstname = pickup_address.lastname = pickup_address.phone = 'unused' if pickup_address.present? - end - - def to_param - "#{id}-#{name.parameterize}" - end -end diff --git a/app/models/enterprise.rb b/app/models/enterprise.rb new file mode 100644 index 0000000000..d4679f6424 --- /dev/null +++ b/app/models/enterprise.rb @@ -0,0 +1,42 @@ +class Enterprise < ActiveRecord::Base + has_many :supplied_products, :class_name => 'Spree::Product', :foreign_key => 'supplier_id' + has_many :distributed_orders, :class_name => 'Spree::Order', :foreign_key => 'distributor_id' + belongs_to :address, :class_name => 'Spree::Address' + has_many :product_distributions, :foreign_key => 'distributor_id', :dependent => :destroy + has_many :distributed_products, :through => :product_distributions, :source => :product + + accepts_nested_attributes_for :address + + validates_presence_of :name + validates_presence_of :address + validates_associated :address + + after_initialize :initialize_country + before_validation :set_unused_address_fields + + scope :by_name, order('name') + scope :is_primary_producer, where(:is_primary_producer => true) + scope :is_distributor, where(:is_distributor => true) + scope :with_distributed_active_products_on_hand, lambda { joins(:distributed_products).where('spree_products.deleted_at IS NULL AND spree_products.available_on <= ? AND spree_products.count_on_hand > 0', Time.now).select('distinct(enterprises.*)') } + + + def has_supplied_products_on_hand? + self.supplied_products.where('count_on_hand > 0').present? + end + + def to_param + "#{id}-#{name.parameterize}" + end + + + private + + def initialize_country + self.address ||= Spree::Address.new + self.address.country = Spree::Country.find_by_id(Spree::Config[:default_country_id]) if self.address.new_record? + end + + def set_unused_address_fields + address.firstname = address.lastname = address.phone = 'unused' if address.present? + end +end diff --git a/app/models/distributor_set.rb b/app/models/enterprise_set.rb similarity index 55% rename from app/models/distributor_set.rb rename to app/models/enterprise_set.rb index 04fbd02db4..b741167dfe 100644 --- a/app/models/distributor_set.rb +++ b/app/models/enterprise_set.rb @@ -1,30 +1,30 @@ -# Tableless model to handle updating multiple distributors at once from a +# Tableless model to handle updating multiple enterprises at once from a # single form. Used to update next_collection_at field for all distributors in # admin backend. -class DistributorSet +class EnterpriseSet include ActiveModel::Conversion extend ActiveModel::Naming - attr_accessor :distributors + attr_accessor :enterprises def initialize(attributes={}) - @distributors = Distributor.all + @enterprises = Enterprise.all attributes.each do |name, value| send("#{name}=", value) end end - def distributors_attributes=(attributes) + def enterprises_attributes=(attributes) attributes.each do |k, attributes| # attributes == {:id => 123, :next_collection_at => '...'} - d = @distributors.detect { |d| d.id.to_s == attributes[:id].to_s } - d.assign_attributes(attributes.except(:id)) + e = @enterprises.detect { |e| e.id.to_s == attributes[:id].to_s } + e.assign_attributes(attributes.except(:id)) end end def save - distributors.all?(&:save) + enterprises.all?(&:save) end def persisted? diff --git a/app/models/product_distribution.rb b/app/models/product_distribution.rb index 19305c2685..026322afd6 100644 --- a/app/models/product_distribution.rb +++ b/app/models/product_distribution.rb @@ -1,6 +1,6 @@ class ProductDistribution < ActiveRecord::Base belongs_to :product, :class_name => 'Spree::Product' - belongs_to :distributor + belongs_to :distributor, :class_name => 'Enterprise' belongs_to :shipping_method, :class_name => 'Spree::ShippingMethod' validates_presence_of :product_id, :on => :update diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 4cfbd1ddcb..449640a4b6 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -1,5 +1,5 @@ Spree::Order.class_eval do - belongs_to :distributor + belongs_to :distributor, :class_name => 'Enterprise' before_validation :shipping_address_from_distributor after_create :set_default_shipping_method @@ -57,7 +57,7 @@ Spree::Order.class_eval do def shipping_address_from_distributor if distributor - self.ship_address = distributor.pickup_address.clone + self.ship_address = distributor.address.clone if bill_address self.ship_address.firstname = bill_address.firstname diff --git a/app/models/spree/product_decorator.rb b/app/models/spree/product_decorator.rb index 91ed6e57ee..cd809d880e 100644 --- a/app/models/spree/product_decorator.rb +++ b/app/models/spree/product_decorator.rb @@ -1,5 +1,5 @@ Spree::Product.class_eval do - belongs_to :supplier + belongs_to :supplier, :class_name => 'Enterprise' has_many :product_distributions, :dependent => :destroy has_many :distributors, :through => :product_distributions @@ -12,6 +12,11 @@ Spree::Product.class_eval do scope :in_supplier, lambda { |supplier| where(:supplier_id => supplier) } scope :in_distributor, lambda { |distributor| joins(:product_distributions).where('product_distributions.distributor_id = ?', (distributor.respond_to?(:id) ? distributor.id : distributor.to_i)) } + scope :in_supplier_or_distributor, lambda { |enterprise| select('distinct spree_products.*'). + joins('LEFT OUTER JOIN product_distributions ON product_distributions.product_id=spree_products.id'). + where('supplier_id=? OR product_distributions.distributor_id=?', + enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i, + enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i) } def shipping_method_for_distributor(distributor) @@ -23,7 +28,7 @@ Spree::Product.class_eval do # Build a product distribution for each distributor def build_product_distributions - Distributor.all.each do |distributor| + Enterprise.is_distributor.each do |distributor| unless self.product_distributions.find_by_distributor_id distributor.id self.product_distributions.build(:distributor => distributor) end diff --git a/app/models/supplier.rb b/app/models/supplier.rb deleted file mode 100644 index 76518a5f34..0000000000 --- a/app/models/supplier.rb +++ /dev/null @@ -1,33 +0,0 @@ -class Supplier < ActiveRecord::Base - has_many :products, :class_name => 'Spree::Product' - belongs_to :address, :class_name => 'Spree::Address' - - accepts_nested_attributes_for :address - - validates_presence_of :name, :address - validates_associated :address - - after_initialize :initialize_country - before_validation :set_unused_address_fields - - def has_products_on_hand? - self.products.where('count_on_hand > 0').present? - end - - def to_param - "#{id}-#{name.parameterize}" - end - - - private - - def initialize_country - self.address ||= Spree::Address.new - self.address.country = Spree::Country.find_by_id(Spree::Config[:default_country_id]) if self.address.new_record? - end - - def set_unused_address_fields - address.firstname = address.lastname = address.phone = 'unused' if address.present? - end - -end diff --git a/app/overrides/add_distributor_details_to_product.rb b/app/overrides/add_distributor_details_to_product.rb new file mode 100644 index 0000000000..d841c82ee3 --- /dev/null +++ b/app/overrides/add_distributor_details_to_product.rb @@ -0,0 +1,9 @@ +Deface::Override.new(:virtual_path => "spree/products/show", + :insert_before => "[data-hook='cart_form']", + :partial => "spree/products/distributor_details", + :name => "product_distributor_details") + +Deface::Override.new(:virtual_path => "spree/products/show", + :insert_after => "[data-hook='product_show']", + :text => "<%= javascript_include_tag main_app.distributors_enterprises_path(:format => :js) %>", + :name => "product_distributor_details_js") diff --git a/app/overrides/distributors_admin_tab.rb b/app/overrides/distributors_admin_tab.rb deleted file mode 100644 index b0b71bfcea..0000000000 --- a/app/overrides/distributors_admin_tab.rb +++ /dev/null @@ -1,11 +0,0 @@ -Deface::Override.new(:virtual_path => "spree/layouts/admin", - :name => "distributors_admin_tabs", - :insert_bottom => "[data-hook='admin_tabs'], #admin_tabs[data-hook]", - :text => "<%= tab(:distributors, :url => main_app.admin_distributors_path) %>", - :disabled => false) - -Deface::Override.new(:virtual_path => "spree/layouts/admin", - :name => "suppliers_admin_tabs", - :insert_bottom => "[data-hook='admin_tabs'], #admin_tabs[data-hook]", - :text => "<%= tab(:suppliers, :url => main_app.admin_suppliers_path) %>", - :disabled => false) diff --git a/app/overrides/enterprises_admin_tab.rb b/app/overrides/enterprises_admin_tab.rb new file mode 100644 index 0000000000..254f9d7d25 --- /dev/null +++ b/app/overrides/enterprises_admin_tab.rb @@ -0,0 +1,4 @@ +Deface::Override.new(:virtual_path => "spree/layouts/admin", + :name => "enterprises_admin_tabs", + :insert_bottom => "[data-hook='admin_tabs'], #admin_tabs[data-hook]", + :text => "<%= tab(:enterprises, :url => main_app.admin_enterprises_path) %>") diff --git a/app/views/admin/distributors/index.html.erb b/app/views/admin/distributors/index.html.erb deleted file mode 100644 index 6259efa15c..0000000000 --- a/app/views/admin/distributors/index.html.erb +++ /dev/null @@ -1,40 +0,0 @@ -
- -<%= form_for @distributor_set, :url => main_app.bulk_update_admin_distributors_path do |f| %> -| Name | -Next Collection Date/Time | -Description | -- |
|---|---|---|---|
| <%= link_to distributor.name, main_app.admin_distributor_path(distributor) %> | -<%= distributor_form.text_field :next_collection_at %> | -<%= distributor.description %> | -- <%= link_to_edit [main_app, distributor], :class => 'edit' %> - <%= link_to_delete [main_app, distributor] %> - | -
| <%= t(:none) %> | |||
| Name | +Role | +Next Collection Date/Time | +Description | ++ |
|---|---|---|---|---|
| <%= link_to enterprise.name, main_app.admin_enterprise_path(enterprise) %> | +<%= 'PP ' if enterprise.is_primary_producer %><%= 'D' if enterprise.is_distributor %> | +<%= enterprise_form.text_field :next_collection_at %> | +<%= enterprise.description %> | ++ <%= link_to_edit enterprise, :class => 'edit' %> + <%= link_to_delete enterprise %> + | +
| <%= t(:none) %> | ||||
Hello, world!
This is a paragraph.
' - email 'supplier@example.com' + email 'enterprise@example.com' address { Spree::Address.first || FactoryGirl.create(:address) } end - factory :distributor, :class => Distributor do - sequence(:name) { |n| "Distributor #{n}" } - contact 'Mr Turing' - phone '1000100100' - description 'The creator' - long_description 'Hello, world!
This is a paragraph.
' - email 'alan@somewhere.com' - url 'http://example.com' - pickup_times "Whenever you're free" - next_collection_at 'Thursday 10am' - pickup_address { Spree::Address.first || FactoryGirl.create(:address) } + factory :supplier_enterprise, :parent => :enterprise do + is_primary_producer true + is_distributor false + end + + factory :distributor_enterprise, :parent => :enterprise do + is_primary_producer false + is_distributor true end factory :product_distribution, :class => ProductDistribution do product { |pd| Spree::Product.first || FactoryGirl.create(:product) } - distributor { |pd| Distributor.first || FactoryGirl.create(:distributor) } + distributor { |pd| Enterprise.is_distributor.first || FactoryGirl.create(:distributor_enterprise) } shipping_method { |pd| Spree::ShippingMethod.where("name != 'Delivery'").first || FactoryGirl.create(:shipping_method) } end @@ -46,7 +43,7 @@ FactoryGirl.modify do # When this fix has been merged into a version of Spree that we're using, this line can be removed. sequence(:name) { |n| "Product ##{n} - #{Kernel.rand(9999)}" } - supplier { Supplier.first || FactoryGirl.create(:supplier) } + supplier { Enterprise.is_primary_producer.first || FactoryGirl.create(:supplier_enterprise) } on_hand 3 # before(:create) do |product, evaluator| diff --git a/spec/lib/open_food_web/group_buy_report_spec.rb b/spec/lib/open_food_web/group_buy_report_spec.rb index c3ed851d55..ec23cab070 100644 --- a/spec/lib/open_food_web/group_buy_report_spec.rb +++ b/spec/lib/open_food_web/group_buy_report_spec.rb @@ -7,9 +7,9 @@ module OpenFoodWeb @orders = [] bill_address = create(:address) distributor_address = create(:address, :address1 => "distributor address", :city => 'The Shire', :zipcode => "1234") - distributor = create(:distributor, :pickup_address => distributor_address) + distributor = create(:distributor_enterprise, :address => distributor_address) - @supplier1 = create(:supplier) + @supplier1 = create(:supplier_enterprise) @variant1 = create(:variant) @variant1.product.supplier = @supplier1 @variant1.product.save! @@ -35,8 +35,8 @@ module OpenFoodWeb order2.line_items << line_item22 @orders << order2 - @supplier2 = create(:supplier) - @variant3 = create(:variant) + @supplier2 = create(:supplier_enterprise) + @variant3 = create(:variant, :weight => nil) @variant3.product.supplier = @supplier2 @variant3.product.save! product_distribution = create(:product_distribution, :product => @variant3.product, :distributor => distributor, :shipping_method => create(:shipping_method)) @@ -82,16 +82,16 @@ module OpenFoodWeb table_row_objects = subject.variants_and_quantities - variant_rows = table_row_objects.select{ |r| r.class == OpenFoodWeb::GroupBuyVariantRow } - product_rows = table_row_objects.select{ |r| r.class == OpenFoodWeb::GroupBuyProductRow } + variant_rows = table_row_objects.select { |r| r.class == OpenFoodWeb::GroupBuyVariantRow } + product_rows = table_row_objects.select { |r| r.class == OpenFoodWeb::GroupBuyProductRow } supplier_groups = variant_rows.group_by { |r| r.variant.product.supplier } - variant_groups = variant_rows.group_by{ |r| r.variant } - product_groups = product_rows.group_by{ |r| r.product } + variant_groups = variant_rows.group_by { |r| r.variant } + product_groups = product_rows.group_by { |r| r.product } supplier_groups.length.should == 2 variant_groups.length.should == 3 product_groups.length.should == 3 end end -end \ No newline at end of file +end diff --git a/spec/lib/open_food_web/order_and_distributor_report_spec.rb b/spec/lib/open_food_web/order_and_distributor_report_spec.rb index 26a04a8cae..8081319391 100644 --- a/spec/lib/open_food_web/order_and_distributor_report_spec.rb +++ b/spec/lib/open_food_web/order_and_distributor_report_spec.rb @@ -9,7 +9,7 @@ module OpenFoodWeb before(:each) do @bill_address = create(:address) @distributor_address = create(:address, :address1 => "distributor address", :city => 'The Shire', :zipcode => "1234") - @distributor = create(:distributor, :pickup_address => @distributor_address) + @distributor = create(:distributor_enterprise, :address => @distributor_address) product = create(:product) product_distribution = create(:product_distribution, :product => product, :distributor => @distributor, :shipping_method => create(:shipping_method)) @shipping_instructions = "pick up on thursday please!" @@ -41,7 +41,7 @@ module OpenFoodWeb @bill_address.full_name, @order.email, @bill_address.phone, @bill_address.city, @line_item.product.sku, @line_item.product.name, @line_item.variant.options_text, @line_item.quantity, @line_item.max_quantity, @line_item.price * @line_item.quantity, @line_item.itemwise_shipping_cost, @payment_method.name, - @distributor.name, @distributor.pickup_address.address1, @distributor.pickup_address.city, @distributor.pickup_address.zipcode, @shipping_instructions ] + @distributor.name, @distributor.address.address1, @distributor.address.city, @distributor.address.zipcode, @shipping_instructions ] end end end diff --git a/spec/lib/open_food_web/order_grouper_spec.rb b/spec/lib/open_food_web/order_grouper_spec.rb new file mode 100644 index 0000000000..d734b78c7b --- /dev/null +++ b/spec/lib/open_food_web/order_grouper_spec.rb @@ -0,0 +1,152 @@ +require 'spec_helper' + +module OpenFoodWeb + describe OrderGrouper do + + before(:each) do + @items = [1, 2, 3, 4] + end + + context "constructing the table" do + it "should build a tree then build a table" do + rules = [ { group_by: Proc.new { |sentence| sentence.paragraph.chapter }, sort_by: Proc.new { |chapter| chapter.name }, summary_columns: [Proc.new { |is| is.first.paragraph.chapter.name }, Proc.new { |is| "TOTAL" }, Proc.new { |is| "" }, Proc.new { |is| is.sum {|i| i.property1 } } ] }, + { group_by: Proc.new { |sentence| sentence.paragraph }, sort_by: Proc.new { |paragraph| paragraph.name } } ] + columns = [Proc.new { |is| is.first.paragraph.chapter.name }, Proc.new { |is| is.first.paragraph.name }, Proc.new { |is| is.first.name }, Proc.new { |is| is.sum {|i| i.property1 } }] + + subject = OrderGrouper.new rules, columns + + tree = double(:tree) + subject.should_receive(:build_tree).with(@items, rules).and_return(tree) + subject.should_receive(:build_table).with(tree) + + subject.table(@items) + end + + end + + context "grouping items without rules" do + it "returns the original array when no rules are provided" do + rules = [] + column1 = double(:col1) + column2 = double(:col2) + columns = [column1, column2] + subject = OrderGrouper.new rules, columns + + rules.should_receive(:clone).and_return(rules) + subject.build_tree(@items, rules).should == @items + end + end + + context "grouping items with rules" do + + before(:each) do + @rule1 = double(:rule1) + rule2 = double(:rule2) + @rules = [@rule1, rule2] + @remaining_rules = [rule2] + column1 = double(:col1) + column2 = double(:col2) + @columns = [column1, column2] + end + + it "builds branches by removing a rule from 'rules' and running group_and_sort" do + subject = OrderGrouper.new @rules, @columns + + @rules.should_receive(:clone).and_return(@rules) + @rules.should_receive(:delete_at).with(0) + grouped_tree = double(:grouped_tree) + subject.should_receive(:group_and_sort).and_return(grouped_tree) + + subject.build_tree(@items, @rules).should == grouped_tree + end + + it "separates the first rule from rules before sending to group_and_sort" do + subject = OrderGrouper.new @rules, @columns + + grouped_tree = double(:grouped_tree) + subject.should_receive(:group_and_sort).with(@rule1, @rules[1..-1], @items).and_return(grouped_tree) + + subject.build_tree(@items, @rules).should == grouped_tree + end + + it "should group, then sort, send each group to build_tree, and return a branch" do + summary_columns_object = double(:summary_columns) + @rule1.stub(:[]).with(:summary_columns) { summary_columns_object } + + subject = OrderGrouper.new @rules, @columns + + number_of_categories = 3 + groups = double(:groups) + @items.should_receive(:group_by).and_return(groups) + sorted_groups = {} + 1.upto(number_of_categories) { |i| sorted_groups[i] = double(:group, name: "Group "+ i.to_s ) } + groups.should_receive(:sort_by).and_return(sorted_groups) + group = { group1: 1, group2: 2, group3: 3 } + subject.should_receive(:build_tree).exactly(number_of_categories).times.and_return(group) + + group_tree = {} + 1.upto(number_of_categories) { |i| group_tree[i] = group } + 1.upto(number_of_categories) { |i| group_tree[i][:summary_row] = summary_columns_object } + subject.group_and_sort(@rule1, @remaining_rules, @items).should == group_tree + end + end + + context "building the table Array" do + before(:each) do + rule1 = double(:rule1) + rule2 = double(:rule2) + @rules = [rule1, rule2] + @column1 = double(:col1, :call => "Column1") + @column2 = double(:col2, :call => "Column2") + @columns = [@column1, @column2] + + sumcol1 = double(:sumcol1, :call => "SumColumn1") + sumcol2 = double(:sumcol2, :call => "SumColumn2") + @sumcols = [sumcol1, sumcol2] + + item1 = double(:item1) + item2 = double(:item2) + item3 = double(:item3) + @items1 = [item1, item2] + @items2 = [item2, item3] + @items3 = [item3, item1] + end + it "should return columns when given an Array" do + subject = OrderGrouper.new @rules, @columns + + @column1.should_receive(:call) + @column2.should_receive(:call) + + subject.build_table(@items1).should == [["Column1", "Column2"]] + end + + it "should return a row for each key-value pair when given a Hash" do + groups = { items1: @items1, items2: @items2, items3: @items3 } + + subject = OrderGrouper.new @rules, @columns + + #subject.should_receive(:build_table).exactly(2).times + + expected_return = [] + groups.length.times { expected_return << ["Column1", "Column2"] } + subject.build_table(groups).should == expected_return + end + + it "should return an extra row when a :summary_row key appears in a given Hash" do + groups = { items1: @items1, items2: @items2, items3: @items3, summary_row: { items: { items2: @items2, items3: @items3 }, columns: @sumcols } } + + subject = OrderGrouper.new @rules, @columns + + expected_return = [] + groups.each do |key, group| + if key == :summary_row + expected_return << ["SumColumn1", "SumColumn2"] + else + expected_return << ["Column1", "Column2"] + end + end + subject.build_table(groups).should == expected_return + end + end + end +end \ No newline at end of file diff --git a/spec/lib/open_food_web/searcher_spec.rb b/spec/lib/open_food_web/searcher_spec.rb index 0dc3ec7477..5c18b51f15 100644 --- a/spec/lib/open_food_web/searcher_spec.rb +++ b/spec/lib/open_food_web/searcher_spec.rb @@ -5,8 +5,8 @@ module OpenFoodWeb describe Searcher do it "searches by supplier" do # Given products under two suppliers - s1 = create(:supplier) - s2 = create(:supplier) + s1 = create(:supplier_enterprise) + s2 = create(:supplier_enterprise) p1 = create(:product, :supplier => s1) p2 = create(:product, :supplier => s2) @@ -18,8 +18,8 @@ module OpenFoodWeb it "searches by distributor" do # Given products under two distributors - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p1 = create(:product, :distributors => [d1]) p2 = create(:product, :distributors => [d2]) @@ -28,5 +28,25 @@ module OpenFoodWeb products = searcher.retrieve_products products.should == [p1] end + + it "searches by supplier or distributor" do + # Given products under some suppliers and distributors + s0 = create(:supplier_enterprise) + s1 = create(:supplier_enterprise) + d1 = create(:distributor_enterprise) + p1 = create(:product, :supplier => s1) + p2 = create(:product, :distributors => [d1]) + p3 = create(:product) + + # When we search by the supplier enterprise, we should see the supplied products + searcher = Searcher.new(:enterprise_id => s1.id.to_s) + products = searcher.retrieve_products + products.should == [p1] + + # When we search by the distributor enterprise, we should see the distributed products + searcher = Searcher.new(:enterprise_id => d1.id.to_s) + products = searcher.retrieve_products + products.should == [p2] + end end end diff --git a/spec/lib/open_food_web/split_products_by_distributor_spec.rb b/spec/lib/open_food_web/split_products_by_distributor_spec.rb index 4924ac1061..b4a7a7b145 100644 --- a/spec/lib/open_food_web/split_products_by_distributor_spec.rb +++ b/spec/lib/open_food_web/split_products_by_distributor_spec.rb @@ -16,8 +16,8 @@ describe OpenFoodWeb::SplitProductsByDistributor do end it "splits products when a distributor is selected" do - d1 = build(:distributor) - d2 = build(:distributor) + d1 = build(:distributor_enterprise) + d2 = build(:distributor_enterprise) orig_products = [build(:product, :distributors => [d1]), build(:product, :distributors => [d2])] diff --git a/spec/lib/spree/product_filters_spec.rb b/spec/lib/spree/product_filters_spec.rb index eb879cfe11..5335683423 100644 --- a/spec/lib/spree/product_filters_spec.rb +++ b/spec/lib/spree/product_filters_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Spree::ProductFilters do context "distributor filter" do it "provides filtering for all distributors" do - 3.times { create(:distributor) } - Spree::ProductFilters.distributor_filter[:labels].should == Distributor.all.map { |d| [d.name, d.name] } + 3.times { create(:distributor_enterprise) } + Spree::ProductFilters.distributor_filter[:labels].should == Enterprise.is_distributor.map { |d| [d.name, d.name] } end end end diff --git a/spec/models/distributors_spec.rb b/spec/models/distributors_spec.rb deleted file mode 100644 index 64fa93b585..0000000000 --- a/spec/models/distributors_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'spec_helper' - -module Spree - describe Distributor do - - describe "associations" do - it { should belong_to(:pickup_address) } - it { should have_many(:product_distributions) } - it { should have_many(:orders) } - end - - describe "validations" do - it { should validate_presence_of(:name) } - end - - it "should default country to system country" do - distributor = Distributor.new - distributor.pickup_address.country.should == Country.find_by_id(Config[:default_country_id]) - end - - describe "scopes" do - it "returns distributors with products in stock" do - d1 = create(:distributor) - d2 = create(:distributor) - d3 = create(:distributor) - d4 = create(:distributor) - create(:product, :distributors => [d1, d2], :on_hand => 5) - create(:product, :distributors => [d1], :on_hand => 5) - create(:product, :distributors => [d3], :on_hand => 0) - - Distributor.with_active_products_on_hand.sort.should == [d1, d2] - end - end - - end -end diff --git a/spec/models/enterprises_spec.rb b/spec/models/enterprises_spec.rb new file mode 100644 index 0000000000..051533144e --- /dev/null +++ b/spec/models/enterprises_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe Enterprise do + + describe "associations" do + it { should have_many(:supplied_products) } + it { should have_many(:distributed_orders) } + it { should belong_to(:address) } + it { should have_many(:product_distributions) } + end + + describe "validations" do + it { should validate_presence_of(:name) } + end + + it "should default address country to system country" do + subject.address.country.should == Spree::Country.find_by_id(Spree::Config[:default_country_id]) + end + + describe "scopes" do + it "returns distributors with products in stock" do + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) + d3 = create(:distributor_enterprise) + d4 = create(:distributor_enterprise) + create(:product, :distributors => [d1, d2], :on_hand => 5) + create(:product, :distributors => [d1], :on_hand => 5) + create(:product, :distributors => [d3], :on_hand => 0) + + Enterprise.with_distributed_active_products_on_hand.sort.should == [d1, d2] + end + end + + context "has_supplied_products_on_hand?" do + before :each do + @supplier = create(:supplier_enterprise) + end + + it "returns false when no products" do + @supplier.should_not have_supplied_products_on_hand + end + + it "returns false when the product is out of stock" do + create(:product, :supplier => @supplier, :on_hand => 0) + @supplier.should_not have_supplied_products_on_hand + end + + it "returns true when the product is in stock" do + create(:product, :supplier => @supplier, :on_hand => 1) + @supplier.should have_supplied_products_on_hand + end + end +end diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index aaa3d70c36..335c67a574 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -15,7 +15,7 @@ describe Spree::Order do end it "reveals permission for changing distributor" do - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d]) subject.distributor = d @@ -27,7 +27,7 @@ describe Spree::Order do end it "raises an exception if distributor is changed without permission" do - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d]) subject.distributor = d subject.save! @@ -41,8 +41,8 @@ describe Spree::Order do end it "reveals permission for adding products to the cart" do - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p_first = create(:product, :distributors => [d1]) p_subsequent_same_dist = create(:product, :distributors => [d1]) @@ -67,7 +67,7 @@ describe Spree::Order do end it "sets attributes on line items for variants" do - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d]) subject.distributor = d diff --git a/spec/models/product_distribution_spec.rb b/spec/models/product_distribution_spec.rb index bcfd131dea..51b5b9a8a2 100644 --- a/spec/models/product_distribution_spec.rb +++ b/spec/models/product_distribution_spec.rb @@ -6,7 +6,7 @@ describe ProductDistribution do pd1.should be_valid new_product = create(:product) - new_distributor = create(:distributor) + new_distributor = create(:distributor_enterprise) pd2 = build(:product_distribution, :product => pd1.product, :distributor => pd1.distributor) pd2.should_not be_valid diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index b78a08c6f0..ef777ef5c7 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -19,17 +19,60 @@ describe Spree::Product do end end - context "finders" do + describe "scopes" do + describe "in_supplier_or_distributor" do + it "finds supplied products" do + s0 = create(:supplier_enterprise) + s1 = create(:supplier_enterprise) + p0 = create(:product, :supplier => s0) + p1 = create(:product, :supplier => s1) + + Spree::Product.in_supplier_or_distributor(s1).should == [p1] + end + + it "finds distributed products" do + d0 = create(:distributor_enterprise) + d1 = create(:distributor_enterprise) + p0 = create(:product, :distributors => [d0]) + p1 = create(:product, :distributors => [d1]) + + Spree::Product.in_supplier_or_distributor(d1).should == [p1] + end + + it "finds products supplied and distributed by the same enterprise" do + s = create(:supplier_enterprise) + d = create(:distributor_enterprise) + p = create(:product, :supplier => s, :distributors => [d]) + + Spree::Product.in_supplier_or_distributor(s).should == [p] + Spree::Product.in_supplier_or_distributor(d).should == [p] + end + + it "shows each product once when it is distributed by many distributors" do + s = create(:supplier_enterprise) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) + d3 = create(:distributor_enterprise) + p = create(:product, :supplier => s, :distributors => [d1, d2, d3]) + + [s, d1, d2, d3].each do |enterprise| + Spree::Product.in_supplier_or_distributor(enterprise).should == [p] + end + end + end + end + + describe "finders" do it "finds the shipping method for a particular distributor" do shipping_method = create(:shipping_method) - distributor = create(:distributor) + distributor = create(:distributor_enterprise) product = create(:product) product_distribution = create(:product_distribution, :product => product, :distributor => distributor, :shipping_method => shipping_method) product.shipping_method_for_distributor(distributor).should == shipping_method end it "raises an error if distributor is not found" do - distributor = create(:distributor) + distributor = create(:distributor_enterprise) product = create(:product) expect do product.shipping_method_for_distributor(distributor) diff --git a/spec/models/suppliers_spec.rb b/spec/models/suppliers_spec.rb deleted file mode 100644 index 7ddc4f8cab..0000000000 --- a/spec/models/suppliers_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper' - -module Spree - describe Supplier do - - describe "associations" do - it { should have_many(:products) } - it { should belong_to(:address) } - end - - describe "validations" do - it { should validate_presence_of(:name) } - end - - it "should default country to system country" do - subject.address.country.should == Country.find_by_id(Config[:default_country_id]) - end - - context "has_products_on_hand?" do - before :each do - @supplier = create(:supplier) - end - - it "returns false when no products" do - @supplier.should_not have_products_on_hand - end - - it "returns false when the product is out of stock" do - create(:product, :supplier => @supplier, :on_hand => 0) - @supplier.should_not have_products_on_hand - end - - it "returns true when the product is in stock" do - create(:product, :supplier => @supplier, :on_hand => 1) - @supplier.should have_products_on_hand - end - end - end -end diff --git a/spec/requests/admin/distributors_spec.rb b/spec/requests/admin/distributors_spec.rb deleted file mode 100644 index d409eba3ff..0000000000 --- a/spec/requests/admin/distributors_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require "spec_helper" - -feature %q{ - As an administration - I want manage the distributors of products -} do - include AuthenticationWorkflow - include WebHelper - - - scenario "listing distributors" do - d = create(:distributor) - - login_to_admin_section - click_link 'Distributors' - - page.should have_content d.name - end - - scenario "viewing a distributor" do - d = create(:distributor) - - login_to_admin_section - click_link 'Distributors' - click_link d.name - - page.should have_content d.name - end - - scenario "creating a new distributor" do - login_to_admin_section - - click_link 'Distributors' - click_link 'New Distributor' - - fill_in 'distributor_name', :with => 'Eaterprises' - fill_in 'distributor_description', :with => 'Connecting farmers and eaters' - fill_in 'distributor_long_description', :with => 'Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.' - fill_in 'distributor_contact', :with => 'Kirsten or Ren' - fill_in 'distributor_phone', :with => '0413 897 321' - - fill_in 'distributor_pickup_address_attributes_address1', :with => '35 Ballantyne St' - fill_in 'distributor_pickup_address_attributes_city', :with => 'Thornbury' - fill_in 'distributor_pickup_address_attributes_zipcode', :with => '3072' - select('Australia', :from => 'distributor_pickup_address_attributes_country_id') - select('Victoria', :from => 'distributor_pickup_address_attributes_state_id') - - fill_in 'distributor_next_collection_at', :with => 'Thursday, 22nd Feb, 6 - 9 PM' - fill_in 'distributor_pickup_times', :with => 'Thursday, 22nd Feb, 6 - 9 PM. Friday, 23nd Feb, 6 - 9 PM' - fill_in 'distributor_email', :with => 'info@eaterprises.com.au' - fill_in 'distributor_url', :with => 'http://eaterprises.com.au' - fill_in 'distributor_abn', :with => '09812309823' - fill_in 'distributor_acn', :with => '' - - click_button 'Create' - - flash_message.should == 'Distributor "Eaterprises" has been successfully created!' - end - - - scenario "updating many distributor next collection times at once" do - # Given three distributors - 3.times { create(:distributor) } - - # When I go to the distributors page - login_to_admin_section - click_link 'Distributors' - - # And I fill in some new collection times and save them - fill_in 'distributor_set_distributors_attributes_0_next_collection_at', :with => 'One' - fill_in 'distributor_set_distributors_attributes_1_next_collection_at', :with => 'Two' - fill_in 'distributor_set_distributors_attributes_2_next_collection_at', :with => 'Three' - click_button 'Update' - - # Then my times should have been saved - flash_message.should == 'Distributor collection times updated.' - Distributor.all.map { |d| d.next_collection_at }.should == %w(One Two Three) - end - -end diff --git a/spec/requests/admin/enterprises_spec.rb b/spec/requests/admin/enterprises_spec.rb new file mode 100644 index 0000000000..dae560df69 --- /dev/null +++ b/spec/requests/admin/enterprises_spec.rb @@ -0,0 +1,122 @@ +require "spec_helper" + +feature %q{ + As an administrator + I want manage enterprises +} do + include AuthenticationWorkflow + include WebHelper + + + scenario "listing enterprises" do + e = create(:enterprise) + + login_to_admin_section + click_link 'Enterprises' + + page.should have_content e.name + end + + scenario "viewing an enterprise" do + e = create(:enterprise) + + login_to_admin_section + click_link 'Enterprises' + click_link e.name + + page.should have_content e.name + end + + scenario "creating a new enterprise" do + login_to_admin_section + + click_link 'Enterprises' + click_link 'New Enterprise' + + fill_in 'enterprise_name', :with => 'Eaterprises' + fill_in 'enterprise_description', :with => 'Connecting farmers and eaters' + fill_in 'enterprise_long_description', :with => 'Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.' + + uncheck 'enterprise_is_primary_producer' + check 'enterprise_is_distributor' + + fill_in 'enterprise_contact', :with => 'Kirsten or Ren' + fill_in 'enterprise_phone', :with => '0413 897 321' + fill_in 'enterprise_email', :with => 'info@eaterprises.com.au' + fill_in 'enterprise_website', :with => 'http://eaterprises.com.au' + fill_in 'enterprise_twitter', :with => '@eaterprises' + fill_in 'enterprise_abn', :with => '09812309823' + fill_in 'enterprise_acn', :with => '' + + fill_in 'enterprise_address_attributes_address1', :with => '35 Ballantyne St' + fill_in 'enterprise_address_attributes_city', :with => 'Thornbury' + fill_in 'enterprise_address_attributes_zipcode', :with => '3072' + select('Australia', :from => 'enterprise_address_attributes_country_id') + select('Victoria', :from => 'enterprise_address_attributes_state_id') + + fill_in 'enterprise_pickup_times', :with => 'Thursday, 22nd Feb, 6 - 9 PM. Friday, 23nd Feb, 6 - 9 PM' + fill_in 'enterprise_next_collection_at', :with => 'Thursday, 22nd Feb, 6 - 9 PM' + + click_button 'Create' + + flash_message.should == 'Enterprise "Eaterprises" has been successfully created!' + end + + scenario "editing an existing enterprise" do + @enterprise = create(:enterprise) + + login_to_admin_section + + click_link 'Enterprises' + click_link 'Edit' + + fill_in 'enterprise_name', :with => 'Eaterprises' + fill_in 'enterprise_description', :with => 'Connecting farmers and eaters' + fill_in 'enterprise_long_description', :with => 'Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.' + + uncheck 'enterprise_is_primary_producer' + check 'enterprise_is_distributor' + + fill_in 'enterprise_contact', :with => 'Kirsten or Ren' + fill_in 'enterprise_phone', :with => '0413 897 321' + fill_in 'enterprise_email', :with => 'info@eaterprises.com.au' + fill_in 'enterprise_website', :with => 'http://eaterprises.com.au' + fill_in 'enterprise_twitter', :with => '@eaterprises' + fill_in 'enterprise_abn', :with => '09812309823' + fill_in 'enterprise_acn', :with => '' + + fill_in 'enterprise_address_attributes_address1', :with => '35 Ballantyne St' + fill_in 'enterprise_address_attributes_city', :with => 'Thornbury' + fill_in 'enterprise_address_attributes_zipcode', :with => '3072' + select('Australia', :from => 'enterprise_address_attributes_country_id') + select('Victoria', :from => 'enterprise_address_attributes_state_id') + + fill_in 'enterprise_pickup_times', :with => 'Thursday, 22nd Feb, 6 - 9 PM. Friday, 23nd Feb, 6 - 9 PM' + fill_in 'enterprise_next_collection_at', :with => 'Thursday, 22nd Feb, 6 - 9 PM' + + click_button 'Update' + + flash_message.should == 'Enterprise "Eaterprises" has been successfully updated!' + end + + + scenario "updating many distributor next collection times at once" do + # Given three distributors + 3.times { create(:distributor_enterprise) } + + # When I go to the enterprises page + login_to_admin_section + click_link 'Enterprises' + + # And I fill in some new collection times and save them + fill_in 'enterprise_set_enterprises_attributes_0_next_collection_at', :with => 'One' + fill_in 'enterprise_set_enterprises_attributes_1_next_collection_at', :with => 'Two' + fill_in 'enterprise_set_enterprises_attributes_2_next_collection_at', :with => 'Three' + click_button 'Update' + + # Then my times should have been saved + flash_message.should == 'Distributor collection times updated.' + Enterprise.is_distributor.map { |d| d.next_collection_at }.should == %w(One Two Three) + end + +end diff --git a/spec/requests/admin/product_spec.rb b/spec/requests/admin/product_spec.rb index 37d9935dd2..9bcacd13d3 100644 --- a/spec/requests/admin/product_spec.rb +++ b/spec/requests/admin/product_spec.rb @@ -8,8 +8,8 @@ feature %q{ include WebHelper background do - @supplier = create(:supplier, :name => 'New supplier') - @distributors = (1..3).map { create(:distributor) } + @supplier = create(:supplier_enterprise, :name => 'New supplier') + @distributors = (1..3).map { create(:distributor_enterprise) } @shipping_method = create(:shipping_method, :name => 'My shipping method') end @@ -49,14 +49,14 @@ feature %q{ fill_in 'product_price', :with => '19.99' select 'New supplier', :from => 'product_supplier_id' choose 'product_group_buy_1' - fill_in 'Group buy unit size', :with => '10 kg' + fill_in 'Group buy unit size', :with => '10' click_button 'Create' flash_message.should == 'Product "A new product !!!" has been successfully created!' product = Spree::Product.find_by_name('A new product !!!') product.group_buy.should be_true - product.group_buy_unit_size.should == '10 kg' + product.group_buy_unit_size.should == 10.0 end end diff --git a/spec/requests/admin/reports_spec.rb b/spec/requests/admin/reports_spec.rb new file mode 100644 index 0000000000..2b6c62ee11 --- /dev/null +++ b/spec/requests/admin/reports_spec.rb @@ -0,0 +1,51 @@ +require "spec_helper" + +feature %q{ + As an administrator + I want numbers, all the numbers! +} do + include AuthenticationWorkflow + include WebHelper + + + scenario "orders and distributors report" do + login_to_admin_section + click_link 'Reports' + click_link 'Orders And Distributors' + + page.should have_content 'Order date' + end + + scenario "group buys report" do + login_to_admin_section + click_link 'Reports' + click_link 'Group Buys' + + page.should have_content 'Supplier' + end + + scenario "bulk co-op report" do + login_to_admin_section + click_link 'Reports' + click_link 'Bulk Co-Op' + + page.should have_content 'Supplier' + end + + scenario "payments reports" do + login_to_admin_section + click_link 'Reports' + click_link 'Payment Reports' + + page.should have_content 'Payment State' + end + + scenario "order cycle reports" do + login_to_admin_section + click_link 'Reports' + click_link 'Order Cycle Reports' + + page.should have_content 'Supplier' + end + +end diff --git a/spec/requests/admin/shipping_methods_spec.rb b/spec/requests/admin/shipping_methods_spec.rb index a72cff3e3a..d794e382c2 100644 --- a/spec/requests/admin/shipping_methods_spec.rb +++ b/spec/requests/admin/shipping_methods_spec.rb @@ -27,7 +27,7 @@ feature 'shipping methods' do scenario "deleting a shipping method referenced by a product distribution" do p = create(:product) - d = create(:distributor) + d = create(:distributor_enterprise) create(:product_distribution, product: p, distributor: d, shipping_method: @sm) visit_delete spree.admin_shipping_method_path(@sm) @@ -38,7 +38,7 @@ feature 'shipping methods' do scenario "deleting a shipping method referenced by a line item" do sm2 = create(:shipping_method) - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product) create(:product_distribution, product: p, distributor: d, shipping_method: sm2) diff --git a/spec/requests/admin/suppliers_spec.rb b/spec/requests/admin/suppliers_spec.rb deleted file mode 100644 index acd91568be..0000000000 --- a/spec/requests/admin/suppliers_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require "spec_helper" - -feature %q{ - As an administration - I want manage the suppliers of products -} do - include AuthenticationWorkflow - include WebHelper - - background do - end - - scenario "listing suppliers" do - s = create(:supplier) - - login_to_admin_section - click_link 'Suppliers' - - page.should have_content s.name - end - - scenario "viewing a supplier" do - s = create(:supplier) - - login_to_admin_section - click_link 'Suppliers' - click_link s.name - - page.should have_content s.name - end - - scenario "creating a new supplier" do - login_to_admin_section - - click_link 'Suppliers' - click_link 'New Supplier' - - fill_in 'supplier_name', :with => 'David Arnold' - fill_in 'supplier_description', :with => 'A farmer with a difference' - fill_in 'supplier_long_description', :with => 'Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.' - - fill_in 'supplier_address_attributes_address1', :with => '35 Byron Ave' - fill_in 'supplier_address_attributes_city', :with => 'Ararat' - fill_in 'supplier_address_attributes_zipcode', :with => '1112' - select('Australia', :from => 'supplier_address_attributes_country_id') - select('Victoria', :from => 'supplier_address_attributes_state_id') - - fill_in 'supplier_email', :with => 'david@here.com' - fill_in 'supplier_website', :with => 'http://somewhere.com' - fill_in 'supplier_twitter', :with => 'davida' - - click_button 'Create' - - flash_message.should == 'Supplier "David Arnold" has been successfully created!' - end -end diff --git a/spec/requests/consumer/add_to_cart_spec.rb b/spec/requests/consumer/add_to_cart_spec.rb index d528866647..de9ccce8da 100644 --- a/spec/requests/consumer/add_to_cart_spec.rb +++ b/spec/requests/consumer/add_to_cart_spec.rb @@ -10,8 +10,8 @@ feature %q{ scenario "adding a product to the cart with no distributor chosen" do # Given a product and some distributors - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p = create(:product, :distributors => [d1]) create(:product, :distributors => [d2]) @@ -30,8 +30,8 @@ feature %q{ create(:itemwise_shipping_method) # Given a product, some distributors and a defined shipping cost - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) create(:product, :distributors => [d2]) p = create(:product, :price => 12.34) create(:product_distribution, :product => p, :distributor => d1, :shipping_method => create(:shipping_method)) @@ -67,8 +67,8 @@ feature %q{ it "does not allow the user to change distributor after a product has been added to the cart" do # Given a product and some distributors - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p = create(:product, :distributors => [d1]) # When I add a product to my cart (which sets my distributor) @@ -87,7 +87,7 @@ feature %q{ context "adding a subsequent product to the cart" do it "does not allow the user to choose a distributor" do # Given a product under a distributor - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d]) # And a product in my cart @@ -103,8 +103,8 @@ feature %q{ it "does not allow the user to add a product from another distributor" do # Given two products, each at a different distributor - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p1 = create(:product, :distributors => [d1]) p2 = create(:product, :distributors => [d2]) @@ -123,7 +123,7 @@ feature %q{ it "adds products with valid distributors" do # Given two products, each at the same distributor - d = create(:distributor) + d = create(:distributor_enterprise) p1 = create(:product, :distributors => [d]) p2 = create(:product, :distributors => [d]) @@ -146,7 +146,7 @@ feature %q{ context "group buys" do scenario "adding a product to the cart for a group buy" do # Given a group buy product and a distributor - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d], :group_buy => true) # When I add the item to my cart @@ -166,7 +166,7 @@ feature %q{ scenario "adding a product with variants to the cart for a group buy" do # Given a group buy product with variants and a distributor - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d], :group_buy => true) create(:variant, :product => p) @@ -187,7 +187,7 @@ feature %q{ scenario "adding a product to cart that is not a group buy does not show max quantity field" do # Given a group buy product and a distributor - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d], :group_buy => false) # When I view the add to cart form, there should not be a max quantity field @@ -198,7 +198,7 @@ feature %q{ scenario "adding a product with a max quantity less than quantity results in max_quantity==quantity" do # Given a group buy product and a distributor - d = create(:distributor) + d = create(:distributor_enterprise) p = create(:product, :distributors => [d], :group_buy => true) # When I add the item to my cart diff --git a/spec/requests/consumer/checkout_spec.rb b/spec/requests/consumer/checkout_spec.rb index cfaaee8bee..2a0bce8c5d 100644 --- a/spec/requests/consumer/checkout_spec.rb +++ b/spec/requests/consumer/checkout_spec.rb @@ -9,13 +9,13 @@ feature %q{ include WebHelper background do - @distributor = create(:distributor, :name => 'Edible garden', - :pickup_address => create(:address, - :address1 => '12 Bungee Rd', - :city => 'Carion', - :zipcode => 3056, - :state => Spree::State.find_by_name('Victoria'), - :country => Spree::Country.find_by_name('Australia')), + @distributor = create(:distributor_enterprise, :name => 'Edible garden', + :address => create(:address, + :address1 => '12 Bungee Rd', + :city => 'Carion', + :zipcode => 3056, + :state => Spree::State.find_by_name('Victoria'), + :country => Spree::Country.find_by_name('Australia')), :pickup_times => 'Tuesday, 4 PM') @shipping_method_1 = create(:shipping_method, :name => 'Shipping Method One') @@ -94,18 +94,18 @@ feature %q{ # Distributor details should be displayed within('fieldset#shipping') do [@distributor.name, - @distributor.pickup_address.address1, - @distributor.pickup_address.city, - @distributor.pickup_address.zipcode, - @distributor.pickup_address.state_text, - @distributor.pickup_address.country.name, + @distributor.address.address1, + @distributor.address.city, + @distributor.address.zipcode, + @distributor.address.state_text, + @distributor.address.country.name, @distributor.pickup_times, @distributor.next_collection_at, @distributor.contact, @distributor.phone, @distributor.email, @distributor.description, - @distributor.url].each do |value| + @distributor.website].each do |value| page.should have_content value end diff --git a/spec/requests/consumer/cms_spec.rb b/spec/requests/consumer/cms_spec.rb index 93a6a87958..7cd085f1e4 100644 --- a/spec/requests/consumer/cms_spec.rb +++ b/spec/requests/consumer/cms_spec.rb @@ -31,7 +31,6 @@ feature %q{ page.should_not have_content 'Home page content' end - scenario "viewing the menu of CMS pages" do # Given some CMS pages home_page = create(:cms_page, content: 'Home') @@ -48,4 +47,19 @@ feature %q{ page.should have_selector 'ul#main-nav-bar li', :text => 'Three' end + scenario "viewing a page from the CMS menu" do + # Given some CMS pages + home_page = create(:cms_page, content: 'Home') + create(:cms_page, parent: home_page, label: 'One') + create(:cms_page, parent: home_page, label: 'Two', content: 'This is the page') + create(:cms_page, parent: home_page, label: 'Three') + + # When I go to one of the pages + visit spree.root_path + click_link 'Two' + + # Then I should see the page + page.should have_content 'This is the page' + end + end diff --git a/spec/requests/consumer/distributors_spec.rb b/spec/requests/consumer/distributors_spec.rb index 1139ace1cd..32e642edf5 100644 --- a/spec/requests/consumer/distributors_spec.rb +++ b/spec/requests/consumer/distributors_spec.rb @@ -10,9 +10,9 @@ feature %q{ scenario "viewing a list of distributors" do # Given some distributors - d1 = create(:distributor) - d2 = create(:distributor) - d3 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) + d3 = create(:distributor_enterprise) # And some of those distributors have a product create(:product, :distributors => [d1, d2]) @@ -26,10 +26,31 @@ feature %q{ page.should_not have_selector 'a', :text => d3.name end + scenario "viewing a distributor" do + # Given some distributors with products + d1 = create(:distributor_enterprise, :long_description => "Hello, world!
") + d2 = create(:distributor_enterprise) + p1 = create(:product, :distributors => [d1]) + p2 = create(:product, :distributors => [d2]) + + # When I go to the first distributor page + visit spree.root_path + click_link d1.name + + # Then I should see the distributor details + page.should have_selector 'h2', :text => d1.name + page.should have_selector 'div.enterprise-description', :text => 'Hello, world!' + + # And I should see the first, but not the second product + page.should have_content p1.name + page.should_not have_content p2.name + end + + context "when a distributor is selected" do it "displays the distributor's details" do # Given a distributor with a product - d = create(:distributor, :name => 'Melb Uni Co-op', :description => 'Hello, world!
') + d = create(:distributor_enterprise, :name => 'Melb Uni Co-op', :description => 'Hello, world!
') create(:product, :distributors => [d]) # When I select the distributor @@ -40,12 +61,12 @@ feature %q{ page.should have_selector 'h2', :text => 'Melb Uni Co-op' # And I should see the distributor's long description - page.should have_selector 'div.distributor-description', :text => 'Hello, world!' + page.should have_selector 'div.enterprise-description', :text => 'Hello, world!' end it "displays the distributor's name on the home page" do # Given a distributor with a product - d = create(:distributor, :name => 'Melb Uni Co-op', :description => 'Hello, world!
') + d = create(:distributor_enterprise, :name => 'Melb Uni Co-op', :description => 'Hello, world!
') create(:product, :distributors => [d]) # When I select the distributor @@ -63,8 +84,8 @@ feature %q{ taxonomy = Spree::Taxonomy.find_by_name('Products') || create(:taxonomy, :name => 'Products') taxonomy_root = taxonomy.root taxon = create(:taxon, :name => 'Taxon one', :parent_id => taxonomy_root.id) - d1 = create(:distributor) - d2 = create(:distributor) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) p1 = create(:product, :distributors => [d1], :taxons => [taxon]) p2 = create(:product, :distributors => [d2], :taxons => [taxon]) @@ -90,7 +111,7 @@ feature %q{ it "allows the user to leave the distributor" do # Given a distributor with a product - d = create(:distributor, :name => 'Melb Uni Co-op') + d = create(:distributor_enterprise, :name => 'Melb Uni Co-op') create(:product, :distributors => [d]) # When I select the distributor and then leave it @@ -105,7 +126,7 @@ feature %q{ context "viewing a product, it provides a choice of distributor when adding to cart" do it "works when no distributor is chosen" do # Given a distributor and a product under it - distributor = create(:distributor) + distributor = create(:distributor_enterprise) product = create(:product, :distributors => [distributor]) # When we view the product @@ -118,7 +139,7 @@ feature %q{ it "displays the local distributor as the default choice when available for the current product" do # Given a distributor and a product under it - distributor = create(:distributor) + distributor = create(:distributor_enterprise) product = create(:product, :distributors => [distributor]) # When we select the distributor and view the product @@ -132,8 +153,8 @@ feature %q{ it "works when viewing a product from a remote distributor" do # Given two distributors and our product under one - distributor_product = create(:distributor) - distributor_no_product = create(:distributor) + distributor_product = create(:distributor_enterprise) + distributor_no_product = create(:distributor_enterprise) product = create(:product, :distributors => [distributor_product]) create(:product, :distributors => [distributor_no_product]) diff --git a/spec/requests/consumer/product_spec.rb b/spec/requests/consumer/product_spec.rb index 97712d1e13..e8741548e2 100644 --- a/spec/requests/consumer/product_spec.rb +++ b/spec/requests/consumer/product_spec.rb @@ -10,8 +10,8 @@ feature %q{ scenario "viewing a product shows its supplier and distributor" do # Given a product with a supplier and distributor - s = create(:supplier) - d = create(:distributor) + s = create(:supplier_enterprise) + d = create(:distributor_enterprise) p = create(:product, :supplier => s, :distributors => [d]) # When I view the product @@ -22,4 +22,62 @@ feature %q{ page.should have_selector 'td', :text => d.name end + describe "viewing distributor details" do + context "without Javascript" do + it "displays a holding message when no distributor is selected" do + p = create(:product) + + visit spree.product_path p + + page.should have_selector '#product-distributor-details', :text => 'When you select a distributor for your order, their address and pickup times will be displayed here.' + end + + it "displays distributor details when one is selected" do + d = create(:distributor_enterprise) + p = create(:product, :distributors => [d]) + + visit spree.root_path + click_link d.name + visit spree.product_path p + + within '#product-distributor-details' do + [d.name, + d.address.address1, + d.address.city, + d.address.zipcode, + d.address.state_text, + d.address.country.name, + d.pickup_times, + d.next_collection_at, + d.contact, + d.phone, + d.email, + d.description, + d.website].each do |value| + + page.should have_content value + end + end + end + end + + context "with Javascript", js: true do + it "changes distributor details when the distributor is changed" do + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) + d3 = create(:distributor_enterprise) + p = create(:product, :distributors => [d1, d2, d3]) + + visit spree.product_path p + + [d1, d2, d3].each do |d| + select d.name, :from => 'distributor_id' + + within '#product-distributor-details' do + page.should have_selector 'h2', :text => d.name + end + end + end + end + end end diff --git a/spec/requests/consumer/suppliers_spec.rb b/spec/requests/consumer/suppliers_spec.rb index 1c88ffd64f..c52e3c6f86 100644 --- a/spec/requests/consumer/suppliers_spec.rb +++ b/spec/requests/consumer/suppliers_spec.rb @@ -10,9 +10,9 @@ feature %q{ scenario "viewing a list of suppliers in the sidebar" do # Given some suppliers - s1 = create(:supplier) - s2 = create(:supplier) - s3 = create(:supplier) + s1 = create(:supplier_enterprise) + s2 = create(:supplier_enterprise) + s3 = create(:supplier_enterprise) # And some of those suppliers have a product create(:product, :supplier => s1) @@ -29,9 +29,9 @@ feature %q{ scenario "viewing a list of all suppliers" do # Given some suppliers - s1 = create(:supplier) - s2 = create(:supplier) - s3 = create(:supplier) + s1 = create(:supplier_enterprise) + s2 = create(:supplier_enterprise) + s3 = create(:supplier_enterprise) # And some of those suppliers have a product create(:product, :supplier => s1) @@ -49,18 +49,23 @@ feature %q{ scenario "viewing products provided by a supplier" do # Given a supplier with a product - s = create(:supplier, :name => 'Murrnong', :long_description => "Hello, world!
") - p = create(:product, :supplier => s) + s1 = create(:supplier_enterprise, :name => 'Murrnong', :long_description => "Hello, world!
") + p1 = create(:product, :supplier => s1) - # When I select the supplier + # And a different supplier with another product + s2 = create(:supplier_enterprise, :name => 'Red Herring') + p2 = create(:product, :supplier => s2) + + # When I select the first supplier visit spree.root_path - click_link s.name + click_link s1.name # Then I should see the supplier details - page.should have_selector 'h2', :text => s.name - page.should have_selector 'div.supplier-description', :text => 'Hello, world!' + page.should have_selector 'h2', :text => s1.name + page.should have_selector 'div.enterprise-description', :text => 'Hello, world!' - # And I should see the product - page.should have_content p.name + # And I should see the first, but not the second product + page.should have_content p1.name + page.should_not have_content p2.name end end diff --git a/spec/requests/consumer/taxonomy_spec.rb b/spec/requests/consumer/taxonomy_spec.rb index 2b606a9406..9a2190c1a0 100644 --- a/spec/requests/consumer/taxonomy_spec.rb +++ b/spec/requests/consumer/taxonomy_spec.rb @@ -40,8 +40,8 @@ feature %q{ taxon_two = create(:taxon, :name => 'Taxon two', :parent_id => taxonomy_root.id) taxon_three = create(:taxon, :name => 'Taxon three', :parent_id => taxonomy_root.id) - my_distributor = create(:distributor, :name => 'My Distributor') - other_distributor = create(:distributor, :name => 'Other Distributor') + my_distributor = create(:distributor_enterprise, :name => 'My Distributor') + other_distributor = create(:distributor_enterprise, :name => 'Other Distributor') 1.times { create(:product, :taxons => [taxon_one], :distributors => [other_distributor]) } 2.times { create(:product, :taxons => [taxon_two], :distributors => [other_distributor]) }