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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1860 - (hide annotations)
Tue May 7 11:58:17 2013 UTC (11 years, 8 months ago) by fmichon
File size: 24143 byte(s)
Modification du constructeur de digitalizedDocument pour ne pas instancier la classe utils et modifcation des tests en conséquence. Il faut noter l'ajout du fichier bootstrap.php à appeler avec l'option --bootstrap lors de l'exécution des tests.

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26