iDb=new WDB(); $this->iInsee=new MInsee(); // $this->tabDevises=$this->getTabDevisesInpi(); } /** Initialisation du tableau privé des devises Inpi <=> ISO **/ private function getTabDevisesInpi() { $rep=$this->iDb->select('tabDevises', 'devInpi, devIso', 'devInpi>0', false, MYSQL_ASSOC); $tabDevises=array(); foreach($rep as $k=>$dev) $tabDevises[$dev['devInpi']*1]=$dev['devIso']; return $tabDevises; } /** Récupération du code ISO de la devise numérique de l'Inpi ** ** @param integer $devise ** @return string Devise ISO **/ public function getDeviseInpi($numDeviseInpi) { if ($numDeviseInpi*1>0 && isset($this->tabDevises[$numDeviseInpi*1])) return $this->tabDevises[$numDeviseInpi*1]; else return ''; } /** * @todo Corriger les adresses présentes dans CEDEXA (toutes les lignes) * @todo Ligne 3, acheter HEXALIGNE3 */ function normaliseAdresse($adrL1, $adrL2, $adrL3, $adrL4, $adrL5, $adrL6, $adrL7='', $norme=38, $debug=false) { $tDeb=microtime(1); $erreur=false; if ($norme<>32 && $norme<>38) { return array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'I8', 'errRNVPlib'=>'La norme doit être 32 ou 38 caractères (38 par défaut)'); } $adrL=$tabRetI=$tabRetV=$tabRetR=$tabRetE=array(); $L1tr=$L2tr=$L3tr=0; // Par défaut, les lignes ne sont pas indiquées comme tronquées $adrL[1]=$adrL1=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL1))))); $adrL[2]=$adrL2=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL2))))); $adrL[3]=$adrL3=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL3))))); $adrL[4]=$adrL4=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL4))))); $adrL[5]=$adrL5=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL5))))); $adrL[6]=$adrL6=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL6))))); $adrL[7]=$adrL7=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(trimAccent($adrL7))))); $dureeM=round(microtime(1)-$tDeb,3); if ($adrL7<>'' || $adrL7<>'FRANCE' || $adrL7<>'MONACO') $L1=$adrL1; $L2=$adrL2; // Ligne 3, acheter HEXALIGNE3 $L3=$adrL3; // Ligne 5 et 7 par défaut $L7=$adrL7; $L5=$adrL5; // Ligne 6 : CP + Localité $idAdr56=false; $tabAdr56k=$tabAdr56L=array(); $cp=substr(trim($adrL6),0,5); $cp2=substr($cp,0,2); $ville=trim(strtr(substr($adrL6,5),array(' SAINT '=>' ST ',' SAINTE '=>' STE '))); $ville=preg_replace('/ CEDEX\s?.*$/ui','',$ville); $tabRetI=array( 'in_cp'=>$cp, 'in_dep'=>$cp2, 'in_ville'=>$ville, 'in_L1'=>$adrL1, 'in_L2'=>$adrL2, 'in_L3'=>$adrL3, 'in_L4'=>$adrL4, 'in_L5'=>$adrL5, 'in_L6'=>$adrL6, 'in_L7'=>$adrL7); //$dureeM=round(microtime(1)-$tDeb,3); $tD=microtime(1); $ret=$this->iDb->select('villes.hexaviaVilles', "idAdr56, codeInseeCom, libCom$norme, codeInseeGlobal, indPluridis, libLigne5n$norme, indRoudis, codePostal, libLigne6n$norme, codeInseePre, codeMaj$norme, dateMaj$norme, MATCH (codePostal, libCom38) AGAINST ('$cp $ville' IN NATURAL LANGUAGE MODE) AS score", "(MATCH (codePostal, libCom38) AGAINST ('$cp $ville' IN NATURAL LANGUAGE MODE) OR MATCH (codePostal, libCom38) AGAINST ('$cp2 $ville' IN NATURAL LANGUAGE MODE)) ORDER BY score DESC /*OR codePostal='$cp' AND libCom$norme='$ville'*/",false, MYSQL_ASSOC); $nbRet=count($ret); if ($nbRet==0) { $tabRetE=array( 'dureeV'=> round(microtime(1)-$tD,3), 'errRNVPcode'=>'V0', 'errRNVPlib'=>'Aucune correspondance CP VILLE'); $erreur=true; } else { foreach($ret as $i=>$iRet) { if ($debug) echo "je compare '$cp' avec '".$iRet['codePostal']."' et '$ville' avec '".$iRet["libCom$norme"]."' (".$iRet['idAdr56'].", score=".$iRet['score'].")".EOL; if (($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2) && ($iRet["libCom$norme"]==$ville || preg_replace('/ 0/', ' ',$iRet["libCom$norme"])==$ville) || (strpos($iRet["libCom$norme"],$ville)>0 && $nbRet==1)) { $idAdr56=$iRet['idAdr56']; $dateMajHexavia=$iRet["dateMaj$norme"]; $codeMajHexaviaVille=$iRet["codeMaj$norme"]; $hexaViaComCod=$iRet['codeInseeCom']; $hexaViaComLib=$iRet["libCom$norme"]; $hexaViaCP=$iRet['codePostal']; $L5=$iRet["libLigne5n$norme"]; $L6=$iRet['codePostal'].' '.$iRet["libLigne6n$norme"]; $L7=''; $tabAdr56k[]=$idAdr56; $tabAdr56L['_'.$idAdr56]=array('L5'=>$L5,'L6'=>$L6,'L7'=>$L7,); $tabRetV=array( 'HexaviaDateRef'=> $dateMajHexavia, 'HexaviaCMAJVille'=>$codeMajHexaviaVille, 'HexaviaComCod'=> $hexaViaComCod, 'HexaviaComLib'=> $hexaViaComLib, 'HexaviaCP'=> $hexaViaCP, 'codeInseeGlobal'=> $iRet['codeInseeGlobal'], 'codeInseePre'=> $iRet['codeInseePre'], 'indPluridis'=> $iRet['indPluridis'], 'indRoudis'=> $iRet['indRoudis'], 'libLigne5'=> $iRet["libLigne5n$norme"], 'libLigne6'=> $iRet["libLigne6n$norme"], 'dureeV'=> round(microtime(1)-$tD,3), ); // if ($iRet['score']>17) break; } } if (!$idAdr56) { $iRet=$ret[0]; if ($debug) echo "On prend le score le + élevé s'il est > à 15 : je compare '$cp' avec '".$iRet['codePostal']."' et '$ville' avec '".$iRet["libCom$norme"]."' (".$iRet['idAdr56'].")".EOL; echo '['.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])) .'-v/s-'.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$ville)).']'.EOL; if (($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2) && ($iRet["libCom$norme"]==$ville || (substr(trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])),0,26)==trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$ville)) && $iRet['score']>15) || (strpos($iRet["libCom$norme"],$ville)>0 && $nbRet==1))) { $idAdr56=$iRet['idAdr56']; $dateMajHexavia=$iRet["dateMaj$norme"]; $hexaViaComCod=$iRet['codeInseeCom']; $hexaViaComLib=$iRet["libCom$norme"]; $hexaViaCP=$iRet['codePostal']; $L5=$iRet["libLigne5n$norme"]; $L6=$iRet['codePostal'].' '.$iRet["libLigne6n$norme"]; $L7=''; $tabAdr56k[]=$idAdr56; $tabAdr56L['_'.$idAdr56]=array('L5'=>$L5,'L6'=>$L6,'L7'=>$L7,); $tabRetV=array( 'HexaviaDateRef'=> $dateMajHexavia, 'HexaviaCMAJVille'=>$codeMajHexaviaVille, 'HexaviaComCod'=> $hexaViaComCod, 'HexaviaComLib'=> $hexaViaComLib, 'HexaviaCP'=> $hexaViaCP, 'codeInseeGlobal'=> $iRet['codeInseeGlobal'], 'codeInseePre'=> $iRet['codeInseePre'], 'indPluridis'=> $iRet['indPluridis'], 'indRoudis'=> $iRet['indRoudis'], 'libLigne5'=> $iRet["libLigne5n$norme"], 'libLigne6'=> $iRet["libLigne6n$norme"], 'dureeV'=> round(microtime(1)-$tD,3), ); } else { if ($debug) print_r($ret); $erreur=true; $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'V2', 'errRNVPlib'=>"Plusieurs correspondances CP VILLE pour $cp $ville"); //return 'Plusieurs correspondances CP VILLE'.EOL; } } } if ($erreur) return array_merge($tabRetI,$tabRetE); // Ligne 4 : Découpage N° Répétition TypeVoie et LibelléVoie $tD=microtime(1); $matriculeHexavia=false; $tabAdr=$this->iInsee->structureVoie($adrL4); $numVoie=@$tabAdr['num']; $indRep=@$tabAdr['indRep']; $typeVoie=@$tabAdr['typeVoie']; $libVoie=@$tabAdr['libVoie']; $libVoie5=trim(substr($libVoie,0,5)); $derMot=''; if (preg_match('/([a-z\d]{1,20})$/i', $libVoie, $matches2)) $derMot=trim($matches2[1]); $derMot5=trim(substr($derMot,0,5)); $strAdr56=implode("','", $tabAdr56k); $ret=$this->iDb->select('villes.hexaviaVoies', "idAdr56, codeVoie, derElemVoie, libVoie$norme, typeVoie, descLibVoie, indStand$norme, indScind, indHomo, codePostal, codeRoudis, codeMaj$norme, dateMaj$norme, numImpMin, numImpMinExt, numImpMax, numImpMaxExt, numPairMin, numPairMinExt, numPairMax, numPairMaxExt, MATCH (codeInseeCom, libVoie38) AGAINST ('$hexaViaComCod $typeVoie $libVoie' IN NATURAL LANGUAGE MODE) AS score", // "idAdr56='$idAdr56' AND (MATCH (libVoie38) AGAINST ('$libVo ie' IN NATURAL LANGUAGE MODE) OR libVoie38 LIKE '$libVoie5%' OR derElemVoie LIKE '$libVoie5%')/*AND typeVoie='$typeVoie' AND derElemVoie='$derMot'*/",false, MYSQL_ASSOC); "idAdr56 IN ('$strAdr56') AND (MATCH (codeInseeCom, libVoie38) AGAINST ('$hexaViaComCod $typeVoie $libVoie' IN NATURAL LANGUAGE MODE) OR derElemVoie LIKE '$derMot5%') ORDER BY score DESC LIMIT 0,20 /*AND typeVoie='$typeVoie' AND derElemVoie='$derMot'*/",false, MYSQL_ASSOC); // "idAdr56 IN ('$strAdr56') AND (derElemVoie='$derMot' OR libVoie38 LIKE '$libVoie5%' OR derElemVoie LIKE '$libVoie5%')",false, MYSQL_ASSOC); /*echo EOL." SELECT idAdr56, codeVoie, derElemVoie, libVoie$norme, typeVoie, descLibVoie, indStand$norme, indScind, indHomo, codePostal, codeRoudis, codeMaj$norme, dateMaj$norme, numImpMin, numImpMinExt, numImpMax, numImpMaxExt, numPairMin, numPairMinExt, numPairMax, numPairMaxExt, MATCH (codeInseeCom, libVoie38) AGAINST ('$hexaViaComCod $typeVoie $libVoie' IN NATURAL LANGUAGE MODE) AS score FROM hexaviaVoies WHERE idAdr56 IN ('$strAdr56') AND (MATCH (codeInseeCom, libVoie38) AGAINST ('$hexaViaComCod $typeVoie $libVoie' IN NATURAL LANGUAGE MODE) OR derElemVoie LIKE '$derMot5%') ORDER BY score DESC LIMIT 0,20; ".EOL; echo mysql_error().EOL; die();*/ if ($derMot=='CABROL') print_r($ret); $nbRet=count($ret); if ($nbRet==0) { // Vérifier si la commune à des voies normées 98816 $ret=$this->iDb->select( 'villes.hexaviaVoies', "codeVoie", "idAdr56 IN('$strAdr56')",false, MYSQL_ASSOC); $nbVoiesCom=count($ret); if ($nbVoiesCom==0) { $erreur=true; if ($debug) echo "Aucune Voie recensée dans cette commune ('$strAdr56') !".EOL; $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'R0', 'errRNVPlib'=>"Aucune Voie recensée dans cette commune ('$strAdr56')"); } else { $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'R1', 'errRNVPlib'=>"Aucune correspondance Voie pour '$adrL4', '$libVoie' ($nbVoiesCom voies dans la commune #$idAdr56)"); } return array_merge($tabRetI,$tabRetV,$tabRetE); } else { foreach($ret as $i=>$iRet) { $libVoieRet=preg_replace('/^[A-Z]{1,4}\s+/','', $iRet["libVoie$norme"]); if ($debug) echo "je compare '$typeVoie $libVoie' avec '".$iRet["typeVoie"]." $libVoieRet' ainsi que '$derMot' avec '". $iRet['derElemVoie']."'"; if ($iRet['typeVoie']==$typeVoie && ($iRet["libVoie$norme"]==$libVoie || $iRet['derElemVoie']==$derMot || substr($iRet['derElemVoie'],0,5)==$derMot5)) { // echo ' OK'; $idAdr56=$iRet['idAdr56']; $L4=preg_replace('/\s+/', ' ', trim($numVoie.' '.$indRep.' '.$iRet["libVoie$norme"])); $L4=preg_replace('/^0+/','',$L4); $hexaViaVoie=$iRet["libVoie$norme"]; if (strlen($L4)>$norme) return "Taille de la ligne 4 générée en sortie plus longue que $norme !".EOL; $matriculeHexavia=$iRet['codeVoie']; /* if ($matriculeHexavia=='00146667') { echo "L4=".$adrL4.EOL; echo "TypeVoie=$typeVoie".EOL; echo "TypeVoie=$libVoie (Tronqué=$libVoie5".EOL; echo "DernierMot=$derMot (Tronqué=$derMot5)".EOL; print_r($ret); die(); }*/ $codeRoudis=$iRet['codeRoudis']; $L5=$tabAdr56L['_'.$idAdr56]['L5']; $L6=$tabAdr56L['_'.$idAdr56]['L6']; $L7=$tabAdr56L['_'.$idAdr56]['L7']; // Si c'est le meilleur score trouvé on sort if ($iRet['score']>17 && isset($ret[$i+1]) && $iRet['score']>$ret[$i+1]['score']) break; } } /* if (($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2) && ($iRet["libCom$norme"]==$ville || preg_replace('/ 0/', ' ',$iRet["libCom$norme"])==$ville) || (strpos($iRet["libCom$norme"],$ville)>0 && $nbRet==1)) { $idAdr56=$iRet['idAdr56']; $dateMajHexavia=$iRet["dateMaj$norme"]; $codeMajHexaviaVille=$iRet["codeMaj$norme"]; $hexaViaComCod=$iRet['codeInseeCom']; $hexaViaComLib=$iRet["libCom$norme"]; $hexaViaCP=$iRet['codePostal']; $L5=$iRet["libLigne5n$norme"]; $L6=$iRet['codePostal'].' '.$iRet["libLigne6n$norme"]; $L7=''; $tabAdr56k[]=$idAdr56; $tabAdr56L['_'.$idAdr56]=array('L5'=>$L5,'L6'=>$L6,'L7'=>$L7,); $tabRetV=array( 'HexaviaDateRef'=> $dateMajHexavia, 'HexaviaCMAJVille'=>$codeMajHexaviaVille, 'HexaviaComCod'=> $hexaViaComCod, 'HexaviaComLib'=> $hexaViaComLib, 'HexaviaCP'=> $hexaViaCP, 'codeInseeGlobal'=> $iRet['codeInseeGlobal'], 'codeInseePre'=> $iRet['codeInseePre'], 'indPluridis'=> $iRet['indPluridis'], 'indRoudis'=> $iRet['indRoudis'], 'libLigne5'=> $iRet["libLigne5n$norme"], 'libLigne6'=> $iRet["libLigne6n$norme"], ); if ($iRet['score']>17) break; } } if (!$idAdr56) { $iRet=$ret[0]; if ($debug) echo "On prend le score le + élevé s'il est > à 15 : je compare '$cp' avec '".$iRet['codePostal']."' et '$ville' avec '".$iRet["libCom$norme"]."' (".$iRet['idAdr56'].")".EOL; echo '['.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])) .'-v/s-'.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$ville)).']'.EOL; if (($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2) && ($iRet["libCom$norme"]==$ville || (substr(trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])),0,26)==trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$ville)) && $iRet['score']>15) || (strpos($iRet["libCom$norme"],$ville)>0 && $nbRet==1))) { */ $dureeR=round(microtime(1)-$tD,3); if (!$matriculeHexavia) { if ($debug) print_r($ret); if ($debug) echo ("Plusieurs correspondances Voies pour $adrL4 $adrL6 dans cette commune ('$strAdr56') !".EOL); //die("Plusieurs correspondances Voies pour $adrL4 $adrL6 dans cette commune ('$strAdr56') !".EOL); $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'R2', 'errRNVPlib'=>"Plusieurs correspondances Voies pour $adrL4 $adrL6 dans cette commune ('$strAdr56')"); return array_merge($tabRetI,$tabRetV,$tabRetE); } } if (!$matriculeHexavia && @strlen($L4)==0) $L4=$adrL4; $tD=microtime(1); $tabLen=$tabMaxLen=array(); $tabLen[1]=strlen($L1); if ($tabLen[1]>$norme) { $L1=$this->normaliseRS($L1, $norme); if ($this->nomTronque==1) $L1tr=1; $tabLen[1]=strlen($L1); if ($tabLen[1]>$norme) $tabMaxLen[]=1; } $tabLen[2]=strlen($L2); if ($tabLen[2]>$norme) { $L2=$this->normaliseRS($L2, $norme); if ($this->nomTronque==1) $L2tr=1; $tabLen[2]=strlen($L2); if ($tabLen[2]>$norme) $tabMaxLen[]=2; } $tabLen[3]=strlen($L3); if ($tabLen[3]>$norme) { $L3=$this->normaliseRS($L3, $norme); if ($this->nomTronque==1) $L3tr=1; $tabLen[3]=strlen($L3); if ($tabLen[3]>$norme) $tabMaxLen[]=3; } $tabLen[4]=strlen($L4); if ($tabLen[4]>$norme) $tabMaxLen[]=4; $tabLen[5]=strlen($L5); if ($tabLen[5]>$norme) $tabMaxLen[]=5; $tabLen[6]=strlen($L6); if ($tabLen[6]>$norme) $tabMaxLen[]=6; $tabLen[7]=strlen($L7); if ($tabLen[7]>$norme) $tabMaxLen[]=7; $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'00', 'errRNVPlib'=>"Normalisation OK"); if (count($tabMaxLen)>0) { foreach($tabMaxLen as $j) { echo "La ligne n°$j fait ".$tabLen[$j]." caractères : '".$adrL[$j]."'".EOL; } if ($j>1) { $tabRetE=array( 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'errRNVPcode'=>'O0', 'errRNVPlib'=>"Une des lignes fait plus de $norme caractères !"); } } $dureeN=round(microtime(1)-$tD,3); $tabRetR=array( 'L1'=>$L1, 'L2'=>$L2, 'L3'=>$L3, 'L4'=>$L4, 'L5'=>$L5, 'L6'=>$L6, 'L7'=>$L7, 'L1_tr'=>$L1tr, 'L2_tr'=>$L2tr, 'L3_tr'=>$L3tr, /* 'L4_tr'=>$L4tr, 'L5_tr'=>$L5tr, 'L6_tr'=>$L6tr, 'L7_tr'=>$L7tr,*/ 'HexaVia56'=>$idAdr56, 'HexaViaVoie'=>$hexaViaVoie, 'HexaViaMat'=>$matriculeHexavia, 'RoudisId'=>$codeRoudis, 'dureeR'=>$dureeR, 'dureeN'=>$dureeN, 'dureeRnvp'=>round(microtime(1)-$tDeb,3), 'dureeM'=>$dureeM*1.0, ); $tabRet=array_merge($tabRetI,$tabRetV,$tabRetR,$tabRetE); //print_r($tabRet); return $tabRet; } /** Retourne le tableau des abbréviations existantes par type d'abréviation */ function getAbreviations($typeAbrev) { $tabRet=array(); if ($typeAbrev=='P') { $ret=$this->iDb->select('villes.tabPrenoms', "prenom", "LENGTH(prenom)>3 AND nbTot>0 ORDER BY LENGTH(prenom) DESC",false, MYSQL_ASSOC); foreach($ret as $iRet) { $tabTmp=explode('-',$iRet['prenom']); $tabTmp2=array(); foreach($tabTmp as $subPrenom) $tabTmp2[]=substr($subPrenom,0,1); $tabRet[$iRet['prenom']]=implode('-', $tabTmp2); } } else { $ret=$this->iDb->select('villes.tabAbreviations', "abrCode, abrLib", "abrType='$typeAbrev' AND dateSuppr=0 AND idSuppr=0 ORDER BY LENGTH(abrLib) DESC, LENGTH(abrCode) ASC",false, MYSQL_ASSOC); foreach($ret as $iRet) { $tabTmp=explode('/', $iRet['abrLib']); foreach($tabTmp as $abrLib) { if ($typeAbrev=='A') $tabRet[$abrLib]=''; else $tabRet[$abrLib]=$iRet['abrCode']; } } } //print_r($tabRet);die(); return $tabRet; } /** Normalise une raison sociale ou un nom **/ function normaliseRS($nomLong, $taille=38, $debug=false) { $nomCourt=preg_replace('/[^A-Z0-9%\'\"\-&\*\/\s]/','',trim(strtoupper($nomLong))); $tabMots=split("[^[:alpha:]]+", $nomCourt); $passage=0; $this->nomTronque=0; echo $nomCourt.EOL; while (strlen($nomCourt)>$taille) { // 1. Remplacement des Libellés de Voies par leurs code Voie $tabTmp=$this->getAbreviations('V'); foreach ($tabTmp as $lib=>$abr) { $nomCourt=trim(str_replace(" $lib".'ES ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'E ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'S ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib ", ' '.$abr.' ', " $nomCourt ")); if (strlen($nomCourt)<=$taille) break; } if ($debug) echo "1-Voies=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; //print_r($tabMots); // 2. Remplacement des Titres par leurs abréviation $tabTmp=$this->getAbreviations('T'); foreach ($tabTmp as $lib=>$abr) { $nomCourt=trim(str_replace(" $lib".'ES ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'E ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'S ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib ", ' '.$abr.' ', " $nomCourt ")); if (strlen($nomCourt)<=$taille) break; } if ($debug) echo "2a-Titres=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; // 2. Remplacement des Formes Juridiques $tabTmp=$this->getAbreviations('J'); foreach ($tabTmp as $lib=>$abr) $nomCourt=trim(str_replace(" $lib ", ' '.$abr.' ', " $nomCourt ")); if ($debug) echo "2b-FJ=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; // 4. Suppression des articles $tabTmp=$this->getAbreviations('A'); foreach ($tabTmp as $lib=>$abr) { if (strpos($lib,"'")>0) $nomCourt=trim(str_replace(' '.$lib, ' ', " $nomCourt ")); else $nomCourt=trim(str_replace(" $lib ", ' ', " $nomCourt ")); if (strlen($nomCourt)<=$taille) break; } if ($debug) echo "4-Articles=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; // 3. Remplacement des Prénoms par leurs initiales $tabTmp=$this->getAbreviations('P'); foreach ($tabTmp as $lib=>$abr) { $nomCourt=trim(str_replace(" $lib ", ' '.$abr.' ', " $nomCourt ")); if (strlen($nomCourt)<=$taille) break; } if ($debug) echo "3-Prenoms=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; $tabTmp=$this->getAbreviations('N'); foreach ($tabTmp as $lib=>$abr) { $nomCourt=trim(str_replace(" $lib".'ES ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'E ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib".'S ', ' '.$abr.' ', " $nomCourt ")); $nomCourt=trim(str_replace(" $lib ", ' '.$abr.' ', " $nomCourt ")); if (strlen($nomCourt)<=$taille) break; } if ($debug) echo "5-Autres Noms=$nomCourt".EOL; if (strlen($nomCourt)<=$taille) break; $nomCourt=substr($nomCourt,0,$taille); $this->nomTronque=1; //die($nomCourt); /** @todo A finir Tronquer ou abréger dans cette ordre - type de voie - titres - initiale du prénom - supprimez les articles (mais pas les particules dans un nom propre) - tronquer à 4 caractères les types de voie non normalisés - tronquer les extensions de voie - réduire le nom de la voie en supprimant les mots de la gauche vers la droite Gérer les pluriels pour les voies, nom, titres, et formes juridiques **/ $passage++; } return $nomCourt; } // Code Insee de la commune libCom32 Libellé de la commune (Ancienne norme 32) libCom38 Libellé function getLibCommune($codeInsee, $norme=38) { if ($norme<>32 && $norme<>38) { return 'La norme doit être 32 ou 38 caractères (38 par défaut)'.EOL; } $ret=$this->iDb->select('villes.hexaviaVilles', "libCom32 , libCom38", "codeInseeCom='$codeInsee' LIMIT 0,1",false, MYSQL_ASSOC); $nbRet=count($ret); if ($nbRet==0 && $codeInsee>99000) { $codePaysInsee=substr($codeInsee,2,3); $ret=$this->iDb->select('jo.tabPays', "SUBSTRING(libPays,1,32) AS libCom32, SUBSTRING(libPays,1,38) AS libCom38", "codePaysInsee='$codeInsee' ORDER BY dependance ASC LIMIT 0,1",false, MYSQL_ASSOC); $nbRet=count($ret); } if ($nbRet==0) return 'Aucune correspondance VILLE'; elseif ($norme==32) return $ret[0]['libCom32']; else return $ret[0]['libCom38']; } function getCodCommune($libelleCommune, $depOuCp='', $debug=false) { $norme=38; $codeCommune=false; $cp=$depOuCp; $cp2=substr($cp,0,2); $ret=$this->iDb->select('villes.hexaviaVilles', "idAdr56, codeInseeCom, libCom$norme, codeInseeGlobal, indPluridis, libLigne5n$norme, indRoudis, codePostal, libLigne6n$norme, codeInseePre, codeMaj$norme, dateMaj$norme, MATCH (codePostal, libCom38) AGAINST ('$depOuCp $libelleCommune' IN NATURAL LANGUAGE MODE) AS score", "MATCH (codePostal, libCom38) AGAINST ('$depOuCp $libelleCommune' IN NATURAL LANGUAGE MODE) ORDER BY score DESC",false, MYSQL_ASSOC); // print_r($ret); $nbRet=count($ret); if ($nbRet==0) return false; else { foreach($ret as $i=>$iRet) { if ($debug) echo "je compare '$depOuCp' avec '".$iRet['codePostal']."' et '$libelleCommune' avec '".$iRet["libCom$norme"]."' (".$iRet['idAdr56'].", score=".$iRet['score'].")".EOL; if (($depOuCp<>'' && ($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2)) && ($iRet["libCom$norme"]==$libelleCommune || preg_replace('/ 0/', ' ',$iRet["libCom$norme"])==$libelleCommune) || (strpos($iRet["libCom$norme"],$libelleCommune)>0 && $nbRet==1)) { $codeCommune=$iRet['codeInseeCom']; if ($iRet['score']>17) break; } } if (!$codeCommune) { $iRet=$ret[0]; if ($debug) echo "On prend le score le + élevé s'il est > à 15 : je compare '$cp' avec '".$iRet['codePostal']."' et '$libelleCommune' avec '".$iRet["libCom$norme"]."' (".$iRet['idAdr56'].")".EOL; if ($debug) echo '['.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])) .'-v/s-'.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$libelleCommune)).']'.EOL; if (($depOuCp<>'' && ($iRet['codePostal']==$cp || substr($iRet['codePostal'],0,2)==$cp2)) && ($iRet["libCom$norme"]==$libelleCommune || (substr(trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])),0,26)==trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$libelleCommune)) && $iRet['score']>15) || (strpos($iRet["libCom$norme"],$libelleCommune)>0 && $nbRet==1))) { $codeCommune=$iRet['codeInseeCom']; } } //die("Code commune de $libelleCommune ($depOuCp) = $codeCommune".EOL); } return $codeCommune; } function normaliseAdresse76310($L1,$L2,$L3,$L4,$L5,$L6,$L7='') { //ini_set('soap.wsdl_cache_enabled', 0); $client = new SoapClient('http://www.rnvp-en-ligne.com/service.asmx?wsdl'); $array = array ( 'pi_session' => '-1', 'pi_user' => 'SDPROD', 'pi_password' => '7631014530', 'pi_codedossier' => '0001', 'pi_numfichier' => '1', 'pi_rsoc' => utf8_encode($L1), //'pio_civ' => '', //'pio_nom' => '', //'pio_prenom' => '', 'pio_cnom' => utf8_encode($L2), // Ligne 2 'pio_cadrs' => utf8_encode($L3), // Ligne 3 'pio_adresse' => utf8_encode($L4), // Ligne 4 'pio_lieudit' => utf8_encode($L5), // Ligne 5 'pio_cpville' => utf8_encode($L6), // Ligne 6 'pio_pays' => utf8_encode($L7), // Ligne 7 /* 'po_tnp' => '', 'po_sex' => '', 'po_civlong' => '', 'po_cp' => '', 'po_ville' => '', 'po_insee' => '', 'po_cqtnp' => '', 'po_cqadrs' => '', 'po_risquerestru' => '', 'po_poidsmodif' => '', 'po_rejet' => '', 'po_etranger' => ''*/ ); $result = $client->Elfyweb_RNVP_Standard($array); return ($result); } } ?>