Commit a2dbf7554776b5d182bde65579af3e331e6b5050

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

Liste champs obligatoires des Materiels => gérée via fichier config YAML

(Liste des autorisations AUSSI en cours de migration pour être gérée via
fichier config YAML)
.gitignore
... ... @@ -2,6 +2,15 @@
2 2  
3 3 #newfolderempty/*
4 4  
  5 +*.37
  6 +*.37.*
  7 +*.36
  8 +
  9 +*.orig
  10 +*.orig.*
  11 +*.ORIG
  12 +*.ORIG.*
  13 +
5 14 # ###############################
6 15 # ELEMENTS FOURNIS AVEC L'INSTALLATION D'UNE APP CAKEPHP :
7 16 # ###############################
... ... @@ -86,7 +95,6 @@ composer.json.*
86 95 composer.lock
87 96 #composer.lock.*
88 97 composer.lock*
89   -*.ORIG
90 98 #old/
91 99  
92 100 # webroot/
... ...
CHANGELOG
... ... @@ -331,8 +331,13 @@ Commencer à implémenter le nouveau workflow v5 :
331 331 ======= CHANGES =======
332 332  
333 333 -------
  334 +02/09/2021 v4.108.23-3.7.9
  335 + - Liste des champs obligatoires de l'entité Materiels => gérée via fichier config YAML
  336 + - (Liste des autorisations AUSSI en cours de migration pour être gérée via fichier config YAML)
  337 +
  338 +-------
334 339 31/08/2021 v4.108.22-3.7.9
335   - - Gestion spécifique des champs obligatoires selon le labo (pour l'instant on ne gère qu'une exception pour IP2I)
  340 + - Gestion spécifique des champs obligatoires de l'entité Materiels, selon le labo (pour l'instant on ne gère qu'une exception pour IP2I)
336 341 - Harmonisation des libellés :
337 342 - "intitulé" pour prêts et suivis
338 343 - "statut" des matériels
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 31/08/2021
56   -Version: v4.108.22-3.7.9
  55 +Date: 02/09/2021
  56 +Version: v4.108.23-3.7.9
57 57  
58 58  
59 59  
... ...
composer.json
... ... @@ -5,15 +5,16 @@
5 5 "type" : "project",
6 6 "license" : "MIT",
7 7 "require" : {
8   - "php" : ">=5.6",
9   - "cakephp/cakephp" : "3.7.*",
10   - "cakephp/migrations" : "^2.0.0",
11   - "cakephp/plugin-installer" : "^1.0",
12   - "mobiledetect/mobiledetectlib" : "2.*",
13   - "aferrandini/phpqrcode" : "*",
14   - "setasign/fpdf" : "*",
15   - "daoandco/cakephp-dompdf" : ">=1.2",
16   - "friendsofcake/bootstrap-ui" : ">=1.4"
  8 + "php": ">=5.6",
  9 + "aferrandini/phpqrcode": "*",
  10 + "cakephp/cakephp": "3.7.*",
  11 + "cakephp/migrations": "^2.0.0",
  12 + "cakephp/plugin-installer": "^1.0",
  13 + "chobo1210/yaml": "dev-master",
  14 + "daoandco/cakephp-dompdf": ">=1.2",
  15 + "friendsofcake/bootstrap-ui": ">=1.4",
  16 + "mobiledetect/mobiledetectlib": "2.*",
  17 + "setasign/fpdf": "*"
17 18 },
18 19 "require-dev" : {
19 20 "cakephp/bake" : "^1.9.0",
... ... @@ -58,4 +59,4 @@
58 59 "config" : {
59 60 "sort-packages" : true
60 61 }
61   -}
62 62 \ No newline at end of file
  63 +}
... ...
config/.gitignore
1 1 /app.php.ORIG
  2 +app_labinvent_mandatory_fields_*.yml
  3 +app_labinvent_mandatory_fields.php
  4 +app_labinvent_authorizations*
... ...
config/app_labinvent_mandatory_fields.yml 0 → 100644
... ... @@ -0,0 +1,116 @@
  1 +
  2 +# Infos minimum obligatoires pour créer une fiche Matériel
  3 +#MANDATORY_FIELDS_LOT0: []
  4 +MANDATORY_FIELDS_LOT0:
  5 +
  6 + # Infos toujours obligatoires (cachées car calculées automatiquement)
  7 + #'status',
  8 + #'tobeordered',
  9 +
  10 + designation: 'Désignation'
  11 +
  12 + description: 'Description'
  13 +
  14 + sur_categorie_id: 'Domaine'
  15 + categorie_id: 'Catégorie'
  16 +
  17 + # Calculé auto au moment du save()
  18 + #'numero_laboratoire',
  19 +
  20 + # ******* END OF $MANDATORY_FIELDS_LOT0 ********
  21 +
  22 +
  23 +
  24 +# Infos obligatoires pour le LOT1 (pour passer la commande)
  25 +# Ne mettre ici QUE les infos obligatoires SUPPLÉMENTAIRES à celles de LOT0
  26 +MANDATORY_FIELDS_LOT1:
  27 +
  28 + # Infos toujours obligatoires (cachées car calculées automatiquement)
  29 + #'status',
  30 + #'tobeordered',
  31 +
  32 + #'hors_service', // O/N
  33 +
  34 + designation: 'Désignation'
  35 +
  36 + description: 'Description'
  37 +
  38 + #'permanent',
  39 + #'will_stay', // O/N
  40 +
  41 + sur_categorie_id: 'Domaine'
  42 + categorie_id: 'Catégorie'
  43 +
  44 + # - Utilisateur
  45 + nom_user: "Nom de l'utilisateur de ce matériel"
  46 +
  47 + # - Acheteur
  48 + nom_responsable: 'Nom du responsable'
  49 + # (rempli automatiquement)
  50 + email_responsable: 'Email du responsable'
  51 +
  52 + # Calculé auto au moment du save()
  53 + #'numero_laboratoire',
  54 +
  55 + organisme_id: 'Organisme'
  56 +
  57 + prix_ht: 'Prix HT'
  58 +
  59 + # Optionnel car par défaut = acheteur
  60 + #'resp_credit' => 'Responsable du crédit',
  61 +
  62 +
  63 + #TODO: a remettre ? avec "je ne sais pas"
  64 + #/////'gestionnaire_id' => 'Gestionnaire de référence',
  65 +
  66 +
  67 + #'fournisseur',
  68 +
  69 + #'devis joint',
  70 +
  71 + # Utilisé par la Gestion pour remplir le champ eotp
  72 + budgets: 'Budgets'
  73 +
  74 + # INFOS ADMINISTRATIVES
  75 + # - EOTP : obligatoire seulement dans LOT2
  76 + #'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s)
  77 +
  78 + # ******* END OF $MANDATORY_FIELDS_LOT1 ********
  79 +
  80 +
  81 +
  82 +# Infos obligatoires pour le LOT2 (pour valider la livraison)
  83 +# Ne mettre ici QUE les infos obligatoires SUPPLÉMENTAIRES à celles de LOT1
  84 +MANDATORY_FIELDS_LOT2:
  85 +
  86 + #//'fournisseur_id' => 'Fournisseur',
  87 + #//'fournisseur' => 'Fournisseur',
  88 +
  89 + date_acquisition: "Date d'achat"
  90 +
  91 + date_reception: 'Date de livraison'
  92 +
  93 + #//'etiquette', // O/N
  94 +
  95 + site_id: 'Site'
  96 +
  97 + lieu_detail: 'Lieu de stockage'
  98 +
  99 + #// INFOS ADMINISTRATIVES :
  100 +
  101 + #// La Gestion doit remplir ce champ a partir des infos qui sont dans le champ "budget" (rempli par acheteur)
  102 + #// ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s)
  103 + eotp: 'Entité(s) dépensière(s) (budget(s))'
  104 +
  105 + numero_commande: 'Num. BC'
  106 + numero_inventaire_organisme: "N° inventaire de l'organisme"
  107 +
  108 + # ******* END OF $MANDATORY_FIELDS_LOT2 ********
  109 +
  110 +
  111 +
  112 +
  113 +#MANDATORY_FIELDS_LOT2: &lot2
  114 +#MANDATORY_FIELDS_LOT3: *lot2
  115 +
  116 +
... ...
config/bootstrap.php
... ... @@ -16,6 +16,20 @@
16 16 * @license http://www.opensource.org/licenses/mit-license.php MIT License
17 17 */
18 18  
  19 +/*
  20 + * https://github.com/guemidiborhane/yaml-config
  21 + *
  22 + * Installation :
  23 + * php composer.phar require chobo1210/yaml "dev-master"
  24 + *
  25 + * Utilisation, voir plus loin la ligne :
  26 + * Configure::config('yaml', new YamlConfig());
  27 + * ...
  28 + */
  29 +use Yaml\Configure\Engine\YamlConfig;
  30 +
  31 +
  32 +
19 33 /**
20 34 * Configure paths required to find CakePHP + general filepath
21 35 * constants
... ... @@ -85,15 +99,22 @@ use Cake\Utility\Security;
85 99 try {
86 100 Configure::config('default', new PhpConfig());
87 101 Configure::load('app', 'default', false);
88   - /* IP2I
89   - // (EP 2021 08 Ajout nouveaux fichiers config pour les champs obligatoires et les autorisations)
90   - Configure::load('app_labinvent_mandatory_fields', 'default');
91   - Configure::load('app_labinvent_authorizations', 'default');
92   - */
  102 + //Configure::load('app_labinvent_mandatory_fields', 'default');
  103 + //Configure::load('app_labinvent_authorizations', 'default');
93 104 } catch (\Exception $e) {
94 105 exit($e->getMessage() . "\n");
95 106 }
96 107  
  108 +// IP2I (EP 2021 09 Ajout nouveaux fichiers config pour les champs obligatoires et les autorisations)
  109 +try {
  110 + Configure::config('yaml', new YamlConfig());
  111 + Configure::load('app_labinvent_mandatory_fields', 'yaml');
  112 + //Configure::load('app_labinvent_mandatory_fields_IP2I', 'yaml');
  113 + //Configure::load('app_labinvent_authorizations', 'yaml');
  114 +} catch (\Exception $e) {
  115 + die('Unable to load yaml config file');
  116 +}
  117 +
97 118 // Load an environment local configuration file.
98 119 // You can use a file like app_local.php to provide local overrides to your
99 120 // shared configuration.
... ...
src/Controller/MaterielsController.php
... ... @@ -2114,11 +2114,11 @@ class MaterielsController extends AppController {
2114 2114  
2115 2115 // Attributs obligatoires pour la phase COMMANDE
2116 2116 //$LOT1 = $this->Materiels->MANDATORY_FIELDS_LOT1;
2117   - $LOT1 = $this->Materiels->getMandatoryFieldsLot1();
  2117 + $LOT1 = $this->Materiels->getMandatoryFieldsForLot(1);
2118 2118  
2119 2119 // Attributs obligatoires pour la phase VALIDATION (livré et payé)
2120 2120 //$LOT2 = $this->Materiels->MANDATORY_FIELDS_LOT2;
2121   - $LOT2 = $this->Materiels->getMandatoryFieldsLot2();
  2121 + $LOT2 = $this->Materiels->getMandatoryFieldsForLot(2);
2122 2122  
2123 2123 // Seulement si prix > 10K€ : exiger la facture jointe et le n° série
2124 2124 if ($materiel->prix_ht > 10000) {
... ... @@ -2809,7 +2809,7 @@ class MaterielsController extends AppController {
2809 2809 // - VALIDATED
2810 2810 if ($newStatus == 'VALIDATED') {
2811 2811 // Attributs obligatoires pour la phase VALIDATION (livré et payé) (LOT2)
2812   - $mandatoryFields = $this->Materiels->getMandatoryFieldsLot2();
  2812 + $mandatoryFields = $this->Materiels->getMandatoryFieldsForLot(2);
2813 2813 //$mandatoryFields = $this->Materiels->MANDATORY_FIELDS_LOT2;
2814 2814 //debug($mandatoryFields);exit;
2815 2815 /*
... ...
src/Model/Table/MaterielsTable.php
... ... @@ -45,12 +45,10 @@ use Cake\Core\Configure;
45 45 */
46 46  
47 47  
48   -//const IP2I = false;
49   -//const IP2I = true;
50   -
51 48 // Max 10 ans entre 2 dates
52 49 //const MAX_DIFF_YEARS = 10;
53 50  
  51 +/* replaced with configuration file (in yaml format)
54 52 const MANDATORY_FIELDS_LOT1 = [
55 53  
56 54 // Infos toujours obligatoires (cachées car calculées automatiquement)
... ... @@ -129,19 +127,6 @@ const MANDATORY_FIELDS_LOT2 = [
129 127  
130 128 ];
131 129  
132   -/*
133   -const IP2I_optional_fields = [
134   - 'organisme_id'=>'',
135   - 'prix_ht'=>'',
136   - 'budgets'=>'',
137   -
138   - 'eotp'=>'',
139   - 'numero_commande'=>'',
140   - 'date_reception'=>'',
141   - 'gestionnaire_id'=>'',
142   -];
143   -*/
144   -
145 130  
146 131 //const MANDATORY_FIELDS_LOT1_IP2I = [
147 132 define ('MANDATORY_FIELDS_LOT1_IP2I', [
... ... @@ -219,7 +204,7 @@ define ('MANDATORY_FIELDS_LOT1_IP2I', [
219 204  
220 205 //const MANDATORY_FIELDS_LOT2_IP2I = MANDATORY_FIELDS_LOT1_IP2I;
221 206 define ('MANDATORY_FIELDS_LOT2_IP2I', MANDATORY_FIELDS_LOT1_IP2I);
222   -
  207 +*/
223 208  
224 209  
225 210 class MaterielsTable extends AppTable
... ... @@ -254,31 +239,56 @@ class MaterielsTable extends AppTable
254 239 return self::$LAB;
255 240 }
256 241  
  242 + private static function getConfigKey($k) {
  243 + if ( Configure::check($k) ) {
  244 + $k = Configure::readOrFail($k);
  245 + }
  246 + else debug("key $k is not in yaml config file");
  247 + return $k;
  248 + }
  249 +
  250 + /* (EP 2021 09) LOT N total = LOT N-1 + LOT N
  251 + * - LOT0 total = [] + LOT0
  252 + * - LOT1 total = LOT0 + LOT1
  253 + * - LOT2 total = LOT1 + LOT2
  254 + */
  255 + public static function getMandatoryFieldsForLot($lot_num) {
  256 + /*
  257 + $specific_constant_name = "MANDATORY_FIELDS_LOT1_".self::getLabName();
  258 + $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_LOT1;
  259 + return $mandatory_fields_lot1;
  260 + */
  261 + if ($lot_num < 0) return [];
  262 + $base_mandatory_fields = self::getMandatoryFieldsForLot($lot_num-1);
  263 + $new_mandatory_fields = Configure::readOrFail('MANDATORY_FIELDS_LOT'.$lot_num);
  264 + return array_merge($base_mandatory_fields, $new_mandatory_fields);
  265 + }
  266 +
  267 + /*
257 268 public static function getMandatoryFieldsLot1() {
258   - //return IP2I ? MANDATORY_FIELDS_LOT1_IP2I : MANDATORY_FIELDS_LOT1;
  269 + /S
259 270 $specific_constant_name = "MANDATORY_FIELDS_LOT1_".self::getLabName();
260   - //debug($constantName);
261   - //debug(defined($constantName));
262 271 $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_LOT1;
263   - //debug($mandatory_fields_lot1);
264 272 return $mandatory_fields_lot1;
  273 + S/
  274 + return Configure::readOrFail('MANDATORY_FIELDS_LOT1');
  275 + //return Configure::readOrFail('MANDATORY_FIELDS_LOT1');
265 276 }
266   -
267 277 public static function getMandatoryFieldsLot2() {
268   - //$mandatory_fields_lot2 = IP2I ? MANDATORY_FIELDS_LOT2_IP2I : MANDATORY_FIELDS_LOT2;
  278 + /S
269 279 $constantName = "MANDATORY_FIELDS_LOT2_".self::getLabName();
270   - //debug($constantName);
271 280 $mandatory_fields_lot2 = defined($constantName) ? constant($constantName) : MANDATORY_FIELDS_LOT2;
272   - //debug($mandatory_fields_lot2);
  281 + return array_merge(self::getMandatoryFieldsLot1(), $mandatory_fields_lot2);
  282 + S/
  283 + $mandatory_fields_lot2 = Configure::readOrFail('MANDATORY_FIELDS_LOT2');
273 284 return array_merge(self::getMandatoryFieldsLot1(), $mandatory_fields_lot2);
274 285 }
  286 + */
275 287  
276 288 public static function getMandatoryFieldsForMaterielStatus($status) {
277   -
278 289 // CREATED => LOT1
279 290 // VALIDATED et au-dessus => LOT2
280   - return ($status == 'CREATED') ? self::getMandatoryFieldsLot1() : self::getMandatoryFieldsLot2();
281   -
  291 + return ($status == 'CREATED') ? self::getMandatoryFieldsForLot(1) : self::getMandatoryFieldsForLot(2);
282 292 }
283 293  
284 294 /**
... ... @@ -296,16 +306,39 @@ class MaterielsTable extends AppTable
296 306 parent::initialize($config);
297 307  
298 308 //debug($config);
299   - /* (IP2I)
300   - $mf1 = Configure::readOrFail('MANDATORY_FIELDS_LOT1');
301   - $mf2 = Configure::readOrFail('MANDATORY_FIELDS_LOT2');
  309 + // (IP2I)
  310 +
  311 + // Champs obligatoires
  312 +
  313 + // - PHP
  314 + /*
  315 + $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_LOT1');
302 316 debug($mf1);
303   - debug($mf2);
304   - if ( Configure::check('MANDATORY_FIELDS_LOT1_IP2I') ) {
305   - $mf1_IP2I = Configure::readOrFail('MANDATORY_FIELDS_LOT1_IP2I');
306   - debug($mf1_IP2I);
  317 + $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_LOT1_IP2I');
  318 + debug($mf1);
  319 + */
  320 +
  321 + // - YML
  322 + $keys = ['MANDATORY_FIELDS_LOT0', 'MANDATORY_FIELDS_LOT1', 'MANDATORY_FIELDS_LOT2'];
  323 + foreach ($keys as $k) {
  324 + //debug($k . ' :');
  325 + if ( Configure::check($k) ) {
  326 + $k = Configure::readOrFail($k);
  327 + //debug($k);
  328 + }
  329 + else debug("error on key $k");
307 330 }
308   - else debug("error");
  331 +
  332 +
  333 + /* Autorisations
  334 + $keys = ['GeneralAuthorizations', 'MaterielsAuthorizations', 'SuivisAuthorizations', 'EmpruntsAuthorizations'];
  335 + foreach ($keys as $k)
  336 + if ( Configure::check($k) ) {
  337 + debug($k . ' :');
  338 + $k = Configure::readOrFail($k);
  339 + debug($k);
  340 + }
  341 + else debug("error on key $k");
309 342 */
310 343  
311 344  
... ... @@ -827,11 +860,14 @@ class MaterielsTable extends AppTable
827 860 $validator->allowEmpty('duree_garantie');
828 861 $validator->allowEmpty('unite_duree_garantie');
829 862  
830   - $mandatory_fields = $this->getMandatoryFieldsLot1();
  863 + $mandatory_fields = $this->getMandatoryFieldsForLot(1);
831 864 $this->_setMandatoryFields($validator, $mandatory_fields);
  865 +
  866 + /*
832 867 $optional_fields = array_diff_key(MANDATORY_FIELDS_LOT1, $mandatory_fields);
833 868 //debug($optional_fields);
834 869 foreach ($optional_fields as $fname) $validator->allowEmptyString($fname, true);
  870 + */
835 871  
836 872 return $validator;
837 873  
... ... @@ -867,7 +903,7 @@ class MaterielsTable extends AppTable
867 903 {
868 904 $validator = $this->validationDefault($validator);
869 905  
870   - $this->_setMandatoryFields( $validator, $this->getMandatoryFieldsLot2() );
  906 + $this->_setMandatoryFields( $validator, $this->getMandatoryFieldsForLot(2) );
871 907  
872 908 //$validator->add('password', 'length', ['rule' => ['lengthBetween', 8, 100]]);
873 909  
... ...