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
README.md
... ... @@ -53,8 +53,8 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 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 58 Author: EP
59 59 Mise à jour framework cakephp et amélioration recherche matériel:
60 60 - Mise à jour du framework cakephp à la version courante : passage de v3.5 à v3.7
... ... @@ -62,7 +62,7 @@ Author: EP
62 62 - Bugfixes et améliorations recherche matériel :
63 63 - ajout du fournisseur dans la recherche globale
64 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 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 5 use Cake\ORM\TableRegistry;
6 6 use Cake\Mailer\Email;
7 7 use Cake\ORM\Locator\TableLocator;
  8 +use Cake\Auth\FallbackPasswordHasher;
8 9  
9 10 /**
10 11 * Materiels Controller
... ... @@ -1351,11 +1352,207 @@ class MaterielsController extends AppController
1351 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 1557 $s_sur_categories = $this->Materiels->SurCategories->find('list', [
1361 1558 'keyField' => 'id',
... ... @@ -1421,475 +1618,172 @@ class MaterielsController extends AppController
1421 1618 )
1422 1619 ]);
1423 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 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 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 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 1789 * group update status + exportAll
... ...