effective_products 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/admin/stamps_controller.rb +9 -0
  3. data/app/controllers/effective/ring_wizards_controller.rb +10 -0
  4. data/app/controllers/effective/stamp_wizards_controller.rb +10 -0
  5. data/app/datatables/admin/effective_rings_datatable.rb +4 -5
  6. data/app/datatables/admin/effective_stamps_datatable.rb +43 -0
  7. data/app/datatables/{effective_ring_payments_datatable.rb → effective_ring_wizards_datatable.rb} +5 -5
  8. data/app/datatables/effective_stamp_wizards_datatable.rb +36 -0
  9. data/app/helpers/effective_products_helper.rb +0 -1
  10. data/app/models/concerns/{effective_products_ring_payment.rb → effective_products_ring_wizard.rb} +27 -36
  11. data/app/models/concerns/effective_products_stamp_wizard.rb +139 -0
  12. data/app/models/effective/ring.rb +2 -24
  13. data/app/models/effective/ring_wizard.rb +7 -0
  14. data/app/models/effective/stamp.rb +69 -0
  15. data/app/models/effective/stamp_wizard.rb +7 -0
  16. data/app/views/admin/rings/_ring.html.haml +23 -15
  17. data/app/views/admin/stamps/_stamp.html.haml +53 -0
  18. data/app/views/effective/{ring_payments → ring_wizards}/_content.html.haml +0 -0
  19. data/app/views/effective/ring_wizards/_dashboard.html.haml +27 -0
  20. data/app/views/effective/{ring_payments → ring_wizards}/_layout.html.haml +0 -0
  21. data/app/views/effective/ring_wizards/_orders.html.haml +4 -0
  22. data/app/views/effective/ring_wizards/_ring.html.haml +40 -0
  23. data/app/views/effective/{rings/_fields.html.haml → ring_wizards/_ring_fields.html.haml} +25 -7
  24. data/app/views/effective/ring_wizards/_ring_wizard.html.haml +3 -0
  25. data/app/views/effective/ring_wizards/_summary.html.haml +31 -0
  26. data/app/views/effective/ring_wizards/billing.html.haml +15 -0
  27. data/app/views/effective/ring_wizards/checkout.html.haml +6 -0
  28. data/app/views/effective/{ring_payments → ring_wizards}/ring.html.haml +4 -4
  29. data/app/views/effective/{ring_payments → ring_wizards}/start.html.haml +1 -1
  30. data/app/views/effective/ring_wizards/submitted.html.haml +16 -0
  31. data/app/views/effective/ring_wizards/summary.html.haml +8 -0
  32. data/app/views/effective/stamp_wizards/_content.html.haml +10 -0
  33. data/app/views/effective/stamp_wizards/_dashboard.html.haml +27 -0
  34. data/app/views/effective/stamp_wizards/_layout.html.haml +3 -0
  35. data/app/views/effective/stamp_wizards/_orders.html.haml +4 -0
  36. data/app/views/effective/stamp_wizards/_stamp.html.haml +45 -0
  37. data/app/views/effective/stamp_wizards/_stamp_fields.html.haml +45 -0
  38. data/app/views/effective/stamp_wizards/_stamp_wizard.html.haml +3 -0
  39. data/app/views/effective/stamp_wizards/_summary.html.haml +31 -0
  40. data/app/views/effective/{ring_payments → stamp_wizards}/billing.html.haml +1 -1
  41. data/app/views/effective/{ring_payments → stamp_wizards}/checkout.html.haml +1 -1
  42. data/app/views/effective/stamp_wizards/stamp.html.haml +18 -0
  43. data/app/views/effective/stamp_wizards/start.html.haml +16 -0
  44. data/app/views/effective/{ring_payments → stamp_wizards}/submitted.html.haml +4 -3
  45. data/app/views/effective/{ring_payments → stamp_wizards}/summary.html.haml +2 -2
  46. data/config/effective_products.rb +4 -4
  47. data/config/routes.rb +11 -3
  48. data/db/migrate/01_create_effective_products.rb.erb +98 -1
  49. data/lib/effective_products/engine.rb +2 -1
  50. data/lib/effective_products/version.rb +1 -1
  51. data/lib/effective_products.rb +6 -6
  52. metadata +42 -21
  53. data/app/controllers/effective/ring_payments_controller.rb +0 -31
  54. data/app/models/effective/ring_payment.rb +0 -7
  55. data/app/views/effective/ring_payments/_dashboard.html.haml +0 -27
  56. data/app/views/effective/ring_payments/_orders.html.haml +0 -4
  57. data/app/views/effective/ring_payments/_ring.html.haml +0 -29
  58. data/app/views/effective/ring_payments/_ring_fields.html.haml +0 -4
  59. data/app/views/effective/ring_payments/_ring_payment.html.haml +0 -8
  60. data/app/views/effective/ring_payments/_summary.html.haml +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2992b6b0b12c9492acc501695ca38ffd7a8bd12afbd3c428eaf7c2be16f62cfb
4
- data.tar.gz: c40613e452d37c8b98617a7d13274b5c5968a7b4ea235a1581938826cfd447fa
3
+ metadata.gz: fe191a8c318148da7f4d5c91a4e8248ad1e46ed79a226fd8549873fbeeac7e58
4
+ data.tar.gz: e0481a234925beb15a4bde2656f931cfc98466224d4fdaa7cdf0be3e4a85879e
5
5
  SHA512:
6
- metadata.gz: 8528fc8d11c0e4d71d635e6a05afb2e455425a35439637638b5d074da5538e2e0fa7e68b28e569c71c9fc918acd2665f89595b519df7a15dbd0d36a3b69dd274
7
- data.tar.gz: 6cf09696ebbe1d0e9b534c128130647b2c73d9599d9961b082d0f7d96cc40f7a89b206ee6f8e54f969ce4678cdff3cf273ed5a380791f4733aa7bdc8e70a1987
6
+ metadata.gz: 39a16cb225c1dd2f0c575af9eec56d5b8865f928d2acc2cb0990aec35dfd36b1d9af8acb474a3ac53dee78772224520fd3e35949447bbf1d5079c38a904511bb
7
+ data.tar.gz: a9f3006715674b41ce72da94d2936a87d456a45f08920cc4765ecc5596d69ffa6502a42aeed557c3ca1dd2061e76214d897bb3e91308e8bb5e2ede6790ec5781
@@ -0,0 +1,9 @@
1
+ module Admin
2
+ class StampsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_products) }
5
+
6
+ include Effective::CrudController
7
+
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Effective
2
+ class RingWizardsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+
5
+ include Effective::WizardController
6
+
7
+ resource_scope -> { EffectiveProducts.RingWizard.deep.where(owner: current_user) }
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Effective
2
+ class StampWizardsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+
5
+ include Effective::WizardController
6
+
7
+ resource_scope -> { EffectiveProducts.StampWizard.deep.where(owner: current_user) }
8
+
9
+ end
10
+ end
@@ -16,11 +16,10 @@ module Admin
16
16
  col :created_at, as: :date
17
17
  col :owner, search: :string
18
18
 
19
- col :first_name
20
- col :last_name
21
-
22
- col :email
23
- col :phone
19
+ col(:first_name) { |ring| ring.owner.first_name }
20
+ col(:last_name) { |ring| ring.owner.last_name }
21
+ col(:email) { |ring| ring.owner.email }
22
+ col(:phone) { |ring| ring.owner.phone }
24
23
 
25
24
  col :member_number, label: 'Member #' do |ring|
26
25
  ring.owner.try(:membership).try(:number)
@@ -0,0 +1,43 @@
1
+ module Admin
2
+ class EffectiveStampsDatatable < Effective::Datatable
3
+ filters do
4
+ scope :ready_to_issue
5
+ scope :issued
6
+ scope :all
7
+ end
8
+
9
+ datatable do
10
+ order :updated_at
11
+
12
+ col :updated_at, visible: false
13
+ col :created_at, visible: false
14
+ col :id, visible: false
15
+
16
+ col :created_at, as: :date
17
+ col :owner, search: :string
18
+
19
+ col(:first_name) { |stamp| stamp.owner.first_name }
20
+ col(:last_name) { |stamp| stamp.owner.last_name }
21
+ col(:email) { |stamp| stamp.owner.email }
22
+ col(:phone) { |stamp| stamp.owner.phone }
23
+
24
+ col :member_number, label: 'Member #' do |stamp|
25
+ stamp.owner.try(:membership).try(:number)
26
+ end
27
+
28
+ col :category
29
+ col :name
30
+ col :name_confirmation
31
+
32
+ col :shipping_address, label: 'Address'
33
+
34
+ col :issued_at
35
+
36
+ actions_col
37
+ end
38
+
39
+ collection do
40
+ Effective::Stamp.deep.all
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,5 @@
1
1
  # Dashboard Ring Payments
2
- class EffectiveRingPaymentsDatatable < Effective::Datatable
2
+ class EffectiveRingWizardsDatatable < Effective::Datatable
3
3
  datatable do
4
4
  order :created_at
5
5
 
@@ -20,17 +20,17 @@ class EffectiveRingPaymentsDatatable < Effective::Datatable
20
20
 
21
21
  actions_col(actions: []) do |resource|
22
22
  if resource.draft?
23
- dropdown_link_to('Continue', effective_products.ring_payment_build_path(resource, reource.next_step), 'data-turbolinks' => false)
24
- dropdown_link_to('Delete', effective_products.ring_payment_path(resource), 'data-confirm': "Really delete #{resource}?", 'data-method': :delete)
23
+ dropdown_link_to('Continue', effective_products.ring_wizard_build_path(resource, reource.next_step), 'data-turbolinks' => false)
24
+ dropdown_link_to('Delete', effective_products.ring_wizard_path(resource), 'data-confirm': "Really delete #{resource}?", 'data-method': :delete)
25
25
  else
26
- dropdown_link_to('Show', effective_products.ring_payment_path(resource))
26
+ dropdown_link_to('Show', effective_products.ring_wizard_path(resource))
27
27
  end
28
28
  end
29
29
 
30
30
  end
31
31
 
32
32
  collection do
33
- EffectiveProducts.RingPayment.deep.done.where(owner: current_user)
33
+ EffectiveProducts.RingWizard.deep.done.where(owner: current_user)
34
34
  end
35
35
 
36
36
  end
@@ -0,0 +1,36 @@
1
+ # Dashboard Stamp Payments
2
+ class EffectiveStampWizardsDatatable < Effective::Datatable
3
+ datatable do
4
+ order :created_at
5
+
6
+ col :token, visible: false
7
+ col :created_at, visible: false
8
+
9
+ col(:submitted_at, label: 'Submitted on') do |resource|
10
+ resource.submitted_at&.strftime('%F') || 'Incomplete'
11
+ end
12
+
13
+ col :owner, visible: false, search: :ststamp
14
+ col :status, visible: false
15
+ col :orders, action: :show
16
+
17
+ col(:issued_at, label: 'Issued on') do |resource|
18
+ resource.stamp.issued_at&.strftime('%F') || '-'
19
+ end
20
+
21
+ actions_col(actions: []) do |resource|
22
+ if resource.draft?
23
+ dropdown_link_to('Continue', effective_products.stamp_wizard_build_path(resource, reource.next_step), 'data-turbolinks' => false)
24
+ dropdown_link_to('Delete', effective_products.stamp_wizard_path(resource), 'data-confirm': "Really delete #{resource}?", 'data-method': :delete)
25
+ else
26
+ dropdown_link_to('Show', effective_products.stamp_wizard_path(resource))
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ collection do
33
+ EffectiveProducts.StampWizard.deep.done.where(owner: current_user)
34
+ end
35
+
36
+ end
@@ -1,3 +1,2 @@
1
1
  module EffectiveProductsHelper
2
-
3
2
  end
@@ -1,28 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # EffectiveProductsRingPayment
3
+ # EffectiveProductsRingWizard
4
4
  #
5
- # Mark your owner model with effective_products_ring_payment to get all the includes
5
+ # Mark your owner model with effective_products_ring_wizard to get all the includes
6
6
 
7
- module EffectiveProductsRingPayment
7
+ module EffectiveProductsRingWizard
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  module Base
11
- def effective_products_ring_payment
12
- include ::EffectiveProductsRingPayment
11
+ def effective_products_ring_wizard
12
+ include ::EffectiveProductsRingWizard
13
13
  end
14
14
  end
15
15
 
16
16
  module ClassMethods
17
- def effective_products_ring_payment?; true; end
18
-
19
- def all_wizard_steps
20
- const_get(:WIZARD_STEPS).keys
21
- end
22
-
23
- def required_wizard_steps
24
- [:start, :billing, :checkout, :submitted]
25
- end
17
+ def effective_products_ring_wizard?; true; end
26
18
  end
27
19
 
28
20
  included do
@@ -52,7 +44,7 @@ module EffectiveProductsRingPayment
52
44
  accepts_nested_attributes_for :owner
53
45
 
54
46
  # Effective Namespace
55
- has_many :rings, -> { order(:id) }, class_name: 'Effective::Ring', inverse_of: :ring_payment, dependent: :destroy
47
+ has_many :rings, -> { order(:id) }, class_name: 'Effective::Ring', inverse_of: :ring_wizard, dependent: :destroy
56
48
  accepts_nested_attributes_for :rings, reject_if: :all_blank, allow_destroy: true
57
49
 
58
50
  has_many :orders, -> { order(:id) }, as: :parent, class_name: 'Effective::Order', dependent: :nullify
@@ -83,7 +75,7 @@ module EffectiveProductsRingPayment
83
75
  # All Steps validations
84
76
  validates :owner, presence: true
85
77
 
86
- # Tickets Step
78
+ # Ring Step
87
79
  validate(if: -> { current_step == :ring }) do
88
80
  self.errors.add(:rings, "can't be blank") unless present_rings.present?
89
81
  end
@@ -117,14 +109,7 @@ module EffectiveProductsRingPayment
117
109
  end
118
110
 
119
111
  def build_ring
120
- ring = rings.build(
121
- owner: owner,
122
- first_name: owner.try(:first_name),
123
- last_name: owner.try(:last_name),
124
- email: owner.try(:email),
125
- phone: owner.try(:phone)
126
- )
127
-
112
+ ring = rings.build(owner: owner)
128
113
  address = owner.try(:shipping_address) || owner.try(:billing_address)
129
114
 
130
115
  if address.present?
@@ -135,23 +120,29 @@ module EffectiveProductsRingPayment
135
120
  end
136
121
 
137
122
  def assign_pricing
138
- price = case ring.metal
139
- when '14k Yellow Gold' then 450_00
140
- when 'Sterling Silver' then 175_00
141
- when 'Titanium' then 50_00
142
- else
143
- raise "unexpected ring metal: #{ring.metal || 'none'}"
144
- end
145
-
146
- qb_item_name = "Chemist's Ring"
147
- tax_exempt = false
148
-
149
- ring.assign_attributes(price: price, qb_item_name: qb_item_name, tax_exempt: tax_exempt)
123
+ raise('to be implemented by including class')
124
+
125
+ # raise('expected a persisted ring') unless ring&.persisted?
126
+
127
+ # price = case ring.metal
128
+ # when '14k Yellow Gold' then 450_00
129
+ # when 'Sterling Silver' then 175_00
130
+ # when 'Titanium' then 50_00
131
+ # else
132
+ # raise "unexpected ring metal: #{ring.metal || 'none'}"
133
+ # end
134
+
135
+ # qb_item_name = "Professional Ring"
136
+ # tax_exempt = false
137
+
138
+ # ring.assign_attributes(price: price, qb_item_name: qb_item_name, tax_exempt: tax_exempt)
150
139
  end
151
140
 
152
141
  # After the configure Ring step
153
142
  def ring!
154
143
  assign_pricing() if ring.present?
144
+ raise('expected ring to have a price') if ring.price.blank?
145
+
155
146
  save!
156
147
  end
157
148
 
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ # EffectiveProductsStampWizard
4
+ #
5
+ # Mark your owner model with effective_products_stamp_wizard to get all the includes
6
+
7
+ module EffectiveProductsStampWizard
8
+ extend ActiveSupport::Concern
9
+
10
+ module Base
11
+ def effective_products_stamp_wizard
12
+ include ::EffectiveProductsStampWizard
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def effective_products_stamp_wizard?; true; end
18
+ end
19
+
20
+ included do
21
+ acts_as_purchasable_parent
22
+ acts_as_tokened
23
+
24
+ acts_as_statused(
25
+ :draft, # Just Started
26
+ :submitted # All done
27
+ )
28
+
29
+ acts_as_wizard(
30
+ start: 'Start',
31
+ stamp: 'Select Stamp',
32
+ summary: 'Review',
33
+ billing: 'Billing Address',
34
+ checkout: 'Checkout',
35
+ submitted: 'Submitted'
36
+ )
37
+
38
+ acts_as_purchasable_wizard
39
+
40
+ log_changes(except: :wizard_steps) if respond_to?(:log_changes)
41
+
42
+ # Application Namespace
43
+ belongs_to :owner, polymorphic: true
44
+ accepts_nested_attributes_for :owner
45
+
46
+ # Effective Namespace
47
+ has_many :stamps, -> { order(:id) }, class_name: 'Effective::Stamp', inverse_of: :stamp_wizard, dependent: :destroy
48
+ accepts_nested_attributes_for :stamps, reject_if: :all_blank, allow_destroy: true
49
+
50
+ has_many :orders, -> { order(:id) }, as: :parent, class_name: 'Effective::Order', dependent: :nullify
51
+ accepts_nested_attributes_for :orders
52
+
53
+ effective_resource do
54
+ # Acts as Statused
55
+ status :string, permitted: false
56
+ status_steps :text, permitted: false
57
+
58
+ # Dates
59
+ submitted_at :datetime
60
+
61
+ # Acts as Wizard
62
+ wizard_steps :text, permitted: false
63
+
64
+ timestamps
65
+ end
66
+
67
+ scope :deep, -> { includes(:owner, :orders, :stamps) }
68
+ scope :sorted, -> { order(:id) }
69
+
70
+ scope :in_progress, -> { where.not(status: [:submitted]) }
71
+ scope :done, -> { where(status: [:submitted]) }
72
+
73
+ scope :for, -> (user) { where(owner: user) }
74
+
75
+ # All Steps validations
76
+ validates :owner, presence: true
77
+
78
+ # Stamp Step
79
+ validate(if: -> { current_step == :stamp }) do
80
+ self.errors.add(:stamps, "can't be blank") unless present_stamps.present?
81
+ end
82
+
83
+ # All Fees and Orders
84
+ def submit_fees
85
+ stamps
86
+ end
87
+
88
+ def after_submit_purchased!
89
+ # Nothing to do yet
90
+ end
91
+
92
+ end
93
+
94
+ # Instance Methods
95
+ def to_s
96
+ 'stamp payment'
97
+ end
98
+
99
+ def in_progress?
100
+ draft?
101
+ end
102
+
103
+ def done?
104
+ submitted?
105
+ end
106
+
107
+ def stamp
108
+ stamps.first
109
+ end
110
+
111
+ def build_stamp
112
+ address = owner.try(:shipping_address) || owner.try(:billing_address)
113
+ stamps.build(owner: owner, shipping_address: address)
114
+ end
115
+
116
+ def assign_pricing
117
+ raise('to be implemented by including class')
118
+
119
+ # price = (stamp.physical? ? 100_00 : 50_00)
120
+ # qb_item_name = "Professional Stamp"
121
+ # tax_exempt = false
122
+
123
+ # stamp.assign_attributes(price: price, qb_item_name: qb_item_name, tax_exempt: tax_exempt)
124
+ end
125
+
126
+ # After the configure Stamp step
127
+ def stamp!
128
+ assign_pricing() if stamp.present?
129
+ raise('expected stamp to have a price') if stamp.price.blank?
130
+ save!
131
+ end
132
+
133
+ private
134
+
135
+ def present_stamps
136
+ stamps.reject(&:marked_for_destruction?)
137
+ end
138
+
139
+ end
@@ -14,15 +14,10 @@ module Effective
14
14
  # This ring is charged to an owner
15
15
  belongs_to :owner, polymorphic: true
16
16
 
17
- # Through the ring_payment
18
- belongs_to :ring_payment, polymorphic: true, optional: true
17
+ # Through the ring_wizard
18
+ belongs_to :ring_wizard, polymorphic: true, optional: true
19
19
 
20
20
  effective_resource do
21
- first_name :string
22
- last_name :string
23
- phone :string
24
- email :string
25
-
26
21
  size :integer
27
22
  metal :string
28
23
 
@@ -40,11 +35,6 @@ module Effective
40
35
  scope :ready_to_issue, -> { purchased.where(issued_at: nil) }
41
36
  scope :issued, -> { where.not(issued_at: nil) }
42
37
 
43
- validates :first_name, presence: true
44
- validates :last_name, presence: true
45
- validates :phone, presence: true
46
- validates :email, presence: true, email: true
47
-
48
38
  validates :metal, presence: true, inclusion: { in: METALS }
49
39
 
50
40
  validates :size, presence: true
@@ -63,17 +53,5 @@ module Effective
63
53
  issued_at.present?
64
54
  end
65
55
 
66
- # This is the Admin Save and Mark Paid action
67
- def mark_paid!
68
- raise('expected a blank ring payment') if ring_payment.present?
69
-
70
- save!
71
-
72
- order = Effective::Order.new(items: self, user: owner)
73
- order.purchase!(skip_buyer_validations: true, email: false)
74
-
75
- true
76
- end
77
-
78
56
  end
79
57
  end
@@ -0,0 +1,7 @@
1
+ module Effective
2
+ class RingWizard < ActiveRecord::Base
3
+ self.table_name = EffectiveProducts.ring_wizards_table_name.to_s
4
+
5
+ effective_products_ring_wizard
6
+ end
7
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Effective
4
+ class Stamp < ActiveRecord::Base
5
+ acts_as_purchasable
6
+ acts_as_addressable :shipping
7
+
8
+ #CATEGORIES = ['Physical', 'Digital-only']
9
+ CATEGORIES = ['Physical']
10
+
11
+ log_changes if respond_to?(:log_changes)
12
+
13
+ # This ring is charged to an owner
14
+ belongs_to :owner, polymorphic: true
15
+
16
+ # Through the stamp_wizard
17
+ belongs_to :stamp_wizard, polymorphic: true, optional: true
18
+
19
+ effective_resource do
20
+ name :string
21
+ name_confirmation :string
22
+
23
+ category :string
24
+
25
+ # Admin issues stamps
26
+ issued_at :datetime # Present when issued by an admin
27
+
28
+ # Acts as Purchasable
29
+ price :integer
30
+ qb_item_name :string
31
+ tax_exempt :boolean
32
+
33
+ timestamps
34
+ end
35
+
36
+ scope :deep, -> { includes(:owner) }
37
+ scope :ready_to_issue, -> { purchased.where(issued_at: nil) }
38
+ scope :issued, -> { where.not(issued_at: nil) }
39
+
40
+ validates :category, presence: true, inclusion: { in: CATEGORIES }
41
+ validates :name, presence: true
42
+ validates :name_confirmation, presence: true
43
+
44
+ validate(if: -> { name.present? && name_confirmation.present? }) do
45
+ self.errors.add(:name_confirmation, "doesn't match name") unless name == name_confirmation
46
+ end
47
+
48
+ validate(if: -> { physical? }) do
49
+ self.errors.add(:shipping_address, "can't be blank when physical stamp") unless shipping_address.present?
50
+ end
51
+
52
+ def to_s
53
+ ['Professional Stamp', *name.presence].join(' ')
54
+ end
55
+
56
+ def mark_as_issued!
57
+ update!(issued_at: Time.zone.now)
58
+ end
59
+
60
+ def issued?
61
+ issued_at.present?
62
+ end
63
+
64
+ def physical?
65
+ category == 'Physical'
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,7 @@
1
+ module Effective
2
+ class StampWizard < ActiveRecord::Base
3
+ self.table_name = EffectiveProducts.stamp_wizards_table_name.to_s
4
+
5
+ effective_products_stamp_wizard
6
+ end
7
+ end
@@ -11,30 +11,38 @@
11
11
  %td
12
12
  - if ring.purchased_order.present?
13
13
  = link_to(ring.purchased_order, effective_orders.admin_order_path(ring.purchased_order))
14
+
14
15
  %tr
15
- %th First Name
16
- %td= ring.first_name
17
- %tr
18
- %th Last Name
19
- %td= ring.last_name
20
- %tr
21
- %th Phone
22
- %td= ring.phone
23
- %tr
24
- %th Email
25
- %td= ring.email
26
- %tr
27
- %th Member Number
28
- %td= ring.owner.try(:membership).try(:number) || '-'
16
+ %th Contact
17
+ %td
18
+ - owner = ring.owner
19
+
20
+ = owner.to_s
21
+
22
+ - if owner.try(:email).present?
23
+ %br
24
+ = mail_to(owner.email)
25
+
26
+ - if owner.try(:phone).present?
27
+ %br
28
+ = owner.phone
29
+
30
+ - if owner.try(:membership).try(:number).present?
31
+ %br
32
+ Member Number #{owner.membership.number}
33
+
29
34
  %tr
30
35
  %th Address
31
36
  %td= ring.shipping_address.to_html
37
+
32
38
  %tr
33
39
  %th Size
34
40
  %td= ring.size
41
+
35
42
  %tr
36
43
  %th Metal
37
44
  %td= ring.metal
45
+
38
46
  %tr
39
47
  %th Issued At
40
- %td= ring.issued_at
48
+ %td= ring.issued_at&.strftime('%F') || 'Not Issued'
@@ -0,0 +1,53 @@
1
+ %table.table
2
+ %tbody
3
+ %tr
4
+ %th Owner
5
+ %td
6
+ - url = (edit_polymorphic_path(stamp.owner) rescue "/admin/users/#{stamp.owner.to_param}/edit")
7
+ = link_to(stamp.owner, url)
8
+
9
+ %tr
10
+ %th Purchased Order
11
+ %td
12
+ - if stamp.purchased_order.present?
13
+ = link_to(stamp.purchased_order, effective_orders.admin_order_path(stamp.purchased_order))
14
+
15
+ %tr
16
+ %th Contact
17
+ %td
18
+ - owner = stamp.owner
19
+
20
+ = owner.to_s
21
+
22
+ - if owner.try(:email).present?
23
+ %br
24
+ = mail_to(owner.email)
25
+
26
+ - if owner.try(:phone).present?
27
+ %br
28
+ = owner.phone
29
+
30
+ - if owner.try(:membership).try(:number).present?
31
+ %br
32
+ Member Number #{owner.membership.number}
33
+
34
+ %tr
35
+ %th
36
+ %td= stamp.physical? ? 'Physical' : 'Digital Only'
37
+
38
+ - if stamp.shipping_address.present?
39
+ %tr
40
+ %th Address
41
+ %td= stamp.shipping_address.to_html
42
+
43
+ %tr
44
+ %th Name on Stamp
45
+ %td= stamp.name
46
+
47
+ %tr
48
+ %th Name Confirmation
49
+ %td= stamp.name_confirmation
50
+
51
+ %tr
52
+ %th Issued At
53
+ %td= stamp.issued_at&.strftime('%F') || 'Not Issued'