<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */


class DBWorkBeziehung extends DBWorkGenerated
{
  public const BEZIEHUNG_ELTERN_ZU_KIND = 2;
  public const BEZIEHUNG_FIRMA_ZU_MITARBEITER = 3;

  public const BEZIEHUNG_AUSBILDER_ZU_MITARBEITER = 8;

  public const BEZIEHUNG_VORGESETZTER_EINES_TEILNEHMERS = 16;

  public function __construct($pDBTyp = 1, $pNewInstance = false)
  {
    parent::__construct($pDBTyp, $pNewInstance);
    $this->select = 'id, typ1, nr1, typ2, nr2, bezid, gueltig_von, gueltig_bis';
  }

  
  public function getNewObject()
  {
    return new Beziehung();
  }

  public function getTableName(): string
  {
    return 'beziehung';
  }

  
  public function getCurrentRow($pRefreshCache = false)
  {
    $tmp = $this->getNewObject();

    $tmp->id = $this->getDatamodulValue('id');
    $tmp->typ1 = $this->getDatamodulValue('typ1');
    $tmp->nr1 = $this->getDatamodulValue('nr1');
    $tmp->typ2 = $this->getDatamodulValue('typ2');
    $tmp->nr2 = $this->getDatamodulValue('nr2');
    $tmp->bezId = $this->getDatamodulValue('bezid');
    $tmp->gueltig_von = $this->getDatamodulValue('gueltig_von');
    $tmp->gueltig_bis = $this->getDatamodulValue('gueltig_bis');

    return $tmp;
  }

  
  public function getBeziehungenElternteilZuKinder($pTnrElternteil)
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(2);
    $query->addToWhere('AND bz.nr1 = :tnrElternteil:')
          ->paramInt('tnrElternteil', $pTnrElternteil);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows();
  }

  
  public function getMitarbeiterTnrZuFirma($pTnrFirma, bool $ignoreBeginning = false)
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(static::BEZIEHUNG_FIRMA_ZU_MITARBEITER, $ignoreBeginning);
    $query->select('bz.nr2')
          ->addToWhere('AND bz.nr1 = :tnrFirma:')
          ->paramInt('tnrFirma', $pTnrFirma);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRowsSingleColumn('nr2');
  }

  
  public function getBeziehungMitarbeiterZuFirma($pTnrMitarbeiter, $pRefreshCache = false)
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(static::BEZIEHUNG_FIRMA_ZU_MITARBEITER);
    $query->select('bz.nr1')
          ->and('bz.nr2 = :tnrMitarbeiter:')
          ->paramInt('tnrMitarbeiter', $pTnrMitarbeiter);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows($pRefreshCache);
  }

  
  public function getBeziehungElternteilZuKind($pTnrElternteil, $pTnrKind)
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(2);
    $query->addToWhere('AND bz.nr1 = :tnrElternteil:')
          ->addToWhere('AND bz.nr2 = :tnrKind:')
          ->paramInt('tnrElternteil', $pTnrElternteil)
          ->paramInt('tnrKind', $pTnrKind);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getFirstRow();
  }

  
  public function getBeziehungenAusbilderZuTeilnehmer($pTnrMitarbeiter, $pRefreshCache = false)
  {
    $query = $this->getSQLQuery4ArtVonDozentZuTeilnehmer(static::BEZIEHUNG_AUSBILDER_ZU_MITARBEITER);
    $query->and('bz.nr2 = :tnrMitarbeiter:')
          ->paramInt('tnrMitarbeiter', $pTnrMitarbeiter);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows($pRefreshCache);
  }

  
  public function getBeziehungenAusbilderZuFirma($pDnrAusbilder, $pRefreshCache = false)
  {
    $query = $this->getSQLQuery4ArtTeilnehmerZuDozent(static::BEZIEHUNG_AUSBILDER_ZU_MITARBEITER);
    $query->and('bz.nr2 = :dnrAusbilder:')
          ->paramInt('dnrAusbilder', $pDnrAusbilder);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows($pRefreshCache);
  }

  
  public function getSQLQuery4Art($art, bool $ignoreBeginning = false)
  {
    if (!is_array($art)) {
      $art = array($art);
    }

    $query = $this->getSelectQueryBuilder();
    $query->select($this->applyPrefixToFieldList($this->select, 'bz.'))
          ->from('beziehung', 'bz')
          ->leftJoin('hlbeziehung hlbz', 'bz.bezid=hlbz.id')
          ->where('hlbz.art IN(:art:)');

    if (!$ignoreBeginning) {
      $query = $query
        ->addToWhere('AND (bz.gueltig_von = :defaultdate: OR bz.gueltig_von <= :now:) ');
    }

    return $query
          ->addToWhere('AND (bz.gueltig_bis = :defaultdate: OR bz.gueltig_bis >= :now:) ')
          ->addToWhere('AND ' . $this->dboperation->dbparser->isNull('hlbz.inaktiv', '\'F\'') . ' != \'W\' ')
          ->addToWhere('AND ' . $this->dboperation->dbparser->isNull('bz.inaktiv', "'F'") . ' != \'W\' ') 

          ->paramIntArray('art', $art)
          ->paramDate('defaultdate', DEFAULTDATE . ' ' . DEFAULTTIME)
          ->paramDate('now', $this->datetimeop->getDateNow());
  }

  
  public function getSQLQuery4ArtZwischenTeilnehmern($art, bool $ignoreBeginning = false)
  {
    $query = $this->getSQLQuery4Art($art, $ignoreBeginning);
    $query->addToWhere("AND bz.typ1='T'")
          ->addToWhere("AND bz.typ2='T'");

    return $query;
  }

  
  public function getSQLQuery4ArtZwischenDozenten($art)
  {
    $query = $this->getSQLQuery4Art($art);
    $query->addToWhere("AND bz.typ1='D'")
          ->addToWhere("AND bz.typ2='D'");

    return $query;
  }

  
  public function getSQLQuery4ArtVonDozentZuTeilnehmer($art)
  {
    $query = $this->getSQLQuery4Art($art);
    $query->addToWhere("AND bz.typ1='D'")
          ->addToWhere("AND bz.typ2='T'");

    return $query;
  }

  
  public function getSQLQuery4ArtTeilnehmerZuDozent($art)
  {
    $query = $this->getSQLQuery4Art($art);
    $query->addToWhere("AND bz.typ1='T'")
          ->addToWhere("AND bz.typ2='D'");

    return $query;
  }

  
  public function getSQLQuery4ArtVonTeilnehmerZuDozent($art)
  {
    $query = $this->getSQLQuery4Art($art);
    $query->addToWhere("AND bz.typ1='T'")
          ->addToWhere("AND bz.typ2='D'");

    return $query;
  }

  
  public function getVeranstalterDnrs($user)
  {
    if (is_numeric($user->dnr) && $user->dnr > 0) {
      $query = $this->getSQLQuery4ArtZwischenDozenten(array(10, 11, 12));
      $nr = $user->dnr;
    } elseif (is_numeric($user->tnr) && $user->tnr > 0) {
      $query = $this->getSQLQuery4ArtVonDozentZuTeilnehmer(array(10, 11, 12));
      $nr = $user->tnr;
    } else {
      return array();
    }
    $query->addToWhere('AND bz.nr2=:mitarbeiter:')
          ->paramInt('mitarbeiter', $nr)
          ->orderByAsc('bz.id');

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRowsSingleColumn('nr1');
  }

  public function getVeranstalterDnr($user)
  {
    if (is_numeric($user->dnr) && $user->dnr > 0) {
      $query = $this->getSQLQuery4ArtZwischenDozenten(array(10, 11, 12));
      $nr = $user->dnr;
    } elseif (is_numeric($user->tnr) && $user->tnr > 0) {
      $query = $this->getSQLQuery4ArtVonDozentZuTeilnehmer(array(10, 11, 12));
      $nr = $user->tnr;
    } else {
      return 0;
    }
    $query->addToWhere('AND bz.nr2=:mitarbeiter:')
          ->paramInt('mitarbeiter', $nr);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    if ($this->dboperation->rowcount() > 0) {
      $this->dboperation->selectrow(0);

      return $this->dboperation->fieldbyname('nr1');
    } else {
      return 0;
    }
  }

  
  public function getVeranstalterTnr($veranstalterDnr)
  {
    $tnrs = $this->getTnrsVonMitarbeterUndLeiterDnrs(array($veranstalterDnr));
    
    if (count($tnrs) == 1) {
      return $tnrs[0];
    } else {
      return 0;
    }
  }

  
  public function getLeiterTnr($leiterDnr)
  {
    
    
    return $this->getVeranstalterTnr($leiterDnr);
  }

  
  public function getHlBezId4BeziehungsArt($art)
  {
    $cleanArt = $this->dboperation->getInt4Sql($art);
    $sql = 'SELECT id FROM hlbeziehung WHERE art = ' . $cleanArt . ' AND ' . $this->dboperation->dbparser->isNull('inaktiv', '\'F\'') . ' != \'W\' ';

    $this->dboperation->clear();
    $this->dboperation->query($sql);
    $rowcount = $this->dboperation->rowcount();
    if ($rowcount > 0) {
      $this->dboperation->selectrow(0);

      return $this->dboperation->fieldbyname('id');
    } else {
      return -1; 
    }
  }

  

  public function getBeziehungenVonVeranstalterZuPersonSalzburgBildungswerk($art, $veranstalterDnrs)
  {
    if (empty($veranstalterDnrs)) {
      return array();
    }

    $query = $this->getSQLQuery4ArtZwischenDozenten($art);
    $query->addToWhere('AND bz.nr1 IN (:veranstalterDnrs:)')
          ->paramIntArray('veranstalterDnrs', $veranstalterDnrs);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows();
  }

  public function getBeziehungenVonPersonZuVeranstalterSalzburgBildungswerk($art, $personenDnrs)
  {
    if (empty($personenDnrs)) {
      return array();
    }

    $query = $this->getSQLQuery4ArtZwischenDozenten($art);
    $query->addToWhere('AND bz.nr2 IN (:personenDnrs:)')
          ->paramIntArray('personenDnrs', $personenDnrs);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRows();
  }

  public function getBeziehungenLeiterVonVeranstalter($veranstalterDnr)
  {
    return $this->getBeziehungenVonVeranstalterZuPersonSalzburgBildungswerk(array(10), array($veranstalterDnr));
  }

  public function getBeziehungenVorsitzendeVonVeranstalter($veranstalterDnr)
  {
    return $this->getBeziehungenVonVeranstalterZuPersonSalzburgBildungswerk(array(15), array($veranstalterDnr));
  }

  public function getBeziehungVeranstalterVonLeiter($leiterDnr)
  {
    $beziehungen = $this->getBeziehungenVonPersonZuVeranstalterSalzburgBildungswerk(array(10), array($leiterDnr));
    if (!empty($beziehungen)) {
      return $beziehungen[0];
    } else {
      return $this->getNewObject();
    }
  }

  public function getBeziehungVeranstalterVonLeiterOderMitarbeiter($leiterOderMitarbeiterDnr)
  {
    $beziehungen = $this->getBeziehungenVonPersonZuVeranstalterSalzburgBildungswerk(array(10, 11, 12), array($leiterOderMitarbeiterDnr));
    if (!empty($beziehungen)) {
      return $beziehungen[0];
    } else {
      return $this->getNewObject();
    }
  }

  public function getMitarbeterDnrsVonVeranstalter($veranstalterDnr)
  {
    $beziehungen = $this->getBeziehungenVonVeranstalterZuPersonSalzburgBildungswerk(array(11, 12), array($veranstalterDnr));

    return ArrayOperations::mapAttribut($beziehungen, 'nr2');
  }

  
  public function getMitarbeiterUndLeiterQuery(): \SelectQueryBuilder
  {
    return $this->getSQLQuery4ArtZwischenDozenten(array(10, 11, 12));
  }

  
  public function getMitarbeterUndLeiterDnrs()
  {
    $query = $this->getMitarbeiterUndLeiterQuery();
    $query->select('bz.nr2');

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    $beziehungen = $this->getAllRows();

    return ArrayOperations::mapAttribut($beziehungen, 'nr2');
  }

  public function getMitarbeiterUndLeiterDnrsVonVeranstalterQuery($veranstalterQuery): \SelectQueryBuilder
  {
    $art = array(10, 11, 12);

    return $this->getSQLQuery4ArtZwischenDozenten($art)
          ->addToWhere('AND bz.nr1 IN (:veranstalterDnrs:)')
          ->paramSelectQuery('veranstalterDnrs', $veranstalterQuery)
          ->select('nr2');
  }

  public function getMitarbeterUndLeiterDnrsVonVeranstalterArray($veranstalterDnrArray)
  {
    $beziehungen = $this->getBeziehungenVonVeranstalterZuPersonSalzburgBildungswerk(array(10, 11, 12), $veranstalterDnrArray);

    return ArrayOperations::mapAttribut($beziehungen, 'nr2');
  }

  public function getZustaendigeTnrsEinesVorgesetzten(int $tnrVorgesetzter): array
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(array(self::BEZIEHUNG_VORGESETZTER_EINES_TEILNEHMERS));
    $query->select('bz.nr2')
      ->addToWhere('AND bz.nr1 = :tnrVorgesetzter:')
      ->paramInt('tnrVorgesetzter', $tnrVorgesetzter);

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRowsSingleColumn('nr2');
  }

  public function getVorgesetztenTnrsEinesTeilnehmers(\Kufer\Web\Classes\Identifier\Identifier $tnId): array
  {
    $query = $this->getSQLQuery4ArtZwischenTeilnehmern(array(self::BEZIEHUNG_VORGESETZTER_EINES_TEILNEHMERS));
    $query->select('bz.nr1')
      ->addToWhere('AND bz.nr2 = :tnr:')
      ->paramInt('tnr', $tnId->getId());

    $this->dboperation->clear();
    $this->dboperation->query($query->getSQL());

    return $this->getAllRowsSingleColumn('nr1');
  }

  public function getTnrsVonMitarbeterUndLeiterDnrs($mitarbeiterDnrs)
  {
    if (empty($mitarbeiterDnrs)) {
      return array();
    }
    
    

    $query1 = $this->getSQLQuery4ArtVonDozentZuTeilnehmer(array(1));
    $query1->select('bz.nr2')
          ->addToWhere('AND bz.nr1 IN(:mitarbeiterDnrs:)')
          ->paramIntArray('mitarbeiterDnrs', $mitarbeiterDnrs);

    $this->dboperation->clear();
    $this->dboperation->query($query1->getSQL());

    $beziehungen1 = $this->getAllRows();

    $tnrs1 = ArrayOperations::mapAttribut($beziehungen1, 'nr2');


    $query2 = $this->getSQLQuery4ArtVonTeilnehmerZuDozent(array(1));
    $query2->select('bz.nr1')
          ->addToWhere('AND bz.nr2 IN(:mitarbeiterDnrs:)')
          ->paramIntArray('mitarbeiterDnrs', $mitarbeiterDnrs);

    $this->dboperation->clear();
    $this->dboperation->query($query2->getSQL());

    $beziehungen2 = $this->getAllRows();

    $tnrs2 = ArrayOperations::mapAttribut($beziehungen2, 'nr1');

    return array_merge($tnrs1, $tnrs2);
  }

  public function getMitarbeterUndLeiterTeilnehmerNummernVonVeranstalterArray($veranstalterDnrArray)
  {
    $dnrs = $this->getMitarbeterUndLeiterDnrsVonVeranstalterArray($veranstalterDnrArray);

    return $this->getTnrsVonMitarbeterUndLeiterDnrs($dnrs);
  }

  
  public function getBeziehungFromPerson($art, $personTyp0, $personNr0, $personTyp1, $personNr1)
  {
    $builder = $this->getSQLQuery4Art($art);
    $builder->and('bz.typ1 = :typ0:')
            ->and('bz.nr1 = :nr0:')
            ->and('bz.typ2 = :typ1:')
            ->and('bz.nr2 = :nr2:')
            ->paramInt('typ0', $personTyp0)
            ->paramInt('nr0', $personNr0)
            ->paramInt('typ1', $personTyp1)
            ->paramInt('nr1', $personNr1);

    $this->dboperation->clear();
    $this->dboperation->query($builder->getSQL());

    return $this->getFirstRow();
  }

  public function getAllQuery(): \SelectQueryBuilder
  {
    return $this->getSelectQueryBuilder()
      ->select($this->select)
      ->from($this->getTableName(), 'bz')
      ->paramRaw('table', 'bz');
  }

  public function findByFilterQuery(\Kufer\Web\Classes\Dbfilter\BeziehungenSQLFilter $filter): \SelectQueryBuilder
  {
    $condition = $filter->createSql($this->dboperation);

    return $this->getAllQuery()
      ->and($condition);
  }

  
  public function findByFilter(\Kufer\Web\Classes\Dbfilter\BeziehungenSQLFilter $filter): array
  {
    $builder = $this->findByFilterQuery($filter);

    $this->dboperation->clear();
    $this->dboperation->query($builder->getSQL());

    return $this->getAllRows();
  }

  
  public function findIdsByFilter(\Kufer\Web\Classes\Dbfilter\BeziehungenSQLFilter $filter): array
  {
    $builder = $this->findByFilterQuery($filter)
      ->select(':table:.id');

    $this->dboperation->clear();
    $this->dboperation->query($builder->getSQL());

    return $this->getAllRowsSingleColumn('nr');
  }

  
  public function countByFilter(\Kufer\Web\Classes\Dbfilter\BeziehungenSQLFilter $filter): int
  {
    $builder = $this->findByFilterQuery($filter)
      ->select('COUNT(*) AS anzahl');

    $this->dboperation->clear();
    $this->dboperation->query($builder->getSQLForInnerQuery());

    $this->dboperation->selectrow(0);

    return (int)$this->getValue('anzahl', \DatamodulVarType::TYPE_INT);
  }
}