codeformunich/Muenchen-Transparent

View on GitHub
protected/RISParser/StadtraetInnenParser.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

class StadtraetInnenParser extends RISParser
{
    private BrowserBasedDowloader $browserBasedDowloader;
    private CurlBasedDownloader $curlBasedDownloader;

    private bool $antraege_alle = false;

    public function __construct(?BrowserBasedDowloader $browserBasedDowloader = null, ?CurlBasedDownloader $curlBasedDownloader = null)
    {
        $this->browserBasedDowloader = $browserBasedDowloader ?: new BrowserBasedDowloader();
        $this->curlBasedDownloader = $curlBasedDownloader ?: new CurlBasedDownloader();
    }

    public function setParseAlleAntraege(bool $set): void
    {
        $this->antraege_alle = $set;
    }

    public function parse_antraege($stadtraetIn_id, $seite)
    {
        $antr_text = RISTools::load_file(RIS_BASE_URL . "ris_antrag_trefferliste.jsp?nav=2&selWahlperiode=0&steller=$stadtraetIn_id&txtPosition=" . ($seite * 10));

        preg_match_all("/ris_antrag_detail\.jsp\?risid=(?<antrag_id>[0-9]+)[\"'& ]/siU", $antr_text, $matches);
        foreach ($matches["antrag_id"] as $antrag_id) try {
            Yii::app()->db->createCommand()->insert("antraege_stadtraetInnen", ["antrag_id" => $antrag_id, "stadtraetIn_id" => $stadtraetIn_id, "gefunden_am" => new CDbExpression("NOW()")]);
        } catch (Exception $e) {
        }
    }

    public function parse(int $id): StadtraetIn
    {
        if (SITE_CALL_MODE != "cron") echo "- StadträtIn $id\n";

        $htmlFraktionen = $this->curlBasedDownloader->loadUrl(RIS_URL_PREFIX . 'person/detail/' . $id . '?tab=fraktionen');
        $htmlAusschuesse = $this->curlBasedDownloader->loadUrl(RIS_URL_PREFIX . 'person/detail/' . $id . '?tab=strausschuesse');

        $parsed = StadtraetInnenData::parseFromHtml($htmlFraktionen, $htmlAusschuesse);

        $daten = new StadtraetIn();
        $daten->id = $id;
        $daten->referentIn = 0;
        $daten->beruf = '';
        $daten->beschreibung = '';
        $daten->quellen = '';
        $daten->name = $parsed->name;
        $daten->gewaehlt_am = $parsed->gewaehltAm?->format('Y-m-d');
        $daten->bio = $parsed->lebenslauf ?? '';

        $aenderungen = "";

        /** @var StadtraetIn $alter_eintrag */
        $alter_eintrag = StadtraetIn::model()->findByPk($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");
            }
        }

        foreach ($parsed->fraktionsMitgliedschaften as $fraktionMitgliedschaft) {
            $str_fraktion = new StadtraetInFraktion();
            $str_fraktion->datum_von = $fraktionMitgliedschaft->seit?->format('Y-m-d');
            $str_fraktion->datum_bis = $fraktionMitgliedschaft->bis?->format('Y-m-d');
            $str_fraktion->fraktion_id    = $fraktionMitgliedschaft->gremiumId;
            $str_fraktion->stadtraetIn_id = $id;
            $str_fraktion->wahlperiode    = $fraktionMitgliedschaft->wahlperiode;
            $str_fraktion->funktion       = $fraktionMitgliedschaft->funktion;
            $str_fraktion->mitgliedschaft = null;

            /** @var array|StadtraetInFraktion[] $bisherige_fraktionen */
            $bisherige_fraktionen = StadtraetInFraktion::model()->findAllByAttributes(["stadtraetIn_id" => $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 != $fraktionMitgliedschaft->wahlperiode) $aenderungen .= "Neue Wahlperiode: " . $bisherige->wahlperiode . " => " . $fraktionMitgliedschaft->wahlperiode . "\n";
                if ($bisherige->funktion != $fraktionMitgliedschaft->funktion) $aenderungen .= "Neue Funktion in der Fraktion: " . $bisherige->funktion . " => " . $fraktionMitgliedschaft->funktion . "\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 $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();
        }

        /*
         * @TODO
        if ($this->antraege_alle) {
            $text = RISTools::load_file(RIS_BASE_URL . "ris_antrag_trefferliste.jsp?nav=2&selWahlperiode=0&steller=$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($id, $i);
            } else if (SITE_CALL_MODE != "cron") echo "Keine Anträge gefunden\n";
        } else for ($i = 0; $i < 2; $i++) {
            $this->parse_antraege($id, $i);
        }
        */

        return $daten;
    }


    public function parseAll(): void
    {
        $html = $this->browserBasedDowloader->downloadPersonList(BrowserBasedDowloader::PERSON_TYPE_STADTRAT);
        $entries = StadtraetInnenListEntry::parseHtmlList($html);

        echo count($entries) . " Stadtratsmitglieder gefunden\n";

        foreach ($entries as $entry) {
            $this->parse($entry->id);
        }
    }

    public function parseUpdate(): void
    {
        echo "Updates: StadträtInnen\n";
        $this->parseAll();
    }

    public function parseQuickUpdate(): void
    {

    }
}