DerDu/SPHERE-Framework

View on GitHub
Application/Setting/Consumer/Service/Data.php

Summary

Maintainability
F
4 days
Test Coverage
<?php

namespace SPHERE\Application\Setting\Consumer\Service;

use SPHERE\Application\Contact\Address\Service\Entity\TblAddress;
use SPHERE\Application\Platform\Gatekeeper\Authorization\Account\Service\Entity\TblAccount;
use SPHERE\Application\Platform\Gatekeeper\Authorization\Consumer\Service\Entity\TblConsumer;
use SPHERE\Application\Platform\System\Protocol\Protocol;
use SPHERE\Application\Setting\Consumer\Service\Entity\TblSetting;
use SPHERE\Application\Setting\Consumer\Service\Entity\TblStudentCustody;
use SPHERE\System\Database\Binding\AbstractData;
use SPHERE\System\Database\Database;
use SPHERE\System\Database\Fitting\Element;
use MOC\V\Component\Database\Component\IBridgeInterface;
use MOC\V\Component\Database\Database as MocDatabase;
use SPHERE\System\Database\Type\MySql;

/**
 * Class Data
 * @package SPHERE\Application\Setting\Consumer\Service
 */
class Data extends AbstractData
{

    public function setupDatabaseContent()
    {

        if (($tblSetting = $this->createSetting('People', 'Meta', 'Student', 'Automatic_StudentNumber',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein', 'Die Schülernummern werden automatisch vom System erstellt.
                In diesem Fall können die Schülernummern nicht per Hand vergeben werden. [Standard: Nein]');
        }

        if (($tblSetting = $this->createSetting('People', 'Person', 'Relationship', 'GenderOfS1', TblSetting::TYPE_INTEGER, 2, 'Allgemein',
            'Für Personenbeziehungen vom Typ: Sorgeberechtigt wird das folgende Geschlecht für S1 vorausgewählt. [Standard: Weiblich]', true))
        ) {
            $this->updateSettingDescription(
                $tblSetting,
                $tblSetting->getCategory(),
                'Für Personenbeziehungen vom Typ: Sorgeberechtigt wird das folgende Geschlecht für S1 vorausgewählt. [Standard: Weiblich]',
                $tblSetting->isPublic()
            );
        }

        if (($tblSetting = $this->createSetting('Transfer', 'Indiware', 'Import',
            'Lectureship_ConvertDivisionLatinToGreek', TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Indiware',
                'Ersetzung der Klassengruppennamen beim Import in ausgeschriebene Griechische Buchstaben. (z.B. a => alpha) [Standard: Nein]');
        }

        if (($tblSetting = $this->createSetting('Contact', 'Address', 'Address', 'Format_GuiString',
            TblSetting::TYPE_STRING, TblAddress::VALUE_PLZ_ORT_OT_STR_NR))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein',
                'Reihenfolge der Adressanzeige [Standard: PLZ_ORT_OT_STR_NR]');
        }

        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'PasswordChange_PictureAddress',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Eltern und Schülerzugänge sowie Passwortänderungsanschreiben kann ein Bild (Logo) hinterlegt werden.
                Adresse des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'PasswordChange_PictureHeight',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Eltern und Schülerzugänge sowie Passwortänderungsanschreiben kann ein Bild (Logo) hinterlegt werden.
                Höhe des Bildes (Maximal 120px): [Standard: 120px]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'SignOutCertificate_PictureAddress',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Abmeldebescheinigung kann ein Bild (Logo) hinterlegt werden. Adresse des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'SignOutCertificate_PictureHeight',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Abmeldebescheinigung kann ein Bild (Logo) hinterlegt werden. Höhe des Bildes (Maximal 120px): [Standard: 80px]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'EnrollmentDocument_PictureAddress',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Schulbescheinigung kann ein Bild (Logo) hinterlegt werden. Adresse des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'EnrollmentDocument_PictureHeight',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für die Schulbescheinigung kann ein Bild (Logo) hinterlegt werden. Höhe des Bildes (Maximal 120px): [Standard: 90px]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'Billing_PictureAddress',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für den Belegdruck der Fakturierung kann ein Bild (Logo) hinterlegt werden. Adresse des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'Standard', 'Billing_PictureHeight',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Für den Belegdruck der Fakturierung kann ein Bild (Logo) hinterlegt werden. Höhe des Bildes (Maximal 150px): [Standard: 90px]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Document', 'StudentCard_PrimarySchool', 'ShowSchoolName',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Dokumente',
                'Anzeige des Schulnamens (Stempel-Feld oben rechts) auf der Schülerkartei für die Grundschule. [Standard: Ja]',
                true);
        }

        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate', 'PictureAddress',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Für die Standard-Zeugnisse kann ein Bild (Logo) hinterlegt werden. Logo für das Zeugnis darf skalliert 
                nicht breiter sein als 182px (bei einer höhe von 50px [Bsp.: 546 * 150 ist noch ok]). Adresse des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate', 'PictureHeight',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Für die Standard-Zeugnisse kann ein Bild (Logo) hinterlegt werden. Logo für das Zeugnis darf skalliert 
                nicht breiter sein als 182px (bei einer höhe von 50px [Bsp.: 546 * 150 ist noch ok]). Höhe des Bildes: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate', 'PictureAddressForDiplomaCertificate', TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse', 'Für die Standard-Abschluss-Zeugnisse kann ein Bild (Logo) hinterlegt werden. Adresse des Bildes: []');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate', 'PictureHeightForDiplomaCertificate', TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse', 'Für die Standard-Abschluss-Zeugnisse kann ein Bild (Logo) hinterlegt werden. Höhe des Bildes: []');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate', 'PictureDisplayLocationForDiplomaCertificate', TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse', 'Für die Standard-Abschluss-Zeugnisse wird das Logo auf der 2. Seite unter dem Abschluss angezeigt (ansonsten auf dem Cover oben links): [Ja]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Education', 'Certificate', 'OrientationAcronym',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Werden die Neigungskurse in der Bildung nicht einzeln gepflegt, sondern nur ein einzelner Standard-Neigungskurs, 
                kann hier das Kürzel des Standard-Neigungskurses (z.B. NK) hinterlegt werden. Für die Zeugnisse wir dann der
                eigentliche Neigungskurs aus der Schülerakte des Schülers gezogen. [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Api', 'Education', 'Certificate', 'ProfileAcronym',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Werden die Profile in der Bildung nicht einzeln gepflegt, sondern nur ein einzelnes Standard-Profil, 
                kann hier das Kürzel des Standard-Profils (z.B. PRO) hinterlegt werden. Für die Zeugnisse wir dann das
                eigentliche Profil aus der Schülerakte des Schülers gezogen. [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'IsGradeVerbalOnDiploma',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige der Zensuren im Wortlaut auf Abschlusszeugnissen [Standard: Nein]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'IsSchoolExtendedNameDisplayed',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige des Schul-Zusatzes (Institutionszusatz) auf Zeugnissen [Standard: Nein]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'SchoolExtendedNameSeparator',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige des Schul-Zusatzes (Institutionszusatz) auf Zeugnissen mit dem Trennzeichen: [Standard: ]');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'UseMultipleBehaviorTasks',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige der Kopfnoten aus allen Kopfnotenaufträge bei der Zeugnisvorbereitung, wenn pro Halbjahr mehrere Kopfnotenaufträge erteilt wurden. [Standard: Nein]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Generate',
            'UseCourseForCertificateChoosing', TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Es wird der Bildungsgang des Schülers verwendet, um die entsprechende Zeugnisvorlage (Mittelschule) dem
                Schüler automatisch zuzuordnen. [Standard: Ja]');
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'IsGradeVerbalOnLeave',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige der Zensuren im Wortlaut auf Abgangszeugnissen [Standard: Nein]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'ShowParentTitle',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Anzeige des Personentitels von Sorgeberechtigten in der Bildungsempfehlung [Standard: Ja]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Diploma', 'PreArticleForSchoolName',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Artikel vor dem Schulnamen auf Abschlusszeugnissen und Abgangszeugnissen (z.B. das): [Standard: ]');
        }
        $this->createSetting('Education', 'Certificate', 'Diploma', 'AlternateSchoolName', TblSetting::TYPE_STRING,
            '', 'Zeugnisse', 'Schulname auf Abschlusszeugnissen und Abgangszeugnissen: [Standard: ]');
        $this->createSetting('Education', 'Certificate', 'Diploma', 'AlternateExtendedSchoolName', TblSetting::TYPE_STRING,
            '', 'Zeugnisse', 'Schul-Zusatz-Name auf Abschlusszeugnissen und Abgangszeugnissen: [Standard: ]');
        $this->createSetting('Education', 'Certificate', 'Diploma', 'ShowExtendedSchoolName', TblSetting::TYPE_BOOLEAN,
            '', 'Zeugnisse', 'Schul-Zusatz-Name von der Institution auf Abschlusszeugnissen und Abgangszeugnissen anzeigen [Standard: Nein]'
            , true);

        if (($tblSetting = $this->createSetting('Education', 'Certificate', 'Prepare', 'HasRemarkBlocking',
            TblSetting::TYPE_BOOLEAN, '1'))
        ) {
            $this->updateSettingDescription($tblSetting, 'Zeugnisse',
                'Sollen leere Bemerkungsfelder auf Zeugnissen gesperrt werden ("---"). [Standard: Ja]',
                true);
        }

        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook',
            'IsShownAverageInStudentOverview', TblSetting::TYPE_BOOLEAN, false))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige des Notendurchschnitts in der Eltern/Schüler-Übersicht [Standard: Nein]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'IsShownScoreInStudentOverview',
            TblSetting::TYPE_BOOLEAN, false))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige des Notenspiegels und des Fach-Klassen-Durchschnitts in der Eltern/Schüler-Übersicht. [Standard: Nein]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'ShowHighlightedTestsInGradeOverview', TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige der geplanten Großen Noten (fettmarkiert, z.B. Klassenarbeiten) in der Notenübersicht für Schüler/Eltern und in der Schülerübersicht [Ja]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'SortHighlighted',
            TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Sortierung der Zensuren im Notenbuch nach Großen (fettmarkiert) und Kleinen Noten. Bei Deaktivierung erfolgt Sortierung nach Datum. [Standard: Nein]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'IsHighlightedSortedRight',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Bei der Sortierung der Zensuren im Notenbuch nach Großen (fettmarkiert) und Kleinen Noten, stehen die Großen Noten rechts. [Standard: Ja]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'ShowAverageInPdf',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige des Notendurchschnitts im heruntergeladenen Notenbuch (PDF) [Standard: Ja]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'ShowCertificateGradeInPdf',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige der Zeugnisnote im heruntergeladenen Notenbuch (PDF) [Standard: Ja]', true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Gradebook', 'YearOfUserView',
            TblSetting::TYPE_STRING, ''))) {
            $this->updateSettingDescription($tblSetting, 'Notenbücher',
                'Anzeige der Noten in der Eltern/Schüler-Übersicht ab folgenden Schuljahr (z.B. 2019/20).
                Wenn leer werden Noten aller Schuljahre angezeigt [Standard: ]', true);
        }

        $this->createSetting('Education', 'Graduation', 'Gradebook', 'IgnoreSchoolType',
            TblSetting::TYPE_STRING, '', 'Notenbücher',
            'Eingrenzung der Schüler- und Elternzugänge nach Schulart(en). Festlegung der Zugänge mittels Zahleneingabe.
             Mehrere Schularten sind mit Komma zu trennen. 1=GS, 2=OS, 3=GYM [Standard: ]'
            , true);

        if (($tblSetting = $this->createSetting('Reporting', 'KamenzReport', 'Validation', 'FirstForeignLanguageLevel',
            TblSetting::TYPE_INTEGER, 1))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein', 'Validierung 1. Fremdsprache im Stammdaten- und Bildungsmodul sowie Modul Kamenzstatistik.
             Klassenstufe, ab welcher ist 1. Fremdsprache unterrichtet wird. [Standard: 1]', true);
        }
        if (($tblSetting = $this->createSetting('Reporting', 'SerialLetter', 'GenderSort', 'FirstFemale',
            TblSetting::TYPE_BOOLEAN, 1))) {
            $this->updateSettingDescription($tblSetting, 'Adresslisten für Serienbriefe',
                'Im Excel-Download wird in den Briefanreden nach DIN 5008 die Frau zuerst angesprochen (Sehr geehrte Frau, sehr geehrter Herr). [Standard: Ja]',
                true);
        }

        if (($tblSetting = $this->createSetting('Education', 'ClassRegister', 'Sort', 'SortMaleFirst',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Klassenbücher',
                'Bei der Sortierung der Schüler im Klassenbuch nach Geschlecht, stehen die männlichen Schüler zuerst. [Standard: Ja]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'ClassRegister', 'Frontend', 'ShowDownloadButton',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Klassenbücher',
                'Fachlehrer können sich im Klassenbuch die Standard-Klassenlisten-Auswertung (Excel) herunterladen. [Standard: Ja]',
                true);
        }

        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Evaluation',
            'HasBehaviorGradesForSubjectsWithNoGrading', TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Leistungsüberprüfungen',
                'Bei Kopfnotenaufträgen können auch Kopfnoten für Fächer vergebenen werden, welche nicht benotet werden. [Standard: Nein]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Evaluation',
            'AutoPublicationOfTestsAfterXDays', TblSetting::TYPE_INTEGER, '28'))) {
            $this->updateSettingDescription($tblSetting, 'Leistungsüberprüfungen',
                'Automatische Bekanntgabe von Leistungsüberprüfungen für die Notenübersicht der Schüler/Eltern nach x Tagen: [Standard: 28]',
                true);
        }
        if (($tblSetting = $this->createSetting('Education', 'Graduation', 'Evaluation',
            'ShowProposalBehaviorGrade', TblSetting::TYPE_BOOLEAN, '0'))) {
            $this->updateSettingDescription($tblSetting, 'Leistungsüberprüfungen',
                'Anzeige der Kopfnoten der Klassenlehrer als Notenvorschlag [Standard: Nein]',
                true);
        }

        if (($tblSetting = $this->createSetting('Education', 'Lesson', 'Subject', 'HasOrientationSubjects',
            TblSetting::TYPE_BOOLEAN, '1', 'Allgemein', 'Es werden Neigungskurse verwendet. [Standard: Ja]'))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein', 'Validierung Neigungskurse im Stammdaten- und Bildungsmodul
             sowie Modul Kamenzstatistik. Schulträger unterrichtet Neigungskurse. [Standard: Ja]', true);
        }

        if (($tblSetting = $this->createSetting('Setting', 'Consumer', 'Service', 'Sort_UmlautWithE',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein', 'Bei der alphabetischen Sortierung von Namen werden Umlaute ersetzt nach DIN 5007-2 (z.B. ä => ae). 
            Bei Deaktivierung erfolgt Sortierung nach DIN 5007-1 (z.B. Ä/ä und a sind gleich) [Standard: Ja]', true);
        }
        if (($tblSetting = $this->createSetting('Setting', 'Consumer', 'Service', 'Sort_WithShortWords',
            TblSetting::TYPE_BOOLEAN, '1'))) {
            $this->updateSettingDescription($tblSetting, 'Allgemein',
                'Bei der alphabetischen Sortierung von Namen werden Präpositionen (z.B. von, de, etc.) für die Sortierung berücksichtigt [Standard: Ja]',
                true);
        }
    }

    /**
     * @param      $Cluster
     * @param      $Application
     * @param null $Module
     * @param      $Identifier
     *
     * @return false|TblSetting
     */
    public function getSetting(
        $Cluster,
        $Application,
        $Module = null,
        $Identifier
    ) {

        return $this->getCachedEntityBy(
            __METHOD__,
            $this->getConnection()->getEntityManager(),
            'TblSetting',
            array(
                TblSetting::ATTR_CLUSTER => $Cluster,
                TblSetting::ATTR_APPLICATION => $Application,
                TblSetting::ATTR_MODULE => $Module ? $Module : null,
                TblSetting::ATTR_IDENTIFIER => $Identifier,
            )
        );
    }

    /**
     * @param $Id
     *
     * @return false|TblSetting
     */
    public function getSettingById($Id)
    {

        return $this->getCachedEntityById(__METHOD__, $this->getEntityManager(), 'TblSetting', $Id);
    }

    /**
     * @param bool $IsSystem
     *
     * @return false|TblSetting[]
     */
    public function getSettingAll($IsSystem = false)
    {

        if ($IsSystem) {
            return $this->getCachedEntityList(__METHOD__, $this->getEntityManager(), 'TblSetting', array(
                TblSetting::ATTR_DESCRIPTION => self::ORDER_ASC
            ));
        } else {
            return $this->getCachedEntityListBy(__METHOD__, $this->getEntityManager(), 'TblSetting', array(
                TblSetting::ATTR_IS_PUBLIC => true
            ), array(
                TblSetting::ATTR_DESCRIPTION => self::ORDER_ASC
            ));
        }
    }

    /**
     * @param $Id
     *
     * @return false|TblStudentCustody
     */
    public function getStudentCustodyById($Id)
    {

        return $this->getCachedEntityById(__METHOD__, $this->getConnection()->getEntityManager(), 'TblStudentCustody',
            $Id);
    }

    /**
     * @param TblAccount $tblAccountStudent
     *
     * @return false|TblStudentCustody[]
     */
    public function getStudentCustodyByStudent(TblAccount $tblAccountStudent)
    {

        return $this->getCachedEntityListBy(__METHOD__, $this->getConnection()->getEntityManager(), 'TblStudentCustody',
            array(
                TblStudentCustody::ATTR_SERVICE_TBL_ACCOUNT_STUDENT => $tblAccountStudent->getId()
            ));
    }

    /**
     * @param TblAccount $tblAccountStudent
     * @param TblAccount $tblAccountCustody
     *
     * @return false|TblStudentCustody
     */
    public function getStudentCustodyByStudentAndCustody(TblAccount $tblAccountStudent, TblAccount $tblAccountCustody)
    {

        return $this->getCachedEntityBy(__METHOD__, $this->getConnection()->getEntityManager(), 'TblStudentCustody',
            array(
                TblStudentCustody::ATTR_SERVICE_TBL_ACCOUNT_STUDENT => $tblAccountStudent->getId(),
                TblStudentCustody::ATTR_SERVICE_TBL_ACCOUNT_CUSTODY => $tblAccountCustody->getId()
            ));
    }

    /**
     * @param $Cluster
     * @param $Application
     * @param $Module
     * @param $Identifier
     * @param string $Type
     * @param $Value
     * @param string $Category
     * @param string $Description
     * @param bool $IsPublic
     *
     * @return TblSetting
     */
    public function createSetting(
        $Cluster,
        $Application,
        $Module,
        $Identifier,
        $Type,
        $Value,
        $Category = 'Allgemein',
        $Description = '',
        $IsPublic = false
    ) {

        $Manager = $this->getConnection()->getEntityManager();

        $Entity = $Manager->getEntity('TblSetting')->findOneBy(array(
            TblSetting::ATTR_CLUSTER => $Cluster,
            TblSetting::ATTR_APPLICATION => $Application,
            TblSetting::ATTR_MODULE => $Module ? $Module : null,
            TblSetting::ATTR_IDENTIFIER => $Identifier,
        ));
        if ($Entity === null) {
            $Entity = new TblSetting();
            $Entity->setCluster($Cluster);
            $Entity->setApplication($Application);
            $Entity->setModule($Module);
            $Entity->setIdentifier($Identifier);
            $Entity->setType($Type);
            $Entity->setValue($Value);
            $Entity->setCategory($Category);
            $Entity->setDescription($Description);
            $Entity->setIsPublic($IsPublic);

            $Manager->saveEntity($Entity);
            Protocol::useService()->createInsertEntry($this->getConnection()->getDatabase(), $Entity);
        }

        return $Entity;
    }

    /**
     * @param TblSetting $tblSetting
     * @param $value
     *
     * @return bool
     * @throws \Doctrine\ORM\ORMException
     * @throws \Doctrine\ORM\OptimisticLockException
     * @throws \Doctrine\ORM\TransactionRequiredException
     */
    public function updateSetting(TblSetting $tblSetting, $value)
    {
        $Manager = $this->getConnection()->getEntityManager();

        /** @var TblSetting $Entity */
        $Entity = $Manager->getEntityById('TblSetting', $tblSetting->getId());
        $Protocol = clone $Entity;
        if (null !== $Entity) {
            $Entity->setValue($value);
            $Manager->saveEntity($Entity);
            Protocol::useService()->createUpdateEntry($this->getConnection()->getDatabase(),
                $Protocol,
                $Entity);

            return true;
        }

        return false;
    }

    /**
     * @param TblSetting $tblSetting
     * @param string $category
     * @param string $description
     * @param bool $isPublic
     *
     * @return bool
     */
    public function updateSettingDescription(TblSetting $tblSetting, $category, $description, $isPublic = false)
    {

        $Manager = $this->getConnection()->getEntityManager();

        /** @var TblSetting $Entity */
        $Entity = $Manager->getEntityById('TblSetting', $tblSetting->getId());
        $Protocol = clone $Entity;
        if (null !== $Entity) {
            $Entity->setCategory($category);
            $Entity->setDescription($description);
            $Entity->setIsPublic($isPublic);
            $Manager->saveEntity($Entity);
            Protocol::useService()->createUpdateEntry($this->getConnection()->getDatabase(),
                $Protocol,
                $Entity);

            return true;
        }

        return false;
    }

    /**
     * @param TblAccount $tblAccountStudent
     * @param TblAccount $tblAccountCustody
     * @param TblAccount $tblAccountBlocker
     *
     * @return TblStudentCustody
     */
    public function createStudentCustody(
        TblAccount $tblAccountStudent,
        TblAccount $tblAccountCustody,
        TblAccount $tblAccountBlocker
    ) {

        $Manager = $this->getConnection()->getEntityManager();

        $Entity = new TblStudentCustody();
        $Entity->setServiceTblAccountStudent($tblAccountStudent);
        $Entity->setServiceTblAccountCustody($tblAccountCustody);
        $Entity->setServiceTblAccountBlocker($tblAccountBlocker);
        $Manager->saveEntity($Entity);
        Protocol::useService()->createInsertEntry($this->getConnection()->getDatabase(), $Entity);

        return $Entity;
    }

    /**
     * @param TblStudentCustody $tblStudentCustody
     *
     * @return bool
     */
    public function removeStudentCustody(TblStudentCustody $tblStudentCustody)
    {
        $Manager = $this->getConnection()->getEntityManager();

        $Entity = $Manager->getEntity('TblStudentCustody')->findOneBy(array('Id' => $tblStudentCustody->getId()));
        if (null !== $Entity) {
            /** @var Element $Entity */
            Protocol::useService()->createDeleteEntry($this->getConnection()->getDatabase(),
                $Entity);
            $Manager->killEntity($Entity);
            return true;
        }
        return false;
    }

    /**
     * @param TblSetting $tblSetting
     * @param TblConsumer $tblConsumer
     *
     * @return string
     */
    public function getSettingByConsumer(TblSetting $tblSetting, TblConsumer $tblConsumer)
    {

        $value = '';
        $connection = false;
        $container = Database::getDataBaseConfig($tblConsumer);

        if ($container) {
            try {
                $connection = $this->getConnectionByAcronym(
                    $container->getContainer('Host')->getValue(),
                    $container->getContainer('Username')->getValue(),
                    $container->getContainer('Password')->getValue(),
                    $tblConsumer->getAcronym()
                );

                if ($connection) {
                    $queryBuilder = $connection->getQueryBuilder();

                    $query = $queryBuilder->select('S.Value')
                        ->from('SettingConsumer_' . $tblConsumer->getAcronym() . '.tblSetting', 'S')
                        ->where('S.Identifier = :identifier')
                        ->setParameter('identifier', $tblSetting->getIdentifier());

                    $result = $query->execute();
                    $array = $result->fetch();

                    if (isset($array['Value'])) {
                        $value = $array['Value'];
                    }

                    $connection->getConnection()->close();
                }
            } catch (\Exception $Exception) {
                if ($connection) {
                    $connection->getConnection()->close();
                }
                $connection = null;
            }
        }

        return $value;
    }

    /**
     * @param string $Host Server-Address (IP)
     * @param string $User
     * @param string $Password
     * @param string $Acronym DatabaseName will get prefix 'SettingConsumer_' e.g. SettingConsumer_{Acronym}
     *
     * @return bool|IBridgeInterface
     */
    private function getConnectionByAcronym($Host, $User, $Password, $Acronym)
    {
        $Connection = MocDatabase::getDatabase(
            $User, $Password, 'SettingConsumer_' . strtoupper($Acronym), (new MySql())->getIdentifier(), $Host
        );
        if ($Connection->getConnection()->isConnected()) {
            return $Connection;
        }
        return false;
    }
}