schild.rb 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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.Sortierung }.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. # Assoziation für Noten
  108. class Noten < Sequel::Model(:schuelerleistungsdaten)
  109. many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
  110. many_to_one :fach, :class => :Faecher, :key => :Fach_ID
  111. # Notenbezeichnung als String
  112. def note
  113. case self.NotenKrz
  114. when "1"
  115. "sehr gut"
  116. when "2"
  117. "gut"
  118. when "3"
  119. "befriedigend"
  120. when "4"
  121. "ausreichend"
  122. when "5"
  123. "mangelhaft"
  124. when "6"
  125. "ungenügend"
  126. when 'NB'
  127. "----------"
  128. end
  129. end
  130. # Bezeichnung des Fachs
  131. def bezeichnung
  132. fach.Bezeichnung
  133. end
  134. # Die Fachgruppen ID des Fachs
  135. def fachgruppe_ID
  136. fach.Fachgruppe_ID
  137. end
  138. end
  139. # Assoziation für Fächer
  140. class Faecher < Sequel::Model(:eigeneschule_faecher)
  141. one_to_one :noten
  142. end
  143. # Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
  144. class Schule < Sequel::Model(:eigeneschule)
  145. # gibt die Schulnummer zurück
  146. def self.schulnummer
  147. self.first.SchulNr
  148. end
  149. end
  150. end