public function parse($fraktion_id, $wahlperiode_id) { $fraktion_id = IntVal($fraktion_id); $wahlperiode_id = IntVal($wahlperiode_id); if (SITE_CALL_MODE != "cron") { echo "- Fraktion {$fraktion_id}\n"; } $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_fraktionen_detail.jsp?risid={$fraktion_id}&periodeid={$wahlperiode_id}"); $daten = new Fraktion(); $daten->id = $fraktion_id; if (preg_match("/introheadline\">(.*)<\\/h3/siU", $html_details, $matches)) { var_dump($matches); $daten->name = trim(str_replace(" ", " ", $matches[1])); } $aenderungen = ""; /** @var Fraktion $alter_eintrag */ $alter_eintrag = Fraktion::model()->findByPk($fraktion_id); $changed = true; if ($alter_eintrag) { $changed = false; if ($alter_eintrag->name != $daten->name) { $aenderungen .= "Name: " . $alter_eintrag->name . " => " . $daten->name . "\n"; } if ($aenderungen != "") { $changed = true; } } if ($changed) { if ($aenderungen == "") { $aenderungen = "Neu angelegt\n"; } } if ($alter_eintrag) { $alter_eintrag->setAttributes($daten->getAttributes(), false); if (!$alter_eintrag->save()) { echo "Fraktion 1\n"; var_dump($alter_eintrag->getErrors()); die("Fehler"); } $daten = $alter_eintrag; } else { if (!$daten->save()) { echo "Fraktion 2\n"; var_dump($daten->getErrors()); die("Fehler"); } } if ($aenderungen != "") { echo "Fraktion {$fraktion_id}: Verändert: " . $aenderungen . "\n"; } if ($aenderungen != "") { $aend = new RISAenderung(); $aend->ris_id = $daten->id; $aend->ba_nr = null; $aend->typ = RISAenderung::$TYP_STADTRAT_FRAKTION; $aend->datum = new CDbExpression("NOW()"); $aend->aenderungen = $aenderungen; $aend->save(); } }
public function actionFeed() { if (isset($_REQUEST["krit_typ"])) { $krits = RISSucheKrits::createFromUrl($_REQUEST); $titel = Yii::app()->params['projectTitle'] . ': ' . $krits->getTitle(); $solr = RISSolrHelper::getSolrClient("ris"); $select = $solr->createSelect(); $krits->addKritsToSolr($select); $select->setRows(100); $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>'); $ergebnisse = $solr->execute($select); $data = RISSolrHelper::ergebnisse2FeedData($ergebnisse); } else { $data = []; /** @var array|RISAenderung[] $aenderungen */ $aenderungen = RISAenderung::model()->findAll(["order" => "id DESC", "limit" => 100]); foreach ($aenderungen as $aenderung) { $data[] = $aenderung->toFeedData(); } $titel = Yii::app()->params['projectTitle'] . ' Änderungen'; } $this->render("feed", ["feed_title" => $titel, "feed_description" => $titel, "data" => $data]); }
/** * @param Solarium\QueryType\Update\Query\Query $update */ private function solrIndex_antrag_do($update) { if (!$this->antrag) { return; } $max_datum = ""; /** @var RISSolrDocument $doc */ $doc = $update->createDocument(); $doc->id = "Document:" . $this->id; $doc->text = RISSolrHelper::string_cleanup(RISTools::korrigiereTitelZeichen($this->antrag->betreff) . " " . $this->text_pdf); $doc->text_ocr = RISSolrHelper::string_cleanup($this->text_ocr_corrected); $doc->dokument_name = RISSolrHelper::string_cleanup($this->name); $doc->dokument_url = $this->url; $doc->antrag_nr = $this->antrag->antrags_nr; $doc->antrag_wahlperiode = $this->antrag->wahlperiode; $doc->antrag_typ = $this->antrag->typ; $doc->antrag_ba = $this->antrag->ba_nr; $doc->antrag_id = $this->antrag->id; $doc->antrag_betreff = RISSolrHelper::string_cleanup($this->antrag->betreff); $doc->referat_id = $this->antrag->referat_id; $antrag_erstellt = $aenderungs_datum = []; if (preg_match("/^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}\$/", $this->antrag->gestellt_am)) { $antrag_erstellt[] = RISSolrHelper::mysql2solrDate($this->antrag->gestellt_am . " 12:00:00"); $aenderungs_datum[] = RISSolrHelper::mysql2solrDate($this->antrag->gestellt_am . " 12:00:00"); $max_datum = $this->antrag->gestellt_am . " 12:00:00"; } $geo = []; $dokument_bas = []; $dokument_bas[] = $this->antrag->ba_nr > 0 ? $this->antrag->ba_nr : 0; foreach ($this->orte as $ort) { if ($ort->ort->to_hide == 0) { $geo[] = $ort->ort->lat . "," . $ort->ort->lon; if ($ort->ort->ba_nr > 0 && !in_array($ort->ort->ba_nr, $dokument_bas)) { $dokument_bas[] = $ort->ort->ba_nr; } } } $doc->geo = $geo; $doc->dokument_bas = $dokument_bas; /** @var array|RISAenderung[] $aenderungen */ $aenderungen = RISAenderung::model()->findAllByAttributes(["ris_id" => $this->antrag_id], ["order" => "datum DESC"]); foreach ($aenderungen as $o) { $aenderungs_datum[] = RISSolrHelper::mysql2solrDate($o->datum); $max_datum = $o->datum; } $doc->antrag_erstellt = $antrag_erstellt; $doc->aenderungs_datum = $aenderungs_datum; $doc->antrag_gestellt_von = RISSolrHelper::string_cleanup($this->antrag->gestellt_von . " " . $this->antrag->initiatorInnen); if ($max_datum != "") { $doc->sort_datum = RISSolrHelper::mysql2solrDate($max_datum); } $update->addDocuments([$doc]); }
public static function parse_stadtrat_gremien($ris_id) { $ris_id = IntVal($ris_id); echo "- Gremium {$ris_id}\n"; $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_gremien_detail.jsp?risid=" . $ris_id); $daten = new Gremium(); $daten->id = $ris_id; $daten->datum_letzte_aenderung = new CDbExpression('NOW()'); $daten->ba_nr = null; if (preg_match("/introheadline\">([^>]+)<\\/h3/siU", $html_details, $matches)) { $daten->name = $matches[1]; } if (preg_match("/rzel:.*detail_div\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->kuerzel = $matches[1]; } if (preg_match("/Gremientyp:.*detail_div\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->gremientyp = $matches[1]; } if (preg_match("/Referat:.*detail_div\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->referat = $matches[1]; } foreach ($daten as $key => $val) { $daten[$key] = $val === null ? null : html_entity_decode(trim($val), ENT_COMPAT, "UTF-8"); } $aenderungen = ""; /** @var Gremium $alter_eintrag */ $alter_eintrag = Gremium::model()->findByPk($ris_id); $changed = true; if ($alter_eintrag) { $changed = false; if ($alter_eintrag->name != $daten->name) { $aenderungen .= "Name: " . $alter_eintrag->name . " => " . $daten->name . "\n"; } if ($alter_eintrag->kuerzel != $daten->kuerzel) { $aenderungen .= "Kürzel: " . $alter_eintrag->kuerzel . " => " . $daten->kuerzel . "\n"; } if ($alter_eintrag->gremientyp != $daten->gremientyp) { $aenderungen .= "Gremientyp: " . $alter_eintrag->gremientyp . " => " . $daten->gremientyp . "\n"; } if ($alter_eintrag->referat != $daten->referat) { $aenderungen .= "Referat: " . $alter_eintrag->referat . " => " . $daten->referat . "\n"; } if ($aenderungen != "") { $changed = true; } } if ($changed) { if ($alter_eintrag) { $alter_eintrag->copyToHistory(); $alter_eintrag->setAttributes($daten->getAttributes()); if (!$alter_eintrag->save()) { echo "Gremium 1"; var_dump($alter_eintrag->getErrors()); die("Fehler"); } $daten = $alter_eintrag; } else { if (!$daten->save()) { echo "Gremium 2"; var_dump($daten->getErrors()); die("Fehler"); } } $aend = new RISAenderung(); $aend->ris_id = $daten->id; $aend->ba_nr = null; $aend->typ = RISAenderung::$TYP_STADTRAT_GREMIUM; $aend->datum = new CDbExpression("NOW()"); $aend->aenderungen = $aenderungen; $aend->save(); } }
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] != " ") { switch ($matches[1][$i]) { case "Zustä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 parse($stadtraetIn_id) { $stadtraetIn_id = IntVal($stadtraetIn_id); if (SITE_CALL_MODE != "cron") { echo "- StadträtIn {$stadtraetIn_id}\n"; } $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_mitglieder_detail_fraktion.jsp?risid={$stadtraetIn_id}"); $daten = new StadtraetIn(); $daten->id = $stadtraetIn_id; $daten->referentIn = 0; if (preg_match("/introheadline\">(.*)<\\/h3/siU", $html_details, $matches)) { $daten->name = trim(str_replace(" ", " ", $matches[1])); } if (preg_match("/Gewählt am:.*detail_div\">([0-9\\.]+)<\\/div/siU", $html_details, $matches)) { $x = explode(".", $matches[1]); $daten->gewaehlt_am = $x[2] . "-" . $x[1] . "-" . $x[0]; } if (preg_match("/Lebenslauf.*detail_div\">(.*)<\\/di/siU", $html_details, $matches)) { $daten->bio = str_replace("<br />", "", $matches[1]); } $aenderungen = ""; /** @var StadtraetIn $alter_eintrag */ $alter_eintrag = StadtraetIn::model()->findByPk($stadtraetIn_id); $changed = true; if ($alter_eintrag) { $changed = false; if ($alter_eintrag->name != $daten->name) { $aenderungen .= "Name: " . $alter_eintrag->name . " => " . $daten->name . "\n"; } if ($alter_eintrag->gewaehlt_am != $daten->gewaehlt_am) { $aenderungen .= "Gewählt am: " . $alter_eintrag->gewaehlt_am . " => " . $daten->gewaehlt_am . "\n"; } if ($alter_eintrag->bio != $daten->bio) { $aenderungen .= "Biografie: " . $alter_eintrag->bio . " => " . $daten->bio . "\n"; } if ($aenderungen != "") { $changed = true; } $daten->web = $alter_eintrag->web; $daten->twitter = $alter_eintrag->twitter; $daten->facebook = $alter_eintrag->facebook; $daten->abgeordnetenwatch = $alter_eintrag->abgeordnetenwatch; $daten->quellen = $alter_eintrag->quellen; $daten->geburtstag = $alter_eintrag->geburtstag; $daten->geschlecht = $alter_eintrag->geschlecht; $daten->beschreibung = $alter_eintrag->beschreibung; $daten->beruf = $alter_eintrag->beruf; $daten->kontaktdaten = $alter_eintrag->kontaktdaten; } if ($changed) { if ($aenderungen == "") { $aenderungen = "Neu angelegt\n"; } } if ($alter_eintrag) { $alter_eintrag->setAttributes($daten->getAttributes(), false); if (!$alter_eintrag->save()) { echo "StadträtInnen 1\n"; var_dump($alter_eintrag->getErrors()); die("Fehler"); } $daten = $alter_eintrag; } else { if (!$daten->save()) { echo "StadträtInnen 2\n"; var_dump($daten->getErrors()); die("Fehler"); } } $unten = explode("Tabellarische Übersicht der Zugehörigkei", $html_details); $unten = $unten[1]; preg_match_all("/ris_fraktionen_detail\\.jsp\\?risid=(?<fraktion_id>[0-9]+)&periodeid=(?<wahlperiode>[0-9]+)[\"'& ].*tdborder\">(?<mitgliedschaft>[^<]*)<\\/td>.*Funktion[^>]*>(?<funktion>[^<]*) *<.*<\\/tr/siU", $unten, $matches); for ($i = 0; $i < count($matches[1]); $i++) { $str_fraktion = new StadtraetInFraktion(); if (preg_match("/^von (?<von_tag>[0-9]+)\\.(?<von_monat>[0-9]+)\\.(?<von_jahr>[0-9]+) bis (?<bis_tag>[0-9]+)\\.(?<bis_monat>[0-9]+)\\.(?<bis_jahr>[0-9]+)\$/", $matches[3][$i], $mitgliedschaft_matches)) { $str_fraktion->datum_von = $mitgliedschaft_matches["von_jahr"] . "-" . $mitgliedschaft_matches["von_monat"] . "-" . $mitgliedschaft_matches["von_tag"]; $str_fraktion->datum_bis = $mitgliedschaft_matches["bis_jahr"] . "-" . $mitgliedschaft_matches["bis_monat"] . "-" . $mitgliedschaft_matches["bis_tag"]; } elseif (preg_match("/^seit (?<von_tag>[0-9]+)\\.(?<von_monat>[0-9]+)\\.(?<von_jahr>[0-9]+)\$/", $matches[3][$i], $mitgliedschaft_matches)) { $str_fraktion->datum_von = $mitgliedschaft_matches["von_jahr"] . "-" . $mitgliedschaft_matches["von_monat"] . "-" . $mitgliedschaft_matches["von_tag"]; $str_fraktion->datum_bis = null; } $str_fraktion->fraktion_id = $matches["fraktion_id"][$i]; $str_fraktion->stadtraetIn_id = $stadtraetIn_id; $str_fraktion->wahlperiode = $matches["wahlperiode"][$i]; $str_fraktion->funktion = $matches["funktion"][$i]; $str_fraktion->mitgliedschaft = $matches["mitgliedschaft"][$i]; /** @var array|StadtraetInFraktion[] $bisherige_fraktionen */ $bisherige_fraktionen = StadtraetInFraktion::model()->findAllByAttributes(["stadtraetIn_id" => $stadtraetIn_id]); /** @var null|StadtraetInFraktion $bisherige */ $bisherige = null; foreach ($bisherige_fraktionen as $fr) { if ($fr->fraktion_id == $str_fraktion->fraktion_id && $fr->wahlperiode == $str_fraktion->wahlperiode && $fr->funktion == $str_fraktion->funktion) { $bisherige = $fr; } } if ($bisherige === null) { $fraktion = Fraktion::model()->findByPk($str_fraktion->fraktion_id); if (is_null($fraktion)) { $frakt_parser = new StadtratsfraktionParser(); $frakt_parser->parse($str_fraktion->fraktion_id, $str_fraktion->wahlperiode); } $str_fraktion->save(); $aenderungen = "Neue Fraktionszugehörigkeit: " . $str_fraktion->fraktion->name . "\n"; } else { if ($bisherige->wahlperiode != $matches["wahlperiode"][$i]) { $aenderungen .= "Neue Wahlperiode: " . $bisherige->wahlperiode . " => " . $matches["wahlperiode"][$i] . "\n"; } if ($bisherige->funktion != $matches["funktion"][$i]) { $aenderungen .= "Neue Funktion in der Fraktion: " . $bisherige->funktion . " => " . $matches["funktion"][$i] . "\n"; } if ($bisherige->mitgliedschaft != $matches["mitgliedschaft"][$i]) { $aenderungen .= "Mitgliedschaft in der Fraktion: " . $bisherige->mitgliedschaft . " => " . $matches["mitgliedschaft"][$i] . "\n"; } if ($bisherige->datum_von != $str_fraktion->datum_von) { $aenderungen .= "Fraktionsmitgliedschaft Start: " . $bisherige->datum_von . " => " . $str_fraktion->datum_von . "\n"; } if ($bisherige->datum_bis != $str_fraktion->datum_bis) { $aenderungen .= "Fraktionsmitgliedschaft Ende: " . $bisherige->datum_bis . " => " . $str_fraktion->datum_bis . "\n"; } $bisherige->setAttributes($str_fraktion->getAttributes()); $bisherige->save(); } } if ($aenderungen != "") { echo "StadträtIn {$stadtraetIn_id}: Verändert: " . $aenderungen . "\n"; } if ($aenderungen != "") { $aend = new RISAenderung(); $aend->ris_id = $daten->id; $aend->ba_nr = null; $aend->typ = RISAenderung::$TYP_STADTRAETIN; $aend->datum = new CDbExpression("NOW()"); $aend->aenderungen = $aenderungen; $aend->save(); } if ($this->antraege_alle) { $text = RISTools::load_file("http://www.ris-muenchen.de/RII/RII/ris_antrag_trefferliste.jsp?nav=2&selWahlperiode=0&steller={$stadtraetIn_id}&txtPosition=0"); if (preg_match("/Suchergebnisse:.* ([0-9]+)<\\/p>/siU", $text, $matches)) { $seiten = Ceil($matches[1] / 10); for ($i = 0; $i < $seiten; $i++) { $this->parse_antraege($stadtraetIn_id, $i); } } else { if (SITE_CALL_MODE != "cron") { echo "Keine Anträge gefunden\n"; } } } else { for ($i = 0; $i < 2; $i++) { $this->parse_antraege($stadtraetIn_id, $i); } } }
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(); } }
public function parse($gremien_id, $wahlperiode_id = 0) { $wahlperiode_id = IntVal($wahlperiode_id > 0 ? $wahlperiode_id : static::$WAHLPERIODE_ID); $gremien_id = IntVal($gremien_id); if (SITE_CALL_MODE != "cron") { echo "- Gremium {$gremien_id}\n"; } $html_details = RISTools::load_file("http://www.ris-muenchen.de/RII/BA-RII/ba_gremien_details.jsp?Id=" . $gremien_id . "&Wahlperiode=" . $wahlperiode_id); $daten = new Gremium(); $daten->id = $gremien_id; $daten->datum_letzte_aenderung = new CDbExpression('NOW()'); if (preg_match("/introheadline\">([^>]+)<\\/h3/siU", $html_details, $matches)) { $daten->name = trim($matches[1]); } if (preg_match("/<a href=\"ba_bezirksausschuesse_details[^>]+>(?<ba>[0-9]+ )/siU", $html_details, $matches)) { $daten->ba_nr = trim($matches["ba"]); } if (preg_match("/rzel:.*detail_div\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->kuerzel = trim($matches[1]); } if (preg_match("/Gremiumtyp:.*detail_div\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->gremientyp = $matches[1]; } $aenderungen = ""; foreach ($daten as $key => $val) { $daten[$key] = $val === null ? null : html_entity_decode(trim($val), ENT_COMPAT, "UTF-8"); } /** @var Gremium $alter_eintrag */ $alter_eintrag = Gremium::model()->findByPk($gremien_id); if ($alter_eintrag) { $changed = false; if ($alter_eintrag->name != $daten->name) { $aenderungen .= "Name: " . $alter_eintrag->name . " => " . $daten->name . "\n"; } if ($alter_eintrag->ba_nr != $daten->ba_nr) { $aenderungen .= "BA: " . $alter_eintrag->ba_nr . " => " . $daten->ba_nr . "\n"; } if ($alter_eintrag->kuerzel != $daten->kuerzel) { $aenderungen .= "Kürzel: " . $alter_eintrag->kuerzel . " => " . $daten->kuerzel . "\n"; } if ($alter_eintrag->gremientyp != $daten->gremientyp) { $aenderungen .= "Gremientyp: " . $alter_eintrag->gremientyp . " => " . $daten->gremientyp . "\n"; } if ($aenderungen != "") { $changed = true; } } else { $aenderungen = "Neu angelegt\n"; $changed = true; } if ($changed) { if ($alter_eintrag) { $alter_eintrag->copyToHistory(); $alter_eintrag->setAttributes($daten->getAttributes()); if (!$alter_eintrag->save()) { echo "Gremium 3"; var_dump($alter_eintrag->getErrors()); die("Fehler"); } $daten = $alter_eintrag; } else { if (!$daten->save()) { echo "Gremium 4"; var_dump($daten->getErrors()); die("Fehler"); } } } /** @var StadtraetInGremium[] $mitglieder_pre */ $mitglieder_pre = []; if ($alter_eintrag) { foreach ($alter_eintrag->mitgliedschaften as $mitgliedschaft) { $mitglieder_pre[$mitgliedschaft->stadtraetIn_id] = $mitgliedschaft; } } $mitglieder_post = []; preg_match_all("/ergebnistab_tr.*<\\/tr/siU", $html_details, $matches); foreach ($matches[0] as $str) { preg_match("/<a[^>]*Id=(?<id>[0-9]+)&[^>]*>(?<name>[^<]*)<\\/a>.*<td[^>]*>(?<partei>[^<]*)<\\/td.*<td[^>]*>(?<datum>[^<]*)<\\/td.*<td[^>]*>(?<funktion>[^<]*)<\\/td/siU", $str, $match2); if ($match2) { /** @var StadtraetIn $stadtraetIn */ $stadtraetIn = StadtraetIn::model()->findByPk($match2["id"]); if (!$stadtraetIn) { $par = new BAMitgliederParser(); $kuerzel = preg_replace("/^ua ?/siu", "", $daten->kuerzel); $par->parse(IntVal($kuerzel)); $stadtraetIn = StadtraetIn::model()->findByPk($match2["id"]); if (!$stadtraetIn) { $name = trim(str_replace([" ", "Herr", "Frau"], [" ", " ", " "], $match2["name"])); $stadtraetIn = StadtraetIn::model()->findByAttributes(["name" => $name]); if (!$stadtraetIn) { RISTools::send_email(Yii::app()->params['adminEmail'], "BA-Gremium nicht zuordbar", "Gremium: {$gremien_id}\nMitglieds-ID: " . $match2["id"], null, "system"); return; } } } $datum = trim(str_ireplace("von ", "", $match2["datum"])); $datum = str_replace("seit ", "", $datum); $datum = explode(" bis ", $datum); $x = explode(".", $datum[0]); $datum_von = $x[2] . "-" . $x[1] . "-" . $x[0]; if (count($datum) == 2) { $x = explode(".", $datum[1]); $datum_bis = $x[2] . "-" . $x[1] . "-" . $x[0]; } else { $datum_bis = null; } if (isset($mitglieder_pre[$stadtraetIn->id])) { $mitgliedschaft = $mitglieder_pre[$stadtraetIn->id]; if ($mitgliedschaft->datum_von != $datum_von || $mitgliedschaft->datum_bis != $datum_bis) { $mitgliedschaft->funktion = $match2["funktion"]; $aenderungen .= "Mitgliedschaft von " . $mitgliedschaft->stadtraetIn->name . ": "; $aenderungen .= $mitgliedschaft->datum_von . "/" . $mitgliedschaft->datum_bis . " => "; $aenderungen .= $datum_von . "/" . $datum_bis . "\n"; $mitgliedschaft->datum_von = $datum_von; $mitgliedschaft->datum_bis = $datum_bis; $mitgliedschaft->save(); } if ($mitgliedschaft->funktion != $match2["funktion"]) { $mitgliedschaft->funktion = $match2["funktion"]; $aenderungen .= "Funktion von " . $mitgliedschaft->stadtraetIn->name . ": " . $mitgliedschaft->funktion . " => " . $match2["funktion"] . "\n"; $mitgliedschaft->save(); } } else { $mitgliedschaft = new StadtraetInGremium(); $mitgliedschaft->datum_von = $datum_von; $mitgliedschaft->datum_bis = $datum_bis; $mitgliedschaft->funktion = trim($match2["funktion"]); $mitgliedschaft->gremium_id = $gremien_id; $mitgliedschaft->stadtraetIn_id = $stadtraetIn->id; $mitgliedschaft->save(); $mitgliedschaft->refresh(); $aenderungen .= "Neues Mitglied: " . $mitgliedschaft->stadtraetIn->name . "\n"; } $mitglieder_post[$stadtraetIn->id] = $mitgliedschaft; } } foreach ($mitglieder_pre as $strIn_id => $mitgliedschaft_pre) { if (!isset($mitglieder_post[$strIn_id])) { $aenderungen .= "Mitglied nicht mehr dabei: " . $strIn_id . " - " . $mitgliedschaft_pre->stadtraetIn->getName() . "\n"; $mitgliedschaft_pre->delete(); } } if ($aenderungen != "") { echo $aenderungen . "\n"; $aend = new RISAenderung(); $aend->ris_id = $daten->id; $aend->ba_nr = null; $aend->typ = RISAenderung::$TYP_BA_GREMIUM; $aend->datum = new CDbExpression("NOW()"); $aend->aenderungen = $aenderungen; $aend->save(); } }
/** * @param int $von_ts * @param int $bis_ts * @return RISAenderung[] */ public function findeAenderungen($von_ts, $bis_ts = 0) { /** @var RISAenderung[] $aenderungen */ $aenderungen = RISAenderung::model()->findAllByAttributes(["typ" => $this->typ, "ris_id" => $this->id]); foreach ($aenderungen as $ae) { // @TODO var_dump($ae->getAttributes()); } }
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\\.]+)|( )))<\\/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 == " ") { 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(" ", " ", $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(" ", " ", $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 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(); } }
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(); } }
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(" ", "", $matches[1])); } if (preg_match("/Sitzungsstand:.*detail_div\">([^<]*)[<]/siU", $html_details, $matches)) { $sitzungsort_gefunden = true; $daten->sitzungsstand = trim(str_replace(" ", "", $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(" ", "", $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(" ", "", $matches[1])); } if (preg_match("/Wahlperiode:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->wahlperiode = trim(str_replace(" ", "", $matches[1])); } if (preg_match("/Status:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->status = trim(str_replace(" ", "", $matches[1])); } if (preg_match("/diges Referat:.*detail_div_left_long\">(<a[^>]+>)?([^>]*)<\\//siU", $html_details, $matches)) { $daten->referat = trim(str_replace(" ", "", $matches[2])); } if (preg_match("/Referent\\/in:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->referent = trim(str_replace(" ", "", $matches[1])); } if (preg_match("/Vorsitz:.*detail_div_left_long\">([^>]*)<\\//siU", $html_details, $matches)) { $daten->vorsitz = trim(str_replace(" ", "", $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([" ", "<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(" ", " ", $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(" ", " ", $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(); } }