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 @@
+ | Name | + <% if current_user.admin? then %>Certifications | + <% if current_user.admin? then %> +Orientation? | + <% end %> +Card? | +Pmt Method | +Desired Level | +Last Payment | +Joined | ++ | + | |
---|---|---|---|---|---|---|---|---|---|---|---|
<%= image_tag user.gravatar_url(:default => "http://members.heatsynclabs.org/assets/nil.png"), :class => :avatar %> | +<%= link_to user.name, user %> | + <% if current_user.admin? then %><%= user.email %> | <% end %> +<% user.certifications.each do |c| %> + <%= link_to c.name, c %><%= "," unless c.id == user.certifications.last.id %> + <% end %> | + <% if current_user.admin? then %>+ <%= unless user.orientation.blank? then raw("✓") end %> + | <% 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 %> | +
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 %> + +