function clm_api_db_season_genDWZ($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_main = "#__clm_liga";
        $table_dates = "#__clm_runden_termine";
        $table_dates_id = "liga";
        $table_list = "#__clm_meldeliste_spieler";
        $table_list_id = "sid";
        $table_round = "#__clm_rnd_spl";
        $table_round_id = "lid";
        $playerId = "zps=? AND mgl_nr=? AND sid=?";
        $birthAndID = "";
    }
    // Alte Ergebnisse entfernen
    clm_core::$api->db_season_delDWZ($id, $group);
    // Ligen/M-Turniere zur Saison auslesen
    $query = 'SELECT id, liga_mt, params' . ' FROM #__clm_liga' . ' WHERE sid=' . $id . ' AND published = 1';
    $liga = clm_core::$db->loadObjectList($query);
    if (count($liga) == 0) {
        return array(true, "e_calculateDWZNoLiga");
    }
    $liga_a = array();
    foreach ($liga as $liga1) {
        //Liga-Parameter aufbereiten
        $paramsStringArray = explode("\n", $liga1->params);
        $liga1->params = array();
        foreach ($paramsStringArray as $value) {
            $ipos = strpos($value, '=');
            if ($ipos !== false) {
                $key = substr($value, 0, $ipos);
                if (substr($key, 0, 2) == "\\'") {
                    $key = substr($key, 2, strlen($key) - 4);
                }
                if (substr($key, 0, 1) == "'") {
                    $key = substr($key, 1, strlen($key) - 2);
                }
                $liga1->params[$key] = substr($value, $ipos + 1);
            }
        }
        if (!isset($liga1->params['incl_to_season'])) {
            if ($liga1->liga_mt == 0) {
                $liga1->params['incl_to_season'] = '1';
            } else {
                $liga1->params['incl_to_season'] = '0';
            }
        }
        if ($liga1->params['incl_to_season'] == '1') {
            $liga_a[] = $liga1->id;
        }
    }
    if (count($liga_a) == 0) {
        return array(true, "e_calculateDWZNoLiga");
    }
    $ligen = '';
    $ligen = implode(',', $liga_a);
    // Vermeintliches Ende bestimmen
    $query = 'SELECT MAX(datum) as date' . ' FROM #__clm_runden_termine' . ' WHERE FIND_IN_SET(liga,"' . $ligen . '") != 0';
    $datum = clm_core::$db->loadObjectList($query);
    if (count($datum) == 0) {
        return array(true, "e_calculateDWZNoRound");
    }
    $year = substr($datum[0]->date, 0, 4);
    if ($year == "0000") {
        $year = date('Y');
        // Falls kein Jahr angegeben wurde
    } else {
        $year = intval($year);
    }
    // Lese alle beteiligten Spieler aus
    $query = 'SELECT a.zps, a.mgl_nr, d.DWZ as start_dwz, d.DWZ_Index as start_I0, d.FIDE_elo as FIDEelo, d.Geburtsjahr' . ' FROM #__clm_meldeliste_spieler as a' . ' LEFT JOIN #__clm_dwz_spieler AS d ON d.sid = a.sid AND d.zps = a.zps AND d.mgl_nr = a.mgl_nr' . ' WHERE a.sid =' . $id . ' GROUP by a.zps, a.mgl_nr';
    $spieler = clm_core::$db->loadObjectList($query);
    $dwz = new clm_class_dwz_rechner();
    if (count($spieler) == 0) {
        return array(false, "e_DWZnoPlayer");
    }
    // Spieler zur DWZ Auswertung hinzufügen
    for ($i = 0; $i < count($spieler); $i++) {
        if ($group) {
            $dwz->addPlayer($spieler[$i]->zps . ":" . $spieler[$i]->mgl_nr, $year - $spieler[$i]->Geburtsjahr, $spieler[$i]->start_dwz, $spieler[$i]->start_I0);
        }
    }
    // Wer hat sich diese Struktur ausgedacht?
    if ($group) {
        // Lese alle relevanten Partien aus
        $query = 'SELECT zps, spieler, gzps, gegner, ergebnis' . ' FROM #__clm_rnd_spl' . ' WHERE FIND_IN_SET(lid,"' . $ligen . '") != 0' . ' AND heim = 1';
    }
    $partien = clm_core::$db->loadObjectList($query);
    // Partien zur DWZ Auswertung hinzufügen
    $someMatch = false;
    for ($i = 0; $i < count($partien); $i++) {
        $punkte = clm_core::$load->gen_result($partien[$i]->ergebnis, 0);
        if ($punkte == -1) {
            continue;
        }
        if ($group) {
            $dwz->addMatch($partien[$i]->zps . ":" . $partien[$i]->spieler, $partien[$i]->gzps . ":" . $partien[$i]->gegner, $punkte);
        }
        $someMatch = true;
    }
    $result = $dwz->getAllPlayerObject();
    if (!$someMatch) {
        return array(false, "e_DWZnoMatch");
    }
    $sql = "UPDATE " . '#__clm_dwz_spieler' . " SET DWZ_neu=?, I0=?, Punkte=?, Partien=?, We=?, Leistung=?, EFaktor=?, Niveau=? WHERE " . $playerId;
    $stmt = clm_core::$db->prepare($sql);
    // Ergebnis Schreiben
    foreach ($result as $id2 => $value) {
        // Korrektur Leistung: Anzeige bei weniger als 5 Spielen oder nur Siegen/Niederlagen nicht gewollt
        if ($value->n < 5 || $value->W == 0 || $value->W == $value->n) {
            $value->R_p = 0;
        }
        if ($group) {
            $id2 = explode(":", $id2);
            $stmt->bind_param('iididiiisii', $value->R_n, $value->R_nI, $value->W, $value->n, $value->W_e, $value->R_p, $value->E, $value->R_c, $id2[0], $id2[1], $id);
        }
        $stmt->execute();
    }
    $stmt->close();
    return array(true, "m_calculateDWZSuccess", $ligen);
}
 public static function test()
 {
     // http://www.schachbund.de/turnier.html?code=B431-636-C4F
     $test = new clm_class_dwz_rechner();
     $test->addPlayer("Barthel", 20, 0, 0);
     $test->addRest("Barthel", 1177, 0);
     $test->addPlayer("Afflerbach", 20, 894, 9);
     $test->addPlayer("Johannes", 20, 1087, 5);
     $test->addPlayer("Wolf", 20, 905, 6);
     $test->addPlayer("Weiß", 20, 1255, 1);
     $test->addMatch("Afflerbach", "Barthel", 0);
     // 1
     $test->addMatch("Barthel", "Johannes", 0);
     // 0
     $test->addMatch("Barthel", "Wolf", 1);
     // 1
     $test->addMatch("Weiß", "Barthel", 1);
     // 0
     echo print_r($test->getAllPlayerObject());
     // --> Ergebnis: neue DWZ: 985
     //	tastsächliche neue DWZ: 983
     // Begründung: Tabelle ungenauer als die vom DSB verwendete
     // Abweichung Niveau kommt vom Einbezug der Restpartie, DSB nimmt diese aus
 }
function clm_api_db_tournament_genDWZ($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_main = "#__clm_liga";
        $table_dates = "#__clm_runden_termine";
        $table_dates_id = "liga";
        $table_list = "#__clm_meldeliste_spieler";
        $table_list_id = "lid";
        $table_round = "#__clm_rnd_spl";
        $table_round_id = "lid";
        $playerId = "zps=? AND mgl_nr=? AND lid=?";
        $birthAndID = "";
    } else {
        $table_main = "#__clm_turniere";
        $table_dates = "#__clm_turniere_rnd_termine";
        $table_dates_id = "turnier";
        $table_list = "#__clm_turniere_tlnr";
        $table_list_id = "turnier";
        $table_round = "#__clm_turniere_rnd_spl";
        $table_round_id = "turnier";
        $playerId = "snr=? AND turnier=?";
        $birthAndID = ", birthYear, snr";
    }
    // Alte Ergebnisse entfernen
    clm_core::$api->db_tournament_delDWZ($id, $group);
    // Liga Punktebereich auslesen
    $query = 'SELECT sid' . ' FROM ' . $table_main . ' WHERE id=' . $id;
    $liga = clm_core::$db->loadObjectList($query);
    if (count($liga) == 0) {
        return array(true, "e_calculateDWZNoLiga");
    }
    $liga = $liga[0];
    // Vermeintliches Ende bestimmen
    $query = 'SELECT MAX(datum) as date' . ' FROM ' . $table_dates . ' WHERE ' . $table_dates_id . '=' . $id;
    $datum = clm_core::$db->loadObjectList($query);
    if (count($datum) == 0) {
        return array(true, "e_calculateDWZNoRound");
    }
    $year = substr($datum[0]->date, 0, 4);
    if ($year == "0000") {
        $year = date('Y');
        // Falls kein Jahr angegeben wurde
    } else {
        $year = intval($year);
    }
    // Lese alle beteiligten Spieler aus
    $query = 'SELECT zps, mgl_nr, start_dwz, start_I0, FIDEelo' . $birthAndID . ' FROM ' . $table_list . ' WHERE ' . $table_list_id . '=' . $id;
    $spieler = clm_core::$db->loadObjectList($query);
    $dwz = new clm_class_dwz_rechner();
    if (count($spieler) == 0) {
        return array(false, "e_DWZnoPlayer");
    }
    // Spieler zur DWZ Auswertung hinzufügen
    for ($i = 0; $i < count($spieler); $i++) {
        // SWT Importe besitzen keinen Index, falls die DWZ größer als 0 ist muss es jedoch einen geben.
        if ($spieler[$i]->start_I0 == 0 && $spieler[$i]->start_dwz > 0) {
            $spieler[$i]->start_I0 = 22;
        }
        if ($group) {
            $query = 'SELECT Geburtsjahr' . ' FROM #__clm_dwz_spieler' . ' WHERE sid=' . $liga->sid . ' AND ZPS="' . clm_core::$db->escape($spieler[$i]->zps) . '"' . ' AND Mgl_Nr="' . clm_core::$db->escape($spieler[$i]->mgl_nr) . '"';
            $birth = clm_core::$db->loadObjectList($query);
            if (count($birth) == 0) {
                // Spieler in der Saison gelöscht?
                $birth = 0;
                // Spieler wird als älter als 25 angenommen
            } else {
                $birth = $birth[0]->Geburtsjahr;
            }
            $dwz->addPlayer($spieler[$i]->zps . ":" . $spieler[$i]->mgl_nr, $year - $birth, $spieler[$i]->start_dwz, $spieler[$i]->start_I0);
        } else {
            if (intval($spieler[$i]->birthYear) == 0) {
                $spieler[$i]->birthYear = $year - 100;
            }
            $dwz->addPlayer("p" . $spieler[$i]->snr, $year - $spieler[$i]->birthYear, $spieler[$i]->start_dwz, $spieler[$i]->start_I0, $spieler[$i]->FIDEelo);
        }
        // addPlayer($id, $A, $R_o, $Index)
    }
    // Wer hat sich diese Struktur ausgedacht?
    if ($group) {
        // Lese alle relevanten Partien aus
        $query = 'SELECT zps, spieler, gzps, gegner, ergebnis' . ' FROM ' . $table_round . ' WHERE ' . $table_round_id . '=' . $id . ' AND heim = 1';
    } else {
        // Lese alle relevanten Partien aus
        $query = 'SELECT ergebnis, spieler, gegner' . ' FROM ' . $table_round . ' WHERE ' . $table_round_id . '=' . $id . ' AND ergebnis IS NOT NULL' . ' AND heim = 1';
    }
    $partien = clm_core::$db->loadObjectList($query);
    // Partien zur DWZ Auswertung hinzufügen
    $someMatch = false;
    for ($i = 0; $i < count($partien); $i++) {
        list($punkte, $gpunkte) = clm_core::$load->gen_result($partien[$i]->ergebnis, 0);
        if ($punkte[0] == -1) {
            continue;
        }
        // addMatch($id1, $id2, $result)
        if ($group) {
            $dwz->addMatch($partien[$i]->zps . ":" . $partien[$i]->spieler, $partien[$i]->gzps . ":" . $partien[$i]->gegner, $punkte, $gpunkte);
        } else {
            $dwz->addMatch("p" . $partien[$i]->spieler, "p" . $partien[$i]->gegner, $punkte, $gpunkte);
        }
        $someMatch = true;
    }
    $result = $dwz->getAllPlayerObject();
    if (!$someMatch) {
        return array(false, "e_DWZnoMatch");
    }
    $sql = "UPDATE " . $table_list . " SET DWZ=?, I0=?, Punkte=?, Partien=?, We=?, Leistung=?, EFaktor=?, Niveau=? WHERE " . $playerId;
    $stmt = clm_core::$db->prepare($sql);
    // Ergebnis Schreiben
    foreach ($result as $id2 => $value) {
        // Korrektur Leistung: Anzeige bei weniger als 5 Spielen oder nur Siegen/Niederlagen nicht gewollt
        if ($value->n < 5 || $value->W == 0 || $value->W == $value->n) {
            $value->R_p = 0;
        }
        if ($group) {
            $id2 = explode(":", $id2);
            $stmt->bind_param('iididiiisii', $value->R_n, $value->R_nI, $value->W, $value->n, $value->W_e, $value->R_p, $value->E, $value->R_c, $id2[0], $id2[1], $id);
        } else {
            $id2 = explode("p", $id2);
            $stmt->bind_param('iididiiiii', $value->R_n, $value->R_nI, $value->W, $value->n, $value->W_e, $value->R_p, $value->E, $value->R_c, $id2[1], $id);
        }
        $stmt->execute();
    }
    $stmt->close();
    if ($group) {
        $table = clm_core::$db->liga->get($id);
    } else {
        $table = clm_core::$db->turniere->get($id);
    }
    if (!$table->isNew()) {
        $params = new clm_class_params($table->params);
        $params->set("inofDWZ", "1");
        $table->params = $params->params();
    }
    return array(true, "m_calculateDWZSuccess");
}