id; $codeUnite = (string) $xmlConfig->owner; $initialHash = (string) $xmlConfig->checksum; excludeFile($importedFile, $errorMsg, $initialHash, $identifier, $codeUnite, '3.2.0'); } } else { erreur("Impossible de lire le fichier XML", $importedFile); } } } } function docserverError() { putAllfilesInError("Ecriture impossible dans le docserver"); } function databaseError() { putAllfilesInError("Erreur d'écriture dans la base de données"); } function genererCRV($codeId, $errorMsg, $hash, $identifier, $codeUnite) { // On récupère l'IP de la brigade $_ENV['db']->query("SELECT brigade_ip FROM dggn_brigades WHERE brigade_id = '".$codeUnite."'"); if ($line = $_ENV['db']->fetch_object()) { $ip = $line->brigade_ip; $date = date("dmY"); $heure = date("His"); $millitime = round(microtime(true) * 1000); $file = $ip."-".$date.$heure.$millitime.".xml"; Maarch_AutoImport_writeLog("Génération du CRV pour le fichier ".$file, 'OK', 'INFO'); $imp = new DOMImplementation(); //$dtd = $imp->createDocumentType('crv', '', $_ENV['crvDtd']); //$dom = $imp->createDocument("", "", $dtd); $dom = new DOMDocument(); // Définition des autres propriétés $dom->encoding = 'UTF-8'; $dom->formatOutput = true; // Noeud crv $crv = $dom->createElement("crv"); $dom->appendChild($crv); // Noeud origin $origin = $dom->createElement("origin"); $crv->appendChild($origin); $originTxt = $dom->createTextNode($ip.'s'); $origin->appendChild($originTxt); // Noeud resources $upvas = $dom->createElement("upvas"); $crv->appendChild($upvas); // Noeud r $u = $dom->createElement("u"); $u->setAttribute("checksum", $hash); $u->setAttribute("id", $identifier); $upvas->appendChild($u); // Noeud error $error = $dom->createElement("error"); $u->appendChild($error); // Noeud code $code = $dom->createElement("code"); $codeTxt = $dom->createTextNode($codeId); $error->appendChild($code); $code->appendChild($codeTxt); // Noeud msg $msg = $dom->createElement("msg"); $msgTxt = $dom->createTextNode($errorMsg); $error->appendChild($msg); $msg->appendChild($msgTxt); if ($dom->save($_ENV['crvPath'].'/'.$file)) { Maarch_AutoImport_writeLog("Génération du CRV pour le fichier ".$file." terminé", 'OK', 'INFO'); } else { Maarch_AutoImport_writeLog("Génération du CRV pour le fichier ".$file." échoué", 'KO', 'ERROR'); } } else { Maarch_AutoImport_writeLog("Génération du CRV pour l'UPVA ".$identifier." échoué, impossible de trouver l'IP de la brigade : ".$codeUnite, 'KO', 'ERROR'); } } function rollback($identifier) { // On récupère la derniere ressource insérée correspondant à l'identifiant d'UPVA $_ENV['db']->query("select MAX(res_id) as id from res_pja where identifier = '".$identifier."'"); if ($line = $_ENV['db']->fetch_object()) { // On supprime le lien entre l'IDJ et l'UPVA, si il existe $_ENV['db']->query("DELETE FROM cases_res WHERE res_id = '".$line->id."'"); // On supprime l'entrée correspondant à l'UPVA en base de données (/!\ Quid du fichier sur le filesystem/!\) $_ENV['db']->query("DELETE FROM res_pja WHERE res_id = '".$line->id."'"); } } function addIdjs($importedFiles) { // On lit le fichier foreach ($importedFiles as $importedFile) { // On récupère le nom du xml if (preg_match('/.xml$/', $importedFile)) { $xmlFullPath = $_ENV['sid']."/".$importedFile; if (file_exists($xmlFullPath)) { //loading of the xml config file. $xmlConfig = simplexml_load_file($xmlFullPath); $identifier = (string) $xmlConfig->id; $idj = (string) $xmlConfig->idj; $idjs = explode('#', trim($idj, '#')); if (empty($idjs[0])) { $idjs = array(); } // On récupère les res_id des fragments d'UPVA $_ENV['db']->query("select res_id from res_pja where identifier = '".$identifier."'"); $resIds = array(); while ($line = $_ENV['db']->fetch_object()) { array_push($resIds, $line->res_id); } foreach ($idjs as $idj) { // Si l'IDJ existe pas dans la base on le crée $_ENV['db']->query("select case_id from cases where case_label = '".strtoupper($idj)."'"); if (!($line = $_ENV['db']->fetch_object())) { $_ENV['db']->query("INSERT INTO cases (case_label, case_last_update_date, case_creation_date, case_typist) VALUES ('".strtoupper($idj)."', NOW(), NOW(), 'AUTOIMPORT')"); // On récupère l'ID de cases inséré $_ENV['db']->query("select case_id from cases where case_label = '".strtoupper($idj)."'"); if (!($line2 = $_ENV['db']->fetch_object())) { erreur("Impossible de lier l'UPVA à l'IDJ", $importedFile); } else { $caseId = $line2->case_id; } } else { $caseId = $line->case_id; } // On ajoute l'IDJ pour chaque UPVA foreach ($resIds as $resId) { $_ENV['db']->query("SELECT res_id, case_id FROM cases_res WHERE case_id = ".$caseId." AND res_id = ".$resId); if (!($_ENV['db']->fetch_object())) { $_ENV['db']->query("INSERT INTO cases_res (case_id, res_id) VALUES ('".$caseId."', '".$resId."')"); } } } } else { erreur("Impossible de lire le fichier XML", $importedFile); } } } } function verifFormat() { // On lit le fichier $fileNames = $_ENV['fileNameLoaded']; foreach ($fileNames as $importedFile) { // On récupère le nom du xml if (preg_match('/.xml$/', $importedFile)) { Maarch_AutoImport_writeLog("Prise en charge de l'UPVA ".$importedFile, 'OK', 'INFO'); $xmlFullPath = $_ENV['sid']."/".$importedFile; if (file_exists($xmlFullPath)) { //loading of the xml config file. if (!($xmlConfig = simplexml_load_file($xmlFullPath))) { erreur("Impossible de lire le fichier XML", $importedFile); } $identifier = (string) $xmlConfig->id; $codeUnite = (string) $xmlConfig->owner; $idjs = (string) $xmlConfig->idj; $initialHash = (string) $xmlConfig->checksum; // On vérifie que le fichier est complet // nom du fichier sans extension $importedFileWithoutExt = substr($importedFile, 0, strrpos($importedFile, '.')); // récupération du fichier associé au XML foreach ($_ENV['fileNameLoaded'] as $archive) { if (!preg_match('/.xml$/', $archive) && preg_match('/^'.$importedFileWithoutExt.'/', $archive)) { // ici on check le fichier $initialFileSize = filesize($_ENV['sid']."/".$archive); usleep(100000); clearstatcache(); $finalFileSize = filesize($_ENV['sid']."/".$archive); // fin check if ($initialFileSize != $finalFileSize) { excludeFileWithoutDelete($importedFile, "Fichier incomplet", $initialHash, $identifier, $codeUnite); continue 2; } break 1; } } // Si le numéro d'UPVA n'est pas au bon format if (!preg_match('/^[0-9]*\/[0-9]*\/[0-9]{4}$/', $identifier)) { excludeFile($importedFile, "Le numéro UPVA a un format incorrect", $initialHash, $identifier, $codeUnite); } // On vérifie sur les IDJs sont au bon format $idjsTab = explode('#', $idjs); if (empty($idjsTab[0])) { $idjsTab = array(); } foreach ($idjsTab as $idj) { if (!preg_match('/^[0-9]{10}[a-zA-Z]{1}$/', $idj)) { excludeFile($importedFile, "Un IDJ a un format incorrect", $initialHash, $identifier, $codeUnite); break 1; } } // On vérifie le checksum // nom du fichier sans extension $importedFileWithoutExt = substr($importedFile, 0, strrpos($importedFile, '.')); // récupération du fichier associé au XML foreach ($_ENV['fileNameLoaded'] as $archive) { if (!preg_match('/.xml$/', $archive) && preg_match('/^'.$importedFileWithoutExt.'/', $archive)) { $hash = Maarch_AutoImport_doFingerprint($_ENV['sid']."/".$archive, $_ENV['docserverFingerprintMode']); if ($hash != $initialHash) { excludeFile($importedFile, "Checksum incorrect", $initialHash, $identifier, $codeUnite); } break 1; } } } else { Maarch_AutoImport_writeLog("Impossible de trouver le fichier XML ".$importedFile, 'KO', 'ERROR'); } } } } function excludeFileWithoutDelete($file, $message, $hash, $identifier, $codeUnite, $code = '3.1.0') { $newFilenames = array(); $fileWithoutDot = substr($file, 0, strrpos($file, '.')); foreach ($_ENV['fileNameLoaded'] as $entry) { // Si c'est pas le fichier a exclure if (!preg_match('/^'.$fileWithoutDot.'\.[0-9a-zA-Z]*$/', $entry)) { array_push($newFilenames, $entry); } } $_ENV['fileNameLoaded'] = $newFilenames; Maarch_AutoImport_writeLog($message.", le fichier ".$file." sera ignoré", 'KO', 'WARN'); } function excludeFile($file, $message, $hash, $identifier, $codeUnite, $code = '3.1.0') { $newFilenames = array(); $fileWithoutDot = substr($file, 0, strrpos($file, '.')); foreach ($_ENV['fileNameLoaded'] as $entry) { // Si c'est pas le fichier a exclure if (!preg_match('/^'.$fileWithoutDot.'\.[0-9a-zA-Z]*$/', $entry)) { array_push($newFilenames, $entry); } // Sinon on le déplace else { Maarch_AutoImport_putFileInError($_ENV['sid'].DIRECTORY_SEPARATOR.$entry); } } $_ENV['fileNameLoaded'] = $newFilenames; erreur($message, $file, $identifier, $codeUnite, $hash, false, false, $code); } function start() { global $CONFIG; $_ENV['crvPath'] = $CONFIG->CRV_PATH; $_ENV['crvDtd'] = $CONFIG->CRV_DTD_URL; Maarch_AutoImport_writeLog("Début du versement d'un lot", 'OK', 'INFO'); } function stop() { Maarch_AutoImport_writeLog("Fin du versement d'un lot", 'OK', 'INFO'); } $plugins->register("program_start", "start"); $plugins->register("program_end", "stop"); $plugins->register("insert_end", "addIdjs"); $plugins->register("error_docserver_end", "docserverError"); $plugins->register("error_database_begin", "databaseError"); $plugins->register("filenames_loaded_end", "verifFormat");