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,6 +306,17 @@ Commencer à implémenter le nouveau workflow v5 :
306 ======= CHANGES ======= 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 02/12/2020 v4.107.27-3.7.9 320 02/12/2020 v4.107.27-3.7.9
310 - Update données par défaut pour install from scratch (tables configuration, type_suivis, domaine, type_docs) 321 - Update données par défaut pour install from scratch (tables configuration, type_suivis, domaine, type_docs)
311 - (b) Bugfix (update) TESTS suite à évolution du code et règle sur étiquette : tous passent ! 322 - (b) Bugfix (update) TESTS suite à évolution du code et règle sur étiquette : tous passent !
@@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : @@ -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 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) 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,6 +1838,9 @@ class MaterielsController extends AppController {
1838 * Add or Edit method (do either add() or edit()) 1838 * Add or Edit method (do either add() or edit())
1839 * => Factorisation de add() et edit() 1839 * => Factorisation de add() et edit()
1840 * (voir aussi https://book.cakephp.org/3.0/en/orm.html) 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 * @param $IS_ADD: True = add ; False = edit 1845 * @param $IS_ADD: True = add ; False = edit
1843 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. 1846 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
@@ -1850,6 +1853,25 @@ class MaterielsController extends AppController { @@ -1850,6 +1853,25 @@ class MaterielsController extends AppController {
1850 //debug("ici"); exit; 1853 //debug("ici"); exit;
1851 $this->myDebug("step 3: MaterielsController.add_or_edit()"); 1854 $this->myDebug("step 3: MaterielsController.add_or_edit()");
1852 $IS_EDIT = !$IS_ADD; 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 $usersTable = TableRegistry::getTableLocator()->get('Users'); 1875 $usersTable = TableRegistry::getTableLocator()->get('Users');
1854 // Set $materiel : soit un matériel vide (ADD new), soit un matériel de la BD à modifier (EDIT et ADD par copie) 1876 // Set $materiel : soit un matériel vide (ADD new), soit un matériel de la BD à modifier (EDIT et ADD par copie)
1855 //$materiel = ($IS_ADD && !$id) ? $this->Materiels->newEntity() : $this->Materiels->get($id, ['contain' => []]); 1877 //$materiel = ($IS_ADD && !$id) ? $this->Materiels->newEntity() : $this->Materiels->get($id, ['contain' => []]);
@@ -1860,9 +1882,51 @@ class MaterielsController extends AppController { @@ -1860,9 +1882,51 @@ class MaterielsController extends AppController {
1860 if ($IS_ADD) { 1882 if ($IS_ADD) {
1861 // ADD normal 1883 // ADD normal
1862 if (! $id) { 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 $materiel->nom_responsable = $this->u->nom; 1892 $materiel->nom_responsable = $this->u->nom;
1865 $materiel->nom_user = $this->u->nom; 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 // ADD par copie : mettre id et numero labo à null 1931 // ADD par copie : mettre id et numero labo à null
1868 else { 1932 else {
@@ -1957,8 +2021,9 @@ class MaterielsController extends AppController { @@ -1957,8 +2021,9 @@ class MaterielsController extends AppController {
1957 2021
1958 /* SI POST... 2022 /* SI POST...
1959 * Les données ont été saisies et postées 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 //if ( $this->request->is(['post','patch','put']) ) { 2027 //if ( $this->request->is(['post','patch','put']) ) {
1963 $authorized_actions = $IS_ADD ? ['post'] : ['post','patch','put']; 2028 $authorized_actions = $IS_ADD ? ['post'] : ['post','patch','put'];
1964 if ( $this->request->is($authorized_actions) ) { 2029 if ( $this->request->is($authorized_actions) ) {
@@ -2013,8 +2078,9 @@ class MaterielsController extends AppController { @@ -2013,8 +2078,9 @@ class MaterielsController extends AppController {
2013 // EDIT : Added: Disable modification of user_id. 2078 // EDIT : Added: Disable modification of user_id.
2014 //'accessibleFields' => ['user_id' => false] 2079 //'accessibleFields' => ['user_id' => false]
2015 2080
  2081 + /* (EP 7/12/20 : déjà fait dans la vue, donc inutile !!!)
2016 // (2) Si l'utilisateur courant est un "administratif" => le mettre comme gestionnaire du materiel 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 $current_user_name = $_SESSION['Auth']['User']['sn'][0]; 2084 $current_user_name = $_SESSION['Auth']['User']['sn'][0];
2019 if (in_array( 2085 if (in_array(
2020 $current_user_name, 2086 $current_user_name,
@@ -2035,9 +2101,125 @@ class MaterielsController extends AppController { @@ -2035,9 +2101,125 @@ class MaterielsController extends AppController {
2035 ]) 2101 ])
2036 ->first()->id; 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 $verb = $IS_ADD ? "ajouté" : "modifié"; 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 //$action = $IS_ADD ? "add" : "edit"; 2223 //$action = $IS_ADD ? "add" : "edit";
2042 //debug($materiel); exit; 2224 //debug($materiel); exit;
2043 if (! $this->Materiels->save($materiel)) { 2225 if (! $this->Materiels->save($materiel)) {
@@ -2089,14 +2271,38 @@ class MaterielsController extends AppController { @@ -2089,14 +2271,38 @@ class MaterielsController extends AppController {
2089 $id 2271 $id
2090 ]); 2272 ]);
2091 } 2273 }
  2274 +
  2275 + } // $ALL_MANDATORY_FIELDS_GIVEN
  2276 +
2092 } // if POST... 2277 } // if POST...
2093 2278
  2279 +
  2280 +
  2281 +
2094 /* SINON (PAS POST) 2282 /* SINON (PAS POST)
2095 * C'est la première fois qu'on vient sur cette vue, 2283 * C'est la première fois qu'on vient sur cette vue,
2096 * donc on va préparer le formulaire de saisie) 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 // DOMAINES : LISTE COMPLETE 2307 // DOMAINES : LISTE COMPLETE
2102 $surCategories = $this->Materiels->SurCategories->find('list', [ 2308 $surCategories = $this->Materiels->SurCategories->find('list', [
@@ -2207,7 +2413,7 @@ class MaterielsController extends AppController { @@ -2207,7 +2413,7 @@ class MaterielsController extends AppController {
2207 2413
2208 // Liste des gestionnaires (admin) 2414 // Liste des gestionnaires (admin)
2209 //$administrateurs = TableRegistry::get('Users')->find('list', [ 2415 //$administrateurs = TableRegistry::get('Users')->find('list', [
2210 - $administrateurs = $usersTable 2416 + $gestionnaires = $usersTable
2211 ->find('list', [ 2417 ->find('list', [
2212 //'keyField' => 'nom', 2418 //'keyField' => 'nom',
2213 'keyField' => 'id', 2419 'keyField' => 'id',
@@ -2379,6 +2585,12 @@ class MaterielsController extends AppController { @@ -2379,6 +2585,12 @@ class MaterielsController extends AppController {
2379 * Both achieve the same thing. 2585 * Both achieve the same thing.
2380 */ 2586 */
2381 //$this->set(compact('designation', 'utilisateurconnect', 'users', 'materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'domaineresp', 'lieu_detail', 'fournisseurs')); 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 $entity = $materiel; 2594 $entity = $materiel;
2383 $this->set(compact( 2595 $this->set(compact(
2384 'IS_ADD', 2596 'IS_ADD',
@@ -2387,10 +2599,14 @@ class MaterielsController extends AppController { @@ -2387,10 +2599,14 @@ class MaterielsController extends AppController {
2387 'entity', // new 2599 'entity', // new
2388 //'materiel', // @deprecated 2600 //'materiel', // @deprecated
2389 2601
  2602 + 'statuses',
2390 // not used 2603 // not used
2391 //'utilisateurconnect', 2604 //'utilisateurconnect',
  2605 +
2392 'surCategories', 2606 'surCategories',
2393 - 'categories', 'sousCategories', 2607 + 'categories',
  2608 + 'sousCategories',
  2609 +
2394 'groupesThematiques', 'groupesMetiers', 2610 'groupesThematiques', 'groupesMetiers',
2395 'projets', 2611 'projets',
2396 2612
@@ -2402,7 +2618,7 @@ class MaterielsController extends AppController { @@ -2402,7 +2618,7 @@ class MaterielsController extends AppController {
2402 //'utilisateurs', 2618 //'utilisateurs',
2403 //'users_login_and_email', 'users_option_list', 2619 //'users_login_and_email', 'users_option_list',
2404 // Gestionnaires (id=>name): 2620 // Gestionnaires (id=>name):
2405 - 'administrateurs' 2621 + 'gestionnaires'
2406 )); 2622 ));
2407 2623
2408 /* (EP) INUTILE (sauf pour faire du json ou xml) !!! 2624 /* (EP) INUTILE (sauf pour faire du json ou xml) !!!
src/Controller/PagesController.php
@@ -505,8 +505,9 @@ class PagesController extends AppController @@ -505,8 +505,9 @@ class PagesController extends AppController
505 $years = []; 505 $years = [];
506 $all_matos = $materiels->find(); 506 $all_matos = $materiels->find();
507 for ($y=$current_year ; $y>=$year_min ; $y--) { 507 for ($y=$current_year ; $y>=$year_min ; $y--) {
508 - //debug($y); 508 + ////debug($y);
509 $all_matos_for_year = $all_matos->cleanCopy()->where(['year(date_acquisition)' => $y]); 509 $all_matos_for_year = $all_matos->cleanCopy()->where(['year(date_acquisition)' => $y]);
  510 + ////debug($all_matos_for_year->count());
510 // - statut par année 511 // - statut par année
511 try { 512 try {
512 foreach ($statuses as $status) { 513 foreach ($statuses as $status) {
@@ -520,21 +521,27 @@ class PagesController extends AppController @@ -520,21 +521,27 @@ class PagesController extends AppController
520 $years[$y][$status] = $all_matos_for_year_and_status->count(); 521 $years[$y][$status] = $all_matos_for_year_and_status->count();
521 } 522 }
522 } catch (\PDOException $e) { 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 exit; 525 exit;
525 } 526 }
  527 + ////debug($years);
526 // Suivis et Prets, par année 528 // Suivis et Prets, par année
527 $all_matos_suivis_for_year = $all_matos_for_year->cleanCopy(); 529 $all_matos_suivis_for_year = $all_matos_for_year->cleanCopy();
528 foreach ($associated_entities as $e) 530 foreach ($associated_entities as $e)
529 try { 531 try {
  532 + ////debug($e);
  533 + //debug($$e->find()->count());
530 /* 534 /*
531 * SQL equivalent : à tester... 535 * SQL equivalent : à tester...
532 * 536 *
533 * SELECT COUNT(DISTINCT(suivis.materiel_id)) FROM suivis LEFT JOIN materiels 537 * SELECT COUNT(DISTINCT(suivis.materiel_id)) FROM suivis LEFT JOIN materiels
534 * ON suivis.materiel_id = materiels.id 538 * ON suivis.materiel_id = materiels.id
535 * WHERE YEAR(materiels.date_acquisition) = $y 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 $years[$y][$e] = $$e 545 $years[$y][$e] = $$e
539 // Tous les suivis/emprunts... 546 // Tous les suivis/emprunts...
540 ->find() 547 ->find()
@@ -554,8 +561,9 @@ class PagesController extends AppController @@ -554,8 +561,9 @@ class PagesController extends AppController
554 //->select(['id', 'count_suivis => count(suivis)']) 561 //->select(['id', 'count_suivis => count(suivis)'])
555 //->where(['count_suivis >' => 0]) 562 //->where(['count_suivis >' => 0])
556 //->count(); 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 exit; 567 exit;
560 } 568 }
561 //debug($years[$y]['suivis']); 569 //debug($years[$y]['suivis']);
src/Template/Materiels/add_edit.ctp
@@ -80,6 +80,7 @@ $entity = $entity; @@ -80,6 +80,7 @@ $entity = $entity;
80 $materiel = $entity; 80 $materiel = $entity;
81 //debug($entity); 81 //debug($entity);
82 82
  83 +$statuses = $statuses;
83 84
84 $domaineresp = $domaineresp; 85 $domaineresp = $domaineresp;
85 //$designations = $designations; 86 //$designations = $designations;
@@ -87,7 +88,7 @@ $domaineresp = $domaineresp; @@ -87,7 +88,7 @@ $domaineresp = $domaineresp;
87 $fournisseurs = $fournisseurs; 88 $fournisseurs = $fournisseurs;
88 //foreach ($fournisseurs as $l) debug($l); 89 //foreach ($fournisseurs as $l) debug($l);
89 //foreach ($fournisseurs as $k=>$v) debug("$k => $v"); 90 //foreach ($fournisseurs as $k=>$v) debug("$k => $v");
90 -$administrateurs = $administrateurs; 91 +$gestionnaires = $gestionnaires;
91 $lieu_detail = $lieu_detail; 92 $lieu_detail = $lieu_detail;
92 //foreach ($lieu_detail as $l) debug($l); 93 //foreach ($lieu_detail as $l) debug($l);
93 //foreach ($lieu_detail as $k=>$v) debug("$k => $v"); 94 //foreach ($lieu_detail as $k=>$v) debug("$k => $v");
@@ -135,7 +136,7 @@ $echoActionButton = $echoActionButton; @@ -135,7 +136,7 @@ $echoActionButton = $echoActionButton;
135 $echoSubmitButtons = $echoSubmitButtons; 136 $echoSubmitButtons = $echoSubmitButtons;
136 137
137 $mydebug($D, $surCategories); 138 $mydebug($D, $surCategories);
138 -$mydebug($D, $categories); 139 +//$mydebug($D, $categories);
139 $mydebug($D, $materiel); 140 $mydebug($D, $materiel);
140 141
141 //debug($GLOBALS); 142 //debug($GLOBALS);
@@ -375,7 +376,8 @@ if (isset($cpMateriel)) { @@ -375,7 +376,8 @@ if (isset($cpMateriel)) {
375 // will_stay 376 // will_stay
376 echo $this->Form->control('will_stay', [ 377 echo $this->Form->control('will_stay', [
377 'label' => 'Ce matériel restera au laboratoire', 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 // - Description 383 // - Description
@@ -423,7 +425,8 @@ if (isset($cpMateriel)) { @@ -423,7 +425,8 @@ if (isset($cpMateriel)) {
423 echo $this->Form->control('sur_categorie_id', [ 425 echo $this->Form->control('sur_categorie_id', [
424 'label' => 'Domaine', 426 'label' => 'Domaine',
425 //'style' => 'width: 260px', 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 'empty' => 'Choisir un domaine', 430 'empty' => 'Choisir un domaine',
428 //'default' => $Sur_categ_id 431 //'default' => $Sur_categ_id
429 // ADD only 432 // ADD only
@@ -433,7 +436,7 @@ if (isset($cpMateriel)) { @@ -433,7 +436,7 @@ if (isset($cpMateriel)) {
433 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields) 436 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields)
434 ]); 437 ]);
435 // - CATEGORIE 438 // - CATEGORIE
436 - $categs = $categories; 439 + //$categs = $categories;
437 /* 440 /*
438 // if a domain is selected, reduce the categories list to this domain 441 // if a domain is selected, reduce the categories list to this domain
439 //debug($categories); 442 //debug($categories);
@@ -447,7 +450,9 @@ if (isset($cpMateriel)) { @@ -447,7 +450,9 @@ if (isset($cpMateriel)) {
447 echo $this->Form->control('categorie_id', [ 450 echo $this->Form->control('categorie_id', [
448 'label' => 'Catégorie', 451 'label' => 'Catégorie',
449 //'style' => 'width: 380px', 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 'empty' => 'Choisir une catégorie', 456 'empty' => 'Choisir une catégorie',
452 //'default' => $Categ_id 457 //'default' => $Categ_id
453 // ADD only 458 // ADD only
@@ -456,7 +461,7 @@ if (isset($cpMateriel)) { @@ -456,7 +461,7 @@ if (isset($cpMateriel)) {
456 'disabled' => $IS_ADD ? false : $isReadonlyField('categorie_id', $myReadonlyFields) 461 'disabled' => $IS_ADD ? false : $isReadonlyField('categorie_id', $myReadonlyFields)
457 ]); 462 ]);
458 // - SOUS-CATEGORIE (by default, list is empty) 463 // - SOUS-CATEGORIE (by default, list is empty)
459 - $souscategs = $sousCategories; 464 + //$souscategs = $sousCategories;
460 /* 465 /*
461 $souscategs = []; 466 $souscategs = [];
462 // if a categ is selected, update sous-categs list for this categ (only) 467 // if a categ is selected, update sous-categs list for this categ (only)
@@ -472,7 +477,9 @@ if (isset($cpMateriel)) { @@ -472,7 +477,9 @@ if (isset($cpMateriel)) {
472 echo $this->Form->control('sous_categorie_id', [ 477 echo $this->Form->control('sous_categorie_id', [
473 'label' => 'Sous-catégorie', 478 'label' => 'Sous-catégorie',
474 //'style' => 'width: 380px', 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 'empty' => 'Choisir une sous-catégorie', 483 'empty' => 'Choisir une sous-catégorie',
477 // ADD only 484 // ADD only
478 //'default' => $Sous_categ_id 485 //'default' => $Sous_categ_id
@@ -494,7 +501,8 @@ if (isset($cpMateriel)) { @@ -494,7 +501,8 @@ if (isset($cpMateriel)) {
494 echo $this->Form->control('groupes_thematique_id', [ 501 echo $this->Form->control('groupes_thematique_id', [
495 'label' => $nom_groupe_thematique, 502 'label' => $nom_groupe_thematique,
496 'empty' => 'N/A', 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 //'default' => $Groupes_thematique_id 506 //'default' => $Groupes_thematique_id
499 //'default' => $IS_ADD ? $materiel->groupes_thematique_id : 1, 507 //'default' => $IS_ADD ? $materiel->groupes_thematique_id : 1,
500 // EDIT only 508 // EDIT only
@@ -504,7 +512,8 @@ if (isset($cpMateriel)) { @@ -504,7 +512,8 @@ if (isset($cpMateriel)) {
504 echo $this->Form->control('groupes_metier_id', [ 512 echo $this->Form->control('groupes_metier_id', [
505 'label' => $nom_groupe_metier, 513 'label' => $nom_groupe_metier,
506 'empty' => 'N/A', 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 //'default' => $Groupes_metier_id 517 //'default' => $Groupes_metier_id
509 //'default' => $IS_ADD ? $materiel->groupes_metier_id : 1, 518 //'default' => $IS_ADD ? $materiel->groupes_metier_id : 1,
510 // EDIT only 519 // EDIT only
@@ -524,7 +533,8 @@ if (isset($cpMateriel)) { @@ -524,7 +533,8 @@ if (isset($cpMateriel)) {
524 'empty' => 'N/A', 533 'empty' => 'N/A',
525 //'empty' => '(seulement si ce matériel est associé à un projet)', 534 //'empty' => '(seulement si ce matériel est associé à un projet)',
526 //'style' => 'width: 380px', 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 // ADD only 538 // ADD only
529 //'default' => $Sous_categ_id 539 //'default' => $Sous_categ_id
530 //'default' => $materiel->projet_id, 540 //'default' => $materiel->projet_id,
@@ -586,7 +596,8 @@ if (isset($cpMateriel)) { @@ -586,7 +596,8 @@ if (isset($cpMateriel)) {
586 596
587 // - Site 597 // - Site
588 echo $this->Form->control('site_id', [ 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 //'style' => 'width: 380px', 601 //'style' => 'width: 380px',
591 //'default' => $Site_id 602 //'default' => $Site_id
592 //'default' => ($IS_ADD ? $materiel->site_id : 9), 603 //'default' => ($IS_ADD ? $materiel->site_id : 9),
@@ -722,12 +733,16 @@ if (isset($cpMateriel)) { @@ -722,12 +733,16 @@ if (isset($cpMateriel)) {
722 */ 733 */
723 echo $this->Form->control('status', [ 734 echo $this->Form->control('status', [
724 'label' => 'Statut', 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 'CREATED' => 'CREATED', 740 'CREATED' => 'CREATED',
727 'VALIDATED' => 'VALIDATED', 741 'VALIDATED' => 'VALIDATED',
728 'TOBEARCHIVED' => 'TOBEARCHIVED', 742 'TOBEARCHIVED' => 'TOBEARCHIVED',
729 'ARCHIVED' => 'ARCHIVED' 743 'ARCHIVED' => 'ARCHIVED'
730 ] 744 ]
  745 + */
731 ]); 746 ]);
732 } 747 }
733 748
@@ -763,8 +778,8 @@ if (isset($cpMateriel)) { @@ -763,8 +778,8 @@ if (isset($cpMateriel)) {
763 //'empty' => $entity->nom_responsable, 778 //'empty' => $entity->nom_responsable,
764 //'default' => $entity->nom_responsable, 779 //'default' => $entity->nom_responsable,
765 //'default' => $username, 780 //'default' => $username,
766 - //'options' => $utilisateurs  
767 'options' => $users_option_list, 781 'options' => $users_option_list,
  782 + //'options' => $utilisateurs
768 //'readonly' => $IS_EDIT ? false : $readonly, 783 //'readonly' => $IS_EDIT ? false : $readonly,
769 //'readonly' => $readonly, 784 //'readonly' => $readonly,
770 'disabled' => $readonly, 785 'disabled' => $readonly,
@@ -789,6 +804,13 @@ if (isset($cpMateriel)) { @@ -789,6 +804,13 @@ if (isset($cpMateriel)) {
789 // ADD only (Quand je crée une fiche, la personne responsable par défaut, c'est moi...) 804 // ADD only (Quand je crée une fiche, la personne responsable par défaut, c'est moi...)
790 'default' => $mail_responsable 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 // (EP) Attention, était désactivé (commenté) pour ADD mais pas pour EDIT 815 // (EP) Attention, était désactivé (commenté) pour ADD mais pas pour EDIT
794 // (EP) TODO: Pour Javascript only (bidouille sale à éviter...) 816 // (EP) TODO: Pour Javascript only (bidouille sale à éviter...)
@@ -814,11 +836,15 @@ if (isset($cpMateriel)) { @@ -814,11 +836,15 @@ if (isset($cpMateriel)) {
814 836
815 // - Nom du gestionnaire de ref 837 // - Nom du gestionnaire de ref
816 echo $this->Form->control('gestionnaire_id', [ 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 'label' => 'Nom gestionnaire de référence', 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 // TODO: pas joli ! 845 // TODO: pas joli !
  846 + // ADD only
820 'default' => $_SESSION['Auth']['User']['sn'][0], 847 'default' => $_SESSION['Auth']['User']['sn'][0],
821 - 'options' => $administrateurs  
822 ]); 848 ]);
823 849
824 850
@@ -920,7 +946,8 @@ if (isset($cpMateriel)) { @@ -920,7 +946,8 @@ if (isset($cpMateriel)) {
920 946
921 // - Organisme 947 // - Organisme
922 echo $this->Form->control('organisme_id', [ 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 //'style' => 'width: 380px', 951 //'style' => 'width: 380px',
925 'empty' => 'Choisir un organisme', 952 'empty' => 'Choisir un organisme',
926 // ADD only 953 // ADD only
src/Template/Materiels/view.ctp
@@ -726,6 +726,9 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN @@ -726,6 +726,9 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN
726 //['controller'=>'Users', 'action'=>'view', 'id'=>$entity->id] 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 // - Utilisateur 733 // - Utilisateur
731 $displayElement(__("Nom de l'utilisateur (destination du bien)"), h($entity->nom_user)); 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,7 +30,8 @@ function is_new_section($line) {
30 30
31 31
32 $wwwroot_dir = new Cake\Filesystem\Folder(WWW_ROOT); 32 $wwwroot_dir = new Cake\Filesystem\Folder(WWW_ROOT);
33 -$fname = 'CHANGES.txt'; 33 +//$fname = 'CHANGES.txt';
  34 +$fname = 'CHANGELOG';
34 $fpath = $wwwroot_dir->pwd() . DS . '..' . DS . $fname; 35 $fpath = $wwwroot_dir->pwd() . DS . '..' . DS . $fname;
35 $nblines_to_read = 5000; 36 $nblines_to_read = 5000;
36 37
src/Template/Pages/stats.ctp
1 <?php 1 <?php
2 2
3 -use SebastianBergmann\CodeCoverage\Report\PHP; 3 +//use SebastianBergmann\CodeCoverage\Report\PHP;
4 4
5 /* 5 /*
6 $avg['CREATED'] = 10; 6 $avg['CREATED'] = 10;
@@ -45,7 +45,10 @@ $years = $years; @@ -45,7 +45,10 @@ $years = $years;
45 45
46 function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) { 46 function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) {
47 if ($is_bold) echo '<b>'; 47 if ($is_bold) echo '<b>';
  48 + //if ($total !== null && $total>0) {
48 if ($total !== null) { 49 if ($total !== null) {
  50 + // Eviter division par zero
  51 + if ($nbelem==0) $total=1;
49 $pct = round( ($nbelem / $total) * 100 , 1 ); 52 $pct = round( ($nbelem / $total) * 100 , 1 );
50 $nbelem = "$pct% ($nbelem)"; 53 $nbelem = "$pct% ($nbelem)";
51 //$nbelem = "$nbelem ($pct%)"; 54 //$nbelem = "$nbelem ($pct%)";
@@ -59,6 +62,7 @@ function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) { @@ -59,6 +62,7 @@ function echoAsPctAndBold($nbelem, $total=null, $is_bold=false) {
59 62
60 //function displayStatsLine($title, $line, $suivis, $prets, $bold=false, $year_prev=null, $avg=null) { 63 //function displayStatsLine($title, $line, $suivis, $prets, $bold=false, $year_prev=null, $avg=null) {
61 function displayStatsLine($title, $line, $is_bold=false, $year_prev=null, $avg=null) { 64 function displayStatsLine($title, $line, $is_bold=false, $year_prev=null, $avg=null) {
  65 + //debug($line);
62 ?> 66 ?>
63 <tr> 67 <tr>
64 68
tests/TestCase/Controller/General.php
@@ -1000,7 +1000,7 @@ class General extends TestCase { @@ -1000,7 +1000,7 @@ class General extends TestCase {
1000 $u = $this->getCurrentUser(); 1000 $u = $this->getCurrentUser();
1001 $m = $this->getMaterielsTable()->get($id); 1001 $m = $this->getMaterielsTable()->get($id);
1002 //$m = $this->getMateriel($id); 1002 //$m = $this->getMateriel($id);
1003 - debug("statut:"); debug($status); 1003 + //debug("statut:"); debug($status);
1004 $NOT = FALSE; 1004 $NOT = FALSE;
1005 1005
1006 // Statut commence par 'NOT' ? 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,7 +25,7 @@ state &quot;**ARCHIVED** (matériel sorti de l&#39;inventaire)&quot; as ARCHIVED
25 25
26 [*] --> CREATED : \l**Créer [& commander]** (add) \n\ 26 [*] --> CREATED : \l**Créer [& commander]** (add) \n\
27 (par A) \n\ 27 (par A) \n\
28 -Infos obligatoires (LOT1) : \n\ 28 +__Infos obligatoires (LOT1)__ : \n\
29 - désignation \n\ 29 - désignation \n\
30 - description (important pour communiquer avec GR) \n\ 30 - description (important pour communiquer avec GR) \n\
31 - domaine/catégorie \n\ 31 - domaine/catégorie \n\
@@ -33,10 +33,13 @@ Infos obligatoires (LOT1) : \n\ @@ -33,10 +33,13 @@ Infos obligatoires (LOT1) : \n\
33 - acheteur (par défaut = A, celui qui fait la fiche) \n\ 33 - acheteur (par défaut = A, celui qui fait la fiche) \n\
34 - [ responsable du crédit (si autre que l'acheteur) ] (optionnel) \n\ 34 - [ responsable du crédit (si autre que l'acheteur) ] (optionnel) \n\
35 - utilisateur destination (champ texte libre) \n\ 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 \n => <&envelope-open> (INFO ou COMMANDE si commande*) : GR (cc Gestion) [avec __devis joint__] \ 43 \n => <&envelope-open> (INFO ou COMMANDE si commande*) : GR (cc Gestion) [avec __devis joint__] \
41 \n => <&envelope-open> (INFO) : U, R(s) 44 \n => <&envelope-open> (INFO) : U, R(s)
42 45
@@ -58,7 +61,7 @@ CREATED --&gt; CREATED: \l**__Actions possibles__ :**\n\ @@ -58,7 +61,7 @@ CREATED --&gt; CREATED: \l**__Actions possibles__ :**\n\
58 (LOT2 ne peut être saisi/modifié que par un G) \n\ 61 (LOT2 ne peut être saisi/modifié que par un G) \n\
59 (LOT1 peut être saisi par tous, et reste obligatoire) \ 62 (LOT1 peut être saisi par tous, et reste obligatoire) \
60 \n => <&envelope-open> (INFO "Fiche modifiée" ("Commande modifiée" si Commande*) : GR (cc Gestion), A/U, R(s) \n\ 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,7 +73,8 @@ CREATED --&gt; VALIDATED: \l**Valider** (validate) \n\
70 (par un G) \n\ 73 (par un G) \n\
71 Infos obligatoires (LOT2) : \n\ 74 Infos obligatoires (LOT2) : \n\
72 - LOT1 \n\ 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 - date livraison \n\ 78 - date livraison \n\
75 - n° inventaire comptable/tutelles (= service fait GESLAB) \n\ 79 - n° inventaire comptable/tutelles (= service fait GESLAB) \n\
76 - "Etiquette imprimée" (à cocher) \n\ 80 - "Etiquette imprimée" (à cocher) \n\
@@ -136,7 +140,7 @@ skinparam legendFontSize 11 @@ -136,7 +140,7 @@ skinparam legendFontSize 11
136 legend left 140 legend left
137 <u>Légende</u>: 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 Acteurs: 145 Acteurs:
142 - A = Acheteur : la personne qui commande le matériel 146 - A = Acheteur : la personne qui commande le matériel