array( __DIR__ . '/../../library/Zend/autoload_classmap.php', __DIR__ . '/../../library/Application/autoload_classmap.php', __DIR__ . '/../../library/Scores/autoload_classmap.php', __DIR__ . '/../../application/autoload_classmap.php', ), 'Zend_Loader_StandardAutoloader' => array( 'prefixes' => array( 'Zend' => __DIR__ . '/../../library/Zend', 'Application' => __DIR__ . '/../../library/Application', 'Scores' => __DIR__ . '/../../library/Scores', 'SdMetier' => __DIR__ . '/../../library/SdMetier', 'Metier' => __DIR__ . '/../../library/Metier', ), 'fallback_autoloader' => true ) )); // Zend_Application - Use it if you don't have autoloaders //require_once 'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); try { $opts = new Zend_Console_Getopt( //Options array( 'help|?' => "Affiche l'aide.", 'list' => "Liste les actes en attente disponible sur le FTP et affiche les informations", 'get-s' => "Recupère seulement les actes du FTP (un seul document si la référence est spécifier G )", 'send-s' => "Récupère les actes et envoi un mail à chaque client (un seul acte si la référence est spécifier G)", 'type-s' => "Type de document : bilan, acte", 'control' => "Control", ) ); $opts->parse(); } catch (Zend_Console_Getopt_Exception $e) { echo $e->getUsageMessage(); exit; } //Usage if(count($opts->getOptions())==0 || isset($opts->help)) { echo "Vérifie les actes numérisés reçus en provenance des Greffes."; echo "\n\n"; echo $opts->getUsageMessage(); echo "\n"; exit; } $c = new Zend_Config($application->getOptions()); Zend_Registry::set('config', $c); $testMail = false; $test = false; if (isset($opts->list)){ $test = true; } $types = array('bi', 'ac'); //Configuration FTP define ('ACTES_IGNUM_FTP_URL', '192.168.3.202'); define ('ACTES_IGNUM_FTP_USER', 'mpc2500'); define ('ACTES_IGNUM_FTP_PASS', 'passmpc78'); define ('ACTES_IGNUM_LOCAL_DIR', $c->profil->path->files.'/'); define ('PATH_DATA', $c->profil->infogreffe->storage->path); $report_email = $c->profil->mail->email->support; $report_subject = 'Traitement des actes '.date('Y-m-d H:i:s'); $report_txt = ''; function sendMail($commande, $type){ $subject = "Actes ou Statuts disponible pour ".$commande->raisonSociale.' ('.$commande->siren.')'; $message = "Bonjour,\n\n"; $message.= "Le document commandé pour ".$commande->raisonSociale." (siren ".$commande->siren.") est disponible en téléchargement sur le site de Scores & Décisions.\r\n\r\n"; if ($commande->refClient!='') { $message = "Votre référence : ".$commande->refClient."\r\n\r\n"; } switch ( $type ) { case 'BI': $dateBilan = substr($commande->bilanCloture,8,2).'/'.substr($commande->bilanCloture,5,2).'/'.substr($commande->bilanCloture,0,4); $message.= "Bilan cloturé le "; break; case 'AC': $dateActe = substr($commande->acteDate,8,2).'/'.substr($commande->acteDate,5,2).'/'.substr($commande->acteDate,0,4); $dateDepot = substr($commande->depotDate,8,2).'/'.substr($commande->depotDate,5,2).'/'.substr($commande->depotDate,0,4); $message.= "Acte n°".$commande->acteNum." du ".$dateActe." (Dépot n°".$commande->depotNum." du ".$dateDepot.") "; break; } $message.= "\n\n"; $message.= "Consulter la fiche identité http://extranet.scores-decisions.com/identite/fiche/siret/".$commande->siren.", puis rubrique \"Pieces Officielles\"\n"; $message.= "ou directement depuis la page suivante http://extranet.scores-decisions.com/pieces"; switch ( $type ) { case 'BI': $message.= "/bilans/siret/".$commande->siren; break; case 'AC': $message.= "/actes/siret/".$commande->siren; break; } $message.= "\n\n"; $message.= "Bien cordialement, \n"; $message.= "Le service support.\n"; $message.= "\n"; $message.= "--"; $message.= "\n\n"; $message.= "SCORES & DECISIONS"; $message.= "\n"; $message.= "Service support"; $message.= "\n"; $message.= "1, rue de Clairefontaine - 78120 RAMBOUILLET"; $message.= "\n"; $message.= "tél : 0 811 261 216"; $message.= "\n"; $message.= "fax : 33 (0)1 75 43 85 74"; $message.= "\n"; $message.= "support@scores-decisions.com"; $message.= "\n"; $message.= "http://www.scores-decisions.com/"; $message.= "\n"; $message.= "Scores & Décisions est l'acteur nouvelle génération de l'information et de l'évaluation des entreprises"; $message.= "\n\n"; $message.= "Pensez à l'environnement avant d'imprimer ce message !"; $message.= "\n"; $message.= "Save paper - think before you print"; $message.= "\n"; $headers = 'From: infoslegales@scores-decisions.com' . "\r\n" . 'Reply-To: infoslegales@scores-decisions.com'; if ( mail(strtolower($commande->email), $subject, utf8_decode($message), $headers) ){ echo date ('Y/m/d - H:i:s').' - Un email a été envoyé à '.$commande->email." pour la commande ".$commande->id.".\n"; return true; } else { echo date ('Y/m/d - H:i:s').' - ERREUR : Impossible d\'envoyer l\'email à '.$commande->email." pour la commande ".$commande->id.".\n"; return false; } } /** * Connexion à la base de données */ $db = Zend_Db::factory($c->profil->db->metier); Zend_Db_Table_Abstract::setDefaultAdapter($db); /** * List actes files and check if an entry exist in the database * greffes/actes/AAAA/MM * preg_match('/^acte-([0-9]{9})-(ST)-([0-9]{8})-.*\.pdf/', $fichier, $matches) * preg_match('/^acte-([0-9]{9})-([0-9a-zA-Z]{1,})-([0-9]{8})-.*-([0-9]{2})\.pdf/', $fichier, $matches) */ if ($opts->control) { $dir = PATH_DATA.'/greffes/actes'; if (is_dir($dir)) { if ($dh = opendir($dir)) { //Annee while (($anneeDir = readdir($dh)) !== false) { if ($anneeDir != '.' || $anneeDir != '..') { echo "Dir ".$dir . DIRECTORY_SEPARATOR . $anneeDir."\n"; if ($dhAnneeDir = opendir($dir . DIRECTORY_SEPARATOR . $anneeDir)) { //Mois while (($moisDir = readdir($dhAnneeDir)) !== false) { echo "Dir ".$dir . DIRECTORY_SEPARATOR . $anneeDir . DIRECTORY_SEPARATOR . $moisDir."\n"; if ($moisDir != '.' || $moisDir != '..') { //Fichier if ($dhFile = opendir($dir . DIRECTORY_SEPARATOR . $anneeDir . DIRECTORY_SEPARATOR . $moisDir)) { while (($file = readdir($dhFile)) !== false) { if ($file != '.' || $file != '..') { if (preg_match('/^acte-([0-9]{9})-([0-9a-zA-Z]{1,})-([0-9]{8})-.*-([0-9]{2})\.pdf/', $file, $matches)) { $siren = $matches[1]; $type = $matches[2]; $date = $matches[3]; $num = $matches[4]; $actesM = new Application_Model_ActesFiles(); $sql = $actesM->select() ->where('siren=?', $siren) ->where('type=?', $type) ->where('date=?', $date) ->where('num=?', $num); $result = $actesM->fetchRow($sql); if ( null === $result ) { echo "Insert $file\n"; $actesM->insert(array( 'siren' => $siren, 'type' => $type, 'date' => $date, 'num' => $num, 'file' => $file, )); } } } } closedir($dhFile); } } } closedir($dhAnneeDir); } } } closedir($dh); } } exit; } /** * Liste des commandes non traités depuis la base de données */ $acM = new Application_Model_Sdv1GreffeCommandesAc(); $biM = new Application_Model_Sdv1GreffeCommandesBi(); $tabCommandes = array(); if (in_array('ac', $types)) { $sql = $acM->select() ->where('mode=?','C') ->where('dateCommande!=?', '0000-00-00 00:00:00') ->where('dateEnvoi=?', '0000-00-00 00:00:00'); $rows = $acM->fetchAll($sql); if (count($rows)>0) { foreach ($rows as $row) { $tabCommandes['G-AC-'.$row->id] = $row; } } } if (in_array('bi', $types)) { $sql = $biM->select() ->where('mode=?','C') ->where('dateCommande!=?', '0000-00-00 00:00:00') ->where('dateEnvoi=?', '0000-00-00 00:00:00'); $rows = $biM->fetchAll($sql); if (count($rows)>0) { foreach ($rows as $row) { $tabCommandes['G-BI-'.$row->id] = $row; } } } $nbCommandes = count($tabCommandes); echo date('Y/m/d - H:i:s') ." - Il y a $nbCommandes commandes en attente de réception courrier ou numérisation !\n"; /** * Connexion au site FTP pour la récupération de la liste des fichiers au format pdf */ $conn_id = ftp_connect(ACTES_IGNUM_FTP_URL); if (!$conn_id) { echo date ('Y/m/d - H:i:s')." - ERREUR : Impossible de se connecter au serveur FTP (".ACTES_IGNUM_FTP_URL.") !\n"; exit; } $login_result = ftp_login($conn_id, ACTES_IGNUM_FTP_USER, ACTES_IGNUM_FTP_PASS); if (!$login_result) { echo date ('Y/m/d - H:i:s')." - ERREUR : Impossible de s'authentifier sur le serveur FTP (".ACTES_IGNUM_FTP_URL.")!\n"; exit; } $contents = ftp_nlist($conn_id, "*.pdf"); /** * Liste de tout les fichiers disponible dans le repertoire * et associe une clé pour faciliter le tri */ $tabFichiersFtp = array(); foreach ($contents as $filename){ $indice = 0; $f = strtolower($filename); if (preg_match('/g-(ac|bi)-[0-9]+\.pdf/', $f) || preg_match('/g-(ac|bi)-[0-9]+-[0-9]{1,2}\.pdf/', $f)){ $part = substr(str_replace('.pdf', '', $f), 5); $p = strpos($part, '-'); if ( $p === false ) { $ref = substr($f, 0, 5) . $part; $indice = 0; } else { $ref = substr($f, 0, 5) . substr($part, 0, $p); $indice = substr($part, $p+1); } $tabFichiersFtp[strtoupper($ref).'-'.$indice] = $filename; // Fichiers en anomalies } else { if ($test){ echo "Erreur : Anomalie fichier numérisé $filename\n"; } else { $subject = "Erreur : Anomalie fichier numérisé"; $message = "Le fichier $filename a été trouvé et ne correspond pas au format attendu"; $headers = 'From: supportdev@scores-decisions.com' . "\r\n" . 'Reply-To: supportdev@scores-decisions.com'; mail('supportdev@scores-decisions.com', $subject, $message, $headers); } } } /** * Tri des fichiers par ordre décroissant * Les noms des fichiers sont incrémenté par 1 */ krsort($tabFichiersFtp); /** * Dans le cas ou il y a eu une erreur de scan, la production passe a nouveau le * document dans le scanner et le fichier est envoyé sur le ftp * Le document est nommé G[ref],G[ref]-1,G[ref]-2,.....pdf. * On garde donc le dernier document scanné. */ $lastRef = ''; $tabFichiersTemp = array(); foreach($tabFichiersFtp as $k => $val) { $part = substr($k, 5); $p = strpos($part, '-'); if ( $p === false ) { $ref = substr($k, 0, 5) . $part; } else { $ref = substr($k, 0, 5) . substr($part, 0, $p); } if( $lastRef != $ref ) { $tabFichiersTemp[$ref] = $val; } $lastRef = $ref; } $tabFichiers = $tabFichiersTemp; unset($tabFichiersTemp); /** * Pour chaque commande, test de la présence d'un fichier associé * Si le fichier correspond téléchargement du fichier */ foreach ( $tabCommandes as $ref => $commande ) { foreach ( $tabFichiers as $refAssocie => $fichier ) { if ( $ref == $refAssocie ) { echo date ('Y/m/d - H:i:s')." - Traitement de la commande $ref\n"; if ( $test ) { echo date ('Y/m/d - H:i:s')." - Fichier $fichier \n"; } else { //Récupération du fichier depuis le FTP (s'il n'existe pas déjà) if ( !file_exists(ACTES_IGNUM_LOCAL_DIR.$fichier) ) { if (ftp_get($conn_id, ACTES_IGNUM_LOCAL_DIR.$fichier, $fichier, FTP_BINARY, 0)) { echo date ('Y/m/d - H:i:s')." - Fichier $fichier téléchargé depuis le serveur FTP.\n"; } else { echo date ('Y/m/d - H:i:s')." - ERREUR : Impossible de télécharger le fichier $fichier !\n"; } } switch ( substr($ref,2,2) ) { case 'BI': $infogreffe = new SdMetier_Infogreffe_DocBI($commande->siren); //Format date cloture $dateCloture = substr($commande->bilanCloture,0,4) . '-' . substr($commande->bilanCloture,5,2) . '-' . substr($commande->bilanCloture,8,2); $path = $infogreffe->getFilePath($commande->bilanType, $dateCloture); $nomCible = $infogreffe->getFileName($commande->bilanType, $dateCloture); $fileOut = PATH_DATA.'/'.$path.'/'.$nomCible; $isFileOnStorage = false; if ( file_exists($fileOut) ) { $isFileOnStorage = true; echo date ('Y/m/d - H:i:s')." - Fichier ".ACTES_IGNUM_LOCAL_DIR.$fichier." déjà présent en ".$fileOut.".\n"; } else { if ( copy(ACTES_IGNUM_LOCAL_DIR.$fichier, $fileOut) ) { $isFileOnStorage = true; echo date ('Y/m/d - H:i:s')." - Fichier ".ACTES_IGNUM_LOCAL_DIR.$fichier." déplacé en ".$fileOut.".\n"; } else { echo date ('Y/m/d - H:i:s')." ERREUR - Impossible de déplacer ".ACTES_IGNUM_LOCAL_DIR.$fichier." en ".$fileOut." !\n"; } } // --- Lecture présence référence bilan $bilanM = new Application_Model_JoGreffesBilans(); $sql = $bilanM->select() ->where('siren=?',$commande->siren) ->where('date_cloture=?', $dateCloture); if ($commande->bilanType=='sociaux') { $sql->where('type_comptes="" OR type_comptes="sociaux"'); } else { $sql->where('type_comptes="consolides"'); } $item = $bilanM->fetchRow($sql); // --- Enregistrement if ( $isFileOnStorage && $item->pdfDate == '0000-00-00' ) { $infos = $infogreffe->pdfInfos($fileOut); if (false !== $infos) { $data = array( 'pdfLink' => $nomCible, 'pdfSize' => $infos['size'], 'pdfPage' => $infos['pages'], 'pdfVer' => $infos['version'], 'pdfDate' => date('Ymd'), ); try { $result = $bilanM->update($data, 'id='.$item->id); } catch(Zend_Db_Adapter_Exception $e) { echo $e->getMessage(); } catch(Zend_Db_Exception $e) { echo $e->getMessage(); } } } break; case 'AC': $acteM = new Application_Model_JoGreffesActes(); $sql = $acteM->select() ->from($acteM, array( 'id', 'siren', 'numRC', 'LPAD(numGreffe,4,0) AS numGreffe', 'pdfLink', 'pdfSize', 'pdfPage', 'pdfDate', 'num_depot', 'date_depot', 'date_acte', 'LPAD(num_acte,2,0) AS num_acte', 'type_acte', 'type_acte_libelle', 'nbpages_acte', 'decision_nature', 'decision_libelle', 'mode_diffusion' )) ->where('siren=?', $commande->siren) ->where('num_depot=?', $commande->depotNum) ->where('num_acte=?', $commande->acteNum) ->where('type_acte=?',$commande->acteType); $item = $acteM->fetchRow($sql); $infogreffe = new SdMetier_Infogreffe_DocAC($commande->siren); $date = $commande->acteDate; if ( $date == '0000-00-00' ) { $date = $commande->depotDate; } $path = $infogreffe->getFilePath($date); //(Numéro du Greffe)-(dossier_millesime)-(dossier_statut)-(dossier_chrono)-(num_depot) $options = $item->numGreffe . '-' . substr($item->numRC,0,2) . '-' . substr($item->numRC,2,1) . '-' . substr($item->numRC,3) . '-' . $item->num_depot; $nomCible = $infogreffe->getFileName($date, $commande->acteNum, $commande->acteType, $options); $fileOut = PATH_DATA.'/'.$path.'/'.$nomCible; $isFileOnStorage = false; if ( file_exists($fileOut) ) { $isFileOnStorage = true; echo date ('Y/m/d - H:i:s')." - Fichier ".ACTES_IGNUM_LOCAL_DIR.$fichier." déjà présent en ".$fileOut.".\n"; } else { if ( copy(ACTES_IGNUM_LOCAL_DIR.$fichier, $fileOut) ) { $isFileOnStorage = true; echo date ('Y/m/d - H:i:s')." - Fichier ".ACTES_IGNUM_LOCAL_DIR.$fichier." déplacé en ".$fileOut.".\n"; } else { echo date ('Y/m/d - H:i:s')." ERREUR - Impossible de déplacer ".ACTES_IGNUM_LOCAL_DIR.$fichier." en ".$fileOut." !\n"; } } if ( $isFileOnStorage && $item->pdfDate == '0000-00-00' ) { $infos = $infogreffe->pdfInfos($fileOut); if ( false !== $infos ) { $data = array( 'pdfLink' => $nomCible, 'pdfSize' => $infos['size'], 'pdfPage' => $infos['pages'], 'pdfVer' => $infos['version'], 'pdfDate' => date('Ymd'), ); try { $result = $acteM->update($data, 'id='.$item->id); echo " = enregistrement.\n"; } catch(Zend_Db_Adapter_Exception $e) { echo $e->getMessage(); } catch(Zend_Db_Exception $e) { echo $e->getMessage(); } } } break; } //Envoi du mail et Mise à jour de la commande if ( file_exists($fileOut) ) { if ( $testMail ) { echo "Envoi fichier $nomCible ($ref) à ".$commande->email; } else { $report_txt.= "$ref intégré à l'extranet"; $isMailSent = false; if (trim($commande->email)!=''){ $isMailSent = sendMail($commande, substr($ref,2,2)); } else { $isMailSent = true; } if ( $isMailSent ) { $data = array( 'dateEnvoi' => date('YmdHis')); switch ( substr($ref,2,2) ) { case 'BI': $commandesM = new Application_Model_Sdv1GreffeCommandesBi(); break; case 'AC': $commandesM = new Application_Model_Sdv1GreffeCommandesAc(); break; } $commandesM->update($data, 'id='.$commande->id); echo date ('Y/m/d - H:i:s')." - Commande $ref mise à jour\n"; $report_txt.= ' - Email envoyé à '.$commande->email; } else { $report_txt.= ' - Email non envoyé !'; echo date ('Y/m/d - H:i:s')." ERREUR - Email non envoyé et commande $ref non mise à jour\n"; } $report_txt.= "\n"; } } // Fin envoi mail } } // Fin condition ref } } ftp_close($conn_id); if (empty($report_txt)) { $report_txt = "Aucun envoi."; } //Envoi du mail de rapport if (!$test && !$testMail){ if (mail($report_email, $report_subject, utf8_decode($report_txt))){ echo date ('Y/m/d - H:i:s')." - Rapport envoyé.\n"; } else { echo date ('Y/m/d - H:i:s')." - Erreur lors de l'envoir du rapport !\n"; } } ?>