Commit 615ca8ea7ba39092105c1d311e64ac6e7095c03d
1 parent
dff255eb
Exists in
master
and in
1 other branch
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
Showing
11 changed files
with
317 additions
and
43 deletions
Show diff stats
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 "**ARCHIVED** (matériel sorti de l'inventaire)" 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 --> 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 --> 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 | ... | ... |