artfully_ose 1.2.0.pre.12 → 1.2.0.pre.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzI1NWEzY2JhNjA1YmIwZDkwMDUxYTQ0MWEwYzE2NThlYWNiYzRlNg==
4
+ ZGY4ZWY4MTE4YWM2NTg5NzRkNzllNTU3MjU4OGUzMGY2ODliOTJmZA==
5
5
  data.tar.gz: !binary |-
6
- Njg3YTczYWY1OWE1YTZmOWY2NjIwMzc5NTM1NDY2MTA3NGU4ZjEzZg==
6
+ MWJkOTk4MmVmNDIxOTgzMGM4MjY0NDZkNDI1ODc4ZjhjZjVhZTA5NA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- M2YwMGEyYzE2ZWZiNDljZTFiMjQ0ZjU0ZTNhMjY5NjgzNjE4MDkyNTBkZjJj
10
- YjE3M2U3MWNlMDNhZjczNTVkN2Y4M2FhYTkwMjI0ZGI2YzAxOTJhNmVmMTlk
11
- MzIyOTljMjZjZjNiNTIwNTUwNDA5MGUwN2Y0NTM1NDQyZGQ3Y2E=
9
+ NjQ4YTNiMDk1ZDBhNGNiNmM0Yjk1MzQzZDE4ZTA3NmM4MWQwZGU2ZTBiNzQx
10
+ MWZmMDA0MDVkYjJmYjdiYjg1OWZmNjAwM2JlMzI0NmVmZmU5MDg3NGRjOTZl
11
+ OGQzMmIzNTY5NDUxZDlkZGQ3ZmRjMTI5ZjdkNzE0NzRiZTdkM2I=
12
12
  data.tar.gz: !binary |-
13
- OWNmOGU5OGQ1NTVhNTliZTU1NTY1ZDllOWY4NzJmYjUzMGZmOTkxOTEzNTcy
14
- ZjQ4Mjc0MzU1NDY0ZjBhMjViNjE3Y2M2MWFmOGYxZjFkYmNlOGEzODg4ZTU3
15
- MWFjYzk0N2RlM2NiMDc3MzAyYmJmMGFlZDIyZGM4MmI4ZmQ4YWM=
13
+ YjUxOTc2YTE5ODBjZDFlYTBjNmY3YWQwMzJhZGY0ZDMzZTM2OWMwYzgyMDc3
14
+ MjRlOTE3ZGUyZjMwMGU2ZjQ0NWRmNDRkOTU1MjYwYTA1ZTkwOGEwNTUyMjg4
15
+ ZmY5ZTcxOGU0Mzk4YzI5MWE0NTkyZjhiYzZjMmUwZTZhMmJkM2U=
@@ -1,6 +1,16 @@
1
1
  class MembershipTypesController < ArtfullyOseController
2
2
  def index
3
3
  @membership_types = current_organization.membership_types.paginate(:page => params[:page], :per_page => 50)
4
+
5
+ respond_to do |format|
6
+ format.html
7
+
8
+ format.csv do
9
+ @filename = 'membership_types.csv'
10
+ @csv_string = @membership_types.to_comma
11
+ send_data @csv_string, :filename => @filename, :type => 'text/csv', :disposition => 'attachment'
12
+ end
13
+ end
4
14
  end
5
15
 
6
16
  def new
@@ -1,4 +1,9 @@
1
1
  class Store::MembershipsController < Store::StoreController
2
+ def show
3
+ @membership_types = [MembershipType.find(params[:id])]
4
+ render :index
5
+ end
6
+
2
7
  def index
3
8
  @membership_types = store_organization.membership_types.storefront
4
9
  end
@@ -0,0 +1,5 @@
1
+ module MembershipTypesHelper
2
+ def membership_type_storefront_path(membership_type)
3
+ url_for(organization_slug: membership_type.organization.cached_slug, controller: 'store/memberships', action: 'show', id: membership_type.id)
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  class DailyMembershipReport
2
- attr_accessor :rows, :start_date, :organization
2
+ attr_accessor :rows, :start_date, :organization, :lapsed_memberships
3
3
  extend ::ArtfullyOseHelper
4
4
 
5
5
  def initialize(organization, date=nil)
@@ -19,6 +19,12 @@ class DailyMembershipReport
19
19
  @rows << Row.new(order.items.select {|item| item.product.membership_type.name == membership_type_name})
20
20
  end
21
21
  end
22
+
23
+ @lapsed_memberships = organization.memberships.lapsed(@end_date, @start_date)
24
+ end
25
+
26
+ def send?
27
+ self.rows.any? || self.lapsed_memberships.any?
22
28
  end
23
29
 
24
30
  def total
@@ -3,18 +3,24 @@ class DailyEmailReportJob
3
3
 
4
4
  date ||= 1.day.ago
5
5
 
6
+ Organization.where(:id => organization_ids_to_email(date)).receiving_sales_email.each do |org|
7
+ tickets = DailyTicketReport.new(org, date)
8
+ donations = DailyDonationReport.new(org, date)
9
+ membership_report = DailyMembershipReport.new(org, date)
10
+
11
+ next if tickets.rows.empty? && donations.rows.empty? && tickets.exchange_rows.empty? && !membership_report.send?
12
+ ReportsMailer.daily(tickets, donations, membership_report).deliver
13
+ end
14
+ end
15
+
16
+ def organization_ids_to_email(date)
6
17
  #
7
18
  # We have to go back two days here intentionally to account for orgs across different time zones
8
19
  # We'll re-select the correct orders in the respective jobs
9
20
  #
10
21
  org_ids = Order.csv_not_imported.after(date-1.day).before(DateTime.now).pluck(:organization_id).uniq
11
- Organization.where(:id => org_ids).receiving_sales_email.each do |org|
12
- tickets = DailyTicketReport.new(org, date)
13
- donations = DailyDonationReport.new(org, date)
14
- memberships = DailyMembershipReport.new(org, date)
15
-
16
- next if tickets.rows.empty? && donations.rows.empty? && tickets.exchange_rows.empty? && memberships.rows.empty?
17
- ReportsMailer.daily(tickets, donations, memberships).deliver
18
- end
22
+ orgs_with_lapsed_memberships = Membership.lapsed.pluck(:organization_id).uniq
23
+ org_ids = (org_ids + orgs_with_lapsed_memberships).uniq
24
+ org_ids
19
25
  end
20
26
  end
@@ -11,8 +11,12 @@ class Membership < ActiveRecord::Base
11
11
  after_destroy :update_member_counters
12
12
  after_update :update_member_counters
13
13
 
14
+ #
15
+ # Make sure you're scoping when you use these.
16
+ # organization.memberships.lapsed
17
+ #
14
18
  scope :current, lambda { |time = Time.now| where("ends_at > ?", time) }
15
- scope :lapsed, lambda { |time = Time.now| where("ends_at < ?", time).where("ends_at > ?", time - 1.year) }
19
+ scope :lapsed, lambda { |time = Time.now, since = (time - 1.year)| where("ends_at < ?", time).where("ends_at > ?", since.midnight) }
16
20
  scope :past, lambda { |time = Time.now| where("ends_at < ?", time - 1.year) }
17
21
 
18
22
  def self.for(membership_type)
@@ -41,7 +45,6 @@ class Membership < ActiveRecord::Base
41
45
  end
42
46
  end
43
47
 
44
-
45
48
  def adjust_expiration_to(new_ends_at)
46
49
  self.ends_at = new_ends_at
47
50
  self.save
@@ -15,6 +15,24 @@ class MembershipType < ActiveRecord::Base
15
15
  scope :storefront, where(:on_sale => true).where("sales_start_at < ? or sales_start_at is null", DateTime.now).where("sales_end_at > ? or sales_end_at is null", DateTime.now)
16
16
  scope :on_sale, where(:on_sale => true)
17
17
 
18
+ comma do
19
+ name
20
+ description
21
+ price
22
+ fee
23
+ number_of_tickets
24
+ type
25
+ members { |m| m.count }
26
+ duration
27
+ period
28
+ starts_at
29
+ ends_at
30
+ on_sale
31
+ sales_start_at
32
+ sales_end_at
33
+ end
34
+
35
+
18
36
  def membershipize
19
37
  self.name.end_with?("Membership") ? self.name : self.name + " Membership"
20
38
  end
@@ -20,6 +20,7 @@ class Organization < ActiveRecord::Base
20
20
  has_many :items
21
21
 
22
22
  has_many :membership_types
23
+ has_many :memberships
23
24
  has_many :members
24
25
  has_many :searches
25
26
 
@@ -4,6 +4,6 @@ class RollingMembershipType < MembershipType
4
4
  end
5
5
 
6
6
  def ends_at
7
- DateTime.now + (self.duration.send(self.period))
7
+ DateTime.now + (self.duration.send(self.period.downcase))
8
8
  end
9
9
  end
@@ -35,8 +35,8 @@
35
35
  = f.text_field :sales_end_at, :value => "#{(l @membership_type.sales_end_at, :format => :date_for_input) unless @membership_type.sales_end_at.nil?}", :class => :datepicker
36
36
 
37
37
  .control-group
38
- = f.label :on_sale, "Show On Storefront", :class => 'control-label'
39
- .controls
38
+ = f.label :on_sale, "Show On Storefront", :class => 'control-label'
39
+ .controls
40
40
  %label
41
41
  = f.check_box :on_sale
42
42
  .form-actions
@@ -1,8 +1,8 @@
1
1
  .control-group
2
- = f.label :starts_at, "Mebership Begins", :class => 'control-label'
2
+ = f.label :starts_at, "Membership Begins", :class => 'control-label'
3
3
  .controls
4
4
  = f.text_field :starts_at, :value => "#{(l @membership_type.starts_at, :format => :date_for_input) unless @membership_type.starts_at.nil?}", :class => :datepicker
5
5
  .control-group
6
6
  = f.label :ends_at, "Membership Ends", :class => 'control-label'
7
7
  .controls
8
- = f.text_field :ends_at, :value => "#{(l @membership_type.ends_at, :format => :date_for_input) unless @membership_type.ends_at.nil?}", :class => :datepicker
8
+ = f.text_field :ends_at, :value => "#{(l @membership_type.ends_at, :format => :date_for_input) unless @membership_type.ends_at.nil?}", :class => :datepicker
@@ -4,7 +4,7 @@
4
4
  .row.bottom-room
5
5
  .pull-right
6
6
  =icon_link_to("New Membership Type", new_membership_type_path, 'icon-plus', 'btn','')
7
- =link_to "Download CSV", "", :class => "btn"
7
+ =link_to "Download CSV", membership_types_path(:format => "csv"), :class => "btn"
8
8
 
9
9
  %table.table
10
10
  %tr
@@ -14,6 +14,7 @@
14
14
  %th.right Price
15
15
  %th.right Fee
16
16
  %th.right On Storefront
17
+ %th.right
17
18
  -@membership_types.each do |membership_type|
18
19
  %tr
19
20
  %td=link_to membership_type.name, edit_membership_type_path(membership_type)
@@ -22,4 +23,6 @@
22
23
  %td.right=number_as_cents membership_type.price
23
24
  %td.right=number_as_cents membership_type.fee
24
25
  %td.right
25
- =check_mark if membership_type.on_sale?
26
+ =check_mark if membership_type.on_sale?
27
+ %td.right
28
+ = link_to('Store link', membership_type_storefront_path(membership_type)) if membership_type.on_sale?
@@ -87,7 +87,18 @@
87
87
  %td=row.membership
88
88
  %td.total= row.total
89
89
  - else
90
- %p There were no memberhsips purchased.
90
+ %p There were no memberships purchased.
91
+
92
+ - if @memberships.lapsed_memberships.any?
93
+ %h3 Membership Lapses
94
+ %table.tabular-data{:cellspacing => "0"}
95
+ %tr
96
+ %th.customer Customer
97
+ %th Membership
98
+ - @memberships.lapsed_memberships.each do |membership_lapse|
99
+ %tr
100
+ %td.order-number= link_to membership_lapse.member.person, person_url(membership_lapse.member.person)
101
+ %td=membership_lapse.membership_type.name
91
102
 
92
103
  - content_for :footer do
93
104
  = render :partial => "fine_print"
@@ -14,7 +14,7 @@ Rails.application.routes.draw do
14
14
  scope ':organization_slug' do
15
15
  namespace :store do
16
16
  resources :events, :only => [:show, :index]
17
- resources :memberships, :only => :index
17
+ resources :memberships, :only => [:show, :index]
18
18
  resources :rolling_membership_types, :controller => :membership_types
19
19
  resources :seasonal_membership_types, :controller => :membership_types
20
20
  resources :shows, :only => :show
@@ -1,3 +1,3 @@
1
1
  module ArtfullyOse
2
- VERSION = "1.2.0.pre.12"
2
+ VERSION = "1.2.0.pre.15"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artfully_ose
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.pre.12
4
+ version: 1.2.0.pre.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artful.ly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-29 00:00:00.000000000 Z
11
+ date: 2013-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -1912,6 +1912,7 @@ files:
1912
1912
  - app/helpers/imports_helper.rb
1913
1913
  - app/helpers/link_helper.rb
1914
1914
  - app/helpers/members_helper.rb
1915
+ - app/helpers/membership_types_helper.rb
1915
1916
  - app/helpers/people_helper.rb
1916
1917
  - app/mailers/order_mailer.rb
1917
1918
  - app/mailers/producer_mailer.rb