From 58cb62dd6dff82a2475547792ab3d839f29c3d4e Mon Sep 17 00:00:00 2001 From: Michael Klimenko Date: Sat, 24 Mar 2018 01:24:49 +0500 Subject: [PATCH] Fix tickets turnover calculation --- app/models/ticket.rb | 10 ++++------ app/models/ticket_purchase.rb | 5 +++++ spec/models/ticket_spec.rb | 11 +++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 6ae4a91d..f28e96a4 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -61,12 +61,10 @@ class Ticket < ApplicationRecord end def tickets_turnover_total(id) - tickets = TicketPurchase.where(ticket_id: id).paid - if tickets.blank? - Money.new(0, Ticket.find(id).price_currency) - else - tickets.inject(Money.new(0, tickets.first.price_currency)){ |sum, ticket| sum + (ticket.amount_paid * ticket.quantity) } - end + ticket = Ticket.find(id) + return Money.new(0, 'USD') unless ticket + sum = ticket.ticket_purchases.paid.total + Money.new(sum, ticket.price_currency) end def tickets_sold diff --git a/app/models/ticket_purchase.rb b/app/models/ticket_purchase.rb index 15de3785..35f36b4c 100644 --- a/app/models/ticket_purchase.rb +++ b/app/models/ticket_purchase.rb @@ -69,6 +69,11 @@ class TicketPurchase < ApplicationRecord purchase end + # Total amount + def self.total + sum('amount_paid * quantity') + end + def pay(payment) update_attributes(paid: true, payment: payment) PhysicalTicket.transaction do diff --git a/spec/models/ticket_spec.rb b/spec/models/ticket_spec.rb index d54dc5cb..cf6f4ae4 100644 --- a/spec/models/ticket_spec.rb +++ b/spec/models/ticket_spec.rb @@ -65,6 +65,17 @@ describe Ticket do end end + describe '#tickets_turnover_total' do + let!(:purchase1) { create :ticket_purchase, ticket: ticket, amount_paid: 5_000, quantity: 1, paid: true, user: user } + let!(:purchase2) { create :ticket_purchase, ticket: ticket, amount_paid: 5_000, quantity: 2, paid: true, user: user } + let!(:purchase3) { create :ticket_purchase, ticket: ticket, amount_paid: 5_000, quantity: 10, paid: false, user: user } + subject { ticket.tickets_turnover_total ticket.id } + + it 'returns turnover as Money with ticket\'s currency' do + is_expected.to eq Money.new(5_000 * 3, ticket.price_currency) + end + end + describe '#unpaid?' do let!(:ticket_purchase) { create(:ticket_purchase, user: user, ticket: ticket) }