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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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