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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2747 - (hide annotations)
Tue Feb 18 17:56:26 2014 UTC (10 years, 11 months ago) by vpihour
File size: 19218 byte(s)
Correction du script d'import des documents numérisés

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 softime 2020 $metadata['title'] = $type_doc;
225 softime 1835
226     }
227    
228     //Formate la date du document
229 softime 2020 $metadata["dateEvenementDocument"] = date("d/m/Y", mktime(0, 0, 0, $month, $day, $year));
230 softime 1835
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 2020 'date_creation' => $metadataFromFilename['dateEvenementDocument'],
327     'document_numerise_type' => $this->get_document_numerise_by_code($metadataFromFilename['title']),
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 softime 1979 || ($dateImport == 'null' || $dateImport == null || $dateImport == '')) {
389 softime 1942
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 vpihour 2747 //On vérifie que le dossier existe
464     $sql = "SELECT dossier
465     FROM ".DB_PREFIXE."dossier
466     WHERE dossier = '".$dossier."'";
467     $dossierExist = $this->f->db->getOne($sql);
468     $this->f->addToLog("obj/digitalizedDocument.class.php : db->getOne(".$sql.")", VERBOSE_MODE);
469     $this->f->isDatabaseError($dossierExist);
470    
471     //Si le dossier n'existe pas on annule l'importation
472     if (!$dossierExist){
473     $this->addToLog($this->NO_IMPORT);
474     return false;
475     }
476    
477 softime 1929 //Instancie la class document_numerise
478     require_once "../obj/document_numerise.class.php";
479     $document_numerise = new document_numerise("]", $this->f->db, $DEBUG);
480 softime 1835
481 softime 1929 //Valeur retour formulaire
482     $document_numerise->retourformulaire = "dossier_instruction";
483    
484 softime 1835 //Liste les documents contenus dans le dossier
485     $listFiles = $this->listFiles($pathSrc);
486     //Si il n'y a aucun document
487     if ($listFiles === null) {
488     //On annule l'importation
489     $this->addToLog($this->NO_IMPORT);
490     return false;
491     }
492    
493     foreach ($listFiles as $key => $filename) {
494    
495     //Construit les métadonnées
496     $metadata = array();
497 nhaye 1900 //Données récupérées pour le filestorage
498     $metadata = $this->extractMetadataToFilestorage($pathSrc, $filename);
499 softime 1835
500     //S'il y a des métadonnées
501     if ($metadata !== null) {
502    
503     //Recupère le contenu du fichier
504     $file_content = file_get_contents($pathSrc.'/'.$filename);
505    
506 softime 1929 //Créer le fichier temporaire
507     $uid = $this->createFileTemporary($file_content, $metadata);
508    
509 softime 1835 //Si le fichier est créé
510     if ($uid !== null) {
511    
512 softime 1929 //Créer le document sur le filestorage et dans la table document_numerise
513     $createFileStorage = $this->createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $this->f->db, $DEBUG);
514 softime 1835
515 softime 1929 //Si le document est crée sur le filestorage
516     if ($createFileStorage !== false) {
517 softime 1835
518 softime 1929 //On déplace le document créé dans le filestorage
519 softime 1835 //du dossier des "à traiter" vers celui des "traités"
520 softime 1929 $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
521 softime 1835
522     }
523    
524     }
525     }
526    
527     }//Fin foreach
528    
529     //Retourne true
530     return true;
531    
532     }
533    
534     /**
535     * Cette fonction permet de lancer toutes les fonctions utiles à la purge de dossier
536     * @param string $path Le chemin vers le dossier
537     * @param int $nbDay Nombre de jour à soustraite à la date du jour
538     * @return boolean true si le traitement à été fait sinon false
539     */
540     function run_purge($path, $nbDay = null) {
541    
542     //Liste les documents contenus dans le dossier
543     $listFiles = $this->listFiles($path);
544    
545 softime 1934 if ($listFiles !== null) {
546 softime 1835
547 softime 1934 //Parcours la liste des fichiers
548     foreach ($listFiles as $key => $filename) {
549     //Fichier
550     $file = $path.'/'.$filename;
551     //Si le nombre de jour est renseigné
552     if ($nbDay !== null) {
553 softime 1835
554 softime 1934 //il faut renseigner la date d'import du fichier
555     $dateImport = date("Y-m-d", filemtime($file));
556 softime 1835
557 softime 1934 } else {
558 softime 1835
559 softime 1934 //Sinon la date d'import est null
560     $dateImport = null;
561    
562     }
563    
564     //S'il n'y pas d'erreur on exécute la fonction purgeFiles
565 softime 1979 $purgeFiles = $this->purgeFiles($file, $dateImport, $nbDay);
566 softime 1835 }
567 softime 1934
568 softime 1835 }
569    
570     //Si il n'y a plus de document
571     if ($listFiles === null) {
572    
573     //on supprime le dossier
574     $deleteFolder = $this->deleteFolder($path);
575     //Si le dossier n'a pas été supprimé on retourne false
576     if (!$deleteFolder) {
577    
578     return false;
579     }
580     }
581    
582     //Si il n'y a pas d'erreur on retourne true
583     return true;
584    
585     }
586    
587     }
588    
589     ?>

Properties

Name Value
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26