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