Exemple #1
0
 public function getUntertitel($export = false, $links = true, $htmlentities = true)
 {
     $text = str_replace('--', '<br/>', CHtml::encode($this->untertitel));
     if (Yii::app()->getModule('event')->team) {
         if (!self::$teamModels) {
             self::$teamModels = Team::model()->findAll();
         }
         foreach (self::$teamModels as $model) {
             $alias = array($model->name);
             if ($htmlentities) {
                 $alias[] = htmlentities($model->name);
             } else {
                 $alias[] = $model->name;
             }
             if ($model->name == 'Milam M. Horn') {
                 $alias[] = 'Milam Horn';
                 $alias[] = 'Milam';
             }
             if ($model->name == 'Katarina Heidenreich') {
                 $alias[] = 'Katarina';
                 $alias[] = 'K.Heidenreich';
             }
             foreach ($alias as $name) {
                 if (strpos($text, $name) !== false) {
                     $this->teamLinks[] = $model->key;
                     if ($links) {
                         if ($export) {
                             $text = str_replace($name, CHtml::link(substr($name, 0, 1), Yii::app()->controller->createAbsoluteUrl('//page/team/get', array('key' => $model->key)), array('style' => '#placeholderpersonstyle#', 'title' => 'Teamseite')) . substr($name, 1), $text);
                         } else {
                             $text = str_replace($name, CHtml::link('<i class="glyphicon glyphicon-user"></i>', array('/page/team/get', 'key' => $model->key), array('rel' => 'nofollow')) . " " . $name, $text);
                         }
                     }
                     break;
                 }
             }
         }
     }
     return $text;
 }
 /**
  * @param int $ba_nr
  * @param string $datum_max
  */
 public function actionBa($ba_nr, $datum_max = "")
 {
     $this->top_menu = "ba";
     $this->load_leaflet_css = true;
     $this->load_leaflet_draw_css = true;
     $tage_zukunft = 60;
     $tage_vergangenheit = 60;
     $antraege_data = $this->ba_dokumente_nach_datum($ba_nr, $datum_max);
     $termine = Termin::model()->termine_stadtrat_zeitraum($ba_nr, date("Y-m-d 00:00:00", time() - $tage_vergangenheit * 24 * 3600), date("Y-m-d 00:00:00", time() + $tage_zukunft * 24 * 3600), true)->findAll(['order' => 'termin DESC']);
     $termin_dokumente = Termin::model()->neueste_ba_dokumente($ba_nr, date("Y-m-d 00:00:00", time() - $tage_vergangenheit * 24 * 3600), date("Y-m-d H:i:s", time()), false)->findAll();
     $termine = Termin::groupAppointments($termine);
     /** @var Termin[] $bvs */
     $bvs = Termin::model()->findAllByAttributes(["ba_nr" => $ba_nr, "typ" => Termin::$TYP_BUERGERVERSAMMLUNG], ["order" => "termin DESC"]);
     $bvs_arr = [];
     foreach ($bvs as $bv) {
         $bvs_arr[] = $bv->toArr();
     }
     /** @var Bezirksausschuss $ba */
     $ba = Bezirksausschuss::model()->findByPk($ba_nr);
     $gremien = $ba->gremien;
     $this->render("ba_startseite", array_merge(["ba" => $ba, "gremien" => $gremien, "termine" => $termine, "termin_dokumente" => $termin_dokumente, "bvs" => $bvs_arr, "tage_vergangenheit" => $tage_vergangenheit, "tage_zukunft" => $tage_zukunft, "tage_vergangenheit_dokumente" => static::$BA_DOKUMENTE_TAGE_PRO_SEITE, "fraktionen" => StadtraetIn::getGroupedByFraktion(date("Y-m-d"), $ba_nr), "explizites_datum" => $datum_max != ""], $antraege_data));
 }
 /**
  * @param Termin[] $alle_termine
  * @param Termin $termin
  */
 function termine_add(&$alle_termine, $termin)
 {
     if (isset($alle_termine[$termin->id])) {
         return;
     }
     $alle_termine[$termin->id] = $termin;
     if ($termin->termin_next_id > 0) {
         $next = Termin::model()->findByPk($termin->termin_next_id);
         if ($next) {
             termine_add($alle_termine, $next);
         }
     }
     if ($termin->termin_prev_id > 0) {
         $prev = Termin::model()->findByPk($termin->termin_prev_id);
         if ($prev) {
             termine_add($alle_termine, $prev);
         }
     }
 }
Exemple #4
0
    $VName = $_POST['VName'];
    $Beschreibung = $_POST['Beschreibung'];
    $Datum = $_POST['Datum'];
    $ZeitVon = $_POST['ZeitVon'];
    $ZeitBis = $_POST['ZeitBis'];
    $RID = $_POST['RID'];
    $Ort = $_POST['Ort'];
    $PID = $_POST['PID'];
    $GName = $_POST['GName'];
    $StID = $_POST['StID'];
    $ZName = $_POST['ZName'];
    $Sprache = $_POST['Sprache'];
    $erstellt_am = date('H:i', gmdate('U'));
    $freigegeben_am = NULL;
    try {
        $objTermin = new Termin($VName, $Beschreibung, $Datum, $ZeitVon, $ZeitBis, $RID, $Ort, $PID, $GName, $StID, $ZName, $Sprache, $erstellt_am, $freigegeben_am);
        //echo "<pre>",print_r(array($objTermin)),"</pre>";
        $objTermin->termin_speichern($objTermin, $DBH);
        $status = "saved";
        header("Location: http://localhost/ikvem/index.php");
        die;
    } catch (PDOException $e) {
        echo "Es gab einen Fehler" . $e->getMessage();
    }
}
// # using the shortcut ->query() method here since there are no variable
// # values in the select statement.
// $STH = $DBH->query('SELECT * from gruppe');
// # setting the fetch mode
// $STH->setFetchMode(PDO::FETCH_ASSOC);
// while($row = $STH->fetch()) {
Exemple #5
0
 function run($template)
 {
     $dbuser = new User();
     if (isREQUEST("activate")) {
         if ($dbuser->activate(REQUEST("activate")) > 0) {
             $template->add("regsuccess", "Benuter aktiviert");
         } else {
             $template->add("regerror", "Fehler beim aktivieren des Users");
         }
     }
     if (isREQUEST("logout")) {
         $dbuser->logout();
     }
     if (isREQUEST("user") && isREQUEST("password")) {
         $usr = $dbuser->logout()->login(REQUEST("user"), REQUEST("password"));
         if (!$usr) {
             $template->add("error", "Login fehlgeschlagen");
         }
     }
     if (!($usr = $dbuser->logedin())) {
         $template->view("login");
         return;
     }
     $t = new Termin();
     $template->add("usr", $usr);
     // für die User Infos oben Rechts
     $template->add("byuser", $t->allbyuser($usr["id"]));
     $template->add("bymitglied", $t->allbymitglieder($usr["id"]));
     $template->view("main");
 }
 public function actionBaTermineAlle($ba_nr)
 {
     /** @var Termin[] $termine */
     $termine = Termin::model()->findAllByAttributes(["ba_nr" => $ba_nr], ["order" => "termin DESC"]);
     $termin_arr = [];
     foreach ($termine as $t) {
         $termin_arr[] = $t->toArr();
     }
     /** @var Bezirksausschuss $ba */
     $ba = Bezirksausschuss::model()->findByPk($ba_nr);
     $this->render("ba_termine_alle", ["ba" => $ba, "termine" => $termin_arr]);
 }
Exemple #7
0
// grullist nr5MpjEYAvWnVuY8
require_once "config/config.php";
require_once "libs/get_post.lib.php";
require_once "libs/user.class.php";
require_once "libs/termin.class.php";
$u = new User();
if (isREQUEST("user") && isREQUEST("passwd")) {
    $u->login(REQUEST("user"), REQUEST("passwd"));
}
if ($usr = $u->logedin()) {
    $ret = array();
    switch (REQUEST("action", REQUEST("a", ""))) {
        case "user":
            $ret = $usr;
            break;
        case "dateadd":
            $t = new Termin();
            $ret = $t->dateadd(REQUEST("t"), $usr["id"], REQUEST("z"));
            break;
        case "vote":
            $t = new Termin();
            $ret = $t->vote(REQUEST("t"), $usr["id"], REQUEST("z"), REQUEST("v"));
            break;
        default:
            $ret = array("error" => "action: " . (isset($_GET["action"]) ? $_GET["action"] : "undefined"));
    }
    echo json_encode($ret);
} else {
    header("HTTP/1.0 401 Unauthorized");
    echo json_encode(array("error" => "401"));
}
Exemple #8
0
 public function actionSaveAll()
 {
     $criteria = new CDbCriteria(array('condition' => '`to`>' . (time() - 60 * 30), 'order' => '`from` ASC'));
     foreach (Termin::model()->findAll($criteria) as $m) {
         $m->save();
     }
 }
 public function actionBuergerInnenversammlungen()
 {
     if (!$this->binContentAdmin()) {
         $this->errorMessageAndDie(403, "");
     }
     $this->top_menu = "admin";
     if (AntiXSS::isTokenSet("delete")) {
         /** @var Termin $termin */
         $termin = Termin::model()->findByPk(AntiXSS::getTokenVal("delete"));
         $termin->delete();
         $this->msg_ok = "Gelöscht.";
     }
     if (AntiXSS::isTokenSet("save")) {
         if (isset($_REQUEST["neu"]) && $_REQUEST["neu"]["datum"] != "" && $_REQUEST["neu"]["ba_nr"] > 0) {
             $result = Yii::app()->db->createCommand("SELECT MIN(id) minid FROM termine")->queryAll();
             $id = $result[0]["minid"];
             if ($id >= 0) {
                 $id = 0;
             }
             $id--;
             $termin = new Termin();
             $termin->id = $id;
             $termin->ba_nr = IntVal($_REQUEST["neu"]["ba_nr"]);
             $termin->typ = Termin::$TYP_BUERGERVERSAMMLUNG;
             $termin->sitzungsort = $_REQUEST["neu"]["ort"];
             $termin->termin = $_REQUEST["neu"]["datum"];
             $termin->datum_letzte_aenderung = new CDbExpression('NOW()');
             if (!$termin->save()) {
                 $this->msg_err = print_r($termin->getErrors(), true);
             }
         }
         if (isset($_REQUEST["termin"])) {
             foreach ($_REQUEST["termin"] as $id => $save) {
                 /** @var Termin $termin */
                 $termin = Termin::model()->findByPk($id);
                 $termin->sitzungsort = $save["ort"];
                 $termin->termin = $save["datum"];
                 $termin->save();
             }
         }
         $this->msg_ok = "Gespeichert";
     }
     $termine = Termin::model()->findAllByAttributes(["typ" => Termin::$TYP_BUERGERVERSAMMLUNG], ["order" => "termin DESC"]);
     $this->render("buergerInnenversammlungen", ["termine" => $termine]);
 }
 public function parse($termin_id)
 {
     $termin_id = IntVal($termin_id);
     if (SITE_CALL_MODE != "cron") {
         echo "- Termin {$termin_id}\n";
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_sitzungen_details.jsp?Id={$termin_id}");
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_sitzungen_dokumente.jsp?Id={$termin_id}");
     $html_to = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_sitzungen_tagesordnung.jsp?Id={$termin_id}");
     $daten = new Termin();
     $daten->typ = Termin::$TYP_AUTO;
     $daten->id = $termin_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->gremium_id = NULL;
     $daten->referat = "";
     $daten->referent = "";
     $daten->vorsitz = "";
     $daten->sitzungsstand = "";
     $dokumente = [];
     if (preg_match("/ba_gremien_details\\.jsp\\?Id=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->gremium_id = IntVal($matches[1]);
     }
     if ($daten->gremium_id) {
         /** @var Gremium $gr */
         $gr = Gremium::model()->findByPk($daten->gremium_id);
         if (!$gr) {
             echo "Lege Gremium an: " . $daten->gremium_id . "\n";
             $parser = new BAGremienParser();
             $parser->parse($daten->gremium_id);
         }
         $daten->ba_nr = $gr->ba_nr;
     }
     if (preg_match("/Termin:.*detail_div\">([^&<]+)[&<]/siU", $html_details, $matches)) {
         $termin = $matches[1];
         $MONATE = ["januar" => "01", "februar" => "02", "märz" => "03", "april" => "04", "mai" => "05", "juni" => "06", "juli" => "07", "august" => "08", "september" => "09", "oktober" => "10", "november" => "11", "dezember" => "12"];
         $x = explode(" ", trim($termin));
         $tag = IntVal($x[1]);
         if ($tag < 10) {
             $tag = "0" . IntVal($tag);
         }
         $jahr = IntVal($x[2]);
         $y = explode(".", $x[1]);
         $monat = $MONATE[mb_strtolower($y[1])];
         if ($monat < 10) {
             $monat = "0" . IntVal($monat);
         }
         $zeit = $x[3];
         $daten->termin = "{$jahr}-{$monat}-{$tag} {$zeit}:00";
     }
     if (preg_match("/Sitzungsort:.*detail_div\">([^<]*)[<]/siU", $html_details, $matches)) {
         $daten->sitzungsort = html_entity_decode($matches[1], ENT_COMPAT, "UTF-8");
     }
     if (preg_match("/Bezirksausschuss:.*link_bold_noimg\">([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->ba_nr = IntVal($matches[1]);
     }
     if (preg_match("/chste Sitzung:.*ba_sitzungen_details\\.jsp\\?Id=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->termin_next_id = $matches[1];
     }
     if (preg_match("/Letzte Sitzung:.*ba_sitzungen_details\\.jsp\\?Id=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->termin_prev_id = $matches[1];
     }
     if (preg_match("/Wahlperiode:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->wahlperiode = $matches[1];
     }
     if (preg_match("/Status:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->status = $matches[1];
     }
     if (trim($daten->wahlperiode) == "") {
         $daten->wahlperiode = "?";
     }
     preg_match_all("/<li><span class=\"iconcontainer\">.*title=\"([^\"]+)\"[^>]*href=\"(.*)\".*>(.*)<\\/a>/siU", $html_dokumente, $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         $dokumente[] = ["url" => $matches[2][$i], "name" => $matches[3][$i], "name_title" => $matches[1][$i]];
     }
     $aenderungen = "";
     /** @var Termin $alter_eintrag */
     $alter_eintrag = Termin::model()->findByPk($termin_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($alter_eintrag->termin != $daten->termin) {
             $aenderungen .= "Termin: " . $alter_eintrag->termin . " => " . $daten->termin . "\n";
         }
         if ($alter_eintrag->gremium_id != $daten->gremium_id) {
             $aenderungen .= "Gremium-ID: " . $alter_eintrag->gremium_id . " => " . $daten->gremium_id . "\n";
         }
         if ($alter_eintrag->sitzungsort != $daten->sitzungsort) {
             $aenderungen .= "Sitzungsort: " . $alter_eintrag->sitzungsort . " => " . $daten->sitzungsort . "\n";
         }
         if ($alter_eintrag->ba_nr != $daten->ba_nr) {
             $aenderungen .= "BA-Nr.: " . $alter_eintrag->ba_nr . " => " . $daten->ba_nr . "\n";
         }
         if ($alter_eintrag->termin_next_id != $daten->termin_next_id) {
             $aenderungen .= "Nächster Termin: " . $alter_eintrag->termin_next_id . " => " . $daten->termin_next_id . "\n";
         }
         if ($alter_eintrag->termin_prev_id != $daten->termin_prev_id) {
             $aenderungen .= "Voriger Termin: " . $alter_eintrag->termin_prev_id . " => " . $daten->termin_prev_id . "\n";
         }
         if ($alter_eintrag->wahlperiode != $daten->wahlperiode) {
             $aenderungen .= "Wahlperiode: " . $alter_eintrag->wahlperiode . " => " . $daten->wahlperiode . "\n";
         }
         if ($alter_eintrag->status != $daten->status) {
             $aenderungen .= "Status: " . $alter_eintrag->status . " => " . $daten->status . "\n";
         }
         if ($aenderungen != "") {
             $changed = true;
         }
     }
     if (!$alter_eintrag) {
         $daten->save();
     }
     $match_top = "<strong>(?<top>(([0-9\\.]+)|(&nbsp;)))<\\/strong>";
     $match_betreff = "<t[hd][^>]*>(?<betreff>.*)<\\/t[hd]>";
     $match_vorlage = "<t[hd][^>]*>(?<vorlage_holder>.*)<\\/t[hd]>";
     $match_entscheidung = "<td[^>]*>(?<entscheidung>.*)<\\/td>";
     preg_match_all("/<tr class=\"ergebnistab_tr\">.*{$match_top}.*{$match_betreff}.*{$match_vorlage}.*{$match_entscheidung}.*<\\/tr>/siU", $html_to, $matches);
     foreach ($matches["betreff"] as $i => $val) {
         $matches["betreff"][$i] = static::text_clean_spaces($matches["betreff"][$i]);
     }
     $matches["betreff"] = RISTools::makeArrValuesUnique($matches["betreff"]);
     /** @var Tagesordnungspunkt[] $bisherige_tops */
     $bisherige_tops = $alter_eintrag ? $alter_eintrag->tagesordnungspunkte : [];
     $aenderungen_tops = "";
     $abschnitt_nr = "";
     $verwendete_top_betreffs = [];
     for ($i = 0; $i < count($matches["top"]); $i++) {
         $betreff = $matches["betreff"][$i];
         if (mb_stripos($betreff, "<strong>") !== false) {
             $abschnitt_nr = trim($matches["top"][$i], " \t\n\r\v.");
             $betreff = str_replace(["<strong>", "</strong>"], ["", ""], $betreff);
             if ($abschnitt_nr == "&nbsp;") {
                 if (preg_match("/TOP (?<top>[0-9.]+)+: (?<betreff>.*)/siu", $betreff, $matches2)) {
                     $abschnitt_nr = $matches2["top"];
                     $betreff = $matches2["betreff"];
                 } else {
                     $abschnitt_nr = "0";
                 }
             }
             $top_ueberschrift = true;
             $top_nr = $abschnitt_nr;
         } else {
             $top_ueberschrift = false;
             $top_nr = $abschnitt_nr . "." . $matches["top"][$i];
         }
         $vorlage_holder = trim(str_replace("&nbsp;", " ", $matches["vorlage_holder"][$i]));
         preg_match_all("/risid%3D(?<risid>[0-9]+)%27/siU", $vorlage_holder, $matches2);
         $vorlage_id = isset($matches2["risid"][0]) ? $matches2["risid"][0] : null;
         preg_match_all("/ba_antraege_details\\.jsp\\?Id=(?<risid>[0-9]+)\"/siU", $vorlage_holder, $matches2);
         $baantrag_id = isset($matches2["risid"][0]) ? $matches2["risid"][0] : null;
         if ($vorlage_id) {
             $vorlage = Antrag::model()->findByPk($vorlage_id);
             if (!$vorlage) {
                 echo "Creating: {$vorlage_id}\n";
                 $p = new StadtratsvorlageParser();
                 $p->parse($vorlage_id);
             }
         }
         if ($baantrag_id) {
             $baantrag = Antrag::model()->findByPk($baantrag_id);
             if (!$baantrag) {
                 echo "Creating: {$baantrag_id}\n";
                 $p = new BAAntragParser();
                 $p->parse($baantrag_id);
             }
         }
         $tagesordnungspunkt = new Tagesordnungspunkt();
         if ($vorlage_id) {
             $tagesordnungspunkt->antrag_id = $vorlage_id;
         } elseif ($baantrag_id) {
             $tagesordnungspunkt->antrag_id = $baantrag_id;
         } else {
             $tagesordnungspunkt->antrag_id = null;
         }
         $entscheidung_original = trim(str_replace("&nbsp;", " ", $matches["entscheidung"][$i]));
         $entscheidung = static::text_clean_spaces(preg_replace("/<a[^>]*>[^<]*<\\/a>/siU", "", $entscheidung_original));
         $tagesordnungspunkt->datum_letzte_aenderung = new CDbExpression("NOW()");
         $tagesordnungspunkt->sitzungstermin_id = $termin_id;
         $tagesordnungspunkt->sitzungstermin_datum = substr($daten->termin, 0, 10);
         $tagesordnungspunkt->top_nr = $top_nr;
         $tagesordnungspunkt->top_ueberschrift = $top_ueberschrift ? 1 : 0;
         $tagesordnungspunkt->entscheidung = $entscheidung;
         $tagesordnungspunkt->top_betreff = $betreff;
         $tagesordnungspunkt->gremium_id = $daten->gremium_id;
         $tagesordnungspunkt->gremium_name = $daten->gremium->name;
         $tagesordnungspunkt->beschluss_text = "";
         /** @var Tagesordnungspunkt[] $alte_tops */
         if ($vorlage_id) {
             $alte_tops = Tagesordnungspunkt::model()->findAllByAttributes(["sitzungstermin_id" => $termin_id, "antrag_id" => $vorlage_id]);
         } elseif ($baantrag_id) {
             $alte_tops = Tagesordnungspunkt::model()->findAllByAttributes(["sitzungstermin_id" => $termin_id, "antrag_id" => $baantrag_id]);
         } else {
             $alte_tops = Tagesordnungspunkt::model()->findAllByAttributes(["sitzungstermin_id" => $termin_id, "top_betreff" => $betreff]);
         }
         $alter_top = $this->loescheDoppelteTOPs($alte_tops);
         $tagesordnungspunkt_aenderungen = "";
         if ($alter_top) {
             if ($alter_top->sitzungstermin_id != $tagesordnungspunkt->sitzungstermin_id) {
                 $tagesordnungspunkt_aenderungen .= "Sitzung geändert: " . $alter_top->sitzungstermin_id . " => " . $tagesordnungspunkt->sitzungstermin_id . "\n";
             }
             if ($alter_top->sitzungstermin_datum != $tagesordnungspunkt->sitzungstermin_datum) {
                 $tagesordnungspunkt_aenderungen .= "Sitzungstermin geändert: " . $alter_top->sitzungstermin_datum . " => " . $tagesordnungspunkt->sitzungstermin_datum . "\n";
             }
             if ($alter_top->top_nr != $tagesordnungspunkt->top_nr) {
                 $tagesordnungspunkt_aenderungen .= "Position geändert: " . $alter_top->top_nr . " => " . $tagesordnungspunkt->top_nr . "\n";
             }
             if ($alter_top->top_ueberschrift != $tagesordnungspunkt->top_ueberschrift) {
                 $tagesordnungspunkt_aenderungen .= "Bereich geändert: " . $alter_top->top_ueberschrift . " => " . $tagesordnungspunkt->top_ueberschrift . "\n";
             }
             if ($alter_top->top_betreff != $tagesordnungspunkt->top_betreff) {
                 $tagesordnungspunkt_aenderungen .= "Betreff geändert: " . $alter_top->top_betreff . " => " . $tagesordnungspunkt->top_betreff . "\n";
             }
             if ($alter_top->antrag_id != $tagesordnungspunkt->antrag_id) {
                 $tagesordnungspunkt_aenderungen .= "Antrag geändert: " . $alter_top->antrag_id . " => " . $tagesordnungspunkt->antrag_id . "\n";
             }
             if ($alter_top->gremium_id != $tagesordnungspunkt->gremium_id) {
                 $tagesordnungspunkt_aenderungen .= "Gremium geändert: " . $alter_top->gremium_id . " => " . $tagesordnungspunkt->gremium_id . "\n";
             }
             if ($alter_top->gremium_name != $tagesordnungspunkt->gremium_name) {
                 $tagesordnungspunkt_aenderungen .= "Gremium geändert: " . $alter_top->gremium_name . " => " . $tagesordnungspunkt->gremium_name . "\n";
             }
             if ($alter_top->entscheidung != $tagesordnungspunkt->entscheidung) {
                 $tagesordnungspunkt_aenderungen .= "Entscheidung: " . $alter_top->entscheidung . " => " . $tagesordnungspunkt->entscheidung . "\n";
             }
             if ($alter_top->beschluss_text != $tagesordnungspunkt->beschluss_text) {
                 $tagesordnungspunkt_aenderungen .= "Beschluss: " . $alter_top->beschluss_text . " => " . $tagesordnungspunkt->beschluss_text . "\n";
             }
             if ($tagesordnungspunkt_aenderungen != "") {
                 $aend = new RISAenderung();
                 $aend->ris_id = $alter_top->id;
                 $aend->ba_nr = NULL;
                 $aend->typ = RISAenderung::$TYP_BA_ERGEBNIS;
                 $aend->datum = new CDbExpression("NOW()");
                 $aend->aenderungen = $tagesordnungspunkt_aenderungen;
                 if (!$aend->save()) {
                     var_dump($aend->getErrors());
                 }
                 $alter_top->copyToHistory();
                 $tagesordnungspunkt->id = $alter_top->id;
                 $alter_top->setAttributes($tagesordnungspunkt->getAttributes(), false);
                 if (!$alter_top->save()) {
                     echo "StadtratAntrag 1\n";
                     var_dump($alter_eintrag->getErrors());
                     die("Fehler");
                 }
                 $tagesordnungspunkt = $alter_top;
                 $aenderungen_tops .= "TOP geändert: " . $tagesordnungspunkt->top_nr . ": " . $tagesordnungspunkt->top_betreff . "\n   " . str_replace("\n", "\n   ", $tagesordnungspunkt_aenderungen) . "\n";
             }
         } else {
             $aenderungen_tops .= "Neuer TOP: " . $top_nr . " - " . $betreff . "\n";
             $tagesordnungspunkt->save();
         }
         $verwendete_top_betreffs[] = $tagesordnungspunkt->top_betreff;
         /*
         if (!is_null($vorlage_id)) {
             $html_vorlage_ergebnis = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_ergebnisse.jsp?risid=$vorlage_id");
             preg_match_all("/ris_sitzung_to.jsp\?risid=" . $termin_id . ".*<\/td>.*<\/td>.*tdborder\">(?<beschluss>.*)<\/td>/siU", $html_vorlage_ergebnis, $matches3);
             $beschluss = static::text_clean_spaces($matches3["beschluss"][0]);
             if ($tagesordnungspunkt->beschluss_text != $beschluss) {
                 $aenderungen .= "Beschluss: " . $tagesordnungspunkt->beschluss_text . " => " . $beschluss . "\n";
                 $tagesordnungspunkt->beschluss_text = $beschluss;
             }
         }
         */
         preg_match("/<a title=\"(?<title>[^\"]*)\" [^>]*href=\"(?<url>[^ ]+)\"/siU", $entscheidung_original, $matches2);
         if (isset($matches2["url"]) && $matches2["url"] != "" && $matches2["url"] != "/RII/RII/DOK/TOP/") {
             $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_BA_BESCHLUSS, $tagesordnungspunkt, ["url" => $matches2["url"], "name" => $matches2["title"], "name_title" => ""]);
         }
     }
     foreach ($bisherige_tops as $top) {
         if (!in_array($top->top_betreff, $verwendete_top_betreffs)) {
             $aenderungen_tops .= "TOP entfernt: " . $top->top_nr . ": " . $top->top_betreff . "\n";
             foreach ($top->dokumente as $dok) {
                 $dok->tagesordnungspunkt_id = null;
                 $dok->save(false);
             }
             $top->delete();
         }
     }
     if ($aenderungen_tops != "") {
         $changed = true;
     }
     if ($changed) {
         if (!$alter_eintrag) {
             $aenderungen = "Neu angelegt\n";
         }
         $aenderungen .= $aenderungen_tops;
         echo "BA-Termin {$termin_id}: Verändert: " . $aenderungen . "\n";
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes());
             if (!$alter_eintrag->save()) {
                 if (SITE_CALL_MODE != "cron") {
                     echo "BA-Termin 1\n";
                 }
                 var_dump($alter_eintrag->getErrors());
                 die("Fehler");
             }
             $daten = $alter_eintrag;
         } else {
             if (!$daten->save()) {
                 if (SITE_CALL_MODE != "cron") {
                     echo "BA-Termin 2\n";
                 }
                 var_dump($daten->getErrors());
                 die("Fehler");
             }
         }
     }
     foreach ($dokumente as $dok) {
         $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_BA_TERMIN, $daten, $dok);
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = $daten->ba_nr;
         $aend->typ = RISAenderung::$TYP_BA_TERMIN;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Termin $termin */
         $termin = Termin::model()->findByPk($termin_id);
         $termin->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $termin->save();
     }
 }
 /**
  * Performs a calendar-query on the contents of this calendar.
  *
  * The calendar-query is defined in RFC4791 : CalDAV. Using the
  * calendar-query it is possible for a client to request a specific set of
  * object, based on contents of iCalendar properties, date-ranges and
  * iCalendar component types (VTODO, VEVENT).
  *
  * This method should just return a list of (relative) urls that match this
  * query.
  *
  * The list of filters are specified as an array. The exact array is
  * documented by Sabre\CalDAV\CalendarQueryParser.
  *
  * Note that it is extremely likely that getCalendarObject for every path
  * returned from this method will be called almost immediately after. You
  * may want to anticipate this to speed up these requests.
  *
  * This method provides a default implementation, which parses *all* the
  * iCalendar objects in the specified calendar.
  *
  * This default may well be good enough for personal use, and calendars
  * that aren't very large. But if you anticipate high usage, big calendars
  * or high loads, you are strongly adviced to optimize certain paths.
  *
  * The best way to do so is override this method and to optimize
  * specifically for 'common filters'.
  *
  * Requests that are extremely common are:
  *   * requests for just VEVENTS
  *   * requests for just VTODO
  *   * requests with a time-range-filter on either VEVENT or VTODO.
  *
  * ..and combinations of these requests. It may not be worth it to try to
  * handle every possible situation and just rely on the (relatively
  * easy to use) CalendarQueryValidator to handle the rest.
  *
  * Note that especially time-range-filters may be difficult to parse. A
  * time-range filter specified on a VEVENT must for instance also handle
  * recurrence rules correctly.
  * A good example of how to interprete all these filters can also simply
  * be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct
  * as possible, so it gives you a good idea on what type of stuff you need
  * to think of.
  *
  * @param mixed $calendarId
  * @param array $filters
  * @return array
  * @throws DAV\Exception\NotFound
  */
 function calendarQuery($calendarId, array $filters)
 {
     /** @var Termin $termin */
     $termin = Termin::model()->findByPk($this->termin_id);
     if (!$termin) {
         throw new \Sabre\DAV\Exception\NotFound('Calendar not found');
     }
     $alle_termine = $termin->alleTermineDerReihe();
     $return = [];
     foreach ($alle_termine as $termin) {
         // @TODO Filtern
         $return[] = $termin->id;
     }
     return $return;
 }
        ?>
                    </ul>
                </li> <?php 
    } else {
        echo "<li>" . CHtml::link($dokument->getName(), $dokument->getLinkZumDokument()) . "</li>\n";
    }
}
if ($dokument != null) {
    if ($dokument->antrag_id) {
        dokumentenliste(Antrag::model()->findByPk($dokument->antrag_id), "Antragsseite", $dokument, true);
    } else {
        if ($dokument->tagesordnungspunkt_id) {
            dokumentenliste(Tagesordnungspunkt::model()->findByPk($dokument->tagesordnungspunkt_id), "Ergebnisseite", $dokument, true);
        } else {
            if ($dokument->termin_id) {
                dokumentenliste(Termin::model()->findByPk($dokument->termin_id), "Terminseite", $dokument, true);
            } else {
                if ($dokument->vorgang_id) {
                    dokumentenliste(Vorgang::model()->findByPk($dokument->vorgang_id), "Vorgangsseite", $dokument, false);
                } else {
                    echo "<li class=\"active\">" . CHtml::encode($dokument->getName()) . "</li>";
                }
            }
        }
    }
}
?>
    </ul>
    <div class="pdf_download_holder"><a href="<?php 
echo CHtml::encode($dokument->getLink());
?>
 public function parse($termin_id)
 {
     $termin_id = IntVal($termin_id);
     if (SITE_CALL_MODE != "cron") {
         echo "- Termin {$termin_id}\n";
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_sitzung_detail.jsp?risid={$termin_id}");
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_sitzung_dokumente.jsp?risid={$termin_id}");
     $html_to = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_sitzung_to.jsp?risid={$termin_id}");
     $html_to_geheim = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_sitzung_nto.jsp?risid={$termin_id}");
     $daten = new Termin();
     $daten->typ = Termin::$TYP_AUTO;
     $daten->id = $termin_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->gremium_id = NULL;
     $daten->ba_nr = NULL;
     $daten->sitzungsstand = "";
     $daten->sitzungsort = "";
     $daten->referat = "";
     $daten->referent = "";
     $daten->vorsitz = "";
     $daten->wahlperiode = "";
     $daten->status = "";
     if (preg_match("/ris_gremien_detail\\.jsp\\?risid=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->gremium_id = IntVal($matches[1]);
     }
     if ($daten->gremium_id) {
         $gr = Gremium::model()->findByPk($daten->gremium_id);
         if (!$gr) {
             echo "Lege Gremium an: " . $daten->gremium_id . "\n";
             Gremium::parse_stadtrat_gremien($daten->gremium_id);
         }
     }
     $geloescht = false;
     $sitzungsort_gefunden = false;
     if (preg_match("/Sitzungsort:.*detail_div\">([^<]*)[<]/siU", $html_details, $matches)) {
         $sitzungsort_gefunden = true;
         $daten->sitzungsort = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Sitzungsstand:.*detail_div\">([^<]*)[<]/siU", $html_details, $matches)) {
         $sitzungsort_gefunden = true;
         $daten->sitzungsstand = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/chste Sitzung:.*ris_sitzung_detail\\.jsp\\?risid=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->termin_next_id = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Letzte Sitzung:.*ris_sitzung_detail\\.jsp\\?risid=([0-9]+)[\"'& ]/siU", $html_details, $matches)) {
         $daten->termin_prev_id = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Wahlperiode:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->wahlperiode = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Status:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->status = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/diges Referat:.*detail_div_left_long\">(<a[^>]+>)?([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->referat = trim(str_replace("&nbsp;", "", $matches[2]));
     }
     if (preg_match("/Referent\\/in:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->referent = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Vorsitz:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) {
         $daten->vorsitz = trim(str_replace("&nbsp;", "", $matches[1]));
     }
     if (preg_match("/Termin:.*detail_div\">([^&<]+)[&<]/siU", $html_details, $matches)) {
         $termin = $matches[1];
         $MONATE = ["januar" => "01", "februar" => "02", "märz" => "03", "april" => "04", "mai" => "05", "juni" => "06", "juli" => "07", "august" => "08", "september" => "09", "oktober" => "10", "november" => "11", "dezember" => "12"];
         $x = explode(" ", trim($termin));
         if (isset($x[1])) {
             $tag = IntVal($x[1]);
             if ($tag < 10) {
                 $tag = "0" . IntVal($tag);
             }
             $jahr = IntVal($x[2]);
             $y = explode(".", $x[1]);
             $monat = $MONATE[mb_strtolower($y[1])];
             if ($monat < 10) {
                 $monat = "0" . IntVal($monat);
             }
             $zeit = $x[3];
             $daten->termin = "{$jahr}-{$monat}-{$tag} {$zeit}:00";
         } else {
             if ($sitzungsort_gefunden && $daten->gremium === null && $daten->sitzungsort == "" && $daten->status == "") {
                 $geloescht = true;
             } else {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratstermin: Unbekanntes Datum", "ID: {$termin_id}\n" . print_r($matches, true), null, "system");
                 die;
             }
         }
     }
     $dokumente = [];
     preg_match_all("/<li><span class=\"iconcontainer\">.*href=\"(.*)\".*>(.*)<\\/a>/siU", $html_dokumente, $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         $dokumente[] = ["url" => $matches[1][$i], "name" => $matches[2][$i], "name_title" => ""];
     }
     $aenderungen = "";
     /** @var Termin $alter_eintrag */
     $alter_eintrag = Termin::model()->findByPk($termin_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($geloescht) {
             $aenderungen = "gelöscht";
             $changed = true;
         } else {
             if ($alter_eintrag->termin != $daten->termin) {
                 $aenderungen .= "Termin: " . $alter_eintrag->termin . " => " . $daten->termin . "\n";
             }
             if ($alter_eintrag->gremium_id != $daten->gremium_id) {
                 $aenderungen .= "Gremium-ID: " . $alter_eintrag->gremium_id . " => " . $daten->gremium_id . "\n";
             }
             if ($alter_eintrag->sitzungsort != $daten->sitzungsort) {
                 $aenderungen .= "Sitzungsort: " . $alter_eintrag->sitzungsort . " => " . $daten->sitzungsort . "\n";
             }
             if ($alter_eintrag->termin_next_id != $daten->termin_next_id) {
                 $aenderungen .= "Nächster Termin: " . $alter_eintrag->termin_next_id . " => " . $daten->termin_next_id . "\n";
             }
             if ($alter_eintrag->termin_prev_id != $daten->termin_prev_id) {
                 $aenderungen .= "Voriger Termin: " . $alter_eintrag->termin_prev_id . " => " . $daten->termin_prev_id . "\n";
             }
             if ($alter_eintrag->wahlperiode != $daten->wahlperiode) {
                 $aenderungen .= "Wahlperiode: " . $alter_eintrag->wahlperiode . " => " . $daten->wahlperiode . "\n";
             }
             if ($alter_eintrag->referat != $daten->referat) {
                 $aenderungen .= "Referat: " . $alter_eintrag->referat . " => " . $daten->referat . "\n";
             }
             if ($alter_eintrag->referent != $daten->referent) {
                 $aenderungen .= "Referent: " . $alter_eintrag->referent . " => " . $daten->referent . "\n";
             }
             if ($alter_eintrag->vorsitz != $daten->vorsitz) {
                 $aenderungen .= "Vorsitz: " . $alter_eintrag->vorsitz . " => " . $daten->vorsitz . "\n";
             }
             if ($alter_eintrag->sitzungsstand != $daten->sitzungsstand) {
                 $aenderungen .= "Sitzungsstand: " . $alter_eintrag->sitzungsstand . " => " . $daten->sitzungsstand . "\n";
             }
             if ($aenderungen != "") {
                 $changed = true;
             }
         }
     }
     if (!$alter_eintrag) {
         $daten->save();
     }
     $match_top = "tdborder\">(?<top>.*)<\\/t[hd]>";
     $match_betreff = "tdborder\">(?<betreff>.*)<\\/t[hd]>";
     $match_vorlage = "<t(?<ueberschrift>[hd])[^>]*>(?<vorlage_holder>.*)<\\/t[hd]>";
     $match_referentIn = "<t[hd][^>]*>(?<referentIn>.*)<\\/t[hd]>";
     $match_entscheidung = "<t[hd][^>]*>(?<entscheidung>.*)<\\/t[hd]>";
     preg_match_all("/<tr class=\"ergebnistab_tr\">.*{$match_top}.*{$match_betreff}.*{$match_vorlage}.*{$match_referentIn}.*{$match_entscheidung}.*<\\/tr>/siU", $html_to, $matches);
     foreach ($matches["betreff"] as $i => $val) {
         $matches["betreff"][$i] = static::text_clean_spaces($matches["betreff"][$i]);
     }
     $matches["betreff"] = RISTools::makeArrValuesUnique($matches["betreff"]);
     /** @var Tagesordnungspunkt[] $bisherige_tops */
     $bisherige_tops = $alter_eintrag ? $alter_eintrag->tagesordnungspunkte : [];
     $aenderungen_tops = "";
     //$verwendete_top_betreffs = array();
     $verwendete_top_ids = [];
     $abschnitt_nr = 0;
     for ($i = 0; $i < count($matches[0]); $i++) {
         $top = trim(str_replace(["&nbsp;", "<strong>", "</strong>"], [" ", "", ""], $matches["top"][$i]));
         $betreff = $matches["betreff"][$i];
         if ($matches["ueberschrift"][$i] == "h") {
             $abschnitt_nr = $abschnitt_nr + 1;
             $top_ueberschrift = true;
             $top_nr = $abschnitt_nr;
             $betreff = str_replace(["<strong>", "</strong>"], ["", ""], $betreff);
         } else {
             if ($abschnitt_nr == 0) {
                 $abschnitt_nr = 1;
             }
             $top_ueberschrift = false;
             $top_nr = $abschnitt_nr . "." . $top;
         }
         $vorlage_holder = trim(str_replace("&nbsp;", " ", $matches["vorlage_holder"][$i]));
         preg_match_all("/risid=(?<risid>[0-9]+)>/siU", $vorlage_holder, $matches2);
         $vorlage_id = isset($matches2["risid"][0]) ? $matches2["risid"][0] : null;
         if ($vorlage_id) {
             $vorlage = Antrag::model()->findByPk($vorlage_id);
             if (!$vorlage) {
                 echo "Creating: {$vorlage_id}\n";
                 $p = new StadtratsvorlageParser();
                 $p->parse($vorlage_id);
             }
         }
         $entscheidung_original = trim(str_replace("&nbsp;", " ", $matches["entscheidung"][$i]));
         $entscheidung = trim(preg_replace("/<a[^>]*>[^<]*<\\/a>/siU", "", $entscheidung_original));
         $top = new Tagesordnungspunkt();
         $top->datum_letzte_aenderung = new CDbExpression("NOW()");
         $top->sitzungstermin_id = $termin_id;
         $top->sitzungstermin_datum = substr($daten->termin, 0, 10);
         $top->top_nr = $top_nr;
         $top->antrag_id = $vorlage_id;
         $top->top_ueberschrift = $top_ueberschrift ? 1 : 0;
         $top->entscheidung = $entscheidung;
         $top->top_betreff = $betreff;
         $top->gremium_id = $daten->gremium_id;
         $top->gremium_name = $daten->gremium->name;
         $top->beschluss_text = "";
         if (!is_null($vorlage_id)) {
             $html_vorlage_ergebnis = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_ergebnisse.jsp?risid={$vorlage_id}");
             preg_match_all("/ris_sitzung_to.jsp\\?risid=" . $termin_id . ".*<\\/td>.*<\\/td>.*tdborder\">(?<beschluss>.*)<\\/td>/siU", $html_vorlage_ergebnis, $matches3);
             if (isset($matches3["beschluss"]) && count($matches3["beschluss"]) > 0) {
                 $beschluss = static::text_clean_spaces($matches3["beschluss"][0]);
             } else {
                 RISTools::send_email(Yii::app()->params["adminEmail"], "StadtratTermin Kein Beschluss", "Termin: {$termin_id}\n" . "http://www.ris-muenchen.de/RII/RII/ris_vorlagen_ergebnisse.jsp?risid={$vorlage_id}\n" . $html_vorlage_ergebnis);
                 $beschluss = "";
             }
             $top->beschluss_text = $beschluss;
         }
         /** @var Tagesordnungspunkt $alter_top */
         if (is_null($vorlage_id)) {
             $alter_top = Tagesordnungspunkt::model()->findByAttributes(["sitzungstermin_id" => $termin_id, "top_betreff" => $betreff]);
         } else {
             $alter_top = Tagesordnungspunkt::model()->findByAttributes(["sitzungstermin_id" => $termin_id, "antrag_id" => $vorlage_id]);
         }
         $top_aenderungen = "";
         if ($alter_top) {
             if ($alter_top->sitzungstermin_id != $top->sitzungstermin_id) {
                 $top_aenderungen .= "Sitzung geändert: " . $alter_top->sitzungstermin_id . " => " . $top->sitzungstermin_id . "\n";
             }
             if ($alter_top->sitzungstermin_datum != $top->sitzungstermin_datum) {
                 $top_aenderungen .= "Sitzungstermin geändert: " . $alter_top->sitzungstermin_datum . " => " . $top->sitzungstermin_datum . "\n";
             }
             if ($alter_top->top_nr != $top->top_nr) {
                 $top_aenderungen .= "TOP geändert: " . $alter_top->top_nr . " => " . $top->top_nr . "\n";
             }
             if ($alter_top->top_ueberschrift != $top->top_ueberschrift) {
                 $top_aenderungen .= "Bereich geändert: " . $alter_top->top_ueberschrift . " => " . $top->top_ueberschrift . "\n";
             }
             if ($alter_top->top_betreff != $top->top_betreff) {
                 $top_aenderungen .= "Betreff geändert: " . $alter_top->top_betreff . " => " . $top->top_betreff . "\n";
             }
             if ($alter_top->antrag_id != $top->antrag_id) {
                 $top_aenderungen .= "Antrag geändert: " . $alter_top->antrag_id . " => " . $top->antrag_id . "\n";
             }
             if ($alter_top->gremium_id != $top->gremium_id) {
                 $top_aenderungen .= "Gremium geändert: " . $alter_top->gremium_id . " => " . $top->gremium_id . "\n";
             }
             if ($alter_top->gremium_name != $top->gremium_name) {
                 $top_aenderungen .= "Gremium geändert: " . $alter_top->gremium_name . " => " . $top->gremium_name . "\n";
             }
             if ($alter_top->entscheidung != $top->entscheidung) {
                 $top_aenderungen .= "Entscheidung: " . $alter_top->entscheidung . " => " . $top->entscheidung . "\n";
             }
             if ($alter_top->beschluss_text != $top->beschluss_text) {
                 $top_aenderungen .= "Beschluss: " . $alter_top->beschluss_text . " => " . $top->beschluss_text . "\n";
             }
             if ($top_aenderungen != "") {
                 $aend = new RISAenderung();
                 $aend->ris_id = $alter_top->id;
                 $aend->ba_nr = NULL;
                 $aend->typ = RISAenderung::$TYP_STADTRAT_ERGEBNIS;
                 $aend->datum = new CDbExpression("NOW()");
                 $aend->aenderungen = $top_aenderungen;
                 $aend->save();
                 $aenderungen_tops .= "TOP geändert: " . $top->top_betreff . "\n   " . str_replace("\n", "\n   ", $top_aenderungen) . "\n";
                 $alter_top->copyToHistory();
                 $top->id = $alter_top->id;
                 $alter_top->setAttributes($top->getAttributes(), false);
                 if (!$alter_top->save()) {
                     echo "StadtratAntrag 1\n";
                     var_dump($alter_eintrag->getErrors());
                     die("Fehler");
                 }
             }
             $top = $alter_top;
         } else {
             $aenderungen .= "Neuer TOP: " . $top_nr . " - " . $betreff . "\n";
             $top->save();
         }
         //$verwendete_top_betreffs[] = $top->top_nr . "-" . $top->top_betreff;
         $verwendete_top_ids[] = $top->id;
         preg_match_all("/<a href=(?<url>[^ ]+) title=\"(?<title>[^\"]*)\"/siU", $entscheidung_original, $matches2);
         if (isset($matches2["url"]) && count($matches2["url"]) > 0) {
             $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_STADTRAT_BESCHLUSS, $top, ["url" => $matches2["url"][0], "name" => $matches2["title"][0], "name_title" => ""]);
             /** @var Dokument $dok */
             $dok = Dokument::model()->findByAttributes(["tagesordnungspunkt_id" => $top->id, "url" => $matches2["url"][0], "name" => $matches2["title"][0]]);
             if ($dok && $dok->tagesordnungspunkt_id != $top->id) {
                 echo "Korrgiere ID\n";
                 $dok->tagesordnungspunkt_id = $top->id;
                 $dok->save(false);
             }
         }
     }
     preg_match_all("/<tr class=\"ergebnistab_tr\">.*<strong>(?<top>[0-9]+)\\..*tdborder\">(?<betreff>.*)<\\/td>.*<span[^>]+>(?<vorlage_id>.*)<\\/span>.*valign=\"top\">(?<referent>.*)<\\/td>/siU", $html_to_geheim, $matches);
     foreach ($matches["betreff"] as $i => $val) {
         $matches["betreff"][$i] = static::text_clean_spaces($matches["betreff"][$i]);
     }
     $matches["betreff"] = RISTools::makeArrValuesUnique($matches["betreff"]);
     for ($i = 0; $i < count($matches[0]); $i++) {
         $betreff = $matches["betreff"][$i];
         $referent = static::text_clean_spaces($matches["referent"][$i]);
         /** @var Tagesordnungspunkt $top */
         $krits = ["sitzungstermin_id" => $termin_id, "status" => "geheim", "top_betreff" => $betreff];
         $top = Tagesordnungspunkt::model()->findByAttributes($krits);
         if (is_null($top)) {
             $top = new Tagesordnungspunkt();
             $aenderungen .= "Neuer geheimer Tagesordnungspunkt: " . $betreff . "\n";
         }
         $top->sitzungstermin_id = $termin_id;
         $top->sitzungstermin_datum = $daten->termin;
         $top->datum_letzte_aenderung = new CDbExpression("NOW()");
         $top->antrag_id = null;
         $top->status = "geheim";
         $top->beschluss_text = $matches["vorlage_id"][$i];
         $top->top_nr = $matches["top"][$i];
         $top->top_betreff = $betreff;
         $top->entscheidung = $referent;
         $top->gremium_id = $daten->gremium_id;
         $top->gremium_name = $daten->gremium->name;
         $top->save();
         //$verwendete_top_betreffs[] = "geheim-" . $top->top_nr . "-" . $top->top_betreff;
         $verwendete_top_ids[] = $top->id;
     }
     foreach ($bisherige_tops as $top) {
         //$top_key = ($top->status == "geheim" ? "geheim-" : "") . $top->top_nr . "-" . $top->top_betreff;
         if (!in_array($top->id, $verwendete_top_ids)) {
             $aenderungen_tops .= "TOP entfernt: " . $top->top_nr . ":" . $top->top_betreff . "\n";
             try {
                 $top->delete();
             } catch (CDbException $e) {
                 $str = "Vermutlich verwaiste Dokumente (war zuvor: \"" . $top->getName() . "\" in " . $daten->getLink() . ":\n";
                 /** @var Dokument[] $doks */
                 $doks = Dokument::model()->findAllByAttributes(["tagesordnungspunkt_id" => $top->id]);
                 foreach ($doks as $dok) {
                     $dok->tagesordnungspunkt_id = null;
                     $dok->save(false);
                     $str .= $dok->getOriginalLink() . "\n";
                 }
                 RISTools::send_email(Yii::app()->params["adminEmail"], "StadtratTermin Verwaist", $str, null, "system");
                 $top->delete();
             }
         }
     }
     if ($aenderungen_tops != "") {
         $changed = true;
     }
     if ($changed) {
         if (!$alter_eintrag) {
             $aenderungen = "Neu angelegt\n";
         }
         $aenderungen .= $aenderungen_tops;
         echo "StR-Termin {$termin_id}: Verändert: " . $aenderungen . "\n";
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes());
             if (!$alter_eintrag->save(false)) {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratstermin: Nicht gespeichert", "StadtratTerminParser 1\n" . print_r($alter_eintrag->getErrors(), true), null, "system");
                 die("Fehler");
             }
             $daten = $alter_eintrag;
             if ($geloescht) {
                 echo "Lösche";
                 if (!$daten->delete()) {
                     RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratstermin: Nicht gelöscht", "StadtratTerminParser 2\n" . print_r($daten->getErrors(), true), null, "system");
                     die("Fehler");
                 }
                 $aend = new RISAenderung();
                 $aend->ris_id = $daten->id;
                 $aend->ba_nr = NULL;
                 $aend->typ = RISAenderung::$TYP_STADTRAT_TERMIN;
                 $aend->datum = new CDbExpression("NOW()");
                 $aend->aenderungen = $aenderungen;
                 $aend->save();
                 return;
             }
         } else {
             if (!$daten->save()) {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratstermin: Nicht gespeichert", "StadtratTerminParser 3\n" . print_r($daten->getErrors(), true), null, "system");
                 die("Fehler");
             }
         }
     }
     foreach ($dokumente as $dok) {
         /** @var array $dok */
         $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_STADTRAT_TERMIN, $daten, $dok);
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = NULL;
         $aend->typ = RISAenderung::$TYP_STADTRAT_TERMIN;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Termin $termin */
         $termin = Termin::model()->findByPk($termin_id);
         $termin->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $termin->save();
     }
 }
 /**
  * @return IRISItem|null
  */
 public function getRISItem()
 {
     switch ($this->typ) {
         case RISAenderung::$TYP_STADTRAT_VORLAGE:
         case RISAenderung::$TYP_STADTRAT_ANTRAG:
         case RISAenderung::$TYP_BA_ANTRAG:
         case RISAenderung::$TYP_BA_INITIATIVE:
             return Antrag::model()->findByPk($this->ris_id);
             break;
         case RISAenderung::$TYP_BA_GREMIUM:
         case RISAenderung::$TYP_STADTRAT_GREMIUM:
             return Gremium::model()->findByPk($this->ris_id);
             break;
         case RISAenderung::$TYP_STADTRAT_TERMIN:
         case RISAenderung::$TYP_BA_TERMIN:
             return Termin::model()->findByPk($this->ris_id);
             break;
         case RISAenderung::$TYP_BA_MITGLIED:
         case RISAenderung::$TYP_STADTRAETIN:
             return StadtraetIn::model()->findByPk($this->ris_id);
             break;
         case RISAenderung::$TYP_RATHAUSUMSCHAU:
             return null;
             // @TODO
             break;
         case RISAenderung::$TYP_STADTRAT_FRAKTION:
             return null;
             // @TODO
             break;
         default:
             return null;
     }
 }