Commit e2af51a23d59b72593b6e630d439b7ef58a71df6

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

date réception => "date livraison", et ne doit pas être future

v4.101.12-3.7.9
@@ -94,6 +94,10 @@ Outre ces changements, voici d'autres changements importants : @@ -94,6 +94,10 @@ Outre ces changements, voici d'autres changements importants :
94 ======= CHANGES ======= 94 ======= CHANGES =======
95 95
96 ------- 96 -------
  97 +17/09/2020 v4.101.12-3.7.9 (EP)
  98 + - (e) date réception => "date livraison", et ne doit pas être future
  99 +
  100 +-------
97 16/09/2020 v4.101.11-3.7.9 (EP) 101 16/09/2020 v4.101.11-3.7.9 (EP)
98 - (i) Fixtures de tests simplifiées avec utilisation par défaut du format des champs de la BD de production (inutile de s'embêter à tout redéfinir et à tenir à jour !!!) 102 - (i) Fixtures de tests simplifiées avec utilisation par défaut du format des champs de la BD de production (inutile de s'embêter à tout redéfinir et à tenir à jour !!!)
99 - (i) Corrigé petit bug sur site_id qui valait 2 par défaut (au lieu de null) 103 - (i) Corrigé petit bug sur site_id qui valait 2 par défaut (au lieu de null)
@@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes : @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes :
43 -------------------------------------------------------------------------------------------- 43 --------------------------------------------------------------------------------------------
44 44
45 Date: 15/09/2020 45 Date: 15/09/2020
46 -Version: 4.101.11-3.7.9 46 +Version: 4.101.12-3.7.9
47 47
48 48
49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) 49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
src/Model/Entity/Materiel.php
@@ -3,8 +3,8 @@ namespace App\Model\Entity; @@ -3,8 +3,8 @@ namespace App\Model\Entity;
3 3
4 use Cake\ORM\Entity; 4 use Cake\ORM\Entity;
5 5
6 -// Max 2 ans entre 2 dates  
7 -const MAX_DIFF_YEARS = 2; 6 +// Max 15 ans entre 2 dates
  7 +const MAX_DIFF_YEARS = 15;
8 8
9 /** 9 /**
10 * Materiel Entity. 10 * Materiel Entity.
@@ -88,11 +88,30 @@ class Materiel extends Entity { @@ -88,11 +88,30 @@ class Materiel extends Entity {
88 // Ce qui s'affiche quand on fait echo $entity 88 // Ce qui s'affiche quand on fait echo $entity
89 public function __toString() { return $this->designation; } 89 public function __toString() { return $this->designation; }
90 90
  91 + public function check_date_is_not_too_old($date_field_name) {
  92 + $d = $this->$date_field_name;
  93 + // today - 50 ans = trop vieux !
  94 + /* Avec TZ
  95 + $tz = new \DateTimeZone('Europe/Paris');
  96 + $date_too_old = new \DateTime('-50 years',$tz);
  97 + */
  98 + // Sans TimeZone (car inutile à ce niveau je crois)
  99 + $date_too_old = new \DateTime('-50 years');
  100 + return $d > $date_too_old;
  101 + }
  102 + public function check_date_is_not_future($date_field_name) {
  103 + $d = $this->$date_field_name;
  104 + $today = new \DateTime('now');
  105 + return $d <= $today;
  106 + }
  107 +
91 // date_reception >= date_acquisition et aussi date_fin_garantie >= date_reception 108 // date_reception >= date_acquisition et aussi date_fin_garantie >= date_reception
92 public function check_date_d2_gt_d1_but_not_too_much($d2_name,$d1_name) { 109 public function check_date_d2_gt_d1_but_not_too_much($d2_name,$d1_name) {
93 - // Si une des 2 dates est nulle => return true  
94 $d2 = $this->$d2_name; 110 $d2 = $this->$d2_name;
95 $d1 = $this->$d1_name; 111 $d1 = $this->$d1_name;
  112 + //debug("d2:"); debug($d2);
  113 + //debug("d1:"); debug($d1);
  114 + // Si une des 2 dates est nulle => return true
96 if (!$d2 || !$d1) return true; 115 if (!$d2 || !$d1) return true;
97 /* 116 /*
98 $tz = new \DateTimeZone('Europe/Paris'); 117 $tz = new \DateTimeZone('Europe/Paris');
@@ -109,7 +128,7 @@ class Materiel extends Entity { @@ -109,7 +128,7 @@ class Materiel extends Entity {
109 if ($d2 < $d1) return false; 128 if ($d2 < $d1) return false;
110 // $d2 > $d1 oui mais pas trop... 129 // $d2 > $d1 oui mais pas trop...
111 $diff = $d2->diff($d1); 130 $diff = $d2->diff($d1);
112 - //debug($diff->y); 131 + //debug($diff->y);
113 return $diff->y < MAX_DIFF_YEARS; 132 return $diff->y < MAX_DIFF_YEARS;
114 //return true; 133 //return true;
115 } 134 }
src/Model/Table/MaterielsTable.php
@@ -143,11 +143,29 @@ class MaterielsTable extends AppTable @@ -143,11 +143,29 @@ class MaterielsTable extends AppTable
143 } 143 }
144 144
145 public function dateIsValid($value, array $context) { 145 public function dateIsValid($value, array $context) {
146 - //debug($entity); 146 +
  147 + /*
  148 + * $value
  149 + *
  150 + * La valeur du champ, souvent une string
  151 + *
  152 + */
  153 + //debug($value);
  154 +
  155 + /*
  156 + * $context
  157 + *
  158 + * $context->newRecord est un boolean
  159 + * $context->data est l'entité complète, sous forme d'un tableau qui contient tous les champs (souvent des 'string')
  160 + *
  161 + */
  162 + //debug($context);
  163 +
147 // /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g 164 // /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
148 //$valid = preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$entity); 165 //$valid = preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$entity);
149 //debug((bool)$valid); 166 //debug((bool)$valid);
150 return (bool) preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$value); 167 return (bool) preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$value);
  168 +
151 } 169 }
152 170
153 171
@@ -178,6 +196,8 @@ class MaterielsTable extends AppTable @@ -178,6 +196,8 @@ class MaterielsTable extends AppTable
178 return (bool) preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$entity); 196 return (bool) preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([1-2][0-9]{3})$/",$entity);
179 }; 197 };
180 */ 198 */
  199 +
  200 + /*
181 // return true si date n'est pas future (maxi = today) 201 // return true si date n'est pas future (maxi = today)
182 $dateIsNotFutureAndNotTooOld = function ($date_string) { 202 $dateIsNotFutureAndNotTooOld = function ($date_string) {
183 $tz = new \DateTimeZone('Europe/Paris'); 203 $tz = new \DateTimeZone('Europe/Paris');
@@ -190,23 +210,25 @@ class MaterielsTable extends AppTable @@ -190,23 +210,25 @@ class MaterielsTable extends AppTable
190 $today = $today->format('Ymd'); 210 $today = $today->format('Ymd');
191 // today - 50 ans = trop vieux ! 211 // today - 50 ans = trop vieux !
192 $date_too_old = $date_too_old->sub(new \DateInterval('P50Y'))->format('Ymd'); 212 $date_too_old = $date_too_old->sub(new \DateInterval('P50Y'))->format('Ymd');
193 - /* 213 + /S
194 $time = Time::now(); // On récupère la date et l'heure actuelles 214 $time = Time::now(); // On récupère la date et l'heure actuelles
195 $today = (new date("$time->year-$time->month-$time->day"))->format('Ymd'); // On extrait la date on la formatte en un format comparable de type 20171231 215 $today = (new date("$time->year-$time->month-$time->day"))->format('Ymd'); // On extrait la date on la formatte en un format comparable de type 20171231
196 - */  
197 - /* 216 + S/
  217 + /S
198 $timeEntity = new time($entity); 218 $timeEntity = new time($entity);
199 $dateEntity = (new date("$timeEntity->year-$timeEntity->month-$timeEntity->day"))->format('Ymd'); 219 $dateEntity = (new date("$timeEntity->year-$timeEntity->month-$timeEntity->day"))->format('Ymd');
200 - */  
201 - /* 220 + S/
  221 + /S
202 debug($entity); // ex: '20/04/2020' 222 debug($entity); // ex: '20/04/2020'
203 debug($today); // '20200717' 223 debug($today); // '20200717'
204 debug($date); // '20200718' => pas bon 224 debug($date); // '20200718' => pas bon
205 debug($date_too_old); 225 debug($date_too_old);
206 - */ 226 + S/
207 //return ($today >= $date); 227 //return ($today >= $date);
208 return ($date<=$today && $date>$date_too_old); 228 return ($date<=$today && $date>$date_too_old);
209 }; 229 };
  230 + */
  231 +
210 /* 232 /*
211 $dateIsNotTooFarAway = function ($date_string) { 233 $dateIsNotTooFarAway = function ($date_string) {
212 $tz = new \DateTimeZone('Europe/Paris'); 234 $tz = new \DateTimeZone('Europe/Paris');
@@ -278,11 +300,14 @@ class MaterielsTable extends AppTable @@ -278,11 +300,14 @@ class MaterielsTable extends AppTable
278 'rule' => 'dateIsValid', 300 'rule' => 'dateIsValid',
279 'message' => "La date n'est pas valide (JJ/MM/AAAA)", 301 'message' => "La date n'est pas valide (JJ/MM/AAAA)",
280 'provider' => 'table', 302 'provider' => 'table',
281 - ]) 303 + ]);
  304 + // migré dans buildRules() car c'est plus de la validation de cohérence
  305 + /*
282 ->add($f, 'acceptable', [ 306 ->add($f, 'acceptable', [
283 'rule' => $dateIsNotFutureAndNotTooOld, 307 'rule' => $dateIsNotFutureAndNotTooOld,
284 'message' => "La date ne doit être ni future ni trop ancienne" 308 'message' => "La date ne doit être ni future ni trop ancienne"
285 ]); 309 ]);
  310 + */
286 311
287 // - Date livraison 312 // - Date livraison
288 $f = 'date_reception'; 313 $f = 'date_reception';
@@ -434,7 +459,8 @@ class MaterielsTable extends AppTable @@ -434,7 +459,8 @@ class MaterielsTable extends AppTable
434 $validator->allowEmpty('unite_duree_garantie'); 459 $validator->allowEmpty('unite_duree_garantie');
435 460
436 return $validator; 461 return $validator;
437 - } 462 +
  463 + } // validationDefault()
438 464
439 public function checkStatus($check) { return ($check !== null && in_array($check, $this->ALL_STATUS)); } 465 public function checkStatus($check) { return ($check !== null && in_array($check, $this->ALL_STATUS)); }
440 466
@@ -524,8 +550,19 @@ class MaterielsTable extends AppTable @@ -524,8 +550,19 @@ class MaterielsTable extends AppTable
524 }; 550 };
525 551
526 552
527 - // Check dates  
528 - $dateIsAfterDateAchatAndNotTooFar = function (Entity $entity) { 553 + // Check DATES
  554 +
  555 + $dateAchatIsNotTooOld = function (Entity $entity) {
  556 + return $entity->check_date_is_not_too_old('date_acquisition');
  557 + };
  558 + $dateAchatIsNotFuture = function (Entity $entity) {
  559 + return $entity->check_date_is_not_future('date_acquisition');
  560 + };
  561 + $dateReceptionIsNotFuture = function (Entity $entity) {
  562 + return $entity->check_date_is_not_future('date_reception');
  563 + };
  564 +
  565 + $dateReceptionIsAfterDateAchatAndNotTooFar = function (Entity $entity) {
529 return $entity->check_date_d2_gt_d1_but_not_too_much('date_reception','date_acquisition'); 566 return $entity->check_date_d2_gt_d1_but_not_too_much('date_reception','date_acquisition');
530 //return $this->check_date_d2_gt_d1_but_not_too_much($entity->date_reception,$entity->date_acquisition); 567 //return $this->check_date_d2_gt_d1_but_not_too_much($entity->date_reception,$entity->date_acquisition);
531 /* 568 /*
@@ -548,7 +585,8 @@ class MaterielsTable extends AppTable @@ -548,7 +585,8 @@ class MaterielsTable extends AppTable
548 return $diff->y < MAX_DIFF_YEARS; 585 return $diff->y < MAX_DIFF_YEARS;
549 */ 586 */
550 }; 587 };
551 - $dateIsAfterDateReceptionAndNotTooFar = function (Entity $entity) { 588 + $dateFinGarantieIsAfterDateReceptionAndNotTooFar = function (Entity $entity) {
  589 + //debug($entity);
552 return $entity->check_date_d2_gt_d1_but_not_too_much('date_fin_garantie','date_reception'); 590 return $entity->check_date_d2_gt_d1_but_not_too_much('date_fin_garantie','date_reception');
553 //return $this->check_date_d2_gt_d1_but_not_too_much($entity->date_fin_garantie,$entity->date_reception); 591 //return $this->check_date_d2_gt_d1_but_not_too_much($entity->date_fin_garantie,$entity->date_reception);
554 /* 592 /*
@@ -633,19 +671,30 @@ class MaterielsTable extends AppTable @@ -633,19 +671,30 @@ class MaterielsTable extends AppTable
633 //$rules->add($rules->existsIn(['photo_id'], 'Photos')); 671 //$rules->add($rules->existsIn(['photo_id'], 'Photos'));
634 ///$rules->add($rules->existsIn(['fournisseur_id'], 'Fournisseurs')); 672 ///$rules->add($rules->existsIn(['fournisseur_id'], 'Fournisseurs'));
635 673
636 - // Check dates reception et fin garantie  
637 - $rules->add($dateIsAfterDateAchatAndNotTooFar, [ 674 + // Check dates achat, reception et fin garantie
  675 + $rules->add($dateAchatIsNotTooOld, [
  676 + 'errorField' => 'date_acquisition',
  677 + 'message' => "La date ne doit pas être trop ancienne"
  678 + ]);
  679 + $rules->add($dateAchatIsNotFuture, [
  680 + 'errorField' => 'date_acquisition',
  681 + 'message' => "La date ne doit pas être future"
  682 + ]);
  683 + $rules->add($dateReceptionIsNotFuture, [
  684 + 'errorField' => 'date_reception',
  685 + 'message' => "La date ne doit pas être future"
  686 + ]);
  687 + $rules->add($dateReceptionIsAfterDateAchatAndNotTooFar, [
638 'errorField' => 'date_reception', 688 'errorField' => 'date_reception',
639 'message' => "La date doit être postérieure à la date d'achat (mais pas trop loin)" 689 'message' => "La date doit être postérieure à la date d'achat (mais pas trop loin)"
640 ]); 690 ]);
641 - $rules->add($dateIsAfterDateReceptionAndNotTooFar, [ 691 + $rules->add($dateFinGarantieIsAfterDateReceptionAndNotTooFar, [
642 'errorField' => 'date_fin_garantie', 692 'errorField' => 'date_fin_garantie',
643 'message' => "La date doit être postérieure à la date de livraison (mais pas trop loin)" 693 'message' => "La date doit être postérieure à la date de livraison (mais pas trop loin)"
644 ]); 694 ]);
645 695
646 -  
647 return $rules; 696 return $rules;
648 - } 697 + } // buildRules()
649 698
650 /* 699 /*
651 private function getEntity($id) { 700 private function getEntity($id) {
src/Template/Materiels/add_edit.ctp
@@ -618,7 +618,7 @@ if (isset($cpMateriel)) { @@ -618,7 +618,7 @@ if (isset($cpMateriel)) {
618 if ($IS_EDIT && $materiel->date_reception) $value_edit = $materiel->date_reception->format('d/m/Y'); 618 if ($IS_EDIT && $materiel->date_reception) $value_edit = $materiel->date_reception->format('d/m/Y');
619 echo $this->Form->control('date_reception', [ 619 echo $this->Form->control('date_reception', [
620 'type' => 'text', 620 'type' => 'text',
621 - 'label' => 'Date de réception', 621 + 'label' => 'Date de livraison',
622 'class' => 'datepicker', 622 'class' => 'datepicker',
623 'placeholder' => $comment, 623 'placeholder' => $comment,
624 'empty' => true, 624 'empty' => true,
src/Template/Materiels/view.ctp
@@ -615,8 +615,8 @@ if ($configuration-&gt;metrologie == 1) { @@ -615,8 +615,8 @@ if ($configuration-&gt;metrologie == 1) {
615 if (h($entity->metrologie) == 0) 615 if (h($entity->metrologie) == 0)
616 $displayElement(__('Métrologie'), $metro); 616 $displayElement(__('Métrologie'), $metro);
617 } 617 }
618 -$displayElement(__('Date d\'achat'), h($entity->date_acquisition));  
619 -$displayElement(__('Date de reception'), h($entity->date_reception)); 618 +$displayElement(__("Date d'achat"), h($entity->date_acquisition));
  619 +$displayElement(__('Date de livraison'), h($entity->date_reception));
620 if (! empty(h($entity->duree_garntie))) { 620 if (! empty(h($entity->duree_garntie))) {
621 $displayElement(__('Duree garantie'), h($entity->duree_garantie) . ' ' . h($entity->unite_duree_garantie)); 621 $displayElement(__('Duree garantie'), h($entity->duree_garantie) . ' ' . h($entity->unite_duree_garantie));
622 } 622 }