Class: TicketService::Redeem

Inherits:
ApplicationService
  • Object
show all
Includes:
DefaultErrorContainer
Defined in:
app/services/ticket_service/redeem.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from DefaultErrorContainer

#error, #error_message_simple, #merge_errors

Constructor Details

#initialize(params) ⇒ Redeem

Initialize the service with parameters

Parameters:

  • params (Hash)

    Parameters for ticket redemption



9
10
11
# File 'app/services/ticket_service/redeem.rb', line 9

def initialize(params)
  @params = params
end

Instance Attribute Details

#paramsObject

Returns the value of attribute params.



4
5
6
# File 'app/services/ticket_service/redeem.rb', line 4

def params
  @params
end

Instance Method Details

#executeBoolean

Execute the ticket redemption process

Returns:

  • (Boolean)

    True if redemption is successful, false otherwise



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'app/services/ticket_service/redeem.rb', line 16

def execute
  ticket = Ticket.find_by(ticket_code: params[:code])

  return false unless valid_ticket?(ticket)

  ticket.name = params[:name] if params[:name].present?
  ticket.phone = params[:phone] if params[:phone].present?
  ticket.guest_detail = params[:guest_detail] if params[:guest_detail].present?
  ticket.redeemed_at = Time.now_in_tz(ticket.ticket_transaction.restaurant.time_zone)

  unless ticket.save
    merge_errors(ticket.errors)
    return false
  end

  NotificationService::Sms.new(phones: ticket.phone, ticket: ticket).send_ticket_redeemed
  UserMailer.ticket_redeem(ticket.id).deliver_later!

  true
end

#valid_ticket?(ticket) ⇒ Boolean

Validate if the ticket is valid for redemption

Parameters:

  • ticket (Ticket)

    The ticket to validate

Returns:

  • (Boolean)

    True if ticket is valid, false otherwise



41
42
43
44
45
46
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
73
74
75
76
77
78
# File 'app/services/ticket_service/redeem.rb', line 41

def valid_ticket?(ticket)
  if ticket.blank?
    errors.add(:base, 'Voucher not found')
    return false
  end

  # Validate if ticket is active
  unless ticket.active
    errors.add(:base, 'Voucher is not active')
    return false
  end

  # Validate if ticket has already been redeemed
  if ticket.redeemed_at.present?
    errors.add(:base, 'Voucher has already been redeemed')
    return false
  end

  # Validate date range
  current_time = Time.now_in_tz(ticket.ticket_transaction.restaurant.time_zone).to_date

  if ticket.valid_start_date.blank? || ticket.valid_end_date.blank?
    errors.add(:base, 'Voucher has invalid date range')
    return false
  end

  if current_time < ticket.valid_start_date
    errors.add(:base, 'Voucher is not yet valid')
    return false
  end

  if current_time > ticket.valid_end_date
    errors.add(:base, 'Voucher has expired')
    return false
  end

  true
end