<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, 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($pBogenIDs)
  {
    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($pID)
  {
    $id = $this->dboperation->getInt4Sql($pID);

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

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

    return $this->getFirstRow();
  }

  
  public function getFeedbackBogenByKnr($pKnr, $pTyp)
  {
    $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($pKurs, $pFaecherAry, $pIncludeSubFachbereich = true, $pBogenTyp = 'D')
  {
    $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($pFachBereichId, $pIncludeSubordinate)
  {
    
    
    
    
    
    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($pFaecherAry)
  {
    $sql = '';
    if (is_array($pFaecherAry) && !empty($pFaecherAry)) {
      $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($pTyp = '', $pFeedbackBogenBezeichnung = '')
  {
    $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();
  }
}