public function parseAlle()
 {
     $text = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_referenten_trefferliste.jsp?nav=1");
     $txt = explode("<!-- ergebnisreihen -->", $text);
     $txt = explode("<div class=\"ergebnisfuss\">", $txt[1]);
     preg_match_all("/ris_referenten_detail\\.jsp\\?risid=(?<id>[0-9]+)[\"'& ][^>]*>(?<name>[^<]+)<.*target=\"_blank\">(?<referat>[^<]+)</siU", $txt[0], $matches);
     for ($i = 0; $i < count($matches["name"]); $i++) {
         $name = trim($matches["name"][$i]);
         $name = str_replace("&nbsp;", " ", $name);
         $name = preg_replace("/ *(\n *)+/siu", "\n", $name);
         $x = explode("\n", $name);
         $y = explode(", ", $x[1]);
         $name = trim($x[0]) . " " . trim($y[1]) . " " . trim($y[0]);
         $id = IntVal($matches["id"][$i]);
         $referat_name = $matches["referat"][$i];
         /** @var StadtraetIn $str */
         $str = StadtraetIn::model()->findByPk($id);
         if ($str) {
             if ($str->name != $name) {
                 RISTools::send_email(Yii::app()->params['adminEmail'], "ReferentIn Änderung", $str->name . " => " . $name, null, "system");
                 $str->name = $name;
                 $str->save();
             }
         } else {
             $str = new StadtraetIn();
             $str->name = $name;
             $str->id = $id;
             $str->referentIn = 1;
             $str->save();
         }
         /** @var Referat $referat */
         $referat = Referat::model()->findByAttributes(["name" => $referat_name]);
         if (!$referat) {
             RISTools::send_email(Yii::app()->params['adminEmail'], "Referat nicht gefunden", $referat_name, null, "system");
             return;
         }
         $gefunden = false;
         foreach ($str->stadtraetInnenReferate as $ref) {
             if ($ref->referat_id == $referat->id) {
                 $gefunden = true;
             }
         }
         if (!$gefunden) {
             $zuo = new StadtraetInReferat();
             $zuo->referat_id = $referat->id;
             $zuo->stadtraetIn_id = $str->id;
             $zuo->save();
             RISTools::send_email(Yii::app()->params['adminEmail'], "Neue ReferentInnen/Referat-Zuordnung", $referat_name . " / " . $str->name, null, "system");
         }
     }
 }
 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();
     }
 }
 /**
  * @param Dokument|null $dokument
  * @return string
  */
 public function getTitle($dokument = null)
 {
     if (count($this->krits) == 1) {
         switch ($this->krits[0]["typ"]) {
             case "betreff":
                 $such = $this->krits[0]["suchbegriff"];
                 if ($such[0] == "\"" && $such[strlen($such) - 1] == "\"") {
                     return "Dokumente mit " . $this->krits[0]["suchbegriff"] . " im Betreff";
                 }
                 return "Dokumente mit \"" . $such . "\" im Betreff";
             case "antrag_typ":
                 return "Dokumente des Typs \"" . Dokument::$TYPEN_ALLE[$this->krits[0]["suchbegriff"]] . "\"";
             case "volltext":
                 $such = $this->krits[0]["suchbegriff"];
                 if ($such[0] == "\"" && $such[strlen($such) - 1] == "\"") {
                     return "Volltextsuche nach " . $this->krits[0]["suchbegriff"];
                 }
                 return "Volltextsuche nach \"" . $such . "\"";
             case "ba":
                 /** @var Bezirksausschuss $ba */
                 $ba = Bezirksausschuss::model()->findByAttributes(["ba_nr" => $this->krits[0]["ba_nr"]]);
                 return "Bezirksausschuss " . $ba->ba_nr . ": " . $ba->name;
             case "geo":
                 $ort = OrtGeo::findClosest($this->krits[0]["lng"], $this->krits[0]["lat"]);
                 $title = "Dokumente mit Ortsbezug (ungefähr: " . IntVal($this->krits[0]["radius"]) . "m um \"" . $ort->ort . "\")";
                 if ($dokument) {
                     /** @var OrtGeo[] $gefundene_orte */
                     $gefundene_orte = [];
                     foreach ($dokument->orte as $dok_ort_ort) {
                         $dok_ort = $dok_ort_ort->ort;
                         $distance = RISGeo::getDistance($dok_ort->lat, $dok_ort->lon, $this->krits[0]["lat"], $this->krits[0]["lng"]);
                         if ($distance * 1000 <= $this->krits[0]["radius"]) {
                             $gefundene_orte[] = $dok_ort;
                         }
                     }
                     if (count($gefundene_orte) > 0) {
                         $namen = [];
                         foreach ($gefundene_orte as $gef_ort) {
                             $namen[] = $gef_ort->ort;
                         }
                         $title .= ": " . implode(", ", $namen);
                     }
                 }
                 return $title;
             case "referat":
                 /** @var Referat $ref */
                 $ref = Referat::model()->findByPk($this->krits[0]["referat_id"]);
                 return $ref->name;
                 break;
             case "antrag_wahlperiode":
                 return "Dokumente der Wahlperiode " . $this->krits[0]["suchbegriff"];
             case "antrag_nr":
                 return "Antrag Nr. " . str_replace("*", " ", $this->krits[0]["suchbegriff"]);
         }
     }
     if (count($this->krits) > 1) {
         $krits = [];
         foreach ($this->krits as $cr) {
             switch ($cr["typ"]) {
                 case "betreff":
                     $krits[] = "mit \"" . $cr["suchbegriff"] . "\" im Betreff";
                     break;
                 case "antrag_typ":
                     $krits[] = "vom Typ \"" . Dokument::$TYPEN_ALLE[$cr["suchbegriff"]] . "\"";
                     break;
                 case "volltext":
                     $krits[] = "mit dem Suchausdruck \"" . $cr["suchbegriff"] . "\"";
                     break;
                 case "ba":
                     /** @var Bezirksausschuss $ba */
                     $ba = Bezirksausschuss::model()->findByAttributes(["ba_nr" => $cr["ba_nr"]]);
                     $krits[] = "aus dem Bezirksausschuss " . $ba->ba_nr . ": " . $ba->name;
                     break;
                 case "geo":
                     $ort = OrtGeo::findClosest($cr["lng"], $cr["lat"]);
                     $krits[] = "mit einem Ortsbezug (ungefähr: " . IntVal($cr["radius"]) . "m um \"" . $ort->ort . "\")";
                     break;
                 case "antrag_nr":
                     $krits[] = "zum Antrag Nr. " . $cr["suchbegriff"];
                     break;
                 case "referat":
                     /** @var Referat $ref */
                     $ref = Referat::model()->findByPk($cr["referat_id"]);
                     $krits[] = "im Zuständigkeitsbereich des " . $ref->name;
                     break;
                 case "antrag_wahlperiode":
                     $krits[] = "aus der Wahlperiode " . CHtml::encode($cr["suchbegriff"]);
                     break;
                 default:
                     $krits[] = json_encode($cr);
             }
         }
         $text = "Dokumente ";
         for ($i = 0; $i < count($krits) - 1; $i++) {
             $text .= $krits[$i];
             if ($i < count($krits) - 2) {
                 $text .= ", ";
             }
         }
         $text .= " und " . $krits[count($krits) - 1];
         return $text;
     }
     return json_encode($this->krits);
 }
 /**
  * @param string $name
  * @return null|Referat
  */
 public static function getByHtmlName($name)
 {
     $name = trim(strip_tags($name));
     $ref = Referat::model()->findByAttributes(["name" => $name]);
     return $ref;
 }
 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();
     }
 }
Beispiel #6
0
					<?php 
}
?>
				</select>
			</div>
		</div>

		<div class="form-group">
			<label for="suche_referat" class="col-sm-3 control-label">Zuständiges Referat:</label>

			<div class="col-sm-9">
				<select id="suche_referat" name="referat" size="1" class="form-control">
					<option>- egal -</option>
					<?php 
/** @var Referat[] $referate */
$referate = Referat::model()->findAll();
foreach ($referate as $ref) {
    ?>
						<option value="<?php 
    echo $ref->id;
    ?>
"><?php 
    echo CHtml::encode($ref->name);
    ?>
</option>
					<?php 
}
?>
				</select>
			</div>
		</div>
 /**
  *
  */
 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($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();
     }
 }