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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1876 - (hide annotations)
Thu May 16 15:24:36 2013 UTC (11 years, 8 months ago) by softime
File size: 23984 byte(s)
Modification formulaire document_numerise pour ajout de fichier manuel + modification de la class digitalizedDocument (peaufinage) + ajout de la table document_numerise_type_categorie

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26