From 8c519d1fa5c3f01494af74cce301f5270cdae340 Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Tue, 31 Aug 2021 13:07:04 +0200 Subject: [PATCH] Modif champs obligatoires pour IP2I et harmonisation des libelles (intitulé, status) --- CHANGELOG | 19 +++++++++++++------ README.md | 4 ++-- config/bootstrap.php | 5 +++++ install/installation.macos.temp.sh | 492 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/Controller/AppController.php | 19 ++++++++++++++++++- src/Controller/MaterielsController.php | 49 ++++++++++++++++++++++++++++++++++++++++--------- src/Model/Entity/Materiel.php | 8 ++++++++ src/Model/Table/AppTable.php | 6 ++++++ src/Model/Table/LdapConnectionsTable.php | 4 +++- src/Model/Table/MaterielsTable.php | 455 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------- src/Template/Element/materiels_list.ctp | 17 ++++++++++++----- src/Template/Emprunts/add_edit.ctp | 2 +- src/Template/Emprunts/index.ctp | 2 +- src/Template/Emprunts/view.ctp | 2 +- src/Template/Materiels/add_edit.ctp | 2 +- src/Template/Materiels/index.ctp | 8 ++++---- src/Template/Materiels/view.ctp | 3 ++- 17 files changed, 492 insertions(+), 605 deletions(-) delete mode 100644 install/installation.macos.temp.sh diff --git a/CHANGELOG b/CHANGELOG index d7fd7e7..cb3db94 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,12 @@ CHANGEMENTS ======= NEWS ======= ------- +31/03/2021 NEWS#6 (v4.108.18) : + +- Installation du logiciel désormais disponible via DOCKER (en quelques petites minutes) + + +------- FÉVRIER 2021 (v4.108.0-3.7.9) - GROSSE AMÉLIORATION DE LA PHASE INSTALLATION (FROM SCRATCH) : - Documentation en ligne (install et technique) grandement mise à jour, pour une progression plus logique @@ -31,12 +37,6 @@ ROADMAP IRAP : ------- -31/03/2021 NEWS#6 (v4.108.18) : - -- Installation du logiciel désormais disponible via DOCKER (en quelques petites minutes) - - -------- 30/11/2020 NEWS#5 (v4.107.21) : - Liste des matériels beaucoup plus pratique (colonnes plus pertinentes) et filtrage plus efficace @@ -331,6 +331,13 @@ Commencer à implémenter le nouveau workflow v5 : ======= CHANGES ======= ------- +31/08/2021 v4.108.22-3.7.9 + - Gestion spécifique des champs obligatoires selon le labo (pour l'instant on ne gère qu'une exception pour IP2I) + - Harmonisation des libellés : + - "intitulé" pour prêts et suivis + - "statut" des matériels + +------- 31/05/2021 v4.108.21-3.7.9 - Ajout asterisque sur nouveaux champs obligatoires pour LOT1 : description, organisme, budgets - (Refactorisation des LOT1 et LOT2 dans MaterielsTable, plus de redondance) diff --git a/README.md b/README.md index d537989..75b99de 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 31/05/2021 -Version: v4.108.21-3.7.9 +Date: 31/08/2021 +Version: v4.108.22-3.7.9 diff --git a/config/bootstrap.php b/config/bootstrap.php index e48e327..a9f8abd 100755 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -85,6 +85,11 @@ use Cake\Utility\Security; try { Configure::config('default', new PhpConfig()); Configure::load('app', 'default', false); + /* IP2I + // (EP 2021 08 Ajout nouveaux fichiers config pour les champs obligatoires et les autorisations) + Configure::load('app_labinvent_mandatory_fields', 'default'); + Configure::load('app_labinvent_authorizations', 'default'); + */ } catch (\Exception $e) { exit($e->getMessage() . "\n"); } diff --git a/install/installation.macos.temp.sh b/install/installation.macos.temp.sh deleted file mode 100644 index f7e76e4..0000000 --- a/install/installation.macos.temp.sh +++ /dev/null @@ -1,492 +0,0 @@ -#!/bin/bash - -# -# ------------ A - SETUP ------------ -# - -# Le script peut-il continuer et créer les fichiers qui lui sont nécessaires ? -access_path=`dirname $0` -if [ -r "$access_path" ]; then - if [ -w "$access_path" ]; then - if [ -x "$access_path" ]; then - echo "Vous avez les droits suffisants sur ce repertoire pour exécuter ce script" - else - echo "Veuillez relancer le script en root" - exit 1 - fi - else - echo "Veuillez relancer le script en root" - exit 1 - fi -else - echo "Veuillez relancer le script en root" - exit 1 -fi - -# Git ne doit pas tenir compte des changements de permission sur les fichiers (style "chmod +x" ou "chmod -R"...) -# Ca signifie qu'un changement de permission sur un fichier n'est pas vu par git (et donc pas commité) -git config core.fileMode false - -# Pour Mac OS recent (10.10, Yosemite), la syntaxe du SED est differente -# Il faut donc faire une copie de ce fichier et transformer les instructions sed a l'interieur -# Pour cela, il suffit d'executer ces 2 lignes : -# cp installation.sh installation_macosx.sh -# sed -e "s/ -i '' / -i '' /" -i '' installation_macosx.sh - -if [ ! -f ./installation.sh ] ; then - echo "Vous devez executer ce script depuis le dossier install/" - exit 1 -fi - -# Pour pouvoir ajouter les donnees IRAP (categories...) pendant l'installation, mettre à 1 -INSTALL_DATA_IRAP=1 - -# Revenir a la racine du projet (car on est dans le repertoire install/) : -#cd ../ -#if [ $0 != "install/installation.sh" ] ; then -# cd ../ -#fi - - -#Configurer l'application -# Donner le nom du groupe webService -echo -echo "LabInvent Copyright (C) 2012-2020 IRAP (Toulouse - France)" -echo "Auteurs : Etienne Pallier , Elodie Bourrec " -echo "Licence GPL (http://www.gnu.org/copyleft/gpl.html)" -echo "Ce logiciel est mis a disposition tel quel, SANS AUCUNE GARANTIE." -echo "C'est un logiciel libre, et vous pouvez le redistribuer sous certaines conditions." -echo "Il est construit sur le framework Php open source CakePhp (v3, http://cakephp.org) avec le langage Php v7" -echo - -echo "Votre serveur Mysql doit etre demarre (ainsi que votre serveur web)" -echo "Si c'est bien le cas, appuyez sur une touche pour continuer..." -read - -echo "La commande 'mysql' doit aussi etre accessible:" -res=`which mysql` -[[ -z "$res" ]] && exit 1 -echo "ok" -echo - -while : ; do - echo "Donner le nom du GROUPE du serveur web (ex: apache (centOs), www-data (Ubuntu), _www (MacOS avec Apache), daemon (MacOS avec XAMPP), nobody (MacOS), admin, ...)" - read grp - [[ -n "$grp" ]] && break -done -echo "==> groupe = $grp" -echo - -echo "Vous devez avoir les droits administrateur (via sudo) pour executer les commandes suivantes" -echo "Appuyez sur une touche pour continuer..." -read - - - -# -# ------------ B - PLUGINS ------------ -# - -# Installation des plugins dans vendor/ (cakephp, phpunit, phpqrcode, fpdf, ...) -echo "Installation des plugins dans vendor/ ..." -#cd install/ -chmod +x plugins_set.sh -chmod +x plugins_install.sh -./plugins_install.sh -#cd ../ - - -# Revenir a la racine du projet (car on est dans le repertoire install/) : -cd ../ - - - -# -# ------------ C - DOSSIERS LOCAUX DE TRAVAIL (./logs, ./tmp, ./webroot) ------------ -# - - -# - 1) Creation des dossiers temporaires (tmp, logs, webroot) - -echo "Création des dossiers temporaires..." -if [ ! -d "./logs" ]; then - mkdir ./logs/ -fi -if [ ! -f "./logs/error.log" ]; then - touch ./logs/error.log -fi -if [ ! -f "./logs/cli-error.log" ]; then - touch ./logs/cli-error.log -fi - -if [ ! -d "./tmp" ]; then - mkdir ./tmp/ -fi -if [ ! -d "./tmp/bake" ]; then - mkdir ./tmp/bake/ -fi -if [ ! -d "./tmp/cache" ]; then - mkdir ./tmp/cache/ -fi -if [ ! -d "./tmp/cache/models" ]; then - mkdir ./tmp/cache/models/ -fi -if [ ! -d "./tmp/cache/persistent" ]; then - mkdir ./tmp/cache/persistent/ -fi -if [ ! -d "./tmp/cache/views" ]; then - mkdir ./tmp/cache/views/ -fi -if [ ! -d "./tmp/documents" ]; then - mkdir ./tmp/documents/ -fi -if [ ! -d "./tmp/sessions" ]; then - mkdir ./tmp/sessions/ -fi -if [ ! -d "./tmp/tests" ]; then - mkdir ./tmp/tests/ -fi -if [ ! -d "./webroot/img/qrcodes" ]; then - # Normalement webroot/img/ existe déjà mais on ne sait jamais (donc -p) - mkdir -p ./webroot/img/qrcodes -fi - -# (EP 11/6/19) Pour pouvoir upload des photos (doc attaché) -folder=./webroot/img/photos -if [ ! -d "$folder" ]; then - mkdir $folder -fi -# Inutile car fait un peu plus loin -#chmod 777 $folder - -# (EP 24/5/19) Pour pouvoir upload des docs attachés -# Question: A quoi sert tmp/documents/ ci-dessus ? On peut le virer ? -folder=./webroot/files -if [ ! -d "$folder" ]; then - mkdir $folder -fi -chmod 777 $folder - -# (EP) Est-ce vraiment utile ? -#if [ ! -d "./vendor/phpunit" ]; then - #./composer.phar require --dev phpunit/phpunit -#else - #./composer.phar remove phpunit/phpunit - #./composer.phar require --dev phpunit/phpunit -#fi - -echo "==>Done" - - -# - 2) Mise à jour des droits d'accès sur ces dossiers temporaires - -echo "Mise à jour des droits des dossiers..." -echo "(Please enter your sudoer password)" - -# - a) POUR LES QRCODES -# Ajouter les droits en ecriture pour la creation des qrcodes -# phpqrcode write its errors into its folder ... -sudo chmod -R 775 ./vendor/aferrandini/phpqrcode/ -touch ./vendor/aferrandini/phpqrcode/errors.txt -chmod 775 ./vendor/aferrandini/phpqrcode/errors.txt -sudo chgrp -R $grp ./vendor/aferrandini/phpqrcode/ -[[ $? -ne 0 ]] && echo "Vous devez avoir le droit de faire un 'sudo' sinon executer ce script en tant que root" && exit 1 - -##sudo chmod -R 775 ./webroot/img/ -# TODO: ca serait mieux d'eviter ca ; -# Normalement, il faudrait ecrire dans app/tmp et pas dans app/webroot -# EP 2014/12/11 chmod 775 ne suffit pas -#chmod -R 775 ./webroot/img/ -#sudo chmod -R 770 ./webroot/img/ -sudo chmod -R 777 ./webroot/img/ -#sudo chown -R $grp:$grp ./webroot/img/ -sudo chgrp -R $grp ./webroot/img/ -# TODO: il faudrait plutot faire ceci : -#sudo chown -R $webServerLogin:$webServerGroup ./webroot/img/ -#chmod -R 775 ./webroot/img/ - -# - b) POUR LES DOCUMENTS -# Ajoute les droits en ecriture pour la generation des documents -dir="./tmp/documents/generator/" -if [ ! -d "$dir" ]; then - mkdir ./tmp/documents/generator/ -fi -##sudo chmod -R 775 ./tmp/documents/ -#chmod -R 775 ./tmp/documents/ - -# - c) POUR CAKEPHP (seule modif demandee par le framework) -# Les dossiers ./tmp et ./logs doivent être modifiable par le serveur web : -#chmod -R 775 ./tmp/ -sudo chmod -R 777 ./tmp/cache/ -chmod -R 777 ./tmp/ -sudo chgrp -R $grp ./tmp/ -chmod -R 777 ./logs/ -sudo chgrp -R $grp ./logs/ -#Il semble qu'il manque des droits au dossier Vendor, droit trop général à réduire (identifié les composants qui ont besoin de s'éxécuter ou de se lire, pas d'écriture dans le dossier Vendor normalement...) -#sudo chmod -R 770 ./vendor/ -sudo chmod -R 777 ./vendor/ -echo "==> Done" - -echo -echo "Mise à jour des droits des dossiers tmp et logs" -echo - -HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1` -setfacl -R -m u:${HTTPDUSER}:rwx tmp -setfacl -R -d -m u:${HTTPDUSER}:rwx tmp -setfacl -R -m u:${HTTPDUSER}:rwx logs -setfacl -R -d -m u:${HTTPDUSER}:rwx logs - - - -# -# ------------ D - MODE : install or update ? ------------ -# - -# Mode install or update - -while : ; do -echo "Voulez-vous effectuer une premiere installation OU BIEN une reconfiguration ('install'/'update') ? ['install'] :" - read mode - [[ -z $mode ]] && mode="install" - [[ $mode == "install" || $mode == "update" ]] && break -done -echo "==> Utilisation en mode $mode" - - - -# -# ------------ D - CONFIGURATION Database (fichier config/app.php) ------------ -# - -cakephpAppPath=./ -configPath=$cakephpAppPath/config -dbConfigFile=$configPath/app.php -myConfigFile=$configPath/app.php -configFile=$configPath/app.php - -# If INSTALL mode => copy sample GENERAL config file to real personal file (make a copy first if already exists !) -[[ -f $myConfigFile ]] && cp -p $myConfigFile $myConfigFile.ORIG -[[ $mode == "install" ]] && cp $configPath/app.default.php $myConfigFile - -while : ; do - echo "Voulez-vous (re-)créer la base de données (O/N) ? [N] :" - read rep - [[ -z $rep ]] && rep="N" - [[ $rep == "O" || $rep == "N" ]] && break -done -BDD=$rep -if [[ $BDD == "O" ]] ; then - echo "==> (re-)Création de la base de donnees" -else - echo "==> Pas de création de la base de donnees (la BD existe déjà)" -fi - -# Set database ip -echo "Entrez le nom ou l'adresse du serveur MySQL hebergeant la base de donnnees : (defaut=localhost)" -read bddIp -if [ -z $bddIp ] ; then - bddIp="localhost" -fi -echo "==> Adresse du serveur MySql = $bddIp" -echo - -if [[ $BDD == "O" ]] ; then - echo "Entrez le login privilegie vous donnant le droit de CREER les bases de donnees (NB: ce login ne sera utilise qu'une seule fois, pour la creation des bases ; par defaut=root) :" - echo "Si vous n'avez pas la permission de créer de nouvelles bases sur le serveur mais souhaitez installer le logiciel dans une base existante, entrez 'bd_existante'" - #echo "Si vous n'avez pas la permission de créer de nouvelles bases sur le serveur mais souhaitez installer le logiciel dans une base existante, entrez 'latmos'" - read bddAdminName - if [ -z $bddAdminName ] ; then - bddAdminName="root" - fi - echo "==> SGBD admin login = $bddAdminName" - echo - echo "Entrez le mot de passe de ce login privilegie (sinon, entrer le mot de passe de root) :" - read -s bddAdminPass - echo -fi - -echo - -# Configuration BD test et prod dans fichier config/app.php - -# - BD test - -sed -e "s/'database' => 'test_database'/'database' => 'test_labinvent2'/" -i '' $dbConfigFile -sed -e "s/'username' => 'test_username'/'username' => 'superadmin'/" -i '' $dbConfigFile -sed -e "s/'password' => 'test_password'/'password' => 'superadmin'/" -i '' $dbConfigFile - -# - BD prod - -#sed -e "s#/\*d\*/'host' => 'localhost'//\*d\*/'host' => '$bddIp'/" -i '' $dbConfigFile -sed -e "s/\*d\*\/'host' => 'localhost'/\*d\*\/'host' => '$bddIp'/" -i '' $dbConfigFile - -echo "Entrez le nom de la base a utiliser pour l'inventaire (defaut=labinvent)" -read bddName -if [ -z $bddName ] ; then - bddName="labinvent" -fi -echo "==> Nom de la BD = $bddName" -echo -sed -e "s/'database' => 'database'/'database' => '$bddName'/" -i '' $dbConfigFile - -# Attention, le login doit faire maximum 16 caracteres, car Mysql ne supporte pas plus -defaultBddUserName=${bddName:0:12}user -echo "Entrez le login qui doit etre cree pour que le logiciel puisse avoir acces a la base de donnees inventaire" -echo "Ce login sera utilise par le logiciel pour acceder et modifier la BD d'inventaire, quelque soit l'utilisateur connecte" -echo "Attention, il ne s'agit pas d'un utilisateur humain, mais d'un login associe au logiciel, il peut donc porter le nom du logiciel par exemple" -echo "Ce login doit faire 16 caracteres MAX (proposition par defaut, $defaultBddUserName):" -read bddUserName -if [ -z $bddUserName ] ; then - bddUserName=$defaultBddUserName -fi -echo "==> BDD inventaire user login = $bddUserName" -echo -sed -e "s/'username' => 'username'/'username' => '$bddUserName'/" -i '' $dbConfigFile -sed -e "s/'username' => 'superadmin'/'username' => '$bddUserName'/" -i '' $dbConfigFile -echo "Entrez le mot de passe de cet utilisateur :" -read -s bddUserPass -echo "==> BDD inventaire user pass = $bddUserPass" -echo -sed -e "s/'password' => 'password'/'password' => '$bddUserPass'/" -i '' $dbConfigFile -sed -e "s/'password' => 'superadmin'/'password' => '$bddUserPass'/" -i '' $dbConfigFile - -# DATABASE INSTALLATION - -#if [ $BDD == "N" ] ; then -# #Structure de la base de test présente dans le fichier "labinvent_mode_update.sql" -# cat ./labinvent_mode_update.sql > ./build_update.sql -# mysql --user=$bddAdminName --password=$bddAdminPass -h $bddIp < ./build_update.sql -#else - -if [ $BDD == "O" ] ; then - cd database/ - echo "Creation script de construction de la BD." - [[ -f build.sql ]] && cp -p build.sql build.sql.ORIG - - # Structure de la base présente dans le fichier "labinvent_last_version.sql" - # (EP 25/5/19) TODO: il faut un script sql adapté au cas 'bd_existante', - # c'est à dire SANS "create schema...", mais juste des "drop table if exists + create table" - if [ $bddAdminName == 'bd_existante' ] ; then - #cat ./labinvent_2.1_22-05-17.sql > ./build.sql - #cat ./labinvent_last_version_from_existing_bd.sql > ./build.sql - # (1) On crée un fichier vide - echo "" > ./build.sql - else - # (1) Instructions de création de la BD - cat ./create_database.sql > ./build.sql - fi - # (2) Instructions de création des tables - #cat ./labinvent_last_version_from_scratch.sql >> ./build.sql - cat ./create_tables.sql >> ./build.sql - # (3) Insertions des données de base indispensables (surtout la table configurations) - cat ./insert_tables_default_data_general.sql >> ./build.sql - - - # Ajout login & mdp utlisateur application dans le script build.sql - #sed -e "s/'mydb'/'$bddUserName'/" -i '' ./build.sql - sed -e "s/'mydb_user'/'$bddUserName'/" -i '' ./build.sql - #sed -e "s/'mydb1'/'$bddUserPass'/" -i '' ./build.sql - sed -e "s/'mydb_pass'/'$bddUserPass'/" -i '' ./build.sql - - # Seulement pour IRAP - if [ $INSTALL_DATA_IRAP -eq 1 ] ; then - echo "Voulez-vous installer les donnees propres a l'IRAP (categories, groupes metiers, groupes thematiques) dans la base de donnees, Oui/Non ? (reponse par defaut Oui) :" - read rep - if [ -z $rep ] || [ $rep == "O" ] || [ $rep == "o" ] || [ $rep == "Oui" ] || [ $rep == "oui" ] || [ $rep == "OUI" ]; then - echo "Installation des donnees IRAP dans la base de donnees" - #cat ./Insert_TablesFunct.sql >> ./build.sql - cat ./insert_tables_default_data_IRAP.sql >> ./build.sql - else - echo "Pas d'install de donnees IRAP dans la base" - fi - fi - echo - - #rep=" " - cat ./insert_superadmin_user.sql >> ./build.sql - - echo "Maintenant, nous allons definir l utilisateur qui sera superadministrateur de l application, ca peut etre VOUS (Pas de mot de passe par défaut) :" - echo "- Entrez ses (vos) Nom et Prenom (sous forme : Nom Prenom ) :" - read UserName UserPrenom - echo - echo "- Entrez son (votre) login (par exemple, votre login ldap - par défaut 'superadmin') :" - read login - # par defaut, on met superadmin (utilisé en fake ldap) - if [ -z $login ] ; then - login="superadmin" - fi - echo "==> login du super administrateur de LabInvent = $login" - echo "*** ATTENTION *** : Notez bien ce login, c'est celui qui vous permettra par défaut de vous connecter à LabInvent en tant que super administrateur (avec le mot de passe 'login')" - echo - echo "- Entrez son (votre) email :" - read mel - echo - sed -e "s/Nom/$UserName/" -i '' ./build.sql - sed -e "s/Prenom/$UserPrenom/" -i '' ./build.sql - sed -e "s/userlogin/$login/" -i '' ./build.sql - sed -e "s/'__@__'/'$mel'/" -i '' ./build.sql - - echo "Voulez-vous installer quelques utilisateurs supplémentaires (bidons, 1 par profil) dans la base de donnees (vous pourrez ensuite changer leur nom dans l'application, ou meme les supprimer ; par defaut, Oui): Oui/Non ?" - read rep - if [ -z $rep ] || [ $rep == "O" ] || [ $rep == "o" ] || [ $rep == "Oui" ] || [ $rep == "oui" ] || [ $rep == "OUI" ]; then - echo "Ajout de quelques utilisateurs supplementaires dans la base (Mot de passe par défaut : login)" - cat ./insert_fake_users.sql >> ./build.sql - fi - - # Remplacement des "use mydb" par "use $bddName" - sed -e "s/mydb/$bddName/" -i '' ./build.sql - - echo - echo "Creation base de donnees (Attention, votre serveur de BD doit etre demarre)" - if [ $bddAdminName == 'bd_existante' ] ; then - mysql --user=$bddUserName --password=$bddUserPass -h $bddIp < ./build.sql - else - mysql --user=$bddAdminName --password=$bddAdminPass -h $bddIp < ./build.sql - fi - echo "Base créée (a verifier)" - cd ../ -fi - - -echo -echo "Passage de l'application en mode INSTALL" -cd database/ -chmod +x mode_panique_macos.sh -./mode_panique_macos.sh - - - - - -echo -echo "*** FIN DE L'INSTALLATION ***" -echo - -#echo "Maintenant, veuillez poursuivre en suivant (rigoureusement) les indications données sur le wiki du projet : https://projects.irap.omp.eu/projects/inventirap/wiki/Installation#C-TESTS" - -#if [ $mode == 'install' ] ; then -# echo "Si vous voulez le conserver, le script de creation de la BD est database/build.sql" -# echo "Le fichier de configuration app.php a été écrasé, vous pouvez retrouver votre ancienne configuration dans le fichier app.php.ORIG." -# echo -# echo "MAINTENANT :" -# echo "1) Verifiez que la BD d'inventaire ($bddName) a bien ete cree (avec phpmyadmin par exemple)" -# echo "2) Verifiez que les tests passent, placez vous à la racine du projet, exécutez la commande 'vendor/bin/phpunit'." -# echo "3) Allez sur l'application, vous devriez arriver par défaut sur un mode install vous donnant des informations sur la configuration de votre application, vérifiez que tous les points sont bien validés (verts), sinon rajouter les extensions manquantes..." -# echo "4) Testez l'accès à l'application par le web" -#else -# echo -# echo "MAINTENANT :" -# echo "1) Verifiez que les tests passent, placez vous à la racine du projet, exécutez la commande 'vendor/bin/phpunit'." -# echo "2) Allez sur l'application, vous devriez arriver par défaut sur un mode install vous donnant des informations sur la configuration de votre application, vérifiez que tous les points sont bien validés (verts), sinon rajouter les extensions manquantes..." -# echo "3) Testez l'accès à l'application par le web" -#fi -# -#echo "Pour aller sur l'application, suivez la suite des instructions qui sont dans le fichier INSTALLATION.txt (à la racine du projet), que vous avez normalement deja commence a lire (ou bien sur le web (https://projects.irap.omp.eu/projects/inventirap/wiki/Installation)" -#echo -#echo "N'oubliez pas 3 choses importantes :" -#echo "1) Personnaliser les 2 fichiers logos suivants dans webroot/img/ :" -#echo "- logo_entity.jpg : le logo du laboratoire" -#echo "- logo_software.jpg : le logo du logiciel" -#echo "2) Personnaliser le logiciel pour votre entité (laboratoire) (via le menu de configuration dans la section outils de l\'application)" -#echo "3) Passer en mode LDAP (via le menu de configuration dans la section outils de l\'application)" diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index 8e02c37..6bcf46b 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -1956,7 +1956,24 @@ class AppController extends Controller // (EP 23/5/19) Exception si la config est vide, inutile d'aller plus loin ! if (is_null($this->confLabinvent)) throw new \Exception("EXCEPTION: La table 'configurations' de la base de données est vide"); - // Initialisation des autorisations pour les actions du controleur + + // (IP2I) Initialisation des autorisations pour les actions du controleur + /* + $configKey = 'GeneralAuthorizations'; + if ( Configure::check($configKey) ) { + $defaultAuthorizations = Configure::readOrFail($configKey); + //debug($defaultAuthorizations); + } + else debug("error"); + + $configKey = 'MaterielsAuthorizations'; + if ( Configure::check($configKey) ) { + $defaultAuthorizations = Configure::readOrFail($configKey); + //debug($defaultAuthorizations); + } + else debug("error"); + */ + // 1) Initialisation des autorisations par défaut du parent (AppController) $this->setDefaultAuthorizations(); // 2) Ajout des autorisations spécifiques par le controleur courant diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index b1907ce..ef16db1 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -485,7 +485,7 @@ class MaterielsController extends AppController { 'resp' => ['NOT CREATED',1] ]); - // Action 'updgrade' (avancement du statut d'un matériel) + // Action 'upgrade' (avancement du statut d'un matériel) // CREATED => VALIDATED => TBA => ARCHIVED /* $this->setAuthorizationsForAction('upgrade', ['NOT ARCHIVED',0], [ // En fait, l'action fait juste passer au statut "suivant" @@ -496,7 +496,6 @@ class MaterielsController extends AppController { 'resp' => 'user' ]); */ - // Action 'updgrade' (avancement du statut d'un matériel) // - Validation d'un materiel (passe à VALIDATED) : CREATED => VALIDATED $this->setAuthorizationsForAction('statusValidated (valider)', ['CREATED',0], [ 'user' => -1, // interdit @@ -2114,10 +2113,12 @@ class MaterielsController extends AppController { */ // Attributs obligatoires pour la phase COMMANDE - $LOT1 = $this->Materiels->MANDATORY_FIELDS_LOT1; + //$LOT1 = $this->Materiels->MANDATORY_FIELDS_LOT1; + $LOT1 = $this->Materiels->getMandatoryFieldsLot1(); // Attributs obligatoires pour la phase VALIDATION (livré et payé) - $LOT2 = $this->Materiels->MANDATORY_FIELDS_LOT2; + //$LOT2 = $this->Materiels->MANDATORY_FIELDS_LOT2; + $LOT2 = $this->Materiels->getMandatoryFieldsLot2(); // Seulement si prix > 10K€ : exiger la facture jointe et le n° série if ($materiel->prix_ht > 10000) { @@ -2125,10 +2126,11 @@ class MaterielsController extends AppController { $LOT2['numero_serie'] = 'S/N'; } // LOT2 = LOT1 + LOT2; - $LOT2 = array_merge($LOT1, $LOT2); + ////$LOT2 = array_merge($LOT1, $LOT2); //debug($LOT2);exit; // Champs obligatoires = LOT1 si CREATED, LOT2 sinon (>CREATED, c'est à dire VALIDATED ou plus) $mandatory_fields = ($materiel->status == 'CREATED') ? $LOT1 : $LOT2; + //debug($mandatory_fields); exit; $verb = $IS_ADD ? "ajouté" : "modifié"; @@ -2136,7 +2138,13 @@ class MaterielsController extends AppController { // Si au moins un champ obligatoire est nul ou vide => ERROR $ALL_MANDATORY_FIELDS_GIVEN = true; //foreach ($mandatory_fields as $fname => $fval) { + //print_r($materiel); foreach ($mandatory_fields as $fname=>$fname_nice) { + + // Champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave()) + // (fournisseur_id, et autres champs ajoutés dans l'avenir ? ...) + if ($fname=='fournisseur_id') continue; + if ($materiel->$fname === null || $materiel->$fname == '') { $ALL_MANDATORY_FIELDS_GIVEN = false; /* (EP 2020 03) @@ -2184,8 +2192,20 @@ class MaterielsController extends AppController { // (EP202009) $this->e doit refléter le matériel mis à jour /////$this->e = $materiel; $this->myDebug($materiel->getErrors()); + + //$msgError1 = "Pour valider un matériel, le champ suivant ne doit pas être vide : ".'fourniss'.' du matériel'; + //$this->Flash->error($msgError1); + + //debug($materiel->getErrors()); + $flash_msg = "Le matériel n'a pas pu être $verb"; + //if (is_null($materiel->Fournisseur)) $flash_msg .= ' (il faut préciser le fournisseur)'; + $this->Flash->error(__($flash_msg)); + //debug($materiel->getErrors()); - $this->Flash->error(__("Le matériel n'a pas pu être $verb")); + //foreach ($materiel->getErrors() as $f=>$e) $this->Flash->error(__($e[0].' : '.$f)); + foreach ($materiel->getErrors() as $f=>$e) + foreach($e as $k=>$v) $this->Flash->error(__($v.' : '.$f)); + } else { //debug($this->getCurrentEntity()); exit; @@ -2241,7 +2261,7 @@ class MaterielsController extends AppController { /* * \AV2 - OPTIONS - * (Domaine de définitionde de chaque champ, si peut s'exprimer comme une liste) + * (Domaine de définition de de chaque champ, si peut s'exprimer comme une liste) * * INITIALISATION DE LISTES qu'on va passer à la vue (edit ou add) pour assister la saisie (listes de choix proposés) * @@ -2788,6 +2808,11 @@ class MaterielsController extends AppController { // - VALIDATED if ($newStatus == 'VALIDATED') { + // Attributs obligatoires pour la phase VALIDATION (livré et payé) (LOT2) + $mandatoryFields = $this->Materiels->getMandatoryFieldsLot2(); + //$mandatoryFields = $this->Materiels->MANDATORY_FIELDS_LOT2; + //debug($mandatoryFields);exit; + /* $mandatoryFields = array( 'Nom utilisateur' => $materiel->nom_responsable, 'Fournisseur' => $materiel->fournisseur_id, @@ -2798,6 +2823,7 @@ class MaterielsController extends AppController { // (EP202009) Un gestionnaire par défaut (de référence) doit être choisi AVANT validation 'Gestionnaire de référence' => $materiel->gestionnaire_id ); + */ /* $mandatoryFields = array( $materiel->nom_responsable, @@ -2818,8 +2844,11 @@ class MaterielsController extends AppController { */ // Si au moins un champ obligatoire est nul ou vide => ERROR - foreach ($mandatoryFields as $fname => $fval) { + foreach ($mandatoryFields as $fname => $fnicename) { + $fval = $materiel->$fname; + //debug($fname); debug($fval); if ($fval === null || $fval == '') { + //debug($fname); // Validation d'un seul matériel => on revient à "edit" if ($onlyOneMateriel) { /* (EP 2020 03) @@ -2830,7 +2859,7 @@ class MaterielsController extends AppController { * (il se peut qu'on n'aie plus besoin de faire ça dans une prochaine version * de bootstrap, ou bootsrap-ui, ou cakephp..., à surveiller donc) */ - $msgError1 = "Pour valider un matériel, le champ suivant ne doit pas être vide : ".$fname.' du matériel'; + $msgError1 = "Pour valider un matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel'; $this->Flash->error($msgError1); /* MARCHE PAS POURQUOI ? $materiel->setError($field, 'Ce champ ne doit pas être vide'); @@ -2849,6 +2878,8 @@ class MaterielsController extends AppController { } } } + //debug("OK"); + //exit; // Le matos est valide, on peut donc marquer la date de validation $materiel->set('date_validated', date('Y-m-d')); //$materiel->date_validated = date('Y-m-d'); diff --git a/src/Model/Entity/Materiel.php b/src/Model/Entity/Materiel.php index 8fb1f9f..8421297 100755 --- a/src/Model/Entity/Materiel.php +++ b/src/Model/Entity/Materiel.php @@ -149,6 +149,14 @@ class Materiel extends Entity { protected function _getIsTobearchived() { return $this->status == 'TOBEARCHIVED'; } protected function _getIsArchived() { return $this->status == 'ARCHIVED'; } + public function getNiceStatus() { + if ($this->is_created) return 'À VALIDER'; + if ($this->is_validated) return 'VALIDÉ'; + if ($this->is_tobearchived) return 'À SORTIR'; + //if ($this->is_archived) + return 'ARCHIVÉ'; + } + // Ce matériel est utilisé ou déclaré par l'utilisateur $userfullname // is Owned Or Declared By User diff --git a/src/Model/Table/AppTable.php b/src/Model/Table/AppTable.php index 92235de..b06f65e 100644 --- a/src/Model/Table/AppTable.php +++ b/src/Model/Table/AppTable.php @@ -18,6 +18,12 @@ class AppTable extends Table // accents + - _ / () . , \s (=space) private $chaine = "a-zA-Z0-9éèàùâêôîïôûç%().,\/\s\+\-_'"; + // Check prix > 0 + public function checkPriceIsPositive($prix_ht) { + if (trim($prix_ht) != '') return is_numeric($prix_ht) && $prix_ht >= 0; + return true; + } + public function check_string($check) { return (bool) preg_match( diff --git a/src/Model/Table/LdapConnectionsTable.php b/src/Model/Table/LdapConnectionsTable.php index e28ffcd..0e2b473 100644 --- a/src/Model/Table/LdapConnectionsTable.php +++ b/src/Model/Table/LdapConnectionsTable.php @@ -1021,7 +1021,9 @@ class LdapConnectionsTable extends AppTable else // - ldap anonyme => binding anonyme $ldapbind = @ldap_bind($ldapConnection); - if (! $ldapbind) die("Impossible de faire un BIND simple sur le serveur ldap"); + if (! $ldapbind) { + die("Impossible de faire un BIND simple sur le serveur ldap " . $this->ldap_authentified ? "(mode authentifié) !" : "(mode anonyme) !"); + } // (4) SEARCH : Recherche d'infos (sur le user qui se connecte, ou bien sur tous les users) // $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index aa701b6..215f0f0 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -12,6 +12,9 @@ use Cake\ORM\Association\BelongsTo; use Cake\ORM\Entity; use Cake\I18n\FrozenDate; +// (2021 08) EP added to read new config files (config/app_mandatory_fields, ...) +use Cake\Core\Configure; + /** * Materiels Model * @@ -42,96 +45,193 @@ use Cake\I18n\FrozenDate; */ +//const IP2I = false; +//const IP2I = true; + // Max 10 ans entre 2 dates //const MAX_DIFF_YEARS = 10; -class MaterielsTable extends AppTable -{ +const MANDATORY_FIELDS_LOT1 = [ + + // Infos toujours obligatoires (cachées car calculées automatiquement) + //'status', + //'tobeordered', + + //'hors_service', // O/N + + 'designation' => 'Désignation', + + 'description' => 'Description', + //'permanent', + //'will_stay', // O/N + + 'sur_categorie_id' => 'Domaine', + 'categorie_id' => 'Catégorie', + + // - Utilisateur + 'nom_user' => "Nom de l'utilisateur de ce matériel", + + // - Acheteur + 'nom_responsable' => 'Nom du responsable', + // (rempli automatiquement) + 'email_responsable' => 'Email du responsable', + + // Calculé auto au moment du save() + //'numero_laboratoire', + + 'organisme_id' => 'Organisme', + + 'prix_ht' => 'Prix HT', + + // Optionnel car par défaut = acheteur + //'resp_credit' => 'Responsable du crédit', + + + //TODO: a remettre ? avec "je ne sais pas" + /////'gestionnaire_id' => 'Gestionnaire de référence', + + + //'fournisseur', + + //'devis joint', + + // Utilisé par la Gestion pour remplir le champ eotp + 'budgets' => 'Budgets', + + // INFOS ADMINISTRATIVES + // - EOTP : obligatoire seulement dans LOT2 + //'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) + +]; // $MANDATORY_FIELDS_LOT1 - private $PREV_SEUIL_INVENTORIABLE = 800; +const MANDATORY_FIELDS_LOT2 = [ - private $LAST_SEUIL_INVENTORIABLE_YEAR = 2020; - private $LAST_SEUIL_INVENTORIABLE_DATE = '03/06/2020'; - private $LAST_SEUIL_INVENTORIABLE; // 1000€ pour IRAP (depuis 3/6/2020) + //'fournisseur_id' => 'Fournisseur', + //'fournisseur' => 'Fournisseur', + 'date_acquisition' => "Date d'achat", - public $MANDATORY_FIELDS_LOT1 = [ + 'date_reception' => 'Date de livraison', - // Infos toujours obligatoires (cachées car calculées automatiquement) - //'status', - //'tobeordered', - - //'hors_service', // O/N - - 'designation' => 'Désignation', - - 'description' => 'Description', - //'permanent', - //'will_stay', // O/N - - 'sur_categorie_id' => 'Domaine', - 'categorie_id' => 'Catégorie', - - // - Utilisateur - 'nom_user' => "Nom de l'utilisateur de ce matériel", - - // - Acheteur - 'nom_responsable' => 'Nom du responsable', - // (rempli automatiquement) - 'email_responsable' => 'Email du responsable', + //'etiquette', // O/N + + 'site_id' => 'Site', + + 'lieu_detail' => 'Lieu de stockage', + + // INFOS ADMINISTRATIVES : + + // La Gestion doit remplir ce champ a partir des infos qui sont dans le champ "budget" (rempli par acheteur) + 'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) + + 'numero_commande' => 'Num. BC', + 'numero_inventaire_organisme' => "N° inventaire de l'organisme", + +]; - // Calculé auto au moment du save() - //'numero_laboratoire', - - 'organisme_id' => 'Organisme', +/* +const IP2I_optional_fields = [ + 'organisme_id'=>'', + 'prix_ht'=>'', + 'budgets'=>'', + + 'eotp'=>'', + 'numero_commande'=>'', + 'date_reception'=>'', + 'gestionnaire_id'=>'', +]; +*/ - 'prix_ht' => 'Prix HT', - - // Optionnel car par défaut = acheteur - //'resp_credit' => 'Responsable du crédit', - - - //TODO: a remettre ? avec "je ne sais pas" - /////'gestionnaire_id' => 'Gestionnaire de référence', - - - //'fournisseur', - - //'devis joint', - - // Utilisé par la Gestion pour remplir le champ eotp - 'budgets' => 'Budgets', - - // INFOS ADMINISTRATIVES - // - EOTP : obligatoire seulement dans LOT2 - //'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) + +//const MANDATORY_FIELDS_LOT1_IP2I = [ +define ('MANDATORY_FIELDS_LOT1_IP2I', [ - ]; // $MANDATORY_FIELDS_LOT1 + // Infos toujours obligatoires (cachées car calculées automatiquement) + //'status', + //'tobeordered', - public $MANDATORY_FIELDS_LOT2 = [ - - 'fournisseur_id' => 'Fournisseur', - - 'date_acquisition' => "Date d'achat", - - 'date_reception' => 'Date de livraison', - - //'etiquette', // O/N - - 'site_id' => 'Site', - - 'lieu_detail' => 'Lieu de stockage', - - // INFOS ADMINISTRATIVES : - - // La Gestion doit remplir ce champ a partir des infos qui sont dans le champ "budget" (rempli par acheteur) - 'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) - - 'numero_commande' => 'Num. BC', - 'numero_inventaire_organisme' => "N° inventaire de l'organisme", - - ]; + //'hors_service', // O/N + + 'designation' => 'Désignation', + + 'description' => 'Description', + //'permanent', + //'will_stay', // O/N + + 'sur_categorie_id' => 'Domaine', + 'categorie_id' => 'Catégorie', + + 'fournisseur_id' => 'Fournisseur', + + // - Utilisateur + 'nom_user' => "Nom de l'utilisateur de ce matériel", + + // - Acheteur + 'nom_responsable' => 'Nom du responsable', + // (rempli automatiquement) + 'email_responsable' => 'Email du responsable', + + // Calculé auto au moment du save() + //'numero_laboratoire', + + ////'organisme_id' => 'Organisme', + + ////'prix_ht' => 'Prix HT', + + // Optionnel car par défaut = acheteur + //'resp_credit' => 'Responsable du crédit', + + + //TODO: a remettre ? avec "je ne sais pas" + /////'gestionnaire_id' => 'Gestionnaire de référence', + + + //'fournisseur', + + //'devis joint', + + // Utilisé par la Gestion pour remplir le champ eotp + ////'budgets' => 'Budgets', + + + + 'date_acquisition' => "Date d'achat", + + ////'date_reception' => 'Date de livraison', + + //'etiquette', // O/N + + ///'site_id' => 'Site', + + ///'lieu_detail' => 'Lieu de stockage', + + + // INFOS ADMINISTRATIVES : + + // La Gestion doit remplir ce champ a partir des infos qui sont dans le champ "budget" (rempli par acheteur) + ///'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) + + ////'numero_commande' => 'Num. BC', + ////'numero_inventaire_organisme' => "N° inventaire de l'organisme", + +]); // $MANDATORY_FIELDS_LOT1 + +//const MANDATORY_FIELDS_LOT2_IP2I = MANDATORY_FIELDS_LOT1_IP2I; +define ('MANDATORY_FIELDS_LOT2_IP2I', MANDATORY_FIELDS_LOT1_IP2I); + + + +class MaterielsTable extends AppTable +{ + + public static $LAB = null; + + private $PREV_SEUIL_INVENTORIABLE = 800; + + private $LAST_SEUIL_INVENTORIABLE_YEAR = 2020; + private $LAST_SEUIL_INVENTORIABLE_DATE = '03/06/2020'; + private $LAST_SEUIL_INVENTORIABLE; // 1000€ pour IRAP (depuis 3/6/2020) public $ALL_STATUS = array( @@ -142,6 +242,44 @@ class MaterielsTable extends AppTable ); public function toto() { return "titi"; } + + public static function getLabName() { + // Singleton (on ne lit qu'1 seule fois la config !!!) + if (! self::$LAB) { + $confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); + if (is_null($confLabinvent)) throw new \Exception("EXCEPTION (from Model): La table 'configurations' de la base de données est vide"); + self::$LAB = $confLabinvent->labNameShort ? $confLabinvent->labNameShort : 'LABO'; + //debug(self::$LAB); + } + return self::$LAB; + } + + public static function getMandatoryFieldsLot1() { + //return IP2I ? MANDATORY_FIELDS_LOT1_IP2I : MANDATORY_FIELDS_LOT1; + $specific_constant_name = "MANDATORY_FIELDS_LOT1_".self::getLabName(); + //debug($constantName); + //debug(defined($constantName)); + $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_LOT1; + //debug($mandatory_fields_lot1); + return $mandatory_fields_lot1; + } + + public static function getMandatoryFieldsLot2() { + //$mandatory_fields_lot2 = IP2I ? MANDATORY_FIELDS_LOT2_IP2I : MANDATORY_FIELDS_LOT2; + $constantName = "MANDATORY_FIELDS_LOT2_".self::getLabName(); + //debug($constantName); + $mandatory_fields_lot2 = defined($constantName) ? constant($constantName) : MANDATORY_FIELDS_LOT2; + //debug($mandatory_fields_lot2); + return array_merge(self::getMandatoryFieldsLot1(), $mandatory_fields_lot2); + } + + public static function getMandatoryFieldsForMaterielStatus($status) { + + // CREATED => LOT1 + // VALIDATED et au-dessus => LOT2 + return ($status == 'CREATED') ? self::getMandatoryFieldsLot1() : self::getMandatoryFieldsLot2(); + + } /** * Initialize method @@ -157,6 +295,27 @@ class MaterielsTable extends AppTable { parent::initialize($config); + //debug($config); + /* (IP2I) + $mf1 = Configure::readOrFail('MANDATORY_FIELDS_LOT1'); + $mf2 = Configure::readOrFail('MANDATORY_FIELDS_LOT2'); + debug($mf1); + debug($mf2); + if ( Configure::check('MANDATORY_FIELDS_LOT1_IP2I') ) { + $mf1_IP2I = Configure::readOrFail('MANDATORY_FIELDS_LOT1_IP2I'); + debug($mf1_IP2I); + } + else debug("error"); + */ + + + /* + $confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); + if (is_null($confLabinvent)) throw new \Exception("EXCEPTION (from Model): La table 'configurations' de la base de données est vide"); + self::$LAB = $confLabinvent->labNameShort ? $confLabinvent->labNameShort : 'LABO'; + //debug(self::$LAB); + */ + $this->setTable('materiels'); //$this->setDisplayField('id'); $this->setDisplayField('designation'); @@ -298,9 +457,52 @@ class MaterielsTable extends AppTable public function validationDefault(Validator $validator) //: Validator { + /* + if (IP2I) { + + //$this->MANDATORY_FIELDS_LOT1['fournisseur_id'] = 'Fournisseur'; + //$this->MANDATORY_FIELDS_LOT1['fournisseur.name'] = 'Fournisseur'; + + $optional_fields = [ + 'organisme_id', + 'prix_ht', + 'budgets', + + 'eotp', + 'numero_commande', + 'date_reception', + 'gestionnaire_id', + ]; + + foreach ($optional_fields as $fname) { + // LOT1 + unset($this->MANDATORY_FIELDS_LOT1[$fname]); + + // LOT2 + unset($this->MANDATORY_FIELDS_LOT2[$fname]); + + $validator->allowEmptyString($fname, true); + } + + } + //print_r($this->MANDATORY_FIELDS_LOT1); + */ + + + /* + // TODO : améliorer ça. C'est lot1 si CREATED, et lot2 si VALIDATED+ + $lot = $this->getMandatoryFieldsLot1(); + // (EP 31/5/21) Champs obligatoires (LOT1) - foreach ($this->MANDATORY_FIELDS_LOT1 as $fname=>$fdisp) + foreach ($lot as $fname=>$fdisp) { + + // Champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave()) + // (fournisseur_id, et autres champs ajoutés dans l'avenir ? ...) + if ($fname=='fournisseur_id') continue; + $validator->allowEmptyString($fname, false, 'Ce champ doit être rempli'); + } + */ // Check date is dd/mm/yyyy /* @@ -520,7 +722,21 @@ class MaterielsTable extends AppTable - $validator->numeric('prix_ht'); + //$validator->numeric('prix_ht'); + /* + $validator->add($checkPriceIsStrictPositive, [ + 'errorField' => 'prix_ht', + //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix' + 'message' => "Le montant doit être supérieur à 0 €" + ]); + */ + $validator->allowEmpty('prix_ht')->add('prix_ht', 'valid', [ + 'rule' => 'checkPriceIsPositive', + 'message' => 'Le prix doit être numérique et positif', + 'provider' => 'table' + ]); + + // (EP202010 prix obligatoire) //->allowEmpty('prix_ht') /* @@ -611,9 +827,54 @@ class MaterielsTable extends AppTable $validator->allowEmpty('duree_garantie'); $validator->allowEmpty('unite_duree_garantie'); + $mandatory_fields = $this->getMandatoryFieldsLot1(); + $this->_setMandatoryFields($validator, $mandatory_fields); + $optional_fields = array_diff_key(MANDATORY_FIELDS_LOT1, $mandatory_fields); + //debug($optional_fields); + foreach ($optional_fields as $fname) $validator->allowEmptyString($fname, true); + return $validator; } // validationDefault() + + + private function _setMandatoryFields(Validator $validator, array $fields) { + + // (EP 31/5/21) Champs obligatoires (LOT1) + foreach ($fields as $fname=>$fdisp) { + + // Champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave()) + // (fournisseur_id, et autres champs ajoutés dans l'avenir ? ...) + if ($fname=='fournisseur_id') continue; + + $validator->allowEmptyString($fname, false, 'Ce champ doit être rempli'); + } + + } + + public function validationLOT1(Validator $validator) + { + $validator = $this->validationDefault($validator); + + //$this->_setMandatoryFields( $validator, $this->getMandatoryFieldsLot1() ); + + //$validator->add('password', 'length', ['rule' => ['lengthBetween', 8, 100]]); + + return $validator; + } + + public function validationLOT2(Validator $validator) + { + $validator = $this->validationDefault($validator); + + $this->_setMandatoryFields( $validator, $this->getMandatoryFieldsLot2() ); + + //$validator->add('password', 'length', ['rule' => ['lengthBetween', 8, 100]]); + + return $validator; + } + + public function checkStatus($check) { return ($check !== null && in_array($check, $this->ALL_STATUS)); } @@ -709,10 +970,17 @@ class MaterielsTable extends AppTable return true; }; + /* // Check prix > 0 $checkPriceIsStrictPositive = function (Entity $entity) { - return $entity->prix_ht > 0; + if ($entity->prix_ht) return $entity->prix_ht > 0; + return true; }; + $checkPriceIsNumeric = function (Entity $entity) { + if ($entity->prix_ht) return numeric($entity->prix_ht); + return true; + }; + */ // Check DATES @@ -808,11 +1076,14 @@ class MaterielsTable extends AppTable 'message' => "Si le matériel n'est pas technique, son prix HT doit obligatoirement être supérieur à ".$this->LAST_SEUIL_INVENTORIABLE."€ (inventoriable)" ]); */ + /* + //if (! IP2I) $rules->add($checkPriceIsStrictPositive, [ $rules->add($checkPriceIsStrictPositive, [ 'errorField' => 'prix_ht', //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix' 'message' => "Le montant doit être supérieur à 0 €" ]); + */ @@ -1068,6 +1339,30 @@ class MaterielsTable extends AppTable $fournisseur_asis = $entity->fournisseur ? $entity->fournisseur['name'] : ''; // Enlever les espaces superflus $fournisseur = trim($fournisseur_asis); + + // Si champ fournisseur obligatoire, vérification qu'il est bien rempli (ou emission d'une erreur) + //if (IP2I && $entity->fournisseur && $fournisseur == '') { + if ( + // - fournisseur_id est obligatoire pour le statut courant du matos + //in_array( 'fournisseur_id', array_keys($this->getMandatoryFieldsLot1()) ) + in_array( 'fournisseur_id', array_keys($this->getMandatoryFieldsForMaterielStatus($entity->status)) ) + // - et on est en mode add ou edit (le champ fournisseur existe) + && $entity->fournisseur + // - et le champ fournisseur est vide + && $fournisseur == '' + ) { + //debug("champ fournisseur vide !");exit; + //$msgError1 = "Pour valider un matériel, le champ suivant ne doit pas être vide : ".'fourniss'.' du matériel'; + //$this->Flash->error($msgError1); + /* MARCHE PAS POURQUOI ? + $materiel->setError($field, 'Ce champ ne doit pas être vide'); + $materiel->setError('numero_commande', 'Ce champ ne doit pas être vide'); + */ + $entity->setError('fournisseur', 'Ce champ ne doit pas être vide'); + + return false; + } + //debug($fournisseur); //debug($entity->fournisseur_orig); //exit; diff --git a/src/Template/Element/materiels_list.ctp b/src/Template/Element/materiels_list.ctp index c115392..899487b 100644 --- a/src/Template/Element/materiels_list.ctp +++ b/src/Template/Element/materiels_list.ctp @@ -215,7 +215,7 @@ $materiels = $materiels; --> Paginator->sort('Categories.nom', 'Catégorie') ?> - Paginator->sort('status', "Statut (CVTA)") ?> + Paginator->sort('status', 'Statut') ?> Paginator->sort('date_acquisition', 'Date Achat') ?> @@ -318,23 +318,30 @@ $materiels = $materiels; getNiceStatus(); + /* switch (h($materiel->status)) { case 'CREATED': - $statut = 'C'; + //$statut = 'C'; + $statut = 'A Valider'; break; case 'VALIDATED': - $statut = 'V'; + //$statut = 'V'; + $statut = 'Validé'; break; case 'TOBEARCHIVED': - $statut = 'T'; + //$statut = 'T'; + $statut = 'A sortir'; break; case 'ARCHIVED': - $statut = 'A'; + //$statut = 'A'; + $statut = 'Archivé'; break; default: $statut = ''; break; } + */ ?> > diff --git a/src/Template/Emprunts/add_edit.ctp b/src/Template/Emprunts/add_edit.ctp index 0b768c2..afea1b0 100644 --- a/src/Template/Emprunts/add_edit.ctp +++ b/src/Template/Emprunts/add_edit.ctp @@ -139,7 +139,7 @@ else { // - Nom emprunt (facultatif) echo $this->Form->control('nom', [ - 'label' => "Label (facultatif)", + 'label' => "Intitulé (facultatif)", 'placeholder' => 'Label pour désigner cet emprunt (facultatif)', ]); diff --git a/src/Template/Emprunts/index.ctp b/src/Template/Emprunts/index.ctp index b27a825..fdf6ea5 100755 --- a/src/Template/Emprunts/index.ctp +++ b/src/Template/Emprunts/index.ctp @@ -6,7 +6,7 @@ - Paginator->sort('id', 'N°') ?> + Paginator->sort('id', 'Intitulé') ?> Paginator->sort('materiel_id', 'Matériel') ?>