diff --git a/Gemfile.lock b/Gemfile.lock index 4951b40..c9c353d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -46,6 +46,19 @@ GEM builder builder (2.1.2) cancan (1.6.4) + capybara (0.4.1.2) + celerity (>= 0.7.9) + culerity (>= 0.2.4) + mime-types (>= 1.16) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + selenium-webdriver (>= 0.0.27) + xpath (~> 0.1.3) + celerity (0.8.9) + childprocess (0.1.9) + ffi (~> 1.0.6) + culerity (0.2.15) devise (1.3.3) bcrypt-ruby (~> 2.1.2) orm_adapter (~> 0.0.3) @@ -54,13 +67,16 @@ GEM rails (>= 3.0.0) erubis (2.6.6) abstract (>= 1.0.0) + factory_girl (2.0.0.beta2) faker (0.9.5) i18n (~> 0.4) + ffi (1.0.8) highline (1.5.1) i18n (0.5.0) jquery-rails (0.2.6) rails (~> 3.0) thor (~> 0.14.4) + json_pure (1.5.1) mail (2.2.19) activesupport (>= 2.3.6) i18n (>= 0.4.0) @@ -75,6 +91,7 @@ GEM nested_set (1.6.4) activerecord (>= 3.0.0) railties (>= 3.0.0) + nokogiri (1.4.4) orm_adapter (0.0.5) paperclip (2.3.8) activerecord @@ -104,6 +121,12 @@ GEM activesupport (~> 3.0) rd_resource_controller (1.0.1) rd_unobtrusive_date_picker (0.1.0) + rubyzip (0.9.4) + selenium-webdriver (0.2.0) + childprocess (>= 0.1.7) + ffi (>= 1.0.7) + json_pure + rubyzip shoulda (2.11.3) spork (0.9.0.rc7) spork-testunit (0.0.5) @@ -140,13 +163,18 @@ GEM warden (1.0.4) rack (>= 1.0) will_paginate (3.0.pre2) + xpath (0.1.4) + nokogiri (~> 1.3) PLATFORMS ruby DEPENDENCIES + capybara (>= 0.4.1) dummier (>= 0.1.0) + factory_girl (>= 2.0.0.beta2) faker (>= 0.9.5) + selenium-webdriver (>= 0.2.0) shoulda (>= 2.11.3) spork (>= 0.9.0.rc5) spork-testunit (>= 0.0.5) diff --git a/app/controllers/admin/wholesaler_states_controller.rb b/app/controllers/admin/wholesaler_states_controller.rb new file mode 100644 index 0000000..1e1a03a --- /dev/null +++ b/app/controllers/admin/wholesaler_states_controller.rb @@ -0,0 +1,13 @@ +class Admin::WholesalerStatesController < Admin::BaseController + + def index + #params[:prefix] = params[:prefix].to_s.downcase + #prefix = %w(bill ship).include?(params[:prefix]) ? params[:prefix] : "bill" + if params[:country_id] + @country = Country.includes(:states).find(params[:country_id]) rescue nil + @states = @country.states.order(:name).all if @country + end + render :partial => "admin/wholesalers/state_field", :locals => { :states => @states } + end + +end diff --git a/app/controllers/admin/wholesalers_controller.rb b/app/controllers/admin/wholesalers_controller.rb index 475fbbc..f04f347 100644 --- a/app/controllers/admin/wholesalers_controller.rb +++ b/app/controllers/admin/wholesalers_controller.rb @@ -1,22 +1,19 @@ -class Admin::WholesalersController < Admin::BaseController - - resource_controller +class Admin::WholesalersController < Admin::ResourceController include SpreeWholesale::WholesalerController - #before_filter :check_json_authenticity, :only => :index + before_filter :approval_setup, :only => [ :approve, :reject ] - index.response do |wants| - wants.html { render :action => :index } - wants.json { render :json => json_data } + def after_wholesaler_create + flash[:notice] = t('admin.wholesalers.success') + redirect_to admin_wholesalers_path end - - destroy.success.wants.js { render_js_for_destroy } - - - before_filter :approval_setup, :only => [ :approve, :reject ] - - + + def after_wholesaler_failed_create + flash[:error] = t('admin.wholesalers.failed') + render :action => :new + end + def approve return redirect_to request.referer, :flash => { :error => "Wholesaler is already active." } if @wholesaler.active? @wholesaler.activate! @@ -33,47 +30,14 @@ def approval_setup @wholesaler = Wholesaler.find(params[:id]) @role = Role.find_by_name("wholesaler") end - - + private def collection params[:search] ||= {} params[:search][:meta_sort] ||= "company.asc" - @search = end_of_association_chain.metasearch(params[:search]) + @search = Wholesaler.search(params[:search]) @collection = @search.paginate(:per_page => Spree::Config[:admin_products_per_page], :page => params[:page]) end end - - ## Allow different formats of json data to suit different ajax calls - #def json_data - # json_format = params[:json_format] or 'default' - # case json_format - # when 'basic' - # collection.map {|u| {'id' => u.id, 'name' => u.email}}.to_json - # else - # collection.to_json(:include => - # {:bill_address => {:include => [:state, :country]}, - # :ship_address => {:include => [:state, :country]}}) - # end - #end - - #def collection - # return @collection if @collection.present? - # unless request.xhr? - # @search = Wholesaler.searchlogic(params[:search]) - # - # #set order by to default or form result - # @search.order ||= "ascend_by_email" - # - # @collection = @search.do_search.includes(:user => [:roles]).paginate(:per_page => Spree::Config[:admin_products_per_page], :page => params[:page]) - # - # #scope = scope.conditions "lower(email) = ?", @filter.email.downcase unless @filter.email.blank? - # else - # @collection = Wholesaler.includes(:user => [:roles], :bill_address => [:state, :country], - # :ship_address => [:state, :country]).where("wholesalers.company like :search", - # {:search => "#{params[:q].strip}%"}).limit(params[:limit] || 100) - # end - #end -#end diff --git a/app/models/order_decorator.rb b/app/models/order_decorator.rb index c5ae796..d5ba3fe 100644 --- a/app/models/order_decorator.rb +++ b/app/models/order_decorator.rb @@ -27,6 +27,12 @@ def to_fullsale! end def to_wholesale! + + puts "user.wholesaler" + puts user.wholesaler + + + return false unless user.wholesaler.present? self.wholesale = true set_line_item_prices(:wholesale_price) update! diff --git a/app/models/user_decorator.rb b/app/models/user_decorator.rb index 4ffc4b1..501bbb0 100644 --- a/app/models/user_decorator.rb +++ b/app/models/user_decorator.rb @@ -7,7 +7,7 @@ User.class_eval do def wholesaler? - has_role?("wholesaler") + has_role?("wholesaler") && !wholesaler.nil? end end \ No newline at end of file diff --git a/app/models/wholesaler.rb b/app/models/wholesaler.rb index bc1feb9..b8a89e2 100644 --- a/app/models/wholesaler.rb +++ b/app/models/wholesaler.rb @@ -1,21 +1,22 @@ class Wholesaler < ActiveRecord::Base - belongs_to :user + partial_updates = false - belongs_to :ship_address, :foreign_key => "shipping_address_id", :class_name => "Address" - belongs_to :bill_address, :foreign_key => "billing_address_id", :class_name => "Address" - - validates_presence_of [ :company, :buyer_contact, :manager_contact, :phone, :taxid ] - - validates_each :user_id, :billing_address_id, :shipping_address_id do |record,attr,value| - record.errors.add attr, 'must not contain any errors.' if value.to_i == 0 - end + belongs_to :user, :dependent => :destroy + belongs_to :bill_address, :foreign_key => "billing_address_id", :class_name => "Address", :dependent => :destroy + belongs_to :ship_address, :foreign_key => "shipping_address_id", :class_name => "Address", :dependent => :destroy + validates :company, :buyer_contact, :manager_contact, :phone, :taxid, :presence => true + validate :validate_parts + delegate_belongs_to :user, :roles delegate_belongs_to :user, :email - - def self.term_options - %(Net 10, Net 15, Net 30, COD, Credit Card).split(", ") + + def validate_parts + uv = user && user.valid? + bv = bill_address && bill_address.valid? + sv = ship_address && ship_address.valid? + self.errors.add(:base, I18n.t("wholesaler.parts_error_message")) unless uv && bv && sv end def activate! @@ -36,6 +37,10 @@ def active? user && user.has_role?("wholesaler") end + def self.term_options + %(Net 10, Net 15, Net 30, COD, Credit Card).split(", ") + end + private def get_wholesale_role diff --git a/app/views/admin/wholesalers/_form.html.erb b/app/views/admin/wholesalers/_form.html.erb index 20a21e9..a1ee40f 100644 --- a/app/views/admin/wholesalers/_form.html.erb +++ b/app/views/admin/wholesalers/_form.html.erb @@ -4,8 +4,29 @@ <%= hook :admin_wholesaler_form_fields, locals do %> <%= render "shared/error_messages", :target => @wholesaler %> + -
+
+ User Details: + <% if @user.new_record? %> + <%= fields_for :user, @user do |uf| %> + <%= render "shared/error_messages", :target => @user %> + <%= render 'admin/users/form', :f => uf %> + <% end %> + <% else %> +

+ User Id: + <%= link_to @user.id, admin_user_path(@user) %> +
+ <%= link_to "view user", admin_user_path(@user) %> / + <%= link_to "edit user", edit_admin_user_path(@user) %> / + <%= render "user_options" %> +

+ <% end %> +
+ + +
Wholesaler Details: <%= f.field_container :company do %> @@ -71,32 +92,11 @@
<% end %> - -
- User Details: - <% if @user.new_record? %> - <%= fields_for :user, @user do |uf| %> - <%= render "shared/error_messages", :target => @user %> - <%= render 'admin/users/form', :f => uf %> - <% end %> - <% else %> -

- User Id: - <%= link_to @user.id, admin_user_path(@user) %> -
- <%= link_to "view user", admin_user_path(@user) %> / - <%= link_to "edit user", edit_admin_user_path(@user) %> / - <%= render "user_options" %> -

- <% end %> -
- -
-
+
Billing Address Details: <%= fields_for :bill_address, @bill_address do |af| %> <%= render "shared/error_messages", :target => @bill_address %> @@ -105,29 +105,19 @@
-
+
Shipping Address Details: <%= fields_for :ship_address, @ship_address do |af| %> <%= render "shared/error_messages", :target => @ship_address %> - <%= render 'shared/address_form', :form => af, :address => @ship_address %> + <%= render 'shared/address_form', :form => af, :address => @ship_address %> <% end %>
- + <% content_for :head do %> <%= stylesheet_link_tag 'admin/wholesalers' %> -<% end %> \ No newline at end of file + <%= javascript_include_tag 'admin/wholesaler_address' %> +<% end %> diff --git a/app/views/admin/wholesalers/_state_field.html.erb b/app/views/admin/wholesalers/_state_field.html.erb new file mode 100644 index 0000000..b5e4ede --- /dev/null +++ b/app/views/admin/wholesalers/_state_field.html.erb @@ -0,0 +1,8 @@ +<% states ||= [] %> +<% prefix ||= '' %> +<% value ||= '' %> +<% unless states.empty? %> + <%= select_tag "#{prefix}_address[state_id]", options_for_select(states.map{|s| [s.name, s.id]}, value.is_a?(Address) ? value.state.id : value), :class => 'required' %> +<% else %> + <%= text_field_tag "#{prefix}_address[state_name]", value.is_a?(Address) ? value.state_name : value, :class => 'text required' %> +<% end %> diff --git a/app/views/admin/wholesalers/edit.html.erb b/app/views/admin/wholesalers/edit.html.erb index 1aaaac1..8e1670f 100644 --- a/app/views/admin/wholesalers/edit.html.erb +++ b/app/views/admin/wholesalers/edit.html.erb @@ -3,7 +3,7 @@ <% end %> <%= hook :admin_wholesaler_edit_form do %> - <%= form_for(:wholesaler, :url => object_url, :html => { :method => :put }) do |f| %> + <%= form_for [:admin, @wholesaler], :html => { :class => "wholesaler-form" } do |f| %> <%= render :partial => "form", :locals => { :f => f } %> <%= hook :admin_wholesaler_edit_form_buttons do %> diff --git a/app/views/admin/wholesalers/new.html.erb b/app/views/admin/wholesalers/new.html.erb index bb5b453..6cbb4bb 100644 --- a/app/views/admin/wholesalers/new.html.erb +++ b/app/views/admin/wholesalers/new.html.erb @@ -3,7 +3,7 @@ <% end %> <%= hook :admin_wholesaler_new_form do %> - <%= form_for(:wholesaler, :url => collection_url) do |f| %> + <%= form_for [:admin, @wholesaler], :html => { :class => "wholesaler-form" } do |f| %> <%= render :partial => "form", :locals => { :f => f } %> <%= hook :admin_wholesaler_new_form_buttons do %> diff --git a/app/views/hooks/_wholesale_customer.html.erb b/app/views/hooks/_wholesale_customer.html.erb new file mode 100644 index 0000000..b011e8d --- /dev/null +++ b/app/views/hooks/_wholesale_customer.html.erb @@ -0,0 +1,5 @@ +<% if @user.wholesaler? %> +

Wholesaler

+

<%= t('wholesale_customer', { :id => @user.id }) %>

+

<%= t('wholesale_customer_since', { :time => @user.wholesaler.created_at }) %>

+<% end %> diff --git a/app/views/shared/_address_form.html.erb b/app/views/shared/_address_form.html.erb index f272fc0..2b32e24 100644 --- a/app/views/shared/_address_form.html.erb +++ b/app/views/shared/_address_form.html.erb @@ -7,7 +7,7 @@

<%= form.label :lastname, t(billing ? 'billing_lastname' : 'shipping_lastname') %>
- <%= form.text_field :lastname %> + <%= form.text_field :lastname, :class => 'required' %>*

<%= form.label :address1, t(:street_address) %>
@@ -22,30 +22,10 @@ <%= form.text_field :city, :class => 'required' %>*

<% if Spree::Config[:address_requires_state] %> -

- - <% have_states = !address.country.states.empty? %> - <%= form.label :state, t(:state) %>
- - <% state_elements = [ - form.collection_select(:state_id, address.country.states, - :id, :name, - {:include_blank => true}, - {:class => have_states ? "required" : "hidden", - :disabled => !have_states}) + - form.text_field(:state_name, - :class => !have_states ? "required" : "hidden", - :disabled => have_states) - ].join.gsub('"', "'").gsub("\n", "") - %> - -
+

+ <% have_states = !address.country.states.empty? %> + <%= form.label :state_id, t(:state) %>
+ <%= render 'state_field', :prefix => billing ? 'bill' : 'ship', :value => address, :states => address.country.states.sort %> *

<% end %> @@ -55,19 +35,16 @@

<%= form.label :country_id, t(:country) %>
- <%= form.collection_select :country_id, Country.all, :id, :name, {}, {:class => 'required'} %> + "> + <%= form.collection_select :country_id, Country.all, :id, :name, {}, { :class => 'country-select required' } %> + *

<%= form.label :phone, t(:phone) %>
<%= form.text_field :phone, :class => 'required' %>*

-<% if Spree::Config[:alternative_billing_phone] %> -

- <%= form.label :alternative_phone, t(:alternative_phone) %>
- <%= form.text_field :alternative_phone %> -

-<% end %> + <% if billing %>