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,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) |
README.md
@@ -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->metrologie == 1) { | @@ -615,8 +615,8 @@ if ($configuration->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 | } |