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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2818 - (hide annotations)
Thu Mar 13 10:19:26 2014 UTC (10 years, 10 months ago) by vpihour
File size: 19728 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 vpihour 2818
49     /**
50     * Nom des fichiers qui ne se sont pas importés
51     * @var array
52     */
53     var $filenameError = array();
54 softime 1835
55     /**
56     * Constructeur
57     */
58 fmichon 1860 public function __construct($f) {
59 softime 1835
60 softime 1953 //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 fmichon 1860 //
72     $this->f = $f;
73 softime 1835 // 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 softime 1929 //Détruit la variable globale de 'f'
95 softime 1835 unset($GLOBALS['f']);
96    
97     }
98    
99     /**
100 softime 1929 * 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 softime 1835 * 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 softime 1876 && strcasecmp(strstr($file, '.'), ".pdf") == 0) {
151 softime 1835
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 softime 1851 } else {
163    
164     //Sinon renvoi null
165     $this->addToLog($this->NO_REP);
166     return null;
167 softime 1835 }
168    
169     //Si le tableau est vide on retourne null
170     if (count($listFiles) == 0) {
171    
172     $this->addToLog($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 softime 1929 //Si aucun type de document n'a pu être extrait
221 softime 1835 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 softime 2020 $metadata['title'] = $type_doc;
231 softime 1835
232     }
233    
234     //Formate la date du document
235 softime 2020 $metadata["dateEvenementDocument"] = date("d/m/Y", mktime(0, 0, 0, $month, $day, $year));
236 softime 1835
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($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 softime 1892 * Cette fonction permet de créer un document temporaire dans le filesystem
294 softime 1835 * @param string $file_content Contenu du fichier
295 softime 1892 * @param array $metadata Métadonnées du fichier
296     * @return string $uid identifiant du document dans le filesystem
297 softime 1835 */
298 softime 1929 public function createFileTemporary($file_content, $metadata) {
299 softime 1835
300     //Création du fichier sur le filestorage
301 softime 1892 $uid = $this->filestorage->create_temporary($file_content, $metadata);
302 softime 1835
303     //Retourne l'identifiant unique du fichier créé
304     return $uid;
305    
306     }
307    
308     /**
309 softime 1892 * Permet de lier le document importé à l'application et de le créer dans le filestorage
310 softime 1929 * @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 softime 1835 */
318 softime 1929 public function createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $db, $DEBUG = NULL) {
319 softime 1835
320 softime 1929 //Maj en ajout
321 softime 1835 $document_numerise->setParameter("maj",0);
322    
323 softime 1929 //Extrait les informations du nom du document
324     $metadataFromFilename = $this->extractMetadataFromFilename($filename);
325 softime 1892
326 softime 1835 //Données
327     $values = array(
328     'document_numerise' => '',
329 softime 1929 'uid' => 'tmp|'.$uid,
330     'dossier' => $dossier,
331 softime 1892 'nom_fichier' => '',
332 softime 2020 'date_creation' => $metadataFromFilename['dateEvenementDocument'],
333     'document_numerise_type' => $this->get_document_numerise_by_code($metadataFromFilename['title']),
334 softime 1835 );
335    
336     //Ajoute dans la table le lien
337     $document_numerise->ajouter($values, $db, $DEBUG);
338    
339 softime 1929 //Si le document n'est pas ajouté
340 softime 1851 if (!$document_numerise->correct) {
341 softime 1835
342 softime 1929 //Log d'erreur
343 softime 1835 $this->addToLog($this->NO_LINK);
344 vpihour 2818 $this->addToLog($document_numerise->msg);
345 softime 1835 return false;
346 softime 1851 }
347 softime 1835
348 softime 1929 return $document_numerise->valF['document_numerise'];
349 softime 1835 }
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 softime 1929 public function moveDocumentNumerise($pathSrc, $pathDes, $filename) {
360 softime 1835
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($this->NO_MOVE);
378     return false;
379    
380     }
381    
382     /**
383     * Cette fonction permet de vider un répertoire
384 softime 1851 * 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 softime 1835 * @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 softime 1942
393     //Si la date et le nombre de jour ne sont pas renseigné
394     if (($nbDay == 'null' || $nbDay == null || $nbDay == '')
395 softime 1979 || ($dateImport == 'null' || $dateImport == null || $dateImport == '')) {
396 softime 1942
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 softime 1892 //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 softime 1835 $dateLimit = date('d-m-Y', strtotime("- $nbDay day", strtotime(date('d-m-Y'))));
413 softime 1892 $dateLimit = new DateTime($dateLimit);
414     $dateLimit = $dateLimit->format('Ymd');
415    
416 softime 1835 //Si la date du fichier à dépassé la date limite
417 softime 1892 if ($dateImport <= $dateLimit) {
418 softime 1835
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 softime 1851 $this->addToLog($this->NO_DELETE_FILE.$file);
432 softime 1835 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 softime 1851 $this->addToLog($this->NO_DELETE_FOLDER);
450 softime 1835 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 softime 1876 function run_import($pathSrc, $pathDes, $DEBUG = NULL) {
463 softime 1835
464     //Récupération du nom du répertoire
465     $foldername = substr(strrchr($pathSrc, "/"), 1);
466 nhaye 1900
467 softime 1929 //Identifiant du dossier
468     $dossier = str_replace('.', '', $foldername);
469 nhaye 1900
470 vpihour 2747 //On vérifie que le dossier existe
471     $sql = "SELECT dossier
472     FROM ".DB_PREFIXE."dossier
473     WHERE dossier = '".$dossier."'";
474     $dossierExist = $this->f->db->getOne($sql);
475     $this->f->addToLog("obj/digitalizedDocument.class.php : db->getOne(".$sql.")", VERBOSE_MODE);
476     $this->f->isDatabaseError($dossierExist);
477    
478     //Si le dossier n'existe pas on annule l'importation
479     if (!$dossierExist){
480     $this->addToLog($this->NO_IMPORT);
481     return false;
482     }
483    
484 softime 1835
485     //Liste les documents contenus dans le dossier
486     $listFiles = $this->listFiles($pathSrc);
487     //Si il n'y a aucun document
488     if ($listFiles === null) {
489     //On annule l'importation
490     $this->addToLog($this->NO_IMPORT);
491     return false;
492     }
493    
494     foreach ($listFiles as $key => $filename) {
495    
496     //Construit les métadonnées
497     $metadata = array();
498 nhaye 1900 //Données récupérées pour le filestorage
499     $metadata = $this->extractMetadataToFilestorage($pathSrc, $filename);
500 softime 1835
501     //S'il y a des métadonnées
502     if ($metadata !== null) {
503    
504     //Recupère le contenu du fichier
505     $file_content = file_get_contents($pathSrc.'/'.$filename);
506    
507 softime 1929 //Créer le fichier temporaire
508     $uid = $this->createFileTemporary($file_content, $metadata);
509    
510 softime 1835 //Si le fichier est créé
511     if ($uid !== null) {
512    
513 vpihour 2818 //Instancie la class document_numerise
514     require_once "../obj/document_numerise.class.php";
515     $document_numerise = new document_numerise("]", $this->f->db, $DEBUG);
516    
517     //Valeur retour formulaire
518     $document_numerise->retourformulaire = "dossier_instruction";
519    
520 softime 1929 //Créer le document sur le filestorage et dans la table document_numerise
521     $createFileStorage = $this->createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $this->f->db, $DEBUG);
522 softime 1835
523 softime 1929 //Si le document est crée sur le filestorage
524 vpihour 2818 if ($createFileStorage !== false && $createFileStorage !== 'OP_FAILURE') {
525 softime 1835
526 softime 1929 //On déplace le document créé dans le filestorage
527 softime 1835 //du dossier des "à traiter" vers celui des "traités"
528 softime 1929 $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
529 softime 1835
530     }
531 vpihour 2818 else {
532     //On annule l'importation
533     $this->addToLog($this->NO_IMPORT);
534     $this->filenameError[] = $filename;
535     }
536 softime 1835
537     }
538     }
539    
540     }//Fin foreach
541    
542     //Retourne true
543     return true;
544    
545     }
546    
547     /**
548     * Cette fonction permet de lancer toutes les fonctions utiles à la purge de dossier
549     * @param string $path Le chemin vers le dossier
550     * @param int $nbDay Nombre de jour à soustraite à la date du jour
551     * @return boolean true si le traitement à été fait sinon false
552     */
553     function run_purge($path, $nbDay = null) {
554    
555     //Liste les documents contenus dans le dossier
556     $listFiles = $this->listFiles($path);
557    
558 softime 1934 if ($listFiles !== null) {
559 softime 1835
560 softime 1934 //Parcours la liste des fichiers
561     foreach ($listFiles as $key => $filename) {
562     //Fichier
563     $file = $path.'/'.$filename;
564     //Si le nombre de jour est renseigné
565     if ($nbDay !== null) {
566 softime 1835
567 softime 1934 //il faut renseigner la date d'import du fichier
568     $dateImport = date("Y-m-d", filemtime($file));
569 softime 1835
570 softime 1934 } else {
571 softime 1835
572 softime 1934 //Sinon la date d'import est null
573     $dateImport = null;
574    
575     }
576    
577     //S'il n'y pas d'erreur on exécute la fonction purgeFiles
578 softime 1979 $purgeFiles = $this->purgeFiles($file, $dateImport, $nbDay);
579 softime 1835 }
580 softime 1934
581 softime 1835 }
582    
583     //Si il n'y a plus de document
584     if ($listFiles === null) {
585    
586     //on supprime le dossier
587     $deleteFolder = $this->deleteFolder($path);
588     //Si le dossier n'a pas été supprimé on retourne false
589     if (!$deleteFolder) {
590    
591     return false;
592     }
593     }
594    
595     //Si il n'y a pas d'erreur on retourne true
596     return true;
597    
598     }
599    
600     }
601    
602     ?>

Properties

Name Value
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26