'Adresse correcte', 20 => 'Adresse correcte (Voie non reconue dans un CEDEX ou BP)', 21 => 'Adresse correcte mais numéro de facade hors borne (petite ville)', 22 => 'Adresse correcte mais numéro de facade absent (petite ville)', 23 => 'Adresse correcte mais numéro de facade hors borne (grande ville)', 24 => 'Adresse correcte mais numéro de facade absent (grande ville)', 30 => 'Voie non reconnue (petite ville)', 31 => 'Voie non reconnue (petite ville, quartier reconnu)', 40 => 'Voie absente (petite ville, quartier reconnu)', 41 => 'Voie absente (petite ville)', 50 => 'Voie non reconnue (grande ville)', 51 => 'Voie non reconnue (grande ville, quartier reconnu)', 60 => 'Voie absente (grande ville, quartier reconnu)', 61 => 'Voie absente (grande ville)', 70 => 'Voie présente mais Cp/Ville non corrigeable', 80 => 'Voie absente et Cp/Ville non corrigeable', 90 => 'Adresse à l\'étranger', ); protected $iInsee; protected $iDb; public function __construct() { $this->iDb = new Metier_Util_Db(); $this->iInsee = new Metier_Insee_MInsee($this->iDb); } /** * Initialisation du tableau privé des devises Inpi <=> ISO * @return multitype:Ambigous */ protected function getTabDevisesInpi() { $rep = $this->iDb->select('jo.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 $numDeviseInpi * @return multitype:|string */ 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 * @param unknown $adrL1 * @param unknown $adrL2 * @param unknown $adrL3 * @param unknown $adrL4 * @param unknown $adrL5 * @param unknown $adrL6 * @param string $adrL7 * @param number $norme * @param string $debug * @return multitype:string number |string|unknown */ public 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(Metier_Util_String::trimAccent($adrL1))))); $adrL[2]=$adrL2=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::trimAccent($adrL2))))); $adrL[3]=$adrL3=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::trimAccent($adrL3))))); $adrL[4]=$adrL4=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::trimAccent($adrL4))))); $adrL[5]=$adrL5=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::trimAccent($adrL5))))); $adrL[6]=$adrL6=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::trimAccent($adrL6))))); $adrL[7]=$adrL7=trim(preg_replace('/\s+/',' ',preg_replace('/[^a-z\d ]/i', ' ', strtoupper(Metier_Util_String::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); if ($cp*1>0) { $cp2=substr($cp,0,2); $ville=trim(strtr(substr($adrL6,5),array(' SAINT '=>' ST ',' SAINTE '=>' STE '))); } else { $cp=$cp2=''; $ville=trim(strtr($adrL6,array(' SAINT '=>' ST ',' SAINTE '=>' STE '))); } $ville=preg_replace('/ CEDEX\s?.*$/ui','',$ville); $tabRetI=array( 'operateurRnvp'=>'SED', '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 (cp=$cp, ville=$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'].")".PHP_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 (!$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'].")".PHP_EOL; //echo '['.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])) .'-v/s-'.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$ville)).']'.PHP_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" ); } } } 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 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 ); $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') !".PHP_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 !".PHP_EOL; $matriculeHexavia=$iRet['codeVoie']; $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; } } $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') !".PHP_EOL); //die("Plusieurs correspondances Voies pour $adrL4 $adrL6 dans cette commune ('$strAdr56') !".PHP_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) { 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, '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); return $tabRet; } /** * Tableau des abbréviations existantes par type d'abréviation * @param string $typeAbrev * @return array */ public 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']; } } } } return $tabRet; } /** * Normalise une raison sociale ou un nom * @param string $nomLong * @param number $taille * @param string $debug * @return mixed */ public 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; 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".PHP_EOL; } if (strlen($nomCourt) <= $taille) break; // 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".PHP_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".PHP_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".PHP_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".PHP_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".PHP_EOL; } if (strlen($nomCourt) <= $taille) break; $nomCourt = substr($nomCourt, 0, $taille); $this->nomTronque = 1; $passage++; } return $nomCourt; } /** * Code Insee de la commune libCom32 Libellé de la commune (Ancienne norme 32) libCom38 Libellé * @param string $codeInsee * @param number $norme * @return string */ public function getLibCommune($codeInsee, $norme = 38) { if ($norme != 32 && $norme != 38) { return 'La norme doit être 32 ou 38 caractères (38 par défaut)'.PHP_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']; } } /** * Code postal depuis le code Insee * @param string $codeInsee * @return boolean */ public function getCPCommune($codeInsee) { $ret = $this->iDb->select('villes.hexaviaVilles', "codePostal", "codeInseeCom='$codeInsee' GROUP BY codePostal",false, MYSQL_ASSOC); $nbRet = count($ret); if ($nbRet == 1) { return $ret[0]['codePostal']; } return false; } /** * * @param unknown $libelleCommune * @param string $depOuCp * @param string $debug * @return string */ public 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); $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'].")".PHP_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'].")".PHP_EOL; } if ($debug) { echo '['.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$iRet["libCom$norme"])) .'-v/s-'.trim(preg_replace('/ (1ER|2EME|3EME|\d+)/', ' ',$libelleCommune)).']'.PHP_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']; } } } return $codeCommune; } /** * * @param unknown $L1 * @param unknown $L2 * @param unknown $L3 * @param unknown $L4 * @param unknown $L5 * @param unknown $L6 * @param string $L7 */ public function normaliseAdresse76310($L1, $L2, $L3, $L4, $L5, $L6, $L7 = '') { $tDeb = microtime(1); $tabRetR = $tabRetE = array(); $cp = substr(trim($L6),0,5); $cp2 = substr($cp,0,2); $ville = trim(strtr(substr($L6,5),array(' SAINT '=>' ST ',' SAINTE '=>' STE '))); $ville = preg_replace('/ CEDEX\s?.*$/ui','',$ville); $tabRetI = array( 'operateurRnvp'=>'76310WEB', 'in_cp'=>$cp, 'in_dep'=>$cp2, 'in_ville'=>$ville, 'in_L1'=>trim($L1), 'in_L2'=>trim($L2), 'in_L3'=>trim($L3), 'in_L4'=>trim($L4), 'in_L5'=>trim($L5), 'in_L6'=>trim($L6), 'in_L7'=>trim($L7) ); $client = new SoapClient('http://www.rnvp-en-ligne.com/service_v5.asmx?wsdl'); $nbEssais = 1; $array = array ( 'pi_session' => '-1', 'pi_user' => 'SDPROD', 'pi_password' => '7631014530', 'pi_codedossier' => '0001', 'pi_numfichier' => '1', 'pi_rsoc' => utf8_encode($L1), '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 ); while(1) { try { $result = $client->Elfyweb_RNVP_Expert_V50($array); $tabRetR=array( 'L1' => $L1, 'L2' => $L2, 'L3' => strtoupper(utf8_decode($result->pio_cadrs)), 'L4' => strtoupper(utf8_decode($result->pio_adresse)), 'L5' => strtoupper(utf8_decode($result->pio_lieudit)), 'L6' => strtoupper(utf8_decode($result->pio_cpville)), 'Cp' => $result->po_cp, 'Ville' => $result->po_ville, 'Insee' => $result->po_insee, 'dureeRnvp' => round(microtime(1)-$tDeb,3), ); if (@$result->pio_pays != 'FRA') { $tabRet['L7'] = $result->pio_pays; } break; } catch (SoapFault $fault) { $nbEssais++; if ($nbEssai < 5) { continue; } $tabRetE = array( 'dureeRnvp' => round(microtime(1)-$tDeb,3), 'errRNVPcode' => 'S0', 'errRNVPlib' => "Erreur SOAP : ".print_r($fault,1)); } } $tabRet = array_merge($tabRetI,$tabRetR,$tabRetE); return $tabRet; } /** * * @param string $cqadrs * @param string $correctionDouteuse * @return number */ public function getLibQualiteAdresse76310($cqadrs, $correctionDouteuse) { switch ($cqadrs*1) { case 10: // Adresse correcte case 20: // Adresse correcte (Voie non reconue dans un CEDEX ou BP) case 21: // Adresse correcte mais numéro de facade hors borne (petite ville) case 22: // Adresse correcte mais numéro de facade absent (petite ville) case 23: // Adresse correcte mais numéro de facade hors borne (grande ville) case 24: // Adresse correcte mais numéro de facade absent (grande ville) $cqRnvpSed = 1; break; case 31: // Voie non reconnue (petite ville, quartier reconnu) case 51: // Voie non reconnue (grande ville, quartier reconnu) $cqRnvpSed = 2; break; case 30: // Voie non reconnue (petite ville) case 50: // Voie non reconnue (grande ville) $cqRnvpSed = 3; break; case 40: // Voie absente (petite ville, quartier reconnu) case 41: // Voie absente (petite ville) case 60: // Voie absente (grande ville, quartier reconnu) case 61: // Voie absente (grande ville) $cqRnvpSed = 4; break; case 70: // Voie présente mais Cp/Ville non corrigeable case 80: // Voie absente et Cp/Ville non corrigeable $cqRnvpSed = 5; break; default: $cqRnvpSed = 0; break; } if ($correctionDouteuse == 'D') { $cqRnvpSed = 0; } return $cqRnvpSed; } /** * Adresse RNVP * @param int $source * @param int $source_id * @param number $num * @return array */ public function getAdresseRnvpSource($source, $source_id, $num=0) { $ret = $this->iDb->select('villes.rnvpSources', 'id, source, source_id, num, L1rnvp, L2rnvp, L3rnvp, L4rnvp, L5rnvp, L6rnvp, L7rnvp, Pays, dateInsert, operateurRnvp, dateEnvoiRnvp, dateRetourRnvp, codeRetour, NumVoie, BisTer, TypeVoieCourt, TypeVoieLong, LibVoie, Cp, Ville, Insee, CQadrs, CorrectionImportante, CorrectionDouteuse, HexaCle, CQL3, InseeGlobal, OldInsee, IsInseeReconstitue, NumDept, IdHexavia, IdHexaposte, Iris_Rivoli, Iris_Ilot99, Iris_CodeIris, Iris_Canton, Iris_Zus, Iris_Zfu, CqIris, dateUpdate', "source=$source AND source_id=$source_id AND num=$num LIMIT 0,1",false, MYSQL_ASSOC); $tabRet = $ret[0]; $tabRet['CQadrsLib'] = $this->tabAdrCQ[$tabRet['CQadrs']]; $tabRet['CQAdrRnvp'] = $this->getLibQualiteAdresse76310($tabRet['CQadrs'], $tabRet['CorrectionDouteuse']); return $tabRet; } } ?>