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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7996 - (hide annotations)
Fri Jul 20 17:12:33 2018 UTC (6 years, 6 months ago) by softime
File size: 21552 byte(s)
* Merge de la branche d'intégration 4.7.0 vers le trunk

1 mbroquet 3730 <?php
2     /**
3 nhaye 5254 * Ce script permet de définir la classe 'DigitalizedDocument'.
4 mbroquet 3730 *
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 fmichon 4700 $this->f->addToLog(__METHOD__."(): db->getOne(".$sql.")", VERBOSE_MODE);
108 mbroquet 3730 $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 fmichon 4700 logger::instance()->log($message, $type);
122 mbroquet 3730 }
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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_REP);
162 mbroquet 3730 return null;
163     }
164    
165     //Si le tableau est vide on retourne null
166     if (count($listFiles) == 0) {
167    
168 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_FILES, EXTRA_VERBOSE_MODE);
169 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
221 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
237 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
248 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__.'(): '.$path.'/'.$filename.' : '.$this->NO_FILE_EXIST);
265 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$this->DOC_NO_CONFORME.$filename);
280 mbroquet 3730 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 fmichon 4700 $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 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/".$filename." : ".$this->NO_MOVE);
374 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$file." : ".$this->NO_DELETE_FILE.$file);
428 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$path." : ".$this->NO_DELETE_FOLDER);
446 mbroquet 3730 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 fmichon 4700 $this->f->addToLog(__METHOD__."(): db->getOne(".$sql.")", VERBOSE_MODE);
486 mbroquet 3730 $this->f->isDatabaseError($dossierExist);
487    
488     //Si le dossier n'existe pas on annule l'importation
489     if (!$dossierExist){
490 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/ : "._("Le dossier d'instruction n'existe pas.")." ".$this->NO_IMPORT);
491 mbroquet 3730 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 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc."/ ".$this->NO_FILES." ".$this->NO_IMPORT);
500 mbroquet 3730 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 softime 7996 $document_numerise = $this->f->get_inst__om_dbform(array(
525     "obj" => "document_numerise",
526     "idx" => "]",
527     ));
528 mbroquet 3730
529     //Valeur retour formulaire
530     $document_numerise->retourformulaire = "dossier_instruction";
531    
532     //Créer le document sur le filestorage et dans la table document_numerise
533     $createFileStorage = $this->createDocumentNumerise($document_numerise, $uid, $dossier, $filename, $this->f->db, $DEBUG);
534    
535     //Si le document est crée sur le filestorage
536     if ($createFileStorage !== false && $createFileStorage !== 'OP_FAILURE') {
537    
538     //On déplace le document créé dans le filestorage
539     //du dossier des "à traiter" vers celui des "traités"
540     $this->moveDocumentNumerise($pathSrc, $pathDes, $filename);
541    
542     }
543     else {
544     //On annule l'importation
545 fmichon 4700 $this->addToLog(__METHOD__."(): ".$pathSrc." : "._("Une erreur s'est produite lors de l'ajout du document ").$filename.". ".$this->NO_IMPORT);
546 mbroquet 3730 $this->filenameError[] = $filename;
547     }
548     //Del le fichier temporaire
549     if($uid != $this->filestorage->delete_temporary($uid)) {
550 fmichon 4700 $this->addToLog(__METHOD__."(): "._("Erreur lors de la suppression du fichier temporaire")." : ".$filename);
551 mbroquet 3730 }
552     }
553     }
554    
555     }//Fin foreach
556    
557     //Retourne true
558     return true;
559    
560     }
561    
562     /**
563     * Cette fonction permet de lancer toutes les fonctions utiles à la purge de dossier
564     * @param string $path Le chemin vers le dossier
565     * @param int $nbDay Nombre de jour à soustraite à la date du jour
566     * @return boolean true si le traitement à été fait sinon false
567     */
568     function run_purge($path, $nbDay = null) {
569    
570     //Liste les documents contenus dans le dossier
571     $listFiles = $this->listFiles($path);
572     $count_purged_files = 0;
573    
574     if ($listFiles !== null) {
575    
576     //Parcours la liste des fichiers
577     foreach ($listFiles as $key => $filename) {
578     //Fichier
579     $file = $path.'/'.$filename;
580     //Si le nombre de jour est renseigné
581     if ($nbDay !== null) {
582    
583     //il faut renseigner la date d'import du fichier
584     $dateImport = date("Y-m-d", filemtime($file));
585    
586     } else {
587    
588     //Sinon la date d'import est null
589     $dateImport = null;
590    
591     }
592    
593     //S'il n'y pas d'erreur on exécute la fonction purgeFiles
594     if($this->purgeFiles($file, $dateImport, $nbDay)) {
595     unset($listFiles[$key]);
596     $count_purged_files++;
597     }
598    
599     }
600    
601     }
602    
603     //Si il n'y a plus de document
604     if (empty($listFiles)) {
605    
606     //on supprime le dossier
607     $deleteFolder = $this->deleteFolder($path);
608     //Si le dossier n'a pas été supprimé on retourne false
609     if (!$deleteFolder) {
610    
611     return false;
612     }
613     }
614    
615     //Si il n'y a pas d'erreur on retourne true
616     return $count_purged_files;
617    
618     }
619    
620     }
621    
622 softime 7996

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26