webservice/includes/partenaires/classMRnvp.php
2014-12-17 15:49:06 +00:00

550 lines
24 KiB
PHP

<?
class MRnvp {
private $iDb;
private $iInsee;
public $tabDevises=array();
public $nomTronque=0;
function __construct() {
$this->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) return 'Aucune correspondance VILLE'.EOL;
if ($norme==32) return $ret[0]['libCom32'];
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;
}
}
?>