/[openfoncier]/branches/3.14.x/obj/utils.class.php
ViewVC logotype

Contents of /branches/3.14.x/obj/utils.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3611 - (show annotations)
Thu Aug 20 16:07:22 2015 UTC (9 years, 5 months ago) by nhaye
File size: 39547 byte(s)
Un instructeur/service non affecté à un service rendait impossible l'édition de consultation.
Suppression d'un des menu "Dossier d'Autorisation" pour le profil instructeur/service
Ajout du droit de visualisation du rapport d'instruction finalisé pour le profil instructeur/service
Suppression de la possibilité pour un instructeur hors division de définaliser un événement d'instruction
Suppression de l'entrée de menu "Demande d'avis" → "Tableau de bord" pour tous les profils

1 <?php
2 /**
3 * Ce fichier est destine a permettre la surcharge de certaines methodes de
4 * la classe om_application pour des besoins specifiques de l'application
5 *
6 * @package openmairie_exemple
7 * @version SVN : $Id: utils.class.php 547 2011-08-25 12:03:42Z fmichon $
8 */
9
10 /**
11 *
12 */
13 require_once "../dyn/locales.inc.php";
14
15 /**
16 *
17 */
18 require_once "../dyn/include.inc.php";
19
20 /**
21 *
22 */
23 require_once "../dyn/debug.inc.php";
24
25 /**
26 *
27 */
28 (defined("PATH_OPENMAIRIE") ? "" : define("PATH_OPENMAIRIE", ""));
29
30 /**
31 *
32 */
33 require_once PATH_OPENMAIRIE."om_application.class.php";
34
35 /**
36 *
37 */
38 class utils extends application {
39
40 // {{{
41
42 /**
43 *
44 */
45 function isAccredited($obj = NULL, $operator = "AND") {
46 // Lorsque l'utilisateur a le login 'admin' alors il est authorisé à
47 // accéder à toutes les fonctions du logiciel
48 // XXX à modifier pour changer ça vers un profil et non un login utilisateur
49 if ($_SESSION["login"] == "admin") {
50 return true;
51 }
52 // Fonctionnement standard
53 return parent::isAccredited($obj, $operator);
54 }
55
56 // }}}
57
58 // {{{
59
60 var $om_utilisateur = array();
61 var $user_is_instr = NULL;
62 var $user_is_service = NULL;
63 var $user_is_admin = NULL;
64 var $user_is_service_ext = NULL;
65 var $user_is_qualificateur = NULL;
66 var $user_is_chef = NULL;
67 var $user_is_divisionnaire = NULL;
68 var $user_is_service_int = NULL;
69 var $user_is_instr_service = NULL;
70
71 /**
72 * Méthode de récupération des informations de l'utilisateur connecté.
73 */
74 function getUserInfos() {
75
76 // Si l'utilisateur est loggé $_SESSION existe
77 if(isset($_SESSION['login']) AND !empty($_SESSION['login'])) {
78
79 // Récupération des infos utilisateur
80 $sqlUser = "SELECT om_utilisateur, nom, email, login, om_collectivite, om_profil ".
81 "FROM ".DB_PREFIXE."om_utilisateur WHERE login = '".$_SESSION['login']."'";
82 $resUser=$this->db->query($sqlUser);
83 $this->addToLog("getUserInfos(): db->query(\"".$sqlUser."\");", VERBOSE_MODE);
84 if ( database::isError($resUser)){
85 die();
86 }
87 $this->om_utilisateur=&$resUser->fetchRow(DB_FETCHMODE_ASSOC);
88
89 // Récupère le profil et test si c'est un
90 $sqlProfil = "SELECT libelle FROM ".DB_PREFIXE."om_profil WHERE om_profil = ".$this->om_utilisateur['om_profil'];
91 $resProfil=$this->db->getOne($sqlProfil);
92 $this->addToLog("getUserInfos(): db->getOne(\"".$sqlProfil."\");", VERBOSE_MODE);
93 if (database::isError($resProfil)){
94 die();
95 }
96 // Sauvegarde le libelle du profil
97 $this->om_utilisateur["libelle_profil"] = $resProfil;
98
99 // si c'est un administrateur technique
100 // XXX Mauvaise méthode, il faut utiliser isAccredited
101 if ($resProfil == "ADMINISTRATEUR TECHNIQUE"
102 || $resProfil == "ADMINISTRATEUR FONCTIONNEL") {
103 $this->user_is_admin = true;
104 } else {
105 $this->user_is_admin = false;
106 }
107
108 //si c'est un service externe
109 if ($resProfil == "SERVICE CONSULTÉ") {
110 $this->user_is_service_ext = true;
111 } else {
112 $this->user_is_service_ext = false;
113 }
114
115 //si c'est un service interne
116 if ($resProfil == "SERVICE CONSULTÉ INTERNE") {
117 $this->user_is_service_int = true;
118 } else {
119 $this->user_is_service_int = false;
120 }
121
122 // si c'est un qualificateur
123 if ($resProfil == "QUALIFICATEUR") {
124 $this->user_is_qualificateur = true;
125 } else {
126 $this->user_is_qualificateur = false;
127 }
128
129 // si c'est un chef de service
130 if ($resProfil == "CHEF DE SERVICE") {
131 $this->user_is_chef = true;
132 } else {
133 $this->user_is_chef = false;
134 }
135
136 // si c'est un divisionnaire
137 if ($resProfil == "DIVISIONNAIRE") {
138 $this->user_is_divisionnaire = true;
139 } else {
140 $this->user_is_divisionnaire = false;
141 }
142
143 // Récupération des infos instructeur
144 $sqlInstr = "SELECT instructeur.instructeur, instructeur.nom, instructeur.telephone,
145 division.division, division.code, division.libelle ".
146 "FROM ".DB_PREFIXE."instructeur INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division ".
147 "WHERE instructeur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
148 $resInstr=$this->db->query($sqlInstr);
149 $this->addToLog("getUserInfos(): db->query(\"".$sqlInstr."\");", VERBOSE_MODE);
150 if ( database::isError($resInstr)){
151 die();
152 }
153 $tempInstr=&$resInstr->fetchRow(DB_FETCHMODE_ASSOC);
154 // Si il y a un resultat c'est un instructeur
155 if(count($tempInstr)>0) {
156 $this->user_is_instr=true;
157 $this->om_utilisateur = array_merge($this->om_utilisateur,$tempInstr);
158 } else {
159 $this->user_is_instr=false;
160 }
161
162 // Récupération des infos de services consultés
163 $sqlServ = "SELECT service.service, service.abrege, service.libelle ".
164 "FROM ".DB_PREFIXE."service ".
165 "INNER JOIN ".DB_PREFIXE."lien_service_om_utilisateur ON lien_service_om_utilisateur.service=service.service ".
166 "WHERE lien_service_om_utilisateur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
167 $resServ=$this->db->query($sqlServ);
168 $this->addToLog("getUserInfos(): db->query(\"".$sqlServ."\");", VERBOSE_MODE);
169 if ( database::isError($resServ)){
170 die();
171 }
172
173 while ($tempServ=&$resServ->fetchRow(DB_FETCHMODE_ASSOC)) {
174 $this->om_utilisateur['service'][]=$tempServ;
175 }
176 // Si il y a un resultat c'est un utilisateur de service
177 if(isset($this->om_utilisateur['service'])) {
178 $this->user_is_service=true;
179 } else {
180 $this->user_is_service=false;
181 }
182 }
183 }
184
185 /**
186 * getter user_is_service
187 */
188 function isUserService() {
189 //
190 if (is_null($this->user_is_service)) {
191 //
192 $this->getUserInfos();
193 }
194 //
195 return $this->user_is_service;
196 }
197
198 /**
199 * getter user_is_instr
200 */
201 function isUserInstructeur() {
202 //
203 if (is_null($this->user_is_instr)) {
204 //
205 $this->getUserInfos();
206 }
207 //
208 return $this->user_is_instr;
209 }
210
211 function isUserAdministrateur() {
212 //
213 if (is_null($this->user_is_admin)) {
214 //
215 $this->getUserInfos();
216 }
217 //
218 return $this->user_is_admin;
219 }
220
221 /**
222 * getter user_is_service_ext
223 */
224 function isUserServiceExt() {
225 //
226 if (is_null($this->user_is_service_ext)) {
227 //
228 $this->getUserInfos();
229 }
230 //
231 return $this->user_is_service_ext;
232 }
233
234 /**
235 * getter user_is_service_int
236 */
237 function isUserServiceInt() {
238 //
239 if (is_null($this->user_is_service_int)) {
240 //
241 $this->getUserInfos();
242 }
243 //
244 return $this->user_is_service_int;
245 }
246
247 /**
248 * getter user_is_qualificateur
249 */
250 function isUserQualificateur() {
251 //
252 if (is_null($this->user_is_qualificateur)) {
253 //
254 $this->getUserInfos();
255 }
256 //
257 return $this->user_is_qualificateur;
258 }
259
260 /**
261 * getter user_is_chef
262 */
263 function isUserChef() {
264 //
265 if (is_null($this->user_is_chef)) {
266 //
267 $this->getUserInfos();
268 }
269 //
270 return $this->user_is_chef;
271 }
272
273 /**
274 * getter user_is_divisionnaire
275 */
276 function isUserDivisionnaire() {
277 //
278 if (is_null($this->user_is_divisionnaire)) {
279 //
280 $this->getUserInfos();
281 }
282 //
283 return $this->user_is_divisionnaire;
284 }
285
286 // Ajout de variables de session contenant la division pour permettre une
287 // utilisation plus efficace dans les requetes
288 function triggerAfterLogin($utilisateur = NULL) {
289 //
290 $sql = "SELECT instructeur.division, division.code
291 FROM ".DB_PREFIXE."instructeur
292 LEFT JOIN ".DB_PREFIXE."division
293 ON instructeur.division = division.division
294 WHERE instructeur.om_utilisateur='".$utilisateur["om_utilisateur"]."'";
295 $res = $this->db->query($sql);
296 $this->addToLog("triggerAfterLogin(): db->query(\"".$sql."\");", VERBOSE_MODE);
297 if ( database::isError($res)){
298 die();
299 }
300 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
301 //
302 if (isset($row["division"]) && $row["division"] != NULL) {
303 $_SESSION["division"] = $row["division"];
304 $_SESSION["division_code"] = $row["code"];
305 } else {
306 $_SESSION["division"] = "0";
307 $_SESSION["division_code"] = "";
308 }
309
310 }
311
312 // Affichage des actions supplémentaires
313 function displayActionExtras() {
314 // Affichage de la division si l'utilisateur en possède une
315 if ($_SESSION["division"] != 0) {
316 echo "\t\t\t<li class=\"action-division\">";
317 echo "(".$_SESSION['division_code'].")";
318 echo "</li>\n";
319 }
320 }
321
322 // }}}
323
324
325 function getDivisionFromDossier($dossier) {
326 //
327 $sql = "select division from ".DB_PREFIXE."dossier ";
328 $sql .= " where dossier='".$dossier."'";
329 //
330 $division = $this->db->getOne($sql);
331 $this->addToLog("getDivisionFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
332 database::isError($division);
333 //
334 return $division;
335 }
336
337 // {{{ GESTION DES FICHIERS
338
339 /**
340 *
341 */
342 function notExistsError ($explanation = NULL) {
343 // message
344 $message_class = "error";
345 $message = _("Cette page n'existe pas.");
346 $this->addToMessage ($message_class, $message);
347 //
348 $this->setFlag(NULL);
349 $this->display();
350
351 //
352 die();
353 }
354
355 // }}}
356 /**
357 * Retourne le statut du dossier d'instruction
358 * @param string $idx Identifiant du dossier d'instruction
359 * @return string Le statut du dossier d'instruction
360 */
361 function getStatutDossier($idx){
362
363 $statut = '';
364
365 //Si l'identifiant du dossier d'instruction fourni est correct
366 if ( $idx != '' ){
367
368 //On récupère le statut de l'état du dossier à partir de l'identifiant du
369 //dossier d'instruction
370 $sql = "SELECT etat.statut
371 FROM ".DB_PREFIXE."dossier
372 LEFT JOIN
373 ".DB_PREFIXE."etat
374 ON
375 dossier.etat = etat.etat
376 WHERE dossier ='".$idx."'";
377 $statut = $this->db->getOne($sql);
378 $this->addToLog("getStatutDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
379 if ( database::isError($statut)){
380 die();
381 }
382 }
383 return $statut;
384 }
385
386 /**
387 * Formate le champ pour le type Timestamp
388 * @param date $date_str Date
389 * @param boolean $show Format pour l'affichage
390 * @return mixed False si le traitement échoue ou la date formatée
391 */
392 function formatTimestamp ($date_str, $show = true) {
393
394 // Sépare la date et l'heure
395 $date = explode(" ", $date_str);
396 if (count($date) != 2) {
397 return false;
398 }
399
400 // Date en BDD
401 $date_db = explode ('-', $date[0]);
402 // Date en affichage
403 $date_show = explode ('/', $date[0]);
404
405 // Contrôle la composition de la date
406 if (count ($date_db) != 3 and count ($date_show) != 3) {
407 return false;
408 }
409
410 if (count ($date_db) == 3) {
411 // Vérifie que c'est une date valide
412 if (!checkdate($date_db[1], $date_db[2], $date_db[0])) {
413 return false;
414 }
415 // Si c'est pour l'affichage de la date
416 if ($show == true) {
417 return $date_db [2]."/".$date_db [1]."/".$date_db [0]." ".$date[1];
418 } else {
419 return $date[0];
420 }
421 }
422
423 //
424 if (count ($date_show) == 3) {
425 // Vérifie que c'est une date valide
426 if (!checkdate($date_show[1], $date_show[0], $date_show[2])) {
427 return false;
428 }
429 // Si c'est pour l'affichage de la date
430 if ($show == true) {
431 return $date[0];
432 } else {
433 return $date_show [2]."-".$date_show [1]."-".$date_show [0]." ".$date[1];
434 }
435
436 }
437 return false;
438
439 }
440
441 /**
442 * Permet de calculer la liste des parcelles à partir de la chaîne passée en paramètre
443 * et la retourner sous forme d'un tableau associatif
444 *
445 * @param string $strParcelles chaîne de la parcelles
446 * @return array (array(quartier, section, parcelle), ...)
447 */
448 function parseParcelles($strParcelles) {
449
450 // Séparation des lignes
451 $references = explode(";", $strParcelles);
452 $liste_parcelles = array();
453
454 // On boucle sur chaque ligne pour ajouter la liste des parcelles de chaque ligne
455 foreach ($references as $parcelles) {
456
457 // On transforme la chaîne de la ligne de parcelles en tableau
458 $ref = str_split($parcelles);
459 // Les 1er caractères sont numériques
460 $num = true;
461
462 // Tableau des champs de la ligne de références cadastrales
463 $reference_tab = array();
464 $temp = "";
465 foreach ($ref as $carac) {
466
467 // Permet de tester si le caractère courant est de même type que le précédent
468 if(is_numeric($carac) === $num) {
469 $temp .= $carac;
470 } else {
471 // Bascule
472 $num = !$num;
473 // On stock le champ
474 $reference_tab[] = $temp;
475 // re-init de la valeur temporaire pour le champ suivant
476 $temp = $carac;
477 }
478 }
479 // Stockage du dernier champ sur lequel il n'y a pas eu de bascule
480 $reference_tab[] = $temp;
481 // Calcul des parcelles
482 $quartier = $reference_tab[0];
483 $sect = $reference_tab[1];
484
485 $ancien_ref_parc = "";
486 for ($i=2; $i < count($reference_tab); $i+=2) {
487 $parc["quartier"] = $quartier;
488 // Met en majuscule si besoin
489 $parc["section"] = strtoupper($sect);
490 if( $ancien_ref_parc == "" OR $reference_tab[$i-1] == "/") {
491 // 1ere parcelle ou parcelle individuelle
492 // Compléte par des "0" le début de la chaîne si besoin
493 $parc["parcelle"] = str_pad($reference_tab[$i], 4, "0", STR_PAD_LEFT);
494 // Ajout d'une parcelle à la liste
495 $liste_parcelles[] = $parc;
496 } elseif ($reference_tab[$i-1] == "A") {
497 // Interval de parcelles
498 for ($j=$ancien_ref_parc+1; $j <= $reference_tab[$i]; $j++) {
499 // Compléte par des "0" le début de la chaîne si besoin
500 $parc["parcelle"] = str_pad($j, 4, "0", STR_PAD_LEFT);
501 // Ajout d'une parcelle à la liste
502 $liste_parcelles[] = $parc;
503 }
504 }
505 //Gestion des erreurs
506 else{
507
508 echo _("Une erreur de formattage a ete detecte dans la reference cadastrale du dossier ").$this->row['dossier'];
509 }
510 // Sauvegarde de la référence courante de parcelle
511 $ancien_ref_parc = $reference_tab[$i];
512 }
513 }
514
515 return $liste_parcelles;
516 }
517
518 /**
519 * Formate les parcelles en ajoutant le code impôt
520 * @param array $liste_parcelles Tableau des parcelles
521 * @return string Liste des parcelles formatées
522 */
523 function formatParcelleToSend($liste_parcelles) {
524
525 //
526 $wParcelle = array();
527
528 //Formatage des références cadastrales pour l'envoi
529 foreach ($liste_parcelles as $value) {
530
531 // On ajoute les données dans le tableau que si quartier + section + parcelle
532 // a été fourni
533 if ($value["quartier"] !== ""
534 && $value["section"] !== ""
535 && $value["parcelle"] !== ""){
536
537 //On récupère le code impôt de l'arrondissement
538 $arrondissement = $this->getCodeImpotByQuartier($value["quartier"]);
539
540 //On ajoute la parcelle, si un arrondissement a été trouvé
541 if ($arrondissement!=="") {
542 //
543 $wParcelle[] = $arrondissement.$value["quartier"].
544 str_pad($value["section"], 2, " ", STR_PAD_LEFT).
545 $value["parcelle"];
546 }
547 }
548 }
549
550 //
551 return $wParcelle;
552 }
553
554 /**
555 * Récupère le code impôt par rapport au quartier
556 * @param string $quartier Numéro de quartier
557 * @return string Code impôt
558 */
559 function getCodeImpotByQuartier($quartier) {
560
561 $arrondissement = "";
562
563 // Si le quartier fournis est correct
564 if ($quartier != "") {
565
566 // Requête SQL
567 $sql = "SELECT
568 arrondissement.code_impots
569 FROM
570 ".DB_PREFIXE."arrondissement
571 LEFT JOIN
572 ".DB_PREFIXE."quartier
573 ON
574 quartier.arrondissement = arrondissement.arrondissement
575 WHERE
576 quartier.code_impots = '".$quartier."'";
577 $this->addToLog("getCodeImpotByQuartier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
578 $arrondissement = $this->db->getOne($sql);
579 $this->isDatabaseError($arrondissement);
580 }
581
582 // Retour
583 return $arrondissement;
584 }
585
586 /**
587 * Vérification des paramètres
588 */
589 function checkParams() {
590 parent::checkParams();
591
592 (isset($this->config['path_scan']) ? "" : $this->config['path_scan'] = '../trs/numerisation/');
593
594 $default_sig_elyx = array(
595 'wsdl' => '../tests/wsurbanisme.wsdl',
596 'login' => 'sig',
597 'password' => 'sig',
598 );
599 (isset($this->config['sig_elyx']) ? "" : $this->config['sig_elyx'] = $default_sig_elyx);
600 }
601
602 /**
603 * Retourne true si tous les paramètres du SIG externe ont bien été définis
604 * @return bool true/false
605 */
606 public function issetSIGParameter() {
607 if($this->getParameter("sig_web_server") != NULL AND
608 $this->getParameter("sig_web_server") != "" AND
609 $this->getParameter("sig_couche_emprise_dossier") != NULL AND
610 $this->getParameter("sig_couche_emprise_dossier") != "" AND
611 $this->getParameter("sig_couche_affichage_dossier") != NULL AND
612 $this->getParameter("sig_couche_affichage_dossier") != "" AND
613 $this->getParameter("sig_couche_affichage_parcelle") != NULL AND
614 $this->getParameter("sig_couche_affichage_parcelle") != "") {
615 return true;
616 } else {
617 return false;
618 }
619 }
620
621 /**
622 * Permet de vérifier que des champs existe dans une table
623 * @param array $list_fields Liste des champs à tester
624 * @param string $table Table où les champs doivent exister
625 * @return mixed Retourne les champs qui n'existent pas
626 * ou true
627 */
628 public function check_field_exist($list_fields, $table) {
629
630 // Instance de la classe en paramètre
631 require_once "../obj/".$table.".class.php";
632 $object = new $table("]", $this->db, DEBUG);
633
634 // Récupère les champs de la table
635 foreach ($object->champs as $champ) {
636 $list_column[] = $champ;
637 }
638
639 // Tableau des champs en erreur
640 $error_fields = array();
641
642 // Pour chaque champ à tester
643 foreach ($list_fields as $value) {
644
645 // S'il n'apparaît pas dans la liste des champs possible
646 if (!in_array($value, $list_column)) {
647
648 // Alors le champ est ajouté au tableau des erreurs
649 $error_fields[] = $value;
650 }
651 }
652
653 // Si le tableau des erreurs n'est pas vide on le retourne
654 if (count($error_fields) > 0) {
655 return $error_fields;
656 }
657
658 // Sinon on retourne le booléen true
659 return true;
660
661 }
662
663 /*
664 *
665 */
666 /**
667 * Récupère la lettre type lié à un événement
668 * @param integer $evenement L'identifiant de l'événement
669 * @return integer Retourne l'idenfiant de la lettre-type ou true
670 */
671 function getLettreType($evenement){
672
673 $lettretype = NULL;
674
675 $sql =
676 "SELECT
677 lettretype
678 FROM
679 ".DB_PREFIXE."evenement
680 WHERE
681 evenement = $evenement";
682
683 $this->addToLog("getLettreType() : db->query(\"".$sql."\")", VERBOSE_MODE);
684 $res = $this->db->query($sql);
685 if ( database::isError($res)){
686 die();
687 }
688
689 if ( $res->numrows() > 0 ){
690
691 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
692 $lettretype = $row['lettretype'];
693 }
694
695 return $lettretype;
696 }
697
698 /**
699 * Retourne le type de dossier d'autorisation du dossier courant :
700 * @param $idxDossier Le numéro du dossier d'instruction
701 * @return le code du type détaillée de dossier d'autorisation
702 **/
703 function getDATDCode($idxDossier) {
704 $sql = "SELECT dossier_autorisation_type_detaille.code
705 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
706 INNER JOIN ".DB_PREFIXE."dossier_autorisation
707 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille =
708 dossier_autorisation.dossier_autorisation_type_detaille
709 INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
710 WHERE dossier.dossier = '".$idxDossier."'";
711 $res = $this->db->getOne($sql);
712 $this->addToLog("getDATDCode() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
713 if ( database::isError($res)){
714 die();
715 }
716 return $res;
717 }
718
719 /**
720 * Permet de copier un enregistrement
721 * @param mixed $idx Identifiant de l'enregistrment
722 * @param string $obj Objet de l'enregistrment
723 * @param string $objsf Objets associés
724 * @return array Tableau des nouveaux id et du message
725 */
726 function copier($idx, $obj, $objsf) {
727
728 // Tableau de résultat
729 $resArray = array();
730 // Message retourné à l'utilisateur
731 $message = "";
732 // Type du message (valid ou error)
733 $message_type = "valid";
734
735 // Requête SQL permettant de récupérer les informations sur l'objet métier
736 $sql = "SELECT *
737 FROM ".DB_PREFIXE.$obj."
738 WHERE ".$obj." = ".$idx;
739 $res = $this->db->query($sql);
740 $this->isDatabaseError($res);
741
742 // Valeurs clonées
743 $valF = array();
744 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
745 // Recupère la valeur
746 $valF = $row;
747 }
748
749 // Valeurs non clonées
750 // Identifiant modifié pour que ça soit un ajout
751 $valF[$obj] = "]";
752
753 // Inclus la classe de l'objet métier
754 require_once "../obj/".$obj.".class.php";
755
756 // Instance de l'objet métier
757 $clone_obj = new $obj("]", $this->db, DEBUG);
758 // Si dans l'objet métier la fonction "copier" existe
759 if (method_exists($clone_obj, "update_for_copy")) {
760 // Traitement sur les valeurs du duplicata
761 $valF = $clone_obj->update_for_copy($valF, $objsf, DEBUG);
762 // Recupère les messages retourné par la fonction
763 $message .= $valF['message'];
764 // Supprime les messages de la liste des valeurs
765 unset($valF['message']);
766 }
767 // Ajoute le duplicata
768 $clone_obj->ajouter($valF, $this->db, DEBUG);
769 // Si aucune erreur se produit dans la classe instanciée
770 if ($clone_obj->correct === true) {
771 // Récupère l'identifiant de l'objet créé
772 $clone_obj_id = $clone_obj->valF[$obj];
773
774 // Message
775 $message .= sprintf(_("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"), "<span class='bold'>"._($obj)."</span>", "<span class='bold'>".$idx."</span>")."<br />";
776
777 // Ajout de l'identifant au tableau des résultat
778 $resArray[$obj.'_'.$idx] = $clone_obj_id;
779
780 // S'il y a au moins un objet metier associé
781 if ($objsf != "") {
782 // Liste des objet métier associés
783 $list_objsf = explode(",", $objsf);
784 // Pour chaque objet associé
785 foreach ($list_objsf as $key => $objsf) {
786 // Inclus la classe de l'objet métier associé
787 require_once "../obj/".$objsf.".class.php";
788
789 // Requête SQL permettant de récupérer les informations sur
790 // l'objet métier associé
791 $sql = "SELECT *
792 FROM ".DB_PREFIXE.$objsf."
793 WHERE ".$obj." = ".$idx;
794 $res = $this->db->query($sql);
795 $this->isDatabaseError($res);
796
797 // Pour chaque élément associé
798 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
799 // Identifiant de l'objet associé à copier
800 $idxsf = $row[$objsf];
801
802 // Valeurs clonées
803 $valF = $row;
804 // Valeurs non clonées
805 $valF[$obj] = $clone_obj_id;
806 // Identifiant modifié pour que ça soit un ajout
807 $valF[$objsf] = "]";
808 // Instance de l'objet métier associé
809 $clone_objsf = new $objsf("]", $this->db, DEBUG);
810 // Si dans l'objet métier associé
811 // la fonction "copier" existe
812 if (method_exists($clone_objsf, "update_for_copy")) {
813 // Traitement sur les valeurs du duplicata
814 $valF = $clone_objsf->update_for_copy($valF, $objsf, DEBUG);
815 // Recupère les messages retourné par la fonction
816 $message .= $valF['message'];
817 // Supprime les messages de la liste des valeurs
818 unset($valF['message']);
819 }
820 // Ajoute le duplicata
821 $clone_objsf->ajouter($valF, $this->db, DEBUG);
822 // Si aucune erreur se produit dans la classe instanciée
823 if ($clone_objsf->correct === true) {
824 // Récupère l'identifiant de l'objet créé
825 $clone_objsf_id = $clone_objsf->valF[$objsf];
826
827 // Message
828 $message .= sprintf(_("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"), "<span class='bold'>"._($objsf)."</span>", "<span class='bold'>".$idxsf."</span>")."<br />";
829
830 // Ajout de l'identifant au tableau des résultat
831 $resArray[$objsf.'_'.$row[$objsf]] = $clone_objsf_id;
832 } else {
833
834 // Message d'erreur récupéré depuis la classe
835 $message .= $clone_objsf->msg;
836 // Type du message
837 $message_type = "error";
838 }
839 }
840 }
841 }
842 //
843 } else {
844
845 // Message d'erreur récupéré depuis la classe
846 $message .= $clone_obj->msg;
847 // Type du message
848 $message_type = "error";
849 }
850
851 // Ajout du message au tableau des résultats
852 $resArray['message'] = $message;
853 // Ajout du type de message au tableau des résultats
854 $resArray['message_type'] = $message_type;
855
856 // Retourne le tableau des résultats
857 return $resArray;
858 }
859
860 /**
861 * Permet de détailler les conditions pour l'affichage des contraintes dans
862 * une édition.
863 * @param string $contraintes_param Chaine des conditions
864 *
865 * @return array Conditions
866 */
867 function explodeConditionContrainte($contraintes_param) {
868
869 // Initialisation des variables
870 $return = array();
871 $listGroupes = "";
872 $listSousgroupes = "";
873 $service_consulte = "";
874
875 // Coupe la condition au ";"
876 // Doit séparer groupe et sous-groupe
877 $contraintes_params = explode(";", $contraintes_param);
878
879 // Pour chaque paramètres
880 foreach ($contraintes_params as $value) {
881 // Si le mot-clés "liste_groupe="
882 if (strstr($value, "liste_groupe=")) {
883 // On enlève le mots-clés "liste_groupe="
884 $listGroupes = str_replace("liste_groupe=", "", $value);
885 }
886 // Si le mot-clés "liste_ssgroupe="
887 if (strstr($value, "liste_ssgroupe=")) {
888 // On enlève le mots-clés "liste_ssgroupe="
889 $listSousgroupes = str_replace("liste_ssgroupe=", "", $value);
890 }
891 // Si le mot-clés "service_consulte="
892 if (strstr($value, "service_consulte=")) {
893 // On enlève le mots-clés "service_consulte="
894 $service_consulte = str_replace("service_consulte=", "", $value);
895 }
896 }
897
898 // Récupère la liste des groupes et sous-groupes qui doivent
899 // être utilisés pour la condition
900 if ($listGroupes != "") {
901 $listGroupes = explode(",", $listGroupes);
902 }
903 if ($listSousgroupes != "") {
904 $listSousgroupes = explode(",", $listSousgroupes);
905 }
906
907 // Tableau à retourner
908 $return['groupes'] = $listGroupes;
909 $return['sousgroupes'] = $listSousgroupes;
910 $return['service_consulte'] = $service_consulte;
911
912 //
913 return $return;
914 }
915
916 /**
917 * Traitement pour créer la condition sur les contraintes dans les éditions.
918 * @param string $part SQL et parti du pdf (sql, titre ou corps)
919 *
920 * @return string Condition pour la requête sur les contraintes
921 */
922 function traitement_condition_contrainte($part) {
923
924 // Initialisationd de la condition
925 $whereContraintes = "";
926
927 // Détaille la condtion
928 $explodeConditionContrainte = $this->explodeConditionContrainte($part);
929
930 // Récupère les groupes, sous-groupes et service_consulte pour la condition
931 $groupes = $explodeConditionContrainte['groupes'];
932 $sousgroupes = $explodeConditionContrainte['sousgroupes'];
933 $service_consulte = $explodeConditionContrainte['service_consulte'];
934
935 // Pour chaque groupe
936 if ($groupes != "") {
937 foreach ($groupes as $key => $groupe) {
938 // Si le groupe n'est pas vide
939 if (!empty($groupe)) {
940 // Choisit l'opérateur logique
941 $op_logique = $key > 0 ? 'OR' : 'AND (';
942 // Ajoute la condition
943 $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.groupe)) = lower('"
944 .pg_escape_string($groupe)."')";
945 }
946 }
947 // S'il y a des valeurs dans groupe
948 if (count($groupe) > 0) {
949 // Ferme la parenthèse
950 $whereContraintes .= " ) ";
951 }
952 }
953
954 // Pour chaque sous-groupe
955 if ($sousgroupes != "") {
956 foreach ($sousgroupes as $key => $sousgroupe) {
957 // Si le sous-groupe n'est pas vide
958 if (!empty($sousgroupe)) {
959 // Choisit l'opérateur logique
960 $op_logique = $key > 0 ? 'OR' : 'AND (';
961 // Ajoute la condition
962 $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.sousgroupe)) = lower('"
963 .pg_escape_string($sousgroupe)."')";
964 }
965 }
966 // S'il y a des valeurs dans sous-groupe
967 if (count($sousgroupes) > 0) {
968 // Ferme la parenthèse
969 $whereContraintes .= " ) ";
970 }
971 }
972
973 // Si l'option service_consulte n'est pas vide
974 if ($service_consulte != "") {
975 // Ajoute la condition
976 $whereContraintes .= " AND service_consulte = cast(lower('".$service_consulte."') as boolean) ";
977 }
978
979 // Condition retournée
980 return $whereContraintes;
981 }
982
983 /**
984 * Calcule une date par l'ajout ou la soustraction de mois
985 * @param date $date Date de base
986 * @param integer $delay Délais à ajouter (en mois)
987 * @param string $operator Opérateur pour le calcul ("-" ou "+")
988 *
989 * @return date Date calculée
990 */
991 function mois_date($date, $delay, $operator = "+") {
992
993 // Si aucune date n'a été fournie ou si ce n'est pas une date correctement formatée
994 if ( is_null($date) || $date == "" ||
995 preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $date) == 0 ){
996 return null;
997 }
998
999 // Découpage de la date
1000 $temp = explode("-", $date);
1001 $day = (int) $temp[2];
1002 $month = (int) $temp[1];
1003 $year = (int) $temp[0];
1004
1005 // Si c'est une addition
1006 if ($operator == '+') {
1007 // Année à ajouter
1008 $year += floor($delay / 12);
1009 // Mois restant
1010 $nb_month = ($delay % 12);
1011 // S'il y a des mois restant
1012 if ($nb_month != 0) {
1013 // Ajout des mois restant
1014 $month += $nb_month;
1015 // Si ça dépasse le mois 12 (décembre)
1016 if ($month > 12) {
1017 // Soustrait 12 au mois
1018 $month -= 12;
1019 // Ajoute 1 à l'année
1020 $year += 1;
1021 }
1022 }
1023 }
1024
1025 // Si c'est une soustraction
1026 if ($operator == "-") {
1027 // Année à soustraire
1028 $year -= floor($delay / 12);
1029 // Mois restant
1030 $nb_month = ($delay % 12);
1031 // S'il y a des mois restant
1032 if ($nb_month != 0) {
1033 // Soustrait le délais
1034 $month -= $nb_month;
1035 // Si ça dépasse le mois 1 (janvier)
1036 if ($month < 1) {
1037 // Soustrait 12 au mois
1038 $month += 12;
1039 // Ajoute 1 à l'année
1040 $year -= 1;
1041 }
1042 }
1043 }
1044
1045 // Calcul du nombre de jours dans le mois sélectionné
1046 switch($month) {
1047 // Mois de février
1048 case "2":
1049 if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
1050 $day_max = 29;
1051 } else {
1052 $day_max = 28;
1053 }
1054 break;
1055 // Mois d'avril, juin, septembre et novembre
1056 case "4":
1057 case "6":
1058 case "9":
1059 case "11":
1060 $day_max = 30;
1061 break;
1062 // Mois de janvier, mars, mai, juillet, août, octobre et décembre
1063 default:
1064 $day_max = 31;
1065 }
1066
1067 // Si le jour est supérieur au jour maximum du mois
1068 if ($day > $day_max) {
1069 // Le jour devient le jour maximum
1070 $day = $day_max;
1071 }
1072
1073 // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre
1074 $month = str_pad($month, 2, "0", STR_PAD_LEFT);
1075 $day = str_pad($day, 2, "0", STR_PAD_LEFT);
1076
1077 // Retourne la date calculée
1078 return $year."-".$month."-".$day ;
1079 }
1080
1081 /**
1082 * Vérifie la valididité d'une date.
1083 *
1084 * @param string $pDate Date à vérifier
1085 *
1086 * @return boolean
1087 */
1088 function check_date($pDate) {
1089
1090 // Vérifie si c'est une date valide
1091 if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $pDate, $date)
1092 && checkdate($date[2], $date[3], $date[1])
1093 && $date[1] >= 1900) {
1094 //
1095 return true;
1096 }
1097
1098 //
1099 return false;
1100 }
1101
1102 /**
1103 * XXX Méthode à supprimer après que les externals du core soient dé-fixé
1104 *
1105 * Méthode de prévention des failles de sécurités en nettoyant les variables
1106 * passées en paramètre.
1107 *
1108 * @param mixed $input valeurs à netoyer
1109 *
1110 * @return mixed valeurs nétoyées
1111 */
1112 function clean_break($input) {
1113 if(is_array($input)) {
1114 foreach($input as $key => $value) {
1115 $input[$key] = $this->clean_break($value);
1116 }
1117 } else {
1118 //remove whitespace...
1119 $input = trim($input);
1120 //disable magic quotes...
1121 if(get_magic_quotes_gpc()) {
1122 stripslashes($input);
1123 }
1124 //prevent sql injection...
1125 if(!is_numeric($input)) {
1126 if(isset($this->db)) {
1127 $this->db->escapeSimple($input);
1128 }
1129 }
1130 //prevent xss...
1131 $input = strip_tags($input);
1132 }
1133 return $input;
1134 }
1135 }
1136
1137 ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26