Class: Spree::StoreCredit
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Spree::StoreCredit
- Extended by:
- DisplayMoney
- Defined in:
- app/models/spree/store_credit.rb
Constant Summary collapse
- VOID_ACTION =
'void'
- CREDIT_ACTION =
'credit'
- CAPTURE_ACTION =
'capture'
- ELIGIBLE_ACTION =
'eligible'
- AUTHORIZE_ACTION =
'authorize'
- ALLOCATION_ACTION =
'allocation'
- ADJUSTMENT_ACTION =
'adjustment'
- INVALIDATE_ACTION =
'invalidate'
- DEFAULT_CREATED_BY_EMAIL =
"[email protected]"
Instance Attribute Summary collapse
-
#action ⇒ Object
Returns the value of attribute action.
-
#action_amount ⇒ Object
Returns the value of attribute action_amount.
-
#action_authorization_code ⇒ Object
Returns the value of attribute action_authorization_code.
-
#action_originator ⇒ Object
Returns the value of attribute action_originator.
-
#update_reason ⇒ Object
Returns the value of attribute update_reason.
Class Method Summary collapse
Instance Method Summary collapse
- #actions ⇒ Object
- #amount_remaining ⇒ Object
- #authorize(amount, order_currency, options = {}) ⇒ Object
- #can_capture?(payment) ⇒ Boolean
- #can_credit?(payment) ⇒ Boolean
- #can_void?(payment) ⇒ Boolean
- #capture(amount, authorization_code, order_currency, options = {}) ⇒ Object
- #credit(amount, authorization_code, order_currency, options = {}) ⇒ Object
- #editable? ⇒ Boolean
- #generate_authorization_code ⇒ Object
- #invalidate(reason, user_performing_invalidation) ⇒ Object
- #invalidateable? ⇒ Boolean
- #invalidated? ⇒ Boolean
- #update_amount(amount, reason, user_performing_update) ⇒ Object
- #validate_authorization(amount, order_currency) ⇒ Object
- #void(authorization_code, options = {}) ⇒ Object
Methods included from DisplayMoney
Instance Attribute Details
#action ⇒ Object
Returns the value of attribute action.
37 38 39 |
# File 'app/models/spree/store_credit.rb', line 37 def action @action end |
#action_amount ⇒ Object
Returns the value of attribute action_amount.
37 38 39 |
# File 'app/models/spree/store_credit.rb', line 37 def action_amount @action_amount end |
#action_authorization_code ⇒ Object
Returns the value of attribute action_authorization_code.
37 38 39 |
# File 'app/models/spree/store_credit.rb', line 37 def @action_authorization_code end |
#action_originator ⇒ Object
Returns the value of attribute action_originator.
37 38 39 |
# File 'app/models/spree/store_credit.rb', line 37 def action_originator @action_originator end |
#update_reason ⇒ Object
Returns the value of attribute update_reason.
37 38 39 |
# File 'app/models/spree/store_credit.rb', line 37 def update_reason @update_reason end |
Class Method Details
.default_created_by ⇒ Object
204 205 206 |
# File 'app/models/spree/store_credit.rb', line 204 def default_created_by Spree.user_class.find_by(email: DEFAULT_CREATED_BY_EMAIL) end |
Instance Method Details
#actions ⇒ Object
148 149 150 |
# File 'app/models/spree/store_credit.rb', line 148 def actions [CAPTURE_ACTION, VOID_ACTION, CREDIT_ACTION] end |
#amount_remaining ⇒ Object
42 43 44 45 |
# File 'app/models/spree/store_credit.rb', line 42 def amount_remaining return 0.0.to_d if invalidated? amount - amount_used - end |
#authorize(amount, order_currency, options = {}) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'app/models/spree/store_credit.rb', line 47 def (amount, order_currency, ={}) = [:action_authorization_code] if if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: ) # Don't authorize again on capture return true end else = end if (amount, order_currency) update_attributes!({ action: AUTHORIZE_ACTION, action_amount: amount, action_originator: [:action_originator], action_authorization_code: , amount_authorized: self. + amount, }) else errors.add(:base, Spree.t('store_credit.insufficient_authorized_amount')) false end end |
#can_capture?(payment) ⇒ Boolean
152 153 154 |
# File 'app/models/spree/store_credit.rb', line 152 def can_capture?(payment) payment.pending? || payment.checkout? end |
#can_credit?(payment) ⇒ Boolean
160 161 162 |
# File 'app/models/spree/store_credit.rb', line 160 def can_credit?(payment) payment.completed? && payment.credit_allowed > 0 end |
#can_void?(payment) ⇒ Boolean
156 157 158 |
# File 'app/models/spree/store_credit.rb', line 156 def can_void?(payment) payment.pending? end |
#capture(amount, authorization_code, order_currency, options = {}) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'app/models/spree/store_credit.rb', line 83 def capture(amount, , order_currency, ={}) return false unless (amount, order_currency, action_authorization_code: ) auth_event = store_credit_events.find_by!(action: AUTHORIZE_ACTION, authorization_code: ) if amount <= auth_event.amount if currency != order_currency errors.add(:base, Spree.t('store_credit.currency_mismatch')) false else update_attributes!({ action: CAPTURE_ACTION, action_amount: amount, action_originator: [:action_originator], action_authorization_code: , amount_used: self.amount_used + amount, amount_authorized: self. - auth_event.amount, }) end else errors.add(:base, Spree.t('store_credit.insufficient_authorized_amount')) false end end |
#credit(amount, authorization_code, order_currency, options = {}) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'app/models/spree/store_credit.rb', line 126 def credit(amount, , order_currency, ={}) # Find the amount related to this authorization_code in order to add the store credit back capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code: ) if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth errors.add(:base, Spree.t('store_credit.currency_mismatch')) false elsif capture_event && amount <= capture_event.amount action_attributes = { action: CREDIT_ACTION, action_amount: amount, action_originator: [:action_originator], action_authorization_code: , } create_credit_record(amount, action_attributes) true else errors.add(:base, Spree.t('store_credit.unable_to_credit', auth_code: )) false end end |
#editable? ⇒ Boolean
168 169 170 |
# File 'app/models/spree/store_credit.rb', line 168 def editable? !amount_remaining.zero? end |
#generate_authorization_code ⇒ Object
164 165 166 |
# File 'app/models/spree/store_credit.rb', line 164 def "#{self.id}-SC-#{Time.now.utc.strftime("%Y%m%d%H%M%S%6N")}" end |
#invalidate(reason, user_performing_invalidation) ⇒ Object
190 191 192 193 194 195 196 197 198 199 200 201 |
# File 'app/models/spree/store_credit.rb', line 190 def invalidate(reason, user_performing_invalidation) if invalidateable? self.action = INVALIDATE_ACTION self.update_reason = reason self.action_originator = user_performing_invalidation self.invalidated_at = Time.now save else errors.add(:invalidated_at, Spree.t("store_credit.errors.cannot_invalidate_uncaptured_authorization")) return false end end |
#invalidateable? ⇒ Boolean
172 173 174 |
# File 'app/models/spree/store_credit.rb', line 172 def invalidateable? !invalidated? && .zero? end |
#invalidated? ⇒ Boolean
176 177 178 |
# File 'app/models/spree/store_credit.rb', line 176 def invalidated? !!invalidated_at end |
#update_amount(amount, reason, user_performing_update) ⇒ Object
180 181 182 183 184 185 186 187 188 |
# File 'app/models/spree/store_credit.rb', line 180 def update_amount(amount, reason, user_performing_update) previous_amount = self.amount self.amount = amount self.action_amount = self.amount - previous_amount self.action = ADJUSTMENT_ACTION self.update_reason = reason self.action_originator = user_performing_update save end |
#validate_authorization(amount, order_currency) ⇒ Object
74 75 76 77 78 79 80 81 |
# File 'app/models/spree/store_credit.rb', line 74 def (amount, order_currency) if amount_remaining.to_d < amount.to_d errors.add(:base, Spree.t('store_credit.insufficient_funds')) elsif currency != order_currency errors.add(:base, Spree.t('store_credit.currency_mismatch')) end return errors.blank? end |
#void(authorization_code, options = {}) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'app/models/spree/store_credit.rb', line 109 def void(, ={}) if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: ) self.update_attributes!({ action: VOID_ACTION, action_amount: auth_event.amount, action_authorization_code: , action_originator: [:action_originator], amount_authorized: - auth_event.amount, }) true else errors.add(:base, Spree.t('store_credit.unable_to_void', auth_code: )) false end end |