Class: Caboose::Order
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Caboose::Order
- Defined in:
- app/models/caboose/order.rb
Constant Summary collapse
- STATUS_CART =
'cart'
- STATUS_PENDING =
'pending'
- STATUS_CANCELED =
'canceled'
- STATUS_READY_TO_SHIP =
'ready to ship'
- STATUS_SHIPPED =
'shipped'
- STATUS_TESTING =
'testing'
- FINANCIAL_STATUS_PENDING =
'pending'
- FINANCIAL_STATUS_AUTHORIZED =
'authorized'
- FINANCIAL_STATUS_CAPTURED =
'captured'
- FINANCIAL_STATUS_REFUNDED =
'refunded'
- FINANCIAL_STATUS_VOIDED =
'voided'
Instance Method Summary collapse
- #authorized? ⇒ Boolean
- #calculate ⇒ Object
- #calculate_discount ⇒ Object
- #calculate_gift_wrap ⇒ Object
- #calculate_handling ⇒ Object
- #calculate_shipping ⇒ Object
- #calculate_subtotal ⇒ Object
- #calculate_tax ⇒ Object
- #calculate_total ⇒ Object
- #capture ⇒ Object
-
#capture_funds ⇒ Object
Capture funds from a previously authorized transaction.
- #check_nil_fields ⇒ Object
- #decrement_quantities ⇒ Object
- #has_downloadable_items? ⇒ Boolean
- #has_empty_shipping_methods? ⇒ Boolean
- #has_shippable_items? ⇒ Boolean
- #increment_quantities ⇒ Object
- #item_count ⇒ Object
- #refund ⇒ Object
- #resend_confirmation ⇒ Object
-
#send_payment_authorization_email ⇒ Object
def refund resp = StdClass.new t = OrderTransaction.where(:order_id => self.id, :transaction_type => OrderTransaction::TYPE_CAPTURE, :success => true).first if self.financial_status != Order::FINANCIAL_STATUS_CAPTURED resp.error = “This order hasn’t been captured yet, you will need to void instead” else sc = self.site.store_config case sc.pp_name when ‘authorize.net’ if PaymentProcessor.refund(order) order.update_attributes( :financial_status => Order::FINANCIAL_STATUS_REFUNDED, :status => Order::STATUS_CANCELED ) response.success = ‘Order refunded successfully’ else response.error = ‘Error refunding order’ end #if order.calculate_net < (order.amount_discounted || 0) || PaymentProcessor.refund(order) # order.financial_status = ‘refunded’ # order.status = ‘refunded’ # order.save # # if order.discounts.any? # discount = order.discounts.first # amount_to_refund = order.calculate_net < order.amount_discounted ? order.calculate_net : order.amount_discounted # discount.update_attribute(:amount_current, amount_to_refund + discount.amount_current) # end # # response.success = “Order refunded successfully” #else # response.error = “Error refunding order.” #end end.
- #shipping_and_handling ⇒ Object
- #take_gift_card_funds ⇒ Object
- #test? ⇒ Boolean
-
#void ⇒ Object
Void an authorized order.
Instance Method Details
#authorized? ⇒ Boolean
124 125 126 |
# File 'app/models/caboose/order.rb', line 124 def self.financial_status == 'authorized' end |
#calculate ⇒ Object
140 141 142 143 144 145 146 147 148 |
# File 'app/models/caboose/order.rb', line 140 def calculate self.update_column(:subtotal , self.calculate_subtotal ) self.update_column(:tax , self.calculate_tax ) self.update_column(:shipping , self.calculate_shipping ) self.update_column(:handling , self.calculate_handling ) self.update_column(:gift_wrap , self.calculate_gift_wrap ) self.update_column(:discount , self.calculate_discount ) self.update_column(:total , self.calculate_total ) end |
#calculate_discount ⇒ Object
184 185 186 187 188 189 190 191 |
# File 'app/models/caboose/order.rb', line 184 def calculate_discount x = 0.0 if self.discounts && self.discounts.count > 0 self.discounts.each{ |d| x = x + d.amount } end x = x + self.custom_discount if self.custom_discount return x end |
#calculate_gift_wrap ⇒ Object
174 175 176 177 178 179 180 181 182 |
# File 'app/models/caboose/order.rb', line 174 def calculate_gift_wrap x = 0.0 self.line_items.each do |li| next if !li.gift_wrap next if !li.variant.product.allow_gift_wrap x = x + li.variant.product.gift_wrap_price * li.quantity end return x end |
#calculate_handling ⇒ Object
169 170 171 172 |
# File 'app/models/caboose/order.rb', line 169 def calculate_handling return 0.0 if self.site.nil? || self.site.store_config.nil? self.subtotal * self.site.store_config.handling_percentage.to_f end |
#calculate_shipping ⇒ Object
162 163 164 165 166 167 |
# File 'app/models/caboose/order.rb', line 162 def calculate_shipping return 0.0 if self.order_packages.nil? || self.order_packages.count == 0 x = 0.0 self.order_packages.all.each{ |op| x = x + op.total } return x end |
#calculate_subtotal ⇒ Object
150 151 152 153 154 155 156 |
# File 'app/models/caboose/order.rb', line 150 def calculate_subtotal return 0.0 if self.line_items.empty? self.line_items.each{ |li| li.verify_unit_price } # Make sure the unit prices are populated x = 0.0 self.line_items.each{ |li| x = x + (li.unit_price * li.quantity) } # Fixed issue with quantity return x end |
#calculate_tax ⇒ Object
158 159 160 |
# File 'app/models/caboose/order.rb', line 158 def calculate_tax return TaxCalculator.tax(self) end |
#calculate_total ⇒ Object
193 194 195 |
# File 'app/models/caboose/order.rb', line 193 def calculate_total return (self.subtotal + self.tax + self.shipping + self.handling + self.gift_wrap) - self.discount end |
#capture ⇒ Object
128 129 130 |
# File 'app/models/caboose/order.rb', line 128 def capture PaymentProcessor.capture(self) end |
#capture_funds ⇒ Object
Capture funds from a previously authorized transaction
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'app/models/caboose/order.rb', line 240 def capture_funds resp = StdClass.new t = OrderTransaction.where(:order_id => self.id, :transaction_type => OrderTransaction::TYPE_AUTHORIZE, :success => true).first if self.financial_status == Order::FINANCIAL_STATUS_CAPTURED resp.error = "Funds for this order have already been captured." elsif self.total > t.amount resp.error = "The order total exceeds the authorized amount." elsif t.nil? resp.error = "This order doesn't seem to be authorized." else sc = self.site.store_config ot = Caboose::OrderTransaction.new( :order_id => self.id, :date_processed => DateTime.now.utc, :transaction_type => OrderTransaction::TYPE_CAPTURE, :amount => self.total ) case sc.pp_name when 'authorize.net' transaction = AuthorizeNet::AIM::Transaction.new(sc.pp_username, sc.pp_password) response = transaction.prior_auth_capture(t.transaction_id, self.total) ot.success = response.response_code && response.response_code == '1' ot.transaction_id = response.transaction_id ot.auth_code = response. ot.response_code = response.response_code ot.save self.update_attribute(:financial_status, Order::FINANCIAL_STATUS_CAPTURED) resp.success = 'Captured funds successfully' when 'stripe' # TODO: Implement capture funds for stripe when 'payscape' # TODO: Implement capture funds for payscape end end return resp end |
#check_nil_fields ⇒ Object
86 87 88 89 90 91 92 93 94 |
# File 'app/models/caboose/order.rb', line 86 def check_nil_fields self.subtotal = 0.00 if self.subtotal.nil? self.tax = 0.00 if self.tax.nil? self.shipping = 0.00 if self.shipping.nil? self.handling = 0.00 if self.handling.nil? self.custom_discount = 0.00 if self.custom_discount.nil? self.discount = 0.00 if self.discount.nil? self.total = 0.00 if self.total.nil? end |
#decrement_quantities ⇒ Object
96 97 98 99 100 101 102 103 104 |
# File 'app/models/caboose/order.rb', line 96 def decrement_quantities return false if self.decremented self.line_items.each do |line_item| line_item.variant.update_attribute(:quantity, line_item.variant.quantity_in_stock - line_item.quantity) end self.update_attribute(:decremented, true) end |
#has_downloadable_items? ⇒ Boolean
225 226 227 228 229 230 |
# File 'app/models/caboose/order.rb', line 225 def has_downloadable_items? self.line_items.each do |li| return true if li.variant.downloadable end return false end |
#has_empty_shipping_methods? ⇒ Boolean
216 217 218 219 220 221 222 223 |
# File 'app/models/caboose/order.rb', line 216 def has_empty_shipping_methods? return true if self.order_packages.nil? return true if self.order_packages.count == 0 self.order_packages.all.each do |op| return true if op.shipping_method_id.nil? end return false end |
#has_shippable_items? ⇒ Boolean
232 233 234 235 236 237 |
# File 'app/models/caboose/order.rb', line 232 def has_shippable_items? self.line_items.each do |li| return true if !li.variant.downloadable end return false end |
#increment_quantities ⇒ Object
106 107 108 109 110 111 112 113 114 |
# File 'app/models/caboose/order.rb', line 106 def increment_quantities return false if !self.decremented self.line_items.each do |line_item| line_item.variant.update_attribute(:quantity, line_item.variant.quantity_in_stock - line_item.quantity) end self.update_attribute(:decremented, false) end |
#item_count ⇒ Object
201 202 203 204 205 |
# File 'app/models/caboose/order.rb', line 201 def item_count count = 0 self.line_items.each{ |li| count = count + li.quantity } if self.line_items return count end |
#refund ⇒ Object
132 133 134 |
# File 'app/models/caboose/order.rb', line 132 def refund PaymentProcessor.refund(self) end |
#resend_confirmation ⇒ Object
116 117 118 |
# File 'app/models/caboose/order.rb', line 116 def resend_confirmation OrdersMailer.configure_for_site(self.site_id).customer_new_order(self).deliver end |
#send_payment_authorization_email ⇒ Object
def refund
resp = StdClass.new
t = OrderTransaction.where(:order_id => self.id, :transaction_type => OrderTransaction::TYPE_CAPTURE, :success => true).first
if self.financial_status != Order::FINANCIAL_STATUS_CAPTURED
resp.error = "This order hasn't been captured yet, you will need to void instead"
else
sc = self.site.store_config
case sc.pp_name
when 'authorize.net'
if PaymentProcessor.refund(order)
order.update_attributes(
:financial_status => Order::FINANCIAL_STATUS_REFUNDED,
:status => Order::STATUS_CANCELED
)
response.success = 'Order refunded successfully'
else
response.error = 'Error refunding order'
end
#if order.calculate_net < (order.amount_discounted || 0) || PaymentProcessor.refund(order)
# order.financial_status = 'refunded'
# order.status = 'refunded'
# order.save
#
# if order.discounts.any?
# discount = order.discounts.first
# amount_to_refund = order.calculate_net < order.amount_discounted ? order.calculate_net : order.amount_discounted
# discount.update_attribute(:amount_current, amount_to_refund + discount.amount_current)
# end
#
# response.success = "Order refunded successfully"
#else
# response.error = "Error refunding order."
#end
end
render json: response
# return if !user_is_allowed('orders', 'edit')
#
# response = Caboose::StdClass.new({
# 'refresh' => nil,
# 'error' => nil,
# 'success' => nil
# })
#
# order = Order.find(params[:id])
#
# if order.financial_status != 'captured'
# response.error = "This order hasn't been captured yet, you will need to void instead"
# else
# if PaymentProcessor.refund(order)
# order.financial_status = 'refunded'
# order.status = 'refunded'
# order.save
#
# # Add the variant quantities ordered back
# order.cancel
#
# response.success = "Order refunded successfully"
# else
# response.error = "Error refunding order."
# end
# end
#
# render :json => response
end
417 418 419 |
# File 'app/models/caboose/order.rb', line 417 def OrdersMailer.configure_for_site(self.site_id).(self).deliver end |
#shipping_and_handling ⇒ Object
197 198 199 |
# File 'app/models/caboose/order.rb', line 197 def shipping_and_handling (self.shipping ? self.shipping : 0.0) + (self.handling ? self.handling : 0.0) end |
#take_gift_card_funds ⇒ Object
207 208 209 210 211 212 213 214 |
# File 'app/models/caboose/order.rb', line 207 def take_gift_card_funds return if self.discounts.nil? || self.discounts.count == 0 self.discounts.each do |d| gc = d.gift_card gc.balance = gc.balance - d.amount gc.save end end |
#test? ⇒ Boolean
120 121 122 |
# File 'app/models/caboose/order.rb', line 120 def test? self.status == 'testing' end |
#void ⇒ Object
Void an authorized order
289 290 291 |
# File 'app/models/caboose/order.rb', line 289 def void PaymentProcessor.void(self) end |