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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5254 - (show annotations)
Fri Nov 25 10:59:14 2016 UTC (8 years, 2 months ago) by nhaye
File size: 21522 byte(s)
Merge de la branche d'application des nouvelles actions (passage des lots en nouvelles actions)

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26