/**
 * @param IRISItemHasDocuments $uebergruppe
 * @param string $name
 * @param Dokument $dokument
 * @param string $link
 */
function dokumentenliste($uebergruppe, $name, $dokument, $link)
{
    if ($link && $uebergruppe) {
        echo "<li>" . CHtml::link($name, $uebergruppe->getLink()) . "<br></li>";
    } else {
        echo "<li class=\"active\">" . CHtml::encode($name) . "<br></li>";
    }
    if ($uebergruppe && count($uebergruppe->getDokumente()) > 1) {
        ?>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?php 
        echo CHtml::encode($dokument->getName());
        ?>
<span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <?php 
        foreach ($uebergruppe->getDokumente() as $dok) {
            echo "<li>" . CHtml::link($dok->getName(), $dok->getLinkZumDokument()) . "</li>\n";
        }
        ?>
                    </ul>
                </li> <?php 
    } else {
        echo "<li>" . CHtml::link($dokument->getName(), $dokument->getLinkZumDokument()) . "</li>\n";
    }
}
 public function run($args)
 {
     if (!isset($args[0])) {
         die("./yiic reindexsolr_documents [id]|stadtrat_beschluss|ba_beschluss|alle [offset]\n");
     }
     if ($args[0] > 0) {
         $data = [$args[0]];
     } elseif ($args[0] == "alle") {
         $sql = Yii::app()->db->createCommand();
         $sql->select("id")->from("dokumente")->where("id >= 0")->order("id");
         $data = $sql->queryColumn(["id"]);
     } elseif (isset(Dokument::$TYPEN_ALLE[$args[0]])) {
         $sql = Yii::app()->db->createCommand();
         $sql->select("id")->from("dokumente")->where("typ = '" . addslashes($args[0]) . "'")->order("id");
         $data = $sql->queryColumn(["id"]);
     } else {
         die("./yiic reindexsolr_documents [id]|stadtrat_beschluss|ba_beschluss|rathausumschau|alle\n");
     }
     $offset = isset($args[1]) && $args[1] > 0 ? IntVal($args[1]) : 0;
     $anz = count($data);
     for ($i = $offset; $i < $anz; $i++) {
         $dok_id = $data[$i];
         echo "{$i} / {$anz} => {$dok_id}\n";
         /** @var Dokument $dokument */
         $dokument = Dokument::model()->findByPk($dok_id);
         $dokument->solrIndex();
     }
 }
 /**
  * @param \Solarium\QueryType\Select\Result\Result $ergebnisse
  * @return array();
  */
 public static function ergebnisse2FeedData($ergebnisse)
 {
     $data = array();
     $dokumente = $ergebnisse->getDocuments();
     $highlighting = $ergebnisse->getHighlighting();
     $purifier = new CHtmlPurifier();
     $purifier->options = array('URI.AllowedSchemes' => array('http' => true, 'https' => true));
     foreach ($dokumente as $dokument) {
         $model = Dokument::getDocumentBySolrId($dokument->id);
         $risitem = $model->getRISItem();
         if (!$risitem) {
             continue;
         }
         $link = $risitem->getLink();
         $highlightedDoc = $highlighting->getResult($dokument->id);
         $item = array("title" => $model->name . " (zu " . $risitem->getTypName() . " \"" . $risitem->getName() . "\"", "link" => $link, "content" => "", "dateCreated" => RISTools::date_iso2timestamp(str_replace("T", " ", str_replace("Z", "", $dokument->sort_datum))), "aenderung_guid" => $link);
         if ($highlightedDoc && count($highlightedDoc) > 0) {
             foreach ($highlightedDoc as $highlight) {
                 $item["content"] .= $purifier->purify(implode(' (...) ', $highlight)) . '<br/>';
             }
         }
         $data[] = $item;
     }
     return $data;
 }
 public function run($args)
 {
     define("VERYFAST", true);
     if (count($args) == 0) {
         die("./yii recalc_documents [Dokument-ID|alle]\n");
     }
     if ($args[0] == "alle") {
         $sql = Yii::app()->db->createCommand();
         $sql->select("id")->from("dokumente")->where("id >= 579866")->order("id");
         $data = $sql->queryColumn(["id"]);
     } else {
         $data = [IntVal($args[0])];
     }
     $anz = count($data);
     foreach ($data as $nr => $dok_id) {
         echo "{$nr} / {$anz} => {$dok_id}\n";
         /** @var Dokument $dokument */
         $dokument = Dokument::model()->findByPk($dok_id);
         if (!$dokument) {
             continue;
         }
         $dokument->download_if_necessary();
         $dokument->geo_extract();
         $absolute_filename = $dokument->getLocalPath();
         $metadata = RISPDF2Text::document_pdf_metadata($absolute_filename);
         $dokument->seiten_anzahl = $metadata["seiten"];
         $dokument->datum_dokument = $metadata["datum"];
         $dokument->save();
         echo $dokument->id . " => " . $dokument->seiten_anzahl . " / " . $dokument->datum_dokument . "\n";
     }
 }
 public function parse($id)
 {
     /** @var Rathausumschau $ru */
     $ru = Rathausumschau::model()->findByPk($id);
     if (count($ru->dokumente) > 0 && $ru->dokumente[0]->text_pdf != "") {
         return;
     }
     if (count($ru->dokumente) > 0) {
         if ($ru->dokumente[0]->text_pdf != "") {
             return;
         }
         $dokument = $ru->dokumente[0];
     } else {
         $result = Yii::app()->db->createCommand("SELECT MIN(id) minid FROM dokumente")->queryAll();
         $id = $result[0]["minid"];
         if ($id >= 0) {
             $id = 0;
         }
         $id--;
         $dokument = new Dokument();
         $dokument->id = $id;
         $dokument->typ = Dokument::$TYP_RATHAUSUMSCHAU;
         $dokument->rathausumschau_id = $ru->id;
     }
     $dokument->url = $ru->url;
     $dokument->datum = $ru->datum;
     $dokument->datum_dokument = $ru->datum;
     $dokument->name = "Rathausumschau " . $ru->nr . "/" . substr($ru->datum, 0, 4);
     $dokument->text_pdf = "";
     if (!$dokument->save()) {
         var_dump($dokument->getErrors());
         die;
     }
     $dokument->reDownloadIndex();
     echo "Load: " . $ru->url . "\n";
 }
 private function importFile($filename)
 {
     echo $filename . "\n";
     $txt = file_get_contents(OMNIPAGE_DST_DIR . $filename);
     //$txt = iconv("Windows-1252", "UTF-8//TRANSLIT", $txt);
     $txt = iconv('UTF-16LE', "UTF-8//TRANSLIT", $txt);
     /*
     $repl = array(
         chr(194) . chr(149) => " ",
         chr(194) . chr(151) => " ",
     
         chr(194) . chr(148) => "„",
         chr(194) . chr(150) => "„",
         chr(194) . chr(132) => "„",
         chr(194) . chr(130) => "„",
     
         chr(194) . chr(147) => "“",
     );
     //$txt = str_replace(array_keys($repl), array_values($repl), $txt);
     echo $txt;
     if (strpos($txt, "Tagessatz in ") !== false) {
         $x = explode("Tagessatz in ", $txt);
         echo ord($x[1][0]) . " - " . ord($x[1][1]) . " - " . ord($x[1][2]);
     }
     */
     /** @var Dokument $dokument */
     $dokument = Dokument::model()->findByPk(IntVal($filename));
     if (!$dokument) {
         rename(OMNIPAGE_DST_DIR . $filename, OMNIPAGE_IMPORTED_DIR . $filename);
         if (file_exists(OMNIPAGE_PDF_DIR . IntVal($filename) . ".pdf")) {
             unlink(OMNIPAGE_PDF_DIR . IntVal($filename) . ".pdf");
         }
         return;
     }
     $dokument->text_ocr_raw = $txt;
     $dokument->text_ocr_corrected = $txt;
     $dokument->text_ocr_garbage_seiten = NULL;
     $dokument->ocr_von = Dokument::$OCR_VON_OMNIPAGE;
     $dokument->save();
     $dokument->geo_extract();
     $dokument->solrIndex();
     rename(OMNIPAGE_DST_DIR . $filename, OMNIPAGE_IMPORTED_DIR . $filename);
     if (file_exists(OMNIPAGE_PDF_DIR . IntVal($filename) . ".pdf")) {
         unlink(OMNIPAGE_PDF_DIR . IntVal($filename) . ".pdf");
     }
 }
 public function run($args)
 {
     if (!isset($args[0]) || $args[0] <= 1) {
         die("./yiic reindex_document [dokument-ID]\n");
     }
     $sql = Yii::app()->db->createCommand();
     $sql->select("id")->from("dokumente")->where("id = " . IntVal($args[0]));
     $data = $sql->queryColumn(["id"]);
     $anz = count($data);
     foreach ($data as $nr => $dok_id) {
         echo "{$nr} / {$anz} => {$dok_id}\n";
         /** @var Dokument $dokument */
         $dokument = Dokument::model()->findByPk($dok_id);
         if (!$dokument) {
             continue;
         }
         //$dokument->reDownloadIndex();
         $dokument->geo_extract();
         $dokument->solrIndex();
     }
 }
 public function checkAndDeleteDocument($doc_id)
 {
     /** @var Dokument $dokument */
     $dokument = Dokument::model()->disableDefaultScope()->findByPk($doc_id);
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $dokument->getLink());
     curl_setopt($ch, CURLOPT_HEADER, 1);
     curl_setopt($ch, CURLOPT_NOBODY, 1);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_TIMEOUT, 10);
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
     // here HTTP request is 'HEAD'
     curl_exec($ch);
     $info = curl_getinfo($ch);
     if ($info["http_code"] == 200 && $dokument->deleted == 1) {
         // @TODO Wiederherstellen
         echo "\n";
     } elseif ($info["http_code"] == 404 && $dokument->deleted == 0) {
         $dokument->loeschen();
         echo "Gelöscht: " . $dokument->id . "\n";
     }
 }
 public function run($args)
 {
     if (count($args) == 0) {
         die("./yiic reindex_documents [max_id]\n");
     }
     $max_id = $args[0];
     $sql = Yii::app()->db->createCommand();
     //$sql->select("id")->from("dokumente")->where("datum < NOW() - INTERVAL 2 MONTH AND datum > NOW() - INTERVAL 3 MONTH")->order("id");
     //$sql->select("id")->from("dokumente")->where("text_pdf = '' AND url LIKE '%pdf'")->order("id");
     $sql->select("id")->from("dokumente")->where("id <= " . IntVal($max_id))->order("id DESC");
     $data = $sql->queryColumn(["id"]);
     $anz = count($data);
     foreach ($data as $nr => $dok_id) {
         echo "{$nr} / {$anz} => {$dok_id}\n";
         /** @var Dokument $dokument */
         $dokument = Dokument::model()->findByPk($dok_id);
         if (!$dokument) {
             continue;
         }
         //$dokument->reDownloadIndex();
         $dokument->geo_extract();
         $dokument->solrIndex();
     }
 }
 /**
  * @param int $zeitspanne
  * @return array
  */
 public function benachrichtigungsErgebnisse($zeitspanne)
 {
     $benachrichtigungen = $this->getBenachrichtigungen();
     if ($zeitspanne > 0) {
         $neu_seit_ts = time() - $zeitspanne * 24 * 3600;
         $neu_seit = date("Y-m-d H:i:s", $neu_seit_ts);
     } else {
         $neu_seit = $this->datum_letzte_benachrichtigung;
         $neu_seit_ts = RISTools::date_iso2timestamp($neu_seit);
     }
     $ergebnisse = ["antraege" => [], "termine" => [], "vorgaenge" => []];
     $sql = Yii::app()->db->createCommand();
     $sql->select("id")->from("dokumente")->where("datum >= '" . addslashes($neu_seit) . "'");
     $data = $sql->queryColumn(["id"]);
     if (count($data) > 0) {
         $document_ids = [];
         foreach ($data as $did) {
             $document_ids[] = "id:\"Document:{$did}\"";
         }
         foreach ($benachrichtigungen as $benachrichtigung) {
             $e = $this->queryBenachrichtigungen($document_ids, $benachrichtigung);
             foreach ($e as $f) {
                 $d = explode(":", $f["id"]);
                 $dokument_id = IntVal($d[1]);
                 $dokument = Dokument::getCachedByID($dokument_id);
                 if (!$dokument) {
                     continue;
                 }
                 if ($dokument->antrag_id > 0) {
                     if (!isset($ergebnisse["antraege"][$dokument->antrag_id])) {
                         $ergebnisse["antraege"][$dokument->antrag_id] = ["antrag" => $dokument->antrag, "dokumente" => []];
                     }
                     if (!isset($ergebnisse["antraege"][$dokument->antrag_id]["dokumente"][$dokument_id])) {
                         $ergebnisse["antraege"][$dokument->antrag_id]["dokumente"][$dokument_id] = ["dokument" => Dokument::model()->findByPk($dokument_id), "queries" => []];
                     }
                     $ergebnisse["antraege"][$dokument->antrag_id]["dokumente"][$dokument_id]["queries"][] = $benachrichtigung;
                 } elseif ($dokument->termin_id > 0) {
                     if (!isset($ergebnisse["termine"][$dokument->termin_id])) {
                         $ergebnisse["termine"][$dokument->termin_id] = ["termin" => $dokument->termin, "dokumente" => []];
                     }
                     if (!isset($ergebnisse["termine"][$dokument->termin_id]["dokumente"][$dokument_id])) {
                         $ergebnisse["termine"][$dokument->termin_id]["dokumente"][$dokument_id] = ["dokument" => Dokument::model()->findByPk($dokument_id), "queries" => []];
                     }
                     $ergebnisse["termine"][$dokument->termin_id]["dokumente"][$dokument_id]["queries"][] = $benachrichtigung;
                 }
             }
         }
     }
     foreach ($this->abonnierte_vorgaenge as $vorgang) {
         foreach ($vorgang->antraege as $ant) {
             if (RISTools::date_iso2timestamp($ant->datum_letzte_aenderung) < $neu_seit_ts) {
                 continue;
             }
             if (!isset($ergebnisse["vorgaenge"][$vorgang->id])) {
                 $ergebnisse["vorgaenge"][$vorgang->id] = ["vorgang" => $vorgang->wichtigstesRisItem()->getName(true), "neues" => []];
             }
             $ant->findeAenderungen(time());
             $ergebnisse["vorgaenge"][$vorgang->id]["neues"][] = $ant;
         }
         foreach ($vorgang->dokumente as $dok) {
             if (RISTools::date_iso2timestamp($dok->datum) < $neu_seit_ts) {
                 continue;
             }
             if (!isset($ergebnisse["vorgaenge"][$vorgang->id])) {
                 $ergebnisse["vorgaenge"][$vorgang->id] = ["vorgang" => $vorgang->wichtigstesRisItem()->getName(true), "neues" => []];
             }
             $ergebnisse["vorgaenge"][$vorgang->id]["neues"][] = $dok;
         }
         foreach ($vorgang->ergebnisse as $erg) {
             if (RISTools::date_iso2timestamp($erg->datum_letzte_aenderung) < $neu_seit_ts) {
                 continue;
             }
             if (!isset($ergebnisse["vorgaenge"][$vorgang->id])) {
                 $ergebnisse["vorgaenge"][$vorgang->id] = ["vorgang" => $vorgang->wichtigstesRisItem()->getName(true), "neues" => []];
             }
             $ergebnisse["vorgaenge"][$vorgang->id]["neues"][] = $erg;
         }
     }
     return $ergebnisse;
 }
 /**
  *
  */
 public function actionIndex()
 {
     $this->top_menu = "themen";
     $this->render("index", ["referate" => Referat::model()->findAll(), "highlights" => Dokument::getHighlightDokumente(5), "tags" => Tag::getTopTags(10)]);
 }
 public function parse($antrag_id)
 {
     $antrag_id = IntVal($antrag_id);
     if (SITE_CALL_MODE != "cron") {
         echo "- Initiative {$antrag_id}\n";
     }
     if ($antrag_id == 0) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler BAInitiativeParser", "Initiative-ID 0\n" . print_r(debug_backtrace(), true), null, "system");
         return;
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_initiativen_details.jsp?Id={$antrag_id}");
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_initiativen_dokumente.jsp?Id={$antrag_id}");
     //$html_ergebnisse = load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=" . $antrag_id);
     $daten = new Antrag();
     $daten->id = $antrag_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->typ = Antrag::$TYP_BA_INITIATIVE;
     $dokumente = [];
     //$ergebnisse = array();
     preg_match("/<h3.*>.* +(.*)<\\/h3/siU", $html_details, $matches);
     if (count($matches) == 2) {
         $daten->antrags_nr = Antrag::cleanAntragNr($matches[1]);
     }
     $dat_details = explode("<h3 class=\"introheadline\">BA-Initiativen-Nummer", $html_details);
     $dat_details = explode("<div class=\"formularcontainer\">", $dat_details[1]);
     preg_match_all("/class=\"detail_row\">.*detail_label\">(.*)<\\/d.*detail_div\">(.*)<\\/div/siU", $dat_details[0], $matches);
     $betreff_gefunden = false;
     for ($i = 0; $i < count($matches[1]); $i++) {
         switch (trim($matches[1][$i])) {
             case "Betreff:":
                 $betreff_gefunden = true;
                 $daten->betreff = html_entity_decode($this->text_simple_clean($matches[2][$i]), ENT_COMPAT, "UTF-8");
                 break;
             case "Status:":
                 $daten->status = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Bearbeitung:":
                 $daten->bearbeitung = trim(strip_tags($matches[2][$i]));
                 break;
         }
     }
     if (!$betreff_gefunden) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler BAInitiativeParser", "Kein Betreff\n" . $html_details, null, "system");
         throw new Exception("Betreff nicht gefunden");
     }
     $dat_details = explode("<div class=\"detailborder\">", $html_details);
     $dat_details = explode("<!-- seitenfuss -->", $dat_details[1]);
     preg_match_all("/<span class=\"itext\">(.*)<\\/span.*detail_div_(left|right|left_long)\">(.*)<\\/div/siU", $dat_details[0], $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         if ($matches[3][$i] != "&nbsp;") {
             switch ($matches[1][$i]) {
                 case "Zust&auml;ndiges Referat:":
                     $daten->referat = $matches[3][$i];
                     break;
                 case "Gestellt am:":
                     $daten->gestellt_am = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Wahlperiode:":
                     $daten->wahlperiode = $matches[3][$i];
                     break;
                 case "Bearbeitungsfrist:":
                     $daten->bearbeitungsfrist = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Registriert am:":
                     $daten->registriert_am = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Bezirksausschuss:":
                     $daten->ba_nr = IntVal($matches[3][$i]);
                     break;
                 case "Typ:":
                     $daten->antrag_typ = strip_tags($matches[3][$i]);
                     break;
                 case "TO aufgenommen am:":
                     $daten->initiative_to_aufgenommen = $this->date_de2mysql($matches[3][$i]);
                     break;
             }
         }
     }
     if ($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]];
     }
     /*
     $dat_ergebnisse = explode("<!-- tabellenkopf -->", $html_ergebnisse);
     $dat_ergebnisse = explode("<!-- tabellenfuss -->", $dat_ergebnisse[1]);
     preg_match_all("<tr>.*bghell  tdborder\"><a.*\">(.*)<\/a>.*
     http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=6127
     */
     if ($daten->ba_nr == 0) {
         echo "BA-Initiative {$antrag_id}: " . "Keine BA-Angabe";
         $GLOBALS["RIS_PARSE_ERROR_LOG"][] = "Keine BA-Angabe (Initiative): {$antrag_id}";
         return;
     }
     $aenderungen = "";
     /** @var Antrag $alter_eintrag */
     $alter_eintrag = Antrag::model()->findByPk($antrag_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($alter_eintrag->betreff != $daten->betreff) {
             $aenderungen .= "Betreff: " . $alter_eintrag->betreff . " => " . $daten->betreff . "\n";
         }
         if ($alter_eintrag->bearbeitungsfrist != $daten->bearbeitungsfrist) {
             $aenderungen .= "Bearbeitungsfrist: " . $alter_eintrag->bearbeitungsfrist . " => " . $daten->bearbeitungsfrist . "\n";
         }
         if ($alter_eintrag->status != $daten->status) {
             $aenderungen .= "Status: " . $alter_eintrag->status . " => " . $daten->status . "\n";
         }
         if ($alter_eintrag->fristverlaengerung != $daten->fristverlaengerung) {
             $aenderungen .= "Fristverlängerung: " . $alter_eintrag->fristverlaengerung . " => " . $daten->fristverlaengerung . "\n";
         }
         if ($alter_eintrag->initiative_to_aufgenommen != $daten->initiative_to_aufgenommen) {
             $aenderungen .= "In TO Aufgenommen: " . $alter_eintrag->initiative_to_aufgenommen . " => " . $daten->initiative_to_aufgenommen . "\n";
         }
         if ($aenderungen != "") {
             $changed = true;
         }
         if ($alter_eintrag->wahlperiode == "") {
             $alter_eintrag->wahlperiode = "?";
         }
     }
     if ($changed) {
         if ($aenderungen == "") {
             $aenderungen = "Neu angelegt\n";
         }
         echo "BA-Initiative {$antrag_id}: Verändert: " . $aenderungen . "\n";
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes());
             if (!$alter_eintrag->save()) {
                 var_dump($alter_eintrag->getErrors());
                 die("Fehler");
             }
             $daten = $alter_eintrag;
         } else {
             if (!$daten->save()) {
                 var_dump($daten->getErrors());
                 die("Fehler");
             }
         }
         $daten->resetPersonen();
     }
     foreach ($dokumente as $dok) {
         $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_BA_INITIATIVE, $daten, $dok);
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = $daten->ba_nr;
         $aend->typ = RISAenderung::$TYP_BA_INITIATIVE;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Antrag $antrag */
         $antrag = Antrag::model()->findByPk($antrag_id);
         $antrag->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $antrag->save();
         $antrag->rebuildVorgaenge();
     }
 }
 public function match(Dokument $dokument)
 {
     return in_array($dokument->getLatestRevision()->getGliederungID(), $this->gliederungids);
 }
Exemple #14
0
 public function match(Dokument $dokument)
 {
     return $dokument->getLatestRevision()->getStatusID() == $this->getStatusID();
 }
 public function parse($vorlage_id)
 {
     if (SITE_CALL_MODE != "cron") {
         echo "- Beschlussvorlage {$vorlage_id}\n";
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_detail.jsp?risid=" . $vorlage_id);
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_dokumente.jsp?risid=" . $vorlage_id);
     $html_ergebnisse = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_ergebnisse.jsp?risid=" . $vorlage_id);
     $daten = new Antrag();
     $daten->id = $vorlage_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->typ = Antrag::$TYP_STADTRAT_VORLAGE;
     $daten->antrag_typ = "";
     $daten->gestellt_von = "";
     $daten->antrag_typ = "";
     $daten->bearbeitung = "";
     $daten->initiatorInnen = "";
     $daten->referent = "";
     $daten->referat = "";
     $dokumente = [];
     $ergebnisse = [];
     if (strpos($html_details, "ris_vorlagen_kurzinfo.jsp?risid={$vorlage_id}")) {
         $html_kurzinfo = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_vorlagen_kurzinfo.jsp?risid=" . $vorlage_id);
         $txt = explode("introtext_border\">", $html_kurzinfo);
         if (count($txt) < 2) {
             RISTools::send_email(Yii::app()->params['adminEmail'], "Vorlage: kein introtext_border", $vorlage_id . "\n" . $html_kurzinfo, null, "system");
             return;
         }
         $txt = explode("</div>", $txt[1]);
         $daten->kurzinfo = trim(str_replace(["<br />", "<p>", "</p>"], ["", "", ""], $txt[0]));
     }
     $dat_details = explode("<!-- bereichsbild, bereichsheadline, allgemeiner text -->", $html_details);
     if (count($dat_details) == 1) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Vorlage: Keine Details", $html_details, null, "system");
         return;
     }
     preg_match("/Vorlagen\\-Nr\\.:&nbsp;([^<]*)</siU", $dat_details[1], $matches);
     $daten->antrags_nr = Antrag::cleanAntragNr($matches[1]);
     $dat_details = explode("<!-- detailbereich -->", $dat_details[1]);
     $betreff_gefunden = false;
     preg_match_all("/class=\"detail_row\">.*detail_label\">(.*)<\\/d.*detail_div\">(.*)<\\/div/siU", $dat_details[0], $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         switch ($matches[1][$i]) {
             case "Betreff:":
                 $betreff_gefunden = true;
                 $daten->betreff = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Status:":
                 $daten->status = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Bearbeitung:":
                 $daten->bearbeitung = trim(strip_tags($matches[2][$i]));
                 break;
         }
     }
     if (!$betreff_gefunden) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler StadtratsvorlageParser", "Kein Betreff\n" . $html_details, null, "system");
         throw new Exception("Betreff nicht gefunden");
     }
     $dat_details = explode("<!-- details und tabelle -->", $html_details);
     $dat_details = explode("<!-- tabellenfuss -->", $dat_details[1]);
     preg_match_all("/label_long\">(<span class=\"itext\">)?([^<]*)(<\\/span>)?<\\/div.*detail_div_(left|right|left_long)\">(.*)<\\/div/siU", $dat_details[0], $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         if ($matches[5][$i] != "&nbsp;") {
             switch ($matches[2][$i]) {
                 case "Typ:":
                     $daten->antrag_typ = $matches[5][$i];
                     break;
                 case "Zust&auml;ndiges Referat:":
                     $daten->referat = $matches[5][$i];
                     $ref = Referat::getByHtmlName($matches[5][$i]);
                     $daten->referat_id = $ref ? $ref->id : null;
                     break;
                 case "Erstellt am:":
                     $daten->gestellt_am = $this->date_de2mysql($matches[5][$i]);
                     break;
                 case "Wahlperiode:":
                     $daten->wahlperiode = $matches[5][$i];
                     break;
                 case "Bearbeitungsfrist:":
                     $daten->bearbeitungsfrist = $this->date_de2mysql($matches[5][$i]);
                     break;
                 case "Fristverl&auml;ngerung:":
                     $daten->fristverlaengerung = $this->date_de2mysql($matches[5][$i]);
                     break;
                 case "Gestellt von:":
                     $daten->gestellt_von = $matches[5][$i];
                     break;
                 case "Initiatoren:":
                     if ($matches[5][$i] != "&nbsp;") {
                         $daten->initiatorInnen = $matches[5][$i];
                     }
                     break;
                 case "Stadtbezirk/e:":
                     $daten->ba_nr = IntVal($matches[5][$i]);
                     break;
                 case "Referent/in:":
                     $daten->referent = $matches[5][$i];
                     break;
             }
         }
     }
     $geloescht = $betreff_gefunden && $daten->wahlperiode == "" && $daten->status == "" && $daten->betreff == "";
     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]];
     }
     preg_match_all("/ris_antrag_detail\\.jsp\\?risid=([0-9]+)[\"'& ]/siU", $html_details, $matches);
     $antrag_links = isset($matches[1]) && is_array($matches[1]) ? $matches[1] : [];
     $dat_ergebnisse = explode("<!-- tabellenkopf -->", $html_ergebnisse);
     if (count($dat_ergebnisse) > 1) {
         $dat_ergebnisse = explode("<!-- tabellenfuss -->", $dat_ergebnisse[1]);
         $gremien_link = "<a class=\"link_bold\" href=\"(?<gremien_link>[^\"]*)\"";
         $sitzung_link = "<a class=\"link_bold\" href=\"(?<sitzung_link>[^\"]*)\"";
         preg_match_all("/<tr[^>]*ergebnistab_tr[^>]*>.*{$gremien_link}.*{$sitzung_link}.*<\\/tr>/siu", $dat_ergebnisse[0], $matches);
         $ba = $str = false;
         if (count($matches) == 0) {
             $str = true;
         } else {
             for ($i = 0; $i < count($matches["gremien_link"]); $i++) {
                 $link = $matches["gremien_link"][$i];
                 if (strpos($link, "ris_gremien_detail.jsp?risid=") === 0) {
                     $str = true;
                 }
                 if (strpos($link, "/RII/BA-RII/ba_gremien_details.jsp?Id=") === 0) {
                     $x = explode("/RII/BA-RII/ba_gremien_details.jsp?Id=", $link);
                     /** @var Gremium $g */
                     $g = Gremium::model()->findByPk($x[1]);
                     $ba = $g->ba_nr;
                 }
             }
         }
         if ($ba > 0) {
             $daten->ba_nr = IntVal($ba);
         } else {
             $daten->ba_nr = null;
         }
     }
     $aenderungen = "";
     /** @var Antrag $alter_eintrag */
     $alter_eintrag = Antrag::model()->findByPk($vorlage_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($geloescht) {
             $aenderungen = "gelöscht";
             $changed = true;
         } else {
             if ($alter_eintrag->bearbeitungsfrist != $daten->bearbeitungsfrist) {
                 $aenderungen .= "Bearbeitungsfrist: " . $alter_eintrag->bearbeitungsfrist . " => " . $daten->bearbeitungsfrist . "\n";
             }
             if ($alter_eintrag->status != $daten->status) {
                 $aenderungen .= "Status: " . $alter_eintrag->status . " => " . $daten->status . "\n";
             }
             if ($alter_eintrag->fristverlaengerung != $daten->fristverlaengerung) {
                 $aenderungen .= "Fristverlängerung: " . $alter_eintrag->fristverlaengerung . " => " . $daten->fristverlaengerung . "\n";
             }
             if (isset($daten->initiatorInnen) && $alter_eintrag->initiatorInnen != $daten->initiatorInnen) {
                 $aenderungen .= "Initiatoren: " . $alter_eintrag->initiatorInnen . " => " . $daten->initiatorInnen . "\n";
             }
             if ($alter_eintrag->gestellt_von != $daten->gestellt_von) {
                 $aenderungen .= "Gestellt von: " . $alter_eintrag->gestellt_von . " => " . $daten->gestellt_von . "\n";
             }
             if ($alter_eintrag->antrags_nr != $daten->antrags_nr) {
                 $aenderungen .= "Vorlagen-Nr: " . $alter_eintrag->antrags_nr . " => " . $daten->antrags_nr . "\n";
             }
             if ($alter_eintrag->ba_nr != $daten->ba_nr) {
                 $aenderungen .= "BA: " . $alter_eintrag->ba_nr . " => " . $daten->ba_nr . "\n";
             }
             if (isset($daten->referat) && $alter_eintrag->referat != $daten->referat) {
                 $aenderungen .= "Referat: " . $alter_eintrag->referat . " => " . $daten->referat . "\n";
             }
             if (isset($daten->referent) && $alter_eintrag->referent != $daten->referent) {
                 $aenderungen .= "Referent: " . $alter_eintrag->referent . " => " . $daten->referent . "\n";
             }
             if ($alter_eintrag->referat_id != $daten->referat_id) {
                 $aenderungen .= "Referats-ID: " . $alter_eintrag->referat_id . " => " . $daten->referat_id . "\n";
             }
             if ($aenderungen != "") {
                 $changed = true;
             }
         }
     }
     if ($changed) {
         echo "Vorlage {$vorlage_id}: Verändert: " . ($changed ? "Ja" : "Nein") . "\n";
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes());
             if (!$alter_eintrag->save(false)) {
                 echo "Vorlage 1\n";
                 var_dump($alter_eintrag->getErrors());
                 die("Fehler");
             }
             $daten = $alter_eintrag;
             if ($geloescht) {
                 echo "Lösche";
                 foreach ($daten->dokumente as $dok) {
                     echo $dok->antrag_id . " => null\n";
                     $dok->antrag_id = null;
                     $dok->save();
                 }
                 foreach ($daten->ergebnisse as $erg) {
                     echo $erg->antrag_id . " => null\n";
                     $erg->antrag_id = null;
                     $erg->save();
                 }
                 Yii::app()->db->createCommand("UPDATE tagesordnungspunkte_history SET antrag_id = NULL WHERE antrag_id = " . IntVal($vorlage_id))->execute();
                 Yii::app()->db->createCommand("UPDATE tagesordnungspunkte SET antrag_id = NULL WHERE antrag_id = " . IntVal($vorlage_id))->execute();
                 Yii::app()->db->createCommand("DELETE FROM antraege_orte WHERE antrag_id = " . IntVal($vorlage_id))->execute();
                 Yii::app()->db->createCommand("DELETE FROM antraege_vorlagen WHERE antrag1 = " . IntVal($vorlage_id))->execute();
                 if (!$daten->delete()) {
                     RISTools::send_email(Yii::app()->params['adminEmail'], "Vorlage: Nicht gelöscht", "VorlageParser 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_VORLAGE;
                 $aend->datum = new CDbExpression("NOW()");
                 $aend->aenderungen = $aenderungen;
                 $aend->save();
                 return;
             }
         } elseif (!$geloescht) {
             if (!$daten->save()) {
                 echo "Vorlage 2\n";
                 var_dump(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 3));
                 var_dump($daten->getErrors());
                 die("Fehler");
             }
         }
         $daten->resetPersonen();
     }
     foreach ($dokumente as $dok) {
         $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_STADTRAT_VORLAGE, $daten, $dok);
     }
     foreach ($antrag_links as $link) {
         /** @var Antrag $antrag */
         $antrag = Antrag::model()->findByPk(IntVal($link));
         if (!$antrag) {
             $parser = new StadtratsantragParser();
             $parser->parse($link);
             $antrag = Antrag::model()->findByPk(IntVal($link));
         }
         if (!$antrag) {
             if (Yii::app()->params['adminEmail'] != "") {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratsvorlage - Zugordnungs Error", $vorlage_id . " - " . $link, null, "system");
             }
         }
         $sql = Yii::app()->db->createCommand();
         $sql->select("antrag2")->from("antraege_vorlagen")->where("antrag1 = " . IntVal($vorlage_id) . " AND antrag2 = " . IntVal($antrag->id));
         $data = $sql->queryAll();
         if (count($data) == 0) {
             $daten->addAntrag($antrag);
             $aenderungen .= "Neuer Antrag zugeordnet: http://www.ris-muenchen.de/RII/RII/ris_antrag_detail.jsp?risid={$link}\n";
         }
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = $daten->ba_nr;
         $aend->typ = RISAenderung::$TYP_STADTRAT_VORLAGE;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Antrag $antrag */
         $antrag = Antrag::model()->findByPk($vorlage_id);
         $antrag->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $antrag->save();
         $antrag->rebuildVorgaenge();
     }
 }
 public function parse($antrag_id)
 {
     $antrag_id = IntVal($antrag_id);
     if (in_array($antrag_id, [3258272])) {
         return;
     }
     if (SITE_CALL_MODE != "cron") {
         echo "- Antrag {$antrag_id}\n";
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_detail.jsp?risid=" . $antrag_id);
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_dokumente.jsp?risid=" . $antrag_id);
     //$html_ergebnisse = load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=" . $antrag_id);
     if (trim($html_details) == "" || trim($html_dokumente) == "") {
         return;
     }
     $daten = new Antrag();
     $daten->id = $antrag_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->typ = Antrag::$TYP_STADTRAT_ANTRAG;
     $daten->referent = "";
     $daten->referat = "";
     $daten->kurzinfo = "";
     $daten->bearbeitung = "";
     $daten->initiatorInnen = "";
     $dokumente = [];
     // $ergebnisse = array();
     $dat_details = explode("<!-- bereichsbild, bereichsheadline, allgemeiner text -->", $html_details);
     if (!isset($dat_details[1])) {
         echo $antrag_id . " - " . "http://www.ris-muenchen.de/RII/RII/ris_antrag_detail.jsp?risid=" . $antrag_id . "\n";
         var_dump($dat_details);
         return;
     }
     $dat_details = explode("<!-- detailbereich -->", $dat_details[1]);
     preg_match("/<h3.*>.*&nbsp;(.*)<\\/h3/siU", $dat_details[0], $matches);
     if (count($matches) == 2) {
         $daten->antrags_nr = Antrag::cleanAntragNr($matches[1]);
     }
     preg_match_all("/class=\"detail_row\">.*detail_label\">(.*)<\\/d.*detail_div\">(.*)<\\/div/siU", $dat_details[0], $matches);
     $betreff_gefunden = false;
     for ($i = 0; $i < count($matches[1]); $i++) {
         switch (trim($matches[1][$i])) {
             case "Betreff:":
                 $betreff_gefunden = true;
                 $daten->betreff = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Status:":
                 $daten->status = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Bearbeitung:":
                 $daten->bearbeitung = trim(strip_tags($matches[2][$i]));
                 break;
         }
     }
     if (!$betreff_gefunden) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler StadtratsantragParser", "Kein Betreff\n" . $html_details, null, "system");
         throw new Exception("Betreff nicht gefunden");
     }
     $dat_details = explode("<!-- details und tabelle -->", $html_details);
     $dat_details = explode("<!-- tabellenfuss -->", $dat_details[1]);
     preg_match_all("/detail_label_long\">(<span class=\"itext\">)?([^<].*)<\\/.*detail_div_(left|right|left_long)\">(.*)<\\/div/siU", $dat_details[0], $matches);
     for ($i = 0; $i < count($matches[2]); $i++) {
         if ($matches[4][$i] != "&nbsp;") {
             switch ($matches[2][$i]) {
                 case "Typ:":
                     $daten->antrag_typ = $matches[4][$i];
                     break;
                 case "Zust&auml;ndiges Referat:":
                     $daten->referat = $matches[4][$i];
                     $ref = Referat::getByHtmlName($matches[4][$i]);
                     $daten->referat_id = $ref ? $ref->id : null;
                     break;
                 case "Gestellt am:":
                     $daten->gestellt_am = $this->date_de2mysql($matches[4][$i]);
                     break;
                 case "Wahlperiode:":
                     $daten->wahlperiode = $matches[4][$i];
                     break;
                 case "Bearbeitungsfrist:":
                     $daten->bearbeitungsfrist = $this->date_de2mysql($matches[4][$i]);
                     break;
                 case "Fristverl&auml;ngerung:":
                     $daten->fristverlaengerung = $this->date_de2mysql($matches[4][$i]);
                     break;
                 case "Gestellt von:":
                     $daten->gestellt_von = $matches[4][$i];
                     break;
                 case "Initiatoren:":
                     if ($matches[4][$i] != "&nbsp;") {
                         $daten->initiatorInnen = $matches[4][$i];
                     }
                     break;
                 case "Erledigt am:":
                     if ($matches[4][$i] != "&nbsp;") {
                         $daten->erledigt_am = $this->date_de2mysql($matches[4][$i]);
                     }
                     break;
             }
         }
     }
     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]];
     }
     /*
     $dat_ergebnisse = explode("<!-- tabellenkopf -->", $html_ergebnisse);
     $dat_ergebnisse = explode("<!-- tabellenfuss -->", $dat_ergebnisse[1]);
     preg_match_all("<tr>.*bghell  tdborder\"><a.*\">(.*)<\/a>.*
     http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=6127
     */
     $aenderungen = "";
     /** @var Antrag $alter_eintrag */
     $alter_eintrag = Antrag::model()->findByPk($antrag_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($alter_eintrag->bearbeitungsfrist != $daten->bearbeitungsfrist) {
             $aenderungen .= "Bearbeitungsfrist: " . $alter_eintrag->bearbeitungsfrist . " => " . $daten->bearbeitungsfrist . "\n";
         }
         if ($alter_eintrag->status != $daten->status) {
             $aenderungen .= "Status: " . $alter_eintrag->status . " => " . $daten->status . "\n";
         }
         if ($alter_eintrag->fristverlaengerung != $daten->fristverlaengerung) {
             $aenderungen .= "Fristverlängerung: " . $alter_eintrag->fristverlaengerung . " => " . $daten->fristverlaengerung . "\n";
         }
         if (isset($daten->initiatorInnen) && $alter_eintrag->initiatorInnen != $daten->initiatorInnen) {
             $aenderungen .= "Initiatoren: " . $alter_eintrag->initiatorInnen . " => " . $daten->initiatorInnen . "\n";
         }
         if ($alter_eintrag->gestellt_von != $daten->gestellt_von) {
             $aenderungen .= "Gestellt von: " . $alter_eintrag->gestellt_von . " => " . $daten->gestellt_von . "\n";
         }
         if ($alter_eintrag->antrags_nr != $daten->antrags_nr) {
             $aenderungen .= "Antrags-Nr: " . $alter_eintrag->antrags_nr . " => " . $daten->antrags_nr . "\n";
         }
         if ($alter_eintrag->erledigt_am != $daten->erledigt_am) {
             $aenderungen .= "Erledigt am: " . $alter_eintrag->erledigt_am . " => " . $daten->erledigt_am . "\n";
         }
         if ($alter_eintrag->referat != $daten->referat) {
             $aenderungen .= "Referat: " . $alter_eintrag->referat . " => " . $daten->referat . "\n";
         }
         if ($alter_eintrag->referat_id != $daten->referat_id) {
             $aenderungen .= "Referats-ID: " . $alter_eintrag->referat_id . " => " . $daten->referat_id . "\n";
         }
         if ($aenderungen != "") {
             $changed = true;
         }
     }
     if ($changed) {
         if ($aenderungen == "") {
             $aenderungen = "Neu angelegt\n";
         }
         echo "Antrag {$antrag_id}: Verändert: " . $aenderungen . "\n";
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes(), false);
             if (!$alter_eintrag->save()) {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratsantrag Fehler 1", "Antrag {$antrag_id}\n" . print_r($alter_eintrag->getErrors(), true) . "\n\n" . $html_details, null, "system");
                 throw new \Exception("StadtratAntrag 1");
             }
             $daten = $alter_eintrag;
         } else {
             if (!$daten->save()) {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "Stadtratsantrag Fehler 2", "Antrag {$antrag_id}\n" . print_r($daten->getErrors(), true) . "\n\n" . $html_details, null, "system");
                 throw new \Exception("StadtratAntrag 2");
             }
         }
         $daten->resetPersonen();
     }
     foreach ($dokumente as $dok) {
         $aenderungen .= Dokument::create_if_necessary(Dokument::$TYP_STADTRAT_ANTRAG, $daten, $dok);
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = $daten->ba_nr;
         $aend->typ = RISAenderung::$TYP_STADTRAT_ANTRAG;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Antrag $antrag */
         $antrag = Antrag::model()->findByPk($antrag_id);
         $antrag->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $antrag->save();
         $antrag->rebuildVorgaenge();
     }
 }
Exemple #17
0
 public function match(Dokument $dokument)
 {
     return $dokument->getLatestRevision()->hasFlag($this->flagid);
 }
if ($dokumenttemplate == null) {
    $api->output(array("failed" => "DOKUMENTTEMPLATE_MISSING"), 400);
    exit;
}
$gliederungid = $dokumenttemplate->getDokumentGliederungID($session);
$kategorieid = $dokumenttemplate->getDokumentKategorieID($session);
$statusid = $dokumenttemplate->getDokumentStatusID($session);
$file = $dokumenttemplate->getDokumentFile($session);
if (!$session->isAllowed("dokumente_create", $gliederungid)) {
    $api->output(array("failed" => "PERMISSION_DENIED"), 403);
    exit;
}
if ($file == null) {
    $api->output(array("failed" => "FILE_MISSING"), 400);
} else {
    $dokument = new Dokument($session->getStorage());
    // Zwischenspeichern um die ID zu bekommen
    $dokument->save();
    $revision = new DokumentRevision($session->getStorage());
    $revision->setDokument($dokument);
    $revision->setUser($session->getUser());
    $revision->setTimestamp(time());
    $revision->setGliederungID($gliederungid);
    $revision->setKategorieID($kategorieid);
    $revision->setStatusID($statusid);
    $revision->setIdentifier($dokumenttemplate->getDokumentIdentifier($session));
    $revision->setLabel($dokumenttemplate->getDokumentLabel($session));
    $revision->setFile($file);
    $revision->setData($dokumenttemplate->getDokumentData($session));
    $revision->setKommentar($dokumenttemplate->getDokumentKommentar($session));
    foreach ($dokumenttemplate->getDokumentFlags($session) as $flagid) {
 /**
  * @param int $limit
  * @return Dokument[]
  */
 public static function getHighlightDokumente($limit = 3)
 {
     return Dokument::model()->findAll(["condition" => "highlight IS NOT NULL", "order" => "highlight DESC", "limit" => $limit]);
 }
 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();
     }
 }
 public static function factory(Storage $storage, $row)
 {
     $dokument = new Dokument($storage);
     $dokument->setDokumentID($row["dokumentid"]);
     return $dokument;
 }
 $suche->addKritsToSolr($select);
 $select->setRows(50);
 $select->addSort('sort_datum', $select::SORT_DESC);
 /** @var Solarium\QueryType\Select\Query\Component\Highlighting\Highlighting $hl */
 $hl = $select->getHighlighting();
 $hl->setFields('text, text_ocr, antrag_betreff');
 $hl->setSimplePrefix('<b>');
 $hl->setSimplePostfix('</b>');
 /** @var \Solarium\QueryType\Select\Result\Result $ergebnisse */
 $ergebnisse = $solr->select($select);
 $dokumente = $ergebnisse->getDocuments();
 if (count($dokumente) > 0) {
     echo '<tr><th>Namentlich erwähnt in:</th><td><ul>';
     $highlighting = $ergebnisse->getHighlighting();
     foreach ($dokumente as $dokument) {
         $dok = Dokument::getDocumentBySolrId($dokument->id, true);
         if (!$dok) {
             if ($this->binContentAdmin()) {
                 echo "<li>Dokument nicht gefunden: " . $dokument->id . "</li>";
             }
         } elseif (!$dok->getRISItem()) {
             if ($this->binContentAdmin()) {
                 echo "<li>Dokument-Zuordnung nicht gefunden: " . $dokument->typ . " / " . $dokument->id . "</li>";
             }
         } else {
             $risitem = $dok->getRISItem();
             if (!$risitem) {
                 continue;
             }
             $dokurl = $dok->getLinkZumDokument();
             echo '<li style="margin-bottom: 10px;">';
 public function match(Dokument $dokument)
 {
     return strpos($dokument->getLatestRevision()->getIdentifier(), $this->getIdentifier()) === 0;
 }
 public function actionDokumente($id)
 {
     $this->load_pdf_js = true;
     /** @var Dokument $dokument */
     $dokument = Dokument::getCachedByID($id);
     if (!$dokument) {
         $this->render('error', ["code" => 404, "message" => "Das Dokument wurde leider nicht gefunden."]);
     } else {
         $this->render('dokumentenanzeige', ["id" => $id, "dokument" => $dokument]);
     }
 }
 public function parse($antrag_id)
 {
     $antrag_id = IntVal($antrag_id);
     if (SITE_CALL_MODE != "cron") {
         echo "- Antrag {$antrag_id}\n";
     }
     if ($antrag_id == 0) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler BAAntragParser", "Antrag-ID 0\n" . print_r(debug_backtrace(), true), null, "system");
         return;
     }
     $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_antraege_details.jsp?Id={$antrag_id}&selTyp=");
     $html_dokumente = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_antraege_dokumente.jsp?Id={$antrag_id}&selTyp=BA-Antrag");
     //$html_ergebnisse = load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=" . $antrag_id);
     $daten = new Antrag();
     $daten->id = $antrag_id;
     $daten->datum_letzte_aenderung = new CDbExpression('NOW()');
     $daten->gestellt_von = "";
     $daten->referat = "";
     $daten->referent = "";
     $daten->antrag_typ = "";
     $daten->kurzinfo = "";
     $daten->bearbeitung = "";
     $daten->initiatorInnen = "";
     $dokumente = [];
     //$ergebnisse = array();
     $dat_details = explode("<!-- bereichsbild, bereichsheadline, allgemeiner text -->", $html_details);
     $dat_details = explode("<!-- detailbereich -->", $dat_details[1]);
     preg_match_all("/class=\"detail_row\">.*detail_label\">(.*)<\\/d.*detail_div\">(.*)<\\/div/siU", $dat_details[0], $matches);
     $betreff_gefunden = false;
     for ($i = 0; $i < count($matches[1]); $i++) {
         switch (trim($matches[1][$i])) {
             case "Betreff:":
                 $betreff_gefunden = true;
                 $daten->betreff = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Status:":
                 $daten->status = $this->text_simple_clean($matches[2][$i]);
                 break;
             case "Bearbeitung:":
                 $daten->bearbeitung = trim(strip_tags($matches[2][$i]));
                 break;
         }
     }
     if (!$betreff_gefunden) {
         RISTools::send_email(Yii::app()->params['adminEmail'], "Fehler BAAntragParser", "Kein Betreff\n" . $html_details, null, "system");
         throw new Exception("Betreff nicht gefunden");
     }
     $dat_details = explode("<!-- bereichsbild, bereichsheadline, allgemeiner text -->", $html_details);
     $dat_details = explode("<!-- tabellenfuss -->", $dat_details[1]);
     preg_match("/<h3.*>(.*) +(.*)<\\/h3/siU", $dat_details[0], $matches);
     if (count($matches) == 3) {
         $daten->antrags_nr = Antrag::cleanAntragNr($matches[2]);
         switch ($matches[1]) {
             case "BA-Antrags-Nummer:":
                 $daten->typ = Antrag::$TYP_BA_ANTRAG;
                 break;
             case "BV-Empfehlungs-Nummer:":
                 $daten->typ = Antrag::$TYP_BUERGERVERSAMMLUNG_EMPFEHLUNG;
                 break;
             default:
                 RISTools::send_email(Yii::app()->params['adminEmail'], "RIS: Unbekannter BA-Antrags-Typ: " . $antrag_id, $matches[1], null, "system");
                 die;
         }
     } else {
         RISTools::send_email(Yii::app()->params['adminEmail'], "RIS: Unbekannter BA-Antrags-Typ: " . $antrag_id, $dat_details[0], null, "system");
         die;
     }
     preg_match_all("/<span class=\"itext\">(.*)<\\/span.*detail_div_(left|right|left_long)\">(.*)<\\/div/siU", $dat_details[0], $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         if ($matches[3][$i] != "&nbsp;") {
             switch ($matches[1][$i]) {
                 case "Zust&auml;ndiges Referat:":
                     $daten->referat = $matches[3][$i];
                     $ref = Referat::getByHtmlName($matches[3][$i]);
                     $daten->referat_id = $ref ? $ref->id : null;
                     break;
                 case "Gestellt am:":
                     $daten->gestellt_am = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Wahlperiode:":
                     $daten->wahlperiode = $matches[3][$i];
                     break;
                 case "Bearbeitungsfrist:":
                     $daten->bearbeitungsfrist = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Registriert am:":
                     $daten->registriert_am = $this->date_de2mysql($matches[3][$i]);
                     break;
                 case "Bezirksausschuss:":
                     $daten->ba_nr = IntVal($matches[3][$i]);
                     break;
             }
         }
     }
     preg_match_all("/<li><span class=\"iconcontainer\">.*href=\"(.*)\"[^>]*title=\"([^\"]*)\">(.*)<\\/a>/siU", $html_dokumente, $matches);
     for ($i = 0; $i < count($matches[1]); $i++) {
         $dokumente[] = ["url" => $matches[1][$i], "name" => $matches[3][$i], "name_title" => $matches[2][$i]];
     }
     /*
     $dat_ergebnisse = explode("<!-- tabellenkopf -->", $html_ergebnisse);
     $dat_ergebnisse = explode("<!-- tabellenfuss -->", $dat_ergebnisse[1]);
     preg_match_all("<tr>.*bghell  tdborder\"><a.*\">(.*)<\/a>.*
     http://www.ris-muenchen.de/RII/RII/ris_antrag_ergebnisse.jsp?risid=6127
     */
     if (!($daten->ba_nr > 0)) {
         echo "BA-Antrag {$antrag_id}:" . "Keine BA-Angabe";
         $GLOBALS["RIS_PARSE_ERROR_LOG"][] = "Keine BA-Angabe (Antrag): {$antrag_id}";
         return;
     }
     $aenderungen = "";
     /** @var Antrag $alter_eintrag */
     $alter_eintrag = Antrag::model()->findByPk($antrag_id);
     $changed = true;
     if ($alter_eintrag) {
         $changed = false;
         if ($alter_eintrag->betreff != $daten->betreff) {
             $aenderungen .= "Betreff: " . $alter_eintrag->betreff . " => " . $daten->betreff . "\n";
         }
         if ($alter_eintrag->bearbeitungsfrist != $daten->bearbeitungsfrist) {
             $aenderungen .= "Bearbeitungsfrist: " . $alter_eintrag->bearbeitungsfrist . " => " . $daten->bearbeitungsfrist . "\n";
         }
         if ($alter_eintrag->status != $daten->status) {
             $aenderungen .= "Status: " . $alter_eintrag->status . " => " . $daten->status . "\n";
         }
         if ($alter_eintrag->fristverlaengerung != $daten->fristverlaengerung) {
             $aenderungen .= "Fristverlängerung: " . $alter_eintrag->fristverlaengerung . " => " . $daten->fristverlaengerung . "\n";
         }
         if ($alter_eintrag->typ != $daten->typ) {
             $aenderungen .= "Typ: " . $alter_eintrag->typ . " => " . $daten->typ . "\n";
         }
         if ($alter_eintrag->referat != $daten->referat) {
             $aenderungen .= "Referat: " . $alter_eintrag->referat . " => " . $daten->referat . "\n";
         }
         if ($alter_eintrag->referat_id != $daten->referat_id) {
             $aenderungen .= "Referats-ID: " . $alter_eintrag->referat_id . " => " . $daten->referat_id . "\n";
         }
         if ($aenderungen != "") {
             $changed = true;
         }
     }
     if ($changed) {
         if ($aenderungen == "") {
             $aenderungen = "Neu angelegt\n";
         }
         echo "BA-Antrag {$antrag_id}: " . $aenderungen;
         if ($alter_eintrag) {
             $alter_eintrag->copyToHistory();
             $alter_eintrag->setAttributes($daten->getAttributes());
             if (!$alter_eintrag->save()) {
                 var_dump($alter_eintrag->getErrors());
                 die("Fehler");
             }
             $daten = $alter_eintrag;
         } else {
             if (!$daten->save()) {
                 var_dump($daten->getErrors());
                 die("Fehler");
             }
         }
         $daten->resetPersonen();
     }
     foreach ($dokumente as $dok) {
         $dok_typ = $daten->typ == Antrag::$TYP_BA_ANTRAG ? Dokument::$TYP_BA_ANTRAG : Dokument::$TYP_BUERGERVERSAMMLUNG_EMPFEHLUNG;
         $aenderungen .= Dokument::create_if_necessary($dok_typ, $daten, $dok);
     }
     if ($aenderungen != "") {
         $aend = new RISAenderung();
         $aend->ris_id = $daten->id;
         $aend->ba_nr = $daten->ba_nr;
         $aend->typ = $daten->typ == Antrag::$TYP_BA_ANTRAG ? RISAenderung::$TYP_BA_ANTRAG : RISAenderung::$TYP_BUERGERVERSAMMLUNG_EMPFEHLUNG;
         $aend->datum = new CDbExpression("NOW()");
         $aend->aenderungen = $aenderungen;
         $aend->save();
         /** @var Antrag $antrag */
         $antrag = Antrag::model()->findByPk($antrag_id);
         $antrag->datum_letzte_aenderung = new CDbExpression('NOW()');
         // Auch bei neuen Dokumenten
         $antrag->save();
         $antrag->rebuildVorgaenge();
     }
 }
 public function match(Dokument $dokument)
 {
     return $dokument->getDokumentID() == $this->getDokumentID();
 }
 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();
     }
 }