codeformunich/Muenchen-Transparent

View on GitHub
protected/models/StadtraetIn.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

/**
 * @property integer $id
 * @property integer $referentIn
 * @property integer $benutzerIn_id
 * @property string $gewaehlt_am
 * @property string $bio
 * @property string $web
 * @property string $email
 * @property string $name
 * @property string $twitter
 * @property string $facebook
 * @property string $abgeordnetenwatch
 * @property string $geschlecht
 * @property string $kontaktdaten
 * @property string $geburtstag
 * @property string $beruf
 * @property string $beschreibung
 * @property string $quellen
 *
 * The followings are the available model relations:
 * @property Antrag[] $antraege
 * @property Person[] $personen
 * @property BenutzerIn
 * @property StadtraetInFraktion[] $stadtraetInnenFraktionen
 * @property StadtraetInGremium[] $mitgliedschaften
 * @property StadtraetInReferat[] $stadtraetInnenReferate
 */
class StadtraetIn extends CActiveRecord implements IRISItem
{
    public static $GESCHLECHTER = [
        "weiblich"  => "Weiblich",
        "maennlich" => "Männlich",
        "sonstiges" => "Beides passt nicht",
    ];


    /**
     * @return StadtraetIn the static model class
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'stadtraetInnen';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return [
            ['id, name, referentIn', 'required'],
            ['id, referentIn, benutzerIn_id', 'numerical', 'integerOnly' => true],
            ['web', 'length', 'max' => 250],
            ['name, email', 'length', 'max' => 100],
            ['twitter', 'length', 'max' => 45],
            ['facebook, abgeordnetenwatch', 'length', 'max' => 200],
            ['created, modified', 'safe'],
        ];
    }

    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return [
            'antraege'                 => [self::MANY_MANY, 'Antrag', 'antraege_stadtraetInnen(stadtraetIn_id, antrag_id)', 'order' => 'gestellt_am DESC'],
            'personen'                 => [self::HAS_MANY, 'Person', 'ris_stadtraetIn'],
            'stadtraetInnenFraktionen' => [self::HAS_MANY, 'StadtraetInFraktion', 'stadtraetIn_id', 'order' => 'wahlperiode DESC'],
            'mitgliedschaften'         => [self::HAS_MANY, 'StadtraetInGremium', 'stadtraetIn_id'],
            'stadtraetInnenReferate'   => [self::HAS_MANY, 'StadtraetInReferat', 'stadtraetIn_id'],
            'benutzerIn'               => [self::HAS_ONE, 'BenutzerIn', 'benutzerIn_id'],
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id'                => 'ID',
            'benutzerIn_id'     => 'BenutzerIn-ID',
            'gewaehlt_am'       => 'Gewaehlt Am',
            'bio'               => 'Bio',
            'web'               => 'Web',
            'email'             => 'E-Mail-Adresse',
            'name'              => 'Name',
            'twitter'           => 'Twitter',
            'facebook'          => 'Facebook',
            'abgeordnetenwatch' => 'Abgeordnetenwatch',
            'kontaktdaten'      => 'Kontaktdaten',
            'geburtstag'        => 'Geburtstag',
            'beruf'             => 'Beruf',
            'beschreibung'      => 'Beschreibung',
            'quellen'           => 'Quellen',
        ];
    }

    public function getLink(array $add_params = []): string
    {
        return Yii::app()->createUrl("personen/person", array_merge(["id" => $this->id, "name" => $this->getName()], $add_params));
    }


    public function getTypName(): string
    {
        return "Stadtratsmitglied";
    }

    private $titel_erraten    = null;
    private $vorname_erraten  = null;
    private $nachname_erraten = null;

    protected function errateNamen()
    {
        if ($this->vorname_erraten !== null) {
            return;
        }

        preg_match("/^(?<titel>([a-z]+\. )*)(?<name>.*)$/siu", $this->name, $matches);
        if (mb_strpos($this->name, ",") > 0) {
            $x = explode(",", $matches["name"]);
            if (count($x) == 2) {
                $this->vorname_erraten  = trim($x[1]);
                $this->nachname_erraten = trim($x[0]);
                $this->titel_erraten    = trim($matches["titel"]);
            } else {
                $this->vorname_erraten  = $this->name;
                $this->nachname_erraten = $this->titel_erraten = "";
            }
        } else {
            $x = explode(" ", $matches["name"]);
            if (count($x) > 1) {
                $this->nachname_erraten = array_pop($x);
                $this->vorname_erraten  = trim(implode(" ", $x));
                $this->titel_erraten    = trim($matches["titel"]);
            } else {
                $this->vorname_erraten  = $this->name;
                $this->nachname_erraten = $this->titel_erraten = "";
            }
        }
    }

    public function errateVorname(): string
    {
        $this->errateNamen();
        return $this->vorname_erraten;
    }

    public function errateNachname(): string
    {
        $this->errateNamen();
        return $this->nachname_erraten;
    }

    public function getName(bool $kurzfassung = false): string
    {
        if (mb_strpos($this->name, ",") > 0) {
            preg_match("/^(?<titel>([a-z]+\. )*)(?<name>.*)$/siu", $this->name, $matches);
            $titel = trim($matches["titel"]);
            if (strlen($titel) > 0) {
                $titel .= " ";
            }

            $x = explode(",", $matches["name"]);
            if (count($x) == 2) {
                $name = $x[1] . " " . $x[0];
            } else {
                $name = $this->name;
            }
            return $titel . trim($name);
        } else {
            return $this->name;
        }
    }

    /**
     * @param string $name1
     * @param string $name2
     * @return int
     */
    public static function sortByNameCmp($name1, $name2)
    {
        $name1 = preg_replace("/^([a-z]+\. )*/siu", "", $name1);
        $name2 = preg_replace("/^([a-z]+\. )*/siu", "", $name2);
        $name1 = str_replace(["Ä", "Ö", "Ü", "ä", "ö", "ü", "ß"], ["A", "O", "U", "a", "o", "u", "s"], $name1);
        $name2 = str_replace(["Ä", "Ö", "Ü", "ä", "Ö", "ü", "ß"], ["A", "O", "U", "a", "o", "u", "s"], $name2);
        return strnatcasecmp($name1, $name2);
    }

    /**
     * @param StadtraetIn[] $personen
     * @return StadtraetIn[];
     */
    public static function sortByName($personen)
    {
        usort($personen, function ($str1, $str2) {
            /** @var StadtraetIn $str1 */
            /** @var StadtraetIn $str2 */
            return StadtraetIn::sortByNameCmp($str1->getName(), $str2->getName());
        });
        return $personen;
    }

    public function getDate(): string
    {
        return "0000-00-00 00:00:00";
    }


    public function getSourceLink(): string
    {
        $istBAler = false;
        foreach ($this->stadtraetInnenFraktionen as $frakt) if ($frakt->fraktion->ba_nr > 0) $istBAler = true;
        if ($istBAler) {
            return RIS_BA_BASE_URL . "ba_mitglieder_details_mitgliedschaft.jsp?Id=" . $this->id . '&Wahlperiode=5666213';
        } else {
            return RIS_BASE_URL . "ris_mitglieder_detail.jsp?risid=" . $this->id . '&periodeid=5666210';
        }
    }

    /**
     *
     */
    private function overrideFraktionsMitgliedschaften()
    {
        if (isset(StadtraetInFraktionOverrides::$FRAKTION_ADD[$this->id])) {
            foreach (StadtraetInFraktionOverrides::$FRAKTION_ADD[$this->id] as $override) {
                $mitgliedschaft                  = new StadtraetInFraktion();
                $mitgliedschaft->stadtraetIn_id  = $this->id;
                $mitgliedschaft->fraktion_id     = $override["fraktion_id"];
                $mitgliedschaft->datum_von       = $override["datum_von"];
                $mitgliedschaft->datum_bis       = $override["datum_bis"];
                $mitgliedschaft->wahlperiode     = $override["wahlperiode"];
                $this->stadtraetInnenFraktionen = array_merge([$mitgliedschaft], $this->stadtraetInnenFraktionen);
            }
        }
        if (isset(StadtraetInFraktionOverrides::$FRAKTION_DEL[$this->id])) {
            $fraktionen_neu = [];
            foreach ($this->stadtraetInnenFraktionen as $mitgliedschaft) {
                $todel = false;
                foreach (StadtraetInFraktionOverrides::$FRAKTION_DEL[$this->id] as $override) {
                    if ($override["datum_von"] == $mitgliedschaft->datum_von && $override["fraktion_id"] == $mitgliedschaft->fraktion_id) {
                        $todel = true;
                    }
                }
                if (!$todel) {
                    $fraktionen_neu[] = $mitgliedschaft;
                }
            }
            $this->stadtraetInnenFraktionen = $fraktionen_neu;
        }
    }

    /**
     * @param string $datum
     * @param int|null $ba_nr
     * @return StadtraetIn[]
     */
    public static function getByFraktion($datum, $ba_nr)
    {
        if ($ba_nr === null) {
            $ba_where = "c.ba_nr IS NULL";
        } else {
            $ba_where = "c.ba_nr = " . IntVal($ba_nr);
        }

        /** @var StadtraetIn[] $strs_in */
        $strs_in = StadtraetIn::model()->findAll([
            'alias' => 'a',
            'order' => 'a.name ASC',
            'with'  => [
                'stadtraetInnenFraktionen'          => [
                    'alias'     => 'b',
                    'condition' => 'b.datum_von <= "' . addslashes($datum) . '" AND (b.datum_bis IS NULL OR b.datum_bis >= "' . addslashes($datum) . '")',
                ],
                'stadtraetInnenFraktionen.fraktion' => [
                    'alias'     => 'c',
                    'condition' => $ba_where,
                ]
            ]
        ]);

        foreach ($strs_in as $key => $strIn) $strIn->overrideFraktionsMitgliedschaften();

        /** @var StadtraetIn[] $strs_out */
        $strs_out = [];
        foreach ($strs_in as $strs) {
            if ($strs->id == 3425214) {
                continue;
            } // Seltsamer ristestuser RIS_BASE_URL . "ris_mitglieder_detail_fraktion.jsp?risid=3425214&periodeid=null o_O
            $strs_out[] = $strs;
        }
        return $strs_out;
    }

    /**
     * @param string $datum
     * @param int|null $ba_nr
     * @return array[]
     */
    public static function getGroupedByFraktion($datum, $ba_nr)
    {
        $strs       = static::getByFraktion($datum, $ba_nr);
        $fraktionen = [];
        foreach ($strs as $str) {
            if (count($str->stadtraetInnenFraktionen) == 0) {
                continue;
            }
            if (!isset($fraktionen[$str->stadtraetInnenFraktionen[0]->fraktion_id])) {
                $fraktionen[$str->stadtraetInnenFraktionen[0]->fraktion_id] = [];
            }
            $fraktionen[$str->stadtraetInnenFraktionen[0]->fraktion_id][] = $str;
        }
        return $fraktionen;
    }

    /**
     * @return StadtraetInFraktion[]
     */
    public function getFraktionsMitgliedschaften()
    {
        $this->overrideFraktionsMitgliedschaften();
        return $this->stadtraetInnenFraktionen;
    }

    public function getAllSearchNames() {
        $names = [$this->getName()];
        if (isset(StadtraetInOverrides::$PERSON_ADDITIONAL_NAMES[$this->id])) {
            $names = array_merge($names, StadtraetInOverrides::$PERSON_ADDITIONAL_NAMES[$this->id]);
        }
        return $names;
    }

    /**
     * @return \Solarium\QueryType\Select\Result\Result
     */
    public function getDocumentMentions() {
        $solr   = RISSolrHelper::getSolrClient();
        $select = $solr->createSelect();

        $dismax = $select->getDisMax();
        $dismax->setQueryParser('edismax');
        $dismax->setQueryFields("text text_ocr");

        $names = array_map(function($name) {
            return "\"" . $name . "\"";
        }, $this->getAllSearchNames());
        $select->setQuery(implode(" OR ", $names));

        $select->setRows(50);
        $select->addSort('sort_datum', $select::SORT_DESC);

        $hl = $select->getHighlighting();
        $hl->setFields(['text', 'text_ocr', 'antrag_betreff']);
        $hl->setSimplePrefix('<b>');
        $hl->setSimplePostfix('</b>');

        return $solr->select($select);
    }
}