mirror of
https://github.com/jcwimer/wrestlingApp
synced 2026-03-25 01:14:43 +00:00
286 lines
7.7 KiB
Ruby
286 lines
7.7 KiB
Ruby
class Match < ActiveRecord::Base
|
|
belongs_to :tournament, touch: true
|
|
belongs_to :weight, touch: true
|
|
belongs_to :mat, touch: true
|
|
has_many :wrestlers, :through => :weight
|
|
has_many :schools, :through => :wrestlers
|
|
validate :score_validation, :win_type_validation, :bracket_position_validation, :overtime_type_validation
|
|
after_update :after_finished_actions, :if => :saved_change_to_finished? or :saved_change_to_winner_id? or :saved_change_to_win_type? or :saved_change_to_score?
|
|
|
|
def after_finished_actions
|
|
if self.w1
|
|
wrestler1.touch
|
|
end
|
|
if self.w2
|
|
wrestler2.touch
|
|
end
|
|
if self.finished == 1 && self.winner_id != nil
|
|
if self.mat
|
|
self.mat.assign_next_match
|
|
end
|
|
advance_wrestlers
|
|
calculate_school_points
|
|
end
|
|
end
|
|
|
|
BRACKET_POSITIONS = ["Pool","1/2","3/4","5/6","7/8","Quarter","Semis","Conso Semis","Bracket","Conso", "Conso Quarter"]
|
|
WIN_TYPES = ["Decision", "Major", "Tech Fall", "Pin", "Forfeit", "Injury Default", "Default", "DQ", "BYE"]
|
|
OVERTIME_TYPES = ["", "SV-1", "TB-1", "UTB", "SV-2", "TB-2", "OT"] # had to keep the blank here for validations
|
|
|
|
def score_validation
|
|
if finished == 1
|
|
if ! winner_id
|
|
errors.add(:winner_id, "cannot be blank")
|
|
end
|
|
if win_type == "Pin" and ! score.match(/^[0-5]?[0-9]:[0-5][0-9]/)
|
|
errors.add(:score, "needs to be in time format MM:SS when win type is Pin example: 1:23 or 10:03")
|
|
end
|
|
if win_type == "Decision" or win_type == "Tech Fall" or win_type == "Major" and ! score.match(/^[0-9]?[0-9]-[0-9]?[0-9]/)
|
|
errors.add(:score, "needs to be in Number-Number format when win type is Decision, Tech Fall, and Major example: 10-2")
|
|
end
|
|
if (win_type == "Forfeit" or win_type == "Injury Default" or win_type == "Default" or win_type == "BYE" or win_type == "DQ") and (score != "")
|
|
errors.add(:score, "needs to be blank when win type is Forfeit, Injury Default, Default, BYE, or DQ win_type")
|
|
end
|
|
end
|
|
end
|
|
|
|
def win_type_validation
|
|
if finished == 1
|
|
if ! WIN_TYPES.include? win_type
|
|
errors.add(:win_type, "can only be one of the following #{WIN_TYPES.to_s}")
|
|
end
|
|
end
|
|
end
|
|
|
|
def overtime_type_validation
|
|
# overtime_type can be nil or of type OVERTIME_TYPES
|
|
if overtime_type != nil and ! OVERTIME_TYPES.include? overtime_type
|
|
errors.add(:overtime_type, "can only be one of the following #{OVERTIME_TYPES.to_s}")
|
|
end
|
|
end
|
|
|
|
def bracket_position_validation
|
|
if ! BRACKET_POSITIONS.include? bracket_position
|
|
errors.add(:bracket_position, "can only be one of the following #{BRACKET_POSITIONS.to_s}")
|
|
end
|
|
end
|
|
|
|
def is_consolation_match
|
|
if self.bracket_position == "Conso" or self.bracket_position == "Conso Quarter" or self.bracket_position == "Conso Semis" or self.bracket_position == "3/4" or self.bracket_position == "5/6" or self.bracket_position == "7/8"
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
def is_championship_match
|
|
if self.bracket_position == "Pool" or self.bracket_position == "Quarter" or self.bracket_position == "Semis" or self.bracket_position == "Bracket" or self.bracket_position == "1/2"
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
def calculate_school_points
|
|
if self.w1 && self.w2
|
|
wrestler1.school.calculate_score
|
|
wrestler2.school.calculate_score
|
|
end
|
|
end
|
|
|
|
def wrestler_in_match(wrestler)
|
|
if self.w1 == wrestler.id or self.w2 == wrestler.id
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
def mat_assigned
|
|
if self.mat
|
|
"Mat #{self.mat.name}"
|
|
else
|
|
""
|
|
end
|
|
end
|
|
|
|
def pin_time_in_seconds
|
|
if self.win_type == "Pin"
|
|
time = self.score.delete("")
|
|
minutes_in_seconds = time.partition(':').first.to_i * 60
|
|
sec = time.partition(':').last.to_i
|
|
return minutes_in_seconds + sec
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def advance_wrestlers
|
|
if self.w1
|
|
AdvanceWrestler.new(wrestler1, self).advance
|
|
end
|
|
if self.w2
|
|
AdvanceWrestler.new(wrestler2, self).advance
|
|
end
|
|
end
|
|
|
|
|
|
def bracket_score_string
|
|
if self.finished != 1
|
|
return ""
|
|
end
|
|
if self.finished == 1
|
|
overtime_type_abbreviation = ""
|
|
if self.overtime_type != "" and self.overtime_type
|
|
overtime_type_abbreviation = " #{self.overtime_type}"
|
|
end
|
|
if self.win_type == "Injury Default"
|
|
return "(Inj)"
|
|
elsif self.win_type == "DQ"
|
|
return "(DQ)"
|
|
elsif self.win_type == "Forfeit"
|
|
return "(FF)"
|
|
else
|
|
win_type_abbreviation = "#{self.win_type.chars.to_a[0..2].join('')}"
|
|
return "(#{win_type_abbreviation} #{self.score}#{overtime_type_abbreviation})"
|
|
end
|
|
end
|
|
end
|
|
|
|
def wrestler1
|
|
wrestlers.select{|w| w.id == self.w1}.first
|
|
end
|
|
|
|
def wrestler2
|
|
wrestlers.select{|w| w.id == self.w2}.first
|
|
end
|
|
|
|
def w1_name
|
|
if self.w1 != nil
|
|
wrestler1.name
|
|
else
|
|
self.loser1_name
|
|
end
|
|
end
|
|
|
|
def w2_name
|
|
if self.w2 != nil
|
|
wrestler2.name
|
|
else
|
|
self.loser2_name
|
|
end
|
|
end
|
|
|
|
def w1_bracket_name
|
|
return_string = ""
|
|
return_string_ending = ""
|
|
if self.w1 and self.winner_id == self.w1
|
|
return_string = return_string + "<strong>"
|
|
return_string_ending = return_string_ending + "</strong>"
|
|
end
|
|
if self.w1 != nil
|
|
if self.round == 1 and (self.bracket_position == "Bracket" or self.bracket_position == "Quarter")
|
|
if self.wrestler1.original_seed
|
|
return_string = return_string + "[#{wrestler1.original_seed}] "
|
|
end
|
|
return_string = return_string + "#{w1_name} - #{wrestler1.school.name} (#{wrestler1.season_win}-#{wrestler1.season_loss})"
|
|
else
|
|
return_string = return_string + "#{w1_name} (#{wrestler1.school.abbreviation})"
|
|
end
|
|
else
|
|
return_string = return_string + "#{w1_name}"
|
|
end
|
|
return return_string + return_string_ending
|
|
end
|
|
|
|
def w2_bracket_name
|
|
return_string = ""
|
|
return_string_ending = ""
|
|
if self.w2 and self.winner_id == self.w2
|
|
return_string = return_string + "<strong>"
|
|
return_string_ending = return_string_ending + "</strong>"
|
|
end
|
|
if self.w2 != nil
|
|
if self.round == 1 and self.bracket_position == "Bracket"
|
|
if self.wrestler2.original_seed
|
|
return_string = return_string + "#{wrestler2.original_seed} "
|
|
end
|
|
return_string = return_string + "#{w2_name} - #{wrestler2.school.name} (#{wrestler2.season_win}-#{wrestler2.season_loss})"
|
|
else
|
|
return_string = return_string + "#{w2_name} (#{wrestler2.school.abbreviation})"
|
|
end
|
|
else
|
|
return_string = return_string + "#{w2_name}"
|
|
end
|
|
return return_string + return_string_ending
|
|
end
|
|
|
|
def winner_name
|
|
if self.finished != 1
|
|
return ""
|
|
end
|
|
if self.winner_id == self.w1
|
|
return self.w1_name
|
|
end
|
|
if self.winner_id == self.w2
|
|
return self.w2_name
|
|
end
|
|
end
|
|
|
|
def bracket_winner_name
|
|
if winner_name != ""
|
|
return "#{winner_name} (#{Wrestler.find(winner_id).school.abbreviation})"
|
|
else
|
|
""
|
|
end
|
|
end
|
|
|
|
def weight_max
|
|
self.weight.max
|
|
end
|
|
|
|
def replace_loser_name_with_wrestler(w,loser_name)
|
|
if self.loser1_name == loser_name
|
|
self.w1 = w.id
|
|
self.save
|
|
end
|
|
if self.loser2_name == loser_name
|
|
self.w2 = w.id
|
|
self.save
|
|
end
|
|
end
|
|
|
|
def replace_loser_name_with_bye(loser_name)
|
|
if self.loser1_name == loser_name
|
|
self.loser1_name = "BYE"
|
|
self.save
|
|
end
|
|
if self.loser2_name == loser_name
|
|
self.loser2_name = "BYE"
|
|
self.save
|
|
end
|
|
end
|
|
|
|
def pool_number
|
|
if self.w1?
|
|
wrestler1.pool
|
|
end
|
|
end
|
|
|
|
def list_w2_stats
|
|
if self.w2
|
|
"#{w2_name} (#{wrestler2.school.name}): #{w2_stat}"
|
|
else
|
|
""
|
|
end
|
|
end
|
|
|
|
def list_w1_stats
|
|
if self.w1
|
|
"#{w1_name} (#{wrestler1.school.name}): #{w1_stat}"
|
|
else
|
|
""
|
|
end
|
|
end
|
|
end
|