Introduced Physical Ticket
Added PhysicalTicket model and controller. It holds the information about each physical ticket bought at the purchase. Physical Tickets are created after every successfull payment.
This commit is contained in:
parent
1c38b091cc
commit
5c56683ae8
17 changed files with 115 additions and 12 deletions
|
|
@ -18,7 +18,7 @@ class PaymentsController < ApplicationController
|
|||
|
||||
if @payment.purchase && @payment.save
|
||||
update_purchased_ticket_purchases
|
||||
redirect_to conference_conference_registration_path(@conference.short_title),
|
||||
redirect_to conference_physical_ticket_index_path,
|
||||
notice: 'Thanks! Your ticket is booked successfully.'
|
||||
else
|
||||
@total_amount_to_pay = Ticket.total_price(@conference, current_user, paid: false)
|
||||
|
|
@ -38,6 +38,8 @@ class PaymentsController < ApplicationController
|
|||
end
|
||||
|
||||
def update_purchased_ticket_purchases
|
||||
current_user.ticket_purchases.by_conference(@conference).unpaid.update_all(paid: true, payment_id: @payment.id)
|
||||
current_user.ticket_purchases.by_conference(@conference).unpaid.each do |ticket_purchase|
|
||||
ticket_purchase.pay(@payment)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
12
app/controllers/physical_ticket_controller.rb
Normal file
12
app/controllers/physical_ticket_controller.rb
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
class PhysicalTicketController < ApplicationController
|
||||
before_action :authenticate_user!
|
||||
load_resource :conference, find_by: :short_title
|
||||
load_and_authorize_resource
|
||||
authorize_resource :conference_registrations, class: Registration
|
||||
|
||||
def index
|
||||
@physical_tickets = current_user.physical_tickets.by_conference(@conference)
|
||||
end
|
||||
|
||||
def show; end
|
||||
end
|
||||
|
|
@ -11,7 +11,7 @@ class TicketPurchasesController < ApplicationController
|
|||
redirect_to new_conference_payment_path,
|
||||
notice: 'Please pay here to get tickets.'
|
||||
elsif current_user.ticket_purchases.by_conference(@conference).paid.any?
|
||||
redirect_to conference_conference_registration_path(@conference.short_title),
|
||||
redirect_to conference_physical_ticket_index_path,
|
||||
notice: 'You have free tickets for the conference.'
|
||||
else
|
||||
redirect_to conference_tickets_path(@conference.short_title),
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ class Ability
|
|||
can :index, Ticket
|
||||
can :manage, TicketPurchase, user_id: user.id
|
||||
can [:new, :create], Payment, user_id: user.id
|
||||
can [:index, :show], PhysicalTicket, user_id: user.id
|
||||
|
||||
can [:create, :destroy], Subscription, user_id: user.id
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ class Conference < ActiveRecord::Base
|
|||
has_one :email_settings, dependent: :destroy
|
||||
has_one :program, dependent: :destroy
|
||||
has_one :venue, dependent: :destroy
|
||||
has_many :physical_tickets, through: :ticket_purchases
|
||||
has_many :ticket_purchases, dependent: :destroy
|
||||
has_many :payments, dependent: :destroy
|
||||
has_many :supporters, through: :ticket_purchases, source: :user
|
||||
|
|
|
|||
6
app/models/physical_ticket.rb
Normal file
6
app/models/physical_ticket.rb
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
class PhysicalTicket < ActiveRecord::Base
|
||||
belongs_to :ticket_purchase
|
||||
has_one :ticket, through: :ticket_purchase
|
||||
has_one :conference, through: :ticket_purchase
|
||||
has_one :user, through: :ticket_purchase
|
||||
end
|
||||
|
|
@ -13,6 +13,8 @@ class TicketPurchase < ActiveRecord::Base
|
|||
delegate :price_cents, to: :ticket
|
||||
delegate :price_currency, to: :ticket
|
||||
|
||||
has_many :physical_tickets
|
||||
|
||||
scope :paid, -> { where(paid: true) }
|
||||
scope :unpaid, -> { where(paid: false) }
|
||||
scope :by_conference, ->(conference) { where(conference_id: conference.id) }
|
||||
|
|
@ -45,8 +47,8 @@ class TicketPurchase < ActiveRecord::Base
|
|||
purchase = new(ticket_id: ticket.id,
|
||||
conference_id: conference.id,
|
||||
user_id: user.id,
|
||||
quantity: quantity,
|
||||
paid: ticket.price_cents.zero?)
|
||||
quantity: quantity)
|
||||
purchase.pay(nil) if ticket.price_cents.zero?
|
||||
end
|
||||
purchase
|
||||
end
|
||||
|
|
@ -60,6 +62,13 @@ class TicketPurchase < ActiveRecord::Base
|
|||
purchase.quantity = quantity if quantity > 0
|
||||
purchase
|
||||
end
|
||||
|
||||
def pay(payment)
|
||||
update_attributes(paid: true, payment: payment)
|
||||
PhysicalTicket.transaction do
|
||||
quantity.times { physical_tickets.create }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -6,6 +6,11 @@ end
|
|||
|
||||
class User < ActiveRecord::Base
|
||||
rolify
|
||||
has_many :physical_tickets, through: :ticket_purchases do
|
||||
def by_conference(conference)
|
||||
where('ticket_purchases.conference_id = ?', conference)
|
||||
end
|
||||
end
|
||||
has_many :users_roles
|
||||
has_many :roles, through: :users_roles, dependent: :destroy
|
||||
|
||||
|
|
|
|||
|
|
@ -38,3 +38,5 @@
|
|||
= link_to 'Subscribe', conference_subscriptions_path(conference.short_title), method: :post, class: 'btn btn-default'
|
||||
- else
|
||||
= link_to 'Unsubscribe', conference_subscriptions_path(conference.short_title), method: :delete, class: 'btn btn-default'
|
||||
- if current_user && current_user.physical_tickets.by_conference(conference).any?
|
||||
= link_to "My Tickets", conference_physical_ticket_index_path(conference.short_title), class: 'btn btn-default'
|
||||
|
|
|
|||
35
app/views/physical_ticket/index.html.haml
Normal file
35
app/views/physical_ticket/index.html.haml
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
.container
|
||||
.row
|
||||
.col-md-12.page-header
|
||||
%h2
|
||||
Tickets
|
||||
.text-muted
|
||||
Your tickets for the conference
|
||||
|
||||
.col-md-12
|
||||
- if @physical_tickets.present?
|
||||
%table.table.table-bordered.table-striped.table-hover#roles
|
||||
%thead
|
||||
%th ID
|
||||
%th Type
|
||||
%th User
|
||||
%th Actions
|
||||
%tbody
|
||||
- @physical_tickets.each do |physical_ticket|
|
||||
%tr
|
||||
%td= physical_ticket.id
|
||||
%td= physical_ticket.ticket.title
|
||||
%td= physical_ticket.user.name
|
||||
%td
|
||||
.btn-group
|
||||
= link_to 'Show',
|
||||
conference_physical_ticket_path(@conference.short_title,
|
||||
physical_ticket.id),
|
||||
class: 'btn btn-primary'
|
||||
= link_to 'Generate PDF',
|
||||
conference_physical_ticket_path(@conference.short_title,
|
||||
physical_ticket.id,
|
||||
format: :pdf),
|
||||
class: 'button btn btn-default btn-info'
|
||||
- else
|
||||
%h5 No Tickets found!
|
||||
0
app/views/physical_ticket/show.html.haml
Normal file
0
app/views/physical_ticket/show.html.haml
Normal file
Loading…
Add table
Add a link
Reference in a new issue