From 473e6eb56ca1211be05d2b5fd814710f2ff78d38 Mon Sep 17 00:00:00 2001 From: Debulois Date: Sun, 13 Mar 2022 12:42:37 +0100 Subject: Mise ç jour de pas mal de chose et ajout de la possibilité de pouvoir ajouter/supprimer des catégories d'emploi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Database/dbmain.php | 10 +- Database/meth_dbadmin.php | 108 +++++++++++++++++++++ Database/meth_dbmission.php | 59 +++++++++++ Database/meth_dbsearch.php | 38 ++------ Database/meth_dbuser.php | 89 ++++++----------- Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb | Bin 13609 -> 13705 bytes .../Bdd_mysql/mysql_alphajob.mwb.bak | Bin 13622 -> 13611 bytes Documents_et_infos/Bdd_mysql/mysql_alphajob.png | Bin 47201 -> 48598 bytes Documents_et_infos/Bdd_mysql/mysql_alphajob.sql | 5 +- .../Zooning_maquette_graphique/infos_css.txt | 3 + Statics/Css/main.css | 22 ++--- Views/Includes/en/message.php | 40 ++++++-- Views/Includes/en/text.php | 16 ++- Views/Includes/en/title.php | 2 +- Views/Includes/fr/message.php | 34 +++++-- Views/Includes/fr/text.php | 16 ++- Views/Includes/fr/title.php | 2 +- Views/Includes/incl_form_admin.php | 90 +++++++++++++++++ Views/Includes/incl_form_delete.php | 60 ------------ Views/Includes/incl_form_userInfo.php | 8 +- Views/Includes/incl_global_navbar.php | 2 +- Views/Includes/incl_index_search.php | 2 +- Views/Includes/incl_table_myMission.php | 4 +- Views/admin.php | 35 +++++++ Views/delete.php | 35 ------- Wrapper/Functions/func_admin.php | 53 ++++++++++ Wrapper/Functions/func_delete.php | 19 ---- Wrapper/Functions/func_info.php | 2 +- Wrapper/Functions/func_login.php | 10 +- Wrapper/Functions/func_logout.php | 2 +- Wrapper/Functions/func_mission.php | 4 +- Wrapper/Functions/func_register.php | 2 +- Wrapper/Functions/func_search.php | 10 +- Wrapper/wrapper.php | 44 ++++++--- todo.txt | 16 +++ 35 files changed, 557 insertions(+), 285 deletions(-) create mode 100644 Database/meth_dbadmin.php create mode 100644 Database/meth_dbmission.php create mode 100644 Views/Includes/incl_form_admin.php delete mode 100644 Views/Includes/incl_form_delete.php create mode 100644 Views/admin.php delete mode 100644 Views/delete.php create mode 100644 Wrapper/Functions/func_admin.php delete mode 100644 Wrapper/Functions/func_delete.php create mode 100644 todo.txt diff --git a/Database/dbmain.php b/Database/dbmain.php index 532bb7c..262c55a 100644 --- a/Database/dbmain.php +++ b/Database/dbmain.php @@ -12,6 +12,8 @@ // final: ne peut etre ré-écris (overload) class DbMain { + // Pour gérer si "en production" + private $debug = True; // Salt pour chiffrement private $salt = "cTKXHBoN3oxymlhNem2h"; // Configuration du serveur MYSQL / MARIADB @@ -19,10 +21,9 @@ class DbMain { private $host = "127.0.0.1"; private $user = "root"; private $pass = ""; - private $debug = True; - // Déclaration des tables private $database = "alphajob"; + // Déclaration des tables // Timestamp auto si non renseigné // UserAccount, infos du compte nécessaire à la connection private $createTableUserAccount = "CREATE TABLE IF NOT EXISTS `alphajob`.`userAccount` ( @@ -65,8 +66,9 @@ class DbMain { // Liste des categories d'emploie possible private $createTableJobCategory = "CREATE TABLE IF NOT EXISTS `alphajob`.`jobCategory` ( - `jobCategoryId` INT UNSIGNED NOT NULL, - `categoryName` VARCHAR(128) NOT NULL, + `jobCategoryId` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `jobCategoryNameEn` VARCHAR(128) NOT NULL, + `jobCategoryNameFr` VARCHAR(128) NOT NULL, PRIMARY KEY (`jobCategoryId`) ) ENGINE = InnoDB diff --git a/Database/meth_dbadmin.php b/Database/meth_dbadmin.php new file mode 100644 index 0000000..32d6077 --- /dev/null +++ b/Database/meth_dbadmin.php @@ -0,0 +1,108 @@ +tableUserAccount; + // https://www.php.net/manual/fr/pdostatement.fetch.php + // "PDO::FETCH_ASSOC: retourne un tableau indexé + // par le nom de la colonne comme retourné dans le jeu de résultats" + $data = $this->exec_cmd($reqGetAll, array())->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // https://stackoverflow.com/questions/1361340/how-can-i-do-insert-if-not-exists-in-mysql + // Suppresion d'un utilisateur + final public function user_del($userId) { + // Préparation de la requète pour voir si l'utilisateur existe + // https://stackoverflow.com/questions/1676551/best-way-to-test-if-a-row-exists-in-a-mysql-table + $reqCheckExistId = "SELECT EXISTS(SELECT 1 FROM ".$this->tableUserAccount." WHERE userId = ? LIMIT 1)"; + // Exécution de la requète, fetchall pour avoir le résultat + // https://www.php.net/manual/fr/pdostatement.fetch.php + // struct par défaut req et index (fetch_both) = arr([0] => arr("req" => BOOL, [0] => BOOL)) + // PDO::FETCH_NUM : retourne un tableau indexé par le numéro de la colonne comme elle + // est retourné dans votre jeu de résultat, commençant à 0 + $reqResult = $this->exec_cmd($reqCheckExistId, array($userId))->fetchAll(PDO::FETCH_NUM); + // Si il existe + if ($reqResult[0][0]) { + // Préparation de la requète pour suppression + $reqDelUser = "DELETE FROM ".$this->tableUserAccount." WHERE userId = ?"; + // Exécution de la requète + $this->exec_cmd($reqDelUser, array($userId)); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Récupérer toutes les infos de la table jobCategory + final public function get_all_job_category() { + $reqGetAll = "SELECT * FROM ".$this->tableJobCategory; + $data = $this->exec_cmd($reqGetAll, array())->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Ajout d'une categorie + final public function job_category_register($jobCategoryNameEn, $jobCategoryNameFr) { + // Préparation et execution de la requète pour voir si la categorie existe en anglais + $reqCheckjobCategoryNameEn = "SELECT EXISTS(SELECT 1 FROM ".$this->tableJobCategory." WHERE jobCategoryNameEn = ? LIMIT 1)"; + $reqResultEn = $this->exec_cmd($reqCheckjobCategoryNameEn, array($jobCategoryNameEn))->fetchAll(PDO::FETCH_NUM); + // Si il n'existe pas en anglais + if (!$reqResultEn[0][0]) { + // Préparation et execution de la requète pour voir si la categorie existe en Français + $reqCheckjobCategoryNameFr = "SELECT EXISTS(SELECT 1 FROM ".$this->tableJobCategory." WHERE jobCategoryNameFr = ? LIMIT 1)"; + $reqResultFr = $this->exec_cmd($reqCheckjobCategoryNameFr, array($jobCategoryNameFr))->fetchAll(PDO::FETCH_NUM); + // Si il n'existe pas en Français non plus + if (!$reqResultFr[0][0]) { + // Préparation de la requète pour l'ajout + $reqjobCategoryNameAdd = "INSERT INTO ".$this->tableJobCategory." + (jobCategoryNameEn, jobCategoryNameFr) + VALUES + (? ,?)"; + // Exécution de la requète + $this->exec_cmd($reqjobCategoryNameAdd, array($jobCategoryNameEn, $jobCategoryNameFr)); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Suppresion d'un utilisateur + final public function job_category_del($jobCategoryId) { + // Préparation de la requète pour voir si l'utilisateur existe + $reqCheckExistId = "SELECT EXISTS(SELECT 1 FROM ".$this->tableJobCategory." WHERE jobCategoryId = ? LIMIT 1)"; + // Exécution de la requète, fetchall pour avoir le résultat + // struct par défaut req et index (fetch_both) = arr([0] => arr("req" => BOOL, [0] => BOOL)) + // fetch_num pour casser l'index "req" en chiffre, dict -> list + $reqResult = $this->exec_cmd($reqCheckExistId, array($jobCategoryId))->fetchAll(PDO::FETCH_NUM); + // Si il existe + if ($reqResult[0][0]) { + // Préparation de la requète pour suppression + $reqDelJobCategory = "DELETE FROM ".$this->tableJobCategory." WHERE jobCategoryId = ?"; + // Exécution de la requète + $this->exec_cmd($reqDelJobCategory, array($jobCategoryId)); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } +} +?> \ No newline at end of file diff --git a/Database/meth_dbmission.php b/Database/meth_dbmission.php new file mode 100644 index 0000000..006f572 --- /dev/null +++ b/Database/meth_dbmission.php @@ -0,0 +1,59 @@ +check_exist_pro($proId); + // Si il existe + if ($exist) { + // Préparation de la requète pour enregistrement de la mission + $reqAddMission = "INSERT INTO ".$this->tableMission." + (date, subject, note, review, clientId, proId) + VALUES (?, ?, ?, ?, ?, ?)"; + // Exécution de la requète + $this->exec_cmd($reqAddMission, + array(date("Y-m-d H:i:s"), $subject, + $note, $review, + $clientId, $proId + ) + ); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Récupérations des missions d'un pro par son id + final public function get_mission_by_id($id) { + $reqGetAllMission = "SELECT subject, note, review, lastname FROM ".$this->tableMission." + LEFT JOIN ".$this->tableUserInfo." + ON ".$this->tableMission.".missionId = ".$this->tableUserInfo.".userId + WHERE proId = ?"; + $data = $this->exec_cmd($reqGetAllMission, array($id))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Compte le nombre de mission d'un consultant par son nom + final public function count_pro_missions_by_lastname($name) { + $reqCountMission = "SELECT COUNT(*) FROM ".$this->tableMission." + INNER JOIN ".$this->tableUserInfo." + ON ".$this->tableMission.".proId = ".$this->tableUserInfo.".userId + WHERE lastname = ?"; + $data = $this->exec_cmd($reqCountMission, array($name))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + +} \ No newline at end of file diff --git a/Database/meth_dbsearch.php b/Database/meth_dbsearch.php index a90925c..8a95a67 100644 --- a/Database/meth_dbsearch.php +++ b/Database/meth_dbsearch.php @@ -10,21 +10,15 @@ require_once(dirname( __FILE__ )."/dbmain.php"); // Extension de cette classe avec dbmain class DbSearch extends DbMain { - // Récupérer toutes les infos de la table userAccount - final public function search_all() { - $reqGetAll = "SELECT * FROM ".$this->tableUserAccount; - $data = $this->exec_cmd($reqGetAll, array())->fetchAll(PDO::FETCH_ASSOC); - return $data; - } // Récupération des infos d'un compte par son id - final public function search_user_by_id($id) { + final public function get_user_account_by_id($id) { $reqSearchUser = "SELECT userId, email, inscriptionDate, isClient, isPro, isAdmin FROM ".$this->tableUserAccount." WHERE userId = ?"; $data = $this->exec_cmd($reqSearchUser, array($id))->fetch(PDO::FETCH_ASSOC); return $data; } - + // Récupération des infos d'un utilisateur par son id final public function get_user_info_by_id($id) { $reqGetUserInfo = "SELECT lastname, firstname, job, degree, @@ -35,9 +29,10 @@ class DbSearch extends DbMain { return $data; } - // Récupération des infos d'un consultant par son nom - final public function search_consultant_by_name($research) { - $reqSearchConsultant = "SELECT userId, lastname, firstname, job, capability FROM ".$this->tableUserInfo." + // Récupération des infos d'un pro par son nom + final public function get_pro_info_by_lastname($research) { + $reqSearchConsultant = "SELECT ".$this->tableUserInfo.".userId, lastname, firstname, job, capability + FROM ".$this->tableUserInfo." INNER JOIN ".$this->tableUserAccount." ON ".$this->tableUserInfo.".userId = ".$this->tableUserAccount.".userId WHERE isPro = '1' AND lastname LIKE CONCAT('%', ?, '%')"; @@ -46,7 +41,7 @@ class DbSearch extends DbMain { } // Récupération des notes d'un consultant par son nom - final public function get_consultant_note_by_name($name) { + final public function get_pro_note_by_lastname($name) { $reqCountMission = "SELECT note FROM ".$this->tableMission." INNER JOIN ".$this->tableUserInfo." ON ".$this->tableMission.".proId = ".$this->tableUserInfo.".userId @@ -55,24 +50,5 @@ class DbSearch extends DbMain { return $data; } - // Récupérations des missions d'un consultant par son id - final public function get_all_mission_by_id($id) { - $reqGetAllMission = "SELECT subject, note, review, lastname FROM ".$this->tableMission." - LEFT JOIN ".$this->tableUserInfo." - ON ".$this->tableMission.".missionId = ".$this->tableUserInfo.".userId - WHERE proId = ?"; - $data = $this->exec_cmd($reqGetAllMission, array($id))->fetchAll(PDO::FETCH_ASSOC); - return $data; - } - - // Compte le nombre de mission d'un consultant par son nom - final public function count_consultant_mission_by_name($name) { - $reqCountMission = "SELECT COUNT(*) FROM ".$this->tableMission." - INNER JOIN ".$this->tableUserInfo." - ON ".$this->tableMission.".proId = ".$this->tableUserInfo.".userId - WHERE lastname = ?"; - $data = $this->exec_cmd($reqCountMission, array($name))->fetchAll(PDO::FETCH_ASSOC); - return $data; - } } ?> \ No newline at end of file diff --git a/Database/meth_dbuser.php b/Database/meth_dbuser.php index cba1683..c0afb8c 100644 --- a/Database/meth_dbuser.php +++ b/Database/meth_dbuser.php @@ -8,8 +8,13 @@ require_once(dirname( __FILE__ )."/dbmain.php"); // Extension de cette classe avec dbmain class DbUser extends DbMain { + + // **************************************************************************** + // Gestion d'un utilisateur + // **************************************************************************** + // Enregistrement d'un nouvel utilisateur - final public function add_user($email, $pass, $is_client, $is_pro, $is_admin) { + final public function user_register($email, $pass, $is_client, $is_pro, $is_admin) { // On vérifie si l'email existe deja dans la bdd $exist = $this->check_exist_email($email); // Si non @@ -38,28 +43,25 @@ class DbUser extends DbMain { } } - // Suppresion d'un utilisateur - final public function del_user($userId) { - // Préparation de la requète pour voir si l'utilisateur existe - $reqCheckExistId = "SELECT EXISTS(SELECT * FROM ".$this->tableUserAccount." WHERE userId = ?)"; - // Exécution de la requète - $data = $this->exec_cmd($reqCheckExistId, array($userId))->fetchAll(PDO::FETCH_NUM); - // Si il existe - if ($data[0][0]) { - // Préparation de la requète pour suppression - $reqDelUser = "DELETE FROM ".$this->tableUserAccount." WHERE userId = ?"; - // Exécution de la requète - $this->exec_cmd($reqDelUser, array($userId)); - // Retourne 1 pour réussite - return 1; - } else { - // Retourne 0 pour échec - return 0; + // Vérification de la combinaison email - pass pour authentification + final public function user_check_credential($email, $pass) { + // Préparation de la requète pour récupérer les infos ou l'email est présent + $reqCheckCredential = "SELECT userId, password + FROM ".$this->tableUserAccount." WHERE email = ? "; + // Chiffrement du mot de passe + $crypt = $this->crypt_pass($pass); + // Execution de la requète + $data = $this->exec_cmd($reqCheckCredential, array($email))->fetchAll(PDO::FETCH_ASSOC); + // Vérifiaction de correspondance email & pass + foreach ($data as $rows) { + if ($rows["password"] == $crypt) { + return $rows["userId"]; + } } } // Mise à jour des infos d'un utilisateur - final public function update_user_info($lastname, $firstname, $job, $degree, + final public function user_infos_update($lastname, $firstname, $job, $degree, $capability, $description, $phoneNumber, $adress, $zipCode, $city, $userId) { // Préparation de la requète pour mise à jour des infos @@ -76,50 +78,13 @@ class DbUser extends DbMain { ); } - // Enregistrement d'une mission - final public function register_mission($subject, $note, $review, $clientId, $proId) { - // Vérification de l'existance de l'id de consultant - $exist = $this->check_exist_pro($proId); - // Si il existe - if ($exist) { - // Préparation de la requète pour enregistrement de la mission - $reqAddMission = "INSERT INTO ".$this->tableMission." - (date, subject, note, review, clientId, proId) - VALUES (?, ?, ?, ?, ?, ?)"; - // Exécution de la requète - $this->exec_cmd($reqAddMission, - array(date("Y-m-d H:i:s"), $subject, - $note, $review, - $clientId, $proId - ) - ); - // Retourne 1 pour réussite - return 1; - } else { - // Retourne 0 pour échec - return 0; - } - } - // Vérification de la combinaison email - pass pour authentification - final public function check_credential($email, $pass) { - // Préparation de la requète pour récupérer les infos ou l'email est présent - $reqCheckCredential = "SELECT userId, password - FROM ".$this->tableUserAccount." WHERE email = ? "; - // Chiffrement du mot de passe - $crypt = $this->crypt_pass($pass); - // Execution de la requète - $data = $this->exec_cmd($reqCheckCredential, array($email))->fetchAll(PDO::FETCH_ASSOC); - // Vérifiaction de correspondance email & pass - foreach ($data as $rows) { - if ($rows["password"] == $crypt) { - return $rows["userId"]; - } - } - } + // **************************************************************************** + // Gestion du token-autologin + // **************************************************************************** // Vérification de la combinaison email - jeton d'auto-login pour authentification - final public function check_token_autologin($email, $token) { + final public function autologin_token_check($email, $token) { // Préparation de la requète pour récupérer les infos ou l'email est présent $reqCheckToken = "SELECT userId, tokenAutoLogin FROM ".$this->tableUserAccount." WHERE email = ?"; @@ -134,7 +99,7 @@ class DbUser extends DbMain { } // Mise à jour du jeton d'auto-login - final public function update_token_autologin($email, $token) { + final public function autologin_token_update($email, $token) { // Préparation de la requète pour mise à jour du jeton d'auto-connection $reqUpdateToken = "UPDATE ".$this->tableUserAccount." SET tokenAutoLogin = ? WHERE email = ?"; @@ -143,7 +108,7 @@ class DbUser extends DbMain { } // Supression du jeton d'auto-login - final public function delete_token_autologin($email) { + final public function autologin_token_delete($email) { // Préparation de la requète pour supression du jeton d'auto-connection $reqDeleteToken = "UPDATE ".$this->tableUserAccount." SET tokenAutoLogin = NULL WHERE email = ?"; diff --git a/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb b/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb index 3a0658c..6d49548 100644 Binary files a/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb and b/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb differ diff --git a/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb.bak b/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb.bak index 5f39098..7a6e7a2 100644 Binary files a/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb.bak and b/Documents_et_infos/Bdd_mysql/mysql_alphajob.mwb.bak differ diff --git a/Documents_et_infos/Bdd_mysql/mysql_alphajob.png b/Documents_et_infos/Bdd_mysql/mysql_alphajob.png index 89e8df5..ea9e271 100644 Binary files a/Documents_et_infos/Bdd_mysql/mysql_alphajob.png and b/Documents_et_infos/Bdd_mysql/mysql_alphajob.png differ diff --git a/Documents_et_infos/Bdd_mysql/mysql_alphajob.sql b/Documents_et_infos/Bdd_mysql/mysql_alphajob.sql index d556d0a..dc0d445 100644 --- a/Documents_et_infos/Bdd_mysql/mysql_alphajob.sql +++ b/Documents_et_infos/Bdd_mysql/mysql_alphajob.sql @@ -1,5 +1,5 @@ -- MySQL Script generated by MySQL Workbench --- Wed Mar 2 13:18:27 2022 +-- Sun Mar 13 12:15:01 2022 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering @@ -39,7 +39,8 @@ DEFAULT CHARACTER SET = utf8; -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `exophp`.`jobCategrory` ( `jobCategoryId` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `categoryName` VARCHAR(128) NOT NULL, + `jobCategoryNameEn` VARCHAR(128) NOT NULL, + `jobCategoryNameFr` VARCHAR(128) NOT NULL, PRIMARY KEY (`jobCategoryId`)) ENGINE = InnoDB; diff --git a/Documents_et_infos/Zooning_maquette_graphique/infos_css.txt b/Documents_et_infos/Zooning_maquette_graphique/infos_css.txt index 98eaea4..33af86c 100644 --- a/Documents_et_infos/Zooning_maquette_graphique/infos_css.txt +++ b/Documents_et_infos/Zooning_maquette_graphique/infos_css.txt @@ -1,3 +1,6 @@ +Ressources: +https://github.com/bradtraversy/design-resources-for-developers +https://www.photopea.com/ Tailles écrans: https://gbksoft.com/blog/common-screen-sizes-for-responsive-web-design/ diff --git a/Statics/Css/main.css b/Statics/Css/main.css index 65b6d89..c3fe421 100644 --- a/Statics/Css/main.css +++ b/Statics/Css/main.css @@ -323,7 +323,7 @@ pre { #register, #userInfo, #message, -#delete, +#admin, #mission, #myMission, #search { @@ -348,7 +348,7 @@ pre { #register h2, #userInfo h2, #message h2, -#delete h2, +#admin h2, #search h2, #mission h2, #myMission h2 { @@ -363,7 +363,7 @@ pre { #userInfo form, #register form, #mission form, -#delete form, +#admin form, #search form { display: flex; flex-direction: column; @@ -374,7 +374,7 @@ pre { } #search form, -#delete form { +#admin form { flex-direction: row; } @@ -382,7 +382,7 @@ pre { #userInfo label, #register label, #mission label, -#delete label, +#admin label, #search label { width: 80%; display: flex; @@ -392,7 +392,7 @@ pre { #userInfo i, #register i, #mission i, -#delete i, +#admin i, #search i { width: 90px; height: 2em; @@ -403,7 +403,7 @@ pre { } #myMission table, -#delete table, +#admin table, #search table { color: var(--text); padding: 5%; @@ -413,7 +413,7 @@ pre { } #myMission th, -#delete th, +#admin th, #search th { font-size: 15px; border: 2px solid var(--mainSiteColor); @@ -421,7 +421,7 @@ pre { } #myMission td, -#delete td, +#admin td, #search td { border: 2px solid var(--tableBorder); @@ -459,7 +459,7 @@ pre { #userInfo input[type="submit"], #mission input[type="submit"], #search input[type="submit"], -#delete input[type="submit"], +#admin input[type="submit"], #register input[type="submit"] { font-size: 17px; font-weight: bold; @@ -474,7 +474,7 @@ pre { #userInfo input[type="submit"]:hover, #mission input[type="submit"]:hover, #search input[type="submit"]:hover, -#delete input[type="submit"]:hover, +#admin input[type="submit"]:hover, #register input[type="submit"]:hover { cursor: pointer; color: var(--bg); diff --git a/Views/Includes/en/message.php b/Views/Includes/en/message.php index 4303907..6e5955f 100644 --- a/Views/Includes/en/message.php +++ b/Views/Includes/en/message.php @@ -9,9 +9,9 @@ $message = [ // Delete // 0 Message réussitee ["success" => true, - "title" => "Delete an user.", - "info" => "User deleted !", - "timer" => true], + "title" => "Delete an user.", + "info" => "User deleted !", + "timer" => true], // 1 Message échec ["success" => false, "title" => "Delete an user.", @@ -54,9 +54,9 @@ $message = [ // Ajout mission // 8 Message réussitee ["success" => true, - "title" => "Register a mission.", - "info" => "Mission registered !", - "timer" => true], + "title" => "Register a mission.", + "info" => "Mission registered !", + "timer" => true], // 9 Message échec ["success" => false, "title" => "Register a mission.", @@ -65,13 +65,35 @@ $message = [ // Ajout utilisateur // 10 Message réussitee ["success" => true, - "title" => "Register an user.", - "info" => "User successfully registered !", - "timer" => true], + "title" => "Register an user.", + "info" => "User successfully registered !", + "timer" => true], // 11 Message échec ["success" => false, "title" => "Register an user.", "info" => "Error, user not registered.", "timer" => true], + // Ajout categorie + // 12 Message réussitee + ["success" => true, + "title" => "Add a job category.", + "info" => "Category added !", + "timer" => true], + // 13 Message échec + ["success" => false, + "title" => "Add a job category.", + "info" => "Category not added.", + "timer" => true], + // Suppression categorie + // 14 Message réussitee + ["success" => true, + "title" => "Deletion of a job category.", + "info" => "Category deleted !", + "timer" => true], + // 15 Message échec + ["success" => false, + "title" => "Deletion of a job category.", + "info" => "Category not deleted !", + "timer" => true], ]; ?> \ No newline at end of file diff --git a/Views/Includes/en/text.php b/Views/Includes/en/text.php index 7caf330..1111e35 100644 --- a/Views/Includes/en/text.php +++ b/Views/Includes/en/text.php @@ -3,10 +3,16 @@ // Description: Texte du site // **************************************************************************** $text = [ - "incl_form_delete" => [ - "h2" => "Delete an user", - "id" => "ID to delete", - "submit" => "Delete", + "incl_form_admin" => [ + "h2Job" => "Manage job category", + "formJobAddEn" => "Name of the category in English", + "formJobAddFr" => "Name of the category in French", + "submitJobAdd" => "Add", + "selJobDel" => "Choose a job to delete", + "submitJobDel" => "Delete", + "h2Del" => "Delete an user", + "formDel" => "ID to delete", + "submitDel" => "Delete", ], "incl_global_footer" => [ "main" => "Made by Debulois Quentin for my professional folder.
December 2021, all rights reserved.", @@ -48,7 +54,7 @@ $text = [ "btnInfos" => "Modif. infos", "btnMission" => "Register mission", "btnMyMission" => "My missions", - "btnDelete" => "Delete an user", + "btnAdmin" => "Administration", "btnLogin" => "Sign-in", "btnLogout" => "Loggout", "btnRegister" => "Sign-up", diff --git a/Views/Includes/en/title.php b/Views/Includes/en/title.php index 3655a7a..d08f444 100644 --- a/Views/Includes/en/title.php +++ b/Views/Includes/en/title.php @@ -10,6 +10,6 @@ $title = [ "myMission" => "AlphaJob - My missions", "register" => "AlphaJob - Register an user", "userInfo" => "AlphaJob - My user information", - "delete" => "AlphaJob - Delete an user" + "admin" => "AlphaJob - Administration of alphajob" ]; ?> \ No newline at end of file diff --git a/Views/Includes/fr/message.php b/Views/Includes/fr/message.php index 0066cb5..408bd82 100644 --- a/Views/Includes/fr/message.php +++ b/Views/Includes/fr/message.php @@ -54,9 +54,9 @@ $message = [ // Ajout mission // 8 Message réussitee ["success" => true, - "title" => "Enregistrement d'une mission.", - "info" => "Mission enregistrée !", - "timer" => true], + "title" => "Enregistrement d'une mission.", + "info" => "Mission enregistrée !", + "timer" => true], // 9 Message échec ["success" => false, "title" => "Enregistrement d'une mission.", @@ -65,13 +65,35 @@ $message = [ // Ajout utilisateur // 10 Message réussitee ["success" => true, - "title" => "Inscription", - "info" => "Utilisateur inscrit !", - "timer" => true], + "title" => "Inscription", + "info" => "Utilisateur inscrit !", + "timer" => true], // 11 Message échec ["success" => false, "title" => "Inscription.", "info" => "Erreur, utilisateur non enregistré.", "timer" => true], + // Ajout categorie + // 12 Message réussitee + ["success" => true, + "title" => "Ajout d'une categorie.", + "info" => "Categorie ajoutée !", + "timer" => true], + // 13 Message échec + ["success" => false, + "title" => "Ajout d'une categorie.", + "info" => "Categorie non ajoutée.", + "timer" => true], + // Suppression categorie + // 14 Message réussitee + ["success" => true, + "title" => "Suppression d'une categorie.", + "info" => "Categorie supprimée !", + "timer" => true], + // 15 Message échec + ["success" => false, + "title" => "Suppression d'une categorie.", + "info" => "Categorie non supprimée.", + "timer" => true], ]; ?> \ No newline at end of file diff --git a/Views/Includes/fr/text.php b/Views/Includes/fr/text.php index 8d72f26..3b7b989 100644 --- a/Views/Includes/fr/text.php +++ b/Views/Includes/fr/text.php @@ -3,10 +3,16 @@ // Description: Texte du site // **************************************************************************** $text = [ - "incl_form_delete" => [ - "h2" => "Supprimer un utilisateur", - "id" => "ID à supprimer", - "submit" => "Supprimer", + "incl_form_admin" => [ + "h2Job" => "Gestion des categories d'emploi", + "formJobAddEn" => "Nom de la catégorie en Englais", + "formJobAddFr" => "Nom de la catégorie en Français", + "submitJobAdd" => "Ajouter", + "selJobDel" => "Choisir une categorie à suppr.", + "submitJobDel" => "Suppr.", + "h2Del" => "Supprimer un utilisateur", + "formDel" => "ID à supprimer", + "submitDel" => "Supprimer", ], "incl_global_footer" => [ "main" => "Réalisé par Debulois Quentin pour mon dossier professionel.
Decembre 2021, tous droits réservés.", @@ -48,7 +54,7 @@ $text = [ "btnInfos" => "Modif. infos", "btnMission" => "Enreg. mission", "btnMyMission" => "Mes missions", - "btnDelete" => "Suppr. utilisateur", + "btnAdmin" => "Administration", "btnLogin" => "Connection", "btnLogout" => "Déconnection", "btnRegister" => "Inscription", diff --git a/Views/Includes/fr/title.php b/Views/Includes/fr/title.php index f0537b2..25b6dd0 100644 --- a/Views/Includes/fr/title.php +++ b/Views/Includes/fr/title.php @@ -10,6 +10,6 @@ $title = [ "myMission" => "AlphaJob - Mes missions", "register" => "AlphaJob - Inscription", "userInfo" => "AlphaJob - Mes informations", - "delete" => "AlphaJob - Supprimer un utilisateur" + "admin" => "AlphaJob - Administration d'alphajob" ]; ?> \ No newline at end of file diff --git a/Views/Includes/incl_form_admin.php b/Views/Includes/incl_form_admin.php new file mode 100644 index 0000000..ef34daa --- /dev/null +++ b/Views/Includes/incl_form_admin.php @@ -0,0 +1,90 @@ + +
+ +
+

'.$text[basename(__FILE__, ".php")]["h2Job"].'

+
+ + +
+ +
+ + +
'.PHP_EOL); + +// Form pour la suppression et envoie au wrappeur. +echo(' +

'.$text[basename(__FILE__, ".php")]["h2Del"].'

+
+ + +
'.PHP_EOL); + +// Récupération de tous les utilisateurs. +$result = $dbadmin->get_all_users_account(); +// Affichage de la table. +echo(" + + + ".PHP_EOL); +// Affichage des en-tête de colonne. +foreach($header[0] as $header) { + echo(" ".PHP_EOL); +} +echo(" ".PHP_EOL); +// Affichage du résultat de la recherche. +foreach ($result as $rows) { + echo(" + ".PHP_EOL); + foreach ($rows as $key => $value) { + // Traduction du résultat si reponse binaire en Oui / Non. + if (($key == "isClient" || $key == "isPro" || $key == "isAdmin") && $value == "1") { + echo(" ".PHP_EOL); + } elseif (($key == "isClient" || $key == "isPro" || $key == "isAdmin") && $value == "0") { + echo(" ".PHP_EOL); + } else { + echo(" ".PHP_EOL); + } + } + echo(" ".PHP_EOL); +} +echo('
".$header."
".$yes."
".$no."
".$value."
+ +
+
'.PHP_EOL); + +?> \ No newline at end of file diff --git a/Views/Includes/incl_form_delete.php b/Views/Includes/incl_form_delete.php deleted file mode 100644 index 99ce216..0000000 --- a/Views/Includes/incl_form_delete.php +++ /dev/null @@ -1,60 +0,0 @@ - -
- -
-

'.$text[basename(__FILE__, ".php")]["h2"].'

-
- - -
'.PHP_EOL); -// Récupération de tous les utilisateurs. -$result = $dbsearch->search_all(); -// Affichage de la table. -echo(" - - - ".PHP_EOL); -// Affichage des en-tête de colonne. -foreach($header[0] as $header) { - echo(" ".PHP_EOL); -} -echo(" ".PHP_EOL); -// Affichage du résultat de la recherche. -foreach ($result as $rows) { - echo(" - ".PHP_EOL); - foreach ($rows as $key => $value) { - // Traduction du résultat si reponse binaire en Oui / Non. - if (($key == "isClient" || $key == "isPro" || $key == "isAdmin") && $value == "1") { - echo(" ".PHP_EOL); - } elseif (($key == "isClient" || $key == "isPro" || $key == "isAdmin") && $value == "0") { - echo(" ".PHP_EOL); - } else { - echo(" ".PHP_EOL); - } - } - echo(" ".PHP_EOL); -} -echo('
".$header."
".$yes."
".$no."
".$value."
- -
-
'.PHP_EOL); - -?> \ No newline at end of file diff --git a/Views/Includes/incl_form_userInfo.php b/Views/Includes/incl_form_userInfo.php index 4cc509c..760838d 100644 --- a/Views/Includes/incl_form_userInfo.php +++ b/Views/Includes/incl_form_userInfo.php @@ -56,19 +56,19 @@ echo(' diff --git a/Views/Includes/incl_global_navbar.php b/Views/Includes/incl_global_navbar.php index 86241e9..1572fa6 100644 --- a/Views/Includes/incl_global_navbar.php +++ b/Views/Includes/incl_global_navbar.php @@ -30,7 +30,7 @@ if (isset($_SESSION["loggedIn"]) if (isset($_SESSION["isAdmin"]) && $_SESSION["isAdmin"] == "1" ) { - echo('
  • '.$text[basename(__FILE__, ".php")]["btnDelete"].'
  • '.PHP_EOL); + echo('
  • '.$text[basename(__FILE__, ".php")]["btnAdmin"].'
  • '.PHP_EOL); } echo('
  • '.$text[basename(__FILE__, ".php")]["btnInfos"].'
  • '.$text[basename(__FILE__, ".php")]["btnLogout"].'
  • '.PHP_EOL); diff --git a/Views/Includes/incl_index_search.php b/Views/Includes/incl_index_search.php index df6372a..a0e0be4 100644 --- a/Views/Includes/incl_index_search.php +++ b/Views/Includes/incl_index_search.php @@ -67,7 +67,7 @@ if (isset($_SESSION["search"])) { if ($_SESSION["search"]["isResearch"]) { echo('
    - +
    '); diff --git a/Views/Includes/incl_table_myMission.php b/Views/Includes/incl_table_myMission.php index b7e4ba9..35e69d4 100644 --- a/Views/Includes/incl_table_myMission.php +++ b/Views/Includes/incl_table_myMission.php @@ -9,9 +9,9 @@ require_once(dirname(__FILE__)."/".$_SESSION["lang"]."/table.php"); // Import des metodes de la base de donnée pour les recherches. require_once(dirname(__FILE__)."/../../Database/meth_dbsearch.php"); // Instanciation de la bdd avec les méthodes de recherche. -$dbsearch = new DbSearch; +$dbmission = new DbMission; // Recherches des missions avec l'id de l'utilisateur actuellement connecté. -$result = $dbsearch->get_all_mission_by_id($_SESSION["userId"]); +$result = $dbmission->get_mission_by_id($_SESSION["userId"]); echo('
    diff --git a/Views/admin.php b/Views/admin.php new file mode 100644 index 0000000..6af1c7c --- /dev/null +++ b/Views/admin.php @@ -0,0 +1,35 @@ + + +'.PHP_EOL); ?> + + + +".$title[basename(__FILE__, ".php")]."".PHP_EOL); ?> + + + + + + + + \ No newline at end of file diff --git a/Views/delete.php b/Views/delete.php deleted file mode 100644 index c11c768..0000000 --- a/Views/delete.php +++ /dev/null @@ -1,35 +0,0 @@ - - -'.PHP_EOL); ?> - - - -".$title[basename(__FILE__, ".php")]."".PHP_EOL); ?> - - - - - - - - \ No newline at end of file diff --git a/Wrapper/Functions/func_admin.php b/Wrapper/Functions/func_admin.php new file mode 100644 index 0000000..05ad337 --- /dev/null +++ b/Wrapper/Functions/func_admin.php @@ -0,0 +1,53 @@ +user_del($userId); + // Sélection du message à affiché en fonction de réussite ou pas. + if ($deleted) { + $messageNumber = 0; + } else { + $messageNumber = 1; + } + // Redirection vers message avec l'index du message à afficher. + $_SESSION["messageNumber"] = $messageNumber; + header("Location: /Views/message.php"); + die(); +} + +function job_category_add($jobCategoryNameEn, $jobCategoryNameFr) { + $dbadmin = new DbAdmin; + // https://www.w3schools.com/php/func_string_strtolower.asp + $added = $dbadmin->job_category_register( + ucwords(strtolower($jobCategoryNameEn)), + ucwords(strtolower($jobCategoryNameFr)) + ); + // Sélection du message à affiché en fonction de réussite ou pas. + if ($added) { + $messageNumber = 12; + } else { + $messageNumber = 13; + } + // Redirection vers message avec l'index du message à afficher. + $_SESSION["messageNumber"] = $messageNumber; + header("Location: /Views/message.php"); + die(); +} + +function job_category_del($jobCategoryId) { + $dbadmin = new DbAdmin; + $deleted = $dbadmin->job_category_del($jobCategoryId); + // Sélection du message à affiché en fonction de réussite ou pas. + if ($deleted) { + $messageNumber = 14; + } else { + $messageNumber = 15; + } + // Redirection vers message avec l'index du message à afficher. + $_SESSION["messageNumber"] = $messageNumber; + header("Location: /Views/message.php"); + die(); +} +?> \ No newline at end of file diff --git a/Wrapper/Functions/func_delete.php b/Wrapper/Functions/func_delete.php deleted file mode 100644 index b118e56..0000000 --- a/Wrapper/Functions/func_delete.php +++ /dev/null @@ -1,19 +0,0 @@ -del_user($userId); - // Sélection du message à affiché en fonction de réussite ou pas. - if ($deleted) { - $messageNumber = 0; - } else { - $messageNumber = 1; - } - // Redirection vers message avec l'index du message à afficher. - $_SESSION["messageNumber"] = $messageNumber; - header("Location: /Views/message.php"); - die(); -} -?> \ No newline at end of file diff --git a/Wrapper/Functions/func_info.php b/Wrapper/Functions/func_info.php index d883d86..97c12c5 100644 --- a/Wrapper/Functions/func_info.php +++ b/Wrapper/Functions/func_info.php @@ -6,7 +6,7 @@ function modify_user_info($lastname, $firstname, $job, $degree, $capabilty, $description, $phoneNumber, $adress, $zipCode, $city, $userId) { $dbuser = new DbUser; - $dbuser->update_user_info($lastname, $firstname, $job, $degree, + $dbuser->user_infos_update($lastname, $firstname, $job, $degree, $capabilty, $description, $phoneNumber, $adress, $zipCode, $city, $userId); // Redirection vers message avec l'index du message à afficher. diff --git a/Wrapper/Functions/func_login.php b/Wrapper/Functions/func_login.php index 3966301..39cf931 100644 --- a/Wrapper/Functions/func_login.php +++ b/Wrapper/Functions/func_login.php @@ -10,13 +10,13 @@ function login($cookie, $email = null, $pass = null, $remember = false) { $dbuser = new DbUser; // On vérifie si la connection se fait via le formulaire de connection ou par cookie if (!$cookie) { - $userId = $dbuser->check_credential($email, $pass); + $userId = $dbuser->user_check_credential($email, $pass); // ou par cookie. } else { // On essaie une fois. - $userId = $dbuser->check_token_autologin($cookie[0], $cookie[1]); + $userId = $dbuser->autologin_token_check($cookie[0], $cookie[1]); // Et on le supprime. - $dbuser->delete_token_autologin($cookie[0]); + $dbuser->autologin_token_delete($cookie[0]); } // Si on a un résultat valide. if ($userId) { @@ -24,7 +24,7 @@ function login($cookie, $email = null, $pass = null, $remember = false) { // LoggedIn devien "true". $_SESSION["loggedIn"] = "1"; // et on remplie les variables de la session avec les infos de l'utilisateur. - $userInfo = $dbsearch->search_user_by_id($userId); + $userInfo = $dbsearch->get_user_account_by_id($userId); foreach ($userInfo as $key => $value) { $_SESSION[$key] = $value; } @@ -35,7 +35,7 @@ function login($cookie, $email = null, $pass = null, $remember = false) { // On génère une chaine de caractère aléatoire en supprimant les caractères spéciaux de base64. $token = str_replace(["+", "/", "="], "", base64_encode(random_bytes(32))); // On update le nouveau token. - $dbuser->update_token_autologin($_SESSION["email"], $token); + $dbuser->autologin_token_update($_SESSION["email"], $token); // Enfin on place l'ensemble sur le navigateur du client codé en base64. setcookie($name, base64_encode(json_encode(array($_SESSION["email"], $token))), diff --git a/Wrapper/Functions/func_logout.php b/Wrapper/Functions/func_logout.php index 20de5a3..1a40235 100644 --- a/Wrapper/Functions/func_logout.php +++ b/Wrapper/Functions/func_logout.php @@ -9,7 +9,7 @@ function logout() { // On instancie les méthodes de gestion de la BDD. $dbuser = new DbUser; // On supprime le token d'auto-connection dans la BDD. - $dbuser->delete_token_autologin($_SESSION["email"]); + $dbuser->autologin_token_delete($_SESSION["email"]); // Et le cookie if (isset($_COOKIE["autoLogin"])) { unset($_COOKIE["autoLogin"]); diff --git a/Wrapper/Functions/func_mission.php b/Wrapper/Functions/func_mission.php index 8875685..07879be 100644 --- a/Wrapper/Functions/func_mission.php +++ b/Wrapper/Functions/func_mission.php @@ -3,8 +3,8 @@ // Description: Fonction d'enregistrement d'une mission // **************************************************************************** function register_mission($subject, $note, $review, $clientId, $proId) { - $dbuser = new DbUser; - $registered = $dbuser->register_mission($subject, + $dbmission = new DbMission; + $registered = $dbmission->register_mission($subject, $note, $review, $clientId, diff --git a/Wrapper/Functions/func_register.php b/Wrapper/Functions/func_register.php index 6a081a9..8482752 100644 --- a/Wrapper/Functions/func_register.php +++ b/Wrapper/Functions/func_register.php @@ -4,7 +4,7 @@ // **************************************************************************** function register($email, $password, $is_client, $is_pro, $is_admin) { $dbuser = new DbUser; - $registered = $dbuser->add_user($email, + $registered = $dbuser->user_register($email, $password, $is_client, $is_pro, diff --git a/Wrapper/Functions/func_search.php b/Wrapper/Functions/func_search.php index 3c85eab..d6cbfb2 100644 --- a/Wrapper/Functions/func_search.php +++ b/Wrapper/Functions/func_search.php @@ -5,24 +5,24 @@ function search($request, $isResearch) { // Instanciation des méthodes de recherches de la BDD. $dbsearch = new DbSearch; + $dbmission = new DbMission; // Si c'est une recherche. if ($isResearch) { - $result = $dbsearch->search_consultant_by_name($request); + $result = $dbsearch->get_pro_info_by_lastname($request); // Pour chaque utilisateur avec un nom qui "match". foreach ($result as $key => $value) { // récupération du nombre de mission effectué. - $numberMission = $dbsearch->count_consultant_mission_by_name($value["lastname"]); + $numberMission = $dbmission->count_pro_missions_by_lastname($value["lastname"]); $result[$key]["numberOfMissions"] = $numberMission[0]["COUNT(*)"]; // récupération des notes de l'utilisateur. - $allNotes = $dbsearch->get_consultant_note_by_name($value["lastname"]); + $allNotes = $dbsearch->get_pro_note_by_lastname($value["lastname"]); // Pour chaque note on la "push" (ajoute) dans une liste. $notes = array(); foreach ($allNotes as $value) { array_push($notes, $value["note"]); } // On fait la moyenne des notes, - // et pour les étoiles on "coupe" tout ce qui est après la virgule. - // J'ai préféré ce système à un "round()" + // et pour les étoiles on "coupe" tout ce qui est après la virgule en castant en "int". if ($notes) { $average = array_sum($notes) / count($notes); $result[$key]["note"] = round($average, 2); diff --git a/Wrapper/wrapper.php b/Wrapper/wrapper.php index 4a39429..62077c2 100644 --- a/Wrapper/wrapper.php +++ b/Wrapper/wrapper.php @@ -9,12 +9,14 @@ // Import de toutes les fonctions et des méthodes pour gérer la BDD. require_once(dirname( __FILE__ )."/../Database/meth_dbuser.php"); +require_once(dirname( __FILE__ )."/../Database/meth_dbadmin.php"); require_once(dirname( __FILE__ )."/../Database/meth_dbsearch.php"); +require_once(dirname( __FILE__ )."/../Database/meth_dbmission.php"); require_once(dirname( __FILE__ )."/Functions/func_info.php"); +require_once(dirname( __FILE__ )."/Functions/func_admin.php"); require_once(dirname( __FILE__ )."/Functions/func_login.php"); require_once(dirname( __FILE__ )."/Functions/func_logout.php"); require_once(dirname( __FILE__ )."/Functions/func_search.php"); -require_once(dirname( __FILE__ )."/Functions/func_delete.php"); require_once(dirname( __FILE__ )."/Functions/func_mission.php"); require_once(dirname( __FILE__ )."/Functions/func_register.php"); require_once(dirname( __FILE__ )."/Functions/func_language.php"); @@ -109,17 +111,37 @@ if (isset($_SESSION["src"])) { $_POST["city"], $_SESSION["userId"] ); - // Condition pour une suppression d'un utilisateur - } elseif ($_SESSION["src"] == "delete" - && isset($_SESSION["loggedIn"], - $_SESSION["isAdmin"], - $_POST["userId"] - ) - && $_SESSION["loggedIn"] == true - && $_SESSION["isAdmin"] == true - && $_POST["userId"] !== "" + // Condition pour l'administration du site + } elseif ($_SESSION["src"] == "admin" + && isset($_SESSION["loggedIn"], + $_SESSION["isAdmin"], + ) + && $_SESSION["loggedIn"] == true + && $_SESSION["isAdmin"] == true + && (isset($_POST["userId"]) + || isset($_POST["addCategoryNameEn"], + $_POST["addCategoryNameFr"] + ) + || isset($_POST["delCategoryId"]) + ) ) { - delete($_POST["userId"]); + if (isset($_POST["userId"]) + && $_POST["userId"] !== "" + ) { + delete($_POST["userId"]); + // Ajout d'un catégorie d'emploi + } elseif (isset($_POST["addCategoryNameEn"]) + && isset($_POST["addCategoryNameFr"]) + && $_POST["addCategoryNameEn"] !== "" + && $_POST["addCategoryNameFr"] !== "" + ) { + job_category_add($_POST["addCategoryNameEn"], $_POST["addCategoryNameFr"]); + // Suppression d'une categorie d'emploi + }elseif (isset($_POST["delCategoryId"]) + && $_POST["delCategoryId"] !== "" + ) { + job_category_del($_POST["delCategoryId"]); + } // Condition pour un enregistrement d'une mission } elseif ($_SESSION["src"] == "mission" diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..63936ec --- /dev/null +++ b/todo.txt @@ -0,0 +1,16 @@ + +################################################# + +- Global + - Système de notification ? (5) + +- Revoir front Client & Pro + - Requète de mission pour un pro sur le moteur de recherche. (3) + - Page mes missions, passés, en cours, terminées. (3) + - Revoir mes infos pour adapter aux clients & pros. (2) + +- Revoir front Admin + - Doit pouvoir supprimer une mission (4) + - Doit pouvoir gérer les catégories de travail (DONE) + +################################################# -- cgit v1.2.3