array('risque'=>0,'type'=>'OK', 'libInt'=>'Néant', 'libExt'=>'Aucune difficulté significative ne nous a été signalée'), '_10'=>array('risque'=>3,'type'=>'IP', 'libInt'=>'Impayé BDF', 'libExt'=>"A surveiller. Présence d'impayé(s)"), '_11'=>array('risque'=>3,'type'=>'IP', 'libInt'=>'Retard de paiement - Prorogation', 'libExt'=>'A suivre. Retard(s) de paiement(s) signalé(s)'), '_12'=>array('risque'=>3,'type'=>'IP', 'libInt'=>'Impayé Groupe Facto', 'libExt'=>"A surveiller. Présence d'impayé(s)"), '_13'=>array('risque'=>3,'type'=>'IP', 'libInt'=>'Impayé BDF (sup. à limite)', 'libExt'=>"A surveiller. Présence d'impayé(s)"), '_15'=>array('risque'=>3,'type'=>'PR', 'libInt'=>'PRIVILEGES URSSAF', 'libExt'=>'A surveiller. Présence de privilèges'), '_16'=>array('risque'=>3,'type'=>'PR', 'libInt'=>'AUTRES PRIVILEGES', 'libExt'=>'A surveiller. Présence de Privilèges'), '_20'=>array('risque'=>4,'type'=>'BL', 'libInt'=>'LIQUIDATION JUDICIAIRE', 'libExt'=>'Liquidation Judiciaire'), '_21'=>array('risque'=>1,'type'=>'BC', 'libInt'=>'CESSATION D\'ACTIVITE', 'libExt'=>'Cessation Activité'), '_22'=>array('risque'=>1,'type'=>'BD', 'libInt'=>'RADIATION RCS', 'libExt'=>'Radiation du RCS'), '_23'=>array('risque'=>1,'type'=>'BG', 'libInt'=>'LOCATION GERANCE', 'libExt'=>'Prise en location Gérance'), '_24'=>array('risque'=>2,'type'=>'RG', 'libInt'=>'GROUPE EN DIFFICULTE', 'libExt'=>'A suivre. Entreprise(s) du groupe signalée(s) en difficulté(s)'), '_25'=>array('risque'=>2,'type'=>'DEF', 'libInt'=>'INFORMATIONS NEGATIVES', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_26'=>array('risque'=>4,'type'=>'BP', 'libInt'=>'PLAN DE CESSION / DE REDRESSEMENT ', 'libExt'=>'Plan de cession/redressement'), '_27'=>array('risque'=>4,'type'=>'BR', 'libInt'=>'REDRESSEMENT JUDICIAIRE', 'libExt'=>'Redressement Judiciaire'), '_28'=>array('risque'=>4,'type'=>'BH', 'libInt'=>'HOMOLOGATION CONCILIATION / REG.AMIABLE', 'libExt'=>'Conciliation, Homologation ou règlement amiable'), '_29'=>array('risque'=>1,'type'=>'BF', 'libInt'=>'FUSION - ABSORPTION', 'libExt'=>'Fusion/Absorption'), '_30'=>array('risque'=>3,'type'=>'IP', 'libInt'=>'MAUVAISE COTE BDF : .8 ou .9', 'libExt'=>"Présence d'impayé(s)"), '_31'=>array('risque'=>1,'type'=>'TC', 'libInt'=>'CESSATION ANNONCEE', 'libExt'=>'Fin d\'activité programmée'), '_33'=>array('risque'=>4,'type'=>'BS', 'libInt'=>'PROCEDURE DE SAUVEGARDE JUGEMENT', 'libExt'=>'Procédure de Sauvegarde'), '_34'=>array('risque'=>4,'type'=>'BV', 'libInt'=>'PLAN DE SAUVEGARDE', 'libExt'=>'Plan de sauvegarde'), '_35'=>array('risque'=>2,'type'=>'DEF', 'libInt'=>'ANALYSE FINANCIERE NEGATIVE', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_36'=>array('risque'=>2,'type'=>'DEF', 'libInt'=>'BILAN NEGATIF', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_37'=>array('risque'=>2,'type'=>'DEF', 'libInt'=>'TRESORERIE SERREE', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_39'=>array('risque'=>2,'type'=>'DEF', 'libInt'=>'PREVISIONS NEGATIVES', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_43'=>array('risque'=>2,'type'=>'LC', 'libInt'=>'LC SFAC', 'libExt'=>"A suivre. Garantie d'assurance crédit limitée"), '_45'=>array('risque'=>2,'type'=>'LC', 'libInt'=>'REFUS SFAC DOM-TOM', 'libExt'=>"A suivre. Garantie d'assurance crédit limitée"), // '_47'=>array('risque'=>2,'type'=>'LC', 'libInt'=>'LISTE CONFIDENTIELLE LEASER', 'libExt'=>"A suivre. Garantie d'assurance crédit limitée"), '_50'=>array('risque'=>2,'type'=>'KO', 'libInt'=>'LIENS AVEC UNE ORGANISATION TERRORISTE', 'libExt'=>'Attention, liens internationaux très risqués'), // Nouveaux regroupements GE '_I' =>array('risque'=>3,'type'=>'IP', 'libInt'=>'Impayés', 'libExt'=>"A surveiller. Présence d'impayé(s) dans les 12 derniers mois"), '_P' =>array('risque'=>3,'type'=>'PR', 'libInt'=>'PRIVILEGES', 'libExt'=>'A surveiller. Présence de privilèges dans les 24 derniers mois'), '_D' =>array('risque'=>2,'type'=>'DEF', 'libInt'=>'PREVISIONS NEGATIVES', 'libExt'=>'A suivre. Informations terrain récentes négatives'), '_T' =>array('risque'=>2,'type'=>'LC', 'libInt'=>'LC Quelconque', 'libExt'=>"Nombreuses demandes d'avis de crédit"), ); // private $siren=0; // private $tabPaiements=array(); function __construct() { $this->iDb=new WDB('sdv1'); } function __destruct() { } public function setTypeFic($typeFic) { $this->typeFlux=$typeFic; } public function readFic($a) { switch ($this->typeFlux) { case 0: // Acheteur $tab=array( 'NUMACH'=> trim(substr($a, 0, 6)), 'SIRENE'=> trim(substr($a, 6, 9)), 'RAISOC'=> trim(substr($a, 15, 35)), 'NUMVOI'=> trim(substr($a, 50, 4)), 'TYPVOI'=> trim(substr($a, 54, 3)), 'LIBVOI'=> trim(substr($a, 57, 30)), 'VILLE' => trim(substr($a, 87, 26)), 'CODPOS'=> trim(substr($a,113, 5)), 'FILLER'=> trim(substr($a,118, 2))); break; case 1: // CS /*$tab=array( 'DATMAJ1'=> WDate::dateT('ymd','Y-m-d', substr($a, 0, 6)), 'NUMGFH'=> trim(substr($a, 6, 6)), 'CSAVAN'=> trim(substr($a, 12, 2)), 'CSAPRE'=> trim(substr($a, 14, 2)), 'INDAUT'=> trim(substr($a, 16, 1)), 'CODUTI'=> trim(substr($a, 17, 6)), 'INIMAJ'=> trim(substr($a, 23, 3)), 'ANAACH'=> trim(substr($a, 25, 2)), 'ANAPOR'=> trim(substr($a, 27, 2)));*/ $tab=array( 'siren' => trim(substr($a, 0, 9)), 'cs' => trim(substr($a, 9, 2)), 'dateFin'=> trim(substr($a, 11, 8))); break; case 2: // Paiements $tab=array( 'NUMACH'=> trim(substr($a, 0, 6)), 'DATPIE'=> substr($a, 6, 8), 'DATECH'=> substr($a, 14, 8), 'DATPAI'=> substr($a, 22, 8), 'MNTPIE'=> trim(substr($a, 30, 13)), 'MNTFRF'=> trim(substr($a, 43, 13)), 'MNTLIT'=> trim(substr($a, 56, 13)), 'CODDEV'=> trim(substr($a, 69, 3))); break; } return $tab; } public function getCoteSpeciale($siren) { $ret=$this->iDb->select( 'ge_cs2', 'siren, cs, dateFin, dateInsert, dateConf', "siren=$siren ORDER BY dateConf DESC, dateInsert DESC", false, MYSQL_ASSOC); $tabRet=array(); foreach ($ret as $i=>$tabCS) { $dateEven=$tabCS['dateConf']; if ($dateEven=='0000-00-00') $dateEven=$tabCS['dateInsert']; $tabRet[]=array('DateEven' => $dateEven, 'DateFin' => $tabCS['dateFin'], 'CoteCS' => $tabCS['cs'], // 'CoteCSpre' => $tabCS['CSAVAN'], 'LibCS' => $this->tabInfoCS['_'.$tabCS['cs']]['libExt'], // 'LibCSpre' => $this->tabInfoCS[$tabCS['CSAVAN']*1]['libExt'], 'NivRisque' => $this->tabInfoCS['_'.$tabCS['cs']]['risque'], //'NivRisquePre' => $this->tabInfoCS[$tabCS['CSAVAN']*1]['risque'], 'CodeRisque' => $this->tabInfoCS['_'.$tabCS['cs']]['type'], ); } return $tabRet; } public function getCoteSpecialeOld($siren) { $ret=$this->iDb->select( 'ge_cs c LEFT JOIN ge_acheteurs a ON a.NUMACH=c.NUMGFH', 'DATMAJ1, NUMGFH, CSAVAN, CSAPRE, SIRENE', "a.SIRENE=$siren ORDER BY a.SIRENE ASC, c.DATMAJ1 DESC", false, MYSQL_ASSOC); $tabRet=array(); foreach ($ret as $i=>$tabCS) { $tabRet[]=array('DateEven' => $tabCS['DATMAJ1'], 'CoteCS' => $tabCS['CSAPRE'], 'CoteCSpre' => $tabCS['CSAVAN'], 'LibCS' => $this->tabInfoCS[$tabCS['CSAPRE']*1]['libExt'], 'LibCSpre' => $this->tabInfoCS[$tabCS['CSAVAN']*1]['libExt'], 'NivRisque' => $this->tabInfoCS[$tabCS['CSAPRE']*1]['risque'], 'NivRisquePre' => $this->tabInfoCS[$tabCS['CSAVAN']*1]['risque'], 'CodeRisque' => $this->tabInfoCS[$tabCS['CSAPRE']*1]['type'], ); } return $tabRet; } public function getPaiements($siren, $echelle='mois') { if ($echelle=='jour') $strGroupBy="GROUP BY p.DATPIE "; elseif ($echelle=='' || $echelle=='mois') $strGroupBy="GROUP BY mois HAVING nbPieces>2 "; elseif ($echelle=='trim') $strGroupBy="GROUP BY trimestre HAVING nbPieces>2 "; else // En mois par défaut $strGroupBy="GROUP BY mois HAVING nbPieces>2 "; $ret=$this->iDb->select( 'ge_paiements p LEFT JOIN ge_acheteurs a ON a.NUMACH=p.NUMACH', "p.NUMACH, DATE_FORMAT(p.DATPIE, '%Y-%m') AS mois, CONCAT(DATE_FORMAT(p.DATPIE,'%Y'),'-',IF(DATE_FORMAT(p.DATPIE,'%m')<4,1,IF(DATE_FORMAT(p.DATPIE,'%m')<7,2,IF(DATE_FORMAT(p.DATPIE,'%m')<10,3,4)))) AS trimestre, count(*) AS nbPieces, AVG(DATEDIFF(NOW(), p.DATECH)) AS nbJourRetard, AVG(DATEDIFF(p.DATPAI, p.DATECH)) AS nbJourPaiement, ROUND(AVG(DATEDIFF(NOW(), p.DATECH) - DATEDIFF(p.DATPAI, p.DATECH))) AS nbJourMoyens, IF(AVG(DATEDIFF(NOW(), p.DATECH) - DATEDIFF( p.DATPAI, p.DATECH ) ) <6, 0, if( AVG( DATEDIFF( NOW( ) , p.DATECH ) - DATEDIFF( p.DATPAI, p.DATECH ) ) <36, 30, if( AVG( DATEDIFF( NOW( ) , p.DATECH ) - DATEDIFF( p.DATPAI, p.DATECH ) ) <66, 60, if( AVG( DATEDIFF( NOW( ) , p.DATECH ) - DATEDIFF( p.DATPAI, p.DATECH ) ) <96, 90, 120 ) ) ) ) AS nbJours, SUM(p.MNTPIE) AS mtPieces, SUM(p.MNTFRF) AS mtPaiements, SUM(p.MNTLIT) AS mtLitiges, p.CODDEV, a.SIRENE, a.RAISOC, a.CODPOS, a.VILLE", "a.SIRENE=$siren AND DATEDIFF(NOW(),p.DATECH)<736 AND p.DATECH$tabPai) { $nbJoursMoyen=$tabPai['nbJourRetard']-$tabPai['nbJourPaiement']; if ($nbJoursMoyen<6) $tranche=0; elseif ($nbJoursMoyen<36) $tranche=30; elseif ($nbJoursMoyen<66) $tranche=60; elseif ($nbJoursMoyen<96) $tranche=90; elseif ($nbJoursMoyen<126) $tranche=120; elseif ($nbJoursMoyen<156) $tranche=150; else $tranche=180; $tabRet[]=array('trimestre' => $tabPai['trimestre'], 'mois' => $tabPai['mois'], 'nbPieces' => $tabPai['nbPieces'], 'nbJourRetard' => $tabPai['nbJourRetard'], 'nbJourPaiement'=> $tabPai['nbJourPaiement'], 'nbJourMoyen' => $nbJoursMoyen, 'nbJourMoyen2' => $tabPai['nbJourMoyens'], 'tranchePaiement'=>$tranche, 'tranchePaie90' =>$tabPai['nbJours'], 'mtPieces' => $tabPai['mtPieces'], 'mtPaiements' => $tabPai['mtPaiements'], 'mtLitiges' => $tabPai['mtLitiges'], 'devise' => $tabPai['CODDEV'], ); } //$this->tabPaiements=$tabRet; return $tabRet; } public function getProfilPayeur($siren) { if ($siren<1000) return ''; $libProfil=''; /*if ($this->siren==$siren) $tabPaie=$this->tabPaiements; else*/ $tabPaie=$this->getPaiements($siren); if (count($tabPaie)>=3) { $tabProfil=array(); $paie_min=180; $paie_max=$totFactures=$totPaiements=$totLitiges=0; foreach ($tabPaie as $i=>$tabPai) { if ($i==0) { $this->risqueImpayeMois=$tabPai['mois']; // Dernier délai de paiement en jour $this->DELAIPAY=$tabPai['tranchePaiement']; } elseif ($this->DELAIPAYp=='' && $tabPai['tranchePaiement']<>$this->DELAIPAY ) { $this->DELAIPAYp=$tabPai['tranchePaiement']; $this->DELAIPAY_MMAA=$tabPai['mois']; } $tabProfil[$i]=$tabPai['tranchePaiement']; $totFactures+=$tabPai['mtPieces']; $totPaiements+=$tabPai['mtPaiements']; $totLitiges+=$tabPai['mtLitiges']; if ($tabPai['tranchePaiement']<$paie_min) $paie_min=$tabPai['tranchePaiement']; if ($tabPai['tranchePaiement']>$paie_max) $paie_max=$tabPai['tranchePaiement']; } $tauxLitige=$totLitiges/$totFactures; if ($tauxLitige>=0.5) $libProfil.='Litiges très importants. '; elseif ($tauxLitige>0.25) $libProfil.='Litiges importants. '; elseif ($tauxLitige>0.05) $libProfil.='Présence de litiges. '; if ($tabProfil[0]==$tabProfil[1] && $tabProfil[1]==$tabProfil[2]) { if ($tranche=0) $libProfil.='Paiements à échéance'; elseif ($tranche<=30) $libProfil.='Paiements à 30 jours maximum'; elseif ($tranche<=60) $libProfil.='Paiements à 60 jours maximum'; elseif ($tranche<=90) { $libProfil.='Paiements à 90 jours maximum'; $this->risqueImpaye=true; } else { $libProfil.='Paiements à plus de 90 jours'; $this->risqueImpaye=true; } } elseif ( ($tabProfil[0]<>$tabProfil[1] && $tabProfil[1]==$tabProfil[2]) || ($tabProfil[0]==$tabProfil[1] && $tabProfil[1]<>$tabProfil[2]) ) { // Récent changement de profil payeur $tranche=$tabProfil[0]; $tr_prec=$tabProfil[1]; $tr_prec2=$tabProfil[2]; if ($tranche<$tr_prec) $libProfil.='Amélioration des délais. '; elseif ($tranche==$tr_prec && $tr_prec<$tr_prec2) $libProfil.='Amélioration des délais. '; else { $this->risqueImpaye=true; $libProfil.='Allongement des délais. '; } if ($tranche=0) $libProfil.='Paiements à échéance'; elseif ($tranche<=30) $libProfil.='Paiements à 30 jours maximum'; elseif ($tranche<=60) $libProfil.='Paiements à 60 jours maximum'; elseif ($tranche<=90) { $libProfil.='Paiements à 90 jours maximum'; $this->risqueImpaye=true; } else { $libProfil.='Paiements à plus de 90 jours'; $this->risqueImpaye=true; } } else $libProfil.="Paiements entre $paie_min et $paie_max jour(s)"; } if (trim($libProfil)=='' && $siren<>552100554 && $siren<>552144503 && $siren<>479974115 && $siren<>0 && $siren<>494967938 ) { $ret=$this->iDb->select('jo.surveillances_listes', 'ref, dateAjout, dateConf, dateSuppr, dateDerEnvoi', "idClient='SURBODPRDFTSRECOCASH' AND siren=$siren AND dateSuppr=0 AND ABS(DATEDIFF(dateAjout, NOW()))<365 ORDER BY dateConf DESC, dateAjout DESC", false, MYSQL_ASSOC); //@sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "Indiscore sur $siren : Paiements", print_r($ret, true).mysql_error().EOL); foreach ($ret as $i=>$tabCS) { $dateMAJ=WDate::dateT('Y-m-d', 'M Y', $tabCS['dateAjout']); $libProfil="En date du $dateMAJ : Contentieux importants."; $this->risqueImpaye=true; $this->risqueImpayeMois=WDate::dateT('Y-m', 'Ym', $tabCS['dateAjout']); break; } } return $libProfil; } public function getTabPaiements($siren) { if ($siren<1000) return false; $tabPaie=$this->getPaiements($siren, 'jour'); foreach ($tabPaie as $i=>$tabPai) { @$tabNbr[$tabPai['trimestre']][$tabPai['tranchePaiement']]+=$tabPai['nbPieces']; @$tabNbr[$tabPai['trimestre']]['all']+=$tabPai['nbPieces']; $mt=$tabPai['mtPieces']/$tabPai['nbPieces']; // echo "$i\t".$tabPai['trimestre']." (".$tabPai['tranchePaiement']." j)\t$mt=".$tabPai['mtPieces'].'/'.$tabPai['nbPieces'].EOL; if ($mt<500) { @$tabMtAn[1][$tabPai['tranchePaiement']]++; @$tabMtAn[1]['all']++; } elseif ($mt<2000) { @$tabMtAn[2][$tabPai['tranchePaiement']]++; @$tabMtAn[2]['all']++; } elseif ($mt<10000) { @$tabMtAn[10][$tabPai['tranchePaiement']]++; @$tabMtAn[10]['all']++; } elseif ($mt<20000) { @$tabMtAn[20][$tabPai['tranchePaiement']]++; @$tabMtAn[20]['all']++; } elseif ($mt<50000) { @$tabMtAn[50][$tabPai['tranchePaiement']]++; @$tabMtAn[50]['all']++; } elseif ($mt<100000) { @$tabMtAn[100][$tabPai['tranchePaiement']]++; @$tabMtAn[100]['all']++; } elseif ($mt<200000) { @$tabMtAn[200][$tabPai['tranchePaiement']]++; @$tabMtAn[200]['all']++; } else { @$tabMtAn[999][$tabPai['tranchePaiement']]++; @$tabMtAn[999]['all']++; } //@$tabMtAn['all'][$tabPai['tranchePaiement']]++; } // Recalcul des délais par Trimestre foreach ($tabNbr as $trim=>$tabTranche) { ksort($tabTranche); foreach ($tabTranche as $tranche=>$mt) { if ($tranche=='all') $tabNbr2[$trim]['nb']=$mt; else $tabNbr2[$trim]['d='.$tranche]=round(($mt/$tabNbr2[$trim]['nb'])*100,1); } } // Recalcul des délais par Montants ksort($tabMtAn ); foreach ($tabMtAn as $mt=>$tabTranche) { ksort($tabTranche); foreach ($tabTranche as $tranche=>$mt2) { if ($tranche=='all') $tabMtAn2[$mt]['nb']=$mt2; else $tabMtAn2[$mt]['d='.$tranche]=round(($mt2/$tabMtAn2[$mt]['nb'])*100,1); } } return array('parMont'=>$tabMtAn2, 'parTrim'=>$tabNbr2); } } ?>