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

Contents of /trunk/obj/dossier.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15037 - (show annotations)
Mon Jun 19 13:23:51 2023 UTC (19 months, 2 weeks ago) by softime
File size: 516301 byte(s)
chore(branch): fusion de la branche d'intégration 5.18.0-develop dans le trunk

1 <?php
2 /**
3 * DBFORM - 'dossier' - Surcharge gen.
4 *
5 * @package openads
6 * @version SVN : $$Id: dossier.class.php 6912 2017-06-15 08:20:09Z tuxayo $
7 */
8
9 require_once "../gen/obj/dossier.class.php";
10
11 require_once "../obj/geoads.class.php";
12 require_once "../obj/task.class.php";
13
14 class dossier extends dossier_gen {
15
16 const LAT_LON_REGEX = "/^(?P<deg>\d+)(°|d) *(?P<min>\d+)[.,](?P<dec>\d+)('|`|′)? *(?P<dir>[NSEOW])\$/";
17
18 var $maj;
19 var $dossier_instruction_type;
20 var $is_incomplet_notifie = null;
21 var $valIdDemandeur = array("petitionnaire_principal" => array(),
22 "delegataire" => array(),
23 "petitionnaire" => array(),
24 "plaignant_principal" => array(),
25 "plaignant" => array(),
26 "contrevenant_principal" => array(),
27 "contrevenant" => array(),
28 "requerant_principal" => array(),
29 "requerant" => array(),
30 "avocat_principal" => array(),
31 "avocat" => array(),
32 "bailleur_principal" => array(),
33 "bailleur" => array(),
34 "proprietaire" => array(),
35 "architecte_lc" => array(),
36 "paysagiste" => array(),
37 );
38 var $postedIdDemandeur = array("petitionnaire_principal" => array(),
39 "delegataire" => array(),
40 "petitionnaire" => array(),
41 "plaignant_principal" => array(),
42 "plaignant" => array(),
43 "contrevenant_principal" => array(),
44 "contrevenant" => array(),
45 "requerant_principal" => array(),
46 "requerant" => array(),
47 "avocat_principal" => array(),
48 "avocat" => array(),
49 "bailleur_principal" => array(),
50 "bailleur" => array(),
51 "proprietaire" => array(),
52 "architecte_lc" => array(),
53 "paysagiste" => array(),
54 );
55 /**
56 * Instance de la classe taxe_amenagement.
57 *
58 * @var null
59 */
60 var $inst_taxe_amenagement = null;
61
62 /**
63 * Instance de la classe donnees_techniques.
64 *
65 * @var null
66 */
67 var $inst_donnees_techniques = null;
68
69 /**
70 * Instance de la classe dossier_autorisation.
71 *
72 * @var mixed (resource | null)
73 */
74 var $inst_dossier_autorisation = null;
75
76 /**
77 * Instance de la classe dossier_autorisation_type_detaille.
78 *
79 * @var null
80 */
81 var $inst_dossier_autorisation_type_detaille = null;
82
83 /**
84 * Instance de la classe cerfa.
85 *
86 * @var null
87 */
88 var $inst_cerfa = null;
89
90 /**
91 * Groupe du dossier d'instruction.
92 *
93 * @var null
94 */
95 var $groupe = null;
96
97 /**
98 * Instance de la classe groupe.
99 */
100 var $inst_groupe = null;
101
102 /**
103 * Instance de la classe dossier_autorisation_type.
104 *
105 * @var null
106 */
107 var $inst_dossier_autorisation_type = null;
108
109 /**
110 * Instance de la classe demande.
111 *
112 * @var mixed (resource | null)
113 */
114 var $inst_demande = null;
115
116 /**
117 * Liste des types de tâches.
118 *
119 * @var array
120 */
121 var $task_types = array(
122 'incompletude_DI',
123 'qualification_DI',
124 'decision_DI',
125 'completude_DI',
126 'pec_metier_consultation',
127 'avis_consultation',
128 'modification_DI',
129 'prescription',
130 'lettre_incompletude',
131 'lettre_majoration'
132 );
133
134 /**
135 * Liste des champs requis dans Plat'AU.
136 *
137 * @var array
138 */
139 var $list_platau_required_fields_dossier = array(
140 'donnees_techniques.enga_decla_date',
141 'donnees_techniques.enga_decla_lieu',
142 'dossier.terrain_adresse_localite',
143 'demandeur.localite',
144 'architecte.ville'
145 );
146
147
148 /**
149 * Liaison NaN
150 *
151 * Tableau contenant les objets qui représente les liaisons.
152 */
153 var $liaisons_nan = array(
154 "lien_dossier_nature_travaux" => array(
155 "table_l" => "lien_dossier_nature_travaux",
156 "table_f" => "nature_travaux",
157 "field" => "nature_travaux",
158 )
159 );
160
161 /**
162 * Set un tableau pour la conception des requêtes de suppression des éléments
163 * dans les tables de liaisons.
164 * Le tableau est constitué de la manière suivante :
165 * 'nom_de_la_table' => array(
166 * 'table' => "nom de la table à supprimer si il
167 * n'a pas pu être renseigné comme clé du tableau",
168 * 'condition_field' => 'nom du champs utilisée pour identifier
169 * les éléments liés',
170 * 'condition_value' => 'valeur utilisée pour identifier les
171 * éléments liés'
172 * ),
173 *
174 * @var array
175 */
176 public function set_related_tables() {
177 $this->related_tables = array(
178 'lien_demande_demandeur' => array(
179 'condition_field' => 'demande',
180 'condition_value' => $this->get_idx_by_args(
181 'demande',
182 'demande',
183 'dossier_instruction',
184 $this->getVal($this->clePrimaire)),
185 ),
186 'demande' => array(
187 'condition_field' => 'dossier_instruction',
188 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
189 ),
190 'lien_dossier_demandeur' => array(
191 'condition_field' => 'dossier',
192 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
193 ),
194 'instruction_notification_document' => array(
195 'condition_field' => 'instruction_notification',
196 'condition_value' => sprintf(
197 'SELECT
198 %2$s
199 FROM
200 %1$s%2$s
201 WHERE
202 %3$s IN (%4$s)',
203 DB_PREFIXE,
204 'instruction_notification',
205 'instruction',
206 sprintf(
207 'SELECT
208 %2$s
209 FROM
210 %1$s%2$s
211 WHERE
212 %3$s = \'%4$s\'',
213 DB_PREFIXE,
214 'instruction',
215 'dossier',
216 $this->getVal($this->clePrimaire)
217 )
218 ),
219 ),
220 'instruction_notification' => array(
221 'condition_field' => 'instruction',
222 'condition_value' => sprintf(
223 'SELECT
224 %2$s
225 FROM
226 %1$s%2$s
227 WHERE
228 %3$s = \'%4$s\'',
229 DB_PREFIXE,
230 'instruction',
231 'dossier',
232 $this->getVal($this->clePrimaire)
233 ),
234 ),
235 'instruction' => array(
236 'condition_field' => 'dossier',
237 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
238 ),
239 'dossier_parcelle' => array(
240 'condition_field' => 'dossier',
241 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
242 ),
243 'dossier_contrainte' => array(
244 'condition_field' => 'dossier',
245 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
246 ),
247 'lien_donnees_techniques_moyen_retenu_juge' => array(
248 'condition_field' => 'donnees_techniques',
249 'condition_value' => $this->get_idx_by_args(
250 'donnees_techniques',
251 'donnees_techniques',
252 'dossier_instruction',
253 $this->getVal($this->clePrimaire)),
254 ),
255 'lien_donnees_techniques_moyen_souleve' => array(
256 'condition_field' => 'donnees_techniques',
257 'condition_value' => $this->get_idx_by_args(
258 'donnees_techniques',
259 'donnees_techniques',
260 'dossier_instruction',
261 $this->getVal($this->clePrimaire)),
262 ),
263 'donnees_techniques_di' => array(
264 'table' => 'donnees_techniques',
265 'condition_field' => 'dossier_instruction',
266 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
267 ),
268 'blocnote' => array(
269 'condition_field' => 'dossier',
270 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
271 ),
272 'consultation_entrante' => array(
273 'condition_field' => 'dossier',
274 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
275 ),
276 'consultation' => array(
277 'condition_field' => 'dossier',
278 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
279 ),
280 'document_numerise' => array(
281 'condition_field' => 'dossier',
282 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
283 ),
284 'rapport_instruction' => array(
285 'condition_field' => 'dossier_instruction',
286 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
287 ),
288 'dossier_commission' => array(
289 'condition_field' => 'dossier',
290 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
291 ),
292 'dossier_message' => array(
293 'condition_field' => 'dossier',
294 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
295 ),
296 'lien_dossier_dossier_1' => array(
297 'table' => 'lien_dossier_dossier',
298 'condition_field' => 'dossier_src',
299 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
300 ),
301 'lien_dossier_dossier_2' => array(
302 'table' => 'lien_dossier_dossier',
303 'condition_field' => 'dossier_cible',
304 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
305 ),
306 'dossier_geolocalisation' => array(
307 'condition_field' => 'dossier',
308 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
309 ),
310 'donnees_techniques_lot' => array(
311 'table' => 'donnees_techniques',
312 'condition_field' => 'lot',
313 'condition_value' => $this->get_idx_by_args(
314 "string_agg(lot::text, ', ')",
315 'lot',
316 'dossier',
317 $this->getVal($this->clePrimaire)),
318 ),
319 'lien_lot_demandeur' => array(
320 'condition_field' => 'lot',
321 'condition_value' => $this->get_idx_by_args(
322 "string_agg(lot::text, ', ')",
323 'lot',
324 'dossier',
325 $this->getVal($this->clePrimaire)),
326 ),
327 'lot' => array(
328 'condition_field' => 'dossier',
329 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
330 ),
331 'dossier_operateur' => array(
332 'condition_field' => 'dossier_instruction',
333 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
334 ),
335 'lien_dossier_nature_travaux' => array(
336 'condition_field' => 'dossier',
337 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
338 )
339 );
340 }
341
342
343 /*Mutateur pour ma variable dossier_instruction_type*/
344 public function getDossierInstructionType(){
345 return $this->dossier_instruction_type;
346 }
347 public function setDossierInstructionType($dossier_instruction_type){
348 $this->dossier_instruction_type = $dossier_instruction_type;
349 }
350
351 /**
352 * Définition des actions disponibles sur la classe.
353 *
354 * @return void
355 */
356 function init_class_actions() {
357
358 parent::init_class_actions();
359
360 // ACTION - 003 - consulter
361 //
362 $this->class_actions[3]["condition"] = array(
363 "is_user_from_allowed_collectivite",
364 "check_context",
365 );
366
367 // ACTION - 004 - contrainte
368 //
369 $this->class_actions[4] = array(
370 "identifier" => "contrainte",
371 "view" => "view_contrainte",
372 "permission_suffix" => "contrainte_tab",
373 "condition" => array(
374 "is_user_from_allowed_collectivite",
375 ),
376 );
377
378 // ACTION - 005 - view_document_numerise
379 // Interface spécifique du tableau des pièces
380 $this->class_actions[5] = array(
381 "identifier" => "view_document_numerise",
382 "view" => "view_document_numerise",
383 "permission_suffix" => "document_numerise",
384 "condition" => array(
385 "is_user_from_allowed_collectivite",
386 ),
387 );
388
389 // ACTION - 006 - view_sitadel
390 //
391 $this->class_actions[6] = array(
392 "identifier" => "sitadel",
393 "view" => "view_sitadel",
394 "permission_suffix" => "export_sitadel",
395 );
396
397 // ACTION - 777 - Redirection vers la classe fille adéquate
398 //
399 $this->class_actions[777] = array(
400 "identifier" => "redirect",
401 "view" => "redirect",
402 "permission_suffix" => "consulter",
403 );
404
405 //
406 //
407 $this->class_actions[998] = array(
408 "identifier" => "json_data",
409 "view" => "view_json_data",
410 "permission_suffix" => "consulter",
411 );
412 }
413
414 /**
415 * Clause select pour la requête de sélection des données de l'enregistrement.
416 *
417 * @return array
418 */
419 function get_var_sql_forminc__champs() {
420 $champs = array(
421 "dossier.dossier",
422 "dossier.om_collectivite AS om_collectivite"
423 );
424 if ($this->f->is_option_dossier_commune_enabled()) {
425 $champs[] = "dossier.commune AS commune";
426 }
427 array_push($champs,
428 "dossier.dossier_libelle",
429 "dossier.dossier_instruction_type",
430 "dossier_autorisation_type_detaille.libelle as dossier_autorisation_type_detaille",
431 "autorisation_contestee",
432 "donnees_techniques.ctx_reference_dsj as ctx_reference_dsj",
433 "donnees_techniques.ctx_reference_sagace as ctx_reference_sagace",
434 "dossier.depot_electronique",
435 "CASE WHEN requerant_principal.qualite='particulier' THEN
436 TRIM(CONCAT(requerant_principal.particulier_nom, ' ', requerant_principal.particulier_prenom))
437 ELSE
438 TRIM(CONCAT(requerant_principal.personne_morale_raison_sociale, ' ', requerant_principal.personne_morale_denomination))
439 END as requerants",
440 "CASE WHEN petitionnaire_principal.qualite='particulier' THEN
441 TRIM(CONCAT(petitionnaire_principal.particulier_nom, ' ', petitionnaire_principal.particulier_prenom))
442 ELSE
443 TRIM(CONCAT(petitionnaire_principal.personne_morale_raison_sociale, ' ', petitionnaire_principal.personne_morale_denomination))
444 END as dossier_petitionnaire",
445 "'' as dossier_petitionnaires",
446 "CASE WHEN contrevenant_principal.qualite='particulier' THEN
447 TRIM(CONCAT(contrevenant_principal.particulier_nom, ' ', contrevenant_principal.particulier_prenom))
448 ELSE
449 TRIM(CONCAT(contrevenant_principal.personne_morale_raison_sociale, ' ', contrevenant_principal.personne_morale_denomination))
450 END as contrevenants",
451 "TRIM(
452 CONCAT_WS(
453 ' ',
454 replace(dossier.terrain_references_cadastrales,';',' '),
455 '<br/>',
456 CASE
457 WHEN dossier.adresse_normalisee IS NULL
458 OR TRIM(dossier.adresse_normalisee) = ''
459 THEN
460 ".DB_PREFIXE."adresse(
461 dossier.terrain_adresse_voie_numero::text,
462 dossier.terrain_adresse_voie::text,
463 ''::text,
464 dossier.terrain_adresse_lieu_dit::text,
465 dossier.terrain_adresse_bp::text,
466 dossier.terrain_adresse_code_postal::text,
467 dossier.terrain_adresse_localite::text,
468 dossier.terrain_adresse_cedex::text,
469 ''::text,
470 ', '::text
471 )
472 ELSE
473 dossier.adresse_normalisee
474 END
475 )
476 ) as terrain",
477 "arrondissement.libelle as dossier_arrondissement",
478 'dossier.adresse_normalisee',
479 'dossier.adresse_normalisee_json',
480 'dossier.dossier_parent',
481 sprintf("(SELECT string_agg(nature_travaux::text, ';') FROM %slien_dossier_nature_travaux WHERE dossier = dossier.dossier) as nature_travaux",
482 DB_PREFIXE),
483 // description/nature des travaux. En cas de modif, bloc de code aussi
484 // présent dans 'dossier_instruction.inc.php','om_requete'
485 // et 'stats à la demande'.
486 "CONCAT_WS(
487 '<br/>',
488 CASE WHEN co_projet_desc = '' THEN
489 NULL
490 ELSE
491 TRIM(co_projet_desc)
492 END,
493 CASE WHEN ope_proj_desc = '' THEN
494 NULL
495 ELSE
496 TRIM(ope_proj_desc)
497 END,
498 CASE WHEN am_projet_desc = '' THEN
499 NULL
500 ELSE
501 TRIM(am_projet_desc)
502 END,
503 CASE WHEN dm_projet_desc = '' THEN
504 NULL
505 ELSE
506 TRIM(dm_projet_desc)
507 END,
508 CASE WHEN donnees_techniques.erp_cstr_neuve IS TRUE
509 THEN '".str_replace("'", "''", _('erp_cstr_neuve'))."' END,
510 CASE WHEN donnees_techniques.erp_trvx_acc IS TRUE
511 THEN '".str_replace("'", "''", _('erp_trvx_acc'))."' END,
512 CASE WHEN donnees_techniques.erp_extension IS TRUE
513 THEN '".str_replace("'", "''", _('erp_extension'))."' END,
514 CASE WHEN donnees_techniques.erp_rehab IS TRUE
515 THEN '".str_replace("'", "''", _('erp_rehab'))."' END,
516 CASE WHEN donnees_techniques.erp_trvx_am IS TRUE
517 THEN '".str_replace("'", "''", _('erp_trvx_am'))."' END,
518 CASE WHEN donnees_techniques.erp_vol_nouv_exist IS TRUE
519 THEN '".str_replace("'", "''", _('erp_vol_nouv_exist'))."' END
520 ) as \"description_projet\"",
521 //
522 "donnees_techniques.ctx_synthese_nti as dt_ctx_synthese_nti",
523 "donnees_techniques.ctx_synthese_anr as dt_ctx_synthese_anr ",
524 "donnees_techniques.ctx_infraction as dt_ctx_infraction ",
525 "donnees_techniques.ctx_regularisable as dt_ctx_regularisable ",
526 "dossier_autorisation.dossier_autorisation",
527 "dossier_autorisation.dossier_autorisation_libelle",
528 "annee",
529 "autorite_competente",
530 "dossier.instructeur",
531 "instructeur_2",
532 "dossier.division",
533 "public.ST_AsText(dossier.geom::geometry) as geom",
534 "'' as streetview",
535 "tax_secteur",
536 // Enjeu
537 "enjeu_urba",
538 "enjeu_erp",
539 "'' as enjeu_ctx",
540 // Qualification
541 "erp",
542 "a_qualifier",
543 "pec_metier",
544 "etat_transmission_platau",
545 // Archive
546 "numero_versement_archive",
547 "date_demande",
548 // Fieldset instruction
549 // Suivi
550 // Col 1
551 "dossier.date_depot",
552 "dossier.date_depot_mairie",
553 "dossier.date_affichage",
554 "date_premiere_visite",
555 "date_derniere_visite",
556 "date_contradictoire",
557 "date_retour_contradictoire",
558 "date_ait",
559 "date_transmission_parquet",
560 "donnees_techniques.ctx_date_audience as date_audience",
561 "delai",
562 "delai_incompletude",
563 "date_dernier_depot",
564 "date_limite",
565 "date_complet",
566 "date_limite_incompletude",
567 "date_cloture_instruction",
568 // Col 2
569 "dossier.etat",
570 "evenement_suivant_tacite",
571 "evenement_suivant_tacite_incompletude",
572 // Bloc 2 fieldsets
573 // Col 1 : Fieldset "Décision"
574 "dossier.date_decision",
575 "dossier.avis_decision",
576 // Col 2 : Fieldset "Validité de l'autorisation"
577 "dossier.date_validite",
578 // Autre
579 // Col 1
580 "accord_tacite",
581 // Col 2
582 "date_rejet",
583 "date_notification_delai",
584 "dossier.date_chantier",
585 "dossier.date_achevement",
586 // Col 3
587 "date_conformite",
588 // Fieldset "Simulation des taxes"
589 "tax_mtn_part_commu",
590 "tax_mtn_part_commu_sans_exo",
591 "tax_mtn_part_depart",
592 "tax_mtn_part_depart_sans_exo",
593 "tax_mtn_part_reg",
594 "tax_mtn_part_reg_sans_exo",
595 "tax_mtn_total",
596 "tax_mtn_total_sans_exo",
597 "tax_mtn_rap",
598 "tax_mtn_rap_sans_exo",
599 // Fieldset "Localisation du terrain"
600 // Col 1
601 "dossier.terrain_adresse_voie_numero",
602 "dossier.terrain_adresse_lieu_dit",
603 "dossier.terrain_adresse_code_postal",
604 "dossier.terrain_adresse_cedex",
605 "dossier.parcelle_temporaire",
606 "dossier.terrain_references_cadastrales",
607 "dossier.geoloc_latitude",
608 "dossier.geoloc_longitude",
609 "dossier.geoloc_rayon",
610 // Col 2
611 "dossier.terrain_adresse_voie",
612 "dossier.terrain_adresse_bp",
613 "dossier.terrain_adresse_localite",
614 "dossier.terrain_superficie",
615 "dossier.terrain_superficie_calculee",
616 //
617 "geom1",
618 "dossier.description",
619 "version",
620 "incompletude",
621 "incomplet_notifie",
622 "etat_pendant_incompletude",
623 "dossier.duree_validite",
624 "quartier",
625 "dossier.log_instructions",
626 "interface_referentiel_erp",
627 "date_modification",
628 "hash_sitadel",
629 "version_clos",
630 "initial_dt",
631 // POC
632 "dossier.numerotation_type",
633 "dossier.numerotation_dep",
634 "dossier.numerotation_com",
635 "dossier.numerotation_division",
636 "dossier.numerotation_suffixe",
637 "dossier.numerotation_entite",
638 "dossier.numerotation_num",
639 "dossier.numerotation_num_suffixe",
640 "dossier.numerotation_num_entite",
641 // CONSULTATION ENTRANTE
642 "consultation_entrante.consultation_entrante",
643 "consultation_entrante.delai_reponse",
644 "consultation_entrante.type_delai",
645 "consultation_entrante.date_consultation",
646 "consultation_entrante.date_emission",
647 "consultation_entrante.date_production_notification",
648 "consultation_entrante.date_premiere_consultation",
649 "consultation_entrante.objet_consultation",
650 "consultation_entrante.etat_consultation",
651 "consultation_entrante.type_consultation",
652 "consultation_entrante.texte_fondement_reglementaire",
653 "consultation_entrante.texte_objet_consultation",
654 "consultation_entrante.service_consultant_id",
655 "consultation_entrante.service_consultant_libelle",
656 "consultation_entrante.service_consultant_insee",
657 "consultation_entrante.service_consultant_mail",
658 "consultation_entrante.service_consultant_type",
659 "consultation_entrante.service_consultant__siren",
660 "consultation_entrante.dossier as dossier_consultation",
661 //
662 "'' as lien_iiue"
663 );
664 return $champs;
665 }
666
667 /**
668 * Clause from pour la requête de sélection des données de l'enregistrement.
669 *
670 * @return string
671 */
672 function get_var_sql_forminc__tableSelect() {
673 return sprintf(
674 '%1$s%2$s
675 LEFT JOIN %1$savis_decision
676 ON avis_decision.avis_decision=dossier.avis_decision
677 LEFT JOIN %1$sdossier_autorisation
678 ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
679 LEFT JOIN %1$sdossier_autorisation_type_detaille
680 ON dossier_autorisation.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
681 LEFT JOIN (
682 SELECT *
683 FROM %1$slien_dossier_demandeur
684 INNER JOIN %1$sdemandeur
685 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
686 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
687 AND LOWER(demandeur.type_demandeur) = LOWER(\'petitionnaire\')
688 ) as petitionnaire_principal
689 ON petitionnaire_principal.dossier = dossier.dossier
690 LEFT JOIN (
691 SELECT *
692 FROM %1$slien_dossier_demandeur
693 INNER JOIN %1$sdemandeur
694 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
695 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
696 AND LOWER(demandeur.type_demandeur) = LOWER(\'requerant\')
697 ) as requerant_principal
698 ON requerant_principal.dossier = dossier.dossier
699 LEFT JOIN (
700 SELECT *
701 FROM %1$slien_dossier_demandeur
702 INNER JOIN %1$sdemandeur
703 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
704 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
705 AND LOWER(demandeur.type_demandeur) = LOWER(\'contrevenant\')
706 ) as contrevenant_principal
707 ON contrevenant_principal.dossier = dossier.dossier
708 LEFT JOIN %1$sdonnees_techniques
709 ON donnees_techniques.dossier_instruction = dossier.dossier
710 LEFT JOIN %1$setat
711 ON dossier.etat = etat.etat
712 LEFT JOIN %1$sarrondissement
713 ON dossier.terrain_adresse_code_postal = arrondissement.code_postal
714 LEFT JOIN %1$sconsultation_entrante
715 ON dossier.dossier = consultation_entrante.dossier',
716 DB_PREFIXE,
717 $this->table
718 );
719 }
720
721 /**
722 *
723 * @return string
724 */
725 function get_var_sql_forminc__sql_avis_decision() {
726 return "SELECT avis_decision,libelle from ".DB_PREFIXE."avis_decision order by libelle";
727 }
728
729 /**
730 *
731 * @return string
732 */
733 function get_var_sql_forminc__sql_avis_decision_by_id() {
734 return "SELECT avis_decision.avis_decision, libelle FROM ".DB_PREFIXE."avis_decision WHERE avis_decision = '<idx>'";
735 }
736
737 /**
738 *
739 * @return string
740 */
741 function get_var_sql_forminc__sql_dossier_autorisation() {
742 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation ORDER BY dossier_autorisation.dossier_autorisation ASC";
743 }
744
745 /**
746 *
747 * @return string
748 */
749 function get_var_sql_forminc__sql_dossier_autorisation_by_id() {
750 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation WHERE dossier_autorisation = '<idx>'";
751 }
752
753 /**
754 *
755 * @return string
756 */
757 function get_var_sql_forminc__sql_arrondissement() {
758 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement ORDER BY arrondissement.libelle ASC";
759 }
760
761 /**
762 *
763 * @return string
764 */
765 function get_var_sql_forminc__sql_arrondissement_by_id() {
766 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement WHERE arrondissement = <idx>";
767 }
768
769 /**
770 *
771 * @return string
772 */
773 function get_var_sql_forminc__sql_autorisation_contestee() {
774 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier ORDER BY dossier.annee ASC";
775 }
776
777 /**
778 *
779 * @return string
780 */
781 function get_var_sql_forminc__sql_autorisation_contestee_by_id() {
782 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier WHERE dossier = '<idx>'";
783 }
784
785 /**
786 *
787 * @return string
788 */
789 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille() {
790 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.code
791 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
792 ORDER BY dossier_autorisation_type_detaille.libelle";
793 }
794
795 /**
796 *
797 * @return string
798 */
799 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille_by_id() {
800 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.code FROM ".DB_PREFIXE."dossier_autorisation_type_detaille WHERE dossier_autorisation_type_detaille = <idx>";
801 }
802
803 /**
804 *
805 * @return string
806 */
807 function get_var_sql_forminc__sql_demandeur() {
808 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.libelle
809 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
810 ORDER BY dossier_autorisation_type_detaille.libelle";
811 }
812
813 /**
814 *
815 * @return string
816 */
817 function get_var_sql_forminc__sql_demandeur_by_id() {
818 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.libelle FROM ".DB_PREFIXE."dossier_autorisation_type_detaille WHERE dossier_autorisation_type_detaille = <idx>";
819 }
820
821 /**
822 *
823 * @return string
824 */
825 function get_var_sql_forminc__sql_instructeur_div() {
826 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
827 FROM ".DB_PREFIXE."instructeur
828 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
829 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
830 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
831 <instructeur_qualite>
832 ORDER BY nom";
833 }
834
835 /**
836 *
837 * @return string
838 */
839 function get_var_sql_forminc__sql_nature_travaux_by_dit() {
840 return sprintf('SELECT
841 nature_travaux.nature_travaux,
842 CONCAT_WS(\' / \', famille_travaux.libelle, nature_travaux.libelle) as lib
843 FROM %1$snature_travaux LEFT JOIN %1$sfamille_travaux ON nature_travaux.famille_travaux = famille_travaux.famille_travaux
844 LEFT JOIN %1$slien_dit_nature_travaux ON lien_dit_nature_travaux.nature_travaux = nature_travaux.nature_travaux
845 WHERE
846 lien_dit_nature_travaux.dossier_instruction_type = <dossier_instruction_type>
847 AND
848 (
849 nature_travaux.om_validite_debut IS NULL
850 OR nature_travaux.om_validite_debut <= CURRENT_DATE
851 )
852 AND (
853 nature_travaux.om_validite_fin IS NULL
854 OR nature_travaux.om_validite_fin > CURRENT_DATE
855 )
856 AND
857 (
858 famille_travaux.om_validite_debut IS NULL
859 OR famille_travaux.om_validite_debut <= CURRENT_DATE
860 )
861 AND (
862 famille_travaux.om_validite_fin IS NULL
863 OR famille_travaux.om_validite_fin > CURRENT_DATE
864 )
865 ORDER BY famille_travaux.libelle, nature_travaux.libelle',
866 DB_PREFIXE);
867 }
868
869 /**
870 *
871 * @return string
872 */
873 function get_var_sql_forminc__sql_nature_travaux_by_id() {
874 return sprintf('SELECT
875 nature_travaux.nature_travaux,
876 CONCAT_WS(\' / \', famille_travaux.libelle, nature_travaux.libelle) as lib
877 FROM
878 %1$snature_travaux
879 INNER JOIN
880 %1$sfamille_travaux ON nature_travaux.famille_travaux = famille_travaux.famille_travaux
881 WHERE
882 nature_travaux.nature_travaux IN (<idx>)
883 ORDER BY
884 nature_travaux.libelle',
885 DB_PREFIXE);
886 }
887
888 /**
889 *
890 * @return string
891 */
892 function get_var_sql_forminc__sql_instructeur_div_by_id() {
893 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
894 FROM ".DB_PREFIXE."instructeur
895 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
896 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
897 WHERE instructeur = <idx>";
898 }
899
900 /**
901 *
902 * @return string
903 */
904 function get_var_sql_forminc__sql_instructeur_div_by_di() {
905 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
906 FROM ".DB_PREFIXE."instructeur
907 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
908 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
909 LEFT JOIN ".DB_PREFIXE."direction
910 ON division.direction = direction.direction
911 LEFT JOIN ".DB_PREFIXE."om_collectivite
912 ON direction.om_collectivite = om_collectivite.om_collectivite
913 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
914 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
915 <instructeur_qualite>
916 ORDER BY nom";
917 }
918
919 /**
920 *
921 * @return string
922 */
923 function get_var_sql_forminc__sql_instructeur_by_di() {
924 return "SELECT instructeur.instructeur, instructeur.nom
925 FROM ".DB_PREFIXE."instructeur
926 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
927 LEFT JOIN ".DB_PREFIXE."division
928 ON instructeur.division = division.division
929 LEFT JOIN ".DB_PREFIXE."direction
930 ON division.direction = direction.direction
931 LEFT JOIN ".DB_PREFIXE."om_collectivite
932 ON direction.om_collectivite = om_collectivite.om_collectivite
933 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
934 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
935 <instructeur_qualite>
936 ORDER BY instructeur.nom ASC";
937 }
938
939 /**
940 *
941 * @return string
942 */
943 function get_var_sql_forminc__sql_instructeur_2_div() {
944 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
945 FROM ".DB_PREFIXE."instructeur
946 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
947 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
948 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
949 AND instructeur_qualite.code = <instructeur_qualite>
950 ORDER BY nom";
951 }
952
953 /**
954 *
955 * @return string
956 */
957 function get_var_sql_forminc__sql_instructeur_2_div_by_id() {
958 return $this->get_var_sql_forminc__sql("instructeur_div_by_id");
959 }
960
961 /**
962 *
963 * @return string
964 */
965 function get_var_sql_forminc__sql_instructeur_2_div_by_di() {
966 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
967 FROM ".DB_PREFIXE."instructeur
968 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
969 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
970 LEFT JOIN ".DB_PREFIXE."direction
971 ON division.direction = direction.direction
972 LEFT JOIN ".DB_PREFIXE."om_collectivite
973 ON direction.om_collectivite = om_collectivite.om_collectivite
974 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
975 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
976 AND instructeur_qualite.code = '<instructeur_qualite>'
977 ORDER BY nom";
978 }
979
980 /**
981 *
982 * @return string
983 */
984 function get_var_sql_forminc__sql_instructeur_2_by_di() {
985 return "SELECT instructeur.instructeur, instructeur.nom
986 FROM ".DB_PREFIXE."instructeur
987 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
988 LEFT JOIN ".DB_PREFIXE."division
989 ON instructeur.division = division.division
990 LEFT JOIN ".DB_PREFIXE."direction
991 ON division.direction = direction.direction
992 LEFT JOIN ".DB_PREFIXE."om_collectivite
993 ON direction.om_collectivite = om_collectivite.om_collectivite
994 WHERE ((instructeur.om_validite_debut IS NULL AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)) OR (instructeur.om_validite_debut <= CURRENT_DATE AND (instructeur.om_validite_fin IS NULL OR instructeur.om_validite_fin > CURRENT_DATE)))
995 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
996 AND instructeur_qualite.code = '<instructeur_qualite>'
997 ORDER BY instructeur.nom ASC";
998 }
999
1000 /**
1001 *
1002 * @return string
1003 */
1004 function get_var_sql_forminc__sql_division_by_di() {
1005 return "SELECT division.division, division.libelle
1006 FROM ".DB_PREFIXE."division
1007 LEFT JOIN ".DB_PREFIXE."direction
1008 ON division.direction = direction.direction
1009 LEFT JOIN ".DB_PREFIXE."om_collectivite
1010 ON direction.om_collectivite = om_collectivite.om_collectivite
1011 WHERE ((division.om_validite_debut IS NULL AND (division.om_validite_fin IS NULL OR division.om_validite_fin > CURRENT_DATE)) OR (division.om_validite_debut <= CURRENT_DATE AND (division.om_validite_fin IS NULL OR division.om_validite_fin > CURRENT_DATE)))
1012 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
1013 ORDER BY division.libelle ASC";
1014 }
1015
1016 /**
1017 *
1018 * @return string
1019 */
1020 function get_var_sql_forminc__sql_commune() {
1021 return "
1022 SELECT
1023 commune.commune, commune.libelle AS libelle
1024 FROM
1025 ".DB_PREFIXE."commune
1026 WHERE (commune.om_validite_debut IS NULL OR commune.om_validite_debut <= CURRENT_DATE)
1027 AND (commune.om_validite_fin IS NULL OR commune.om_validite_fin > CURRENT_DATE)
1028 ORDER BY commune.libelle ASC
1029 ";
1030 }
1031
1032 /**
1033 *
1034 * @return string
1035 */
1036 function get_var_sql_forminc__sql_dossier_instruction_type_by_id() {
1037 return sprintf('
1038 SELECT dossier_instruction_type.dossier_instruction_type,
1039 CONCAT_WS(\' - \', dossier_autorisation_type_detaille.libelle, dossier_instruction_type.libelle)
1040 FROM %1$sdossier_instruction_type
1041 LEFT JOIN %1$sdossier_autorisation_type_detaille ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1042 WHERE dossier_instruction_type = <idx>
1043 ',
1044 DB_PREFIXE
1045 );
1046 }
1047
1048 /**
1049 * VIEW - view_sitadel.
1050 *
1051 * @return void
1052 */
1053 function view_sitadel() {
1054 // Affichage du formulaire permettant le choix d'un interval de date
1055 // ainsi que le numéro de d'ordre qui est le numéro de la version de
1056 // l'export
1057 if (empty($this->f->get_submitted_post_value())) {
1058 // Affichage du formulaire
1059 $this->affichageFormulaire();
1060 }
1061 else {
1062 // Initialisation des variables pour les messages de fin de traitement
1063 $correct=true;
1064 // Initialisation de la chaîne contenant le message d'erreur
1065 $erreur = "";
1066 //
1067 $message_valid = '';
1068 $message_info = '';
1069
1070 // Initialisation des dates de début et de fin
1071 $datedebut ='';
1072 $datefin='';
1073
1074 // Traitement des erreurs
1075 if ($this->f->get_submitted_post_value("datedebut") == "") {
1076 $correct=false;
1077 } else {
1078 $datedebut = substr($this->f->get_submitted_post_value("datedebut"),6,4).
1079 "-".substr($this->f->get_submitted_post_value("datedebut"),3,2)."-".
1080 substr($this->f->get_submitted_post_value("datedebut"),0,2);
1081 }
1082 if ($this->f->get_submitted_post_value("datefin") == "") {
1083 $correct=false;
1084 } else {
1085 $datefin = substr($this->f->get_submitted_post_value("datefin"),6,4).
1086 "-".substr($this->f->get_submitted_post_value("datefin"),3,2)."-".
1087 substr($this->f->get_submitted_post_value("datefin"),0,2);
1088 }
1089 $numero = $this->f->get_submitted_post_value("numero");
1090
1091 if ($correct === true){
1092 // Vérifie la collectivité de l'utilisateur et si c'est un utilisateur
1093 // mono les résultats de l'exports concerneront uniquement sa collectivité
1094 $filtreCollectivite = '';
1095 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1096 $filtreCollectivite = sprintf(
1097 'AND dossier_autorisation.om_collectivite = %d',
1098 intval($_SESSION['collectivite'])
1099 );
1100 }
1101 // Requête permettant de lister tous les dossiers de l'export
1102 $sql = sprintf(
1103 "SELECT
1104 dossier.dossier,
1105 dossier.om_collectivite as collectivite,
1106 dossier.dossier_autorisation,
1107 dossier_instruction_type.mouvement_sitadel,
1108 dossier_instruction_type.code as dossier_instruction_type_code,
1109 dossier.date_depot,
1110 dossier.date_decision,
1111 dossier.date_chantier,
1112 dossier.date_achevement,
1113 dossier.terrain_references_cadastrales as dossier_terrain_references_cadastrales,
1114 dossier.geoloc_latitude as dossier_geoloc_latitude,
1115 dossier.geoloc_longitude as dossier_geoloc_longitude,
1116 dossier.geoloc_rayon as dossier_geoloc_rayon,
1117 dossier.terrain_adresse_voie_numero as dossier_terrain_adresse_voie_numero,
1118 dossier.terrain_adresse_voie as dossier_terrain_adresse_voie,
1119 dossier.terrain_adresse_lieu_dit as dossier_terrain_adresse_lieu_dit,
1120 dossier.terrain_adresse_localite as dossier_terrain_adresse_localite,
1121 dossier.terrain_adresse_code_postal as dossier_terrain_adresse_code_postal,
1122 dossier.terrain_adresse_bp as dossier_terrain_adresse_bp,
1123 dossier.terrain_adresse_cedex as dossier_terrain_adresse_cedex,
1124 dossier_autorisation_type.code,
1125 dossier.date_limite,
1126 dossier.date_limite_incompletude,
1127 dossier.date_notification_delai,
1128 dossier.terrain_superficie as dossier_terrain_superficie,
1129 dossier.terrain_superficie_calculee as dossier_terrain_superficie_calculee,
1130 dossier.date_modification,
1131 dossier.hash_sitadel,
1132
1133 arrondissement.code_impots as code_impots,
1134
1135 autorite_competente.autorite_competente_sitadel,
1136 pp.type_demandeur,
1137 pp.qualite,
1138 civilite_pp.libelle as civilite_pp,
1139 pp.particulier_nom as pp_particulier_nom,
1140 pp.particulier_prenom as pp_particulier_prenom,
1141 pp.personne_morale_denomination as pp_personne_morale_denomination,
1142 pp.personne_morale_raison_sociale as pp_personne_morale_raison_sociale,
1143 pp.personne_morale_siret as pp_personne_morale_siret,
1144 pp.personne_morale_categorie_juridique as pp_personne_morale_categorie_juridique,
1145 civilite_pm.libelle as civilite_pm_libelle,
1146 pp.personne_morale_nom as pp_personne_morale_nom,
1147 pp.personne_morale_prenom as pp_personne_morale_prenom,
1148
1149 pp.numero as pp_numero,
1150 pp.voie as pp_voie,
1151 pp.complement as pp_complement,
1152 pp.lieu_dit as pp_lieu_dit,
1153 pp.localite as pp_localite,
1154 pp.code_postal as pp_code_postal,
1155 pp.bp as pp_bp,
1156 pp.cedex as pp_cedex,
1157 pp.pays as pp_pays,
1158 pp.division_territoriale as pp_division_territoriale,
1159
1160 pp.telephone_fixe as pp_telephone_fixe,
1161 pp.courriel as pp_courriel,
1162
1163 donnees_techniques.co_archi_recours,
1164 donnees_techniques.am_terr_surf,
1165 donnees_techniques.am_lotiss,
1166 donnees_techniques.terr_juri_zac,
1167 donnees_techniques.terr_juri_afu,
1168 donnees_techniques.co_projet_desc,
1169 donnees_techniques.am_projet_desc,
1170 donnees_techniques.dm_projet_desc,
1171 donnees_techniques.co_cstr_nouv,
1172 donnees_techniques.co_cstr_exist,
1173 donnees_techniques.co_modif_aspect,
1174 donnees_techniques.co_modif_struct,
1175 donnees_techniques.co_cloture,
1176 donnees_techniques.co_trx_exten,
1177 donnees_techniques.co_trx_surelev,
1178 donnees_techniques.co_trx_nivsup,
1179 donnees_techniques.co_trx_amgt,
1180 donnees_techniques.co_anx_pisc,
1181 donnees_techniques.co_anx_gara,
1182 donnees_techniques.co_anx_veran,
1183 donnees_techniques.co_anx_abri,
1184 donnees_techniques.co_anx_autr,
1185 donnees_techniques.co_bat_niv_nb,
1186
1187 -- Tableau des destinations
1188 donnees_techniques.su_avt_shon1,
1189 donnees_techniques.su_avt_shon2,
1190 donnees_techniques.su_avt_shon3,
1191 donnees_techniques.su_avt_shon4,
1192 donnees_techniques.su_avt_shon5,
1193 donnees_techniques.su_avt_shon6,
1194 donnees_techniques.su_avt_shon7,
1195 donnees_techniques.su_avt_shon8,
1196 donnees_techniques.su_avt_shon9,
1197 donnees_techniques.su_demo_shon1,
1198 donnees_techniques.su_demo_shon2,
1199 donnees_techniques.su_demo_shon3,
1200 donnees_techniques.su_demo_shon4,
1201 donnees_techniques.su_demo_shon5,
1202 donnees_techniques.su_demo_shon6,
1203 donnees_techniques.su_demo_shon7,
1204 donnees_techniques.su_demo_shon8,
1205 donnees_techniques.su_demo_shon9,
1206 donnees_techniques.su_chge_shon1,
1207 donnees_techniques.su_chge_shon2,
1208 donnees_techniques.su_chge_shon3,
1209 donnees_techniques.su_chge_shon4,
1210 donnees_techniques.su_chge_shon5,
1211 donnees_techniques.su_chge_shon6,
1212 donnees_techniques.su_chge_shon7,
1213 donnees_techniques.su_chge_shon8,
1214 donnees_techniques.su_chge_shon9,
1215 donnees_techniques.su_sup_shon1,
1216 donnees_techniques.su_sup_shon2,
1217 donnees_techniques.su_sup_shon3,
1218 donnees_techniques.su_sup_shon4,
1219 donnees_techniques.su_sup_shon5,
1220 donnees_techniques.su_sup_shon6,
1221 donnees_techniques.su_sup_shon7,
1222 donnees_techniques.su_sup_shon8,
1223 donnees_techniques.su_sup_shon9,
1224 donnees_techniques.su_cstr_shon1,
1225 donnees_techniques.su_cstr_shon2,
1226 donnees_techniques.su_cstr_shon3,
1227 donnees_techniques.su_cstr_shon4,
1228 donnees_techniques.su_cstr_shon5,
1229 donnees_techniques.su_cstr_shon6,
1230 donnees_techniques.su_cstr_shon7,
1231 donnees_techniques.su_cstr_shon8,
1232 donnees_techniques.su_cstr_shon9,
1233 donnees_techniques.su_tot_shon1,
1234 donnees_techniques.su_tot_shon2,
1235 donnees_techniques.su_tot_shon3,
1236 donnees_techniques.su_tot_shon4,
1237 donnees_techniques.su_tot_shon5,
1238 donnees_techniques.su_tot_shon6,
1239 donnees_techniques.su_tot_shon7,
1240 donnees_techniques.su_tot_shon8,
1241 donnees_techniques.su_tot_shon9,
1242 -- XXX valeurs obsolètes mais utilisées dans les conditions
1243 -- pour afficher les messages d'incohérence
1244 donnees_techniques.su_trsf_shon1,
1245 donnees_techniques.su_trsf_shon2,
1246 donnees_techniques.su_trsf_shon3,
1247 donnees_techniques.su_trsf_shon4,
1248 donnees_techniques.su_trsf_shon5,
1249 donnees_techniques.su_trsf_shon6,
1250 donnees_techniques.su_trsf_shon7,
1251 donnees_techniques.su_trsf_shon8,
1252 donnees_techniques.su_trsf_shon9,
1253
1254 -- Tableau des sous-destinations
1255 donnees_techniques.su2_avt_shon1,
1256 donnees_techniques.su2_avt_shon2,
1257 donnees_techniques.su2_avt_shon3,
1258 donnees_techniques.su2_avt_shon4,
1259 donnees_techniques.su2_avt_shon5,
1260 donnees_techniques.su2_avt_shon6,
1261 donnees_techniques.su2_avt_shon7,
1262 donnees_techniques.su2_avt_shon8,
1263 donnees_techniques.su2_avt_shon9,
1264 donnees_techniques.su2_avt_shon10,
1265 donnees_techniques.su2_avt_shon11,
1266 donnees_techniques.su2_avt_shon12,
1267 donnees_techniques.su2_avt_shon13,
1268 donnees_techniques.su2_avt_shon14,
1269 donnees_techniques.su2_avt_shon15,
1270 donnees_techniques.su2_avt_shon16,
1271 donnees_techniques.su2_avt_shon17,
1272 donnees_techniques.su2_avt_shon18,
1273 donnees_techniques.su2_avt_shon19,
1274 donnees_techniques.su2_avt_shon20,
1275 donnees_techniques.su2_avt_shon21,
1276 donnees_techniques.su2_avt_shon22,
1277 donnees_techniques.su2_demo_shon1,
1278 donnees_techniques.su2_demo_shon2,
1279 donnees_techniques.su2_demo_shon3,
1280 donnees_techniques.su2_demo_shon4,
1281 donnees_techniques.su2_demo_shon5,
1282 donnees_techniques.su2_demo_shon6,
1283 donnees_techniques.su2_demo_shon7,
1284 donnees_techniques.su2_demo_shon8,
1285 donnees_techniques.su2_demo_shon9,
1286 donnees_techniques.su2_demo_shon10,
1287 donnees_techniques.su2_demo_shon11,
1288 donnees_techniques.su2_demo_shon12,
1289 donnees_techniques.su2_demo_shon13,
1290 donnees_techniques.su2_demo_shon14,
1291 donnees_techniques.su2_demo_shon15,
1292 donnees_techniques.su2_demo_shon16,
1293 donnees_techniques.su2_demo_shon17,
1294 donnees_techniques.su2_demo_shon18,
1295 donnees_techniques.su2_demo_shon19,
1296 donnees_techniques.su2_demo_shon20,
1297 donnees_techniques.su2_demo_shon21,
1298 donnees_techniques.su2_demo_shon22,
1299 donnees_techniques.su2_chge_shon1,
1300 donnees_techniques.su2_chge_shon2,
1301 donnees_techniques.su2_chge_shon3,
1302 donnees_techniques.su2_chge_shon4,
1303 donnees_techniques.su2_chge_shon5,
1304 donnees_techniques.su2_chge_shon6,
1305 donnees_techniques.su2_chge_shon7,
1306 donnees_techniques.su2_chge_shon8,
1307 donnees_techniques.su2_chge_shon9,
1308 donnees_techniques.su2_chge_shon10,
1309 donnees_techniques.su2_chge_shon11,
1310 donnees_techniques.su2_chge_shon12,
1311 donnees_techniques.su2_chge_shon13,
1312 donnees_techniques.su2_chge_shon14,
1313 donnees_techniques.su2_chge_shon15,
1314 donnees_techniques.su2_chge_shon16,
1315 donnees_techniques.su2_chge_shon17,
1316 donnees_techniques.su2_chge_shon18,
1317 donnees_techniques.su2_chge_shon19,
1318 donnees_techniques.su2_chge_shon20,
1319 donnees_techniques.su2_chge_shon21,
1320 donnees_techniques.su2_chge_shon22,
1321 donnees_techniques.su2_sup_shon1,
1322 donnees_techniques.su2_sup_shon2,
1323 donnees_techniques.su2_sup_shon3,
1324 donnees_techniques.su2_sup_shon4,
1325 donnees_techniques.su2_sup_shon5,
1326 donnees_techniques.su2_sup_shon6,
1327 donnees_techniques.su2_sup_shon7,
1328 donnees_techniques.su2_sup_shon8,
1329 donnees_techniques.su2_sup_shon9,
1330 donnees_techniques.su2_sup_shon10,
1331 donnees_techniques.su2_sup_shon11,
1332 donnees_techniques.su2_sup_shon12,
1333 donnees_techniques.su2_sup_shon13,
1334 donnees_techniques.su2_sup_shon14,
1335 donnees_techniques.su2_sup_shon15,
1336 donnees_techniques.su2_sup_shon16,
1337 donnees_techniques.su2_sup_shon17,
1338 donnees_techniques.su2_sup_shon18,
1339 donnees_techniques.su2_sup_shon19,
1340 donnees_techniques.su2_sup_shon20,
1341 donnees_techniques.su2_sup_shon21,
1342 donnees_techniques.su2_sup_shon22,
1343 donnees_techniques.su2_cstr_shon1,
1344 donnees_techniques.su2_cstr_shon2,
1345 donnees_techniques.su2_cstr_shon3,
1346 donnees_techniques.su2_cstr_shon4,
1347 donnees_techniques.su2_cstr_shon5,
1348 donnees_techniques.su2_cstr_shon6,
1349 donnees_techniques.su2_cstr_shon7,
1350 donnees_techniques.su2_cstr_shon8,
1351 donnees_techniques.su2_cstr_shon9,
1352 donnees_techniques.su2_cstr_shon10,
1353 donnees_techniques.su2_cstr_shon11,
1354 donnees_techniques.su2_cstr_shon12,
1355 donnees_techniques.su2_cstr_shon13,
1356 donnees_techniques.su2_cstr_shon14,
1357 donnees_techniques.su2_cstr_shon15,
1358 donnees_techniques.su2_cstr_shon16,
1359 donnees_techniques.su2_cstr_shon17,
1360 donnees_techniques.su2_cstr_shon18,
1361 donnees_techniques.su2_cstr_shon19,
1362 donnees_techniques.su2_cstr_shon20,
1363 donnees_techniques.su2_cstr_shon21,
1364 donnees_techniques.su2_cstr_shon22,
1365 donnees_techniques.su2_tot_shon1,
1366 donnees_techniques.su2_tot_shon2,
1367 donnees_techniques.su2_tot_shon3,
1368 donnees_techniques.su2_tot_shon4,
1369 donnees_techniques.su2_tot_shon5,
1370 donnees_techniques.su2_tot_shon6,
1371 donnees_techniques.su2_tot_shon7,
1372 donnees_techniques.su2_tot_shon8,
1373 donnees_techniques.su2_tot_shon9,
1374 donnees_techniques.su2_tot_shon10,
1375 donnees_techniques.su2_tot_shon11,
1376 donnees_techniques.su2_tot_shon12,
1377 donnees_techniques.su2_tot_shon13,
1378 donnees_techniques.su2_tot_shon14,
1379 donnees_techniques.su2_tot_shon15,
1380 donnees_techniques.su2_tot_shon16,
1381 donnees_techniques.su2_tot_shon17,
1382 donnees_techniques.su2_tot_shon18,
1383 donnees_techniques.su2_tot_shon19,
1384 donnees_techniques.su2_tot_shon20,
1385 donnees_techniques.su2_tot_shon21,
1386 donnees_techniques.su2_tot_shon22,
1387
1388 donnees_techniques.co_sp_transport,
1389 donnees_techniques.co_sp_enseign,
1390 donnees_techniques.co_sp_sante,
1391 donnees_techniques.co_sp_act_soc,
1392 donnees_techniques.co_sp_ouvr_spe,
1393 donnees_techniques.co_sp_culture,
1394 donnees_techniques.dm_tot_log_nb,
1395 donnees_techniques.co_tot_ind_nb,
1396 donnees_techniques.co_tot_coll_nb,
1397 donnees_techniques.co_tot_log_nb,
1398 donnees_techniques.co_resid_agees,
1399 donnees_techniques.co_resid_etud,
1400 donnees_techniques.co_resid_tourism,
1401 donnees_techniques.co_resid_hot_soc,
1402 donnees_techniques.co_resid_hand,
1403 donnees_techniques.co_resid_autr,
1404 donnees_techniques.co_resid_autr_desc,
1405 donnees_techniques.co_uti_pers,
1406 donnees_techniques.co_uti_princ,
1407 donnees_techniques.co_uti_secon,
1408 donnees_techniques.co_uti_vente,
1409 donnees_techniques.co_uti_loc,
1410 donnees_techniques.co_foyer_chamb_nb,
1411 donnees_techniques.co_fin_lls_nb,
1412 donnees_techniques.co_fin_aa_nb,
1413 donnees_techniques.co_fin_ptz_nb,
1414 donnees_techniques.co_fin_autr_nb,
1415 donnees_techniques.co_mais_piece_nb,
1416 donnees_techniques.co_log_1p_nb,
1417 donnees_techniques.co_log_2p_nb,
1418 donnees_techniques.co_log_3p_nb,
1419 donnees_techniques.co_log_4p_nb,
1420 donnees_techniques.co_log_5p_nb,
1421 donnees_techniques.co_log_6p_nb,
1422 donnees_techniques.mod_desc,
1423
1424 donnees_techniques.doc_date,
1425 donnees_techniques.terr_div_surf_av_div,
1426 donnees_techniques.doc_tot_trav,
1427 donnees_techniques.doc_tranche_trav,
1428 donnees_techniques.doc_tranche_trav_desc,
1429 donnees_techniques.doc_surf,
1430 donnees_techniques.doc_nb_log,
1431 donnees_techniques.doc_nb_log_indiv,
1432 donnees_techniques.doc_nb_log_coll,
1433 donnees_techniques.doc_nb_log_lls,
1434 donnees_techniques.doc_nb_log_aa,
1435 donnees_techniques.doc_nb_log_ptz,
1436 donnees_techniques.doc_nb_log_autre,
1437 donnees_techniques.daact_date,
1438 donnees_techniques.daact_date_chgmt_dest,
1439 donnees_techniques.daact_tot_trav,
1440 donnees_techniques.daact_tranche_trav,
1441 donnees_techniques.daact_tranche_trav_desc,
1442 donnees_techniques.daact_surf,
1443 donnees_techniques.daact_nb_log,
1444 donnees_techniques.daact_nb_log_indiv,
1445 donnees_techniques.daact_nb_log_coll,
1446 donnees_techniques.daact_nb_log_lls,
1447 donnees_techniques.daact_nb_log_aa,
1448 donnees_techniques.daact_nb_log_ptz,
1449 donnees_techniques.daact_nb_log_autre,
1450
1451 dossier_autorisation.date_depot as date_depot_da,
1452 dossier_autorisation.date_decision as date_decision_da,
1453 dossier_autorisation.date_validite as date_validite_da,
1454 dossier_autorisation.date_chantier as date_chantier_da,
1455 dossier_autorisation.date_achevement as date_achevement_da,
1456 avis_decision.typeavis as typeavis_da,
1457 avis_decision.sitadel,
1458 avis_decision.sitadel_motif,
1459 avis_decision.typeavis,
1460 etat.statut as statut_di
1461
1462 FROM
1463 %1\$sdossier
1464 INNER JOIN %1\$sdossier_instruction_type
1465 ON dossier.dossier_instruction_type =
1466 dossier_instruction_type.dossier_instruction_type
1467 INNER JOIN %1\$sdossier_autorisation_type_detaille
1468 ON dossier_instruction_type.dossier_autorisation_type_detaille
1469 =dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1470 INNER JOIN %1\$sdossier_autorisation_type
1471 ON dossier_autorisation_type.dossier_autorisation_type
1472 =dossier_autorisation_type_detaille.dossier_autorisation_type
1473 INNER JOIN %1\$sgroupe
1474 ON dossier_autorisation_type.groupe = groupe.groupe
1475 AND groupe.code != 'CTX'
1476 INNER JOIN %1\$sdossier_autorisation
1477 ON dossier_autorisation.dossier_autorisation
1478 =dossier.dossier_autorisation
1479 INNER JOIN %1\$sautorite_competente
1480 ON autorite_competente.autorite_competente
1481 =dossier.autorite_competente
1482
1483 LEFT JOIN %1\$sdonnees_techniques
1484 ON donnees_techniques.dossier_instruction = dossier.dossier
1485 LEFT JOIN %1\$savis_decision
1486 ON avis_decision.avis_decision = dossier.avis_decision
1487 LEFT JOIN %1\$slien_dossier_demandeur as ldd_pp
1488 ON ldd_pp.dossier = dossier.dossier
1489 LEFT JOIN %1\$sdemandeur as pp
1490 ON ldd_pp.demandeur = pp.demandeur
1491 LEFT JOIN %1\$scivilite as civilite_pp
1492 ON civilite_pp.civilite = pp.particulier_civilite
1493 LEFT JOIN %1\$scivilite as civilite_pm
1494 ON civilite_pm.civilite = pp.personne_morale_civilite
1495 LEFT JOIN %1\$setat
1496 ON etat.etat = dossier.etat
1497 LEFT JOIN %1\$sarrondissement
1498 ON dossier_autorisation.arrondissement=arrondissement.arrondissement
1499
1500 WHERE
1501 dossier_instruction_type.mouvement_sitadel IS NOT NULL
1502 AND ldd_pp.petitionnaire_principal is TRUE
1503 AND (dossier.date_modification >= '%2\$s'
1504 AND dossier.date_modification <= '%3\$s')
1505 %4\$s
1506 ORDER
1507 by dossier_instruction_type.mouvement_sitadel,
1508 dossier.dossier",
1509 DB_PREFIXE,
1510 $this->f->db->escapeSimple($datedebut),
1511 $this->f->db->escapeSimple($datefin),
1512 $filtreCollectivite
1513 );
1514 //Exécution de la requête
1515 $query = $this->f->get_all_results_from_db_query(
1516 $sql,
1517 array(
1518 'origin' => __METHOD__
1519 ));
1520 $export="";
1521 foreach ($query['result'] as $row) {
1522 // initialisation de la classe permettant la mise en forme de chaque ligne de l'export
1523 require_once "../obj/export_sitadel.class.php";
1524 $export_sitadel = new export_sitadel($row['dossier'], $this->f);
1525 $export_sitadel->setRow($row);
1526 //Ajout du fichier de variable
1527 if(file_exists ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php")) {
1528 include ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php");
1529 }
1530 //
1531 $export_sitadel->setVal($val);
1532 $departement = $export_sitadel->getDepartement($row["collectivite"]);
1533 $commune = $export_sitadel->getCommune($row["collectivite"]);
1534 $region = $this->f->getParameter("region");
1535
1536 // Initialisation des variables pour le tableau des
1537 // surfaces en version 1
1538 $prefix_su = 'su';
1539 $count_su = 9;
1540 // S'il faut utiliser le tableau des surfaces en
1541 // version 2
1542 if ($export_sitadel->get_tab_su_version() === 2) {
1543 //
1544 $prefix_su = 'su2';
1545 $count_su = 20;
1546 }
1547
1548 // Récupère la version du dossier d'instruction depuis son
1549 // numéro
1550 $version = 0;
1551 $version = intval($this->get_di_numero_suffixe($row['dossier']));
1552
1553 // Mouvement de dépôt
1554 $depot="";
1555
1556 // Tous les mouvements autres que transfert ont comme mouvement le code DEPOT
1557 // les décisions devant êtres précédées par le dépôt correspondant,
1558 // les dossiers avec date de décision comprise dans l'interval fourni sont
1559 // réaffichés en tant que dépôts (mouvement DEPOT)
1560 if (($row['mouvement_sitadel'] == 'DEPOT'||($row['mouvement_sitadel'] == 'MODIFICATIF'
1561 AND $row['statut_di']=='cloture' AND $row['typeavis']=='F'))) {
1562 $depot.=$export_sitadel->entete("DEPOT",$departement,$commune, $version);
1563 $depot.=$export_sitadel->etatcivil();
1564 $depot.=$export_sitadel->adresse();
1565 $depot.=$export_sitadel->delegataire();
1566 $depot.=$export_sitadel->meltel($row['mouvement_sitadel']);
1567 $depot.=$export_sitadel->adresse_terrain();
1568 $depot.=$export_sitadel->parcelle();
1569 // ===========================
1570 // contrat maison individuelle
1571 // ===========================
1572 // sitadel : contrat|
1573 // openads : non renseigne
1574 $depot.= $export_sitadel->defaultValue('contrat')."|";
1575 // ==========
1576 // architecte
1577 // ==========
1578 // sitadel : architecte|
1579 // openads : données techniques.co_archi_recours
1580 $depot.= ($row['co_archi_recours'] == "t")?"1|":"0|";
1581 // =====================
1582 // utilisation data cnil
1583 // ======================
1584 // sitadel : cnil
1585 // openads : non renseigne
1586 $depot.= $export_sitadel->defaultValue('cnil');
1587 // fin d enregistrement depot
1588 $depot.="\n";
1589 }
1590
1591 // Seuls les dossier de type transfert ont comme mouvement le code TRANSFERT
1592 $transfert ="";
1593 if ($row['mouvement_sitadel']=='TRANSFERT') {
1594 $transfert.=$export_sitadel->entete("TRANSFERT",$departement,$commune, $version);
1595 $transfert.=$export_sitadel->etatcivil();
1596 $transfert.=$export_sitadel->adresse();
1597 $transfert.=$export_sitadel->meltel($row['mouvement_sitadel']);
1598 $transfert.="\n";
1599 }
1600
1601
1602 // Une ligne de mouvement DECISION est insérée après chaque ligne
1603 // de mouvement DEPOT
1604 $decision="";
1605 if ($row['mouvement_sitadel'] != 'TRANSFERT'
1606 and $row['mouvement_sitadel'] != 'SUPPRESSION'
1607 and $row['mouvement_sitadel'] == 'DEPOT') {
1608
1609 //Ajout de l'entête
1610 $decision.=$export_sitadel->entete("DECISION",$departement,$commune, $version);
1611
1612 //Ajout du groupe 1
1613 $decision.= $export_sitadel->decision_groupe1();
1614 // Si la décision est favorable, on remplit le groupe 2
1615 if ( $row['sitadel'] == 2 || $row['sitadel'] == 4 || $row['sitadel'] == 5
1616 || $row['sitadel'] === '' || $row['sitadel'] === 0){
1617 //
1618 $decision.= $export_sitadel->amenagement_terrain();
1619 //Nature du projet
1620 $natproj = 2;
1621 $natprojlib= array(
1622 1=>_("Nouvelle construction"),
1623 2=>_("Travaux sur construction existante"),
1624 3=>_("Nouvelle construction et travaux sur construction"),
1625 );
1626 if ( isset($row['co_cstr_nouv']) && isset($row['co_cstr_exist']) &&
1627 $row['co_cstr_nouv'] == 't' &&
1628 $row['co_cstr_exist'] == 't' ){
1629 $natproj = 3;
1630 }
1631 //Nouvelle construction
1632 elseif ( isset($row['co_cstr_nouv']) && $row['co_cstr_nouv'] == 't' ) {
1633 $natproj = 1;
1634 }
1635 //
1636 $su_avt_shon = $export_sitadel->shon("avt");
1637 //Si la SHON existante avant travaux est supérieur à la SHON
1638 //démolie alors la variable natproj est égale à 2
1639 $shonExistante = 0;
1640 $shonDemolie = 0;
1641 // Pour chaque ligne du tableau
1642 for ($i = 1; $i <= $count_su; $i++) {
1643 //
1644 $shonExistante += floor(floatval($row[$prefix_su.'_avt_shon'.$i]));
1645 $shonDemolie += floor(floatval($row[$prefix_su.'_demo_shon'.$i]));
1646 }
1647 //Si la SHON existante avant travaux et la SHON démolie sont
1648 //égales alors la variable natproj est égale à 1
1649 if ( $shonExistante == 0 && $shonDemolie == 0 && $natproj != 1 &&
1650 $row['code'] != 'DP' && $row['code'] != 'PA') {
1651 $erreur .= _("Dossier ").$row['dossier']." \"".$natprojlib[$natproj]."\" "._("La SHON existante avant travaux et la SHON demolie sont nulles alors cela devrait être une nouvelle construction.")."\n";
1652 } elseif ( $shonExistante > $shonDemolie && $natproj != 2 ){
1653 $erreur .= _("Dossier ").$row['dossier']." \"".$natprojlib[$natproj]."\" "._("La SHON existante avant travaux ne doit pas être supérieure à la SHON démolie.")."\n";
1654 }
1655 $decision .= $su_avt_shon;
1656
1657 $su_demo_shon = $export_sitadel->shon("demo");
1658 //La SHON démolie s'accompagne obligatoirement de la shon
1659 //existante avant travaux
1660 if ( $shonDemolie != 0 && $shonExistante == 0 ){
1661 $erreur .= _("Dossier ").$row['dossier']." "._("La SHON demolie s'accompagne obligatoirement de la SHON existante avant travaux.")."\n";
1662 }
1663 $decision .= $su_demo_shon;
1664 //
1665 $su_sup_shon = $export_sitadel->shon("sup");
1666 $su_chge_shon = $export_sitadel->shon("chge");
1667 if ( strcasecmp($su_sup_shon, $su_chge_shon) != 0){
1668 //
1669 $erreur .= _("Dossier ").$row['dossier']." "._("Les SHON globales supprimées par changement de destination ou de sous-destination et créées par le même changement doivent être égales.")."\n";
1670 }
1671 $decision .= $su_sup_shon;
1672 $decision .= $su_chge_shon;
1673 $decision .= $export_sitadel->shon("cstr");
1674 $decision .= "0|0|0|0|0|0|0|0|0|";
1675 // Les SHON créées par changement de destination ou
1676 // de sous-destination s'accompagnent obligatoirement
1677 // de SHON existante avant travaux non nulle
1678 if (preg_match("/[0|]{7}/", $su_chge_shon) &&
1679 preg_match("/[0|]{7}/", $su_avt_shon)){
1680
1681 $erreur .= _("Dossier ").$row['dossier']." "._("Les SHON créées par changement de destination ou de sous-destination s'accompagnent obligatoirement de SHON existante avant travaux non nulle.")."\n";
1682 }
1683 // Un nombre de logements démolis strictement positif doit
1684 // s'accompagner obligatoirement de SHON démolie.
1685 if($row['dm_tot_log_nb'] > 0) {
1686 if($export_sitadel->get_shon_val('demo', 1) <= 0) {
1687 //
1688 $erreur .= _("Dossier ").$row['dossier']." "._("Un nombre de logements demolis strictement positif doit s'accompagner obligatoirement de SHON demolie.")."\n";
1689 }
1690 }
1691 // Un nombre de logements créés strictement positif doit
1692 // s'accompagner obligatoirement de SHON créée ou de SHON
1693 // créée par changement de destination ou de sous-destination
1694 // ayant pour destination l'habitation.
1695 if($row['co_tot_log_nb'] > 0 AND ($export_sitadel->get_shon_val('cstr', 1) <= 0 OR $export_sitadel->get_shon_val('chge', 1) <=0)) {
1696 //
1697 $erreur .= _("Dossier ").$row['dossier']." "._("Un nombre de logements créés strictement positif doit s'accompagner obligatoirement de SHON créée ou de SHON créée par changement de destination ou de sous-destination ayant pour destination l'habitation.")."\n";
1698 }
1699
1700 // La SHON créée ou issue de la transformation
1701 // suffixée par 9 (intérêt collectif ou service public) doit
1702 // obligatoirement s'accompagner de la décomposition
1703 // en sous modalité renseignée par la variable cpublic et réciproquement.
1704
1705 // Test si une valeur est true
1706 $cpublic = FALSE;
1707 if (isset($row['co_sp_transport']) && $row['co_sp_transport'] == 't') {
1708 $cpublic = TRUE;
1709 }
1710 if (isset($row['co_sp_enseign']) && $row['co_sp_enseign'] == 't') {
1711 $cpublic = TRUE;
1712 }
1713 if (isset($row['co_sp_sante']) && $row['co_sp_sante'] == 't') {
1714 $cpublic = TRUE;
1715 }
1716 if (isset($row['co_sp_act_soc']) && $row['co_sp_act_soc'] == 't') {
1717 $cpublic = TRUE;
1718 }
1719 if (isset($row['co_sp_ouvr_spe']) && $row['co_sp_ouvr_spe'] == 't') {
1720 $cpublic = TRUE;
1721 }
1722 if (isset($row['co_sp_culture']) && $row['co_sp_culture'] == 't') {
1723 $cpublic = TRUE;
1724 }
1725 //
1726 if($cpublic !== TRUE AND ($export_sitadel->get_shon_val('cstr', 9) > 0 OR $export_sitadel->get_shon_val('chge', 9) > 0)) {
1727 $erreur .= _("Dossier ").$row['dossier']." "._("La SHON créée ou créée par changement de destination ou de sous-destination concernant le service public ou l'interet collectif doit obligatoirement s'accompagner du choix de destination des constructions.")."\n";
1728 }
1729
1730 // La destination principale du logement mise à résidence
1731 // principale ou résidence secondaire doit obligatoirement
1732 // s'accompagner d'un mode d'utilisation à occupation personnelle
1733 if($row['co_uti_princ'] == 't' OR $row['co_uti_secon'] == 't') {
1734 if($row['co_uti_pers'] != 't') {
1735
1736 $erreur .= _("Dossier ").$row['dossier']." "._("La destination principale du logement mise a residence principale ou residence secondaire doit obligatoirement s'accompagner d'un mode d'utilisation a occupation personnelle.")."\n";
1737 }
1738 }
1739
1740 $decision.= $export_sitadel->destination($row['mouvement_sitadel']);
1741
1742 // Le nombre total de logements créés (variable nbtotlog)
1743 // doit être égal à la somme des nombres de logements créés
1744 // ventilés par type de financement
1745 if(intval($row['co_tot_log_nb']) != (intval($row['co_fin_lls_nb']) + intval($row['co_fin_aa_nb']) +
1746 intval($row['co_fin_ptz_nb']) + intval($row['co_fin_autr_nb']))) {
1747
1748 $erreur .= _("Dossier ").$row['dossier']." "._("Le nombre total de logements crees doit etre egal a la somme des nombres de logements crees ventiles par type de financement.")."\n";
1749 }
1750
1751 $decision.= $export_sitadel->repartitionFinan();
1752
1753 // Le nombre total de logements créés (variable nbtotlog)
1754 // doit être égal à la totalisation de la répartition des
1755 // logements par nombre de pièces
1756 if(intval($row['co_tot_log_nb']) != (intval($row['co_log_1p_nb']) + intval($row['co_log_2p_nb']) +
1757 intval($row['co_log_3p_nb']) + intval($row['co_log_4p_nb']) + intval($row['co_log_5p_nb']) +
1758 intval($row['co_log_6p_nb']))) {
1759
1760 $erreur .= _("Dossier ").$row['dossier']." "._("Le nombre total de logements crees doit etre egal a la totalisation de la repartition des logements par nombre de pieces.")."\n";
1761 }
1762
1763 $decision.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1764 }
1765 else {
1766 //
1767 $decision.= str_repeat("|", 6);
1768 if($row['code']=='DP'){
1769 $decision .= "00000|";
1770 }else{
1771 $decision .= "|";
1772 }
1773 $decision .= "0000|00000|";
1774 $decision.= str_repeat("|", 74);
1775 }
1776 $decision.="\n";
1777 }
1778
1779 // modificatif
1780 $modificatif='';
1781 if($row['mouvement_sitadel'] == 'MODIFICATIF' AND $row['statut_di']=='cloture' AND
1782 $row['typeavis']=='F') {
1783 $modificatif.=$export_sitadel->entete("MODIFICATIF",$departement,$commune, $version);
1784
1785 $modificatif.= $export_sitadel->decision_groupe1();
1786
1787 if(isset($row['date_decision']) or $row['date_decision']==""){
1788 // avis_sitadel et avis_sitadel_motif
1789 // si la decision est favorable, envoi des informations statistiques
1790 if($row["sitadel"] == 2 or $row["sitadel"] == 4
1791 or $row["sitadel"] == 5){
1792 // si accordé : ajout du 2nd groupe d'informations
1793 $modificatif .= $export_sitadel->adresse_terrain(); // adresse du terrain
1794 $modificatif .= $export_sitadel->parcelle(); // 3 premières parcelles
1795 $modificatif .= $export_sitadel->modificatif_terrain(); // Informations complémentaires
1796
1797 $modificatif.= $export_sitadel->shon("avt");
1798 $modificatif.= $export_sitadel->shon("demo");
1799 $modificatif.= $export_sitadel->shon("chge");
1800 $modificatif.= $export_sitadel->shon("trsf");
1801 $modificatif.= $export_sitadel->shon("cstr");
1802
1803 $modificatif.= "|||||||||";
1804 $modificatif.= $export_sitadel->destination($row['mouvement_sitadel']);
1805 $modificatif.= $export_sitadel->repartitionFinan();
1806 $modificatif.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1807 }
1808 else {
1809 $modificatif .= str_repeat("|", 90);
1810 }
1811 }
1812 else {
1813 $modificatif .= str_repeat("|", 90);
1814 }
1815
1816 $modificatif.="\n";
1817 }
1818
1819 // Mouvement suppression
1820 $suppression = '';
1821 if($row['mouvement_sitadel'] == 'SUPPRESSION') {
1822 $suppression .= $export_sitadel->entete("SUPPRESSION",$departement,$commune, $version);
1823 $suppression .= "\n";
1824 }
1825
1826 // Règles sur le mouvement suivi
1827 $suivi="";
1828 if($row['mouvement_sitadel'] == 'SUIVI' and
1829 ($row['date_chantier'] >= $datedebut and $row['date_chantier']<=$datefin) ||
1830 ($row['date_achevement'] >= $datedebut and $row['date_achevement']<=$datefin)){
1831 // Si le dossier est une DOC
1832 if($row['dossier_instruction_type_code']=='DOC'){
1833 // Une ouverture de chantier ne peut concerner qu'un permis autorisé
1834 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1835 $erreur .= _("Dossier ").$row['dossier']." "._("Une ouverture de chantier ne peut concerner qu'un permis autorise.")."\n";
1836 }
1837 // La date d'ouverture de chantier doit être supérieur à la date d'autorisation
1838 if($row['doc_date'] > $row['date_decision_da']) {
1839 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'ouverture de chantier doit être superieur a la date d'autorisation.")."\n";
1840 }
1841 // Un achèvement de chantier ne peut concerner qu'un permis autorisé
1842 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1843 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis autorise.")."\n";
1844 }
1845 if( $row['date_chantier_da'] == "" && $row['date_achevement']!="") {
1846 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis sur lequel un chantier a ete ouvert.")."\n";
1847 }
1848 // La date d'achevement de travaux doit être supérieur à la date d'ouverture des travaux
1849 if($row['daact_date'] > $row['date_chantier_da']) {
1850 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'achevement de travaux doit etre superieur a la date d'ouverture des travaux.")."\n";
1851 }
1852 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1853 $suivi.=$export_sitadel->chantier($row);
1854 //On récupère la DAACT si elle existe
1855 $sqlDAACT = "SELECT
1856 donnees_techniques.daact_date,
1857 donnees_techniques.daact_date_chgmt_dest,
1858 donnees_techniques.daact_tot_trav,
1859 donnees_techniques.daact_tranche_trav,
1860 donnees_techniques.daact_tranche_trav_desc,
1861 donnees_techniques.daact_surf,
1862 donnees_techniques.daact_nb_log,
1863 donnees_techniques.daact_nb_log_indiv,
1864 donnees_techniques.daact_nb_log_coll,
1865 donnees_techniques.daact_nb_log_lls,
1866 donnees_techniques.daact_nb_log_aa,
1867 donnees_techniques.daact_nb_log_ptz,
1868 donnees_techniques.daact_nb_log_autre,
1869 etat.statut as statut_di
1870
1871 FROM ".DB_PREFIXE."dossier
1872 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1873 ON dossier.dossier=donnees_techniques.dossier_instruction
1874 LEFT JOIN ".DB_PREFIXE."etat
1875 ON dossier.etat = etat.etat
1876 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1877 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
1878 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1879 dossier_instruction_type.code = 'DAACT' and mouvement_sitadel='SUIVI'";
1880 $resDAACT = $this->f->db -> query ($sqlDAACT);
1881 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDAACT."\")", VERBOSE_MODE);
1882 $this->f->isDatabaseError($resDAACT);
1883 $rowDAACT=& $resDAACT->fetchRow(DB_FETCHMODE_ASSOC);
1884 $suivi.=$export_sitadel->achevement($rowDAACT);
1885 $suivi.="\n";
1886 }
1887 elseif($row['dossier_instruction_type_code']=='DAACT'){
1888
1889 //On vérifie qu'une DOC existe
1890 $sqlDOC = "SELECT dossier.dossier,
1891 dossier.date_chantier,
1892 donnees_techniques.doc_date,
1893 donnees_techniques.terr_div_surf_av_div,
1894 donnees_techniques.doc_tot_trav,
1895 donnees_techniques.doc_tranche_trav,
1896 donnees_techniques.doc_tranche_trav_desc,
1897 donnees_techniques.doc_surf,
1898 donnees_techniques.doc_nb_log,
1899 donnees_techniques.doc_nb_log_indiv,
1900 donnees_techniques.doc_nb_log_coll,
1901 donnees_techniques.doc_nb_log_lls,
1902 donnees_techniques.doc_nb_log_aa,
1903 donnees_techniques.doc_nb_log_ptz,
1904 donnees_techniques.doc_nb_log_autre
1905 FROM ".DB_PREFIXE."dossier
1906 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1907 ON dossier.dossier=donnees_techniques.dossier_instruction
1908 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1909 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
1910 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1911 dossier_instruction_type.code = 'DOC' and mouvement_sitadel='SUIVI'";
1912 $resDOC = $this->f->db -> query ($sqlDOC);
1913 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDOC."\")", VERBOSE_MODE);
1914 $this->f->isDatabaseError($resDOC);
1915 $rowDOC=& $resDOC->fetchRow(DB_FETCHMODE_ASSOC);
1916 // Vérifie si il y a une DOC en cours de validité associé au dossier. Cad si :
1917 // - la requête retourne un dossier avec une DOC mais le chantier n'a pas débuter ou est fini
1918 // - la requête ne retourne pas de dossier, il n'y a donc pas de DOC associée au dossier
1919 if ((isset($rowDOC['dossier'])
1920 && ($rowDOC['date_chantier'] < $datedebut
1921 || $rowDOC['date_chantier'] > $datefin))
1922 || ! isset($rowDOC['dossier'])) {
1923 //
1924 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1925 $suivi.=$export_sitadel->chantier($rowDOC);
1926 $suivi.=$export_sitadel->achevement($row);
1927 $suivi.="\n";
1928 }
1929 }
1930 }
1931 // Ligne SITADEL généré
1932 $line_sitadel = $depot.$decision.$transfert.$modificatif.$suivi.$suppression;
1933 if ($line_sitadel !== '') {
1934 // Hash la ligne SITADEL
1935 $hash_sitadel = md5($line_sitadel);
1936 // Si le hash de la ligne générée est différent du hash
1937 // sauvegardé sur le dossier
1938 if ($row['hash_sitadel'] !== $hash_sitadel) {
1939 // Met la ligne dans l'export
1940 $export .= $line_sitadel;
1941 // Met à jour le hash SITADEL du dossier
1942 $inst_di = $this->get_inst_dossier($row['dossier']);
1943 $inst_di->update_hash_sitadel($hash_sitadel);
1944 } else {
1945 // Supprime les erreurs liées à la ligne qui ne sera
1946 // pas exportée
1947 $erreur = '';
1948 }
1949 }
1950 } // fin while
1951
1952 /**
1953 *
1954 */
1955 //
1956 if (DBCHARSET == 'UTF8') {
1957 $export = utf8_decode($export);
1958 }
1959
1960 /**
1961 * En-tête de fichier.
1962 *
1963 * C'est la première ligne du fichier.
1964 */
1965 // on éclate la chaîne export par ligne pour calculer le nombre
1966 // d'enregistrements et la longueur maximale des enregistrements
1967 $export_by_line = explode("\n", $export);
1968 // longueur maximale des enregistrements
1969 // (Num)(6) longueur de l’enregistrement le plus long contenu dans le
1970 // fichier (sans compter la fin d’enregistrement ou la fin de fichier)
1971 $longueur_maximale_des_enregistrements = 0;
1972 foreach ($export_by_line as $export_line) {
1973 if ($longueur_maximale_des_enregistrements > strlen($export_line)) {
1974 continue;
1975 }
1976 $longueur_maximale_des_enregistrements = strlen($export_line);
1977 }
1978 // nombre d'enregistrements
1979 // (Num)(6) nombre d’enregistrements présents dans le fichier en
1980 // comptant l’en-tête du fichier
1981 // XXX Ne faut-il pas ajouter +1 pour la ligne d'en-tête ?
1982 $nombre_d_enregistrements = count($export_by_line);
1983 // code application
1984 // (Alphanum)(7) = SITADEL
1985 $code_application = "SITADEL";
1986 // code département
1987 // (Alphanum)(3) département dans lequel se trouve le service instructeur
1988 // nomenclature : 001 à 095, 02A, 02B, 971...974
1989 $code_departement = $this->f->getParameter("departement");
1990 // service expéditeur
1991 // (Alphanum)(3) DDE ou commune (la plus grosse en cas d'EPCI) ou DGI
1992 // nomenclature : 'ADS', ‘DGI ou code commune INSEE
1993 $service_expediteur = $this->f->getParameter("commune");
1994 // service destinataire
1995 // (Alphanum)(2) DRE
1996 // nomenclature : code région INSEE (exemple : Ile-de-France=11)
1997 $service_destinataire = $this->f->getParameter("region");
1998 // code du fichier transmis
1999 // (AlphaNum)(12) AAMMjjdddccc
2000 // ddd = département du service instructeur
2001 // ccc = code du service expéditeur
2002 // AAMMjj = date
2003 // par exemple : 090531093ADS dans le cas de la transmission mensuelle
2004 // des événements intervenus au mois de mai communiqués par la DDE de
2005 // Seine-Saint-Denis.
2006 // XXX La date du jour correspond bien à la date demandée ?
2007 $code_du_fichier_transmis = sprintf(
2008 "%s%s%s",
2009 date('ymd'),
2010 $code_departement,
2011 $service_expediteur
2012 );
2013 // numéro d'ordre
2014 // (AlphaNum)(1) numéro d’ordre du fichier en cas de rectificatif
2015 // XXX Le formulaire propose jusqu'à la valeur 10 alors que la taille
2016 // de la châine doit être (1) ?
2017 $numero_d_ordre = $this->f->get_submitted_post_value("numero");
2018 // date de création
2019 // (Alphanum)(6) AAMMjj date de création du fichier transmis
2020 $date_de_creation = date('ymd');
2021 // nom de l'applicatif expéditeur
2022 // (Alphanum)(20) Exemple : GESTIO
2023 $nom_de_l_applicatif_expediteur = "openADS";
2024 // version de l'applicatif expéditeur
2025 // (Alphanum)(8) Exemple : 2.05
2026 $version_de_l_applicatif_expediteur = substr($this->f->get_application_version(), 0, 8);
2027 // Consititution de la ligne d'en-tête.
2028 $entete = sprintf(
2029 "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\n",
2030 $code_application,
2031 $code_departement,
2032 $service_expediteur,
2033 $service_destinataire,
2034 $code_du_fichier_transmis,
2035 $numero_d_ordre,
2036 $longueur_maximale_des_enregistrements,
2037 $date_de_creation,
2038 $nombre_d_enregistrements,
2039 $nom_de_l_applicatif_expediteur,
2040 $version_de_l_applicatif_expediteur
2041 );
2042
2043 /**
2044 *
2045 */
2046 //
2047 $export = $entete.$export;
2048
2049 /**
2050 * Écriture de l'export dans un fichier sur le disque et affichage du
2051 * lien de téléchargement.
2052 */
2053 // Composition du nom du fichier
2054 $nom_fichier = "SITADEL".substr($this->f->get_submitted_post_value("datedebut"),3,2)."".substr($this->f->get_submitted_post_value("datedebut"),8,4).".txt";
2055 // Composition des métadonnées du fichier
2056 $metadata_fichier = array(
2057 "filename" => $nom_fichier,
2058 "size" => strlen($export),
2059 "mimetype" => "text/csv",
2060 );
2061 // Écriture du fichier
2062 $id_fichier = $this->f->store_file(
2063 $export,
2064 $metadata_fichier,
2065 "sitadel",
2066 json_encode(array(
2067 'date_debut' => $datedebut,
2068 'date_fin' => $datefin,
2069 ))
2070 );
2071 if ($id_fichier === false) {
2072 $msg_error = __("Erreur lors du stockage/enregistrement du fichier SITADEL.").' '.__("Veuillez contacter votre administrateur.");
2073 $this->f->displayMessage("error", $msg_error);
2074 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
2075 return;
2076 }
2077 //
2078 $message_valid = sprintf(
2079 "%s<br/>%s",
2080 sprintf(__("Le fichier %s a été généré."), $nom_fichier),
2081 sprintf(
2082 '<a href="%1$s&snippet=file&obj=storage&champ=uid&id=%2$s" id="%2$s" target="_blank"><span class="om-icon om-icon-16 om-icon-fix reqmo-16" title="%3$s"></span> %3$s</a>',
2083 OM_ROUTE_FORM,
2084 $id_fichier,
2085 __("Télécharger le fichier SITADEL")
2086 )
2087 );
2088
2089 /**
2090 * Écriture d'une éventuelle erreur durant l'export dans un fichier sur
2091 * le disque et affichage du lien de téléchargement.
2092 */
2093 //
2094 if ($erreur != "") {
2095 // Composition du nom du fichier
2096 $nom_fichier_erreur = "probleme_".$nom_fichier;
2097 // Composition des métadonnées du fichier
2098 $metadata_fichier_erreur = array(
2099 "filename" => $nom_fichier_erreur,
2100 "size" => strlen($erreur),
2101 "mimetype" => "application/octet-stream",
2102 );
2103 // Écriture du fichier
2104 $id_fichier_erreur = $this->f->store_file(
2105 $erreur,
2106 $metadata_fichier_erreur,
2107 "sitadel",
2108 json_encode(array(
2109 'date_debut' => $datedebut,
2110 'date_fin' => $datefin,
2111 ))
2112 );
2113 if ($id_fichier_erreur === false) {
2114 $msg_error = __("Erreur lors du stockage/enregistrement du fichier des incohérences SITADEL.").' '.__("Veuillez contacter votre administrateur.");
2115 $this->f->displayMessage("error", $msg_error);
2116 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
2117 return;
2118 }
2119 //
2120 $message_info .= sprintf(
2121 "%s<br/>%s",
2122 sprintf(__("Un ou plusieurs problèmes de cohérence ont été détectés durant l'export, celles-ci sont listées dans le fichiers %s."), $nom_fichier_erreur),
2123 sprintf(
2124 '<a href="%1$s&snippet=file&obj=storage&champ=uid&id=%2$s" id="%2$s" target="_blank"><span class="om-icon om-icon-16 om-icon-fix reqmo-16" title="%3$s"></span> %3$s</a>',
2125 OM_ROUTE_FORM,
2126 $id_fichier_erreur,
2127 __("Télécharger le fichier d'incohérence SITADEL")
2128 )
2129 );
2130 }
2131
2132 //
2133 $this->f->displayMessage("valid",
2134 sprintf(
2135 '%s%s%s',
2136 $message_valid,
2137 $message_info !== '' ? '<br/><br/>' : '',
2138 $message_info
2139 )
2140 );
2141
2142 //
2143 if (DEBUG > 0) {
2144 printf($export);
2145 }
2146
2147 } else {// correct = false
2148 $this->f->displayMessage("error", __("Les champs dates sont obligatoires."));
2149 }
2150 }
2151 }
2152
2153
2154 function affichageFormulaire() {
2155 printf("<form method=\"POST\" name=f1>");
2156 //
2157 printf(
2158 "<div id=\"sitadel-form-fonctionnement\" class=\"sitadel-form-bloc\"><h3>%s</h3><p>%s</p></div>",
2159 __("Fonctionnement"),
2160 __("Les dossiers déjà exportés pour SITADEL n'apparaîtront plus dans les prochains exports. Ils seront à nouveau affichés lorsqu’au moins une des données utilisées par SITADEL sera différente du dernier export.")
2161 );
2162 //
2163 printf(
2164 "<div id=\"sitadel-form-export\" class=\"sitadel-form-bloc\"><h3>%s</h3>",
2165 __("Export")
2166 );
2167 //Description de la page
2168 $description = __("Saisissez la période pour laquelle vous souhaitez exporter les mouvements des dossiers au format SITADEL.");
2169 $this->f->displayDescription($description);
2170 //
2171 $input = "<input type=\"text\" name=\"%s\" id=\"%s\" value=\"%s\" size=\"15\" class=\"champFormulaire datepicker\" onchange=\"fdate(this)\" />";
2172 // champ date debut
2173 printf(" "._("Date de début")." ");
2174 printf($input, "datedebut", "datedebut", '');
2175 // champ date fin
2176 printf(" "._("Date de fin")." ");
2177 printf($input, "datefin", "datefin", '');
2178 // numero d'ordre d'envoi
2179 printf(" "._("Numero d'ordre d'envoi")." : "."<select name=\"numero\">");
2180 for ($i = 1; $i < 11; $i++) {
2181 printf("<option value =\"%d\" ", $i);
2182 printf(">%d</option>", $i);
2183 }
2184 printf("</select>");
2185 printf(
2186 "<br/><input id=\"sitadel-form-export-submit\" class=\"sitadel-form-bloc-button\" type=\"button\" value=\"%s\" onClick=\"sitadel_form_confirmation_action('form', this, '%s')\" data-href=\"%s&obj=sitadel&action=6&idx=0\" />",
2187 __("Exporter le fichier SITADEL"),
2188 addslashes(sprintf(
2189 "<b>%s</b><br/><br/>%s",
2190 __("Important à lire avant de confirmer le message de validation."),
2191 __("Les mouvements concernés par la période vont être marqués comme <i>exportés</i>. Ils ne figureront pas dans un nouvel export sur la même période.")
2192 )),
2193 OM_ROUTE_FORM
2194 );
2195 printf("</div>");
2196
2197 // Affiche le tableau des fichiers sitadel stocké
2198 $link_tab_storage = OM_ROUTE_SOUSTAB.'&obj=storage&idxformulaire=0&retour=tab&retourformulaire=sitadel';
2199 $tab_storage = sprintf(
2200 '<div id="sousform-storage-sitadel" class="sitadel-form-bloc-tab"></div>
2201 <script type="text/javascript" >
2202 ajaxIt(\'storage-sitadel\', \'%1$s\');
2203 </script>',
2204 $link_tab_storage
2205 );
2206 printf(
2207 "<div id=\"sitadel-form-histo\" class=\"sitadel-form-bloc-end\"><h3>%s</h3>%s</div>",
2208 __("Historique des exports"),
2209 $tab_storage
2210 );
2211
2212 printf("</form>");
2213 }
2214
2215 /**
2216 * VIEW - view_document_numerise.
2217 *
2218 * Vue du tableau des pièces du dossier d'autorisation.
2219 *
2220 * Cette vue permet de gérer le contenu de l'onglet "Pièce(s)" sur un
2221 * dossier d'autorisation. Cette vue spécifique est nécessaire car
2222 * l'ergonomie standard du framework ne prend pas en charge ce cas.
2223 * C'est ici la vue spécifique des pièces liées au dossier qui est
2224 * affichée directement au clic de l'onglet au lieu du soustab.
2225 *
2226 * L'idée est donc de simuler l'ergonomie standard en créant un container
2227 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
2228 * de la vue visualisation de l'objet lié.
2229 *
2230 * @return void
2231 */
2232 function view_document_numerise() {
2233 // Vérification de l'accessibilité sur l'élément
2234 $this->checkAccessibility();
2235 // Récupération des variables GET
2236 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
2237 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
2238 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
2239 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
2240 // Objet à charger
2241 $obj = "document_numerise";
2242 $type_aff_form = $this->get_type_affichage_formulaire();
2243 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
2244 $obj = "document_numerise_contexte_ctx";
2245 }
2246 // Construction de l'url de sousformulaire à appeler
2247 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
2248 $url .= "&idx=".$idxformulaire;
2249 $url .= "&action=4";
2250 $url .= "&retourformulaire=".$retourformulaire;
2251 $url .= "&idxformulaire=".$idxformulaire;
2252 $url .= "&retour=form";
2253 // Affichage du container permettant le reffraichissement du contenu
2254 // dans le cas des action-direct.
2255 printf('
2256 <div id="sousform-href" data-href="%s">
2257 </div>',
2258 $url
2259 );
2260 // Affichage du container permettant de charger le retour de la requête
2261 // ajax récupérant le sous formulaire.
2262 printf('
2263 <div id="sousform-%s">
2264 </div>
2265 <script>
2266 ajaxIt(\'%s\', \'%s\');
2267 </script>',
2268 $obj,
2269 $obj,
2270 $url
2271 );
2272 }
2273
2274
2275 /**
2276 * Traitement du numéro de version d'un dossier.
2277 * Renvoie le numéro de version.
2278 *
2279 * Récupère le numéro de version du dossier d'instruction (DI) à l'aide du
2280 * numéro de dossier d'autorisation (DA).
2281 * Si un numéro de version a été récupéré incremente également le numéro
2282 * de version du DA dans la base de données.
2283 *
2284 * @param array tableau contenant les valeurs du formulaire
2285 * @return integer|null numero de version du dossier si il a pu être récupéré
2286 */
2287 protected function traitementNumeroVersion($val = array()) {
2288 // Récupération du numéro de version du dossier d'instruction
2289 $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
2290 // Mise à jour du numéro de version du DA
2291 // La numérotation du DI est unique et basée sur celle du DA qui débute à -1.
2292 // Ainsi la version du DI initial est à 0.
2293 if (is_numeric($numeroVersion) or $numeroVersion == -1){
2294 $this->incrementNumeroVersion($val['dossier_autorisation'], ++$numeroVersion);
2295 }
2296 return $numeroVersion;
2297 }
2298
2299 /**
2300 * Traitement de la numérotation du dossier lors de la saisie manuelle du
2301 * numéro de dossier.
2302 * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2303 * dossier.
2304 *
2305 * Récupère le numéro de dossier issus du formulaire. Construis le libellé et
2306 * l'identifiant du dossier à partir du numéro saisie.
2307 *
2308 *
2309 * @param array tableau contenant les valeurs du formulaire.
2310 * @return array informations liées à la numérotation du dossier.
2311 */
2312 protected function traitementNumerotationDossierManuelle($val = array()) {
2313 // INitialisation des valeurs de la numérotation à partir des informations issues
2314 // du formulaire
2315 $num_doss_comp = $val['numero_dossier_complet'];
2316 $numerotation = array(
2317 $this->clePrimaire => $num_doss_comp,
2318 'dossier_libelle' => $num_doss_comp
2319 );
2320 // TODO : à commenter
2321 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2322 // TODO : à commenter
2323 if (empty($num_urba['di']) === false) {
2324 $dossier = sprintf("%s%s%s%s%s%s%s%s",
2325 $num_urba['di']['type'],
2326 $num_urba['di']['departement'],
2327 $num_urba['di']['commune'],
2328 $num_urba['di']['annee'],
2329 $num_urba['di']['division'],
2330 $num_urba['di']['numero'],
2331 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2332 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2333 );
2334 $dossierLibelle = sprintf("%s %s%s %s %s%s%s%s",
2335 $num_urba['di']['type'],
2336 $num_urba['di']['departement'],
2337 $num_urba['di']['commune'],
2338 $num_urba['di']['annee'],
2339 $num_urba['di']['division'],
2340 $num_urba['di']['numero'],
2341 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2342 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2343 );
2344 $numerotation = array(
2345 $this->clePrimaire => $dossier,
2346 'dossier_libelle' => $dossierLibelle,
2347 'numerotation_type' => $num_urba['di']['type'],
2348 'numerotation_dep' => $num_urba['di']['departement'],
2349 'numerotation_com' => $num_urba['di']['commune'],
2350 'numerotation_division' => $num_urba['di']['division'],
2351 'numerotation_num' => $num_urba['di']['numero'],
2352 'numerotation_suffixe' => isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : null,
2353 'numerotation_num_suffixe' => isset($num_urba['di']['num_suffixe']) === true ? $num_urba['di']['num_suffixe'] : null
2354 );
2355 }
2356 return $numerotation;
2357 }
2358
2359 /**
2360 * Traitement automatique de la numérotation du dossier.
2361 * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2362 * dossier.
2363 *
2364 * @param array tableau contenant les valeurs du formulaire.
2365 * @return array informations liées à la numérotation du dossier.
2366 */
2367 protected function traitementNumerotationDossierAuto($val = array()) {
2368 // GESTION DU SUFFIXE :
2369 // La version du suffixe est celle du type de DI : à ne pas confondre avec celle du DI lui même.
2370 // Exemple chronologique :
2371 // DI n° PC0130551600004 -> version 0
2372 // DI n° PC0130551600004M01 -> version 1
2373 // DI n° PC0130551600004PRO01 -> version 2 !!
2374 $code = null;
2375 $numeroVersionDossierInstructionType = null;
2376 $suffixe = "";
2377 // Si l'option suffixe de ce type de DI est activée
2378 if ( $this->getSuffixe($this->getDossierInstructionType()) === 't' ){
2379 // Récupération de la lettre associée au type de dossier d'instruction
2380 $code = $this->getCode($this->getDossierInstructionType());
2381 // Récupération du numéro de version en fonction du type de dossier d'instruction
2382 $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
2383 $numeroVersionDossierInstructionType = $this->getNumeroVersionDossierInstructionType(
2384 $val['dossier_autorisation'],
2385 $val['dossier_instruction_type'],
2386 $val['demande_type'],
2387 $numeroVersion
2388 );
2389 // Suffixe
2390 $suffixe = $code.$numeroVersionDossierInstructionType;
2391 }
2392
2393 // Récupération du DA pour aller chercher le type, le département, la commune, la division et le numéro
2394 // nécessaire à la numérotation du dossier.
2395 $da = $this->f->get_inst__om_dbform(array(
2396 "obj" => "dossier_autorisation",
2397 "idx" => $val['dossier_autorisation'],
2398 ));
2399
2400 return array(
2401 'dossier' => $val['dossier_autorisation'].$suffixe,
2402 'dossier_libelle' => $da->getVal('dossier_autorisation_libelle').$suffixe,
2403 'numerotation_type' => ! empty($da->getVal("numerotation_type")) ? $da->getVal("numerotation_type") : null,
2404 'numerotation_dep' => ! empty($da->getVal("numerotation_dep")) ? $da->getVal("numerotation_dep") : null,
2405 'numerotation_com' => ! empty($da->getVal("numerotation_com")) ? $da->getVal("numerotation_com") : null,
2406 'numerotation_division' => ! empty($da->getVal("numerotation_division")) ? $da->getVal("numerotation_division") : null,
2407 'numerotation_num' => ! empty($da->getVal("numerotation_num")) ? $da->getVal("numerotation_num") : null,
2408 'numerotation_suffixe' => $code,
2409 'numerotation_num_suffixe' => $numeroVersionDossierInstructionType
2410 );
2411 }
2412
2413 /**
2414 * Traitement spécifique pour la numérotation du dossier.
2415 * Renvoie un tableau contenant les valeurs à mettre à jour pour la numérotation.
2416 *
2417 * Le(s) traitement(s) effectué(s) dans cette méthode est(sont) :
2418 * - Si l'option om_collectivite_entite est active gère la numérotation de l'entité
2419 * du dossier.
2420 *
2421 * @param array tableau contenant les valeurs du formulaire.
2422 * @return array informations liées à la numérotation du dossier.
2423 */
2424 function traitementSpécifique($val = array()) {
2425 // TODO : commenter
2426 $numerotation = array();
2427 // Gestion du numéro entité du dossier (specifique au MC)
2428 $numerotation_entite = $this->f->get_collectivite_code_entite($val['om_collectivite']);
2429 if ($this->f->is_option_om_collectivite_entity_enabled($val['om_collectivite']) === true
2430 && $numerotation_entite !== null) {
2431 $numerotation_num_entite = $this->increment_num_entite($val['dossier_autorisation']);
2432 $numerotation_num_entite = str_pad($numerotation_num_entite, 2, "0", STR_PAD_LEFT);
2433 $numerotation = array(
2434 $this->clePrimaire => $val[$this->clePrimaire].$numerotation_entite.$numerotation_num_entite,
2435 'dossier_libelle' => $val['dossier_libelle']." ".$numerotation_entite.$numerotation_num_entite,
2436 'numerotation_entite' => $numerotation_entite,
2437 'numerotation_num_entite' => $numerotation_num_entite
2438 );
2439 }
2440 return $numerotation;
2441 }
2442
2443 /**
2444 * Définition de la version et du suffixe du DI lors de sa création.
2445 *
2446 * @param array tableau contenant les valeurs du formulaire
2447 */
2448 function setValFAjout($val = array()) {
2449 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2450 // traitement lié à la récupération du numéro de version du dossier et stockage
2451 // de ce numéro de version
2452 $numeroVersion = $this->traitementNumeroVersion($val);
2453 $this->valF['version'] = $numeroVersion;
2454
2455 // Il y a deux possibilité de numérotation :
2456 // - la numérotation manuelle : le numéro de dossier est complétement saisis par l'utilisateur
2457 // - la numérotation automatique : le numéro de dossier est construis à partir du paramétrage
2458 // Selon les cas on va donc gérer la numérotation différemment.
2459 // Dans tous les cas on va récupérer les valeurs lié à la numérotation sous le forme d'un tableau.
2460 $isSaisieManuelle = ! empty($val['numero_dossier_complet']);
2461 if ($isSaisieManuelle) {
2462 $valNumerotationDossier = $this->traitementNumerotationDossierManuelle($val);
2463 } else {
2464 $valNumerotationDossier = $this->traitementNumerotationDossierAuto($val);
2465 }
2466 // Traitements spécifiques nécessaires à la numérotation du dossier.
2467 // Pour pouvoir réaliser les traitements spécifique on a besoin des infos de
2468 // numérotation. On l'ajoute donc au tableau des valeur pour pouvoir y accéder.
2469 $val = array_merge($val, $valNumerotationDossier);
2470 $valNumerotationSpecifique = $this->traitementSpécifique($val);
2471
2472
2473
2474 // Affectation automatique du dossier
2475 // Pour pouvoir réaliser l'affectation automatique on a besoin de la localisation.
2476 // On l'ajoute donc au tableau des valeur pour pouvoir y accéder
2477 // Récupération des références de localisation du dossier
2478 $valLocalisation = $this->localisation_dossier($val);
2479 $val = array_merge(
2480 $val,
2481 $valLocalisation
2482 );
2483 $valAffectation = $this->affectation_dossier($val);
2484
2485 // Construis le tableau des valeurs mise à jour à partir des valeurs issues de
2486 // tous les traitements précédents
2487 $this->valF = array_merge(
2488 $this->valF,
2489 $valNumerotationDossier,
2490 $valNumerotationSpecifique,
2491 $valAffectation
2492 );
2493
2494 $this->addToLog(__METHOD__."(): end", EXTRA_VERBOSE_MODE);
2495 }
2496
2497 /**
2498 * Traitement permettant de récupérer la localisation du dossier à partir de
2499 * ses références cadastrales.
2500 *
2501 * Récupère un tableau contenant les informations suivantes :
2502 * array(
2503 * 'quartier' => quartier,
2504 * 'arrondissement' => arrondissement
2505 * 'section' => section
2506 * )
2507 *
2508 * @param array tableau des valeurs du dossier
2509 * @param array tableau contenant la localisation du dossier
2510 */
2511 protected function localisation_dossier($val) {
2512 $quartier = 0;
2513 $arrondissement = 0;
2514 $section = '';
2515
2516 // Si la référence cadastrale n'est pas vide alors on récupère la
2517 // section, le quartier et l'arrondissement
2518 if ($val['terrain_references_cadastrales'] != '') {
2519
2520 // Récupère toutes les parcelles du dossier et sélectionne la première
2521 $list_parcelles = $this->f->parseParcelles($this->valF['terrain_references_cadastrales'], $this->valF['om_collectivite']);
2522 if (count($list_parcelles) > 0) {
2523 $parcelle = $list_parcelles[0];
2524
2525 // Récupère l'identifiant du quartier et de l'arrondissement
2526 $quartier_arrondissement = $this->get_quartier_arrondissement_by_code_impot($parcelle['quartier']);
2527 if ($quartier_arrondissement !== null
2528 && is_array($quartier_arrondissement) === true
2529 && isset($quartier_arrondissement['quartier']) === true
2530 && isset($quartier_arrondissement['arrondissement']) === true) {
2531 //
2532 $quartier = $quartier_arrondissement['quartier'];
2533 $arrondissement = $quartier_arrondissement['arrondissement'];
2534 }
2535
2536 // On récupère la section
2537 $section = $parcelle['section'];
2538 }
2539 }
2540
2541 return array(
2542 'quartier' => $quartier,
2543 'arrondissement' => $arrondissement,
2544 'section' => $section
2545 );
2546 }
2547
2548 // Permet d'incrémenter le numéro de version de l'entité
2549 public function increment_num_entite($da) {
2550 if ($da === null || $da === '') {
2551 return false;
2552 }
2553 $last_entity_num = 0;
2554 //
2555 $inst_da = $this->f->get_inst__om_dbform(array(
2556 "obj" => "dossier_autorisation",
2557 "idx" => $da,
2558 ));
2559 $list_di = $inst_da->get_list_dossier_instruction();
2560 foreach ($list_di as $di) {
2561 $inst_di = $this->f->get_inst__om_dbform(array(
2562 "obj" => "dossier",
2563 "idx" => $di['dossier'],
2564 ));
2565 if (intval($inst_di->getVal('numerotation_num_entite')) > $last_entity_num) {
2566 $last_entity_num = intval($inst_di->getVal('numerotation_num_entite'));
2567 }
2568 }
2569 return ++$last_entity_num;
2570 }
2571
2572 /*Récupère la valeur du suffixe d'un dossier_instruction_type*/
2573 function getSuffixe($idDIType){
2574 $dossierInstructionType = $this->f->get_inst__om_dbform(array(
2575 'obj' => 'dossier_instruction_type',
2576 'idx' => $idDIType
2577 ));
2578 return $dossierInstructionType->getVal('suffixe');
2579 }
2580
2581 /*Récupère dans la table de paramètrage la lettre correspondant
2582 * au dossier_instruction_type
2583 */
2584 function getCode($idDIType){
2585 $dossierInstructionType = $this->f->get_inst__om_dbform(array(
2586 'obj' => 'dossier_instruction_type',
2587 'idx' => $idDIType
2588 ));
2589 return $dossierInstructionType->getVal('code');
2590 }
2591
2592 /**
2593 * Récupère le numéro de version d'un dossier_autorisation à l'aide d'une
2594 * requête sql.
2595 *
2596 * En cas d'erreur sur la requête arrête l'execution et affiche un message
2597 * d'erreur.
2598 *
2599 * @param string identifiant du dossier d'autorisation (DA)
2600 * @return integer numéro de version du DA
2601 */
2602 function getNumeroVersion($idDA){
2603 $dossierAutorisation = $this->f->get_inst__om_dbform(array(
2604 'obj' => 'dossier_autorisation',
2605 'idx' => $idDA
2606 ));
2607 return $dossierAutorisation->getVal('numero_version');
2608 }
2609
2610
2611 /**
2612 * Récupère le numéro de suffixe du dossier d'instruction.
2613 *
2614 * @return string
2615 */
2616 function get_di_numero_suffixe($dossier_instruction = null) {
2617
2618 $ref_dossier = $this;
2619 if (! empty($dossier_instruction)) {
2620 if(empty($ref_dossier = $this->f->findObjectById('dossier', $dossier_instruction))) {
2621 $this->f->addToLog(__METHOD__."(): Dossier '$dossier_instruction' non trouvé", DEBUG_MODE);
2622 return false;
2623 }
2624 }
2625 else {
2626 $dossier_instruction = $ref_dossier->getVal($this->clePrimaire);
2627 }
2628
2629 $dossier_suffixe = intval($ref_dossier->getVal('numerotation_num_suffixe'));
2630
2631 // TODO si les tests se déroulent bien:
2632 // - supprimer le code ci-dessous et la fonction 'numerotation_urbanisme'
2633 // - retourner le résultat de la ligne ci-dessus en tant que valeur de retour de la fonction
2634
2635 $dossier_ref_id = $dossier_instruction;
2636 $collectivite_id = $ref_dossier->getVal('om_collectivite');
2637
2638 // si l'option 'code_entité' est activée pour la collectivité
2639 if ($this->f->is_option_om_collectivite_entity_enabled($collectivite_id)) {
2640
2641 // si le code entité n'est pas défini ou vide
2642 if ($this->f->get_collectivite_code_entite($collectivite_id) === null) {
2643
2644 // affiche un message d'alerte
2645 $err_msg = sprintf(__("Paramètre '%s' manquant ou vide pour la collectivité '%s'"),
2646 'code_entite',
2647 $collectivite_id);
2648 $this->f->addToLog(__METHOD__."() : $err_msg", DEBUG_MODE);
2649 }
2650 // si le code entité est défini et non-vide
2651 else {
2652
2653 // supprime le code entité du numéro de dossier
2654 $code_entite = $this->f->get_collectivite_code_entite($collectivite_id);
2655 $dossier_ref_id = preg_replace('/'.$code_entite.'[0-9]+$/', '', $dossier_ref_id);
2656 $this->f->addToLog(__METHOD__."(): suppression (temporaire) du code entité '$code_entite' du dossier $dossier_ref_id (complet: $dossier_instruction)", DEBUG_MODE);
2657 }
2658 }
2659
2660 $num_urba = $this->f->numerotation_urbanisme($dossier_ref_id);
2661
2662 // Si l'expression régulière retourne une erreur
2663 if ($num_urba == false) {
2664 // Message dans le log
2665 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de suffixe du dossier d'instruction"), DEBUG_MODE);
2666 return false;
2667 }
2668
2669 $suffixe = 0;
2670
2671 // Retourne seulement la suffixe du dossier d'instruction.
2672 // Elle vaut 0 si le numéro du DI n'a pas de suffixe.
2673 if (isset($num_urba['di']['num_suffixe'])) {
2674 $suffixe = $num_urba['di']['num_suffixe'];
2675 }
2676
2677 if ($dossier_suffixe != intval($suffixe)) {
2678 //throw new RuntimeException("Dossier '".$ref_dossier->getVal('dossier')."' suffixes differs ($dossier_suffixe != $suffixe)");
2679 $this->f->addToLog(__METHOD__."(): Dossier '".$ref_dossier->getVal('dossier')."' suffixes differs (new:$dossier_suffixe != old:$suffixe)", DEBUG_MODE);
2680 }
2681
2682 return $suffixe;
2683 }
2684
2685 /*Incrémente le numéro de version du dossier*/
2686 function incrementNumeroVersion($dossierAutorisation, $nouveauNumeroVersion) {
2687
2688 $valF = array (
2689 "numero_version" => $nouveauNumeroVersion
2690 );
2691
2692 $res = $this->f->db->autoexecute(
2693 DB_PREFIXE."dossier_autorisation",
2694 $valF,
2695 DB_AUTOQUERY_UPDATE,
2696 "dossier_autorisation = '$dossierAutorisation'"
2697 );
2698 $this->addToLog(
2699 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier_autorisation\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"dossier_autorisation = '".$dossierAutorisation."'\");",
2700 VERBOSE_MODE
2701 );
2702 $this->f->isDatabaseError($res);
2703 }
2704
2705 /**
2706 * Retourne un numéro de version en fonction du type de dossier d'instruction
2707 * @param string $dossier_autorisation
2708 * @param integer $dossier_instruction_type
2709 * @return int
2710 */
2711 public function getNumeroVersionDossierInstructionType($dossier_autorisation, $dossier_instruction_type, $demande_type, $numero_version, $increment = true){
2712
2713 $numeroVersionDossierInstructionType = $numero_version;
2714
2715 // Récupère la nature de la demande
2716 $inst_demande_type = $this->f->get_inst__om_dbform(array(
2717 "obj" => "demande_type",
2718 "idx" => $demande_type
2719 ));
2720 $inst_demande_nature = $this->f->get_inst__om_dbform(array(
2721 "obj" => "demande_nature",
2722 "idx" => $inst_demande_type->getVal('demande_nature')
2723 ));
2724
2725 // Si c'est un dossier d'instruction de type "Initial"
2726 if (strtolower($inst_demande_nature->getVal('code')) === 'nouv') {
2727 return 0;
2728 }
2729 //Si c'est un modificatif ou transfert on retourne un nombre correspondant au
2730 //nombre de dossier d'instruction de ce type, rattaché au dossier
2731 //d'autorisation complété par des 0 à gauche si besoin. Format du retour
2732 //attendu : 01 ou 02, etc.
2733 else {
2734 //On récupère le nombre de dossier d'instruction de ce type rattaché au
2735 //dossier d'autorisation
2736 $qres = $this->f->get_one_result_from_db_query(
2737 sprintf(
2738 'SELECT
2739 count(dossier)
2740 FROM
2741 %1$sdossier
2742 LEFT JOIN %1$sdossier_autorisation
2743 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
2744 WHERE
2745 dossier_autorisation.dossier_autorisation = \'%2$s\'
2746 AND dossier.dossier_instruction_type = \'%3$d\'',
2747 DB_PREFIXE,
2748 $this->f->db->escapeSimple($dossier_autorisation),
2749 intval($dossier_instruction_type)
2750 ),
2751 array(
2752 "origin" => __METHOD__,
2753 "force_return" => true
2754 )
2755 );
2756 $numeroVersionDossierInstructionType = $qres['result'];
2757
2758 if ($qres["code"] !== "OK") { // PP
2759 $this->f->addToError("", $numeroVersionDossierInstructionType, $numeroVersionDossierInstructionType);
2760 return false;
2761 }
2762
2763 // Requête SQL
2764 $qres = $this->f->get_all_results_from_db_query(
2765 sprintf(
2766 'SELECT
2767 substring(dossier, \'\d*$\')::int as last_num_dossier
2768 FROM
2769 %1$sdossier
2770 WHERE
2771 dossier_instruction_type = %2$s
2772 AND dossier_autorisation = \'%3$s\'
2773 AND version = (
2774 SELECT
2775 max(version)
2776 FROM
2777 %1$sdossier
2778 WHERE
2779 dossier_instruction_type = %2$s
2780 AND dossier_autorisation = \'%3$s\'
2781 GROUP BY
2782 dossier_instruction_type,
2783 dossier_autorisation
2784 )',
2785 DB_PREFIXE,
2786 intval($dossier_instruction_type),
2787 $this->f->db->escapeSimple($dossier_autorisation)
2788 ),
2789 array(
2790 'origin' => __METHOD__
2791 )
2792 );
2793 $num_version_last_dossier = null;
2794 if (count($qres['result']) > 0) {
2795 $row = array_shift($qres['result']);
2796 $num_version_last_dossier = $row['last_num_dossier'];
2797 }
2798
2799 if (!empty($num_version_last_dossier)
2800 && $num_version_last_dossier >= $numeroVersionDossierInstructionType) {
2801 // Modifie le numéro suivant
2802 $numeroVersionDossierInstructionType = $num_version_last_dossier;
2803 }
2804 //
2805 if ($increment === true) {
2806 $numeroVersionDossierInstructionType = ++$numeroVersionDossierInstructionType;
2807 }
2808 //On compléte par des 0 à gauche
2809 $numeroVersionDossierInstructionType = str_pad($numeroVersionDossierInstructionType, 2, "0", STR_PAD_LEFT);
2810
2811 return $numeroVersionDossierInstructionType;
2812 }
2813 }
2814
2815 function setvalF($val = array()){
2816
2817 if (! $this->f->is_option_dossier_commune_enabled()) {
2818 // ajoute une "fausse" clé 'commune' dans le tableau des données envoyées
2819 // car la fonction 'setValF()' dans 'gen/obj/demande.class.php'
2820 // déclenche une erreur 'Undefined index: commune' sinon
2821 $val['commune'] = null;
2822 // idem pour cette valeur qui est passée au dossier d'instruction
2823 $this->valF['commune'] = null;
2824 }
2825
2826 // normalise les coordonnées géographiques
2827 foreach(array('latitude', 'longitude') as $key) {
2828 if (isset($val["geoloc_$key"]) && ! empty($val["geoloc_$key"])) {
2829 $m = array();
2830 if (preg_match(self::LAT_LON_REGEX, $val["geoloc_$key"], $m)) {
2831 $val["geoloc_$key"] = sprintf('%d° %d.%d %1s', $m['deg'], $m['min'], $m['dec'], $m['dir']);
2832 }
2833 }
2834 }
2835
2836 parent::setvalF($val);
2837
2838 // Récupération des id demandeurs postés
2839 $this->getPostedValues();
2840
2841 // enlever les valeurs a ne pas saisir -> recherche en trigger ajouter et modifier
2842 unset ($this->valF['geom']);
2843 unset ($this->valF['geom1']);
2844 // valeurs hiddenstatic (calcule)
2845 if($this->maj==1){
2846 // par defaut
2847 unset ($this->valF['etat']);
2848 unset ($this->valF['delai']);
2849 unset ($this->valF['accord_tacite']);
2850 }
2851 unset ($this->valF['avis_decision']); // avis + libelle avis
2852 unset ($this->valF['terrain_surface_calcul']);
2853 unset ($this->valF['shon_calcul']);
2854 unset ($this->valF['date_notification_delai']);
2855 unset ($this->valF['date_decision']);
2856 unset ($this->valF['date_limite']);
2857 unset ($this->valF['date_validite']);
2858 unset ($this->valF['date_chantier']);
2859 unset ($this->valF['date_achevement']);
2860 unset ($this->valF['date_conformite']);
2861 // Ce champ est mis à jour uniquement par la gestion spécifique du log
2862 // et donc jamais par les actions ajouter/modifier
2863 unset ($this->valF['log_instructions']);
2864 // Ce champ n'est jamais mis à jour, seulement initialisé à la création
2865 // du dossier d'instruction
2866 unset($this->valF['initial_dt']);
2867
2868 // Vérification de la saisie manuelle du numéro complet
2869 $force_param_duree_val = false;
2870 $num_doss_comp = isset($val['numero_dossier_complet']) === true ? $val['numero_dossier_complet'] : null;
2871 if ($num_doss_comp !== null) {
2872
2873 // si l'option 'code_entité' est activée pour la collectivité
2874 if ($this->f->is_option_om_collectivite_entity_enabled($this->valF['om_collectivite'])) {
2875
2876 // si le code entité n'est pas défini ou vide
2877 if ($this->f->get_collectivite_code_entite($this->valF['om_collectivite']) === null) {
2878
2879 // affiche un message d'alerte
2880 $err_msg = sprintf(__("Paramètre '%s' manquant ou vide pour la collectivité '%s'"),
2881 'code_entite',
2882 $this->valF['om_collectivite']);
2883 $this->f->addToLog(__METHOD__."() : $err_msg", DEBUG_MODE);
2884 }
2885 // si le code entité est défini et non-vide
2886 else {
2887
2888 // supprime le code entité du numéro de dossier
2889 $code_entite = $this->f->get_collectivite_code_entite($this->valF['om_collectivite']);
2890 $num_doss_comp = preg_replace('/'.$code_entite.'[0-9]+$/', '', $num_doss_comp);
2891 $this->f->addToLog(
2892 __METHOD__."(): suppression (temporaire) du code entité '$code_entite' ".
2893 "du dossier $num_doss_comp (complet: ".$val['numero_dossier_complet'].")", DEBUG_MODE);
2894 }
2895 }
2896
2897 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2898 if (empty($num_urba['di']) === false) {
2899 $force_param_duree_val = true;
2900 }
2901 }
2902 // Durée de validité lors de la création du dossier d'instruction
2903 $this->valF['duree_validite'] = $this->get_duree_validite($this->valF['dossier_autorisation'], $force_param_duree_val);
2904 }
2905
2906
2907 /**
2908 * Retourne le type de formulaire : ADS, CTX RE, CTX IN ou DPC.
2909 *
2910 * @return mixed $type_aff_form Type de formulaire (string) ou false (bool) si erreur BDD.
2911 */
2912 function get_type_affichage_formulaire() {
2913 if (isset($this->type_aff_form) === true) {
2914 return $this->type_aff_form;
2915 }
2916
2917 $id_dossier_instruction_type = $this->getVal("dossier_instruction_type");
2918 if($this->getParameter('maj') == '0' OR $this->get_action_crud() === 'create') {
2919 $id_dossier_instruction_type = $this->valF["dossier_instruction_type"];
2920 }
2921
2922 $qres = $this->f->get_one_result_from_db_query(
2923 sprintf(
2924 'SELECT
2925 dossier_autorisation_type.affichage_form
2926 FROM
2927 %1$sdossier_instruction_type
2928 INNER JOIN %1$sdossier_autorisation_type_detaille
2929 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2930 INNER JOIN %1$sdossier_autorisation_type
2931 ON dossier_autorisation_type.dossier_autorisation_type = dossier_autorisation_type_detaille.dossier_autorisation_type
2932 WHERE
2933 dossier_instruction_type.dossier_instruction_type = \'%2$d\'',
2934 DB_PREFIXE,
2935 intval($id_dossier_instruction_type)
2936 ),
2937 array(
2938 "origin" => __METHOD__,
2939 "force_return" => true
2940 )
2941 );
2942
2943 if ($qres["code"] !== "OK") {
2944 return false;
2945 }
2946
2947 $this->type_aff_form = $qres["result"];
2948
2949 return $this->type_aff_form;
2950 }
2951
2952
2953 /**
2954 * Retourne le code du groupe du dossier d'instruction.
2955 *
2956 * @return string
2957 */
2958 public function get_groupe() {
2959 //
2960 if (isset($this->groupe) === true && $this->groupe !== null) {
2961 return $this->groupe;
2962 }
2963
2964 // Récupère le code du groupe
2965 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
2966 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
2967 $inst_groupe = $this->get_inst_groupe($inst_dossier_autorisation_type->getVal('groupe'));
2968 $groupe = $inst_groupe->getVal('code');
2969
2970 //
2971 $this->groupe = $groupe;
2972 //
2973 return $this->groupe;
2974 }
2975
2976 /**
2977 * @return void
2978 */
2979 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
2980 parent::verifier($val);
2981 // La date de dépôt est obligatoire
2982 if (isset($val['date_depot']) && ($val['date_depot'] === '' || $val['date_depot'] === null)) {
2983 //
2984 $this->correct = false;
2985 $this->addToMessage( _('Le champ').' <span class="bold">'.$this->getLibFromField('date_depot').'</span> '._('est obligatoire'));
2986 } else {
2987 //
2988 $date_depot = $val["date_depot"];
2989 if (preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', $val["date_depot"], $d_match)) {
2990 $date_depot = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
2991 }
2992 // Il faut avoir une date de dépôt pour pouvoir vérifier si elle est supérieure à la date du jour
2993 $date_depot = DateTime::createFromFormat('Y-m-d', $date_depot);
2994 $aujourdhui = new DateTime();
2995 try {
2996 if (! $date_depot instanceof DateTime) {
2997 throw new RuntimeException("Not a DateTime");
2998 }
2999 // Si la date issus du formulaire n'a pas pu être converti, date_demande vaudra
3000 // false. Avant de comparer on vérifie donc que la date a bien été récupérée
3001 if($date_depot > $aujourdhui) {
3002 $this->correct = false;
3003 $this->addToMessage(_("La date de depot ne peut pas être superieure à la date du jour."));
3004 }
3005 } catch (RuntimeException $e) {
3006 $this->correct = false;
3007 $this->addToLog($e.' : '._("Le format de la date de depot n'est pas valide."));
3008 $this->addToMessage(_("Erreur : le format de la date de depot n'est pas correct. Contactez votre administrateur."));
3009 }
3010 }
3011
3012 $type_aff_form = $this->get_type_affichage_formulaire();
3013 if ($type_aff_form ===false) {
3014 $this->correct = false;
3015 $this->addToMessage(_("Une erreur s'est produite lors de l'ajout de ce dossier. Veuillez contacter votre administrateur."));
3016 }
3017
3018 switch ($type_aff_form) {
3019 case 'ADS':
3020 case 'CTX RE':
3021 case 'CONSULTATION ENTRANTE':
3022 if (!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
3023 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
3024 !is_null($this->form)) {
3025 $this->correct = false;
3026 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
3027 }
3028 break;
3029 case 'CTX IN':
3030 if (!isset($this->postedIdDemandeur["contrevenant_principal"]) OR
3031 empty($this->postedIdDemandeur["contrevenant_principal"]) AND
3032 !is_null($this->form)) {
3033 $this->correct = false;
3034 $this->addToMessage(_("La saisie d'un contrevenant principal est obligatoire."));
3035 }
3036 break;
3037 case 'DPC':
3038 if(!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
3039 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
3040 !is_null($this->form)) {
3041 $this->correct = false;
3042 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
3043 }
3044 if(!isset($this->postedIdDemandeur["bailleur_principal"]) OR
3045 empty($this->postedIdDemandeur["bailleur_principal"]) AND
3046 !is_null($this->form)) {
3047 $this->correct = false;
3048 $this->addToMessage(_("La saisie d'un bailleur principal est obligatoire."));
3049 }
3050 break;
3051 }
3052
3053 // Récupération du crud par rapport au mode du formulaire
3054 $crud = $this->get_action_crud($this->getParameter("maj"));
3055
3056 // L'année de la date de dépot ne peut pas être modifiée
3057 if ($crud === 'update' && array_key_exists("date_depot", $val) === true && ($val["date_depot"] !== "" && $val["date_depot"] !== null)) {
3058 //
3059 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
3060 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
3061 if ($new_date->format("Y") != $old_date->format("Y")) {
3062 $this->addToMessage(_("L'année de la date de dépôt n'est pas modifiable."));
3063 $this->correct = false;
3064 }
3065 }
3066
3067 // L'année de la date de dépot en mairie ne peut pas être modifiée
3068 if ($crud === 'update' && array_key_exists("date_depot_mairie", $val) === true && (isset($val["date_depot_mairie"]) === true && $val["date_depot_mairie"] !== "" && $val["date_depot_mairie"] !== null)) {
3069 //
3070 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot_mairie"]);
3071 // Dans le cas où une date de dépôt en mairie est saisie et que l'option pour afficher
3072 // ce champ est désactivée, le champ sera mis en hidden et donc le format de la date
3073 // dans la valeur ne sera plus "d/m/Y" mais "Y-m-d".
3074 $new_date = $new_date !== false ? $new_date : DateTime::createFromFormat('Y-m-d', $val["date_depot_mairie"]);
3075 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot_mairie"));
3076 if ($old_date !== false && $new_date->format("Y") != $old_date->format("Y")) {
3077 $this->addToMessage(_("L'année de la date de dépôt en mairie n'est pas modifiable."));
3078 $this->correct = false;
3079 }
3080 }
3081
3082 // option dossier_commune activée
3083 if ($this->f->is_option_dossier_commune_enabled()) {
3084
3085 // La commune doit être définie
3086 if ($crud !== 'delete') {
3087 if (! array_key_exists("commune", $val) || empty($val["commune"])) {
3088 $this->addToMessage(__("La commune doit être définie."));
3089 $this->correct = false;
3090 }
3091 else {
3092 // récupération de la date de demande
3093 $date_demande = 'NOW';
3094 $d_match = array();
3095 if (isset($val["date_demande"])
3096 && preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/',
3097 $val["date_demande"], $d_match)) {
3098 $date_demande = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
3099 }
3100 $date_demande = new DateTime($date_demande);
3101
3102 // La commune doit exister
3103 $commune = $this->f->findObjectById("commune", $val["commune"]);
3104 if (empty($commune)) {
3105 $this->addToMessage(__("La commune doit exister."));
3106 $this->correct = false;
3107 }
3108 // La commune ne peut pas être modifiée
3109 elseif ($crud === 'update') {
3110 if ($val["commune"] != $this->getVal('commune')) {
3111 $this->addToMessage(__("La commune n'est pas modifiable."));
3112 $this->correct = false;
3113 }
3114 }
3115 // La commune doit être valide
3116 elseif (! $commune->valid($date_demande)) {
3117 $this->addToMessage(__(
3118 "La commune doit être valide ".
3119 "à la date du '".$date_demande->format('d/m/Y')."'."));
3120 $this->correct = false;
3121 }
3122 }
3123 }
3124 }
3125
3126 // coordonnées géographiques
3127 if (isset($val['geoloc_rayon']) && ! empty($val['geoloc_rayon'])) {
3128 if (! ctype_digit(strval($val['geoloc_rayon']))) {
3129 $this->addToMessage(__("Le rayon (coordonnées géographiques) est invalide: doit être un nombre"));
3130 $this->correct = false;
3131 }
3132 }
3133 foreach(array('latitude', 'longitude') as $key) {
3134 if (isset($val["geoloc_$key"]) && ! empty($val["geoloc_$key"])) {
3135 $coord = $val["geoloc_$key"];
3136 if (! preg_match(self::LAT_LON_REGEX, $coord)) {
3137 $this->addToMessage(sprintf(
3138 __("%s '%s' invalide: le format à respecter est 'd° min.dec N/S/E/O'"), ucfirst($key), $coord));
3139 $this->correct = false;
3140 }
3141 }
3142 }
3143 }
3144
3145
3146 /**
3147 * Permet de vérifier si les champs requis Plat'AU ont été remplis
3148 *
3149 * @param $dossier l'identifiant du dossier
3150 *
3151 * @return array un tableau contenant une clé is_ok qui indique
3152 * si tous les champs sont saisis ou non et une clé
3153 * required_fields_empty qui contient les champs qui n'ont pas été saisis
3154 * | false si une erreur survient
3155 *
3156 */
3157 function check_platau_required_fields($dossier) {
3158
3159 // On récupère les champs Plat'AU requis
3160 $fields_list = $this->list_platau_required_fields_dossier;
3161
3162 // On fait un tableau qui contiendra les tables et un tableau
3163 // qui contient les champs au format 'table.champ'
3164 $tables = array();
3165 $champs = array();
3166
3167 foreach ($fields_list as $value) {
3168 $expl_tab = explode('.', $value);
3169 if (! in_array($expl_tab[0], $tables)) {
3170 $tables[] = $expl_tab[0];
3171 }
3172 $champs[] = $value;
3173 }
3174
3175 // Il y aura toujours la table dossier dans la requête
3176 if (in_array('dossier', $tables)) {
3177 $key = array_keys($tables, 'dossier');
3178 unset($tables[$key[0]]);
3179 }
3180
3181 $from_tables = array();
3182 // On construit le 'FROM' de la requête sql avec les jointures
3183 foreach($tables as $table) {
3184 // Cas particulier pour la table demandeur et architecte
3185 if ($table == "demandeur") {
3186 $from_tables[] = sprintf(
3187 ' LEFT JOIN %1$slien_dossier_demandeur ON lien_dossier_demandeur.dossier = dossier.dossier LEFT JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur',
3188 DB_PREFIXE
3189 );
3190 } elseif ($table == "architecte") {
3191 $from_tables[] = sprintf(
3192 ' LEFT JOIN %sarchitecte ON architecte.architecte = donnees_techniques.architecte',
3193 DB_PREFIXE
3194 );
3195 } else {
3196 $from_tables[] = sprintf(" LEFT JOIN %s$table ON dossier.dossier = $table.%s ", DB_PREFIXE, $table == 'donnees_techniques' ? 'dossier_instruction' : 'dossier');
3197 }
3198 }
3199
3200 // Construction de la requête sql
3201 $sql = sprintf(
3202 '
3203 SELECT
3204 %s,
3205 CASE WHEN demandeur.qualite=\'particulier\'
3206 THEN
3207 TRIM(CONCAT_WS(\' \', demandeur.particulier_nom, demandeur.particulier_prenom))
3208 ELSE
3209 CASE WHEN demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL
3210 THEN
3211 TRIM(CONCAT_WS(\' \', demandeur.personne_morale_raison_sociale, demandeur.personne_morale_denomination, \'%s\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
3212 ELSE
3213 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination))
3214 END
3215 END as petitionnaire,
3216 demandeur.demandeur
3217 FROM
3218 %sdossier
3219 %s
3220 WHERE dossier.dossier = \'%s\'
3221 ',
3222 implode(', ', $champs),
3223 __("représenté(e) par"),
3224 DB_PREFIXE,
3225 implode(' ', $from_tables),
3226 $dossier
3227 );
3228
3229 // On récupère les champs
3230 $result_fields = $this->f->get_all_results_from_db_query(
3231 $sql,
3232 array(
3233 "origin" => __METHOD__,
3234 )
3235 );
3236
3237 // Si il y a une erreur
3238 if ($result_fields['code'] == 'KO'
3239 || $result_fields['result'] == ''
3240 || $result_fields['result'] == null) {
3241
3242 $this->addToLog(__METHOD__."() query : ".var_export($sql, true)." error: ".var_export($result_fields['message'], true), DEBUG_MODE);
3243 return false;
3244 }
3245
3246 // On récupère le résultat de la requête
3247 $required_fields = $result_fields['result'];
3248
3249 $required_fields_with_tab = array();
3250
3251 // Pour chaque champ on récupère la table
3252 $demandeur_num = 1;
3253 foreach ($required_fields as $required_field) {
3254 foreach ($champs as $champ) {
3255 if ($champ == "demandeur.localite") {
3256 $required_fields_with_tab[$champ.','.$required_field['petitionnaire'].' '.$required_field['demandeur']] = $required_field[explode('.', $champ)[1]];
3257 } else {
3258 $required_fields_with_tab[$champ] = $required_field[explode('.', $champ)[1]];
3259 }
3260 }
3261 }
3262
3263 // On vérifie si un architecte est lié
3264 $qres = $this->f->get_one_result_from_db_query(
3265 sprintf(
3266 'SELECT
3267 architecte.*
3268 FROM
3269 %1$sdossier
3270 LEFT JOIN %1$sdonnees_techniques
3271 ON dossier.dossier = donnees_techniques.dossier_instruction
3272 LEFT JOIN %1$sarchitecte
3273 ON donnees_techniques.architecte = architecte.architecte
3274 WHERE
3275 dossier.dossier = \'%2$s\'',
3276 DB_PREFIXE,
3277 $this->f->db->escapeSimple($dossier)
3278 ),
3279 array(
3280 "origin" => __METHOD__,
3281 "force_return" => true
3282 )
3283 );
3284
3285 if ($qres["code"] !== "OK") {
3286 $this->addToLog(__METHOD__."() plop error: ".var_export($qres["message"], true), DEBUG_MODE);
3287 return false;
3288 }
3289
3290 // Si il n'est pas lié on enlève le champs architecte
3291 if ($qres["result"] == '' || $qres["result"] == null) {
3292 unset($required_fields_with_tab['architecte.ville']);
3293 }
3294
3295 $result_tab = array(
3296 'is_ok' => false,
3297 'required_fields_empty' => array()
3298 );
3299
3300 // Construction du message avec les tables et les champs
3301 foreach ($required_fields_with_tab as $required_field => $value) {
3302 if ($value == null || $value == '') {
3303 $required_fields_splited = explode('.', $required_field);
3304 if (isset(explode(',', $required_fields_splited[1])[1])) {
3305 $required_fields_splited = explode('.', $required_field);
3306 // On enlève l'identifiant du demandeur dans le message
3307 $required_fields_splited[1] = preg_replace('/[0-9]*$/', '', $required_fields_splited[1]);
3308 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3309 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3310 __(" le champ : "),
3311 __(explode(',', $required_fields_splited[1])[0]).' pour '.explode(',', $required_fields_splited[1])[1]
3312 );
3313 } else {
3314 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3315 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3316 __(" le champ : "),
3317 __($required_fields_splited[1])
3318 );
3319 }
3320 }
3321 }
3322
3323 if (empty($result_tab['required_fields_empty'])) {
3324 $result_tab['is_ok'] = true;
3325 }
3326
3327 return $result_tab;
3328
3329 }
3330
3331
3332 /**
3333 * Permet de mettre à jour le state d'une task selon certains paramètre
3334 * Si le paramètre $dossier_autorisation est spécifié cela signifie que
3335 * le dossier a été transmis et qu'on doit modifier les state seulement
3336 * des tache de modification du di et d da
3337 *
3338 * @param dossier l'identifiant du dossier
3339 * @param state_prev le state de la tâche
3340 * @param state_wanted le state que doit avoir la tâche
3341 * @param dossier_autorisation l'identifiant du dossier d'autorisation
3342 *
3343 * @return void
3344 *
3345 */
3346 function update_task_state($dossier, $state_prev, $state_wanted, $dossier_autorisation=null) {
3347
3348 $already_transmitted_updated = '';
3349 $type_task_to_update = '';
3350
3351 $already_transmitted_updated = sprintf('OR task.dossier=\'%s\'', $dossier_autorisation !== null ? $dossier_autorisation : $this->valF['dossier_autorisation']);
3352
3353 $sql = sprintf(
3354 'SELECT task FROM %stask WHERE task.state = \'%s\' AND (task.dossier=\'%s\' %s) %s %s',
3355 DB_PREFIXE,
3356 $state_prev,
3357 $dossier,
3358 $already_transmitted_updated,
3359 $type_task_to_update,
3360 " AND type NOT IN ('notification_recepisse', 'notification_instruction', 'notification_decision') "
3361 );
3362 $tasks_id = $this->f->get_all_results_from_db_query(
3363 $sql,
3364 array(
3365 "origin" => __METHOD__,
3366 )
3367 );
3368 $params = array('val' => array('state' => $state_wanted));
3369 foreach ($tasks_id['result'] as $task_id) {
3370 $inst_task = $this->f->get_inst__om_dbform(array(
3371 "obj" => "task",
3372 "idx" => intval($task_id['task'])
3373 ));
3374 $inst_task->update_task($params);
3375 }
3376 }
3377
3378
3379 function setType(&$form,$maj) {
3380 // Par défaut le type des champs est géré nativement par le framework
3381 parent::setType($form,$maj);
3382
3383 // Récupération du contexte : groupe, CRUD et paramètres
3384 $groupe = $this->get_type_affichage_formulaire();
3385 $crud = $this->get_action_crud($maj);
3386 $parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
3387
3388 //
3389 // Gestion du groupe
3390 //
3391
3392 // CONSULTATION ENTRANTE
3393 $ce_fields = array(
3394 'autorisation_contestee' => 'hidden',
3395 'cle_acces_citoyen' => 'static',
3396 'contrevenants' => 'hidden',
3397 'date_ait' => 'hidden',
3398 'date_audience' => 'hidden',
3399 'date_affichage' => 'datestatic',
3400 'date_cloture_instruction' => 'hidden',
3401 'date_contradictoire' => 'hidden',
3402 'date_derniere_visite' => 'hidden',
3403 'date_premiere_visite' => 'hidden',
3404 'date_transmission_parquet' => 'hidden',
3405 'dossier_autorisation_type_detaille' => 'hidden',
3406 'dossier_instruction_type' => 'selecthiddenstatic',
3407 'dossier_petitionnaires' => 'hidden',
3408 'dt_ctx_infraction' => 'hidden',
3409 'dt_ctx_regularisable' => 'hidden',
3410 'dt_ctx_synthese_anr' => 'hidden',
3411 'dt_ctx_synthese_nti' => 'hidden',
3412 'ctx_reference_dsj' => 'hidden',
3413 'enjeu_ctx' => 'static',
3414 'instructeur_2' => 'selecthiddenstatic',
3415 'requerants' => 'hidden',
3416 'bailleur' => 'hidden',
3417 'ctx_reference_sagace' => 'hidden',
3418 'pec_metier' => 'selecthiddenstatic',
3419 "consultation_entrante" => 'hidden',
3420 "delai_reponse" => 'hidden',
3421 "type_delai" => 'hidden',
3422 "objet_consultation" => 'hidden',
3423 "date_production_notification" => 'hidden',
3424 "date_premiere_consultation" => 'hidden',
3425 "date_consultation" => 'hidden',
3426 "date_emission" => 'hidden',
3427 "service_consultant_id" => 'hidden',
3428 "service_consultant_libelle" => 'hidden',
3429 "service_consultant_insee" => 'hidden',
3430 "service_consultant_mail" => 'hidden',
3431 "service_consultant_type" => 'hidden',
3432 "service_consultant__siren" => 'hidden',
3433 "etat_consultation" => 'hidden',
3434 "type_consultation" => 'hidden',
3435 "texte_fondement_reglementaire" => 'hidden',
3436 "texte_objet_consultation" => 'hidden',
3437 "dossier_consultation" => 'hidden',
3438 );
3439 // INFRACTION
3440 $inf_fields = array(
3441 'a_qualifier' => 'hidden',
3442 'autorisation_contestee' => 'hidden',
3443 'autorite_competente' => 'hidden',
3444 'cle_acces_citoyen' => 'hidden',
3445 'contrevenants' => 'static',
3446 'date_ait' => 'hiddenstaticdate',
3447 'date_audience' => 'hiddenstaticdate',
3448 'date_cloture_instruction' => 'hidden',
3449 'date_complet' => 'hidden',
3450 'date_contradictoire' => 'hiddenstaticdate',
3451 'date_decision' => 'hiddenstaticdate',
3452 'date_depot' => 'hiddenstaticdate',
3453 'date_depot_mairie' => 'hiddenstaticdate',
3454 'date_dernier_depot' => 'hidden',
3455 'date_derniere_visite' => 'hiddenstaticdate',
3456 'date_limite' => 'hidden',
3457 'date_limite_incompletude' => 'hidden',
3458 'date_premiere_visite' => 'hiddenstaticdate',
3459 'date_transmission_parquet' => 'hiddenstaticdate',
3460 'date_validite' => 'hidden',
3461 'delai' => 'hidden',
3462 'description_projet' => 'hidden',
3463 'dossier_autorisation_type_detaille' => 'hidden',
3464 'dossier_instruction_type' => 'hidden',
3465 'dossier_petitionnaire' => 'hidden',
3466 'dossier_petitionnaires' => 'hidden',
3467 'dt_ctx_infraction' => 'checkboxhiddenstatic',
3468 'dt_ctx_regularisable' => 'checkboxhiddenstatic',
3469 'dt_ctx_synthese_anr' => 'static',
3470 'dt_ctx_synthese_nti' => 'static',
3471 'ctx_reference_dsj' => 'static',
3472 'enjeu_ctx' => 'hidden',
3473 'enjeu_erp' => 'hidden',
3474 'enjeu_urba' => 'hidden',
3475 'erp' => 'hidden',
3476 'evenement_suivant_tacite' => 'hidden',
3477 'evenement_suivant_tacite_incompletude' => 'hidden',
3478 'numero_versement_archive' => 'hidden',
3479 'requerants' => 'hidden',
3480 'tax_mtn_part_commu' => 'hidden',
3481 'tax_mtn_part_depart' => 'hidden',
3482 'tax_mtn_part_reg' => 'hidden',
3483 'tax_mtn_total' => 'hidden',
3484 'tax_mtn_rap' => 'hidden',
3485 'tax_secteur' => 'hidden',
3486 'tax_mtn_part_commu_sans_exo' => 'hidden',
3487 'tax_mtn_part_depart_sans_exo' => 'hidden',
3488 'tax_mtn_part_reg_sans_exo' => 'hidden',
3489 'tax_mtn_total_sans_exo' => 'hidden',
3490 'tax_mtn_rap_sans_exo' => 'hidden',
3491 'bailleur' => 'hidden',
3492 'ctx_reference_sagace' => 'static',
3493 'pec_metier' => 'hidden',
3494 "consultation_entrante" => 'hidden',
3495 "delai_reponse" => 'hidden',
3496 "type_delai" => 'hidden',
3497 "objet_consultation" => 'hidden',
3498 "date_production_notification" => 'hidden',
3499 "date_premiere_consultation" => 'hidden',
3500 "date_consultation" => 'hidden',
3501 "date_emission" => 'hidden',
3502 "service_consultant_id" => 'hidden',
3503 "service_consultant_libelle" => 'hidden',
3504 "service_consultant_insee" => 'hidden',
3505 "service_consultant_mail" => 'hidden',
3506 "service_consultant_type" => 'hidden',
3507 "service_consultant__siren" => 'hidden',
3508 "etat_consultation" => 'hidden',
3509 "type_consultation" => 'hidden',
3510 "texte_fondement_reglementaire" => 'hidden',
3511 "texte_objet_consultation" => 'hidden',
3512 "dossier_consultation" => 'hidden',
3513 );
3514 // RECOURS
3515 $re_fields = array(
3516 'a_qualifier' => 'hidden',
3517 'autorite_competente' => 'hidden',
3518 'cle_acces_citoyen' => 'hidden',
3519 'contrevenants' => 'hidden',
3520 'date_ait' => 'hidden',
3521 'date_audience' => 'hidden',
3522 'date_cloture_instruction' => 'hiddenstaticdate',
3523 'date_complet' => 'hidden',
3524 'date_contradictoire' => 'hidden',
3525 'date_decision' => 'hiddenstaticdate',
3526 'date_depot' => 'hiddenstaticdate',
3527 'date_depot_mairie' => 'hiddenstaticdate',
3528 'date_dernier_depot' => 'hidden',
3529 'date_derniere_visite' => 'hidden',
3530 'date_limite' => 'hiddenstaticdate',
3531 'date_limite_incompletude' => 'hidden',
3532 'date_premiere_visite' => 'hidden',
3533 'date_transmission_parquet' => 'hidden',
3534 'date_validite' => 'hidden',
3535 'delai' => 'hidden',
3536 'description_projet' => 'hidden',
3537 'dossier_autorisation_type_detaille' => 'static',
3538 'dossier_instruction_type' => 'hidden',
3539 'dossier_petitionnaire' => 'hidden',
3540 'dossier_petitionnaires' => 'static',
3541 'dt_ctx_infraction' => 'hidden',
3542 'dt_ctx_regularisable' => 'hidden',
3543 'dt_ctx_synthese_anr' => 'hidden',
3544 'dt_ctx_synthese_nti' => 'hidden',
3545 'enjeu_ctx' => 'hidden',
3546 'enjeu_erp' => 'hidden',
3547 'enjeu_urba' => 'hidden',
3548 'erp' => 'hidden',
3549 'evenement_suivant_tacite' =>'selecthiddenstatic',
3550 'evenement_suivant_tacite_incompletude' => 'hidden',
3551 'instructeur_2' => 'hidden',
3552 'numero_versement_archive' => 'hidden',
3553 'requerants' => 'static',
3554 'tax_mtn_part_commu' => 'hidden',
3555 'tax_mtn_part_depart' => 'hidden',
3556 'tax_mtn_part_reg' => 'hidden',
3557 'tax_mtn_total' => 'hidden',
3558 'tax_mtn_rap' => 'hidden',
3559 'tax_secteur' => 'hidden',
3560 'tax_mtn_part_commu_sans_exo' => 'hidden',
3561 'tax_mtn_part_depart_sans_exo' => 'hidden',
3562 'tax_mtn_part_reg_sans_exo' => 'hidden',
3563 'tax_mtn_total_sans_exo' => 'hidden',
3564 'tax_mtn_rap_sans_exo' => 'hidden',
3565 'bailleur' => 'hidden',
3566 'ctx_reference_dsj' => 'static',
3567 'ctx_reference_sagace' => 'static',
3568 'pec_metier' => 'hidden',
3569 "consultation_entrante" => 'hidden',
3570 "delai_reponse" => 'hidden',
3571 "type_delai" => 'hidden',
3572 "objet_consultation" => 'hidden',
3573 "date_production_notification" => 'hidden',
3574 "date_premiere_consultation" => 'hidden',
3575 "date_consultation" => 'hidden',
3576 "date_emission" => 'hidden',
3577 "service_consultant_id" => 'hidden',
3578 "service_consultant_libelle" => 'hidden',
3579 "service_consultant_insee" => 'hidden',
3580 "service_consultant_mail" => 'hidden',
3581 "service_consultant_type" => 'hidden',
3582 "service_consultant__siren" => 'hidden',
3583 "etat_consultation" => 'hidden',
3584 "type_consultation" => 'hidden',
3585 "texte_fondement_reglementaire" => 'hidden',
3586 "texte_objet_consultation" => 'hidden',
3587 "dossier_consultation" => 'hidden',
3588 );
3589 // ADS
3590 $ads_fields = array(
3591 'autorisation_contestee' => 'hidden',
3592 'cle_acces_citoyen' => 'static',
3593 'contrevenants' => 'hidden',
3594 'date_ait' => 'hidden',
3595 'date_audience' => 'hidden',
3596 'date_affichage' => 'datestatic',
3597 'date_cloture_instruction' => 'hidden',
3598 'date_contradictoire' => 'hidden',
3599 'date_derniere_visite' => 'hidden',
3600 'date_premiere_visite' => 'hidden',
3601 'date_transmission_parquet' => 'hidden',
3602 'dossier_autorisation_type_detaille' => 'hidden',
3603 'dossier_instruction_type' => 'selecthiddenstatic',
3604 'dossier_petitionnaires' => 'hidden',
3605 'dt_ctx_infraction' => 'hidden',
3606 'dt_ctx_regularisable' => 'hidden',
3607 'dt_ctx_synthese_anr' => 'hidden',
3608 'dt_ctx_synthese_nti' => 'hidden',
3609 'ctx_reference_dsj' => 'hidden',
3610 'enjeu_ctx' => 'static',
3611 'instructeur_2' => 'selecthiddenstatic',
3612 'requerants' => 'hidden',
3613 'bailleur' => 'hidden',
3614 'ctx_reference_sagace' => 'hidden',
3615 'pec_metier' => 'selecthiddenstatic',
3616 "consultation_entrante" => 'hidden',
3617 "delai_reponse" => 'hidden',
3618 "type_delai" => 'hidden',
3619 "objet_consultation" => 'hidden',
3620 "date_production_notification" => 'hidden',
3621 "date_premiere_consultation" => 'hidden',
3622 "date_consultation" => 'hidden',
3623 "date_emission" => 'hidden',
3624 "service_consultant_id" => 'hidden',
3625 "service_consultant_libelle" => 'hidden',
3626 "service_consultant_insee" => 'hidden',
3627 "service_consultant_mail" => 'hidden',
3628 "service_consultant_type" => 'hidden',
3629 "service_consultant__siren" => 'hidden',
3630 "etat_consultation" => 'hidden',
3631 "type_consultation" => 'hidden',
3632 "texte_fondement_reglementaire" => 'hidden',
3633 "texte_objet_consultation" => 'hidden',
3634 "dossier_consultation" => 'hidden',
3635 );
3636 // DPC
3637 $dpc_fields = array(
3638 'autorisation_contestee' => 'hidden',
3639 'cle_acces_citoyen' => 'static',
3640 'contrevenants' => 'hidden',
3641 'date_ait' => 'hidden',
3642 'date_audience' => 'hidden',
3643 'date_cloture_instruction' => 'hidden',
3644 'date_contradictoire' => 'hidden',
3645 'date_derniere_visite' => 'hidden',
3646 'date_premiere_visite' => 'hidden',
3647 'date_transmission_parquet' => 'hidden',
3648 'dossier_autorisation_type_detaille' => 'hidden',
3649 'dossier_instruction_type' => 'selecthiddenstatic',
3650 'dossier_petitionnaires' => 'hidden',
3651 'dt_ctx_infraction' => 'hidden',
3652 'dt_ctx_regularisable' => 'hidden',
3653 'dt_ctx_synthese_anr' => 'hidden',
3654 'dt_ctx_synthese_nti' => 'hidden',
3655 'ctx_reference_dsj' => 'hidden',
3656 'enjeu_ctx' => 'static',
3657 'instructeur_2' => 'selecthiddenstatic',
3658 'requerants' => 'hidden',
3659 'bailleur' => 'static',
3660 'ctx_reference_sagace' => 'hidden',
3661 'pec_metier' => 'hidden',
3662 "consultation_entrante" => 'hidden',
3663 "delai_reponse" => 'hidden',
3664 "type_delai" => 'hidden',
3665 "objet_consultation" => 'hidden',
3666 "date_production_notification" => 'hidden',
3667 "date_premiere_consultation" => 'hidden',
3668 "date_consultation" => 'hidden',
3669 "date_emission" => 'hidden',
3670 "service_consultant_id" => 'hidden',
3671 "service_consultant_libelle" => 'hidden',
3672 "service_consultant_insee" => 'hidden',
3673 "service_consultant_mail" => 'hidden',
3674 "service_consultant_type" => 'hidden',
3675 "service_consultant__siren" => 'hidden',
3676 "etat_consultation" => 'hidden',
3677 "type_consultation" => 'hidden',
3678 "texte_fondement_reglementaire" => 'hidden',
3679 "texte_objet_consultation" => 'hidden',
3680 "dossier_consultation" => 'hidden',
3681 );
3682 // COMMUN
3683 $all_fields = array(
3684 'accord_tacite' => 'hidden',
3685 'annee' => 'hidden',
3686 'autres_demandeurs' => 'hidden',
3687 'date_achevement' => 'hidden',
3688 'date_chantier' => 'hidden',
3689 'date_conformite' => 'hidden',
3690 'date_notification_delai' => 'hidden',
3691 'date_rejet' => 'hidden',
3692 'date_retour_contradictoire' => 'hidden',
3693 'delai_incompletude' => 'hidden',
3694 'description' => 'hidden',
3695 'dossier' => 'hidden',
3696 'dossier_arrondissement' => 'hidden',
3697 'dossier_autorisation' => 'hidden',
3698 'dossier_autorisation_libelle' => 'hidden',
3699 'duree_validite' => 'hidden',
3700 'etat_pendant_incompletude' => 'hidden',
3701 'geom' => 'hiddenstatic',
3702 'geom1' => 'hidden',
3703 'incomplet_notifie' => 'hidden',
3704 'incompletude' => 'hidden',
3705 'interface_referentiel_erp' => 'hidden',
3706 'log_instructions' => 'nodisplay',
3707 'om_collectivite' => 'hidden',
3708 'quartier' => 'hidden',
3709 'version' => 'hidden',
3710 'date_modification' => 'hidden',
3711 'hash_sitadel' => 'hidden',
3712 'depot_electronique' => 'hidden',
3713 'version_clos' => 'hidden',
3714 'initial_dt' => 'hidden',
3715 'adresse_normalisee' => 'hidden',
3716 'adresse_normalisee_json' => 'hidden',
3717 'streetview' => 'hidden',
3718 'numerotation_type' => 'hidden',
3719 'numerotation_dep' => 'hidden',
3720 'numerotation_com' => 'hidden',
3721 'numerotation_division' => 'hidden',
3722 'numerotation_suffixe' => 'hidden',
3723 'numerotation_entite' => 'hidden',
3724 'numerotation_num' => 'hidden',
3725 'numerotation_num_suffixe' => 'hidden',
3726 'numerotation_num_entite' => 'hidden',
3727 'lien_iiue' => 'hidden',
3728 'dossier_parent' => 'hidden',
3729 'terrain_superficie_calculee' => 'static',
3730 'nature_travaux' => 'static',
3731 );
3732 if (isset($parameters['option_afficher_division'])
3733 && $parameters['option_afficher_division'] !== 'true') {
3734 $all_fields['division'] = 'hidden';
3735 }
3736 if (isset($parameters['option_sig'])
3737 && $parameters['option_sig'] !== 'sig_interne'
3738 && $parameters['option_sig'] !== 'sig_externe'){
3739 $all_fields['geom'] = 'hidden';
3740 }
3741
3742 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3743 $all_fields['date_depot_mairie'] = 'hiddenstaticdate';
3744 } else {
3745 $all_fields['date_depot_mairie'] = 'hidden';
3746 }
3747
3748 // Affichage des identifiants techniques Plat'AU
3749 if ($crud === 'read'
3750 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
3751 && ($this->f->is_option_mode_service_consulte_enabled() !== true
3752 || ($this->f->is_option_mode_service_consulte_enabled() === true
3753 && ($this->get_source_depot_from_demande() === PLATAU
3754 || $this->get_source_depot_from_demande() === PORTAL)))) {
3755 //
3756 $all_fields['lien_iiue'] = 'jsontotab';
3757 }
3758
3759 //
3760 // Gestion du contexte
3761 //
3762
3763 // AJOUTER, MODIFIER
3764 if ($crud === 'create' OR $crud === 'update') {
3765
3766 $all_fields['avis_decision'] = 'selecthiddenstatic';
3767 $all_fields['etat'] = 'hiddenstatic';
3768 $all_fields['terrain'] = 'hiddenstatic';
3769 $all_fields['terrain_superficie_calculee'] = 'hiddenstatic';
3770 //
3771 $ads_fields['a_qualifier'] = 'checkbox';
3772 $ads_fields['accord_tacite'] = 'hiddenstatic';
3773 $ads_fields['autorite_competente'] = 'selecthiddenstatic';
3774 $ads_fields['date_achevement'] = 'hiddenstaticdate';
3775 $ads_fields['date_chantier'] = 'hiddenstaticdate';
3776 $ads_fields['date_conformite'] = 'hiddenstaticdate';
3777 $ads_fields['date_decision'] = 'hiddenstaticdate';
3778 $ads_fields['date_affichage'] = 'hiddenstaticdate';
3779 $ads_fields['date_depot'] = 'hiddenstaticdate';
3780 //
3781 $ce_fields['a_qualifier'] = 'checkbox';
3782 $ce_fields['accord_tacite'] = 'hiddenstatic';
3783 $ce_fields['autorite_competente'] = 'selecthiddenstatic';
3784 $ce_fields['date_achevement'] = 'hiddenstaticdate';
3785 $ce_fields['date_chantier'] = 'hiddenstaticdate';
3786 $ce_fields['date_conformite'] = 'hiddenstaticdate';
3787 $ce_fields['date_decision'] = 'hiddenstaticdate';
3788 $ce_fields['date_affichage'] = 'hiddenstaticdate';
3789 $ce_fields['date_depot'] = 'hiddenstaticdate';
3790 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3791 $ads_fields['date_depot_mairie'] = 'date';
3792 $ce_fields['date_depot_mairie'] = 'date';
3793 } else {
3794 $ads_fields['date_depot_mairie'] = 'hidden';
3795 $ce_fields['date_depot_mairie'] = 'hidden';
3796 }
3797 $ads_fields['date_dernier_depot'] = 'hiddenstaticdate';
3798 $ads_fields['date_notification_delai'] = 'hiddenstaticdate';
3799 $ads_fields['date_rejet'] = 'hiddenstaticdate';
3800 $ads_fields['date_validite'] = 'hiddenstaticdate';
3801 $ads_fields['delai'] = 'hiddenstatic';
3802 $ads_fields['description_projet'] = 'hiddenstatic';
3803 $ads_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3804 $ads_fields['shon_calcul'] = 'hiddenstatic';
3805 $ads_fields['tax_mtn_part_commu'] = 'hidden';
3806 $ads_fields['tax_mtn_part_depart'] = 'hidden';
3807 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3808 $ads_fields['tax_mtn_total'] = 'hidden';
3809 $ads_fields['tax_mtn_rap'] = 'hidden';
3810 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3811 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3812 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3813 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3814 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3815 $ads_fields['terrain_surface_calcul'] = 'hiddenstatic';
3816 //
3817 $ce_fields['date_dernier_depot'] = 'hiddenstaticdate';
3818 $ce_fields['date_notification_delai'] = 'hiddenstaticdate';
3819 $ce_fields['date_rejet'] = 'hiddenstaticdate';
3820 $ce_fields['date_validite'] = 'hiddenstaticdate';
3821 $ce_fields['delai'] = 'hiddenstatic';
3822 $ce_fields['description_projet'] = 'hiddenstatic';
3823 $ce_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3824 $ce_fields['shon_calcul'] = 'hiddenstatic';
3825 $ce_fields['tax_mtn_part_commu'] = 'hidden';
3826 $ce_fields['tax_mtn_part_depart'] = 'hidden';
3827 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3828 $ce_fields['tax_mtn_total'] = 'hidden';
3829 $ce_fields['tax_mtn_rap'] = 'hidden';
3830 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3831 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3832 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3833 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3834 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3835 $ce_fields['terrain_surface_calcul'] = 'hiddenstatic';
3836 //
3837 $dpc_fields['a_qualifier'] = 'checkbox';
3838 $dpc_fields['accord_tacite'] = 'hiddenstatic';
3839 $dpc_fields['autorite_competente'] = 'selecthiddenstatic';
3840 $dpc_fields['date_achevement'] = 'hiddenstaticdate';
3841 $dpc_fields['date_chantier'] = 'hiddenstaticdate';
3842 $dpc_fields['date_conformite'] = 'hiddenstaticdate';
3843 $dpc_fields['date_decision'] = 'hiddenstaticdate';
3844 $dpc_fields['date_depot'] = 'hiddenstaticdate';
3845 $dpc_fields['date_depot_mairie'] = 'hiddenstaticdate';
3846 $dpc_fields['date_dernier_depot'] = 'hiddenstaticdate';
3847 $dpc_fields['date_notification_delai'] = 'hiddenstaticdate';
3848 $dpc_fields['date_rejet'] = 'hiddenstaticdate';
3849 $dpc_fields['date_validite'] = 'hiddenstaticdate';
3850 $dpc_fields['delai'] = 'hiddenstatic';
3851 $dpc_fields['description_projet'] = 'hiddenstatic';
3852 $dpc_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3853 $dpc_fields['shon_calcul'] = 'hiddenstatic';
3854 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3855 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3856 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3857 $dpc_fields['tax_mtn_total'] = 'hidden';
3858 $dpc_fields['tax_mtn_rap'] = 'hidden';
3859 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3860 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3861 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3862 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3863 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3864 $dpc_fields['terrain_surface_calcul'] = 'hiddenstatic';
3865 //
3866 $re_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3867 $re_fields['dossier_petitionnaires'] = 'static';
3868 $re_fields['requerants'] = 'hiddenstatic';
3869 $inf_fields['contrevenants'] = 'hiddenstatic';
3870 $inf_fields['dt_ctx_synthese_anr'] = 'hiddenstatic';
3871 $inf_fields['dt_ctx_synthese_nti'] = 'hiddenstatic';
3872 //
3873 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3874 if ($this->get_source_depot_from_demande() === PLATAU
3875 || $this->get_source_depot_from_demande() === PORTAL) {
3876 //
3877 $ce_fields["consultation_entrante"] = 'hidden';
3878 $ce_fields["delai_reponse"] = 'static';
3879 $ce_fields["type_delai"] = 'static';
3880 $ce_fields["objet_consultation"] = 'static';
3881 $ce_fields["date_production_notification"] = 'datestatic';
3882 $ce_fields["date_premiere_consultation"] = 'datestatic';
3883 $ce_fields["date_consultation"] = 'datestatic';
3884 $ce_fields["date_emission"] = 'datestatic';
3885 $ce_fields["service_consultant_id"] = 'static';
3886 $ce_fields["service_consultant_libelle"] = 'static';
3887 $ce_fields["service_consultant_insee"] = 'static';
3888 $ce_fields["service_consultant_mail"] = 'static';
3889 $ce_fields["service_consultant_type"] = 'static';
3890 $ce_fields["service_consultant__siren"] = 'static';
3891 $ce_fields["etat_consultation"] = 'static';
3892 $ce_fields["type_consultation"] = 'static';
3893 $ce_fields["texte_fondement_reglementaire"] = 'static';
3894 $ce_fields["texte_objet_consultation"] = 'static';
3895 $ce_fields["dossier_consultation"] = 'hidden';
3896 }
3897 // Si l'état du dossier est incomplet
3898 if ($this->is_incomplet_notifie()) {
3899 // On cache les dates de complétude et de limite d'instruction
3900 $ads_fields['date_complet'] = 'hidden';
3901 $ads_fields['date_limite'] = 'hidden';
3902 $ads_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3903 $ads_fields['evenement_suivant_tacite'] ='hidden';
3904 $ads_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3905 //
3906 $dpc_fields['date_complet'] = 'hidden';
3907 $dpc_fields['date_limite'] = 'hidden';
3908 $dpc_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3909 $dpc_fields['evenement_suivant_tacite'] ='hidden';
3910 $dpc_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3911 //
3912 $ce_fields['date_complet'] = 'hidden';
3913 $ce_fields['date_limite'] = 'hidden';
3914 $ce_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3915 $ce_fields['evenement_suivant_tacite'] ='hidden';
3916 $ce_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3917 } else {
3918 // Sinon on cache la date de limite d'incomplétude
3919 $ads_fields['date_limite_incompletude'] = 'hidden';
3920 $ads_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3921 $ads_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3922 $ads_fields['date_complet'] = 'hiddenstaticdate';
3923 $ads_fields['date_limite'] = 'hiddenstaticdate';
3924 //
3925 $dpc_fields['date_limite_incompletude'] = 'hidden';
3926 $dpc_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3927 $dpc_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3928 $dpc_fields['date_complet'] = 'hiddenstaticdate';
3929 $dpc_fields['date_limite'] = 'hiddenstaticdate';
3930 //
3931 $ce_fields['date_limite_incompletude'] = 'hidden';
3932 $ce_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3933 $ce_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3934 $ce_fields['date_complet'] = 'hiddenstaticdate';
3935 $ce_fields['date_limite'] = 'hiddenstaticdate';
3936 }
3937
3938 // MODIFIER
3939 if ($crud ==='update') {
3940 $all_fields['dossier_libelle'] = 'hiddenstatic';
3941 $ads_fields['dossier_petitionnaire'] = 'static';
3942 $dpc_fields['dossier_petitionnaire'] = 'static';
3943 $ce_fields['dossier_petitionnaire'] = 'static';
3944 $inf_fields['numero_versement_archive'] = 'text';
3945 $re_fields['numero_versement_archive'] = 'text';
3946 $all_fields['nature_travaux'] = 'select_multiple';
3947 //
3948 if ($this->f->isAccredited("dossier_modifier_instructeur")) {
3949 $all_fields['instructeur'] = 'select';
3950 $inf_fields['instructeur_2'] = 'select';
3951 $ads_fields['instructeur_2'] = 'select';
3952 $dpc_fields['instructeur_2'] = 'select';
3953 $ce_fields['instructeur_2'] = 'select';
3954 } else {
3955 $all_fields['instructeur'] = 'selecthiddenstatic';
3956 $inf_fields['instructeur_2'] = 'selecthiddenstatic';
3957 $ads_fields['instructeur_2'] = 'selecthiddenstatic';
3958 $dpc_fields['instructeur_2'] = 'selecthiddenstatic';
3959 $ce_fields['instructeur_2'] = 'selecthiddenstatic';
3960 }
3961 //
3962 if (isset($parameters['option_afficher_division'])
3963 && $parameters['option_afficher_division'] === 'true') {
3964 $all_fields['division'] = 'selecthiddenstatic';
3965 if ($this->f->isAccredited("dossier_modifier_division")) {
3966 $all_fields['division'] = 'select';
3967 }
3968 }
3969 // Si l'utilisateur ne peut pas qualifier un DI (guichet unique & guichet et suivi)
3970 if (!$this->f->isAccredited(array("dossier_instruction","dossier_instruction_qualifier"), "OR")) {
3971 // Il ne peut pas modifier les champs suivants
3972 $ads_fields['numero_versement_archive'] = 'hiddenstatic';
3973 $ads_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3974 $ads_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3975 $ads_fields['erp'] = 'checkboxhiddenstatic';
3976 $ads_fields['a_qualifier'] = 'checkboxhiddenstatic';
3977 //
3978 $dpc_fields['numero_versement_archive'] = 'hiddenstatic';
3979 $dpc_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3980 $dpc_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3981 $dpc_fields['erp'] = 'checkboxhiddenstatic';
3982 $dpc_fields['a_qualifier'] = 'checkboxhiddenstatic';
3983 //
3984 $ce_fields['numero_versement_archive'] = 'hiddenstatic';
3985 $ce_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3986 $ce_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3987 $ce_fields['erp'] = 'checkboxhiddenstatic';
3988 $ce_fields['a_qualifier'] = 'checkboxhiddenstatic';
3989 }
3990 // Le profil Qualificateur peut modifier seulement les champs
3991 // autorite_competente, a_qualifier et erp
3992 if ($this->f->isUserQualificateur()) {
3993 $ads_fields['numero_versement_archive'] = 'static';
3994 $ads_fields['enjeu_urba'] = 'checkboxstatic';
3995 $ads_fields['enjeu_erp'] = 'checkboxstatic';
3996 //
3997 $dpc_fields['numero_versement_archive'] = 'static';
3998 $dpc_fields['enjeu_urba'] = 'checkboxstatic';
3999 $dpc_fields['enjeu_erp'] = 'checkboxstatic';
4000 //
4001 $ce_fields['numero_versement_archive'] = 'static';
4002 $ce_fields['enjeu_urba'] = 'checkboxstatic';
4003 $ce_fields['enjeu_erp'] = 'checkboxstatic';
4004 }
4005 // Le dossier ne doit pas être instruit
4006 if ($this->has_only_recepisse() === true
4007 && $this->getStatut() !== 'cloture') {
4008 //
4009 $all_fields['date_depot'] = 'date';
4010 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
4011 $all_fields['date_depot_mairie'] = 'date';
4012 } else {
4013 $all_fields['date_depot_mairie'] = 'hidden';
4014 }
4015 }
4016 // Gestion de la case à cocher ERP en cas d'interfaçage avec le
4017 // référentiel ERP
4018 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true) {
4019 // Par défaut la case à cocher ERP est non modifiable
4020 $all_fields['erp'] = 'checkboxhiddenstatic';
4021 // Si le type du dossier d'instruction en cours est présent
4022 // dans les paramètres autorisant l'interfaçage avec le référentiel ERP
4023 if (isset($parameters['erp__dossier__nature__at']) === true
4024 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__at']) {
4025 //
4026 $all_fields['erp'] = 'checkbox';
4027 }
4028 if (isset($parameters['erp__dossier__nature__pc']) === true
4029 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__pc']
4030 && isset($parameters['erp__dossier__type_di__pc']) === true) {
4031 //
4032 $erp_di_pc = explode(";", $parameters['erp__dossier__type_di__pc']);
4033 if (is_array($erp_di_pc) === true
4034 && in_array($this->getVal("dossier_instruction_type"), $erp_di_pc) === true) {
4035 //
4036 $all_fields['erp'] = 'checkbox';
4037 }
4038 }
4039 }
4040 // modification de la date d'affichage pour les ADS
4041 if ($this->f->isAccredited($this->get_absolute_class_name()."_modifier_date_affichage")) {
4042 $ads_fields['date_affichage'] = 'date';
4043 $ce_fields['date_affichage'] = 'date';
4044 }
4045
4046 // pas de modificiation de la commune associée au dossier (si l'option est activée)
4047 if ($this->f->is_option_dossier_commune_enabled($this->getVal('om_collectivite'))) {
4048 $ads_fields['commune'] = 'selecthiddenstatic';
4049 $ce_fields['commune'] = 'selecthiddenstatic';
4050 }
4051 }
4052 }
4053 // MODIFIER, SUPPRIMER, CONSULTER
4054 if ($crud !== 'create') {
4055 $re_fields['autorisation_contestee'] = 'selecthiddenstatic';
4056 $all_fields['date_demande'] = 'hidden';
4057 // La collectivité n'est jamais modifiable
4058 if ($_SESSION['niveau'] == 2) {
4059 $all_fields['om_collectivite'] = 'selecthiddenstatic';
4060 }
4061 // Instance du paramétrage des taxes
4062 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
4063 // Instance de cerfa
4064 $inst_cerfa = $this->get_inst_cerfa();
4065
4066 // Gestion du secteur pour la taxe d'aménagement
4067 // MODIFIER
4068 if ($crud === 'update') {
4069 //
4070 if ($this->is_in_context_of_foreign_key("tax_secteur", $this->getParameter("retourformulaire"))) {
4071 $ads_fields['tax_secteur'] = 'selecthiddenstatic';
4072 $dpc_fields['tax_secteur'] = 'selecthiddenstatic';
4073 $ce_fields['tax_secteur'] = 'selecthiddenstatic';
4074 } else {
4075 $ads_fields['tax_secteur'] = 'select';
4076 $dpc_fields['tax_secteur'] = 'select';
4077 $ce_fields['tax_secteur'] = 'select';
4078 }
4079 }
4080 // SUPPRIMER
4081 if ($crud === 'delete') {
4082 //
4083 $ads_fields['tax_secteur'] = 'selectstatic';
4084 $dpc_fields['tax_secteur'] = 'selectstatic';
4085 $ce_fields['tax_secteur'] = 'selectstatic';
4086 }
4087 // CONSULTER
4088 if ($crud === 'read') {
4089 //
4090 $ads_fields['tax_secteur'] = 'selectstatic';
4091 $dpc_fields['tax_secteur'] = 'selectstatic';
4092 $ce_fields['tax_secteur'] = 'selectstatic';
4093 $inf_fields['numero_versement_archive'] = 'hiddenstatic';
4094 $re_fields['numero_versement_archive'] = 'hiddenstatic';
4095 }
4096
4097 // Si l'option de simulation est activée pour la collectivité du
4098 // dossier, l'utilisateur connecté a la permissions de voir
4099 // la simulation des taxes, la collectivité à un paramétrage pour
4100 // les taxes et que le cerfa du dossier à les champs requis
4101 if ($this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true
4102 && $this->f->isAccredited("dossier_instruction_simulation_taxes") === true
4103 && $inst_taxe_amenagement !== null
4104 && $inst_cerfa->can_simulate_taxe_amenagement() === true) {
4105
4106 // Si ce n'est pas une commune d'Île-de-France
4107 if ($inst_taxe_amenagement->getVal('en_ile_de_france') == 'f') {
4108 //
4109 $ads_fields['tax_mtn_part_reg'] = 'hidden';
4110 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4111 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
4112 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4113 $ce_fields['tax_mtn_part_reg'] = 'hidden';
4114 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4115 }
4116 } else {
4117 // SUPPRIMER, CONSULTER
4118 if ($crud === 'delete' OR $crud ==='read') {
4119 $ads_fields['tax_mtn_part_commu'] = 'hidden';
4120 $ads_fields['tax_mtn_part_depart'] = 'hidden';
4121 $ads_fields['tax_mtn_part_reg'] = 'hidden';
4122 $ads_fields['tax_mtn_total'] = 'hidden';
4123 $ads_fields['tax_mtn_rap'] = 'hidden';
4124 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4125 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4126 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4127 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
4128 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4129 //
4130 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
4131 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
4132 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
4133 $dpc_fields['tax_mtn_total'] = 'hidden';
4134 $dpc_fields['tax_mtn_rap'] = 'hidden';
4135 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4136 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4137 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4138 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
4139 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4140 //
4141 $ce_fields['tax_mtn_part_commu'] = 'hidden';
4142 $ce_fields['tax_mtn_part_depart'] = 'hidden';
4143 $ce_fields['tax_mtn_part_reg'] = 'hidden';
4144 $ce_fields['tax_mtn_total'] = 'hidden';
4145 $ce_fields['tax_mtn_rap'] = 'hidden';
4146 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4147 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4148 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4149 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
4150 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4151 }
4152 }
4153 }
4154 // CONSULTER
4155 if ($crud ==='read') {
4156
4157 $ads_fields['geom'] = 'static';
4158 $ads_fields['a_qualifier'] = 'checkboxstatic';
4159 $ads_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4160 //
4161 $dpc_fields['geom'] = 'static';
4162 $dpc_fields['a_qualifier'] = 'checkboxstatic';
4163 $dpc_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4164 //
4165 $ce_fields['geom'] = 'static';
4166 $ce_fields['a_qualifier'] = 'checkboxstatic';
4167 $ce_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4168
4169 $all_fields['nature_travaux'] = 'select_multiple_static';
4170
4171 // Affiche le champ streetview si l'option est active
4172 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true) {
4173 $all_fields['streetview'] = 'static';
4174 }
4175
4176 // Si l'état du dossier est incomplet
4177 if ($this->is_incomplet_notifie()) {
4178 // on cache les dates de complétude et de limite d'instruction
4179 $ads_fields['date_complet'] = 'hidden';
4180 $ads_fields['date_limite'] = 'hidden';
4181 $ads_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4182 $ads_fields['evenement_suivant_tacite'] = 'hidden';
4183 //
4184 $dpc_fields['date_complet'] = 'hidden';
4185 $dpc_fields['date_limite'] = 'hidden';
4186 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4187 $dpc_fields['evenement_suivant_tacite'] = 'hidden';
4188 //
4189 $ce_fields['date_complet'] = 'hidden';
4190 $ce_fields['date_limite'] = 'hidden';
4191 $ce_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4192 $ce_fields['evenement_suivant_tacite'] = 'hidden';
4193 } else {
4194 // sinon on cache la date de limite d'incomplétude
4195 $ads_fields['date_limite_incompletude'] = 'hidden';
4196 $ads_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4197 $ads_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4198 //
4199 $dpc_fields['date_limite_incompletude'] = 'hidden';
4200 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4201 $dpc_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4202 //
4203 $ce_fields['date_limite_incompletude'] = 'hidden';
4204 $ce_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4205 $ce_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4206 }
4207 if (isset($parameters['option_arrondissement'])
4208 && $parameters['option_arrondissement'] === 'true') {
4209 $all_fields['dossier_arrondissement'] = 'static';
4210 }
4211 //
4212 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
4213 if ($this->get_source_depot_from_demande() === PLATAU
4214 || $this->get_source_depot_from_demande() === PORTAL) {
4215 //
4216 $ce_fields["consultation_entrante"] = 'hidden';
4217 $ce_fields["delai_reponse"] = 'static';
4218 $ce_fields["type_delai"] = 'static';
4219 $ce_fields["objet_consultation"] = 'static';
4220 $ce_fields["date_production_notification"] = 'datestatic';
4221 $ce_fields["date_premiere_consultation"] = 'datestatic';
4222 $ce_fields["date_consultation"] = 'datestatic';
4223 $ce_fields["date_emission"] = 'datestatic';
4224 $ce_fields["service_consultant_id"] = 'static';
4225 $ce_fields["service_consultant_libelle"] = 'static';
4226 $ce_fields["service_consultant_insee"] = 'static';
4227 $ce_fields["service_consultant_mail"] = 'static';
4228 $ce_fields["service_consultant_type"] = 'static';
4229 $ce_fields["service_consultant__siren"] = 'static';
4230 $ce_fields["etat_consultation"] = 'static';
4231 $ce_fields["type_consultation"] = 'static';
4232 $ce_fields["texte_fondement_reglementaire"] = 'static';
4233 $ce_fields["texte_objet_consultation"] = 'static';
4234 $ce_fields["dossier_consultation"] = 'hidden';
4235 }
4236 }
4237 // SUPPRIMER
4238 if($crud === 'delete') {
4239 // Cache tous les champs execepté le libellé du dossier
4240 foreach ($this->champs as $champ) {
4241 $all_fields[$champ] = 'hidden';
4242 }
4243 $all_fields['dossier_libelle'] = 'hiddenstatic';
4244 }
4245
4246 $all_fields['etat_transmission_platau'] = 'hidden';
4247 if ($crud !== 'create') {
4248 //
4249 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
4250 if ($inst_datd->getVal('dossier_platau') === 't') {
4251 //
4252 $all_fields['etat_transmission_platau'] = 'selecthiddenstatic';
4253 }
4254 }
4255
4256
4257 if ($crud == 'create' || $crud == 'update') {
4258 $required_fields_platau = $this->list_platau_required_fields_dossier;
4259 if ($this->f->is_option_mode_service_consulte_enabled() === false) {
4260 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
4261 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
4262 //
4263 foreach ($required_fields_platau as $required_field_platau) {
4264 $champ = explode('.', $required_field_platau)[1];
4265 if (in_array($champ, $this->champs)) {
4266 $form->setType($champ ,$form->type[$champ].'_demat_color');
4267 }
4268 }
4269 }
4270 }
4271 }
4272
4273 // Dans tous les cas si le champ accord_tacite est à non on veut insérer
4274 // du texte dans le champ "au terme du délai" et donc ce n'est plus un
4275 // selecthiddenstatic
4276 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4277 if ($this->is_incomplet_notifie() === false) {
4278 $all_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4279 $ads_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4280 $ce_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4281 $dpc_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4282 } else {
4283 $all_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4284 $ads_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4285 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4286 $ce_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4287 }
4288 }
4289
4290 // Lorsque le statut de dossier est "cloture" on cache le champ "au terme du délai"
4291 if ($this->getStatut() === 'cloture') {
4292 $all_fields['evenement_suivant_tacite'] = 'hidden';
4293 $ads_fields['evenement_suivant_tacite'] = 'hidden';
4294 $dpc_fields['evenement_suivant_tacite'] = 'hidden';
4295 $ce_fields['evenement_suivant_tacite'] = 'hidden';
4296 }
4297
4298 //
4299 // Typage
4300 //
4301
4302 switch ($groupe) {
4303 case 'CTX IN':
4304 $this->manage_type($form, $inf_fields);
4305 break;
4306 case 'CTX RE':
4307 $this->manage_type($form, $re_fields);
4308 break;
4309 case 'ADS':
4310 $this->manage_type($form, $ads_fields);
4311 break;
4312 case 'DPC':
4313 $this->manage_type($form, $dpc_fields);
4314 break;
4315 case 'CONSULTATION ENTRANTE':
4316 $this->manage_type($form, $ce_fields);
4317 break;
4318 }
4319 $this->manage_type($form, $all_fields);
4320 }
4321
4322
4323 /**
4324 * Gestion du typage des champs
4325 *
4326 * @param object $form formulaire instancié
4327 * @param array $fields tableau associatif des champs avec leur widget de formulaire en valeur
4328 * @return void
4329 */
4330 protected function manage_type($form, $fields) {
4331 foreach ($this->champs as $key => $field) {
4332 if (array_key_exists($field, $fields) === true) {
4333 $form->setType($field, $fields[$field]);
4334 }
4335 }
4336 }
4337
4338
4339 /**
4340 * Retourne le nombre de parcelles qu'à en commun le dossier passé en
4341 * paramètre avec les dossiers contentieux en cours. Le nombre de parcelles
4342 * est groupé par type de dossier d'autorisation : RE ou IN.
4343 * Permet également de vérifier si au moins un des dossiers contentieux liés,
4344 * est clôturé ou non, ce résultat est regroupé par type RE ou IN.
4345 *
4346 * @param string $di identifiant du DI
4347 *
4348 * @return array
4349 */
4350 function get_data_dossier_ctx_lie($di) {
4351 $qres = $this->f->get_all_results_from_db_query(
4352 sprintf(
4353 'SELECT
4354 dossier_autorisation_type.code,
4355 dossier_ctx.dossier,
4356 etat.statut
4357 FROM %1$sdossier
4358 LEFT JOIN %1$sdossier_parcelle
4359 ON dossier.dossier = dossier_parcelle.dossier
4360 LEFT JOIN %1$sdossier_parcelle as parcelle_ctx
4361 ON dossier_parcelle.libelle = parcelle_ctx.libelle
4362 AND dossier_parcelle.dossier != parcelle_ctx.dossier
4363 LEFT JOIN %1$sdossier as dossier_ctx
4364 ON dossier_ctx.dossier = parcelle_ctx.dossier
4365 INNER JOIN %1$setat
4366 ON dossier_ctx.etat = etat.etat
4367 LEFT JOIN %1$sdossier_autorisation
4368 ON dossier_ctx.dossier_autorisation = dossier_autorisation.dossier_autorisation
4369 LEFT JOIN %1$sdossier_autorisation_type_detaille
4370 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4371 = dossier_autorisation.dossier_autorisation_type_detaille
4372 LEFT JOIN %1$sdossier_autorisation_type
4373 ON dossier_autorisation_type_detaille.dossier_autorisation_type
4374 = dossier_autorisation_type.dossier_autorisation_type
4375 WHERE
4376 dossier.dossier = \'%2$s\'
4377 AND (dossier_autorisation_type.code = \'RE\'
4378 OR dossier_autorisation_type.code = \'IN\')',
4379 DB_PREFIXE,
4380 $this->f->db->escapeSimple($di)
4381 ),
4382 array(
4383 'origin' => __METHOD__
4384 )
4385 );
4386
4387 // Nombre de dossier de chaque type
4388 $nb_re_inf = array('re' => 0, 'inf' => 0);
4389 // Au moins un dossier est clôturé, par type
4390 $cloture_re_inf = array('re' => true, 'inf' => true);
4391 foreach ($qres['result'] as $row) {
4392 // Compte le nombre de RE et vérifie si au moins l'un d'entre eux
4393 // n'est pas clôturé
4394 if ($row["code"] == "RE"){
4395 $nb_re_inf['re']++;
4396 if ($row['statut'] != "cloture") {
4397 $cloture_re_inf['re'] = false;
4398 }
4399 }
4400 // Compte le nombre de IN et vérifie si au moins l'un d'entre eux
4401 // n'est pas clôturé
4402 if ($row["code"] == "IN"){
4403 $nb_re_inf['inf']++;
4404 if ($row['statut'] != "cloture") {
4405 $cloture_re_inf['inf'] = false;
4406 }
4407 }
4408 }
4409
4410 // Tableau de résultat
4411 $result = array(
4412 'nb_re_inf' => $nb_re_inf,
4413 'cloture_re_inf' => $cloture_re_inf,
4414 );
4415 return $result;
4416 }
4417
4418 /**
4419 * SETTER_FORM - setVal (setVal).
4420 *
4421 * @return void
4422 */
4423 function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
4424 // parent::setVal($form, $maj, $validation);
4425 //
4426 $this->maj=$maj;
4427
4428 if ($this->f->is_option_sig_enabled($this->getVal("om_collectivite")) === true
4429 && $this->f->issetSIGParameter($this->getVal("dossier")) === true) {
4430
4431 // lien vers le SIG
4432 $geoLinksHtml = $this->getGeolocalisationLink();
4433 $form->setVal("geom", $geoLinksHtml);
4434 }
4435 // si l'option 'streetview' est activée ajoute un lien vers Google Maps Street View
4436 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true
4437 && $maj == 3) {
4438 //
4439 $gStreetViewLinkHtml = $this->getGoogleMapsStreetViewLink();
4440 $form->setVal("streetview", $gStreetViewLinkHtml);
4441 }
4442 //
4443 $affichage_form = $this->get_type_affichage_formulaire();
4444 if ($affichage_form === "ADS" || $affichage_form === "CONSULTATION ENTRANTE") {
4445 // Dans le cas d'un dépôt électronique un pictogramme apparait devant le demandeur
4446 if ($maj == 1 || $maj == 2 || $maj == 3) {
4447 if ($this->getVal("depot_electronique") === "t"
4448 || $this->getVal("depot_electronique") === true
4449 || $this->getVal("depot_electronique") === 1) {
4450 //
4451 $form->setVal(
4452 "dossier_petitionnaire",
4453 sprintf(
4454 '<span class="om-icon om-icon-16 om-icon-fix depot-electronique-16" title="%s"> </span>%s',
4455 "Dépôt électronique",
4456 $this->getVal("dossier_petitionnaire")
4457 )
4458 );
4459 }
4460 }
4461 if ($maj == 3) {
4462 // Attribution d'une classe CSS aux éventuelles pastilles indiquant les recours et infractions
4463 $re_inf = $this->get_data_dossier_ctx_lie($this->getVal("dossier"));
4464 $message = "";
4465 if ($re_inf['nb_re_inf']["re"] > 0) {
4466 // On teste si le dossier recours est clôturé (vert) ou non (orange) pour lui attribuer une couleur via la classe CSS
4467 $message = sprintf(
4468 '<span class=\'label %1$s\' name= \'%2$s\' title=\'%3$s\'> %2$s </span>',
4469 $re_inf['cloture_re_inf']['re'] ? "label-success" : "label-warning",
4470 __("RE"),
4471 __("Au moins un dossier de recours contentieux ou gracieux en cours concerne les références cadastrales du dossier courant.")
4472 );
4473 if ($re_inf['nb_re_inf']["inf"] > 0) {
4474 $message .= " ";
4475 }
4476 }
4477 if ($re_inf['nb_re_inf']["inf"] > 0) {
4478 // On teste si le dossier infraction est clôturé (vert) ou non (rouge) pour lui attribuer une couleur via la classe CSS
4479 $message .= sprintf(
4480 '<span class=\'label %1$s\' name= \'%2$s\' title=\'%3$s\'> %2$s </span>',
4481 $re_inf['cloture_re_inf']['inf'] ? "label-success" : "label-important",
4482 __("IN"),
4483 __("Au moins un dossier d'infraction en cours concerne les références cadastrales du dossier courant.")
4484 );
4485 }
4486 $form->setVal("enjeu_ctx", $message);
4487 }
4488 } elseif ($affichage_form === "CTX RE") {
4489 // Récupération des demandeurs liés au dossier
4490 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4491 //
4492 $requerants = "";
4493 if ($this->getVal("requerants") != "") {
4494 $requerants = $this->getVal("requerants");
4495 if (isset($this->valIdDemandeur["requerant"]) === true
4496 && count($this->valIdDemandeur["requerant"]) > 0) {
4497 //
4498 $requerants .= " "._("et autres");
4499 }
4500 }
4501 $form->setVal("requerants", $requerants);
4502 //
4503 $dossier_petitionnaires = "";
4504 if ($this->getVal("dossier_petitionnaire") != "") {
4505 $dossier_petitionnaires = $this->getVal("dossier_petitionnaire");
4506 }
4507 if (isset($this->valIdDemandeur["petitionnaire"]) === true
4508 && count($this->valIdDemandeur["petitionnaire"]) > 0) {
4509 //
4510 $dossier_petitionnaires .= " "._("et autres");
4511 }
4512 $form->setVal("dossier_petitionnaires", $dossier_petitionnaires);
4513 } elseif ($affichage_form === "CTX IN") {
4514 // Récupération des demandeurs liés au dossier
4515 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4516 //
4517 $contrevenants = "";
4518 if ($this->getVal("contrevenants") != "") {
4519 $contrevenants = $this->getVal("contrevenants");
4520 if (isset($this->valIdDemandeur["contrevenant"]) === true
4521 && count($this->valIdDemandeur["contrevenant"]) > 0) {
4522 //
4523 $contrevenants .= " "._("et autres");
4524 }
4525 }
4526 $form->setVal("contrevenants", $contrevenants);
4527 } elseif ($affichage_form === "DPC") {
4528 // Récupération des demandeurs liés au dossier
4529 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4530 //
4531 $bailleurs = "";
4532 if ($this->getVal("bailleurs") != "") {
4533 $bailleurs = $this->getVal("bailleurs");
4534 if (isset($this->valIdDemandeur["bailleur"]) === true
4535 && count($this->valIdDemandeur["bailleur"]) > 0) {
4536 //
4537 $bailleurs .= " "._("et autres");
4538 }
4539 }
4540 $form->setVal("bailleurs", $bailleurs);
4541 }
4542 //
4543 if ($validation == 0) {
4544 if ($maj == 0) {
4545 $form->setVal("annee", date("y"));
4546 $form->setVal("date_demande", date("Y-m-d"));
4547 $form->setVal("date_depot", date("Y-m-d"));
4548 $form->setVal("accord_tacite", "Non");
4549 $form->setVal("etat", "initialiser");
4550 }
4551 }
4552 //
4553 if ($maj == 3) {
4554 $form->setVal("lien_iiue", $this->get_json_lien_iiue());
4555 }
4556
4557 // Dans tous les cas si le champ accord_tacite est à non on veut insérer du texte dans le champ "au terme du délai"
4558 if ($this->is_incomplet_notifie() === false) {
4559 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4560 $form->setVal('evenement_suivant_tacite', __('N/A'));
4561 }
4562 } else {
4563 // Si le champ accord_tacite est à false alors on met "N/A" dans le champ evenement_suivant_tacite_incompletude
4564 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4565 $form->setVal('evenement_suivant_tacite_incompletude', __('N/A'));
4566 }
4567 }
4568 }
4569
4570 /**
4571 * getGeolocalisationLink retourne le code HTML affichant l'icone du globe, ainsi que
4572 * les coordonnées du centroide du dossier, le tout étant un lien vers le SIG.
4573 *
4574 * @return string Lien vers le SIG
4575 */
4576 function getGeolocalisationLink() {
4577 //
4578 $link = "<a id='action-form-localiser'".
4579 " target='_SIG' href='".OM_ROUTE_FORM."&obj=dossier_instruction&action=140&idx=".$this->getVal("dossier")."'>".
4580 "<span class='om-icon om-icon-16 om-icon-fix sig-16' title='Localiser'>Localiser</span> ".
4581 $this->getVal('geom').
4582 " </a>";
4583 $nogeoloc = "<div class='no-geoloc_label'><span class='om-icon om-icon-16 om-icon-fix sig-16 no-geoloc' title='Localiser'></span><span>"._("Aucune geolocalisation")."</span></div>";
4584 return $this->getVal('geom') ? $link : $nogeoloc;
4585 }
4586
4587
4588 /**
4589 * converti un geom au format Lat,Lon
4590 *
4591 * @param string $geom Le Geom
4592 * @param string $fromRefId Le référentiel dans lequel le geom est défini
4593 * @param string $toLongLatId Le référentiel dans lequel le geom doit être converti
4594 *
4595 * @return array[2] Long,Lat ou bien false,"message" en cas d'erreur
4596 */
4597 protected function convertGeomToLongLat(string $geom, string $fromRefId = '2154',
4598 string $toLongLatId = '4326') {
4599
4600 $qres = $this->f->get_all_results_from_db_query(
4601 sprintf(
4602 'SELECT
4603 ST_X(ST_Transform(ST_GeomFromText(\'%1$s\', %2$s), %3$s)) AS longitude,
4604 ST_Y(ST_Transform(ST_GeomFromText(\'%1$s\', %2$s), %3$s)) AS latitude',
4605 $this->f->db->escapeSimple($geom),
4606 $this->f->db->escapeSimple($fromRefId),
4607 $this->f->db->escapeSimple($toLongLatId)
4608 ),
4609 array(
4610 'origin' => __METHOD__
4611 )
4612 );
4613
4614 if ($qres['code'] !== 'OK') { // PP
4615 $this->addToLog(__METHOD__."() error: ".var_export($qres['message'], true), DEBUG_MODE);
4616 return array(false, $qres['message'],);
4617 }
4618 if (count($qres['result']) != 1) {
4619 $this->addToLog(__METHOD__."() error: ".var_export(count($qres['result']), true), DEBUG_MODE);
4620 return array(false, __("Erreur: Plus d'un enregistrement retourné").
4621 '('.count($qres['result']).')');
4622 }
4623 $coord = array_shift($qres['result']);
4624 $this->addToLog(__METHOD__."() coord: ".var_export($coord, true), EXTRA_VERBOSE_MODE);
4625 return array_values($coord);
4626 }
4627
4628 /**
4629 * getGoogleMapsStreetViewLink retourne le code HTML affichant un lien vers une vue
4630 * Google Maps Street View à partir des coordonnées du geom.
4631 *
4632 * @return string Lien vers Google Maps Street View
4633 */
4634 protected function getGoogleMapsStreetViewLink() {
4635 // Récupération coordonnées du terrain
4636
4637 // Passage du numéro de dossier comme id pour pouvoir le récupérer dans le
4638 // jscript lors du clic
4639 $html = sprintf(
4640 "<a id='action-form-gstreetview' class='simple-btn' title='%s' onclick='get_adresse_terrain(this.id, \"%s\")'>
4641 <span class='om-icon om-icon-16 om-icon-fix consult-16'></span>%s
4642 </a>",
4643 __("Ouvrir dans Google Maps Street View"),
4644 $this->getVal($this->clePrimaire),
4645 __("Street View")
4646 );
4647 return $html;
4648 }
4649
4650 /**
4651 * SETTER_FORM - setSelect.
4652 *
4653 * @return void
4654 */
4655 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
4656 $crud = $this->get_action_crud($this->getParameter("maj"));
4657
4658 // XXX Commenté pour patcher le problème de montée en charge de la base
4659 // de données en cas de reprise de données d'un gros volume de dossier
4660 // d'instruction
4661 // parent::setSelect($form, $maj);
4662 // om_collectivite
4663 $this->init_select(
4664 $form,
4665 $this->f->db,
4666 $maj,
4667 null,
4668 "om_collectivite",
4669 $this->get_var_sql_forminc__sql("om_collectivite"),
4670 $this->get_var_sql_forminc__sql("om_collectivite_by_id"),
4671 false
4672 );
4673
4674 if ($maj == 1 || $maj == 3) {
4675 $sql_nature_travaux_by_dit = str_replace(
4676 '<dossier_instruction_type>',
4677 $this->getVal('dossier_instruction_type'),
4678 $this->get_var_sql_forminc__sql("nature_travaux_by_dit")
4679 );
4680 // Initialisation du selecteur multiple nature_travaux
4681 $this->init_select(
4682 $form,
4683 $this->f->db,
4684 $maj,
4685 null,
4686 "nature_travaux",
4687 $sql_nature_travaux_by_dit,
4688 $this->get_var_sql_forminc__sql("nature_travaux_by_id"),
4689 false,
4690 true
4691 );
4692 }
4693
4694 /*
4695 * Pour chaque init_select d'un select non modifiable on teste
4696 * si l'on est en mode modifier : si c'est le cas alors on initialise le
4697 * select en mode consulter (qui n'affiche rien s'il n'y a aucune valeur).
4698 */
4699
4700 $collectivite_idx = $this->getVal("om_collectivite");
4701 $affichage_form_dat = "";
4702 // Si recherche avancée om_collectivite = collectivité utilisateur
4703 if ($maj == 999) {
4704 $collectivite_idx = $this->f->getParameter("om_collectivite_idx");
4705 } else {
4706 $affichage_form_dat = $this->get_type_affichage_formulaire();
4707 }
4708 // Définition de la qualité et de la traduction de l'instructeur
4709 $lib_instructeur = __("l'instructeur");
4710 $lib_instructeur_2 = __("l'instructeur secondaire");
4711 $affichage_instr_2 = 'instr';
4712 $affichage_instr = '';
4713 switch ($affichage_form_dat) {
4714 case 'DPC':
4715 case 'ADS':
4716 case 'CONSULTATION ENTRANTE':
4717 $affichage_instr = "AND instructeur_qualite.code = 'instr'";
4718 break;
4719 case 'CTX RE':
4720 $lib_instructeur_2 = __("le technicien");
4721 $affichage_instr_2 = 'tech';
4722 break;
4723 case 'CTX IN':
4724 $affichage_instr = "AND instructeur_qualite.code = 'juri'";
4725 $lib_instructeur = __('le juriste');
4726 $lib_instructeur_2 = __("le technicien");
4727 $affichage_instr_2 = 'tech';
4728 break;
4729 default:
4730 $affichage_instr = "";
4731 break;
4732 }
4733
4734 // instructeur
4735 // on recupère les services des multicollectivités et de celle du DI
4736 if ($this->f->getParameter('option_afficher_division')==='true') {
4737 // instructeur
4738 $sql_instructeur_div_by_di = str_replace(
4739 '<collectivite_di>',
4740 $collectivite_idx,
4741 $this->get_var_sql_forminc__sql("instructeur_div_by_di")
4742 );
4743 $sql_instructeur_div_by_di = str_replace(
4744 '<instructeur_qualite>',
4745 $affichage_instr,
4746 $sql_instructeur_div_by_di
4747 );
4748 $this->init_select(
4749 $form,
4750 $this->f->db,
4751 $maj,
4752 null,
4753 "instructeur",
4754 $sql_instructeur_div_by_di,
4755 $this->get_var_sql_forminc__sql("instructeur_div_by_id"),
4756 true,
4757 false,
4758 $lib_instructeur
4759 );
4760 // instructeur_2
4761 $sql_instructeur_2_div_by_di = str_replace(
4762 '<collectivite_di>',
4763 $collectivite_idx,
4764 $this->get_var_sql_forminc__sql("instructeur_2_div_by_di")
4765 );
4766 $sql_instructeur_2_div_by_di = str_replace(
4767 '<instructeur_qualite>',
4768 $affichage_instr_2,
4769 $sql_instructeur_2_div_by_di
4770 );
4771 $this->init_select(
4772 $form,
4773 $this->f->db,
4774 $maj,
4775 null,
4776 "instructeur_2",
4777 $sql_instructeur_2_div_by_di,
4778 $this->get_var_sql_forminc__sql("instructeur_2_div_by_id"),
4779 true,
4780 false,
4781 $lib_instructeur_2
4782 );
4783 } else {
4784 $sql_instructeur_by_di = str_replace(
4785 '<collectivite_di>',
4786 $collectivite_idx,
4787 $this->get_var_sql_forminc__sql("instructeur_by_di")
4788 );
4789 $sql_instructeur_by_di = str_replace(
4790 '<instructeur_qualite>',
4791 $affichage_instr,
4792 $sql_instructeur_by_di
4793 );
4794 $this->init_select(
4795 $form,
4796 $this->f->db,
4797 $maj,
4798 null,
4799 "instructeur",
4800 $sql_instructeur_by_di,
4801 $this->get_var_sql_forminc__sql("instructeur_by_id"),
4802 true,
4803 false,
4804 $lib_instructeur
4805 );
4806 $sql_instructeur_2_by_di = str_replace(
4807 '<collectivite_di>',
4808 $collectivite_idx,
4809 $this->get_var_sql_forminc__sql("instructeur_2_by_di")
4810 );
4811 $sql_instructeur_2_by_di = str_replace(
4812 '<instructeur_qualite>',
4813 $affichage_instr_2,
4814 $sql_instructeur_2_by_di
4815 );
4816 $this->init_select(
4817 $form,
4818 $this->f->db,
4819 $maj,
4820 null,
4821 "instructeur_2",
4822 $sql_instructeur_2_by_di,
4823 $this->get_var_sql_forminc__sql("instructeur_2_by_id"),
4824 true,
4825 false,
4826 $lib_instructeur_2
4827 );
4828 }
4829
4830 // etat
4831 if ($maj == 1) {
4832 $this->init_select(
4833 $form,
4834 $this->f->db,
4835 3,
4836 null,
4837 "etat",
4838 $this->get_var_sql_forminc__sql("etat"),
4839 $this->get_var_sql_forminc__sql("etat_by_id"),
4840 false
4841 );
4842 } else {
4843 $this->init_select(
4844 $form,
4845 $this->f->db,
4846 $maj,
4847 null,
4848 "etat",
4849 $this->get_var_sql_forminc__sql("etat"),
4850 $this->get_var_sql_forminc__sql("etat_by_id"),
4851 false
4852 );
4853 }
4854
4855 // dossier_instruction_type
4856 $this->init_select(
4857 $form,
4858 $this->f->db,
4859 $maj,
4860 null,
4861 "dossier_instruction_type",
4862 $this->get_var_sql_forminc__sql("dossier_instruction_type"),
4863 $this->get_var_sql_forminc__sql("dossier_instruction_type_by_id"),
4864 false
4865 );
4866
4867 // division
4868 $sql_division_by_di = str_replace(
4869 '<collectivite_di>',
4870 $collectivite_idx,
4871 $this->get_var_sql_forminc__sql("division_by_di")
4872 );
4873 $this->init_select(
4874 $form,
4875 $this->f->db,
4876 $maj,
4877 null,
4878 "division",
4879 $sql_division_by_di,
4880 $this->get_var_sql_forminc__sql("division_by_id"),
4881 true
4882 );
4883
4884 // autorite_competente
4885 $this->init_select(
4886 $form,
4887 $this->f->db,
4888 $maj,
4889 null,
4890 "autorite_competente",
4891 $this->get_var_sql_forminc__sql("autorite_competente"),
4892 $this->get_var_sql_forminc__sql("autorite_competente_by_id"),
4893 false
4894 );
4895
4896 // avis_decision
4897 if ($maj == 1) {
4898 $this->init_select(
4899 $form,
4900 $this->f->db,
4901 3,
4902 null,
4903 "avis_decision",
4904 $this->get_var_sql_forminc__sql("avis_decision"),
4905 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4906 false
4907 );
4908 } else {
4909 $this->init_select(
4910 $form,
4911 $this->f->db,
4912 $maj,
4913 null,
4914 "avis_decision",
4915 $this->get_var_sql_forminc__sql("avis_decision"),
4916 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4917 false
4918 );
4919 }
4920
4921 // autorisation_contestee
4922 if ($affichage_form_dat === 'CTX RE'
4923 && ($maj == 1 || $maj == 3)) {
4924 // À exécuter seulement en mode modifier ou consulter des recours
4925 // pour éviter le ralentissement de l'affichage des listings des DI
4926 $this->init_select(
4927 $form,
4928 $this->f->db,
4929 $maj,
4930 null,
4931 "autorisation_contestee",
4932 $this->get_var_sql_forminc__sql("autorisation_contestee"),
4933 $this->get_var_sql_forminc__sql("autorisation_contestee_by_id"),
4934 false
4935 );
4936 }
4937
4938 // Si l'accord tacite est activé, on récupère la liste des évènements
4939 if ($this->getVal('accord_tacite') === 'Oui') {
4940
4941 // evenement_suivant_tacite
4942 $this->init_select(
4943 $form,
4944 $this->f->db,
4945 $maj,
4946 null,
4947 "evenement_suivant_tacite",
4948 $this->get_var_sql_forminc__sql("evenement_suivant_tacite"),
4949 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_by_id"),
4950 false
4951 );
4952
4953 // evenement_suivant_tacite_incompletude
4954 $this->init_select(
4955 $form,
4956 $this->f->db,
4957 $maj,
4958 null,
4959 "evenement_suivant_tacite_incompletude",
4960 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude"),
4961 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude_by_id"),
4962 false
4963 );
4964 }
4965
4966 // Ajout, modification et recherche avancée
4967 if ($maj == 0 || $maj == 1 || $maj == 999) {
4968 // accord tacite
4969 $contenu=array();
4970 $contenu[0]=array('Non','Oui');
4971 $contenu[1]=array('Non','Oui');
4972 $form->setSelect("accord_tacite", $contenu);
4973 // geom *** a voir
4974 if ($maj == 1) { //modification
4975 $contenu=array();
4976 $contenu[0]=array("dossier", $this->getParameter("idx"));
4977 $form->setSelect('geom', $contenu);
4978 }
4979 // arrondissement recherche avancée
4980 $this->init_select(
4981 $form,
4982 $this->f->db,
4983 $maj,
4984 null,
4985 "arrondissement",
4986 $this->get_var_sql_forminc__sql("arrondissement"),
4987 $this->get_var_sql_forminc__sql("arrondissement_by_id"),
4988 false
4989 );
4990 // dossier_autorisation_type_detaille recherche avancée
4991 $this->init_select(
4992 $form,
4993 $this->f->db,
4994 $maj,
4995 null,
4996 "dossier_autorisation_type_detaille",
4997 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille"),
4998 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille_by_id"),
4999 false
5000 );
5001 }
5002
5003 // Ce formulaire n'est pas accessible en ajout ni en recherche avancée
5004 // mais dans le cas où il le serait, rien ne doit être fait concernant
5005 // les taxes
5006 if ($maj != 0 && $maj != 999) {
5007 // Choix du secteur pour part communale
5008 $contenu = array();
5009 $contenu[0][0] = "";
5010 $contenu[1][0] = __('choisir')."&nbsp;".__("le")."&nbsp;".__("tax_secteur");
5011 if ($crud === 'read') {
5012 $contenu[1][0] = "";
5013 }
5014 // Instance du parmétrage des taxes
5015 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
5016 // Si la colletivité à un paramétrage pour la taxe d'aménagement
5017 if ($inst_taxe_amenagement !== null) {
5018 // Il y a 20 secteurs maximum dans une commune de France
5019 for ($i=1; $i < 21; $i++) {
5020 // Valeur du secteur
5021 $value = $inst_taxe_amenagement->getVal('tx_comm_secteur_'.$i);
5022 //
5023 if ($value !== null && $value !== '') {
5024 //
5025 $contenu[0][$i] = $i;
5026 $contenu[1][$i] = sprintf(__('Secteur %s'), $i);
5027 }
5028 }
5029 }
5030 //
5031 $form->setSelect("tax_secteur", $contenu);
5032 }
5033 // commune
5034 $this->init_select(
5035 $form,
5036 $this->f->db,
5037 $maj,
5038 null,
5039 "commune",
5040 $this->get_var_sql_forminc__sql("commune"),
5041 $this->get_var_sql_forminc__sql("commune_by_id"),
5042 false
5043 );
5044 // pec_metier
5045 $this->init_select(
5046 $form,
5047 $this->f->db,
5048 $maj,
5049 null,
5050 "pec_metier",
5051 $this->get_var_sql_forminc__sql("pec_metier"),
5052 $this->get_var_sql_forminc__sql("pec_metier_by_id"),
5053 false
5054 );
5055 // etat_transmission_platau
5056 $contenu = array();
5057 $contenu[0] = array(
5058 'jamais_transmissible',
5059 'non_transmissible',
5060 'transmis_mais_non_transmissible',
5061 'transmissible',
5062 );
5063 $contenu[1] = array(
5064 __('Ne sera jamais transmis'),
5065 __('Non transmissible'),
5066 __('Déjà transmis mais non transmissible'),
5067 __('Transmissible'),
5068 );
5069 $form->setSelect("etat_transmission_platau", $contenu);
5070 }
5071
5072 /**
5073 * SETTER_FORM - setLib.
5074 *
5075 * @return void
5076 */
5077 function setLib(&$form, $maj) {
5078 parent::setLib($form, $maj);
5079 // Les libellés généraux sont mis avant la modification des libellés
5080 // selon le contexte pour permettre de ne surcharger que les libellés
5081 // voulu et d'avoir les mêmes dans tous les autres cas.
5082 $form->setLib('accord_tacite',_("decision tacite"));
5083 $form->setLib('autorite_competente',_('competence'));
5084 $form->setLib('cle_acces_citoyen', _("cle_acces_citoyen"));
5085 $form->setLib('date_ait', _("Date d'AIT"));
5086 $form->setLib('date_audience', _("Date d'audience"));
5087 $form->setLib('date_complet', _("completude"));
5088 $form->setLib('date_contradictoire', _("Date de contradictoire"));
5089 $form->setLib('date_dernier_depot', _("dernier depot"));
5090 $form->setLib('date_derniere_visite', _("Date de dernière visite"));
5091 $form->setLib('date_limite_incompletude', _("limite d'instruction"));
5092 $form->setLib('date_premiere_visite', _("Date de 1ère visite"));
5093 $form->setLib('date_transmission_parquet', _('Date de transmission au Parquet'));
5094 $form->setLib('date_validite', _("fin de validite le"));
5095 $form->setLib('delai', _("delai (mois)"));
5096 $form->setLib('delai',_("delai d'instruction"));
5097 $form->setLib('nature_travaux',__('Nature des travaux'));
5098 $form->setLib('description_projet',_('description du projet'));
5099 $form->setLib('dossier_arrondissement', _("Arrondissement"));
5100 $form->setLib('dossier_autorisation_libelle',_('dossier_autorisation_libelle'));
5101 $form->setLib('dossier_autorisation_type_detaille', _("Type"));
5102 $form->setLib('contrevenants', _("Contrevenant(s)"));
5103 $form->setLib('dossier_instruction_type',_('type de dossier'));
5104 $form->setLib('dossier_petitionnaire',_('demandeur'));
5105 $form->setLib('dossier_petitionnaires', _("Pétitionnaire(s)"));
5106 $form->setLib('requerants', _("Requérant(s)"));
5107 $form->setLib('dt_ctx_infraction', _("Infraction"));
5108 $form->setLib('dt_ctx_regularisable', _("Régularisable"));
5109 $form->setLib('dt_ctx_synthese_anr', _("Synthèse des ANR"));
5110 $form->setLib('dt_ctx_synthese_nti', _("Synthèse des NTI"));
5111 $form->setLib('ctx_reference_dsj', _("ctx_reference_dsj"));
5112 $form->setLib('ctx_reference_sagace', _("ctx_reference_sagace"));
5113 $form->setLib('enjeu_ctx', _("contentieux"));
5114 $form->setLib('enjeu_erp', _("ERP"));
5115 $form->setLib('enjeu_urba', _("urbanisme"));
5116 $form->setLib('erp', _("ERP"));
5117 $form->setLib('geom',_('geolocalisaion'));
5118 $form->setLib('instructeur_2', _('Technicien'));
5119 $form->setLib('numero_versement_archive', _("numero"));
5120 $form->setLib('bailleur', _("Bailleur(s)"));
5121 $form->setLib('terrain', _("Localisation"));
5122 $form->setLib('etat_transmission_platau', __("Statut Plat'AU"));
5123 $form->setLib('lien_iiue', '');
5124 $form->setLib('geoloc_latitude', __('Latitude (d° min.dec N/S)'));
5125 $form->setLib('geoloc_longitude', __('Longitude (d° min.dec E/O)'));
5126 $form->setLib('geoloc_rayon', __("Rayon d'emprise (m)"));
5127 $form->setLib('terrain_superficie_calculee', __("Superficie calculée (m²)"));
5128
5129 $affichage_form = $this->get_type_affichage_formulaire();
5130 if ($affichage_form === 'ADS') {
5131 $form->setLib('date_decision', _("date de la decision"));
5132 $form->setLib('date_limite', _("limite d'instruction"));
5133 $form->setLib('instructeur_2', __("instructeur secondaire"));
5134 }
5135 if ($affichage_form === 'CTX IN') {
5136 $form->setLib('avis_decision', _("Décision"));
5137 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
5138 $form->setLib('date_decision', _("Date de décision"));
5139 $form->setLib('date_depot', _("Date de réception"));
5140 $form->setLib('date_limite', _("Tacicité"));
5141 $form->setLib('instructeur',_('Juriste'));
5142 }
5143 if ($affichage_form === 'CTX RE') {
5144 $form->setLib('autorisation_contestee', _("Autorisation contestée"));
5145 $form->setLib('avis_decision', _("Décision"));
5146 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
5147 $form->setLib('date_decision', _("Date de décision"));
5148 $form->setLib('date_depot', _("Date de recours"));
5149 $form->setLib('date_limite', _("Tacicité"));
5150 $form->setLib('instructeur',_('Juriste'));
5151 }
5152 if ($affichage_form === 'DPC') {
5153 $form->setLib('instructeur_2', __("instructeur secondaire"));
5154 }
5155 if ($affichage_form === 'CONSULTATION ENTRANTE') {
5156 $form->setLib('date_decision', _("date de la decision"));
5157 $form->setLib('date_limite', _("limite d'instruction"));
5158 //
5159 $form->setLib('delai_reponse', __('Délai de réponse'));
5160 $form->setLib('date_consultation', __('Date de la consultation'));
5161 $form->setLib('date_emission', __("Date d'émission"));
5162 $form->setLib('etat_consultation', __('État de la consultation'));
5163 $form->setLib('type_consultation', __('Type de la consultation'));
5164 $form->setLib('texte_fondement_reglementaire', __('Article(s) réglementaire sur le(s)quel(s) se fonde la consultation'));
5165 $form->setLib('texte_objet_consultation', __("Texte de l'objet de la consultation"));
5166 $form->setLib('service_consultant_id', __('Service consultant : identifiant'));
5167 $form->setLib('service_consultant_libelle', __('Service consultant : libellé'));
5168 $form->setLib('service_consultant_insee', __('Service consultant : INSEE'));
5169 $form->setLib('service_consultant_mail', __('Service consultant : mail'));
5170 $form->setLib('service_consultant_type', __('Service consultant : type'));
5171 $form->setLib('service_consultant__siren', __('Service consultant : SIREN'));
5172
5173 $form->setLib('type_delai', __('Type de délai'));
5174 $form->setLib('objet_consultation', __('Objet de la consultation'));
5175 $form->setLib('date_production_notification', __('Date de production de la notification'));
5176 $form->setLib('date_premiere_consultation', __('Date de la première consultation'));
5177 $form->setLib('instructeur_2', __("instructeur secondaire"));
5178 }
5179 }
5180
5181 function setOnchange(&$form,$maj){
5182 parent::setOnchange($form,$maj);
5183 // mise en majuscule
5184 $form->setOnchange("demandeur_nom","this.value=this.value.toUpperCase()");
5185 $form->setOnchange("demandeur_societe","this.value=this.value.toUpperCase()");
5186 $form->setOnchange("delegataire_nom","this.value=this.value.toUpperCase()");
5187 $form->setOnchange("delegataire_societe","this.value=this.value.toUpperCase()");
5188 $form->setOnchange("architecte_nom","this.value=this.value.toUpperCase()");
5189 $form->setOnchange("terrain_adresse","this.value=this.value.toUpperCase()");
5190 $form->setOnchange('terrain_surface','VerifNumdec(this)');
5191 $form->setOnchange('tax_mtn_part_commu', 'VerifFloat(this, 0)');
5192 $form->setOnchange('tax_mtn_part_depart', 'VerifFloat(this, 0)');
5193 $form->setOnchange('tax_mtn_part_reg', 'VerifFloat(this, 0)');
5194 $form->setOnchange('tax_mtn_total', 'VerifFloat(this, 0)');
5195 $form->setOnchange('tax_mtn_rap', 'VerifFloat(this, 0)');
5196 $form->setOnchange('tax_mtn_part_commu_sans_exo', 'VerifFloat(this, 0)');
5197 $form->setOnchange('tax_mtn_part_depart_sans_exo', 'VerifFloat(this, 0)');
5198 $form->setOnchange('tax_mtn_part_reg_sans_exo', 'VerifFloat(this, 0)');
5199 $form->setOnchange('tax_mtn_total_sans_exo', 'VerifFloat(this, 0)');
5200 $form->setOnchange('tax_mtn_rap_sans_exo', 'VerifFloat(this, 0)');
5201 }
5202
5203 function setLayout(&$form, $maj) {
5204
5205 // Récupère le CRUD
5206 $crud = $this->get_action_crud($this->getParameter("maj"));
5207
5208 // Il n'y a pas d'affichage spécifique dans le cas d'une suppression
5209 if ($crud === 'delete') {
5210 return;
5211 }
5212
5213 $affichage_form = $this->get_type_affichage_formulaire();
5214 if ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE') {
5215 // Le contrôle de données est seulement possible si on est pas en mode service consulté.
5216 // et si le champ dossier_platau du dossier d'autorisation type detaillé est à true
5217 if ($this->f->is_option_mode_service_consulte_enabled() === false
5218 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
5219 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
5220 //
5221 $required_fields_platau = $this->check_platau_required_fields($this->getVal('dossier'));
5222
5223 if (isset($required_fields_platau['is_ok']) && $required_fields_platau['is_ok'] === false) {
5224 $class = 'demat-color demat-color-text';
5225 $message = __("La transmission à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
5226 if ($this->getVal('etat_transmission_platau') == "transmis_mais_non_transmissible") {
5227 $message = __("La transmission des modifications à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
5228 }
5229 $this->f->display_panel_information($class, $message, $required_fields_platau['required_fields_empty'], __('Champs requis'), 'demat-color');
5230 }
5231 }
5232 // En-tête
5233 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5234
5235 // Col1 : Fieldset "Dossier d'Instruction"
5236 $form->setBloc('om_collectivite', 'D', '', 'col_9');
5237
5238 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5239 $form->setFieldset('tax_secteur', 'F');
5240
5241
5242 $form->setBloc('tax_secteur', 'F');
5243
5244 // Col2 : 3 fieldsets
5245 $form->setBloc('enjeu_urba', 'D', '', 'col_3');
5246
5247 // Fieldset "Enjeu"
5248 $form->setFieldset('enjeu_urba', 'D', _("Enjeu"));
5249 $form->setFieldset('enjeu_ctx', 'F');
5250 // Fieldset "Qualification"
5251 $form->setFieldset('erp', 'D', _("Qualification"));
5252 $form->setFieldset('etat_transmission_platau', 'F');
5253 // Fieldset "Archive"
5254 $form->setFieldset('numero_versement_archive', 'D', _("Archive"));
5255 $form->setFieldset('date_demande', 'F');
5256
5257 $form->setBloc('date_demande', 'F');
5258 $form->setBloc('date_demande', 'F');
5259
5260 // Fieldset "Instruction"
5261 $form->setBloc('date_depot', 'D', '', 'col_12');
5262 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
5263
5264 // Fieldset "Suivi"
5265 $form->setBloc('date_depot', 'D', '', 'col_12');
5266
5267 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5268 // Col 1
5269 $form->setBloc('date_depot', 'D', '', 'col_6');
5270 $form->setBloc('date_depot', 'D');
5271 $form->setBloc('date_dernier_depot', 'F');
5272 $form->setBloc('date_limite', 'D', '', 'interligne');
5273 $form->setBloc('date_limite_incompletude', 'F');
5274 $form->setBloc('date_limite_incompletude', 'F');
5275 // Col 2
5276 $form->setBloc('etat', 'D', '', 'col_6');
5277 $form->setBloc('etat', 'D');
5278 $form->setBloc('etat', 'F');
5279 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5280 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5281 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5282 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5283
5284 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5285
5286 // Bloc 2 fieldsets
5287 $form->setBloc('date_decision', 'D', '', 'col_12');
5288
5289 // Col 1 Fieldset "Décision"
5290 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_6');
5291 $form->setFieldset('avis_decision','F','');
5292 // Col 2 Fieldset "Validité de l'autorisation"
5293 $form->setFieldset('date_validite', 'D', _("Validite de l'autorisation"), 'col_6');
5294 $form->setFieldset('date_validite','F','');
5295
5296 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
5297
5298 $form->setFieldset('date_conformite','F','');
5299 $form->setBloc('date_conformite', 'F'); // Fin Instruction
5300
5301 // Fieldset "Simulation des taxes"
5302 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
5303 $form->setFieldset('tax_mtn_part_commu', 'D', _("Simulation des taxes"), 'startClosed');
5304 //
5305 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
5306 $form->setFieldset('tax_mtn_part_commu', 'D', _("Taxe d'aménagement"), 'collapsible');
5307 $form->setFieldset('tax_mtn_total_sans_exo', 'F', '');
5308 $form->setBloc('tax_mtn_total_sans_exo', 'F');
5309 //
5310 $form->setBloc('tax_mtn_rap', 'D', '', 'col_12');
5311 $form->setFieldset('tax_mtn_rap', 'D', _("Redevance d'archéologie préventive"), 'collapsible');
5312 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
5313 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
5314 //
5315 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
5316 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
5317
5318 // Fieldset "Localisation"
5319 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5320
5321 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5322 // Col 1
5323 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5324 $form->setBloc('geoloc_rayon', 'F');
5325 // Col 2
5326 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5327 $form->setBloc('terrain_superficie_calculee', 'F');
5328
5329 $form->setFieldset('terrain_superficie_calculee', 'F', '');
5330
5331 $form->setBloc('terrain_superficie_calculee', 'F');
5332
5333 // Fieldset "Plat'AU : identifiants techniques"
5334 $form->setBloc('lien_iiue', 'D', '', 'col_12');
5335 $form->setFieldset('lien_iiue', 'D', __("Plat'AU - Identifiants techniques"), 'demat-color-fieldset startClosed');
5336 $form->setFieldset('lien_iiue', 'F', '');
5337 $form->setBloc('lien_iiue', 'F');
5338 }
5339 // CONSULTATION ENTRANTE
5340 // Vérifie que le dossier a été déposé électroniquement
5341 if ($affichage_form === 'CONSULTATION ENTRANTE'
5342 && ($this->get_source_depot_from_demande() === PLATAU
5343 || $this->get_source_depot_from_demande() === PORTAL)) {
5344 // Fieldset "Consultation"
5345 $form->setBloc('consultation_entrante', 'D', '', 'col_12');
5346 $form->setFieldset('consultation_entrante', 'D', __('Consultation'), '');
5347 $form->setBloc('consultation_entrante', 'D', "", "col_6");
5348 $form->setBloc('type_consultation', 'F');
5349 $form->setBloc('texte_fondement_reglementaire', 'D', "", "col_6");
5350 $form->setBloc('dossier_consultation', 'F');
5351 $form->setFieldset('dossier_consultation', 'F', '');
5352 $form->setBloc('dossier_consultation', 'F');
5353 }
5354 // RECOURS
5355 if ($affichage_form === 'CTX RE') {
5356 // Fieldset "Dossier d'Instruction"
5357 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5358 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5359 $form->setFieldset('etat_transmission_platau', 'F');
5360 $form->setBloc('etat_transmission_platau', 'F');
5361
5362 // Fieldset "Archive"
5363 $form->setBloc('numero_versement_archive', 'D', '', 'col_12');
5364 $form->setFieldset('numero_versement_archive', 'DF', __("Archive"));
5365 $form->setBloc('numero_versement_archive', 'F', '');
5366
5367 // Fieldset "Instruction"
5368 $form->setBloc('date_depot', 'D', '', 'col_12');
5369 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
5370
5371 // Fieldset "Suivi"
5372 $form->setBloc('date_depot', 'D', '', 'col_12');
5373
5374 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5375 // Col 1
5376 $form->setBloc('date_depot', 'D', '', 'col_6');
5377 // $form->setBloc('date_depot', 'D');
5378 // $form->setBloc('date_dernier_depot', 'F');
5379 // $form->setBloc('date_limite', 'D', '');
5380 // $form->setBloc('date_limite_incompletude', 'F');
5381 $form->setBloc('date_cloture_instruction', 'F');
5382 // Col 2
5383 $form->setBloc('etat', 'D', '', 'col_6');
5384 $form->setBloc('etat', 'D');
5385 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5386 // $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5387 // $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5388 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5389 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5390
5391 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5392
5393 // Bloc 2 fieldsets
5394 $form->setBloc('date_decision', 'D', '', 'col_12');
5395
5396 // Col 1 Fieldset "Décision"
5397 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5398 $form->setFieldset('avis_decision','F','');
5399 // Col 2 Fieldset "Validité de l'autorisation"
5400
5401 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
5402
5403 $form->setFieldset('date_conformite','F','');
5404 $form->setBloc('date_conformite', 'F'); // Fin Instruction
5405
5406 // Fieldset "Localisation"
5407 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5408
5409 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5410 // Col 1
5411 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5412 $form->setBloc('geoloc_rayon', 'F');
5413 // Col 2
5414 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5415 $form->setBloc('terrain_superficie_calculee', 'F');
5416
5417 $form->setFieldset('terrain_superficie_calculee', 'F', '');
5418
5419 $form->setBloc('terrain_superficie_calculee', 'F');
5420 }
5421
5422 // INFRACTION
5423 if ($affichage_form === 'CTX IN') {
5424
5425 // Fieldset "Dossier d'Instruction"
5426 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5427 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5428 $form->setFieldset('etat_transmission_platau', 'F');
5429 $form->setBloc('etat_transmission_platau', 'F');
5430
5431 // Fieldset "Archive"
5432 $form->setBloc('numero_versement_archive', 'D', '', 'col_12');
5433 $form->setFieldset('numero_versement_archive', 'DF', __("Archive"));
5434 $form->setBloc('numero_versement_archive', 'F', '');
5435
5436 // Fieldset "Instruction"
5437 $form->setBloc('date_depot', 'D', '', 'col_12');
5438 $form->setFieldset('date_depot', 'D', _('Instruction'));
5439 // Fieldset "Suivi"
5440 $form->setBloc('date_depot', 'D', '', '');
5441 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5442 // Col 1
5443 $form->setBloc('date_depot', 'D', '', 'col_6');
5444 $form->setBloc('date_depot', 'D');
5445 $form->setBloc('date_dernier_depot', 'F');
5446 $form->setBloc('date_limite', 'D', '', 'interligne');
5447 $form->setBloc('date_limite_incompletude', 'F');
5448 $form->setBloc('date_limite_incompletude', 'F');
5449 // Col 2
5450 $form->setBloc('etat', 'D', '', 'col_6');
5451 $form->setBloc('etat', 'D');
5452 $form->setBloc('etat', 'F');
5453 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5454 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5455 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5456 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5457 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5458 // Fieldset "Décision"
5459 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5460 $form->setFieldset('date_conformite','F',''); // Fin Décision
5461 $form->setFieldset('date_conformite','F','');
5462 $form->setBloc('date_conformite', 'F'); // Fin Instruction
5463
5464 // Fieldset "Localisation"
5465 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5466 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5467 // Col 1
5468 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5469 $form->setBloc('geoloc_rayon', 'F');
5470 // Col 2
5471 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5472 $form->setBloc('terrain_superficie_calculee', 'F');
5473 $form->setFieldset('terrain_superficie_calculee', 'F', '');
5474 $form->setBloc('terrain_superficie_calculee', 'F');
5475
5476 // Fieldset "Demandeurs"
5477 // → cf. formSpecificContent()
5478 }
5479 }
5480
5481 /**
5482 * Permet de retourner si le dossier est incomplet notifié
5483 *
5484 * @return boolean true si incomplet notifié
5485 */
5486 function is_incomplet_notifie() {
5487 // Si le dossier est défini en tant qu'incomplet notifie
5488 if($this->getVal('incomplet_notifie') == 't' AND
5489 $this->getVal('incompletude') == 't') {
5490 return true;
5491 }
5492 return false;
5493 }
5494
5495
5496 /**
5497 * Vérifie que le dossier d'instruction en cours ne soit pas instruit.
5498 * Ne sont pas compté comme instruit les dossiers n'ayant que des événements
5499 * d'instruction de type 'affichage'.
5500 *
5501 * @return boolean
5502 */
5503 function has_only_recepisse() {
5504
5505 // Récupère la liste des instructions du dossier
5506 $list_instructions = $this->get_list_instructions(true);
5507
5508 // Si le dossier a pour seule instruction le récépissé de la demande
5509 if (count($list_instructions) === 1
5510 && $list_instructions[0] === $this->get_demande_instruction_recepisse()) {
5511 //
5512 return true;
5513 }
5514
5515 //
5516 return false;
5517 }
5518
5519
5520 /**
5521 * TRIGGER - triggerajouterapres.
5522 *
5523 * - Interface avec le référentiel ERP [108]
5524 * - Gestion des données techniques liées
5525 * - Mise à jour du DA
5526 * - Gestion des références cadastrales / parcelles liées
5527 *
5528 * @return boolean
5529 */
5530 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5531 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5532
5533 // si la version du DI n'est pas zéro
5534 $version = $this->valF['version'];
5535 if (intval($version) > 0) {
5536
5537 // récupération du DI qui vient d'être créé
5538 $di = $this->valF['dossier'];
5539 if (empty($di_inst = $this->f->findObjectById('dossier', $di))) {
5540 $this->addToMessage(sprintf(
5541 __("Erreur lors de la récupération du DI %s (dossier non-trouvé)"),
5542 $di));
5543 $this->correct = false;
5544 return false;
5545 }
5546
5547 $collectivite = $this->valF['om_collectivite'];
5548 $da = $this->valF['dossier_autorisation'];
5549 $commune = $this->f->get_submitted_post_value("commune");
5550
5551 $ret = $di_inst->replicate_geolocalisation($di, $da, $collectivite, $commune);
5552 if (is_string($ret)) {
5553 $this->addToMessage($ret);
5554 }
5555 }
5556
5557 /**
5558 * Interface avec le référentiel ERP.
5559 *
5560 * (WS->ERP)[108] Dépôt de dossier DAT -> AT
5561 * Déclencheur :
5562 * - L'option ERP est activée
5563 * - Validation du formulaire d'ajout d'une demande de nouveau dossier
5564 * de type AT
5565 */
5566 //
5567 if ($this->f->is_option_referentiel_erp_enabled($this->valF['om_collectivite']) === true
5568 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')) {
5569 //
5570 $infos = array(
5571 "dossier_instruction" => $this->valF['dossier'],
5572 );
5573 //
5574 $ret = $this->f->send_message_to_referentiel_erp(108, $infos);
5575 if ($ret !== true) {
5576 $this->cleanMessage();
5577 $this->addToMessage(_("Une erreur s'est produite lors de la notification (108) du référentiel ERP. Contactez votre administrateur."));
5578 return false;
5579 }
5580 $this->addToMessage(_("Notification (108) du référentiel ERP OK."));
5581 }
5582
5583 /**
5584 * Gestion des données techniques liées.
5585 */
5586 // On ajoute les données techniques
5587 if ($this->ajoutDonneesTechniquesDI($id, $val) === false) {
5588 //
5589 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5590 $this->correct = false;
5591 return false;
5592 }
5593
5594 /**
5595 * Mise à jour des données du DA.
5596 */
5597 //
5598 $inst_da = $this->get_inst_dossier_autorisation($this->valF["dossier_autorisation"]);
5599 //
5600 $params = array(
5601 'di_id' => $this->valF[$this->clePrimaire],
5602 );
5603 if ($inst_da->majDossierAutorisation($params) === false) {
5604 //
5605 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5606 $this->correct = false;
5607 return false;
5608 }
5609
5610 /**
5611 * Gestion des références cadastrales / parcelles liées.
5612 */
5613 // Si le champ des références cadastrales n'est pas vide
5614 if ($this->valF['terrain_references_cadastrales'] != '') {
5615 // Ajout des parcelles dans la table dossier_parcelle
5616 $this->ajouter_dossier_parcelle(
5617 $this->valF['dossier'],
5618 $this->valF['terrain_references_cadastrales']
5619 );
5620 }
5621
5622 /**
5623 * Notification de l'éventuelle autorisation contestée
5624 */
5625 if ($this->valF['autorisation_contestee'] !== null) {
5626 // Instancie la classe dossier_message
5627 $dossier_message = $this->get_inst_dossier_message(']');
5628 // Ajoute le message de notification
5629 $dossier_message_val = array(
5630 'dossier' => $this->valF['autorisation_contestee'],
5631 'type' => __('Autorisation contestée'),
5632 'emetteur' => $this->f->get_connected_user_login_name(),
5633 'login' => $_SESSION['login'],
5634 'date_emission' => date('Y-m-d H:i:s'),
5635 'contenu' => sprintf(
5636 __('Cette autorisation a été contestée par le recours %s.'),
5637 $this->valF['dossier']
5638 )
5639 );
5640 // Si une erreur se produit lors de l'ajout
5641 if ($dossier_message->add_notification_message($dossier_message_val, false, true) !== true) {
5642 // Message d'erreur affiché à l'utilisateur
5643 $this->addToMessage(_("L'autorisation contestée n'a pas pu être notifiée du recours."));
5644 $this->correct = false;
5645 return false;
5646 }
5647 }
5648 // Gestion dossier operateur liées.
5649 //
5650 // En mode service consulté, on ajoute suite à la création du dossier un
5651 // élément dans la table dossier_operateur qui permettra par la suite d'effectuer
5652 // la désignation de l'opérateur
5653 if ($this->f->is_option_mode_service_consulte_enabled() === true) {
5654 // On ajoute le dossier opérateur
5655 if ($this->ajoutDossierOperateurDI($id, $val) === false) {
5656
5657 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5658 $this->correct = false;
5659 return false;
5660 }
5661 }
5662
5663 /**
5664 * Gestion des tâches pour la dématérialisation
5665 */
5666 //
5667 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
5668 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible') {
5669 // Pour les dossiers d'instruction dont la source de dépôt est différent de PLAT'AU
5670 if (isset($val['source_depot']) === false || $val['source_depot'] !== PLATAU) {
5671 // Gérer l'ajout du DA si pas lié à un objet PLAT'AU
5672 // Nécessaire pour les dossiers d'instruction sur existant dont l'initial n'est pas
5673 // transmis à PLAT'AU
5674 $inst_lien = $this->f->get_inst__om_dbform(array(
5675 "obj" => "lien_id_interne_uid_externe",
5676 "idx" => ']',
5677 ));
5678 $is_exists = $inst_lien->is_exists('dossier_autorisation', $inst_da->getVal('dossier_autorisation'));
5679 if (! $is_exists) {
5680 $inst_task = $this->f->get_inst__om_dbform(array(
5681 "obj" => "task",
5682 "idx" => 0,
5683 ));
5684 $task_val = array(
5685 'type' => 'creation_DA',
5686 'object_id' => $inst_da->getVal('dossier_autorisation'),
5687 'dossier' => $inst_da->getVal('dossier_autorisation'),
5688 );
5689 // Si le mode service consulté n'est pas activé
5690 // et que le dossier est dans l'état 'non_transmissible'
5691 if ($this->f->is_option_mode_service_consulte_enabled() === false
5692 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5693 // Passage du statut de la task en draft
5694 $task_val['state'] = $inst_task::STATUS_DRAFT;
5695 }
5696 $add_task = $inst_task->add_task(array('val' => $task_val));
5697 if ($add_task === false) {
5698 $this->addToMessage(sprintf('%s %s',
5699 __("Une erreur s'est produite lors de la création tâche."),
5700 __("Veuillez contacter votre administrateur.")
5701 ));
5702 $this->correct = false;
5703 return false;
5704 }
5705 }
5706
5707 // Ajout de la task creation_DI
5708 $inst_task = $this->f->get_inst__om_dbform(array(
5709 "obj" => "task",
5710 "idx" => 0,
5711 ));
5712 $task_val = array(
5713 'type' => 'creation_DI',
5714 'object_id' => $id,
5715 'dossier' => $id,
5716 );
5717 // Si le mode service consulté n'est pas activé
5718 // et que le dossier est dans l'état 'non_transmissible'
5719 if ($this->f->is_option_mode_service_consulte_enabled() === false
5720 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5721 // Passage du statut de la task en draft
5722 $task_val['state'] = $inst_task::STATUS_DRAFT;
5723 }
5724 $add_task = $inst_task->add_task(array('val' => $task_val));
5725 if ($add_task === false) {
5726 $this->addToMessage(sprintf('%s %s',
5727 __("Une erreur s'est produite lors de la création tâche."),
5728 __("Veuillez contacter votre administrateur.")
5729 ));
5730 $this->correct = false;
5731 return false;
5732 }
5733 }
5734 // Pour les dossier d'instruction dont la source de dépôt est PLAT'AU
5735 if (isset($val['source_depot']) === true && $val['source_depot'] == PLATAU) {
5736 //
5737 $inst_task = $this->f->get_inst__om_dbform(array(
5738 "obj" => "task",
5739 "idx" => 0,
5740 ));
5741 $task_val = array(
5742 'type' => 'modification_DI',
5743 'object_id' => $id,
5744 'dossier' => $id,
5745 );
5746 $add_task = $inst_task->add_task(array('val' => $task_val));
5747 if ($add_task === false) {
5748 $this->addToMessage(sprintf('%s %s',
5749 __("Une erreur s'est produite lors de la création tâche."),
5750 __("Veuillez contacter votre administrateur.")
5751 ));
5752 $this->correct = false;
5753 return false;
5754 }
5755 }
5756 // Dans tous les cas
5757 $inst_task = $this->f->get_inst__om_dbform(array(
5758 "obj" => "task",
5759 "idx" => 0,
5760 ));
5761 $task_val = array(
5762 'type' => 'depot_DI',
5763 'object_id' => $id,
5764 'dossier' => $id,
5765 );
5766 // Change l'état de la tâche de notification en fonction de l'état de
5767 // transmission du dossier d'instruction
5768 if ($this->f->is_option_mode_service_consulte_enabled() === false
5769 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5770 //
5771 $task_val['state'] = $inst_task::STATUS_DRAFT;
5772 }
5773 $add_task = $inst_task->add_task(array('val' => $task_val));
5774 if ($add_task === false) {
5775 $this->addToMessage(sprintf('%s %s',
5776 __("Une erreur s'est produite lors de la création tâche."),
5777 __("Veuillez contacter votre administrateur.")
5778 ));
5779 $this->correct = false;
5780 return false;
5781 }
5782 }
5783 // Ajout automatique des acteurs au dossier si l'option est activée
5784 if ($this->f->is_option_enabled('option_module_acteur') === true) {
5785 if ($this->add_dossier_actors($id) === false) {
5786 $this->addToMessage(__('ATTENTION : Les acteurs n\'ont pas été rattachés au dossier.'));
5787 }
5788 }
5789
5790 // On duplique les nature du travaux du dossier initial ou du dernier dossier clôturé
5791
5792 // Récupération du numéro de dossier initial ou dernier dossier clôturé
5793 $qres = $this->f->get_one_result_from_db_query(
5794 sprintf(
5795 'SELECT
5796 dossier.dossier
5797 FROM
5798 %1$sdossier
5799 WHERE
5800 dossier.dossier_autorisation = \'%2$s\'
5801 AND dossier.dossier != \'%3$s\'
5802 ORDER BY
5803 dossier.version DESC,
5804 dossier.date_depot DESC
5805 LIMIT 1',
5806 DB_PREFIXE,
5807 $this->f->db->escapeSimple($this->valF['dossier_autorisation']),
5808 $id
5809 ),
5810 array(
5811 'origin' => __METHOD__,
5812 'force_return' => true
5813 )
5814 );
5815 if ($qres['code'] !== 'OK') {
5816 return false;
5817 }
5818 $di_id = $qres['result'];
5819 // Duplication des lien de nature de travaux pour le nouveau dossier
5820 if ($this->lienNatureTravauxDossierInstruction($di_id, $id) === false) {
5821 $this->addToMessage(sprintf('%s %s',
5822 __("Une erreur s'est produite lors de l'ajout des nature de travaux sur le nouveau dossier."),
5823 __("Veuillez contacter votre administrateur.")
5824 ));
5825 $this->correct = false;
5826 return false;
5827 }
5828 return true;
5829 }
5830
5831 /**
5832 * Gestion des liens entre les natures de travaux et le nouveau dossier
5833 **/
5834 function lienNatureTravauxDossierInstruction($di_orig, $di_id) {
5835 $inst_ldnt = $this->f->get_inst__om_dbform(array(
5836 "obj" => "lien_dossier_nature_travaux",
5837 "idx" => "]",
5838 ));
5839
5840 $qres = $this->f->get_all_results_from_db_query(
5841 sprintf(
5842 'SELECT
5843 *
5844 FROM
5845 %1$slien_dossier_nature_travaux INNER JOIN %1$snature_travaux ON nature_travaux.nature_travaux = lien_dossier_nature_travaux.nature_travaux INNER JOIN %1$slien_dit_nature_travaux ON lien_dossier_nature_travaux.nature_travaux = lien_dit_nature_travaux.nature_travaux
5846 WHERE
5847 dossier = \'%2$s\' AND lien_dit_nature_travaux.dossier_instruction_type = %3$d',
5848 DB_PREFIXE,
5849 $di_orig,
5850 $this->valF['dossier_instruction_type']
5851 ),
5852 array(
5853 "origin" => __METHOD__,
5854 "force_return" => true,
5855 )
5856 );
5857 if ($qres["code"] !== "OK") {
5858 return false;
5859 }
5860 $liens_dossier_nature_travaux = $qres["result"];
5861 $valnaturetravaux = array();
5862
5863 foreach ($liens_dossier_nature_travaux as $lien) {
5864 $valnaturetravaux['lien_dossier_nature_travaux'] = '';
5865 $valnaturetravaux['dossier'] = $di_id;
5866 $valnaturetravaux['nature_travaux'] = $lien['nature_travaux'];
5867
5868 if ($inst_ldnt->ajouter($valnaturetravaux) === false) {
5869 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter le lien entre la nature de travaux et le dossier d'instruction.", DEBUG_MODE);
5870 return false;
5871 }
5872 }
5873
5874 return true;
5875 }
5876
5877
5878 /**
5879 * Ajoute à l'aide d'une requête sql tous les acteurs (lien dossier - tiers) paramétrés pour
5880 * être ajoutés automatiquement.
5881 *
5882 * Pour être ajoutés automatiquement un acteur doit :
5883 * - avoir une catégorie paramétré en tant qu'ajout automatique pour le type de DI du dossier
5884 * - avoir une catégorie liée à la même collectivité que celle du dossier
5885 * - accepter les notifications par mail
5886 * - ne pas avoir d'uid platau ou sa liste d'uid ne doit pas contenir celui de la consultation
5887 * entrante (acteur != du service en charge du dossier)
5888 * - ne pas avoir d'habilitation en cours de validité
5889 * OU avoir une (ou +) habilitation sans division territoriale (commune ou département)
5890 * OU avoir une (ou +) habilitation avec division territoriale commune lié à la commune du dossier
5891 * OU avoir une (ou +) habilitation avec division territoriale département lié au département du dossier
5892 *
5893 * @param string $idDossier : identifiant du dossier
5894 * @return boolean résultat de l'ajout. true : ok, false : l'ajout a échoué
5895 */
5896 protected function add_dossier_actors($idDossier) {
5897 // Sql de récupération de tous les acteurs qui doivent automatiquement être associé au dossier.
5898 $actor_auto_dossier_sql = sprintf(
5899 'SELECT DISTINCT
5900 nextval(\'%1$slien_dossier_tiers_seq\') AS lien_dossier_tiers_seq,
5901 dossier.dossier,
5902 tiers_consulte.tiers_consulte
5903 FROM
5904 %1$stiers_consulte
5905 INNER JOIN %1$scategorie_tiers_consulte
5906 ON tiers_consulte.categorie_tiers_consulte = categorie_tiers_consulte.categorie_tiers_consulte
5907 -- Filtre les tiers a ajouter automatiquement au dossier
5908 INNER JOIN %1$slien_dossier_instruction_type_categorie_tiers
5909 ON lien_dossier_instruction_type_categorie_tiers.ajout_automatique IS TRUE
5910 AND categorie_tiers_consulte.categorie_tiers_consulte = lien_dossier_instruction_type_categorie_tiers.categorie_tiers
5911 INNER JOIN %1$slien_categorie_tiers_consulte_om_collectivite
5912 ON categorie_tiers_consulte.categorie_tiers_consulte = lien_categorie_tiers_consulte_om_collectivite.categorie_tiers_consulte
5913 -- Filtre les tiers dont la collectivité et le type correspondent à celle du dossier
5914 INNER JOIN %1$sdossier
5915 ON lien_dossier_instruction_type_categorie_tiers.dossier_instruction_type = dossier.dossier_instruction_type
5916 AND lien_categorie_tiers_consulte_om_collectivite.om_collectivite = dossier.om_collectivite
5917 AND dossier.dossier = \'%2$s\'
5918 -- Filtre pour garder uniquement les habilitations en cours de validité
5919 LEFT JOIN %1$shabilitation_tiers_consulte
5920 ON tiers_consulte.tiers_consulte = habilitation_tiers_consulte.tiers_consulte
5921 AND (habilitation_tiers_consulte.om_validite_debut IS NULL
5922 OR habilitation_tiers_consulte.om_validite_debut <= CURRENT_DATE)
5923 AND (habilitation_tiers_consulte.om_validite_fin IS NULL
5924 OR habilitation_tiers_consulte.om_validite_fin > CURRENT_DATE)
5925 -- Récupère uniquement les habilitations liées à la commune du dossier
5926 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
5927 ON dossier.commune = lien_habilitation_tiers_consulte_commune.commune
5928 AND habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
5929 -- Récupère uniquement les habilitations liées au département du dossier
5930 LEFT JOIN %1$scommune
5931 ON dossier.commune = commune.commune
5932 LEFT JOIN %1$sdepartement
5933 ON commune.dep = departement.dep
5934 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
5935 ON departement.departement = lien_habilitation_tiers_consulte_departement.departement
5936 AND habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
5937 WHERE
5938 -- Garde les tiers notifiable ayant un id platau différent de celui du service consultant du dossier
5939 tiers_consulte.accepte_notification_email IS TRUE
5940 AND tiers_consulte.liste_diffusion IS NOT NULL
5941 AND TRIM(tiers_consulte.liste_diffusion) != \'\'
5942 -- Garde les tiers n ayant pas d habilitation en cours de validite
5943 -- OU ayant une habilitation liée à la commune du dossier
5944 -- OU ayant une habilitation liée au département d appartenance de la commune du dossier
5945 -- OU n étant lié à aucune commune ou département
5946 AND (
5947 -- Pas d habilitation en cours de validité
5948 habilitation_tiers_consulte.habilitation_tiers_consulte IS NULL
5949 OR (-- Habilitation associée à la commune du dossier
5950 lien_habilitation_tiers_consulte_commune.lien_habilitation_tiers_consulte_commune IS NOT NULL
5951 -- Habilitation associée au département du dossier
5952 OR lien_habilitation_tiers_consulte_departement.lien_habilitation_tiers_consulte_departement IS NOT NULL
5953 -- Habilitation non liée à une commune ou à un département
5954 OR (NOT EXISTS(
5955 SELECT lien_habilitation_tiers_consulte_departement
5956 FROM %1$slien_habilitation_tiers_consulte_departement AS lhtcd
5957 WHERE lhtcd.habilitation_tiers_consulte = habilitation_tiers_consulte.habilitation_tiers_consulte)
5958 AND NOT EXISTS(
5959 SELECT lien_habilitation_tiers_consulte_commune
5960 FROM %1$slien_habilitation_tiers_consulte_commune AS lhtcc
5961 WHERE lhtcc.habilitation_tiers_consulte = habilitation_tiers_consulte.habilitation_tiers_consulte))))',
5962 DB_PREFIXE,
5963 $this->f->db->escapeSimple($idDossier)
5964 );
5965 // Création d'un lien entre le dossier et les tiers pour chaque tiers en ajout auto
5966 $qres = $this->f->execute_db_query(
5967 sprintf(
5968 'INSERT INTO %1$slien_dossier_tiers (lien_dossier_tiers, dossier, tiers)
5969 (%2$s)
5970 ON CONFLICT (dossier,tiers) DO NOTHING',
5971 DB_PREFIXE,
5972 $actor_auto_dossier_sql
5973 ),
5974 array(
5975 'origin' => __METHOD__,
5976 'force_return' => true
5977 )
5978 );
5979 return $qres['code'] === 'OK';
5980 }
5981
5982 /**
5983 * Permet de vérifier que les champs requis pour platau ont été saisis
5984 * et si oui mettre à jour le statut des taches à new
5985 *
5986 * @param string $dossier L'identifiant du dossier.
5987 * @param string $add_or_update Permet de déterminer si on est en ajout ou en modification
5988 *
5989 * @return bool true|false
5990 */
5991 function trigger_platau_required_fields($dossier) {
5992 // Vérification des champs Plat'AU requis pour transmission
5993 $is_required_fields_fulfilled = $this->check_platau_required_fields($dossier);
5994
5995 // On récupère l'identifiant du dossier d'autorisation en fonction
5996 // de si on est en ajout ou en modification
5997 $dossier_autorisation = $this->getVal('dossier_autorisation') != "" ? $this->getVal('dossier_autorisation') : $this->valF['dossier_autorisation'];
5998
5999 $inst_task = $this->f->get_inst__om_dbform(array(
6000 "obj" => "task",
6001 "idx" => 0,
6002 ));
6003
6004 // Si les champs requis sont saisis on met à jour le flag
6005 // etat_transmission_platau à transmissible pour indiquer
6006 // que le dossier peut être transmis à Plat'AU et on met
6007 // l'état des tâches draft en new
6008 if ($is_required_fields_fulfilled['is_ok']) {
6009 // Valeurs à mettre à jour
6010 $valF = array();
6011 $valF['etat_transmission_platau'] = 'transmissible';
6012
6013 // Met à jour le quartier du dossier
6014 $cle = " dossier='".$dossier."'";
6015 $res = $this->f->db->autoExecute(
6016 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
6017 $this->addToLog(__METHOD__."(): db->autoexecute(\""
6018 .DB_PREFIXE."dossier\", ".print_r($valF, true)
6019 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
6020 if ($this->f->isDatabaseError($res, true)) {
6021 return false;
6022 }
6023 $this->update_task_state($dossier, 'draft', 'new', $dossier_autorisation);
6024 }
6025 // Si les champs requis ne sont pas saisis on marque
6026 // le dossier comme non transmissible ou transmis mais non transmissible
6027 // et on met l'état des tâches new en draft
6028 if (! $is_required_fields_fulfilled['is_ok']) {
6029 $valF = array();
6030 if ($inst_task->task_exists('creation_DI', $dossier)) {
6031 $valF['etat_transmission_platau'] = 'non_transmissible';
6032 } else {
6033 $valF['etat_transmission_platau'] = 'transmis_mais_non_transmissible';
6034 }
6035
6036 // Met à jour le quartier du dossier
6037 $cle = " dossier='".$dossier."'";
6038 $res = $this->f->db->autoExecute(
6039 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
6040 $this->addToLog(__METHOD__."(): db->autoexecute(\""
6041 .DB_PREFIXE."dossier\", ".print_r($valF, true)
6042 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
6043 if ($this->f->isDatabaseError($res, true)) {
6044 return false;
6045 }
6046 $this->update_task_state($dossier, 'new', 'draft', $dossier_autorisation);
6047 }
6048
6049 return true;
6050 }
6051
6052 /**
6053 * TODO: replace with '$this->f->findObjectById' ?
6054 *
6055 * Récupère l'instance de dossier message.
6056 *
6057 * @param string $dossier_message Identifiant du message.
6058 *
6059 * @return object
6060 */
6061 private function get_inst_dossier_message($dossier_message = null) {
6062 //
6063 return $this->get_inst_common("dossier_message", $dossier_message);
6064 }
6065
6066 /**
6067 * Récupère l'identifiant du quartier et de l'arrondissement depuis le code
6068 * impôt.
6069 *
6070 * @param string $code_impots Code impôt du quartier
6071 *
6072 * @return array
6073 */
6074 public function get_quartier_arrondissement_by_code_impot($code_impot) {
6075 if (empty($code_impot) === true) {
6076 return null;
6077 }
6078 $query = sprintf('
6079 SELECT
6080 quartier,
6081 arrondissement
6082 FROM
6083 %1$squartier
6084 WHERE
6085 code_impots = \'%2$s\'',
6086 DB_PREFIXE,
6087 $code_impot
6088 );
6089 $res = $this->f->get_all_results_from_db_query(
6090 $query,
6091 array(
6092 "origin" => __METHOD__,
6093 "force_return" => true,
6094 )
6095 );
6096 if ($res['code'] !== 'KO' &&
6097 count($res['result']) > 0) {
6098 //
6099 return $res['result'][0];
6100 }
6101 return null;
6102 }
6103
6104 /**
6105 * Retourne l'intructeur correspondant le mieux à la parcelle.
6106 *
6107 * @param int $quartier le numéro de quartier
6108 * @param int $arrondissement le numéro d'arrondissement
6109 * @param string $section la section
6110 * @param int $dadt le type détaillé de dossier d'autorisation
6111 * @param int $collectivite l'identifiant de la collectivité
6112 * @param int $commune_id l'identifiant de la commune (optionel)
6113 * @param int $demande_type l'identifiant du type de demande (optionel)
6114 *
6115 * @return array contenant l'instructeur, et éventuellement sa division
6116 */
6117 public function getInstructeurDivision (
6118 int $quartier, int $arrondissement, $section,
6119 int $dadt, int $collectivite, int $commune_id = 0, int $demande_type = 0) : array {
6120
6121 // requête de récupération de l'instructeur à affecter
6122 // (exclu les affectations manuelles supposées avoir été utilisées avant)
6123 $sql = sprintf('
6124 SELECT
6125 instructeur, instructeur_2, section, quartier, arrondissement, dossier_autorisation_type_detaille, dossier_instruction_type
6126 FROM
6127 %1$saffectation_automatique AS AA
6128 WHERE
6129 (AA.affectation_manuelle IS NULL OR AA.affectation_manuelle = \'\')
6130 AND AA.instructeur IS NOT NULL
6131 ',
6132 DB_PREFIXE
6133 );
6134
6135 // si l'identifiant de la demande_type est spécifié, récupère
6136 // le type de dossier d'instruction
6137 $dit = null;
6138 if (empty($demande_type) === false && $demande_type !== 0) {
6139 $demande_type_inst = $this->f->get_inst__om_dbform(array(
6140 "obj" => "demande_type",
6141 "idx" => $demande_type,
6142 ));
6143 $dit = $demande_type_inst->getVal('dossier_instruction_type');
6144 }
6145
6146 // ajoute les conditions SQL correspondantes aux paramètres de filtrage
6147 foreach(array(
6148 'om_collectivite ' => $collectivite,
6149 'dossier_autorisation_type_detaille' => $dadt,
6150 'dossier_instruction_type' => $dit,
6151 'quartier' => $quartier,
6152 'arrondissement' => $arrondissement,
6153 'section' => $section
6154 ) as $column => $value) {
6155 if (empty($value) === false) {
6156 if ($column == 'section') {
6157 $valType = 's'; // string
6158 $value = $this->f->db->escapeSimple($value);
6159 } else {
6160 $valType = 'd'; // int
6161 $value = intval($value);
6162 }
6163 $sql .= sprintf(" AND (AA.$column IS NULL OR AA.$column = '%$valType') ",
6164 $value);
6165 }
6166 else {
6167 $sql .= " AND AA.$column IS NULL ";
6168 }
6169 }
6170 if (!empty($commune_id) && $this->f->is_option_dossier_commune_enabled()) {
6171 $commune = $this->f->findObjectById('commune', $commune_id);
6172 if (!empty($commune)) {
6173 $code_departement = $commune->getVal('dep');
6174 $code_commune = preg_replace('/^'.$code_departement.'/', '', $commune->getVal('com'));
6175 $sql .= sprintf(
6176 " AND (AA.communes IS NULL OR AA.communes ~ '%s') ",
6177 "(^|,)$code_departement($code_commune)?(,|$)");
6178 }
6179 else {
6180 $this->addToLog(__METHOD__."(): commune '$commune_id' non trouvée", DEBUG_MODE);
6181 }
6182 }
6183
6184 // ordonnancement et limite à un seul résultat
6185 $sql .= sprintf("
6186 ORDER BY
6187 communes %s,
6188 dossier_instruction_type %s,
6189 dossier_autorisation_type_detaille %s,
6190 quartier %s,
6191 section %s,
6192 arrondissement %s
6193 LIMIT 1
6194 ",
6195 // on positionne les valeurs NULL en premier si le filtre sur ce champ n'a pas été saisi
6196 $commune_id === 0 ? 'NULLS FIRST' : '',
6197 $dit === 0 ? 'NULLS FIRST' : '',
6198 $dadt === 0 ? 'NULLS FIRST' : '',
6199 $quartier === 0 ? 'NULLS FIRST' : '',
6200 empty($section) === true ? 'NULLS FIRST' : '',
6201 $arrondissement === 0 ? 'NULLS FIRST' : ''
6202 );
6203
6204 // exécution de la requête
6205 $res = $this->f->get_all_results_from_db_query(
6206 $sql,
6207 array(
6208 "origin" => __METHOD__,
6209 )
6210 );
6211 $result = $res['result'];
6212
6213 // si on a récupéré un instructeur correspondant aux critères
6214 if (is_array($result) && count($result) > 0) {
6215
6216 $instructeur = $this->f->get_inst__om_dbform(array(
6217 'obj' => 'instructeur',
6218 'idx' => $result[0]['instructeur'],
6219 ));
6220 $divisionId = $instructeur->getVal('division');
6221
6222 // s'il a une division, retourne l'instructeur et sa division
6223 if (empty($divisionId) === false) {
6224 return array(
6225 'instructeur' => $result[0]['instructeur'],
6226 'instructeur_2' => $result[0]['instructeur_2'],
6227 'division' => $divisionId,
6228 );
6229 }
6230
6231 // aucune division trouvée, retour uniquement l'instructeur
6232 return array(
6233 'instructeur' => $result[0]['instructeur'],
6234 'instructeur_2' => $result[0]['instructeur_2'],
6235 );
6236 }
6237
6238 return array();
6239 }
6240
6241 /**
6242 * Récupère le type détaillé d'une dossier d'autorisation.
6243 *
6244 * @param string $dossier_autorisation DA
6245 *
6246 * @return string identifiant du type détaillé de dossier d'autorisation
6247 */
6248 function get_dossier_autorisation_da_type_detaille($dossier_autorisation) {
6249 //Récupération du dossier_autorisation_type_detaille concerné par le
6250 //$dossier_autorisation
6251 $dossierAutorisation = $this->f->get_inst__om_dbform(array(
6252 "obj" => "dossier_autorisation",
6253 "idx" => $dossier_autorisation
6254 ));
6255 return $dossierAutorisation->getVal('dossier_autorisation_type_detaille');
6256 }
6257
6258 /**
6259 * Cette méthode permet de gérer l'affectation du dossier.
6260 * Deux cas sont gérées :
6261 * - l'affectation a été sélectionnée par l'utilisateur
6262 * - l'affectation est réalisé automatiquement
6263 *
6264 * Renvoie un tableau associatif contenant l'instructeur, la division et
6265 * l'instructeur secondaire du dossier.
6266 *
6267 * Ex : array(
6268 * 'instructeur' => id_instructeur,
6269 * 'instructeur_2' => id_instructeur_2,
6270 * 'division' => id_division
6271 * )
6272 *
6273 * @param array valeurs récupérées à l'ajout du dossier
6274 * @return array tableau contenant l'affectation du dossier
6275 */
6276 protected function affectation_dossier($val) {
6277 $affectation = array(
6278 'instructeur' => null,
6279 'instructeur_2' => null,
6280 'division' => null,
6281 );
6282 // Cas 1 : Vérifie si une valeur d'affectation automatique
6283 // existe. Si c'est le cas c'est que l'affectation a été choisie
6284 // par l'utilisateur.
6285 // Il s'agit donc d'une affectation manuelle
6286 if (empty($val['affectation_automatique']) === false) {
6287 // Récupération de l'affectation automatique correspondante
6288 $idAffectationAuto = intval($val['affectation_automatique']);
6289 // Préparation des logs
6290 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6291 "non trouvée";
6292 $logMsgMode = DEBUG_MODE;
6293
6294 $affectationAuto = $this->f->get_inst__om_dbform(array(
6295 "obj" => "affectation_automatique",
6296 "idx" => $idAffectationAuto
6297 ));
6298 // Vérifie que l'affectation automatique a été correctement récupérée en regardant
6299 // si l'objet instancié a un identifiant non null
6300 if (empty($affectationAuto->getVal($affectationAuto->clePrimaire)) === false) {
6301 // log si l'instructeur n'est pas défini
6302 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6303 "pas d'instructeur défini";
6304 // On cherche maintenant à récupérer l'instructeur principal visé par cette affectation
6305 // et sa division
6306 $instructeurId = $affectationAuto->getVal('instructeur');
6307 if (! empty($instructeurId)) {
6308 // log si l'instructeur n'existe pas
6309 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6310 "instructeur '$instructeurId' non trouvé";
6311 // De la même manière que pour l'affectation automatique on instancie
6312 // l'instructeur avec l'identifiant issus de l'affectation et on vérifie
6313 // si l'instructeur a bien été récupéré.
6314 $instructeur = $this->f->get_inst__om_dbform(array(
6315 "obj" => "instructeur",
6316 "idx" => intval($instructeurId)
6317 ));
6318 if (empty($instructeur->getVal($instructeur->clePrimaire)) === false) {
6319 // Récupération de l'identifiant et de la division de l'instructeur principal
6320 $affectation['instructeur'] = $instructeurId;
6321 $affectation['division'] = $instructeur->getVal('division');
6322
6323 // log le succès
6324 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6325 "instructeur [".$affectation['instructeur']."] ".
6326 "'".$instructeur->getVal('nom')."' affecté, avec sa division ".
6327 "'".$affectation['division']."'";
6328 $logMsgMode = EXTRA_VERBOSE_MODE;
6329 }
6330 }
6331 // Affichage des log de la récupération de l'instructeur principal et de sa division
6332 $this->addToLog($logMsg, $logMsgMode);
6333
6334 // Si l'affectation donne aussi un instructeur secondaire on le récupère
6335 $instructeur2Id = $affectationAuto->getVal('instructeur_2');
6336 // log si aucun instructeur secondaire est défini
6337 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6338 "pas de second instructeur défini";
6339 $logMsgMode = EXTRA_VERBOSE_MODE;
6340 if (empty($instructeur2Id) === false) {
6341 // log si l'instructeur n'existe pas
6342 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6343 "second instructeur '$instructeur2Id' non trouvé";
6344 $logMsgMode = DEBUG_MODE;
6345 // Instancie l'instructeur secondaire et vérifie si il a bien été récupéré
6346 $instructeur2 = $this->f->get_inst__om_dbform(array(
6347 "obj" => "instructeur",
6348 "idx" => intval($instructeur2Id)
6349 ));
6350 if (empty($instructeur2) === false) {
6351 // Récupération de l'identifiant l'instructeur secondaire
6352 $affectation['instructeur_2'] = $instructeur2Id;
6353
6354 // log le succès
6355 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6356 "second instructeur [".$affectation['instructeur_2']."] ".
6357 "'".$instructeur2->getVal('nom')."' affecté";
6358 $logMsgMode = EXTRA_VERBOSE_MODE;
6359 }
6360 }
6361 // Affichage des log de la récupération de l'instructeur secondaire
6362 $this->addToLog($logMsg, $logMsgMode);
6363
6364 // succès : plus rien à logger
6365 $logMsg = null;
6366 $logMsgMode = null;
6367 }
6368
6369 // affectation automatique inexistante
6370 if (empty($logMsg) === false && empty($logMsgMode) === false) {
6371 $this->addToLog($logMsg, $logMsgMode);
6372 }
6373 }
6374
6375
6376 // Cas 2 : Si aucune affectation automatique n'a été choisi alors on cherche la plus adaptée
6377
6378 // si l'instructeur n'a pas déjà été récupéré et si on a pas de numéro de dossier d'autorisation
6379 // alors l'affectation ne pourra pas être effectué sur ce dossier
6380 if (empty($affectation['instructeur']) === true
6381 && empty($val['dossier_autorisation']) === false) {
6382
6383 // Sinon on récupère le type détaillé du DA
6384 $dadt = $this->get_dossier_autorisation_da_type_detaille($val['dossier_autorisation']);
6385
6386 // si la commune est spécifiée
6387 $commune_id = 0;
6388 if (isset($val['commune']) && $this->f->is_option_dossier_commune_enabled()) {
6389 $commune_id = $val['commune'];
6390 }
6391
6392 // récupération de l'instructeur ainsi que de sa division
6393 $instructeurDivision = $this->getInstructeurDivision(
6394 intval($val['quartier']),
6395 intval($val['arrondissement']),
6396 $val['section'],
6397 intval($dadt),
6398 intval($val['om_collectivite']),
6399 intval($commune_id),
6400 intval($val['demande_type'])
6401 );
6402
6403 if (! empty($instructeurDivision['instructeur']) === true &&
6404 ! empty($instructeurDivision['division']) === true) {
6405 $affectation['instructeur'] = $instructeurDivision['instructeur'];
6406 $affectation['division'] = $instructeurDivision['division'];
6407 }
6408
6409 if (isset($instructeurDivision['instructeur_2']) === true
6410 && empty($instructeurDivision['instructeur_2']) === false) {
6411 //
6412 $affectation['instructeur_2'] = $instructeurDivision['instructeur_2'];
6413 }
6414 }
6415
6416 // Préviens l'utilisateur si l'affectation du dossier n'a pas pu être réalisée.
6417 if (empty($affectation['instructeur']) === true) {
6418 $affMsg = "<br/> "._("Aucun instructeur compatible avec ce dossier trouve, ".
6419 "contactez votre administrateur afin d'en assigner un ".
6420 "a ce dossier.")." <br/>";
6421
6422 if ($this->f->isAccredited("dossier_modifier_instructeur") === true) {
6423 $affMsg = "<br/> "._("Pensez a assigner un instructeur a ce dossier.")." <br/>";
6424 }
6425 $this->addToMessage($affMsg);
6426 }
6427
6428 return $affectation;
6429 }
6430
6431 /**
6432 * TRIGGER - triggermodifierapres.
6433 *
6434 * - Interface avec le référentiel ERP [101]
6435 * - Interface avec le référentiel ERP [102][103]
6436 * - Interface avec le référentiel ERP [114]
6437 * - Gestion des demandeurs liés
6438 * - Gestion des références cadastrales / parcelles liées
6439 * - Gestion des taxes
6440 *
6441 * @return boolean
6442 */
6443 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6444 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6445
6446 // Liaisons NaN
6447 foreach ($this->liaisons_nan as $liaison_nan) {
6448 // Suppression des liaisons table NaN
6449 $this->supprimer_liaisons_table_nan($liaison_nan["table_l"]);
6450 // Ajout des liaisons table Nan
6451 $nb_liens = $this->ajouter_liaisons_table_nan(
6452 $liaison_nan["table_l"],
6453 $liaison_nan["table_f"],
6454 $liaison_nan["field"],
6455 $val[$liaison_nan["field"]]
6456 );
6457 // Message de confirmation
6458 if ($nb_liens > 0) {
6459 $this->addToMessage(__("Mise à jour des liaisons realisée avec succès."));
6460 }
6461 }
6462
6463 // Mise à jour DA si miroir du DI
6464 $inst_da = $this->get_inst_dossier_autorisation($this->getVal('dossier_autorisation'));
6465 if ($inst_da->is_dossier_autorisation_visible() === false) {
6466 $params = array(
6467 'di_id' => $this->getVal($this->clePrimaire),
6468 );
6469 if ($inst_da->majDossierAutorisation($params) === false) {
6470 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
6471 return false;
6472 }
6473 }
6474
6475 /**
6476 * Interface avec le référentiel ERP.
6477 *
6478 * (WS->ERP)[101] ERP Qualifié -> AT
6479 * Déclencheur :
6480 * - L'option ERP est activée
6481 * - Le dossier est de type AT
6482 * - Le dossier est marqué comme "connecté au référentiel ERP"
6483 * - Le formulaire de modification du dossier est validé avec le
6484 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
6485 * "OUI"
6486 */
6487 //
6488 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6489 && $this->is_connected_to_referentiel_erp() === true
6490 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')
6491 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false) {
6492 // Récupère la liste des contraintes
6493 $contraintes_plu_list = $this->getListContrainte($this->valF['dossier'], false);
6494 // Extrait les libellés de chaque contraintes
6495 $contraintes_plu = array();
6496 $contraintes_plu_string = "";
6497 foreach ($contraintes_plu_list as $row) {
6498 //
6499 $contraintes_plu[] = $row['contrainte_libelle'];
6500 }
6501 // Chaîne de caractère listant toutes les contraintes du dossier
6502 $contraintes_plu_string = implode(' ; ', $contraintes_plu);
6503 $competence = "";
6504 if ($this->valF['autorite_competente'] !== null) {
6505 $inst_ac = $this->get_inst_autorite_competente($this->valF['autorite_competente']);
6506 $competence = $inst_ac->getVal("libelle");
6507 }
6508 //
6509 $infos = array(
6510 "dossier_instruction" => $this->valF['dossier'],
6511 "competence" => $competence,
6512 "contraintes_plu" => $contraintes_plu_string,
6513 "references_cadastrales" => $this->getReferenceCadastrale($this->valF['dossier']),
6514 );
6515 //
6516 $ret = $this->f->send_message_to_referentiel_erp(101, $infos);
6517 if ($ret !== true) {
6518 $this->cleanMessage();
6519 $this->addToMessage(_("Une erreur s'est produite lors de la notification (101) du référentiel ERP. Contactez votre administrateur."));
6520 return false;
6521 }
6522 $this->addToMessage(_("Notification (101) du référentiel ERP OK."));
6523 }
6524
6525 /**
6526 * Interface avec le référentiel ERP.
6527 *
6528 * (WS->ERP)[102] Demande de complétude de dossier PC pour un ERP -> PC qui concerne un ERP
6529 * (WS->ERP)[103] Demande de qualification de dossier PC pour un ERP -> PC qui concerne un ERP
6530 * Déclencheur :
6531 * - L'option ERP est activée
6532 * - Le dossier est de type PC
6533 * - Le formulaire de modification du dossier est validé avec le
6534 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
6535 * "OUI"
6536 * - Le formulaire de modification du dossier est validé avec le
6537 * marqueur "ERP" à "OUI"
6538 */
6539 //
6540 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6541 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
6542 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
6543 && $this->valF['erp'] == true) {
6544 //
6545 $infos = array(
6546 "dossier_instruction" => $this->valF['dossier'],
6547 );
6548 // [102] Demande de complétude de dossier PC pour un ERP
6549 $ret = $this->f->send_message_to_referentiel_erp(102, $infos);
6550 if ($ret !== true) {
6551 $this->cleanMessage();
6552 $this->addToMessage(_("Une erreur s'est produite lors de la notification (102) du référentiel ERP. Contactez votre administrateur."));
6553 return false;
6554 }
6555 $this->addToMessage(_("Notification (102) du référentiel ERP OK."));
6556 // [103] Demande de qualification de dossier PC pour un ERP
6557 $ret = $this->f->send_message_to_referentiel_erp(103, $infos);
6558 if ($ret !== true) {
6559 $this->cleanMessage();
6560 $this->addToMessage(_("Une erreur s'est produite lors de la notification (103) du référentiel ERP. Contactez votre administrateur."));
6561 return false;
6562 }
6563 $this->addToMessage(_("Notification (103) du référentiel ERP OK."));
6564 }
6565
6566 /**
6567 * Interface avec le référentiel ERP.
6568 *
6569 * (WS->ERP)[114] ERP Qualifié -> PC
6570 * Déclencheur :
6571 * - l'option ERP est activée
6572 * - ET le dossier est marqué comme "connecté au référentiel ERP"
6573 * - ET le dossier est de type PC
6574 * - ET
6575 * - soit le formulaire de modification du dossier est validé avec le
6576 * marqueur "enjeu_urba" qui change de statut
6577 * - soit ce marqueur est vrai et le dossier passe à qualifié
6578 */
6579 // Étant donné que l'objet a été modifié en base après sa création,
6580 // il faut le ré-instancier pour récupérer ses informations.
6581 $dossier = $this->f->get_inst__om_dbform(array(
6582 "obj" => "dossier",
6583 "idx" => $this->valF['dossier'],
6584 ));
6585 if ($dossier->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6586 && $dossier->is_connected_to_referentiel_erp() === true
6587 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
6588 && (($this->getVal('enjeu_urba') == 't') != $this->valF['enjeu_urba']
6589 || ($this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
6590 && $this->getVal('enjeu_urba') == 't'))) {
6591
6592 $enjeu = "non";
6593 if ($this->valF['enjeu_urba']) {
6594 $enjeu = "oui";
6595 }
6596
6597 $infos = array(
6598 "dossier_instruction" => $this->valF['dossier'],
6599 "Dossier à enjeu ADS" => $enjeu
6600 );
6601 //
6602 $ret = $this->f->send_message_to_referentiel_erp(114, $infos);
6603 if ($ret !== true) {
6604 $this->cleanMessage();
6605 $this->addToMessage(_("Une erreur s'est produite lors de la notification (114) du référentiel ERP. Contactez votre administrateur."));
6606 return false;
6607 }
6608 $this->addToMessage(_("Notification (114) du référentiel ERP OK."));
6609 }
6610
6611 /**
6612 * Gestion des demandeurs liés.
6613 */
6614 // Ajout ou modification des demandeurs
6615 $this->insertLinkDossierDemandeur();
6616
6617 /**
6618 * Gestion des références cadastrales / parcelles liées.
6619 */
6620 // Si le champ des références cadastrales n'est pas vide
6621 if ($this->getVal('terrain_references_cadastrales')
6622 != $this->valF['terrain_references_cadastrales']) {
6623
6624 // On supprime toutes les lignes de la table dossier_parcelle qui
6625 // font référence le dossier en cours de modification
6626 $this->supprimer_dossier_parcelle($val['dossier']);
6627
6628 // Ajout des parcelles dans la table dossier_parcelle
6629 $this->ajouter_dossier_parcelle($val['dossier'],
6630 $val['terrain_references_cadastrales']);
6631
6632 }
6633
6634 /**
6635 * Gestion des taxes.
6636 */
6637 // Si le champ tax_secteur est modifié et que l'option de simulation des
6638 // taxes est activée
6639 if ($this->getVal('tax_secteur') != $this->valF['tax_secteur']
6640 && $this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true) {
6641
6642 // Valeurs pour le calcul de la taxe d'aménagement
6643 $values = array();
6644 // Instance de la classe donnees_techniques
6645 $donnees_techniques = $this->get_inst_donnees_techniques();
6646 // Récupère les valeurs des données techniques
6647 $values = $donnees_techniques->get_form_val();
6648
6649 // Met à jour les montants du dossier
6650 $update_dossier_tax_mtn = $this->update_dossier_tax_mtn($this->valF['tax_secteur'], $values);
6651 if ($update_dossier_tax_mtn === false) {
6652 //
6653 $this->addToMessage(_("La mise a jour des montants de la simulation de la taxe d'amenagement a echouee."));
6654 //
6655 return false;
6656 }
6657 }
6658
6659 /**
6660 * Gestion des métadonées des pièces liés.
6661 * Vérifie les méthodes à exécuter configurées dans le connecteur du
6662 * filestorage.
6663 */
6664 //
6665 $ret = $this->post_update_metadata($val);
6666 //
6667 if ($ret === false) {
6668 //
6669 $this->cleanMessage();
6670 $this->addToMessage(_("La mise à jour des métadonnées des pièces liées à ce dossier a échouée."));
6671 return false;
6672 }
6673
6674 /**
6675 * Gestion des du changement de date de dépôt.
6676 * Vérification préalable de la présence de la date et de sa
6677 * modification.
6678 */
6679 //
6680 if (array_key_exists("date_depot", $val) === true) {
6681 //
6682 $inst_new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
6683 $inst_old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
6684 $new_date = $inst_new_date->format('d/m/Y');
6685 $old_date = $inst_old_date->format('d/m/Y');
6686
6687 //
6688 if ($new_date !== $old_date) {
6689 //
6690 $status = $this->update_date_depot($val["date_depot"]);
6691 //
6692 if ($status === false) {
6693 //
6694 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
6695 return false;
6696 }
6697
6698 }
6699 }
6700
6701 /**
6702 * Gestion de la normalisation de l'adresse.
6703 * En cas de modification de l'adresse du terrain, l'adresse normalisée
6704 * est supprimée.
6705 */
6706 $list_address_keys = array(
6707 'terrain_adresse_voie_numero',
6708 'terrain_adresse_voie',
6709 'terrain_adresse_lieu_dit',
6710 'terrain_adresse_localite',
6711 'terrain_adresse_code_postal',
6712 'terrain_adresse_bp',
6713 'terrain_adresse_cedex',
6714 );
6715 $change = false;
6716 foreach ($list_address_keys as $key) {
6717 if (array_key_exists($key, $val) === true
6718 && $val[$key] !== $this->getVal($key)) {
6719 //
6720 $change = true;
6721 break;
6722 }
6723 }
6724 if ($change === true) {
6725 $this->normalize_address();
6726 }
6727
6728 if ($this->f->is_option_mode_service_consulte_enabled() === false
6729 && $this->f->is_type_dossier_platau($this->valF['dossier_autorisation']) === true
6730 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
6731
6732 $trigger_platau_required_fields = $this->trigger_platau_required_fields($this->valF['dossier']);
6733 // Gestion de l'erreur
6734 if (! $trigger_platau_required_fields) {
6735 $this->addToMessage(sprintf('%s %s',
6736 __("Une erreur s'est produite lors de la mise à jour de l'état de transmission du dossier."),
6737 __("Veuillez contacter votre administrateur.")
6738 ));
6739 $this->correct = false;
6740 return false;
6741 }
6742 }
6743
6744 /**
6745 * Gestion des tâches pour la dématérialisation
6746 */
6747 // Qualification du dossier d'instruction
6748 if ($this->getVal('instructeur') != $this->valF['instructeur']
6749 || $this->getVal('division') != $this->valF['division']) {
6750 //
6751 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6752 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6753 && ($this->f->is_option_mode_service_consulte_enabled() !== true
6754 || ($this->f->is_option_mode_service_consulte_enabled() === true
6755 && ($this->get_source_depot_from_demande() === PLATAU
6756 || $this->get_source_depot_from_demande() === PORTAL)))) {
6757 //
6758 $inst_task = $this->f->get_inst__om_dbform(array(
6759 "obj" => "task",
6760 "idx" => 0,
6761 ));
6762 $task_val = array(
6763 'type' => 'qualification_DI',
6764 'object_id' => $id,
6765 'dossier' => $id,
6766 );
6767 if ($this->f->is_option_mode_service_consulte_enabled() === false
6768 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6769 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6770 $task_val['state'] = $inst_task::STATUS_DRAFT;
6771 }
6772 $add_task = $inst_task->add_task(array('val' => $task_val));
6773 if ($add_task === false) {
6774 $this->addToMessage(sprintf('%s %s',
6775 __("Une erreur s'est produite lors de la création tâche."),
6776 __("Veuillez contacter votre administrateur.")
6777 ));
6778 $this->correct = false;
6779 return false;
6780 }
6781 }
6782 }
6783 // Modification du dossier d'instruction
6784 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6785 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6786 && ($this->f->is_option_mode_service_consulte_enabled() !== true
6787 || ($this->f->is_option_mode_service_consulte_enabled() === true
6788 && ($this->get_source_depot_from_demande() === PLATAU
6789 || $this->get_source_depot_from_demande() === PORTAL)))) {
6790 //
6791 $inst_task = $this->f->get_inst__om_dbform(array(
6792 "obj" => "task",
6793 "idx" => 0,
6794 ));
6795 $task_val = array(
6796 'type' => 'modification_DI',
6797 'object_id' => $id,
6798 'dossier' => $id,
6799 );
6800 // Change l'état de la tâche de notification en fonction de l'état de
6801 // transmission du dossier d'instruction
6802 if ($this->f->is_option_mode_service_consulte_enabled() === false
6803 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6804 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6805 //
6806 $task_val['state'] = $inst_task::STATUS_DRAFT;
6807 }
6808 $add_task = $inst_task->add_task(array('val' => $task_val));
6809 if ($add_task === false) {
6810 $this->addToMessage(sprintf('%s %s',
6811 __("Une erreur s'est produite lors de la création tâche."),
6812 __("Veuillez contacter votre administrateur.")
6813 ));
6814 $this->correct = false;
6815 return false;
6816 }
6817 // XXX Les données du DA sont mises à jour seulement lors de l'ajout ou modification
6818 // d'une instruction du DI initial et lors de la décision sur le DI non initial.
6819 // Sachant ce comportement, voir si cette tâche modification_DA est bien située.
6820 // $inst_task = $this->f->get_inst__om_dbform(array(
6821 // "obj" => "task",
6822 // "idx" => 0,
6823 // ));
6824 // $task_val = array(
6825 // 'type' => 'modification_DA',
6826 // 'object_id' => $this->getVal('dossier_autorisation'),
6827 // 'dossier' => $this->getVal('dossier_autorisation'),
6828 // );
6829 // // Change l'état de la tâche de notification en fonction de l'état de
6830 // // transmission du dossier d'instruction
6831 // if ($this->f->is_option_mode_service_consulte_enabled() === false
6832 // && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6833 // || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6834 // //
6835 // $task_val['state'] = $inst_task::STATUS_DRAFT;
6836 // }
6837 // $add_task = $inst_task->add_task(array('val' => $task_val));
6838 // if ($add_task === false) {
6839 // $this->addToMessage(sprintf('%s %s',
6840 // __("Une erreur s'est produite lors de la création tâche."),
6841 // __("Veuillez contacter votre administrateur.")
6842 // ));
6843 // $this->correct = false;
6844 // return false;
6845 // }
6846 }
6847
6848 //
6849 return true;
6850 }
6851
6852 /**
6853 * TRIGGER - triggermodifier.
6854 *
6855 * @return boolean
6856 */
6857 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6858 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6859 // Si la date de dépôt a changé et si elle valait celle du dernier dépôt
6860 // alors cette dernière prend également sa valeur
6861 if ($this->f->formatDate($this->getVal('date_depot')) !== $val['date_depot']
6862 && $this->f->formatDate($this->getVal('date_depot')) === $this->f->formatDate($this->getVal('date_dernier_depot'))) {
6863 $this->valF['date_dernier_depot'] = $this->valF['date_depot'];
6864 }
6865 //
6866 return true;
6867 }
6868
6869 /**
6870 * Methode de traitement suite à la modification de la date de dépot.
6871 *
6872 * @param string $new_date_str Nouvelle date de dépot.
6873 *
6874 * @return boolean
6875 */
6876 function update_date_depot($new_date_str) {
6877 $demande = $this->get_inst_demande();
6878 // TODO: should return null instead of false
6879 if ($demande === false) {
6880 return false;
6881 }
6882
6883 $retour = $this->majDateInstruction($demande->getVal("instruction_recepisse"), $new_date_str);
6884 if ($retour === false) {
6885 return false;
6886 }
6887
6888 $valF = array();
6889 foreach ($demande->champs as $id => $champ) {
6890 $valF[$champ] = $demande->val[$id];
6891 }
6892 $valF['date_demande'] = $new_date_str;
6893 $modification = $demande->modifier($valF);
6894 if ($modification === false) {
6895 return false;
6896 }
6897
6898 $row_date = array("date_demande" => $new_date_str);
6899 $res = $this->f->db->autoExecute(
6900 DB_PREFIXE."dossier",
6901 $row_date,
6902 DB_AUTOQUERY_UPDATE,
6903 "dossier = '".$this->getVal("dossier")."'"
6904 );
6905 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6906 if ($this->f->isDatabaseError($res, true)) {
6907 return false;
6908 }
6909
6910 // Si c'est un dossier d'instruction initial
6911 $di_version = $this->get_di_numero_suffixe();
6912 if ($di_version === 0 || $di_version === '0') {
6913 //
6914 $row_date = array("depot_initial" => $new_date_str);
6915 $res = $this->f->db->autoExecute(
6916 DB_PREFIXE."dossier_autorisation",
6917 $row_date,
6918 DB_AUTOQUERY_UPDATE,
6919 "dossier_autorisation = '" . $this->getVal("dossier_autorisation") . "'"
6920 );
6921 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6922 if ($this->f->isDatabaseError($res, true)) {
6923 return false;
6924 }
6925 }
6926 }
6927
6928
6929 /**
6930 * Met à jour l'instruction en fonction de la nouvelle date
6931 * ou retourne false si il ya une erreur.
6932 *
6933 * @param integer $instruction_id Identifiant de l'instruction.
6934 * @param string $date_depot Nouvelle date de dépôt.
6935 *
6936 * @return boolean
6937 */
6938 public function majDateInstruction($instruction_id, $date_depot) {
6939
6940 // Definalise l'instruction de récépissé si nécessaire
6941 $instruction = $this->f->get_inst__om_dbform(array(
6942 "obj" => "instruction",
6943 "idx" => $instruction_id,
6944 ));
6945 $instruction->setParameter('maj', 110);
6946 //
6947 if ($instruction->is_unfinalizable_without_bypass() === true
6948 && $instruction->unfinalize($instruction->valF) === false) {
6949 return false;
6950 }
6951
6952 // Modifie la date d'événement
6953 $instruction->setParameter('maj', 1);
6954 //
6955 $valF = array();
6956 foreach ($instruction->champs as $id => $champ) {
6957 $valF[$champ] = $instruction->getVal($champ);
6958 }
6959 //
6960 $valF['date_evenement'] = $date_depot;
6961 $valF['date_finalisation_courrier'] = null;
6962 //
6963 $modification = $instruction->modifier($valF);
6964 //
6965 if ($modification === false) {
6966 return false;
6967 }
6968
6969 // Finalise l'instruction
6970 $instruction->setParameter('maj', 100);
6971 if ($instruction->finalize($instruction->valF) === false) {
6972 return false;
6973 }
6974
6975 //
6976 return true;
6977 }
6978
6979 /**
6980 * TODO: replace with '$this->f->findObjectById' ?
6981 *
6982 * Récupère l'instance de l'autorité compétente.
6983 *
6984 * @param string $autorite_competente Identifiant de l'autorité compétente.
6985 *
6986 * @return object
6987 */
6988 function get_inst_autorite_competente($autorite_competente = null) {
6989 //
6990 return $this->get_inst_common("autorite_competente", $autorite_competente);
6991 }
6992
6993
6994 /**
6995 * Met à jour les montants des taxes du dossier d'instruction.
6996 *
6997 * @param integer $tax_secteur Secteur communal.
6998 * @param array $val Valeurs des données techniques.
6999 *
7000 * @return boolean
7001 */
7002 public function update_dossier_tax_mtn($tax_secteur, $val = array()) {
7003 // Instance du paramétrage de la taxe d'aménagement
7004 $taxe_amenagement = $this->get_inst_taxe_amenagement();
7005
7006 // Liste des montants à mettre à jour
7007 $valF = array();
7008 $valF['tax_mtn_part_commu'] = null;
7009 $valF['tax_mtn_part_depart'] = null;
7010 $valF['tax_mtn_part_reg'] = null;
7011 $valF['tax_mtn_total'] = null;
7012 $valF['tax_mtn_rap'] = null;
7013 $valF['tax_mtn_part_commu_sans_exo'] = null;
7014 $valF['tax_mtn_part_depart_sans_exo'] = null;
7015 $valF['tax_mtn_part_reg_sans_exo'] = null;
7016 $valF['tax_mtn_total_sans_exo'] = null;
7017 $valF['tax_mtn_rap_sans_exo'] = null;
7018
7019 // Si le tableau des valeurs n'est pas vide
7020 if ($val !== array()) {
7021
7022 // Si le taux communal est renseigné
7023 if ($taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== null
7024 && $taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== '') {
7025
7026 // Calcul de la TA
7027 $calcul_ta = $taxe_amenagement->compute_ta($tax_secteur, $val);
7028
7029 // Si chaque résultat est calculable
7030 if ($calcul_ta !== null && is_array($calcul_ta) === true) {
7031
7032 // Total des parts de la TA avec exonération
7033 $total_ta = $calcul_ta['commu'] + $calcul_ta['depart'] + $calcul_ta['reg'];
7034 $total_ta_ss_exo = $calcul_ta['commu_ss_exo'] + $calcul_ta['depart_ss_exo'] + $calcul_ta['reg_ss_exo'];
7035
7036 // Valeurs à mettre à jour, les montants doivent être à l'entier
7037 // inférieur
7038 $valF['tax_mtn_part_commu'] = floor(floatval($calcul_ta['commu']));
7039 $valF['tax_mtn_part_depart'] = floor(floatval($calcul_ta['depart']));
7040 $valF['tax_mtn_part_reg'] = floor(floatval($calcul_ta['reg']));
7041 $valF['tax_mtn_total'] = floor(floatval($total_ta));
7042 $valF['tax_mtn_part_commu_sans_exo'] = floor(floatval($calcul_ta['commu_ss_exo']));
7043 $valF['tax_mtn_part_depart_sans_exo'] = floor(floatval($calcul_ta['depart_ss_exo']));
7044 $valF['tax_mtn_part_reg_sans_exo'] = floor(floatval($calcul_ta['reg_ss_exo']));
7045 $valF['tax_mtn_total_sans_exo'] = floor(floatval($total_ta_ss_exo));
7046 }
7047 }
7048
7049 // Calcul de la RAP
7050 $calcul_rap = $taxe_amenagement->compute_rap($val);
7051
7052 // Si chaque résultat est calculable
7053 if ($calcul_rap !== null && is_array($calcul_rap) === true) {
7054
7055 // RAP avec exonération
7056 $mtn_rap = $calcul_rap['rap'];
7057 // RAP sans exonération
7058 $mtn_rap_ss_exo = $calcul_rap['rap_ss_exo'];
7059
7060 // Valeurs à mettre à jour, les montants doivent être à l'entier
7061 // inférieur
7062 $valF['tax_mtn_rap'] = floor(floatval($mtn_rap));
7063 $valF['tax_mtn_rap_sans_exo'] = floor(floatval($mtn_rap_ss_exo));
7064 }
7065 }
7066
7067 // Met à jour l'enregistrement de dossier
7068 $res = $this->f->db->autoExecute(
7069 DB_PREFIXE.$this->table,
7070 $valF,
7071 DB_AUTOQUERY_UPDATE,
7072 $this->clePrimaire ."='".$this->getVal($this->clePrimaire)."'"
7073 );
7074 // Log
7075 $this->f->addToLog(__METHOD__."() : db->autoExecute(".$res.")", VERBOSE_MODE);
7076 //
7077 if ($this->f->isDatabaseError($res, true)) {
7078 //
7079 $this->correct = false;
7080 return false;
7081 }
7082
7083 //
7084 return true;
7085 }
7086
7087 /**
7088 * TRIGGER - triggersupprimer.
7089 *
7090 * @return boolean
7091 */
7092 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
7093 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
7094
7095 // Permet de récupérer la le type de demande pour la gestion du numéro de dossier.
7096 $inst_demande = $this->get_inst_demande();
7097 $this->val['demande_type'] = $inst_demande->getVal('demande_type');
7098
7099 /**
7100 * Gestion de la suppression des tables liées au dossier d'instruction.
7101 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
7102 */
7103 if (! isset($this->related_tables)) {
7104 $this->set_related_tables();
7105 }
7106 // Supprime les enregistrements des tables
7107 $delete = $this->delete_related_tables($this->related_tables);
7108 if ($delete === false) {
7109 return false;
7110 }
7111
7112 //
7113 return true;
7114 }
7115
7116 /**
7117 * TRIGGER - triggersupprimerapres.
7118 *
7119 * @return boolean
7120 */
7121 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
7122 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
7123
7124 /**
7125 * Gestion de la suppression des tables liées au dossier d'instruction.
7126 * Dans le cas d'un dossier d'instruction initial le dossier
7127 * d'autorisation est également supprimé pour libérer la numéroration.
7128 * S'il s'agit d'un dossier d'instruction sur exsitant alors le dossier
7129 * d'autorisation est mise à jour.
7130 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
7131 */
7132 // S'il s'agit d'une suppression de dossier d'instruction sur existant
7133 if ($this->has_only_initial_di(true) === false) {
7134 // Mise à jour des données du dossier d'autorisation
7135 $da = $this->f->get_inst__om_dbform(array(
7136 "obj" => "dossier_autorisation",
7137 "idx" => $this->getVal("dossier_autorisation"),
7138 ));
7139 $da->majDossierAutorisation();
7140
7141 } else {
7142 // S'il s'agit d'une suppression de dossier d'instruction initial
7143 // Tableau pour la conception des requêtes de suppression
7144 $related_tables = array(
7145 'lien_dossier_autorisation_demandeur' => array(
7146 'condition_field' => 'dossier_autorisation',
7147 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7148 ),
7149 'dossier_autorisation_parcelle' => array(
7150 'condition_field' => 'dossier_autorisation',
7151 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7152 ),
7153 'donnees_techniques' => array(
7154 'condition_field' => 'dossier_autorisation',
7155 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7156 ),
7157 'dossier_autorisation' => array(
7158 'condition_field' => 'dossier_autorisation',
7159 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7160 ),
7161 );
7162 // Supprime les tables
7163 $delete = $this->delete_related_tables($related_tables);
7164 if ($delete === false) {
7165 return false;
7166 }
7167
7168 // Compose le nom de la séquence
7169 $seq_name = null;
7170 $datc = $this->getVal('numerotation_type');
7171 $annee = $this->getVal('annee');
7172 $dep = $this->getVal('numerotation_dep');
7173 $com = $this->getVal('numerotation_com');
7174 // TODO si les tests se déroulent bien;
7175 // - supprimer la création manuelle de la séquence avec 'sprintf(...)'
7176 // - conserver uniquement l'usage de 'compose_sequence_name(...)'
7177 if (! empty($datc) && ! empty($annee) && ! empty($dep) && ! empty($com)) {
7178 $seq_name = strtolower(sprintf(
7179 '%sdossier_%s_%s_%s_%s_seq',
7180 DB_PREFIXE,
7181 $datc,
7182 $annee,
7183 $dep,
7184 $com
7185 ));
7186 $alt_seq_name = $this->compose_sequence_name($datc, $annee, $dep, $com);
7187 if ($seq_name != $alt_seq_name) {
7188 throw new RuntimeException("Sequence names differs ($seq_name != $alt_seq_name) for $id");
7189 }
7190 }
7191
7192 // si il manque l'une des données, c'est que le dossier a un numéro qui ne respecte pas
7193 // la norme urbanisme et donc on a pas su le décomposer lors de la création du dossier
7194 // (moment où ces données sont renseignées) et la séquence (qui utilise ces données) n'a
7195 // pas pu être constituée et donc pas incrémentée lors de la création du dossier.
7196 // C'est pourquoi il ne faut pas modifier la séquence non-plus lors de la suppression.
7197 else {
7198 foreach(array('numerotation_type', 'annee', 'numerotation_dep', 'numerotation_com') as $key) {
7199 if (empty($this->getVal($key) )) {
7200 $this->f->addToLog("Valeur vide pour le champ '$key' du dossier $id", VERBOSE_MODE);
7201 }
7202 }
7203 }
7204 // Instancie le dossier d'autorisation sans identifiant
7205 $da = $this->f->get_inst__om_dbform(array(
7206 "obj" => "dossier_autorisation",
7207 "idx" => 0,
7208 ));
7209
7210 // Si la séquence a pu être composée et que celle-ci existe
7211 if (! empty($seq_name ) && $da->doesNumeroDossierSequenceExists($seq_name) === true){
7212 /**
7213 * Mise à jour de la séquence.
7214 */
7215 $curr_da_num = $da->getMaxDANumeroDossier($datc, $annee, $dep, $com);
7216 if (is_integer($curr_da_num) !== true) {
7217 $this->addToMessage(__('Erreur lors du calcul du numéro de dossier.'));
7218 return false;
7219 }
7220
7221 // Dans le cas de la suppression du dernier dossier d'instruction de
7222 // sa numérotation alors la séquence est supprimée
7223 if ($curr_da_num === 0) {
7224 $table_name = substr($seq_name, 0, -4);
7225 $res = $this->f->db->dropSequence($table_name);
7226 $this->f->addToLog(__METHOD__."(): db->dropSequence(\"".$table_name."\");", VERBOSE_MODE);
7227 $this->f->isDatabaseError($res);
7228 } else {
7229 // La méthode setval avec la valeur true en troisième argument
7230 // signifie que le prochain nextval avancera la séquence avant
7231 // de renvoyer une valeur.
7232 // TODO : cette requête ne sert pas à récupérer des résultats mais
7233 // juste à mettre à un numéro de séquence. Voir si il n'est pas judicieux
7234 // d'avoir une autre méthode plutôt qu'un get_result pour ce genre de cas
7235 $this->f->get_all_results_from_db_query(
7236 sprintf(
7237 'SELECT
7238 setval(\'%s\', %s, true)',
7239 $this->f->db->escapeSimple($seq_name),
7240 $this->f->db->escapeSimple($curr_da_num)
7241 ),
7242 array(
7243 'origin' => __METHOD__
7244 )
7245 );
7246 }
7247 }
7248 // Si le dossier n'est pas décomposable et donc que la séquence du dossier n'a pas
7249 // été mise à jour
7250 else {
7251 $id_di = $this->getVal($this->clePrimaire);
7252
7253 // si l'option de saisie complète du numéro de dossier n'est pas activée, c'est un
7254 // bug (ou défaut de paramétrage)
7255 if (! $this->f->is_option_dossier_saisie_numero_complet_enabled($this->getVal('om_collectivite'))) {
7256 throw new RuntimeException(
7257 "Le dossier supprimé '$id_di' n'a pas de séquence correspondante, ".
7258 "alors que l'option 'dossier_saisie_numero_complet' n'est pas activée: BUG ?!");
7259 }
7260
7261 // ajoute un message de log pour avoir un suivi
7262 $this->f->addToLog(
7263 __METHOD__."(): INFO: le dossier '$id_di' n'étant pas à la norme urba, ".
7264 "la séquence correspondante n'a pas besoin d'être mise à jour.",
7265 DEBUG_MODE
7266 );
7267 }
7268 }
7269
7270 /**
7271 * Supprime le dossier d'instruction des derniers dossiers consultés,
7272 * sauvegardé en session
7273 */
7274 if (isset($_SESSION['dossiers_consulte']) !== false) {
7275 $id_di = $this->getVal($this->clePrimaire);
7276 if (in_array($id_di, $_SESSION['dossiers_consulte']) === true) {
7277 unset($_SESSION['dossiers_consulte'][$id_di]);
7278 }
7279 // Supprime le tableau s'il n'y a plus de dossier consulté
7280 if (count($_SESSION['dossiers_consulte']) === 0) {
7281 unset($_SESSION['dossiers_consulte']);
7282 }
7283 }
7284
7285 /**
7286 * Gestion des tâches pour la dématérialisation
7287 */
7288 $inst_task_empty = $this->f->get_inst__om_dbform(array(
7289 "obj" => "task",
7290 "idx" => 0,
7291 ));
7292 $task_types = array(
7293 "creation_DI",
7294 "depot_DI",
7295 );
7296 foreach ($task_types as $task_type) {
7297 $task_exists = $inst_task_empty->task_exists($task_type, $id);
7298 if ($task_exists !== false) {
7299 $inst_task = $this->f->get_inst__om_dbform(array(
7300 "obj" => "task",
7301 "idx" => $task_exists,
7302 ));
7303 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
7304 $task_val = array(
7305 'state' => $inst_task::STATUS_CANCELED,
7306 );
7307 $update_task = $inst_task->update_task(array('val' => $task_val));
7308 if ($update_task === false) {
7309 $this->addToMessage(sprintf('%s %s',
7310 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
7311 __("Veuillez contacter votre administrateur.")
7312 ));
7313 $this->correct = false;
7314 return false;
7315 }
7316 }
7317 }
7318 }
7319
7320 return true;
7321 }
7322
7323 /**
7324 * TREATMENT - delete_related_tables.
7325 *
7326 * Suppression par requête SQL les enregistrements des tables passées en
7327 * paramètre.
7328 *
7329 * @param array $related_tables Liste des enregistrements à supprimer
7330 *
7331 * @return boolean
7332 */
7333 function delete_related_tables(array $related_tables) {
7334 $this->begin_treatment(__METHOD__);
7335
7336 // Supprime chaque enregistrement liés au dossier d'instruction
7337 $template_delete_sql = 'DELETE FROM %s%s WHERE %s IN (%s)';
7338 foreach ($related_tables as $table => $value) {
7339 if (isset($value['table']) === true) {
7340 $table = $value['table'];
7341 }
7342 if ($value['condition_value'] !== '' && $value['condition_value'] !== null) {
7343 $sql = sprintf(
7344 $template_delete_sql,
7345 DB_PREFIXE,
7346 $table,
7347 $value['condition_field'],
7348 $value['condition_value']
7349 );
7350 $res = $this->f->db->query($sql);
7351 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
7352 $this->f->isDatabaseError($res);
7353 }
7354 }
7355
7356 /**
7357 * Gestion des tâches pour la dématérialisation
7358 */
7359
7360 // Annule toutes les tâches liées au dossier
7361 $inst_task_empty = $this->f->get_inst__om_dbform(array(
7362 "obj" => "task",
7363 "idx" => 0,
7364 ));
7365 $all_task_type = array_merge(task::TASK_TYPE_SI, task::TASK_TYPE_SC);
7366 $search_values = array(
7367 sprintf('(state = \'%s\' OR state = \'%s\')', task::STATUS_NEW, task::STATUS_DRAFT),
7368 isset($related_tables['dossier_autorisation']) === false
7369 ? sprintf(
7370 'type IN (%s) AND (object_id = \'%s\' OR dossier = \'%s\')',
7371 implode( // liste (string) des type de tâches concernés
7372 ',',
7373 array_map(
7374 function ($t) { return "'$t'"; },
7375 array_merge(
7376 task::TASK_TYPE_SI,
7377 task::TASK_TYPE_SC)
7378 )
7379 ),
7380 $this->getVal($this->clePrimaire),
7381 $this->getVal($this->clePrimaire)
7382 )
7383 : sprintf(
7384 '((type IN (%s) AND (object_id = \'%s\' OR dossier = \'%s\'))
7385 OR (type IN (%s) AND object_id = \'%s\'))',
7386 implode( // liste (string) des type de tâches concernés
7387 ',',
7388 array_map(
7389 function ($t) { return "'$t'"; },
7390 array_merge(
7391 task::TASK_TYPE_SI,
7392 task::TASK_TYPE_SC)
7393 )
7394 ),
7395 $this->getVal($this->clePrimaire),
7396 $this->getVal($this->clePrimaire),
7397 "'creation_DA', 'modification_DA'",
7398 $this->getVal('dossier_autorisation')
7399 ),
7400 );
7401 $task_exists = $inst_task_empty->task_exists_multi_search($search_values);
7402 if ($task_exists !== false) {
7403 foreach ($task_exists as $task) {
7404 $inst_task = $this->f->get_inst__om_dbform(array(
7405 "obj" => "task",
7406 "idx" => $task['task'],
7407 ));
7408 $task_val = array(
7409 'state' => task::STATUS_CANCELED,
7410 );
7411 $update_task = $inst_task->update_task(array('val' => $task_val));
7412 if ($update_task === false) {
7413 $this->addToMessage(sprintf('%s %s',
7414 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
7415 __("Veuillez contacter votre administrateur.")
7416 ));
7417 $this->correct = false;
7418 return $this->end_treatment(__METHOD__, false);
7419 }
7420 }
7421 }
7422
7423 return $this->end_treatment(__METHOD__, true);
7424 }
7425
7426 /**
7427 * CONDITION - has_only_initial_di.
7428 *
7429 * Permet de vérifier qu'il s'agit du dossier d'instruction initial de
7430 * l'autorisation.
7431 *
7432 * @param boolean $after_delete À activer si la méthode est utilisée lors de
7433 * la suppression.
7434 *
7435 * @return boolean
7436 */
7437 function has_only_initial_di($after_delete=false) {
7438
7439 // Compte le nombre de dossier lié au dossier d'autorisation
7440 $res = $this->get_idx_by_args('COUNT(dossier)', 'dossier', 'dossier_autorisation', $this->getVal('dossier_autorisation'));
7441
7442 // Si la méthode est utilisé dans le triggersupprimerapres alors le
7443 // dossier d'instruction est déjà supprimé dans la base de données, le
7444 // retour doit donc être 0 pour prouver la suppression du DI initial
7445 if ($after_delete === true) {
7446 if ($res === '0') {
7447 return true;
7448 }
7449 //
7450 return false;
7451 }
7452
7453 // S'il y a qu'un seul dossier d'instruction alors le DI courant est
7454 // forcément l'initial
7455 if ($res === '1') {
7456 return true;
7457 }
7458 //
7459 return false;
7460 }
7461
7462 /**
7463 * Retourne la reference cadastrale de la demande attache a un dossier ERP
7464 * specifique
7465 * @param string $dossier L'identifiant du dossier
7466 * @return string|null La reference cadastrale si elle est trouve,
7467 * sinon NULL. En cas d'erreur de la BD, l'execution s'arrete.
7468 */
7469 function getReferenceCadastrale($dossier) {
7470 $qres = $this->f->get_all_results_from_db_query(
7471 sprintf(
7472 'SELECT
7473 terrain_references_cadastrales
7474 FROM
7475 %1$sdemande
7476 WHERE
7477 dossier_instruction = \'%2$s\'
7478 LIMIT 1',
7479 DB_PREFIXE,
7480 $this->f->db->escapeSimple($dossier)
7481 ),
7482 array(
7483 'origin' => __METHOD__,
7484 'force_return' => true
7485 )
7486 );
7487 if ($qres['code'] !== 'OK') {
7488 // Appel de la methode de recuperation des erreurs
7489 // TODO : pas de correspondance pour la méthode getDebugInfo() voir si
7490 // il faut faire évoluer ce code ou si la modif est ok
7491 // Ancien code : $this->erreur_db($res->getDebugInfo(), $res->getMessage(), 'demande');
7492 $this->erreur_db($qres['message'], $qres['message'], 'demande');
7493 }
7494 // retourne la nature du dossier
7495 foreach ($qres['result'] as $row) {
7496 return $row['terrain_references_cadastrales'];
7497 }
7498 // la nature n'etait pas trouve, ce qui ne devrait pas se passer
7499 return NULL;
7500 }
7501
7502 /**
7503 * Supprime puis recrée tous les liens entre dossier et demandeurs
7504 **/
7505 function insertLinkDossierDemandeur() {
7506 // Suppression des anciens demandeurs
7507 $this->deleteLinkDossierDemandeur();
7508 $types_demandeur = array(
7509 "petitionnaire_principal",
7510 "delegataire",
7511 "petitionnaire",
7512 "plaignant_principal",
7513 "plaignant",
7514 "contrevenant_principal",
7515 "contrevenant",
7516 "requerant_principal",
7517 "requerant",
7518 "avocat_principal",
7519 "avocat",
7520 "bailleur_principal",
7521 "bailleur",
7522 "proprietaire",
7523 "architecte_lc",
7524 "paysagiste",
7525 );
7526 foreach ($types_demandeur as $type) {
7527 // Comparaison des autres demandeurs
7528 if(isset($this->postedIdDemandeur[$type]) === true) {
7529 // Ajout des nouveaux liens
7530 foreach ($this->postedIdDemandeur[$type] as $demandeur) {
7531 //
7532 $principal = false;
7533 if (strpos($type, '_principal') !== false) {
7534 $principal = true;
7535 }
7536 if ($this->addLinkDossierDemandeur($demandeur, $principal) === false) {
7537 //
7538 return false;
7539 }
7540 }
7541 }
7542 }
7543 }
7544
7545
7546 /**
7547 * Fonction permettant d'ajouter un lien
7548 * entre la table dossier et demandeur
7549 **/
7550 function addLinkDossierDemandeur($id, $principal) {
7551 $lienAjout = $this->f->get_inst__om_dbform(array(
7552 "obj" => "lien_dossier_demandeur",
7553 "idx" => "]",
7554 ));
7555 $lien = array('lien_dossier_demandeur' => "",
7556 'petitionnaire_principal' => (($principal)?"t":"f"),
7557 'dossier' => $this->valF['dossier'],
7558 'demandeur' => $id);
7559 $lienAjout->ajouter($lien);
7560 $lienAjout->__destruct();
7561 }
7562
7563 /**
7564 * Fonction permettant de supprimer un lien
7565 * entre la table demande et demandeur
7566 **/
7567 function deleteLinkDossierDemandeur() {
7568 // Suppression
7569 $sql = "DELETE FROM ".DB_PREFIXE."lien_dossier_demandeur ".
7570 "WHERE dossier='".$this->valF['dossier']."'";
7571 $res = $this->f->db->query($sql);
7572 $this->f->addToLog(
7573 __METHOD__."(): db->query(\"".$sql."\");",
7574 VERBOSE_MODE
7575 );
7576 $this->f->isDatabaseError($res);
7577 }
7578
7579 /**
7580 * Methode de recupération des valeurs postées
7581 **/
7582 function getPostedValues() {
7583 // Récupération des demandeurs dans POST
7584 $types_demandeur = array(
7585 "petitionnaire_principal",
7586 "delegataire",
7587 "petitionnaire",
7588 "plaignant_principal",
7589 "plaignant",
7590 "contrevenant_principal",
7591 "contrevenant",
7592 "requerant_principal",
7593 "requerant",
7594 "avocat_principal",
7595 "avocat",
7596 "bailleur_principal",
7597 "bailleur",
7598 "proprietaire",
7599 "architecte_lc",
7600 "paysagiste",
7601 );
7602 foreach ($types_demandeur as $type) {
7603 if($this->f->get_submitted_post_value($type) !== null AND
7604 $this->f->get_submitted_post_value($type) != '') {
7605 $this->postedIdDemandeur[$type] = $this->f->get_submitted_post_value($type);
7606 }
7607 }
7608 }
7609
7610 /**
7611 * Méthode permettant de récupérer les id des demandeurs liés à la table
7612 * liée passée en paramètre
7613 *
7614 * @param string $from Table liée : "demande", "dossier", dossier_autorisation"
7615 * @param string $id Identifiant (clé primaire de la table liée en question)
7616 */
7617 function listeDemandeur($from, $id) {
7618
7619 // Si la donnée membre a déjà été remplie par un précédent appel à cette méthode,
7620 // on sort.
7621 if ($this->valIdDemandeur["petitionnaire_principal"] !== array() or
7622 $this->valIdDemandeur["delegataire"] !== array() or
7623 $this->valIdDemandeur["petitionnaire"] !== array() or
7624 $this->valIdDemandeur["plaignant_principal"] !== array() or
7625 $this->valIdDemandeur["plaignant"] !== array() or
7626 $this->valIdDemandeur["contrevenant_principal"] !== array() or
7627 $this->valIdDemandeur["contrevenant"] !== array() or
7628 $this->valIdDemandeur["requerant_principal"] !== array() or
7629 $this->valIdDemandeur["requerant"] !== array() or
7630 $this->valIdDemandeur["avocat_principal"] !== array() or
7631 $this->valIdDemandeur["avocat"] !== array() or
7632 $this->valIdDemandeur["bailleur_principal"] !== array() or
7633 $this->valIdDemandeur["bailleur"] !== array() or
7634 $this->valIdDemandeur["proprietaire"] !== array() or
7635 $this->valIdDemandeur["architecte_lc"] !== array() or
7636 $this->valIdDemandeur["paysagiste"] !== array()) {
7637 return;
7638 }
7639
7640 // Récupération des demandeurs de la base
7641 $qres = $this->f->get_all_results_from_db_query(
7642 sprintf(
7643 'SELECT
7644 demandeur.demandeur,
7645 demandeur.type_demandeur,
7646 lien_%2$s_demandeur.petitionnaire_principal
7647 FROM
7648 %1$slien_%2$s_demandeur
7649 INNER JOIN %1$sdemandeur
7650 ON demandeur.demandeur=lien_%2$s_demandeur.demandeur
7651 WHERE
7652 %2$s = \'%3$s\'',
7653 DB_PREFIXE,
7654 $from,
7655 $this->f->db->escapeSimple($id)
7656 ),
7657 array(
7658 'origin' => __METHOD__
7659 )
7660 );
7661
7662 // Stockage du résultat dans un tableau
7663 foreach ($qres['result'] as $row) {
7664
7665 $demandeur_type = $row['type_demandeur'];
7666 if ($row['petitionnaire_principal'] == 't'){
7667 $demandeur_type .= "_principal";
7668 }
7669 $this->valIdDemandeur[$demandeur_type][] = $row['demandeur'];
7670 }
7671 }
7672
7673 /**
7674 * Récupère la liste des contraintes d'un dossier.
7675 *
7676 * @param string $dossier Identifiant du dossier.
7677 * @param boolean $for_di_view Liste avec condition affichage DI.
7678 *
7679 * @return object Résultat de la requête
7680 */
7681 function getListContrainte($dossier, $for_di_view = true) {
7682
7683 // Select
7684 $select = "SELECT dossier_contrainte.dossier_contrainte as dossier_contrainte_id,
7685 dossier_contrainte.texte_complete as dossier_contrainte_texte,
7686 dossier_contrainte.reference as dossier_contrainte_reference,
7687 contrainte.libelle as contrainte_libelle,
7688 contrainte.nature as contrainte_nature,
7689 contrainte.texte as contrainte_texte,
7690 contrainte.reference as contrainte_reference,
7691 lower(contrainte.groupe) as contrainte_groupe,
7692 lower(contrainte.sousgroupe) as contrainte_sousgroupe ";
7693
7694 // From
7695 $from = " FROM ".DB_PREFIXE."contrainte
7696 LEFT JOIN ".DB_PREFIXE."dossier_contrainte
7697 ON dossier_contrainte.contrainte = contrainte.contrainte ";
7698
7699 // Where
7700 $where = " WHERE dossier_contrainte.dossier = '".$dossier."' ";
7701
7702 // Si les contraintes sont listées pour être affichées dans le DI
7703 if ($for_di_view === true) {
7704 // Si le paramètre "option_contrainte_di" est défini
7705 if ($this->f->getParameter('option_contrainte_di') != 'aucun') {
7706 // Ajoute la condition
7707 $where .= $this->f->traitement_condition_contrainte(
7708 $this->f->getParameter('option_contrainte_di'));
7709 }
7710 }
7711
7712 // Tri
7713 $tri = " ORDER BY contrainte_groupe DESC, contrainte_sousgroupe,
7714 contrainte.no_ordre, contrainte.libelle ";
7715
7716 // Requête SQL
7717 $qres = $this->f->get_all_results_from_db_query($select.$from.$where.$tri, array(
7718 'origin' => __METHOD__
7719 )
7720 );
7721
7722 // Retourne le résultat
7723 return $qres['result'];
7724 }
7725
7726 /**
7727 * Récupère les informations à afficher dans le tableau des identifiants
7728 * tehniques Plat'AU. Stocke ces informations dans un tableau.
7729 * Converti le tableau au format json et renvoi le json obtenu
7730 *
7731 * @return json
7732 */
7733 protected function get_json_lien_iiue() {
7734 // Tableau de retour
7735 $val_suivi = array();
7736
7737 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
7738 $liste_champs = array(
7739 'object' => __('type'),
7740 'object_id' => __('identifiant openADS'),
7741 'external_uid' => __("identifiant Plat'AU"),
7742 'state' => __('état du versement'),
7743 );
7744 // Mapping entre la valeur 'object' de la table de liaison des identifiants
7745 // et la valeur de 'object' dans la tables des tâches
7746 $mapping_one_to_one_object_liiue_task = array(
7747 'dossier_autorisation' => 'creation_DA',
7748 'dossier' => 'creation_DI',
7749 'piece' => 'ajout_piece',
7750 'consultation' => 'creation_consultation',
7751 'instruction_action_cl' => 'envoi_CL',
7752 );
7753 // Traduction des états de versement
7754 $trad_state = array(
7755 'done' => sprintf('%s %s', __('terminé'), '[V]'),
7756 'pending' => __('en cours'),
7757 'error' => __('en erreur'),
7758 'new' => __('à réaliser'),
7759 );
7760 // Traduction des objets
7761 $trad_object = array(
7762 'dossier_autorisation' => __('dossier_autorisation'),
7763 'dossier' => __('dossier'),
7764 'piece' => __('pièce'),
7765 'dossier_consultation' => __('consultation'),
7766 'pec_dossier_consultation' => __('prise en compte'),
7767 'avis_dossier_consultation' => __('avis'),
7768 'instruction_action_cl' => __('instruction transmise au CL'),
7769 );
7770 // Instance de la table de liaison des identifiants
7771 $inst_liiue = $this->f->get_inst__om_dbform(array(
7772 "obj" => "lien_id_interne_uid_externe",
7773 "idx" => 0,
7774 ));
7775 // Instance de la table des tâches
7776 $inst_task = $this->f->get_inst__om_dbform(array(
7777 "obj" => "task",
7778 "idx" => 0,
7779 ));
7780 // Récupération de toutes les occurences du dossier en cours dans la table des
7781 // liaisons des identifiants
7782 $external_uids = $inst_liiue->get_all_lien_id_interne_uid_externe_by_dossier($this->getVal('dossier'), PLATAU);
7783 if (is_array($external_uids) === true && count($external_uids) > 0) {
7784 //
7785 foreach ($external_uids as $external_uid) {
7786
7787 /**
7788 * Gestion de l'état du versement dans Plat'AU
7789 */
7790 // État par défaut
7791 $external_uid['state'] = __('N/A');
7792 // Tente d'identifier le type, dans certains cas il n'est pas
7793 // possible de le définir avec certitude
7794 $type = isset($mapping_one_to_one_object_liiue_task[$external_uid['object']]) === true ? $mapping_one_to_one_object_liiue_task[$external_uid['object']] : null;
7795 $search_values = array(
7796 sprintf('type = \'%s\'', $type),
7797 sprintf('object_id = \'%s\'', $external_uid['object_id']),
7798 sprintf('state != \'%s\'', $inst_task::STATUS_CANCELED),
7799 );
7800 // Si le type ne peut pas être défini avec certitude, alors on ne
7801 // l'inclut pas dans la recherche de la tâche
7802 if ($type === null) {
7803 unset($search_values[0]);
7804 }
7805 $task_exists = $inst_task->task_exists_multi_search($search_values);
7806 // Pour récupérer un état, il ne faut qu'un résultat
7807 if ($task_exists !== false) {
7808 //
7809 foreach ($task_exists as $task_value) {
7810 $external_uid['state'] = $task_value['state'];
7811 if ($task_value['state'] === 'pending') {
7812 break;
7813 }
7814 }
7815 }
7816 // Remplace les valeurs des états de versement par les traductions
7817 foreach ($trad_state as $key => $value) {
7818 if ($external_uid['state'] === $key) {
7819 $external_uid['state'] = $value;
7820 }
7821 }
7822
7823 // Remplace les valeurs des états de versement par les traductions
7824 foreach ($trad_object as $key => $value) {
7825 if ($external_uid['object'] === $key) {
7826 $external_uid['object'] = __($value);
7827 }
7828 }
7829
7830 //
7831 $val_notif = array();
7832 foreach($liste_champs as $key => $champ) {
7833 $val_notif[$champ] = $external_uid[$key];
7834 }
7835 array_push($val_suivi, $val_notif);
7836 }
7837 }
7838
7839 // Passage du tableau au format json
7840 return json_encode($val_suivi, JSON_HEX_APOS);
7841 }
7842
7843 /**
7844 * Ajout de la liste des contraintes et des demandeurs
7845 */
7846 function formSpecificContent($maj) {
7847
7848 // Récupère le CRUD
7849 $crud = $this->get_action_crud($this->getParameter("maj"));
7850
7851 // Les contenus spécifiques ne sont pas affichés en cas de suppression
7852 if ($crud === 'delete') {
7853 return;
7854 }
7855
7856 /**
7857 * Liste des contraintes
7858 */
7859 //
7860 $listContrainte = $this->getListContrainte($this->getVal('dossier'));
7861
7862 // Si le dossier possède des contraintes et qu'on n'est pas dans la vue "Journal d'instruction"
7863 if (count($listContrainte) != 0 && $maj !== "200") {
7864
7865 // Affiche du fieldset
7866 printf("<div id=\"liste_contrainte\" class=\"demande_hidden_bloc\">");
7867 printf("<fieldset class=\"cadre ui-corner-all ui-widget-content col_12 startClosed\">");
7868 printf(" <legend class=\"ui-corner-all ui-widget-content ui-state-active\"
7869 id =\"fieldset_contraintes_liees\">"
7870 ._("dossier_contrainte")."</legend>");
7871 printf("<div class=\"fieldsetContent\" style=\"display: none;\">");
7872
7873 // Entête pour le groupe
7874 $groupeHeader = "
7875 <div class='dossier_contrainte_groupe'>
7876 <div class='dossier_contrainte_groupe_header'>
7877 <span class='name'>
7878 %s
7879 </span>
7880 </div>
7881 ";
7882
7883 // Entête pour le sous-groupe
7884 $sousgroupeHeader = "
7885 <div class='dossier_contrainte_sousgroupe'>
7886 <div class='dossier_contrainte_sousgroupe_header'>
7887 <span class='name'>
7888 %s
7889 </span>
7890 </div>
7891 ";
7892
7893 // Titres des colonnes
7894 $tableHeader = "
7895 <thead>
7896 <tr class='ui-tabs-nav ui-accordion ui-state-default tab-title'>
7897 <th class='title col-0 firstcol contrainte_th_texte_complete'>
7898 <span class='name'>
7899 "._('texte_complete')."
7900 </span>
7901 </th>
7902 <th class='title col-1 contrainte_th_reference'>
7903 <span class='name'>
7904 "._('reference')."
7905 </span>
7906 </th>
7907 <th class='title col-2 contrainte_th_nature'>
7908 <span class='name'>
7909 "._('nature')."
7910 </span>
7911 </th>
7912 </tr>
7913 </thead>
7914 ";
7915
7916 // Ligne de données
7917 $line = "
7918 <tr class='tab-data %s'>
7919 <td class='col-0 firstcol contrainte_th_texte_complete'>
7920 %s
7921 </td>
7922 <td class='col-1 contrainte_th_reference'>
7923 %s
7924 </td>
7925 <td class='col-2 contrainte_th_nature'>
7926 %s
7927 </td>
7928 ";
7929
7930 // Sauvegarde des données pour les comparer
7931 $lastRow = array();
7932 $lastRow['contrainte_groupe'] = 'empty';
7933 $lastRow['contrainte_sousgroupe'] = 'empty';
7934
7935 // Tant qu'il y a des résultats
7936 foreach ($listContrainte as $row) {
7937 // Si l'identifiant du groupe de la contrainte présente et
7938 // celle d'avant est différent
7939 if ($row['contrainte_groupe'] != $lastRow['contrainte_groupe']) {
7940
7941 // Si l'identifiant du groupe d'avant est vide
7942 if ($lastRow['contrainte_groupe'] != 'empty') {
7943 // Ferme le tableau
7944 printf("</table>");
7945 // Ferme le div
7946 printf("</div>");
7947 // Ferme le div
7948 printf("</div>");
7949 }
7950
7951 // Affiche le header du groupe
7952 printf($groupeHeader, $row['contrainte_groupe']);
7953 }
7954
7955 // Si l'identifiant du sous-groupe de la contrainte présente et
7956 // celle d'avant est différent
7957 // Ou qu'ils soient identique mais n'appartiennent pas au même groupe
7958 if ($row['contrainte_sousgroupe'] != $lastRow['contrainte_sousgroupe']
7959 || ($row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']
7960 && $row['contrainte_groupe'] != $lastRow['contrainte_groupe'])) {
7961
7962 //
7963 if($row['contrainte_groupe'] == $lastRow['contrainte_groupe']) {
7964 // Si l'identifiant de la sous-groupe d'avant est vide
7965 if ($lastRow['contrainte_sousgroupe'] != 'empty') {
7966 // Ferme le tableau
7967 printf("</table>");
7968 // Ferme le div
7969 printf("</div>");
7970 }
7971 }
7972
7973 // Affiche le header du sous-groupe
7974 printf($sousgroupeHeader, $row['contrainte_sousgroupe']);
7975
7976 // Ouvre le tableau
7977 printf("<table id='sousgroupe_".$row['contrainte_sousgroupe']."' class='tab-tab dossier_contrainte_view'>");
7978
7979 // Affiche le header des données
7980 printf($tableHeader);
7981
7982 // Définis le style des lignes
7983 $style = 'odd';
7984 }
7985
7986 // Si toujours dans la même groupe et même sous-groupe,
7987 // on change le style de la ligne
7988 if ($row['contrainte_groupe'] == $lastRow['contrainte_groupe']
7989 && $row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']) {
7990 // Définis le style
7991 $style = ($style=='even')?'odd':'even';
7992 }
7993
7994 // Affiche "Oui" ou "Non" pour le bouléen
7995 if ($row['dossier_contrainte_reference'] == 1
7996 || $row['dossier_contrainte_reference'] == "t"
7997 || $row['dossier_contrainte_reference'] == "Oui") {
7998 //
7999 $contrainte_reference = "Oui";
8000 } else {
8001 //
8002 $contrainte_reference = "Non";
8003 }
8004
8005 // Affiche les données
8006 printf($line, $style,
8007 $row['dossier_contrainte_texte'],
8008 $contrainte_reference,
8009 $row['contrainte_nature']
8010 );
8011
8012 // Sauvegarde les données
8013 $lastRow['contrainte_groupe'] = $row['contrainte_groupe'];
8014 $lastRow['contrainte_sousgroupe'] = $row['contrainte_sousgroupe'];
8015
8016 }
8017 // Ferme le tableau
8018 printf("</table>");
8019 // Ferme le sous-groupe
8020 printf("</div>");
8021 // Ferme le groupe
8022 printf("</div>");
8023
8024 printf("</div>");
8025
8026 printf("<div class=\"visualClear\"></div>");
8027 // Ferme le fieldset content
8028 printf("</div>");
8029 printf("</fieldset>");
8030 }
8031 /**
8032 * Fin Liste des contraintes
8033 */
8034
8035 /**
8036 * Liste des demandeurs
8037 */
8038 // Tableau des demandeurs selon le contexte
8039 $listeDemandeur = $this->valIdDemandeur;
8040 /**
8041 * Gestion du bloc des demandeurs
8042 */
8043 // Si le mode est (modification ou suppression ou consultation) ET que
8044 // le formulaire n'est pas correct (c'est-à-dire que le formulaire est
8045 // actif)
8046 if ($this->correct !== true AND
8047 $this->getParameter('validation') == 0 AND
8048 $this->getParameter("maj") != 0) {
8049 // Alors on récupère les demandeurs dans la table lien pour
8050 // affectation des résultats dans $this->valIdDemandeur
8051 $this->listeDemandeur("dossier", $this->getval($this->clePrimaire));
8052 $listeDemandeur = $this->valIdDemandeur;
8053 }
8054
8055 // Récupération des valeurs postées
8056 if ($this->getParameter('validation') != 0) {
8057 $listeDemandeur = $this->postedIdDemandeur;
8058 }
8059
8060 // Si le mode est (ajout ou modification)
8061 // ET que le mode n'est pas (journal d'instruction)
8062 // ET que le formulaire n'est pas correct
8063 // (c'est-à-dire que le formulaire est actif)
8064 if (($this->getParameter("maj") < 2 AND $this->correct !== true)) {
8065 // Alors on positionne le marqueur linkable a true qui permet
8066 // d'afficher ou non les actions de gestion des demandeurs
8067 $linkable = true;
8068 } else {
8069 // Sinon on positionne le marqueur linkable a false qui permet
8070 // d'afficher ou non les actions de gestion des demandeurs
8071 $linkable = false;
8072 }
8073 $affichage_form = $this->get_type_affichage_formulaire();
8074 // Pour les dossiers contentieux, il faut un droit spécifique pour visualiser le
8075 // fieldset "Demandeurs"
8076 if ($this->getParameter("maj") != 200 &&
8077 ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE')
8078 OR ($affichage_form === 'CTX RE' AND $this->f->isAccredited('dossier_contentieux_recours_afficher_demandeurs') === true)
8079 OR ($affichage_form === 'CTX IN' AND $this->f->isAccredited('dossier_contentieux_infractions_afficher_demandeurs') === true)
8080 ) {
8081
8082 // Conteneur de la listes des demandeurs
8083 echo "<div id=\"liste_demandeur\" class=\"demande_hidden_bloc col_12\">";
8084 echo "<fieldset id=\"fieldset-form-dossier_instruction-demandeur\" class=\"cadre ui-corner-all ui-widget-content startClosed\">";
8085 echo " <legend class=\"ui-corner-all ui-widget-content ui-state-active\">"
8086 ._("Demandeurs")."</legend>";
8087 echo "<div class=\"fieldsetContent\" style=\"display: none;\">";
8088
8089
8090 // Pour les DI avec DA visible, dans tous les modes excepté en ajout et si l'option d'accès au
8091 // portail citoyen est activée
8092 $inst_da = $this->get_inst_dossier_autorisation();
8093 if ($this->getParameter("maj") != 0
8094 && $this->f->is_option_citizen_access_portal_enabled() === true
8095 && $inst_da->is_dossier_autorisation_visible() === true) {
8096 // Instance du dossier d'autorisation
8097 //
8098 printf('<div class="field field-type-static"><div class="form-libelle"><label id="lib-cle_acces_citoyen" class="libelle-cle_acces_citoyen" for="cle_acces_citoyen">%s</label></div><div class="form-content"><span id="cle_acces_citoyen" class="field_value">%s</span></div></div><br/>', _("cle_acces_citoyen"), $inst_da->getVal('cle_acces_citoyen'));
8099 }
8100 // Sélection des demandeur à afficher en fonction du paramétrage du type
8101 // du dossier d'autorisation.
8102 switch ($affichage_form) {
8103 case 'ADS':
8104 case 'CONSULTATION ENTRANTE':
8105 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8106 break;
8107 case 'CTX RE':
8108 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8109 $this->display_demandeur_requerant_avocat($listeDemandeur);
8110 break;
8111 case 'CTX IN':
8112 $this->display_demandeur_plaignant_contrevenant($listeDemandeur);
8113 break;
8114 case 'DPC':
8115 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8116 $this->display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur);
8117 break;
8118 }
8119
8120 }
8121
8122 echo "</fieldset>";
8123 echo "</div>";
8124 /**
8125 * Fin liste des demandeurs
8126 */
8127
8128 /**
8129 * Interface avec le référentiel ERP.
8130 *
8131 * On affiche le message uniquement si le dossier est connecté.
8132 */
8133 if ($this->getParameter('maj') == 3 && $this->is_connected_to_referentiel_erp() === true) {
8134 //
8135 printf(
8136 '<div class="col_12">
8137 Ce dossier est connecté au référentiel ERP.
8138 </div>'
8139 );
8140 }
8141
8142 }
8143
8144 /**
8145 * Affiche le bloc d'affichage des demandeurs pour dossiers ADS avec actions.
8146 *
8147 * @param array $listeDemandeur Liste des demandeurs.
8148 */
8149 function display_demandeur_petitionnaire_delegataire($listeDemandeur) {
8150
8151 // Affichage du bloc pétitionnaire principal / délégataire
8152 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8153 echo "<div id=\"petitionnaire_principal_delegataire\">";
8154 // Affichage de la synthèse du pétitionnaire principal
8155 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire_principal");
8156 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8157 echo "<div id=\"delegataire\">";
8158 // Affichage de la synthèse du délégataire
8159 $this->displaySyntheseDemandeur($listeDemandeur, "delegataire");
8160 echo "</div>";
8161 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8162 echo "<div id=\"proprietaire\">";
8163 // Affichage de la synthèse du délégataire
8164 $this->displaySyntheseDemandeur($listeDemandeur, "proprietaire");
8165 echo "</div>";
8166 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8167 echo "<div id=\"architecte_lc\">";
8168 // Affichage de la synthèse du délégataire
8169 $this->displaySyntheseDemandeur($listeDemandeur, "architecte_lc");
8170 echo "</div>";
8171 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8172 echo "<div id=\"paysagiste\">";
8173 // Affichage de la synthèse du délégataire
8174 $this->displaySyntheseDemandeur($listeDemandeur, "paysagiste");
8175 echo "</div>";
8176 echo "<div class=\"both\"></div>";
8177 echo "</div>";
8178 // Bloc des pétitionnaires secondaires
8179 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8180 echo "<div id=\"listePetitionnaires\">";
8181 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire");
8182 echo "</div>";
8183 }
8184
8185 /**
8186 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX recours
8187 * avec actions.
8188 *
8189 * @param array $listeDemandeur Liste des demandeurs.
8190 */
8191 function display_demandeur_plaignant_contrevenant($listeDemandeur) {
8192
8193 echo "<div id=\"plaignant_contrevenant\">";
8194 // Affichage du bloc contrevenant
8195 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8196 echo "<div id=\"listeContrevenants\" class=\"col_12\">";
8197 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8198 echo "<div id=\"contrevenant_principal\">";
8199 // Affichage de la synthèse
8200 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant_principal");
8201 echo "</div>";
8202 echo "<div id=\"listeAutresContrevenants\">";
8203 // Affichage de la synthèse
8204 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant");
8205 echo "</div>";
8206 echo "</div>";
8207 // Affichage du bloc plaignant
8208 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8209 echo "<div id=\"listePlaignants\" class=\"col_12\">";
8210 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8211 echo "<div id=\"plaignant_principal\">";
8212 // Affichage de la synthèse
8213 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant_principal");
8214 echo "</div>";
8215 echo "<div id=\"listeAutresPlaignants\">";
8216 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant");
8217 echo "</div>";
8218 echo "</div>";
8219 echo "</div>";
8220
8221 }
8222
8223 /**
8224 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX infraction
8225 * avec actions.
8226 *
8227 * @param array $listeDemandeur Liste des demandeurs.
8228 */
8229 function display_demandeur_requerant_avocat($listeDemandeur) {
8230 echo "<div id=\"requerant_avocat\">";
8231 // Affichage du bloc requérant
8232 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8233 echo "<div id=\"listeRequerants\" class=\"col_12\">";
8234 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8235 echo "<div id=\"requerant_principal\">";
8236 // Affichage de la synthèse
8237 $this->displaySyntheseDemandeur($listeDemandeur, "requerant_principal");
8238 echo "</div>";
8239 echo "<div id=\"listeAutresRequerants\">";
8240 $this->displaySyntheseDemandeur($listeDemandeur, "requerant");
8241 echo "</div>";
8242 echo "</div>";
8243 // Affichage du bloc avocat
8244 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8245 echo "<div id=\"listeAvocat\" class=\"col_12\">";
8246 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8247 echo "<div id=\"avocat_principal\">";
8248 $this->displaySyntheseDemandeur($listeDemandeur, "avocat_principal");
8249 echo "</div>";
8250 echo "<div id=\"listeAutresAvocats\">";
8251 $this->displaySyntheseDemandeur($listeDemandeur, "avocat");
8252 echo "</div>";
8253 echo "</div>";
8254 echo "</div>";
8255 echo "</fieldset>";
8256 // Champ flag permettant de récupérer la valeur de l'option sig pour
8257 // l'utiliser en javascript, notamment lors du chargement de l'interface
8258 // pour les références cadastrales
8259 // XXX Si un widget pour les références cadastrales existait, il n'y
8260 // aurait pas besoin de faire cela
8261 echo "<input id='option_sig' type='hidden' value='".$this->f->getParameter("option_sig")."' name='option_sig'>";
8262 echo "</div>";
8263 }
8264
8265
8266 /**
8267 * Affiche le bloc d'affichage des demandeurs pour dossiers DPC avec actions.
8268 *
8269 * @param array $listeDemandeur Liste des demandeurs.
8270 */
8271 function display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur) {
8272
8273 // Affichage du bloc pétitionnaire principal / délégataire / bailleur
8274 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8275 echo "<div id=\"petitionnaire_principal_delegataire_bailleur\">";
8276 // Doit être utilisé avec la div petitionnaire_principal_delegataire
8277 echo "<div id=\"listeBailleurs\" class=\"col_12\">";
8278 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8279 echo "<div id=\"bailleur_principal\">";
8280 // Affichage de la synthèse
8281 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur_principal");
8282 echo "</div>";
8283 echo "<div id=\"listeAutresBailleurs\">";
8284 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur");
8285 echo "</div>";
8286 echo "</div>";
8287 echo "</div>";
8288 }
8289
8290
8291 function displaySyntheseDemandeur($listeDemandeur, $type) {
8292 // Si le mode est (ajout ou modification) ET que le formulaire n'est pas
8293 // correct (c'est-à-dire que le formulaire est actif)
8294 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
8295 // Alors on positionne le marqueur linkable a true qui permet
8296 // d'afficher ou non les actions de gestion des demandeurs
8297 $linkable = true;
8298 } else {
8299 // Sinon on positionne le marqueur linkable a false qui permet
8300 // d'afficher ou non les actions de gestion des demandeurs
8301 $linkable = false;
8302 }
8303 // Récupération du type de demandeur pour l'affichage
8304 switch ($type) {
8305 case 'petitionnaire_principal':
8306 $legend = _("Petitionnaire principal");
8307 break;
8308
8309 case 'delegataire':
8310 $legend = _("Autre correspondant");
8311 break;
8312
8313 case 'petitionnaire':
8314 $legend = _("Petitionnaire");
8315 break;
8316
8317 case 'contrevenant_principal':
8318 $legend = _("Contrevenant principal");
8319 break;
8320
8321 case 'contrevenant':
8322 $legend = _("Autre contrevenant");
8323 break;
8324
8325 case 'plaignant_principal':
8326 $legend = _("Plaignant principal");
8327 break;
8328
8329 case 'plaignant':
8330 $legend = _("Autre plaignant");
8331 break;
8332
8333 case 'requerant_principal':
8334 $legend = _("Requérant principal");
8335 break;
8336
8337 case 'requerant':
8338 $legend = _("Autre requérant");
8339 break;
8340
8341 case 'avocat_principal':
8342 $legend = _("Avocat principal");
8343 break;
8344
8345 case 'avocat':
8346 $legend = _("Autre avocat");
8347 break;
8348
8349 case 'bailleur_principal':
8350 $legend = _("Bailleur principal");
8351 break;
8352
8353 case 'bailleur':
8354 $legend = _("Bailleur");
8355 break;
8356
8357 case 'proprietaire':
8358 $legend = __("Propriétaire");
8359 break;
8360
8361 case 'architecte_lc':
8362 $legend = __("Architecte législation connexe");
8363 break;
8364
8365 case 'paysagiste':
8366 $legend = __("Concepteur-Paysagiste");
8367 break;
8368 }
8369 foreach ($listeDemandeur[$type] as $demandeur_id) {
8370 $obj = str_replace('_principal', '', $type);
8371 $demandeur = $this->f->get_inst__om_dbform(array(
8372 "obj" => $obj,
8373 "idx" => $demandeur_id,
8374 ));
8375 $demandeur -> afficherSynthese($type, $linkable);
8376 $demandeur -> __destruct();
8377 }
8378 // Si en édition de formulaire
8379 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
8380 // Bouton d'ajout du avocat
8381 // L'ID DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8382 echo "<a id=\"add_".$type."\"
8383 class=\"om-form-button add-16\">".
8384 $legend.
8385 "</a>";
8386 }
8387 }
8388
8389 /**
8390 * Retourne le statut du dossier
8391 * @return string Le statut du dossier d'instruction
8392 */
8393 function getStatut(){
8394 $etat = $this->f->get_inst__om_dbform(array(
8395 "obj" => 'etat',
8396 "idx" => $this->getVal("etat"),
8397 ));
8398 return $etat->getVal('statut');
8399 }
8400
8401 /**
8402 * Retourne le dernier événement lié au dossier instancié
8403 *
8404 * @return [string] ID du dernier événement
8405 */
8406 function get_dernier_evenement() {
8407 $qres = $this->f->get_one_result_from_db_query(
8408 sprintf(
8409 'SELECT
8410 MAX(instruction)
8411 FROM
8412 %1$sinstruction
8413 WHERE
8414 dossier = \'%2$s\'',
8415 DB_PREFIXE,
8416 $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8417 ),
8418 array(
8419 "origin" => __METHOD__,
8420 )
8421 );
8422
8423 return $qres["result"];
8424 }
8425
8426 /**
8427 * Retourne l'identifiant du rapport d'instruction lié du dossier
8428 * @return string L'identifiant du rapport d'instruction lié du dossier
8429 */
8430 function getRapportInstruction() {
8431 $qres = $this->f->get_one_result_from_db_query(
8432 sprintf(
8433 'SELECT
8434 rapport_instruction
8435 FROM
8436 %1$srapport_instruction
8437 WHERE
8438 dossier_instruction = \'%2$s\'',
8439 DB_PREFIXE,
8440 $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8441 ),
8442 array(
8443 "origin" => __METHOD__
8444 )
8445 );
8446
8447 return $qres["result"];
8448 }
8449
8450 /**
8451 * Retourne l'identifiant des données techniques liées du dossier
8452 * @return string L'identifiant des données techniques liées du dossier
8453 */
8454 function getDonneesTechniques() {
8455 $qres = $this->f->get_one_result_from_db_query(
8456 sprintf(
8457 'SELECT
8458 donnees_techniques
8459 FROM
8460 %1$sdonnees_techniques
8461 WHERE
8462 dossier_instruction = \'%2$s\'',
8463 DB_PREFIXE,
8464 $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8465 ),
8466 array(
8467 "origin" => __METHOD__,
8468 )
8469 );
8470
8471 return $qres["result"];
8472 }
8473
8474 /**
8475 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
8476 *
8477 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
8478 * la vue 'sousformulaire'.
8479 *
8480 * @return string
8481 */
8482 function get_back_link($view = "formulaire") {
8483 $baseURL = OM_ROUTE_TAB;
8484 $paramsHref = array(
8485 'premier' => $this->getParameter("premier"),
8486 'tricol' => $this->getParameter("tricol"),
8487 'advs_id' => $this->getParameter("advs_id"),
8488 'valide' => $this->getParameter("valide")
8489 );
8490
8491 // Si on vient d'un widget de recherche paramétrable avec un message d'aide paramétré
8492 if (empty($this->f->get_submitted_get_value("message_help")) === false) {
8493 // On ajoute le message d'aide dans l'url de retour
8494 $paramsHref['message_help'] = urlencode($this->f->get_submitted_get_value("message_help"));
8495 }
8496
8497 if($this->getParameter("idx_dossier") != "") {
8498 $paramsHref['obj'] = "recherche_dossier";
8499 } else {
8500 if($this->getParameter("retour") == "form") {
8501 $paramsHref['idx'] = $this->getParameter("idx");
8502 $paramsHref['action'] = '3';
8503 if (!($this->getParameter("validation") > 0 && $this->getParameter("maj") == 2 && $this->correct)) {
8504 $baseURL = OM_ROUTE_FORM;
8505
8506 }
8507 }
8508 $paramsHref['obj'] = $this->f->get_submitted_get_value('retour_widget') !== null ?
8509 $this->f->get_submitted_get_value('retour_widget') :
8510 $this->get_absolute_class_name();
8511
8512 if ($this->f->get_submitted_get_value('widget_recherche_id') !== null) {
8513 $paramsHref['widget_recherche_id'] = $this->f->get_submitted_get_value('widget_recherche_id');
8514 }
8515 if (empty($this->f->get_submitted_get_value('retourformulaire2')) === false) {
8516 $paramsHref['retourformulaire'] = $this->f->get_submitted_get_value('retourformulaire2');
8517 }
8518 }
8519
8520 // Construction du lien à partir des valeurs stockées dans le tableau
8521 $href = array_map(function ($key, $value) {
8522 return '&'.$key.'='.$value;
8523 }, array_keys($paramsHref), $paramsHref);
8524 $href = $baseURL.implode('', $href);
8525
8526 return $href;
8527 }
8528
8529 /**
8530 * Surcharge du bouton retour afin de retourner sur la recherche de dossiers
8531 * d'instruction existant.
8532 */
8533 function retour($premier = 0, $recherche = "", $tricol = "") {
8534 $css_class = "retour";
8535 // Récupération du lien de redirection
8536 $href = str_replace(
8537 "&",
8538 "&amp;",
8539 $this->get_back_link("formulaire")
8540 );
8541 // Affichage du bouton retour avec le lien et la classe voulues
8542 $this->f->layout->display_form_retour(array(
8543 "id" => "form-action-".$this->get_absolute_class_name()."-back-".uniqid(),
8544 "href" => $href,
8545 "class" => $css_class,
8546 ));
8547 }
8548
8549 /**
8550 * Permet de modifier le fil d'Ariane
8551 * @param string $ent Fil d'Ariane
8552 * @param array $val Valeurs de l'objet
8553 * @param intger $maj Mode du formulaire
8554 */
8555 function getFormTitle($ent) {
8556
8557 // Fil d'Ariane
8558 $type_aff_form = $this->get_type_affichage_formulaire();
8559 switch ($type_aff_form) {
8560 case 'DPC':
8561 case 'ADS':
8562 $ent = _("instruction")." -> "._("dossiers d'instruction");
8563 break;
8564 case 'CTX IN':
8565 $ent = _("contentieux")." -> "._("infraction");
8566 break;
8567 case 'CTX RE':
8568 $ent = _("contentieux")." -> "._("recours");
8569 break;
8570 case 'CONSULTATION ENTRANTE':
8571 $ent = __("instruction")." -> ".__("dossiers de consultation");
8572 }
8573
8574 // Si différent de l'ajout
8575 if($this->getParameter("maj") != 0) {
8576 // Si le champ dossier_libelle existe
8577 if (trim($this->getVal("dossier_libelle")) != '') {
8578 $ent .= " -> ".strtoupper($this->getVal("dossier_libelle"));
8579 }
8580 // Si contexte ADS
8581 if ($type_aff_form ==='ADS'
8582 && trim($this->getVal("dossier")) != '') {
8583 $demandeur = $this->get_demandeur($this->getVal("dossier"));
8584 // Si le demandeur existe
8585 if (isset($demandeur) && trim($demandeur) != '') {
8586 $ent .= " ".mb_strtoupper($demandeur, "UTF-8");
8587 }
8588 }
8589
8590 // Dans le cas d'un dossier d'instruction issu d'un dépôt électronique
8591 // applique un style spécifique sur le fil d'Arianne
8592 if ($this->getVal('depot_electronique') === 't') {
8593 $this->f->addStyleForTitle("demat-color-breadcrumb");
8594 }
8595 }
8596
8597 // Change le fil d'Ariane pour l'interface de géolocalisation automatique des DI
8598 if ($this->getParameter("maj") == 126) {
8599 $ent = _("administration")." -> "._("options avancées")." -> "._("Géolocalisation des dossiers");
8600 }
8601
8602 // Change le fil d'Ariane
8603 return $ent;
8604 }
8605
8606 /**
8607 * Récupère le demandeur du dossier
8608 * @return string Identifiant du dossier
8609 */
8610 private function get_demandeur($dossier) {
8611 // Requête SQL
8612 $qres = $this->f->get_one_result_from_db_query(
8613 sprintf(
8614 'SELECT
8615 CASE
8616 WHEN demandeur.qualite = \'particulier\' THEN TRIM(
8617 CONCAT(
8618 demandeur.particulier_nom,
8619 \' \',
8620 demandeur.particulier_prenom
8621 )
8622 )
8623 ELSE TRIM(
8624 CONCAT(
8625 demandeur.personne_morale_raison_sociale,
8626 \' \',
8627 demandeur.personne_morale_denomination
8628 )
8629 )
8630 END as demandeur
8631 FROM
8632 %1$sdossier
8633 LEFT JOIN %1$slien_dossier_demandeur
8634 ON lien_dossier_demandeur.dossier=dossier.dossier
8635 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
8636 LEFT JOIN %1$sdemandeur
8637 ON lien_dossier_demandeur.demandeur=demandeur.demandeur
8638 WHERE
8639 dossier.dossier = \'%2$s\'',
8640 DB_PREFIXE,
8641 $this->f->db->escapeSimple($dossier)
8642 ),
8643 array(
8644 "origin" => __METHOD__,
8645 )
8646 );
8647
8648 return $qres["result"];
8649 }
8650
8651 /**
8652 * Récupère la durée de validité
8653 * @param string $dossier_autorisation Identifiant dossier d'autorisation
8654 * @return intger Durée de validité
8655 */
8656 function get_duree_validite($dossier_autorisation, $force_param = false) {
8657
8658 // Récupère le numéro de version
8659 $numeroVersion = $this->getNumeroVersion($dossier_autorisation);
8660
8661 // Si c'est l'ajout du dossier initial
8662 if ($numeroVersion < 0 || $force_param === true) {
8663
8664 // Récupération de la duree de validite depuis la table
8665 // "dossier_autorisation_type_detaille"
8666 $qres = $this->f->get_one_result_from_db_query(
8667 sprintf(
8668 'SELECT
8669 duree_validite_parametrage
8670 FROM
8671 %1$sdossier_autorisation_type_detaille
8672 LEFT JOIN %1$sdossier_autorisation
8673 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8674 WHERE
8675 dossier_autorisation.dossier_autorisation = \'%2$s\'',
8676 DB_PREFIXE,
8677 $this->f->db->escapeSimple($dossier_autorisation)
8678 ),
8679 array(
8680 "origin" => __METHOD__,
8681 )
8682 );
8683 $duree_validite = $qres["result"];
8684
8685 } else {
8686
8687 // Récupération de la duree de validite depuis le P0
8688 $qres = $this->f->get_one_result_from_db_query(
8689 sprintf(
8690 'SELECT
8691 duree_validite
8692 FROM
8693 %1$sdossier
8694 LEFT JOIN %1$sdossier_autorisation
8695 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
8696 WHERE
8697 dossier_autorisation.dossier_autorisation = \'%2$s\'
8698 AND dossier.version = 0',
8699 DB_PREFIXE,
8700 $this->f->db->escapeSimple($dossier_autorisation)
8701 ),
8702 array(
8703 "origin" => __METHOD__,
8704 )
8705 );
8706 $duree_validite = $qres["result"];
8707 }
8708 // Vérifie si la duree de validité a bien été récupérée. Si ce n'est pas le cas
8709 // la duree de validite est mise à 0 par défaut pour ne pas bloquer le traitement
8710 // (notamment en modification du dossier) et on affiche le problème dans les logs.
8711 try {
8712 if (! isset($duree_validite) || $duree_validite == null || $duree_validite == '') {
8713 $duree_validite = '0';
8714 throw new UnexpectedValueException('Unexpected NULL value');
8715 }
8716 } catch (UnexpectedValueException $e) {
8717 $this->addToLog(
8718 $e.
8719 ' : '.
8720 _("Erreur : la récupération de la durée de validité à échouée pour le dossier : ").
8721 $dossier_autorisation
8722 );
8723 }
8724
8725 // retourne le résultat
8726 return $duree_validite;
8727
8728 }
8729
8730 /**
8731 * Ajoute les parcelles du dossier passé en paramètre et met à jour le
8732 * quartier du dossier.
8733 * @param string $dossier Identifiant du dossier
8734 * @param string $terrain_references_cadastrales Références cadastrales du
8735 * dossier
8736 */
8737 function ajouter_dossier_parcelle($dossier, $terrain_references_cadastrales) {
8738
8739 // Parse les parcelles
8740 $list_parcelles = $this->f->parseParcelles($terrain_references_cadastrales, $this->getVal('om_collectivite'));
8741
8742 // A chaque parcelle une nouvelle ligne est créée dans la table
8743 // dossier_parcelle
8744 foreach ($list_parcelles as $parcelle) {
8745
8746 // Instance de la classe dossier_parcelle
8747 $dossier_parcelle = $this->f->get_inst__om_dbform(array(
8748 "obj" => "dossier_parcelle",
8749 "idx" => "]",
8750 ));
8751
8752 // Valeurs à sauvegarder
8753 $value = array(
8754 'dossier_parcelle' => '',
8755 'dossier' => $dossier,
8756 'parcelle' => '',
8757 'libelle' => $parcelle['quartier']
8758 .$parcelle['section']
8759 .$parcelle['parcelle']
8760 );
8761
8762 // Ajout de la ligne
8763 $dossier_parcelle->ajouter($value);
8764 }
8765
8766 // Si la liste des parcelles n'est pas vide
8767 if (count($list_parcelles) > 0) {
8768
8769 // Récupère le code impôt de la première référence cadastrale
8770 $quartier_code_impots = $list_parcelles[0]['quartier'];
8771 // Récupère l'identifiant du quartier
8772 $quartier = $this->get_quartier_by_code_impot($quartier_code_impots);
8773
8774 // Ajoute le quartier au dossier
8775 $this->modifier_quartier_dossier($dossier, $quartier);
8776 }
8777 }
8778
8779 /**
8780 * Supprime les parcelles du dossier passé en paramètre et met à jour le
8781 * quartier du dossier.
8782 * @param string $dossier Identifiant du dossier
8783 */
8784 function supprimer_dossier_parcelle($dossier) {
8785
8786 // Suppression des parcelles du dossier
8787 $sql = "DELETE FROM ".DB_PREFIXE."dossier_parcelle
8788 WHERE dossier='".$dossier."'";
8789 $res = $this->f->db->query($sql);
8790 $this->addToLog(
8791 __METHOD__."(): db->query(\"".$sql."\");",
8792 VERBOSE_MODE
8793 );
8794 $this->f->isDatabaseError($res);
8795
8796 // Supprime le quartier dans dossier
8797 $this->modifier_quartier_dossier($dossier);
8798 }
8799
8800 /**
8801 * Modifie le quartier au dossier.
8802 * @param string $dossier Numéro du dossier
8803 * @param integer $quartier Identifiant du quartier
8804 */
8805 function modifier_quartier_dossier($dossier, $quartier = null) {
8806
8807 // Valeurs à mettre à jour
8808 $valF = array();
8809 $valF['quartier'] = $quartier;
8810
8811 // Met à jour le quartier du dossier
8812 $cle = " dossier='".$dossier."'";
8813 $res = $this->f->db->autoExecute(
8814 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
8815 $this->addToLog("ajouter_quartier_dossier(): db->autoexecute(\""
8816 .DB_PREFIXE."dossier\", ".print_r($valF, true)
8817 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
8818 $this->f->isDatabaseError($res);
8819 }
8820
8821 /**
8822 * Récupère le quartier par rapport au code impôts.
8823 * @param string $code_impots Code impôts du quartier
8824 *
8825 * @return integer Identifiant du quartier
8826 */
8827 function get_quartier_by_code_impot($code_impots) {
8828
8829 // Initialisation résultat
8830 $quartier = null;
8831
8832 // Si la condition n'est pas vide
8833 if ($code_impots != ""
8834 && $code_impots != null) {
8835
8836 // Requête SQL
8837 $qres = $this->f->get_one_result_from_db_query(
8838 sprintf(
8839 'SELECT
8840 quartier
8841 FROM
8842 %1$squartier
8843 WHERE
8844 code_impots = \'%2$s\'',
8845 DB_PREFIXE,
8846 $this->f->db->escapeSimple($code_impots)
8847 ),
8848 array(
8849 "origin" => __METHOD__,
8850 )
8851 );
8852 $quartier = $qres["result"];
8853 }
8854
8855 // Retourne résultat
8856 return $quartier;
8857 }
8858
8859 /**
8860 * TREATMENT - update_initial_dt.
8861 *
8862 * Cette méthode ajoute les données techniques initiales d'un DI au format JSON.
8863 *
8864 * @return boolean
8865 */
8866 public function update_initial_dt($dt_json) {
8867 //
8868 $this->begin_treatment(__METHOD__);
8869 //
8870 if ($dt_json === null || $dt_json === '') {
8871 return $this->end_treatment(__METHOD__, false);
8872 }
8873 //
8874 $this->correct = true;
8875 $data = array();
8876 $data["initial_dt"] = $dt_json;
8877 //
8878 $res = $this->f->db->autoExecute(
8879 sprintf('%s%s', DB_PREFIXE, $this->table),
8880 $data,
8881 DB_AUTOQUERY_UPDATE,
8882 sprintf("%s = '%s'", $this->clePrimaire, $this->valF[$this->clePrimaire])
8883 );
8884 $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, $this->table)."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("%s = '%s'", $this->clePrimaire, $this->valF[$this->clePrimaire])."\");", VERBOSE_MODE);
8885 if ($this->f->isDatabaseError($res, true) === true) {
8886 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
8887 $this->correct = false;
8888 return $this->end_treatment(__METHOD__, false);
8889 }
8890 return $this->end_treatment(__METHOD__, true);
8891 }
8892
8893
8894
8895 /**
8896 * Méthode permettant d'ajouter les données techniques d'un DI.
8897 *
8898 * @param integer $id identifiant du dossier d'instruction
8899 * @param array $val tableau de valeurs postées via le formulaire
8900 *
8901 * @return boolean false si erreur
8902 */
8903 function ajoutDonneesTechniquesDI($id, $val) {
8904
8905 //On vérifie que le dossier d'autorisation a des données techniques
8906 $qres = $this->f->get_all_results_from_db_query(
8907 sprintf(
8908 'SELECT
8909 *
8910 FROM
8911 %1$sdonnees_techniques
8912 WHERE
8913 dossier_autorisation = \'%2$s\'',
8914 DB_PREFIXE,
8915 $this->f->db->escapeSimple($this->valF["dossier_autorisation"])
8916 ),
8917 array(
8918 "origin" => __METHOD__,
8919 "force_return" => true,
8920 )
8921 );
8922 if ($qres['code'] === 'KO') {
8923 $this->f->addToLog(__METHOD__."() : ERROR - Erreur de base de données. Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
8924 return false;
8925 }
8926 $valF = $qres['result'][0];
8927
8928 //Si le dossier d'autorisation a des données techniques
8929 if (count($valF) > 0) {
8930 //
8931 $dtdi = $this->f->get_inst__om_dbform(array(
8932 "obj" => "donnees_techniques",
8933 "idx" => "]",
8934 ));
8935 // Récupération de la dernière version du CERFA
8936 $inst_da = $this->get_inst_dossier_autorisation($valF['dossier_autorisation']);
8937 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille($inst_da->getVal('dossier_autorisation_type_detaille'));
8938 $inst_cerfa = $this->get_inst_cerfa($inst_datd->getVal('cerfa'));
8939 // Conserve seulement les données affichées par la nouvelle version du CERFA
8940 foreach ($valF as $champ => $value) {
8941 if (array_search($champ, $inst_cerfa->champs) !== false) {
8942 if ($inst_cerfa->getVal($champ) == 'f') {
8943 $valF[$champ] = null;
8944 }
8945 }
8946 }
8947
8948 //Sauvegarde des données techniques initiales
8949 //Conversion en JSON
8950 $dt_json = json_encode($valF);
8951
8952 //Enregistrement en BDD
8953 $sauvegarde_bdd = $this->update_initial_dt($dt_json);
8954
8955 //Gestion des erreurs
8956 if ($sauvegarde_bdd === false){
8957 $msg_error = __("Erreur de base de données. Impossible de sauvegarder les données techniques du dossier d'instruction au format JSON.");
8958 $this->f->addToLog(sprintf(
8959 "%s() : ERREUR - %s",
8960 __METHOD__,
8961 $msg_error
8962 ));
8963 $this->addToMessage(sprintf(
8964 "%s %s",
8965 $msg_error,
8966 __("Veuillez contacter votre administrateur.")
8967 ));
8968
8969 return false;
8970 }
8971
8972 // Modification pour avoir la dernière version du CERFA
8973 $valF["cerfa"] = $inst_cerfa->getVal($inst_cerfa->clePrimaire);
8974 //Suppression de l'identifiant
8975 $valF["donnees_techniques"] = null;
8976 // Ajout du numéro de dossier d'instruction
8977 $valF['dossier_instruction'] = $this->valF['dossier'];
8978 // Suppression du numéro de dossier d'autorisation
8979 $valF['dossier_autorisation'] = null;
8980 // Ajout des données techniques
8981 if($dtdi->ajouter($valF) === false) {
8982 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
8983 $this->f->addToLog(__METHOD__."() : ".$dtdi->msg, DEBUG_MODE);
8984 return false;
8985 }
8986 }
8987 else {
8988 //Le dossier d'autorisation n'a pas de données techniques
8989 $this->f->addToLog(__METHOD__."() : ERROR - le DA n'a pas de données techniques.", DEBUG_MODE);
8990 return -1;
8991 }
8992
8993 //
8994 return true;
8995 }
8996
8997 /**
8998 * Méthode permettant d'ajouter le dossier operateur d'un DI.
8999 *
9000 * @param integer $id identifiant de la demande
9001 * @param array $val tableau de valeurs postées via le formulaire
9002 *
9003 * @return boolean false si erreur
9004 */
9005 function ajoutDossierOperateurDI($id, $val) {
9006 //
9007 $dodi = $this->f->get_inst__om_dbform(array(
9008 "obj" => "dossier_operateur",
9009 "idx" => "]",
9010 ));
9011
9012 $valF = array();
9013 foreach ($dodi->champs as $champ) {
9014 $valF[$champ] = null;
9015 }
9016 // Ajout du numéro de dossier d'instruction
9017 $valF['dossier_instruction'] = $this->valF['dossier'];
9018 // Ajout du dossier operateur
9019 if($dodi->ajouter($valF) === false) {
9020 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les dossier opérateur du dossier d'instruction.", DEBUG_MODE);
9021 return false;
9022 }
9023
9024 //
9025 return true;
9026 }
9027
9028 /**
9029 * VIEW - contrainte.
9030 *
9031 * Vue des contraintes du dossier
9032 *
9033 * Cette vue permet de gérer le contenu de l'onglet "Contrainte(s)" sur un
9034 * dossier. Cette vue spécifique est nécessaire car l'ergonomie standard du
9035 * framework ne prend pas en charge ce cas.
9036 * C'est ici la vue spécifique des contraintes liées au dossier qui est
9037 * affichée directement au clic de l'onglet au lieu du soustab.
9038 *
9039 * L'idée est donc de simuler l'ergonomie standard en créant un container
9040 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
9041 * de la vue visualisation de l'objet lié.
9042 *
9043 * @return void
9044 */
9045 function view_contrainte() {
9046 // Vérification de l'accessibilité sur l'élément
9047 $this->checkAccessibility();
9048 // Récupération des variables GET
9049 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
9050 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
9051 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
9052 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
9053 $obj = "dossier_contrainte";
9054 $type_aff_form = $this->get_type_affichage_formulaire();
9055 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
9056 $obj = "dossier_contrainte_contexte_ctx";
9057 }
9058 // Objet à charger
9059 // Construction de l'url de sousformulaire à appeler
9060 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
9061 $url .= "&action=4";
9062 $url .= "&idx=".$idxformulaire;
9063 $url .= "&retourformulaire=".$retourformulaire;
9064 $url .= "&idxformulaire=".$idxformulaire;
9065 $url .= "&retour=form";
9066 // Affichage du container permettant le reffraichissement du contenu
9067 // dans le cas des action-direct.
9068 printf('
9069 <div id="sousform-href" data-href="%s">
9070 </div>',
9071 $url
9072 );
9073 // Affichage du container permettant de charger le retour de la requête
9074 // ajax récupérant le sous formulaire.
9075 printf('
9076 <div id="sousform-%s">
9077 </div>
9078 <script>
9079 ajaxIt(\'%s\', \'%s\');
9080 </script>',
9081 $obj,
9082 $obj,
9083 $url
9084 );
9085 }
9086
9087 /**
9088 * Cette methode permet d'afficher le bouton de validation du formulaire
9089 *
9090 * @param integer $maj Mode de mise a jour
9091 * @return void
9092 */
9093 function bouton($maj) {
9094
9095 if (!$this->correct
9096 && $this->checkActionAvailability() == true) {
9097 //
9098 switch($maj) {
9099 case 0 :
9100 $bouton = _("Ajouter");
9101 break;
9102 case 1 :
9103 $bouton = _("Modifier");
9104 break;
9105 case 2 :
9106 $bouton = _("Supprimer");
9107 break;
9108 case 200 :
9109 return;
9110 default :
9111 // Actions specifiques
9112 if ($this->get_action_param($maj, "button") != null) {
9113 //
9114 $bouton = $this->get_action_param($maj, "button");
9115 } else {
9116 //
9117 $bouton = _("Valider");
9118 }
9119 break;
9120 }
9121 //
9122 $params = array(
9123 "value" => $bouton,
9124 "name" => "submit",
9125 "onclick"=>"return getDataFieldReferenceCadastrale();",
9126 );
9127 //
9128 $this->f->layout->display_form_button($params);
9129 }
9130
9131 }
9132
9133 /**
9134 * Récupère l'instance de paramétrage des taxes.
9135 *
9136 * @param integer $taxe_amenagement Identifiant
9137 *
9138 * @return object
9139 */
9140 function get_inst_taxe_amenagement($taxe_amenagement = null) {
9141 //
9142 if ($this->inst_taxe_amenagement === null) {
9143 //
9144 if ($taxe_amenagement === null) {
9145 //
9146 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($this->getVal('om_collectivite'));
9147
9148 // Si aucun paramétrage de taxe trouvé et que la collectivité
9149 // est mono
9150 if ($taxe_amenagement === null
9151 && $this->f->isCollectiviteMono($this->getVal('om_collectivite')) === true) {
9152 // Récupère la collectivité multi
9153 $om_collectivite_multi = $this->f->get_idx_collectivite_multi();
9154 //
9155 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($om_collectivite_multi);
9156 }
9157
9158 //
9159 if ($taxe_amenagement === null) {
9160 //
9161 return null;
9162 }
9163 }
9164 //
9165 $this->inst_taxe_amenagement = $this->f->get_inst__om_dbform(array(
9166 "obj" => "taxe_amenagement",
9167 "idx" => $taxe_amenagement,
9168 ));
9169 }
9170 //
9171 return $this->inst_taxe_amenagement;
9172 }
9173
9174 /**
9175 * Récupère l'identifiant de la taxe d'aménagement par rapport à la collectivité.
9176 *
9177 * @param integer $om_collectivite La collectivité
9178 *
9179 * @return integer
9180 */
9181 function get_taxe_amenagement_by_om_collectivite($om_collectivite) {
9182 //
9183 $taxe_amenagement = null;
9184
9185 // Si la collectivité n'est pas renseigné
9186 if ($om_collectivite !== '' && $om_collectivite !== null) {
9187
9188 // SQL
9189 $qres = $this->f->get_one_result_from_db_query(
9190 sprintf(
9191 'SELECT
9192 taxe_amenagement
9193 FROM
9194 %1$staxe_amenagement
9195 WHERE
9196 om_collectivite = %2$d',
9197 DB_PREFIXE,
9198 intval($om_collectivite)
9199 ),
9200 array(
9201 "origin" => __METHOD__,
9202 )
9203 );
9204 $taxe_amenagement = $qres["result"];
9205 }
9206
9207 //
9208 return $taxe_amenagement;
9209 }
9210
9211 /**
9212 * [get_inst_donnees_techniques description]
9213 *
9214 * @param [type] $donnees_techniques [description]
9215 *
9216 * @return [type] [description]
9217 */
9218 function get_inst_donnees_techniques($donnees_techniques = null) {
9219 //
9220 if (is_null($this->inst_donnees_techniques)) {
9221 //
9222 if (is_null($donnees_techniques)) {
9223 $donnees_techniques = $this->getDonneesTechniques();
9224 }
9225 //
9226 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
9227 "obj" => "donnees_techniques",
9228 "idx" => $donnees_techniques,
9229 ));
9230 }
9231 //
9232 return $this->inst_donnees_techniques;
9233 }
9234
9235
9236 /**
9237 * TODO: replace with '$this->f->findObjectById' ?
9238 *
9239 * Récupère l'instance du dossier d'autorisation.
9240 *
9241 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
9242 *
9243 * @return object
9244 */
9245 function get_inst_dossier_autorisation($dossier_autorisation = null) {
9246 //
9247 return $this->get_inst_common("dossier_autorisation", $dossier_autorisation);
9248 }
9249
9250
9251 /**
9252 * Récupère l'instance du dossier d'autorisation, puis la clé d'accès au portail
9253 * citoyen associée à ce DA.
9254 *
9255 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
9256 *
9257 * @return string $cle_acces_citoyen si la clé d'accès existe
9258 * boolean false si la clé n'existe pas
9259 */
9260 protected function get_citizen_access_key($dossier_autorisation = null) {
9261 //
9262 $inst_da = $this->get_inst_dossier_autorisation($dossier_autorisation);
9263 // Récupération de la valeur de la clé d'accès
9264 $cle_acces_citoyen = $inst_da->getVal('cle_acces_citoyen');
9265 if ($cle_acces_citoyen === '' OR $cle_acces_citoyen === null) {
9266 return false;
9267 }
9268 return $cle_acces_citoyen;
9269 }
9270
9271
9272 /**
9273 * Récupère l'instance du type détaillé du dossier d'autorisation.
9274 *
9275 * @param integer $dossier_autorisation_type_detaille Identifiant
9276 *
9277 * @return object
9278 */
9279 function get_inst_dossier_autorisation_type_detaille($dossier_autorisation_type_detaille = null) {
9280 //
9281 if (is_null($this->inst_dossier_autorisation_type_detaille)) {
9282 //
9283 if (is_null($dossier_autorisation_type_detaille)) {
9284 //
9285 $dossier_autorisation = $this->get_inst_dossier_autorisation();
9286 //
9287 $dossier_autorisation_type_detaille = $dossier_autorisation->getVal('dossier_autorisation_type_detaille');
9288 }
9289 //
9290 $this->inst_dossier_autorisation_type_detaille = $this->f->get_inst__om_dbform(array(
9291 "obj" => "dossier_autorisation_type_detaille",
9292 "idx" => $dossier_autorisation_type_detaille,
9293 ));
9294 }
9295 //
9296 return $this->inst_dossier_autorisation_type_detaille;
9297 }
9298
9299 /**
9300 * Récupère l'instance du cerfa
9301 *
9302 * @param integer $cerfa Identifiant du cerfa
9303 *
9304 * @return object
9305 */
9306 function get_inst_cerfa($cerfa = null) {
9307 //
9308 if (is_null($this->inst_cerfa)) {
9309 //
9310 if (is_null($cerfa)) {
9311 //
9312 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9313 //
9314 $cerfa = $dossier_autorisation_type_detaille->getVal('cerfa');
9315 }
9316 //
9317 $this->inst_cerfa = $this->f->get_inst__om_dbform(array(
9318 "obj" => "cerfa",
9319 "idx" => $cerfa,
9320 ));
9321 }
9322 //
9323 return $this->inst_cerfa;
9324 }
9325
9326 /**
9327 * CONDITION - is_user_from_allowed_collectivite.
9328 *
9329 * Cette condition permet de vérifier si l'utilisateur connecté appartient
9330 * à une collectivité autorisée : c'est-à-dire de niveau 2 ou identique à
9331 * la collectivité de l'enregistrement sur lequel on se trouve.
9332 *
9333 * @return boolean
9334 */
9335 function is_user_from_allowed_collectivite() {
9336
9337 // Si l'utilisateur est de niveau 2
9338 if ($_SESSION["niveau"] == "2") {
9339 // Alors l'utilisateur fait partie d'une collectivité autorisée
9340 return true;
9341 }
9342
9343 // L'utilisateur est donc de niveau 1
9344 // On vérifie donc si la collectivité de l'utilisateur est la même
9345 // que la collectivité de l'élément sur lequel on se trouve
9346 if ($_SESSION["collectivite"] === $this->getVal("om_collectivite")) {
9347 // Alors l'utilisateur fait partie d'une collectivité autorisée
9348 return true;
9349 }
9350
9351 // L'utilisateur ne fait pas partie d'une collectivité autorisée
9352 return false;
9353 }
9354
9355 /**
9356 * Création ou mise à jour du répertoire de numérisation.
9357 *
9358 * L'objet de cette méthode est la création ou la mise à jour de la date de
9359 * modification du répertoire de numérisation destiné à recevoir les pièces
9360 * numérisées pour un import automatique.
9361 * À chaque saisie d'une nouvelle demande dans openADS, le répertoire est
9362 * soit créé soit mis à jour pour être disponible en dehors d'openADS
9363 * (point de montage sur le serveur) pour permettre de déposer les pièces
9364 * numérisées directement depuis le copieur. À intervalle régulier, un
9365 * service vérifie le contenu de ces répertoire pour importer
9366 * automatiquement ces fichiers dans l'onglet 'Pièce(s)' du dossier
9367 * concerné.
9368 * La mise à jour de la date de modification est importante pour réaliser
9369 * la purge des répertoires vides sur la base de la date de la dernière
9370 * demande qui concerne le dossier.
9371 *
9372 * @return boolean
9373 */
9374 function create_or_touch_digitalization_folder() {
9375
9376 // Nom du répertoire
9377 // Le répertoire créé possède comme nom le libellé du dossier avec
9378 // le suffixe séparé par un '.'. Exemple : PC0130551601234.P0
9379 $separateur = '';
9380 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
9381 $separateur = '.';
9382 }
9383
9384 $digitalization_folder_name = str_replace(
9385 $this->getVal("dossier_autorisation"),
9386 $this->getVal("dossier_autorisation").$separateur,
9387 $this->getVal($this->clePrimaire)
9388 );
9389
9390 // Vérifie que l'option de numérisation des dossiers est désactivée
9391 if ($this->f->is_option_digitalization_folder_enabled() !== true) {
9392 //
9393 $this->addToLog(
9394 _("L'option de numerisation des dossiers n'est pas activee").".",
9395 DEBUG_MODE
9396 );
9397 return false;
9398 }
9399
9400 // Vérifie le paramétrage du répertoire de numérisation
9401 if ($this->f->getParameter("digitalization_folder_path") === null) {
9402 //
9403 $this->addToLog(
9404 "Configuration du répertoire de numérisation incorrecte.",
9405 DEBUG_MODE
9406 );
9407 return false;
9408 }
9409
9410 // Répertoire cible
9411 $root_folder_path = $this->f->getParameter("digitalization_folder_path");
9412
9413 // Vérifie que le répertoire existe
9414 if (is_dir($root_folder_path) !== true) {
9415 //
9416 $this->addToLog(
9417 sprintf(
9418 "Le répertoire '%s' n'existe pas.",
9419 $root_folder_path
9420 ),
9421 DEBUG_MODE
9422 );
9423 return false;
9424 }
9425
9426 // Répertoire des "à traiter"
9427 $todo_folder_path = $root_folder_path."Todo/";
9428
9429 // Vérifie que le répertoire existe
9430 if (is_dir($todo_folder_path) !== true) {
9431 //
9432 $this->addToLog(
9433 sprintf(
9434 "Le répertoire '%s' n'existe pas.",
9435 $todo_folder_path
9436 ),
9437 DEBUG_MODE
9438 );
9439 return false;
9440 }
9441
9442 // Répertoire de numérisation.
9443 $digitalization_folder_path = $todo_folder_path.$digitalization_folder_name;
9444
9445 // Si le répertore existe déjà le répertoire n'est pas créé
9446 if (file_exists($digitalization_folder_path) == true) {
9447 // Mise à jour du répertoire
9448 if (touch($digitalization_folder_path) !== true) {
9449 // Si une erreur survient
9450 $this->addToLog(
9451 sprintf(
9452 "Erreur lors de la mise à jour du répertoire '%s'.",
9453 $digitalization_folder_path
9454 ),
9455 DEBUG_MODE
9456 );
9457 return false;
9458 }
9459 //
9460 return true;
9461 } else {
9462 // Création du répertoire
9463 if (mkdir($digitalization_folder_path) !== true) {
9464 //
9465 $this->addToLog(
9466 sprintf(
9467 "Erreur lors de la création du répertoire '%s'.",
9468 $digitalization_folder_path
9469 ),
9470 DEBUG_MODE
9471 );
9472 return false;
9473 }
9474 //
9475 return true;
9476 }
9477 }
9478
9479 /**
9480 * Récupère, convertit et retourne les logs de toutes les instructions
9481 *
9482 * @return array tableau indexé de logs
9483 */
9484 public function get_log_instructions() {
9485 $log_instructions = $this->getVal('log_instructions');
9486 // Gestion du premier log
9487 if ($log_instructions === '') {
9488 $log_instructions = json_encode(array());
9489 }
9490 // Gestion du log invalide
9491 if(!$this->isJson($log_instructions)) {
9492 return false;
9493 }
9494 return json_decode($log_instructions, true);
9495 }
9496
9497 /**
9498 * Ajoute un log d'instruction aux logs existants
9499 *
9500 * @param array $log valeurs de l'instruction
9501 * @return bool vrai si traitement effectué avec succès
9502 */
9503 public function add_log_instructions($log) {
9504 // Begin
9505 $this->begin_treatment(__METHOD__);
9506 // Ajout du log
9507 $log_instructions = $this->get_log_instructions();
9508 if ($log_instructions === false) {
9509 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9510 return $this->end_treatment(__METHOD__, false);
9511 }
9512 array_push($log_instructions, $log);
9513 $log_instructions = json_encode($log_instructions);
9514 // Mise à jour du DI
9515 $val = array("log_instructions"=>$log_instructions);
9516 $ret = $this->f->db->autoexecute(
9517 DB_PREFIXE."dossier",
9518 $val,
9519 DB_AUTOQUERY_UPDATE,
9520 "dossier = '".$this->getVal('dossier')."'"
9521 );
9522 $this->addToLog(
9523 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($val, true).", DB_AUTOQUERY_UPDATE, \"dossier = '".$this->getVal('dossier')."'\");",
9524 VERBOSE_MODE
9525 );
9526 if ($this->f->isDatabaseError($ret, true) !== false) {
9527 $this->erreur_db($ret->getDebugInfo(), $ret->getMessage(), 'dossier');
9528 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9529 return $this->end_treatment(__METHOD__, false);
9530 }
9531 return $this->end_treatment(__METHOD__, true);
9532 }
9533
9534 /**
9535 * TREATMENT - mark_as_connected_to_referentiel_erp.
9536 *
9537 * Cette méthode permet de positionner le marqueur
9538 * 'interface_referentiel_erp' à 'true'. Cela signifie que le dossier est
9539 * connecté au référentiel ERP.
9540 *
9541 * @return boolean
9542 */
9543 function mark_as_connected_to_referentiel_erp() {
9544 //
9545 $this->begin_treatment(__METHOD__);
9546 //
9547 $data = array("interface_referentiel_erp" => true, );
9548 // Exécution de la requête
9549 $res = $this->f->db->autoExecute(
9550 DB_PREFIXE.$this->table,
9551 $data,
9552 DB_AUTOQUERY_UPDATE,
9553 $this->getCle($this->getVal($this->clePrimaire))
9554 );
9555 // Logger
9556 $this->addToLog(
9557 __METHOD__."(): db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");",
9558 VERBOSE_MODE
9559 );
9560 //
9561 if ($this->f->isDatabaseError($res, true)) {
9562 // Appel de la methode de recuperation des erreurs
9563 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9564 $this->correct = false;
9565 $this->addToLog(
9566 __METHOD__."(): Problème erreur lors de la mise à jour du dossier",
9567 DEBUG_MODE
9568 );
9569 // Termine le traitement
9570 return $this->end_treatment(__METHOD__, false);
9571 }
9572 //
9573 $this->addToMessage(_("Le dossier est désormais 'connecté avec le référentiel ERP'."));
9574 return $this->end_treatment(__METHOD__, true);
9575 }
9576
9577 /**
9578 * CONDITION - is_connected_to_referentiel_erp.
9579 *
9580 * @return boolean
9581 */
9582 function is_connected_to_referentiel_erp() {
9583 //
9584 if ($this->getVal("interface_referentiel_erp") !== "t") {
9585 return false;
9586 }
9587 //
9588 return true;
9589 }
9590
9591
9592 /**
9593 * Retourne les données techniques applicables au dossier courant, càd les données
9594 * techniques liées au dossier avec seulement les champs du CERFA associé au type de
9595 * dossier.
9596 *
9597 * @return array $donnees_techniques_applicables Tableau associatif contenant
9598 * seulement les données techniques
9599 * applicables au dossier.
9600 */
9601 public function get_donnees_techniques_applicables() {
9602
9603 // Récupération de l'identifiant des données techniques liées au dossier
9604 $donnees_techniques = $this->getDonneesTechniques();
9605
9606 $inst_donnees_techniques = $this->get_inst_common('donnees_techniques', $donnees_techniques);
9607 $donnees_techniques_applicables = $inst_donnees_techniques->get_donnees_techniques_applicables();
9608 //
9609 return $donnees_techniques_applicables;
9610
9611 }
9612
9613
9614 /**
9615 * Retourne un tableau avec les données du dossier d'instruction.
9616 *
9617 * L'objectif est de mettre à disposition via un WS REST un ensemble
9618 * de données exploitable par une autre application.
9619 */
9620 function get_datas() {
9621
9622 /**
9623 *
9624 */
9625
9626 // TODO: replace '$this->get_inst_common' with '$this->f->findObjectById' ?
9627 $om_collectivite = $this->get_inst_common('om_collectivite', $this->getVal('om_collectivite'));
9628 $instructeur = $this->get_inst_common('instructeur', $this->getVal('instructeur'));
9629 $division = $this->get_inst_common('division', $this->getVal('division'));
9630 $etat = $this->get_inst_common('etat', $this->getVal('etat'));
9631 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9632 $dossier_autorisation_type = $this->get_inst_common('dossier_autorisation_type', $dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9633 $donnees_techniques = $this->get_donnees_techniques_applicables();
9634
9635 //
9636 $datas = array(
9637 //
9638 "dossier_instruction" => $this->getVal($this->clePrimaire),
9639 //
9640 "dossier_autorisation" => $this->getVal("dossier_autorisation"),
9641 //
9642 "terrain_adresse_voie_numero" => $this->getVal("terrain_adresse_voie_numero"),
9643 "terrain_adresse_lieu_dit" => $this->getVal("terrain_adresse_lieu_dit"),
9644 "terrain_adresse_code_postal" => $this->getVal("terrain_adresse_code_postal"),
9645 "terrain_adresse_cedex" => $this->getVal("terrain_adresse_cedex"),
9646 "terrain_adresse_voie" => $this->getVal("terrain_adresse_voie"),
9647 "terrain_adresse_bp" => $this->getVal("terrain_adresse_bp"),
9648 "terrain_adresse_localite" => $this->getVal("terrain_adresse_localite"),
9649 "terrain_superficie" => $this->getVal("terrain_superficie"),
9650 "terrain_superficie_calculee" => $this->getVal("terrain_superficie_calculee"),
9651 //
9652 "references_cadastrales" => $this->f->parseParcelles($this->getVal("terrain_references_cadastrales"), $this->getVal('om_collectivite')),
9653 "geoloc_latitude" => $this->getVal("geoloc_latitude"),
9654 "geoloc_longitude" => $this->getVal("geoloc_longitude"),
9655 "geoloc_rayon" => $this->getVal("geoloc_rayon"),
9656 "dossier_autorisation_type" => $dossier_autorisation_type->getVal("libelle"),
9657 "dossier_autorisation_type_detaille" => $dossier_autorisation_type_detaille->getVal("libelle"),
9658 "collectivite" => $om_collectivite->getVal("libelle"),
9659 "instructeur" => $instructeur->getVal("nom"),
9660 "division" => $division->getVal("libelle"),
9661 "etat_dossier" => $etat->getVal("libelle"),
9662 "statut_dossier" => $this->getStatut(),
9663 "date_depot_initial" => $this->getVal("date_depot"),
9664 "date_limite_instruction" => $this->getVal("date_limite"),
9665 "date_decision" => $this->getVal("date_decision"),
9666 "enjeu_urbanisme" => $this->getVal("enjeu_urba") == 't' ? 'true' : 'false',
9667 "enjeu_erp" => $this->getVal("enjeu_erp") == 't' ? 'true' : 'false',
9668 );
9669
9670 // Gestion des demandeurs.
9671 $this->listeDemandeur('dossier', $this->getVal($this->clePrimaire));
9672 //
9673 if (isset($this->valIdDemandeur["petitionnaire_principal"]) AND !empty($this->valIdDemandeur["petitionnaire_principal"])) {
9674 $demandeur = $this->f->get_inst__om_dbform(array(
9675 "obj" => "petitionnaire",
9676 "idx" => $this->valIdDemandeur["petitionnaire_principal"][0],
9677 ));
9678 $datas["petitionnaire_principal"] = $demandeur->get_datas();
9679 $demandeur->__destruct();
9680 }
9681 //
9682 if (isset($this->valIdDemandeur["delegataire"]) && !empty($this->valIdDemandeur["delegataire"])) {
9683 $demandeur = $this->f->get_inst__om_dbform(array(
9684 "obj" => "delegataire",
9685 "idx" => $this->valIdDemandeur["delegataire"][0],
9686 ));
9687 $datas["delegataire"] = $demandeur->get_datas();
9688 $demandeur->__destruct();
9689 }
9690 //
9691 if (isset($this->valIdDemandeur["petitionnaire"]) AND !empty($this->valIdDemandeur["petitionnaire"])) {
9692 $datas["autres_petitionnaires"] = array();
9693 foreach ($this->valIdDemandeur["petitionnaire"] as $petitionnaire) {
9694 $demandeur = $this->f->get_inst__om_dbform(array(
9695 "obj" => "petitionnaire",
9696 "idx" => $petitionnaire,
9697 ));
9698 $datas["autres_petitionnaires"][] = $demandeur->get_datas();
9699 $demandeur->__destruct();
9700 }
9701 }
9702
9703 // Tableau contenant le nom de chaque champ de données techniques à retourner
9704 $dt_a_afficher = array(
9705 "co_tot_log_nb",
9706 "co_cstr_exist",
9707 "co_uti_pers",
9708 "co_uti_vente",
9709 "co_uti_loc",
9710 "su_tot_shon_tot",
9711 "su_avt_shon_tot",
9712 "am_lot_max_nb",
9713 "am_empl_nb",
9714 );
9715
9716 // Tableau associatif contenant les données techniques voulues
9717 $tab_donnees_techniques = array();
9718 foreach ($dt_a_afficher as $key) {
9719 // On ajoute le champ de données techniques dans le retour seulement s'il
9720 // existe dans $donnees_techniques (s'il est applicable au dossier)
9721 if (array_key_exists($key, $donnees_techniques) === true) {
9722 if ($donnees_techniques[$key] === 't') {
9723 $donnees_techniques[$key] = 'true';
9724 };
9725 if ($donnees_techniques[$key] === 'f') {
9726 $donnees_techniques[$key] = 'false';
9727 };
9728 $tab_donnees_techniques[$key] = $donnees_techniques[$key];
9729 };
9730 };
9731
9732 $datas['donnees_techniques'] = $tab_donnees_techniques;
9733
9734 // Affiche le code INSEE de la collectivité du dossier d'instruction
9735 /*$collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
9736 $datas['collectivite_insee'] = $collectivite["insee"];*/
9737 $datas['collectivite_insee'] = $this->get_da_insee();
9738 //
9739 return $datas;
9740 }
9741
9742 /**
9743 * Renvoi le code INSEE du DA associé
9744 */
9745 protected function get_da_insee() {
9746 $inst_da = $this->f->get_inst__om_dbform(array(
9747 "obj" => "dossier_autorisation",
9748 "idx" => $this->getVal('dossier_autorisation')
9749 ));
9750 return $inst_da->getVal('insee');
9751 }
9752
9753 /**
9754 * CONDITION - is_class_dossier_corresponding_to_his_groupe
9755 *
9756 * Vérifie la correspondance groupe/classe du dossier instancié.
9757 *
9758 * @param string $classe
9759 * @return boolean
9760 */
9761 protected function is_class_dossier_corresponding_to_type_form($classe) {
9762 $type_form = $this->get_type_affichage_formulaire();
9763 switch ($type_form) {
9764 case 'DPC';
9765 case 'ADS':
9766 case 'CONSULTATION ENTRANTE':
9767 if ($this->f->starts_with($classe, 'dossier_instruction') === true) {
9768 return true;
9769 }
9770 return false;
9771 case 'CTX RE':
9772 if ($this->f->ends_with($classe, '_recours') === true) {
9773 return true;
9774 }
9775 return false;
9776 case 'CTX IN':
9777 if ($this->f->ends_with($classe, '_infractions') === true) {
9778 return true;
9779 }
9780 return false;
9781 default:
9782 return false;
9783 }
9784 }
9785
9786
9787 /**
9788 * CONDITION - check_context
9789 *
9790 * Vérifie la correspondance groupes dossier/utilisateur.
9791 * Vérifie l'accès aux dossiers confidentiels.
9792 * Vérifie la correspondance groupe/classe.
9793 *
9794 * @return boolean
9795 */
9796 public function check_context() {
9797 // Le dossier doit être un objet valide
9798 $id = $this->getVal($this->clePrimaire);
9799 if ($id === 0 OR $id === '0' OR $id === '' OR $id === ']') {
9800 return false;
9801 }
9802
9803 // Vérification que l'utilisateur a accès au dossier
9804 if ($this->can_user_access_dossier() === false) {
9805 return false;
9806 }
9807 // Vérification que la classe métier instanciée est adéquate.
9808 return $this->is_class_dossier_corresponding_to_type_form($this->get_absolute_class_name());
9809 }
9810
9811 /**
9812 * VIEW - redirect.
9813 *
9814 * Cette vue est appelée lorsque l'on souhaite consulter un dossier dont on ne connaît pas le groupe.
9815 * Ce fonctionnement est nécessaire car les classes métier filles de 'dossier' sont relatives à ce groupe.
9816 *
9817 * Par exemple, depuis l'onglet "Dossiers Liés" du DI, le listing ne permet pas d'instancier chaque résultat
9818 * et par conséquent on n'a pas accès au groupe du dossier. L'action tableau consulter y est surchargée afin
9819 * d'amener à cette vue qui se charge de faire la redirection adéquate.
9820 *
9821 * @return void
9822 */
9823 public function redirect() {
9824 // Redirection vers la classe métier adéquate
9825 $context = $this->get_type_affichage_formulaire();
9826 switch ($context) {
9827 case 'ADS':
9828 case 'CONSULTATION ENTRANTE':
9829 $obj = 'dossier_instruction';
9830 break;
9831 case 'CTX RE':
9832 $obj = 'dossier_contentieux_tous_recours';
9833 break;
9834 case 'CTX IN':
9835 $obj = 'dossier_contentieux_toutes_infractions';
9836 break;
9837 default:
9838 return;
9839 }
9840 $idx = $this->getVal($this->clePrimaire);
9841 $link = OM_ROUTE_FORM.'&obj='.$obj.'&action=3&idx='.$idx;
9842 if ($this->f->get_submitted_get_value('retourformulaire') !== null
9843 && $this->f->get_submitted_get_value('idxformulaire') !== null) {
9844 $link .= '&premier=0&tricol=&retourformulaire='.$this->f->get_submitted_get_value('retourformulaire');
9845 $link .= '&idxformulaire='.$this->f->get_submitted_get_value('idxformulaire');
9846 }
9847
9848 header('Location: '.$link);
9849 exit();
9850 }
9851
9852
9853 /**
9854 * CONDITION - is_confidentiel
9855 *
9856 * Permet de savoir si le type de dossier d'autorisation du dossier courant est
9857 * confidentiel.
9858 *
9859 * @return boolean true si le dossier est confidentiel, sinon false.
9860 *
9861 */
9862 public function is_confidentiel() {
9863 //
9864 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9865 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9866 $confidentiel = $inst_dossier_autorisation_type->getVal('confidentiel');
9867 //
9868 if ($confidentiel === 't') {
9869 return true;
9870 }
9871 return false;
9872 }
9873
9874
9875 /**
9876 * CONDITION - can_user_access_dossier
9877 *
9878 * Effectue les vérifications suivantes :
9879 * - L'utilisateur doit avoir accès au groupe du dossier
9880 * - Si le dossier est confidentiel, l'utilisateur doit avoir accès aux dossiers
9881 * confidentiels de ce groupe
9882 *
9883 * @return boolean true si les conditions ci-dessus sont réunies, sinon false
9884 *
9885 */
9886 public function can_user_access_dossier() {
9887 // Récupère le code du groupe
9888 $groupe_dossier = $this->get_groupe();
9889
9890 // Le groupe doit être accessible par l'utilisateur ;
9891 if ($this->f->is_user_in_group($groupe_dossier) === false) {
9892 return false;
9893 }
9894 if ($this->is_confidentiel() === true) {
9895 //
9896 if ($this->f->can_user_access_dossiers_confidentiels_from_groupe($groupe_dossier) === false) {
9897 return false;
9898 }
9899 }
9900 return true;
9901 }
9902
9903
9904 /**
9905 * Met à jour une métadonnée sur tous les fichiers liés au dossier.
9906 *
9907 * @param string $metadata Nom de la métadonnée.
9908 * @param string $metadata_value Nouvelle valeur de la métadonnée.
9909 *
9910 * @return boolean
9911 */
9912 public function update_metadata_by_dossier($metadata, $metadata_value) {
9913 // Rècupère la liste des fichiers stockés liés au dossier
9914 $qres = $this->f->get_all_results_from_db_query(
9915 sprintf(
9916 'SELECT
9917 uid AS uid
9918 FROM
9919 %1$sdocument_numerise
9920 WHERE
9921 dossier = \'%2$s\'
9922 AND document_numerise IS NOT NULL
9923 UNION
9924 SELECT
9925 fichier AS uid
9926 FROM
9927 %1$sconsultation
9928 WHERE
9929 dossier = \'%2$s\'
9930 AND fichier IS NOT NULL
9931 UNION
9932 SELECT
9933 om_fichier_consultation AS uid
9934 FROM
9935 %1$sconsultation
9936 WHERE
9937 dossier = \'%2$s\'
9938 AND om_fichier_consultation IS NOT NULL
9939 UNION
9940 SELECT
9941 om_fichier_instruction AS uid
9942 FROM
9943 %1$sinstruction
9944 WHERE
9945 dossier = \'%2$s\'
9946 AND om_fichier_instruction IS NOT NULL
9947 UNION
9948 SELECT
9949 om_fichier_rapport_instruction AS uid
9950 FROM
9951 %1$srapport_instruction
9952 WHERE
9953 dossier_instruction = \'%2$s\'
9954 AND om_fichier_rapport_instruction IS NOT NULL;',
9955 DB_PREFIXE,
9956 $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
9957 ),
9958 array(
9959 'origin' => __METHOD__
9960 )
9961 );
9962
9963 // Définit la métadonnée à mettre à jour
9964 $metadata_update = array();
9965 $metadata_update[$metadata] = $metadata_value;
9966
9967 // Pour chaque résultat
9968 foreach ($qres['result'] as $row) {
9969 // Met à jour les métadonnées du fichier
9970 $uid_update = $this->f->storage->storage->update_metadata($row['uid'], $metadata_update);
9971
9972 // Si la méthode ne retourne pas l'uid du fichier alors la mise
9973 // à jour ne s'est pas réalisée
9974 if ($uid_update !== $row['uid']) {
9975 //
9976 return false;
9977 }
9978 }
9979
9980 //
9981 return true;
9982 }
9983
9984
9985 /**
9986 * Traitement pour les ERP.
9987 * Si la valeur du champ 'erp' a été modifié, modifie la valeur de la
9988 * métadonnée concernceERP sur tous les fichiers liés au dossier.
9989 *
9990 * @param array $values Liste des nouvelles valeurs.
9991 *
9992 * @return boolean
9993 */
9994 public function update_concerneERP(array $values) {
9995 // Définit le champ et la métadonnée
9996 $champ = 'erp';
9997 $metadata = 'concerneERP';
9998
9999 // Définit les valeurs à comparer
10000 $value_after = $this->get_boolean_from_view_value($values[$champ]);
10001 $value_before = $this->get_boolean_from_pgsql_value($this->getVal($champ));
10002
10003 // Vérifie si la valeur du champ a été modifié
10004 if ($value_after !== $value_before) {
10005 // Transforme la valeur booléenne en string
10006 $metadata_value = 'false';
10007 if ($value_after === true) {
10008 $metadata_value = 'true';
10009 }
10010
10011 // Met à jour les métadonnées des fichiers liés au dossier
10012 $update = $this->update_metadata_by_dossier($metadata, $metadata_value);
10013 //
10014 if ($update !== true) {
10015 //
10016 return false;
10017 }
10018 }
10019
10020 //
10021 return true;
10022 }
10023
10024
10025 /**
10026 * TODO: replace with '$this->f->findObjectById' ?
10027 *
10028 * Récupère l'instance du groupe.
10029 *
10030 * @param string $groupe Identifiant du groupe.
10031 *
10032 * @return object
10033 */
10034 private function get_inst_groupe($groupe) {
10035 //
10036 return $this->get_inst_common("groupe", $groupe);
10037 }
10038
10039
10040 /**
10041 * TODO: replace with '$this->f->findObjectById' ?
10042 *
10043 * Récupère l'instance du type de dossier d'autorisation.
10044 *
10045 * @param string $dossier_autorisation_type Identifiant du type de dossier
10046 * d'autorisation.
10047 *
10048 * @return object
10049 */
10050 private function get_inst_dossier_autorisation_type($dossier_autorisation_type) {
10051 //
10052 return $this->get_inst_common("dossier_autorisation_type", $dossier_autorisation_type);
10053 }
10054
10055
10056 /**
10057 * Récupère l'instance de la demande du dossier
10058 *
10059 * @param mixed Identifiant de la demande
10060 *
10061 * @return object
10062 */
10063 function get_inst_demande($demande = null) {
10064 //
10065 if (is_null($this->inst_demande)) {
10066 //
10067 if (is_null($demande)) {
10068 $demande = $this->get_demande_by_dossier_instruction();
10069 }
10070 //
10071 return $this->get_inst_common("demande", $demande);
10072 }
10073 //
10074 return $this->inst_demande;
10075 }
10076
10077
10078 /**
10079 * Récupère l'identifiant de la demande initiale par le dossier d'instruction.
10080 *
10081 * @return integer|null renvoie l'identifiant de la demande ou null si
10082 * rien n'a été récupéré
10083 */
10084 function get_demande_by_dossier_instruction() {
10085 $qres = $this->f->get_one_result_from_db_query(
10086 sprintf(
10087 'SELECT
10088 demande
10089 FROM
10090 %1$sdemande
10091 WHERE
10092 dossier_instruction = \'%2$s\'
10093 ORDER BY
10094 instruction_recepisse ASC
10095 LIMIT 1',
10096 DB_PREFIXE,
10097 $this->getVal($this->clePrimaire)
10098 ),
10099 array(
10100 "origin" => __METHOD__,
10101 )
10102 );
10103
10104 return $qres["result"];
10105 }
10106
10107 /**
10108 * TREATMENT - update_last_modification_date.
10109 *
10110 * Cette methode met à jour la date de dernière modification du dossier.
10111 *
10112 * @return boolean
10113 */
10114 public function update_last_modification_date() {
10115 //
10116 $this->begin_treatment(__METHOD__);
10117 //
10118 $this->correct = true;
10119 $valF = array();
10120 $valF["date_modification"] = 'NOW';
10121 //
10122 $res = $this->f->db->autoExecute(
10123 DB_PREFIXE.$this->table,
10124 $valF,
10125 DB_AUTOQUERY_UPDATE,
10126 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
10127 );
10128 if ($this->f->isDatabaseError($res, true)) {
10129 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10130 $this->correct = false;
10131 return $this->end_treatment(__METHOD__, false);
10132 } else {
10133 return $this->end_treatment(__METHOD__, true);
10134 }
10135 //
10136 return $this->end_treatment(__METHOD__, false);
10137 }
10138
10139 /**
10140 * TREATMENT - update_hash_sitadel.
10141 *
10142 * Cette methode met à jour le hash SITADEL du dossier.
10143 *
10144 * @return boolean
10145 */
10146 public function update_hash_sitadel($hash_sitadel = null) {
10147 //
10148 $this->begin_treatment(__METHOD__);
10149 //
10150 if ($hash_sitadel !== null && $hash_sitadel !== '') {
10151 //
10152 $this->correct = true;
10153 $valF = array();
10154 $valF["hash_sitadel"] = $hash_sitadel;
10155 //
10156 $res = $this->f->db->autoExecute(
10157 DB_PREFIXE.$this->table,
10158 $valF,
10159 DB_AUTOQUERY_UPDATE,
10160 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
10161 );
10162 if ($this->f->isDatabaseError($res, true)) {
10163 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10164 $this->correct = false;
10165 return $this->end_treatment(__METHOD__, false);
10166 } else {
10167 return $this->end_treatment(__METHOD__, true);
10168 }
10169 }
10170 //
10171 return $this->end_treatment(__METHOD__, false);
10172 }
10173
10174 /**
10175 * TREATMENT - update_version_clos
10176 *
10177 * @param string $mode Mode de mise à jour ("up" ou "down")
10178 *
10179 * @return boolean
10180 */
10181 public function update_version_clos($mode) {
10182 //
10183 $this->begin_treatment(__METHOD__);
10184 //
10185 if ($mode !== 'up' && $mode !== 'down') {
10186 return $this->end_treatment(__METHOD__, false);
10187 }
10188 //
10189 $inst_da = $this->get_inst_dossier_autorisation($this->getVal("dossier_autorisation"));
10190 $da_version_clos = $inst_da->getval('numero_version_clos');
10191 //
10192 $this->correct = true;
10193 $data = array();
10194 $data["version_clos"] = 0;
10195 if ($da_version_clos !== null
10196 && $da_version_clos !== '') {
10197 //
10198 if ($mode === 'up') {
10199 $data["version_clos"] = intval($da_version_clos)+1;
10200 $inst_da->update_numero_version_clos($data["version_clos"]);
10201 }
10202 if ($mode === 'down') {
10203 $data["version_clos"] = null;
10204 }
10205 } else {
10206 $inst_da->update_numero_version_clos($data["version_clos"]);
10207 }
10208 //
10209 $res = $this->f->db->autoExecute(
10210 sprintf('%s%s', DB_PREFIXE, $this->table),
10211 $data,
10212 DB_AUTOQUERY_UPDATE,
10213 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10214 );
10215 $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, $this->table)."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10216 if ($this->f->isDatabaseError($res, true) === true) {
10217 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10218 $this->correct = false;
10219 return $this->end_treatment(__METHOD__, false);
10220 }
10221 return $this->end_treatment(__METHOD__, true);
10222 }
10223
10224 /**
10225 * Récupère l'identifiant de l'état car le getVal() récupère le libellé.
10226 *
10227 * @return mixed Soit un string, soit "false"
10228 */
10229 function get_id_etat() {
10230 $dossier = $this->f->get_inst__om_dbform(array(
10231 'obj' => 'dossier',
10232 'idx' => $this->getVal($this->clePrimaire)
10233 ));
10234 return $dossier->getVal('etat');
10235 }
10236
10237 /**
10238 * Methode clesecondaire
10239 *
10240 * Vérifications Effectuées :
10241 * - Vérifie si le dossier est lié à un contentieux. Si c'est le cas
10242 * affiche un message d'erreur personnalisé et ne lance pas la
10243 * la vérification des clé étrangère.
10244 */
10245 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
10246 // Le dossier d'instruction n'est pas supprimé si celui-ci est lié à un contentieux
10247 $autorisation_contestee = $this->get_idx_by_args(
10248 'autorisation_contestee',
10249 'dossier',
10250 'autorisation_contestee',
10251 $this->getVal($this->clePrimaire)
10252 );
10253 if (! empty($autorisation_contestee)) {
10254 $this->addToMessage(__("Le dossier d'instruction ne peut pas être supprimé car celui-ci est lié à un contentieux."));
10255 $this->correct = false;
10256 return;
10257 }
10258 parent::cleSecondaire($id, $dnu1, $val, $dnu2);
10259 }
10260
10261 /**
10262 * Surcharge de la méthode rechercheTable pour éviter de court-circuiter le
10263 * générateur en devant surcharger la méthode cleSecondaire afin de supprimer
10264 * les éléments liés dans les tables NaN.
10265 *
10266 * Vérifications Effectuées :
10267 * - Vérifie si la table à chercher fait partie des tables que l'on va
10268 * supprimer si c'est le cas la vérification de la présence d'élement
10269 * n'est pas faite
10270 *
10271 * @param mixed $dnu1 Instance BDD - À ne pas utiliser
10272 * @param string $table Table
10273 * @param string $field Champ
10274 * @param mixed $id Identifiant
10275 * @param mixed $dnu2 Marqueur de débogage - À ne pas utiliser
10276 * @param string $selection Condition de la requête
10277 *
10278 * @return void
10279 */
10280 function rechercheTable(&$dnu1 = null, $table = "", $field = "", $id = null, $dnu2 = null, $selection = "") {
10281 // Dans le cas d'une suppression du dossier d'instruction, les tables
10282 // liées ne sont pas vérifiées
10283 if (! isset($this->related_tables)) {
10284 $this->set_related_tables();
10285 }
10286 // Récupère le nom des tables de liaison à partir de la liste des tables liées.
10287 // Vérifie pour chaque élément du tableau des liaisons si il existe une clé "table".
10288 // Si c'est le cas on récupère le nom de la table dans cette entrée si ce n'est pas
10289 // le cas on récupère la clé de l'élement car il dois contenir le nom de la table.
10290 // Ensuite supprime les doublons et renvoie un tableau contenant le nom des tables
10291 // liées pour lesquels la suppression va être effectuée.
10292 $liaison_suppr = array_unique( // supprime les doublons
10293 array_map(function($value, $key) { // Récupère le nom des tables de liaison
10294 return ! empty($value['table']) ? $value['table'] : $key;
10295 },
10296 $this->related_tables,
10297 array_keys($this->related_tables)
10298 ),
10299 SORT_STRING
10300 );
10301
10302 if ($this->get_action_crud() === 'delete'
10303 && in_array($table, $liaison_suppr) === true) {
10304 // Annule la vérif
10305 $this->addToLog(__METHOD__."(): ".__("Dans le cas spécifique de la suppression du dossier d'instruction, les tables liées ne sont pas vérifiées."), EXTRA_VERBOSE_MODE);
10306 return;
10307 }
10308
10309 parent::rechercheTable($this->f->db, $table, $field, $id, null, $selection);
10310 }
10311
10312 /**
10313 * Effectue une requête sql pour récupérer la liste des id des demandeurs
10314 * associé au dossier et l'indicateur permettant de savoir si c'est un
10315 * demandeur principal ou pas.
10316 * Renvoi les résultats sous la forme d'un tableau.
10317 *
10318 * @return array|boolean tableau contenant les infos des demandeurs et false
10319 * en cas d'erreur de base de données.
10320 */
10321 public function get_demandeurs() {
10322 $query = sprintf('
10323 SELECT
10324 demandeur.demandeur,
10325 lien_dossier_demandeur.petitionnaire_principal,
10326 demandeur.type_demandeur
10327 FROM
10328 %1$sdemandeur
10329 INNER JOIN %1$slien_dossier_demandeur
10330 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
10331 WHERE
10332 lien_dossier_demandeur.dossier = \'%2$s\'',
10333 DB_PREFIXE,
10334 $this->getVal($this->clePrimaire)
10335 );
10336 $res = $this->f->get_all_results_from_db_query(
10337 $query,
10338 array(
10339 "origin" => __METHOD__,
10340 "force_return" => true,
10341 )
10342 );
10343 if ($res['code'] === 'KO') {
10344 return false;
10345 }
10346 return $res['result'];
10347 }
10348
10349 /**
10350 * TREATMENT - normalize_address
10351 *
10352 * Enregistre en base de données les valeurs concernant l'adresse normalisée.
10353 *
10354 * @param string $address Valeur de l'adresse normalisée.
10355 * @param string $address_json JSON de toutes les données de l'adresse normalisée.
10356 * @return boolean
10357 */
10358 public function normalize_address(string $address = null, string $address_json = '{}') {
10359 //
10360 $this->begin_treatment(__METHOD__);
10361 // Valeurs par défaut si l'adresse normalisée est vide
10362 if ($address === '') {
10363 $address = null;
10364 $address_json = '{}';
10365 }
10366 // Valeur par défaut pour le JSON de l'adresse si l'adresse saisie ne
10367 // correspond au label du JSON, donc adresse non sélectionnée parmis les
10368 // résultats retourner par l'API adresse
10369 if ($address !== null) {
10370 $address_json_decode = json_decode($address_json, true);
10371 if (isset($address_json_decode['label']) === true
10372 && $address !== $address_json_decode['label']) {
10373 //
10374 $address_json = '{}';
10375 }
10376 }
10377 //
10378 $this->correct = true;
10379 $data = array();
10380 $data["adresse_normalisee"] = $address;
10381 $data["adresse_normalisee_json"] = $address_json;
10382 //
10383 $res = $this->f->db->autoExecute(
10384 sprintf('%s%s', DB_PREFIXE, $this->table),
10385 $data,
10386 DB_AUTOQUERY_UPDATE,
10387 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10388 );
10389 $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, $this->table)."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10390 if ($this->f->isDatabaseError($res, true) === true) {
10391 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10392 $this->correct = false;
10393 return $this->end_treatment(__METHOD__, false);
10394 }
10395 return $this->end_treatment(__METHOD__, true);
10396 }
10397
10398 public function get_last_instruction_decision() {
10399 $qres = $this->f->get_one_result_from_db_query(
10400 sprintf(
10401 'SELECT
10402 instruction.instruction
10403 FROM
10404 %1$sinstruction
10405 INNER JOIN %1$sdossier
10406 ON dossier.dossier = instruction.dossier
10407 INNER JOIN %1$setat
10408 ON dossier.etat = etat.etat
10409 WHERE
10410 instruction.etat = dossier.etat
10411 AND instruction.dossier = \'%2$s\'
10412 AND etat.statut = \'cloture\'
10413 ORDER BY
10414 instruction.instruction DESC
10415 LIMIT 1',
10416 DB_PREFIXE,
10417 $this->f->db->escapeSimple($this->getVal('dossier'))
10418 ),
10419 array(
10420 "origin" => __METHOD__,
10421 "force_return" => true,
10422 )
10423 );
10424 if ($qres["code"] !== "OK") {
10425 return false;
10426 }
10427 return $qres["result"];
10428 }
10429
10430 /**
10431 * VIEW - view_normalize_address.
10432 *
10433 * Formulaire de recherche de l'adresse normalisée.
10434 *
10435 * @return void
10436 */
10437 public function view_normalize_address() {
10438 // Vérification de l'accessibilité sur l'élément
10439 $this->checkAccessibility();
10440
10441 // Par défaut l'adresse saisie est celle renseignée sur le dossier
10442 $address_val = trim(preg_replace('/\s\s+/', ' ', sprintf('%s %s %s %s %s %s %s',
10443 $this->getVal('terrain_adresse_voie_numero'),
10444 $this->getVal('terrain_adresse_voie'),
10445 $this->getVal('terrain_adresse_lieu_dit'),
10446 $this->getVal('terrain_adresse_localite'),
10447 $this->getVal('terrain_adresse_code_postal'),
10448 $this->getVal('terrain_adresse_bp'),
10449 $this->getVal('terrain_adresse_cedex')
10450 )));
10451 $address_val_json = '{}';
10452 if ($this->getVal('adresse_normalisee') !== null
10453 && $this->getVal('adresse_normalisee') !== '') {
10454 //
10455 $address_val = $this->getVal('adresse_normalisee');
10456 $address_val_json = htmlentities($this->getVal('adresse_normalisee_json'));
10457 if ($this->f->get_submitted_post_value("submit-normalize") === null) {
10458 $this->f->displayMessage("error", __("L'adresse de ce terrain a déjà été normalisée."));
10459 }
10460 }
10461
10462 /**
10463 * TREATMENT
10464 */
10465 // Traitement si validation du formulaire
10466 if ($this->f->get_submitted_post_value("submit-normalize") !== null) {
10467 //
10468 $this->normalize_address($_POST["address"], $_POST["address_json"]);
10469 return;
10470 }
10471
10472 // Formulaire de validation
10473 $this->f->layout->display__form_container__begin(array(
10474 "action" => "",
10475 "name" => "f2_normalize_address",
10476 "onsubmit" => "normalize_address(this);return false;",
10477 ));
10478 //
10479 printf('
10480 <div id="sousform-href" data-href="%s"></div>',
10481 $this->compose_form_url("form", array(
10482 "validation" => null,
10483 "maj" => 160,
10484 "retour" => "form",
10485 ))
10486 );
10487 $champs = array('address', 'address_json', );
10488 // Instanciation de l'objet formulaire
10489 $this->form = $this->f->get_inst__om_formulaire(array(
10490 "validation" => 0,
10491 "maj" => $this->getParameter("maj"),
10492 "champs" => $champs,
10493 ));
10494 // Paramétrage des champs du formulaire
10495 // address
10496 $this->form->setLib("address", __("adresse à normaliser"));
10497 $this->form->setTaille("address", 60);
10498 $this->form->setMax("address", 255);
10499 $this->form->setType("address", "text");
10500 $this->form->setVal('address', $address_val);
10501 // address_json
10502 $this->form->setType("address_json", "hidden");
10503 $this->form->setVal('address_json', $address_val_json);
10504 $this->f->displayDescription(__("Veuillez sélectionner l'adresse normalisée qui se rapproche le plus de l'adresse du terrain."));
10505 // Ouverture du conteneur de formulaire
10506 $this->form->entete();
10507 $this->form->afficher($champs, 0, false, false);
10508 $this->form->enpied();
10509 $this->f->layout->display__form_controls_container__begin(array(
10510 "controls" => "bottom",
10511 ));
10512 $this->f->layout->display__form_input_submit(array(
10513 "name" => "submit-normalize",
10514 "value" => __("Normaliser l'adresse"),
10515 "class" => "boutonFormulaire",
10516 ));
10517 $this->f->layout->display__form_controls_container__end();
10518 //
10519 $this->f->layout->display__form_container__end();
10520 }
10521
10522
10523 public function get_last_instruction_incompletude() {
10524 $qres = $this->f->get_one_result_from_db_query(
10525 sprintf(
10526 'SELECT
10527 instruction.instruction
10528 FROM
10529 %1$sinstruction
10530 INNER JOIN %1$sevenement
10531 ON evenement.evenement = instruction.evenement
10532 WHERE
10533 instruction.dossier = \'%2$s\'
10534 AND evenement.type = \'incompletude\'
10535 ORDER BY
10536 instruction.instruction DESC
10537 LIMIT 1',
10538 DB_PREFIXE,
10539 $this->f->db->escapeSimple($this->getVal('dossier'))
10540 ),
10541 array(
10542 "origin" => __METHOD__,
10543 "force_return" => true,
10544 )
10545 );
10546 if ($qres["code"] !== "OK") {
10547 return false;
10548 }
10549 return $qres["result"];
10550 }
10551
10552 function get_max_num_suffixe($dat_c, $annee, $dep_c, $com_c, $num) {
10553 $qres = $this->f->get_one_result_from_db_query(
10554 sprintf(
10555 'SELECT
10556 MAX(numerotation_num_suffixe) AS max_num_suffixe
10557 FROM
10558 %1$sdossier
10559 WHERE
10560 numerotation_type = \'%2$s\'
10561 AND annee = \'%3$s\'
10562 AND numerotation_dep = \'%4$s\'
10563 AND numerotation_com = \'%5$s\'
10564 AND numerotation_num = \'%6$s\'',
10565 DB_PREFIXE,
10566 $this->f->db->escapeSimple($dat_c),
10567 $this->f->db->escapeSimple($annee),
10568 $this->f->db->escapeSimple($dep_c),
10569 $this->f->db->escapeSimple($com_c),
10570 $this->f->db->escapeSimple($num)
10571 ),
10572 array(
10573 "origin" => __METHOD__,
10574 "force_return" => true,
10575 )
10576 );
10577 if ($qres["code"] !== "OK") {
10578 return null;
10579 }
10580 return $qres["result"];
10581 }
10582
10583 public function view_json_data() {
10584 $this->checkAccessibility();
10585 $this->f->disableLog();
10586 $view = $this->get_json_data();
10587 printf(json_encode($view));
10588 }
10589
10590 public function get_json_data() {
10591 $val = array_combine($this->champs, $this->val);
10592 foreach ($val as $key => $value) {
10593 $val[$key] = strip_tags($value);
10594 }
10595 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
10596 $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
10597 $val['dossier_autorisation_type_detaille_code'] = $inst_datd->getVal('code');
10598 $val['dossier_autorisation_type_code'] = $inst_dat->getVal('code');
10599 $val['dossier_instruction_type_code'] = $this->getCode($this->getVal('dossier_instruction_type'));
10600 $val['dossier_suffixe'] = '';
10601 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
10602 $val['dossier_suffixe'] = sprintf('%s%s',
10603 $this->getCode($this->getVal('dossier_instruction_type')),
10604 $this->get_di_numero_suffixe()
10605 );
10606 }
10607 /*$parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
10608 $val['insee'] = $parameters['insee'];*/
10609 $val['insee'] = $this->get_da_insee();
10610 $inst_ac = $this->get_inst_autorite_competente($val['autorite_competente']);
10611 $val['autorite_competente_code'] = $inst_ac->getVal('code');
10612 $val['source_depot'] = $this->get_source_depot_from_demande();
10613 return $val;
10614 }
10615
10616 public function update_by_instruction(array $val, array $extra_params = array()) {
10617 $this->begin_treatment(__METHOD__);
10618 // XXX Supprime les champs qui n'existent pas dans dossier
10619 $valF = $val;
10620 unset($valF['instruction']);
10621 unset($valF['crud']);
10622 if (empty($valF) === false) {
10623 $res = $this->f->db->autoExecute(
10624 sprintf('%s%s', DB_PREFIXE, $this->table),
10625 $valF,
10626 DB_AUTOQUERY_UPDATE,
10627 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10628 );
10629 $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, $this->table)."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10630 if ($this->f->isDatabaseError($res, true) === true) {
10631 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10632 $this->correct = false;
10633 return $this->end_treatment(__METHOD__, false);
10634 }
10635 }
10636 $trigger = $this->trigger_update_by_instruction($val);
10637 if ($trigger === false) {
10638 $this->addToLog(__METHOD__."(): ".__("Erreur lors de la mise à jour par instruction."), DEBUG_MODE);
10639 $this->correct = false;
10640 return $this->end_treatment(__METHOD__, false);
10641 }
10642 return $this->end_treatment(__METHOD__, true);
10643 }
10644
10645 protected function trigger_update_by_instruction(array $val, array $extra_params = array()) {
10646 foreach ($this->task_types as $task_type) {
10647 $method = sprintf('add_task_%s', $task_type);
10648 if (method_exists($this, $method) === true) {
10649 //
10650 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
10651 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible'
10652 && ($this->f->is_option_mode_service_consulte_enabled() !== true
10653 || ($this->f->is_option_mode_service_consulte_enabled() === true
10654 && ($this->get_source_depot_from_demande() === PLATAU
10655 || $this->get_source_depot_from_demande() === PORTAL)))) {
10656 //
10657 $res = $this->$method($val, $extra_params);
10658 if ($res !== true) {
10659 return $res;
10660 }
10661 }
10662 }
10663 }
10664 return true;
10665 }
10666
10667 /**
10668 * Ajoute une tâche pec_metier_consultation, sortante si le tableau des valeurs
10669 * contiens :
10670 * - une entrée "pec_metier" n'ont vide
10671 *
10672 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10673 * la tâche sera à l'état "draft". Sinon son état est "New".
10674 *
10675 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10676 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10677 * à l'ajout de la tâche
10678 *
10679 * @return boolean true : traitement ok, false : erreur de traitement
10680 */
10681 protected function add_task_pec_metier_consultation(array $val, array $extra_params = array()) {
10682 if (array_key_exists("pec_metier", $val) === true
10683 && $val['pec_metier'] !== null
10684 && $val['pec_metier'] !== '') {
10685 //
10686 $inst_task = $this->f->get_inst__om_dbform(array(
10687 "obj" => "task",
10688 "idx" => 0,
10689 ));
10690 $task_val = array(
10691 'type' => 'pec_metier_consultation',
10692 'object_id' => $val['instruction'],
10693 'dossier' => $this->getVal($this->clePrimaire),
10694 );
10695 if ($this->f->is_option_mode_service_consulte_enabled() === false
10696 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10697 $task_val['state'] = $inst_task::STATUS_DRAFT;
10698 }
10699 $add_task = $inst_task->add_task(array('val' => $task_val));
10700 if ($add_task === false) {
10701 return false;
10702 }
10703 }
10704 return true;
10705 }
10706
10707 /**
10708 * Ajoute une tâche qualification_DI, sortante si le tableau des valeurs
10709 * contiens :
10710 * - une entrée "autorite_competente" ayant une valeur différente de celle du dossier
10711 *
10712 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10713 * la tâche sera à l'état "draft". Sinon son état est "New".
10714 *
10715 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10716 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10717 * à l'ajout de la tâche
10718 *
10719 * @return boolean true : traitement ok, false : erreur de traitement
10720 */
10721 protected function add_task_qualification_DI(array $val, array $extra_params = array()) {
10722 if (array_key_exists("autorite_competente", $val) === true
10723 && $val["autorite_competente"] !== $this->getVal('autorite_competente')) {
10724 //
10725 $inst_task = $this->f->get_inst__om_dbform(array(
10726 "obj" => "task",
10727 "idx" => 0,
10728 ));
10729 $task_val = array(
10730 'type' => 'qualification_DI',
10731 'object_id' => $val['instruction'],
10732 'dossier' => $this->getVal($this->clePrimaire),
10733 );
10734 if ($this->f->is_option_mode_service_consulte_enabled() === false
10735 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10736 $task_val['state'] = $inst_task::STATUS_DRAFT;
10737 }
10738 $add_task = $inst_task->add_task(array('val' => $task_val));
10739 if ($add_task === false) {
10740 return false;
10741 }
10742 }
10743 return true;
10744 }
10745
10746 /**
10747 * Ajoute une tâche decision_DI, sortante si le tableau des valeurs
10748 * contiens :
10749 * - une entrée "date_decision" non vide
10750 * - une entrée "avis_decision" non vide
10751 * - une entrée "crud" qui n'a pas pour valeur 'delete'
10752 * et si l'avis de décision n'a pas de prescription.
10753 *
10754 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10755 * la tâche sera à l'état "draft". Sinon son état est "New".
10756 *
10757 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10758 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10759 * à l'ajout de la tâche
10760 *
10761 * @return boolean true : traitement ok, false : erreur de traitement
10762 */
10763 protected function add_task_decision_DI(array $val, array $extra_params = array()) {
10764 if (array_key_exists("date_decision", $val) === true
10765 && array_key_exists("avis_decision", $val) === true
10766 && !empty($val['date_decision'])
10767 && !empty($val['avis_decision'])
10768 && array_key_exists("crud", $val) === true
10769 && $val['crud'] !== 'delete') {
10770 //
10771 $inst_ad = $this->f->get_inst__om_dbform(array(
10772 "obj" => "avis_decision",
10773 "idx" => $val['avis_decision'],
10774 ));
10775 if ($inst_ad->getVal('prescription') === 'f') {
10776 //
10777 $inst_task = $this->f->get_inst__om_dbform(array(
10778 "obj" => "task",
10779 "idx" => 0,
10780 ));
10781 $task_val = array(
10782 'type' => 'decision_DI',
10783 'object_id' => $val['instruction'],
10784 'dossier' => $this->getVal($this->clePrimaire),
10785 );
10786 if ($this->f->is_option_mode_service_consulte_enabled() === false
10787 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10788 $task_val['state'] = $inst_task::STATUS_DRAFT;
10789 }
10790 $add_task = $inst_task->add_task(array('val' => $task_val));
10791 if ($add_task === false) {
10792 return false;
10793 }
10794 }
10795 }
10796 return true;
10797 }
10798
10799 /**
10800 * Ajoute une tâche avis_consultation, sortante si le tableau des valeurs
10801 * contiens :
10802 * - une entrée "date_decision" non vide
10803 * - une entrée "avis_decision" non vide
10804 * - une entrée "crud" qui n'a pas pour valeur 'delete'
10805 * et si l'avis de décision n'a pas de prescription.
10806 *
10807 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10808 * la tâche sera à l'état "draft". Sinon son état est "New".
10809 *
10810 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10811 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10812 * à l'ajout de la tâche
10813 *
10814 * @return boolean true : traitement ok, false : erreur de traitement
10815 */
10816 protected function add_task_avis_consultation(array $val, array $extra_params = array()) {
10817 if (array_key_exists("date_decision", $val) === true
10818 && array_key_exists("avis_decision", $val) === true
10819 && !empty($val['date_decision'])
10820 && !empty($val['avis_decision'])
10821 && array_key_exists("crud", $val) === true
10822 && $val['crud'] !== 'delete') {
10823 //
10824 $inst_ad = $this->f->get_inst__om_dbform(array(
10825 "obj" => "avis_decision",
10826 "idx" => $val['avis_decision'],
10827 ));
10828 if ($inst_ad->getVal('prescription') === 'f') {
10829 //
10830 $inst_task = $this->f->get_inst__om_dbform(array(
10831 "obj" => "task",
10832 "idx" => 0,
10833 ));
10834 $task_val = array(
10835 'type' => 'avis_consultation',
10836 'object_id' => $val['instruction'],
10837 'dossier' => $this->getVal($this->clePrimaire),
10838 );
10839 if ($this->f->is_option_mode_service_consulte_enabled() === false
10840 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10841 $task_val['state'] = $inst_task::STATUS_DRAFT;
10842 }
10843 $add_task = $inst_task->add_task(array('val' => $task_val));
10844 if ($add_task === false) {
10845 return false;
10846 }
10847 }
10848 }
10849 return true;
10850 }
10851
10852 /**
10853 * Ajoute une tâche prescription, sortante si le tableau des valeurs
10854 * contiens :
10855 * - une entrée "date_decision" non vide
10856 * - une entrée "avis_decision" non vide
10857 * - une entrée "crud" qui n'a pas pour valeur 'delete'
10858 * et si l'avis de décision à une prescription.
10859 *
10860 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10861 * la tâche sera à l'état "draft". Sinon son état est "New".
10862 *
10863 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10864 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10865 * à l'ajout de la tâche
10866 *
10867 * @return boolean true : traitement ok, false : erreur de traitement
10868 */
10869 protected function add_task_prescription(array $val, array $extra_params = array()) {
10870 if (array_key_exists("date_decision", $val) === true
10871 && array_key_exists("avis_decision", $val) === true
10872 && !empty($val['date_decision'])
10873 && !empty($val['avis_decision'])
10874 && array_key_exists("crud", $val) === true
10875 && $val['crud'] !== 'delete') {
10876 //
10877 $inst_ad = $this->f->get_inst__om_dbform(array(
10878 "obj" => "avis_decision",
10879 "idx" => $val['avis_decision'],
10880 ));
10881 if ($inst_ad->getVal('prescription') === 't') {
10882 //
10883 $inst_task = $this->f->get_inst__om_dbform(array(
10884 "obj" => "task",
10885 "idx" => 0,
10886 ));
10887 $task_val = array(
10888 'type' => 'prescription',
10889 'object_id' => $val['instruction'],
10890 'dossier' => $this->getVal($this->clePrimaire),
10891 );
10892 if ($this->f->is_option_mode_service_consulte_enabled() === false
10893 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10894 $task_val['state'] = $inst_task::STATUS_DRAFT;
10895 }
10896 $add_task = $inst_task->add_task(array('val' => $task_val));
10897 if ($add_task === false) {
10898 return false;
10899 }
10900 }
10901 }
10902 return true;
10903 }
10904
10905 /**
10906 * Ajoute une tâche completude_DI, sortante à l'état "draft" si le tableau des valeurs
10907 * contiens :
10908 * - une entrée "incomplet_notifie" qui a pour valeur 'f'
10909 * - une entrée "crud" qui n'a pas pour valeur 'delete'
10910 * - pas d'entrée "avis_decision"
10911 * - pas d'entrée "date_decision"
10912 *
10913 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10914 * la tâche sera à l'état "draft". Sinon son état est "New".
10915 *
10916 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10917 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10918 * à l'ajout de la tâche
10919 *
10920 * @return boolean true : traitement ok, false : erreur de traitement
10921 */
10922 protected function add_task_completude_DI(array $val, array $extra_params = array()) {
10923 if (array_key_exists("incomplet_notifie", $val) === true
10924 && $val['incomplet_notifie'] === 'f'
10925 && $this->getVal('incomplet_notifie') === 't'
10926 && array_key_exists("crud", $val) === true
10927 && $val['crud'] !== 'delete'
10928 && empty($val['date_decision'])
10929 && empty($val['avis_decision'])) {
10930 //
10931 $inst_task = $this->f->get_inst__om_dbform(array(
10932 "obj" => "task",
10933 "idx" => 0,
10934 ));
10935 $task_val = array(
10936 'type' => 'completude_DI',
10937 'object_id' => $val['instruction'],
10938 'dossier' => $this->getVal($this->clePrimaire),
10939 );
10940 if ($this->f->is_option_mode_service_consulte_enabled() === false
10941 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10942 $task_val['state'] = $inst_task::STATUS_DRAFT;
10943 }
10944 $add_task = $inst_task->add_task(array('val' => $task_val));
10945 if ($add_task === false) {
10946 return false;
10947 }
10948 }
10949 return true;
10950 }
10951
10952 /**
10953 * Ajoute une tâche incompletude_DI, sortante à l'état "draft" si le tableau des valeurs
10954 * contiens une entrée "incomplet_notifie" qui a pour valeur 't' et une entrée "crud"
10955 * qui n'a pas pour valeur 'delete'.
10956 * Si la tâche d'incompletude est bien ajoute une tâche lettre_incompletude est également
10957 * ajoutée.
10958 *
10959 * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10960 * la tâche incompletude_DI sera à l'état "draft". Sinon son état est "New".
10961 *
10962 * @param array $val : tableau de valeur servant à l'ajout de la tâche
10963 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10964 * à l'ajout de la tâche
10965 *
10966 * @return boolean true : traitement ok, false : erreur de traitement
10967 */
10968 public function add_task_incompletude_DI(array $val, array $extra_params = array()) {
10969 if (array_key_exists("incomplet_notifie", $val) === true
10970 && $val['incomplet_notifie'] === 't'
10971 && $this->getVal('incomplet_notifie') !== 't'
10972 && array_key_exists("crud", $val) === true
10973 && $val['crud'] !== 'delete') {
10974 //
10975 $inst_task = $this->f->get_inst__om_dbform(array(
10976 "obj" => "task",
10977 "idx" => 0,
10978 ));
10979 $task_val = array(
10980 'type' => 'incompletude_DI',
10981 'object_id' => $val['instruction'],
10982 'dossier' => $this->getVal($this->clePrimaire),
10983 );
10984 if ($this->f->is_option_mode_service_consulte_enabled() === false
10985 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10986 $task_val['state'] = $inst_task::STATUS_DRAFT;
10987 }
10988 $add_task = $inst_task->add_task(array('val' => $task_val));
10989 if ($add_task === false) {
10990 return false;
10991 }
10992 }
10993 return true;
10994 }
10995
10996 /**
10997 * Ajoute une tâche lettre_incompletude, sortante si le tableau des valeurs contiens une
10998 * entrée "incomplet_notifie" qui a pour valeur 't', que le dossier visé n'est pas déjà en
10999 * incomplet notifié, et une entrée "crud" qui n'a pas pour valeur
11000 * 'delete'.
11001 *
11002 * @param array $val : tableau de valeur servant à l'ajout de la tâche
11003 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11004 * à l'ajout de la tâche
11005 *
11006 * @return boolean true : traitement ok, false : erreur de traitement
11007 */
11008 public function add_task_lettre_incompletude(array $val, array $extra_params = array()) {
11009 if (array_key_exists("incomplet_notifie", $val) === true
11010 && $val['incomplet_notifie'] === 't'
11011 && $this->getVal('incomplet_notifie') !== 't'
11012 && array_key_exists("crud", $val) === true
11013 && $val['crud'] !== 'delete') {
11014 // Ajout de la tâche de lettre du premier mois
11015 $extra_params['type'] = 'incompletude';
11016 if ($this->add_task_lettre_petitionnaire($val, $extra_params) === false) {
11017 return false;
11018 }
11019 }
11020 return true;
11021 }
11022
11023 /**
11024 * Ajoute une tâche lettre_majoration, sortante si le tableau des valeurs contiens une
11025 * entrée "delai" qui a une valeur différente du "delai" du dossier d'instruction
11026 * et une entrée "crud" qui n'a pas pour valeur 'delete'.
11027 *
11028 * @param array $val : tableau de valeur servant à l'ajout de la tâche
11029 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11030 * à l'ajout de la tâche
11031 *
11032 * @return boolean true : traitement ok, false : erreur de traitement
11033 */
11034 public function add_task_lettre_majoration(array $val, array $extra_params = array()) {
11035 if (array_key_exists("delai", $val) === true
11036 && $val['delai'] !== null
11037 && $val['delai'] !== ''
11038 && intval($this->getVal('delai')) !== 0
11039 && array_key_exists("crud", $val) === true
11040 && $val['crud'] !== 'delete') {
11041 // Ajout de la tâche de lettre du premier mois
11042 $extra_params['type'] = 'majoration';
11043 if ($this->add_task_lettre_petitionnaire($val, $extra_params) === false) {
11044 return false;
11045 }
11046 }
11047 return true;
11048 }
11049
11050 /**
11051 * Ajoute une tâche de lettre au pétitionnaire en fonction du type fournis dans les
11052 * extra_params.
11053 * - si extra_params n'a pas d'entrée type ou que cette entrée est vide, ajoute une
11054 * tâche lettre_petitionnaire
11055 * - si l'entrée type existe et n'est pas vide ajoute une tâche lettre_[type fourni]
11056 * /!\ Seule les tâches lettre_majoration et lettre_incompletude existent pour le moment
11057 * et peuvent être ajoutée.
11058 *
11059 * L'instruction doit être liée directement ou indirectement à un courrier.
11060 *
11061 * @param array $val : tableau de valeur servant à l'ajout de la tâche
11062 * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11063 * à l'ajout de la tâche
11064 *
11065 * @return boolean true : traitement ok, false : erreur de traitement
11066 */
11067 public function add_task_lettre_petitionnaire(array $val, array $extra_params = array()) {
11068 // Vérification de l'existance d'un courrier
11069 $with_doc = false;
11070 if (array_key_exists("instruction", $val) === true
11071 && $val['instruction'] !== ''
11072 && $val['instruction'] !== null) {
11073 //
11074 $inst_instruction = $this->f->get_inst__om_dbform(array(
11075 'obj' => 'instruction',
11076 'idx' => $val['instruction']
11077 ));
11078 // L'instruction executant ce code n'est pas porteur du document
11079 if ($inst_instruction->getVal('lettretype') !== null
11080 && $inst_instruction->getVal('lettretype') !== '') {
11081 //
11082 $with_doc = true;
11083 } else {
11084 // Recherche dans les instructions liés s'il y a un document
11085 $inst_ev = $this->f->get_inst__om_dbform(array(
11086 "obj" => "evenement",
11087 "idx" => $inst_instruction->getVal('evenement'),
11088 ));
11089 if ($inst_ev->getVal('retour') === 't') {
11090 $instructions_related = $inst_instruction->get_related_instructions();
11091 foreach ($instructions_related as $instruction) {
11092 if ($instruction !== null && $instruction !== '') {
11093 $inst_related_instruction = $this->f->get_inst__om_dbform(array(
11094 "obj" => "instruction",
11095 "idx" => $instruction,
11096 ));
11097 if ($inst_related_instruction->getVal('om_fichier_instruction') !== null
11098 && $inst_related_instruction->getVal('om_fichier_instruction') !== '') {
11099 //
11100 $with_doc = true;
11101 }
11102 }
11103 }
11104 }
11105 }
11106 }
11107 //
11108 if ($with_doc === true) {
11109 $inst_task = $this->f->get_inst__om_dbform(array(
11110 "obj" => "task",
11111 "idx" => 0,
11112 ));
11113 $task_val = array(
11114 'type' => (! empty($extra_params['type']) ? 'lettre_'.$extra_params['type'] : 'lettre_petitionnaire'),
11115 'object_id' => $val['instruction'],
11116 'dossier' => $this->getVal($this->clePrimaire),
11117 );
11118 if ($this->f->is_option_mode_service_consulte_enabled() === false
11119 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
11120 $task_val['state'] = $inst_task::STATUS_DRAFT;
11121 }
11122 $add_task_lettre = $inst_task->add_task(array('val' => $task_val));
11123 return $add_task_lettre !== false;
11124 }
11125 return true;
11126 }
11127
11128 public function get_parcelles($dossier = null) {
11129 if ($dossier === null) {
11130 $dossier = $this->getVal('dossier');
11131 }
11132 $query = sprintf('
11133 SELECT *
11134 FROM %1$sdossier_parcelle
11135 WHERE dossier = \'%2$s\'
11136 ORDER BY dossier_parcelle
11137 ',
11138 DB_PREFIXE,
11139 $dossier
11140 );
11141 $res = $this->f->get_all_results_from_db_query(
11142 $query,
11143 array(
11144 "origin" => __METHOD__,
11145 "force_return" => true,
11146 )
11147 );
11148 if ($res['code'] === 'KO') {
11149 return false;
11150 }
11151 return $res['result'];
11152 }
11153
11154 protected function getDossier($champ = null) {
11155 return $this->getVal($this->clePrimaire);
11156 }
11157
11158 protected function getDossierObject() {
11159 return $this;
11160 }
11161
11162 /**
11163 * Recupère la source du dépôt
11164 *
11165 * @return string source du dépôt
11166 */
11167 public function get_source_depot_from_demande() {
11168 $demande = $this->get_inst_demande();
11169 return $demande->getVal('source_depot');
11170 }
11171
11172 /**
11173 * Récupère l'instance de consultation entrante associé au dossier.
11174 *
11175 * @return consultation_entrante
11176 */
11177 public function get_inst_consultation_entrante() {
11178 $dossier = $this->getVal($this->clePrimaire);
11179 $qres = $this->f->get_one_result_from_db_query(
11180 sprintf(
11181 'SELECT
11182 consultation_entrante
11183 FROM
11184 %1$sconsultation_entrante
11185 WHERE
11186 dossier = \'%2$s\'',
11187 DB_PREFIXE,
11188 $this->f->db->escapeSimple($dossier)
11189 ),
11190 array(
11191 "origin" => __METHOD__
11192 )
11193 );
11194 $consultationEntrante = $this->f->get_inst__om_dbform(array(
11195 'obj' => 'consultation_entrante',
11196 'idx' => $qres['result']
11197 ));
11198 return $consultationEntrante;
11199 }
11200
11201 /**
11202 * Récupère l'instance du département lié à la commune du dossier.
11203 *
11204 * @return departement
11205 */
11206 public function get_inst_departement_dossier() {
11207 // Si le dossier n'a pas de commune associé alors il n'est pas non
11208 // plus associé à un département. On renvoie donc null.
11209 if (empty($this->getVal('commune'))) {
11210 return null;
11211 }
11212 $qres = $this->f->get_one_result_from_db_query(
11213 sprintf(
11214 'SELECT
11215 departement
11216 FROM
11217 %1$scommune
11218 LEFT JOIN %1$sdepartement
11219 ON commune.dep = departement.dep
11220 WHERE
11221 commune = %2$s',
11222 DB_PREFIXE,
11223 $this->f->db->escapeSimple($this->getVal('commune'))
11224 ),
11225 array(
11226 "origin" => __METHOD__
11227 )
11228 );
11229 $departement = $this->f->get_inst__om_dbform(array(
11230 'obj' => 'departement',
11231 'idx' => $qres['result']
11232 ));
11233 return $departement;
11234 }
11235
11236
11237 /**
11238 * Met à jour les informations (log) d'actions de localisation sur un dossier.
11239 *
11240 * @param string $action Nom de l'action.
11241 * @param string $date Date de l'action.
11242 * @param boolean $etat Etat de l'action.
11243 * @param string $message Message de retour de l'action.
11244 *
11245 * @return boolean false si erreur de traitement, true sinon.
11246 */
11247 public function update_dossier_geolocalisation($action, $date, $etat, $message, $dossier = null) {
11248 if ($dossier == null) {
11249 $dossier = $this->getVal('dossier');
11250 }
11251 require_once "../obj/dossier_geolocalisation.class.php";
11252 $dossier_geolocalisation = new dossier_geolocalisation(
11253 null,
11254 null,
11255 null,
11256 $dossier
11257 );
11258
11259 return $dossier_geolocalisation->set_geolocalisation_state(
11260 $action,
11261 $date,
11262 $etat,
11263 $message
11264 );
11265 }
11266
11267
11268 /**
11269 * Retourne une instance du connecteur geoads, et la créer si elle n'existe pas.
11270 *
11271 * @param array $collectivite Informations de la collectivité.
11272 *
11273 * @return geoads Instance du connecteur.
11274 */
11275 protected function get_geoads_instance(array $collectivite, string $dossierIdx) {
11276 $extra_params = array(
11277 "inst_framework" => $this->f,
11278 "dossier_idx" => $dossierIdx,
11279 );
11280 // Instanciation de l'abstracteur geoads
11281 try {
11282 $this->geoads_instance = new geoads($collectivite, $extra_params);
11283 } catch (geoads_exception $e) {
11284 $this->handle_geoads_exception($e, $dossierIdx);
11285 return false;
11286 }
11287 return $this->geoads_instance;
11288 }
11289
11290
11291 /**
11292 * Traitement des erreurs retournées par l'abstracteur geoads.
11293 *
11294 * @param geoads_exception $exception Exception retournée par l'abstracteur.
11295 *
11296 * @return void
11297 */
11298 protected function handle_geoads_exception(geoads_exception $exception, $dossierId = null) {
11299 if ($dossierId == null) {
11300 $dossierId = $this->getVal("dossier");
11301 }
11302 // log le message d'erreur retourné par le webservice
11303 $this->f->addToLog(
11304 "geolocalisation : Traitement webservice SIG: id dossier = ".
11305 $dossierId." : ".$exception->getMessage(), DEBUG_MODE
11306 );
11307 $return['log'] = array(
11308 "date" => date('d/m/Y H:i:s'),
11309 "etat" => false,
11310 "message" => $exception->getMessage(),
11311 );
11312 if ($this->f->isAjaxRequest()) {
11313 echo json_encode($return);
11314 die(); // TODO traiter correctement les erreurs !
11315 } else {
11316 $this->f->displayMessage('error', $return["log"]["message"]);
11317 }
11318 }
11319
11320
11321 /**
11322 * Réplication de la géolocalisation d'un dossier sur un autre.
11323 *
11324 * @param string $di Identifiant du DI qui va être mis à jour
11325 * @param string $da Identifiant du DA associé au DI
11326 * @param string $collectivite Identifiant de la collectivité associée au DI
11327 * @param string $commune (Optionel) Identifiant de la commune associée au DI
11328 * @param string $ref (Optionel) Identifiant de DI contenant la géolocalisation à répliquer
11329 *
11330 * @return bool|string 'true' si tout s'est bien passé, sinon un message d'erreur
11331 */
11332 public function replicate_geolocalisation(string $di, string $da, string $collectivite,
11333 string $commune = null, string $ref = null) {
11334 $this->addToLog(__METHOD__."() BEGIN", EXTRA_VERBOSE_MODE);
11335
11336 if (empty($di)) {
11337 $di = $this->getVal('dossier');
11338 }
11339
11340 // si le sig est activé/configuré
11341 if ($this->f->is_option_sig_enabled($collectivite)) {
11342
11343 // récupération du DI qui vient d'être créé
11344 if (empty($di_inst = $this->f->findObjectById('dossier', $di))) {
11345 return sprintf(
11346 __("Erreur lors de la récupération du DI %s (dossier non-trouvé)"),
11347 $di);
11348 }
11349
11350 // si un dossier référence est spécifié
11351 if (! empty($ref)) {
11352 $prev_di_idx = $ref;
11353 $err_msg = sprintf(__("Erreur lors de la récupération du DI référence %s"), $ref);
11354 }
11355
11356 // aucun dossier référence spécifié
11357 else {
11358
11359 // si on est en mode service consulté, cela concerne des consultations
11360 // et il faut également rechercher un dossier de même type DI
11361 $sameTypeWhereCond = '';
11362 if ($this->f->is_option_mode_service_consulte_enabled($collectivite)) {
11363 $sameTypeWhereCond = 'AND dossier_instruction_type = '.
11364 intval($di_inst->getVal('dossier_instruction_type'));
11365 }
11366
11367 // récupération du DI le plus récent sur le DA
11368 $qres = $this->f->get_one_result_from_db_query(
11369 sprintf("
11370 SELECT
11371 dossier
11372 FROM
11373 ".DB_PREFIXE."dossier
11374 WHERE
11375 om_collectivite = '%s'
11376 AND dossier_autorisation = '%s'
11377 AND version < %d
11378 AND dossier != '%s'
11379 $sameTypeWhereCond
11380 ORDER BY
11381 version DESC
11382 LIMIT 1
11383 ",
11384 $this->f->db->escapeSimple($collectivite),
11385 $this->f->db->escapeSimple($da),
11386 intval($di_inst->getVal('version')),
11387 $this->f->db->escapeSimple($di)),
11388 array(
11389 "origin" => __METHOD__,
11390 "force_return" => true,
11391 )
11392 );
11393 $err_msg = sprintf(
11394 __("Erreur lors de la récupération du DI le plus récent pour le DA %s"),
11395 $da);
11396 if ($qres["code"] !== "OK") {
11397 $this->addToLog(__METHOD__.'() '.$err_msg);
11398 return $err_msg;
11399 }
11400 if (empty($prev_di_idx = $qres["result"])) {
11401 $this->addToLog(__METHOD__.'() '.$err_msg." (pas de DI trouvé)");
11402 return $err_msg;
11403 }
11404 }
11405
11406 $prev_di_inst = $this->f->findObjectById('dossier', $prev_di_idx);
11407 if (empty($prev_di_inst)) {
11408 $this->addToLog(__METHOD__.'() '.$err_msg);
11409 return $err_msg;
11410 }
11411
11412 // si le DI le plus récent est géolocalisé
11413 if (! empty($prev_di_inst->getVal('geom'))) {
11414
11415 // récupère une instance du connecteur SIG
11416 $collectivite_param = $this->f->getCollectivite($collectivite);
11417 $extra_params = array(
11418 "inst_framework" => $this->f,
11419 );
11420 if ($this->f->is_option_dossier_commune_enabled() === true
11421 && !empty($commune)) {
11422 $extra_params['commune_idx'] = $commune;
11423 }
11424 try {
11425 $geoads = new geoads($collectivite_param, $extra_params);
11426 } catch (Exception $e) {
11427 return __("Erreur lors de l'instanciation du connecteur sig").
11428 ' '.__("Détail: ").json_encode($e->getMessage());
11429 }
11430
11431 // si le SIG implémente la fonctionnalité de réplication de la
11432 // géolocalisation d'un dossier à partir d'un autre
11433 if (method_exists($geoads, 'methodIsImplemented')
11434 && $geoads->methodIsImplemented('replicate_geolocalisation')) {
11435 try {
11436
11437 // réplication de sa géolocalisation sur le DI courant
11438 if (! $geoads->replicate_geolocalisation($prev_di_idx, $di)) {
11439 $err_msg = sprintf(
11440 __("Erreur lors de la réplication de la géolocalisation du DI %s sur le DI %"),
11441 $prev_di_idx,
11442 $di);
11443 $this->addToLog(__METHOD__.'() '.$err_msg);
11444 return $err_msg;
11445 }
11446
11447 // enregistrement du succès de la création du dossier/emprise
11448 $msg = sprintf(
11449 __("Emprise/dossier créé à partir du dossier %s"),
11450 $prev_di_idx);
11451 $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11452 $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11453 if (! $di_inst->update_dossier_geolocalisation('calcul_emprise', $now_dt_text, true, $msg)) {
11454 $err_msg = sprintf(
11455 __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information n'a pas pu être enregistré)"),
11456 $di, $prev_di_idx);
11457 $this->addToLog(__METHOD__.'() '.$err_msg);
11458 }
11459
11460 // enregistrement du geom (centroide)
11461 $sql = sprintf("
11462 UPDATE
11463 ".DB_PREFIXE."dossier
11464 SET
11465 geom = public.ST_GeomFromText('%s', %s)
11466 WHERE
11467 dossier = '%s'",
11468 $prev_di_inst->getVal('geom'),
11469 $collectivite_param['sig']['sig_referentiel'],
11470 $this->f->db->escapeSimple($di)
11471 );
11472 $qres = $this->f->db->query($sql);
11473 if ($this->f->isDatabaseError($qres, true)) {
11474 $err_msg = sprintf(
11475 __("Erreur lors de l'enregistrement du centroide dans le dossier %s (le dossier a bien été créé/géolocalisé dans le SIG)"),
11476 $di);
11477 $this->addToLog(__METHOD__.'() '.$err_msg);
11478 }
11479 else {
11480
11481 // enregistrement du message pour le centroide
11482 $msg = sprintf(
11483 __("Centroide récupéré à partir du dossier %s"),
11484 $prev_di_idx);
11485 $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11486 $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11487 if (! $di_inst->update_dossier_geolocalisation('calcul_centroide', $now_dt_text, true, $msg)) {
11488 $err_msg = sprintf(
11489 __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information sur le centroide n'a pas pu être enregistré)"),
11490 $di, $prev_di_idx);
11491 $this->addToLog(__METHOD__.'() '.$err_msg);
11492 }
11493
11494 // réplication des contraintes
11495 $res = $this->f->get_all_results_from_db_query(
11496 sprintf('
11497 SELECT
11498 contrainte,
11499 texte_complete,
11500 reference
11501 FROM
11502 %1$sdossier_contrainte
11503 WHERE
11504 dossier = \'%2$s\'',
11505 DB_PREFIXE,
11506 $this->f->db->escapeSimple($prev_di_idx)
11507 ),
11508 array(
11509 "origin" => __METHOD__,
11510 "force_return" => true,
11511 )
11512 );
11513 if ($res['code'] === 'KO') {
11514 $err_msg = sprintf(
11515 __("Erreur lors de la récupération des contraintes sig du dossier %s."),
11516 $di);
11517 $this->addToLog(__METHOD__.'() '.$err_msg);
11518 } else {
11519 $add_all_dc = true;
11520 foreach ($res['result'] as $result) {
11521 $inst_dc = $this->f->get_inst__om_dbform(array(
11522 "obj" => "dossier_contrainte",
11523 "idx" => "]",
11524 ));
11525 $valF = array();
11526 foreach ($inst_dc->champs as $champ) {
11527 $valF[$champ] = null;
11528 }
11529 $valF['dossier'] = $di;
11530 $valF['contrainte'] = $result['contrainte'];
11531 $valF['texte_complete'] = $result['texte_complete'];
11532 $valF['reference'] = $result['reference'];
11533 $add_dc = $inst_dc->ajouter($valF);
11534 if ($add_dc === false) {
11535 $add_all_dc = false;
11536 $this->addToLog(__METHOD__."() ".sprintf(__("Erreur lors de l'enregistrement de la contrainte %s sur le dossier %s."), $valF['contrainte'], $valF['dossier'])." : ".$inst_dc->msg);
11537 }
11538 }
11539 if ($add_all_dc === false) {
11540 $err_msg = sprintf(
11541 __("Erreur lors de la réplication d'une ou des contraintes sig du dossier %s à partir du dossier %s (le dossier a bien été créé/géolocalisé dans le SIG)"),
11542 $di, $prev_di_idx);
11543 $this->addToLog(__METHOD__.'() '.$err_msg);
11544 }
11545
11546 // TODO recopie-t-on les données de la géolocalisation par disque (latitude/longitude/rayon) ?
11547
11548 else {
11549
11550 // enregistrement du message pour les contraintes
11551 $msg = sprintf(
11552 __("Contraintes récupérées à partir du dossier %s"),
11553 $prev_di_idx);
11554 $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11555 $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11556 if (! $di_inst->update_dossier_geolocalisation('recup_contrainte', $now_dt_text, true, $msg)) {
11557 $err_msg = sprintf(
11558 __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information sur les contraintes n'a pas pu être enregistré)"),
11559 $di, $prev_di_idx);
11560 $this->addToLog(__METHOD__.'() '.$err_msg);
11561 }
11562 }
11563 }
11564 }
11565 }
11566 catch(geoads_connector_method_not_implemented_exception $e) {
11567 $this->addToLog(__METHOD__."() Method not impletemented 'replicate_geolocalisation'");
11568 }
11569 catch(Exception $e) {
11570 $this->addToLog(__METHOD__."() ".get_class($e)." ".$e->getMessage());
11571 return false;
11572 }
11573 }
11574 }
11575 }
11576
11577 return true;
11578 }
11579 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26