modify ticket and ticket_purchases models

This commit is contained in:
Rishabh Saxena 2016-07-27 19:41:42 +05:30
parent 1894cea975
commit e2d42fbbbb
2 changed files with 19 additions and 14 deletions

View file

@ -18,24 +18,27 @@ class Ticket < ActiveRecord::Base
end end
def paid?(user) def paid?(user)
ticket_purchases.find_by(user: user, paid: true).present? ticket_purchases.paid.by_user(user).present?
end end
def quantity_bought_by(user) def quantity_bought_by(user, paid: false)
result = ticket_purchases.where(user_id: user.id).first ticket_purchases.by_user(user).where(paid: paid).sum(:quantity)
result ? result.quantity : 0
end end
def total_price(user) def unpaid?(user)
quantity_bought_by(user) * price ticket_purchases.unpaid.by_user(user).present?
end end
def self.total_price(conference, user) def total_price(user, paid: false)
quantity_bought_by(user, paid: paid) * price
end
def self.total_price(conference, user, paid: false)
tickets = Ticket.where(conference_id: conference.id) tickets = Ticket.where(conference_id: conference.id)
result = nil result = nil
begin begin
tickets.each do |ticket| tickets.each do |ticket|
price = ticket.total_price(user) price = ticket.total_price(user, paid: paid)
if result if result
result += price unless price.zero? result += price unless price.zero?
else else

View file

@ -7,23 +7,24 @@ class TicketPurchase < ActiveRecord::Base
validates_numericality_of :quantity, greater_than: 0 validates_numericality_of :quantity, greater_than: 0
validates_uniqueness_of :user_id,
scope: :ticket_id,
message: 'already bought this ticket!'
delegate :title, to: :ticket delegate :title, to: :ticket
delegate :description, to: :ticket delegate :description, to: :ticket
delegate :price, to: :ticket delegate :price, to: :ticket
delegate :price_cents, to: :ticket delegate :price_cents, to: :ticket
delegate :price_currency, to: :ticket delegate :price_currency, to: :ticket
scope :paid, -> { where(paid: true) }
scope :unpaid, -> { where(paid: false) }
scope :by_conference, -> (conference) { where(conference_id: conference.id) }
scope :by_user, -> (user) { where(user_id: user.id) }
def self.purchase(conference, user, purchases) def self.purchase(conference, user, purchases)
errors = [] errors = []
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
conference.tickets.each do |ticket| conference.tickets.each do |ticket|
quantity = purchases[ticket.id.to_s].to_i quantity = purchases[ticket.id.to_s].to_i
# if the user bought the ticket, just update the quantity # if the user bought the ticket, just update the quantity
if ticket.bought?(user) if ticket.bought?(user) && ticket.unpaid?(user)
purchase = update_quantity(conference, quantity, ticket, user) purchase = update_quantity(conference, quantity, ticket, user)
else else
purchase = purchase_ticket(conference, quantity, ticket, user) purchase = purchase_ticket(conference, quantity, ticket, user)
@ -48,7 +49,8 @@ class TicketPurchase < ActiveRecord::Base
def self.update_quantity(conference, quantity, ticket, user) def self.update_quantity(conference, quantity, ticket, user)
purchase = TicketPurchase.where(ticket_id: ticket.id, purchase = TicketPurchase.where(ticket_id: ticket.id,
conference_id: conference.id, conference_id: conference.id,
user_id: user.id).first user_id: user.id,
paid: false).first
purchase.quantity = quantity if quantity > 0 purchase.quantity = quantity if quantity > 0
purchase purchase