schild.rb 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. require "schild/version"
  2. require 'sequel'
  3. # Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt
  4. module Schild
  5. # ist die Datenbank-Verbindung. Alle Daten können über diese Konstante abgerufen werden
  6. DB = Sequel.connect(:adapter=>ENV['S_ADAPTER'], :host=>ENV['S_HOST'], :user=>ENV['S_USER'], :password=>ENV['S_PASSWORD'], :database=>ENV['S_DB'])
  7. # Stellt eine Verbindung zu einem Schild-Server her. Sollte nur aufgerufen werden, wenn wechselnde Verbindungen nötig sind.
  8. def self.connect
  9. Sequel.connect(:adapter=>ENV['S_ADAPTER'], :host=>ENV['S_HOST'], :user=>ENV['S_USER'], :password=>ENV['S_PASSWORD'], :database=>ENV['S_DB'])
  10. end
  11. # Stellt die Schüler-Tabelle samt Assoziationen bereit.
  12. class Schueler < Sequel::Model(:schueler)
  13. many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
  14. one_to_many :abschnitte, :class => :Abschnitt
  15. # gibt das z.Zt. aktuelle Halbjahr zurück.
  16. def akt_halbjahr
  17. abschnitte.last
  18. end
  19. # gibt das erste Halbjahr von +jahr+ zurück.
  20. def erstes_halbjahr(jahr)
  21. halbjahr(jahr, 1)
  22. end
  23. # gibt das zweite Halbjahr von +jahr+ zurück.
  24. def zweites_halbjahr(jahr)
  25. halbjahr(jahr, 2)
  26. end
  27. # gibt aus +jahr+ das Halbjahr +1+ oder +2+ zurück.
  28. def halbjahr(jahr, abschnitt)
  29. abschnitte_dataset.where(:jahr => jahr, :abschnitt => abschnitt).first
  30. end
  31. # gibt +Herr+ oder +Frau+ als Anrede für Schüler zurück.
  32. def anrede
  33. if self.Geschlecht == 3
  34. return "Herr"
  35. elsif self.Geschlecht == 4
  36. return "Frau"
  37. end
  38. end
  39. # gibt +true+ zurück, wenn Schüler volljährig.
  40. def volljaehrig?
  41. self.Volljaehrig == "+"
  42. end
  43. # gibt das aktuelle Schuljahr als String im Format "2014/15" zurück.
  44. def schuljahr
  45. jahr = self.AktSchuljahr
  46. "#{jahr}/#{jahr-1999}"
  47. end
  48. end
  49. # Dient als Assoziation für Schüler und deren Klassenbezeichnung etc.
  50. class Fachklasse < Sequel::Model(:eigeneschule_fachklassen)
  51. one_to_one :schueler
  52. end
  53. # Assoziation für Lehrer, hauptsächlich für Klassenlehrer
  54. class Klassenlehrer < Sequel::Model(:k_lehrer)
  55. one_to_one :abschnitt, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
  56. end
  57. # Ist die Assoziation, die Halbjahre, sog. Abschnitte zurückgibt.
  58. class Abschnitt < Sequel::Model(:schuelerlernabschnittsdaten)
  59. many_to_one :schueler, :class => :Schueler, :key => :Schueler_ID
  60. one_to_many :noten, :class => :Noten
  61. many_to_one :klassenlehrer, :class => :Klassenlehrer, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
  62. dataset_module do
  63. # filtert den Datensatz nach Jahr
  64. def jahr(i)
  65. where(:Jahr => i)
  66. end
  67. # filtert den Datensatz nach Halbjahr
  68. def halbjahr(i,j)
  69. jahr(i).where(:Abschnitt => j)
  70. end
  71. # filtert und gibt den Datensatz als Abschnitt des aktuellen Halbjahrs zurück
  72. def akt_halbjahr
  73. halbjahr(Time.new.year-1, 1).first
  74. end
  75. end
  76. # wählt alle berufsbezogenen Fächer des gewählten Schülers in angegeben Halbjahr.
  77. def berufsbezogen
  78. noten.select{ |n| n.fach.Fachgruppe_ID == 20 && !n.NotenKrz.nil? }
  79. end
  80. # wählt alle berufsübergreifenden Fächer des gewählten Schülers in angegeben Halbjahr.
  81. def berufsuebergreifend
  82. noten.select{ |n| n.fach.Fachgruppe_ID == 10 && !n.NotenKrz.nil? }
  83. end
  84. # wählt alle Fächer des Differenzierungsbreichs des gewählten Schülers in angegeben Halbjahr.
  85. def differenzierungsbereich
  86. noten.select{ |n| n.fach.Fachgruppe_ID == 30 && !n.NotenKrz.nil? }
  87. end
  88. # wählt alle Fächergruppen aus.
  89. def faechergruppen
  90. [berufsuebergreifend, berufsbezogen, differenzierungsbereich]
  91. end
  92. # gibt den Namen des Klassenlehrers mit gekürztem Vornamen.
  93. def v_name_klassenlehrer
  94. v = klassenlehrer.Vorname
  95. n = klassenlehrer.Nachname
  96. "#{v[0]}. #{n}"
  97. end
  98. # gibt "Klassenlehrer" entsprechend Geschlecht zurück
  99. def klassenlehrer_in
  100. klassenlehrer.Geschlecht == "3" ? "Klassenlehrer" : "Klassenlehrerin"
  101. end
  102. end
  103. # Assoziation für Noten
  104. class Noten < Sequel::Model(:schuelerleistungsdaten)
  105. many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
  106. many_to_one :fach, :class => :Faecher, :key => :Fach_ID
  107. # Notenbezeichnung als String
  108. def note
  109. case self.NotenKrz
  110. when "1"
  111. "sehr gut"
  112. when "2"
  113. "gut"
  114. when "3"
  115. "befriedigend"
  116. when "4"
  117. "ausreichend"
  118. when "5"
  119. "mangelhaft"
  120. when "6"
  121. "ungenügend"
  122. when 'NB'
  123. "----------"
  124. end
  125. end
  126. # Bezeichnung des Fachs
  127. def bezeichnung
  128. fach.Bezeichnung
  129. end
  130. # Die Fachgruppen ID des Fachs
  131. def fachgruppe_ID
  132. fach.Fachgruppe_ID
  133. end
  134. end
  135. # Assoziation für Fächer
  136. class Faecher < Sequel::Model(:eigeneschule_faecher)
  137. one_to_one :noten
  138. end
  139. # Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
  140. class Schule < Sequel::Model(:eigeneschule)
  141. # gibt die Schulnummer zurück
  142. def self.schulnummer
  143. self.first.SchulNr
  144. end
  145. end
  146. end