class Planik::Arbeitszeitkonto::Zeitspanne

Definiert eine Zeitspanne einer bestimmten Zeitkontos (Sa, den 03.08.15 von 22 - 24) oder eines Dienstes. Kann die Ueberlappung von zwei Zeitspannen berechnen

Attributes

datum_zeit_bis[R]
datum_zeit_von[R]

Public Class Methods

create_time(datum, zeit, next_day = false) click to toggle source

Hilfsfunktion um ein Timeobjekt zu erzeugen

# File lib/arbeitszeitkonto/zeitspanne.rb, line 21
def self.create_time(datum, zeit, next_day = false)
  datum = datum +1 if next_day
  Time.new(datum.year, datum.month, datum.day, zeit[0], zeit[1])
end
new(zeit_von, zeit_bis) click to toggle source
# File lib/arbeitszeitkonto/zeitspanne.rb, line 27
def initialize(zeit_von, zeit_bis)
  raise(ArbeitszeitkontoError, "zeit_von ist grösser als zeit_bis") if zeit_von > zeit_bis
  raise(ArbeitszeitkontoError, "zeit_von und zeit_bis sind gleich") if zeit_von == zeit_bis
  @datum_zeit_von = zeit_von
  @datum_zeit_bis = zeit_bis
end
relative(datum, zeit_von, zeit_bis) click to toggle source

def self.from_dienst dienst

Zeitspanne.new(dienst.datum_zeit_von.to_date, dienst.datum_zeit_von, dienst.datum_zeit_bis, from_dienst: true)

end

# File lib/arbeitszeitkonto/zeitspanne.rb, line 15
def self.relative datum, zeit_von, zeit_bis
  self.new(create_time(datum, zeit_von), create_time(datum, zeit_bis, zeit_von[0] > zeit_bis[0]))
end

Public Instance Methods

datum() click to toggle source
# File lib/arbeitszeitkonto/zeitspanne.rb, line 34
def datum
  datum_zeit_von.to_date
end
overlap(kandidat) click to toggle source
# File lib/arbeitszeitkonto/zeitspanne.rb, line 69
def overlap(kandidat)
  seconds = 0
  reste = []
  case
    # Fall 1: komplette Überlappung
    when kandidat.datum_zeit_von >= datum_zeit_von && kandidat.datum_zeit_bis <= datum_zeit_bis
      #puts "#{self.class.name}#overlap: komplette Überlappung"
      seconds = kandidat.datum_zeit_bis - kandidat.datum_zeit_von
      # rest3: keine
    # Fall 2a: Teilüberlappung
    when kandidat.datum_zeit_von < datum_zeit_von && kandidat.datum_zeit_bis > datum_zeit_von && kandidat.datum_zeit_bis <= datum_zeit_bis
      #puts "#{self.class.name}#overlap: Teilweise Überlappung: vorne"
      seconds = kandidat.datum_zeit_bis - datum_zeit_von
      reste << Zeitspanne.new(kandidat.datum_zeit_von, datum_zeit_von)
      # rest: kandidat.datum_zeit_von - self.datzm_zeit_von
    # Fall 2b: Teilüberlappung
    when kandidat.datum_zeit_von > datum_zeit_von && kandidat.datum_zeit_von < datum_zeit_bis
      #puts "#{self.class.name}#overlap: Teilweise Überlappung: hinten"
      seconds = datum_zeit_bis - kandidat.datum_zeit_von
      reste << Zeitspanne.new(datum_zeit_bis, kandidat.datum_zeit_bis)
    # Fall 2c: Teilüberlappung: Kandidat lappt über beide Ende
    when kandidat.datum_zeit_von < datum_zeit_von && kandidat.datum_zeit_bis > datum_zeit_bis
      #puts "#{self.class.name}#overlap: Fall 2c: Teilüberlappung: Kandidat lappt über beide Ende  "
      seconds = datum_zeit_bis - datum_zeit_von
      reste << Zeitspanne.new(kandidat.datum_zeit_von, datum_zeit_von)
      reste << Zeitspanne.new(datum_zeit_bis, kandidat.datum_zeit_bis)
    # Fall 3: Keine Überlappung
    when kandidat.datum_zeit_bis <= datum_zeit_von || kandidat.datum_zeit_von >= datum_zeit_bis
      #puts "#{self.class.name}#overlap: Keine Überlappung"
      second = 0
      reste << kandidat
    else
      raise ArbeitszeitkontoError, "overlap: Unbekannte Situation"
  end
  [seconds, reste]
end
to_s() click to toggle source
# File lib/arbeitszeitkonto/zeitspanne.rb, line 106
def to_s
  "#{d_to_s(datum_zeit_von)} - #{d_to_s(datum_zeit_bis)}"
end

Private Instance Methods

d_to_s(dt) click to toggle source
# File lib/arbeitszeitkonto/zeitspanne.rb, line 112
def d_to_s dt
  dt.strftime("%Y-%m-%d %H:%M:%S")
end