From 36d06f17fe7d9f815c53a887e9b57f5c6dc891b0 Mon Sep 17 00:00:00 2001
From: Table <romain.drouin@ensiie.fr>
Date: Sun, 8 May 2016 23:35:46 +0200
Subject: [PATCH] ajout de la modification de parties

---
 app/controller/AdminController.php |  11 +-
 app/model/Admin.php                | 169 +++++++++++++++++++++++++++++
 app/model/Partie.php               |   2 +-
 3 files changed, 173 insertions(+), 9 deletions(-)

diff --git a/app/controller/AdminController.php b/app/controller/AdminController.php
index fc80149..7693aea 100644
--- a/app/controller/AdminController.php
+++ b/app/controller/AdminController.php
@@ -500,6 +500,7 @@ class AdminController extends Controller {
 
     public function verifyModifPartieStep2()
     {
+        $id = $this->route["params"]["slug"];
         session_start();
         if (!isset($_SESSION['jeu_select'])) {
             self::error("<h1>Erreur : le jeu doit être renseigné.</h1>", "step0");
@@ -531,7 +532,6 @@ class AdminController extends Controller {
             }
         }
 
-
         $scores = $_POST["scores"];
         foreach ($scores as $s) {
             if (!is_numeric($s)) {
@@ -553,11 +553,9 @@ class AdminController extends Controller {
                 self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "stepe2");
                 die();
             }
-
-            $pb = Partie::modPartie($equipes, $scores, $jeu, $_SESSION['id_partie']);
+            $pb = Admin::ModifPartie($id,$equipes, $scores, $jeu);
             if (!$pb) {
                 unset($_SESSION['equipes']);
-                unset($_SESSION['id_partie']);
                 unset($_SESSION['jeu_select']);
                 header('Location:valid'); // Redirection vers la page OK
                 die();
@@ -581,11 +579,9 @@ class AdminController extends Controller {
                 self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "step2");
                 die();
             }
-            $pb = Partie::modPartie($joueurs, $scores, $jeu, $_SESSION['id_partie']);
+            $pb = Admin::ModifPartie($id, $joueurs, $scores, $jeu);
             if (!$pb) {
                 unset($_SESSION['jeu_select']);
-
-                unset($_SESSION['id_partie']);
                 unset($_SESSION['joueurs_select']);
                 //self::error("<h1>DEBUGGING</h1>", "step2");
                 //die();
@@ -604,5 +600,4 @@ class AdminController extends Controller {
             }
         }
     }
-
 }
diff --git a/app/model/Admin.php b/app/model/Admin.php
index 3a6a101..7729150 100644
--- a/app/model/Admin.php
+++ b/app/model/Admin.php
@@ -165,6 +165,18 @@ class Admin extends Model {
         return $res;
     }
 
+    public static function getListeScorePartie2($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne['score_partie'];
+        }
+        return $res;
+    }
+
     public static function getListeClassement($id) {
         $db = Database::getInstance(); // on récupère la connexion à la BDD
         $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
@@ -177,4 +189,161 @@ class Admin extends Model {
         return $res;
     }
 
+    public static function getListeClassement2($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne['classement'];
+        }
+        return $res;
+    }
+
+    public static function ModifPartie($id, $joueurs, $scores, $jeu)
+    {
+        $db = Database::getInstance();
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $stmt5 = $db->prepare($sql5);
+
+        $partieModif = Partie::getFromId($id);
+        // recherche des joueurs ayant fais une partie apres celle-ci (celle-ci incluse)
+        $sql1 = "SELECT * FROM R_joueur_partie JOIN R_partie ON R_joueur_partie.partie = R_partie.id WHERE date >= date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt1 = $db->prepare($sql1);
+        $stmt1->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu));
+        // pour tout les joueurs remettre les scrores comme-ci aucune partie après celle-ci a été jouée
+        $joueurDejaTraite = array();
+        while ($joueur = $stmt1->fetch(PDO::FETCH_ASSOC)) {
+            if (!in_array($joueur['joueur'], $joueurDejaTraite)) {
+                $joueurDejaTraite[] = $joueur['joueur'];
+                $stmt5->execute(array(':new_score' => $joueur['score'],
+                ':id_joueur' => $joueur['joueur'],
+                    ':id_jeu' => $joueur['jeu']));
+            }
+        }
+        // applique la partie
+        if (($resp = self::appliquePartie($id, $joueurs, $scores, $jeu)) > 0){
+            print $resp;
+            die();
+        }
+        // pour chaque partie apres celle modifier on la réapplique avec les nouveaux scores
+        $sql2 = "SELECT * FROM R_partie WHERE date > date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt2 = $db->prepare($sql2);
+        $stmt2->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu));
+        while ($ligne = $stmt2->fetch(PDO::FETCH_ASSOC)) {
+            $joueurs = $jeu->type == 'equipes' ? Admin::getEquipes($ligne['id']) : Admin::getListeJoueur($ligne['id']);
+            $scores = $jeu->type_scores == 'scores' ? Admin::getListeScorePartie2($ligne['id']) : Admin::getListeClassement2($ligne['id']);
+            self::appliquePartie($ligne['id'],$joueurs, $scores, $jeu);
+        }
+
+    }
+
+
+    static function appliquePartie($id_partie, $joueurs, $scores, $jeu) {
+        $db = Database::getInstance();
+        $sql3 = "SELECT score FROM R_joueur_jeu WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $sql4 = "UPDATE R_joueur_partie SET classement = :classement, score = :score, score_partie = :score_partie
+             WHERE joueur = :joueur AND partie = :partie;";
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);";
+        $stmt3 = $db->prepare($sql3);
+        $stmt4 = $db->prepare($sql4);
+        $stmt5 = $db->prepare($sql5);
+
+        $m = count($scores);
+
+        $old_score = array_fill(0, $m, 0);
+        $old_score_e = array();
+        foreach ($joueurs as $k => $joueur) {
+            // version avec équipes
+            if ($jeu->type == 'equipes') {
+                $old_score_e[$k] = array();
+                foreach ($joueur as $kj => $j) {
+                    if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug))) {
+                        if ($row = $stmt3->fetch()) {
+                            // Le joueur a déja joué à ce jeu
+                            $old_score_e[$k][$kj] = $row[0];
+                        } else {
+                            // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                            $old_score_e[$k][$kj] = 1000;
+                            $stmtN = $db->prepare($sqlN);
+                            if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                            } else
+                                return 2;
+                        }
+                    }
+                }
+                $old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]);
+            } else {
+                // récupération du score actuel de chaque joueur
+                if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug))) {
+                    if ($row = $stmt3->fetch()) {
+                        // Le joueur a déja joué à ce jeu
+                        $old_score[$k] = $row[0];
+                    } else {
+                        // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                        $old_score[$k] = 1000;
+                        $stmtN = $db->prepare($sqlN);
+                        if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                        } else
+                            return 2;
+                    }
+
+                }
+            }
+        }
+        // Calcul de la nouvelle différence de scores et du classement de chacun dans la partie
+        $diff_scores = ELO_scores($old_score, $scores, 32);
+        $classement = Partie::calcul_classement($diff_scores);
+        foreach ($joueurs as $k => $joueur) {
+            if ($jeu->type_scores == 'classement'){
+                $score = null;
+            }
+            else{
+                $score = $scores[$k];
+            }
+            if ($jeu->type == 'equipes') {
+                foreach ($joueur as $kj => $j) {
+                    // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                    // et le score de la partie) pour chaque joueur par équipe
+                    if ($stmt4->execute(array(":partie" => $id_partie,
+                        ":joueur" => $j->slug,
+                        ":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj], ":score_partie" => $score))
+                    ) {
+                        $newS = $old_score_e[$k][$kj] + $diff_scores[$k];
+                        // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                        if ($stmt5->execute(array(":new_score" => $newS,
+                            ":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug))
+                        ) {
+                        } else
+                            return 4;
+                    } else
+                        return 3;
+                }
+            } else {
+                // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                //  et le score de la partie) pour chaque joueur
+
+                if ($stmt4->execute(array(":partie" => $id_partie,
+                    ":joueur" => $joueur->slug,
+                    ":classement" => $classement[$k], ":score" => $old_score[$k], ":score_partie" => $score))
+                ) {
+                    $newS = $old_score[$k] + $diff_scores[$k];
+                    // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                    if ($stmt5->execute(array(":new_score" => $newS,
+                        ":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug))
+                    ) {
+                    } else
+                        return 4;
+                } else
+                    return 3;
+            }
+        }
+        // met à jour le classement de tous les joueurs
+        return Partie::updateClassement($jeu);
+    }
+
 }
\ No newline at end of file
diff --git a/app/model/Partie.php b/app/model/Partie.php
index 6ae8ae8..684b5eb 100644
--- a/app/model/Partie.php
+++ b/app/model/Partie.php
@@ -44,7 +44,7 @@ class Partie extends Model
         return false; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
     }
 
-    private static function calcul_classement($R)
+    public static function calcul_classement($R)
     {
         $m = count($R);
 
-- 
GitLab