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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3339 - (show annotations)
Tue Mar 17 17:54:37 2015 UTC (9 years, 10 months ago) by nhaye
File size: 21276 byte(s)
Correction de la purge des documents numérisés qui ne se finalisé pas correctement

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

Properties

Name Value
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26