diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index da2d5ef..838f7de 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -5,6 +5,8 @@ def index @recent_certs = UserCertification.where("created_at > ?", DateTime.now - 7.days).count @num_users = User.count @recent_users = User.where("created_at > ?", DateTime.now - 7.days).count + @num_paid_users = User.all.select{|u| u.member_status >= 250 }.count + @num_delinquent_users = User.all.select{|u| !u.payment_status }.count if can? :read, User then @recent_user_names = User.where("member_level > 10").accessible_by(current_ability).order('created_at desc').limit(5) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 38f7e7f..4b6877c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -33,6 +33,10 @@ class UsersController < ApplicationController end end + def inactive + @users = @users.all.select{|u| u if u.payment_status == false }.sort_by{ |u| -u.delinquency } + end + # GET /users/1 # GET /users/1.json def show diff --git a/app/models/ability.rb b/app/models/ability.rb index 1c47f5e..4f5ea1b 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -35,9 +35,11 @@ class Ability can :read, UserCertification end - # Accountants can manage all + # Accountants can manage payments if user.accountant? can :manage, Payment + can :manage, Ipn + can :manage, PaypalCsv end # Admins can manage all diff --git a/app/models/ipn.rb b/app/models/ipn.rb index 002a834..417884a 100644 --- a/app/models/ipn.rb +++ b/app/models/ipn.rb @@ -45,6 +45,7 @@ class Ipn < ActiveRecord::Base end unless response == "VERIFIED" Rails.logger.error "Invalid IPN: #{response}" + Rails.logger.error "Data: #{self.data}" return false end @@ -58,8 +59,8 @@ class Ipn < ActiveRecord::Base private def create_payment # find user by email, then by payee - user = User.find_by_email(self.payer_email) - user = User.find_by_payee(self.payer_email) if user.nil? && self.payer_email.present? + user = User.where("lower(email) = ?", self._from_email_address.downcase).first + user = User.where("lower(payee) = ?", self._from_email_address.downcase).first if user.nil? && self._from_email_address.present? # Only create payments if the IPN matches a member if user.present? diff --git a/app/models/payment.rb b/app/models/payment.rb index 4b10b67..8c4ab5b 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -7,7 +7,6 @@ class Payment < ActiveRecord::Base validates_presence_of :user_id, :date, :amount # not created_by validates_uniqueness_of :date, :scope => :user_id, :message => ' of payment already exists for this user.' - def human_date if date.year < DateTime.now.year date.strftime("%b %e, %y") diff --git a/app/models/paypal_csv.rb b/app/models/paypal_csv.rb index 1791aa6..d150e8e 100644 --- a/app/models/paypal_csv.rb +++ b/app/models/paypal_csv.rb @@ -38,8 +38,8 @@ class PaypalCsv < ActiveRecord::Base private def create_payment # find user by email, then by payee - user = User.find_by_email(self._from_email_address) - user = User.find_by_payee(self._from_email_address) if user.nil? && self._from_email_address.present? + user = User.where("lower(email) = ?", self._from_email_address.downcase).first + user = User.where("lower(payee) = ?", self._from_email_address.downcase).first if user.nil? && self._from_email_address.present? # Only create payments if the CSV matches a member if user.present? diff --git a/app/models/user.rb b/app/models/user.rb index 6e7fa48..899ee2f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -89,6 +89,11 @@ class User < ActiveRecord::Base {25 => "Associate", 50 => "Basic", 75 => "Basic", 100 => "Plus"} end + def payment_status + results = payment_status_calculation + return results[:paid] + end + def member_status results = member_status_calculation return results[:rank] @@ -99,6 +104,15 @@ class User < ActiveRecord::Base return "" end + def delinquency + if self.payments.count > 0 + paydate = self.payments.maximum(:date) + (Date.today - paydate).to_i + else + (Date.today - self.created_at.to_date).to_i + end + end + private def member_status_calculation @@ -112,7 +126,7 @@ class User < ActiveRecord::Base case self.member_level.to_i when 0..9 if self.payments.count > 0 then - message = "Former Member (#{(DateTime.now - self.payments.last.date).to_i} days ago)" + message = "Former Member (#{(DateTime.now - self.payments.maximum(:date)).to_i/30} months ago)" icon = :timeout rank = 1 else @@ -138,27 +152,41 @@ class User < ActiveRecord::Base rank = 1000 end + payment_results = payment_status_calculation + flair = payment_results[:flair] + rank = rank/10 unless payment_results[:paid] + message = payment_results[:message] unless payment_results[:message].blank? + + return {:message => message, :icon => icon, :flair => flair, :rank => rank} + end + + def payment_status_calculation + flair = "" + message = "" + paid = true + # Second status item is payment status case self.member_level.to_i when 25..999 # There are payments if self.payments.count > 0 then # They're on time - if self.payments.last.date > (DateTime.now - 60.days) + if self.payments.maximum(:date) > (DateTime.now - 60.days) flair = "-paid" + paid = true else - message = "Last Payment #{(DateTime.now - self.payments.last.date).to_i/30} months ago" - rank = rank/10 + message = "Last Payment #{(DateTime.now - self.payments.maximum(:date)).to_i/30} months ago" + paid = false end else message = "No Payments Recorded" - rank = rank/10 + paid = false end end - - return {:message => message, :icon => icon, :flair => flair, :rank => rank} + return {:message => message, :paid => paid, :flair => flair} end + def send_new_user_email Rails.logger.info UserMailer.new_user_email(self).deliver end diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 9d47d6d..6be51a1 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -27,6 +27,8 @@
<%= @num_users %> (<%= @recent_users %> new in the last 7 days)
# of People Certified:
<%= @num_certs %> (<%= @recent_certs %> new in the last 7 days)
+
# of Current Paying Members:
+
<%= @num_paid_users %> (<%= @num_delinquent_users %> not-current)
# of Door Accesses Granted:
<%= @num_door_opens %> (<%= @today_door_opens %> today, <%= @recent_door_opens %> in the last 7 days)
# of Door Accesses Denied:
diff --git a/app/views/users/inactive.html.erb b/app/views/users/inactive.html.erb new file mode 100644 index 0000000..35c7911 --- /dev/null +++ b/app/views/users/inactive.html.erb @@ -0,0 +1,65 @@ +

Inactive Users

+ + + + + <% if current_user.admin? then %><% end %> + + <% if current_user.admin? %>+ <% end %> + + + + + + + + <% if current_user.admin? then %><% end %> + + <% if current_user.admin? then %> + + <% end %> + + + + + + + + + +<% if !@users.blank? %> + <% @users.each do |user| %> + + + <% if current_user.admin? then %><% end %> + + <% if current_user.admin? then %><% end %> + + + + + + + + + <% end %> +<% end %> +
NameEmailCertificationsOrientation?Card?Pmt MethodDesired LevelLast PaymentJoined
<%= image_tag user.gravatar_url(:default => "http://members.heatsynclabs.org/assets/nil.png"), :class => :avatar %><%= link_to user.name, user %><%= user.email %><% user.certifications.each do |c| %> + <%= link_to c.name, c %><%= "," unless c.id == user.certifications.last.id %> + <% end %> + <%= unless user.orientation.blank? then raw("") end %> + <%= unless user.cards.blank? then raw("") end %><%= user.payment_method %><%= user.member_level %><% delinquency = user.delinquency %> + <% if delinquency == 9999 %> + No Payments + <% else %> + <%= (delinquency/30).to_s+" mo. ago" %> + <% end %> + <%= user.created_at.to_date %><%= link_to 'Edit', edit_user_path(user) if can? :update, user %><%= link_to 'Destroy', user, :confirm => 'Are you sure? WARNING: THIS DOES NOT REMOVE THE USER FROM THE DOOR SYSTEM! DISABLE THEM FIRST.', :method => :delete if can? :destroy, user %>
+ +<% if current_user.orientation.blank? then %> +

There's a lot more to see here, but our records show you haven't completed the new member orientation yet. If that's incorrect, please contact a volunteer.

+<% end %> + +
diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 19a48e2..bcbff58 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -6,6 +6,9 @@ <% if can? :manage, User %> | <%= link_to 'Merge Users', users_merge_path %> <% end %> +<% if current_user.admin? %> + | <%= link_to 'Inactive Users', users_inactive_path %> +<% end %> diff --git a/config/routes.rb b/config/routes.rb index ba34d4d..46ceb98 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,6 +28,7 @@ Dooraccess::Application.routes.draw do match 'user_summary/:id' => 'users#user_summary' # User summary view match 'users/merge' => 'users#merge_view', :via => :get # Merge view match 'users/merge' => 'users#merge_action', :via => :post # Merge action + match 'users/inactive' => 'users#inactive' # Inactive users report resources :users match 'users/create' => 'users#create', :via => :post # Use POST users/create instead of POST users to avoid devise conflict