schild.esm.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. import Knex from 'knex';
  2. import { Model } from 'objection';
  3. // Then you can simply run the snake_casing code in $parseDatabaseJson or $formatJson
  4. class Schueler extends Model {
  5. static get tableName () { return 'schueler' }
  6. static get virtualAttributes () {
  7. return ['anrede', 'akt_halbjahr', 'schueler_in', 'studierende_r', 'berufsbezeichnung_mw', 'volljaehrig']
  8. }
  9. get anrede () {
  10. return (this.Geschlecht === 3 ? 'Herr' : 'Frau')
  11. }
  12. get schueler_in () {
  13. return (this.Geschlecht === 3 ? 'Schüler' : 'Schülerin')
  14. }
  15. get studierende_r () {
  16. return (this.Geschlecht === 3 ? 'Studierender' : 'Studierende')
  17. }
  18. get berufsbezeichnung_mw () {
  19. if (this.fachklasse) return this.Geschlecht === 3 ? this.fachklasse.Bezeichnung : this.fachklasse.Beschreibung_W
  20. else return 'Keine Fachklasse zugeordnet'
  21. }
  22. get volljaehrig () {
  23. return this.Volljaehrig === '+'
  24. }
  25. volljaehrig_bei (datum) {
  26. if (!datum || !this.Geburtsdatum) return false
  27. var g = new Date(this.Geburtsdatum);
  28. var d = new Date(datum);
  29. return (d.getFullYear() - g.getFullYear() - ((d.getMonth() > g.getMonth() || (d.getMonth() === g.getMonth() && d.getDay() >= g.getDay())) ? 0 : 1)) >= 18
  30. }
  31. static get relationMappings () {
  32. return {
  33. fachklasse: {
  34. relation: Model.BelongsToOneRelation,
  35. modelClass: Fachklasse,
  36. join: { from: 'schueler.Fachklasse_ID', to: 'eigeneschule_fachklassen.ID' }
  37. },
  38. abschnitte: {
  39. relation: Model.HasManyRelation,
  40. modelClass: Abschnitt,
  41. join: { from: 'schueler.ID', to: 'schuelerlernabschnittsdaten.Schueler_ID' }
  42. },
  43. vermerke: {
  44. relation: Model.HasManyRelation,
  45. modelClass: Vermerk,
  46. join: { from: 'schueler.ID', to: 'schuelervermerke.Schueler_ID' }
  47. },
  48. bk_abschluss: {
  49. relation: Model.HasOneRelation,
  50. modelClass: BKAbschluss,
  51. join: { from: 'schueler.ID', to: 'schuelerbkabschluss.Schueler_ID' }
  52. },
  53. bk_abschluss_faecher: {
  54. relation: Model.HasManyRelation,
  55. modelClass: BKAbschlussFach,
  56. join: { from: 'schueler.ID', to: 'schuelerbkfaecher.Schueler_ID' }
  57. },
  58. abi_abschluss: {
  59. relation: Model.HasOneRelation,
  60. modelClass: AbiAbschluss,
  61. join: { from: 'schueler.ID', to: 'schuelerabitur.Schueler_ID' }
  62. },
  63. abi_abschluss_faecher: {
  64. relation: Model.HasManyRelation,
  65. modelClass: AbiAbschlussFach,
  66. join: { from: 'schueler.ID', to: 'schuelerabifaecher.Schueler_ID' }
  67. },
  68. fhr_abschluss: {
  69. relation: Model.HasOneRelation,
  70. modelClass: FHRAbschluss,
  71. join: { from: 'schueler.ID', to: 'schuelerfhr.Schueler_ID' }
  72. },
  73. fhr_abschluss_faecher: {
  74. relation: Model.HasManyRelation,
  75. modelClass: FHRAbschlussFach,
  76. join: { from: 'schueler.ID', to: 'schuelerfhrfaecher.Schueler_ID' }
  77. },
  78. schuelerfoto: {
  79. relation: Model.HasOneRelation,
  80. modelClass: Schuelerfoto,
  81. join: { from: 'schueler.ID', to: 'schuelerfotos.Schueler_ID' }
  82. },
  83. sprachenfolgen: {
  84. relation: Model.HasManyRelation,
  85. modelClass: Sprachenfolge,
  86. join: { from: 'schueler.ID', to: 'schuelersprachenfolge.Schueler_ID' }
  87. },
  88. versetzung: {
  89. relation: Model.HasOneRelation,
  90. modelClass: Versetzung,
  91. join: { from: 'schueler.Klasse', to: 'versetzung.Klasse' }
  92. }
  93. }
  94. }
  95. }
  96. class Fachklasse extends Model {
  97. static get tableName () { return 'eigeneschule_fachklassen' }
  98. static get relationMappings () {
  99. return {
  100. fach_gliederungen: {
  101. relation: Model.HasManyRelation,
  102. modelClass: FachGliederung,
  103. join: { from: 'eigeneschule_fachklassen.ID', to: 'fach_gliederungen.Fachklasse_ID' }
  104. }
  105. }
  106. }
  107. }
  108. class Abschnitt extends Model {
  109. static get tableName () { return 'schuelerlernabschnittsdaten' }
  110. static get virtualAttributes () {
  111. return ['v_name_klassenlehrer', 'klassenlehrer_in', 'schuljahr']
  112. }
  113. get v_name_klassenlehrer () {
  114. return `${this.lehrer?.Vorname?.[0]}. ${this.lehrer?.Nachname}`
  115. }
  116. get klassenlehrer_in () {
  117. return (this.lehrer?.Geschlecht === '3' ? 'Klassenlehrer' : 'Klassenlehrerin')
  118. }
  119. get schuljahr () {
  120. return `${this.Jahr}/${this.Jahr - 1999}`
  121. }
  122. static get relationMappings () {
  123. return {
  124. lehrer: {
  125. relation: Model.BelongsToOneRelation,
  126. modelClass: Lehrer,
  127. join: { from: 'schuelerlernabschnittsdaten.KlassenLehrer', to: 'k_lehrer.Kuerzel' }
  128. },
  129. fachklasse: {
  130. relation: Model.BelongsToOneRelation,
  131. modelClass: Fachklasse,
  132. join: { from: 'schuelerlernabschnittsdaten.Fachklasse_ID', to: 'eigeneschule_fachklassen.ID' }
  133. },
  134. noten: {
  135. relation: Model.HasManyRelation,
  136. modelClass: Note,
  137. join: { from: 'schuelerlernabschnittsdaten.ID', to: 'schuelerleistungsdaten.Abschnitt_ID' }
  138. }
  139. }
  140. }
  141. }
  142. class Jahrgang extends Model {
  143. static get tableName () { return 'eigeneschule_jahrgaenge' }
  144. }
  145. class Versetzung extends Model {
  146. static get tableName () { return 'versetzung' }
  147. static get relationMappings () {
  148. return {
  149. jahrgang: {
  150. relation: Model.BelongsToOneRelation,
  151. modelClass: Jahrgang,
  152. join: { from: 'versetzung.Jahrgang_ID', to: 'eigeneschule_jahrgaenge.ID' }
  153. },
  154. fachklasse: {
  155. relation: Model.BelongsToOneRelation,
  156. modelClass: Fachklasse,
  157. join: { from: 'versetzung.Fachklasse_ID', to: 'eigeneschule_fachklassen.ID' }
  158. },
  159. schueler: {
  160. relation: Model.HasManyRelation,
  161. modelClass: Schueler,
  162. join: { from: 'versetzung.Klasse', to: 'schueler.Klasse' }
  163. }
  164. }
  165. }
  166. }
  167. class Lehrer extends Model {
  168. static get tableName () { return 'k_lehrer' }
  169. }
  170. class Note extends Model {
  171. static get tableName () { return 'schuelerleistungsdaten' }
  172. static get relationMappings () {
  173. return {
  174. fach: {
  175. relation: Model.BelongsToOneRelation,
  176. modelClass: Fach,
  177. join: { from: 'schuelerleistungsdaten.Fach_ID', to: 'eigeneschule_faecher.ID' }
  178. }
  179. }
  180. }
  181. }
  182. class Fach extends Model {
  183. static get tableName () { return 'eigeneschule_faecher' }
  184. static get relationMappings () {
  185. return {
  186. fach_gliederungen: {
  187. relation: Model.HasManyRelation,
  188. modelClass: FachGliederung,
  189. join: { from: 'eigeneschule_faecher.ID', to: 'fach_gliederungen.Fach_ID' }
  190. }
  191. }
  192. }
  193. }
  194. class BKAbschluss extends Model {
  195. static get tableName () { return 'schuelerbkabschluss' }
  196. }
  197. class BKAbschlussFach extends Model {
  198. static get tableName () { return 'schuelerbkfaecher' }
  199. static get relationMappings () {
  200. return {
  201. fach: {
  202. relation: Model.BelongsToOneRelation,
  203. modelClass: Fach,
  204. join: { from: 'schuelerbkfaecher.Fach_ID', to: 'eigeneschule_faecher.ID' }
  205. }
  206. }
  207. }
  208. }
  209. class AbiAbschluss extends Model {
  210. static get tableName () { return 'schuelerabitur' }
  211. }
  212. class AbiAbschlussFach extends Model {
  213. static get tableName () { return 'schuelerabifaecher' }
  214. static get relationMappings () {
  215. return {
  216. fach: {
  217. relation: Model.BelongsToOneRelation,
  218. modelClass: Fach,
  219. join: { from: 'schuelerabifaecher.Fach_ID', to: 'eigeneschule_faecher.ID' }
  220. }
  221. }
  222. }
  223. }
  224. class FHRAbschluss extends Model {
  225. static get tableName () { return 'schuelerfhr' }
  226. }
  227. class FHRAbschlussFach extends Model {
  228. static get tableName () { return 'schuelerfhrfaecher' }
  229. static get relationMappings () {
  230. return {
  231. fach: {
  232. relation: Model.BelongsToOneRelation,
  233. modelClass: Fach,
  234. join: { from: 'schuelerfhrfaecher.Fach_ID', to: 'eigeneschule_faecher.ID' }
  235. }
  236. }
  237. }
  238. }
  239. class Sprachenfolge extends Model {
  240. static get tableName () { return 'schuelersprachenfolge' }
  241. static get relationMappings () {
  242. return {
  243. fach: {
  244. relation: Model.BelongsToOneRelation,
  245. modelClass: Fach,
  246. join: { from: 'schuelersprachenfolge.Fach_ID', to: 'eigeneschule_faecher.ID' }
  247. }
  248. }
  249. }
  250. }
  251. class FachGliederung extends Model {
  252. static get tableName () { return 'fach_gliederungen' }
  253. static get relationMappings () {
  254. return {
  255. fachklasse: {
  256. relation: Model.BelongsToOneRelation,
  257. modelClass: Fachklasse,
  258. join: { from: 'fach_gliederungen.Fachklasse_ID', to: 'eigeneschule_fachklassen.ID' }
  259. }
  260. }
  261. }
  262. }
  263. class Vermerk extends Model {
  264. static get tableName () { return 'schuelervermerke' }
  265. }
  266. class Schuelerfoto extends Model {
  267. static get tableName () { return 'schuelerfotos' }
  268. }
  269. class Schule extends Model {
  270. static get tableName () { return 'eigeneschule' }
  271. static get virtualAttributes () {
  272. return ['schulleiter_in']
  273. }
  274. get schulleiter_in () {
  275. return this.SchulleiterGeschlecht === 3 ? 'Schulleiter' : 'Schulleiterin'
  276. }
  277. }
  278. class Nutzer extends Model {
  279. static get tableName () { return 'users' }
  280. }
  281. class Schild {
  282. constructor() {
  283. this.options = null;
  284. this.knex = null;
  285. }
  286. async connect(knexConfig) {
  287. try {
  288. this.knex = await Knex(knexConfig);
  289. Model.knex(this.knex);
  290. } catch (e) {
  291. throw e;
  292. }
  293. }
  294. disconnect() {
  295. if (this.knex) this.knex.destroy();
  296. }
  297. async testConnection() {
  298. try {
  299. await this.knex.raw('select 1+1 as result');
  300. console.log('Testverbindung konnte aufgebaut werden');
  301. return true;
  302. } catch (err) {
  303. console.log(err);
  304. console.log('Testverbindung konnte nicht aufgebaut werden');
  305. throw err
  306. }
  307. }
  308. async suche(pattern) {
  309. const pattern_w = pattern+'%';
  310. try {
  311. const sres = await Schueler
  312. .query()
  313. .whereRaw(`
  314. Geloescht='-'
  315. AND Gesperrt='-'
  316. AND (CONCAT(Vorname,' ',Name) LIKE ?
  317. OR CONCAT(Name,', ',Vorname) LIKE ?)
  318. `
  319. , [pattern_w, pattern_w])
  320. .select('Name', 'Vorname', 'Klasse', 'Status', 'AktSchuljahr', 'ID')
  321. .orderBy('AktSchuljahr', 'desc');
  322. const schueler = sres.map(s => {
  323. return {
  324. value: `${s.Name}, ${s.Vorname} (${s.Klasse})`,
  325. status: s.Status,
  326. jahr: s.AktSchuljahr,
  327. id: s.ID
  328. };
  329. });
  330. const kres = await Versetzung.query().where('Klasse', 'like', pattern + '%').select('Klasse').orderBy('Klasse', 'desc');
  331. const klassen = kres.map(k => {
  332. return {
  333. value: k.Klasse,
  334. id: k.Klasse
  335. };
  336. });
  337. return schueler.concat(klassen)
  338. } catch (e) {
  339. throw e;
  340. }
  341. }
  342. async getSchueler(id) {
  343. try {
  344. const res = await Schueler.query()
  345. .where(function () {
  346. this.where('Geloescht', '-')
  347. .andWhere('Gesperrt', '-')
  348. .andWhere('ID', id);})
  349. .withGraphFetched(`
  350. [abschnitte.[noten.fach, lehrer],
  351. fachklasse.[fach_gliederungen], versetzung, bk_abschluss,
  352. bk_abschluss_faecher.fach, fhr_abschluss, fhr_abschluss_faecher.fach,
  353. abi_abschluss, abi_abschluss_faecher.fach, vermerke, sprachenfolgen.fach]
  354. `)
  355. .modifyGraph('abschnitte', builder => {
  356. builder.orderBy('ID');
  357. }).first();
  358. return res.toJSON()
  359. } catch (e) {
  360. throw e;
  361. }
  362. }
  363. async getKlasse(klasse) {
  364. try {
  365. const res = await Versetzung.query()
  366. .where('Klasse', klasse)
  367. .withGraphFetched(`
  368. [schueler.[abschnitte.[noten.fach, lehrer],
  369. fachklasse.[fach_gliederungen], versetzung, bk_abschluss,
  370. bk_abschluss_faecher.fach, fhr_abschluss, fhr_abschluss_faecher.fach,
  371. abi_abschluss, abi_abschluss_faecher.fach, vermerke, sprachenfolgen.fach], fachklasse,
  372. jahrgang]
  373. `)
  374. .modifyGraph('schueler', builder => {
  375. builder.where(function () {
  376. this.where('Geloescht', '-')
  377. .andWhere('Gesperrt', '-');})
  378. .orderBy('Name');
  379. })
  380. .first();
  381. return res.toJSON()
  382. } catch (e) {
  383. throw e;
  384. }
  385. }
  386. async getSchule() {
  387. try {
  388. const res = await Schule.query().first();
  389. delete res.SchulLogo;
  390. delete res.Einstellungen;
  391. delete res.Einstellungen2;
  392. return res.toJSON()
  393. } catch (e) {
  394. throw e;
  395. }
  396. }
  397. async getSchuelerfoto(id) {
  398. try {
  399. const data = await Schuelerfoto.query().where('Schueler_ID', id).first();
  400. return Buffer.from(data.Foto, 'binary').toString('base64');
  401. } catch (e) {
  402. throw e;
  403. }
  404. }
  405. async getNutzer(username) {
  406. try {
  407. const res = await Nutzer.query().where('US_LoginName', username).first();
  408. return res.toJSON()
  409. } catch (e) {
  410. throw e;
  411. }
  412. }
  413. }
  414. export { AbiAbschluss, AbiAbschlussFach, Abschnitt, BKAbschluss, BKAbschlussFach, FHRAbschluss, FHRAbschlussFach, Fach, FachGliederung, Fachklasse, Jahrgang, Lehrer, Note, Nutzer, Schild, Schueler, Schuelerfoto, Schule, Sprachenfolge, Vermerk, Versetzung };