'; } // --------------------------------------------------------------------------- // // debugln // --------------------------------------------------------------------------- // if (DEBUG) { function debugln($ln = '') { print $ln.'
'; } } else if (LOCAL) { function debugln($ln = '') { } } else { function debugln($ln = '') { /* $fp = fopen(LOG_PATH.'/recherchesDebug.log', 'a'); fwrite($fp, $ln.'\n'); fclose($fp); */ } } // --------------------------------------------------------------------------- // // Filtre les caracteres speciaux // --------------------------------------------------------------------------- // function filtreCaracteresSpeciaux(&$formR) { foreach ($formR as $label => $valeur) { if (empty($valeur) == true) { continue; } $formR[$label] = str_replace('@', 'a', $valeur); $formR[$label] = str_replace('\'', ' ', $formR[$label]); } } // --------------------------------------------------------------------------- // // Filtre pour le siren // --------------------------------------------------------------------------- // function filtreSiret(&$formR, &$criteres, &$sphinx) { if (empty($formR['siret']) == true) { return; } if (strstr($criteres, 'I') != false) { if (preg_match('/[0-9]{9}/', $formR['siret'], $arraySiren) > 0) { debugln("filtre siren='$arraySiren[0]'"); $sphinx->SetFilter('siren', $arraySiren); } else if (preg_match('/[0-9]{5}/', $formR['siret'], $arrayNic) > 0) { debugln("filtre nic='$arrayNic[0]'"); $sphinx->SetFilter('nic', $arrayNic); } } } // --------------------------------------------------------------------------- // // Filtre pour les elements de l'adresse // --------------------------------------------------------------------------- // function filtreAdresse(&$formR, &$criteres, &$sphinx) { global $gDatabaseJO; if (empty($formR['cpVille']) == true) { return; } $adressePostale = $formR['cpVille']; if (preg_match('/[0-9]{5}/', $adressePostale, $codePostaux) > 0) { if (strstr($criteres, 'L') != false) { debugln("filtre adr_cp='$codePostaux[0]'"); $sphinx->SetFilter('adr_cp', $codePostaux); } else if (strstr($criteres, 'D') != false) { $departement = substr($codePostaux[0], 0, 2); if ($departement == 97 || $departement == 98) { $departement = substr($codePostaux[0], 0, 3); } debugln("filtre adr_dep='$departement'"); $sphinx->SetFilter('adr_dep', array($departement)); } $formR['ville'] = str_replace($codePostaux[0], '', $adressePostale); $dep = intval(substr($codePostaux[0], 0, 2)); if ($codePostaux[0] == '98000') { $formR['departement'] = 99; $formR['localite'] = 0; } else if ($dep == 97 || $dep == 98) { $formR['departement'] = substr($codePostaux[0], 0, 3); $formR['localite'] = substr($codePostaux[0], 3, 2); } else { $formR['departement'] = substr($codePostaux[0], 0, 2); $formR['localite'] = substr($codePostaux[0], 2, 3); } } else if (preg_match('/[0-9]{3}/', $adressePostale, $departements) > 0 || preg_match('/[0-9]{2}/', $adressePostale, $departements) > 0) { if (strstr($criteres, 'D') != false) { debugln("filtre adr_dep='$departements[0]'"); $sphinx->SetFilter('adr_dep', $departements); } $formR['ville'] = str_replace($departements[0], '', $adressePostale); $formR['departement'] = $departements[0]; } else { $formR['ville'] = $adressePostale; } // Completion if (isset($formR['ville']) == true && isset($formR['localite']) == false) { $ville = strtoupper(trim($formR['ville'])); if ($ville == 'PARIS') { $formR['departement'] = 75; return; } if ($ville == 'LYON') { $formR['departement'] = 69; return; } if ($ville == 'MARSEILLE') { $formR['departement'] = 13; return; } $requeteDB = "select * from communes where LibCom like '$ville'"; debugln($requeteDB); $resDB = $gDatabaseJO->query($requeteDB); if ($resDB->num_rows == 1) { $cp = $resDB->fetch_assoc(); $cp = $cp['Code Postal']; $formR['departement'] = substr($cp, 0, 2); if ($formR['departement'] == '97' || $formR['departement'] == '98') { $formR['departement'] = substr($cp, 0, 3); $formR['localite'] = substr($cp, 3, 2); } else { $formR['localite'] = substr($cp, 2, 3); } if (DEBUG) { print 'Completion: '.$formR['ville'].' '. $formR['departement'].$formR['localite'].'
'; } } // TODO: // On peut ameliorer avec le departement si plusieurs resultats // ou tronquer la ville si aucun resultat } } // --------------------------------------------------------------------------- // // Filtre pour le numero de la voie // --------------------------------------------------------------------------- // function filtreNumero(&$formR, &$criteres, &$sphinx) { if (empty($formR['numVoie']) == false) { if (strstr($criteres, 'N') != false) { debugln("filtre adr_num='$formR[numVoie]'"); $sphinx->SetFilter('adr_num', array($formR['numVoie'])); } } } // --------------------------------------------------------------------------- // // Filtre pour la date de naissance // --------------------------------------------------------------------------- // function filtreDateNaiss(&$formR, &$criteres, &$sphinx) { $jj = preg_replace('/[^0-9]/', '', $formR['dirDateNaissJJ']); if ($jj < 0 || $jj > 31) { die('Jour de naissance incorrect !'); } $mm = preg_replace('/[^0-9]/', '', $formR['dirDateNaissMM']); if ($mm < 0 || $mm > 12) { die('Mois de naissance incorrect !'); } $aa = preg_replace('/[^0-9]/', '', $formR['dirDateNaissAAAA']); $annee = date('Y') - 18; if ($aa < 0 || $aa > $annee) { die('Année de naissance incorrecte !'); } if (empty($jj) == false && strstr($criteres, 'J') != false) { debugln("filtre naiss_jour='$jj'"); $sphinx->SetFilter('naiss_jour', array($jj)); } if (empty($mm) == false && strstr($criteres, 'M') != false) { debugln("filtre naiss_jour='$mm'"); $sphinx->SetFilter('naiss_mois', array($mm)); } if (empty($aa) == false) { if (strstr($criteres, 'A') != false) { debugln("filtre naiss_jour='$aa'"); $sphinx->SetFilter('naiss_annee', array($aa)); } else if (strstr($criteres, 'R') != false) { debugln("filtre naiss_jour='".($aa-5).'-'.($aa+5)."'"); $sphinx->SetFilterRange('naiss_annee', $aa - 5, $aa + 5); } } } // --------------------------------------------------------------------------- // // Premiere requete Sphinx // --------------------------------------------------------------------------- // // Premiere requete sans la gestion des mots non significatifs // et avec concatenation de tous les mots de la raison sociale // --------------------------------------------------------------------------- // function premiereRequeteSphinx(&$sphinx, &$index, &$formR, &$criteres, &$criteresSphinx, &$form2crit, $sirenValide) { filtreSiret ($formR, $criteres, $sphinx); filtreAdresse($formR, $criteres, $sphinx); filtreNumero ($formR, $criteres, $sphinx); if ($sirenValide == true) { $sphinx->SetFilter('sirenValide', array(1)); } $requete_sphinx = ''; foreach ($formR as $label => $valeur) { if ($label == 'naf' && empty($valeur) == false) { $requete_sphinx .= '@ape_etab '.$valeur.' '; } else if (empty($valeur) == false && isset($criteresSphinx[$label]) == true && strstr($criteres, $form2crit[$label]) != false) { if ($label == 'raisonSociale') { $sans_espace = str_replace(' ', '', $valeur); if ($sans_espace != $valeur) { if (strstr($valeur, '"') == false) { $valeur = '"'.$valeur.'"'; } $valeur = '('.$sans_espace.' | '.$valeur.'~2)'; } else if (strstr($valeur, '"') == false) { $valeur = '"'.$valeur.'"'; } } $requete_sphinx .= $criteresSphinx[$label].' '.$valeur.' '; } } debugln("requete='$requete_sphinx'"); if (substr($index, 0, 3) == 'ent') { $sphinx-> SetSortMode(SPH_SORT_EXTENDED, 'sirenValide DESC, rang DESC, actif DESC, siege DESC'); } else if (substr($index, 0, 3) == 'dir') { $sphinx->SetSortMode(SPH_SORT_EXTENDED, 'actif DESC'); } return $sphinx->Query($requete_sphinx, $index); } // --------------------------------------------------------------------------- // // Requete Sphinx // --------------------------------------------------------------------------- // function requeteSphinx(&$sphinx, &$index, &$formR, &$criteres, &$criteresSphinx, &$form2crit, $quorum_actif, $quorum, $sirenValide) { filtreSiret ($formR, $criteres, $sphinx); filtreAdresse($formR, $criteres, $sphinx); filtreNumero ($formR, $criteres, $sphinx); if ($sirenValide == true) { $sphinx->SetFilter('sirenValide', array(1)); } if ($quorum_actif == true) { foreach ($quorum as $label => $valeur) { if ($valeur > 1 && strstr($formR[$label], '"') == false) { $formR[$label] = '"'.$formR[$label].'"/'.($valeur-1); } } } $requete_sphinx = ''; foreach ($formR as $label => $valeur) { if ($label == 'naf' && empty($valeur) == false) { $requete_sphinx .= '@ape_etab '.$valeur.' '; } else if (empty($valeur) == false && isset($criteresSphinx[$label]) == true && strstr($criteres, $form2crit[$label]) != false) { $requete_sphinx .= $criteresSphinx[$label].' '.$valeur.' '; } } debugln("requete='$requete_sphinx'"); if (substr($index, 0, 3) == 'ent') { $sphinx-> SetSortMode(SPH_SORT_EXTENDED, 'sirenValide DESC, rang DESC, actif DESC, siege DESC'); } else if (substr($index, 0, 3) == 'dir') { $sphinx->SetSortMode(SPH_SORT_EXTENDED, 'actif DESC'); } return $sphinx->Query($requete_sphinx, $index); } // --------------------------------------------------------------------------- // // Criteres de depart // --------------------------------------------------------------------------- // function criteresDeDepart(&$formR, &$form2crit) { $criteres = ''; foreach ($form2crit as $label => $valeur) { if (empty($formR[$label]) == false) { if ($valeur == 'I') { // Dans ce cas on ne garde que le siren return 'I '; } $criteres .= $valeur; } else { $criteres .= ' '; } } return $criteres; } // --------------------------------------------------------------------------- // // Affichage du status de Sphinx // --------------------------------------------------------------------------- // function afficheStatusSphinx(&$sphinx, &$resSphinx) { if (DEBUG) { if ($resSphinx == false) { println('Query failed: '.$sphinx->GetLastError().'.'); return; } if ($sphinx->GetLastWarning()) { println('WARNING: '.$sphinx->GetLastWarning()); } println("Query retrieved $resSphinx[total]". " of $resSphinx[total_found] matches in $resSphinx[time] sec."); println('Query stats:'); if (isset ($resSphinx['words']) && is_array($resSphinx['words'])) { foreach ($resSphinx['words'] as $word => $info) { println(" '$word' found $info[hits] times". " in $info[docs] documents"); } println(''); } } } // --------------------------------------------------------------------------- // // Affichage des donnees en base // --------------------------------------------------------------------------- // function afficheDB(&$resSphinx, &$formR, &$form2crit, $table, &$base2form, $deb, $nbRep) { global $gDatabaseJO; if (isset($resSphinx['matches']) == false) { println('Aucun résultat'); return; } if ($formR['type'] == 'ent') { $requeteDB = "select *, (siren>200) AS sirenValide"; } else { $requeteDB = "select *"; } $requeteDB .= " from $table where id=".$resSphinx['matches'][0]['id']; for ($i = 1; $i + $deb < $resSphinx['total'] && $i < $nbRep; ++$i) { $requeteDB .= ' or id='.$resSphinx['matches'][$i]['id']; } if ($formR['type'] == 'ent') { $requeteDB .= ' ORDER BY sirenValide DESC, rang DESC, actif DESC, siege DESC'; } else { $requeteDB .= ' ORDER BY actif DESC'; } $requeteDB .= ' limit 0, '.$nbRep; debugln("requeteDB='$requeteDB'"); $resDB = $gDatabaseJO->query($requeteDB); $nb_res = $resDB->num_rows; for ($i = 0; $i < $nb_res; ++$i) { $ligne = $resDB->fetch_assoc(); println(); foreach ($base2form as $label => $valeur) { if (empty($formR[$valeur]) == false) { print "$form2crit[$valeur]='$ligne[$label]' "; } else { print "$form2crit[$valeur]='$ligne[$label]' "; } } } println(); } // --------------------------------------------------------------------------- // // Nombre de mots trouves dans un champ // --------------------------------------------------------------------------- // function nombreDeMots(&$res, $champ) { if (isset($res['words']) == false) { return 0; } $champ = preg_replace('/[^A-Za-z]/', ' ', $champ); $mot = explode(' ', strtolower($champ)); $n = 0; $nul = 0; foreach ($mot as $m) { if (isset($res['words'][$m]) == true) { debugln('nombre de mots: '. $m.' => '.$res['words'][$m]['hits']); if ($res['words'][$m]['hits'] == 0) { ++$nul; } ++$n; } } if ($nul > 2) { return $n - $nul + 1; } else { return $n; } } // --------------------------------------------------------------------------- // // changePass // --------------------------------------------------------------------------- // // mode et index doivent etre positionnes a chaque fois // --------------------------------------------------------------------------- // function changePass(&$pass, &$mode, &$index, &$quorumActif, &$formR) { switch ($pass) { case 1: // Pass 2 : Phonex $pass = 2; $mode = SPH_MATCH_EXTENDED2; $index = 'ent_phx'; return true; case 2: // Pass 3 : Ispell $pass = 3; $mode = SPH_MATCH_ISPELL; $index = 'ent_mns'; return true; case 3: // Pass 4 : Quorum n-1 $pass = 4; $mode = SPH_MATCH_EXTENDED2; $index = 'ent_mns'; $quorumActif = true; return true; case 4: // Pass 5 : Quorum n-2 $pass = 5; foreach ($formR as $label => $valeur) { if (preg_match('@.*"/[1-9]+@', $valeur) != false) { $n = preg_replace('@.*"/([1-9]+).*@', '$1', $valeur); if ($n > 1) { $formR[$label] = str_replace($n, $n - 1, $valeur); } } } return true; default: return false; } } // --------------------------------------------------------------------------- // // initSphinx // --------------------------------------------------------------------------- // function initSphinx(&$sphinx, $mode, $pass, $deb, $nbRep, $max) { debugln(); debugln('pass '.$pass); debugln(); $sphinx->SetMatchMode($mode); $sphinx->resetFilters(); $sphinx->SetLimits(intval($deb), $nbRep, $max); } // --------------------------------------------------------------------------- // // Criteres recherche par dirigeant // --------------------------------------------------------------------------- // function criteresDir($c, &$index) { if (substr($c, strlen($c) - 1, 1) == 'p') { $c = substr($c, 0, strlen($c) - 1); $index = 'dir'; } else { $index = 'dir_phx'; return $c.'p'; } $tab = array('NPAMJDV' => 'NPAM DV', 'NPAM DV' => 'NPA DV', 'NPA DV' => 'NPR DV', 'NPR DV' => 'NP DV', 'NP DV' => 'NPAMJD ', 'NPAMJD ' => 'NPAMJ ', 'NPAMJ ' => 'N AMJDV', 'N AMJDV' => 'N AM DV', 'N AM DV' => 'N A DV', 'N A DV' => 'N R DV', 'N R DV' => 'N DV', 'N DV' => 'N AMJD ', 'N AMJD ' => 'N AMJ ', 'N AMJ ' => ' PAMJDV', ' PAMJDV' => ' PAM DV', ' PAM DV' => ' PA DV', ' PA DV' => ' PR DV', ' PR DV' => ' P DV', ' P DV' => ' PAMJD ', ' PAMJD ' => ' PAMJ ', ' PAMJ ' => ' PAM '); if (isset($tab[$c]) == true) { $ret = $tab[$c]; } else { $ret = ''; } return $ret; } // --------------------------------------------------------------------------- // // clientSphinx // --------------------------------------------------------------------------- // function clientSphinx(&$formR) { // Formulaire $formulaire_vide = true; foreach ($formR as $label => $valeur) { if ($label != 'type' && // Ce champs ne devrait pas etre dans formR empty($valeur) == false) { $formulaire_vide = false; $formR[$label] = trim($valeur); } } if ($formulaire_vide == true) { return false; } if (DEBUG) { foreach ($formR as $label => $valeur) { println("$label = '$valeur'"); } } // Client Sphinx $sphinx = new SphinxClient(); $sphinx->SetServer(SPHINX_HOST, SPHINX_PORT); $sphinx->SetConnectTimeout(1); $sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25); $sphinx->SetArrayResult(true); return $sphinx; } // --------------------------------------------------------------------------- // // reponse // --------------------------------------------------------------------------- // function reponse(&$resSphinx, &$resDB, $criteres, $time, $formR, $form2crit, $deb, $ligneDir = array()) { $criteresRet = array(); foreach ($form2crit as $field => $letter) { if (preg_match("/$letter/", $criteres)) { if (empty($formR[$field]) == false) { $criteresRet[] = strtoupper($formR[$field]); } } } $ret['criteres'] = $criteresRet; //$ret['nbReponses'] = $resDB->num_rows; $ret['nbReponsesTotal'] = $resSphinx['total']; $ret['duree'] = $time; $decalage = false; for ($i = 0, $k = 0; $k < $resDB->num_rows || $decalage == true; ++$i) { if ($decalage == false) { $ligne = $resDB->fetch_assoc(); ++$k; } else { $decalage = false; } if ($formR['type'] == 'dir') { debugln($ligneDir[$i]['id'].' '.$ligne['id']); } if ($formR['type'] == 'dir' && $ligneDir[$i]['id'] != $ligne['id']) { for ($j = $i - 1; $j >= 0; --$j) { if ($ret['reponses'][$j]['id'] == $ligneDir[$i]['id']) { $ret['reponses'][$i] = $ret['reponses'][$j]; $decalage = true; break; } } if ($decalage != true) { debugln('erreur '.$ligneDir[$i]['id'].' != '.$ligne['id']); } } else { $ret['reponses'][$i]['id'] = $ligne['id']; if ($formR['type'] == 'dir') { //debugln("$i:$ligne[id]"); } $nom=trim($ligne['raisonSociale']); // Cas des noms vides à l'INSEE (une centaine) if ($nom=='') $nom=@preg_replace('/,.*$/','',$ligne['identite_pre']); $ret['reponses'][$i]['Pertinence'] = 100; $ret['reponses'][$i]['Siret'] = $ligne['siret']; $ret['reponses'][$i]['Siren'] = $ligne['siren']; $ret['reponses'][$i]['Nic'] = $ligne['nic']; $ret['reponses'][$i]['Siege'] = $ligne['siege']; $ret['reponses'][$i]['Nom'] = $nom; $ret['reponses'][$i]['Nom2'] = ''; $ret['reponses'][$i]['Sigle'] = $ligne['sigle']; $ret['reponses'][$i]['Enseigne'] = $ligne['enseigne']; $ret['reponses'][$i]['Adresse'] = $ligne['adr_num'].' '. $ligne['adr_typeVoie'].' '. $ligne['adr_libVoie']; $ret['reponses'][$i]['Adresse2'] = $ligne['adr_comp']; $ret['reponses'][$i]['CP'] = $ligne['adr_cp']; $ret['reponses'][$i]['Ville'] = $ligne['adr_ville']; $ret['reponses'][$i]['Tel'] = $ligne['tel']; $ret['reponses'][$i]['Fax'] = $ligne['fax']; $ret['reponses'][$i]['FJ'] = $ligne['cj']; //$ret['reponses'][$i]['FJLib'] = ; $ret['reponses'][$i]['Actif'] = $ligne['actif']; $ret['reponses'][$i]['NafEtab'] = $ligne['ape_etab']; //$ret['reponses'][$i]['NafEtabLib'] = ; $ret['reponses'][$i]['NafEnt'] = $ligne['ape_entrep']; //$ret['reponses'][$i]['NafEntLib'] = ; } if ($formR['type'] == 'dir') { // Dirigeant $ret['reponses'][$i]['DirRs'] = ''; $ret['reponses'][$i]['DirNom'] = $ligneDir[$i]['nom']; $ret['reponses'][$i]['DirPrenom'] = $ligneDir[$i]['prenom']; $ret['reponses'][$i]['DirNomUsage'] = ''; $ret['reponses'][$i]['DirDateEffet'] = ''; $ret['reponses'][$i]['DirFonction'] = $ligneDir[$i]['fonction_lib']; $ret['reponses'][$i]['DirDepart'] = ''; } } if ($formR['type'] == 'dir') { for (; $i < count($ligneDir); ++$i) { debugln($ligneDir[$i]['id'].' ==> '.$i); for ($j = $i - 1; $j >= 0; --$j) { if ($ret['reponses'][$j]['id'] == $ligneDir[$i]['id']) { $ret['reponses'][$i] = $ret['reponses'][$j]; $ret['reponses'][$i]['DirRs'] = ''; $ret['reponses'][$i]['DirNom'] = $ligneDir[$i]['nom']; $ret['reponses'][$i]['DirPrenom'] = $ligneDir[$i]['prenom']; $ret['reponses'][$i]['DirNomUsage'] = ''; $ret['reponses'][$i]['DirDateEffet'] = ''; $ret['reponses'][$i]['DirFonction'] = $ligneDir[$i]['fonction_lib']; $ret['reponses'][$i]['DirDepart'] = ''; break; } } if ($j < 0) { debugln('erreur '.$ligneDir[$i]['id'].' non trouve'); } } } if ($formR['type'] == 'ent') { $ret['pass'] = $resSphinx['pass']; } $ret['nbReponses'] = count($ret['reponses']); if (DEBUG) { print '
';
        print_r($ret);
        print '
'; } return $ret; } // --------------------------------------------------------------------------- // // Recherche par dirigeant // --------------------------------------------------------------------------- // function rechercheDir(&$formR, $deb, $nbRep, $max) { global $gDatabaseJO; // Duree totale $total_time = 0; $sphinx = clientSphinx($formR); if ($sphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => 'Formulaire vide'); } $criteresSphinx = array('nom' => '@nom', 'prenom' => '@prenom', 'ville' => '@naissance_lieu'); $form2crit = array('nom' => 'N', 'prenom' => 'P', 'dirDateNaissAAAA' => 'A', 'dirDateNaissMM' => 'M', 'dirDateNaissJJ' => 'J', 'departement' => 'D', 'ville' => 'V'); $index = 'dir'; $mode = SPH_MATCH_EXTENDED2; $pass = 0; $criteres = 'NPAMJDV'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); while (empty($criteres) == false) { debugln("criteres: $criteres"); filtreDateNaiss($formR, $criteres, $sphinx); filtreAdresse($formR, $criteres, $sphinx); $requete_sphinx = ''; foreach ($formR as $label => $valeur) { if (empty($valeur) == false && isset($criteresSphinx[$label]) == true && strstr($criteres, $form2crit[$label]) != false) { if ($label == 'prenom') { $requete_sphinx .= $criteresSphinx[$label]. ' "'.$valeur.'"/1 '; } else { $requete_sphinx .= $criteresSphinx[$label].' '.$valeur.' '; } } } debugln("requete='$requete_sphinx'"); $sphinx->SetSortMode(SPH_SORT_EXTENDED, 'actif DESC'); $resSphinx = $sphinx->Query($requete_sphinx, $index); if ($resSphinx != false) { $total_time += $resSphinx['time']; } if ($resSphinx != false && $resSphinx['total'] > 0) { break; } $criteres = criteresDir($criteres, $index); $sphinx->resetFilters(); } afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'criteres' => $criteres); } if ($resSphinx['total'] == 0) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'criteres' => $criteres); } if (DEBUG) { $base2form = array('adr_dep' => 'departement', 'nom' => 'nom', 'prenom' => 'prenom', 'naissance_nom' => 'nom', 'naissance_date' => 'dirDateNaissAAAA', 'naissance_lieu' => 'ville'); afficheDB($resSphinx, $formR, $form2crit, 'rncs_dirigeants', $base2form, $deb, $nbRep); } // Recherche des sieges if ($gDatabaseJO == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => $resSphinx['total'], 'duree' => $total_time, 'erreur' => 'Base inaccessible'); } if (isset($resSphinx['matches']) == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => $resSphinx['total'], 'duree' => $total_time, 'erreur' => 'Aucun résultat'); } $requeteDB = 'select e.id, d.nom, d.prenom, d.fonction_lib '. // d.rs, d.nomUsage, d.naissance_date, d.naissance_lieu, ' from rncs_dirigeants d, etablissements e'. ' where d.siren = e.siren and e.siege = 1 and (d.id='. $resSphinx['matches'][0]['id']; for ($i = 1; $i + $deb < $resSphinx['total'] && $i < $nbRep; ++$i) { $requeteDB .= ' or d.id='.$resSphinx['matches'][$i]['id']; } $requeteDB .= ')'; $requeteDB .= ' GROUP BY d.siren, d.id'; $requeteDB .= ' ORDER BY e.rang DESC, e.actif DESC, e.siege DESC, e.id ASC'; debugln(); debugln("requeteDB='$requeteDB'"); $resDB = $gDatabaseJO->query($requeteDB); // Reponse $ligneDir = array(); $ligne = $resDB->fetch_assoc(); $requeteDB = 'select id, CONCAT(siren,nic) AS siret, siren, nic, siege, '. 'raisonSociale, sigle, enseigne, adr_num, adr_typeVoie, adr_libVoie, '. 'adr_comp, adr_cp, adr_ville, tel, fax, cj, actif, ape_etab, '. 'ape_entrep, identite_pre from etablissements where id='.$ligne['id']; $ligneDir[0] = array('id' => $ligne['id'], 'nom' => $ligne['nom'], 'prenom' => $ligne['prenom'], 'fonction_lib' => $ligne['fonction_lib']); for ($i = 1; $i < $resDB->num_rows; ++$i) { $ligne = $resDB->fetch_assoc(); $requeteDB .= ' or id='.$ligne['id']; $ligneDir[$i] = array('id' => $ligne['id'], 'nom' => $ligne['nom'], 'prenom' => $ligne['prenom'], 'fonction_lib' => $ligne['fonction_lib']); } $requeteDB .= ' ORDER BY rang DESC, actif DESC, siege DESC, id ASC'; debugln(); debugln("requeteDB='$requeteDB'"); $resDB = $gDatabaseJO->query($requeteDB); return reponse($resSphinx, $resDB, $criteres, $total_time, $formR, $form2crit, $deb, $ligneDir); } // --------------------------------------------------------------------------- // // Recherche entreprise // --------------------------------------------------------------------------- // function rechercheEnt(&$formR, $deb, $nbRep, $max, $sirenValide = false) { global $gDatabaseJO; // Duree totale $total_time = 0; $sphinx = clientSphinx($formR); if ($sphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => 'Formulaire vide'); } $criteresSphinx = array( //'siret' => '@siren', 'raisonSociale' => '@nom', //'numVoie' => '@adr_num', //'voie' => '@(adr_typeVoie,adresse)', 'voie' => '@adresse', //'cpVille' => '@(adr_dep,adr_cp,ville)', 'ville' => '@ville', 'telFax' => '@(tel,fax)', 'naf' => '@ape_etab'); $form2crit = array('siret' => 'I', 'telFax' => 'T', 'raisonSociale' => 'S', 'enseigne' => 'E', 'prenom' => 'P', 'departement' => 'D', 'localite' => 'L', 'ville' => 'V', 'numVoie' => 'N', 'voie' => 'R'); filtreCaracteresSpeciaux($formR); // Quorum $quorum_actif = false; $quorum = array(); // Premiere requete sans la gestion des mots non significatifs // et avec concatenation de tous les mots de la raison sociale $index = 'ent'; $mode = SPH_MATCH_EXTENDED2; $pass = 0; $criteres = 'ITSEPDLVNR'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); $resSphinx = premiereRequeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, $sirenValide); afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'pass' => $pass, 'criteres' => $criteres); } $total_time += $resSphinx['time']; if ($resSphinx['total'] == 0) { debugln('Sans la gestion des mots non significatifs'); debugln(); $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, false, $quorum, $sirenValide); afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'pass' => $pass, 'criteres' => $criteres); } $total_time += $resSphinx['time']; } if ($resSphinx['total'] == 0 && isset($formR['departement']) == true) { debugln('Sans la gestion des mots non significatifs'. ' et sans la localité'); debugln(); $criteres = 'ITSEPD VNR'; $sphinx->resetFilters(); $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, false, $quorum, $sirenValide); afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'pass' => $pass, 'criteres' => $criteres); } $total_time += $resSphinx['time']; $criteres = 'ITSEPDLVNR'; } $total_premiere_requete = $resSphinx['total']; if ($total_premiere_requete == 0 || $total_premiere_requete > 500) { // "huit a huit" donne 414 $index = 'ent_mns'; // Requete sans les mots non significatifs // pour connaitre le nombre de mots trouves pour chaque champ alpha debugln('Avec la gestion des mots non significatifs'. ' et avec quorum si l\'adresse est complete'); $raisonSociale = $formR['raisonSociale']; if ((empty($formR['ville']) == false || empty($formR['departement']) == false) && empty($formR['numVoie']) == false && empty($formR['voie']) == false) { $quorum = array('raisonSociale' => 2); $quorum_actif = true; } $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, $quorum_actif, $quorum, $sirenValide); afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'pass' => $pass, 'criteres' => $criteres); } $total_time += $resSphinx['time']; $quorum_actif = false; $quorum = array(); $formR['raisonSociale'] = $raisonSociale; if ($resSphinx['total'] == 0) { $pass = 1; $criteres = 'ITSEPDLVNR'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); // Nombre de mots pour le quorum if (isset($formR['raisonSociale']) == true) { $quorum['raisonSociale'] = nombreDeMots($resSphinx, $formR['raisonSociale']); } if (isset($formR['voie']) == true) { $quorum['voie'] = nombreDeMots($resSphinx, $formR['voie']); } if (isset($formR['ville']) == true) { $quorum['ville'] = nombreDeMots($resSphinx, $formR['ville']); } } } while ($pass > 0) { // Requete Sphinx $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, $quorum_actif, $quorum, $sirenValide); afficheStatusSphinx($sphinx, $resSphinx); if ($resSphinx == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'erreur' => $sphinx->GetLastError(), 'pass' => $pass, 'criteres' => $criteres); } $total_time += $resSphinx['time']; if ($resSphinx['total'] > 0 && ($total_premiere_requete == 0 || $total_premiere_requete >= $resSphinx['total'])) { break; } if (isset($sequence) == false) { // Criteres de depart $criteres = criteresDeDepart($formR, $form2crit); debugln("criteres de depart='$criteres'"); // Sequence $sequence = nouvelleSequence($criteres); if ($sequence == array()) { debugln('fin des sequences'); if (changePass($pass, $mode, $index, $quorum_actif, $formR) == true) { $criteres = 'ITSEPDLVNR'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); $sequencePos = 0; continue; } else { break; } } $sequencePos = 0; if (DEBUG) { print "sequence='"; foreach ($sequence as $valeur) { print $valeur.' '; } println("'"); } // Pour les nouveaux criteres if (LOCAL) { $comb2crit = file('comb2crit.txt'); } else { $comb2crit = file(realpath(dirname(__FILE__)).'/comb2crit.txt'); } } // Combinaison $combinaison = nouvelleCombinaison($sequence, $sequencePos, $pass, $index, $mode); if ($combinaison == '') { debugln('fin des combinaisons'); if (changePass($pass, $mode, $index, $quorum_actif, $formR) == true) { $criteres = 'ITSEPDLVNR'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); $sequencePos = 0; continue; } else { break; } } debugln("combinaison='$combinaison'"); if (strlen($combinaison) == 3) { $combinaison = substr($combinaison, 0, 2); } // Nouveaux criteres $criteres = nouveauxCriteres($comb2crit, $combinaison); if ($criteres == '') { debugln("combinaison inconnue: '$combinaison'"); break; } debugln("nouveau criteres='$criteres'"); $sphinx->SetMatchMode($mode); $sphinx->resetFilters(); } $resSphinx['pass'] = $pass; // Reprise de la premiere requete si elle etait meilleure if ($pass > 0 && $total_premiere_requete > 0 && $total_premiere_requete < $resSphinx['total']) { $index = 'ent'; $mode = SPH_MATCH_EXTENDED2; $pass = 0; $criteres = 'ITSEPDLVNR'; initSphinx($sphinx, $mode, $pass, $deb, $nbRep, $max); $resSphinx = premiereRequeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, $sirenValide); $total_time += $resSphinx['time']; // Sans la gestion des mots non significatifs if ($resSphinx['total'] == 0) { $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, false, $quorum, $sirenValide); $total_time += $resSphinx['time']; } // Sans la gestion des mots non significatifs et sans la localité if ($resSphinx['total'] == 0 && isset($formR['departement']) == true) { $criteres = 'ITSEPD VNR'; $sphinx->resetFilters(); $resSphinx = requeteSphinx($sphinx, $index, $formR, $criteres, $criteresSphinx, $form2crit, false, $quorum, $sirenValide); $total_time += $resSphinx['time']; } $resSphinx['pass'] = $pass; } if ($resSphinx['total'] == 0) { return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => $total_time, 'pass' => $pass, 'criteres' => $criteres); } if (DEBUG) { $base2form = array('adr_dep' => 'departement', 'adr_cp' => 'localite', 'adr_num' => 'numVoie', 'adr_libVoie' => 'voie', 'adr_comp' => 'voie', 'adr_ville' => 'ville', 'raisonSociale' => 'raisonSociale', 'enseigne' => 'raisonSociale', 'sigle' => 'raisonSociale', 'identite_pre' => 'raisonSociale'); afficheDB($resSphinx, $formR, $form2crit, 'etablissements', $base2form, $deb, $nbRep); } // Reponse if ($gDatabaseJO == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => $resSphinx['total'], 'duree' => $total_time, 'erreur' => 'Base inaccessible'); } if (isset($resSphinx['matches']) == false) { return array('nbReponses' => 0, 'nbReponsesTotal' => $resSphinx['total'], 'duree' => $total_time, 'erreur' => 'Aucun résultat'); } $requeteDB = 'select id, CONCAT(siren,nic) AS siret, siren, nic, siege, '. 'raisonSociale, sigle, enseigne, adr_num, adr_typeVoie, adr_libVoie, '. 'adr_comp, adr_cp, adr_ville, tel, fax, cj, actif, ape_etab, '. 'ape_entrep, (siren>200) AS sirenValide, identite_pre'. ' from etablissements where id='.$resSphinx['matches'][0]['id']; for ($i = 1; $i + $deb < $resSphinx['total'] && $i < $nbRep; ++$i) { $requeteDB .= ' or id='.$resSphinx['matches'][$i]['id']; } $requeteDB .= ' ORDER BY sirenValide DESC, rang DESC, actif DESC, siege DESC'; debugln(); debugln("requeteDB='$requeteDB'"); $resDB = $gDatabaseJO->query($requeteDB); return reponse($resSphinx, $resDB, $criteres, $total_time, $formR, $form2crit, $deb); } // --------------------------------------------------------------------------- // // sommeDeControle // --------------------------------------------------------------------------- // function sommeDeControle($sn) { $s = 0; $n = strlen($sn); for ($i = 0; $i < $n; ++$i) { if ($i & 1) { $t = substr($sn, $n - $i - 1, 1) << 1; $s += ($t > 9)? $t - 9 : $t; } else { $s += substr($sn, $n - $i - 1, 1); } } return $s % 10; } // --------------------------------------------------------------------------- // // Verification du siret // --------------------------------------------------------------------------- // function verificationDuSiret($siret) { if (strlen($siret) == 14) { $sn = substr($siret, 0, 9); $st = $siret; } else if (strlen($siret) == 9) { $sn = $siret; $st = 0; } else { // TODO: message d'erreur et/ou correction return false; } // Verification du siren $s = sommeDeControle($sn); if ($s != 0) { // Correction du chiffre de controle $sr = (substr($sn, 8, 1) - $s + 10) % 10; $liste = array(substr($sn, 0, 8).$sr); // Transpositions for ($i = 0; $i < 8; ++$i) { $n1 = substr($sn, $i, 1); $n2 = substr($sn, $i + 1, 1); if ($n1 == $n2) { continue; } $p = ''; if ($i > 0) { $p .= substr($sn, 0, $i); } $p .= $n2; if ($i < 7) { $p .= $n1; } if ($i < 6) { $p .= substr($sn, $i + 2, 6 - $i); } if ($i & 1) { if ($i < 7) { if ($n1 >= 5) { $n1 -= 9; } if ($n2 >= 5) { $n2 -= 9; } } else { $n1 = ($n1 >= 5) ? ($n1 << 1) - 9 : ($n1 << 1); $n2 = ($n2 >= 5) ? ($n2 << 1) - 9 : ($n2 << 1); } $p .= ($sr + $n1 - $n2 + 10) % 10; } else { if ($n2 >= 5) { $n2 -= 9; } if ($n1 >= 5) { $n1 -= 9; } $p .= ($sr + $n2 - $n1 + 10) % 10; } $liste[] = $p; } // Substitutions for ($i = 0; $i < 8; ++$i) { $n = substr($sn, $i, 1); for ($j = 0; $j < 10; ++$j) { if ($j == $n) { continue; } $p = ''; if ($i > 0) { $p .= substr($sn, 0, $i); } $p .= $j; if ($i < 7) { $p .= substr($sn, $i + 1, 7 - $i); } if ($i & 1) { $n1 = ($n << 1); if ($n1 > 9) { $n1 -= 9; } $n2 = ($j << 1); if ($n2 > 9) { $n2 -= 9; } $p .= ($sr + $n1 - $n2 + 10) % 10; } else { $p .= ($sr + $n - $j + 10) % 10; } $liste[] = $p; } } return $liste; } if ($st == 0) { return false; } // Verification du siret if (sommeDeControle($st) != 0) { return array($sn); } return false; } // --------------------------------------------------------------------------- // // Recherche // --------------------------------------------------------------------------- // function recherche(&$formR, $deb = 0, $nbRep = 20, $max = 1000) { if ($formR['type'] == 'ent') { return rechercheEnt($formR, $deb, $nbRep, $max); } else if ($formR['type'] == 'dir') { return rechercheDir($formR, $deb, $nbRep, $max); } else { debugln('Type de recherche inconnu'); return array('nbReponses' => 0, 'nbReponsesTotal' => 0, 'duree' => 0, 'erreur' => 'Type de recherche inconnu'); } } ?>