/[openfoncier]/trunk/obj/digitalizedDocument.class.php
ViewVC logotype

Annotation of /trunk/obj/digitalizedDocument.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4700 - (hide annotations)
Fri Jul 1 13:47:45 2016 UTC (8 years, 7 months ago) by fmichon
File size: 21850 byte(s)
* Amélioration - Optimisation des logs dans le contexte de la numérisation des
  pièces : suppression du message de log d'erreur concernant les répertoires de
  numérisation vides, vidage des logs à la destruction de la classe utils pour
  éviter la duplication des messages lors de l'exécution des tests.
  Ticket #8416.

1 mbroquet 3730 <?php
2     /**
3     * Ce fichier permet la déclaration de la class DigitalizedDocument
4     * conçus pour gérer les fichiers scannés
5     *
6     * @package openads
7     * @version SVN : $Id
8     */
9    
10    
11    
12     /**
13     * Cette classe permet d'effectuer les traitements sur les documents à incorporer dans l'application
14     *
15     * Pour imorter les données depuis un dossier il faut utiliser run_import dans une boucle
16     * qui parcourt le dossier qui abrite les répertoires des dossiers d'instructions
17     *
18     * Pour purger les documents il faut utiliser la fonction run_purge dans une boucle
19     * qui parcourt le dossier qui abrite les répertoires des dossiers d'instructions
20     */
21     class DigitalizedDocument {
22    
23     /**
24     * @access static
25     * @var string Messages utilisées pour l'écriture dans le log
26     */
27     var $NO_REP;
28     var $NO_FILES;
29     var $NO_FILE_EXIST;
30     var $DOC_NO_CONFORME;
31     var $NO_LINK;
32     var $NO_MOVE;
33     var $NO_DELETE_FOLDER;
34     var $NO_DELETE_FILE;
35     var $NO_IMPORT;
36    
37     /**
38     * Instance de la classe utils
39     * @var utils
40     */
41     var $f = NULL;
42    
43     /**
44     * Instance du filestorage
45     * @var storage
46     */
47     var $filestorage = NULL;
48    
49     /**
50     * Nom des fichiers qui ne se sont pas importés
51     * @var array
52     */
53     var $filenameError = array();
54    
55     /**
56     * Constructeur
57     */
58     public function __construct($f) {
59    
60     //Set des attributs
61     $this->NO_REP = _("Le dossier n'existe pas.");
62     $this->NO_FILES = _("Le dossier est vide.");
63     $this->NO_FILE_EXIST = _("Le fichier n'existe pas.");
64     $this->DOC_NO_CONFORME = _("Le document n'est pas conforme a la regle RG2 : ");
65     $this->NO_LINK = _("Le lien entre le document et le dossier d'instruction n'a pu etre etabli.");
66     $this->NO_MOVE = _("Le fichier n'a pas pu etre deplace.");
67     $this->NO_DELETE_FOLDER = _("Le dossier n'a pas pu etre supprime");
68     $this->NO_DELETE_FILE = _("Le fichier n'a pas pu etre supprime : ");
69     $this->NO_IMPORT = _("L'importation a été annulee.");
70    
71     //
72     $this->f = $f;
73     // Permet lors de l'instantiation d'objets métiers d'avoir accès à f
74     $GLOBALS['f'] = $this->f;
75    
76     // initialise le msg attribute qui est utilise pour stocker les
77     // messages de retour (reussite ou erreur)
78     $this->msg = '';
79    
80     //Instance de filestorage
81     $this->filestorage = $this->f->storage;
82    
83     }
84    
85     /**
86     * Destructeur
87     */
88     public function __destruct() {
89    
90     //Détruit les instance de utils et filestorage
91     unset($this->f);
92     unset($this->filestorage);
93    
94     //Détruit la variable globale de 'f'
95     unset($GLOBALS['f']);
96    
97 fmichon 4700 // La destruction de $this->f écrit les logs dans un fichier
98     // il est nécessaire de les vider pour ne pas réécrire les
99     // même logs lors de l'éventuelle prochaine instanciation de
100     // cette même classe.
101     logger::instance()->cleanLog();
102    
103 mbroquet 3730 }
104    
105     /**
106     * Récupère l'identifiant du type de document par rapport au code
107     * @param string $code Code du type de document
108     * @return int Identifiant du type de document
109     */
110     private function get_document_numerise_by_code($code) {
111    
112     //Requête SQL
113     $sql = "SELECT document_numerise_type
114     FROM ".DB_PREFIXE."document_numerise_type
115     WHERE code = '".$code."'";
116     $document_numerise_type = $this->f->db->getOne($sql);
117 fmichon 4700 $this->f->addToLog(__METHOD__."(): db->getOne(".$sql.")", VERBOSE_MODE);
118 mbroquet 3730 $this->f->isDatabaseError($document_numerise_type);
119    
120     //retourne la clé primaire
121     return $document_numerise_type;
122     }
123    
124     /**
125     * Ajoute une chaine de caracteres dans le log.
126     * @param string $message Le message qui doit etre ajouté dans le log.
127     * @param mixed $type Le mode de log.
128     */
129     protected function addToLog($message, $type = DEBUG_MODE) {
130     //
131 fmichon 4700 logger::instance()->log($message, $type);
132 mbroquet 3730 }
133    
134     /**
135     * Cette fonction permet de recupérer et de classer dans un tableau
136     * la liste des documents présent dans le dossier passé en paramètre
137     * @param string $path Le chemin vers le dossier
138     * @return array Tableau des documents
139     */
140     public function listFiles($path) {
141    
142     //Tableau qui sera retourné en fin de traitement
143     $listFiles = array();
144    
145     //Ouvre le répertoire
146     $dir = opendir($path);
147    
148     //Si un dossier est ouvert
149     if ($dir) {
150    
151     //Parcours le dossier
152     while(false !== ($file = readdir($dir))) {
153    
154     //Si le document est bien un fichier de type pdf
155     if($file != '.' && $file != '..' && !is_dir($dir.$file)
156     && strcasecmp(strstr($file, '.'), ".pdf") == 0) {
157    
158     //Alors il est ajouté dans le tableau
159     array_push($listFiles, $file);
160    
161     }
162    
163     }
164    
165     //Ferme le répertoire
166     closedir($dir);
167    
168     } else {
169    
170     //Sinon renvoi null
171 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_REP);
172 mbroquet 3730 return null;
173     }
174    
175     //Si le tableau est vide on retourne null
176     if (count($listFiles) == 0) {
177    
178 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_FILES, EXTRA_VERBOSE_MODE);
179 mbroquet 3730 return null;
180    
181     }
182    
183     //Retourne le tableau des documents
184     return $listFiles;
185    
186     }
187    
188     /**
189     * Cette fonction permet de construire les métadonnées d'un document
190     * à partir des informations du nom du fichier
191     * @param string $filename Nom du fichier
192     * @return array Tableau des metadonnées
193     */
194     public function extractMetadataFromFilename($filename) {
195    
196     //Tableau qui sera retourné en fin de traitement
197     $metadata = array();
198    
199     //Récupération de l'année
200     $year = substr($filename, 0, 4);
201     //Récupération du mois
202     $month = substr($filename, 4, 2);
203     //Récupération du jour
204     $day = substr($filename, 6, 2);
205    
206     //Vérification que l'année, le mois et le jour sont des numériques
207     if (is_numeric($year) && is_numeric($month) && is_numeric($day)) {
208    
209     //Vérification que cela correspond à une date possible
210     if (checkdate($month, $day, $year)) {
211    
212     //Récupération du type de document
213     //Si le séparateur '-' n'est pas présent
214     if (strpos($filename, '-') === false) {
215    
216     //On récupère le nom du fichier avant l'extension
217     $type_doc = substr(strstr($filename, '.', true), 8);
218    
219     } else {
220    
221     //Sinon on récupère le nom du fichier avant le '-'
222     $type_doc = substr(strstr($filename, '-', true), 8);
223    
224     }
225    
226     //Si aucun type de document n'a pu être extrait
227     if (empty($type_doc)) {
228    
229     //On retourne null
230 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
231 mbroquet 3730 return null;
232    
233     } else {
234    
235     //Sinon on ajoute le type de document dans les métadonnées
236     $metadata['title'] = $type_doc;
237    
238     }
239    
240     //Formate la date du document
241     $metadata["dateEvenementDocument"] = date("d/m/Y", mktime(0, 0, 0, $month, $day, $year));
242    
243     //Si le tableau est vide on retourne null
244     if (count($metadata) == 0) {
245    
246 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
247 mbroquet 3730 return null;
248    
249     }
250    
251     //On retourne les métadonnées
252     return $metadata;
253     }
254     }
255    
256     //Le nom du document n'est pas conforme
257 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
258 mbroquet 3730 return null;
259    
260     }
261    
262     /**
263     * Cette fonction permet de récupérer des informations sur le fichier
264     * nécessaire pour le filestorage
265     * @param string $path Chemin du dossier
266     * @param string $filename Nom du fichier
267     * @return array Tableau des métadonnées
268     */
269     public function extractMetadataToFilestorage($path, $filename) {
270    
271     //Test si le fichier existe
272     if (!file_exists($path.'/'.$filename)) {
273     //
274 fmichon 4700 $this->addToLog(__METHOD__.'(): '.$path.'/'.$filename.' : '.$this->NO_FILE_EXIST);
275 mbroquet 3730 return null;
276     }
277    
278     //Tableau qui sera retourné en fin de traitement
279     $metadata = array();
280    
281     //Métadonnées nécessaire au filestorage
282     $metadata["filename"] = $filename;
283     $metadata["size"] = filesize($path.'/'.$filename);
284     $metadata["mimetype"] = mime_content_type($path.'/'.$filename);
285    
286     //Si le tableau est vide on retourne null
287     if (count($metadata) == 0) {
288    
289 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
290 mbroquet 3730 return null;
291    
292     }
293    
294     //Retourne le tableau des métadonnées
295     return $metadata;
296     }
297    
298     /**
299     * Cette fonction permet de créer un document temporaire dans le filesystem
300     * @param string $file_content Contenu du fichier
301     * @param array $metadata Métadonnées du fichier
302     * @return string $uid identifiant du document dans le filesystem
303     */
304     public function createFileTemporary($file_content, $metadata) {
305    
306     //Création du fichier sur le filestorage
307     $uid = $this->filestorage->create_temporary($file_content, $metadata);
308    
309     //Retourne l'identifiant unique du fichier créé
310     return $uid;
311    
312     }
313    
314     /**
315     * Permet de lier le document importé à l'application et de le créer dans le filestorage
316     * @param object $document_numerise Instance de la classe document_numerise
317     * @param string $uid Identifiant du fichier temporaire
318     * @param string $dossier Identifiant du dossier d'instruction
319     * @param string $filename Nom du document
320     * @param mixed $db Référence à la bdd
321     * @param mixed $DEBUG Mode de debug
322     * @return boolean Vrai ou faux
323     */
324     public function createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $db, $DEBUG = NULL) {
325    
326     //Maj en ajout
327     $document_numerise->setParameter("maj",0);
328    
329     //Extrait les informations du nom du document
330     $metadataFromFilename = $this->extractMetadataFromFilename($filename);
331    
332     //Données
333     $values = array(
334     'document_numerise' => '',
335     'uid' => 'tmp|'.$uid,
336     'dossier' => $dossier,
337     'nom_fichier' => $filename,
338     'date_creation' => $metadataFromFilename['dateEvenementDocument'],
339     'document_numerise_type' => $this->get_document_numerise_by_code($metadataFromFilename['title']),
340     );
341    
342     //Ajoute dans la table le lien
343     $document_numerise->ajouter($values, $db, $DEBUG);
344    
345     //Si le document n'est pas ajouté
346     if (!$document_numerise->correct) {
347    
348     //Log d'erreur
349 fmichon 4700 $this->addToLog(__METHOD__."(): ".$dossier."/".$filename." : "._("Une erreur s'est produite lors de l'ajout du document ").$filename.".");
350     $this->addToLog(__METHOD__."(): ".$document_numerise->msg);
351 mbroquet 3730 return false;
352     }
353    
354     return $document_numerise->valF['document_numerise'];
355     }
356    
357     /**
358     * Permet de déplacer les fichiers créés dans le filestorage vers le dossier
359     * des fichiers traités
360     * @param string $pathSrc Chemin du dossier source
361     * @param string $pathDes Chemin du dossier de destination
362     * @param string $filename Nom du fichier
363     * @return boolean Retourne true si le fichier à été déplacé sinon false
364     */
365     public function moveDocumentNumerise($pathSrc, $pathDes, $filename) {
366    
367     //Si le dossier de destination n'existe pas, il est créé
368     if (!file_exists($pathDes)) {
369     mkdir($pathDes);
370     }
371    
372     //Déplace le document
373     $move = rename($pathSrc.'/'.$filename, $pathDes.'/'.$filename);
374    
375     //Si le déplacement à réussi
376     if ($move) {
377    
378     //On retourne TRUE
379     return true;
380     }
381    
382     //Si le deplacement n'est pas fait on retourne false
383 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/".$filename." : ".$this->NO_MOVE);
384 mbroquet 3730 return false;
385    
386     }
387    
388     /**
389     * Cette fonction permet de vider un répertoire
390     * Si la date d'import du fichier et le nombre de jour ne sont pas renseignés
391     * alors les fichiers sont supprimés sans vérification sur la date
392     * @param string $file Fichier traité
393     * @param date $dateImport Date de l'importation du fichier
394     * @param int $nbDay Nombre de jour à soustraite à la date du jour
395     * @return boolean true si le traitement à été fait sinon false
396     */
397     public function purgeFiles($file, $dateImport = null, $nbDay = null) {
398    
399     //Si la date et le nombre de jour ne sont pas renseigné
400     if (($nbDay == 'null' || $nbDay == null || $nbDay == '')
401     || ($dateImport == 'null' || $dateImport == null || $dateImport == '')) {
402    
403     //On supprime le fichier sans faire de test
404     if (unlink($file)) {
405    
406     return true;
407    
408     }
409    
410     //Si la date d'import et le nombre de jour sont renseignés
411     } else {
412    
413     //Date d'import dans un format correct pour la comparaison
414     $dateImport = new DateTime($dateImport);
415     $dateImport = $dateImport->format('Ymd');
416    
417     //Date limite pour la suppresion des fichier (Date du jour - 60 jours)
418     $dateLimit = date('d-m-Y', strtotime("- $nbDay day", strtotime(date('d-m-Y'))));
419     $dateLimit = new DateTime($dateLimit);
420     $dateLimit = $dateLimit->format('Ymd');
421    
422     //Si la date du fichier à dépassé la date limite
423     if ($dateImport <= $dateLimit) {
424    
425     //on supprime le fichier
426     if (unlink($file)) {
427    
428     return true;
429    
430     }
431    
432     }
433    
434     }
435    
436     //Si aucun traitement n'a été fait on retourne false
437 fmichon 4700 $this->addToLog(__METHOD__."(): ".$file." : ".$this->NO_DELETE_FILE.$file);
438 mbroquet 3730 return false;
439    
440     }
441    
442     /**
443     * Cette fonction permet de supprimer un dossier
444     * @param string $path Chemin du dossier
445     * @return boolean Retourn vrai si le dossier à été supprimé sinon faux
446     */
447     public function deleteFolder($path) {
448    
449     //Si le fichier est supprimé on retourne true
450     if (rmdir($path)) {
451     return true;
452     }
453    
454     //Si le fichier n'a pas été supprimé on retourne false
455 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_DELETE_FOLDER);
456 mbroquet 3730 return false;
457    
458     }
459    
460     /**
461     * Cette fonction permet de lancer toutes les fonctions utiles
462     * à l'importation des documents scannés
463     * @param string $pathSrc Le chemin vers le dossier à traiter
464     * @param string $pathDes Le chemin vers le dossier après le traitement
465     * @param mixed $DEBUG mode de débuggage
466     * @return boolean true si le traitement à été fait sinon false
467     */
468     function run_import($pathSrc, $pathDes, $DEBUG = NULL) {
469    
470     //Récupération du nom du répertoire
471     $foldername = substr(strrchr($pathSrc, "/"), 1);
472    
473     //Identifiant du dossier
474     $dossier = str_replace('.', '', $foldername);
475    
476     //Vérifie si le numéro de dossier d'instruction est sur quatres chiffres
477     if(preg_match('/[A-Za-z]{2,3}'.$this->f->getParameter("departement").
478     $this->f->getParameter("commune").'[0-9]{2}[0-9]{4}[A-Za-z]{1,5}[0-9]{1,2}/',
479     $dossier)){
480    
481     //On modifie le nom du dossier d'instruction pour qu'il ait la numérotation
482     //standard
483     $tempDossier = preg_split('/([A-Za-z]{2,3}'.$this->f->getParameter("departement").
484     $this->f->getParameter("commune").'[0-9]{2})/i', $dossier, 0, PREG_SPLIT_NO_EMPTY |
485     PREG_SPLIT_DELIM_CAPTURE);
486    
487     $dossier = $tempDossier[0]."0".$tempDossier[1];
488     }
489    
490     //On vérifie que le dossier existe
491     $sql = "SELECT dossier
492     FROM ".DB_PREFIXE."dossier
493     WHERE dossier = '".$dossier."'";
494     $dossierExist = $this->f->db->getOne($sql);
495 fmichon 4700 $this->f->addToLog(__METHOD__."(): db->getOne(".$sql.")", VERBOSE_MODE);
496 mbroquet 3730 $this->f->isDatabaseError($dossierExist);
497    
498     //Si le dossier n'existe pas on annule l'importation
499     if (!$dossierExist){
500 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/ : "._("Le dossier d'instruction n'existe pas.")." ".$this->NO_IMPORT);
501 mbroquet 3730 return false;
502     }
503    
504     //Liste les documents contenus dans le dossier
505     $listFiles = $this->listFiles($pathSrc);
506     //Si il n'y a aucun document
507     if ($listFiles === null) {
508     //On annule l'importation
509 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/ ".$this->NO_FILES." ".$this->NO_IMPORT);
510 mbroquet 3730 return false;
511     }
512    
513     foreach ($listFiles as $key => $filename) {
514    
515     //Construit les métadonnées
516     $metadata = array();
517     //Données récupérées pour le filestorage
518     $metadata = $this->extractMetadataToFilestorage($pathSrc, $filename);
519    
520     //S'il y a des métadonnées
521     if ($metadata !== null) {
522    
523     //Recupère le contenu du fichier
524     $file_content = file_get_contents($pathSrc.'/'.$filename);
525    
526     //Créer le fichier temporaire
527     $uid = $this->createFileTemporary($file_content, $metadata);
528     // On vide la mémoire utilisée par le fichier
529     unset($file_content);
530     //Si le fichier est créé
531     if ($uid !== null) {
532    
533     //Instancie la class document_numerise
534     require_once "../obj/document_numerise.class.php";
535     $document_numerise = new document_numerise("]", $this->f->db, $DEBUG);
536    
537     //Valeur retour formulaire
538     $document_numerise->retourformulaire = "dossier_instruction";
539    
540     //Créer le document sur le filestorage et dans la table document_numerise
541     $createFileStorage = $this->createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $this->f->db, $DEBUG);
542    
543     //Si le document est crée sur le filestorage
544     if ($createFileStorage !== false && $createFileStorage !== 'OP_FAILURE') {
545    
546     //On déplace le document créé dans le filestorage
547     //du dossier des "à traiter" vers celui des "traités"
548     $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
549    
550     }
551     else {
552     //On annule l'importation
553 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc." : "._("Une erreur s'est produite lors de l'ajout du document ").$filename.". ".$this->NO_IMPORT);
554 mbroquet 3730 $this->filenameError[] = $filename;
555     }
556     //Del le fichier temporaire
557     if($uid != $this->filestorage->delete_temporary($uid)) {
558 fmichon 4700 $this->addToLog(__METHOD__."(): "._("Erreur lors de la suppression du fichier temporaire")." : ".$filename);
559 mbroquet 3730 }
560     }
561     }
562    
563     }//Fin foreach
564    
565     //Retourne true
566     return true;
567    
568     }
569    
570     /**
571     * Cette fonction permet de lancer toutes les fonctions utiles à la purge de dossier
572     * @param string $path Le chemin vers le dossier
573     * @param int $nbDay Nombre de jour à soustraite à la date du jour
574     * @return boolean true si le traitement à été fait sinon false
575     */
576     function run_purge($path, $nbDay = null) {
577    
578     //Liste les documents contenus dans le dossier
579     $listFiles = $this->listFiles($path);
580     $count_purged_files = 0;
581    
582     if ($listFiles !== null) {
583    
584     //Parcours la liste des fichiers
585     foreach ($listFiles as $key => $filename) {
586     //Fichier
587     $file = $path.'/'.$filename;
588     //Si le nombre de jour est renseigné
589     if ($nbDay !== null) {
590    
591     //il faut renseigner la date d'import du fichier
592     $dateImport = date("Y-m-d", filemtime($file));
593    
594     } else {
595    
596     //Sinon la date d'import est null
597     $dateImport = null;
598    
599     }
600    
601     //S'il n'y pas d'erreur on exécute la fonction purgeFiles
602     if($this->purgeFiles($file, $dateImport, $nbDay)) {
603     unset($listFiles[$key]);
604     $count_purged_files++;
605     }
606    
607     }
608    
609     }
610    
611     //Si il n'y a plus de document
612     if (empty($listFiles)) {
613    
614     //on supprime le dossier
615     $deleteFolder = $this->deleteFolder($path);
616     //Si le dossier n'a pas été supprimé on retourne false
617     if (!$deleteFolder) {
618    
619     return false;
620     }
621     }
622    
623     //Si il n'y a pas d'erreur on retourne true
624     return $count_purged_files;
625    
626     }
627    
628     }
629    
630     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26