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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1900 - (hide annotations)
Fri May 24 13:23:53 2013 UTC (11 years, 8 months ago) by nhaye
File size: 22246 byte(s)
Configuration de la récupération des métadonnées pour le champ uid de la classe document_numerise,
ajout de paramètres contenant certaines informations (métadonnées) globales à l'application

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26