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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1851 - (show annotations)
Mon May 6 15:10:00 2013 UTC (11 years, 8 months ago) by softime
File size: 24682 byte(s)
Amélioration de la class digitalizedDocument : ajout de log sur deleteFolder et purgeFiles + suppression de la fonction checkLinkFile
Amélioration des tests de la class digitalizedDocument : ajout de la fonction checkLinkFile + amélioration des vérifications de retour de fonction

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26