Commit c630247ae38f8ab3cd5f92bd9e3b837d0b8f2cba
1 parent
daccf948
Exists in
master
and in
2 other branches
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 | ... | ... |