<?php
class Vertrag_model extends DB_Model
{

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

        $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel');
        $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
        $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
	}

    /**
     * Saves Vertrag for a Lehrauftrag and sets Vertragsstatus to 'bestellt'.
     * Also updates vertrag_id in tbl_lehreinheitmitarbeiter or tbl_projektbetreuer.
     * @param $person_id
     * @param $lehrveranstaltung_id
     * @param $lehreinheit_id
     * @param $projektarbeit_id
     * @param $betrag                   Monetary amount of that Lehreinheit / Projektbetreuung.
     * @param $vertragsstunden          Working hours of that Lehreinheit / Projektbetreuung.
     * @param $studiensemester_kurzbz
     * @param $vertragstyp_kurzbz
     * @return array|null               On success object. On failure null.
     */
	public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz)
    {
        $person_id = (isset($person_id) && is_numeric($person_id))
            ? $person_id
            : show_error('peron_id must be set and numeric.');
        $lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id))
            ? $lehreinheit_id
            : show_error('lehreinheit_id must be set and numeric.');
        $lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id))
            ? $lehrveranstaltung_id
            : show_error('lehrveranstaltung_id must be set and numeric.');
        $projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id))
            ? $projektarbeit_id
            : null;
        $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
            ? $vertragsstunden
            : 0;
        $betrag = (isset($betrag) && is_numeric($betrag))
            ? $betrag
            : 0;
        $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid))
            ? $mitarbeiter_uid
            : show_error('mitarbeiter_uid must be set and a string value.');;

        $vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung';

        // First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag
        if ($vertragstyp_kurzbz == 'Lehrauftrag')
        {
            if ($this->LehreinheitmitarbeiterModel->hasVertrag($mitarbeiter_uid, $lehreinheit_id))
            {
            	return error('Lehrauftrag existiert bereits');	// Exit if Lehrauftrag already has Vertrag
            }
        }
        elseif ($vertragstyp_kurzbz == 'Betreuung')
        {
            if ($this->ProjektbetreuerModel->hasVertrag($person_id, $projektarbeit_id))
            {
                return error('Lehrauftrag existiert bereits');   // Exit if Projektbetreuung already has Vertrag
            }
        }

        // If Vertrag does not exist, create now
        // Vertragsbezeichnung
        $bezeichnung = $this->_writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz);

        // Start DB transaction
        $this->db->trans_start(false);

        // Insert Vertragsdata
        $result = $this->insert(
            array(
                'person_id' => $person_id,
                'lehrveranstaltung_id' => $lehrveranstaltung_id,
                'vertragstyp_kurzbz' => $vertragstyp_kurzbz,
                'bezeichnung' => $bezeichnung,
                'betrag' => $betrag,
                'insertamum' => 'NOW()',
                'insertvon' => getAuthUID(),
                'vertragsdatum' => 'NOW()',
                'vertragsstunden' => $vertragsstunden,
                'vertragsstunden_studiensemester_kurzbz' => $studiensemester_kurzbz
            )
        );

        // Retrieve primary key
        $vertrag_id = $result->retval;

        // If Vertrag was created successfully, update vertrag_id
        if (isSuccess($result))
        {
            // if Lehrtätigkeit, update vertrag_id in tbl_lehreinheitmitarbeiter
            if ($vertragstyp_kurzbz == 'Lehrauftrag')
            {
                $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
                $result = $this->LehreinheitmitarbeiterModel->update(
                    array(
                        'lehreinheit_id' =>  $lehreinheit_id,
                        'mitarbeiter_uid' =>$mitarbeiter_uid
                    ),
                    array(
                        'vertrag_id' => $vertrag_id
                    )
                );
            }
            // if (Projekt-)Betreuung, update vertrag_id in tbl_projektbetreuer
            elseif ($vertragstyp_kurzbz == 'Betreuung')
            {
                $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
                $result = $this->ProjektbetreuerModel->update(
                    array(
                        'person_id' =>  $person_id,
                        'projektarbeit_id' => $projektarbeit_id
                    ),
                    array(
                        'vertrag_id' => $vertrag_id
                    )
                );
            }
        }

        // If updating vertrag_id was successfully, set Status to 'bestellt'
        if (isSuccess($result))
        {
            $result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'bestellt');
        }

        // Transaction complete!
        $this->db->trans_complete();

        // Check if everything went ok during the transaction
        if ($this->db->trans_status() === false || isError($result))
        {
            $this->db->trans_rollback();
            return error($result->msg, EXIT_ERROR);
        }
        else
        {
            $this->db->trans_commit();
            return success($vertrag_id);
        }
    }

    /**
     * Updates Vertrag and, if resets vertragsstatus as follows:
     * - if vertragsstatus 'erteilt': delete status 'erteilt' and update date of status 'bestellt'
     * - if vertragsstatus 'bestellt': update date of status 'bestellt'
     * @param $vertrag_obj  Object with vertrag properties vertrag_id, vertragsstunden, betrag.
     * @param $mitarbeiter_uid
     */
    public function updateVertrag($vertrag_id, $vertragsstunden, $betrag, $mitarbeiter_uid)
    {
        $vertrag_id = (isset($vertrag_id) && is_numeric($vertrag_id))
            ? $vertrag_id
            : show_error('vertrag_id must be set and numeric.');
        $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
            ? $vertragsstunden
            : 0;
        $betrag = (isset($betrag) && is_numeric($betrag))
            ? $betrag
            : 0;
        $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid))
            ? $mitarbeiter_uid
            : show_error('mitarbeiter_uid must be set and a string value.');

        // Start DB transaction
        $this->db->trans_start(false);

        // Update contract
        $result = $this->update(
            $vertrag_id,
            array(
                'vertragsstunden' => $vertragsstunden,
                'betrag' => $betrag,
                'updateamum' => $this->escape('NOW()'),
                'updatevon' => getAuthUID()
            )
        );

        // If last vertragsstatus is 'erteilt', delete the status
        if (isSuccess($result))
        {
            $result = $this->VertragvertragsstatusModel->getLastStatus($vertrag_id, $mitarbeiter_uid);

            $lastStatus = getData($result)[0]->vertragsstatus_kurzbz;

            if ($lastStatus == 'erteilt')
            {
                $result = $this->VertragvertragsstatusModel->deleteStatus($vertrag_id, 'erteilt');
            }
        }

        // Update date of status 'bestellt'
        if (isSuccess($result))
        {
            $result = $this->VertragvertragsstatusModel->updateStatus($vertrag_id, 'bestellt');
        }

        // Transaction complete!
        $this->db->trans_complete();

        // Check if everything went ok during the transaction
        if ($this->db->trans_status() === false || isError($result))
        {
            $this->db->trans_rollback();
            return error($result->msg, EXIT_ERROR);
        }
        else
        {
            $this->db->trans_commit();
            return success('Contract successfully updated.');
        }
    }

    /**
     * Gets Lehreinheit ID corresponding to the contract.
     * @param $vertrag_id
     * @return array
     */
    public function getLehreinheitID($vertrag_id)
    {
        $vertragstyp_kurzbz = null;

        $this->addSelect('vertragstyp_kurzbz');
        if ($result = getData($this->load($vertrag_id)))
        {
            $vertragstyp_kurzbz = $result[0]->vertragstyp_kurzbz;
        }
        else
        {
            return error('Fehler beim Laden des Vertrags.');
        }

        if ($vertragstyp_kurzbz == 'Lehrauftrag')
        {
            $this->LehreinheitmitarbeiterModel->addSelect('lehreinheit_id');
            if ($result = $this->LehreinheitmitarbeiterModel->loadWhere(array('vertrag_id' => $vertrag_id)))
            {
                return success($result->retval);
            }
            else
            {
                return error('Fehler beim Ermitteln der Lehreinheit ID');
            }

        }
        elseif ($vertragstyp_kurzbz == 'Betreuung')
        {
            $this->addSelect('lehreinheit_id');
            $this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id');
            $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
            if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id)))
            {
                return success($result->retval);
            }
            else
            {
                return error('Fehler beim Ermitteln der Lehreinheit ID');
            }
        }
    }

    /**
     * Gets (table) data of lehreinheit_id corresponding to the contract.
     * @param integer $vertrag_id
     * @param string $select To restrict fields, pass select string. e.g. 'lehrveranstaltung_id'.
     * @return array
     */
    public function getLehreinheitData($vertrag_id, $select = '*')
    {
        if ($result = getData($this->getLehreinheitID($vertrag_id)))
        {
            $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
            $this->LehreinheitModel->addSelect($select);

            if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id))
            {
                return success($result->retval);
            }
            else
            {
                return error('Fehler beim Laden der Lehreinheit');
            }
        }
        else
        {
            return error('Fehler beim Ermitteln der Lehreinheit ID');
        }
    }

    /**
     * Prueft ob ein Mitarbeiter einen erteilten Vertrag zu einer Lehrveranstaltung besitzt.
     * @param $lehrveranstaltung_id ID der Lehrveranstaltung
     * @param $studiensemester_kurzbz Studiensemester das geprueft wird
     * @param $mitarbeiter_uid UID des Mitarbeiters
     */
    public function isVertragErteiltLV($lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid)
    {
	    if (defined('CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON')
	     && CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON != '')
	    {
		    // Liegt das Studiensemester vor dem Pruefdatum, wird die LV immer als Erteilt angezeigt
		    $stsemquery = "
			    SELECT
				    tbl_studiensemester.start
			    FROM
				    public.tbl_studiensemester
			    WHERE
				    studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz)."
				    AND tbl_studiensemester.start < (
					    SELECT 
						start
					    FROM 
						public.tbl_studiensemester stsem 
					    WHERE
						stsem.studiensemester_kurzbz = " . $this->escape(CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON)."
					    )";

		    if ($stsemresult = $this->execReadOnlyQuery($stsemquery))
		    {
			    $stsemdata = getData($stsemresult);
			    if ($stsemdata && count($stsemdata) > 0)
			    {
				    // Wenn das Studiensemester vor dem Pruefdatum liegt, gilt der Vertrag immer als erteilt.
				    return true;
			    }
		    }
		    else
		    {
			    return false;
		    }
	    }

	    $query = "
		    SELECT
			    1
		    FROM
			    lehre.tbl_lehreinheitmitarbeiter
			    JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
			    JOIN lehre.tbl_vertrag USING(vertrag_id)
			    JOIN lehre.tbl_vertrag_vertragsstatus USING(vertrag_id)
		    WHERE
			    tbl_lehreinheitmitarbeiter.mitarbeiter_uid = " . $this->escape($mitarbeiter_uid) . "
			    AND tbl_lehreinheit.studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
			    AND tbl_lehreinheit.lehrveranstaltung_id = " . $this->escape(intval($lehrveranstaltung_id)) . "
			    AND tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz='erteilt'
			    AND NOT EXISTS(
				    SELECT 
					1 
				    FROM 
					lehre.tbl_vertrag_vertragsstatus vstatus
				    WHERE 
					vstatus.vertrag_id = tbl_vertrag.vertrag_id
					AND vstatus.vertragsstatus_kurzbz = 'storno'
			    )
	    ";

	    if ($result = $this->execReadOnlyQuery($query))
	    {
		    $data = getData($result);
		    if ($data && count($data) > 0)
		    {
			    return true;
		    }
		    else
		    {
			    return false;
		    }
	    }
	    else
	    {
		    return false;
	    }
    }

	public function getVertrag($mitarbeiter_uid, $lehreinheit_id)
	{
		$this->addSelect('tbl_lehreinheitmitarbeiter.*, tbl_vertrag.*, status.bezeichnung as vertragsstatus, status.vertragsstatus_kurzbz');
		$this->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'vertrag_id');
		$this->addJoin('lehre.tbl_vertragstyp', 'vertragstyp_kurzbz', 'LEFT');
		$this->addJoin('
			(
				SELECT DISTINCT ON(vertrag_id) vertrag_id,
					bezeichnung, 
					tbl_vertragsstatus.vertragsstatus_kurzbz 
				FROM lehre.tbl_vertrag_vertragsstatus 
					JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) 
				ORDER BY vertrag_id, datum DESC
			) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT');

		return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id));
	}

	public function getVertragById($vertrag_id)
	{
		$this->addSelect(
			'tbl_vertrag.vertrag_id, vertragstyp_kurzbz, vertragsstunden, vertragsstunden_studiensemester_kurzbz, status.vertragsstatus_kurzbz,
			status.bezeichnung AS vertragsstatus, tbl_vertrag.betrag, lema.semesterstunden, lema.stundensatz'
		);
		$this->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_vertrag.vertrag_id = lema.vertrag_id', 'LEFT');
		$this->addJoin('
			(
				SELECT DISTINCT ON(vst.vertrag_id) vst.vertrag_id,
					bezeichnung,
					tbl_vertragsstatus.vertragsstatus_kurzbz
				FROM lehre.tbl_vertrag_vertragsstatus vst
					JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
				ORDER BY vst.vertrag_id, datum DESC
			) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT');

		return $this->loadWhere(['tbl_vertrag.vertrag_id' => $vertrag_id]);
	}

	public function cancelVertrag($vertrag_id, $mitarbeiter_uid)
	{
		$vertrag = $this->load($vertrag_id);

		if (!hasData($vertrag))
			return error("Contract not found");

		$vertrag = getData($vertrag)[0];

		$this->_updateVertragRelevant($vertrag->vertrag_id);

		return $this->VertragvertragsstatusModel->insert(array(
			'vertrag_id' => $vertrag->vertrag_id,
			'vertragsstatus_kurzbz' => 'storno',
			'uid' => $mitarbeiter_uid,
			'datum' => 'NOW()',
			'insertamum' => 'NOW()',
			'insertvon' => getAuthUID()
		));
	}

	public function deleteVertrag($vertrag_id)
	{
		$vertrag = $this->load($vertrag_id);

		if (!hasData($vertrag))
			return error("Contract not found");

		$vertrag = getData($vertrag)[0];

		$this->_updateVertragRelevant($vertrag->vertrag_id);

		$this->VertragvertragsstatusModel->delete(array('vertrag_id' => $vertrag->vertrag_id));
		return $this->delete(array('vertrag_id' => $vertrag->vertrag_id));
	}

    // -----------------------------------------------------------------------------------------------------------------
    // Private methods

    /**
     * Generate contract description.
     * Example: WS2017-BEE3-LIA-LAB
     * @param $lehrveranstaltung_id
     * @param $studiensemester_kurzbz   Studiensemester of Lehrauftrag (= when the lector will teach the lehrveranstaltung)
     * @return string   Returns e.g. WS2017-BBE5-GAP-LAB
     */
    private function _writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz)
    {
        $bezeichnung = '';
        $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
        $this->LehrveranstaltungModel->addSelect('tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.kurzbz AS "lv_kurzbz", lehrform_kurzbz, public.tbl_studiengang.typ, public.tbl_studiengang.kurzbz');
        $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'lehrveranstaltung_id');
        $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan', 'studienplan_id');
        $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienordnung', 'studienordnung_id');
        $this->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'public.tbl_studiengang.studiengang_kz = lehre.tbl_studienordnung.studiengang_kz');
        $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);

        if (hasData($result))
        {
            $bezeichnung = $studiensemester_kurzbz. '-';
            $bezeichnung.= strtoupper($result->retval[0]->typ. $result->retval[0]->kurzbz). $result->retval[0]->semester. '-';
            $bezeichnung.= $result->retval[0]->lv_kurzbz. '-';
            $bezeichnung.= $result->retval[0]->lehrform_kurzbz;
        }

        return $bezeichnung;
    }

	/**
	 * Loads all Contracts of a Person
	 * @param $person_id
	 * @return array of objects
	 */
	public function loadContractsOfPerson($person_id)
	{
		$query = "
			SELECT
					*,
					tbl_vertrag.bezeichnung as bezeichnung,
					tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
					tbl_vertrag.vertragsdatum,
					(SELECT bezeichnung FROM lehre.tbl_vertragsstatus 
					JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
						WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
			    CASE
					WHEN EXISTS (
						SELECT 1
						FROM lehre.tbl_vertrag_vertragsstatus
						WHERE vertrag_id = tbl_vertrag.vertrag_id
						AND vertragsstatus_kurzbz = 'abgerechnet'
					) THEN true 
					ELSE false
				END AS isAbgerechnet
				FROM
					lehre.tbl_vertrag
					LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
				WHERE person_id= ?";


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

	/**
	 * Loads all Contracts of a Person that are not assigned yet
	 * @param $person_id
	 * @return array of objects
	 */
	public function loadContractsOfPersonNotAssigned($person_id)
	{
		$query = "
SELECT
			'Lehrauftrag' as type,
			lehreinheit_id,
			mitarbeiter_uid,
			null as pruefung_id,
			null as projektarbeit_id,
			(tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
			tbl_lehreinheit.studiensemester_kurzbz,
			null as betreuerart_kurzbz,
			(	SELECT
					upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester  || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
				FROM
					lehre.tbl_lehrveranstaltung
					JOIN public.tbl_studiengang USING(studiengang_kz)
				WHERE
					lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
			as bezeichnung
		FROM
			lehre.tbl_lehreinheitmitarbeiter
			JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
		WHERE
			mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
			AND vertrag_id IS NULL
		UNION
		SELECT
			'Betreuung' as type,
			tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
			null as mitarbeiter_uid,
			null::integer as pruefung_id,
			projektarbeit_id,
			(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
			tbl_lehreinheit.studiensemester_kurzbz,
			tbl_projektbetreuer.betreuerart_kurzbz,
			(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
			as bezeichnung
		FROM
			lehre.tbl_projektbetreuer
			JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
			JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
		WHERE
			tbl_projektbetreuer.person_id=?
			AND vertrag_id IS NULL
				";

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

	/**
	 * Loads all Contracts of a Person that are assigned yet
	 * @param $person_id, $vertrag_id
	 * @return array of objects
	 */

	public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
	{
		$query = "
		SELECT
			'Lehrauftrag' as type,
			lehreinheit_id,
			mitarbeiter_uid,
			null as pruefung_id,
			null as projektarbeit_id,
			(tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
			tbl_lehreinheit.studiensemester_kurzbz,
			null as betreuerart_kurzbz,
			(	SELECT
					upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester  || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
				FROM
					lehre.tbl_lehrveranstaltung
					JOIN public.tbl_studiengang USING(studiengang_kz)
				WHERE
					lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
			as bezeichnung, vertrag_id
		FROM
			lehre.tbl_lehreinheitmitarbeiter
			JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
		WHERE
			mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
			AND vertrag_id = ?
		UNION
		SELECT
			'Betreuung' as type,
			tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
			null as mitarbeiter_uid,
			null::integer as pruefung_id,
			projektarbeit_id,
			(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
			tbl_lehreinheit.studiensemester_kurzbz,
			tbl_projektbetreuer.betreuerart_kurzbz,
			(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
			as bezeichnung, vertrag_id
		FROM
			lehre.tbl_projektbetreuer
			JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
			JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
		WHERE
			tbl_projektbetreuer.person_id=?
			AND vertrag_id = ?
				";

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

	/**
	 * Returns all stati of a contract
	 *
	 * @param $vertrag_id
	 * @return array
	 */
	public function getStatiOfContract($vertrag_id)
	{
		$query = " 
			SELECT
				*,
                tbl_vertrag_vertragsstatus.datum,
                tbl_vertrag_vertragsstatus.insertamum,
                tbl_vertrag_vertragsstatus.updateamum
			FROM
				lehre.tbl_vertrag_vertragsstatus
				JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
			WHERE
				tbl_vertrag_vertragsstatus.vertrag_id = ?
			ORDER BY tbl_vertrag_vertragsstatus.datum DESC";

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

	private function _updateVertragRelevant($vertrag_id)
	{
		$this->LehreinheitmitarbeiterModel->update(
			array("vertrag_id" => $vertrag_id),
			array(
				'vertrag_id' => null
			)
		);
		$this->ProjektbetreuerModel->update(
			array("vertrag_id" => $vertrag_id),
			array(
				'vertrag_id' => null
			)
		);
	}
}
