artfully_ose 1.2.0.pre.19 → 1.2.0.pre.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +28 -0
  3. data/app/assets/javascripts/change-membership.js +66 -16
  4. data/app/assets/javascripts/store/store.js +4 -0
  5. data/app/assets/stylesheets/sass/store.sass +2 -0
  6. data/app/{models/carts → concerns}/cart_finder.rb +0 -0
  7. data/app/{models/actions → concerns}/immutable_action.rb +0 -0
  8. data/app/concerns/pdf_generation.rb +71 -0
  9. data/app/{models/orders → concerns}/unrefundable.rb +0 -0
  10. data/app/controllers/export_controller.rb +1 -5
  11. data/app/controllers/imports_controller.rb +12 -0
  12. data/app/controllers/members/index_controller.rb +1 -1
  13. data/app/controllers/members/members_controller.rb +6 -1
  14. data/app/controllers/members/passwords_controller.rb +10 -0
  15. data/app/controllers/members/people_controller.rb +17 -0
  16. data/app/controllers/membership_cancellations_controller.rb +46 -0
  17. data/app/controllers/membership_comps_controller.rb +97 -0
  18. data/app/controllers/membership_types_controller.rb +6 -2
  19. data/app/controllers/people_controller.rb +15 -3
  20. data/app/controllers/sales_controller.rb +4 -0
  21. data/app/controllers/searches_controller.rb +2 -2
  22. data/app/controllers/sections_controller.rb +1 -1
  23. data/app/controllers/shows_controller.rb +52 -3
  24. data/app/controllers/store/checkouts_controller.rb +2 -7
  25. data/app/controllers/store/memberships_controller.rb +2 -1
  26. data/app/helpers/artfully_ose_helper.rb +4 -3
  27. data/app/mailers/order_mailer.rb +3 -3
  28. data/app/models/actions/comp_action.rb +15 -0
  29. data/app/models/address.rb +7 -0
  30. data/app/models/{carts/cart.rb → cart.rb} +0 -19
  31. data/app/models/checkout.rb +53 -15
  32. data/app/models/comp.rb +21 -11
  33. data/app/models/database_views/item_view.rb +4 -0
  34. data/app/models/event.rb +1 -0
  35. data/app/models/{ext/ext.rb → ext.rb} +14 -1
  36. data/app/models/ext/preprocessor.rb +6 -0
  37. data/app/models/job/order_processor.rb +6 -3
  38. data/app/models/job/show_creator.rb +6 -2
  39. data/app/models/kit.rb +1 -1
  40. data/app/models/kits/membership_kit.rb +8 -1
  41. data/app/models/kits/scannable_tickets_kit.rb +24 -0
  42. data/app/models/member.rb +59 -13
  43. data/app/models/membership.rb +2 -14
  44. data/app/models/membership_cancellation.rb +80 -0
  45. data/app/models/membership_comp.rb +103 -0
  46. data/app/models/membership_comp_job.rb +32 -0
  47. data/app/models/membership_type.rb +3 -3
  48. data/app/models/{orders/order.rb → order.rb} +8 -2
  49. data/app/models/orders/comp_order.rb +4 -0
  50. data/app/models/organization.rb +5 -1
  51. data/app/models/{payments/payment.rb → payment.rb} +12 -1
  52. data/app/models/payments/credit_card_payment.rb +36 -5
  53. data/app/models/person.rb +11 -1
  54. data/app/models/rolling_membership_type.rb +3 -1
  55. data/app/models/sale.rb +1 -1
  56. data/app/models/search.rb +1 -6
  57. data/app/models/seasonal_membership_type.rb +1 -0
  58. data/app/models/ticket.rb +2 -0
  59. data/app/models/ticket/qr_code.rb +1 -1
  60. data/app/models/ticket/transfers.rb +6 -3
  61. data/app/models/ticket_type.rb +6 -0
  62. data/app/models/user.rb +2 -1
  63. data/app/views/addresses/_address.html.haml +7 -6
  64. data/app/views/events/_ticket_type_fields.html.haml +2 -2
  65. data/app/views/imports/index.html.haml +2 -1
  66. data/app/views/layouts/_menu.html.haml +3 -2
  67. data/app/views/layouts/storefront.html.haml +17 -13
  68. data/app/views/members/index/index.html.haml +5 -11
  69. data/app/views/members/invitations/edit.html.haml +17 -0
  70. data/app/views/members/mailer/_invitation_body.html.haml +18 -0
  71. data/app/views/members/mailer/invitation_instructions.html.haml +6 -12
  72. data/app/views/members/mailer/reset_password_instructions.html.erb +8 -0
  73. data/app/views/members/passwords/edit.html.haml +18 -0
  74. data/app/views/members/sessions/new.html.haml +19 -0
  75. data/app/views/membership_cancellations/_form.html.haml +39 -0
  76. data/app/views/membership_cancellations/_modal.html.haml +2 -0
  77. data/app/views/membership_cancellations/_processing.html.haml +14 -0
  78. data/app/views/membership_cancellations/create.js.erb +3 -0
  79. data/app/views/membership_cancellations/new.js.erb +3 -0
  80. data/app/views/membership_comps/confirm.html.haml +85 -0
  81. data/app/views/membership_comps/create.html.haml +18 -0
  82. data/app/views/membership_comps/new.html.haml +82 -0
  83. data/app/views/membership_mailer/cancellation_confirmation.html.haml +9 -0
  84. data/app/views/membership_mailer/cancellation_confirmation.text.haml +6 -0
  85. data/app/views/membership_mailer/refund_problem.html.haml +18 -0
  86. data/app/views/membership_mailer/refund_problem.text.haml +14 -0
  87. data/app/views/membership_types/_form.html.haml +18 -53
  88. data/app/views/membership_types/_membership_type_fees.html.haml +0 -0
  89. data/app/views/membership_types/index.html.haml +1 -5
  90. data/app/views/memberships/_membership_scripts.js.erb +15 -0
  91. data/app/views/memberships/index.html.haml +18 -17
  92. data/app/views/order_mailer/confirmation_for.html.haml +8 -0
  93. data/app/views/orders/_order_sidebar.html.haml +1 -3
  94. data/app/views/organizations/_form.html.haml +6 -0
  95. data/app/views/pdfs/member.html.haml +66 -0
  96. data/app/views/pdfs/order.html.haml +84 -0
  97. data/app/views/people/_comp_membership.html.haml +23 -0
  98. data/app/views/people/_edit_modal.html.haml +6 -3
  99. data/app/views/people/show.html.haml +1 -2
  100. data/app/views/searches/_form.html.haml +34 -33
  101. data/app/views/searches/show.html.haml +4 -1
  102. data/app/views/segments/show.html.haml +4 -1
  103. data/app/views/shows/_ticket_table.html.haml +1 -1
  104. data/app/views/shows/index.html.haml +8 -2
  105. data/app/views/store/checkouts/_membership_info.html.haml +1 -0
  106. data/app/views/store/checkouts/thanks.html.haml +7 -3
  107. data/app/views/store/events/index.html.haml +9 -3
  108. data/app/views/store/events/single_show.html.haml +4 -1
  109. data/app/views/store/memberships/index.html.haml +2 -1
  110. data/app/views/store/orders/show.html.haml +2 -2
  111. data/config/initializers/devise.rb +1 -1
  112. data/config/initializers/paperclip.rb +39 -0
  113. data/config/locales/devise_invitable.en.yml +1 -1
  114. data/config/locales/en.yml +9 -0
  115. data/config/routes.rb +14 -7
  116. data/db/migrate/20131223215615_goodbye_order_view.rb +6 -0
  117. data/db/migrate/20140114011856_add_welcome_message_to_memberships.rb +5 -0
  118. data/db/migrate/20140114212127_add_send_email_to_memberships.rb +5 -0
  119. data/db/migrate/20140125183606_index_memberships_and_types.rb +6 -0
  120. data/db/migrate/20140128213101_add_pdf_to_members.rb +5 -0
  121. data/db/migrate/20140128223140_add_uuid_to_member.rb +6 -0
  122. data/db/migrate/20140128223948_add_qr_code_to_member.rb +9 -0
  123. data/lib/artfully_ose/common_abilities.rb +1 -1
  124. data/lib/artfully_ose/engine.rb +23 -2
  125. data/lib/artfully_ose/version.rb +1 -1
  126. data/spec/factories/action_factories.rb +19 -0
  127. data/spec/factories/address_factories.rb +11 -0
  128. data/spec/factories/cart_factories.rb +26 -0
  129. data/spec/factories/chart_factories.rb +52 -0
  130. data/spec/factories/discount_factories.rb +11 -0
  131. data/spec/factories/donation_factories.rb +14 -0
  132. data/spec/factories/event_factories.rb +29 -0
  133. data/spec/factories/import_factories.rb +61 -0
  134. data/spec/factories/item_factories.rb +51 -0
  135. data/spec/factories/kit_factories.rb +27 -0
  136. data/spec/factories/member_factories.rb +19 -0
  137. data/spec/factories/membership_factories.rb +8 -0
  138. data/spec/factories/membership_type_factories.rb +18 -0
  139. data/spec/factories/order_factories.rb +40 -0
  140. data/spec/factories/organization_factories.rb +44 -0
  141. data/spec/factories/payments_factories.rb +97 -0
  142. data/spec/factories/person_factories.rb +44 -0
  143. data/spec/factories/phone_factories.rb +6 -0
  144. data/spec/factories/section_factories.rb +21 -0
  145. data/spec/factories/segment_factories.rb +6 -0
  146. data/spec/factories/show_factories.rb +33 -0
  147. data/spec/factories/ticket_factories.rb +57 -0
  148. data/spec/factories/ticket_offer_factories.rb +16 -0
  149. data/spec/factories/ticket_type_factories.rb +8 -0
  150. data/spec/factories/user_factories.rb +24 -0
  151. metadata +75 -17
  152. data/app/controllers/membership_awards_controller.rb +0 -60
  153. data/app/models/database_views/order_view.rb +0 -34
  154. data/app/models/membership_award.rb +0 -24
  155. data/app/models/orders/pdf_generation.rb +0 -75
  156. data/app/views/members/invitations/edit.html.erb +0 -14
  157. data/app/views/membership_awards/confirm.html.haml +0 -105
  158. data/app/views/membership_awards/create.html.haml +0 -1
  159. data/app/views/membership_awards/new.html.haml +0 -79
@@ -0,0 +1,14 @@
1
+ ="Refund Failed"
2
+ ="-------------"
3
+
4
+ Order number: #{@order.id}
5
+ Refund total: -$#{format("%.2f", @amount)}
6
+
7
+ - unless @items.empty?
8
+ There was a problem while attempting to issue a refund for these memberships:
9
+
10
+ - @items.each do |item|
11
+ =" * #{item.product.membership_type.name}"
12
+
13
+ Message:
14
+ =" #{@message}"
@@ -5,12 +5,12 @@
5
5
  .control-group
6
6
  = f.label :name, "Name", :class => 'control-label'
7
7
  .controls
8
- = f.text_field :name, :class => 'input'
8
+ = f.text_field :name, :class => 'input span6'
9
9
  .control-group
10
10
  = f.label :description, "Description", :class => 'control-label'
11
11
  .controls
12
- = f.text_area :description, :rows => "5"
13
- .control-group
12
+ = f.text_area :description, :rows => "5", :class => "span6"
13
+ .control-group{:style => "display: none"}
14
14
  = f.label :number_of_tickets, "Number of Tickets", :class => 'control-label'
15
15
  .controls
16
16
  = f.text_field :number_of_tickets, :class => "span1"
@@ -21,14 +21,7 @@
21
21
  .control-group
22
22
  = f.label :price, "Price", :class => 'control-label'
23
23
  .controls
24
- = f.text_field :price, :class => 'input-small section-price currency'
25
-
26
- .control-group
27
- =f.label :hide_fee, "Hide service fee?", :class => 'control-label'
28
- .controls
29
- = f.select :hide_fee, options_for_select([["Yes", true], ["No", false]]), {}, :class => 'span1'
30
- %br
31
- =link_to "Learn more", "#pricing-example", "data-toggle" => "modal"
24
+ = f.text_field :price, :class => 'span2 section-price currency'
32
25
 
33
26
  .control-group
34
27
  = f.label :offer_renewal, "Offer renewal price?", :class => 'control-label'
@@ -39,55 +32,24 @@
39
32
  .control-group#renewal-price-group
40
33
  = f.label :renewal_price, "Renewal Price", :class => 'control-label'
41
34
  .controls
42
- = f.text_field :renewal_price, :class => 'input-small section-price currency'
43
-
44
- #pricing-example.modal
45
- .modal-header
46
- .close{'data-dismiss'=>'modal'} x
47
- %h3 Pricing Example
48
- .modal-body
49
- %table.table.table-compact
50
- %tr
51
- %th
52
- %th.right Hidden fee
53
- %th.right Shown fee
54
- %tr
55
- %td Membership price
56
- %td.right $100
57
- %td.right $100
58
- %tr
59
- %td Patron pays
60
- %td.right $100
61
- %td.right $100 + 5% service = $105
62
- %tr
63
- %td You receive
64
- %td.right
65
- $100
66
- %br
67
- ="- 5% service"
68
- %br
69
- ="- 3.5% processing"
70
- %br
71
- ="$91.68"
72
- %td.right $100 - 3.5% processing = $96.5
73
- .modal-footer
74
- = button_tag "Close", :class => "btn", 'data-dismiss' => 'modal'
35
+ = f.text_field :renewal_price, :class => 'span2 section-price currency'
75
36
 
37
+ =render :partial => "membership_type_fees", :locals => {:f => f}
76
38
 
77
- / .control-group
78
- / = f.label :fee, "Member Fee", :class => 'control-label'
79
- / .controls
80
- / = f.text_field :fee, :class => 'input-small section-price currency'
81
39
  %fieldset
82
40
  %legend Storefront Copy
83
41
  .control-group
84
- = f.label :thanks_copy, "Thanks Message", :class => 'control-label'
42
+ = f.label :thanks_copy, :class => 'control-label' do
43
+ Thanks Message
44
+ .tip.muted Thanks message will appear on the confirmation page after the patron completes purchase of the membership
85
45
  .controls
86
- = f.text_area :thanks_copy, :rows => "5"
46
+ = f.text_area :thanks_copy, :rows => "5", :class => "span6"
87
47
  .control-group
88
- = f.label :invitation_email_text_copy, "Email Message", :class => 'control-label'
48
+ = f.label :invitation_email_text_copy, :class => 'control-label' do
49
+ Email Message
50
+ .tip.muted Email message will appear in the email confirming the patron's membership
89
51
  .controls
90
- = f.text_area :invitation_email_text_copy, :rows => "5"
52
+ = f.text_area :invitation_email_text_copy, :rows => "5", :class => "span6"
91
53
 
92
54
  %fieldset
93
55
  %legend Sales
@@ -101,7 +63,10 @@
101
63
  = 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
102
64
 
103
65
  .control-group
104
- = f.label :on_sale, "Show On Storefront", :class => 'control-label'
66
+ = f.label :on_sale, :class => 'control-label' do
67
+ Show On Storefront
68
+ .tip.muted If checked, this will be available on your
69
+ =link_to "Membership Storefront", store_memberships_path(current_user.current_organization.cached_slug), :target => "_blank"
105
70
  .controls
106
71
  %label
107
72
  = f.check_box :on_sale
@@ -6,14 +6,12 @@
6
6
  =icon_link_to("New Membership Type", new_membership_type_path, 'icon-plus', 'btn','')
7
7
  =link_to "Download CSV", membership_types_path(:format => "csv"), :class => "btn"
8
8
 
9
- %table.table
9
+ %table.table#membership-types-table
10
10
  %tr
11
11
  %th Name
12
12
  %th.right # Sold
13
13
  %th.right Members
14
- %th.right Tickets
15
14
  %th.right Price
16
- %th.right Fee
17
15
  %th.right Visibility
18
16
  %th.right
19
17
  -@membership_types.each do |membership_type|
@@ -21,9 +19,7 @@
21
19
  %td=link_to membership_type.name, edit_membership_type_path(membership_type)
22
20
  %td.right=membership_type.memberships.count
23
21
  %td.right=link_to membership_type.members.count, segment_path(membership_type.segment)
24
- %td.right=membership_type.number_of_tickets || "unlimited"
25
22
  %td.right=number_as_cents membership_type.price
26
- %td.right=number_as_cents membership_type.fee
27
23
  %td.right
28
24
  %a{:href => "#", :class => "artfully-tooltip", :rel => "tooltip", "data-original-title" => "This membership is currently #{"not" unless membership_type.on_sale?} visible in your online Storefront.", "data-trigger" => "hover"}
29
25
  %span.badge{:class => "#{'badge-success' if membership_type.on_sale?}"}="S"
@@ -0,0 +1,15 @@
1
+ <% content_for :custom_js do %>
2
+ <script type="text/javascript" charset="utf-8">
3
+ angular.module('artfully').factory('Memberships', function() {
4
+ var self = this;
5
+
6
+ this.personId = function() {
7
+ return <%= j(@person.id.to_s) %>;
8
+ };
9
+
10
+ return {
11
+ personId: this.personId
12
+ }
13
+ });
14
+ </script>
15
+ <% end %>
@@ -8,24 +8,27 @@
8
8
  .span12
9
9
  .row-fluid
10
10
  .span6
11
- %ul.in-table
11
+ %ul.in-table{'ng-controller' => 'MembershipActionsCtrl'}
12
12
  %li.dropdown{:id => "#menu#bulkactions"}
13
13
  =icon_link_to('Work with...', "#menu#bulkactions", 'icon-asterisk', 'dropdown-toggle dropdown btn', '')
14
+ =image_tag "loading.gif", :class => 'loading-indicator', 'ng-show' => 'loading'
15
+ .alert{'ng-show' => 'error'}
16
+ %button.close{'ng-click' => 'error = false'}
17
+ &times;
18
+ ='{{errorMessage}}'
14
19
  %ul.dropdown-menu
15
- %li
16
- = link_to "Full Refund", "#full-refund", 'data-toggle' => 'modal'
17
- %li
18
- = link_to "Partial Refund", "#partial-refund", 'data-toggle' => 'modal'
20
+ -# %li= link_to "Full Refund", "#full-refund", 'data-toggle' => 'modal'
21
+ -# %li= link_to "Partial Refund", "#partial-refund", 'data-toggle' => 'modal'
19
22
  %li
20
23
  = link_to "Change Expiration", "#extend", 'data-toggle' => 'modal'
21
24
  %li
22
- = link_to "Change Membership Type", "#change", 'ng-controller' => 'ChangeMembershipController', 'ng-click' => 'changeSelected($event)'
25
+ = link_to "Change Membership Type", "#change", 'ng-click' => 'change($event)'
23
26
  %li
24
- = link_to "Cancel Membership", "#cancel", 'data-toggle' => 'modal'
27
+ = link_to "Cancel Membership", "#cancel", 'ng-click' => 'cancel($event)'
25
28
  .span6.right
26
29
  = icon_link_to("View Record", person_path(@person), 'icon-share-alt', 'btn', '')
27
- = link_to "Log In", "#", 'data-toggle' => 'modal', :class => 'btn'
28
- = link_to "Reset Password", "#", 'data-toggle' => 'modal', :class => 'btn btn-danger'
30
+ -# = link_to "Log In", "#", 'data-toggle' => 'modal', :class => 'btn'
31
+ = link_to "Reset Password", "#reset-password-modal", 'data-toggle' => 'modal', :class => 'btn btn-danger'
29
32
 
30
33
  =form_tag bulk_update_person_memberships_path(@person), :method => :post do
31
34
  #items
@@ -37,7 +40,6 @@
37
40
  %th Starts
38
41
  %th Expires
39
42
  %th.right Price Paid
40
- %th.right Fee
41
43
  %tbody
42
44
  - @person.memberships.each do |membership|
43
45
  - if membership.expired?
@@ -47,7 +49,6 @@
47
49
  %td.starts-at=l membership.starts_at, :format => :slashed_date
48
50
  %td.ends-at=l membership.ends_at, :format => :slashed_date
49
51
  %td.price.right=number_as_cents membership.sold_price
50
- %td.fee.right TODO
51
52
  - else
52
53
  %tr
53
54
  %td.grouped-checkbox= check_box_tag "membership_ids[]", membership.id, false, :id => "membership_id_#{membership.id}"
@@ -55,7 +56,6 @@
55
56
  %td.starts-at=l membership.starts_at, :format => :slashed_date
56
57
  %td.ends-at=l membership.ends_at, :format => :slashed_date
57
58
  %td.price.right=number_as_cents membership.sold_price
58
- %td.fee.right TODO
59
59
 
60
60
  - if @expired_count > 0
61
61
  = link_to "See #{@expired_count} lapsed & expired memberships", '#', 'ng-show' => '!scope.showExpired', 'ng-click' => 'scope.showExpired = true'
@@ -157,12 +157,13 @@
157
157
  =link_to "Process Refund", "#", :class => "btn btn-success", 'data-dismiss'=>'modal'
158
158
  =link_to "Cancel", "#", :class => "btn btn-danger", 'data-dismiss'=>'modal'
159
159
 
160
- #cancel.modal
160
+ #reset-password-modal.modal
161
161
  .modal-header
162
162
  .close{'data-dismiss'=>'modal'} x
163
- %h3 Cancel Membership
163
+ %h3 Reset Password
164
164
  .modal-body
165
- %p="These memberships will be cancelled."
165
+ %p="This member will receive an email with a link to reset their password so they can log in to their member dashboard."
166
166
  .modal-footer
167
- =link_to "Cancel Memberhships", "#", :class => "btn btn-success", 'data-dismiss'=>'modal'
168
- =link_to "Cancel", "#", :class => "btn btn-danger", 'data-dismiss'=>'modal'
167
+ =link_to "Send Password Reset", reset_password_person_path(@person), :class => "btn btn-primary", 'data-dismiss'=>'modal', :method => :post
168
+ =link_to "Cancel", "#", :class => "btn", 'data-dismiss'=>'modal'
169
+ = render partial: 'membership_scripts.js'
@@ -52,3 +52,11 @@
52
52
  %span.price= "$#{format("%.2f", (item.price/100.00))}:"
53
53
  %span.name= "Donation to #{@order.organization.name_for_donations}"
54
54
 
55
+ - unless @order.memberships.empty?
56
+ %h4 Memberships
57
+ %ul.donation-list
58
+ - @order.memberships.each do |item|
59
+ %li
60
+ %span.price= "$#{format("%.2f", (item.price/100.00))}:"
61
+ %span.name= "#{item.product.membership_type.membershipize}"
62
+
@@ -54,11 +54,9 @@
54
54
  .value= order.details
55
55
  %li
56
56
  %h6.key-full Special Instructions
57
- %li
58
57
  .value= order.special_instructions
59
- %li
58
+ %li#notes-display
60
59
  %h6.key-full Order Notes
61
- %li
62
60
  .value= order.notes
63
61
 
64
62
  #edit-order-popup.modal
@@ -12,6 +12,12 @@
12
12
  = form.email_field :email, :placeholder => 'contact@organization.org', :required => true, :class => 'input-xlarge email-popup', "data-content" => "Your patrons will be able to respond to this email address when receiving ticket/donation receipts. You can change this at any time."
13
13
  %span.help-inline (default contact for your patrons)
14
14
 
15
+ - unless @organization.new_record?
16
+ .control-group
17
+ = form.label :cached_slug, 'Storefront URL', :class=>'control-label'
18
+ .controls
19
+ = form.text_field :cached_slug, :placeholder => @organization.cached_slug, :required => true, :class => 'input-xlarge'
20
+
15
21
  %fieldset
16
22
  %legend Details
17
23
  .control-group
@@ -0,0 +1,66 @@
1
+ :plain
2
+ <style>
3
+ @import http://artfully-pdf-css.s3.amazonaws.com/helvetica.css;
4
+
5
+ body {
6
+ padding: 0;
7
+ margin: 0;
8
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ color: #000;
12
+ }
13
+ .card {
14
+ width: 3.5in;
15
+ height: 2in;
16
+ border: 1px solid #000;
17
+ clear: both;
18
+ margin-bottom: 1in;
19
+ }
20
+ .qr-code img {
21
+ margin-left: 1px;
22
+ margin-top: 1px;
23
+ width: 150px;
24
+ height: 150px;
25
+ }
26
+ .left-side {
27
+ float: left
28
+ }
29
+ .right-side {
30
+ margin-top: 10px;
31
+ }
32
+ .organization-name {
33
+ font-weight: bold;
34
+ }
35
+ .membership {
36
+ margin-bottom: 10px;
37
+ }
38
+ .person-name {
39
+ font-weight: bold;
40
+ }
41
+ .membership-number {
42
+ margin-bottom: 10px;
43
+ }
44
+ .expiration {
45
+ font-size: 11px;
46
+ }
47
+ </style>
48
+
49
+ :ruby
50
+ member = pdfable
51
+ membership = member.memberships.current.first
52
+ person = member.person
53
+
54
+ .card
55
+ .left-side
56
+ .qr-code
57
+ %img{:src => (member.download_link_for(:qr_code) rescue 'http://placehold.it/150/ffffff.png&text=No+QR+Code')}
58
+
59
+ .right-side
60
+ .organization-name #{member.organization.name}
61
+ .membership Member: #{membership.membership_type.name}
62
+
63
+ .person-name #{person.first_name} #{person.last_name}
64
+ .membership-number Member ##{member.member_number}
65
+
66
+ .expiration Valid until #{I18n.localize membership.ends_at, :format => :date}
@@ -0,0 +1,84 @@
1
+ :plain
2
+ <style>
3
+ @import http://artfully-pdf-css.s3.amazonaws.com/helvetica.css;
4
+
5
+ body {
6
+ padding: 0;
7
+ margin: 0;
8
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ color: #000;
12
+ }
13
+ .ticket {
14
+ width: 5.5in;
15
+ height: 2in;
16
+ border: 1px solid #000;
17
+ clear: both;
18
+ margin-bottom: 20px;
19
+ box-sizing: border-box;
20
+ }
21
+ .ticket:nth-child(4n+4) {
22
+ margin-bottom: 1.1in;
23
+ }
24
+ .qr-code img {
25
+ margin-left: 1px;
26
+ margin-top: 1px;
27
+ width: 150px;
28
+ height: 150px;
29
+ }
30
+ .left-side {
31
+ margin-left: 10px;
32
+ margin-top: 10px;
33
+ }
34
+ .show-name {
35
+ font-weight: bold;
36
+ }
37
+ .show-time {
38
+ margin-bottom: 10px;
39
+ }
40
+ .right-side {
41
+ float: right;
42
+ }
43
+ .order-number {
44
+ margin-left: 10px;
45
+ }
46
+ .venue {
47
+ margin-bottom: 10px;
48
+ }
49
+ .person-name {
50
+ font-weight: bold;
51
+ }
52
+ </style>
53
+
54
+ - pdfable.tickets.each do |item|
55
+ :ruby
56
+ order = pdfable
57
+ person = order.person
58
+ organization = order.organization
59
+ product = item.product
60
+ event = product.event
61
+ show = product.show
62
+ venue = event.venue
63
+
64
+ .ticket
65
+ .right-side
66
+ .qr-code
67
+ %img{:src => (product.qr_code_url rescue 'http://placehold.it/150/ffffff.png&text=No+QR+Code')}
68
+ .order-number Order ##{order.id}
69
+
70
+ .left-side
71
+ .organization-name= organization.name
72
+ .show-name= event.name
73
+ .show-time= I18n.localize show.datetime_local_to_event
74
+
75
+ .venue
76
+ #{venue.name} <br />
77
+ - if venue.address1.present?
78
+ #{venue.address1} <br />
79
+ - if venue.address2.present?
80
+ #{venue.address2} <br />
81
+ #{[venue.city,venue.state].select {|s| s.present?}.join(',')} #{venue.zip}
82
+
83
+ .person-name #{person.first_name} #{person.last_name}
84
+ .product #{product.ticket_type.name} #{number_as_cents product.price}
@@ -0,0 +1,23 @@
1
+ -with_kit (:membership) do
2
+ -if person.email.blank?
3
+ %p= link_to "Comp Membership", "#comp-membership", 'data-toggle' => 'modal'
4
+ #comp-membership.modal
5
+ .modal-header
6
+ .close{'data-dismiss'=>'modal'} x
7
+ %h3 Comp Membership
8
+ .modal-body
9
+ Sorry! We can't comp memberships to patrons who don't have an email.
10
+ .modal-footer
11
+ = button_tag "Close", :class => "btn", 'data-dismiss' => 'modal'
12
+ -elsif person.company?
13
+ %p= link_to "Comp Membership", "#comp-membership", 'data-toggle' => 'modal'
14
+ #comp-membership.modal
15
+ .modal-header
16
+ .close{'data-dismiss'=>'modal'} x
17
+ %h3 Comp Membership
18
+ .modal-body
19
+ Sorry! We can't comp memberships to companies or institutions.
20
+ .modal-footer
21
+ = button_tag "Close", :class => "btn", 'data-dismiss' => 'modal'
22
+ -else
23
+ %p= link_to "Comp Membership", new_person_membership_comp_path(person)