1 |
<?php |
2 |
//$Id: dossier_message.class.php 4685 2015-04-30 12:30:55Z nmeucci $ |
3 |
//gen openMairie le 15/11/2012 18:30 |
4 |
|
5 |
require_once ("../gen/obj/dossier_message.class.php"); |
6 |
|
7 |
class dossier_message extends dossier_message_gen { |
8 |
|
9 |
/** @var boolean Les nouvelles actions sont activées sur cet objet */ |
10 |
var $activate_class_action; |
11 |
|
12 |
/** |
13 |
* Instance de om_utilisateur |
14 |
* |
15 |
* @var null |
16 |
*/ |
17 |
var $inst_om_utilisateur = null; |
18 |
|
19 |
/** |
20 |
* Instance de dossier |
21 |
* |
22 |
* @var null |
23 |
*/ |
24 |
var $inst_dossier = null; |
25 |
|
26 |
function __construct($id, &$dnu1 = null, $dnu2 = null) { |
27 |
// On active les nouvelles actions |
28 |
$this->activate_class_action = true; |
29 |
// |
30 |
$this->constructeur($id); |
31 |
}// fin constructeur |
32 |
|
33 |
/** |
34 |
* Définition des actions disponibles sur la classe. |
35 |
* |
36 |
* @return void |
37 |
*/ |
38 |
function init_class_actions() { |
39 |
parent::init_class_actions(); |
40 |
|
41 |
// ACTION - 000 - ajouter |
42 |
// |
43 |
$this->class_actions[0]["condition"] = "is_ajoutable"; |
44 |
|
45 |
// ACTION - 001 - modifier |
46 |
// |
47 |
$this->class_actions[1]["condition"] = "is_modifiable"; |
48 |
|
49 |
// ACTION - 002 - supprimer |
50 |
// |
51 |
$this->class_actions[2]["condition"] = "is_supprimable"; |
52 |
|
53 |
// ACTION - 010 - marquer comme lu |
54 |
// |
55 |
$this->class_actions[10] = array( |
56 |
"identifier" => "marquer_comme_lu", |
57 |
"portlet" => array( |
58 |
"type" => "action-direct", |
59 |
"libelle" => _("Marquer comme lu"), |
60 |
"order" => 30, |
61 |
"class" => "lu-16", |
62 |
), |
63 |
"view" => "formulaire", |
64 |
"method" => "marquer_comme_lu", |
65 |
"permission_suffix" => "modifier_lu", |
66 |
"condition" => "is_marquable_comme_lu", |
67 |
); |
68 |
|
69 |
// ACTION - 020 - marquer comme non lu |
70 |
// |
71 |
$this->class_actions[20] = array( |
72 |
"identifier" => "marquer_comme_non_lu", |
73 |
"portlet" => array( |
74 |
"type" => "action-direct", |
75 |
"libelle" => _("Marquer comme non lu"), |
76 |
"order" => 30, |
77 |
"class" => "nonlu-16", |
78 |
), |
79 |
"view" => "formulaire", |
80 |
"method" => "marquer_comme_non_lu", |
81 |
"permission_suffix" => "modifier_lu", |
82 |
"condition" => "is_marquable_comme_non_lu", |
83 |
); |
84 |
} |
85 |
|
86 |
|
87 |
/** |
88 |
* CONDITION - is_marquable_comme_lu. |
89 |
* |
90 |
* Condition pour afficher le bouton marquer comme lu |
91 |
* |
92 |
* @return boolean |
93 |
*/ |
94 |
public function is_marquable_comme_lu() { |
95 |
// Si déjà lu |
96 |
if ($this->getVal("lu") == "t") { |
97 |
return false; |
98 |
} |
99 |
// Si l'utilisateur est un intructeur qui ne correspond pas à la |
100 |
// division du dossier et qu'il n'a pas de bypass |
101 |
if (!$this->f->isAccredited("dossier_message_modifier_lu_bypass") |
102 |
&& $this->f->isUserInstructeur() |
103 |
&& isset($this->f->om_utilisateur["division"]) |
104 |
&& $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) { |
105 |
return false; |
106 |
} |
107 |
// Récupération de l'ID et et de la classe du dossier lié |
108 |
$idxformulaire = $this->getParameter("idxformulaire"); |
109 |
$retourformulaire = $this->getParameter("retourformulaire"); |
110 |
// Si le dossier d'instruction auquel est rattaché le message |
111 |
// est cloturé |
112 |
if ($this->is_in_context_of_foreign_key("dossier", $retourformulaire)) { |
113 |
// On récupère le statut du dossier d'instruction |
114 |
$statut = $this->f->getStatutDossier($idxformulaire); |
115 |
if ($this->f->isUserInstructeur() && $statut == "cloture" ){ |
116 |
return false; |
117 |
} |
118 |
} |
119 |
return true; |
120 |
} |
121 |
|
122 |
|
123 |
/** |
124 |
* CONDITION - is_marquable_comme_non_lu. |
125 |
* |
126 |
* Condition pour afficher le bouton marquer comme non lu |
127 |
* |
128 |
* @return boolean |
129 |
*/ |
130 |
public function is_marquable_comme_non_lu() { |
131 |
// Si déjà non lu |
132 |
if ($this->getVal("lu") == "f") { |
133 |
return false; |
134 |
} |
135 |
// Si l'utilisateur est un intructeur qui ne correspond pas à la |
136 |
// division du dossier et qu'il n'a pas de bypass |
137 |
if (!$this->f->isAccredited("dossier_message_modifier_lu_bypass") |
138 |
&& $this->f->isUserInstructeur() |
139 |
&& isset($this->f->om_utilisateur["division"]) |
140 |
&& $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) { |
141 |
return false; |
142 |
} |
143 |
// Récupération de l'ID et et de la classe du dossier lié |
144 |
$idxformulaire = $this->getParameter("idxformulaire"); |
145 |
$retourformulaire = $this->getParameter("retourformulaire"); |
146 |
// Si le dossier d'instruction auquel est rattaché le message |
147 |
// est cloturé |
148 |
if ($this->is_in_context_of_foreign_key("dossier", $retourformulaire)) { |
149 |
// On récupère le statut du dossier d'instruction |
150 |
$statut = $this->f->getStatutDossier($idxformulaire); |
151 |
if ($this->f->isUserInstructeur() && $statut == "cloture" ){ |
152 |
return false; |
153 |
} |
154 |
} |
155 |
return true; |
156 |
} |
157 |
|
158 |
|
159 |
/** |
160 |
* TREATMENT - marquer_comme_lu. |
161 |
* |
162 |
* Cette methode permet de passer la message en "lu" |
163 |
* |
164 |
* @return boolean true si maj effectué false sinon |
165 |
*/ |
166 |
public function marquer_comme_lu() { |
167 |
// Cette méthode permet d'exécuter une routine en début des méthodes |
168 |
// dites de TREATMENT. |
169 |
$this->begin_treatment(__METHOD__); |
170 |
|
171 |
if($this->getVal("lu") == 'f') { |
172 |
$this->correct = true; |
173 |
$this->valF["lu"] = true; |
174 |
|
175 |
$res = $this->f->db->autoExecute( |
176 |
DB_PREFIXE.$this->table, |
177 |
$this->valF, |
178 |
DB_AUTOQUERY_UPDATE, |
179 |
$this->clePrimaire."=".$this->getVal($this->clePrimaire) |
180 |
); |
181 |
if ($this->f->isDatabaseError($res, true)) { |
182 |
// Appel de la methode de recuperation des erreurs |
183 |
$this->erreur_db($res->getDebugInfo(), $res->getMessage(), ''); |
184 |
$this->correct = false; |
185 |
// Termine le traitement |
186 |
return $this->end_treatment(__METHOD__, false); |
187 |
} else { |
188 |
$this->addToMessage(_("Le message a été marqué comme lu.")); |
189 |
return $this->end_treatment(__METHOD__, true); |
190 |
} |
191 |
|
192 |
} else { |
193 |
$this->addToMessage(_("Le message est déjà marqué comme lu.")); |
194 |
} |
195 |
|
196 |
// Termine le traitement |
197 |
return $this->end_treatment(__METHOD__, false); |
198 |
} |
199 |
|
200 |
|
201 |
/** |
202 |
* TREATMENT - marquer_comme_non_lu. |
203 |
* |
204 |
* Cette methode permet de passer la message en "non lu" |
205 |
* |
206 |
* @return boolean true si maj effectué false sinon |
207 |
*/ |
208 |
public function marquer_comme_non_lu() { |
209 |
// Cette méthode permet d'exécuter une routine en début des méthodes |
210 |
// dites de TREATMENT. |
211 |
$this->begin_treatment(__METHOD__); |
212 |
|
213 |
if($this->getVal("lu") == 't') { |
214 |
$this->correct = true; |
215 |
$this->valF["lu"] = false; |
216 |
|
217 |
$res = $this->f->db->autoExecute( |
218 |
DB_PREFIXE.$this->table, |
219 |
$this->valF, |
220 |
DB_AUTOQUERY_UPDATE, |
221 |
$this->clePrimaire."=".$this->getVal($this->clePrimaire) |
222 |
); |
223 |
if ($this->f->isDatabaseError($res, true)) { |
224 |
// Appel de la methode de recuperation des erreurs |
225 |
$this->erreur_db($res->getDebugInfo(), $res->getMessage(), ''); |
226 |
$this->correct = false; |
227 |
// Termine le traitement |
228 |
return $this->end_treatment(__METHOD__, false); |
229 |
} else { |
230 |
$this->addToMessage(_("Le message a été marqué comme non lu.")); |
231 |
return $this->end_treatment(__METHOD__, true); |
232 |
} |
233 |
|
234 |
} else { |
235 |
$this->addToMessage(_("Le message est déjà marqué comme non lu.")); |
236 |
} |
237 |
|
238 |
// Termine le traitement |
239 |
return $this->end_treatment(__METHOD__, false); |
240 |
} |
241 |
|
242 |
|
243 |
/** |
244 |
* CONDITION - is_ajoutable. |
245 |
* |
246 |
* Condition pour pouvoir ajouter |
247 |
* |
248 |
* @return boolean |
249 |
*/ |
250 |
function is_ajoutable() { |
251 |
// Impossible d'ajouter un message manuellement |
252 |
return false; |
253 |
} |
254 |
|
255 |
/** |
256 |
* CONDITION - is_modifiable. |
257 |
* |
258 |
* Condition pour afficher le bouton modifier |
259 |
* |
260 |
* @return boolean |
261 |
*/ |
262 |
function is_modifiable() { |
263 |
// Test du bypass |
264 |
if ($this->f->isAccredited("dossier_message_modifier_bypass")) { |
265 |
return true; |
266 |
} |
267 |
// Test des autres conditions |
268 |
return $this->is_ajoutable_or_modifiable_or_supprimable(); |
269 |
} |
270 |
|
271 |
/** |
272 |
* CONDITION - is_supprimable. |
273 |
* |
274 |
* Condition pour afficher le bouton supprimer |
275 |
* @return boolean |
276 |
*/ |
277 |
function is_supprimable() { |
278 |
// Test du bypass |
279 |
if ($this->f->isAccredited("dossier_message_supprimer_bypass")) { |
280 |
return true; |
281 |
} |
282 |
// Test des autres conditions |
283 |
return $this->is_ajoutable_or_modifiable_or_supprimable(); |
284 |
} |
285 |
|
286 |
/** |
287 |
* Conditions pour afficher les boutons modifier et supprimer |
288 |
* |
289 |
* @return boolean |
290 |
*/ |
291 |
function is_ajoutable_or_modifiable_or_supprimable() { |
292 |
// |
293 |
$dossier = ($this->getParameter("maj")==0)?$this->getParameter("idxformulaire"):$this->getVal("dossier"); |
294 |
/** |
295 |
* Tester si le dossier est cloturé , de la meme division, instructeur, admin (?) |
296 |
*/ |
297 |
if($this->f->isUserInstructeur() |
298 |
&& isset($this->f->om_utilisateur["division"]) |
299 |
&& $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()){ |
300 |
return false; |
301 |
} |
302 |
// |
303 |
if ( $this->f->isUserInstructeur() && $this->f->getStatutDossier($dossier) == "cloture" ){ |
304 |
return false; |
305 |
} |
306 |
return true; |
307 |
} |
308 |
|
309 |
/** |
310 |
* Cette variable permet de stocker le résultat de la méthode |
311 |
* getDivisionFromDossier() afin de ne pas effectuer le recalcul à chacun de |
312 |
* ces appels. |
313 |
* @var string Code de la division du dossier en cours |
314 |
*/ |
315 |
var $_division_from_dossier = NULL; |
316 |
|
317 |
/** |
318 |
* Cette méthode permet de récupérer le code de division correspondant |
319 |
* au dossier sur lequel on se trouve. |
320 |
* |
321 |
* @return string Code de la division du dossier en cours |
322 |
*/ |
323 |
function getDivisionFromDossier() { |
324 |
// Cette méthode peut être appelée plusieurs fois lors d'une requête. |
325 |
// Pour éviter de refaire le traitement de recherche de la division |
326 |
// alors on vérifie si nous ne l'avons pas déjà calculé. |
327 |
if ($this->_division_from_dossier != NULL) { |
328 |
// Logger |
329 |
$this->addToLog("getDivisionFromDossier(): retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE); |
330 |
// On retourne la valeur déjà calculée |
331 |
return $this->_division_from_dossier; |
332 |
} |
333 |
|
334 |
// Par défaut, on définit la valeur du dossier à NULL |
335 |
$dossier = NULL; |
336 |
// Test sur le mode et le contexte du formulaire |
337 |
if ($this->getParameter("maj") == 0 |
338 |
&& $this->is_in_context_of_foreign_key("dossier", $this->getParameter("retourformulaire"))) { |
339 |
// Si on se trouve en mode AJOUT (seul mode où l'enregistrement |
340 |
// n'existe pas en base de données) ET que nous nous trouvons |
341 |
// dans le contexte d'un dossier d'instruction alors on récupère |
342 |
// le numéro de dossier depuis le paramètre 'idxformulaire' |
343 |
$dossier = $this->getParameter("idxformulaire"); |
344 |
} else { |
345 |
// Sinon on récupère le numéro de dossier dans le champs dossier de |
346 |
// l'enregistrement (en base de données) |
347 |
$dossier = $this->getVal("dossier"); |
348 |
} |
349 |
|
350 |
// On appelle la méthode de la classe utils qui renvoi le code de la |
351 |
// division d'un dossier, on la stocke pour ne pas refaire le calcul au |
352 |
// prochain appel de cette méthode |
353 |
$this->_division_from_dossier = $this->f->getDivisionFromDossier($dossier); |
354 |
// Logger |
355 |
$this->addToLog("getDivisionFromDossier(): retour de la valeur nouvellement calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE); |
356 |
// On retourne la valeur retournée |
357 |
return $this->_division_from_dossier; |
358 |
|
359 |
} |
360 |
|
361 |
// }}} |
362 |
|
363 |
/** |
364 |
* Utilise dans la recherche avance pour remplir le select par |
365 |
* le type du message |
366 |
*/ |
367 |
function setSelect(&$form, $maj, &$db, $debug) { |
368 |
// |
369 |
if (file_exists("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php")) { |
370 |
include "../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php"; |
371 |
} elseif (file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc")) { |
372 |
include "../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc"; |
373 |
} |
374 |
|
375 |
// import depuis de la BD les types des messages disponibles pour |
376 |
// le dossier |
377 |
$this->init_select($form, $db, $maj, $debug, "type", $sql_messages_type, null, false); |
378 |
} |
379 |
|
380 |
public function setType(&$form,$maj) { |
381 |
//type |
382 |
parent::setType($form, $maj); |
383 |
|
384 |
// On cache le dossier |
385 |
$form->setType('dossier','hidden'); |
386 |
|
387 |
// seulement la modification du champ lu est possible en modification |
388 |
if ($maj==1){ //modifier |
389 |
$form->setType('type','hiddenstatic'); |
390 |
$form->setType('emetteur','hiddenstatic'); |
391 |
$form->setType('date_emission','hiddenstatic'); |
392 |
$form->setType('lu','checkbox'); |
393 |
$form->setType('contenu','textareahiddenstatic'); |
394 |
$form->setType('categorie','hiddenstatic'); |
395 |
}// fin modifier |
396 |
|
397 |
// Pour les actions marquer_comme_lu, marquer_comme_non_lu |
398 |
if($maj == 10 || $maj == 20) { |
399 |
// |
400 |
foreach ($this->champs as $value) { |
401 |
// Cache tous les champs |
402 |
$form->setType($value, 'hidden'); |
403 |
} |
404 |
} |
405 |
} |
406 |
|
407 |
|
408 |
public function setOnchange(&$form, $maj) { |
409 |
parent::setOnchange($form, $maj); |
410 |
|
411 |
// JS de contrôle de la date |
412 |
$form->setOnchange('date_emission','fdate(this)'); |
413 |
} |
414 |
|
415 |
|
416 |
public function setLib(&$form, $maj) { |
417 |
parent::setLib($form, $maj); |
418 |
|
419 |
// |
420 |
$form->setLib('dossier_message',_('message')); |
421 |
} |
422 |
|
423 |
|
424 |
/** |
425 |
* Surcharge du fil d'ariane en contexte sous-formulaire. |
426 |
* |
427 |
* @param string $subent Chaîne initiale. |
428 |
* |
429 |
* @return string |
430 |
*/ |
431 |
public function getSubFormTitle($subent) { |
432 |
// |
433 |
$subent = _("dossiers d'instruction")." -> "._("message")." -> ".$this->getVal('dossier_message'); |
434 |
// |
435 |
return $subent; |
436 |
} |
437 |
|
438 |
|
439 |
/** |
440 |
* Ajoute un message de notification. |
441 |
* |
442 |
* @param array $val Liste des valeurs. |
443 |
* |
444 |
* @return boolean |
445 |
*/ |
446 |
public function add_notification_message(array $val) { |
447 |
|
448 |
// Liste des valeurs nécessaires à la création du message |
449 |
$dossier = $val['dossier']; |
450 |
$type = $val['type']; |
451 |
$emetteur = $val['emetteur']; |
452 |
$login = $val['login']; |
453 |
$date_emission = $val['date_emission']; |
454 |
$contenu = $val['contenu']; |
455 |
|
456 |
// Récupère l'identifiant instructeur de l'emetteur |
457 |
$inst_om_utilisateur = $this->get_inst_om_utilisateur(0); |
458 |
$instructeur = $inst_om_utilisateur->get_instructeur_by_om_utilisateur_login($login); |
459 |
|
460 |
// Récupère l'instructeur du dossier |
461 |
$inst_dossier = $this->get_inst_dossier($dossier); |
462 |
$di_instructeur = $inst_dossier->getVal('instructeur'); |
463 |
|
464 |
// Vérifie si l'instructeur est affecté au dossier |
465 |
$transmitter_is_dossier_instructor = false; |
466 |
if ($instructeur !== '' |
467 |
&& $instructeur !== null |
468 |
&& $instructeur === $di_instructeur) { |
469 |
// |
470 |
$transmitter_is_dossier_instructor = true; |
471 |
} |
472 |
|
473 |
// Requête SQL de recherche des messages |
474 |
$sql = 'SELECT count(dossier_message) |
475 |
FROM '.DB_PREFIXE.'dossier_message |
476 |
WHERE dossier = \''.$dossier.'\' |
477 |
AND type = \''.$this->f->db->escapeSimple($type).'\' |
478 |
-- Permet de récupérer seulement la date sans l\'\'heure, les minutes et les secondes |
479 |
AND date_trunc(\'day\', date_emission) = date_trunc(\'day\', timestamp \''.$date_emission.'\') |
480 |
AND emetteur = \''.$this->f->db->escapeSimple($emetteur).'\''; |
481 |
// Si l'emetteur n'est pas l'instructeur du dossier |
482 |
if ($transmitter_is_dossier_instructor == false) { |
483 |
// Vérifie que le message ne soit pas lu |
484 |
$sql .= 'AND lu IS FALSE'; |
485 |
} |
486 |
// Log |
487 |
$this->f->addToLog(__METHOD__."() : db->getOne(\"".$sql."\")", VERBOSE_MODE); |
488 |
// Exécute la requête |
489 |
$count = $this->db->getOne($sql); |
490 |
// Contrôle les erreurs de base de données |
491 |
$this->f->isDatabaseError($count); |
492 |
|
493 |
// Si au moins un message identique existe |
494 |
if ($count !== '0') { |
495 |
// Stop le traitement |
496 |
return true; |
497 |
} |
498 |
|
499 |
// Liste des valeurs |
500 |
$val = array(); |
501 |
$val['dossier_message'] = ''; |
502 |
$val['dossier'] = $dossier; |
503 |
$val['type'] = $type; |
504 |
$val['emetteur'] = $emetteur; |
505 |
$val['date_emission'] = $date_emission; |
506 |
$val['lu'] = $transmitter_is_dossier_instructor; |
507 |
$val['contenu'] = $contenu; |
508 |
$val['categorie'] = 'interne'; |
509 |
// Ajoute un message |
510 |
$add = $this->ajouter($val); |
511 |
// Si une erreur se produit pendant l'ajout |
512 |
if ($add !== true) { |
513 |
// |
514 |
return false; |
515 |
} |
516 |
|
517 |
// |
518 |
return true; |
519 |
} |
520 |
|
521 |
|
522 |
/** |
523 |
* Récupère l'instance de om_utilisateur. |
524 |
* |
525 |
* @param string $om_utilisateur Identifiant de l'utilisateur. |
526 |
* |
527 |
* @return object |
528 |
*/ |
529 |
private function get_inst_om_utilisateur($om_utilisateur = null) { |
530 |
// |
531 |
return $this->get_inst_common("om_utilisateur", $om_utilisateur); |
532 |
} |
533 |
|
534 |
|
535 |
/** |
536 |
* Récupère l'instance de dossier. |
537 |
* |
538 |
* @param string $dossier Identifiant du dossier d'instruction. |
539 |
* |
540 |
* @return object |
541 |
*/ |
542 |
private function get_inst_dossier($dossier = null) { |
543 |
// |
544 |
return $this->get_inst_common("dossier", $dossier); |
545 |
} |
546 |
|
547 |
|
548 |
}// fin classe |
549 |
?> |