#!/usr/bin/php -q
<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
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<NNN> )",
            '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<NNN>)",
        )
    );
	$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);

$test = false;
if (isset($opts->list)){
	$test = true;
}

//Configuration FTP
define ('ACTES_IGNUM_FTP_URL', 'ftp2.scores-decisions.com');
define ('ACTES_IGNUM_FTP_USER',	'mpc2500');
define ('ACTES_IGNUM_FTP_PASS',	'passmpc78');

define ('PATH_DATA', $c->profil->path->data);
define ('ACTES_IGNUM_LOCAL_DIR', PATH_DATA.'/pdf/scan/');
define ('ACTES_IG_LOCAL_DIR', PATH_DATA.'/pdf/');

$report_email = $c->profil->mail->email->support;
$report_subject = 'Traitement des actes '.date('Y-m-d H:i:s');
$report_txt = '';

require_once 'common/ftp.php';

function sendMail($commande, $nomCible){
	$subject = "Actes ou Statuts disponible pour ".$commande['siren'];
	$message = "Le document commandé pour le siren ".$commande['siren']." est disponible en téléchargement sur le site de Scores & Décisions à l'adresse suivante :\r\n\r\n";
	$message.= "http://extranet.scores-decisions.com/fichier/pdf/$nomCible\r\n";
	$headers =  'From: infoslegales@scores-decisions.com' . "\r\n" .
				'Reply-To: infoslegales@scores-decisions.com';
	if ( mail($commande['emailCommande'], $subject, utf8_decode($message), $headers) ){
		echo date ('Y/m/d - H:i:s').' - Un email a été envoyé à '.$commande['emailCommande']." pour la commande $nomCible.\n";
		return true;
	} else {
		echo date ('Y/m/d - H:i:s').' - ERREUR : Impossible d\'envoyer l\'email à '.$commande['emailCommande']." pour la commande $nomCible.\n";
		return false;
	}
}

set_time_limit(0);

/**
 * Connexion à la base de données
 */
$db = Zend_Db::factory($c->profil->db->sdv1);
Zend_Db_Table_Abstract::setDefaultAdapter($db);

/**
 * Liste des commandes non traités depuis la base de données
 */
$sql = "SELECT idCommande, idUser, login, emailCommande, siren, refDocument, typeCommande, dateCommande FROM commandes WHERE dateReception=0";
$tabCommandes = $db->fetchAssoc($sql);

$nbCommandes = count($tabCommandes);
$tabTmp = array();
foreach ($tabCommandes as $commande) {
	if ($commande['typeCommande']=='C'){
		$tabTmp['c'.$commande['idCommande']] = $commande;
	} elseif ($commande['typeCommande']=='G' || $commande['typeCommande']==''){
		$tabTmp['g'.$commande['idCommande']] = $commande;
	}
}
$tabCommandes = $tabTmp;
unset($tabTmp);
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;
	if (preg_match('/[g|c][0-9]+\.pdf/', $filename)
		|| preg_match('/[g|c][0-9]+-[0-9]{1,2}\.pdf/', $filename)){
		
		list($ref, $indice) = explode('-', str_replace(array('.pdf', 'g', 'c'), array('','',''), $filename));
		if(empty($indice)) $indice = 0;
		$tabFichiersFtp[$ref.'-'.$indice] = strtolower($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)
{
	list($ref, $indice) = explode('-',$k);
	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 (substr($ref,1) == $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";
					}
				}

				//Copie et renommage du fichier suivant la ref infogreffe (s'il n'existe pas déjà)
				$sirenC = $commande['siren'];
				$refC = $commande['refDocument'];
				
				require_once 'Infogreffe/Infogreffe.php';
				$infogreffe = new Infogreffe();
				if (preg_match('/^([0-9]{4}_).*?$/', $refC, $matches)){
				    $path = $infogreffe->bilanPath($refC);
				    $nomCible = $infogreffe->bilanFilename($sirenC, $refC);
				    $type = 'acte';
				} else {
				    $path = $infogreffe->actePath($refC);
				    $nomCible = $infogreffe->acteFilename($sirenC, $refC);
				    $type = 'bilan';
				}
				
				if (file_exists(ACTES_IGNUM_LOCAL_DIR.$fichier) &&
					!file_exists(PATH_DATA.$path.$nomCible)) {
					if (rename(ACTES_IGNUM_LOCAL_DIR.$fichier, PATH_DATA.$path.$nomCible)){
					    if ( $type == 'acte' ){
					        preg_match('/^acte-([0-9]{9})-([0-9a-zA-Z]{1,})-([0-9]{8})-(.*)-(.*)-(.*)-(.*)-(.*)-([0-9]{1,})\.pdf$/', $fichier, $matches);
				            $siren = $matches[1];
				            $type_acte = $matches[2];
				            $date_acte = $matches[3];
				            $num_acte = $matches[9];
				            $actesM = new Application_Model_ActesFiles();
				            $sql = $actesM->select()->where('file=?',$nomCible);
				            $result = $actesM->fetchRow($sql);
				            if ( null === $result ) {
				                $actesM->insert(array(
				                    'siren' => $siren,
				                    'type' => $type_acte,
				                    'date' => $date_acte,
				                    'num' => $num_acte,
				                    'file' => $nomCible,
				                ));
				            }
					    }
						echo date ('Y/m/d - H:i:s')." - Fichier ".ACTES_IGNUM_LOCAL_DIR.$fichier." déplacé en ".PATH_DATA.$path.$nomCible.".\n";
					} else {
						echo date ('Y/m/d - H:i:s')." ERREUR - Impossible de déplacer ".ACTES_IGNUM_LOCAL_DIR.$fichier." en ".PATH_DATA.$path.$nomCible." !\n";
					}
				}

				//Envoi du mail et Mise à jour de la commande
				$testMail = false;
				if (file_exists(PATH_DATA.$path.$nomCible)){
					if ($testMail){
						echo "Envoi fichier $nomCible ($ref) à ".$commande['emailCommande'];
					} else {
						$report_txt.= "$ref intégré à l'extranet";
						$isMailSent = false;
						if (trim($commande['emailCommande'])!=''){
							$isMailSent = sendMail($commande, $nomCible);
						} else {
							$isMailSent = true;
						}
						if ($isMailSent){
							echo date ('Y/m/d - H:i:s')." - Commande $ref mise à jour\n";
							$commandesM = new Application_Model_Commandes();
							$data = array( 'dateReception' => date('YmdHis'));
							$commandesM->update($data, 'idCommande='.$commande['idCommande']);
							$report_txt.= ' - Email envoyé à '.$commande['emailCommande'];
						} 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";
					}
				}

			}
			break;
		}
	}
}
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";
	}
}

?>