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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2020 - (show annotations)
Wed Jun 19 08:19:36 2013 UTC (11 years, 7 months ago) by softime
File size: 18671 byte(s)
Modification des noms de métadonnées dans la classe DigitalizedDocument + correction du run_testsuite : pas besoin d'envoyer bootstrap pour les tests sur le REST

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 * Constructeur
51 */
52 public function __construct($f) {
53
54 //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 //
66 $this->f = $f;
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 la variable globale de 'f'
89 unset($GLOBALS['f']);
90
91 }
92
93 /**
94 * 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 * 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 && strcasecmp(strstr($file, '.'), ".pdf") == 0) {
145
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 } else {
157
158 //Sinon renvoi null
159 $this->addToLog($this->NO_REP);
160 return null;
161 }
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 //Si aucun type de document n'a pu être extrait
215 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['title'] = $type_doc;
225
226 }
227
228 //Formate la date du document
229 $metadata["dateEvenementDocument"] = 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 * Cette fonction permet de créer un document temporaire dans le filesystem
288 * @param string $file_content Contenu du fichier
289 * @param array $metadata Métadonnées du fichier
290 * @return string $uid identifiant du document dans le filesystem
291 */
292 public function createFileTemporary($file_content, $metadata) {
293
294 //Création du fichier sur le filestorage
295 $uid = $this->filestorage->create_temporary($file_content, $metadata);
296
297 //Retourne l'identifiant unique du fichier créé
298 return $uid;
299
300 }
301
302 /**
303 * Permet de lier le document importé à l'application et de le créer dans le filestorage
304 * @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 */
312 public function createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $db, $DEBUG = NULL) {
313
314 //Maj en ajout
315 $document_numerise->setParameter("maj",0);
316
317 //Extrait les informations du nom du document
318 $metadataFromFilename = $this->extractMetadataFromFilename($filename);
319
320 //Données
321 $values = array(
322 'document_numerise' => '',
323 'uid' => 'tmp|'.$uid,
324 'dossier' => $dossier,
325 'nom_fichier' => '',
326 'date_creation' => $metadataFromFilename['dateEvenementDocument'],
327 'document_numerise_type' => $this->get_document_numerise_by_code($metadataFromFilename['title']),
328 );
329
330 //Ajoute dans la table le lien
331 $document_numerise->ajouter($values, $db, $DEBUG);
332
333 //Si le document n'est pas ajouté
334 if (!$document_numerise->correct) {
335
336 //Log d'erreur
337 $this->addToLog($this->NO_LINK);
338 return false;
339 }
340
341 return $document_numerise->valF['document_numerise'];
342 }
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 public function moveDocumentNumerise($pathSrc, $pathDes, $filename) {
353
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 * 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 * @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
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 //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 $dateLimit = date('d-m-Y', strtotime("- $nbDay day", strtotime(date('d-m-Y'))));
406 $dateLimit = new DateTime($dateLimit);
407 $dateLimit = $dateLimit->format('Ymd');
408
409 //Si la date du fichier à dépassé la date limite
410 if ($dateImport <= $dateLimit) {
411
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 $this->addToLog($this->NO_DELETE_FILE.$file);
425 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 $this->addToLog($this->NO_DELETE_FOLDER);
443 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 function run_import($pathSrc, $pathDes, $DEBUG = NULL) {
456
457 //Récupération du nom du répertoire
458 $foldername = substr(strrchr($pathSrc, "/"), 1);
459
460 //Identifiant du dossier
461 $dossier = str_replace('.', '', $foldername);
462
463 //Instancie la class document_numerise
464 require_once "../obj/document_numerise.class.php";
465 $document_numerise = new document_numerise("]", $this->f->db, $DEBUG);
466
467 //Valeur retour formulaire
468 $document_numerise->retourformulaire = "dossier_instruction";
469
470 //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 //Données récupérées pour le filestorage
484 $metadata = $this->extractMetadataToFilestorage($pathSrc, $filename);
485
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 //Créer le fichier temporaire
493 $uid = $this->createFileTemporary($file_content, $metadata);
494
495 //Si le fichier est créé
496 if ($uid !== null) {
497
498 //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
501 //Si le document est crée sur le filestorage
502 if ($createFileStorage !== false) {
503
504 //On déplace le document créé dans le filestorage
505 //du dossier des "à traiter" vers celui des "traités"
506 $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
507
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 if ($listFiles !== null) {
532
533 //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
540 //il faut renseigner la date d'import du fichier
541 $dateImport = date("Y-m-d", filemtime($file));
542
543 } else {
544
545 //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 $purgeFiles = $this->purgeFiles($file, $dateImport, $nbDay);
552 }
553
554 }
555
556 //Si il n'y a plus de document
557 if ($listFiles === null) {
558
559 //on supprime le dossier
560 $deleteFolder = $this->deleteFolder($path);
561 //Si le dossier n'a pas été supprimé on retourne false
562 if (!$deleteFolder) {
563
564 return false;
565 }
566 }
567
568 //Si il n'y a pas d'erreur on retourne true
569 return true;
570
571 }
572
573 }
574
575 ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26