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 +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
|