schild.cjs 14 KB

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