Class: TravelSponsorship

Inherits:
ReimbursableRequest show all
Defined in:
app/models/travel_sponsorship.rb

Overview

Request from a user to get help from the TSP for a given event

State Machines

This class contains 1 state machine(s).

state

Instance Attribute Summary

Attributes inherited from Request

#contact_phone_number, #created_at, #description, #state, #state_updated_at, #type, #updated_at, #visa_letter

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ReimbursableRequest

#can_cancel?, #expenses, #expenses_sum, expenses_sum, #lacks_reimbursement?, #no_expenses?, #reimbursement

Methods inherited from Request

#event

Methods included from HasState

#active?, #assigned_roles, #can_be_destroyed?, #can_cancel?, #cancel, #editable?, #human_state_description, #human_state_guide, #in_final_state?, #in_initial_state?, #label, #notify_state, #title, #with_transitions?

Methods inherited from ApplicationRecord

ransackable_associations, ransackable_attributes

Class Method Details

.in_conflict_withActiveRecord::Relation<TravelSponsorship>

A relation of TravelSponsorships that are in conflict with. Active Record Scope

Returns:

See Also:



10
11
12
13
14
# File 'app/models/travel_sponsorship.rb', line 10

scope :in_conflict_with, lambda { |req|
  others = active.where(user_id: req.user_id, event_id: req.event_id)
  others = others.where(['id <> ?', req.id]) if req.id
  others
}

.notify_missing_reimbursement(after_end_threshold, before_deadline_threshold) ⇒ Object

Sends notifications about requests lacking a reimbursement.

Looks for events that finished some days ago or that are about to reach the reimbursement deadline and sends a reminder for every request associated to those events and lacking a reimbursement object.

Parameters:

  • after_end_threshold (#to_i)

    number of days after the event to start sending reminders

  • before_deadline_threshold (#to_i)

    number of days before the reimbursement deadline to start sending reminders



102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'app/models/travel_sponsorship.rb', line 102

def self.notify_missing_reimbursement(after_end_threshold, before_deadline_threshold)
  now = Time.zone.now
  # Skip events finished more than 6 months ago to keep the size under control
  candidate_events = Event.where(
    ['(end_date > ? and end_date < ?) or '\
      '(reimbursement_creation_deadline > ? and reimbursement_creation_deadline < ?)',
     now - 6.months, now - after_end_threshold, now, now + before_deadline_threshold]
  )
  candidate_events.includes(:requests).each do |e|
    e.requests.each do |r|
      ReimbursableRequestMailer.notify_to([r.user], :missing_reimbursement, r) if r.lacks_reimbursement?
    end
  end
end

Instance Method Details

#allow_cancel?(role_name) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
76
# File 'app/models/travel_sponsorship.rb', line 73

def allow_cancel?(role_name)
  r = role_name.to_sym
  %i[requester supervisor].include?(r) || (r == :tsp && !accepted?)
end

#can_have_reimbursement?Boolean

Checks whether the request is ready for reimbursement

Returns:

  • (Boolean)

    true if all conditions are met



81
82
83
# File 'app/models/travel_sponsorship.rb', line 81

def can_have_reimbursement?
  accepted? && (!reimbursement.nil? || event.accepting_reimbursements?)
end

#visa_letter_allowed?Boolean

Check wheter the visa_letter attribute can be used

Returns:

  • (Boolean)

    true if the requester can ask for visa letter



88
89
90
# File 'app/models/travel_sponsorship.rb', line 88

def visa_letter_allowed?
  event.try(:visa_letters) == true
end