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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1953 - (hide annotations)
Wed May 29 16:36:59 2013 UTC (11 years, 8 months ago) by softime
File size: 18750 byte(s)
MAJ HISTORY.txt + MAJ des tests + amélioration verification obj dans document_numerise.class + Changement des attributs dans la classe digitalizedDocument

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 softime 1953 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 softime 1851
37 softime 1835 /**
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     * Constructeur
51     */
52 fmichon 1860 public function __construct($f) {
53 softime 1835
54 softime 1953 //Set des attributs
55     $this->NO_REP = _("Le dossier n'existe pas.");
56     $this->NO_FILES = _("Le dossier est vide.");
57     $this->NO_FILE_EXIST = _("Le fichier n'existe pas.");
58     $this->DOC_NO_CONFORME = _("Le document n'est pas conforme a la regle RG2 : ");
59     $this->NO_LINK = _("Le lien entre le document et le dossier d'instruction n'a pu etre etabli.");
60     $this->NO_MOVE = _("Le fichier n'a pas pu etre deplace.");
61     $this->NO_DELETE_FOLDER = _("Le dossier n'a pas pu etre supprime");
62     $this->NO_DELETE_FILE = _("Le fichier n'a pas pu etre supprime : ");
63     $this->NO_IMPORT = _("L'importation a été annulee.");
64    
65 fmichon 1860 //
66     $this->f = $f;
67 softime 1835 // Permet lors de l'instantiation d'objets métiers d'avoir accès à f
68     $GLOBALS['f'] = $this->f;
69    
70     // initialise le msg attribute qui est utilise pour stocker les
71     // messages de retour (reussite ou erreur)
72     $this->msg = '';
73    
74     //Instance de filestorage
75     $this->filestorage = $this->f->storage;
76    
77     }
78    
79     /**
80     * Destructeur
81     */
82     public function __destruct() {
83    
84     //Détruit les instance de utils et filestorage
85     unset($this->f);
86     unset($this->filestorage);
87    
88 softime 1929 //Détruit la variable globale de 'f'
89 softime 1835 unset($GLOBALS['f']);
90    
91     }
92    
93     /**
94 softime 1929 * Récupère l'identifiant du type de document par rapport au code
95     * @param string $code Code du type de document
96     * @return int Identifiant du type de document
97     */
98     private function get_document_numerise_by_code($code) {
99    
100     //Requête SQL
101     $sql = "SELECT document_numerise_type
102     FROM ".DB_PREFIXE."document_numerise_type
103     WHERE code = '".$code."'";
104     $document_numerise_type = $this->f->db->getOne($sql);
105     $this->f->addToLog("obj/digitalizedDocument.class.php : db->getOne(".$sql.")", VERBOSE_MODE);
106     $this->f->isDatabaseError($document_numerise_type);
107    
108     //retourne la clé primaire
109     return $document_numerise_type;
110     }
111    
112     /**
113 softime 1835 * Ajoute une chaine de caracteres dans le log.
114     * @param string $message Le message qui doit etre ajouté dans le log.
115     * @param mixed $type Le mode de log.
116     */
117     protected function addToLog($message, $type = DEBUG_MODE) {
118     //
119     logger::instance()->log("class ".get_class($this)." : "."method ".__METHOD__." - ".$message, $type);
120     }
121    
122     /**
123     * Cette fonction permet de recupérer et de classer dans un tableau
124     * la liste des documents présent dans le dossier passé en paramètre
125     * @param string $path Le chemin vers le dossier
126     * @return array Tableau des documents
127     */
128     public function listFiles($path) {
129    
130     //Tableau qui sera retourné en fin de traitement
131     $listFiles = array();
132    
133     //Ouvre le répertoire
134     $dir = opendir($path);
135    
136     //Si un dossier est ouvert
137     if ($dir) {
138    
139     //Parcours le dossier
140     while(false !== ($file = readdir($dir))) {
141    
142     //Si le document est bien un fichier de type pdf
143     if($file != '.' && $file != '..' && !is_dir($dir.$file)
144 softime 1876 && strcasecmp(strstr($file, '.'), ".pdf") == 0) {
145 softime 1835
146     //Alors il est ajouté dans le tableau
147     array_push($listFiles, $file);
148    
149     }
150    
151     }
152    
153     //Ferme le répertoire
154     closedir($dir);
155    
156 softime 1851 } else {
157    
158     //Sinon renvoi null
159     $this->addToLog($this->NO_REP);
160     return null;
161 softime 1835 }
162    
163     //Si le tableau est vide on retourne null
164     if (count($listFiles) == 0) {
165    
166     $this->addToLog($this->NO_FILES);
167     return null;
168    
169     }
170    
171     //Retourne le tableau des documents
172     return $listFiles;
173    
174     }
175    
176     /**
177     * Cette fonction permet de construire les métadonnées d'un document
178     * à partir des informations du nom du fichier
179     * @param string $filename Nom du fichier
180     * @return array Tableau des metadonnées
181     */
182     public function extractMetadataFromFilename($filename) {
183    
184     //Tableau qui sera retourné en fin de traitement
185     $metadata = array();
186    
187     //Récupération de l'année
188     $year = substr($filename, 0, 4);
189     //Récupération du mois
190     $month = substr($filename, 4, 2);
191     //Récupération du jour
192     $day = substr($filename, 6, 2);
193    
194     //Vérification que l'année, le mois et le jour sont des numériques
195     if (is_numeric($year) && is_numeric($month) && is_numeric($day)) {
196    
197     //Vérification que cela correspond à une date possible
198     if (checkdate($month, $day, $year)) {
199    
200     //Récupération du type de document
201     //Si le séparateur '-' n'est pas présent
202     if (strpos($filename, '-') === false) {
203    
204     //On récupère le nom du fichier avant l'extension
205     $type_doc = substr(strstr($filename, '.', true), 8);
206    
207     } else {
208    
209     //Sinon on récupère le nom du fichier avant le '-'
210     $type_doc = substr(strstr($filename, '-', true), 8);
211    
212     }
213    
214 softime 1929 //Si aucun type de document n'a pu être extrait
215 softime 1835 if (empty($type_doc)) {
216    
217     //On retourne null
218     $this->addToLog($this->DOC_NO_CONFORME.$filename);
219     return null;
220    
221     } else {
222    
223     //Sinon on ajoute le type de document dans les métadonnées
224     $metadata['type_doc'] = $type_doc;
225    
226     }
227    
228     //Formate la date du document
229     $metadata["date_evenement"] = date("d/m/Y", mktime(0, 0, 0, $month, $day, $year));
230    
231     //Si le tableau est vide on retourne null
232     if (count($metadata) == 0) {
233    
234     $this->addToLog($this->DOC_NO_CONFORME.$filename);
235     return null;
236    
237     }
238    
239     //On retourne les métadonnées
240     return $metadata;
241     }
242     }
243    
244     //Le nom du document n'est pas conforme
245     $this->addToLog($this->DOC_NO_CONFORME.$filename);
246     return null;
247    
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 softime 1892 * Cette fonction permet de créer un document temporaire dans le filesystem
288 softime 1835 * @param string $file_content Contenu du fichier
289 softime 1892 * @param array $metadata Métadonnées du fichier
290     * @return string $uid identifiant du document dans le filesystem
291 softime 1835 */
292 softime 1929 public function createFileTemporary($file_content, $metadata) {
293 softime 1835
294     //Création du fichier sur le filestorage
295 softime 1892 $uid = $this->filestorage->create_temporary($file_content, $metadata);
296 softime 1835
297     //Retourne l'identifiant unique du fichier créé
298     return $uid;
299    
300     }
301    
302     /**
303 softime 1892 * Permet de lier le document importé à l'application et de le créer dans le filestorage
304 softime 1929 * @param object $document_numerise Instance de la classe document_numerise
305     * @param string $uid Identifiant du fichier temporaire
306     * @param string $dossier Identifiant du dossier d'instruction
307     * @param string $filename Nom du document
308     * @param mixed $db Référence à la bdd
309     * @param mixed $DEBUG Mode de debug
310     * @return boolean Vrai ou faux
311 softime 1835 */
312 softime 1929 public function createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $db, $DEBUG = NULL) {
313 softime 1835
314 softime 1929 //Maj en ajout
315 softime 1835 $document_numerise->setParameter("maj",0);
316    
317 softime 1929 //Extrait les informations du nom du document
318     $metadataFromFilename = $this->extractMetadataFromFilename($filename);
319 softime 1892
320 softime 1835 //Données
321     $values = array(
322     'document_numerise' => '',
323 softime 1929 'uid' => 'tmp|'.$uid,
324     'dossier' => $dossier,
325 softime 1892 'nom_fichier' => '',
326 softime 1929 'date_creation' => $metadataFromFilename['date_evenement'],
327 softime 1892 'document_numerise_type' => $this->get_document_numerise_by_code($metadataFromFilename['type_doc']),
328 softime 1835 );
329    
330     //Ajoute dans la table le lien
331     $document_numerise->ajouter($values, $db, $DEBUG);
332    
333 softime 1929 //Si le document n'est pas ajouté
334 softime 1851 if (!$document_numerise->correct) {
335 softime 1835
336 softime 1929 //Log d'erreur
337 softime 1835 $this->addToLog($this->NO_LINK);
338     return false;
339 softime 1851 }
340 softime 1835
341 softime 1929 return $document_numerise->valF['document_numerise'];
342 softime 1835 }
343    
344     /**
345     * Permet de déplacer les fichiers créés dans le filestorage vers le dossier
346     * des fichiers traités
347     * @param string $pathSrc Chemin du dossier source
348     * @param string $pathDes Chemin du dossier de destination
349     * @param string $filename Nom du fichier
350     * @return boolean Retourne true si le fichier à été déplacé sinon false
351     */
352 softime 1929 public function moveDocumentNumerise($pathSrc, $pathDes, $filename) {
353 softime 1835
354     //Si le dossier de destination n'existe pas, il est créé
355     if (!file_exists($pathDes)) {
356     mkdir($pathDes);
357     }
358    
359     //Déplace le document
360     $move = rename($pathSrc.'/'.$filename, $pathDes.'/'.$filename);
361    
362     //Si le déplacement à réussi
363     if ($move) {
364    
365     //On retourne TRUE
366     return true;
367     }
368    
369     //Si le deplacement n'est pas fait on retourne false
370     $this->addToLog($this->NO_MOVE);
371     return false;
372    
373     }
374    
375     /**
376     * Cette fonction permet de vider un répertoire
377 softime 1851 * Si la date d'import du fichier et le nombre de jour ne sont pas renseignés
378     * alors les fichiers sont supprimés sans vérification sur la date
379 softime 1835 * @param string $file Fichier traité
380     * @param date $dateImport Date de l'importation du fichier
381     * @param int $nbDay Nombre de jour à soustraite à la date du jour
382     * @return boolean true si le traitement à été fait sinon false
383     */
384     public function purgeFiles($file, $dateImport = null, $nbDay = null) {
385 softime 1942
386     //Si la date et le nombre de jour ne sont pas renseigné
387     if (($nbDay == 'null' || $nbDay == null || $nbDay == '')
388     && ($dateImport == 'null' || $dateImport == null || $dateImport == '')) {
389    
390     //On supprime le fichier sans faire de test
391     if (unlink($file)) {
392    
393     return true;
394    
395     }
396    
397     //Si la date d'import et le nombre de jour sont renseignés
398     } else {
399    
400 softime 1892 //Date d'import dans un format correct pour la comparaison
401     $dateImport = new DateTime($dateImport);
402     $dateImport = $dateImport->format('Ymd');
403    
404     //Date limite pour la suppresion des fichier (Date du jour - 60 jours)
405 softime 1835 $dateLimit = date('d-m-Y', strtotime("- $nbDay day", strtotime(date('d-m-Y'))));
406 softime 1892 $dateLimit = new DateTime($dateLimit);
407     $dateLimit = $dateLimit->format('Ymd');
408    
409 softime 1835 //Si la date du fichier à dépassé la date limite
410 softime 1892 if ($dateImport <= $dateLimit) {
411 softime 1835
412     //on supprime le fichier
413     if (unlink($file)) {
414    
415     return true;
416    
417     }
418    
419     }
420    
421     }
422    
423     //Si aucun traitement n'a été fait on retourne false
424 softime 1851 $this->addToLog($this->NO_DELETE_FILE.$file);
425 softime 1835 return false;
426    
427     }
428    
429     /**
430     * Cette fonction permet de supprimer un dossier
431     * @param string $path Chemin du dossier
432     * @return boolean Retourn vrai si le dossier à été supprimé sinon faux
433     */
434     public function deleteFolder($path) {
435    
436     //Si le fichier est supprimé on retourne true
437     if (rmdir($path)) {
438     return true;
439     }
440    
441     //Si le fichier n'a pas été supprimé on retourne false
442 softime 1851 $this->addToLog($this->NO_DELETE_FOLDER);
443 softime 1835 return false;
444    
445     }
446    
447     /**
448     * Cette fonction permet de lancer toutes les fonctions utiles
449     * à l'importation des documents scannés
450     * @param string $pathSrc Le chemin vers le dossier à traiter
451     * @param string $pathDes Le chemin vers le dossier après le traitement
452     * @param mixed $DEBUG mode de débuggage
453     * @return boolean true si le traitement à été fait sinon false
454     */
455 softime 1876 function run_import($pathSrc, $pathDes, $DEBUG = NULL) {
456 softime 1835
457     //Récupération du nom du répertoire
458     $foldername = substr(strrchr($pathSrc, "/"), 1);
459 nhaye 1900
460 softime 1929 //Identifiant du dossier
461     $dossier = str_replace('.', '', $foldername);
462 nhaye 1900
463 softime 1929 //Instancie la class document_numerise
464     require_once "../obj/document_numerise.class.php";
465     $document_numerise = new document_numerise("]", $this->f->db, $DEBUG);
466 softime 1835
467 softime 1929 //Valeur retour formulaire
468     $document_numerise->retourformulaire = "dossier_instruction";
469    
470 softime 1835 //Liste les documents contenus dans le dossier
471     $listFiles = $this->listFiles($pathSrc);
472     //Si il n'y a aucun document
473     if ($listFiles === null) {
474     //On annule l'importation
475     $this->addToLog($this->NO_IMPORT);
476     return false;
477     }
478    
479     foreach ($listFiles as $key => $filename) {
480    
481     //Construit les métadonnées
482     $metadata = array();
483 nhaye 1900 //Données récupérées pour le filestorage
484     $metadata = $this->extractMetadataToFilestorage($pathSrc, $filename);
485 softime 1835
486     //S'il y a des métadonnées
487     if ($metadata !== null) {
488    
489     //Recupère le contenu du fichier
490     $file_content = file_get_contents($pathSrc.'/'.$filename);
491    
492 softime 1929 //Créer le fichier temporaire
493     $uid = $this->createFileTemporary($file_content, $metadata);
494    
495 softime 1835 //Si le fichier est créé
496     if ($uid !== null) {
497    
498 softime 1929 //Créer le document sur le filestorage et dans la table document_numerise
499     $createFileStorage = $this->createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $this->f->db, $DEBUG);
500 softime 1835
501 softime 1929 //Si le document est crée sur le filestorage
502     if ($createFileStorage !== false) {
503 softime 1835
504 softime 1929 //On déplace le document créé dans le filestorage
505 softime 1835 //du dossier des "à traiter" vers celui des "traités"
506 softime 1929 $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
507 softime 1835
508     }
509    
510     }
511     }
512    
513     }//Fin foreach
514    
515     //Retourne true
516     return true;
517    
518     }
519    
520     /**
521     * Cette fonction permet de lancer toutes les fonctions utiles à la purge de dossier
522     * @param string $path Le chemin vers le dossier
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     function run_purge($path, $nbDay = null) {
527    
528     //Liste les documents contenus dans le dossier
529     $listFiles = $this->listFiles($path);
530    
531 softime 1934 if ($listFiles !== null) {
532 softime 1835
533 softime 1934 //Parcours la liste des fichiers
534     foreach ($listFiles as $key => $filename) {
535     //Fichier
536     $file = $path.'/'.$filename;
537     //Si le nombre de jour est renseigné
538     if ($nbDay !== null) {
539 softime 1835
540 softime 1934 //il faut renseigner la date d'import du fichier
541     $dateImport = date("Y-m-d", filemtime($file));
542 softime 1835
543 softime 1934 } else {
544 softime 1835
545 softime 1934 //Sinon la date d'import est null
546     $dateImport = null;
547    
548     }
549    
550     //S'il n'y pas d'erreur on exécute la fonction purgeFiles
551     $this->purgeFiles($file, $dateImport, $nbDay);
552 softime 1835 }
553 softime 1934
554     //Analyse le dossier après traitement
555     $listFiles = $this->listFiles($path);
556 softime 1835 }
557    
558     //Si il n'y a plus de document
559     if ($listFiles === null) {
560    
561     //on supprime le dossier
562     $deleteFolder = $this->deleteFolder($path);
563     //Si le dossier n'a pas été supprimé on retourne false
564     if (!$deleteFolder) {
565    
566     return false;
567     }
568     }
569    
570     //Si il n'y a pas d'erreur on retourne true
571     return true;
572    
573     }
574    
575     }
576    
577     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26