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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5024 - (hide annotations)
Wed Nov 2 14:39:23 2016 UTC (8 years, 3 months ago) by softime
File size: 21573 byte(s)
* Merge de la branche de développement 3.33.x

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26