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


class DBWorkFeedBackBogen extends DBWorkGenerated
{
  public function __construct($pDBTyp = 1, $pNewInstance = false)
  {
    parent::__construct($pDBTyp, $pNewInstance);
    $this->select = 'fbb.id, fbb.bezeichnung, ' . $this->clob('fbb.bemerkung') . ', fbb.typ, fbb.art, fbb.benutzer, fbb.gruppen, fbb.knrvon,
                     fbb.knrbis, fbb.fachbereiche, fbb.veranstaltungsarten, fbb.faecher, ' . $this->clob('fbb.vorspann') . ', ' . $this->clob('fbb.nachspann') . ',
                     fbb.kapitelanzeigen, fbb.kapitelnummernanzeigen, fbb.fragen_online_gruppiert';
  }

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

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

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

    $tmp->id = $this->getDatamodulValue('id');
    $tmp->bezeichnung = $this->getDatamodulValue('bezeichnung');
    $tmp->bemerkung = $this->getDatamodulValue('bemerkung');
    $tmp->typ = $this->getDatamodulValue('typ');
    $tmp->art = $this->getDatamodulValue('art');
    $tmp->benutzer = $this->getDatamodulValue('benutzer');
    $tmp->gruppen = $this->getDatamodulValue('gruppen');
    $tmp->knrvon = $this->getDatamodulValue('knrvon');
    $tmp->knrbis = $this->getDatamodulValue('knrbis');
    $tmp->fachbereiche = $this->getDatamodulValue('fachbereiche');
    $tmp->veranstaltungsarten = $this->getDatamodulValue('veranstaltungsarten');
    $tmp->faecher = $this->getDatamodulValue('faecher');
    $tmp->vorspann = $this->getDatamodulValue('vorspann');
    $tmp->nachspann = $this->getDatamodulValue('nachspann');
    $tmp->kapitelanzeigen = $this->getDatamodulValue('kapitelanzeigen');
    $tmp->kapitelnummernanzeigen = $this->getDatamodulValue('kapitelnummernanzeigen');
    $tmp->fragen_online_gruppiert = $this->getDatamodulValue('fragen_online_gruppiert');

    return $tmp;
  }

  
  public function getFeedBackBogenByBogenIDs(array $pBogenIDs): array
  {
    if (empty($pBogenIDs)) {
      return array();
    }

    $bogenIDs = $this->dboperation->getInts4Sql($pBogenIDs);

    $sqlstr = 'SELECT ' . $this->select . ' FROM ' . $this->getTableName() . ' WHERE ' . $this->createInStatement('id', $bogenIDs);

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

    return $this->getAllRows();
  }

  
  public function getFeedBackBogenByID(int $pID, bool $pRefreshCache = false): \FeedBackBogen
  {
    static $cache = array();
    $id = $this->dboperation->getInt4Sql($pID);

    if (!isset($cache[$id]) || $pRefreshCache) {
      $sqlstr = 'SELECT ' . $this->select . ' FROM ' . $this->getTableName() . ' WHERE fbb.id = ' . $id;

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

      $cache[$id] = $this->getFirstRow();
    }

    return $cache[$id];
  }

  
  public function getFeedbackBogenByKnr(string $pKnr, string $pTyp): array
  {
    $sqlstr = 'SELECT ' . $this->select . ' FROM ' . $this->getTableName()
              . ' WHERE fbb.typ = \'' . $pTyp . '\' AND fbb.art=\'I\' ';

    $knr = $this->dboperation->getString4Sql($pKnr);

    
    $sqlstr .= ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.knrvon') . ' OR fbb.knrvon <= \'' . $knr . '\') ';
    $sqlstr .= ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.knrbis') . ' OR fbb.knrbis >= \'' . $knr . '\') ';

    
    

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

    return $this->getAllRows();
  }

  
  public function getFeedbackBogenByDifferentCriteria(\Kurs $pKurs, array $pFaecherAry, bool $pIncludeSubFachbereich = true, string $pBogenTyp = 'D'): array
  {
    $sqlstr = 'SELECT ' . $this->select . ' FROM ' . $this->getTableName()
              . ' INNER JOIN feedbackbogenfragen fbbf ON fbb.id = fbbf.bogenid'
              . ' WHERE fbb.typ = \'' . $pBogenTyp . '\' AND fbb.art=\'I\' ';
    
    $sqlstr .= ' AND fbbf.frageid > 0';
    $knr = $this->dboperation->getString4Sql($pKurs->id);

    
    $sqlstr .= ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.knrvon') . ' OR fbb.knrvon <= \'' . $knr . '\') ';
    $sqlstr .= ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.knrbis') . ' OR fbb.knrbis >= \'' . $knr . '\') ';

    
    
    $sqlstr .= $this->getSQLFachbereichSelect($pKurs->fachb, $pIncludeSubFachbereich);

    
    
    $sqlstr .= ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.veranstaltungsarten')
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.veranstaltungsarten', '%' . $pKurs->kart_key . '%') . ')';

    
    if (is_array($pFaecherAry) && !empty($pFaecherAry)) {
      $sqlstr .= $this->getSQLFaecherSelect($pFaecherAry);
    }

    $this->dboperation->clear();
    $this->dboperation->query($sqlstr);
    
    return $this->getAllRows();
  }

  
  protected function postGetAllRowsHook($pDatamodules, $pRefreshCache = false)
  {
    $feedbackBogenAry = parent::postGetAllRowsHook($pDatamodules, $pRefreshCache);
    
    $feedbackBogenUniqueAry = array();

    

    $uniqueFbbIds = array();
    
    foreach ($feedbackBogenAry as $feedbackBogen) {
      if (!in_array($feedbackBogen->id, $uniqueFbbIds)) {
        $uniqueFbbIds[] = $feedbackBogen->id;
        $feedbackBogenUniqueAry[] = $feedbackBogen;
      }
    }

    return $feedbackBogenUniqueAry;
  }

  
  private function getSQLFachbereichSelect(string $pFachBereichId, bool $pIncludeSubordinate): string
  {
    
    
    
    
    
    if ($pIncludeSubordinate) {
      $sql = ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.fachbereiche')
          
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', $pFachBereichId . '%')
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', '%#' . $pFachBereichId . '%') . ')';
    }
    
    
    
    else {
      
      
      
      $sql = ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.fachbereiche')
          
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', '%#' . $pFachBereichId . '#%')
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', '%#' . $pFachBereichId)
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', $pFachBereichId . '#%')
            . ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.fachbereiche', $pFachBereichId) . ')';
    }

    return $sql;
  }

  
  private function getSQLFaecherSelect(array $pFaecherAry): string
  {
    if (empty($pFaecherAry)) {
      return '';
    }

    $sql = ' AND (' . $this->dboperation->dbparser->emptyStringComparison('fbb.faecher');

    foreach ($pFaecherAry as $fach) {
      $sql .= ' OR ' . $this->dboperation->dbparser->caseInsensitiveLike('', 'fbb.faecher', '%' . $fach . '%');
    }

    $sql .= ')';

    return $sql;
  }

  
  public function getFirstFeedbackbogen(string $pTyp = '', string $pFeedbackBogenBezeichnung = ''): FeedBackBogen
  {
    $query = $this->getSelectQueryBuilder();
    $query->select($this->select)
      ->from($this->getTableName())
      ->where('1=1');

    if ($pTyp !== '') {
      $query->addToWhere('AND typ = :typ:')
        ->paramString('typ', $pTyp);
    }

    if ($pFeedbackBogenBezeichnung !== '') {
      $query->addToWhere('AND bezeichnung like :bezeichnung:')
        ->paramString('bezeichnung', '%' . $pFeedbackBogenBezeichnung . '%');
    }

    $query->orderByAsc('fbb.id');

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

    return $this->getFirstRow();
  }
}