schild.rb 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. # Hilfsmethode für die folgenden Methoden
  77. def faecher_nach_id(id)
  78. noten.sort_by{ |n| n.fach.SortierungS2 }.select{ |n| n.fach.Fachgruppe_ID == id && n.AufZeugnis == '+' }
  79. end
  80. # wählt alle berufsübergreifenden Fächer des gewählten Schülers in angegeben Halbjahr.
  81. def berufsuebergreifend
  82. faecher_nach_id 10
  83. end
  84. # wählt alle berufsbezogenen Fächer des gewählten Schülers in angegeben Halbjahr.
  85. def berufsbezogen
  86. faecher_nach_id 20
  87. end
  88. # wählt alle Fächer des Differenzierungsbreichs des gewählten Schülers in angegeben Halbjahr.
  89. def differenzierungsbereich
  90. faecher_nach_id 30
  91. end
  92. # wählt alle Fächergruppen aus.
  93. def faechergruppen
  94. [berufsuebergreifend, berufsbezogen, differenzierungsbereich]
  95. end
  96. # gibt den Namen des Klassenlehrers mit gekürztem Vornamen.
  97. def v_name_klassenlehrer
  98. v = klassenlehrer.Vorname
  99. n = klassenlehrer.Nachname
  100. "#{v[0]}. #{n}"
  101. end
  102. # gibt "Klassenlehrer" entsprechend Geschlecht zurück
  103. def klassenlehrer_in
  104. klassenlehrer.Geschlecht == "3" ? "Klassenlehrer" : "Klassenlehrerin"
  105. end
  106. end
  107. # gibt das aktuelle Schuljahr als String im Format "2014/15" zurück.
  108. def schuljahr
  109. jahr = self.Jahr
  110. "#{jahr}/#{jahr-1999}"
  111. end
  112. # Assoziation für Noten
  113. class Noten < Sequel::Model(:schuelerleistungsdaten)
  114. many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
  115. many_to_one :fach, :class => :Faecher, :key => :Fach_ID
  116. # Notenbezeichnung als String
  117. def note
  118. case self.NotenKrz
  119. when "1"
  120. "sehr gut"
  121. when "2"
  122. "gut"
  123. when "3"
  124. "befriedigend"
  125. when "4"
  126. "ausreichend"
  127. when "5"
  128. "mangelhaft"
  129. when "6"
  130. "ungenügend"
  131. when 'NB'
  132. "----------"
  133. when 'E3'
  134. "teilgenommen"
  135. end
  136. end
  137. # Bezeichnung des Fachs
  138. def bezeichnung
  139. fach.Bezeichnung
  140. end
  141. # Die Fachgruppen ID des Fachs
  142. def fachgruppe_ID
  143. fach.Fachgruppe_ID
  144. end
  145. end
  146. # Assoziation für Fächer
  147. class Faecher < Sequel::Model(:eigeneschule_faecher)
  148. one_to_one :noten
  149. end
  150. # Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
  151. class Schule < Sequel::Model(:eigeneschule)
  152. # gibt die Schulnummer zurück
  153. def self.schulnummer
  154. self.first.SchulNr
  155. end
  156. def self.v_name_schulleiter
  157. "#{self.first.SchulleiterVorname[0]}. #{self.first.SchulleiterName}"
  158. end
  159. def self.schulleiter_in
  160. self.first.SchulleiterGeschlecht == 3 ? "Schulleiter" : "Schulleiterin"
  161. end
  162. def self.ort
  163. self.first.Ort
  164. end
  165. end
  166. end