Commit c630247ae38f8ab3cd5f92bd9e3b837d0b8f2cba

Authored by Etienne Pallier
1 parent daccf948
Exists in master and in 2 other branches dev, dev-IRAP

Mise à jour framework cakephp et amélioration recherche matériel

- Bugfixes et améliorations recherche matériel :
	- ajout du fournisseur dans la recherche globale
	- bugfix désignation (si elle contient plusieurs mots)
	- refactorisation et optimisation du code (bcp plus court...)
	- ...

- Mise à jour du framework cakephp à la version courante : passage de
v3.5 à v3.7
($ php composer.phar require --update-with-dependencies
"cakephp/cakephp:3.7.*")
Showing 2 changed files with 345 additions and 451 deletions   Show diff stats
@@ -53,8 +53,8 @@ Logiciel testé et validé sur les configurations suivantes : @@ -53,8 +53,8 @@ Logiciel testé et validé sur les configurations suivantes :
53 53
54 VERSION ACTUELLE 54 VERSION ACTUELLE
55 55
56 -Date: 17/01/2019  
57 -Version: 2.10.1 56 +Date: 21/01/2019
  57 +Version: 2.10.2
58 Author: EP 58 Author: EP
59 Mise à jour framework cakephp et amélioration recherche matériel: 59 Mise à jour framework cakephp et amélioration recherche matériel:
60 - Mise à jour du framework cakephp à la version courante : passage de v3.5 à v3.7 60 - Mise à jour du framework cakephp à la version courante : passage de v3.5 à v3.7
@@ -62,7 +62,7 @@ Author: EP @@ -62,7 +62,7 @@ Author: EP
62 - Bugfixes et améliorations recherche matériel : 62 - Bugfixes et améliorations recherche matériel :
63 - ajout du fournisseur dans la recherche globale 63 - ajout du fournisseur dans la recherche globale
64 - bugfix désignation (si elle contient plusieurs mots) 64 - bugfix désignation (si elle contient plusieurs mots)
65 - - optimisation du code (bcp plus court...) 65 + - refactorisation et optimisation du code (bcp plus court...)
66 - ... 66 - ...
67 67
68 Version majeure en cours : 2.10 (https://projects.irap.omp.eu/versions/207) 68 Version majeure en cours : 2.10 (https://projects.irap.omp.eu/versions/207)
src/Controller/MaterielsController.php
@@ -5,6 +5,7 @@ use App\Controller\AppController; @@ -5,6 +5,7 @@ use App\Controller\AppController;
5 use Cake\ORM\TableRegistry; 5 use Cake\ORM\TableRegistry;
6 use Cake\Mailer\Email; 6 use Cake\Mailer\Email;
7 use Cake\ORM\Locator\TableLocator; 7 use Cake\ORM\Locator\TableLocator;
  8 +use Cake\Auth\FallbackPasswordHasher;
8 9
9 /** 10 /**
10 * Materiels Controller 11 * Materiels Controller
@@ -1351,11 +1352,207 @@ class MaterielsController extends AppController @@ -1351,11 +1352,207 @@ class MaterielsController extends AppController
1351 return NULL; 1352 return NULL;
1352 } 1353 }
1353 1354
1354 - /**  
1355 - * Find method 1355 +
  1356 + private function find_general($general_search_field_name) {
  1357 + // $general_search_field_name equals 's_all' or 's_all2'
  1358 +
  1359 + //$generalFieldConditions = NULL;
  1360 +
  1361 + $all = $this->request->getData($general_search_field_name);
  1362 + //debug($all); exit;
  1363 + // Check for a date
  1364 + foreach ([
  1365 + "/",
  1366 + "-"
  1367 + ] as $symb) {
  1368 + $pos1 = strpos($all, $symb); // Première occurence
  1369 + $pos2 = strrchr($all, $symb); // Dernière occurence
  1370 + if ($pos1 !== false && $pos2 !== false && $pos1 != $pos2) {
  1371 + list ($dd, $mm, $yyyy) = explode($symb, $all);
  1372 + if (checkdate((int) $mm, (int) $dd, (int) $yyyy)) {
  1373 + $all = "$yyyy-$mm-$dd";
  1374 + break;
  1375 + }
  1376 + }
  1377 + }
  1378 + // End datecheck
  1379 +
  1380 + $tabSearch = explode(' ', $all);
  1381 +
  1382 + $merge = [];
  1383 + foreach ($tabSearch as $word) {
  1384 + $FieldConditions = [
  1385 + // Utilisation de array() pour pouvoir mettre plusieurs fois la meme clé.
  1386 + // Exemple : la clé "Materiels.designation LIKE" pourra apparaître plusieurs fois si on fait une recherche de "mac pc"
  1387 + // On aura : "Materiels.designation LIKE" => '%mac%' et "Materiels.designation LIKE" => '%pc%'
  1388 + // Sinon on aurait uniquement eu : "Materiels.designation LIKE" => '%pc%'
  1389 + array(
  1390 + 'Materiels.designation LIKE' => '%' . $word . '%'
  1391 + ),
  1392 + array(
  1393 + 'Materiels.numero_laboratoire LIKE' => '%' . $word . '%'
  1394 + ),
  1395 + array(
  1396 + 'Materiels.numero_inventaire_organisme LIKE' => '%' . $word . '%'
  1397 + ),
  1398 + array(
  1399 + 'Materiels.numero_inventaire_old LIKE' => '%' . $word . '%'
  1400 + ),
  1401 + array(
  1402 + 'Materiels.numero_commande LIKE' => '%' . $word . '%'
  1403 + ),
  1404 + array(
  1405 + 'Materiels.description LIKE' => '%' . $word . '%'
  1406 + ),
  1407 + /*TODO: comment gérer fournisseur ???*/
  1408 + array(
  1409 + //'Materiels.fournisseur_id LIKE' => '%' . $word . '%'
  1410 + //'Materiels.fournisseur_id =' => $word
  1411 + 'Fournisseurs.nom LIKE' => '%' . $word . '%'
  1412 + ),
  1413 + array(
  1414 + 'Materiels.nom_responsable LIKE' => '%' . $word . '%'
  1415 + ),
  1416 + array(
  1417 + 'Materiels.email_responsable LIKE' => '%' . $word . '%'
  1418 + ),
  1419 + array(
  1420 + 'Materiels.code_comptable LIKE' => '%' . $word . '%'
  1421 + ),
  1422 + array(
  1423 + 'Materiels.numero_serie LIKE' => '%' . $word . '%'
  1424 + ),
  1425 + array(
  1426 + 'Materiels.date_acquisition LIKE' => '%' . $word . '%'
  1427 + ),
  1428 + array(
  1429 + 'Materiels.lieu_detail LIKE' => '%' . $word . '%'
  1430 + )
  1431 + ];
  1432 + $merge = array_merge($merge, $FieldConditions);
  1433 + }
  1434 + $generalFieldConditions = [
  1435 + 'OR' => $merge
  1436 + ];
  1437 +
  1438 + return $generalFieldConditions;
  1439 + }
  1440 +
  1441 +
  1442 + private function find_specific_fields() {
  1443 +
  1444 + // Materiel type
  1445 + $matostype = $this->request->getData('s_matostype');
  1446 + $matostypeRequest = NULL;
  1447 +
  1448 + switch ($matostype) {
  1449 + // Administratif
  1450 + case 'A':
  1451 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  1452 + break;
  1453 + // Technique
  1454 + case 'T':
  1455 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  1456 + break;
  1457 + // Admin et Tech
  1458 + case 'AT':
  1459 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  1460 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  1461 + break;
  1462 + // Admin ONLY
  1463 + case 'AO':
  1464 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  1465 + $matostypeRequest['Materiels.materiel_technique ='] = '0';
  1466 + break;
  1467 + // Tech ONLY
  1468 + case 'TO':
  1469 + $matostypeRequest['Materiels.materiel_administratif ='] = '0';
  1470 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  1471 + break;
  1472 + }
  1473 +
  1474 + $periode_acquisitionRequest = NULL;
  1475 + $date_acquisition = NULL;
  1476 +
  1477 + $salle = NULL;
  1478 + $fournisseur = NULL;
  1479 + if ($this->request->getData('s_periode_acquisition1') != '')
  1480 + $periode_acquisitionRequest['Materiels.date_acquisition >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition1'))));
  1481 + if ($this->request->getData('s_periode_acquisition2') != '')
  1482 + $periode_acquisitionRequest['Materiels.date_acquisition <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition2'))));
  1483 + if ($this->request->getData('s_date_acquisition') != '')
  1484 + $date_acquisition['Materiels.date_acquisition LIKE'] = '%' . date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_acquisition')))) . '%';
  1485 +
  1486 + $montantRequest = [];
  1487 + if ($this->request->getData('s_prix_ht_inf') != '')
  1488 + $montantRequest['Materiels.prix_ht <='] = $this->request->getData('s_prix_ht_inf');
  1489 + if ($this->request->getData('s_prix_ht_sup') != '')
  1490 + $montantRequest['Materiels.prix_ht >='] = $this->request->getData('s_prix_ht_sup');
  1491 +
  1492 + if ($this->request->getData('s_salle') !== null && $this->request->getData('s_salle') != '')
  1493 + $salle['Materiels.lieu_detail LIKE'] = '%' . $this->request->getData('s_salle') . '%';
  1494 +
  1495 + if ($this->request->getData('s_fournisseur_id') !== null && $this->request->getData('s_fournisseur_id') != '')
  1496 + $fournisseur['Materiels.fournisseur_id ='] = $this->request->getData('s_fournisseur');
  1497 +
  1498 + /* TODO: (EP 2019/01) NOUVEAU CODE POUR REMPLACER LE CODE SUPER REDONDANT D'AVANT (300 lignes !!!) */
  1499 + $designation = NULL;
  1500 + if ($this->request->getData('s_designation')) {
  1501 + //$designation_words = [];
  1502 + //$designation_words = explode (" ", $this->request->getData('s_designation'));
  1503 + $designation = str_replace(" ","%", $this->request->getData('s_designation'));
  1504 + $designation = [ 'Materiels.designation LIKE' => '%'.$designation.'%' ];
  1505 + #TODO: gérer un peu mieux le cas où le champ designation contient plusieurs mots: en cherchant chaque mot séparément (avec un "OU") :
  1506 + /*
  1507 + $designation_conditions = [];
  1508 + for ($i = 0; $i < count($designation); $i++) {
  1509 + //'Materiels.designation LIKE' => '%' . $designation[0]. '%',
  1510 + //'Materiels.designation LIKE' => '%' . $designation[1]. '%',
  1511 + $designation_conditions['Materiels.designation LIKE'] = '%'.$designation_words[$i].'%');
  1512 + }
  1513 + */
  1514 + }
  1515 +
  1516 + // Putting all these specific fields together
  1517 + $specificFieldsConditions = [
  1518 + //'Materiels.designation LIKE' => '%' . $designation[0] . '%',
  1519 + //'Materiels.designation LIKE' => '%' . $this->request->getData('s_designation'). '%',
  1520 + $designation,
  1521 + //'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',
  1522 + $this->getConditionForField('numero_laboratoire'),
  1523 + $this->getConditionForField('numero_commande'),
  1524 + $date_acquisition,
  1525 + $periode_acquisitionRequest,
  1526 + $this->getConditionForFieldNumber('prix_ht'),
  1527 + $montantRequest,
  1528 + $this->getConditionForFieldNumber('sur_categorie_id'),
  1529 + $this->getConditionForFieldNumber('categorie_id'),
  1530 + $this->getConditionForFieldNumber('sous_categorie_id'),
  1531 + $this->getConditionForField('nom_responsable'),
  1532 + $this->getConditionForField('numero_inventaire_organisme'),
  1533 + $this->getConditionForField('numero_inventaire_old'),
  1534 + $this->getConditionForFieldNumber('groupes_metier_id'),
  1535 + $this->getConditionForFieldNumber('groupes_thematique_id'),
  1536 + $salle,
  1537 + //$fournisseur,
  1538 + $this->getConditionForFieldNumber('fournisseur_id'),
  1539 + $this->getConditionForFieldNumber('organisme_id'),
  1540 + $matostypeRequest,
  1541 + $this->getConditionForFieldNumber('organisme_id'),
  1542 + $matostypeRequest,
  1543 + $this->getConditionForField('status'),
  1544 + ];
  1545 +
  1546 + return $specificFieldsConditions;
  1547 +
  1548 + }
  1549 +
  1550 +
  1551 + /* ********************
  1552 + * Create all needed LISTS and pass them to the VIEW (find)
  1553 + * ********************
1356 */ 1554 */
1357 - public function find()  
1358 - { 1555 + private function set_elements_lists_for_view_find() {
1359 1556
1360 $s_sur_categories = $this->Materiels->SurCategories->find('list', [ 1557 $s_sur_categories = $this->Materiels->SurCategories->find('list', [
1361 'keyField' => 'id', 1558 'keyField' => 'id',
@@ -1421,475 +1618,172 @@ class MaterielsController extends AppController @@ -1421,475 +1618,172 @@ class MaterielsController extends AppController
1421 ) 1618 )
1422 ]); 1619 ]);
1423 $categories = $this->Materiels->Categories; 1620 $categories = $this->Materiels->Categories;
1424 - $this->set(compact('s_numero_laboratoire', 's_nomresp', 's_sur_categories', 's_categories', 's_sous_categories', 's_groupes_thematiques', 's_groupes_metiers', 1621 +
  1622 + // Pass all these LISTS to the view :
  1623 + $this->set(compact('s_numero_laboratoire', 's_nomresp', 's_sur_categories', 's_categories', 's_sous_categories', 's_groupes_thematiques', 's_groupes_metiers',
1425 's_organismes', 's_fournisseurs', 's_salles', 'categories')); 1624 's_organismes', 's_fournisseurs', 's_salles', 'categories'));
  1625 +
  1626 + }
  1627 +
  1628 +
  1629 +
  1630 +
  1631 + /**
  1632 + * Find method
  1633 + * (EP) tout refait le 18/1/17 pour que ça soit plus lisible et moins bugué...
  1634 + */
  1635 + public function find()
  1636 + {
  1637 +
  1638 + $this->set_elements_lists_for_view_find();
  1639 +
  1640 + // Get the previous search result (from session) set in the view (find.ctp)
1426 $resultTri = $this->request->getSession()->read("resultTri"); 1641 $resultTri = $this->request->getSession()->read("resultTri");
1427 1642
  1643 + // Do not show Archived materiel if not Admin
  1644 + $conditionNotArchived = $this->USER_IS_ADMIN_AT_LEAST() ? '' : [ 'Materiels.status !=' => 'ARCHIVED' ];
1428 // if (! (in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']))) 1645 // if (! (in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur'])))
1429 - if (! $this->USER_IS_ADMIN_AT_LEAST())  
1430 - $conditionNotArchived = [  
1431 - 'Materiels.status !=' => 'ARCHIVED'  
1432 - ];  
1433 - else  
1434 - $conditionNotArchived = '';  
1435 1646
1436 - // some data POSTED (au moins le champ de recherche generale) ?  
1437 - if ($this->request->getData('s_all') !== null || $this->request->getData('s_all_2') !== null || $this->request->getData('s_designation') !== null) {  
1438 - $generalFieldConditions = NULL;  
1439 - // if general field set (s_all), then set general request for it  
1440 - //if ($this->request->getData('s_all') !== null) {  
1441 - //debug($this->request->getData()); exit;  
1442 - if ($this->request->data('s_all') !== null) {  
1443 - $all = $this->request->getData('s_all');  
1444 - //debug($all); exit;  
1445 - // Check for a date  
1446 - foreach ([  
1447 - "/",  
1448 - "-"  
1449 - ] as $symb) {  
1450 - $pos1 = strpos($all, $symb); // Première occurence  
1451 - $pos2 = strrchr($all, $symb); // Dernière occurence  
1452 - if ($pos1 !== false && $pos2 !== false && $pos1 != $pos2) {  
1453 - list ($dd, $mm, $yyyy) = explode($symb, $all);  
1454 - if (checkdate((int) $mm, (int) $dd, (int) $yyyy)) {  
1455 - $all = "$yyyy-$mm-$dd";  
1456 - break;  
1457 - }  
1458 - }  
1459 - }  
1460 - // End datecheck  
1461 -  
1462 - $tabSearch = explode(' ', $all);  
1463 1647
1464 - $merge = [];  
1465 - foreach ($tabSearch as $word) {  
1466 - $FieldConditions = [  
1467 - // Utilisation de array() pour pouvoir mettre plusieurs fois la meme clé.  
1468 - // Exemple : la clé "Materiels.designation LIKE" pourra apparaître plusieurs fois si on fait une recherche de "mac pc"  
1469 - // On aura : "Materiels.designation LIKE" => '%mac%' et "Materiels.designation LIKE" => '%pc%'  
1470 - // Sinon on aurait uniquement eu : "Materiels.designation LIKE" => '%pc%'  
1471 - array(  
1472 - 'Materiels.designation LIKE' => '%' . $word . '%'  
1473 - ),  
1474 - array(  
1475 - 'Materiels.numero_laboratoire LIKE' => '%' . $word . '%'  
1476 - ),  
1477 - array(  
1478 - 'Materiels.numero_inventaire_organisme LIKE' => '%' . $word . '%'  
1479 - ),  
1480 - array(  
1481 - 'Materiels.numero_inventaire_old LIKE' => '%' . $word . '%'  
1482 - ),  
1483 - array(  
1484 - 'Materiels.numero_commande LIKE' => '%' . $word . '%'  
1485 - ),  
1486 - array(  
1487 - 'Materiels.description LIKE' => '%' . $word . '%'  
1488 - ),  
1489 - /*TODO: comment gérer fournisseur ???*/  
1490 - array(  
1491 - //'Materiels.fournisseur_id LIKE' => '%' . $word . '%'  
1492 - //'Materiels.fournisseur_id =' => $word  
1493 - 'Fournisseurs.nom LIKE' => '%' . $word . '%'  
1494 - ),  
1495 - array(  
1496 - 'Materiels.nom_responsable LIKE' => '%' . $word . '%'  
1497 - ),  
1498 - array(  
1499 - 'Materiels.email_responsable LIKE' => '%' . $word . '%'  
1500 - ),  
1501 - array(  
1502 - 'Materiels.code_comptable LIKE' => '%' . $word . '%'  
1503 - ),  
1504 - array(  
1505 - 'Materiels.numero_serie LIKE' => '%' . $word . '%'  
1506 - ),  
1507 - array(  
1508 - 'Materiels.date_acquisition LIKE' => '%' . $word . '%'  
1509 - ),  
1510 - array(  
1511 - 'Materiels.lieu_detail LIKE' => '%' . $word . '%'  
1512 - )  
1513 - ];  
1514 - $merge = array_merge($merge, $FieldConditions); 1648 + /* ********************
  1649 + * Plusieurs cas possibles:
  1650 + * - (1) SI POST (getData()) :
  1651 + * - (1.1) WITH DATA (au moins un champ rempli, avec ou sans critère de tri) :
  1652 + * - (1.1.1) recherche globale (s_all ou s_all2) :
  1653 + * - (1.1.1.1) s_all2 (champ de recherche global en bas à gauche) => recherche globale (toutes les tables)
  1654 + * - (1.1.1.2) s_all (champ de recherche général matériel tout au début du formulaire de recherche, en haut de page) => recherche générale sur la table matériel (et tables liées)
  1655 + * - (1.1.2) recherche spécifique : 1 ou plusieurs champ(s) spécifique(s) (s_designation, ...) => recherche sur champs spécifiques
  1656 + * - (1.2) NO DATA, only empty fields : Une recherche a été soumise sans remplir aucun champ !! => ne rien faire
  1657 + * - (2) SINON :
  1658 + * - (2.1) avec critères de tri => sort_result() : Devant le résultat d'une recherche, on a simplement cliqué sur une colonne pour afficher le résultat TRIÉ (sorted)
  1659 + * - (2.2) sans critère de tri => c'est la première fois qu'on vient sur la vue, rien à faire de plus
  1660 + * ********************
  1661 + */
  1662 +
  1663 +
  1664 + // (1) POST
  1665 + if ($this->request->is('post')) {
  1666 + $has_data = FALSE;
  1667 + foreach ($this->request->getData() as $k=>$v) {
  1668 + if ($v != '') {
  1669 + $has_data = TRUE;
  1670 + break;
1515 } 1671 }
1516 - $generalFieldConditions = [  
1517 - 'OR' => $merge  
1518 - ];  
1519 } 1672 }
1520 - if ($this->request->getData('s_all_2') !== null) {  
1521 - $all = $this->request->getData('s_all_2'); 1673 +
  1674 + // (1.1) POST with data
  1675 + if ($has_data) {
1522 1676
1523 - // Check for a date  
1524 - foreach ([  
1525 - "/",  
1526 - "-"  
1527 - ] as $symb) {  
1528 - $pos1 = strpos($all, $symb); // Première occurence  
1529 - $pos2 = strrchr($all, $symb); // Dernière occurence  
1530 - if ($pos1 !== false && $pos1 != $pos2) {  
1531 - // Si une première occurence est trouvée, une dernière aussi  
1532 - list ($dd, $mm, $yyyy) = explode($symb, $all);  
1533 - if (checkdate((int) $mm, (int) $dd, (int) $yyyy)) {  
1534 - $all = "$yyyy-$mm-$dd";  
1535 - break;  
1536 - }  
1537 - }  
1538 - }  
1539 - // End datecheck 1677 + ///debug("post with data");
1540 1678
1541 - $tabSearch = explode(' ', $all);  
1542 - $merge = [];  
1543 - foreach ($tabSearch as $word) {  
1544 - $FieldConditions = [  
1545 - // Utilisation de array() pour pouvoir mettre plusieurs fois la meme clé.  
1546 - // Exemple : la clé "Materiels.designation LIKE" pourra apparaître plusieurs fois si on fait une recherche de "mac pc"  
1547 - // On aura : "Materiels.designation LIKE" => '%mac%' et "Materiels.designation LIKE" => '%pc%'  
1548 - // Sinon on aurait uniquement eu : "Materiels.designation LIKE" => '%pc%'  
1549 - array(  
1550 - 'Materiels.designation LIKE' => '%' . $word . '%'  
1551 - ),  
1552 - array(  
1553 - 'Materiels.numero_laboratoire LIKE' => '%' . $word . '%'  
1554 - ),  
1555 - array(  
1556 - 'Materiels.numero_inventaire_organisme LIKE' => '%' . $word . '%'  
1557 - ),  
1558 - array(  
1559 - 'Materiels.numero_inventaire_old LIKE' => '%' . $word . '%'  
1560 - ),  
1561 - array(  
1562 - 'Materiels.numero_commande LIKE' => '%' . $word . '%'  
1563 - ),  
1564 - array(  
1565 - 'Materiels.description LIKE' => '%' . $word . '%'  
1566 - ),  
1567 - /*TODO: comment gérer fournisseur ???*/  
1568 - array(  
1569 - //'Materiels.fournisseur_id LIKE' => '%' . $word . '%'  
1570 - //'Materiels.fournisseur_id =' => $word  
1571 - 'Fournisseurs.nom LIKE' => '%' . $word . '%'  
1572 - ),  
1573 - array(  
1574 - 'Materiels.nom_responsable LIKE' => '%' . $word . '%'  
1575 - ),  
1576 - array(  
1577 - 'Materiels.email_responsable LIKE' => '%' . $word . '%'  
1578 - ),  
1579 - array(  
1580 - 'Materiels.code_comptable LIKE' => '%' . $word . '%'  
1581 - ),  
1582 - array(  
1583 - 'Materiels.numero_serie LIKE' => '%' . $word . '%'  
1584 - ),  
1585 - array(  
1586 - 'Materiels.date_acquisition LIKE' => '%' . $word . '%'  
1587 - ),  
1588 - array(  
1589 - 'Materiels.lieu_detail LIKE' => '%' . $word . '%'  
1590 - )  
1591 - ];  
1592 - $merge = array_merge($merge, $FieldConditions); 1679 + // (1.1.1) Recherche globale (s_all_2 ou s_all) :
  1680 + /*
  1681 + * TODO: Distinguer la recherche globale dans TOUTES les tables (s_all_2) de la recherche générale seulement dans la table matériel (s_all)
  1682 + * - Pour le moment, les résultats sont les mêmes pour ces 2 champs (normal, on fait le même traitement), c'est pas normal !!!
  1683 + * - Recherche s_all ok : il faudrait juste améliorer la recherche dans toutes les tables liées au matériel (fournisseur, organismes, catégories...)
  1684 + * - Recherche s_all_2 pas faite : à inventer...
  1685 + * - Ajouter des tests de recherche (nombreux cas possibles)
  1686 + */
  1687 + if ( $this->request->getData('s_all_2') || $this->request->getData('s_all') ) {
  1688 + ///debug("recherche globale");
  1689 + $general_search_field_name = $this->request->getData('s_all_2') ? 's_all_2':'s_all';
  1690 + $conditions = $this->find_general($general_search_field_name);
  1691 + /*
  1692 + if ($this->request->getData('s_all_2'))
  1693 + debug("s_all2, recherche globale (toutes les tables)");
  1694 + else if ($this->request->getData('s_all'))
  1695 + debug("s_all, recherche générale dans la table des matériels (et tables associées)");
  1696 + */
1593 } 1697 }
1594 - $generalFieldConditions = [  
1595 - 'OR' => $merge  
1596 - ];  
1597 - }  
1598 -  
1599 -  
1600 - /*  
1601 - * SPECIFIC FIELDS  
1602 - */  
1603 - //$specificFieldsConditions = NULL;  
1604 - //$specificFieldsConditions = [];  
1605 -  
1606 - // au moins un champ specifique rempli ?  
1607 - if ($this->request->getData('s_designation') !== null) {  
1608 - // Materiel type  
1609 - $matostype = $this->request->getData('s_matostype');  
1610 - $matostypeRequest = NULL;  
1611 1698
1612 - switch ($matostype) {  
1613 - // Administratif  
1614 - case 'A':  
1615 - $matostypeRequest['Materiels.materiel_administratif ='] = '1';  
1616 - break;  
1617 - // Technique  
1618 - case 'T':  
1619 - $matostypeRequest['Materiels.materiel_technique ='] = '1';  
1620 - break;  
1621 - // Admin et Tech  
1622 - case 'AT':  
1623 - $matostypeRequest['Materiels.materiel_administratif ='] = '1';  
1624 - $matostypeRequest['Materiels.materiel_technique ='] = '1';  
1625 - break;  
1626 - // Admin ONLY  
1627 - case 'AO':  
1628 - $matostypeRequest['Materiels.materiel_administratif ='] = '1';  
1629 - $matostypeRequest['Materiels.materiel_technique ='] = '0';  
1630 - break;  
1631 - // Tech ONLY  
1632 - case 'TO':  
1633 - $matostypeRequest['Materiels.materiel_administratif ='] = '0';  
1634 - $matostypeRequest['Materiels.materiel_technique ='] = '1';  
1635 - break; 1699 + // (1.1.2) recherche spécifique : 1 ou plusieurs champ(s) spécifique(s) (s_designation, ...) => recherche sur champs spécifiques
  1700 + else {
  1701 + ///debug("recherche de champs spécifiques dans la table des matériels");
  1702 + $conditions = $this->find_specific_fields();
1636 } 1703 }
  1704 +
  1705 + // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions OR $generalFieldConditions (mais entre chaque champ, c'est un AND)
  1706 + // by default, no sort
  1707 + $conditions = [ $conditions, $conditionNotArchived ];
  1708 + //debug($conditions); exit;
  1709 +
  1710 + $lastResults = $this->Materiels->find('all', [
  1711 + 'conditions' => $conditions,
  1712 + 'contain' => ['Categories', 'Fournisseurs']
  1713 + ])->limit(1000);
1637 1714
1638 - $periode_acquisitionRequest = NULL;  
1639 - $date_acquisition = NULL;  
1640 -  
1641 - $salle = NULL;  
1642 - $fournisseur = NULL;  
1643 - if ($this->request->getData('s_periode_acquisition1') != '')  
1644 - $periode_acquisitionRequest['Materiels.date_acquisition >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition1'))));  
1645 - if ($this->request->getData('s_periode_acquisition2') != '')  
1646 - $periode_acquisitionRequest['Materiels.date_acquisition <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition2'))));  
1647 - if ($this->request->getData('s_date_acquisition') != '')  
1648 - $date_acquisition['Materiels.date_acquisition LIKE'] = '%' . date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_acquisition')))) . '%'; 1715 + $this->paginate = [
  1716 + 'maxLimit' => 1000,
  1717 + 'limit' => 1000
  1718 + ];
  1719 + //debug($lastResults); exit;
  1720 + $_results = $this->paginate($lastResults);
  1721 + $this->set(compact('_results'));
1649 1722
1650 - $montantRequest = [];  
1651 - if ($this->request->getData('s_prix_ht_inf') != '')  
1652 - $montantRequest['Materiels.prix_ht <='] = $this->request->getData('s_prix_ht_inf');  
1653 - if ($this->request->getData('s_prix_ht_sup') != '')  
1654 - $montantRequest['Materiels.prix_ht >='] = $this->request->getData('s_prix_ht_sup'); 1723 + // pour l'export
  1724 + $this->request->getSession()->write("result", $lastResults->toArray());
1655 1725
1656 - if ($this->request->getData('s_salle') !== null && $this->request->getData('s_salle') != '')  
1657 - $salle['Materiels.lieu_detail LIKE'] = '%' . $this->request->getData('s_salle') . '%'; 1726 + } // $has_data
  1727 +
  1728 + // (1.2) POST without data
  1729 + else {
  1730 + ///debug("post without data => do nothing");
  1731 + // with sort field => trier un résultat
  1732 + // without sort field => c'est la première visite de cette vue
  1733 + }
  1734 +
  1735 + }
  1736 +
  1737 + // (2) no POST
  1738 + else {
  1739 + ///debug("no POST");
  1740 +
  1741 + // (2.1) AVEC critère de tri (sort) => seulement demandé un tri du résultat, no data posted
  1742 + /*
  1743 + * TODO: on pourrait faire autrement:
  1744 + * A chaque fois qu'on fait un tri sur une colonne,
  1745 + * au lieu de sauvegarder le résultat de la recherche dans une variable de session puis recharger ce résultat en mémoire pour le trier,
  1746 + * il vaudrait mieux relancer la recherche à chaque fois, mais juste changer le critère de tri, c'est plus simple, plus naturel
  1747 + */
  1748 + if ($resultTri !== null && strstr($this->request->here(), 'sort') != false && strstr($this->request->here(), 'direction') != false) {
1658 1749
1659 - if ($this->request->getData('s_fournisseur_id') !== null && $this->request->getData('s_fournisseur_id') != '')  
1660 - $fournisseur['Materiels.fournisseur_id ='] = $this->request->getData('s_fournisseur'); 1750 + $foundMateriel = [];
1661 1751
1662 - /* TODO: (EP) NOUVEAU CODE EN COURS POUR REMPLACER LE CODE REDONDANT CI-APRES */  
1663 - $designation = NULL;  
1664 - if ($this->request->getData('s_designation')) {  
1665 - //$designation_words = [];  
1666 - $designation_words = explode (" ", $this->request->getData('s_designation'));  
1667 - $designation = str_replace(" ","%", $this->request->getData('s_designation'));  
1668 - /*  
1669 - $designation_conditions = [];  
1670 - for ($i = 0; $i < count($designation); $i++) {  
1671 - //$designation_conditions['Materiels.designation LIKE'] = '%'.$designation_words[$i].'%');  
1672 - }  
1673 - */  
1674 - $designation = [ 'Materiels.designation LIKE' => '%'.$designation.'%' ]; 1752 + foreach ($resultTri as $r) {
  1753 + array_push($foundMateriel, $r->id);
1675 } 1754 }
1676 -  
1677 - // Putting all these specific fields together  
1678 - $specificFieldsConditions = [  
1679 -  
1680 - //'Materiels.designation LIKE' => '%' . $designation[0] . '%',  
1681 - //'Materiels.designation LIKE' => '%' . $this->request->getData('s_designation'). '%',  
1682 - $designation,  
1683 - //'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',  
1684 - $this->getConditionForField('numero_laboratoire'),  
1685 - $this->getConditionForField('numero_commande'),  
1686 - $date_acquisition,  
1687 - $periode_acquisitionRequest,  
1688 - $this->getConditionForFieldNumber('prix_ht'),  
1689 - $montantRequest,  
1690 - $this->getConditionForFieldNumber('sur_categorie_id'),  
1691 - $this->getConditionForFieldNumber('categorie_id'),  
1692 - $this->getConditionForFieldNumber('sous_categorie_id'),  
1693 - $this->getConditionForField('nom_responsable'),  
1694 - $this->getConditionForField('numero_inventaire_organisme'),  
1695 - $this->getConditionForField('numero_inventaire_old'),  
1696 - $this->getConditionForFieldNumber('groupes_metier_id'),  
1697 - $this->getConditionForFieldNumber('groupes_thematique_id'),  
1698 - $salle,  
1699 - //$fournisseur,  
1700 - $this->getConditionForFieldNumber('fournisseur_id'),  
1701 - $this->getConditionForFieldNumber('organisme_id'),  
1702 - $matostypeRequest,  
1703 - $this->getConditionForFieldNumber('organisme_id'),  
1704 - $matostypeRequest,  
1705 - $this->getConditionForField('status'),  
1706 -  
1707 - ];  
1708 - /* (EP) CODE REDONDANT INUTILEMENT, REMPLACÉ PAR LE CODE CI-DESSUS, BIEN PLUS COURT, qui en plus ne marchait pas !!!  
1709 - $designation = explode (" ", $this->request->getData('s_designation'));  
1710 - //debug($designation);  
1711 - if (count($designation) == 1 ) {  
1712 - $specificFieldsConditions = [  
1713 - 'Materiels.designation LIKE' => '%' . $designation[0] . '%',  
1714 - 'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',  
1715 - $this->getConditionForField('numero_commande'),  
1716 - $date_acquisition,  
1717 - $periode_acquisitionRequest,  
1718 - $this->getConditionForFieldNumber('prix_ht'),  
1719 - $montantRequest,  
1720 - $this->getConditionForFieldNumber('sur_categorie_id'),  
1721 - $this->getConditionForFieldNumber('categorie_id'),  
1722 - $this->getConditionForFieldNumber('sous_categorie_id'),  
1723 - $this->getConditionForField('nom_responsable'),  
1724 - $this->getConditionForField('numero_inventaire_organisme'),  
1725 - $this->getConditionForField('numero_inventaire_old'),  
1726 - $this->getConditionForFieldNumber('groupes_metier_id'),  
1727 - $this->getConditionForFieldNumber('groupes_thematique_id'),  
1728 - $salle,  
1729 - //$fournisseur,  
1730 - $this->getConditionForFieldNumber('fournisseur_id'),  
1731 - $this->getConditionForFieldNumber('organisme_id'),  
1732 - $matostypeRequest,  
1733 - $this->getConditionForFieldNumber('organisme_id'),  
1734 - $matostypeRequest  
1735 - ]; 1755 + $res = $this->Materiels->find('all', [
  1756 + 'limit' => 1000
  1757 + ]);
  1758 + for ($i = 0; $i < sizeof($foundMateriel); $i ++) {
  1759 + $res->orWhere([
  1760 + 'id =' => $foundMateriel[$i]
  1761 + ]);
1736 } 1762 }
1737 - else if(count($designation) == 2 ) {  
1738 - //debug($designation);  
1739 - $specificFieldsConditions = [  
1740 - 'Materiels.designation LIKE' => '%' . $designation[0]. '%',  
1741 - 'Materiels.designation LIKE' => '%' . $designation[1]. '%',  
1742 - 'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',  
1743 - $this->getConditionForField('numero_commande'),  
1744 - $date_acquisition,  
1745 - $periode_acquisitionRequest,  
1746 - $this->getConditionForFieldNumber('prix_ht'),  
1747 - $montantRequest,  
1748 - $this->getConditionForFieldNumber('sur_categorie_id'),  
1749 - $this->getConditionForFieldNumber('categorie_id'),  
1750 - $this->getConditionForFieldNumber('sous_categorie_id'),  
1751 - $this->getConditionForField('nom_responsable'),  
1752 - $this->getConditionForField('numero_inventaire_organisme'),  
1753 - $this->getConditionForField('numero_inventaire_old'),  
1754 - $this->getConditionForFieldNumber('groupes_metier_id'),  
1755 - $this->getConditionForFieldNumber('groupes_thematique_id'),  
1756 - $salle,  
1757 - //$fournisseur,  
1758 - $this->getConditionForFieldNumber('fournisseur_id'),  
1759 - $this->getConditionForFieldNumber('organisme_id'),  
1760 - $matostypeRequest,  
1761 - $this->getConditionForFieldNumber('organisme_id'),  
1762 - $matostypeRequest  
1763 - ];  
1764 - }else if(count($designation) == 3 ) {  
1765 - $specificFieldsConditions = [  
1766 - 'Materiels.designation LIKE' => '%' . $designation[0] . '%',  
1767 - 'Materiels.designation LIKE' => '%' . $designation[1] . '%',  
1768 - 'Materiels.designation LIKE' => '%' . $designation[2] . '%',  
1769 - 'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',  
1770 - $this->getConditionForField('numero_commande'),  
1771 - $date_acquisition,  
1772 - $periode_acquisitionRequest,  
1773 - $this->getConditionForFieldNumber('prix_ht'),  
1774 - $montantRequest,  
1775 - $this->getConditionForFieldNumber('sur_categorie_id'),  
1776 - $this->getConditionForFieldNumber('categorie_id'),  
1777 - $this->getConditionForFieldNumber('sous_categorie_id'),  
1778 - $this->getConditionForField('nom_responsable'),  
1779 - $this->getConditionForField('numero_inventaire_organisme'),  
1780 - $this->getConditionForField('numero_inventaire_old'),  
1781 - $this->getConditionForFieldNumber('groupes_metier_id'),  
1782 - $this->getConditionForFieldNumber('groupes_thematique_id'),  
1783 - $salle,  
1784 - //$fournisseur,  
1785 - $this->getConditionForFieldNumber('fournisseur_id'),  
1786 - $this->getConditionForFieldNumber('organisme_id'),  
1787 - $matostypeRequest,  
1788 - $this->getConditionForFieldNumber('organisme_id'),  
1789 - $matostypeRequest  
1790 - ];  
1791 - }else {  
1792 - $specificFieldsConditions = [  
1793 - 'Materiels.designation LIKE' => '%' . $this->request->getData('s_designation'). '%',  
1794 - 'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%',  
1795 - $this->getConditionForField('numero_commande'),  
1796 - $date_acquisition,  
1797 - $periode_acquisitionRequest,  
1798 - $this->getConditionForFieldNumber('prix_ht'),  
1799 - $montantRequest,  
1800 - $this->getConditionForFieldNumber('sur_categorie_id'),  
1801 - $this->getConditionForFieldNumber('categorie_id'),  
1802 - $this->getConditionForFieldNumber('sous_categorie_id'),  
1803 - $this->getConditionForField('nom_responsable'),  
1804 - $this->getConditionForField('numero_inventaire_organisme'),  
1805 - $this->getConditionForField('numero_inventaire_old'),  
1806 - $this->getConditionForFieldNumber('groupes_metier_id'),  
1807 - $this->getConditionForFieldNumber('groupes_thematique_id'),  
1808 - $salle,  
1809 - //$fournisseur,  
1810 - $this->getConditionForFieldNumber('fournisseur_id'),  
1811 - $this->getConditionForFieldNumber('organisme_id'),  
1812 - $matostypeRequest,  
1813 - $this->getConditionForFieldNumber('organisme_id'),  
1814 - $matostypeRequest  
1815 - ];  
1816 - }  
1817 - */  
1818 1763
1819 - /*  
1820 - // STATUS : CREATED, VALIDATED, ARCHIVED...  
1821 - //debug($specificFieldsConditions);  
1822 - //if ($this->request->getData('s_status') != '')  
1823 - if ($this->request->getData('s_status'))  
1824 - //debug("status is" . $this->request->getData('s_status'));  
1825 - array_push($specificFieldsConditions,  
1826 - [ 'Materiels.status =' => $this->request->getData('s_status') ]  
1827 - );  
1828 - */  
1829 - }  
1830 -  
1831 -  
1832 - // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions OR $generalFieldConditions (mais entre chaque champ, c'est un AND)  
1833 - // by default, no sort  
1834 - if ($this->request->getData('s_all_2') !== null && $this->request->getData('s_all_2') != '')  
1835 - $conditions = [  
1836 - $generalFieldConditions,  
1837 - $conditionNotArchived  
1838 - ];  
1839 - else if ($this->request->getData('s_all') !== null && $this->request->getData('s_all') != '')  
1840 - $conditions = [  
1841 - $generalFieldConditions,  
1842 - $conditionNotArchived 1764 + $this->paginate = [
  1765 + 'maxLimit' => 1000,
  1766 + 'limit' => 1000
1843 ]; 1767 ];
1844 - else  
1845 - $conditions = [  
1846 - $specificFieldsConditions,  
1847 - $conditionNotArchived  
1848 - ];  
1849 -  
1850 - $lastResults = $this->Materiels->find('all', [  
1851 - 'conditions' => $conditions,  
1852 - 'contain' => ['Categories', 'Fournisseurs']  
1853 - ])->limit(1000);  
1854 -  
1855 - $this->paginate = [  
1856 - 'maxLimit' => 1000,  
1857 - 'limit' => 1000  
1858 - ];  
1859 - //debug($lastResults); exit;  
1860 - $_results = $this->paginate($lastResults);  
1861 - $this->set(compact('_results'));  
1862 -  
1863 - // pour l'export  
1864 - $this->request->getSession()->write("result", $lastResults->toArray());  
1865 -  
1866 - } // end if()  
1867 - else if ($resultTri !== null && strstr($this->request->here(), 'sort') != false && strstr($this->request->here(), 'direction') != false) {  
1868 - $findedMateriel = [];  
1869 -  
1870 - foreach ($resultTri as $r) {  
1871 - array_push($findedMateriel, $r->id); 1768 + $_results = $this->paginate($res);
  1769 + $this->set(compact('_results'));
  1770 +
  1771 + // pour l'export
  1772 + $this->request->getSession()->write("result", $res->toArray());
1872 } 1773 }
1873 - $res = $this->Materiels->find('all', [  
1874 - 'limit' => 1000  
1875 - ]);  
1876 - for ($i = 0; $i < sizeof($findedMateriel); $i ++) {  
1877 - $res->orWhere([  
1878 - 'id =' => $findedMateriel[$i]  
1879 - ]); 1774 +
  1775 + // (2.2) SANS critère de tri => c'est la première fois qu'on vient sur la vue, rien à faire de plusl
  1776 + else {
  1777 + ///debug("1ère venue sur la vue");
1880 } 1778 }
1881 1779
1882 - $this->paginate = [  
1883 - 'maxLimit' => 1000,  
1884 - 'limit' => 1000  
1885 - ];  
1886 - $_results = $this->paginate($res);  
1887 - $this->set(compact('_results'));  
1888 -  
1889 - // pour l'export  
1890 - $this->request->getSession()->write("result", $res->toArray());  
1891 - }  
1892 - } 1780 + } // no POST
  1781 +
  1782 + } // find()
  1783 +
  1784 +
  1785 +
  1786 +
1893 1787
1894 /** 1788 /**
1895 * group update status + exportAll 1789 * group update status + exportAll