| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831 |
- <?php
- /**
- * Classe document
- *
- * Cette classe gère les documents, y compris leur création, mise à jour, suppression,
- * gestion des fichiers joints, et envoi d'emails liés aux documents.
- */
- class document
- {
- /**
- * Télécharge un fichier temporaire et l'enregistre dans le répertoire des données des documents.
- *
- * @param array $_temp Tableau contenant les informations du fichier temporaire.
- * @return string|false Retourne le chemin du fichier enregistré ou FALSE en cas d'échec.
- */
- static public function uploadFile(array $_temp){
- $tmp = file::record($_temp, DIR_DATAS_DOCS);
- if($tmp != FALSE){
- return $tmp;
- } else {
- return FALSE;
- }
- }
- /**
- * Lit un fichier spécifique à partir du répertoire des données des documents.
- *
- * @param string $_id Identifiant du fichier à lire.
- * @return string Retourne le contenu du fichier.
- */
- static public function readFile(string $_id){
- return file::download($_id, DIR_DATAS_DOCS);
- }
- /**
- * Supprime un fichier spécifique du répertoire des données des documents.
- *
- * @param string $_id Identifiant du fichier à supprimer.
- * @return void
- */
- static public function deleteFile(string $_id){
- db::query("DELETE FROM ". DB_T_DOCUMENT_FILES ." WHERE id_files = :id_files");
- db::bind(':id_files', $_id);
- db::execute();
- file::delete($_id, DIR_DATAS_DOCS);
- }
- /**
- * Supprime tous les fichiers associés à un document spécifique.
- *
- * @param float $_id Identifiant du document.
- * @return void
- */
- static public function deleteFiles(float $_id){
- foreach (self::getFiles($_id) as $file) {
- db::query("DELETE FROM ". DB_T_DOCUMENT_FILES ." WHERE id_files = :id_files");
- db::bind(':id_files', $file["id"]);
- db::execute();
- file::delete($file["id"], DIR_DATAS_DOCS);
- }
- }
- /**
- * Récupère les types de documents disponibles.
- *
- * @return array Retourne un tableau associatif des types de documents.
- */
- static public function getTypes(){
- db::query("SELECT "
- . "id, label "
- . "FROM " . DB_T_TYPE_DOCUMENT . " "
- . "ORDER BY " . DB_T_TYPE_DOCUMENT . ".id ASC");
- foreach (db::resultset() as $value) {
- $return[$value["id"]] = $value["label"];
- }
- return $return;
- }
- /**
- * Supprime un document spécifique et ses fichiers associés.
- *
- * @param float $_id Identifiant du document à supprimer.
- * @return bool Retourne TRUE en cas de succès, FALSE en cas d'échec.
- */
- public static function delete(float $_id)
- {
- try {
- db::query("DELETE FROM ". DB_T_DOCUMENT_TAGS ." WHERE id_documents = :id_documents");
- db::bind(':id_documents', $_id);
- db::execute();
- self::deleteFiles($_id);
-
- db::query("DELETE FROM " . DB_T_DOCUMENTS . " WHERE id = :id");
- db::bind(':id', $_id);
- db::execute();
-
- alert::recSuccess("Le document vient d'être supprimé");
- return TRUE;
- } catch (Exception $ex) {
- alert::recError("Erreur à la suppression du document");
- return FALSE;
- }
- }
- /**
- * Récupère l'identifiant du dernier document ajouté.
- *
- * @return int Identifiant du dernier document.
- */
- public static function lastAdd()
- {
- db::query("SELECT MAX(id) AS id FROM " . DB_T_DOCUMENTS);
- return db::single()["id"];
- }
- /**
- * Ajoute un fichier à un document spécifique.
- *
- * @param float $_idDocument Identifiant du document.
- * @param string $_idFile Identifiant du fichier.
- * @param int|null $_principal Indique si le fichier est principal (1) ou non (0).
- * @return bool Retourne TRUE en cas de succès, FALSE en cas d'échec.
- */
- private static function addFile(float $_idDocument, string $_idFile, int $_principal = NULL)
- {
- db::query("INSERT INTO " . DB_T_DOCUMENT_FILES . " (id_documents, id_files, principal) VALUES (:id_documents, :id_files, :principal)");
- db::bind(':id_documents', $_idDocument);
- db::bind(':id_files', $_idFile);
- db::bind(':principal', $_principal);
- try {
- db::execute();
- return TRUE;
- } catch (Exception $ex) {
- echo "error";
- echo $ex;
- exit();
- return FALSE;
- }
- }
- /**
- * Ajoute des tags à un document spécifique.
- *
- * @param float $_idDocument Identifiant du document.
- * @param string|null $_tags Liste des tags séparés par des virgules.
- * @param float $_type Type des tags.
- * @return bool Retourne TRUE en cas de succès, FALSE en cas d'échec.
- */
- private static function addTags(float $_idDocument, string $_tags = NULL, float $_type)
- {
- db::query("DELETE FROM " . DB_T_DOCUMENT_TAGS . " WHERE id_documents = :id_documents AND id_type_tags = :id_type_tags");
- db::bind(':id_documents', $_idDocument);
- db::bind(':id_type_tags', $_type);
- db::execute();
-
- if($_tags != NULL){
- $tags = explode(",", $_tags);
- $sqlMaj = "";
- foreach ($tags as $tag) {
- $sqlMaj .= " (:id_documents, ".$tag.", :id_type_tags),";
- }
- $sqlMaj = substr($sqlMaj, 0, -1);
- db::query("INSERT INTO " . DB_T_DOCUMENT_TAGS . " (id_documents, id_tags, id_type_tags) VALUES" . $sqlMaj);
- db::bind(':id_documents', $_idDocument);
- db::bind(':id_type_tags', $_type);
- try {
- db::execute();
- return TRUE;
- } catch (Exception $ex) {
- return FALSE;
- }
- }
- }
- /**
- * Récupère les tags orphelins (non associés à des documents).
- *
- * @return array Retourne un tableau des tags orphelins.
- */
- public static function getOrphanTags(){
- db::query("SELECT
- " . DB_T_TAGS . ".id
- FROM " . DB_T_TAGS . "
- LEFT JOIN " . DB_T_DOCUMENT_TAGS . " ON tags.id = " . DB_T_DOCUMENT_TAGS . ".id_tags
- WHERE " . DB_T_DOCUMENT_TAGS . ".id_tags IS NULL AND " . DB_T_TAGS . ".id_type = 2");
- return db::resultset();
- }
- /**
- * Supprime les tags orphelins de la base de données.
- *
- * @return void
- */
- public static function cleanOrphanTags(){
- foreach (self::getOrphanTags() as $value) {
- db::query("DELETE FROM ". DB_T_TAGS ." WHERE id = :id");
- db::bind(':id', $value["id"]);
- db::execute();
- }
- }
-
- /**
- * Ajoute un nouveau document avec ses fichiers et tags associés.
- *
- * @return int|false Retourne l'identifiant du document ajouté ou FALSE en cas d'échec.
- */
- public static function add()
- {
- session::setTemp(core::getPost(), "document");
- $file = core::getFiles("document-import");
- $checkFile = file::getErrorUpload($file);
- if(isset($checkFile["status"]) AND $checkFile["status"] == "error"){
- alert::recError($checkFile["description"]);
- return FALSE;
- }
- $md5 = md5_file($file["tmp_name"]);
- if(file::findM5($md5) == TRUE){
- alert::recError("Ce fichier a déjà été utilisé : " . $file["name"]);
- } else {
- db::query("INSERT INTO " . DB_T_DOCUMENTS . " (id_type, titre, date, deadline, description, montant, rapprochement, id_client, id_user) VALUES (:id_type, :titre, :date, :deadline, :description, :montant, :rapprochement, :id_client, :id_user)");
- db::bind(':id_type', core::getPost("id_type"));
- db::bind(':titre', core::getPost("titre"));
- db::bind(':date', core::getPost("date"));
- db::bind(':deadline', core::getPost("deadline"));
- db::bind(':description', core::getPost("description"));
- db::bind(':montant', !empty(core::getPost("montant")) ? floatval(core::getPost("montant")) : 0.0);
- db::bind(':rapprochement', core::getPost("rapprochement"));
- db::bind(':id_client', core::getPost("id_client") == "" ? NULL : core::getPost("id_client"));
- db::bind(':id_user', session::getId());
-
- try {
- db::execute();
- $lastId = db::lastInsertId();
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la fiche : " . core::getPost("titre"));
- if(debug::isFile("debug")) { alert::recError("Stack : " . $ex); }
- return FALSE;
- }
- try {
- $idFile = self::uploadFile($file);
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la pièce jointe : " . $idFile);
- if(debug::isFile("debug")) { alert::recError("Stack : " . $ex); }
- return FALSE;
- }
- try {
- self::addFile($lastId, $idFile, 1);
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la liaison : " . $idFile);
- if(debug::isFile("debug")) { alert::recError("Stack : " . $ex); }
- return FALSE;
- }
- try {
- $tagsUser = tags::textToId(core::getPost("tagsUser"), 1);
- self::addTags($lastId, $tagsUser, 1);
- $tagsSupplier = tags::textToId(core::getPost("tagsSupplier"), 2);
- self::addTags($lastId, $tagsSupplier, 2);
-
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la liaison : " . $idFile);
- if(debug::isFile("debug")) { alert::recError("Stack : " . $ex); }
- return FALSE;
- }
- return $lastId;
- }
- }
- /**
- * Met à jour un document existant, y compris ses fichiers et tags associés.
- *
- * @return bool Retourne TRUE en cas de succès, FALSE en cas d'échec.
- */
- public static function update()
- {
- $file = core::getFiles("attachement-document");
- if($file != NULL AND $file["name"] != ""){
- $checkFile = file::getErrorUpload($file);
- if(isset($checkFile["status"]) AND $checkFile["status"] == "error"){
- alert::recError($checkFile["description"]);
- return FALSE;
- }
- $md5 = md5_file($file["tmp_name"]);
- }
- if(isset($md5) AND file::findM5($md5) == TRUE){
- alert::recError("Le fichier \"" . $file["name"] . "\" a déjà été utilisé");
- session::setTemp(core::getPost(), "document");
- } else {
- if(isset($md5)){
- try {
- $idFile = self::uploadFile($file);
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la pièce jointe : " . $idFile);
- return FALSE;
- }
- try {
- self::addFile(core::getPost("id"), $idFile, 0);
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la liaison : " . $idFile);
- return FALSE;
- }
- }
-
- if(core::getPost("delete-attachement")){
- foreach (core::getPost("delete-attachement") as $deleteAttach) {
- self::deleteFile($deleteAttach);
- }
- }
- if(core::getPost("default-attachement")){
- self::principalFile(core::getPost("id"), core::getPost("default-attachement"));
- }
- try {
- $tagsUser = tags::textToId(core::getPost("tagsUser"), 1);
- self::addTags(core::getPost("id"), $tagsUser, 1);
-
- $tagsSupplier = tags::textToId(core::getPost("tagsSupplier"), 2);
- self::addTags(core::getPost("id"), $tagsSupplier, 2);
- } catch (Exception $ex) {
- alert::recError("Erreur à l'enregistrement de la liaison : " . core::getPost("id"));
- return FALSE;
- }
- if(core::ifPost("date_done") AND core::getPost("date_done") != ""){
- $sql = ", id_user_done = :id_user_done, date_done = :date_done ";
- } else {
- $sql = "";
- }
-
- db::query("UPDATE " . DB_T_DOCUMENTS . " SET "
- . "id_type = :id_type, "
- . "titre = :titre, "
- . "date = :date, "
- . "deadline = :deadline, "
- . "description = :description, "
- . "montant = :montant, "
- . "rapprochement = :rapprochement, "
- . "id_client = :id_client "
- . $sql
- . "WHERE id = :id");
-
- db::bind(':id_type', core::getPost("id_type"));
- db::bind(':titre', core::getPost("titre"));
- db::bind(':date', core::getPost("date"));
- db::bind(':deadline', core::getPost("deadline"));
- db::bind(':description', core::getPost("description"));
- db::bind(':montant', core::getPost("montant"));
- db::bind(':rapprochement', core::getPost("rapprochement"));
- db::bind(':id_client', core::getPost("id_client") == "" ? NULL : core::getPost("id_client"));
- db::bind(':id', core::getPost("id"));
- if(core::ifPost("date_done") AND core::getPost("date_done") == TRUE){
- db::bind(':id_user_done', session::getId());
- db::bind(':date_done', core::getPost("date_done"));
- }
-
- try {
- db::execute();
- alert::recSuccess("Document mis à jour avec succès");
- return TRUE;
- } catch (Exception $ex) {
- alert::recError("Erreur de mise à jour du document : " . $ex);
- return FALSE;
- }
- }
- }
- /**
- * Imprime un fichier spécifique.
- *
- * @param string $_id Identifiant du fichier à imprimer.
- * @return void
- */
- static public function printFile(string $_id) {
- $filePatch = file::download($_id, DIR_DATAS_DOCS);
-
- if (file_exists($filePatch) && is_readable($filePatch)) {
-
- $file_info = new finfo(FILEINFO_MIME_TYPE);
- $mime_type = $file_info->file($filePatch);
-
- // Vérification si le fichier est de type XML
- if ($mime_type === 'application/xml' || $mime_type === 'text/xml') {
- // Chargement du contenu XML
- $xml_content = file_get_contents($filePatch);
- xml::print($xml_content);
- } else {
- // Si ce n'est pas un fichier XML, comportement normal pour servir le fichier
- header('Content-Type: ' . $mime_type);
- header('Content-Length: ' . filesize($filePatch));
- readfile($filePatch);
- }
- } else {
- echo "Le fichier n'a pas été trouvé ou n'est pas lisible.";
- }
- }
- /**
- * Récupère un fichier spécifique.
- *
- * @param string $_id Identifiant du fichier à récupérer.
- * @return void
- */
- static public function getFile(string $_id) {
- $filePatch = file::download($_id, DIR_DATAS_DOCS);
-
- if (file_exists($filePatch) && is_readable($filePatch)) {
- $file_info = new finfo(FILEINFO_MIME_TYPE);
- $mime_type = $file_info->file($filePatch);
- header('Content-Type: ' . $mime_type);
- header('Content-Length: ' . filesize($filePatch));
- readfile($filePatch);
- } else {
- echo "Le fichier n'a pas été trouvé ou n'est pas lisible.";
- }
- }
- /**
- * Récupère les informations d'un document spécifique.
- *
- * @param float $_id Identifiant du document.
- * @return array Retourne un tableau contenant les informations du document et ses fichiers associés.
- */
- static public function get(float $_id){
- db::query("SELECT "
- . "" . DB_T_DOCUMENTS . ".id, "
- . "" . DB_T_DOCUMENTS . ".id_type, "
- . "" . DB_T_DOCUMENTS . ".titre, "
- . "" . DB_T_DOCUMENTS . ".date, "
- . "" . DB_T_DOCUMENTS . ".deadline, "
- . "" . DB_T_DOCUMENTS . ".description, "
- . "" . DB_T_DOCUMENTS . ".montant, "
- . "" . DB_T_DOCUMENTS . ".rapprochement, "
- . "" . DB_T_DOCUMENTS . ".id_client, "
- . "" . DB_T_DOCUMENTS . ".id_user_done, "
- . "" . DB_T_DOCUMENTS . ".date_done, "
- . "CONCAT(" . DB_T_USER . ".prenom, ' ', " . DB_T_USER . ".nom) AS doneUser "
- . "FROM " . DB_T_DOCUMENTS . " "
- . "LEFT JOIN " . DB_T_USER . " ON " . DB_T_USER . ".id = " . DB_T_DOCUMENTS . ".id_user_done "
- . "WHERE " . DB_T_DOCUMENTS . ".id = :id");
- db::bind(':id', $_id);
- $document = db::single();
- if(empty($document)){
- $document = [];
- }
- $document["tagsSupplier"] = self::getTags($_id, 2);
- $document["tagsUser"] = self::getTags($_id, 1);
- $files = self::getFiles($_id);
- return array("document" => $document, "files" => $files);
- }
- /**
- * Récupère les tags associés à un document spécifique.
- *
- * @param float $_idDocument Identifiant du document.
- * @param float $_idTypeTags Type des tags.
- * @return string|null Retourne une chaîne de caractères contenant les tags ou NULL si aucun tag n'est trouvé.
- */
- static public function getTags(float $_idDocument, float $_idTypeTags){
- db::query("SELECT "
- . "" . DB_T_TAGS . ".label "
- . "FROM " . DB_T_DOCUMENT_TAGS . " "
- . "INNER JOIN " . DB_T_TAGS . " ON " . DB_T_TAGS . ".id = " . DB_T_DOCUMENT_TAGS . ".id_tags "
- . "WHERE " . DB_T_DOCUMENT_TAGS . ".id_documents = :idDocument AND " . DB_T_DOCUMENT_TAGS . ".id_type_tags = :idTypeTags "
- . "ORDER BY " . DB_T_DOCUMENT_TAGS . ".creer ASC");
- db::bind(':idDocument', $_idDocument);
- db::bind(':idTypeTags', $_idTypeTags);
- $tmp = db::resultset();
- if(isset($tmp[0])){
- $return = NULL;
- foreach ($tmp as $value) {
- $return .= $value["label"].",";
- }
-
- $return = substr($return, 0, -1);
- return $return;
- } else {
- return NULL;
- }
-
- }
- /**
- * Récupère les fichiers associés à un document spécifique.
- *
- * @param float $_idDocument Identifiant du document.
- * @return array|null Retourne un tableau des fichiers ou NULL si aucun fichier n'est trouvé.
- */
- static public function getFiles(float $_idDocument){
- db::query("SELECT "
- . "" . DB_T_FILES . ".id, "
- . "" . DB_T_FILES . ".name, "
- . "" . DB_T_FILES . ".size, "
- . "" . DB_T_FILES . ".creer, "
- . "" . DB_T_FILES . ".id_user, "
- . "CONCAT(" . DB_T_USER . ".prenom, ' ', " . DB_T_USER . ".nom) AS user, "
- . "" . DB_T_DOCUMENT_FILES . ".principal "
- . "FROM " . DB_T_DOCUMENT_FILES . " "
- . "INNER JOIN " . DB_T_FILES . " ON " . DB_T_FILES . ".id = " . DB_T_DOCUMENT_FILES . ".id_files "
- . "INNER JOIN " . DB_T_USER . " ON " . DB_T_USER . ".id = " . DB_T_FILES . ".id_user "
- . "WHERE " . DB_T_DOCUMENT_FILES . ".id_documents = :id "
- . "ORDER BY " . DB_T_FILES . ".creer");
- db::bind(':id', $_idDocument);
- $tmp = db::resultset();
- if(isset($tmp[0])){
- foreach ($tmp as $file) {
- if($file["principal"] == TRUE){
- $return["principal"] = $file;
- } else {
- $return[] = $file;
- }
- }
- if(empty($return["principal"])){
- $return["principal"] = $return[0];
- self::principalFile($_idDocument, $return["principal"]["id"]);
- unset($return[0]);
- }
- return $return;
- } else {
- return NULL;
- }
- }
- /**
- * Définit un fichier comme principal pour un document spécifique.
- *
- * @param float $_idDocument Identifiant du document.
- * @param string $_idFile Identifiant du fichier à définir comme principal.
- * @return void
- */
- static public function principalFile(float $_idDocument, string $_idFile){
- db::query("UPDATE " . DB_T_DOCUMENT_FILES . " SET principal = :principal WHERE id_documents = :id_documents");
- db::bind(':principal', 0);
- db::bind(':id_documents', $_idDocument);
- db::execute();
- db::query("UPDATE " . DB_T_DOCUMENT_FILES . " SET principal = :principal WHERE id_documents = :id_documents AND id_files = :id_files");
- db::bind(':principal', 1);
- db::bind(':id_documents', $_idDocument);
- db::bind(':id_files', $_idFile);
- db::execute();
- }
- /**
- * Récupère les documents assignés à un utilisateur spécifique.
- *
- * @param float|null $_id Identifiant de l'utilisateur (facultatif).
- * @return array Retourne un tableau des documents assignés.
- */
- static public function getAssign(float $_id = NULL){
- $idUser = is_null($_id) ? session::getId() : $_id;
- $tags = user::getIdTags($idUser);
- $where = NULL;
- foreach ($tags AS $key => $value) {
- if($key == 0){
- $where = " WHERE " . DB_T_DOCUMENTS . ".id_user_done IS NULL AND (" . DB_T_DOCUMENT_TAGS . ".id_tags = " . $value . "";
- } else {
- $where .= " OR " . DB_T_DOCUMENT_TAGS . ".id_tags = " . $value . "";
- }
- }
- $where .= ")";
- db::query("SELECT
- " . DB_T_DOCUMENTS . ".id,
- " . DB_T_DOCUMENTS . ".titre,
- " . DB_T_DOCUMENTS . ".date,
- " . DB_T_DOCUMENTS . ".deadline,
- " . DB_T_DOCUMENTS . ".description,
- " . DB_T_DOCUMENTS . ".montant,
- ( SELECT GROUP_CONCAT(" . DB_T_TAGS . ".label SEPARATOR ', ')
- FROM " . DB_T_DOCUMENT_TAGS . "
- INNER JOIN " . DB_T_TAGS . " ON " . DB_T_TAGS . ".id = " . DB_T_DOCUMENT_TAGS . ".id_tags
- WHERE id_documents = " . DB_T_DOCUMENTS . ".id AND " . DB_T_DOCUMENT_TAGS . ".id_type_tags = 2
- ORDER BY " . DB_T_DOCUMENT_TAGS . ".creer) AS tags,
- ( SELECT GROUP_CONCAT(" . DB_T_TAGS . ".label SEPARATOR ', ')
- FROM " . DB_T_DOCUMENT_TAGS . "
- INNER JOIN " . DB_T_TAGS . " ON " . DB_T_TAGS . ".id = " . DB_T_DOCUMENT_TAGS . ".id_tags
- WHERE id_documents = " . DB_T_DOCUMENTS . ".id AND " . DB_T_DOCUMENT_TAGS . ".id_type_tags = 1
- ORDER BY " . DB_T_DOCUMENT_TAGS . ".creer) AS assign,
- " . DB_T_TYPE_DOCUMENT . ".label
- FROM " . DB_T_DOCUMENT_TAGS . "
- INNER JOIN " . DB_T_DOCUMENTS . " ON " . DB_T_DOCUMENTS . ".id = " . DB_T_DOCUMENT_TAGS . ".id_documents
- INNER JOIN " . DB_T_TYPE_DOCUMENT . " ON " . DB_T_TYPE_DOCUMENT . ".id = " . DB_T_DOCUMENTS . ".id_type
- " . $where .
- " GROUP BY documents.id");
- return db::resultset();
- }
- /**
- * Affiche les pièces jointes d'un document sous forme de liste HTML.
- *
- * @param array $_attachs Tableau des pièces jointes.
- * @return void
- */
- static public function printAttachement(array $_attachs){
- $principal = $_attachs["principal"];
- echo '<ol class="list-group list-group-numbered">';
- echo ' <li class="list-group-item d-flex justify-content-between align-items-start" id="attach-'.$principal["id"].'">
- <div class="ms-2 me-auto">
- <div><span class="fw-bold">'.$principal["name"].'</span> ('.core::convertBytes($principal["size"]).')</div>
- Chargé le '.core::convertDate($principal["creer"]).' par '.$principal["user"].'
- <div id="select-attach-'.$principal["id"].'" style="color:red;"></div>
- </div>
- <div class="btn-group">
- <button type="button" title="Voir le document" class="btn btn btn-outline-secondary" onclick="window.open(\'/document.php?id=' . $principal["id"] . '\', \'_blank\')">' . icon::getFont(["icon" => "bi bi-eye-fill"]) . '</button>
- <button type="button" title="Télécharger le document" class="btn btn btn-outline-secondary" onclick="downloadFile(\'/document.php?id=' . $principal["id"] . '&download=1\', \''.$principal["name"].'\')">' . icon::getFont(["icon" => "bi bi-arrow-down-square-fill"]) . '</button>
- </div>
- </li>';
- foreach ($_attachs as $key => $attach) {
- if($key != "principal"){
- echo ' <li class="list-group-item d-flex justify-content-between align-items-start" id="attach-'.$attach["id"].'">
- <div class="ms-2 me-auto">
- <div><span class="fw-bold">'.$attach["name"].'</span> ('.core::convertBytes($attach["size"]).')</div>
- Chargé le '.core::convertDate($attach["creer"]).' par '.$attach["user"].'
- <div id="select-attach-'.$attach["id"].'"></div>
- </div><div class="btn-group">
- <button type="button" title="Voir le document" class="btn btn btn-outline-secondary" onclick="window.open(\'/document.php?id=' . $attach["id"] . '\', \'_blank\')">' . icon::getFont(["icon" => "bi bi-eye-fill"]) . '</button>
- <button type="button" title="Télécharger le document" class="btn btn btn-outline-secondary" onclick="downloadFile(\'/document.php?id=' . $attach["id"] . '&download=1\', \''.$attach["name"].'\')">' . icon::getFont(["icon" => "bi bi-arrow-down-square-fill"]) . '</button>';
- if (access::ifAccesss("add-document")) {
- echo '<button type="button" title="Document mis en avant" class="btn btn btn-outline-primary" onclick="defaultAttachment(\''.$attach["id"].'\')" id="button-default-'.$attach["id"].'">' . icon::getFont(["icon" => "bi bi-star-fill"]) . '</button>
- <button type="button" title="Supprimer ce document" class="btn btn-outline-danger" onclick="deleteAttachment(\''.$attach["id"].'\')" id="button-delete-'.$attach["id"].'">' . icon::getFont(["icon" => "bi bi-trash"]) . '</button>';
- }
- echo '</div>
- </li>';
- }
- }
- echo '</ol><br />';
- }
- /**
- * Récupère les documents assignés à un utilisateur en fonction de ses tags.
- *
- * @param array|null $_tags Tableau des tags de l'utilisateur.
- * @return int|null Retourne le nombre de documents assignés ou NULL si aucun document n'est trouvé.
- */
- static public function myAssign(?array $_tags = NULL){
- if($_tags == NULL){
- return NULL;
- } else {
- $where = NULL;
- foreach ($_tags AS $key => $value) {
- if($key == 0){
- $where = "WHERE " . DB_T_DOCUMENTS . ".id_user_done IS NULL AND (" . DB_T_DOCUMENT_TAGS . ".id_tags = " . $value . "";
- } else {
- $where .= " OR " . DB_T_DOCUMENT_TAGS . ".id_tags = " . $value . "";
- }
- }
- $where .= ")";
- }
- db::query("SELECT "
- . "COUNT(" . DB_T_DOCUMENT_TAGS . ".id_tags) AS nb "
- . "FROM " . DB_T_DOCUMENT_TAGS . " "
- . "INNER JOIN " . DB_T_DOCUMENTS . " ON " . DB_T_DOCUMENTS . ".id = " . DB_T_DOCUMENT_TAGS . ".id_documents "
- . $where);
- return db::single()["nb"];
- }
-
- /**
- * Retourne une alerte pour les documents assignés.
- *
- * @return int|null Retourne le nombre de documents assignés ou NULL si aucun document n'est trouvé.
- */
- static public function badgeAlert(){
- $return = self::myAssign(user::getIdTags(session::getId()));
- return $return > 0 ? $return : NULL;
- }
- /**
- * Récupère les utilisateurs assignés à un document pour l'envoi d'emails.
- *
- * @return array Retourne un tableau des utilisateurs assignés.
- */
- static public function assignMailDocument(){
- db::query("SELECT "
- . "" . DB_T_USER . ".id, "
- . "" . DB_T_USER . ".email, "
- . "CONCAT(" . DB_T_USER . ".prenom, ' ', " . DB_T_USER . ".nom) AS name "
- . "FROM " . DB_T_USER_TAGS . " "
- . "INNER JOIN " . DB_T_USER . " ON " . DB_T_USER . ".id = " . DB_T_USER_TAGS . ".id_user "
- . "WHERE (" . DB_T_USER_TAGS . ".id_tags = 1 OR " . DB_T_USER_TAGS . ".id_tags = 2) AND " . DB_T_USER . ".deleted = 0 "
- . "GROUP BY " . DB_T_USER . ".id");
- return db::resultset();
- }
- /**
- * Envoie un email récapitulatif des documents assignés à un utilisateur.
- *
- * @param array $_data Données nécessaires pour l'envoi de l'email.
- * @return void
- */
- public static function sendEmailCronAssign(array $_data)
- {
- $list = self::getAssign($_data["id"]);
- $nb = count($list);
- if ($nb > 0) {
- $titre = $nb > 1 ? $nb . " documents en attentes de validation" : "Un document en attente de validation";
- $message = "Cet email est un récapitulatif des documents qui vous ont été assignés sur le CMS du CSE Invent.<br />A ce jour ";
- $message .= $nb > 1 ? $nb . " documents sont en attentes de validation." : "un seul document est en attente de validation.";
- $message .= "<br />Ce bilan sera mis à jour une fois par semaine et sera envoyé à l'ensemble des personnes assignées à ces documents.";
- $tmp = [
- "name" => $_data["name"],
- "subject" => $titre,
- "message" => $message,
- "table" => self::getMailArray($list)
- ];
- $data = [
- "to" => $_data["email"],
- "name" => $_data["name"],
- "subject" => $titre,
- "template" => self::templateMail($tmp)
- ];
- try {
- email::send($data);
- historique::recRef("script");
- historique::add(
- array(
- "idType" => historique::getIdRef("CRON"),
- "idUser" => NULL,
- "idPage" => historique::getIdRef("script"),
- "log" => "Email d'assignation envoyé à " . $data["name"]
- )
- );
- } catch (\Throwable $th) {
- debug::log($th);
- }
- }
- }
- /**
- * Génère un template d'email pour les documents assignés.
- *
- * @param array $_data Données nécessaires pour générer le template.
- * @return string|false Retourne le template généré ou FALSE en cas d'échec.
- */
- public static function templateMail(array $_data)
- {
- $logo_url = empty($_data["logo_url"]) ? "https://" . DOMAIN_CMS . "/img/logo.png" : $_data["logo_url"];
- $date = empty($_data["date"]) ? core::printDateTxt() : $_data["date"];
- $name = empty($_data["name"]) ? NULL : $_data["name"];
- $subject = empty($_data["subject"]) ? NULL : $_data["subject"];
- $message = empty($_data["message"]) ? NULL : $_data["message"];
- $cms_url = empty($_data["cms_url"]) ? "https://" . DOMAIN_CMS : $_data["cms_url"];
- $table = empty($_data["table"]) ? NULL : $_data["table"];
-
- $template = email::loadTemplate('cms.documents.html');
- if ($template === false) {
- echo "Impossible de lire le template d'email.";
- return false;
- }
- // Remplacer les variables dans le template
- $template = str_replace([
- '{{logo_url}}',
- '{{date}}',
- '{{name}}',
- '{{subject}}',
- '{{message}}',
- '{{cms_url}}',
- '{{table}}'
- ], [
- $logo_url,
- $date,
- $name,
- $subject,
- $message,
- $cms_url,
- $table
- ], $template);
- // Si debug
- if(debug::isFile("email")){
- debug::log($template);
- }
- return $template;
- }
- /**
- * Génère un tableau HTML pour les emails assignés.
- *
- * @param array $_array Tableau des données des documents.
- * @return string Retourne le tableau HTML généré.
- */
- private static function getMailArray(array $_array){
- $return = NULL;
- foreach ($_array as $value) {
- $return .= ' <tr>
- <td>' . core::convertDate($value["date"], FALSE) . '</td>
- <td>' . $value["titre"] . '</td>
- <td>' . $value["label"] . '</td>
- <td>' . $value["deadline"] . '</td>
- <td>' . $value["assign"] . '</td>
- <td style="text-align:right;">' . core::formatEuro($value["montant"]) . '</td>
- </tr>';
- }
- return $return;
- }
- }
|