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(" ", " ", $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] != " ") { switch ($matches[1][$i]) { case "Zustä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.*>.* (.*)<\\/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] != " ") { switch ($matches[2][$i]) { case "Typ:": $daten->antrag_typ = $matches[4][$i]; break; case "Zustä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ä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] != " ") { $daten->initiatorInnen = $matches[4][$i]; } break; case "Erledigt am:": if ($matches[4][$i] != " ") { $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(); } }
<?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\\.: ([^<]*)</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] != " ") { switch ($matches[2][$i]) { case "Typ:": $daten->antrag_typ = $matches[5][$i]; break; case "Zustä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ä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] != " ") { $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(); } }