<?php

/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

class DBWorkKursplanung extends DBWork
{
  private $felder;
  private $dbwKursplanungDokumente;
  private $dbwKursplanungDozenten;
  private $dbwKursplanungWerbung;
  private $dbwKursplanungKursort;

  public function __construct($pDBTyp = 1, $pNewInstance = false)
  {
    parent::__construct($pDBTyp, $pNewInstance);

    $this->felder = \array_merge(
      array('id', 'knr', 'kopiertVon', 'titel', $this->clob('info'), 'dozNr', 'woher', 'zeitstempel', 'kursort', $this->clob('methode'), $this->clob('ziel'), $this->clob('zielgruppe'),
                          $this->clob('anmelde'), 'material', $this->clob('voraussetzungen'), 'kurzbez', 'web_user_id', 'semester', 'beginn_dat', $this->clob('beginn_dat_wunsch'),
                          'beginn', $this->clob('beginn_wunsch'), 'dauer', 'bis_semende', $this->clob('bemerkung'), $this->clob('raum_anforderung'), 'ende_dat', 'ende', 'teil_min', 'teil_max',
                          'verlauf', 'stundenanz', 'abwktage',
                          'altervon', 'alterbis', 'ma_planend_id', 'fachb', 'fachb_bvv', 'fachb_land', 'aussenstelle', 'anm_ende', $this->clob('zusatztext6'),
                          $this->clob('zusatztext7'), $this->clob('zusatztext8'), $this->clob('zusatztext9'), $this->clob('zusatztext10'), 'kurstyp', 'kursgebuehr', 'kirchenbezirk', 'kirchengemeinde',
                          'veranstalter_nr', 'kurstage_anlegen', 'in_bearbeitung', 'kostenfreitxt', 'teinzel_m', 'teinzel_w', 'kart_key', 'termin_tel_kontakt', 'termin_nachbericht', 'termin_vorbericht',
                          'internetaktiv', 'presse_weitergabe', 'salzbnachr_weitergabe', 'eduard_weitergabe', 'agb_bestaetigt_am', 'websuchbegriffe', 'honorarfaktor', 'honorarsatz', 'pauschal_honorar',
                          'fahrtentfernung', 'fahrtkmsatz', 'pauschale_fahrtkosten', 'dauerdetai', 'kzielg_key', 'vertrag', 'webinfo', 'kurstage_rzvor', 'kurstage_rznach', 'intnotiz', 'ksk', 'webinar', 'kebstoff', 'knr_org'),
      \array_map(\FunctionOperations::prefixString('freidef'), \range(1, 40))
    );
    $this->select = implode(', ', $this->felder);

    $this->dbwKursplanungDokumente = new DBWorkKursplanungDokumente(1, true);
    $this->dbwKursplanungDozenten = new DBWorkKursplanungDozenten(1, true);
    $this->dbwKursplanungWerbung = new DBWorkKursplanungWerbung(1, true);
    $this->dbwKursplanungKursort = new DBWorkKursplanungKursort(1, true);
  }

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

    
    
    foreach ($this->felder as $feld) {
      $result->{$feld} = $this->getDatamodulValue($feld);
    }

    return $result;
  }

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

  protected function postGetAllRowsHook($pDatamodules, $pRefreshCache = false)
  {
    $datamodules = parent::postGetAllRowsHook($pDatamodules, $pRefreshCache);

    $kursplanungIds = ArrayOperations::mapAttribut($datamodules, 'id');
    $dokumente = $this->dbwKursplanungDokumente->getDokumenteByKursplanungIds($kursplanungIds);
    $dokumenteByPlanungId = ArrayOperations::setAttributAsKeyArray($dokumente, 'kursplanung_id');

    $dozenten = $this->dbwKursplanungDozenten->getDozentenByKursplanungIds($kursplanungIds);
    $dozentenByPlanungId = ArrayOperations::setAttributAsKeyArray($dozenten, 'kursplanung_id');

    $werbemittel = $this->dbwKursplanungWerbung->getWerbemittelByKursplanungIds($kursplanungIds);
    $werbemittelByPlanungId = ArrayOperations::setAttributAsKeyArray($werbemittel, 'kursplanung_id');

    $kursorte = $this->dbwKursplanungKursort->getKursorteByKursplanungIds($kursplanungIds);
    $kursorteByPlanungId = ArrayOperations::setAttributAsKey($kursorte, 'kursplanung_id');

    foreach ($datamodules as $key => $kursplanung) {
      if (isset($dokumenteByPlanungId[$kursplanung->id])) {
        $datamodules[$key]->dokumente = $dokumenteByPlanungId[$kursplanung->id];
      }
      if (isset($dozentenByPlanungId[$kursplanung->id])) {
        $datamodules[$key]->dozenten = $dozentenByPlanungId[$kursplanung->id];
      }
      if (isset($werbemittelByPlanungId[$kursplanung->id])) {
        $datamodules[$key]->werbemittel = $werbemittelByPlanungId[$kursplanung->id];
      }
      if (isset($kursorteByPlanungId[$kursplanung->id])) {
        $datamodules[$key]->kursortObj = $kursorteByPlanungId[$kursplanung->id];
      }
    }

    return $datamodules;
  }

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

  public function getKursplanungen4ErfasserQuery($userId): \SelectQueryBuilder
  {
    return $this->getSelectQueryBuilder()
            ->selectColumnArray($this->felder)
            ->from('kursplanung')
            ->where('web_user_id = :wuid:')
            ->paramInt('wuid', $userId);
  }

  public function getKursplanungen4Erfasser($userId)
  {
    $select = $this->getKursplanungen4ErfasserQuery($userId);
    $this->dboperation->clear();
    $this->dboperation->query($select->getSQL());

    return $this->getAllRows();
  }

  public function getKursplanungenIds4Erfasser($userId): array
  {
    $builder = $this->getKursplanungen4ErfasserQuery($userId)
      ->select('id');

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

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

  public function getKursplanungen4Veranstalter($veranstalterDnr)
  {
    $select = new SelectQueryBuilder($this->dboperation);
    $select->selectColumnArray($this->felder)
            ->from('kursplanung')
            ->where('veranstalter_nr = :veranstalter:')
            ->paramInt('veranstalter', $veranstalterDnr);

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

    return $this->getAllRows();
  }

  
  public function getKursplanungen4Grafiken($raumBezeichnungen, $datumVon = '', $datumBis = '')
  {
    $select = new SelectQueryBuilder($this->dboperation);
    $select->selectColumnArray($this->felder)
            ->from('kursplanung')
            ->where('kursort IN (:raumbezeichnungen:)')
            ->paramStringArray('raumbezeichnungen', $raumBezeichnungen);

    if ($datumVon != '') {
      $select->addToWhere('AND ende_dat >= :datumVon:')
             ->paramDate('datumVon', $datumVon);
    }

    if ($datumBis != '') {
      $select->addToWhere('AND beginn_dat <= :datumBis:')
             ->paramDate('datumBis', $datumBis);
    }

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

    return $this->getAllRows();
  }

  public function getKursplanungFromID($pKursplanungId)
  {
    $select = new SelectQueryBuilder($this->dboperation);
    $select->selectColumnArray($this->felder)
           ->from('kursplanung')
           ->where('id = (:kursplanungsid:)')
           ->paramInt('kursplanungsid', $pKursplanungId);

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

    return $this->getFirstRow();
  }

  public function getKursplanungenFromIDs($pKursplanungIds)
  {
    if (count($pKursplanungIds) == 0) {
      return array();
    }

    $select = new SelectQueryBuilder($this->dboperation);
    $select->selectColumnArray($this->felder)
           ->from('kursplanung')
           ->where('id IN (:kursplanungsids:)')
           ->paramIntArray('kursplanungsids', $pKursplanungIds);

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

    return $this->getAllRows();
  }

  
  public function insert($kursplanung)
  {
    $kursplanung->id = (int)$this->insertRecord('kursplanung', 'id', 'knr');
    $this->saveChanging('kursplanung', '', '', $kursplanung->id, 'id', 'I');

    $original = new Kursplanung();
    $original->id = $kursplanung->id;

    $this->updateObject($kursplanung, $original, 'kursplanung', 'id', 'A');
    $this->setActionIDs();

    $this->aktualisiereKursplanungDokumente($kursplanung);
    $this->aktualisiereKursplanungDozenten($kursplanung);
    $this->aktualisiereKursplanungWerbemittel($kursplanung);
    $this->aktualisiereKursplanungKursort($kursplanung);

    return $kursplanung->id;
  }

  
  public function insertRecord($pTablename, $pIdField, $dummyfield, $gentableexists = false)
  {
    $tablename = $this->dboperation->getString4Sql($pTablename);
    
    
    $this->dboperation->clear();
    $this->dboperation->execute('INSERT INTO ' . $tablename . ' (web_user_id, zeitstempel'
        . ") VALUES ('0', " . $this->datetimeop->getFormatDate4Server(DEFAULTDATE) . ')');

    return $this->dboperation->getLastID($tablename);
  }

  public function canupdate($varname)
  {
    switch ($varname) {
      case 'id':
      case 'beginn_dat_wotagkurz':
      case 'beginn_dat_wotaglang':
      case 'ende_dat_wotagkurz':
      case 'ende_dat_wotaglang':
      case 'dokumente':
      case 'dozenten':
      case 'werbemittel':
      case 'kursortObj':
      case 'honorar_sbw':
        return false;
    }

    return parent::canupdate($varname);
  }

  
  public function deleteKursplanung($pKursplanungId)
  {
    $kursplanungId = $this->dboperation->getInt4Sql($pKursplanungId);
    $this->dboperation->clear();
    $this->dboperation->execute('DELETE FROM kursplanung WHERE id=' . $kursplanungId);
    $this->saveChanging('kursplanung', '', '', "'" . $kursplanungId . "'", '', 'D');
    $this->setActionIDs();

    $this->dbwKursplanungDokumente->deleteDokumenteByKursplanungId($kursplanungId);
    $this->dbwKursplanungDozenten->deleteDozentenByKursplanungId($pKursplanungId);
    $this->dbwKursplanungWerbung->deleteWerbemittelByKursplanungId($pKursplanungId);
    $this->dbwKursplanungKursort->deleteByKursplanungId($pKursplanungId);
  }

  
  public function updateKursplanung(&$pKursplanung, $pNoProtocol = false)
  {
    $orgKursplanung = $this->getKursplanungFromID($pKursplanung->id);

    $this->updateObject($pKursplanung, $orgKursplanung, 'kursplanung', 'id', 'U', $pNoProtocol);
    $this->setActionIDs();

    $this->aktualisiereKursplanungDokumente($pKursplanung);
    $this->aktualisiereKursplanungDozenten($pKursplanung);
    $this->aktualisiereKursplanungWerbemittel($pKursplanung);
    $this->aktualisiereKursplanungKursort($pKursplanung);

    return $pKursplanung;
  }

  public function aktualisiereKursplanungDokumente($pKursplanung)
  {
    $this->dbwKursplanungDokumente->deleteDokumenteByKursplanungId($pKursplanung->id);
    foreach ($pKursplanung->dokumente as $dokument) {
      $dokument->kursplanung_id = $pKursplanung->id;
      $this->dbwKursplanungDokumente->insertOne($dokument, 'kursplanung_id');
    }
  }

  public function aktualisiereKursplanungDozenten($pKursplanung)
  {
    $this->dbwKursplanungDozenten->deleteDozentenByKursplanungId($pKursplanung->id);
    foreach ($pKursplanung->dozenten as $dozent) {
      $dozent->kursplanung_id = $pKursplanung->id;
      $this->dbwKursplanungDozenten->insertOne($dozent, 'kursplanung_id');
    }
  }

  public function aktualisiereKursplanungWerbemittel($pKursplanung)
  {
    $this->dbwKursplanungWerbung->deleteWerbemittelByKursplanungId($pKursplanung->id);
    foreach ($pKursplanung->werbemittel as $werbemittel) {
      $werbemittel->kursplanung_id = $pKursplanung->id;
      $this->dbwKursplanungWerbung->insertOne($werbemittel, 'kursplanung_id');
    }
  }

  public function aktualisiereKursplanungKursort($pKursplanung)
  {
    $this->dbwKursplanungKursort->deleteByKursplanungId($pKursplanung->id);
    if (!is_null($pKursplanung->kursortObj)) {
      $pKursplanung->kursortObj->kursplanung_id = $pKursplanung->id;
      $this->dbwKursplanungKursort->insertOne($pKursplanung->kursortObj, array('kursplanung_id', 'mktext'));
    }
  }
}