diff --git a/CHANGES.txt b/CHANGES.txt index fdaf1f1..19a7ce8 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,7 +13,7 @@ TODO: - Nouvelle page web "Statistiques mensuelles" (/pages/stats) ------- -16/07/2020 NEWS#2 : +17/07/2020 NEWS#2 : - Nouvelle page web pour visualiser les changements faits sur le logiciel (cette même page que vous visualisez actuellement) : /pages/changes @@ -70,12 +70,15 @@ Outre ces changements, voici d'autres changements importants : ======= CHANGES ======= ------- +20/07/2020 v3.7.9.65 (EP) + - (i) Ajouts important de TESTS sur les dates d'un matériel (achat, livraison, fin garantie) + +------- 17/07/2020 v3.7.9.63-64 (EP) - (i) Renforcement important des controles sur les dates d'un matériel (achat, livraison, fin garantie) - (i) Le numero d'inventaire généré automatiquement en fonction de l'année d'achat est désormais MIS À JOUR à chaque fois qu'on change la date d'achat !!! - (b) bugfixes et renforcement des tests (date reception doit maintenant etre >= date achat, et test sur message flash était insuffisant et laissait passer des cas...) - ------- 16/07/2020 v3.7.9.61-62 (EP) - (e) Amélioration importante de la nouvelle page web "Changements" (/pages/changes) diff --git a/README.md b/README.md index a86902b..8b101bd 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 17/07/2020 -Version: 3.7.9.64 +Date: 20/07/2020 +Version: 3.7.9.65 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index 4222382..03da45a 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -37,6 +37,11 @@ use Cake\ORM\Association\BelongsTo; * @mixin \Cake\ORM\Behavior\TimestampBehavior * */ + + +// Max 10 ans entre 2 dates +const MAX_DIFF_YEARS = 10; + class MaterielsTable extends AppTable { @@ -195,6 +200,18 @@ class MaterielsTable extends AppTable //return ($today >= $date); return ($date<=$today && $date>$date_too_old); }; + /* + $dateIsNotTooFarAway = function ($date_string) { + $tz = new \DateTimeZone('Europe/Paris'); + $date = ( new \DateTime(strtr($date_string,'/','-'),$tz) )->format('Ymd'); + $today = new \DateTime('now',$tz); + $date_too_far = $today; + $today = $today->format('Ymd'); + // today + 50 ans = trop vieux ! + $date_too_far = $date_too_far->add(new \DateInterval('P50Y'))->format('Ymd'); + return ($date < $date_too_far); + }; + */ $validator->integer('id')->allowEmpty('id', 'create'); $validator->notEmpty('designation', 'Ce champ doit être rempli')->add('designation', 'valid', [ @@ -270,6 +287,12 @@ class MaterielsTable extends AppTable 'message' => "La date n'est pas valide (JJ/MM/AAAA)", 'provider' => 'table', ]); + /* + ->add($f, 'acceptable2', [ + 'rule' => $dateIsNotTooFarAway, + 'message' => "La date est trop loin dans le futur" + ]); + */ // - Date fin garantie $f = 'date_fin_garantie'; @@ -281,7 +304,13 @@ class MaterielsTable extends AppTable 'message' => "La date n'est pas valide (JJ/MM/AAAA)", 'provider' => 'table', ]); - + /* + ->add($f, 'acceptable3', [ + 'rule' => $dateIsNotTooFarAway, + 'message' => "La date est trop loin dans le futur" + ]); + */ + /* @@ -459,25 +488,44 @@ class MaterielsTable extends AppTable //return ($entity->prix_ht !== null); return true; }; + // Check dates - $dateIsAfterDateAchat = function ($entity) { + $dateIsAfterDateAchatAndNotTooFar = function ($entity) { + // Si une des 2 dates est nulle => return true + if (!$entity->date_reception || !$entity->date_acquisition) return true; $tz = new \DateTimeZone('Europe/Paris'); // DateTime lit les dates au format JJ-MM-YYYY (et non pas JJ/MM/YYYY) - $d1 = ( new \DateTime(strtr($entity->date_acquisition,'/','-'),$tz) )->format('Ymd'); - $d2 = ( new \DateTime(strtr($entity->date_reception,'/','-'),$tz) )->format('Ymd'); + //$d1 = ( new \DateTime(strtr($entity->date_acquisition,'/','-'),$tz) )->format('Ymd'); + $d1 = new \DateTime(strtr($entity->date_acquisition,'/','-'),$tz); + //$d1_text = $d1->format('Ymd'); + $d2 = new \DateTime(strtr($entity->date_reception,'/','-'),$tz); + //$d2_text = $d2->format('Ymd'); //date_default_timezone_set('Europe/Paris'); //$today = (new \DateTime('now',$tz))->format('Ymd'); - return ($d2 >= $d1); + //$ok = ($d2_text >= $d1_text); + if ($d2 < $d1) return false; + // $d2 > $d1 oui mais pas trop... + $diff = $d2->diff($d1); + //debug($diff->y); + return $diff->y < MAX_DIFF_YEARS; }; - $dateIsAfterDateReception = function ($entity) { + $dateIsAfterDateReceptionAndNotTooFar = function ($entity) { + // Si une des 2 dates est nulle => return true + if (!$entity->date_reception || !$entity->date_fin_garantie) return true; $tz = new \DateTimeZone('Europe/Paris'); // DateTime lit les dates au format JJ-MM-YYYY (et non pas JJ/MM/YYYY) - $d1 = ( new \DateTime(strtr($entity->date_reception,'/','-'),$tz) )->format('Ymd'); - $d2 = ( new \DateTime(strtr($entity->date_fin_garantie,'/','-'),$tz) )->format('Ymd'); + //debug($entity->date_reception); + //$d1 = ( new \DateTime(strtr($entity->date_reception,'/','-'),$tz) )->format('Ymd'); + $d1 = new \DateTime(strtr($entity->date_reception,'/','-'),$tz); + $d2 = new \DateTime(strtr($entity->date_fin_garantie,'/','-'),$tz); //date_default_timezone_set('Europe/Paris'); //$today = (new \DateTime('now',$tz))->format('Ymd'); - return ($d2 >= $d1); + if ($d2 < $d1) return false; + // $d2 > $d1 oui mais pas trop... + $diff = $d2->diff($d1); + //debug($diff->y); + return $diff->y < MAX_DIFF_YEARS; }; /* @@ -541,13 +589,13 @@ class MaterielsTable extends AppTable ///$rules->add($rules->existsIn(['fournisseur_id'], 'Fournisseurs')); // Check dates reception et fin garantie - $rules->add($dateIsAfterDateAchat, [ + $rules->add($dateIsAfterDateAchatAndNotTooFar, [ 'errorField' => 'date_reception', - 'message' => "La date doit être postérieure à la date d'achat" + 'message' => "La date doit être postérieure à la date d'achat (et pas trop loin)" ]); - $rules->add($dateIsAfterDateReception, [ + $rules->add($dateIsAfterDateReceptionAndNotTooFar, [ 'errorField' => 'date_fin_garantie', - 'message' => "La date doit être postérieure à la date de livraison" + 'message' => "La date doit être postérieure à la date de livraison (et pas trop loin)" ]); diff --git a/tests/TestCase/Controller/MaterielsControllerTest.php b/tests/TestCase/Controller/MaterielsControllerTest.php index 6b4bda0..cbed82f 100755 --- a/tests/TestCase/Controller/MaterielsControllerTest.php +++ b/tests/TestCase/Controller/MaterielsControllerTest.php @@ -2649,6 +2649,119 @@ class MaterielsControllerTest extends General { } + + /** + * (EP 20200720) + * + * Test des controles sur les dates + * + */ + public function testMaterielDatesValidation() { + + // On teste avec le profil SUPERADMIN car il a (presque) tous les droits + $this->authAs('SUPER'); + + // On récupère un matériel qcq qu'on va modifier à souhait pour faire les tests + $id = $this->_getEntityIdOkForTesting(); + $m = $this->Materiels->get($id); + $format = 'd/m/Y'; + + + // 1) Test edit date acquisition correct format => OK + $f = 'date_acquisition'; + + $new_data = [ + $f => '19/04/'.yyyy0, + 'date_reception' => '', + ]; + $action = 'edit'; + //$this->_doActionAndCheckResult($action, $id, $SUCCESS=true, $new_data); + $this->_doActionAndCheckResult($action, $id, TRUE, $new_data); + + + // 2) Test edit date acquisition wrong format => KO + + // - date (achat) mauvais format => KO + $new_data = [ + $f => '19-04-'.yyyy0, + //'date_reception' => '', + ]; + //$action = 'edit'; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + // - date (achat) incorrecte => KO + $new_data = [ $f => '31/04/'.yyyy0 ]; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + // - date (achat) today => OK... + $tz = new \DateTimeZone('Europe/Paris'); + $date = $today = new \DateTime('now',$tz); + //debug($date); + $new_data = [ $f => $date->format('d/m/Y') ]; + $this->_doActionAndCheckResult($action, $id, TRUE, $new_data); + + // - ... mais date future (demain) => KO + $tomorrow = new \DateTime('now',$tz); + $date = $tomorrow->add(new \DateInterval('P1D')); + //debug($date); + $new_data = [ $f => $date->format('d/m/Y') ]; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + // - date (achat) loin dans le passé (-40 ans) => OK... + $old = new \DateTime('now',$tz); + $date = $old->sub(new \DateInterval('P40Y')); + $new_data = [ $f => $date->format('d/m/Y') ]; + $this->_doActionAndCheckResult($action, $id, TRUE, $new_data); + // - mais pas trop loin dans le passé (-50 ans) => KO + $date = $old->sub(new \DateInterval('P10Y')); + //debug($date); + $new_data = [ $f => $date->format('d/m/Y') ]; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + + // 3) Test Date reception >= date acq, mais pas trop loin + $f = 'date_reception'; + + // - date (reception) < date acq => KO + $yesterday = new \DateTime('now',$tz); + $date = $yesterday->sub(new \DateInterval('P1D')); + $new_data = [ + 'date_acquisition' => $today->format($format), + $f => $date->format($format) + ]; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + // - date (reception) = date acq => OK + $date = $today; + $new_data = [ + 'date_acquisition' => $today->format($format), + $f => $date->format($format) + ]; + $this->_doActionAndCheckResult($action, $id, TRUE, $new_data); + + // - date (reception) > date_acq (jqa MAX_DIFF - 1 jour) => OK... + $MAX_DIFF = 10; + $far = new \DateTime('now',$tz); + $far->add(new \DateInterval('P'.$MAX_DIFF.'Y')); + $date = $far->sub(new \DateInterval('P1D')); + debug($date); + $new_data = [ + 'date_acquisition' => $today->format('d/m/Y'), + $f => $date->format('d/m/Y') + ]; + $this->_doActionAndCheckResult($action, $id, TRUE, $new_data); + // - ...mais pas trop loin dans le futur (MAX_DIFF) => KO + $date = $far->add(new \DateInterval('P1D')); + debug($date); + $new_data = [ $f => $date->format('d/m/Y') ]; + $this->_doActionAndCheckResult($action, $id, FALSE, $new_data); + + + // 4) Test Date fin garantie >= date reception, mais pas trop loin + // C'est la meme chose que le point precedent (3), on suppose donc que c'est ok... + } + + /** * (EP 20200629) * -- libgit2 0.21.2