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'=>'A suivre. Informations terrain. Risque de fermeture'), '_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 à suivre'), '_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 $tabTranches = array( 0=>6, 30=>36, 60=>66, 90=>96, 120=>126, 150=>156, 180=>999, ); private $tabMontants = array( 1=>500, 2=>2000, 10=>10000, 20=>20000, 50=>50000, 100=>100000, 200=>200000, 999=>999999 ); public function __construct($db = null) { if ( $db === null ) { $this->iDb = new WDB(); } else { $this->iDb = $db; } } public function setTypeFic($typeFic) { $this->typeFlux = $typeFic; } public function readFic($a) { switch ($this->typeFlux) { case 0: // Acheteur GESCDCLT - Line length (120 + CRLF = 122) $tab = array( 'NUMACH'=> trim(substr($a, 0, 7)), // 0-7 | 7 'SIRENE'=> trim(substr($a, 7, 9)), // 7-16 | 9 'RAISOC'=> trim(substr($a, 16, 35)), // 16-51 | 35 'NUMVOI'=> trim(substr($a, 51, 4)), // 51-55 | 4 'TYPVOI'=> trim(substr($a, 55, 3)), // 55-58 | 3 'LIBVOI'=> trim(substr($a, 58, 30)), // 58-88 | 30 'VILLE'=> trim(substr($a, 88, 26)), // 88-114 | 26 'CODPOS'=> trim(substr($a,114, 5)), // 114-119 | 5 'FILLER'=> trim(substr($a,119, 2)), // 119-120 | 1 ); break; case 1: // CS - GESDACH - Line Length (19 + CRLF = 21) $tab = array( 'siren' => trim(substr($a, 0, 9)), // 0-9 | 9 'cs' => trim(substr($a, 9, 2)), // 9-11 | 2 'dateFin'=> trim(substr($a, 11, 8)), // 11-9 | 8 ); break; case 2: // Paiements - GESCDMVT - Line length (73 + CRLF = 75) $tab = array( 'NUMACH'=> trim(substr($a, 0, 7)), // 0-7 | 7 'DATPIE'=> substr($a, 7, 8), // 7-15 | 8 'DATECH'=> substr($a, 15, 8), // 15-23 | 8 'DATPAI'=> substr($a, 23, 8), // 23-31 | 8 'MNTPIE'=> trim(substr($a, 31, 13)), // 31-44 | 13 'MNTFRF'=> trim(substr($a, 44, 13)), // 44-57 | 13 'MNTLIT'=> trim(substr($a, 57, 13)), // 57-70 | 13 'CODDEV'=> trim(substr($a, 70, 3)), // 70-73 | 3 ); break; } return $tab; } public function getCoteSpeciale($siren) { $ret=$this->iDb->select( 'sdv1.ge_cs2', 'siren, cs, dateFin, dateInsert, dateConf', "siren=$siren AND (dateSuppr=0 OR dateConf>dateSuppr) AND (dateFin=0 OR dateFin>NOW()) AND cs NOT IN (20,22,27,33,34) 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( 'sdv1.ge_cs c LEFT JOIN sdv1.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( 'sdv1.ge_paiements p LEFT JOIN sdv1.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'], ); } 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'; $this->profilPayeur=1; } elseif ($tranche<=30) { $libProfil.='Paiements à 30 jours maximum'; $this->profilPayeur=2; } elseif ($tranche<=60) { $libProfil.='Paiements à 60 jours maximum'; $this->profilPayeur=3; } elseif ($tranche<=90) { $libProfil.='Paiements à 90 jours maximum'; $this->profilPayeur=4; $this->risqueImpaye=true;} else { $libProfil.='Paiements à plus de 90 jours'; $this->profilPayeur=4; $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'; $this->profilPayeur=1; } elseif ($tranche<=30) { $libProfil.='Paiements à 30 jours maximum'; $this->profilPayeur=2; } elseif ($tranche<=60) { $libProfil.='Paiements à 60 jours maximum'; $this->profilPayeur=3; } elseif ($tranche<=90) { $libProfil.='Paiements à 90 jours maximum'; $this->profilPayeur=4; $this->risqueImpaye=true;} else { $libProfil.='Paiements à plus de 90 jours'; $this->profilPayeur=4; $this->risqueImpaye=true;} } else { if ($paie_max<=30) $this->profilPayeur=1; elseif ($paie_max<=60) $this->profilPayeur=2; elseif ($paie_max<=90) $this->profilPayeur=3; elseif ($paie_max>90) $this->profilPayeur=4; $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); foreach ($ret as $i=>$tabCS) { $classWDate = new WDate(); $dateMAJ = $classWDate->dateT('Y-m-d', 'M Y', $tabCS['dateAjout']); $libProfil="En date du $dateMAJ : Contentieux importants."; $this->risqueImpaye=true; $this->risqueImpayeMois=$classWDate->dateT('Y-m', 'Ym', $tabCS['dateAjout']); $this->profilPayeur=4; break; } } //@sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "Indiscore sur $siren : Paiements", $libProfil.EOL.'Profil payeur = '. $this->profilPayeur .EOL.print_r($tabPaie, true).EOL); return $libProfil; } public function getTabPaiements($siren) { if ($siren<1000) return false; $tabNbr=array(); // Tableau de travail du nombre de factures par trimestre et par tranches de délais de paiements $tabMtAn=array(); // Tableau de travail du nombre de factures par montant et par tranches de délais de paiements $tabNbr2=array(); // Tableau retour du nombre de factures par trimestre et par tranches de délais de paiements $tabMtAn2=array(); // Tableau retour du nombre de factures par montant et par tranches de délais de paiements $tabPaie=$this->getPaiements($siren, 'jour'); foreach ($tabPaie as $i=>$tabPai) { @$tabNbr[$tabPai['trimestre']]['d='.$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]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[1]['all']++; } elseif ($mt<2000) { @$tabMtAn[2]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[2]['all']++; } elseif ($mt<10000) { @$tabMtAn[10]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[10]['all']++; } elseif ($mt<20000) { @$tabMtAn[20]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[20]['all']++; } elseif ($mt<50000) { @$tabMtAn[50]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[50]['all']++; } elseif ($mt<100000) { @$tabMtAn[100]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[100]['all']++; } elseif ($mt<200000) { @$tabMtAn[200]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[200]['all']++; } else { @$tabMtAn[999]['d='.$tabPai['tranchePaiement']]++; @$tabMtAn[999]['all']++; } //@$tabMtAn['all'][$tabPai['tranchePaiement']]++; } // Recalcul des délais par Trimestre foreach ($tabNbr as $trim=>$tabTranche) { ksort($tabTranche); // Initialisation des tranches à 0 foreach ($this->tabTranches as $tranche=>$vide) $tabNbr2[$trim]['nb']=$tabNbr2[$trim]['d='.$tranche]=0; foreach ($tabTranche as $tranche=>$mt3) { $tranche=str_replace('d=','',$tranche); if ($tranche=='all') $tabNbr2[$trim]['nb']=$mt3; else $tabNbr2[$trim]['d='.$tranche]=round(($mt3/$tabNbr2[$trim]['nb'])*100,1); } } // Initialisation des tranches à 0 par Montants foreach ($this->tabMontants as $mt=>$vide) { $tabMtAn2['_'.$mt]['nb']=0; foreach ($this->tabTranches as $tranche=>$vide) $tabMtAn2['_'.$mt]['d='.$tranche]=0; } // Recalcul des délais par Montants ksort($tabMtAn); foreach ($tabMtAn as $mt=>$tabTranche) { ksort($tabTranche); foreach ($tabTranche as $tranche=>$mt2) { $tranche=str_replace('d=','',$tranche); if ($tranche=='all') $tabMtAn2['_'.$mt]['nb']=$mt2; else $tabMtAn2['_'.$mt]['d='.$tranche]=round(($mt2/$tabMtAn2['_'.$mt]['nb'])*100,1); } } //@sendMail('production@scores-decisions.com', 'ylenaour@scores-decisions.com', "Indiscore sur $siren : Tableaux des Paiements", 'Paiements par montants :'.EOL.print_r($tabMtAn2, true).EOL.EOL.'Paiements par trimestres :'.EOL.print_r($tabNbr2, true).EOL.print_r($tabNbr, true).EOL.print_r($tabMtAn, true).EOL); return array( 'parMont'=>$tabMtAn2, 'parTrim'=>$tabNbr2 ); } public function getLibInfoCS($cs) { return array( 'CoteCS' => $cs, 'LibCS' => $this->tabInfoCS["_$cs"]['libExt'], 'NivRisque' => $this->tabInfoCS["_$cs"]['risque'], 'CodeRisque' => $this->tabInfoCS["_$cs"]['type'], ); } }