From ee1665e91b17be1d5f6c91118e15349190cbb38e Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Fri, 20 Mar 2020 19:04:49 +0100 Subject: [PATCH] Amélioration et nombreux bugfixes de la gestion des docs attachés (2) --- README.md | 15 +++++++++------ src/Controller/AppController.php | 651 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/Controller/DocumentsController.php | 378 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/Controller/MaterielsController.php | 13 ++++++++++--- src/Model/Table/DocumentsTable.php | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- src/Template/Documents/add.ctp | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------- src/Template/Documents/edit.ctp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------- src/Template/Documents/view.ctp | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------- src/Template/Materiels/view.ctp | 35 +++++++++++++++++++++-------------- 9 files changed, 896 insertions(+), 668 deletions(-) diff --git a/README.md b/README.md index c076a4a..ebdb1e8 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,10 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE -Date: 16/03/2020 -Version: 3.7.9.5 +Date: 20/03/2020 +Version: 3.7.9.6 Author: EP -Commentaire: Premiers bugfixes du nouveau site responsive (5) - - Nombreux bugfixes de la gestion des documents attachés (presque fini) - - superadmin ressemble de plus en plus au profil "admin" (avec un peu plus de droits) - - Forcer DebugKit (en mode debug) dans config/bootstrap.php : Configure::write('DebugKit.forceEnable', true); +Commentaire: Amélioration et nombreux bugfixes de la gestion des docs attachés (2) IMPORTANT : - Pour connaitre la version actuelle, taper "./VERSION" @@ -94,6 +91,12 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https ----------------------------------------------------------------------------------------------------------- +16/03/2020 Version 3.7.9.5 (EP) + Premiers bugfixes du nouveau site responsive (5) + - Nombreux bugfixes de la gestion des documents attachés (presque fini) + - superadmin ressemble de plus en plus au profil "admin" (avec un peu plus de droits) + - Forcer DebugKit (en mode debug) dans config/bootstrap.php : Configure::write('DebugKit.forceEnable', true); + 13/03/2020 Version 3.7.9.4 (EP) Premiers bugfixes du nouveau site responsive (4) - Fournisseur peut etre créé, modif, suppr par simple Utilisateur (improved) diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index a1aa5e1..c19288b 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -1285,25 +1285,34 @@ class AppController extends Controller // MI Fonction d'envoi de mails avec pièce jointe private function sendEmailPJTo($subject, $msg, $mail, $config, $nomDoc) { - if ($mail != null && ! $config->test) { + if ($mail!=null && !$config->test) { if (filter_var($mail, FILTER_VALIDATE_EMAIL)) { - $email = new Email(); + $email = new Email(); $etiquetteFrom = explode("@", $config->sender_mail); - // (EP) Je vais tuer le stagiaire qui a fait ça : //$email->attachments(["/var/www/html/labinvent/webroot/files/$nomDoc"]); // Il fallait plutot faire ça : $wwwroot_dir = new \Cake\Filesystem\Folder(WWW_ROOT); - $absFileName = $wwwroot_dir->pwd() . DS . 'files' . DS . $nomDoc; + //$absFileName = $wwwroot_dir->pwd() . DS . 'files' . DS . $nomDoc; + $extension = explode(".", $nomDoc)[1]; + // Photo ou doc ? + $path_to_doc = in_array($extension, ['png','jpg','jpeg']) ? 'img'.DS.'photos' : 'files'; + $absFileName = $wwwroot_dir->pwd().$path_to_doc.DS.$nomDoc; $email->attachments([$absFileName]); - + /* + debug($mail); + debug($etiquetteFrom); + debug($absFileName); + debug($email); + exit; + */ $email->transport('default') - ->from([ - $config->sender_mail => $etiquetteFrom[0] - ]) - ->to($mail) - ->subject("[LabInvent] " . $subject) - ->send($msg); + ->from([ + $config->sender_mail => $etiquetteFrom[0] + ]) + ->to($mail) + ->subject("[LabInvent] " . $subject) + ->send($msg); } } } @@ -1338,308 +1347,320 @@ class AppController extends Controller $action = $this->request->getAttribute('params')['action']; // add or edit or delete or ... // Si les deux cases "Activer l'envoi des mails.." sont décochées, on se fatigue pas à exécuter la fonction - if (! $configuration->envoi_mail && ! $configuration->envoi_mail_guests) - return null; - - $mailList = []; - - // On détermine le message et le sujet du mail en fonction de l'action effectuee - // on bloque l'envoi de mail à l'edition et à la validation pour eviter trop d'envoi de mail - // le temps que soit trouvé une autre solution - $acteur = $_SESSION['Auth']['User']['givenname'][0] . ' ' . $_SESSION['Auth']['User']['sn'][0]; - // if ($entity != null) { - if ($entity instanceof Materiel) { - $materiel = $entity; - $nom_materiel = $materiel->designation; - if ($subject == null && $msg == null) { - $msgMore = ''; - Switch ($action) { - case 'add': - $subject = "Ajout d'un matériel"; - $msg = "$acteur a ajouté le matériel \"$nom_materiel\""; - break; - case 'edit': - $subject = "Modification d'un matériel"; - $msg = "$acteur a modifié le matériel \"$nom_materiel\""; - break; - case 'delete': - $subject = "Suppression d'un matériel"; - $msg = "$acteur a supprimé le matériel \"$nom_materiel\""; - // @todo: mettre le nom des domaine, categ, et sous-categ, et non pas l'id - if ($materiel->sur_categorie_id != "") - $msgMore .= "\n\nDomaine : " . $materiel->sur_categorie_id; - if ($materiel->categorie_id != "") - $msgMore .= "\n\nCatégorie : " . $materiel->categorie_id; - if ($materiel->sous_categorie_id != "") - $msgMore .= "\n\nSous-catégorie : " . $materiel->sous_categorie_id; - if ($materiel->description != "") - $msgMore .= "\n\nDescription :\n" . $materiel->description; - break; - case 'statusCreated': - $subject = "Dé-validation d'un matériel"; - $msg = "$acteur a dé-validé le matériel \"$nom_materiel\""; - break; - case 'statusValidated': - $subject = "Validation d'un matériel"; - $msg = "$acteur a validé le matériel \"$nom_materiel\""; - break; - case 'statusToBeArchived': - $subject = "Demande d'archivage d'un matériel"; - $msg = "$acteur a demandé l'archivage du matériel \"$nom_materiel\""; - break; - case 'statusArchived': - $subject = "Archivage d'un matériel"; - $msg = "$acteur a archivé le matériel \"$nom_materiel\""; - break; - case 'setLabelIsPlaced': - $subject = "Etiquette posée sur un matériel"; - $msg = "Etiquette posée sur le matériel \"$nom_materiel\""; - break; - case 'printLabelRuban': - $subject = "Etiquette imprimée"; - $msg = "L'étiquette concerant votre matériel \"$nom_materiel\" a été imprimée"; - $mailList[0] = $materiel->email_responsable; - default: - $subject = "Action \"$action\" sur un matériel"; - $msg = "$acteur a effectué l'action \"$action\" sur le matériel \"$nom_materiel\""; - break; - } // end switch - // (EP) Ajout de l'ID du materiel !!! - $msg .= " (id=" . $materiel->id . ")."; - // Only for "delete" action (for the moment...) - if ($msgMore) - $msg .= $msgMore; - // $msg .= "\n\n"; - } // subject is null - - // Et maintenant on construit la liste de mails... - // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'): - if ($configuration->envoi_mail && $action != 'printLabelRuban') { - - // owner's mail (utilisateur du matériel) - $mailList[0] = $materiel->email_responsable; - - // resp's mail - $mailsRespMetier = []; - $mailRespThematique = []; - - //TODO: changer ça car c'est pas forcément id=1 - if ($materiel->groupes_metier_id != null && $materiel->groupes_metier_id != 1) { - // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe - $mailsRespMetier = TableRegistry::getTableLocator()->get('Users')->find() - ->select('email') - ->where([ - 'role =' => 'Responsable', - 'groupes_metier_id =' => $materiel->groupes_metier_id - ]) - ->toArray(); - } - - //TODO: changer ça car c'est pas forcément id=1 - if ($materiel->groupes_thematique_id != null && $materiel->groupes_thematique_id != 1) { - // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe - $mailRespThematique = TableRegistry::getTableLocator()->get('Users')->find() - ->select('email') - ->where([ - 'role =' => 'Responsable', - 'groupe_thematique_id =' => $materiel->groupes_thematique_id - ]) - ->toArray(); - } - - if ($mailsRespMetier != [] || $mailRespThematique != []) { - $mailsResp = array_unique(array_merge($mailsRespMetier, $mailRespThematique)); - /* - for ($i = 0; $i < sizeof($mailsResp); $i ++) { - $mailList[] = $mailsResp[$i]['email']; - // $mailList[sizeof($mailList)] = $mailsResp[$i]['email']; - } - */ - foreach ($mailsResp as $mailResp) $mailList[] = $mailResp['email']; - $mailList = array_unique($mailList); - } - //debug($mailList);exit(); - - // mail admin de reference (ici appele gestionnaire) -> Partie administration - // Cela a été mis en commentaire car de toute façon l'utilisateur va voir un administratif pour faire valider sa fiche, - // Pas la peine de spam l'administration de mails non plus hein ! - - /* - * if ($action != 'statusValidated' && $action != 'statusArchived') { - * $mailsAdmin = TableRegistry::getTableLocator()->get('Users')->find()->select('email') - * ->where(['role =' => 'Administration']) - * ->toArray(); - * for ($i = 0; $i < sizeof($mailsAdmin); $i ++) { - * $mailList[sizeof($mailList)] = $mailsAdmin[$i]['email']; - * } - * } - */ - } - } // Materiel - - // @todo: ajouter quelques infos dans ces cas : - else if ($entity instanceof Document) { - //debug("doc"); exit; - $doc = $entity; - $nom_doc = $doc->nom; - $id_doc = $doc->id; - $type_doc = $doc->type_doc; - $id_mat = $doc->materiel_id; - $id_suiv = $doc->suivi_id; - if ($subject == null && $msg == null) { - $msgMore = ''; - Switch ($action) { - case 'add': - $subject = "Ajout d'un document"; - $msg = "$acteur a ajouté le document \"$nom_doc\" au format \"$type_doc\""; - break; - //ajoutons un contenu de message plus clair pour l'envoi de document - case'mailDevis': - $subject = "$acteur a partagé un document avec vous"; - $msg = "$acteur après avoir ajouté le document \"$nom_doc\", a voulu le partager avec vous, c'est un document ayant le format \"$type_doc\" ."; - $msg .="\n\n Le document est en pièce jointe."; - break; - //L'edition - //comme il n'étais pas actuellement activé, on le laisse en commentaire - //case 'edit': - //$subject = "Modification d'un document"; - //$msg = "$acteur a modifié le matériel \"$nom_doc\""; - //break; - //La suppression - //comme il n'étais pas actuellement activé, on le laisse en commentaire - //case 'delete': - //$subject = "Suppression d'un document"; - //$msg = "$acteur a supprimé le document\"$nom_doc\""; - //break; - default: - $subject = "Action \"$action\" sur un matériel"; - $msg = "$acteur a effectué l'action \"$action\" sur le document \"$nom_doc\" au format \"$type_doc\""; - break; - } // end switch - // (EP) Ajout de l'ID du document, et de l'id du materiel associé !!! - //On change le contenu en fonction de si le document a été lié à un matériel, ou a un suivi - if (!$id_mat == Null) { - $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_mat\")"; - $nomFic =$id_mat."_".$nom_doc."_".$id_doc.".".$type_doc; - } else { - $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_suiv\")"; - $nomFic =$id_suiv."_".$nom_doc."_".$id_doc.".".$type_doc; - } - } - // Et maintenant on construit la liste de mails... - // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'): - if ($configuration->envoi_mail && $action != 'printLabelRuban') { - - // (EP) Recup du materiel associé - $materiel = TableRegistry::getTableLocator()->get('Materiels')->find() - ->where([ - 'id =' => $doc->materiel_id - ])->first(); - - //debug("envoi"); - //debug("matos = ".$materiel); - //exit; - - // owner's mail (utilisateur du matériel associé ) - //$mailList[0] = $entity->materiel->email_responsable; - - // (MI) - gestionaire ratachée au matériel - //$mailList[1]= TableRegistry::getTableLocator()->get('Users')->find() - $mailList[]= TableRegistry::getTableLocator()->get('Users')->find() - ->select('email') - ->where([ - 'role =' => 'Administration', - 'id =' => $materiel->gestionnaire_id - ]); - - } - - - } else if ($entity instanceof Suivi) { - ; - } else if ($entity instanceof Emprunt) { - ; - } - /* - * @todo: - * else if ($entity instanceof Configuration) { - * ; - * } - * ... etc ... (il faut qu'on soit plus précis) - */ - // Si l'envoi à la liste spécifiée est activé (et que l'action ne correspond pas à 'printLabelRuban'): - $specificUsers = []; - if ($configuration->envoi_mail_guests && $action != 'printLabelRuban') { - // mail aux adresses specifiees dans la config - for ($i = 0; $i < 11; $i ++) { - $specificUser = $configuration['emailGuest' . $i]; - if ($specificUser) - $specificUsers[] = $specificUser; - // $mailList[sizeof($mailList)] = $configuration['emailGuest' . $i]; - $mailList[] = $specificUser; - // Le if vérifie que la ligne soit pas null - } - } - - // On dedoublonne la liste des mails, c'pas tres cool de se faire spam 2-3 fois pour la meme action sur le meme materiel, non mais ! - $mailList = array_unique($mailList); - - // ... Pour envoyer les mails aux personnes concernees - foreach ($mailList as $mail) { - // On envoi des mails à toute la liste, sauf pour "l'acteur", il sait ce qu'il a fait, pas besoin de le spam non plus hein - //if ($mail == $_SESSION['Auth']['User']['mail'][0]) - //continue; - $message = $msg; // Sisi, cette variable $message est utile, m'enfin vous pouvez toujours essayer de la supprimer ..... Et pensez à regarder le contenu de vos mails !!! Sinon ca fait une tumeur - // Génération du message "Vous recevez ce message en tant que $role" - // Si $role inexistant (lorsque c'est un mail de la liste entrée en configuration), le message est plutot "Vous recevez ce message car vous avez demandé à le recevoir. [...]" - //if ($specificUsers) - $role = "car vous etes dans la liste spécifique des emails de LabInvent. \n\nPour faire retirer votre mail de cette liste, veuillez contacter un super-administrateur."; - /* (EP 13/319) : à quoi sert toute cette suite du texte du mail ??? - * Ca sent le bon vieux copier-coller sans réfléchir... - //else { - //$role = $role. TableRegistry::get('Users')->find() - $role = $role. TableRegistry::getTableLocator()->get('Users')->find() - ->select('role') - ->where([ - 'email =' => $mail - ]) - ->first()['role'].' + '; - // Default role is Utilisateur (for people in LDAP but without priviledge, not in the users table) - // if (is_null($role)) - $role =$role .'en tant que ' .'Utilisateur'; - //} - */ - if ($entity != null && ! in_array($action, [ - 'delete', - 'statusValidated', - 'statusCreated' - ])) { - $message .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante."; - $message .= "\n\nVous recevez ce message " . $role; - //en fonction du mode à l'appel, on utilise un envoi de mail différent - - - switch($mode) { - //si le mode 1 est sélectionné c'est un envoi de mail avec ajout d'une photo - //explique le document qui a été ajouté, et le met en pièce jointe - case 1 : - $this->sendEmailImgTo("$subject", $message, $mail, $configuration, $nomFic); - break; - //si le mode 2 est sélectionné c'est un envoi de mail avec ajout d'un document - //à personnaliser - case 2 : - $this->sendEmailPJTo("$subject", $message, $mail, $configuration, $nomFic); - break; - //si le mode defaut est sélectionné c'est un simple envoi de mail - //récapitule une action (mieux pour les add...) - default : - $this->sendEmailTo("$subject", $message, $mail, $configuration); - break; - } - - } - } - return $mailList; -} -} + if (!$configuration->envoi_mail && !$configuration->envoi_mail_guests) return null; + + $mailList = []; + // On détermine le message et le sujet du mail en fonction de l'action effectuee + // on bloque l'envoi de mail à l'edition et à la validation pour eviter trop d'envoi de mail + // le temps que soit trouvé une autre solution + $acteur = $_SESSION['Auth']['User']['givenname'][0] . ' ' . $_SESSION['Auth']['User']['sn'][0]; + + /* + * - mail pour un MATERIEL + */ + + // if ($entity != null) { + if ($entity instanceof Materiel) { + $materiel = $entity; + $nom_materiel = $materiel->designation; + if ($subject == null && $msg == null) { + $msgMore = ''; + Switch ($action) { + case 'add': + $subject = "Ajout d'un matériel"; + $msg = "$acteur a ajouté le matériel \"$nom_materiel\""; + break; + case 'edit': + $subject = "Modification d'un matériel"; + $msg = "$acteur a modifié le matériel \"$nom_materiel\""; + break; + case 'delete': + $subject = "Suppression d'un matériel"; + $msg = "$acteur a supprimé le matériel \"$nom_materiel\""; + // @todo: mettre le nom des domaine, categ, et sous-categ, et non pas l'id + if ($materiel->sur_categorie_id != "") + $msgMore .= "\n\nDomaine : " . $materiel->sur_categorie_id; + if ($materiel->categorie_id != "") + $msgMore .= "\n\nCatégorie : " . $materiel->categorie_id; + if ($materiel->sous_categorie_id != "") + $msgMore .= "\n\nSous-catégorie : " . $materiel->sous_categorie_id; + if ($materiel->description != "") + $msgMore .= "\n\nDescription :\n" . $materiel->description; + break; + case 'statusCreated': + $subject = "Dé-validation d'un matériel"; + $msg = "$acteur a dé-validé le matériel \"$nom_materiel\""; + break; + case 'statusValidated': + $subject = "Validation d'un matériel"; + $msg = "$acteur a validé le matériel \"$nom_materiel\""; + break; + case 'statusToBeArchived': + $subject = "Demande d'archivage d'un matériel"; + $msg = "$acteur a demandé l'archivage du matériel \"$nom_materiel\""; + break; + case 'statusArchived': + $subject = "Archivage d'un matériel"; + $msg = "$acteur a archivé le matériel \"$nom_materiel\""; + break; + case 'setLabelIsPlaced': + $subject = "Etiquette posée sur un matériel"; + $msg = "Etiquette posée sur le matériel \"$nom_materiel\""; + break; + case 'printLabelRuban': + $subject = "Etiquette imprimée"; + $msg = "L'étiquette concerant votre matériel \"$nom_materiel\" a été imprimée"; + $mailList[0] = $materiel->email_responsable; + default: + $subject = "Action \"$action\" sur un matériel"; + $msg = "$acteur a effectué l'action \"$action\" sur le matériel \"$nom_materiel\""; + break; + } // end switch + // (EP) Ajout de l'ID du materiel !!! + $msg .= " (id=" . $materiel->id . ")."; + // Only for "delete" action (for the moment...) + if ($msgMore) + $msg .= $msgMore; + // $msg .= "\n\n"; + } // subject is null + + // Et maintenant on construit la liste de mails... + // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'): + if ($configuration->envoi_mail && $action != 'printLabelRuban') { + + // owner's mail (utilisateur du matériel) + $mailList[0] = $materiel->email_responsable; + + // resp's mail + $mailsRespMetier = []; + $mailRespThematique = []; + + //TODO: changer ça car c'est pas forcément id=1 + if ($materiel->groupes_metier_id != null && $materiel->groupes_metier_id != 1) { + // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe + $mailsRespMetier = TableRegistry::getTableLocator()->get('Users')->find() + ->select('email') + ->where([ + 'role =' => 'Responsable', + 'groupes_metier_id =' => $materiel->groupes_metier_id + ]) + ->toArray(); + } + + //TODO: changer ça car c'est pas forcément id=1 + if ($materiel->groupes_thematique_id != null && $materiel->groupes_thematique_id != 1) { + // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe + $mailRespThematique = TableRegistry::getTableLocator()->get('Users')->find() + ->select('email') + ->where([ + 'role =' => 'Responsable', + 'groupe_thematique_id =' => $materiel->groupes_thematique_id + ]) + ->toArray(); + } + + if ($mailsRespMetier != [] || $mailRespThematique != []) { + $mailsResp = array_unique(array_merge($mailsRespMetier, $mailRespThematique)); + /* + for ($i = 0; $i < sizeof($mailsResp); $i ++) { + $mailList[] = $mailsResp[$i]['email']; + // $mailList[sizeof($mailList)] = $mailsResp[$i]['email']; + } + */ + foreach ($mailsResp as $mailResp) $mailList[] = $mailResp['email']; + $mailList = array_unique($mailList); + } + //debug($mailList);exit(); + + // mail admin de reference (ici appele gestionnaire) -> Partie administration + // Cela a été mis en commentaire car de toute façon l'utilisateur va voir un administratif pour faire valider sa fiche, + // Pas la peine de spam l'administration de mails non plus hein ! + + /* + * if ($action != 'statusValidated' && $action != 'statusArchived') { + * $mailsAdmin = TableRegistry::getTableLocator()->get('Users')->find()->select('email') + * ->where(['role =' => 'Administration']) + * ->toArray(); + * for ($i = 0; $i < sizeof($mailsAdmin); $i ++) { + * $mailList[sizeof($mailList)] = $mailsAdmin[$i]['email']; + * } + * } + */ + } + } // Materiel + + + /* + * - mail pour un DOCUMENT LIÉ + */ + + // @todo: ajouter quelques infos dans ces cas : + else if ($entity instanceof Document) { + + //debug("doc"); exit; + $doc = $entity; + $nom_doc = $doc->nom; + $id_doc = $doc->id; + $type_doc = $doc->type_doc; + $id_mat = $doc->materiel_id; + $id_suiv = $doc->suivi_id; + if ($subject == null && $msg == null) { + $msgMore = ''; + Switch ($action) { + case 'add': + $subject = "Ajout d'un document"; + $msg = "$acteur a ajouté le document \"$nom_doc\" au format \"$type_doc\""; + break; + //ajoutons un contenu de message plus clair pour l'envoi de document + case 'mailDevis': + $subject = "$acteur a partagé un document avec vous"; + $msg = "$acteur après avoir ajouté le document \"$nom_doc\", a voulu le partager avec vous, c'est un document ayant le format \"$type_doc\" ."; + $msg .="\n\n Le document est en pièce jointe."; + break; + //L'edition + //comme il n'étais pas actuellement activé, on le laisse en commentaire + //case 'edit': + //$subject = "Modification d'un document"; + //$msg = "$acteur a modifié le matériel \"$nom_doc\""; + //break; + //La suppression + //comme il n'étais pas actuellement activé, on le laisse en commentaire + //case 'delete': + //$subject = "Suppression d'un document"; + //$msg = "$acteur a supprimé le document\"$nom_doc\""; + //break; + default: + $subject = "Action \"$action\" sur un matériel"; + $msg = "$acteur a effectué l'action \"$action\" sur le document \"$nom_doc\" au format \"$type_doc\""; + break; + } // end switch + // (EP) Ajout de l'ID du document, et de l'id du materiel associé !!! + //On change le contenu en fonction de si le document a été lié à un matériel, ou a un suivi + if (!$id_mat == Null) { + $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_mat\")"; + $nomFic =$id_mat."_".$nom_doc."_".$id_doc.".".$type_doc; + } else { + $msg .= "\n\n (id doc=".$doc->id.", Materiel associé d'id=\"$id_suiv\")"; + $nomFic =$id_suiv."_".$nom_doc."_".$id_doc.".".$type_doc; + } + } + + // Si le doc est lié à un matos, on ajoute le mail du gestionnaire du matos + // (ssi l'envoi général est activé et que l'action ne correspond pas à 'printLabelRuban') + if ( !$id_mat == Null && $configuration->envoi_mail && $action!='printLabelRuban' ) { + // (EP) Recup du materiel associé + /* + $materiel = TableRegistry::getTableLocator()->get('Materiels')->find() + ->where([ + 'id =' => $doc->materiel_id + ])->first(); + */ + $materiel = TableRegistry::getTableLocator()->get('Materiels')->get($doc->materiel_id); + //debug("envoi"); + //debug("matos = ".$materiel); + //exit; + // owner's mail (utilisateur du matériel associé ) + //$mailList[0] = $entity->materiel->email_responsable; + // (MI) - gestionaire ratachée au matériel + //$mailList[1]= TableRegistry::getTableLocator()->get('Users')->find() + $mailList[]= TableRegistry::getTableLocator()->get('Users')->find() + ->select('email') + ->where([ + 'role =' => 'Administration', + 'id =' => $materiel->gestionnaire_id + ]); + } // if matos + + } // DOC lié + + else if ($entity instanceof Suivi) { + ; + } + + else if ($entity instanceof Emprunt) { + ; + } + + /* + * @todo: + * else if ($entity instanceof Configuration) { + * ; + * } + * ... etc ... (il faut qu'on soit plus précis) + */ + + // Et maintenant on construit la liste de mails... + + // Si l'envoi à la liste spécifiée est activé (et que l'action ne correspond pas à 'printLabelRuban'): + $specificUsers = []; + if ($configuration->envoi_mail_guests && $action != 'printLabelRuban') { + // mail aux adresses specifiees dans la config + for ($i = 0; $i < 11; $i ++) { + $specificUser = $configuration['emailGuest' . $i]; + if ($specificUser) + $specificUsers[] = $specificUser; + // $mailList[sizeof($mailList)] = $configuration['emailGuest' . $i]; + $mailList[] = $specificUser; + // Le if vérifie que la ligne soit pas null + } + } + + // On dedoublonne la liste des mails, c'pas tres cool de se faire spam 2-3 fois pour la meme action sur le meme materiel, non mais ! + // Ca supprime aussi les lignes vides + $mailList = array_unique($mailList); + // ... Pour envoyer les mails aux personnes concernees + foreach ($mailList as $mail) { + // On envoi des mails à toute la liste, sauf pour "l'acteur", il sait ce qu'il a fait, pas besoin de le spam non plus hein + //if ($mail == $_SESSION['Auth']['User']['mail'][0]) + //continue; + $message = $msg; // Sisi, cette variable $message est utile, m'enfin vous pouvez toujours essayer de la supprimer ..... Et pensez à regarder le contenu de vos mails !!! Sinon ca fait une tumeur + // Génération du message "Vous recevez ce message en tant que $role" + // Si $role inexistant (lorsque c'est un mail de la liste entrée en configuration), le message est plutot "Vous recevez ce message car vous avez demandé à le recevoir. [...]" + //if ($specificUsers) + $role = "car vous etes dans la liste spécifique des emails de LabInvent. \n\nPour faire retirer votre mail de cette liste, veuillez contacter un super-administrateur."; + /* (EP 13/319) : à quoi sert toute cette suite du texte du mail ??? + * Ca sent le bon vieux copier-coller sans réfléchir... + //else { + //$role = $role. TableRegistry::get('Users')->find() + $role = $role. TableRegistry::getTableLocator()->get('Users')->find() + ->select('role') + ->where([ + 'email =' => $mail + ]) + ->first()['role'].' + '; + // Default role is Utilisateur (for people in LDAP but without priviledge, not in the users table) + // if (is_null($role)) + $role =$role .'en tant que ' .'Utilisateur'; + //} + */ + if ($entity != null && !in_array($action, ['delete','statusValidated','statusCreated'])) { + $message .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante."; + $message .= "\n\nVous recevez ce message " . $role; + //en fonction du mode à l'appel, on utilise un envoi de mail différent + switch($mode) { + //si le mode 1 est sélectionné c'est un envoi de mail avec ajout d'une photo + //explique le document qui a été ajouté, et le met en pièce jointe + case 1 : + $this->sendEmailImgTo("$subject", $message, $mail, $configuration, $nomFic); + break; + //si le mode 2 est sélectionné c'est un envoi de mail avec ajout d'un document + //à personnaliser + case 2 : + $this->sendEmailPJTo("$subject", $message, $mail, $configuration, $nomFic); + break; + //si le mode defaut est sélectionné c'est un simple envoi de mail + //récapitule une action (mieux pour les add...) + default : + $this->sendEmailTo("$subject", $message, $mail, $configuration); + break; + } // switch + } + } //foreach ($mailList as $mail) + return $mailList; + + } // function sendmail + + + +} // class AppController diff --git a/src/Controller/DocumentsController.php b/src/Controller/DocumentsController.php index fdc1914..064863c 100755 --- a/src/Controller/DocumentsController.php +++ b/src/Controller/DocumentsController.php @@ -4,6 +4,7 @@ namespace App\Controller; //use App\Controller\AppController; use Cake\ORM\TableRegistry; use FPDF; +use Cake\ORM\Locator\TableLocator; //use TCPDF; @@ -16,6 +17,15 @@ use FPDF; class DocumentsController extends AppController { + // Formats autorisés pour photo + var $photo_formats = ['png','jpg','jpeg']; + + // private pour qu'elle ne puisse pas être appelée via url comme une action + private function is_photo_type_from_extension($doc) { + return in_array($doc->type_doc, $this->photo_formats); + } + + /** * Give authorization for documents * @@ -214,103 +224,193 @@ class DocumentsController extends AppController ]); } + /** * Add method * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ - public function add() - { - $document = $this->Documents->newEntity(); + //public function add() + public function add($valeurs = null, $erreurs = null) { + $this->add_or_edit(TRUE, null, $valeurs, $erreurs); + } + + /** + * EDit method + * + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. + */ + public function edit($id = null) { + $this->add_or_edit(FALSE, $id); + } + + /** + * Add or Edit method (do either add() or edit()) + * => Factorisation de add() et edit() + * (voir aussi https://book.cakephp.org/3.0/en/orm.html) + * + * @param $IS_ADD: True = add ; False = edit + * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. + */ + private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) { + $this->myDebug("step 3: DocumentsController.add_or_edit()"); + + // add + + $document = $IS_ADD ? $this->Documents->newEntity() : $this->Documents->get($id, ['contain' => []]); + // POST (on vient de soumettre un nouveau doc) + /* + // ADD if ($this->request->is('post')) { + // EDIT + if ($this->request->is(['post','patch','put'])) { + */ + // (EP) Je suppose qu'on peut utiliser le meme test pour ADD ou EDIT + if ($this->request->is(['post','patch','put'])) { + $document = $this->Documents->patchEntity($document, $this->request->getData()); - $nomType = $this->Documents->TypeDocuments->find() - ->where([ - 'id =' => $document->type_document_id - ]) - ->first()['nom']; - - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') { - $document->set('photo', 1); + if ($IS_ADD) { + /* + $nomType = $this->Documents->TypeDocuments->find() + ->where([ + 'id =' => $document->type_document_id + ])->first()['nom']; + */ + $nomType = $this->Documents->TypeDocuments->get($document->type_document_id)['nom']; + if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') + $document->set('photo', 1); } - if ($this->Documents->save($document)) { - $this->Flash->success(__('Le fichier a bien été ajouté.')); + // SAVE + $action = $IS_ADD ? 'ajouté' : 'modifié'; + // - NOT SAVED + if (! $this->Documents->save($document)) { + //$this->myDebug($document->getErrors()); + //debug($document->getErrors()); + //debug($document); + $this->Flash->error(__("Le fichier n'a pas pu être $action")); + } + // - SAVED ok + else { + $this->Flash->success(__("Le fichier a bien été $action")); + //$id = $document->materiel_id; + $parent_id = $document->materiel_id; - $id = $document->materiel_id; - if (! empty($id)) { - $materielTable = TableRegistry::get('Materiels'); - $materiel = $materielTable->get($id); + if (!empty($parent_id)) { + $doc_type = 'matériel'; + //$parent_name = $parent->designation." (id = $parent->id)"; + $parent_controller = 'materiels'; } - - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') { - - $photoIdOld = $materiel->get('photo_id'); - if ($photoIdOld !== null) { - $docOld = TableRegistry::get('Documents')->get($photoIdOld); - $this->Documents->delete($docOld); - } - - $materiel->set('photo_id', $document->id); - $materielTable->save($materiel); + else { + $parent_id = $document->suivi_id; + $doc_type = 'suivi'; + //$parent_name = 'Suivi#'.$document->suivi_id; + $parent_controller = 'suivis'; } - $userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; - $userEmail = $this->LdapAuth->user('mail')[0]; - - // EMAIL - $id = $document->materiel_id; - if (empty($id)) { - // Ajout de doc au suivi - $id = $document->suivi_id; - // $this->sendEmailToManagementWith('[LabInvent] Ajout d\'un document', $userName.' (email = '.$userEmail.') a ajouté un document de type "'.$nomType.'" au suivi "Suivi '.$document->suivi_id.'".'); - $this->sendEmail($document, '[LabInvent] Ajout d\'un document', $userName . ' a ajouté un document de type "' . $nomType . '" au suivi "Suivi ' . $document->suivi_id . '".'); - return $this->redirect([ - 'controller' => 'suivis', - 'action' => 'view', - $id - ]); - } else { - // Ajout de doc au matériel - // $this->sendEmailToManagementWith('[LabInvent] Ajout d\'un document', $userName.' (email = '.$userEmail.') a ajouté un document de type "'.$nomType.'" au matériel "'.$materiel->designation.'" (id = '.$materiel->id.').'); - $this->sendEmail($document, '[LabInvent] Ajout d\'un document', $userName . ' a ajouté un document de type "' . $nomType . '" au matériel "' . $materiel->designation . '" (id = ' . $materiel->id . ').'); - return $this->redirect([ - 'controller' => 'materiels', - 'action' => 'view', - $id - ]); - } - } else { - //$this->myDebug($document->getErrors()); - debug($document->getErrors()); - debug($document); - $this->Flash->error(__('Le fichier n\'a pas pu être ajouté.')); - } + if ($IS_ADD) { + /* + // materiel + if (! empty($parent_id)) { + //$materielTable = TableRegistry::get('Materiels'); + $materielTable = TableRegistry::getTableLocator()->get('Materiels'); + //$materiel = $materielTable->get($id); + $parent = $materielTable->get($parent_id); + } + */ + $parentTable = TableRegistry::getTableLocator()->get($parent_controller); + $parent = $parentTable->get($parent_id); + // (EP 20200320) Ca n'est plus utilisé, mais je garde au cas où + // S'il y avait déjà une photo UNIQUE (mais ça n'est plus le cas puisqu'on associe N photos) liée au parent (materiel ou suivi) + // on la remplace par cette nouvelle photo + if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') { + //$photoIdOld = $materiel->get('photo_id'); + $photoIdOld = $parent->get('photo_id'); + if ($photoIdOld !== null) { + $docOld = TableRegistry::get('Documents')->get($photoIdOld); + $this->Documents->delete($docOld); + } + //$materiel->set('photo_id', $document->id); + //$materielTable->save($materiel); + $parent->set('photo_id', $document->id); + $parentTable->save($parent); + } + $userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; + $userEmail = $this->LdapAuth->user('mail')[0]; + + // send EMAIL et redirige vers vue détaillée + /* + //$id = $document->materiel_id; + if (!empty($parent_id)) { + $doc_type = 'matériel'; + $parent_name = $parent->designation." (id = $parent->id)"; + //$parent_controller = 'materiels'; + } + else { + $parent_id = $document->suivi_id; + $doc_type = 'suivi'; + $parent_name = 'Suivi#'.$document->suivi_id; + //$parent_controller = 'suivis'; + } + */ + $parent_name = $parent_controller=='materiels' ? + $parent->designation." (id = $parent->id)" + : + 'Suivi#'.$document->suivi_id; + $this->sendEmail($document, "[LabInvent] Ajout d'un document : $userName a ajouté un document de type '$nomType' au $doc_type $parent_name"); + } // ADD + //$parent_controller = empty($parent_id) ? 'suivis' : 'materiels'; + return $this->redirect([ + 'controller' => $parent_controller, + 'action' => 'view', + $parent_id + ]); + } // SAVED ok + } // fin du traitement POST - if (isset($this->request->getAttribute('params')['pass'][1]) && $this->request->getAttribute('params')['pass'][1] == 'mat') { - $materiel = $this->Documents->Materiels->find('list', [ - 'keyField' => 'id', - 'valueField' => 'numero_laboratoire' - ])->where([ - 'id =' => $this->request->getAttribute('params')['pass'][0] - ]); - $this->set('materiel', $materiel); - } else { - $suivi = $this->Documents->Suivis->find('list', [ - 'keyField' => 'id', - 'valueField' => 'id' - ])->where([ - 'id =' => $this->request->getAttribute('params')['pass'][0] - ]); - $this->set('suivi', $suivi); + // Traitement juste avant d'afficher la vue ADD ou EDIT + // On crée les variables nécessaires à la vue et on les lui passe + // ADD + if ($IS_ADD) { + $PARENT_IS_MATOS = (isset($this->request->getAttribute('params')['pass'][1]) && $this->request->getAttribute('params')['pass'][1] == 'mat'); + $parent_id = $this->request->getAttribute('params')['pass'][0]; } + // EDIT + else { + $PARENT_IS_MATOS = ! empty($document->materiel_id); + $parent_id = $PARENT_IS_MATOS ? $document->materiel_id : $document->suivi_id; + } + + //$parent_controller = $PARENT_IS_MATOS ? 'Materiels' : 'Suivis'; + $parent_controller = $PARENT_IS_MATOS ? 'materiels' : 'suivis'; + $parent = $this->Documents->$parent_controller->get($parent_id); + + // Set some variables for the view + $this->set(compact('parent')); + $doc_type = $PARENT_IS_MATOS ? 'matériel' : 'suivi'; + $this->set(compact('doc_type')); + $this->set(compact('parent_controller')); + $parent_name = $PARENT_IS_MATOS ? $parent->designation." (id = $parent->id)" : 'Suivi#'.$document->suivi_id; + $this->set(compact('parent_name')); + + $IS_PHOTO = $IS_ADD ? + (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') + : + $document->photo; + + if ($IS_PHOTO) $this->set('photo', 1); + $typesD = $this->Documents->TypeDocuments->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + 'order' => 'TypeDocuments.nom' + ]); - if (isset($this->request->getAttribute('params')['pass'][2]) && $this->request->getAttribute('params')['pass'][2] == 'photo') { - $this->set('photo', 1); + // ADD only + if ($IS_ADD && $IS_PHOTO) { $typesD = $this->Documents->TypeDocuments->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' @@ -320,102 +420,20 @@ class DocumentsController extends AppController $idType = $this->Documents->TypeDocuments->find() ->where([ 'nom =' => 'Photo' - ]) - ->first()['id']; + ])->first()['id']; $this->set('idType', $idType); - } else { - $typesD = $this->Documents->TypeDocuments->find('list', [ - 'keyField' => 'id', - 'valueField' => 'nom', - 'order' => 'TypeDocuments.nom' - ]); - } - - $this->set(compact('document', 'typesD')); - $this->set('_serialize', [ - 'document' - ]); - } - - /** - * EDit method - * - * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. - */ - public function edit($id = null) - { - $document = $this->Documents->get($id, [ - 'contain' => [] - ]); - - if ($this->request->is([ - 'patch', - 'post', - 'put' - ])) { - $document = $this->Documents->patchEntity($document, $this->request->getData()); - - if ($this->Documents->save($document)) { - $this->Flash->success(__('Le fichier a bien été edité.')); - - $id = $document->materiel_id; - if (empty($id)) { - $id = $document->suivi_id; - return $this->redirect([ - 'controller' => 'suivis', - 'action' => 'view', - $id - ]); - } else - return $this->redirect([ - 'controller' => 'materiels', - 'action' => 'view', - $id - ]); - } else - $this->Flash->error(__('Le fichier n\'a pas pu être edité.')); - } - - $id = $document->materiel_id; - if (empty($id)) { - $id = $document->suivi_id; - $suivi = $this->Documents->Suivis->find('list', [ - 'keyField' => 'id', - 'valueField' => 'id' - ])->where([ - 'id =' => $id - ]); - $this->set('suivi', $suivi); - } else { - /* - $materiel = $this->Documents->Materiels->find('list', [ - 'keyField' => 'id', - //'valueField' => 'numero_laboratoire' - 'valueField' => 'designation' - ])->where([ - 'id =' => $id - ]); - */ - $materiel = $this->Documents->Materiels->get($id); - $this->set('materiel', $materiel); - } - - if ($document->photo) $this->set('photo', 1); - - $typesD = $this->Documents->TypeDocuments->find('list', [ - 'keyField' => 'id', - 'valueField' => 'nom', - 'order' => 'TypeDocuments.nom' - ]); + } // ADD $this->set(compact('document', 'typesD')); - /* Inutile + /* inutile $this->set('_serialize', [ 'document' ]); */ - } + + } // add_or_edit() + /** * Delete method * @@ -734,9 +752,35 @@ class DocumentsController extends AppController */ public function mailDevis($id) { - $document = $this->Documents->get($id); - + /* + debug($document); + exit; + Exemple de résultat : + object(App\Model\Entity\Document) { + 'id' => (int) 63, + 'type_doc' => 'pdf', + 'materiel_id' => (int) 12007, + 'suivi_id' => null, + 'type_document_id' => (int) 12, + 'description' => 'df', + 'nom' => 'flkqjsd', + 'photo' => false, + '[new]' => false, + '[accessible]' => [ + '*' => true, + 'id' => false + ], + '[dirty]' => [], + '[original]' => [], + '[virtual]' => [], + '[hasErrors]' => false, + '[errors]' => [], + '[invalid]' => [], + '[repository]' => 'Documents' + + } + */ if ($this->request->is([ 'patch', 'post', diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 0f1f4d9..448b16d 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -951,7 +951,7 @@ class MaterielsController extends AppController * @param $IS_ADD: True = add ; False = edit * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. */ - public function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null) + private function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null) { $this->myDebug("step 3: MaterielsController.add_or_edit()"); @@ -1012,6 +1012,7 @@ class MaterielsController extends AppController */ if ( + /* // ADD // Nouveau materiel saisi et posted ($is_add && $this->request->is('post')) @@ -1021,6 +1022,8 @@ class MaterielsController extends AppController // EDIT // materiel modifié et posted ( (!$is_add) && $this->request->is(['patch','post','put']) ) + */ + ( $this->request->is(['post','patch','put']) ) ) { @@ -1385,7 +1388,9 @@ class MaterielsController extends AppController * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ - public function add($valeurs = null, $erreurs = null) { $this->add_or_edit(TRUE, null, $valeurs, $erreurs); } + public function add($valeurs = null, $erreurs = null) { + $this->add_or_edit(TRUE, null, $valeurs, $erreurs); + } /** @@ -1396,7 +1401,9 @@ class MaterielsController extends AppController * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ - public function edit($id = null) { $this->add_or_edit(FALSE, $id); } + public function edit($id = null) { + $this->add_or_edit(FALSE, $id); + } /** * Administrer method diff --git a/src/Model/Table/DocumentsTable.php b/src/Model/Table/DocumentsTable.php index a4a4f78..daccdd0 100755 --- a/src/Model/Table/DocumentsTable.php +++ b/src/Model/Table/DocumentsTable.php @@ -15,6 +15,10 @@ use Cake\ORM\TableRegistry; class DocumentsTable extends AppTable { + // Formats autorisés pour photo + var $photo_formats = ['png','jpg','jpeg']; + + /** * Initialize method * @@ -22,8 +26,7 @@ class DocumentsTable extends AppTable * The configuration for the Table. * @return void */ - public function initialize(array $config) - { + public function initialize(array $config) { parent::initialize($config); $this->setTable('documents'); @@ -124,10 +127,12 @@ class DocumentsTable extends AppTable if (! empty($entity->get('chemin_file')['tmp_name'])) { if ($entity->get('photo') || $entity->get('type_document_id')==4) { $extension = strtolower(pathinfo($entity->get('chemin_file')['name'], PATHINFO_EXTENSION)); - return in_array($extension, ['png','jpg','jpeg']); + return in_array($extension, $this->photo_formats); } return true; } + if ( $entity->get('edit') && $entity->get('type_document_id')==4 && !in_array($entity->get('type_doc'), $this->photo_formats)) + return false; return true; }; @@ -139,7 +144,12 @@ class DocumentsTable extends AppTable // Attention, c'est la DERNIERE règle ajoutée qui est testée en premier !!! (c'est une pile) - // REGLE 3 - Si photo, format ok + // REGLE 3 - Si photo, format doit être ok + $rules->add($checkPhotoFormat, [ + //'errorField' => 'chemin_file', + 'errorField' => 'type_document_id', + 'message' => 'La photo doit etre au format png, jpg (ou jpeg)' + ]); $rules->add($checkPhotoFormat, [ 'errorField' => 'chemin_file', 'message' => 'La photo doit etre au format png, jpg (ou jpeg)' @@ -184,21 +194,71 @@ class DocumentsTable extends AppTable * CakePHP Model Functions */ /* AVANT la sauvegarde: - * renseigner le champ "type_doc" avec l'extension, - * et mettre le type à photo si N/A alors que c'est une photo + * - renseigner le champ "type_doc" avec l'extension, + * - mettre le type à photo si N/A alors que c'est une photo */ public function beforeSave($event, $entity, $options) { - $file = $entity->get('chemin_file'); - if (! empty($file['tmp_name'])) { - $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); + $fileinfos = $entity->get('chemin_file'); + /* + debug($fileinfos); + Exemple de résultat : + [ + 'tmp_name' => '/private/var/tmp/phpD0Wky7', + 'error' => (int) 0, + 'name' => 'admission.pdf', + 'type' => 'application/pdf', + 'size' => (int) 18735 + ] + */ + if (! empty($fileinfos['tmp_name'])) { + $extension = strtolower(pathinfo($fileinfos['name'], PATHINFO_EXTENSION)); $entity->set('type_doc', $extension); } else { $extension = $entity->get('type_doc'); } + /* + debug($entity); + Exemple de résultat: + object(App\Model\Entity\Document) { + 'materiel_id' => (int) 12007, // ou suivi_id + 'nom' => 'zeoriazpe', + 'type_document_id' => (int) 1, + 'description' => '', + 'photo' => false, + 'chemin_file' => [ + 'tmp_name' => '/private/var/tmp/php9jc50F', + 'error' => (int) 0, + 'name' => 'admission.pdf', + 'type' => 'application/pdf', + 'size' => (int) 18735 + ], + 'type_doc' => 'pdf', + '[new]' => true, + '[accessible]' => [ + '*' => true, + 'id' => false + ], + '[dirty]' => [ + 'materiel_id' => true, + 'nom' => true, + 'type_document_id' => true, + 'description' => true, + 'photo' => true, + 'chemin_file' => true, + 'type_doc' => true + ], + '[original]' => [], + '[virtual]' => [], + '[hasErrors]' => false, + '[errors]' => [], + '[invalid]' => [], + '[repository]' => 'Documents' + } + */ // Si photo, set type_document_id = photo - if ( in_array($extension, ['png','jpg','jpeg']) ) { + if ( in_array($extension, $this->photo_formats) ) { if ( $entity->get('type_document_id')==1 ) $entity->set('type_document_id', 4); } @@ -208,7 +268,12 @@ class DocumentsTable extends AppTable /** * CakePHP Model Functions */ - // APRES la sauvegarde: renommer le fichier attaché selon norme id(du matériel ou suivi associé)_NomDoc_id(Doc).extension + /* APRES la sauvegarde: + * - renommer le fichier attaché selon norme : id(du matériel ou suivi associé)_NomDoc_id(Doc).extension + * - l'enregistrer au bon endroit : + * - si type photo => img/photos/ + * - sinon (doc pdf ou autre) => files/ + */ public function afterSave($event, $entity, $options) { $file = $entity->get('chemin_file'); @@ -225,10 +290,13 @@ class DocumentsTable extends AppTable */ $id = ( $entity->get('materiel_id') !== Null ) ? $entity->get('materiel_id') : $entity->get('suivi_id'); $nom = $id."_".$entity->get('nom')."_".$entity->get('id'). '.' . $extension; - if ($entity->get('photo')) { + //if ($entity->get('photo')) { + if ( in_array($entity->get('type_doc'), $this->photo_formats) ) { + // Photos dans img/photos/ move_uploaded_file($file['tmp_name'], 'img' . DS . 'photos' . DS . $nom ); } else { - move_uploaded_file($file['tmp_name'], 'files' . DS . $nom ); + // Docs dans files/ + move_uploaded_file($file['tmp_name'], 'files' . DS . $nom ); } } } @@ -250,7 +318,8 @@ class DocumentsTable extends AppTable */ $id = ( $entity->get('materiel_id') !== Null ) ? $entity->get('materiel_id') : $entity->get('suivi_id'); $nomFichier = $id."_".$entity->get('nom')."_".$entity->get('id').'.' . $entity->get('type_doc'); - if ($entity->get('photo')) { + //if ($entity->get('photo')) { + if ( in_array($entity->get('type_doc'), $this->photo_formats) ) { unlink('img' . DS . 'photos' . DS . $nomFichier); } else { unlink('files' . DS . $nomFichier); diff --git a/src/Template/Documents/add.ctp b/src/Template/Documents/add.ctp index 91d7f87..1001e92 100755 --- a/src/Template/Documents/add.ctp +++ b/src/Template/Documents/add.ctp @@ -1,81 +1,133 @@ request->getAttribute('params')['pass'][0]; -$parent_id = $this->request->getAttribute('params')['pass'][0]; +/* +debug($materiel); +debug($parent_id); +debug($document); +debug($typesD); +*/ ?>
- Form->create($document, ['type' => 'file']) ?> + + Lier $doc"; + + // Ce doc est rattaché à ... + //$link = isset($materiel) ? $materiel->designation : 'Suivi '.$suivi->id; + $displayElement(__("Ce document est lié au $doc_type"), $this->Html->link($parent_name, [ + 'controller' => $parent_controller, + 'action' => 'view', + $parent->id + ])); + + echo $this->Form->create($document, ['type' => 'file']); + ?> +
- Lier une photo'; - } else { - echo '

Lier un document

'; - } - if (isset($materiel)) { - echo $this->Form->control('materiel_id', [ - 'label' => 'N° materiel labo', - 'options' => $materiel, + + Form->control($control_name, [ + 'label' => $label, + 'options' => $parent, 'default' => $parent_id, 'readonly' => true ]); - } else if (isset($suivi)) { - echo $this->Form->control('suivi_id', [ - 'label' => 'N° suivi', - 'options' => $suivi, - 'default' => $parent_id, - 'readonly' => true + */ + //$control_name = isset($materiel) ? 'materiel_id' : 'suivi_id'; + $control_name = $parent_controller=='materiels' ? 'materiel_id' : 'suivi_id'; + //$label = 'N° materiel labo'; + echo $this->Form->hidden($control_name, [ + //'default' => $parent_id, + 'default' => $parent->id, ]); - } - - echo $this->Form->control('nom'); - - if (isset($photo)) { - echo $this->Form->hidden('type_document_id', [ + + // - Nom + echo $this->Form->control('nom'); + + // - Type (hidden si photo) + echo "(Si vous choisissez le type 'Photo', ce document sera affiché en tête de la fiche du $doc_type associé)"; + $f = 'control'; + $default = 1; + if (isset($photo)) { + $f = 'hidden'; + $default = $idType; + } + echo $this->Form->$f('type_document_id', [ 'label' => 'Type', 'options' => $typesD, - 'default' => $idType + 'default' => $default ]); - } else { - echo $this->Form->control('type_document_id', [ - 'label' => 'Type', - 'options' => $typesD, - 'default' => 1 + + // - Description + echo $this->Form->control('description'); + + // - File upload + echo $this->Form->control('chemin_file', [ + 'label' => 'Fichier (' . substr($configuration->taille_max_doc / (1024 * 1024), 0, 4) . ' Mo max)', + 'type' => 'file' ]); - } - - echo $this->Form->control('description'); - echo $this->Form->control('chemin_file', [ - 'label' => 'Fichier (' . substr($configuration->taille_max_doc / (1024 * 1024), 0, 4) . ' Mo max)', - 'type' => 'file' - ]); - - if (isset($photo)) { + + // - photo (hidden) echo $this->Form->hidden('photo', [ - 'default' => 1 + 'default' => isset($photo) ? 1 : 0 ]); - } else { - echo $this->Form->hidden('photo', [ - 'default' => 0 - ]); - } - - ?> + + ?> +
id, + $parent_controller ); echo $this->Form->end(); diff --git a/src/Template/Documents/edit.ctp b/src/Template/Documents/edit.ctp index bc74c5b..3934481 100644 --- a/src/Template/Documents/edit.ctp +++ b/src/Template/Documents/edit.ctp @@ -1,11 +1,40 @@ designation; +} +if (isset($suivi)) { + $suivi = $suivi; + $doc_type = 'suivi'; + $parent = $suivi; + $parent_controller = 'Suivis'; + $parent_name = 'Suivi#'.$parent->id; +} +*/ + +// Nouvelles variables +//$parent_id = $parent->id; + ?>
@@ -13,30 +42,17 @@ if (isset($suivi)) $suivi = $suivi; Editer une photo'; - } else { - echo '

Editer un document

'; - } + echo "

Editer $doc

"; //$materiel = $materiel->toArray(); //debug($materiel); - - if (isset($materiel)) { - $displayElement(__('Ce document est rattaché au materiel'), $this->Html->link($materiel->designation, [ - 'controller' => 'Materiels', - 'action' => 'view', - $materiel->id - ])); - } else if (isset($suivi)) { - $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [ - 'controller' => 'Suivis', - 'action' => 'view', - $suivi->id - ])); - } - + $displayElement(__("Ce document est lié au $doc_type"), $this->Html->link($parent_name, [ + 'controller' => $parent_controller, + 'action' => 'view', + $parent->id + ])); + echo $this->Form->create($document, ['type' => 'file']); ?> @@ -69,21 +85,18 @@ if (isset($suivi)) $suivi = $suivi; */ // - Nom - //On met le nom du doc en read only vu qu'il apparait dans le nom du fichier sur le serveur - //et une opération pour remodifier ces fichiers peut être complexe + // (Malik) On met le nom du doc en read only vu qu'il apparait dans le nom du fichier sur le serveur + // et une opération pour remodifier ces fichiers peut être complexe echo $this->Form->control('nom', ['readonly' => true]); // - Type (hidden si photo) - if (isset($photo)) - echo $this->Form->hidden('type_document_id', [ - 'label' => 'Type', - 'options' => $typesD - ]); - else - echo $this->Form->control('type_document_id', [ - 'label' => 'Type', - 'options' => $typesD - ]); + echo "(Si vous choisissez le type 'Photo', ce document sera affiché en tête de la fiche du $doc_type associé)"; + //$f = isset($photo) ? 'hidden' : 'control'; + $f = 'control'; + echo $this->Form->$f('type_document_id', [ + 'label' => 'Type', + 'options' => $typesD + ]); // - Description echo $this->Form->control('description'); @@ -100,15 +113,9 @@ if (isset($suivi)) $suivi = $suivi; ]); // - photo = 0 ou 1 (hidden) - if (isset($photo)) { - echo $this->Form->hidden('photo', [ - 'default' => 1 - ]); - } else { - echo $this->Form->hidden('photo', [ - 'default' => 0 - ]); - } + echo $this->Form->hidden('photo', [ + 'default' => isset($photo) ? 1 : 0 + ]); ?> @@ -117,8 +124,9 @@ if (isset($suivi)) $suivi = $suivi; id : $suivi->id, - isset($materiel) ? 'Materiels' : 'Suivis' + //$parent_id, + $parent->id, + $parent_controller ); echo $this->Form->end(); diff --git a/src/Template/Documents/view.ctp b/src/Template/Documents/view.ctp index 3c2882e..bb4689f 100755 --- a/src/Template/Documents/view.ctp +++ b/src/Template/Documents/view.ctp @@ -1,35 +1,44 @@

Détail document

- + + element('buttons_edit_del', ['id' => $document->id]);?> materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc; + // Seulement les photos : //$is_doc_photo = $document->type_document->nom == 'Photo'; - $is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']); + // Toute image : + $is_doc_photo = in_array($document->type_doc, $photo_formats); //echo $is_doc_photo; //debug($document); - if ($document->photo || $is_doc_photo) { - $style = 'max-width: 300px; text-align: center;'; - echo '
'; + //if ($document->photo || $is_doc_photo) { + if ($is_doc_photo) { + //$style = 'max-width: 300px; text-align: center;'; + $style = 'max-width: 300px;'; + //echo '
'; + echo '
'; //echo $this->Html->link('files/' . $doc_name, [ //echo $this->Html->image('photos/' . $doc_name, [ //echo 'FichierPhoto'; - if ($document->photo) - echo $this->Html->image('photos/' . $doc_name, [ + //if ($document->photo) + echo $this->Html->image('photos/' . $doc_name, [ //echo $this->Html->image('photos/' . $document->id . '.' . $document->type_doc, [ 'alt' => 'Photo', 'style' => $style ]); // $is_doc_photo //else echo 'Photo'; - else echo "Image"; + //else echo "Image"; echo '
'; } ?> @@ -42,49 +51,57 @@ $document = $document; Html->link($materiel->designation, [ - 'controller' => 'Materiels', - 'action' => 'view', - $materiel->id - ])); - } else if (isset($suivi)) { - $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [ - 'controller' => 'Suivis', - 'action' => 'view', - $suivi->id - ])); - } - - // - Nom du doc - $displayElement(__('Nom'), h($document->nom)); - - // - Type - $displayElement(__('Type'), $document->has('type_document') ? h($document->type_document->nom) : ''); - - if ($document->photo) { - $p = 'Oui'; - } else { - $p = 'Non'; - } - $displayElement(__('Miniature'), $p); - - echo '' . __('Description') . ' ' . nl2br($document->description) . ''; - - $displayElement(__('Extension fichier'), h($document->type_doc)); - - //$doc_name = $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc; - if ($document->photo) { - //echo 'FichierTélécharger fichier'; - echo 'FichierVoir photo'; - } else { - echo 'FichierTélécharger fichier'; - } - - ?> + // - Matériel : lien vers le materiel (ou le suivi) + if (isset($materiel)) { + $displayElement(__('Materiel'), $this->Html->link($materiel->designation, [ + 'controller' => 'Materiels', + 'action' => 'view', + $materiel->id + ])); + } else if (isset($suivi)) { + $displayElement(__('Suivi'), $this->Html->link('Suivi ' . $suivi->id, [ + 'controller' => 'Suivis', + 'action' => 'view', + $suivi->id + ])); + } + + // - Nom du doc + $displayElement(__('Nom'), h($document->nom)); + + // - Type + $displayElement(__('Type'), $document->has('type_document') ? h($document->type_document->nom) : ''); + + /* + // - Miniature + if ($document->photo) { + $p = 'Oui'; + } else { + $p = 'Non'; + } + $displayElement(__('Miniature'), $p); + */ + + // - Description + echo '' . __('Description') . ' ' . nl2br($document->description) . ''; + + // - Extension fichier + $displayElement(__('Extension fichier'), h($document->type_doc)); + + // - Lien téléchargement + //$doc_name = $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc; + //if ($document->photo) { + if ($is_doc_photo) { + //echo 'FichierTélécharger fichier'; + echo 'FichierVoir photo'; + } else { + echo 'FichierTélécharger fichier'; + } + + ?> +
type_document_id==4; - $is_doc_photo = in_array($document->type_doc, ['png','jpg','jpeg']); + $is_doc_photo = in_array($document->type_doc, $photo_formats); ?> photo || $is_doc_photo) ? 'Oui' : ''?> -- libgit2 0.21.2