Commit 615ca8ea7ba39092105c1d311e64ac6e7095c03d

Authored by Etienne Pallier
1 parent dff255eb
Exists in master and in 1 other branch dev

Mise à jour composer et bugfix stats div/0

- mise à jour de composer.phar v1 => v2
- bugfix stats pour début nouvelle année (quand pas de donnée, division
par 0)
- Début Autorisations niveau VUE (niveau 2) dans MaterielsController

v4.107.30-3.7.9
CHANGES.txt renamed to CHANGELOG
... ... @@ -306,6 +306,17 @@ Commencer à implémenter le nouveau workflow v5 :
306 306 ======= CHANGES =======
307 307  
308 308 -------
  309 +18/12/2020 v4.107.29-3.7.9
  310 + - renommé CHANGES.txt en CHANGELOG, c'est plus standard
  311 +
  312 +
  313 +-------
  314 +08/12/2020 v4.107.28-3.7.9
  315 + - (#32) Ajout et gestion des nouveaux champs nécessaires pour LOT1 et LOT2
  316 + - Champs obligatoires pour LOT1 (comande) et LOT2 (validation)
  317 + - (#33) Définir le 2ème niveau d'autorisation (VUE) dans la doc et réorganiser l'action add_edit et la vue materiels/add_edit en conséquence
  318 +
  319 +-------
309 320 02/12/2020 v4.107.27-3.7.9
310 321 - Update données par défaut pour install from scratch (tables configuration, type_suivis, domaine, type_docs)
311 322 - (b) Bugfix (update) TESTS suite à évolution du code et règle sur étiquette : tous passent !
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 02/12/2020
56   -Version: 4.107.27-3.7.9
  55 +Date: 18/12/2020
  56 +Version: 4.107.29-3.7.9
57 57  
58 58  
59 59 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
composer.phar
No preview for this file type
src/Controller/MaterielsController.php
... ... @@ -1838,6 +1838,9 @@ class MaterielsController extends AppController {
1838 1838 * Add or Edit method (do either add() or edit())
1839 1839 * => Factorisation de add() et edit()
1840 1840 * (voir aussi https://book.cakephp.org/3.0/en/orm.html)
  1841 + *
  1842 + * Les autorisations du niveau 2 (VUE) pour cette action sont définies dans la documentation technique au chapître "Autorisations"
  1843 + * (https://docs.google.com/document/d/1-OhEeoi96j6ueUl5NQCQ9ZsTfbJTFw3ZVaWU2iYly_o/edit?pli=1#heading=h.uqfpcjutghc7)
1841 1844 *
1842 1845 * @param $IS_ADD: True = add ; False = edit
1843 1846 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
... ... @@ -1850,6 +1853,25 @@ class MaterielsController extends AppController {
1850 1853 //debug("ici"); exit;
1851 1854 $this->myDebug("step 3: MaterielsController.add_or_edit()");
1852 1855 $IS_EDIT = !$IS_ADD;
  1856 +
  1857 + /*
  1858 + * (EP 20201207)
  1859 + *
  1860 + * La plupart des Autorisations de niveau 2 (c'est à dire liées à la VUE materiels add_edit) sont définies ici.
  1861 + *
  1862 + * Voir le tableau correspondant dans la doc techique :
  1863 + * https://docs.google.com/document/d/1-OhEeoi96j6ueUl5NQCQ9ZsTfbJTFw3ZVaWU2iYly_o/edit?pli=1#heading=h.uqfpcjutghc7
  1864 + *
  1865 + * Il existe 5 types d'Autorisation de niveau Vue (AV) pour chaque attribut de l'entité (Entity Materiel) :
  1866 + * - \AV1. Obligatoire (défini dans classe Table pour LOT1, et ici pour LOT2) : cet attribut est-il obligatoire ?
  1867 + * - \AV2. Options (défini ici) : a-t-il un domaine de définition précis, c’est à dire un ensemble de valeurs possibles que l’on peut lister ?
  1868 + * - \AV3. Défaut (défini ici, ADD only) : a-t-il une valeur par défaut ?
  1869 + * - \AV4. Lecture seule (R, EDIT only) ou Caché (C) (défini ici) : est-il en lecture seule ?
  1870 + * - \AV5. Contrainte (défini dans classe Table) : existe-t-il sur lui une (ou des) contrainte d’intégrité ou une règle métier à respecter (ex: la date de livraison doit être supérieure à la date d’achat) ?
  1871 + *
  1872 + * Ces autorisations sont définies ci-dessous, précédées de leur type (\AV1, \AV2, ...)
  1873 + */
  1874 +
1853 1875 $usersTable = TableRegistry::getTableLocator()->get('Users');
1854 1876 // Set $materiel : soit un matériel vide (ADD new), soit un matériel de la BD à modifier (EDIT et ADD par copie)
1855 1877 //$materiel = ($IS_ADD && !$id) ? $this->Materiels->newEntity() : $this->Materiels->get($id, ['contain' => []]);
... ... @@ -1860,9 +1882,51 @@ class MaterielsController extends AppController {
1860 1882 if ($IS_ADD) {
1861 1883 // ADD normal
1862 1884 if (! $id) {
1863   - // Par défaut, l'Acheteur et l'Utilisateur du matériel c'est l'utilisateur courant
  1885 +
  1886 + // \AV3 : Valeurs par Défaut
  1887 +
  1888 + // matos permanent
  1889 + $materiel->will_stay = true;
  1890 +
  1891 + // l'Acheteur et l'Utilisateur du matériel c'est l'utilisateur courant (EDITEUR)
1864 1892 $materiel->nom_responsable = $this->u->nom;
1865 1893 $materiel->nom_user = $this->u->nom;
  1894 +
  1895 + // Si l'utilisateur courant (EDITEUR) est un gestionnaire :
  1896 + // - Gestionnaire de référence = EDITEUR (sinon, 'Je ne sais pas qui choisir')
  1897 + // - Date achat = today
  1898 + //$materiel->gestionnaire_id = null;
  1899 + $gestionnaires = $usersTable
  1900 + ->find('list', [
  1901 + //'keyField' => 'nom',
  1902 + 'keyField' => 'id',
  1903 + 'valueField' => 'nom'
  1904 + ])
  1905 + ->where([
  1906 + 'role =' => 'Administration'
  1907 + ])
  1908 + ->toArray();
  1909 + if ( in_array($this->u->id, $gestionnaires) ) {
  1910 + $materiel->gestionnaire_id = $this->u->id;
  1911 + //$materiel->gestionnaire_id = $_SESSION['Auth']['User']['sn'][0];
  1912 + $materiel->date_acquisition = date("d/m/Y");
  1913 + }
  1914 +
  1915 + // Etiquette : pas imprimée
  1916 + $materiel->etiquette = false;
  1917 +
  1918 + // statut = CREATED
  1919 + $materiel->status = 'CREATED';
  1920 +
  1921 + // Materiel à commander ? NON
  1922 + //$materiel->tobeordered = false;
  1923 +
  1924 + // Unité garantie = Ans
  1925 + $materiel->unite_duree_garantie = 'Ans';
  1926 +
  1927 + // HS ? NON
  1928 + $materiel->hors_service = false;
  1929 +
1866 1930 }
1867 1931 // ADD par copie : mettre id et numero labo à null
1868 1932 else {
... ... @@ -1957,8 +2021,9 @@ class MaterielsController extends AppController {
1957 2021  
1958 2022 /* SI POST...
1959 2023 * Les données ont été saisies et postées
1960   - * On va donc les sauvegarder
  2024 + * On va donc les sauvegarder (si ok)
1961 2025 */
  2026 +
1962 2027 //if ( $this->request->is(['post','patch','put']) ) {
1963 2028 $authorized_actions = $IS_ADD ? ['post'] : ['post','patch','put'];
1964 2029 if ( $this->request->is($authorized_actions) ) {
... ... @@ -2013,8 +2078,9 @@ class MaterielsController extends AppController {
2013 2078 // EDIT : Added: Disable modification of user_id.
2014 2079 //'accessibleFields' => ['user_id' => false]
2015 2080  
  2081 + /* (EP 7/12/20 : déjà fait dans la vue, donc inutile !!!)
2016 2082 // (2) Si l'utilisateur courant est un "administratif" => le mettre comme gestionnaire du materiel
2017   - // (tout ça pour ça !!! Faudra réduire ce bazar)
  2083 + // (tout ça pour ça !!! Faudra réduire ce bazar !)
2018 2084 $current_user_name = $_SESSION['Auth']['User']['sn'][0];
2019 2085 if (in_array(
2020 2086 $current_user_name,
... ... @@ -2035,9 +2101,125 @@ class MaterielsController extends AppController {
2035 2101 ])
2036 2102 ->first()->id;
2037 2103 }
  2104 + */
  2105 +
  2106 +
  2107 + /*
  2108 + * \AV1 : Attributs OBLIGATOIRES
  2109 + * On définit les infos obligatoires et on vérifie qu'elles sont bien présentes dans le POST
  2110 + */
  2111 +
  2112 + // Attributs obligatoires pour la phase COMMANDE
  2113 + $LOT1 = [
  2114 +
  2115 + // Infos toujours obligatoires (cachées car calculées automatiquement)
  2116 + //'status',
  2117 + //'tobeordered',
  2118 +
  2119 + //'hors_service', // O/N
  2120 +
  2121 + 'designation',
  2122 +
  2123 + //'permanent',
  2124 + //'will_stay', // O/N
  2125 +
  2126 + 'sur_categorie_id',
  2127 + 'categorie_id',
  2128 +
  2129 + // Calculé auto au moment du save()
  2130 + //'numero_laboratoire',
  2131 +
  2132 + 'description',
  2133 + 'prix_ht',
  2134 +
  2135 + 'nom_responsable',
  2136 + // Calculé auto
  2137 + 'email_responsable',
  2138 + 'resp_credit',
  2139 + 'nom_user',
  2140 +
  2141 + 'gestionnaire_id',
  2142 +
  2143 + 'organisme_id',
  2144 +
  2145 + //'fournisseur',
  2146 +
  2147 + //'devis joint',
  2148 +
  2149 + // INFOS ADMINISTRATIVES
  2150 + 'eotp', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s)
  2151 +
  2152 + ];
  2153 +
  2154 + // Attributs obligatoires pour la phase VALIDATION (livré et payé)
  2155 + $LOT2 = [
  2156 +
  2157 + 'fournisseur_id',
  2158 +
  2159 + 'date_acquisition',
  2160 +
  2161 + 'date_reception',
  2162 +
  2163 + //'etiquette', // O/N
  2164 +
  2165 + 'site_id',
  2166 +
  2167 + 'lieu_detail',
  2168 +
  2169 + // INFOS ADMINISTRATIVES
  2170 + 'numero_commande',
  2171 + 'numero_inventaire_organisme',
  2172 +
  2173 + ];
  2174 + // Seulement si prix > 10K€ : exiger la facture jointe et le n° série
  2175 + if ($materiel->prix_ht > 10000) {
  2176 + //$LOT2[] = 'facture jointe';
  2177 + $LOT2[] = 'numero_serie';
  2178 + }
  2179 + // LOT2 = LOT1 + LOT2;
  2180 + $LOT2 = array_merge($LOT1, $LOT2);
  2181 + //debug($LOT2);exit;
  2182 + // Champs obligatoires = LOT1 si CREATED, LOT2 sinon (>CREATED, c'est à dire VALIDATED ou plus)
  2183 + $mandatory_fields = ($materiel->status == 'CREATED') ? $LOT1 : $LOT2;
2038 2184  
2039   - // (3) On l'ajoute en BD, on envoie un email, et on affiche ok sur page accueil
2040 2185 $verb = $IS_ADD ? "ajouté" : "modifié";
  2186 +
  2187 + // On vérifie que les infos obligatoires sont présentes
  2188 + // Si au moins un champ obligatoire est nul ou vide => ERROR
  2189 + $ALL_MANDATORY_FIELDS_GIVEN = true;
  2190 + //foreach ($mandatory_fields as $fname => $fval) {
  2191 + foreach ($mandatory_fields as $fname) {
  2192 + if ($materiel->$fname === null || $materiel->$fname == '') {
  2193 + $ALL_MANDATORY_FIELDS_GIVEN = false;
  2194 + /* (EP 2020 03)
  2195 + * Ce genre de ligne ($this->Flash->...) affichant un message flash en haut de page,
  2196 + * ne fonctionnait plus à cause de bootstrap (css).
  2197 + * Ca fonctionne uniquement parce qu'on a surchargé la règle "fade"
  2198 + * de bootstrap dans inventirap.css
  2199 + * (il se peut qu'on n'aie plus besoin de faire ça dans une prochaine version
  2200 + * de bootstrap, ou bootsrap-ui, ou cakephp..., à surveiller donc)
  2201 + */
  2202 + $msgError1 = "Le champ suivant est obligatoire : ".$fname.' du matériel';
  2203 + $this->Flash->error($msgError1);
  2204 + /* MARCHE PAS POURQUOI ?
  2205 + $materiel->setError($field, 'Ce champ ne doit pas être vide');
  2206 + $materiel->setError('numero_commande', 'Ce champ ne doit pas être vide');
  2207 + */
  2208 + $materiel->setError($fname, 'Ce champ est obligatoire');
  2209 + // (EP 2020 03) Si on ne veut pas de bouton de suppression du message :
  2210 + //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible in alert-danger']]);
  2211 + //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible fade in alert-danger']]);
  2212 + //return $this->redirect(['action'=>'edit',$id]);
  2213 + ///////////////$this->Flash->error(__("Le matériel n'a pas pu être $verb"));
  2214 + //return false;
  2215 + break;
  2216 + }
  2217 + }
  2218 +
  2219 + if ($ALL_MANDATORY_FIELDS_GIVEN) {
  2220 +
  2221 + // (3) On l'ajoute en BD, on envoie un email, et on affiche ok sur page accueil
  2222 + //$verb = $IS_ADD ? "ajouté" : "modifié";
2041 2223 //$action = $IS_ADD ? "add" : "edit";
2042 2224 //debug($materiel); exit;
2043 2225 if (! $this->Materiels->save($materiel)) {
... ... @@ -2089,14 +2271,38 @@ class MaterielsController extends AppController {
2089 2271 $id
2090 2272 ]);
2091 2273 }
  2274 +
  2275 + } // $ALL_MANDATORY_FIELDS_GIVEN
  2276 +
2092 2277 } // if POST...
2093 2278  
  2279 +
  2280 +
  2281 +
2094 2282 /* SINON (PAS POST)
2095 2283 * C'est la première fois qu'on vient sur cette vue,
2096 2284 * donc on va préparer le formulaire de saisie)
2097 2285 */
2098 2286  
2099   - //--- 1) INITIALISATION DE LISTES qu'on va passer à la vue (edit ou add) pour assister la saisie (listes de choix proposés)
  2287 +
  2288 + /*
  2289 + * \AV2 - OPTIONS
  2290 + * (Domaine de définitionde de chaque champ, si peut s'exprimer comme une liste)
  2291 + *
  2292 + * INITIALISATION DE LISTES qu'on va passer à la vue (edit ou add) pour assister la saisie (listes de choix proposés)
  2293 + *
  2294 + * Attention, le nom des variables utilisées est très important.
  2295 + * Ca doit être le MEME nom que le champ, mais au PLURIEL
  2296 + * Comme ça, c'est AUTOMAGIQUEMENT utilisé dans la vue comme liste d'options possibles
  2297 + *
  2298 + * ex:
  2299 + * - pour sur_categorie_id => surCategories
  2300 + * - pour sur_categorie_id => categories
  2301 + * - pour sur_categorie_id => sousCategories
  2302 + * - pour organisme_id => organismes
  2303 + * ...
  2304 + *
  2305 + */
2100 2306  
2101 2307 // DOMAINES : LISTE COMPLETE
2102 2308 $surCategories = $this->Materiels->SurCategories->find('list', [
... ... @@ -2207,7 +2413,7 @@ class MaterielsController extends AppController {
2207 2413  
2208 2414 // Liste des gestionnaires (admin)
2209 2415 //$administrateurs = TableRegistry::get('Users')->find('list', [
2210   - $administrateurs = $usersTable
  2416 + $gestionnaires = $usersTable
2211 2417 ->find('list', [
2212 2418 //'keyField' => 'nom',
2213 2419 'keyField' => 'id',
... ... @@ -2379,6 +2585,12 @@ class MaterielsController extends AppController {
2379 2585 * Both achieve the same thing.
2380 2586 */
2381 2587 //$this->set(compact('designation', 'utilisateurconnect', 'users', 'materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'domaineresp', 'lieu_detail', 'fournisseurs'));
  2588 + $statuses = [
  2589 + 'CREATED' => 'CREATED',
  2590 + 'VALIDATED' => 'VALIDATED',
  2591 + 'TOBEARCHIVED' => 'TOBEARCHIVED',
  2592 + 'ARCHIVED' => 'ARCHIVED'
  2593 + ];
2382 2594 $entity = $materiel;
2383 2595 $this->set(compact(
2384 2596 'IS_ADD',
... ... @@ -2387,10 +2599,14 @@ class MaterielsController extends AppController {
2387 2599 'entity', // new
2388 2600 //'materiel', // @deprecated
2389 2601  
  2602 + 'statuses',
2390 2603 // not used
2391 2604 //'utilisateurconnect',
  2605 +
2392 2606 'surCategories',
2393   - 'categories', 'sousCategories',
  2607 + 'categories',
  2608 + 'sousCategories',
  2609 +
2394 2610 'groupesThematiques', 'groupesMetiers',
2395 2611 'projets',
2396 2612  
... ... @@ -2402,7 +2618,7 @@ class MaterielsController extends AppController {
2402 2618 //'utilisateurs',
2403 2619 //'users_login_and_email', 'users_option_list',
2404 2620 // Gestionnaires (id=>name):
2405   - 'administrateurs'
  2621 + 'gestionnaires'
2406 2622 ));
2407 2623  
2408 2624 /* (EP) INUTILE (sauf pour faire du json ou xml) !!!
... ...
src/Controller/PagesController.php
... ... @@ -505,8 +505,9 @@ class PagesController extends AppController
505 505 $years = [];
506 506 $all_matos = $materiels->find();
507 507 for ($y=$current_year ; $y>=$year_min ; $y--) {
508   - //debug($y);
  508 + ////debug($y);
509 509 $all_matos_for_year = $all_matos->cleanCopy()->where(['year(date_acquisition)' => $y]);
  510 + ////debug($all_matos_for_year->count());
510 511 // - statut par année
511 512 try {
512 513 foreach ($statuses as $status) {
... ... @@ -520,21 +521,27 @@ class PagesController extends AppController
520 521 $years[$y][$status] = $all_matos_for_year_and_status->count();
521 522 }
522 523 } catch (\PDOException $e) {
523   - debug("Mauvais format de requete SQL (PagesController suivis), Exception PDO générée !");
  524 + debug("Mauvais format de requete SQL (PagesController/stats statuses), Exception PDO générée !");
524 525 exit;
525 526 }
  527 + ////debug($years);
526 528 // Suivis et Prets, par année
527 529 $all_matos_suivis_for_year = $all_matos_for_year->cleanCopy();
528 530 foreach ($associated_entities as $e)
529 531 try {
  532 + ////debug($e);
  533 + //debug($$e->find()->count());
530 534 /*
531 535 * SQL equivalent : à tester...
532 536 *
533 537 * SELECT COUNT(DISTINCT(suivis.materiel_id)) FROM suivis LEFT JOIN materiels
534 538 * ON suivis.materiel_id = materiels.id
535 539 * WHERE YEAR(materiels.date_acquisition) = $y
  540 + *
  541 + * $years[$y]['suivis'] = $suivis->find()...
  542 + * puis
  543 + * $years[$y]['prets'] = $prets->find()...
536 544 */
537   - //$years[$y]['suivis'] = $suivis
538 545 $years[$y][$e] = $$e
539 546 // Tous les suivis/emprunts...
540 547 ->find()
... ... @@ -554,8 +561,9 @@ class PagesController extends AppController
554 561 //->select(['id', 'count_suivis => count(suivis)'])
555 562 //->where(['count_suivis >' => 0])
556 563 //->count();
557   - } catch (\PDOException $e) {
558   - debug("Mauvais format de requete SQL (PagesController prets), Exception PDO générée !");
  564 + } catch (\PDOException $ex) {
  565 + debug("Mauvais format de requete SQL (PagesController/stats suivis/prets), Exception PDO générée !");
  566 + debug($ex);
559 567 exit;
560 568 }
561 569 //debug($years[$y]['suivis']);
... ...
src/Template/Materiels/add_edit.ctp
... ... @@ -80,6 +80,7 @@ $entity = $entity;
80 80 $materiel = $entity;
81 81 //debug($entity);
82 82  
  83 +$statuses = $statuses;
83 84  
84 85 $domaineresp = $domaineresp;
85 86 //$designations = $designations;
... ... @@ -87,7 +88,7 @@ $domaineresp = $domaineresp;
87 88 $fournisseurs = $fournisseurs;
88 89 //foreach ($fournisseurs as $l) debug($l);
89 90 //foreach ($fournisseurs as $k=>$v) debug("$k => $v");
90   -$administrateurs = $administrateurs;
  91 +$gestionnaires = $gestionnaires;
91 92 $lieu_detail = $lieu_detail;
92 93 //foreach ($lieu_detail as $l) debug($l);
93 94 //foreach ($lieu_detail as $k=>$v) debug("$k => $v");
... ... @@ -135,7 +136,7 @@ $echoActionButton = $echoActionButton;
135 136 $echoSubmitButtons = $echoSubmitButtons;
136 137  
137 138 $mydebug($D, $surCategories);
138   -$mydebug($D, $categories);
  139 +//$mydebug($D, $categories);
139 140 $mydebug($D, $materiel);
140 141  
141 142 //debug($GLOBALS);
... ... @@ -375,7 +376,8 @@ if (isset($cpMateriel)) {
375 376 // will_stay
376 377 echo $this->Form->control('will_stay', [
377 378 'label' => 'Ce matériel restera au laboratoire',
378   - 'default' => 1,
  379 + // Inutile, défini via controller
  380 + //'default' => 1,
379 381 ]);
380 382  
381 383 // - Description
... ... @@ -423,7 +425,8 @@ if (isset($cpMateriel)) {
423 425 echo $this->Form->control('sur_categorie_id', [
424 426 'label' => 'Domaine',
425 427 //'style' => 'width: 260px',
426   - 'options' => $surCategories,
  428 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  429 + //'options' => $surCategories,
427 430 'empty' => 'Choisir un domaine',
428 431 //'default' => $Sur_categ_id
429 432 // ADD only
... ... @@ -433,7 +436,7 @@ if (isset($cpMateriel)) {
433 436 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields)
434 437 ]);
435 438 // - CATEGORIE
436   - $categs = $categories;
  439 + //$categs = $categories;
437 440 /*
438 441 // if a domain is selected, reduce the categories list to this domain
439 442 //debug($categories);
... ... @@ -447,7 +450,9 @@ if (isset($cpMateriel)) {
447 450 echo $this->Form->control('categorie_id', [
448 451 'label' => 'Catégorie',
449 452 //'style' => 'width: 380px',
450   - 'options' => $categs,
  453 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  454 + //'options' => $categories,
  455 + //'options' => $categs,
451 456 'empty' => 'Choisir une catégorie',
452 457 //'default' => $Categ_id
453 458 // ADD only
... ... @@ -456,7 +461,7 @@ if (isset($cpMateriel)) {
456 461 'disabled' => $IS_ADD ? false : $isReadonlyField('categorie_id', $myReadonlyFields)
457 462 ]);
458 463 // - SOUS-CATEGORIE (by default, list is empty)
459   - $souscategs = $sousCategories;
  464 + //$souscategs = $sousCategories;
460 465 /*
461 466 $souscategs = [];
462 467 // if a categ is selected, update sous-categs list for this categ (only)
... ... @@ -472,7 +477,9 @@ if (isset($cpMateriel)) {
472 477 echo $this->Form->control('sous_categorie_id', [
473 478 'label' => 'Sous-catégorie',
474 479 //'style' => 'width: 380px',
475   - 'options' => $souscategs,
  480 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  481 + //'options' => $sousCategories,
  482 + //'options' => $souscategs,
476 483 'empty' => 'Choisir une sous-catégorie',
477 484 // ADD only
478 485 //'default' => $Sous_categ_id
... ... @@ -494,7 +501,8 @@ if (isset($cpMateriel)) {
494 501 echo $this->Form->control('groupes_thematique_id', [
495 502 'label' => $nom_groupe_thematique,
496 503 'empty' => 'N/A',
497   - 'options' => $groupesThematiques,
  504 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  505 + //'options' => $groupesThematiques,
498 506 //'default' => $Groupes_thematique_id
499 507 //'default' => $IS_ADD ? $materiel->groupes_thematique_id : 1,
500 508 // EDIT only
... ... @@ -504,7 +512,8 @@ if (isset($cpMateriel)) {
504 512 echo $this->Form->control('groupes_metier_id', [
505 513 'label' => $nom_groupe_metier,
506 514 'empty' => 'N/A',
507   - 'options' => $groupesMetiers,
  515 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  516 + //'options' => $groupesMetiers,
508 517 //'default' => $Groupes_metier_id
509 518 //'default' => $IS_ADD ? $materiel->groupes_metier_id : 1,
510 519 // EDIT only
... ... @@ -524,7 +533,8 @@ if (isset($cpMateriel)) {
524 533 'empty' => 'N/A',
525 534 //'empty' => '(seulement si ce matériel est associé à un projet)',
526 535 //'style' => 'width: 380px',
527   - 'options' => $projets,
  536 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  537 + //'options' => $projets,
528 538 // ADD only
529 539 //'default' => $Sous_categ_id
530 540 //'default' => $materiel->projet_id,
... ... @@ -586,7 +596,8 @@ if (isset($cpMateriel)) {
586 596  
587 597 // - Site
588 598 echo $this->Form->control('site_id', [
589   - 'options' => $sites,
  599 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  600 + //'options' => $sites,
590 601 //'style' => 'width: 380px',
591 602 //'default' => $Site_id
592 603 //'default' => ($IS_ADD ? $materiel->site_id : 9),
... ... @@ -722,12 +733,16 @@ if (isset($cpMateriel)) {
722 733 */
723 734 echo $this->Form->control('status', [
724 735 'label' => 'Statut',
725   - 'options' => [
  736 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  737 + //'options' => $statuses,
  738 + /*
  739 + 'options' => [
726 740 'CREATED' => 'CREATED',
727 741 'VALIDATED' => 'VALIDATED',
728 742 'TOBEARCHIVED' => 'TOBEARCHIVED',
729 743 'ARCHIVED' => 'ARCHIVED'
730 744 ]
  745 + */
731 746 ]);
732 747 }
733 748  
... ... @@ -763,8 +778,8 @@ if (isset($cpMateriel)) {
763 778 //'empty' => $entity->nom_responsable,
764 779 //'default' => $entity->nom_responsable,
765 780 //'default' => $username,
766   - //'options' => $utilisateurs
767 781 'options' => $users_option_list,
  782 + //'options' => $utilisateurs
768 783 //'readonly' => $IS_EDIT ? false : $readonly,
769 784 //'readonly' => $readonly,
770 785 'disabled' => $readonly,
... ... @@ -789,6 +804,13 @@ if (isset($cpMateriel)) {
789 804 // ADD only (Quand je crée une fiche, la personne responsable par défaut, c'est moi...)
790 805 'default' => $mail_responsable
791 806 ]);
  807 +
  808 +
  809 + // - Nom Responsable du crédit
  810 + echo $this->Form->control('resp_credit', [
  811 + 'label' => "Responsable du crédit (si différent de l'acheteur)",
  812 + ]);
  813 +
792 814  
793 815 // (EP) Attention, était désactivé (commenté) pour ADD mais pas pour EDIT
794 816 // (EP) TODO: Pour Javascript only (bidouille sale à éviter...)
... ... @@ -814,11 +836,15 @@ if (isset($cpMateriel)) {
814 836  
815 837 // - Nom du gestionnaire de ref
816 838 echo $this->Form->control('gestionnaire_id', [
  839 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  840 + //'options' => $gestionnaires,
  841 + //'options' => $administrateurs,
817 842 'label' => 'Nom gestionnaire de référence',
818   - 'empty' => 'Choisir un gestionnaire',
  843 + //'empty' => 'Choisir un gestionnaire',
  844 + 'empty' => 'Je ne sais pas qui choisir',
819 845 // TODO: pas joli !
  846 + // ADD only
820 847 'default' => $_SESSION['Auth']['User']['sn'][0],
821   - 'options' => $administrateurs
822 848 ]);
823 849  
824 850  
... ... @@ -920,7 +946,8 @@ if (isset($cpMateriel)) {
920 946  
921 947 // - Organisme
922 948 echo $this->Form->control('organisme_id', [
923   - 'options' => $organismes,
  949 + // inutile car automatique si le nom de la variable passée par le controleur respecte la norme
  950 + //'options' => $organismes,
924 951 //'style' => 'width: 380px',
925 952 'empty' => 'Choisir un organisme',
926 953 // ADD only
... ...
src/Template/Materiels/view.ctp
... ... @@ -726,6 +726,9 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN
726 726 //['controller'=>'Users', 'action'=>'view', 'id'=>$entity->id]
727 727 )
728 728 );
  729 +
  730 + // - Resp. crédit
  731 + $displayElement(__('Responsable crédit'), h($entity->resp_credit));
729 732  
730 733 // - Utilisateur
731 734 $displayElement(__("Nom de l'utilisateur (destination du bien)"), h($entity->nom_user));
... ...
src/Template/Pages/changes.ctp
... ... @@ -30,7 +30,8 @@ function is_new_section($line) {
30 30  
31 31  
32 32 $wwwroot_dir = new Cake\Filesystem\Folder(WWW_ROOT);
33   -$fname = 'CHANGES.txt';
  33 +//$fname = 'CHANGES.txt';
  34 +$fname = 'CHANGELOG';
34 35 $fpath = $wwwroot_dir->pwd() . DS . '..' . DS . $fname;
35 36 $nblines_to_read = 5000;
36 37  
... ...
src/Template/Pages/stats.ctp
1 1 <?php
2 2  
3   -use SebastianBergmann\CodeCoverage\Report\PHP;
  3 +//use SebastianBergmann\CodeCoverage\Report\PHP;
4 4  
5 5 /*
6 6 $avg['CREATED'] = 10;
... ... @@ -45,7 +45,10 @@ $years = $years;
45 45  
46 46 function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) {
47 47 if ($is_bold) echo '<b>';
  48 + //if ($total !== null && $total>0) {
48 49 if ($total !== null) {
  50 + // Eviter division par zero
  51 + if ($nbelem==0) $total=1;
49 52 $pct = round( ($nbelem / $total) * 100 , 1 );
50 53 $nbelem = "$pct% ($nbelem)";
51 54 //$nbelem = "$nbelem ($pct%)";
... ... @@ -59,6 +62,7 @@ function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) {
59 62  
60 63 //function displayStatsLine($title, $line, $suivis, $prets, $bold=false, $year_prev=null, $avg=null) {
61 64 function displayStatsLine($title, $line, $is_bold=false, $year_prev=null, $avg=null) {
  65 + //debug($line);
62 66 ?>
63 67 <tr>
64 68  
... ...
tests/TestCase/Controller/General.php
... ... @@ -1000,7 +1000,7 @@ class General extends TestCase {
1000 1000 $u = $this->getCurrentUser();
1001 1001 $m = $this->getMaterielsTable()->get($id);
1002 1002 //$m = $this->getMateriel($id);
1003   - debug("statut:"); debug($status);
  1003 + //debug("statut:"); debug($status);
1004 1004 $NOT = FALSE;
1005 1005  
1006 1006 // Statut commence par 'NOT' ?
... ...
webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_01.txt
... ... @@ -25,7 +25,7 @@ state &quot;**ARCHIVED** (matériel sorti de l&#39;inventaire)&quot; as ARCHIVED
25 25  
26 26 [*] --> CREATED : \l**Créer [& commander]** (add) \n\
27 27 (par A) \n\
28   -Infos obligatoires (LOT1) : \n\
  28 +__Infos obligatoires (LOT1)__ : \n\
29 29 - désignation \n\
30 30 - description (important pour communiquer avec GR) \n\
31 31 - domaine/catégorie \n\
... ... @@ -33,10 +33,13 @@ Infos obligatoires (LOT1) : \n\
33 33 - acheteur (par défaut = A, celui qui fait la fiche) \n\
34 34 - [ responsable du crédit (si autre que l'acheteur) ] (optionnel) \n\
35 35 - utilisateur destination (champ texte libre) \n\
36   -- [ devis joint (ou copie écran du "panier") ] (optionnel ou obligatoire selon config) \n\
37   -- ligne budgétaire = "Sur quel(s) budget(s) ?" \n\
38   -- gestionnaire de référence (GR) \n\
39   -- tobeordered (champ invisible, FAUX par défaut, VRAI si commande*) \
  36 +- gestionnaire de référence (GR) (par défaut "Je ne sais pas") \n\
  37 +- ligne budgétaire = "Sur quel(s) budget(s) ?" (à transformer en entité(s) dépens.) \n\
  38 +- organisme (CNRS, UPS, ...) \n\
  39 +- fournisseur (on pourra toujours le modifier après) \n\
  40 +- tobeordered (champ invisible, FAUX par défaut, VRAI si commande*) \n\
  41 +__Infos obligatoires (LOT1+) (si on a cliqué sur "commander")__ : \n\
  42 +- [ devis joint (ou copie écran du "panier") ] (optionnel ou obligatoire selon config) \
40 43 \n => <&envelope-open> (INFO ou COMMANDE si commande*) : GR (cc Gestion) [avec __devis joint__] \
41 44 \n => <&envelope-open> (INFO) : U, R(s)
42 45  
... ... @@ -58,7 +61,7 @@ CREATED --&gt; CREATED: \l**__Actions possibles__ :**\n\
58 61 (LOT2 ne peut être saisi/modifié que par un G) \n\
59 62 (LOT1 peut être saisi par tous, et reste obligatoire) \
60 63 \n => <&envelope-open> (INFO "Fiche modifiée" ("Commande modifiée" si Commande*) : GR (cc Gestion), A/U, R(s) \n\
61   -- **Imprimer étiquette** (date cde + tutelle [+ n° inventaire tutelle]) (par A/U, un R, ou un G)
  64 +- **Imprimer étiquette** (date cde + organisme tutelle [+ n° inventaire tutelle]) (par A/U, un R, ou un G)
62 65  
63 66  
64 67  
... ... @@ -70,7 +73,8 @@ CREATED --&gt; VALIDATED: \l**Valider** (validate) \n\
70 73 (par un G) \n\
71 74 Infos obligatoires (LOT2) : \n\
72 75 - LOT1 \n\
73   - - entité dépens. + n° BC + date BC \n\
  76 + - entité(s) dépens. (= validation de la ligne budgétaire) \n\
  77 + - n° BC + date BC \n\
74 78 - date livraison \n\
75 79 - n° inventaire comptable/tutelles (= service fait GESLAB) \n\
76 80 - "Etiquette imprimée" (à cocher) \n\
... ... @@ -136,7 +140,7 @@ skinparam legendFontSize 11
136 140 legend left
137 141 <u>Légende</u>:
138 142  
139   -Diagramme UML d'États-Transitions du 25/11/20 - Logiciel LabInvent v5.x - E. Pallier - IRAP
  143 +Diagramme UML d'États-Transitions du 04/12/20 - Logiciel LabInvent v5.x - E. Pallier - IRAP
140 144  
141 145 Acteurs:
142 146 - A = Acheteur : la personne qui commande le matériel
... ...