<?php

/* class user */


class user
{

    var $userId;
    var $abgleichid;
    var $anrede;
    var $titel;
    var $name;
    var $vorname;
    var $strasse;
    var $hausnummer;
    var $plz;
    var $ort;
    var $land;
    var $email;
    var $emailanmeldung;
    var $versnummer;
    var $versnummerneu;
    var $versnummerfamilie;
    var $versnummermv;
    var $famityp;
    var $rechtskreis;
    var $rechtskreisfamilie;
    var $versstatus;
    var $geburtsdatum;
    var $mitgliedseit;
    var $telefonnummer;
    var $mobilnummer;
    var $passwort;
    var $freigeschaltet; // Freigeschaltet durch bearbeiter
    var $anmeldungbestaetigt; // Flag: 1 wenn User Anmeldung bestaetigt hat
    var $schluessel;
    var $erstellungsdatum;
    var $aenderungsdatum;
    var $deaktiviert; // Online an- und abschalten
    var $status;
    var $ersteller;
    var $deleted;
    var $ip;
    var $auszugperemail;
    var $arztbescheinigung; // Datum einer aerztlichen Bescheinigung;
    var $crmkv; // Datum des letzten Erscheinens in CRMKV-Daten
    var $logintries; // erfolglose Loginversuche
    var $u18;
    var $konto;

    /* suchfelder */
    var $datefrom;
    var $dateto;
    var $praemie;
    var $praemiebestellt;
    var $kontomatch;
    var $datefrompraemie;
    var $datetopraemie;
    var $loggedIn;


    function __construct($versnummer = '0', $id = 0, $del = 0, $rechtskreis = '', $versnummerneu = '')
    {

        global $_SERVER;
        if ((strlen($versnummer) >= 9) or ( $id) or $versnummerneu != '') {
            if ($del != 0) {
                $table = "deleted_users";
            }
            else {
                $table = "users";
            }
            $query = "SELECT * FROM $table WHERE ";
            if ($id) {
                $query .= "userId = " . intval($id);
            } elseif ($versnummer != '') {
                $query .= "versnummer LIKE '$versnummer'";
            } elseif ($versnummerneu != '') {
                $query .= "versnummerneu LIKE '$versnummerneu'";
            } else {
                return null;
            }

            $result = dbQuery($query)
                    or error("Konnte Logindaten nicht aus der Datenbank lesen: " . dbError());
            $numRows = dbNumRows($result);
            // Wenn der User bereits existiert, dann hole gleich alle Daten
            // aus der Datenbank
            if ($numRows == 0 && $versnummerneu != '') {
                $query = "SELECT * FROM $table WHERE versnummerneu LIKE '" . $versnummerneu . "'";
                // print $query . "\n";
                $result = dbQuery($query)
                        or error("Konnte Logindaten nicht aus der Datenbank lesen: " . dbError());
                $numRows = dbNumRows($result);
            }
            if ($numRows != 0) {
                $row = dbFetchRow($result);

                $this->userId = unescape($row['userId']);
                $this->anrede = unescape($row['anrede']);
                $this->titel = unescape($row['titel']);
                $this->name = unescape($row['name']);
                $this->vorname = unescape($row['vorname']);
                $this->strasse = unescape($row['strasse']);
                $this->hausnummer = unescape($row['hausnummer']);
                $this->hausnummer = '';
                $this->plz = unescape($row['plz']);
                $this->ort = unescape($row['ort']);
                $this->land = unescape($row['land']);
                $this->email = unescape($row['email']);
                $this->emailanmeldung = unescape($row['emailanmeldung']);
                $this->versnummer = unescape($row['versnummer']);
                $this->versnummerneu = unescape($row['versnummerneu']);
                $this->versnummermv = unescape($row['versnummermv']);
                $this->famityp = unescape($row['famityp']);
                $this->rechtskreis = unescape($row['rechtskreis']);
                $this->rechtskreisfamilie = unescape($row['rechtskreis']);
                $this->versstatus = unescape($row['versstatus']);
                $this->geburtsdatum = unescape($row['geburtsdatum']);
                $this->mitgliedseit = unescape($row['mitgliedseit']);
                $this->telefonnummer = unescape($row['telefonnummer']);
                $this->mobilnummer = unescape($row['mobilnummer']);
                $this->passwort = unescape($row['passwort']);

                $this->freigeschaltet = unescape($row['freigeschaltet']);
//                $this->anmeldungbestaetigt = unescape($row['anmeldungbestaetigt']);

                $this->schluessel = unescape($row['schluessel']);
                $this->erstellungsdatum = unescape($row['erstellungsdatum']);
                $this->aenderungsdatum = unescape($row['aenderungsdatum']);
                $this->ersteller = unescape($row['ersteller']);
                $this->deaktiviert = unescape($row['deaktiviert']);
                $this->status = unescape($row['status']);
                $this->auszugperemail = unescape($row['auszugperemail']);
                $this->rausfaller = unescape($row['rausfaller']);
                $this->arztbescheinigung = $this->getarztbescheinigung();
                $this->crmkv = unescape($row['crmkv']);
                $this->logintries = unescape($row['logintries']);
                $familienversicherte = new familienversicherte();
                $fami = $familienversicherte->getByUserId($this->userId);
                if ($fami) {
                    if ($fami->parentId != $this->userId) {
                        $parent = new user(0, $fami->parentId);
                        $this->versnummerfamilie = $parent->versnummer;
                        $this->rechtskreisfamilie = $parent->rechtskreis;
                    }
                }
            }
            dbFreeResult($result);
        }
        $this->u18 = !$this->checklegalage();
        (isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&
                ($forwards = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) &&
                $remoteip = trim(end($forwards))) || $remoteip = filter_input(INPUT_SERVER,'REMOTE_ADDR');
        $this->ip = $remoteip;
        return $this;
    }


    function fetchuserbyversnummerneu($versnummerneu)
    {

        $user = null;
        $query = "SELECT userId
              FROM users
              WHERE versnummerneu = '$versnummerneu'";
        $results = dbQuery($query) or error("Kann nicht nach versnunmerneu '$versnunmerneu' suchen");
        if (dbNumRows($results) > 0) {
            $row = dbFetchRow($results);
            $userId = $row['userId'];
            $user = new user(0, $userId);
        }
        return $user;
    }


    function getarztbescheinigung()
    {

        $today = date('Y-m-d');

        $query = "SELECT max(datumbescheinigung) as datumbescheinigung FROM kontobewegungen WHERE userId = " . $this->userId;

        $result = dbQuery($query) or error("Cannot read Kontobewegung: " . dbError());
        $row = dbFetchRow($result);
        $datumbescheinigung = $row['datumbescheinigung'];
        if (($datumbescheinigung > '2000-01-01') && ($datumbescheinigung < $today)) {
            return $datumbescheinigung;
        }
        return '';
    }


    function writeaddress($adminname, $bearbeitername, $bearbeiteremail)
    {
        $konto = new konto($this->userId);
        $punkte = $konto->getSaldo();
        $filename = "/tmp/adresse_$adminname.txt";
        $fout = fopen($filename, 'w') or die("Cannot write to $filename");
        $requestip = $_SERVER['REMOTE_ADDR'];
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $requestip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        fwrite($fout,
               $requestip . "\n" . utf8_encode(
                        $this->anrede . ';' .
                        $this->titel . ';' .
                        $this->vorname . ';' .
                        $this->name . ';' .
                        $this->strasse . ';' .
                        ';' .
                        $this->plz . ';' .
                        $this->ort . ';' .
                        $this->land . ';' .
                        $this->email . ';' .
                        $this->versnummer . ';' .
                        $punkte . ';' .
                        $bearbeitername . ';' .
                        $bearbeiteremail
                ) . "\r\n");
        fclose($fout);
    }


    public function login($email, $password)
    {
        if (!$this->userId) {
            return false;
        }

        if ($this->email != '' && $this->emailanmeldung == '') {
            $this->emailanmeldung = $this->email;
        }
        if (strtolower($this->emailanmeldung) != strtolower($email) && strtolower($this->email) != strtolower($email)) {
            print "Kann Email nicht finden\n";
            return false;
        }
        if ($this->logintries > 4 && $this->getLastFailedLogin()+600 > time()) {
print "Last Login failed: " . date('Y-m-d H:i:s' , $this->getLastFailedLogin());
//            return false;
        }

        /* If password has not been set, use versnummer */
        if ($this->passwort == '') {
            if ($this->versnummer != $password && $this->versnummerneu != $password) {
                $this->increaseLoginTries();
                $this->log('login failed', $this->userId);
                return false;
            }
        }
        else {
            if ($this->passwort != $password) {
                $this->increaseLoginTries();
                $this->log('login failed', $this->userId);
                return false;
            }
        }

        $this->log('login', $this->userId);
        $this->clearLoginTries();
        return true;
    }

    function getLastLogin()
    {

        $row = '';
        $query = "SELECT timestamp FROM userlogs WHERE userId = " .
                $this->userId . " AND aktion='login' and type='client' ORDER BY timestamp DESC";
        $result = dbQuery($query)
                or error("Konnte log nicht aus der Datenbank lesen: " . dbError());
        if (dbNumRows($result) > 1) {
            $row = dbFetchRow($result);
            dbFreeResult($result);
            return (date('d.m.Y', $row['timestamp']));
        }
            dbFreeResult($result);
        return false;
    }

    function getLastFailedLogin()
    {
        $row = '';
        $query = "SELECT timestamp FROM userlogs WHERE userId = " .
                $this->userId . " AND aktion='login failed' and type='client' ORDER BY timestamp DESC";
        $result = dbQuery($query)
                or error("Konnte log nicht aus der Datenbank lesen: " . dbError());
        if (dbNumRows($result) > 1) {
            $row = dbFetchRow($result);
            dbFreeResult($result);
            return ($row['timestamp']);
        }
        dbFreeResult($result);
        return false;
    }

    public function increaseLoginTries()
    {
        dbquery('UPDATE users SET logintries = logintries+1 WHERE userId = ' . $this->userId);
    }

    public function clearLoginTries()
    {
        $this->logintries = 0;
        dbquery('UPDATE users SET logintries = 0 WHERE userId = ' . $this->userId);
        return $this;
    }

    function updateUserData($del = 0, $updated = true)
    {

        $familienversicherte = new familienversicherte();
        if ($updated) {
            $this->aenderungsdatum = time();
        }
        if ($del) {
            $table = "deleted_users";
        }
        else {
            $table = "users";
        }
        /* change "Herr" to "Herrn" */
        if ($this->anrede == 'Herr') {
            $this->anrede = 'Herrn';
        }

        // Familienversicherung: Eingestellte MV überschreiben
        if ($this->versnummerfamilie) {
//              $this->versnummermv = $this->versnummerfamilie;
        }
        $query = "UPDATE $table SET " .
                "anrede = '" . $this->anrede . "'," .
                "titel = '" . $this->titel . "'," .
                "name = '" . dbEscapeString($this->name) . "'," .
                "vorname = '" . dbEscapeString(
                                                          $this->vorname) . "'," .
                "strasse = '" . dbEscapeString(
                                                          $this->strasse) . "'," .
                "hausnummer = '" . $this->hausnummer . "'," .
                "plz = '" . $this->plz . "'," .
                "ort = '" . dbEscapeString($this->ort) . "'," .
                "land = '" . $this->land . "'," .
                "email = '" . $this->email . "'," .
                "emailanmeldung= '" . $this->emailanmeldung . "'," .
                "versnummer = '" . $this->versnummer . "'," .
                "versnummerneu = '" . $this->versnummerneu . "'," .
                "versnummermv = '" . $this->versnummermv . "'," .
                "famityp = '" . $this->famityp . "'," .
                "passwort = '" . dbEscapeString(
                                                           $this->passwort) . "'," .
                "rechtskreis = '" . $this->rechtskreis . "'," .
                "rechtskreisfamilie = '" . $this->rechtskreisfamilie . "'," .
                "versstatus = '" . $this->versstatus . "'," .
                "geburtsdatum = '" . $this->geburtsdatum . "'," .
                "mitgliedseit= '" . $this->mitgliedseit . "'," .
                "aenderungsdatum = '" . $this->aenderungsdatum . "'," .
                "deaktiviert = '" . $this->deaktiviert . "', " .
                "status = '" . $this->status . "', " .
                "freigeschaltet = " . $this->freigeschaltet . ", " .
                "schluessel = '" . $this->schluessel . "', " .
                "rausfaller = '" . $this->rausfaller . "', " .
                "crmkv = '" . $this->crmkv . "', " .
                "auszugperemail = " . $this->auszugperemail . ", " .
                "logintries = 0" .
                " WHERE userId = " . $this->userId;
        $result = dbQuery($query)
                or error("Konnte Änderungen nicht in der Datenbank speichern: ($query)" . dbError());
        if ($this->versnummerfamilie) {
            $enter = true;
            $fami = $familienversicherte->getByUserId($this->userId);
            if ($fami) {
                $parent = new user(0, $fami->parentId);
                if ($parent->versnumemr == $this->versnummerfamilie) {
                    $enter = false;
                }
                else {
                    $fami->delete();
                }
            }
            if ($enter) {
                $parent = new user($this->versnummerfamilie, 0, 0,
                                   $this->rechtskreisfamilie);
                if (!$parent->userId) {
#                      error("Konnte Parent nicht finden: $versnummerfamilie, $rechtskreisfamilie");
                }
                else {
                    $fami = new familienversicherte();
                    $fami->parentId = $parent->userId;
                    $fami->typ = 0;
                    $fami->versnummer = $this->versnummer;
                    $fami->rechtskreis = $this->rechtskreis;
                    $fami->insert();
                }
            }
        }

        // dbFreeResult($result);
    }


    function insertUserData($log = false)
    {
        /* change "Herr" to "Herrn" */
        if ($this->anrede == 'Herr') {
            $this->anrede = 'Herrn';
        }
        if ($this->passwort == '') {
            $this->passwort = $this->versnummer;
        }
        if (!$this->auszugperemail) {
            $this->auszugperemail = 0;
        }
        if (!$this->freigeschaltet) {
            $this->freigeschaltet = 0;
        }

        if (!$this->anmeldungbestaetigt) {
            $this->anmeldungbestaetigt = 0;
        }


        if (!$this->rausfaller) {
            $this->rausfaller = 0;
        }


        $this->erstellungsdatum = time();
        $this->aenderungsdatum = time();
        $query = "INSERT INTO users SET " .
                "anrede = '" . $this->anrede . "'," .
                "titel = '" . $this->titel . "'," .
                "name = '" . dbEscapeString($this->name) . "'," .
                "vorname = '" . dbEscapeString(
                                                          $this->vorname) . "'," .
                "strasse = '" . dbEscapeString(
                                                          $this->strasse) . "'," .
                "hausnummer = '" . $this->hausnummer . "'," .
                "plz = '" . $this->plz . "'," .
                "ort = '" . dbEscapeString($this->ort) . "'," .
                "land = '" . dbEscapeString($this->land) . "'," .
                "email = '" . dbEscapeString($this->email) . "'," .
                "emailanmeldung = '" . $this->emailanmeldung . "'," .
                "versnummer = '" . $this->versnummer . "'," .
                "versnummerneu = '" . $this->versnummerneu . "'," .
                "versnummermv = '" . $this->versnummermv . "'," .
                "famityp = '" . $this->famityp . "'," .
                "rechtskreis = '" . $this->rechtskreis . "'," .
                "rechtskreisfamilie = '" . $this->rechtskreisfamilie . "'," .
                "versstatus = '" . $this->versstatus . "'," .
                "auszugperemail = " . $this->auszugperemail . "," .
                "geburtsdatum = '" . convertdate($this->geburtsdatum) . "'," .
                "mitgliedseit= '" . $this->mitgliedseit . "'," .
                "telefonnummer= '" . $this->telefonnummer . "'," .
                "mobilnummer= '" . $this->mobilnummer . "'," .
                "passwort= '" . dbEscapeString(
                                                          $this->passwort) . "'," .
                "freigeschaltet= " . $this->freigeschaltet . "," .
                "schluessel= '" . $this->schluessel . "'," .
                "rausfaller= " . $this->rausfaller . "," .
                "erstellungsdatum = " . $this->erstellungsdatum . "," .
                "aenderungsdatum = " . $this->aenderungsdatum . "," .
		        "deaktiviert = '" . $this->deaktiviert . "', " .
		        "status = '" . $this->status . "', " .
                "ersteller = " . $this->ersteller . ", " .
                "crmkv = '" . $this->crmkv . "'";
        if (!$result = dbQuery($query)) {
            error("Konnte Teilnehmer nicht in die Datenbank einfügen: " . dbError() . "<br>\n" .
                    "<pre>Query: $query</pre>");
            return false;
        }
        $this->userId = dbInsertId();
        if ($log) {
            $this->log('Angelegt', $this->userId);
        }
        dbFreeResult($result);
    }


    function deleteUser($undel = 0)
    {

        $this->aenderungsdatum = time();
        if ($undel) {
            $table = "users";
        }
        else {
            $table = "deleted_users";
        }

        # Nur in "deleted_users" verschieben, wenn Eintrag
        # bereits freigeschaltet ist
        if ($this->freigeschaltet == 1) {
            # Ist der User bereits geloescht?
            $query = "SELECT userId FROM $table WHERE userId = " . $this->userId;
            $result = (dbQuery($query)) or error("Cannot select." . dbError());

            if (dbNumRows($result) == 0) {
                $query = "INSERT INTO $table SET " .
                        "userId = '" . $this->userId . "'," .
                        "anrede = '" . $this->anrede . "'," .
                        "titel = '" . $this->titel . "'," .
                        "name = '" . dbEscapeString(
                                                               $this->name) . "'," .
                        "vorname = '" . dbEscapeString(
                                                                  $this->vorname) . "'," .
                        "strasse = '" . dbEscapeString(
                                                                  $this->strasse) . "'," .
                        "hausnummer = '" . $this->hausnummer . "'," .
                        "plz = '" . $this->plz . "'," .
                        "ort = '" . dbEscapeString(
                                                              $this->ort) . "'," .
                        "land = '" . $this->land . "'," .
                        "email = '" . $this->email . "'," .
                        "emailanmeldung = '" . $this->emailanmeldung . "'," .
                        "versnummer = '" . $this->versnummer . "'," .
                        "versnummermv = '" . $this->versnummermv . "'," .
                        "famityp = '" . $this->famityp . "'," .
                        "passwort = '" . $this->versnummer . "'," .
                        "versnummerneu = '" . $this->versnummerneu . "'," .
                        "geburtsdatum = '" . convertdate($this->geburtsdatum) . "'," .
                        "mitgliedseit= '" . $this->mitgliedseit . "'," .
                        "telefonnummer= '" . $this->telefonnummer . "'," .
                        "mobilnummer= '" . $this->mobilnummer . "'," .
                        "freigeschaltet= " . $this->freigeschaltet . "," .
                        "schluessel= '" . $this->schluessel . "'," .
                        "rausfaller = '" . $this->rausfaller . "'," .
                        "erstellungsdatum = " . $this->erstellungsdatum . "," .
                        "aenderungsdatum = " . $this->aenderungsdatum . "," .
                        "deaktiviert = '" . $this->deaktiviert . "', " .
                        "status = '" . $this->status . "', " .
                        "ersteller = '" . $this->ersteller . "', " .
                        "crmkv = '" . $this->crmkv . "', " .
                        "rechtskreis = '" . $this->rechtskreis . "', " .
                        "versstatus = '" . $this->versstatus . "', " .
                        "auszugperemail = '" . $this->auszugperemail . "'";
                if (!$result = dbQuery($query)) {
                    error("Konnte Teilnehmer nicht in die Datenbank einfügen: " . dbError() . "<br>\n" .
                            "Query: $query");
                    return false;
                }
                dbFreeResult($result);
            }
        }
        if ($undel) {
            $table = "deleted_users";
        }
        else {
            $table = "users";
        }

        $query = "DELETE FROM $table WHERE userId = '" . $this->userId . "' LIMIT 1";

        $result = dbQuery($query) or
                error("Konnte Teilnehmer nicht loeschen: " . dbError() . "<br>\n");
        dbFreeResult($result);
        return new user($this->versnummer, 0, 0, $this->rechtskreis);
    }

    /* holt user aus der Datenbank, sortiert nach sortfield, sortierrichtung dir */


    function getUsers($sortfield = '', $dir = '', $asId = 0)
    {

        $users = array();
        $tmpUsers = array();
        $kontostaende = array();
        $query = "";
        $searchfields = array('versnummer', 'rechtskreis', 'anrede',
            'titel', 'name', 'vorname', 'geburtsdatum', 'strasse',
            'plz', 'ort', 'land', 'email', 'emailanmeldung',
            'passwort', 'status');
        foreach ($searchfields as $searchfield)
        {
            if (isset($this->$searchfield) && ($this->$searchfield != '')) {
                if ($query)
                    $query .= " AND";

                if ($searchfield === 'versnummer') {

                    $query .= " (versnummer like '%" .
                            dbEscapeString(
                                                      $this->$searchfield) . "%'";
                    $query .= " OR versnummerneu like '%" .
                            dbEscapeString(
                                                      $this->$searchfield) . "%')";
                }
                else {
                    $query .= " " . dbEscapeString(
                                                              $searchfield) . " like '%" .
                            dbEscapeString(
                                                      $this->$searchfield) . "%'";
                }
            }
        }
        $timestamp18yearsago = strtotime("18 years ago", strtotime("today"));
        // work around for php's non-type boolean brain damage
        // if u18=true, then both 'yes' and 'no' will also be true
        if ($this->u18 == 'yes' && $this->u18 == 'no') {
            $this->u18 = '';
        }
        if ($this->u18 == 'yes') {
            if ($query)
                $query .= " AND";
            $query .= " UNIX_TIMESTAMP(geburtsdatum) > $timestamp18yearsago ";
        }
        if ($this->u18 == 'no') {
            if ($query)
                $query .= " AND";
            $query .= " UNIX_TIMESTAMP(geburtsdatum) <= $timestamp18yearsago ";
        }

        if ($this->datefrom != '') {
            if ($query)
                $query .= ' AND';
            $query .= " erstellungsdatum >= '" . $this->datefrom . "'";
        }

        if ($this->dateto != '') {
            if ($query)
                $query .= ' AND';
            $query .= " erstellungsdatum <= '" . $this->dateto . "'";
        }

        if (isset($this->datefromchange) && ($this->datefromchange != '')) {
            if ($query)
                $query .= ' AND';
            $query .= " aenderungsdatum >= '" . $this->datefromchange . "'";
        }

        if (isset($this->datetochange) && ($this->datetochange != '')) {
            if ($query)
                $query .= ' AND';
            $query .= " aenderungsdatum <= '" . $this->datetochange . "'";
        }

        if ($this->ersteller != '') {
            if ($query)
                $query .= " AND";
            $query .=" ersteller like '%" . $this->ersteller . "%'";
        }

        if (!$query) {
            $query = "1";
        }

        if (!$dir)
            $dir = "ASC";
        if (!$sortfield)
            $sortfield = "erstellungsdatum";
        if ($this->deleted) {
            $myquery = "SELECT userId FROM deleted_users WHERE $query order by $sortfield $dir";
        }
        else {
            $myquery = "SELECT userId FROM users WHERE $query order by $sortfield $dir";
        }
        $result = dbQuery($myquery) or
                error("Kann User nicht aus der Datenbank lesen<br>" .
                        dbError() . "<br>Query: $myquery<br>\n");

        # Speichere Zwischenergebnis (User) in array users ab.
        while ($row = dbFetchRow($result))
        {
            array_push($users, $row['userId']);
        }
        dbFreeResult($result);

        if ($this->loggedIn) {
            $query = "SELECT userId FROM userlogs WHERE " .
                    " aktion='login' and type='client'";
            if ($this->datefrompraemie)
                $query .= " AND timestamp > " .
                        $this->datefrompraemie;
            if ($this->datetopraemie)
                $query .= " AND timestamp < " .
                        $this->datetopraemie;

            $result = dbQuery($query)
                    or error("Konnte log nicht aus der Datenbank lesen: " . dbError());

            while ($row = dbFetchRow($result))
            {
                $logins[$row['userId']] = 1;
            }
            dbFreeResult($result);

            foreach ($users as $user)
            {
                if (($this->loggedIn == 'yes') && $logins[$user]) {
                    array_push($tmpUsers, $user);
                }
                if (($this->loggedIn == 'no') && (!$logins[$user])) {
                    array_push($tmpUsers, $user);
                }
            }


            $users = $tmpUsers;
            $tmpUsers = array();
        }

        # Special selects for konto
        if ($this->praemiebestellt or $this->kontomatch) {
            $query = "";
            $myQuery = "SELECT userId, SUM(wert) as kontostand FROM kontobewegungen ";
            if ($this->praemiebestellt) {
                if ($query)
                    $query .= ' AND ';
                $query .= ' (beschreibung like "Bestellung der Pr%" or beschreibung like "Spende an:%") AND wert < 0 ';
            }
            if ($this->kontomatch) {
                if ($query)
                    $query .= ' AND ';
                $query .= " beschreibung like '%" .
                        $this->kontomatch . "%'";
            }
            if ($this->datefrompraemie) {
                if ($query)
                    $query .= ' AND ';
                $query .= " datum >= " . $this->datefrompraemie;
            }
            if ($this->datetopraemie) {
                if ($query)
                    $query .= ' AND ';
                $query .= " datum <= " . $this->datetopraemie;
            }
            if ($query)
                $query = ' WHERE ' . $query;

            $query = $myQuery . $query;
            $query .= " GROUP BY userId";

            $result = dbQuery($query) or
                    error("Kann kontoauszug nicht lesen:" . dbError());
            while ($row = dbFetchRow($result))
            {
                $id = $row['userId'];
                if (in_array($id, $users)) {
                    array_push($tmpUsers, $id);
                }
            }
            dbFreeResult($result);
            $users = $tmpUsers;
            $tmpUsers = array();
        }


        if (isset($this->kontostand) && ($this->kontostand != '')) {
            $query = "";
            $myQuery = "SELECT userId, SUM(wert) as kontostand FROM kontobewegungen ";
            if ($this->datetopraemie) {
                if ($query)
                    $query .= ' AND ';
                $query .= " datum <= " . $this->datetopraemie;
            }
            if ($query)
                $query = ' WHERE ' . $query;

            $query = $myQuery . $query;
            $query .= " GROUP BY userId";

            /* Searches in hashes are much faster than using "in_array" */
            $userhash = array();
            foreach ($users as $id)
                $userhash[$id] = 1;
            $result = dbQuery($query) or
                    error("Kann kontoauszug nicht lesen:" . dbError());
            while ($row = dbFetchRow($result))
            {
                $id = $row['userId'];
                if (isset($userhash[$id])) {
                    if ($row['kontostand'] == '')
                        $row['kontostand'] = '0';
                    $kontostaende[$id] = $row['kontostand'];
                }
            }
            dbFreeResult($result);
            foreach ($users as $user)
            {
                if (($kontostaende[$user] or $kontostaende[$user] == 0) and $this->operatorkontostand)
                    $kontostaende[$user] +=0;
                $toEval = "\$ergebnis = (" . $kontostaende[$user] . ' ' . $this->operatorkontostand . ' ' . $this->kontostand . ");";
                eval($toEval);
                if ($ergebnis) {
                    array_push($tmpUsers, $user);
                }
            }

            $users = $tmpUsers;
            $tmpUsers = array();
        }

        // tie results together
        foreach ($users as $user)
        {
            if ($asId) {
                array_push($tmpUsers, $user);
            }
            else {
                array_push($tmpUsers, new user('', $user, $this->deleted));
                if ($this->logintries > 4 && $this->getLastFailedLogin()+600 > time()) {
                    return false;
                }
            }
        }

        return $tmpUsers;
    }


    function log($action, $object)
    {

        if (!isset($this->ip)) {
            $this->ip = '0.0.0.0';
        }
        $action = dbEscapeString($action);
        $query = "INSERT INTO userlogs VALUES (" .
                $this->userId . ", " .
                "'client', " .
                "'$action', " .
                "'$object', " .
                "'" . $this->ip . "', " .
                time() .
                ")";
        $result = dbQuery($query) or
                error("Kann log nicht eintragen: " . dbError());
        dbFreeResult($result);
    }

    /*
     * returns true if age is above 18
     */


    function checklegalage()
    {

        $timestamp18yearsago = strtotime("18 years ago", strtotime("today"));
        $timestampgeburtstag = strtotime($this->geburtsdatum);
        if ($timestampgeburtstag < $timestamp18yearsago) {
            return true;
        }
        return false;
    }

    /*
     * returns true if age is above 5
     */


    function checkoverfive()
    {

        //$timestamp5yearsago = strtotime("5 years ago", strtotime("today"));
        $timestamp5yearsago = strtotime("today");
        $timestampgeburtstag = strtotime($this->geburtsdatum);
        if ($timestampgeburtstag < $timestamp5yearsago) {
            return true;
        }
        return false;
    }

    /*
     * Creates a child
     *
     *  @param string $vorname Vorname
     *  @param date $geburtsdatum Geburtsdatum
     *  @param int $ersteller Id des Admins, der das Kind anlegt
     *  @return object child object
     */


    function createChild($vorname, $geburtsdatum, $ersteller, $versnummerkind, $rechtskreiskind)
    {

        $children = $this->getChildren();
        # gibt es bereits ein Kind mit diesem Namen?
        foreach ($children as $child)
        {
            if (trim($child->vorname) == ($vorname)) {
                $child->geburtsdatum = $geburtsdatum;
                $child->update();
                return $child;
            }
        }
        $child = new Kind();
        $child->userId = $this->userId;
        $child->vorname = $vorname;
        $child->geburtsdatum = $geburtsdatum;
        $child->ersteller = $ersteller;
        if ($versnummerkind && $rechtskreiskind) {
            $child->versnummer = $versnummerkind;
            $child->rechtskreis = $rechtskreiskind;

            $childuser = new user($versnummerkind, 0, 0, $rechtskreiskind);
            if ($childuser->userId) {
                $fami = new familienversicherte();
                $fami->versnummer = $versnummerkind;
                $fami->rechtskreis = $rechtskreiskind;
                $fami->userId = $childuser->userId;
                $fami->parentId = $this->userId;
                $fami->typ = 0;
                $fami->insert();
            }
        }
        $child->insert(true);
        return $child;
    }

    # Kinder ohne Versicherungsnummer


    function getChildren($hasvnr = false)
    {

        if ($hasvnr)
            return $this->getChildrenVNr();
        $children = Array();
        /* Kinder aus der Tabelle 'Kinder' lesen */
        $query = "SELECT id FROM kinder 
              WHERE userId = '" . $this->userId . "'";
        $result = dbQuery($query) or
                error("Kann Kinder nicht aus der Datenbank lesen: " . dbError());
        while ($row = dbFetchRow($result))
        {
            $children[] = new Kind($row['id']);
        }
        dbFreeResult($result);
        return $children;
    }

    # Kinder mit Versicherungsnummer


    function getChildrenVNr()
    {

        if ($this->famityp == 'K') {
            /* Kinder haben keine Kinder :) */
            return false;
        }
        $children = Array();
        $famis = $this->getFamilienmitglieder();
        foreach ($famis as $fami)
        {
            if ($fami->famityp == 'K') {
                $children[] = $fami;
            }
        }
        return $children;
    }

    # Partner mit Versicherungsnummer


    function getPartners()
    {

        if ($this->famityp == 'K') {
            return false;
        }
        $partner = Array();
        $famis = $this->getFamilienmitglieder(true);
        foreach ($famis as $fami)
        {
            if ($fami->famityp != 'K') {
                $partner[] = $fami;
            }
        }
        return $partner;
    }


    static public function getBySchluessel($id)
    {

#          $id = dbEscapeString($id);
        $query = "SELECT userId FROM users WHERE schluessel = '$id'";
        $result = dbQuery($query) or error("Kann User mit Schluessel '$id' nicht lesen");
        if (dbNumRows($result) == 0) {
            return false;
        }
        $row = dbFetchRow($result);
        $userId = $row['userId'];
        return new user(0, $userId);
    }


    function getFamilienmitglieder($includeself = false)
    {

        $famis = array();
        /* Wenn MV eingetragen ist: Mitversichert. Suche Parent */
        if ($this->versnummermv) {
            $query = "SELECT userId FROM users WHERE versnummer = '" . $this->versnummermv . "'
                  AND rechtskreis = '" . $this->rechtskreisfamilie . "'";
            $result = dbQuery($query) or error("Kann Hauptversicherten nicht lesen");

            if (dbNumRows($result) > 0) {
                $row = dbFetchRow($result);
                $useridhv = $row['userId'];
                $user = new user(0, $useridhv);
                /* $famis[] = $user; */
                /* Gebe alle Familienmitglieder dieses Users zurück */
                $allfamis = $user->getFamilienmitglieder($includeself);
                foreach ($allfamis as $fami)
                {
                    /* Filter out $this */
                    if ((($this->userId != $fami->userId) || $includeself) && $useridhv != $fami->userId) {
                        $famis[] = $fami;
                    }
                }
                $user->famityp = 'MV';
                $famis[] = $user;
            }
            else {
                /* Hauptversicherter ist nicht HM-Teilnehmer */
                $hvuser = new user();
                $hvuser->versnummer = $this->versnummermv;
                $hvuser->rechtskreis = $this->rechtskreisfamilie;
                $hvuser->famityp = 'MV';
                $query = "SELECT * FROM abgleich WHERE versnummer = '" . $this->versnummermv . "'
                      AND rechtskreis = '" . $this->rechtskreisfamilie . "'";
                $result = dbQuery($query);
                if (dbNumRows($result) == 0) {
                    /* Hauptversicherter is auch nicht in der Krankenkasse: Error! */
                    print "Error: Hauptversicherter ist kein Teilnehmer und kein Versicherungsmitglied<br/>\n";
                    return null;
                }
                $row = dbFetchRow($result);
                $hvuser->id = $row['id'];
                $hvuser->versnummerneu = $row['versnummerneu'];
                $hvuser->rechtskreis = $row['rechtskreis'];
                $hvuser->anrede = $row['anrede'];
                $hvuser->titel = $row['titel'];
                $hvuser->vorname = $row['vorname'];
                $hvuser->name = $row['name'];
                $hvuser->strasse = $row['strasse'];
                $hvuser->plz = $row['plz'];
                $hvuser->ort = $row['ort'];
                $hvuser->geburtsdatum = $row['geburtsdatum'];
                $hvuser->email = $row['email'];
                $famis = $hvuser->getFamilienmitglieder();
                $famis[] = $hvuser;
            }
        }
        else {
            /* Suche alle, die mitversichert sind */
            $query = "SELECT userId FROM users WHERE versnummermv = '" . $this->versnummer . "'
                  AND rechtskreisfamilie= '" . $this->rechtskreis . "'";
            $result = dbQuery($query) or error("Kann Mitversicherte nicht lesen");
            while ($row = dbFetchRow($result))
            {
                $useridhv = $row['userId'];
                $user = new user(0, $useridhv);
                $famis[] = $user;
            }
            if ($includeself) {
                $famis[] = $this;
            }

            /* Fuege alle hinzu, die nicht teilnehmer seind */
            $query = "SELECT * FROM abgleich WHERE versnummermv = '" . $this->versnummer . "'
                  AND rechtskreis = '" . $this->rechtskreis . "'
                  AND (versnummer, rechtskreis) NOT IN (SELECT versnummer, rechtskreis from users)";
            $result = dbQuery($query) or error("Kann Hauptversicherten nicht lesen: " . dbError());
            while ($row = dbFetchRow($result))
            {
                $tmpuser = new user();
                $tmpuser->id = $row['id'];
                $tmpuser->rechtskreis = $row['rechtskreis'];
                $tmpuser->versnummer = $row['versnummer'];
                $tmpuser->versnummerneu = $row['versnummerneu'];
                $tmpuser->anrede = $row['anrede'];
                $tmpuser->titel = $row['titel'];
                $tmpuser->vorname = $row['vorname'];
                $tmpuser->name = $row['name'];
                $tmpuser->strasse = $row['strasse'];
                $tmpuser->plz = $row['plz'];
                $tmpuser->ort = $row['ort'];
                $tmpuser->geburtsdatum = $row['geburtsdatum'];
                $tmpuser->email = $row['email'];
                $tmpuser->famityp = $row['famityp'];
                $famis[] = $tmpuser;
            }
        }
        return $famis;
    }

    /* Holt user aus Abgleich */


    function fetchbyversnummerneu($versnummerneu)
    {

        $query = "SELECT * FROM abgleich WHERE versnummerneu = '$versnummerneu'";
        $result = dbQuery($query)
                or error("Konnte Logindaten nicht aus der Datenbank lesen: " . dbError());
        $numRows = dbNumRows($result);
        if ($numRows != 0) {
            $row = dbFetchRow($result);

            $this->abgleichid = unescape($row['id']);
            $this->anrede = unescape($row['anrede']);
            $this->titel = unescape($row['titel']);
            $this->name = unescape($row['name']);
            $this->vorname = unescape($row['vorname']);
            $this->strasse = unescape($row['strasse']);
            $this->hausnummer = unescape($row['hausnummer']);
            $this->hausnummer = '';
            $this->plz = unescape($row['plz']);
            $this->ort = unescape($row['ort']);
            $this->land = unescape($row['land']);
            $this->email = unescape($row['email']);
            $this->emailanmeldung = unescape($row['emailanmeldung']);
            $this->versnummer = unescape($row['versnummer']);
            $this->versnummerneu = unescape($row['versnummerneu']);
            $this->versnummermv = unescape($row['versnummermv']);
            $this->famityp = unescape($row['famityp']);
            $this->rechtskreis = unescape($row['rechtskreis']);
            $this->versstatus = unescape($row['versstatus']);
            $this->geburtsdatum = unescape($row['geburtsdatum']);
            $this->mitgliedseit = unescape($row['mitgliedseit']);
            $this->telefonnummer = unescape($row['telefonnummer']);
            $this->mobilnummer = unescape($row['mobilnummer']);
            $this->passwort = unescape($row['passwort']);
            $this->freigeschaltet = unescape($row['freigeschaltet']);
            $this->schluessel = unescape($row['schluessel']);
            $this->erstellungsdatum = unescape($row['erstellungsdatum']);
            $this->aenderungsdatum = unescape($row['aenderungsdatum']);
            $this->ersteller = unescape($row['ersteller']);
            $this->crmkv = unescape($row['crmkv']);
            $this->deaktiviert = unescape($row['deaktiviert']);
            $this->status = unescape($row['status']);
            $this->auszugperemail = unescape($row['auszugperemail']);
            $this->rausfaller = unescape($row['rausfaller']);

            dbFreeResult($result);
            $user = new user($this->versnummer, 0, $rechtskreis);
            $this->isteilnehmer = false;
            if ($user->userId) {
                $this->isteilnehmer = true;
            }
            return $this;
        }
        dbFreeResult($result);
        return false;
    }

    /* Holt user aus Abgleich */


    function fetchmitgliedbyid($id)
    {

        $query = "SELECT * FROM abgleich WHERE id = $id";
        $result = dbQuery($query)
                or error("Konnte Abgleichdaten nicht aus der Datenbank lesen: '$query'" . dbError());
        $numRows = dbNumRows($result);
        if ($numRows != 0) {
            $row = dbFetchRow($result);

            $this->abgleichid = unescape($row['id']);
            $this->anrede = unescape($row['anrede']);
            $this->titel = unescape($row['titel']);
            $this->name = unescape($row['name']);
            $this->vorname = unescape($row['vorname']);
            $this->strasse = unescape($row['strasse']);
            $this->hausnummer = unescape($row['hausnummer']);
            $this->hausnummer = '';
            $this->plz = unescape($row['plz']);
            $this->ort = unescape($row['ort']);
            $this->land = unescape($row['land']);
            $this->email = unescape($row['email']);
            $this->emailanmeldung = unescape($row['emailanmeldung']);
            $this->versnummer = unescape($row['versnummer']);
            $this->versnummerneu = unescape($row['versnummerneu']);
            $this->versnummermv = unescape($row['versnummermv']);
            $this->famityp = unescape($row['famityp']);
            $this->rechtskreis = unescape($row['rechtskreis']);
            $this->versstatus = unescape($row['versstatus']);
            $this->geburtsdatum = unescape($row['geburtsdatum']);
            $this->mitgliedseit = unescape($row['mitgliedseit']);
            $this->telefonnummer = unescape($row['telefonnummer']);
            $this->mobilnummer = unescape($row['mobilnummer']);
            $this->passwort = unescape($row['passwort']);
            $this->freigeschaltet = unescape($row['freigeschaltet']);
            $this->schluessel = unescape($row['schluessel']);
            $this->erstellungsdatum = unescape($row['erstellungsdatum']);
            $this->aenderungsdatum = unescape($row['aenderungsdatum']);
            $this->ersteller = unescape($row['ersteller']);
            $this->crmkv = unescape($row['crmkv']);
            $this->deaktiviert = unescape($row['deaktiviert']);
            $this->status = unescape($row['status']);
            $this->auszugperemail = unescape($row['auszugperemail']);
            $this->rausfaller = unescape($row['rausfaller']);

            dbFreeResult($result);
            $user = new user($this->versnummer, 0, $rechtskreis);
            $this->isteilnehmer = false;
            if ($user->userId) {
                $this->isteilnehmer = true;
            }
            return $this;
        }
        dbFreeResult($result);
        return false;
    }


    function sendpasswordmail()
    {


        $headers = 'Content-Type: text/plain; charset="UTF-8"' . "\n";
        $headers .= 'Content-transfer-encoding: 8bit' . "\n";

        $subject = "Ihre Anmeldung zum Healthmiles-Bonusprogramm";
        $mailto = $this->emailanmeldung;
        $mailfrom = 'noreply@healthmiles.de';
        $headers .= "From: $mailfrom\n";
        $mailtext = 'Sehr geehrte';
        if ($this->anrede == 'Herrn') {
            $mailtext .= 'r Herr';
        }
        else {
            $mailtext .= ' Frau';
        }
        $mailtext .= ' ' . $this->name . ",\n";
        $mailtext .= "\nIhre Anmeldung zum Healthmiles-Bonusprogramm ist nun vollständig.\n";
        $mailtext .= "Sie können sich nun mit folgenden Zugangsdaten anmelden:\n";
        $mailtext .= "Benutzername: " . $this->emailanmeldung . "\n";
        $mailtext .= "Passwort: " . $this->passwort . "\n\n";
        $mailtext .= "Mit freundlichen Grüßen\n";
        $mailtext .= "Ihr Healthmiles-Team\n";
        mail($mailto, $subject, $mailtext, $headers);
    }

    /* Holt user aus Abgleich */


    function fetchunapproved()
    {

        $query = "SELECT userId FROM users WHERE freigeschaltet = 0 AND anmeldungbestaetigt = 1";
        $result = dbQuery($query)
                or error("Konnte Teilnehmer nicht aus der Datenbank lesen: '$query'" . dbError());
        $numRows = dbNumRows($result);
        if ($numRows != 0) {
            $users = array();
            while ($row = dbFetchRow($result))
            {
                $userId = $row['userId'];
                $user = new user(0, $userId);
                array_push($users, $user);
            }
            dbFreeResult($result);
            return $users;
        }
        return false;
    }


    function fetchdoublekvnrneu()
    {

        $query = "SELECT versnummerneu, COUNT( versnummerneu ) AS anzahl
              FROM users
              GROUP BY versnummerneu
              HAVING anzahl >1";
        $result = dbQuery($query) or
                error("Kann doppelte KVNrNeu nicht suchen: " . dbError());
        $doppeltekvnrs = array();
        while ($row = dbFetchRow($result))
        {
            $versnummerneu = $row['versnummerneu'];
            if ($versnummerneu != '') {
                array_push($doppeltekvnrs, $versnummerneu);
            }
        }

        $dups = array();
        foreach ($doppeltekvnrs as $kvnrneu)
        {
            $query = "SELECT userId FROM users 
                  WHERE versnummerneu = '$kvnrneu'";
            $result = dbQuery($query) or
                    error("Kann doppelte KVNrNeu nicht suchen");
            while ($row = dbFetchRow($result))
            {
                array_push($dups, new user(0, $row['userId']));
            }
        }
        return $dups;
    }


    function fetchmissingkvnrneu()
    {

        $query = "SELECT userId
              FROM users
              WHERE versnummerneu = ''";
        $result = dbQuery($query) or
                error("Kann fehlende KVNrNeu nicht suchen: " . dbError());
        $users = array();
        while ($row = dbFetchRow($result))
        {
            $userId = $row['userId'];
            if ($userId != '') {
                array_push($users, new user(0, $userId));
            }
        }
        return $users;
    }


    function israusfaller()
    {

        if ($this->versnummerneu === '') {
            $query = "SELECT userId
                  FROM users
                  WHERE versnummer = '" . $this->versnummer . "'
                  AND rechtskreis = '" . $this->rechtskreis . "'
                  AND (versnummer, rechtskreis) NOT IN (
                          SELECT versnummer, rechtskreis FROM abgleich WHERE 1
                          )";
            $result = dbQuery($query) or error("Kann rausfaller nicht suchen: $query<br/>\n" . dbError());
            if (dbNumRows($result) == 0) {
                return false;
            }
        }
        $query = "SELECT userId
              FROM users
              WHERE versnummerneu = '" . $this->versnummerneu . "'
              AND versnummerneu NOT IN (
                      SELECT versnummerneu FROM abgleich WHERE 1
                      )";
        $result = dbQuery($query) or error("Kann rausfaller nicht suchen: $query<br/>\n" . dbError());
        if (dbNumRows($result) == 0) {
            return false;
        }
        return true;
    }


    function fetchmissingmitglieder()
    {

        $query = "SELECT userId
              FROM users
              WHERE versnummerneu != ''
              AND versnummerneu NOT IN (
                      SELECT versnummerneu FROM abgleich WHERE 1
                      )";
        $result = dbQuery($query) or
                error("Kann fehlende Mitglieder suchen: " . dbError());
        $users = array();
        while ($row = dbFetchRow($result))
        {
            $userId = $row['userId'];
            if ($userId != '') {
                array_push($users, new user(0, $userId));
            }
        }
        return $users;
    }


    function toXML($id = 0)
    {
        if (! $this->versnummerneu) {
            return '';
        }
        /*
          $exportKasse = ($this->rechtskreis == 'West')
          ? '20'
          : ($this->rechtskreis == 'Ost')
          ? '70'
          : 'NA';
          $xml = '<?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE CRM_Import SYSTEM "../../dtd\CRM_Import.dtd">
          <CRM_Import>
          <PersonZusatz>
          <PersonIdentifier kasse="' . $exportKasse . '" kvNr="' . $this->versnummer . '"/>
          <BonusDatenListe>
          <BonusDaten programId="011" status="20" erfassSpDatum="' .
          date("d.m.Y", $this->erstellungsdatum) .
          '" sBId="GmbH" spDatum="' . date("d.m.Y") . '" beginndatum="' .
          date("d.m.Y", $this->erstellungsdatum) . '"/>
          </BonusDatenListe>
          </PersonZusatz>
          </CRM_Import>';
         */
        $xml = '<?xml version="1.0" encoding="UTF-8"?>
<!--XML-Beispieldatei von XMLSpy generiert v2013 rel. 2 sp2 (http://www.altova.com)-->
<!DOCTYPE CrmImport SYSTEM "CrmImport.dtd">
<CrmImport>
';
        $xml .= '  <PartnerIdentifier Action="update" Id="ID_' . $id . '">
    <Ordnungsbegriff_PartnerIdentifier>' . $this->versnummerneu . '</Ordnungsbegriff_PartnerIdentifier>
    <PartnerIdentifier_TypNatuerlichePerson_NatuerlichePersonDaten>
      <TypNatuerlichePerson>
        <TypNatuerlichePerson_RolleBonusteilnehmer_RolleBonusteilnehmer>
          <RolleBonusteilnehmer>
            <RolleBonusteilnehmer_Bonusprogramm_Bonus>
              <Bonusprogramm>
                <Kennzeichen_Bonusprogramm>Healthmiles</Kennzeichen_Bonusprogramm>
                <BeginnFruehestens_Bonusprogramm>' . date("Y-m-d", $this->erstellungsdatum) . '</BeginnFruehestens_Bonusprogramm>
                <EndeSpaetestens_Bonusprogramm></EndeSpaetestens_Bonusprogramm>
                <Status_Bonusprogramm>Teilnehmer</Status_Bonusprogramm>
              </Bonusprogramm>
            </RolleBonusteilnehmer_Bonusprogramm_Bonus>
          </RolleBonusteilnehmer>
        </TypNatuerlichePerson_RolleBonusteilnehmer_RolleBonusteilnehmer>
      </TypNatuerlichePerson>
    </PartnerIdentifier_TypNatuerlichePerson_NatuerlichePersonDaten>
  </PartnerIdentifier>
';
        $xml .=  '</CrmImport>';
        return $xml;
    }

}
