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 +8 -8
- data/app/controllers/membership_types_controller.rb +10 -0
- data/app/controllers/store/memberships_controller.rb +5 -0
- data/app/helpers/membership_types_helper.rb +5 -0
- data/app/models/daily_membership_report.rb +7 -1
- data/app/models/job/daily_email_report_job.rb +14 -8
- data/app/models/membership.rb +5 -2
- data/app/models/membership_type.rb +18 -0
- data/app/models/organization.rb +1 -0
- data/app/models/rolling_membership_type.rb +1 -1
- data/app/views/membership_types/_form.html.haml +2 -2
- data/app/views/membership_types/_seasonal_membership_type_form.html.haml +2 -2
- data/app/views/membership_types/index.html.haml +5 -2
- data/app/views/reports_mailer/daily.html.haml +12 -1
- data/config/routes.rb +1 -1
- data/lib/artfully_ose/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGY4ZWY4MTE4YWM2NTg5NzRkNzllNTU3MjU4OGUzMGY2ODliOTJmZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWJkOTk4MmVmNDIxOTgzMGM4MjY0NDZkNDI1ODc4ZjhjZjVhZTA5NA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjQ4YTNiMDk1ZDBhNGNiNmM0Yjk1MzQzZDE4ZTA3NmM4MWQwZGU2ZTBiNzQx
|
10
|
+
MWZmMDA0MDVkYjJmYjdiYjg1OWZmNjAwM2JlMzI0NmVmZmU5MDg3NGRjOTZl
|
11
|
+
OGQzMmIzNTY5NDUxZDlkZGQ3ZmRjMTI5ZjdkNzE0NzRiZTdkM2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
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,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
|
-
|
12
|
-
|
13
|
-
|
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
|
data/app/models/membership.rb
CHANGED
@@ -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 > ?",
|
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
|
data/app/models/organization.rb
CHANGED
@@ -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, "
|
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
|
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"
|
data/config/routes.rb
CHANGED
@@ -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
|
data/lib/artfully_ose/version.rb
CHANGED
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.
|
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-
|
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
|