Commit e2af51a23d59b72593b6e630d439b7ef58a71df6
1 parent
0154a32b
Exists in
master
and in
1 other branch
date réception => "date livraison", et ne doit pas être future
v4.101.12-3.7.9
Showing
6 changed files
with
97 additions
and
25 deletions
Show diff stats
CHANGES.txt
... | ... | @@ -94,6 +94,10 @@ Outre ces changements, voici d'autres changements importants : |
94 | 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 | 101 | 16/09/2020 v4.101.11-3.7.9 (EP) |
98 | 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 | 103 | - (i) Corrigé petit bug sur site_id qui valait 2 par défaut (au lieu de null) | ... | ... |
README.md
... | ... | @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes : |
43 | 43 | -------------------------------------------------------------------------------------------- |
44 | 44 | |
45 | 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 | 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 | 3 | |
4 | 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 | 10 | * Materiel Entity. |
... | ... | @@ -88,11 +88,30 @@ class Materiel extends Entity { |
88 | 88 | // Ce qui s'affiche quand on fait echo $entity |
89 | 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 | 108 | // date_reception >= date_acquisition et aussi date_fin_garantie >= date_reception |
92 | 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 | 110 | $d2 = $this->$d2_name; |
95 | 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 | 115 | if (!$d2 || !$d1) return true; |
97 | 116 | /* |
98 | 117 | $tz = new \DateTimeZone('Europe/Paris'); |
... | ... | @@ -109,7 +128,7 @@ class Materiel extends Entity { |
109 | 128 | if ($d2 < $d1) return false; |
110 | 129 | // $d2 > $d1 oui mais pas trop... |
111 | 130 | $diff = $d2->diff($d1); |
112 | - //debug($diff->y); | |
131 | + //debug($diff->y); | |
113 | 132 | return $diff->y < MAX_DIFF_YEARS; |
114 | 133 | //return true; |
115 | 134 | } | ... | ... |
src/Model/Table/MaterielsTable.php
... | ... | @@ -143,11 +143,29 @@ class MaterielsTable extends AppTable |
143 | 143 | } |
144 | 144 | |
145 | 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 | 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 | 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 | 166 | //debug((bool)$valid); |
150 | 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 | 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 | 201 | // return true si date n'est pas future (maxi = today) |
182 | 202 | $dateIsNotFutureAndNotTooOld = function ($date_string) { |
183 | 203 | $tz = new \DateTimeZone('Europe/Paris'); |
... | ... | @@ -190,23 +210,25 @@ class MaterielsTable extends AppTable |
190 | 210 | $today = $today->format('Ymd'); |
191 | 211 | // today - 50 ans = trop vieux ! |
192 | 212 | $date_too_old = $date_too_old->sub(new \DateInterval('P50Y'))->format('Ymd'); |
193 | - /* | |
213 | + /S | |
194 | 214 | $time = Time::now(); // On récupère la date et l'heure actuelles |
195 | 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 | 218 | $timeEntity = new time($entity); |
199 | 219 | $dateEntity = (new date("$timeEntity->year-$timeEntity->month-$timeEntity->day"))->format('Ymd'); |
200 | - */ | |
201 | - /* | |
220 | + S/ | |
221 | + /S | |
202 | 222 | debug($entity); // ex: '20/04/2020' |
203 | 223 | debug($today); // '20200717' |
204 | 224 | debug($date); // '20200718' => pas bon |
205 | 225 | debug($date_too_old); |
206 | - */ | |
226 | + S/ | |
207 | 227 | //return ($today >= $date); |
208 | 228 | return ($date<=$today && $date>$date_too_old); |
209 | 229 | }; |
230 | + */ | |
231 | + | |
210 | 232 | /* |
211 | 233 | $dateIsNotTooFarAway = function ($date_string) { |
212 | 234 | $tz = new \DateTimeZone('Europe/Paris'); |
... | ... | @@ -278,11 +300,14 @@ class MaterielsTable extends AppTable |
278 | 300 | 'rule' => 'dateIsValid', |
279 | 301 | 'message' => "La date n'est pas valide (JJ/MM/AAAA)", |
280 | 302 | 'provider' => 'table', |
281 | - ]) | |
303 | + ]); | |
304 | + // migré dans buildRules() car c'est plus de la validation de cohérence | |
305 | + /* | |
282 | 306 | ->add($f, 'acceptable', [ |
283 | 307 | 'rule' => $dateIsNotFutureAndNotTooOld, |
284 | 308 | 'message' => "La date ne doit être ni future ni trop ancienne" |
285 | 309 | ]); |
310 | + */ | |
286 | 311 | |
287 | 312 | // - Date livraison |
288 | 313 | $f = 'date_reception'; |
... | ... | @@ -434,7 +459,8 @@ class MaterielsTable extends AppTable |
434 | 459 | $validator->allowEmpty('unite_duree_garantie'); |
435 | 460 | |
436 | 461 | return $validator; |
437 | - } | |
462 | + | |
463 | + } // validationDefault() | |
438 | 464 | |
439 | 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 | 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 | 566 | return $entity->check_date_d2_gt_d1_but_not_too_much('date_reception','date_acquisition'); |
530 | 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 | 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 | 590 | return $entity->check_date_d2_gt_d1_but_not_too_much('date_fin_garantie','date_reception'); |
553 | 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 | 671 | //$rules->add($rules->existsIn(['photo_id'], 'Photos')); |
634 | 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 | 688 | 'errorField' => 'date_reception', |
639 | 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 | 692 | 'errorField' => 'date_fin_garantie', |
643 | 693 | 'message' => "La date doit être postérieure à la date de livraison (mais pas trop loin)" |
644 | 694 | ]); |
645 | 695 | |
646 | - | |
647 | 696 | return $rules; |
648 | - } | |
697 | + } // buildRules() | |
649 | 698 | |
650 | 699 | /* |
651 | 700 | private function getEntity($id) { | ... | ... |
src/Template/Materiels/add_edit.ctp
... | ... | @@ -618,7 +618,7 @@ if (isset($cpMateriel)) { |
618 | 618 | if ($IS_EDIT && $materiel->date_reception) $value_edit = $materiel->date_reception->format('d/m/Y'); |
619 | 619 | echo $this->Form->control('date_reception', [ |
620 | 620 | 'type' => 'text', |
621 | - 'label' => 'Date de réception', | |
621 | + 'label' => 'Date de livraison', | |
622 | 622 | 'class' => 'datepicker', |
623 | 623 | 'placeholder' => $comment, |
624 | 624 | 'empty' => true, | ... | ... |
src/Template/Materiels/view.ctp
... | ... | @@ -615,8 +615,8 @@ if ($configuration->metrologie == 1) { |
615 | 615 | if (h($entity->metrologie) == 0) |
616 | 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 | 620 | if (! empty(h($entity->duree_garntie))) { |
621 | 621 | $displayElement(__('Duree garantie'), h($entity->duree_garantie) . ' ' . h($entity->unite_duree_garantie)); |
622 | 622 | } | ... | ... |