Commit a2dbf7554776b5d182bde65579af3e331e6b5050
1 parent
8c519d1f
Exists in
master
and in
1 other branch
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)
Showing
9 changed files
with
250 additions
and
60 deletions
Show diff stats
.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
... | ... | @@ -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 | ... | ... |