<?php

use \CI3_Events as Events;
class Lehreinheit_model extends DB_Model
{

	/**
	 * Constructor
	 */
	public function __construct()
	{
		parent::__construct();
		$this->dbTable = 'lehre.tbl_lehreinheit';
		$this->pk = 'lehreinheit_id';

		$this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
		$this->load->model('education/lehreinheitgruppe_model', 'LehreinheitgruppeModel');
		$this->load->model('education/lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
		$this->load->model('organisation/studiengang_model', 'StudiengangModel');
		$this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
		$this->load->model('ressource/stundenplan_model', 'StundenplanModel');
		$this->load->model('system/Log_model', 'LogModel');
	}

	/**
	 * Gets Lehreinheiten for a Lehrveranstaltung in a Studiensemester.
	 * Includes Lehrfach, Lehreinheitgruppen and Lektoren.
	 * @param $lehrveranstaltung_id
	 * @param $studiensemester
	 * @return array with Lehreinheiten and their Lehreinheitgruppen
	 */
	public function getLesForLv($lehrveranstaltung_id, $studiensemester)
	{
		$lehreinheiten = array();

		$this->addSelect(
			'lehreinheit_id, lehrveranstaltung_id, studiensemester_kurzbz, lehrform_kurzbz,
			stundenblockung, wochenrythmus, start_kw, raumtyp, raumtypalternativ,
			sprache, lehre, unr, lvnr, lehrfach_id, gewicht'
		);
		$this->addOrder('lehreinheit_id');
		$les = $this->loadWhere(
			array('lehrveranstaltung_id' => $lehrveranstaltung_id,
				'studiensemester_kurzbz' => $studiensemester)
		);

		if (hasData($les))
		{
			$this->LehrveranstaltungModel->addSelect('kurzbz, bezeichnung');
			foreach ($les->retval as $le)
			{
				$lehrfach = $this->LehrveranstaltungModel->load($le->lehrfach_id);
				if (hasData($lehrfach))
				{
					$letoadd = $le;
					$letoadd->lehrfach_bezeichnung = $lehrfach->retval[0]->bezeichnung;
					$letoadd->lehrfach_kurzbz = $lehrfach->retval[0]->kurzbz;

					// add lehreinheitgruppen, each lehreinheitid
					// having (maybe multiple) lehreinheitgruppen
					$letoadd->lehreinheitgruppen = array();

					$this->LehreinheitgruppeModel->addSelect('lehre.tbl_lehreinheitgruppe.*, tbl_gruppe.bezeichnung, tbl_gruppe.direktinskription');
					$this->LehreinheitgruppeModel->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT');

					$lehreinheitgruppen = $this->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $le->lehreinheit_id));

					if (hasData($lehreinheitgruppen))
					{
						foreach ($lehreinheitgruppen->retval as $lehreinheitgruppe)
						{
							$studiengangresponse = $this->StudiengangModel->load($lehreinheitgruppe->studiengang_kz);
							if (hasData($studiengangresponse))
							{
								$studiengang = $studiengangresponse->retval[0];
								$stgkuerzel = mb_strtoupper($studiengang->typ.$studiengang->kurzbz);

								$letoadd->lehreinheitgruppen[] = array(
									'semester' => $lehreinheitgruppe->semester,
									'verband' => $lehreinheitgruppe->verband,
									'gruppe' => $lehreinheitgruppe->gruppe,
									'gruppe_kurzbz' => $lehreinheitgruppe->gruppe_kurzbz,
									'direktinskription' => $lehreinheitgruppe->direktinskription,
									'studiengang_kz' => $lehreinheitgruppe->studiengang_kz,
									'studiengang_kuerzel' => $stgkuerzel
								);
							}
						}
					}

					// add lektoren
					$letoadd->lektoren = array();
					$lehreinheitmitarbeiter = $this->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $le->lehreinheit_id));
					if (hasData($lehreinheitmitarbeiter))
					{
						foreach ($lehreinheitmitarbeiter->retval as $lehreinheitma)
						{
							$letoadd->lektoren[] = $lehreinheitma->mitarbeiter_uid;
						}
					}

					$lehreinheiten[] = $letoadd;
				}
			}
		}

		return $lehreinheiten;
	}

	/**
	 * Gets students of a Lehreinheit
	 * @param int $lehreinheit_id
	 * @return array
	 */
	public function getStudenten($lehreinheit_id)
	{
		$query = 'SELECT uid, vorname, nachname, prestudent_id '
			. 'FROM campus.vw_student_lehrveranstaltung '
			. 'JOIN campus.vw_student '
			. 'USING (uid) '
			. 'WHERE lehreinheit_id = ?'
			. ' ORDER BY nachname';

		return $this->execQuery($query, array($lehreinheit_id));
	}

	/**
	 * Gets emails of all Studierende in a lehrveranstaltung
	 * @param int $lehreinheit_id
	 * @return array
	 */
	public function getStudentenMail($lehreinheit_id)
	{
		  
		// logic used from cis_menu_lv.inc.php line 335
		return $this->execReadOnlyQuery("
		SELECT
			gruppe_kurzbz,
			CASE 
				WHEN nomail = TRUE THEN 'nomail'
				WHEN gruppe_kurzbz !='' THEN LOWER(gruppe_kurzbz || '@' || ?)
				ELSE LOWER(stg_typ || stg_kurzbz || semester || TRIM(verband) || TRIM(gruppe) || '@' || ?) 
			END AS mail
			
		FROM 
		(
			SELECT 
				distinct vw_lehreinheit.studiensemester_kurzbz, vw_lehreinheit.stg_kurzbz, vw_lehreinheit.stg_typ, vw_lehreinheit.semester,
				COALESCE(vw_lehreinheit.verband,'') as verband, COALESCE(vw_lehreinheit.gruppe,'') as gruppe, vw_lehreinheit.gruppe_kurzbz, tbl_gruppe.mailgrp,
				CASE
					WHEN mailgrp = TRUE OR mailgrp IS NULL THEN FALSE
					ELSE TRUE
				END as nomail
			FROM campus.vw_lehreinheit
			LEFT JOIN public.tbl_gruppe USING(gruppe_kurzbz)
			WHERE 
				vw_lehreinheit.lehrveranstaltung_id=
				(select distinct lehrveranstaltung_id from campus.vw_lehreinheit where lehreinheit_id=?)
				AND
				vw_lehreinheit.studiensemester_kurzbz =
				(select distinct studiensemester_kurzbz from campus.vw_lehreinheit where lehreinheit_id=?)
				AND (vw_lehreinheit.gruppe_kurzbz IS NULL OR
					(vw_lehreinheit.gruppe_kurzbz IS NOT NULL AND (SELECT COUNT(*) FROM public.tbl_benutzergruppe where gruppe_kurzbz = vw_lehreinheit.gruppe_kurzbz AND studiensemester_kurzbz = vw_lehreinheit.studiensemester_kurzbz) > 0))
				
		
		) AS subquery
		",[DOMAIN,DOMAIN,$lehreinheit_id,$lehreinheit_id ]);
	}

    public function getLehreinheitenForStudentAndStudienSemester($lehrveranstaltung_id, $student_uid, $studiensemester_kurzbz)
    {
	$query = <<<EOSQL
	    SELECT
	      le.* 
	    FROM 
	      lehre.tbl_lehreinheit le 
	    JOIN 
	      campus.vw_student_lehrveranstaltung vslv USING(lehreinheit_id)
	    WHERE 
	      vslv.lehrveranstaltung_id = {$this->escape($lehrveranstaltung_id)} AND 
	      vslv.uid = {$this->escape($student_uid)} AND 
	      vslv.studiensemester_kurzbz = {$this->escape($studiensemester_kurzbz)}
EOSQL;

	$res = $this->execReadOnlyQuery($query);
	return $res;
    }
    
    public function getLehrfachIdMitarbeiter($angezeigtes_stsem,$user,$lvid)
    {
	$query = "
	    SELECT
		distinct lehrfach_id
            FROM
                lehre.tbl_lehreinheit
                JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
            WHERE
                studiensemester_kurzbz=" . $this->escape($angezeigtes_stsem) . "
                AND mitarbeiter_uid=" . $this->escape($user)."
                AND lehrveranstaltung_id=" . $this->escape(intval($lvid));
	
	$res = $this->execReadOnlyQuery($query);
	return $res;
    }
    
    public function getLehrfachIdStudierender($angezeigtes_stsem,$user,$lvid)
    {
	$query = "
	    SELECT 
		distinct lehrfach_id
            FROM
                campus.vw_student_lehrveranstaltung
            WHERE
                lehrveranstaltung_id=" . $this->escape(intval($lvid))."
                AND studiensemester_kurzbz=" . $this->escape($angezeigtes_stsem)."
                AND uid=" . $this->escape($user);
	
	$res = $this->execReadOnlyQuery($query);
	return $res;
    }
    
    public function getLehreinheitInfo($lvid, $angezeigtes_stsem, $lehrfach_id)
    {
	$query = "
	    SELECT 
		* 
	    FROM (
		SELECT 
		    distinct on(uid) vorname, nachname, tbl_benutzer.uid as uid,
		    CASE 
			WHEN lehrfunktion_kurzbz='LV-Leitung' THEN true 
			ELSE false 
		    END as lvleiter
		FROM 
		    lehre.tbl_lehreinheit, lehre.tbl_lehreinheitmitarbeiter, 
		    public.tbl_benutzer, public.tbl_person
		WHERE
		    tbl_lehreinheit.lehreinheit_id = tbl_lehreinheitmitarbeiter.lehreinheit_id
		    AND tbl_lehreinheitmitarbeiter.mitarbeiter_uid = tbl_benutzer.uid
		    AND tbl_person.person_id = tbl_benutzer.person_id 
		    AND lehrveranstaltung_id = " . $this->escape(intval($lvid)) . " 
		    AND tbl_lehreinheitmitarbeiter.mitarbeiter_uid NOT like '_Dummy%' 
		    AND tbl_benutzer.aktiv = true 
		    AND tbl_person.aktiv = true 
		    AND studiensemester_kurzbz = " . $this->escape($angezeigtes_stsem);

	if($lehrfach_id != '')
	{
	    $query .= " AND tbl_lehreinheit.lehrfach_id = " . $this->escape(intval($lehrfach_id));
	}
	
	$query .= " ORDER BY uid, lvleiter desc) as a ORDER BY lvleiter desc, nachname, vorname";
	
	$res = $this->execReadOnlyQuery($query);
	return $res;
    }

	/**
	 * Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester.
	 * Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung
	 * @param $lehrveranstaltung_id
	 * @param $studiensemester
	 * @return array with Lehreinheiten and their Lehreinheitgruppen
	 */
	public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null)
	{
		$params = array($lehrveranstaltung_id);

		$query = "
			SELECT
			    lv.lehrveranstaltung_id,
			    le.lehreinheit_id,
				le.lehrform_kurzbz,
				lv.kurzbz,
				lv.bezeichnung,
				lv.semester,
				(
					SELECT
						STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ')
					FROM lehre.tbl_lehreinheitgruppe leg
					WHERE leg.lehreinheit_id = le.lehreinheit_id
				) AS gruppe,
			     STRING_AGG(tma.kurzbz, ' ') as kuerzel
			FROM
				lehre.tbl_lehreinheit le
			JOIN
				lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id
			JOIN
				lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id)
			JOIN
				public.tbl_mitarbeiter tma USING (mitarbeiter_uid)
			WHERE
				lv.lehrveranstaltung_id = ?
				";

		if (isset($studiensemester_kurzbz))
		{
			$query .= " AND le.studiensemester_kurzbz = ?";
			$params[] = $studiensemester_kurzbz;
		}

		$query .="
			GROUP BY
                lv.lehrveranstaltung_id,
				le.lehreinheit_id,
				le.lehrform_kurzbz,
				lv.kurzbz,
				lv.bezeichnung,
				lv.semester
			ORDER BY
				le.lehreinheit_id;
		";

		return $this->execQuery($query, $params);
	}


	public function getOes($lehreinheit_id)
	{
		$this->addSelect('tbl_lehrveranstaltung.studiengang_kz,
								tbl_lehrveranstaltung.lehrveranstaltung_id');
		$this->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id');
		$result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));

		if (isError($result)) return $result;

		if (hasData($result))
		{
			$lehrveranstaltung = getData($result)[0];
			$oe_result = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id);
			return success(hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(''));
		}
	}

	public function getLehrfachOe($lehreinheit_id)
	{
		$this->addSelect('lehrfach.oe_kurzbz');
		$this->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id', 'LEFT');
		return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
	}


	public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
	{
		$qry = "WITH lehreinheiten AS (
				SELECT *
				FROM lehre.tbl_lehreinheit
				WHERE lehrveranstaltung_id = ?
					AND studiensemester_kurzbz = ?
			),
				". $this->_getGruppenCTE() . ", 
				". $this->_getLektorenCTE() . ", 
				". $this->_getFachbereichCTE() . ",
				". $this->_getTagsCTE() . "
				
				SELECT lehreinheiten.*,
						lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
						tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
						tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
						COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
						gruppen.gruppen,
						mitarbeiter.lektoren,
						mitarbeiter.le_planstunden,
						mitarbeiter.vorname,
						mitarbeiter.nachname,
						mitarbeiter.semesterstunden,
						fachbereich.bezeichnung as fachbereich,
						UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
						semester
				FROM lehreinheiten
					LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
					LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
					LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
					LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
					LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
					LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
				WHERE true 
				";

		$params = array($lv_id, $studiensemester_kurzbz);

		if ($mitarbeiter_uid !== null)
		{
			$qry .= " AND lehreinheiten.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) ";
			$params[] = $mitarbeiter_uid;
		}

		if($fachbereich_kurzbz !== null)
		{
			$qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=lehreinheiten.lehrfach_id)";
			$params[] = $fachbereich_kurzbz;
		}
		$qry .= " ORDER BY lehrveranstaltung_id;";

		return $this->execReadOnlyQuery($qry, $params);
	}

	private function getLVTmp($stg_kz = null)
	{
		$qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *, 
						'' as stundenblockung,
						'' as lehreinheit_id,
						'' as wochenrythmus,
						'' as raumtyp,
						'' as raumtypalternativ,
						'' as gruppen,
						'' as studienplan_id,
						'' as studienplan_beeichnung, 
						UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
                FROM campus.vw_lehreinheit
				WHERE mitarbeiter_uid = ?
				  AND studiensemester_kurzbz = ?";

		if (!is_null($stg_kz)) {
			$qry .= " AND lv_studiengang_kz = ?";
		}

		return $qry;
	}

	public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
	{
		$qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ")
				SELECT lvs.*
				FROM lvs
				";

		$params = array($mitarbeiter_uid, $studiensemester_kurzbz);
		if (!is_null($stg_kz))
		{
			$params[] = $stg_kz;
		}
		return $this->execReadOnlyQuery($qry, $params);
	}

	public function deleteLehreinheit($lehreinheit_id)
	{
		$lehreinheit = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));

		if (isError($lehreinheit)) return $lehreinheit;

		if (!hasData($lehreinheit))
			return error("Lehreinheit not found!");

		$errorReasons = [];
		$addError = function ($reason = null) use (&$errorReasons)
		{
			if ($reason !== null)
			{
				$errorReasons[] = $reason;
			}
		};

		$stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
		$stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));

		if (hasData($stundenplan_result) || hasData($stundenplandev_result))
			$addError('Dieser LV-Teil ist bereits im LV-Plan verplant und kann daher nicht geloescht werden!');

		Events::trigger(
			'lehreinheit_delete_check',
			$addError,
			$lehreinheit_id
		);

		if (!empty($errorReasons)) return error($errorReasons);

		$this->db->trans_begin();

		Events::trigger(
			'lehreinheit_delete',
			$addError,
			$lehreinheit_id
		);

		$undosql = '';

		$lehreinheit_gruppe_result = $this->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
		if (hasData($lehreinheit_gruppe_result))
		{
			foreach (getData($lehreinheit_gruppe_result) as $row)
			{
				$values = [
					$this->db->escape($row->lehreinheitgruppe_id),
					$this->db->escape($row->lehreinheit_id),
					$this->db->escape($row->studiengang_kz),
					$this->db->escape($row->semester),
					$this->db->escape($row->verband),
					$this->db->escape($row->gruppe),
					$this->db->escape($row->gruppe_kurzbz),
					$this->db->escape($row->updateamum),
					$this->db->escape($row->updatevon),
					$this->db->escape($row->insertamum),
					$this->db->escape($row->insertvon)
				];

				$undosql .= "INSERT INTO lehre.tbl_lehreinheitgruppe (
						lehreinheitgruppe_id,
						lehreinheit_id,
						studiengang_kz,
						semester,
						verband,
						gruppe,
						gruppe_kurzbz,
						updateamum,
						updatevon,
						insertamum,
						insertvon
					) VALUES (" . implode(', ', $values) . ");\n";
			}

			$lehreinheit_gruppe_delete_result = $this->LehreinheitgruppeModel->delete(array('lehreinheit_id' => $lehreinheit_id));

			if (isError($lehreinheit_gruppe_delete_result))
				$addError(getError($lehreinheit_gruppe_delete_result));
		}

		$lehreinheit_mitarbeiter_result = $this->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
		if (hasData($lehreinheit_mitarbeiter_result))
		{
			foreach (getData($lehreinheit_mitarbeiter_result) as $row)
			{
				$values = [
					$this->db->escape($row->lehreinheit_id),
					$this->db->escape($row->mitarbeiter_uid),
					$this->db->escape($row->lehrfunktion_kurzbz),
					$this->db->escape($row->planstunden),
					$this->db->escape($row->stundensatz),
					$this->db->escape($row->faktor),
					$this->db->escape($row->anmerkung),
					$this->db->escape($row->bismelden),
					$this->db->escape($row->updateamum),
					$this->db->escape($row->updatevon),
					$this->db->escape($row->insertamum),
					$this->db->escape($row->insertvon),
					$this->db->escape($row->semesterstunden)
				];

				$undosql .= "INSERT INTO lehre.tbl_lehreinheitmitarbeiter (
								lehreinheit_id,
								mitarbeiter_uid,
								lehrfunktion_kurzbz,
								planstunden,
								stundensatz,
								faktor,
								anmerkung,
								bismelden,
								updateamum,
								updatevon,
								insertamum,
								insertvon,
								semesterstunden
							) VALUES (" . implode(', ', $values) . ");\n";
			}

			$lehreinheit_mitarbeiter_delete_result = $this->LehreinheitmitarbeiterModel->delete(array('lehreinheit_id' => $lehreinheit_id));
			if (isError($lehreinheit_mitarbeiter_delete_result))
				$addError(getError($lehreinheit_mitarbeiter_delete_result));
		}

		foreach (getData($lehreinheit) as $row)
		{
			$values = [
				$this->db->escape($row->lehreinheit_id),
				$this->db->escape($row->lehrveranstaltung_id),
				$this->db->escape($row->studiensemester_kurzbz),
				$this->db->escape($row->lehrfach_id),
				$this->db->escape($row->lehrform_kurzbz),
				$this->db->escape($row->stundenblockung),
				$this->db->escape($row->wochenrythmus),
				$this->db->escape($row->start_kw),
				$this->db->escape($row->raumtyp),
				$this->db->escape($row->raumtypalternativ),
				$this->db->escape($row->sprache),
				$this->db->escape($row->lehre),
				$this->db->escape($row->anmerkung),
				$this->db->escape($row->unr),
				$this->db->escape($row->lvnr),
				$this->db->escape($row->updateamum),
				$this->db->escape($row->updatevon),
				$this->db->escape($row->insertamum),
				$this->db->escape($row->insertvon),
			];

			$undosql .= "INSERT INTO lehre.tbl_lehreinheit (
						lehreinheit_id,
						lehrveranstaltung_id,
						studiensemester_kurzbz,
						lehrfach_id,
						lehrform_kurzbz,
						stundenblockung,
						wochenrythmus,
						start_kw,
						raumtyp,
						raumtypalternativ,
						sprache,
						lehre,
						anmerkung,
						unr,
						lvnr,
						updateamum,
						updatevon,
						insertamum,
						insertvon
					) VALUES (" . implode(', ', $values) . ");\n";
		}
		$lehreinheit_result = $this->delete($lehreinheit_id);

		$deleteSql = "DELETE FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
						DELETE FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
						DELETE FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) .";";
		if (isError($lehreinheit_result))
			$addError($lehreinheit_result);

		$log_result = $this->LogModel->insert([
			'sql' => $deleteSql,
			'sqlundo' => $undosql,
			'beschreibung' => 'Lehreinheit loeschen - ' . $lehreinheit_id,
			'mitarbeiter_uid' => getAuthUID(),
		]);

		if (isError($log_result))
			$addError($log_result);

		if (!empty($errorReasons))
		{
			$this->db->trans_rollback();
			return error($errorReasons);
		}

		$this->db->trans_commit();
		return success('Contract successfully updated.');
	}

	private function _getGruppenCTE()
	{
		return "gruppen AS (
					SELECT
						lehreinheit_id,
						 STRING_AGG(
								 CASE
									 WHEN (tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL OR tbl_lehreinheitgruppe.gruppe_kurzbz = '')
										 THEN
										 UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) ||
										 COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), '') ||
										 COALESCE(TRIM(tbl_lehreinheitgruppe.verband), '') ||
										 COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), '')
									 ELSE
										 CASE
											 WHEN NOT tbl_gruppe.direktinskription THEN tbl_lehreinheitgruppe.gruppe_kurzbz
											 ELSE NULL
											 END
									 END,
								 ' ' 
									ORDER BY
										UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz),
										COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''),
										COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''),
										COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''),
										COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')
						 ) AS gruppen
					 FROM lehre.tbl_lehreinheitgruppe
						LEFT JOIN public.tbl_studiengang USING (studiengang_kz)
						LEFT JOIN public.tbl_gruppe USING (gruppe_kurzbz)
						JOIN lehreinheiten USING(lehreinheit_id)
						GROUP BY lehreinheit_id
				)";
	}
	private function _getLektorenCTE()
	{
		return "mitarbeiter AS (
					 SELECT
						tbl_lehreinheitmitarbeiter.lehreinheit_id,
						STRING_AGG(m.kurzbz, ' ') AS lektoren,
						STRING_AGG(tbl_person.vorname, ' ') AS vorname,
						STRING_AGG(tbl_person.nachname, ' ') AS nachname,
						STRING_AGG(tbl_lehreinheitmitarbeiter.semesterstunden::text, ' ') AS semesterstunden,
						STRING_AGG(tbl_lehreinheitmitarbeiter.planstunden::text, ' ') AS le_planstunden
					FROM lehre.tbl_lehreinheitmitarbeiter
						JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid)
						JOIN lehreinheiten USING(lehreinheit_id)
						JOIN public.tbl_benutzer ON mitarbeiter_uid = uid
						JOIN public.tbl_person ON tbl_benutzer.person_id = tbl_person.person_id
					GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id
				)";
	}

	private function _getFachbereichCTE()
	{
		return "fachbereich AS (
					SELECT
						 CONCAT(tbl_organisationseinheit.bezeichnung, ' (',  tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')') as bezeichnung,
						 lehreinheiten.lehreinheit_id
					 FROM public.tbl_organisationseinheit
						JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz
						JOIN lehre.tbl_lehreinheit ON lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id
						JOIN lehreinheiten ON tbl_lehreinheit.lehreinheit_id = lehreinheiten.lehreinheit_id
				)";
	}

	private function _getTagsCTE()
	{
		$this->load->config('lvverwaltung');
		$tags = $this->config->item('tags');

		$whereTags = '';
		if (is_array($tags) && !isEmptyArray($tags))
		{
			$tags = array_keys($tags);

			foreach ($tags as $key => $tag)
			{
				$tags[$key] = $this->db->escape($tag);
			}

			$whereTags = " AND tbl_notiz_typ.typ_kurzbz IN (" . implode(",", $tags) . ")";
		}

		return "tag_data_agg AS (
					SELECT
						lehreinheit_id,
						COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags
					FROM (
							SELECT DISTINCT ON (public.tbl_notiz.notiz_id)
								tbl_notiz.notiz_id AS id,
								typ_kurzbz,
								array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung,
								text AS notiz,
								style,
								erledigt AS done,
								lehreinheit_id
							FROM public.tbl_notizzuordnung
								JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id
								JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz
							WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten)"
								. $whereTags.
						") AS tag
					GROUP BY lehreinheit_id
				)";
	}

}
