diff options
Diffstat (limited to 'app/models/chouette/journey_pattern.rb')
| -rw-r--r-- | app/models/chouette/journey_pattern.rb | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb new file mode 100644 index 000000000..d48733edb --- /dev/null +++ b/app/models/chouette/journey_pattern.rb @@ -0,0 +1,109 @@ +class Chouette::JourneyPattern < Chouette::TridentActiveRecord +  # FIXME http://jira.codehaus.org/browse/JRUBY-6358 +  self.primary_key = "id" + +  belongs_to :route +  has_many :vehicle_journeys, :dependent => :destroy +  has_many :vehicle_journey_at_stops, :through => :vehicle_journeys +  has_and_belongs_to_many :stop_points, -> { order("stop_points.position") }, :before_add => :vjas_add, :before_remove => :vjas_remove, :after_add => :shortcuts_update_for_add, :after_remove => :shortcuts_update_for_remove +  has_many :journey_pattern_sections +  has_many :route_sections, through: :journey_pattern_sections, dependent: :destroy + +  validates_presence_of :route + +  enum section_status: { todo: 0, completed: 1, control: 2 } + +  attr_accessor  :control_checked +  after_update :control_route_sections, :unless => "control_checked" + +  # TODO: this a workarround +  # otherwise, we loose the first stop_point +  # when creating a new journey_pattern +  def special_update +    bck_sp = self.stop_points.map {|s| s} +    self.update_attributes :stop_points => [] +    self.update_attributes :stop_points => bck_sp +  end + +  def departure_stop_point +    return unless departure_stop_point_id +    Chouette::StopPoint.find( departure_stop_point_id) +  end + +  def arrival_stop_point +    return unless arrival_stop_point_id +    Chouette::StopPoint.find( arrival_stop_point_id) +  end + +  def shortcuts_update_for_add( stop_point) +    stop_points << stop_point unless stop_points.include?( stop_point) + +    ordered_stop_points = stop_points +    ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty? + +    self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id), +                             :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id)) +  end + +  def shortcuts_update_for_remove( stop_point) +    stop_points.delete( stop_point) if stop_points.include?( stop_point) + +    ordered_stop_points = stop_points +    ordered_stop_points = ordered_stop_points.sort { |a,b| a.position <=> b.position} unless ordered_stop_points.empty? + +    self.update_attributes( :departure_stop_point_id => (ordered_stop_points.first && ordered_stop_points.first.id), +                             :arrival_stop_point_id => (ordered_stop_points.last && ordered_stop_points.last.id)) +  end + +  def vjas_add( stop_point) +    return if new_record? + +    vehicle_journeys.each do |vj| +      vjas = vj.vehicle_journey_at_stops.create :stop_point_id => stop_point.id +    end +  end + +  def vjas_remove( stop_point) +    return if new_record? + +    vehicle_journey_at_stops.where( :stop_point_id => stop_point.id).each do |vjas| +      vjas.destroy +    end +  end + +  def control_route_sections +    stop_area_ids = self.stop_points.map(&:stop_area_id) +    control_route_sections_by_stop_areas(stop_area_ids) +  end + +  def control_route_sections_by_stop_areas(stop_area_ids) +    journey_pattern_section_all +    i = 0 +    to_control = false +    stop_area_ids.each_cons(2) do |a| +      jps = @route_sections_orders[i] +      i += 1 +      unless jps +        to_control = true +        next +      end +      unless [jps.route_section.departure.id, jps.route_section.arrival.id] == a +        jps.destroy +        to_control = true +      end +    end +    self.control_checked = true +    to_control ? self.control! : self.completed! +  end + +  protected + +  def journey_pattern_section_all +    @route_sections_orders = {} +    self.journey_pattern_sections.all.map do |journey_pattern_section| +      @route_sections_orders[journey_pattern_section.rank] = journey_pattern_section +    end +  end + +end + | 
