/[openfoncier]/trunk/app/versement_archives.php
ViewVC logotype

Contents of /trunk/app/versement_archives.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2458 - (show annotations)
Tue Nov 12 18:33:26 2013 UTC (11 years, 2 months ago) by vpihour
File size: 15456 byte(s)
Correction de deux notice et de deux warning
Ajout d'une restriction sur le champ d'upload du csv
Correction de la traduction et des tests

1 <?php
2 /**
3 * Ce script permet d'uploader un fichier CSV pouvant mettre à jour le numéro de
4 * versement aux archives de plusieurs dossier en même temps
5 *
6 * @package openfoncier
7 * @version SVN : $Id$
8 */
9
10 // Fichiers requis
11 require_once "../obj/utils.class.php";
12 require_once '../obj/om_formulaire.class.php';
13
14 // Instance de la classe utils
15 $f = new utils(null, "versement_archives", _("Versement aux archives"));
16
17 // Description de la page
18 $description = _("Cette page permet d'importer les numeros d'archives des dossiers.");
19 // Affichage de la description
20 $f->displayDescription($description);
21
22 function afficherFormulaireSaisie($value = array()) {
23
24 // Les champs du formulaire
25 $champs = array("insee", "fichier", "separateur");
26
27 // Instance du formulaire
28 $form = new formulaire(null, 0, 0, $champs);
29
30 // Tableau des contraintes
31 $params = array(
32 "constraint" => array(
33 "extension" => ".csv"
34 ),
35 );
36
37 // Restriction sur le champ d'upload
38 $form->setSelect("fichier", $params);
39
40 // Type des champs
41 $form->setType("insee", "text");
42 $form->setType("fichier", "upload2");
43 $form->setType("separateur", "select");
44
45 // Libellé des champs
46 $form->setLib("insee", _("insee"));
47 $form->setLib("fichier", _("fichier").' <span class="not-null-tag">*</span>');
48 $form->setLib("separateur", _("separateur").' <span class="not-null-tag">*</span>');
49
50 // Taille des champs
51 $form->setTaille("insee", 5);
52 $form->setTaille("fichier", 64);
53
54 // Taille max des champs
55 $form->setMax("insee", 5);
56 $form->setMax("fichier", 30);
57
58 // Initilisation des liste à choix
59 $contenu = array(
60 0 => array(";", ",", ),
61 1 => array("; "._("(point-virgule)"), ", "._("(virgule)")),
62 );
63 $form->setSelect("separateur", $contenu);
64
65 // Si le paramètre n'est pas vide
66 if (!empty($value)) {
67 // Valeurs des champs
68 $form->setVal("insee", $value["insee"]);
69 $form->setVal("fichier", $value["fichier"]);
70 $form->setVal("separateur", $value["separateur"]);
71 }
72
73 // Ouverture du formulaire
74 printf("<form method=\"POST\" action=\"versement_archives.php\" name=f2>");
75
76 // Champs du formulaire
77 $form->entete();
78 $form->afficher($champs, 0, false, false);
79 $form->enpied();
80
81 // Bouton "Importer"
82 printf("<div class=\"formControls\">");
83 printf("<input id=\"button-versement_archives-importer\" type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\" value=\"Importer\" role=\"button\" aria-disabled=\"false\">");
84 printf("</div>");
85
86 // Fermeture du formulaire
87 printf("</form>");
88 }
89
90 /**
91 * Récupère le numéro de dossier d'autorisation
92 * @param object $f Instance de la classe utils
93 * @param string $annee Année du dossier
94 * @param string $code Code du type du dossier d'autorisation
95 * @param string $numero_dossier Numéro du dossier sur 5 chiffres
96 * @return string Numéro du dossier d'autorisation
97 */
98 function getDossierAutorisation($f, $annee, $code, $numero_dossier) {
99
100 // Récupération du code département
101 $dep = $f->getParameter("departement");
102 // Récupération du code commune
103 $com = $f->getParameter("commune");
104
105 // Numéro de dossier d'autorisation
106 $dossier_autorisation = $code . $dep . $com . $annee . str_pad($numero_dossier, 5, "0", STR_PAD_LEFT);
107
108 // Retourne le dossier d'autorisation
109 return $dossier_autorisation;
110 }
111
112 /**
113 * Récupère le numéro de dossier d'instruction
114 * @param object $f Instance de la classe utils
115 * @param integer $insee Numéro INSEE
116 * @param string $dossier_autorisation Numéro du dossier d'autorisation
117 * @param string $version Numéro de version
118 * @return string Numéro du dossier d'instruction
119 */
120 function getDossier($f, $insee, $dossier_autorisation, $version) {
121
122 // Requête SQL
123 $sql = "SELECT dossier.dossier
124 FROM ".DB_PREFIXE."dossier
125 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
126 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
127 WHERE dossier_autorisation.dossier_autorisation = '$dossier_autorisation'
128 AND dossier.version = $version
129 AND dossier_autorisation.insee = $insee";
130
131 // Résultat de la requête
132 $dossier = $f->db->getOne($sql);
133 $f->addToLog("app/versement_archives.php : db->getOne(\"".$sql."\")", VERBOSE_MODE);
134
135 // Retourne le résultat de la requête
136 return $dossier;
137 }
138
139 // Si le formulaire de saisie à été validé
140 if (!empty($_POST)) {
141
142 // Initialisation de la variable permettant de définir que le traitement
143 // est en erreur
144 $error = false;
145
146 // Récupère les valeurs des champs
147 $insee = (isset($_POST['insee'])) ? $_POST['insee'] : "";
148 $fichier_tmp = (isset($_POST['fichier'])) ? $_POST['fichier'] : "";
149 $separateur = (isset($_POST['separateur'])) ? $_POST['separateur'] : ";";
150
151 // Initialisation de variable
152 $csv_res_path = "";
153
154 // Si aucun fichier n'est uploadé
155 if ($fichier_tmp == "") {
156
157 // Indique que le traitement est en erreur
158 $error = true;
159 $message = _("Vous n'avez pas selectionne de fichier a importer.");
160 }
161
162 // Si il n'y a pas d'erreur
163 if ($error === false) {
164
165 // On enlève le préfixe du fichier temporaire
166 $fichier_tmp = str_replace("tmp|", "", $fichier_tmp);
167 // On récupère le fichier
168 $fichier = $f->storage->get_temporary($fichier_tmp);
169 // On récupère le chemin vers le fichier
170 $fichier_path = $f->storage->storage->temporary_storage->getPath($fichier_tmp);
171
172 // Si le fichier n'est pas un csv
173 if ($fichier['metadata']['mimetype'] != 'text/csv') {
174
175 // Indique que le traitement est en erreur
176 $error = true;
177 $message = _("Le fichier n'est pas au format CSV.");
178 }
179
180 // Si le fichier existe
181 if (file_exists($fichier_path)
182 && $error === false) {
183
184 // Ouverture du fichier
185 $file = fopen($fichier_path, "r+");
186
187 // Création du fichier csv résultat
188 $csv_res_filename = "versement_archives_resultat_".date("Ymd_His").".csv";
189 $csv_res_path = "../tmp/".$csv_res_filename;
190 $csv_res = fopen($csv_res_path, "w");
191
192 // Initialisation des variables compteurs
193 $cpt = array(
194 "total" => 0,
195 "accepte" => 0,
196 "rejete" => 0,
197 "ignore" => 0
198 );
199
200 // Boucle sur chaque ligne du fichier
201 while (($line = fgetcsv($file, 0, $separateur)) !== FALSE) {
202
203 // Initialisation de la variable permettant de définir jusqu'où
204 // le traitement doit aller
205 $stop = false;
206
207 // Incrémente le compteur de ligne
208 $cpt["total"]++;
209
210 // Contrôle du nombre de colonne sur la ligne
211 if (count($line) != 7) {
212
213 // Incrémente le compteur des lignes rejetées
214 $cpt["rejete"]++;
215 // Arrête le traitement pour cette ligne
216 $stop = true;
217 // Colonne résultat à ajouter dans la ligne
218 $line[] = _("ligne rejetee : nombre de separateur incorrect.");
219 // Ecrit dans le fichier csv
220 fputcsv($csv_res, $line, $separateur);
221 }
222
223 // Contrôle le contenu de chaque colonne de la ligne
224 if ($stop === false) {
225
226 // Chaque colonne doit respecter un certain format
227 if (!is_string($line[0]) && count($line[0]) != 5
228 || !is_string($line[1]) && count($line[1]) != 2
229 || !is_string($line[2]) && count($line[2]) != 2
230 || !is_numeric($line[3]) && count($line[3]) > 5
231 || !is_numeric($line[4]) && count($line[4]) > 2
232 || !is_string($line[5]) && count($line[5]) > 4
233 || !is_numeric($line[6])) {
234
235 // Incrémente le compteur des lignes rejetées
236 $cpt["rejete"]++;
237 // Arrête le traitement pour cette ligne
238 $stop = true;
239 // Colonne résultat à ajouter dans la ligne
240 $line[] = _("ligne rejetee : contenu non conforme.");
241 // Ecrit dans le fichier csv
242 fputcsv($csv_res, $line, $separateur);
243 }
244 }
245
246 // Si un code INSEE est renseigné
247 if ($stop === false
248 && $insee != "") {
249
250 // Si le code INSEE de la ligne est différent de celui
251 // renseigné dans le formulaire, alors on ne traite pas
252 // la ligne
253 if ($line[0] != $insee) {
254 // Incrémente le compteur des lignes ingorées
255 $cpt["ignore"]++;
256 // Arrête le traitement pour cette ligne
257 $stop = true;
258 // Colonne résultat à ajouter dans la ligne
259 $line[] = _("ligne ignoree : code insee different de celui indique dans le formulaire.");
260 // Ecrit dans le fichier csv
261 fputcsv($csv_res, $line, $separateur);
262 }
263 }
264
265 // Si le traitement doit continuer
266 if ($stop === false) {
267
268 // Récupère le numéro du dossier d'autorisation
269 $dossier_autorisation = getDossierAutorisation($f, $line[1], $line[2], $line[3]);
270 // Récupère le numéro du dossier d'instruction
271 $dossier = getDossier($f, $line[0], $dossier_autorisation, $line[4]);
272 // Si le dossier n'existe pas dans la base de données
273 if ($dossier == "") {
274 // Incrémente le compteur des lignes rejetées
275 $cpt["rejete"]++;
276 // Arrête le traitement pour cette ligne
277 $stop = true;
278 // Colonne résultat à ajouter dans la ligne
279 $line[] = _("ligne rejetee : dossier inexistant dans l'application.");
280 // Ecrit dans le fichier csv
281 fputcsv($csv_res, $line, $separateur);
282 }
283 }
284
285 // Si le traitement doit continuer
286 if ($stop === false) {
287
288 // Numéro d'archive
289 $archive = $line[5] . " " . $line[6];
290
291 // Valeur à modifier
292 $value_dossier['numero_versement_archive'] = $archive;
293
294 // Met à jour le numéro de versement aux archives du dossier
295 $res = $f->db->autoExecute(
296 DB_PREFIXE."dossier",
297 $value_dossier, DB_AUTOQUERY_UPDATE,
298 "dossier = '".$dossier."'");
299 // Si il y une erreur lors de la mise à jour
300 if ($f->isDatabaseError($res)) {
301
302 // Log
303 $f->addToLog("app/versement_archives.php: db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($value_dossier, true).", DB_AUTOQUERY_UPDATE, \"dossier = '".$dossier."'\");", DEBUG);
304
305 // Indique que le traitement est en erreur
306 $error = true;
307 $message = sprintf(_("Erreur de base de donnees lors de la mis a jour du dossier %s."), $dossier);
308
309 } else {
310
311 // Log
312 $f->addToLog("app/versement_archives.php: db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($value_dossier, true).", DB_AUTOQUERY_UPDATE, \"dossier = '".$dossier."'\");", VERBOSE_MODE);
313
314 // Incrémente le compteur des lignes acceptées
315 $cpt["accepte"]++;
316 // Colonne résultat à ajouter dans la ligne
317 $line[] = _("ligne acceptee : dossier mis a jour.");
318 // Ecrit dans le fichier csv
319 fputcsv($csv_res, $line, $separateur);
320 }
321
322 }
323
324 }
325
326 // Fermeture des fichiers;
327 fclose($file);
328 fclose($csv_res);
329 }
330 }
331
332 // Si une erreur s'est produite
333 if ($error === true) {
334
335 // Supprime le csv de résultat si celui-ci a été crée
336 if (file_exists($csv_res_path)) {
337 unlink($csv_res_path);
338 }
339
340 // Tableau des valeurs
341 $value = array();
342 $value['insee'] = $insee;
343 $value['fichier'] = $fichier_tmp;
344 $value['separateur'] = $separateur;
345
346 // Affiche le message d'erreur
347 $f->displayMessage("error", $message);
348
349 // Afiche le formulaire avec les valeurs
350 afficherFormulaireSaisie($value);
351
352 // Si il n'y a aucune erreur
353 } else {
354
355 // Contenu du fichier csv résultat
356 $csv_res_content = file_get_contents($csv_res_path);
357 // Métadonnées du fichier csv résultat
358 $metadata['filename'] = $csv_res_filename;
359 $metadata['size'] = strlen($csv_res_content);
360 $metadata['mimetype'] = "text/csv";
361 // Création du fichier sur le storage temporaire
362 $csv_res_uid = $f->storage->create_temporary($csv_res_content, $metadata);
363
364 // Message traitement csv
365 $message = sprintf(_("Il y a eu %s ligne(s) lue(s), %s ligne(s) acceptee(s), %s ligne(s) rejetee(s) et %s ligne(s) ignoree(s)"), $cpt['total'], $cpt['accepte'], $cpt['rejete'], $cpt['ignore']);
366 // Message pour télécharger le csv résultat
367 $message .= "<br/>"._("Pour telecharger le fichier, cliquer ici :")."<a href=\"../spg/file.php?uid=$csv_res_uid&mode=temporary\"><img src=\"../app/img/ico_trace.png\" alt=\""._("Telecharger le fichier CSV")."\" title=\""._("Telecharger le fichier CSV")."\" /></a>";
368
369 // Affiche le message
370 $f->displayMessage("valid", $message);
371
372 // Supprime le csv de résultat qui n'est pas dans le storage
373 unlink($csv_res_path);
374
375 // Si le mode DEBUG n'est pas "PRODUCTION_MODE"
376 if(DEBUG != "PRODUCTION_MODE") {
377
378 // Affiche le contenu du fichier de résultat
379 $csv_res_tmp = $f->storage->get_temporary($csv_res_uid);
380 $csv_res_content = $csv_res_tmp['file_content'];
381 $csv_res_content = str_replace("\n","<br>", $csv_res_content);
382
383 printf('<div id="content_versement_archives" >');
384 printf($csv_res_content);
385 printf('</div>');
386 }
387
388 }
389
390 // Sinon affiche le formulaire de saisie de base
391 } else {
392
393 // Affiche le formulaire de saisie
394 afficherFormulaireSaisie();
395 }
396
397 ?>

Properties

Name Value
svn:executable *
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26