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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13137 - (show annotations)
Thu Oct 27 20:34:03 2022 UTC (2 years, 3 months ago) by softime
File size: 460486 byte(s)
* Fusion de la branche d'intégration 5.14.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 class dossier extends dossier_gen {
12
13 var $maj;
14 var $dossier_instruction_type;
15 var $is_incomplet_notifie = null;
16 var $valIdDemandeur = array("petitionnaire_principal" => array(),
17 "delegataire" => array(),
18 "petitionnaire" => array(),
19 "plaignant_principal" => array(),
20 "plaignant" => array(),
21 "contrevenant_principal" => array(),
22 "contrevenant" => array(),
23 "requerant_principal" => array(),
24 "requerant" => array(),
25 "avocat_principal" => array(),
26 "avocat" => array(),
27 "bailleur_principal" => array(),
28 "bailleur" => array(),
29 "proprietaire" => array(),
30 "architecte_lc" => array(),
31 "paysagiste" => array(),
32 );
33 var $postedIdDemandeur = array("petitionnaire_principal" => array(),
34 "delegataire" => array(),
35 "petitionnaire" => array(),
36 "plaignant_principal" => array(),
37 "plaignant" => array(),
38 "contrevenant_principal" => array(),
39 "contrevenant" => array(),
40 "requerant_principal" => array(),
41 "requerant" => array(),
42 "avocat_principal" => array(),
43 "avocat" => array(),
44 "bailleur_principal" => array(),
45 "bailleur" => array(),
46 "proprietaire" => array(),
47 "architecte_lc" => array(),
48 "paysagiste" => array(),
49 );
50 /**
51 * Instance de la classe taxe_amenagement.
52 *
53 * @var null
54 */
55 var $inst_taxe_amenagement = null;
56
57 /**
58 * Instance de la classe donnees_techniques.
59 *
60 * @var null
61 */
62 var $inst_donnees_techniques = null;
63
64 /**
65 * Instance de la classe dossier_autorisation.
66 *
67 * @var mixed (resource | null)
68 */
69 var $inst_dossier_autorisation = null;
70
71 /**
72 * Instance de la classe dossier_autorisation_type_detaille.
73 *
74 * @var null
75 */
76 var $inst_dossier_autorisation_type_detaille = null;
77
78 /**
79 * Instance de la classe cerfa.
80 *
81 * @var null
82 */
83 var $inst_cerfa = null;
84
85 /**
86 * Groupe du dossier d'instruction.
87 *
88 * @var null
89 */
90 var $groupe = null;
91
92 /**
93 * Instance de la classe groupe.
94 */
95 var $inst_groupe = null;
96
97 /**
98 * Instance de la classe dossier_autorisation_type.
99 *
100 * @var null
101 */
102 var $inst_dossier_autorisation_type = null;
103
104 /**
105 * Instance de la classe demande.
106 *
107 * @var mixed (resource | null)
108 */
109 var $inst_demande = null;
110
111 /**
112 * Liste des types de tâches.
113 *
114 * @var array
115 */
116 var $task_types = array(
117 'incompletude_DI',
118 'qualification_DI',
119 'decision_DI',
120 'completude_DI',
121 'pec_metier_consultation',
122 'avis_consultation',
123 'modification_DI',
124 'prescription',
125 );
126
127 /**
128 * Liste des champs requis dans Plat'AU.
129 *
130 * @var array
131 */
132 var $list_platau_required_fields_dossier = array(
133 'donnees_techniques.enga_decla_date',
134 'donnees_techniques.enga_decla_lieu',
135 'dossier.terrain_adresse_localite',
136 'demandeur.localite',
137 'architecte.ville'
138 );
139
140
141 /*Mutateur pour ma variable dossier_instruction_type*/
142 public function getDossierInstructionType(){
143 return $this->dossier_instruction_type;
144 }
145 public function setDossierInstructionType($dossier_instruction_type){
146 $this->dossier_instruction_type = $dossier_instruction_type;
147 }
148
149 /**
150 * Définition des actions disponibles sur la classe.
151 *
152 * @return void
153 */
154 function init_class_actions() {
155
156 parent::init_class_actions();
157
158 // ACTION - 003 - consulter
159 //
160 $this->class_actions[3]["condition"] = array(
161 "is_user_from_allowed_collectivite",
162 "check_context",
163 );
164
165 // ACTION - 004 - contrainte
166 //
167 $this->class_actions[4] = array(
168 "identifier" => "contrainte",
169 "view" => "view_contrainte",
170 "permission_suffix" => "contrainte_tab",
171 "condition" => array(
172 "is_user_from_allowed_collectivite",
173 ),
174 );
175
176 // ACTION - 005 - view_document_numerise
177 // Interface spécifique du tableau des pièces
178 $this->class_actions[5] = array(
179 "identifier" => "view_document_numerise",
180 "view" => "view_document_numerise",
181 "permission_suffix" => "document_numerise",
182 "condition" => array(
183 "is_user_from_allowed_collectivite",
184 ),
185 );
186
187 // ACTION - 006 - view_sitadel
188 //
189 $this->class_actions[6] = array(
190 "identifier" => "sitadel",
191 "view" => "view_sitadel",
192 "permission_suffix" => "export_sitadel",
193 );
194
195 // ACTION - 777 - Redirection vers la classe fille adéquate
196 //
197 $this->class_actions[777] = array(
198 "identifier" => "redirect",
199 "view" => "redirect",
200 "permission_suffix" => "consulter",
201 );
202
203 //
204 //
205 $this->class_actions[998] = array(
206 "identifier" => "json_data",
207 "view" => "view_json_data",
208 "permission_suffix" => "consulter",
209 );
210 }
211
212 /**
213 * Clause select pour la requête de sélection des données de l'enregistrement.
214 *
215 * @return array
216 */
217 function get_var_sql_forminc__champs() {
218 $champs = array(
219 "dossier.dossier",
220 "dossier.om_collectivite AS om_collectivite"
221 );
222 if ($this->f->is_option_dossier_commune_enabled()) {
223 $champs[] = "dossier.commune AS commune";
224 }
225 array_push($champs,
226 "dossier.dossier_libelle",
227 "dossier.dossier_instruction_type",
228 "dossier_autorisation_type_detaille.libelle as dossier_autorisation_type_detaille",
229 "autorisation_contestee",
230 "donnees_techniques.ctx_reference_dsj as ctx_reference_dsj",
231 "donnees_techniques.ctx_reference_sagace as ctx_reference_sagace",
232 "dossier.depot_electronique",
233 "CASE WHEN requerant_principal.qualite='particulier' THEN
234 TRIM(CONCAT(requerant_principal.particulier_nom, ' ', requerant_principal.particulier_prenom))
235 ELSE
236 TRIM(CONCAT(requerant_principal.personne_morale_raison_sociale, ' ', requerant_principal.personne_morale_denomination))
237 END as requerants",
238 "CASE WHEN petitionnaire_principal.qualite='particulier' THEN
239 TRIM(CONCAT(petitionnaire_principal.particulier_nom, ' ', petitionnaire_principal.particulier_prenom))
240 ELSE
241 TRIM(CONCAT(petitionnaire_principal.personne_morale_raison_sociale, ' ', petitionnaire_principal.personne_morale_denomination))
242 END as dossier_petitionnaire",
243 "'' as dossier_petitionnaires",
244 "CASE WHEN contrevenant_principal.qualite='particulier' THEN
245 TRIM(CONCAT(contrevenant_principal.particulier_nom, ' ', contrevenant_principal.particulier_prenom))
246 ELSE
247 TRIM(CONCAT(contrevenant_principal.personne_morale_raison_sociale, ' ', contrevenant_principal.personne_morale_denomination))
248 END as contrevenants",
249 "TRIM(
250 CONCAT_WS(
251 ' ',
252 replace(dossier.terrain_references_cadastrales,';',' '),
253 '<br/>',
254 CASE
255 WHEN dossier.adresse_normalisee IS NULL
256 OR TRIM(dossier.adresse_normalisee) = ''
257 THEN
258 CONCAT_WS(
259 ' ',
260 dossier.terrain_adresse_voie_numero,
261 dossier.terrain_adresse_voie,
262 dossier.terrain_adresse_code_postal
263 )
264 ELSE
265 dossier.adresse_normalisee
266 END
267 )
268 ) as terrain",
269 "arrondissement.libelle as dossier_arrondissement",
270 'dossier.adresse_normalisee',
271 'dossier.adresse_normalisee_json',
272 'dossier.dossier_parent',
273 // description/nature des travaux. En cas de modif, bloc de code aussi
274 // présent dans 'dossier_instruction.inc.php','om_requete'
275 // et 'stats à la demande'.
276 "CONCAT_WS(
277 '<br/>',
278 CASE WHEN co_projet_desc = '' THEN
279 NULL
280 ELSE
281 TRIM(co_projet_desc)
282 END,
283 CASE WHEN ope_proj_desc = '' THEN
284 NULL
285 ELSE
286 TRIM(ope_proj_desc)
287 END,
288 CASE WHEN am_projet_desc = '' THEN
289 NULL
290 ELSE
291 TRIM(am_projet_desc)
292 END,
293 CASE WHEN dm_projet_desc = '' THEN
294 NULL
295 ELSE
296 TRIM(dm_projet_desc)
297 END,
298 CASE WHEN donnees_techniques.erp_cstr_neuve IS TRUE
299 THEN '".str_replace("'", "''", _('erp_cstr_neuve'))."' END,
300 CASE WHEN donnees_techniques.erp_trvx_acc IS TRUE
301 THEN '".str_replace("'", "''", _('erp_trvx_acc'))."' END,
302 CASE WHEN donnees_techniques.erp_extension IS TRUE
303 THEN '".str_replace("'", "''", _('erp_extension'))."' END,
304 CASE WHEN donnees_techniques.erp_rehab IS TRUE
305 THEN '".str_replace("'", "''", _('erp_rehab'))."' END,
306 CASE WHEN donnees_techniques.erp_trvx_am IS TRUE
307 THEN '".str_replace("'", "''", _('erp_trvx_am'))."' END,
308 CASE WHEN donnees_techniques.erp_vol_nouv_exist IS TRUE
309 THEN '".str_replace("'", "''", _('erp_vol_nouv_exist'))."' END
310 ) as \"description_projet\"",
311 //
312 "donnees_techniques.ctx_synthese_nti as dt_ctx_synthese_nti",
313 "donnees_techniques.ctx_synthese_anr as dt_ctx_synthese_anr ",
314 "donnees_techniques.ctx_infraction as dt_ctx_infraction ",
315 "donnees_techniques.ctx_regularisable as dt_ctx_regularisable ",
316 "dossier_autorisation.dossier_autorisation",
317 "dossier_autorisation.dossier_autorisation_libelle",
318 "annee",
319 "autorite_competente",
320 "dossier.instructeur",
321 "instructeur_2",
322 "dossier.division",
323 "public.ST_AsText(dossier.geom::geometry) as geom",
324 "'' as streetview",
325 "tax_secteur",
326 // Enjeu
327 "enjeu_urba",
328 "enjeu_erp",
329 "'' as enjeu_ctx",
330 // Qualification
331 "erp",
332 "a_qualifier",
333 "pec_metier",
334 "etat_transmission_platau",
335 // Archive
336 "numero_versement_archive",
337 "date_demande",
338 // Fieldset instruction
339 // Suivi
340 // Col 1
341 "dossier.date_depot",
342 "dossier.date_depot_mairie",
343 "dossier.date_affichage",
344 "date_premiere_visite",
345 "date_derniere_visite",
346 "date_contradictoire",
347 "date_retour_contradictoire",
348 "date_ait",
349 "date_transmission_parquet",
350 "donnees_techniques.ctx_date_audience as date_audience",
351 "delai",
352 "delai_incompletude",
353 "date_dernier_depot",
354 "date_limite",
355 "date_complet",
356 "date_limite_incompletude",
357 "date_cloture_instruction",
358 // Col 2
359 "dossier.etat",
360 "evenement_suivant_tacite",
361 "evenement_suivant_tacite_incompletude",
362 // Bloc 2 fieldsets
363 // Col 1 : Fieldset "Décision"
364 "dossier.date_decision",
365 "dossier.avis_decision",
366 // Col 2 : Fieldset "Validité de l'autorisation"
367 "dossier.date_validite",
368 // Autre
369 // Col 1
370 "accord_tacite",
371 // Col 2
372 "date_rejet",
373 "date_notification_delai",
374 "dossier.date_chantier",
375 "dossier.date_achevement",
376 // Col 3
377 "date_conformite",
378 // Fieldset "Simulation des taxes"
379 "tax_mtn_part_commu",
380 "tax_mtn_part_commu_sans_exo",
381 "tax_mtn_part_depart",
382 "tax_mtn_part_depart_sans_exo",
383 "tax_mtn_part_reg",
384 "tax_mtn_part_reg_sans_exo",
385 "tax_mtn_total",
386 "tax_mtn_total_sans_exo",
387 "tax_mtn_rap",
388 "tax_mtn_rap_sans_exo",
389 // Fieldset "Localisation du terrain"
390 // Col 1
391 "dossier.terrain_adresse_voie_numero",
392 "dossier.terrain_adresse_lieu_dit",
393 "dossier.terrain_adresse_code_postal",
394 "dossier.terrain_adresse_cedex",
395 "dossier.parcelle_temporaire",
396 "dossier.terrain_references_cadastrales",
397 // Col 2
398 "dossier.terrain_adresse_voie",
399 "dossier.terrain_adresse_bp",
400 "dossier.terrain_adresse_localite",
401 "dossier.terrain_superficie",
402 //
403 "geom1",
404 "dossier.description",
405 "version",
406 "incompletude",
407 "incomplet_notifie",
408 "etat_pendant_incompletude",
409 "dossier.duree_validite",
410 "quartier",
411 "dossier.log_instructions",
412 "interface_referentiel_erp",
413 "date_modification",
414 "hash_sitadel",
415 "version_clos",
416 "initial_dt",
417 // POC
418 "dossier.numerotation_type",
419 "dossier.numerotation_dep",
420 "dossier.numerotation_com",
421 "dossier.numerotation_division",
422 "dossier.numerotation_suffixe",
423 "dossier.numerotation_entite",
424 "dossier.numerotation_num",
425 "dossier.numerotation_num_suffixe",
426 "dossier.numerotation_num_entite",
427 // CONSULTATION ENTRANTE
428 "consultation_entrante.consultation_entrante",
429 "consultation_entrante.delai_reponse",
430 "consultation_entrante.type_delai",
431 "consultation_entrante.date_consultation",
432 "consultation_entrante.date_emission",
433 "consultation_entrante.date_production_notification",
434 "consultation_entrante.date_premiere_consultation",
435 "consultation_entrante.objet_consultation",
436 "consultation_entrante.etat_consultation",
437 "consultation_entrante.type_consultation",
438 "consultation_entrante.texte_fondement_reglementaire",
439 "consultation_entrante.texte_objet_consultation",
440 "consultation_entrante.service_consultant_id",
441 "consultation_entrante.service_consultant_libelle",
442 "consultation_entrante.service_consultant_insee",
443 "consultation_entrante.service_consultant_mail",
444 "consultation_entrante.service_consultant_type",
445 "consultation_entrante.service_consultant__siren",
446 "consultation_entrante.dossier as dossier_consultation",
447 //
448 "'' as lien_iiue"
449 );
450 return $champs;
451 }
452
453 /**
454 * Clause from pour la requête de sélection des données de l'enregistrement.
455 *
456 * @return string
457 */
458 function get_var_sql_forminc__tableSelect() {
459 return sprintf(
460 '%1$s%2$s
461 LEFT JOIN %1$savis_decision
462 ON avis_decision.avis_decision=dossier.avis_decision
463 LEFT JOIN %1$sdossier_autorisation
464 ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
465 LEFT JOIN %1$sdossier_autorisation_type_detaille
466 ON dossier_autorisation.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
467 LEFT JOIN (
468 SELECT *
469 FROM %1$slien_dossier_demandeur
470 INNER JOIN %1$sdemandeur
471 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
472 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
473 AND LOWER(demandeur.type_demandeur) = LOWER(\'petitionnaire\')
474 ) as petitionnaire_principal
475 ON petitionnaire_principal.dossier = dossier.dossier
476 LEFT JOIN (
477 SELECT *
478 FROM %1$slien_dossier_demandeur
479 INNER JOIN %1$sdemandeur
480 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
481 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
482 AND LOWER(demandeur.type_demandeur) = LOWER(\'requerant\')
483 ) as requerant_principal
484 ON requerant_principal.dossier = dossier.dossier
485 LEFT JOIN (
486 SELECT *
487 FROM %1$slien_dossier_demandeur
488 INNER JOIN %1$sdemandeur
489 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
490 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
491 AND LOWER(demandeur.type_demandeur) = LOWER(\'contrevenant\')
492 ) as contrevenant_principal
493 ON contrevenant_principal.dossier = dossier.dossier
494 LEFT JOIN %1$sdonnees_techniques
495 ON donnees_techniques.dossier_instruction = dossier.dossier
496 LEFT JOIN %1$setat
497 ON dossier.etat = etat.etat
498 LEFT JOIN %1$sarrondissement
499 ON dossier.terrain_adresse_code_postal = arrondissement.code_postal
500 LEFT JOIN %1$sconsultation_entrante
501 ON dossier.dossier = consultation_entrante.dossier',
502 DB_PREFIXE,
503 $this->table
504 );
505 }
506
507 /**
508 *
509 * @return string
510 */
511 function get_var_sql_forminc__sql_avis_decision() {
512 return "SELECT avis_decision,libelle from ".DB_PREFIXE."avis_decision order by libelle";
513 }
514
515 /**
516 *
517 * @return string
518 */
519 function get_var_sql_forminc__sql_avis_decision_by_id() {
520 return "SELECT avis_decision.avis_decision, libelle FROM ".DB_PREFIXE."avis_decision WHERE avis_decision = '<idx>'";
521 }
522
523 /**
524 *
525 * @return string
526 */
527 function get_var_sql_forminc__sql_dossier_autorisation() {
528 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation ORDER BY dossier_autorisation.dossier_autorisation ASC";
529 }
530
531 /**
532 *
533 * @return string
534 */
535 function get_var_sql_forminc__sql_dossier_autorisation_by_id() {
536 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation WHERE dossier_autorisation = '<idx>'";
537 }
538
539 /**
540 *
541 * @return string
542 */
543 function get_var_sql_forminc__sql_arrondissement() {
544 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement ORDER BY arrondissement.libelle ASC";
545 }
546
547 /**
548 *
549 * @return string
550 */
551 function get_var_sql_forminc__sql_arrondissement_by_id() {
552 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement WHERE arrondissement = <idx>";
553 }
554
555 /**
556 *
557 * @return string
558 */
559 function get_var_sql_forminc__sql_autorisation_contestee() {
560 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier ORDER BY dossier.annee ASC";
561 }
562
563 /**
564 *
565 * @return string
566 */
567 function get_var_sql_forminc__sql_autorisation_contestee_by_id() {
568 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier WHERE dossier = '<idx>'";
569 }
570
571 /**
572 *
573 * @return string
574 */
575 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille() {
576 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.code
577 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
578 ORDER BY dossier_autorisation_type_detaille.libelle";
579 }
580
581 /**
582 *
583 * @return string
584 */
585 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille_by_id() {
586 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>";
587 }
588
589 /**
590 *
591 * @return string
592 */
593 function get_var_sql_forminc__sql_demandeur() {
594 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.libelle
595 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
596 ORDER BY dossier_autorisation_type_detaille.libelle";
597 }
598
599 /**
600 *
601 * @return string
602 */
603 function get_var_sql_forminc__sql_demandeur_by_id() {
604 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>";
605 }
606
607 /**
608 *
609 * @return string
610 */
611 function get_var_sql_forminc__sql_instructeur_div() {
612 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
613 FROM ".DB_PREFIXE."instructeur
614 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
615 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
616 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)))
617 <instructeur_qualite>
618 ORDER BY nom";
619 }
620
621 /**
622 *
623 * @return string
624 */
625 function get_var_sql_forminc__sql_instructeur_div_by_id() {
626 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
627 FROM ".DB_PREFIXE."instructeur
628 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
629 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
630 WHERE instructeur = <idx>";
631 }
632
633 /**
634 *
635 * @return string
636 */
637 function get_var_sql_forminc__sql_instructeur_div_by_di() {
638 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
639 FROM ".DB_PREFIXE."instructeur
640 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
641 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
642 LEFT JOIN ".DB_PREFIXE."direction
643 ON division.direction = direction.direction
644 LEFT JOIN ".DB_PREFIXE."om_collectivite
645 ON direction.om_collectivite = om_collectivite.om_collectivite
646 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)))
647 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
648 <instructeur_qualite>
649 ORDER BY nom";
650 }
651
652 /**
653 *
654 * @return string
655 */
656 function get_var_sql_forminc__sql_instructeur_by_di() {
657 return "SELECT instructeur.instructeur, instructeur.nom
658 FROM ".DB_PREFIXE."instructeur
659 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
660 LEFT JOIN ".DB_PREFIXE."division
661 ON instructeur.division = division.division
662 LEFT JOIN ".DB_PREFIXE."direction
663 ON division.direction = direction.direction
664 LEFT JOIN ".DB_PREFIXE."om_collectivite
665 ON direction.om_collectivite = om_collectivite.om_collectivite
666 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)))
667 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
668 <instructeur_qualite>
669 ORDER BY instructeur.nom ASC";
670 }
671
672 /**
673 *
674 * @return string
675 */
676 function get_var_sql_forminc__sql_instructeur_2_div() {
677 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
678 FROM ".DB_PREFIXE."instructeur
679 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
680 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
681 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)))
682 AND instructeur_qualite.code = <instructeur_qualite>
683 ORDER BY nom";
684 }
685
686 /**
687 *
688 * @return string
689 */
690 function get_var_sql_forminc__sql_instructeur_2_div_by_id() {
691 return $this->get_var_sql_forminc__sql("instructeur_div_by_id");
692 }
693
694 /**
695 *
696 * @return string
697 */
698 function get_var_sql_forminc__sql_instructeur_2_div_by_di() {
699 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
700 FROM ".DB_PREFIXE."instructeur
701 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
702 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
703 LEFT JOIN ".DB_PREFIXE."direction
704 ON division.direction = direction.direction
705 LEFT JOIN ".DB_PREFIXE."om_collectivite
706 ON direction.om_collectivite = om_collectivite.om_collectivite
707 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)))
708 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
709 AND instructeur_qualite.code = '<instructeur_qualite>'
710 ORDER BY nom";
711 }
712
713 /**
714 *
715 * @return string
716 */
717 function get_var_sql_forminc__sql_instructeur_2_by_di() {
718 return "SELECT instructeur.instructeur, instructeur.nom
719 FROM ".DB_PREFIXE."instructeur
720 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
721 LEFT JOIN ".DB_PREFIXE."division
722 ON instructeur.division = division.division
723 LEFT JOIN ".DB_PREFIXE."direction
724 ON division.direction = direction.direction
725 LEFT JOIN ".DB_PREFIXE."om_collectivite
726 ON direction.om_collectivite = om_collectivite.om_collectivite
727 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)))
728 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
729 AND instructeur_qualite.code = '<instructeur_qualite>'
730 ORDER BY instructeur.nom ASC";
731 }
732
733 /**
734 *
735 * @return string
736 */
737 function get_var_sql_forminc__sql_division_by_di() {
738 return "SELECT division.division, division.libelle
739 FROM ".DB_PREFIXE."division
740 LEFT JOIN ".DB_PREFIXE."direction
741 ON division.direction = direction.direction
742 LEFT JOIN ".DB_PREFIXE."om_collectivite
743 ON direction.om_collectivite = om_collectivite.om_collectivite
744 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)))
745 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
746 ORDER BY division.libelle ASC";
747 }
748
749 /**
750 *
751 * @return string
752 */
753 function get_var_sql_forminc__sql_commune() {
754 return "
755 SELECT
756 commune.commune, commune.libelle AS libelle
757 FROM
758 ".DB_PREFIXE."commune
759 WHERE (commune.om_validite_debut IS NULL OR commune.om_validite_debut <= CURRENT_DATE)
760 AND (commune.om_validite_fin IS NULL OR commune.om_validite_fin > CURRENT_DATE)
761 ORDER BY commune.libelle ASC
762 ";
763 }
764
765 /**
766 *
767 * @return string
768 */
769 function get_var_sql_forminc__sql_dossier_instruction_type_by_id() {
770 return sprintf('
771 SELECT dossier_instruction_type.dossier_instruction_type,
772 CONCAT_WS(\' - \', dossier_autorisation_type_detaille.libelle, dossier_instruction_type.libelle)
773 FROM %1$sdossier_instruction_type
774 LEFT JOIN %1$sdossier_autorisation_type_detaille ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
775 WHERE dossier_instruction_type = <idx>
776 ',
777 DB_PREFIXE
778 );
779 }
780
781 /**
782 * VIEW - view_sitadel.
783 *
784 * @return void
785 */
786 function view_sitadel() {
787 // Affichage du formulaire permettant le choix d'un interval de date
788 // ainsi que le numéro de d'ordre qui est le numéro de la version de
789 // l'export
790 if (empty($this->f->get_submitted_post_value())) {
791 // Affichage du formulaire
792 $this->affichageFormulaire();
793 }
794 else {
795 // Initialisation des variables pour les messages de fin de traitement
796 $correct=true;
797 // Initialisation de la chaîne contenant le message d'erreur
798 $erreur = "";
799 //
800 $message_valid = '';
801 $message_info = '';
802
803 // Initialisation des dates de début et de fin
804 $datedebut ='';
805 $datefin='';
806
807 // Traitement des erreurs
808 if ($this->f->get_submitted_post_value("datedebut") == "") {
809 $correct=false;
810 } else {
811 $datedebut = substr($this->f->get_submitted_post_value("datedebut"),6,4).
812 "-".substr($this->f->get_submitted_post_value("datedebut"),3,2)."-".
813 substr($this->f->get_submitted_post_value("datedebut"),0,2);
814 }
815 if ($this->f->get_submitted_post_value("datefin") == "") {
816 $correct=false;
817 } else {
818 $datefin = substr($this->f->get_submitted_post_value("datefin"),6,4).
819 "-".substr($this->f->get_submitted_post_value("datefin"),3,2)."-".
820 substr($this->f->get_submitted_post_value("datefin"),0,2);
821 }
822 $numero = $this->f->get_submitted_post_value("numero");
823 //
824 if ($correct === true){ // ***
825 // Requête permettant de lister tous les dossiers de l'export
826 $sql= "SELECT dossier.dossier,
827 dossier.om_collectivite as collectivite,
828 dossier.dossier_autorisation,
829 dossier_instruction_type.mouvement_sitadel,
830 dossier_instruction_type.code as dossier_instruction_type_code,
831 dossier.date_depot,
832 dossier.date_decision,
833 dossier.date_chantier,
834 dossier.date_achevement,
835 dossier.terrain_references_cadastrales as dossier_terrain_references_cadastrales,
836 dossier.terrain_adresse_voie_numero as dossier_terrain_adresse_voie_numero,
837 dossier.terrain_adresse_voie as dossier_terrain_adresse_voie,
838 dossier.terrain_adresse_lieu_dit as dossier_terrain_adresse_lieu_dit,
839 dossier.terrain_adresse_localite as dossier_terrain_adresse_localite,
840 dossier.terrain_adresse_code_postal as dossier_terrain_adresse_code_postal,
841 dossier.terrain_adresse_bp as dossier_terrain_adresse_bp,
842 dossier.terrain_adresse_cedex as dossier_terrain_adresse_cedex,
843 dossier_autorisation_type.code,
844 dossier.date_limite,
845 dossier.date_limite_incompletude,
846 dossier.date_notification_delai,
847 dossier.terrain_superficie as dossier_terrain_superficie,
848 dossier.date_modification,
849 dossier.hash_sitadel,
850
851 arrondissement.code_impots as code_impots,
852
853 autorite_competente.autorite_competente_sitadel,
854 pp.type_demandeur,
855 pp.qualite,
856 civilite_pp.libelle as civilite_pp,
857 pp.particulier_nom as pp_particulier_nom,
858 pp.particulier_prenom as pp_particulier_prenom,
859 pp.personne_morale_denomination as pp_personne_morale_denomination,
860 pp.personne_morale_raison_sociale as pp_personne_morale_raison_sociale,
861 pp.personne_morale_siret as pp_personne_morale_siret,
862 pp.personne_morale_categorie_juridique as pp_personne_morale_categorie_juridique,
863 civilite_pm.libelle as civilite_pm_libelle,
864 pp.personne_morale_nom as pp_personne_morale_nom,
865 pp.personne_morale_prenom as pp_personne_morale_prenom,
866
867 pp.numero as pp_numero,
868 pp.voie as pp_voie,
869 pp.complement as pp_complement,
870 pp.lieu_dit as pp_lieu_dit,
871 pp.localite as pp_localite,
872 pp.code_postal as pp_code_postal,
873 pp.bp as pp_bp,
874 pp.cedex as pp_cedex,
875 pp.pays as pp_pays,
876 pp.division_territoriale as pp_division_territoriale,
877
878 pp.telephone_fixe as pp_telephone_fixe,
879 pp.courriel as pp_courriel,
880
881 donnees_techniques.co_archi_recours,
882 donnees_techniques.am_terr_surf,
883 donnees_techniques.am_lotiss,
884 donnees_techniques.terr_juri_zac,
885 donnees_techniques.terr_juri_afu,
886 donnees_techniques.co_projet_desc,
887 donnees_techniques.am_projet_desc,
888 donnees_techniques.dm_projet_desc,
889 donnees_techniques.co_cstr_nouv,
890 donnees_techniques.co_cstr_exist,
891 donnees_techniques.co_modif_aspect,
892 donnees_techniques.co_modif_struct,
893 donnees_techniques.co_cloture,
894 donnees_techniques.co_trx_exten,
895 donnees_techniques.co_trx_surelev,
896 donnees_techniques.co_trx_nivsup,
897 donnees_techniques.co_trx_amgt,
898 donnees_techniques.co_anx_pisc,
899 donnees_techniques.co_anx_gara,
900 donnees_techniques.co_anx_veran,
901 donnees_techniques.co_anx_abri,
902 donnees_techniques.co_anx_autr,
903 donnees_techniques.co_bat_niv_nb,
904
905 -- Tableau des destinations
906 donnees_techniques.su_avt_shon1,
907 donnees_techniques.su_avt_shon2,
908 donnees_techniques.su_avt_shon3,
909 donnees_techniques.su_avt_shon4,
910 donnees_techniques.su_avt_shon5,
911 donnees_techniques.su_avt_shon6,
912 donnees_techniques.su_avt_shon7,
913 donnees_techniques.su_avt_shon8,
914 donnees_techniques.su_avt_shon9,
915 donnees_techniques.su_demo_shon1,
916 donnees_techniques.su_demo_shon2,
917 donnees_techniques.su_demo_shon3,
918 donnees_techniques.su_demo_shon4,
919 donnees_techniques.su_demo_shon5,
920 donnees_techniques.su_demo_shon6,
921 donnees_techniques.su_demo_shon7,
922 donnees_techniques.su_demo_shon8,
923 donnees_techniques.su_demo_shon9,
924 donnees_techniques.su_chge_shon1,
925 donnees_techniques.su_chge_shon2,
926 donnees_techniques.su_chge_shon3,
927 donnees_techniques.su_chge_shon4,
928 donnees_techniques.su_chge_shon5,
929 donnees_techniques.su_chge_shon6,
930 donnees_techniques.su_chge_shon7,
931 donnees_techniques.su_chge_shon8,
932 donnees_techniques.su_chge_shon9,
933 donnees_techniques.su_sup_shon1,
934 donnees_techniques.su_sup_shon2,
935 donnees_techniques.su_sup_shon3,
936 donnees_techniques.su_sup_shon4,
937 donnees_techniques.su_sup_shon5,
938 donnees_techniques.su_sup_shon6,
939 donnees_techniques.su_sup_shon7,
940 donnees_techniques.su_sup_shon8,
941 donnees_techniques.su_sup_shon9,
942 donnees_techniques.su_cstr_shon1,
943 donnees_techniques.su_cstr_shon2,
944 donnees_techniques.su_cstr_shon3,
945 donnees_techniques.su_cstr_shon4,
946 donnees_techniques.su_cstr_shon5,
947 donnees_techniques.su_cstr_shon6,
948 donnees_techniques.su_cstr_shon7,
949 donnees_techniques.su_cstr_shon8,
950 donnees_techniques.su_cstr_shon9,
951 donnees_techniques.su_tot_shon1,
952 donnees_techniques.su_tot_shon2,
953 donnees_techniques.su_tot_shon3,
954 donnees_techniques.su_tot_shon4,
955 donnees_techniques.su_tot_shon5,
956 donnees_techniques.su_tot_shon6,
957 donnees_techniques.su_tot_shon7,
958 donnees_techniques.su_tot_shon8,
959 donnees_techniques.su_tot_shon9,
960 -- XXX valeurs obsolètes mais utilisées dans les conditions
961 -- pour afficher les messages d'incohérence
962 donnees_techniques.su_trsf_shon1,
963 donnees_techniques.su_trsf_shon2,
964 donnees_techniques.su_trsf_shon3,
965 donnees_techniques.su_trsf_shon4,
966 donnees_techniques.su_trsf_shon5,
967 donnees_techniques.su_trsf_shon6,
968 donnees_techniques.su_trsf_shon7,
969 donnees_techniques.su_trsf_shon8,
970 donnees_techniques.su_trsf_shon9,
971
972 -- Tableau des sous-destinations
973 donnees_techniques.su2_avt_shon1,
974 donnees_techniques.su2_avt_shon2,
975 donnees_techniques.su2_avt_shon3,
976 donnees_techniques.su2_avt_shon4,
977 donnees_techniques.su2_avt_shon5,
978 donnees_techniques.su2_avt_shon6,
979 donnees_techniques.su2_avt_shon7,
980 donnees_techniques.su2_avt_shon8,
981 donnees_techniques.su2_avt_shon9,
982 donnees_techniques.su2_avt_shon10,
983 donnees_techniques.su2_avt_shon11,
984 donnees_techniques.su2_avt_shon12,
985 donnees_techniques.su2_avt_shon13,
986 donnees_techniques.su2_avt_shon14,
987 donnees_techniques.su2_avt_shon15,
988 donnees_techniques.su2_avt_shon16,
989 donnees_techniques.su2_avt_shon17,
990 donnees_techniques.su2_avt_shon18,
991 donnees_techniques.su2_avt_shon19,
992 donnees_techniques.su2_avt_shon20,
993 donnees_techniques.su2_avt_shon21,
994 donnees_techniques.su2_avt_shon22,
995 donnees_techniques.su2_demo_shon1,
996 donnees_techniques.su2_demo_shon2,
997 donnees_techniques.su2_demo_shon3,
998 donnees_techniques.su2_demo_shon4,
999 donnees_techniques.su2_demo_shon5,
1000 donnees_techniques.su2_demo_shon6,
1001 donnees_techniques.su2_demo_shon7,
1002 donnees_techniques.su2_demo_shon8,
1003 donnees_techniques.su2_demo_shon9,
1004 donnees_techniques.su2_demo_shon10,
1005 donnees_techniques.su2_demo_shon11,
1006 donnees_techniques.su2_demo_shon12,
1007 donnees_techniques.su2_demo_shon13,
1008 donnees_techniques.su2_demo_shon14,
1009 donnees_techniques.su2_demo_shon15,
1010 donnees_techniques.su2_demo_shon16,
1011 donnees_techniques.su2_demo_shon17,
1012 donnees_techniques.su2_demo_shon18,
1013 donnees_techniques.su2_demo_shon19,
1014 donnees_techniques.su2_demo_shon20,
1015 donnees_techniques.su2_demo_shon21,
1016 donnees_techniques.su2_demo_shon22,
1017 donnees_techniques.su2_chge_shon1,
1018 donnees_techniques.su2_chge_shon2,
1019 donnees_techniques.su2_chge_shon3,
1020 donnees_techniques.su2_chge_shon4,
1021 donnees_techniques.su2_chge_shon5,
1022 donnees_techniques.su2_chge_shon6,
1023 donnees_techniques.su2_chge_shon7,
1024 donnees_techniques.su2_chge_shon8,
1025 donnees_techniques.su2_chge_shon9,
1026 donnees_techniques.su2_chge_shon10,
1027 donnees_techniques.su2_chge_shon11,
1028 donnees_techniques.su2_chge_shon12,
1029 donnees_techniques.su2_chge_shon13,
1030 donnees_techniques.su2_chge_shon14,
1031 donnees_techniques.su2_chge_shon15,
1032 donnees_techniques.su2_chge_shon16,
1033 donnees_techniques.su2_chge_shon17,
1034 donnees_techniques.su2_chge_shon18,
1035 donnees_techniques.su2_chge_shon19,
1036 donnees_techniques.su2_chge_shon20,
1037 donnees_techniques.su2_chge_shon21,
1038 donnees_techniques.su2_chge_shon22,
1039 donnees_techniques.su2_sup_shon1,
1040 donnees_techniques.su2_sup_shon2,
1041 donnees_techniques.su2_sup_shon3,
1042 donnees_techniques.su2_sup_shon4,
1043 donnees_techniques.su2_sup_shon5,
1044 donnees_techniques.su2_sup_shon6,
1045 donnees_techniques.su2_sup_shon7,
1046 donnees_techniques.su2_sup_shon8,
1047 donnees_techniques.su2_sup_shon9,
1048 donnees_techniques.su2_sup_shon10,
1049 donnees_techniques.su2_sup_shon11,
1050 donnees_techniques.su2_sup_shon12,
1051 donnees_techniques.su2_sup_shon13,
1052 donnees_techniques.su2_sup_shon14,
1053 donnees_techniques.su2_sup_shon15,
1054 donnees_techniques.su2_sup_shon16,
1055 donnees_techniques.su2_sup_shon17,
1056 donnees_techniques.su2_sup_shon18,
1057 donnees_techniques.su2_sup_shon19,
1058 donnees_techniques.su2_sup_shon20,
1059 donnees_techniques.su2_sup_shon21,
1060 donnees_techniques.su2_sup_shon22,
1061 donnees_techniques.su2_cstr_shon1,
1062 donnees_techniques.su2_cstr_shon2,
1063 donnees_techniques.su2_cstr_shon3,
1064 donnees_techniques.su2_cstr_shon4,
1065 donnees_techniques.su2_cstr_shon5,
1066 donnees_techniques.su2_cstr_shon6,
1067 donnees_techniques.su2_cstr_shon7,
1068 donnees_techniques.su2_cstr_shon8,
1069 donnees_techniques.su2_cstr_shon9,
1070 donnees_techniques.su2_cstr_shon10,
1071 donnees_techniques.su2_cstr_shon11,
1072 donnees_techniques.su2_cstr_shon12,
1073 donnees_techniques.su2_cstr_shon13,
1074 donnees_techniques.su2_cstr_shon14,
1075 donnees_techniques.su2_cstr_shon15,
1076 donnees_techniques.su2_cstr_shon16,
1077 donnees_techniques.su2_cstr_shon17,
1078 donnees_techniques.su2_cstr_shon18,
1079 donnees_techniques.su2_cstr_shon19,
1080 donnees_techniques.su2_cstr_shon20,
1081 donnees_techniques.su2_cstr_shon21,
1082 donnees_techniques.su2_cstr_shon22,
1083 donnees_techniques.su2_tot_shon1,
1084 donnees_techniques.su2_tot_shon2,
1085 donnees_techniques.su2_tot_shon3,
1086 donnees_techniques.su2_tot_shon4,
1087 donnees_techniques.su2_tot_shon5,
1088 donnees_techniques.su2_tot_shon6,
1089 donnees_techniques.su2_tot_shon7,
1090 donnees_techniques.su2_tot_shon8,
1091 donnees_techniques.su2_tot_shon9,
1092 donnees_techniques.su2_tot_shon10,
1093 donnees_techniques.su2_tot_shon11,
1094 donnees_techniques.su2_tot_shon12,
1095 donnees_techniques.su2_tot_shon13,
1096 donnees_techniques.su2_tot_shon14,
1097 donnees_techniques.su2_tot_shon15,
1098 donnees_techniques.su2_tot_shon16,
1099 donnees_techniques.su2_tot_shon17,
1100 donnees_techniques.su2_tot_shon18,
1101 donnees_techniques.su2_tot_shon19,
1102 donnees_techniques.su2_tot_shon20,
1103 donnees_techniques.su2_tot_shon21,
1104 donnees_techniques.su2_tot_shon22,
1105
1106 donnees_techniques.co_sp_transport,
1107 donnees_techniques.co_sp_enseign,
1108 donnees_techniques.co_sp_sante,
1109 donnees_techniques.co_sp_act_soc,
1110 donnees_techniques.co_sp_ouvr_spe,
1111 donnees_techniques.co_sp_culture,
1112 donnees_techniques.dm_tot_log_nb,
1113 donnees_techniques.co_tot_ind_nb,
1114 donnees_techniques.co_tot_coll_nb,
1115 donnees_techniques.co_tot_log_nb,
1116 donnees_techniques.co_resid_agees,
1117 donnees_techniques.co_resid_etud,
1118 donnees_techniques.co_resid_tourism,
1119 donnees_techniques.co_resid_hot_soc,
1120 donnees_techniques.co_resid_hand,
1121 donnees_techniques.co_resid_autr,
1122 donnees_techniques.co_resid_autr_desc,
1123 donnees_techniques.co_uti_pers,
1124 donnees_techniques.co_uti_princ,
1125 donnees_techniques.co_uti_secon,
1126 donnees_techniques.co_uti_vente,
1127 donnees_techniques.co_uti_loc,
1128 donnees_techniques.co_foyer_chamb_nb,
1129 donnees_techniques.co_fin_lls_nb,
1130 donnees_techniques.co_fin_aa_nb,
1131 donnees_techniques.co_fin_ptz_nb,
1132 donnees_techniques.co_fin_autr_nb,
1133 donnees_techniques.co_mais_piece_nb,
1134 donnees_techniques.co_log_1p_nb,
1135 donnees_techniques.co_log_2p_nb,
1136 donnees_techniques.co_log_3p_nb,
1137 donnees_techniques.co_log_4p_nb,
1138 donnees_techniques.co_log_5p_nb,
1139 donnees_techniques.co_log_6p_nb,
1140 donnees_techniques.mod_desc,
1141
1142 donnees_techniques.doc_date,
1143 donnees_techniques.terr_div_surf_av_div,
1144 donnees_techniques.doc_tot_trav,
1145 donnees_techniques.doc_tranche_trav,
1146 donnees_techniques.doc_tranche_trav_desc,
1147 donnees_techniques.doc_surf,
1148 donnees_techniques.doc_nb_log,
1149 donnees_techniques.doc_nb_log_indiv,
1150 donnees_techniques.doc_nb_log_coll,
1151 donnees_techniques.doc_nb_log_lls,
1152 donnees_techniques.doc_nb_log_aa,
1153 donnees_techniques.doc_nb_log_ptz,
1154 donnees_techniques.doc_nb_log_autre,
1155 donnees_techniques.daact_date,
1156 donnees_techniques.daact_date_chgmt_dest,
1157 donnees_techniques.daact_tot_trav,
1158 donnees_techniques.daact_tranche_trav,
1159 donnees_techniques.daact_tranche_trav_desc,
1160 donnees_techniques.daact_surf,
1161 donnees_techniques.daact_nb_log,
1162 donnees_techniques.daact_nb_log_indiv,
1163 donnees_techniques.daact_nb_log_coll,
1164 donnees_techniques.daact_nb_log_lls,
1165 donnees_techniques.daact_nb_log_aa,
1166 donnees_techniques.daact_nb_log_ptz,
1167 donnees_techniques.daact_nb_log_autre,
1168
1169 dossier_autorisation.date_depot as date_depot_da,
1170 dossier_autorisation.date_decision as date_decision_da,
1171 dossier_autorisation.date_validite as date_validite_da,
1172 dossier_autorisation.date_chantier as date_chantier_da,
1173 dossier_autorisation.date_achevement as date_achevement_da,
1174 avis_decision.typeavis as typeavis_da,
1175 avis_decision.sitadel,
1176 avis_decision.sitadel_motif,
1177 avis_decision.typeavis,
1178 etat.statut as statut_di
1179
1180 FROM ".DB_PREFIXE."dossier
1181
1182 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
1183 ON dossier.dossier_instruction_type =
1184 dossier_instruction_type.dossier_instruction_type
1185 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1186 ON dossier_instruction_type.dossier_autorisation_type_detaille
1187 =dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1188 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
1189 ON dossier_autorisation_type.dossier_autorisation_type
1190 =dossier_autorisation_type_detaille.dossier_autorisation_type
1191 INNER JOIN ".DB_PREFIXE."groupe
1192 ON dossier_autorisation_type.groupe = groupe.groupe
1193 AND groupe.code != 'CTX'
1194 INNER JOIN ".DB_PREFIXE."dossier_autorisation
1195 ON dossier_autorisation.dossier_autorisation
1196 =dossier.dossier_autorisation
1197 INNER JOIN ".DB_PREFIXE."autorite_competente
1198 ON autorite_competente.autorite_competente
1199 =dossier.autorite_competente
1200
1201 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1202 ON donnees_techniques.dossier_instruction = dossier.dossier
1203 LEFT JOIN ".DB_PREFIXE."avis_decision
1204 ON avis_decision.avis_decision = dossier.avis_decision
1205 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur as ldd_pp
1206 ON ldd_pp.dossier = dossier.dossier
1207 LEFT JOIN ".DB_PREFIXE."demandeur as pp
1208 ON ldd_pp.demandeur = pp.demandeur
1209 LEFT JOIN ".DB_PREFIXE."civilite as civilite_pp
1210 ON civilite_pp.civilite = pp.particulier_civilite
1211 LEFT JOIN ".DB_PREFIXE."civilite as civilite_pm
1212 ON civilite_pm.civilite = pp.personne_morale_civilite
1213 LEFT JOIN ".DB_PREFIXE."etat
1214 ON etat.etat = dossier.etat
1215 LEFT JOIN ".DB_PREFIXE."arrondissement
1216 ON dossier_autorisation.arrondissement=arrondissement.arrondissement
1217
1218 WHERE dossier_instruction_type.mouvement_sitadel IS NOT NULL
1219 AND ldd_pp.petitionnaire_principal is TRUE
1220 AND (dossier.date_modification >= '".$datedebut."' AND dossier.date_modification <= '".$datefin."')
1221 ORDER by dossier_instruction_type.mouvement_sitadel, dossier.dossier";
1222 //Exécution de la requête
1223 $res = $this->f->db -> query ($sql);
1224 $this->f->addToLog("dossier.class.php : db->query(\"".$sql."\")", VERBOSE_MODE);
1225 $this->f->isDatabaseError($res);
1226 $export="";
1227 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
1228 // initialisation de la classe permettant la mise en forme de chaque ligne de l'export
1229 require_once "../obj/export_sitadel.class.php";
1230 $export_sitadel = new export_sitadel($row['dossier'], $this->f);
1231 $export_sitadel->setRow($row);
1232 //Ajout du fichier de variable
1233 if(file_exists ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php")) {
1234 include ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php");
1235 }
1236 //
1237 $export_sitadel->setVal($val);
1238 $departement = $export_sitadel->getDepartement($row["collectivite"]);
1239 $commune = $export_sitadel->getCommune($row["collectivite"]);
1240 $region = $this->f->getParameter("region");
1241
1242 // Initialisation des variables pour le tableau des
1243 // surfaces en version 1
1244 $prefix_su = 'su';
1245 $count_su = 9;
1246 // S'il faut utiliser le tableau des surfaces en
1247 // version 2
1248 if ($export_sitadel->get_tab_su_version() === 2) {
1249 //
1250 $prefix_su = 'su2';
1251 $count_su = 20;
1252 }
1253
1254 // Récupère la version du dossier d'instruction depuis son
1255 // numéro
1256 $version = 0;
1257 $version = intval($this->get_dossier_instruction_version($row['dossier']));
1258
1259 // Mouvement de dépôt
1260 $depot="";
1261
1262 // Tous les mouvements autres que transfert ont comme mouvement le code DEPOT
1263 // les décisions devant êtres précédées par le dépôt correspondant,
1264 // les dossiers avec date de décision comprise dans l'interval fourni sont
1265 // réaffichés en tant que dépôts (mouvement DEPOT)
1266 if (($row['mouvement_sitadel'] == 'DEPOT'||($row['mouvement_sitadel'] == 'MODIFICATIF'
1267 AND $row['statut_di']=='cloture' AND $row['typeavis']=='F'))) {
1268 $depot.=$export_sitadel->entete("DEPOT",$departement,$commune, $version);
1269 $depot.=$export_sitadel->etatcivil();
1270 $depot.=$export_sitadel->adresse();
1271 $depot.=$export_sitadel->delegataire();
1272 $depot.=$export_sitadel->meltel($row['mouvement_sitadel']);
1273 $depot.=$export_sitadel->adresse_terrain();
1274 $depot.=$export_sitadel->parcelle();
1275 // ===========================
1276 // contrat maison individuelle
1277 // ===========================
1278 // sitadel : contrat|
1279 // openads : non renseigne
1280 $depot.= $export_sitadel->defaultValue('contrat')."|";
1281 // ==========
1282 // architecte
1283 // ==========
1284 // sitadel : architecte|
1285 // openads : données techniques.co_archi_recours
1286 $depot.= ($row['co_archi_recours'] == "t")?"1|":"0|";
1287 // =====================
1288 // utilisation data cnil
1289 // ======================
1290 // sitadel : cnil
1291 // openads : non renseigne
1292 $depot.= $export_sitadel->defaultValue('cnil');
1293 // fin d enregistrement depot
1294 $depot.="\n";
1295 }
1296
1297 // Seuls les dossier de type transfert ont comme mouvement le code TRANSFERT
1298 $transfert ="";
1299 if ($row['mouvement_sitadel']=='TRANSFERT') {
1300 $transfert.=$export_sitadel->entete("TRANSFERT",$departement,$commune, $version);
1301 $transfert.=$export_sitadel->etatcivil();
1302 $transfert.=$export_sitadel->adresse();
1303 $transfert.=$export_sitadel->meltel($row['mouvement_sitadel']);
1304 $transfert.="\n";
1305 }
1306
1307
1308 // Une ligne de mouvement DECISION est insérée après chaque ligne
1309 // de mouvement DEPOT
1310 $decision="";
1311 if ($row['mouvement_sitadel'] != 'TRANSFERT'
1312 and $row['mouvement_sitadel'] != 'SUPPRESSION'
1313 and $row['mouvement_sitadel'] == 'DEPOT') {
1314
1315 //Ajout de l'entête
1316 $decision.=$export_sitadel->entete("DECISION",$departement,$commune, $version);
1317
1318 //Ajout du groupe 1
1319 $decision.= $export_sitadel->decision_groupe1();
1320 // Si la décision est favorable, on remplit le groupe 2
1321 if ( $row['sitadel'] == 2 || $row['sitadel'] == 4 || $row['sitadel'] == 5
1322 || $row['sitadel'] == 0 ){
1323 //
1324 $decision.= $export_sitadel->amenagement_terrain();
1325 //Nature du projet
1326 $natproj = 2;
1327 $natprojlib= array(
1328 1=>_("Nouvelle construction"),
1329 2=>_("Travaux sur construction existante"),
1330 3=>_("Nouvelle construction et travaux sur construction"),
1331 );
1332 if ( isset($row['co_cstr_nouv']) && isset($row['co_cstr_exist']) &&
1333 $row['co_cstr_nouv'] == 't' &&
1334 $row['co_cstr_exist'] == 't' ){
1335 $natproj = 3;
1336 }
1337 //Nouvelle construction
1338 elseif ( isset($row['co_cstr_nouv']) && $row['co_cstr_nouv'] == 't' ) {
1339 $natproj = 1;
1340 }
1341 //
1342 $su_avt_shon = $export_sitadel->shon("avt");
1343 //Si la SHON existante avant travaux est supérieur à la SHON
1344 //démolie alors la variable natproj est égale à 2
1345 $shonExistante = 0;
1346 $shonDemolie = 0;
1347 // Pour chaque ligne du tableau
1348 for ($i = 1; $i <= $count_su; $i++) {
1349 //
1350 $shonExistante += floor($row[$prefix_su.'_avt_shon'.$i]);
1351 $shonDemolie += floor($row[$prefix_su.'_demo_shon'.$i]);
1352 }
1353 //Si la SHON existante avant travaux et la SHON démolie sont
1354 //égales alors la variable natproj est égale à 1
1355 if ( $shonExistante == 0 && $shonDemolie == 0 && $natproj != 1 &&
1356 $row['code'] != 'DP' && $row['code'] != 'PA') {
1357 $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";
1358 } elseif ( $shonExistante > $shonDemolie && $natproj != 2 ){
1359 $erreur .= _("Dossier ").$row['dossier']." \"".$natprojlib[$natproj]."\" "._("La SHON existante avant travaux ne doit pas être supérieure à la SHON démolie.")."\n";
1360 }
1361 $decision .= $su_avt_shon;
1362
1363 $su_demo_shon = $export_sitadel->shon("demo");
1364 //La SHON démolie s'accompagne obligatoirement de la shon
1365 //existante avant travaux
1366 if ( $shonDemolie != 0 && $shonExistante == 0 ){
1367 $erreur .= _("Dossier ").$row['dossier']." "._("La SHON demolie s'accompagne obligatoirement de la SHON existante avant travaux.")."\n";
1368 }
1369 $decision .= $su_demo_shon;
1370 //
1371 $su_sup_shon = $export_sitadel->shon("sup");
1372 $su_chge_shon = $export_sitadel->shon("chge");
1373 if ( strcasecmp($su_sup_shon, $su_chge_shon) != 0){
1374 //
1375 $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";
1376 }
1377 $decision .= $su_sup_shon;
1378 $decision .= $su_chge_shon;
1379 $decision .= $export_sitadel->shon("cstr");
1380 $decision .= "0|0|0|0|0|0|0|0|0|";
1381 // Les SHON créées par changement de destination ou
1382 // de sous-destination s'accompagnent obligatoirement
1383 // de SHON existante avant travaux non nulle
1384 if (preg_match("/[0|]{7}/", $su_chge_shon) &&
1385 preg_match("/[0|]{7}/", $su_avt_shon)){
1386
1387 $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";
1388 }
1389 // Un nombre de logements démolis strictement positif doit
1390 // s'accompagner obligatoirement de SHON démolie.
1391 if($row['dm_tot_log_nb'] > 0) {
1392 if($export_sitadel->get_shon_val('demo', 1) <= 0) {
1393 //
1394 $erreur .= _("Dossier ").$row['dossier']." "._("Un nombre de logements demolis strictement positif doit s'accompagner obligatoirement de SHON demolie.")."\n";
1395 }
1396 }
1397 // Un nombre de logements créés strictement positif doit
1398 // s'accompagner obligatoirement de SHON créée ou de SHON
1399 // créée par changement de destination ou de sous-destination
1400 // ayant pour destination l'habitation.
1401 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)) {
1402 //
1403 $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";
1404 }
1405
1406 // La SHON créée ou issue de la transformation
1407 // suffixée par 9 (intérêt collectif ou service public) doit
1408 // obligatoirement s'accompagner de la décomposition
1409 // en sous modalité renseignée par la variable cpublic et réciproquement.
1410
1411 // Test si une valeur est true
1412 $cpublic = FALSE;
1413 if (isset($row['co_sp_transport']) && $row['co_sp_transport'] == 't') {
1414 $cpublic = TRUE;
1415 }
1416 if (isset($row['co_sp_enseign']) && $row['co_sp_enseign'] == 't') {
1417 $cpublic = TRUE;
1418 }
1419 if (isset($row['co_sp_sante']) && $row['co_sp_sante'] == 't') {
1420 $cpublic = TRUE;
1421 }
1422 if (isset($row['co_sp_act_soc']) && $row['co_sp_act_soc'] == 't') {
1423 $cpublic = TRUE;
1424 }
1425 if (isset($row['co_sp_ouvr_spe']) && $row['co_sp_ouvr_spe'] == 't') {
1426 $cpublic = TRUE;
1427 }
1428 if (isset($row['co_sp_culture']) && $row['co_sp_culture'] == 't') {
1429 $cpublic = TRUE;
1430 }
1431 //
1432 if($cpublic !== TRUE AND ($export_sitadel->get_shon_val('cstr', 9) > 0 OR $export_sitadel->get_shon_val('chge', 9) > 0)) {
1433 $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";
1434 }
1435
1436 // La destination principale du logement mise à résidence
1437 // principale ou résidence secondaire doit obligatoirement
1438 // s'accompagner d'un mode d'utilisation à occupation personnelle
1439 if($row['co_uti_princ'] == 't' OR $row['co_uti_secon'] == 't') {
1440 if($row['co_uti_pers'] != 't') {
1441
1442 $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";
1443 }
1444 }
1445
1446 $decision.= $export_sitadel->destination($row['mouvement_sitadel']);
1447
1448 // Le nombre total de logements créés (variable nbtotlog)
1449 // doit être égal à la somme des nombres de logements créés
1450 // ventilés par type de financement
1451 if(intval($row['co_tot_log_nb']) != (intval($row['co_fin_lls_nb']) + intval($row['co_fin_aa_nb']) +
1452 intval($row['co_fin_ptz_nb']) + intval($row['co_fin_autr_nb']))) {
1453
1454 $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";
1455 }
1456
1457 $decision.= $export_sitadel->repartitionFinan();
1458
1459 // Le nombre total de logements créés (variable nbtotlog)
1460 // doit être égal à la totalisation de la répartition des
1461 // logements par nombre de pièces
1462 if(intval($row['co_tot_log_nb']) != (intval($row['co_log_1p_nb']) + intval($row['co_log_2p_nb']) +
1463 intval($row['co_log_3p_nb']) + intval($row['co_log_4p_nb']) + intval($row['co_log_5p_nb']) +
1464 intval($row['co_log_6p_nb']))) {
1465
1466 $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";
1467 }
1468
1469 $decision.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1470 }
1471 else {
1472 //
1473 $decision.= str_repeat("|", 6);
1474 if($row['code']=='DP'){
1475 $decision .= "00000|";
1476 }else{
1477 $decision .= "|";
1478 }
1479 $decision .= "0000|00000|";
1480 $decision.= str_repeat("|", 74);
1481 }
1482 $decision.="\n";
1483 }
1484
1485 // modificatif
1486 $modificatif='';
1487 if($row['mouvement_sitadel'] == 'MODIFICATIF' AND $row['statut_di']=='cloture' AND
1488 $row['typeavis']=='F') {
1489 $modificatif.=$export_sitadel->entete("MODIFICATIF",$departement,$commune, $version);
1490
1491 $modificatif.= $export_sitadel->decision_groupe1();
1492
1493 if(isset($row['date_decision']) or $row['date_decision']==""){
1494 // avis_sitadel et avis_sitadel_motif
1495 // si la decision est favorable, envoi des informations statistiques
1496 if($row["sitadel"] == 2 or $row["sitadel"] == 4
1497 or $row["sitadel"] == 5){
1498 // si accordé : ajout du 2nd groupe d'informations
1499 $modificatif .= $export_sitadel->adresse_terrain(); // adresse du terrain
1500 $modificatif .= $export_sitadel->parcelle(); // 3 premières parcelles
1501 $modificatif .= $export_sitadel->modificatif_terrain(); // Informations complémentaires
1502
1503 $modificatif.= $export_sitadel->shon("avt");
1504 $modificatif.= $export_sitadel->shon("demo");
1505 $modificatif.= $export_sitadel->shon("chge");
1506 $modificatif.= $export_sitadel->shon("trsf");
1507 $modificatif.= $export_sitadel->shon("cstr");
1508
1509 $modificatif.= "|||||||||";
1510 $modificatif.= $export_sitadel->destination($row['mouvement_sitadel']);
1511 $modificatif.= $export_sitadel->repartitionFinan();
1512 $modificatif.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1513 }
1514 else {
1515 $modificatif .= str_repeat("|", 90);
1516 }
1517 }
1518 else {
1519 $modificatif .= str_repeat("|", 90);
1520 }
1521
1522 $modificatif.="\n";
1523 }
1524
1525 // Mouvement suppression
1526 $suppression = '';
1527 if($row['mouvement_sitadel'] == 'SUPPRESSION') {
1528 $suppression .= $export_sitadel->entete("SUPPRESSION",$departement,$commune, $version);
1529 $suppression .= "\n";
1530 }
1531
1532 // Règles sur le mouvement suivi
1533 $suivi="";
1534 if($row['mouvement_sitadel'] == 'SUIVI' and
1535 ($row['date_chantier'] >= $datedebut and $row['date_chantier']<=$datefin) ||
1536 ($row['date_achevement'] >= $datedebut and $row['date_achevement']<=$datefin)){
1537 // Si le dossier est une DOC
1538 if($row['dossier_instruction_type_code']=='DOC'){
1539 // Une ouverture de chantier ne peut concerner qu'un permis autorisé
1540 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1541 $erreur .= _("Dossier ").$row['dossier']." "._("Une ouverture de chantier ne peut concerner qu'un permis autorise.")."\n";
1542 }
1543 // La date d'ouverture de chantier doit être supérieur à la date d'autorisation
1544 if($row['doc_date'] > $row['date_decision_da']) {
1545 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'ouverture de chantier doit être superieur a la date d'autorisation.")."\n";
1546 }
1547 // Un achèvement de chantier ne peut concerner qu'un permis autorisé
1548 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1549 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis autorise.")."\n";
1550 }
1551 if( $row['date_chantier_da'] == "" && $row['date_achevement']!="") {
1552 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis sur lequel un chantier a ete ouvert.")."\n";
1553 }
1554 // La date d'achevement de travaux doit être supérieur à la date d'ouverture des travaux
1555 if($row['daact_date'] > $row['date_chantier_da']) {
1556 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'achevement de travaux doit etre superieur a la date d'ouverture des travaux.")."\n";
1557 }
1558 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1559 $suivi.=$export_sitadel->chantier($row);
1560 //On récupère la DAACT si elle existe
1561 $sqlDAACT = "SELECT
1562 donnees_techniques.daact_date,
1563 donnees_techniques.daact_date_chgmt_dest,
1564 donnees_techniques.daact_tot_trav,
1565 donnees_techniques.daact_tranche_trav,
1566 donnees_techniques.daact_tranche_trav_desc,
1567 donnees_techniques.daact_surf,
1568 donnees_techniques.daact_nb_log,
1569 donnees_techniques.daact_nb_log_indiv,
1570 donnees_techniques.daact_nb_log_coll,
1571 donnees_techniques.daact_nb_log_lls,
1572 donnees_techniques.daact_nb_log_aa,
1573 donnees_techniques.daact_nb_log_ptz,
1574 donnees_techniques.daact_nb_log_autre,
1575 etat.statut as statut_di
1576
1577 FROM ".DB_PREFIXE."dossier
1578 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1579 ON dossier.dossier=donnees_techniques.dossier_instruction
1580 LEFT JOIN ".DB_PREFIXE."etat
1581 ON dossier.etat = etat.etat
1582 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1583 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
1584 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1585 dossier_instruction_type.code = 'DAACT' and mouvement_sitadel='SUIVI'";
1586 $resDAACT = $this->f->db -> query ($sqlDAACT);
1587 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDAACT."\")", VERBOSE_MODE);
1588 $this->f->isDatabaseError($resDAACT);
1589 $rowDAACT=& $resDAACT->fetchRow(DB_FETCHMODE_ASSOC);
1590 $suivi.=$export_sitadel->achevement($rowDAACT);
1591 $suivi.="\n";
1592 }
1593 elseif($row['dossier_instruction_type_code']=='DAACT'){
1594
1595 //On vérifie qu'une DOC existe
1596 $sqlDOC = "SELECT dossier.dossier,
1597 dossier.date_chantier,
1598 donnees_techniques.doc_date,
1599 donnees_techniques.terr_div_surf_av_div,
1600 donnees_techniques.doc_tot_trav,
1601 donnees_techniques.doc_tranche_trav,
1602 donnees_techniques.doc_tranche_trav_desc,
1603 donnees_techniques.doc_surf,
1604 donnees_techniques.doc_nb_log,
1605 donnees_techniques.doc_nb_log_indiv,
1606 donnees_techniques.doc_nb_log_coll,
1607 donnees_techniques.doc_nb_log_lls,
1608 donnees_techniques.doc_nb_log_aa,
1609 donnees_techniques.doc_nb_log_ptz,
1610 donnees_techniques.doc_nb_log_autre
1611 FROM ".DB_PREFIXE."dossier
1612 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1613 ON dossier.dossier=donnees_techniques.dossier_instruction
1614 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1615 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
1616 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1617 dossier_instruction_type.code = 'DOC' and mouvement_sitadel='SUIVI'";
1618 $resDOC = $this->f->db -> query ($sqlDOC);
1619 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDOC."\")", VERBOSE_MODE);
1620 $this->f->isDatabaseError($resDOC);
1621 $rowDOC=& $resDOC->fetchRow(DB_FETCHMODE_ASSOC);
1622
1623 if((isset($rowDOC['dossier']) &&
1624 $rowDOC['date_chantier']<$datedebut || $rowDOC['date_chantier']>$datefin) ||
1625 !isset($rowDOC['dossier'])) {
1626 //
1627 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1628 $suivi.=$export_sitadel->chantier($rowDOC);
1629 $suivi.=$export_sitadel->achevement($row);
1630 $suivi.="\n";
1631 }
1632 }
1633 }
1634 // Ligne SITADEL généré
1635 $line_sitadel = $depot.$decision.$transfert.$modificatif.$suivi.$suppression;
1636 if ($line_sitadel !== '') {
1637 // Hash la ligne SITADEL
1638 $hash_sitadel = md5($line_sitadel);
1639 // Si le hash de la ligne générée est différent du hash
1640 // sauvegardé sur le dossier
1641 if ($row['hash_sitadel'] !== $hash_sitadel) {
1642 // Met la ligne dans l'export
1643 $export .= $line_sitadel;
1644 // Met à jour le hash SITADEL du dossier
1645 $inst_di = $this->get_inst_dossier($row['dossier']);
1646 $inst_di->update_hash_sitadel($hash_sitadel);
1647 } else {
1648 // Supprime les erreurs liées à la ligne qui ne sera
1649 // pas exportée
1650 $erreur = '';
1651 }
1652 }
1653 } // fin while
1654
1655 /**
1656 *
1657 */
1658 //
1659 if (DBCHARSET == 'UTF8') {
1660 $export = utf8_decode($export);
1661 }
1662
1663 /**
1664 * En-tête de fichier.
1665 *
1666 * C'est la première ligne du fichier.
1667 */
1668 // on éclate la chaîne export par ligne pour calculer le nombre
1669 // d'enregistrements et la longueur maximale des enregistrements
1670 $export_by_line = explode("\n", $export);
1671 // longueur maximale des enregistrements
1672 // (Num)(6) longueur de l’enregistrement le plus long contenu dans le
1673 // fichier (sans compter la fin d’enregistrement ou la fin de fichier)
1674 $longueur_maximale_des_enregistrements = 0;
1675 foreach ($export_by_line as $export_line) {
1676 if ($longueur_maximale_des_enregistrements > strlen($export_line)) {
1677 continue;
1678 }
1679 $longueur_maximale_des_enregistrements = strlen($export_line);
1680 }
1681 // nombre d'enregistrements
1682 // (Num)(6) nombre d’enregistrements présents dans le fichier en
1683 // comptant l’en-tête du fichier
1684 // XXX Ne faut-il pas ajouter +1 pour la ligne d'en-tête ?
1685 $nombre_d_enregistrements = count($export_by_line);
1686 // code application
1687 // (Alphanum)(7) = SITADEL
1688 $code_application = "SITADEL";
1689 // code département
1690 // (Alphanum)(3) département dans lequel se trouve le service instructeur
1691 // nomenclature : 001 à 095, 02A, 02B, 971...974
1692 $code_departement = $this->f->getParameter("departement");
1693 // service expéditeur
1694 // (Alphanum)(3) DDE ou commune (la plus grosse en cas d'EPCI) ou DGI
1695 // nomenclature : 'ADS', ‘DGI ou code commune INSEE
1696 $service_expediteur = $this->f->getParameter("commune");
1697 // service destinataire
1698 // (Alphanum)(2) DRE
1699 // nomenclature : code région INSEE (exemple : Ile-de-France=11)
1700 $service_destinataire = $this->f->getParameter("region");
1701 // code du fichier transmis
1702 // (AlphaNum)(12) AAMMjjdddccc
1703 // ddd = département du service instructeur
1704 // ccc = code du service expéditeur
1705 // AAMMjj = date
1706 // par exemple : 090531093ADS dans le cas de la transmission mensuelle
1707 // des événements intervenus au mois de mai communiqués par la DDE de
1708 // Seine-Saint-Denis.
1709 // XXX La date du jour correspond bien à la date demandée ?
1710 $code_du_fichier_transmis = sprintf(
1711 "%s%s%s",
1712 date('ymd'),
1713 $code_departement,
1714 $service_expediteur
1715 );
1716 // numéro d'ordre
1717 // (AlphaNum)(1) numéro d’ordre du fichier en cas de rectificatif
1718 // XXX Le formulaire propose jusqu'à la valeur 10 alors que la taille
1719 // de la châine doit être (1) ?
1720 $numero_d_ordre = $this->f->get_submitted_post_value("numero");
1721 // date de création
1722 // (Alphanum)(6) AAMMjj date de création du fichier transmis
1723 $date_de_creation = date('ymd');
1724 // nom de l'applicatif expéditeur
1725 // (Alphanum)(20) Exemple : GESTIO
1726 $nom_de_l_applicatif_expediteur = "openADS";
1727 // version de l'applicatif expéditeur
1728 // (Alphanum)(8) Exemple : 2.05
1729 $version_de_l_applicatif_expediteur = substr($this->f->get_application_version(), 0, 8);
1730 // Consititution de la ligne d'en-tête.
1731 $entete = sprintf(
1732 "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\n",
1733 $code_application,
1734 $code_departement,
1735 $service_expediteur,
1736 $service_destinataire,
1737 $code_du_fichier_transmis,
1738 $numero_d_ordre,
1739 $longueur_maximale_des_enregistrements,
1740 $date_de_creation,
1741 $nombre_d_enregistrements,
1742 $nom_de_l_applicatif_expediteur,
1743 $version_de_l_applicatif_expediteur
1744 );
1745
1746 /**
1747 *
1748 */
1749 //
1750 $export = $entete.$export;
1751
1752 /**
1753 * Écriture de l'export dans un fichier sur le disque et affichage du
1754 * lien de téléchargement.
1755 */
1756 // Composition du nom du fichier
1757 $nom_fichier = "SITADEL".substr($this->f->get_submitted_post_value("datedebut"),3,2)."".substr($this->f->get_submitted_post_value("datedebut"),8,4).".txt";
1758 // Composition des métadonnées du fichier
1759 $metadata_fichier = array(
1760 "filename" => $nom_fichier,
1761 "size" => strlen($export),
1762 "mimetype" => "text/csv",
1763 );
1764 // Écriture du fichier
1765 $id_fichier = $this->f->store_file(
1766 $export,
1767 $metadata_fichier,
1768 "sitadel",
1769 json_encode(array(
1770 'date_debut' => $datedebut,
1771 'date_fin' => $datefin,
1772 ))
1773 );
1774 if ($id_fichier === false) {
1775 $msg_error = __("Erreur lors du stockage/enregistrement du fichier SITADEL.").' '.__("Veuillez contacter votre administrateur.");
1776 $this->f->displayMessage("error", $msg_error);
1777 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
1778 return;
1779 }
1780 //
1781 $message_valid = sprintf(
1782 "%s<br/>%s",
1783 sprintf(__("Le fichier %s a été généré."), $nom_fichier),
1784 sprintf(
1785 '<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>',
1786 OM_ROUTE_FORM,
1787 $id_fichier,
1788 __("Télécharger le fichier SITADEL")
1789 )
1790 );
1791
1792 /**
1793 * Écriture d'une éventuelle erreur durant l'export dans un fichier sur
1794 * le disque et affichage du lien de téléchargement.
1795 */
1796 //
1797 if ($erreur != "") {
1798 // Composition du nom du fichier
1799 $nom_fichier_erreur = "probleme_".$nom_fichier;
1800 // Composition des métadonnées du fichier
1801 $metadata_fichier_erreur = array(
1802 "filename" => $nom_fichier_erreur,
1803 "size" => strlen($erreur),
1804 "mimetype" => "application/octet-stream",
1805 );
1806 // Écriture du fichier
1807 $id_fichier_erreur = $this->f->store_file(
1808 $erreur,
1809 $metadata_fichier_erreur,
1810 "sitadel",
1811 json_encode(array(
1812 'date_debut' => $datedebut,
1813 'date_fin' => $datefin,
1814 ))
1815 );
1816 if ($id_fichier_erreur === false) {
1817 $msg_error = __("Erreur lors du stockage/enregistrement du fichier des incohérences SITADEL.").' '.__("Veuillez contacter votre administrateur.");
1818 $this->f->displayMessage("error", $msg_error);
1819 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
1820 return;
1821 }
1822 //
1823 $message_info .= sprintf(
1824 "%s<br/>%s",
1825 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),
1826 sprintf(
1827 '<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>',
1828 OM_ROUTE_FORM,
1829 $id_fichier_erreur,
1830 __("Télécharger le fichier d'incohérence SITADEL")
1831 )
1832 );
1833 }
1834
1835 //
1836 $this->f->displayMessage("valid",
1837 sprintf(
1838 '%s%s%s',
1839 $message_valid,
1840 $message_info !== '' ? '<br/><br/>' : '',
1841 $message_info
1842 )
1843 );
1844
1845 //
1846 if (DEBUG > 0) {
1847 printf($export);
1848 }
1849
1850 } else {// correct = false
1851 $this->f->displayMessage("error", __("Les champs dates sont obligatoires."));
1852 }
1853 }
1854 }
1855
1856
1857 function affichageFormulaire() {
1858 printf("<form method=\"POST\" name=f1>");
1859 //
1860 printf(
1861 "<div id=\"sitadel-form-fonctionnement\" class=\"sitadel-form-bloc\"><h3>%s</h3><p>%s</p></div>",
1862 __("Fonctionnement"),
1863 __("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.")
1864 );
1865 //
1866 printf(
1867 "<div id=\"sitadel-form-export\" class=\"sitadel-form-bloc\"><h3>%s</h3>",
1868 __("Export")
1869 );
1870 //Description de la page
1871 $description = __("Saisissez la période pour laquelle vous souhaitez exporter les mouvements des dossiers au format SITADEL.");
1872 $this->f->displayDescription($description);
1873 //
1874 $input = "<input type=\"text\" name=\"%s\" id=\"%s\" value=\"%s\" size=\"15\" class=\"champFormulaire datepicker\" onchange=\"fdate(this)\" />";
1875 // champ date debut
1876 printf(" "._("Date de début")." ");
1877 printf($input, "datedebut", "datedebut", '');
1878 // champ date fin
1879 printf(" "._("Date de fin")." ");
1880 printf($input, "datefin", "datefin", '');
1881 // numero d'ordre d'envoi
1882 printf(" "._("Numero d'ordre d'envoi")." : "."<select name=\"numero\">");
1883 for ($i = 1; $i < 11; $i++) {
1884 printf("<option value =\"%d\" ", $i);
1885 printf(">%d</option>", $i);
1886 }
1887 printf("</select>");
1888 printf(
1889 "<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\" />",
1890 __("Exporter le fichier SITADEL"),
1891 addslashes(sprintf(
1892 "<b>%s</b><br/><br/>%s",
1893 __("Important à lire avant de confirmer le message de validation."),
1894 __("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.")
1895 )),
1896 OM_ROUTE_FORM
1897 );
1898 printf("</div>");
1899
1900 // Affiche le tableau des fichiers sitadel stocké
1901 $link_tab_storage = OM_ROUTE_SOUSTAB.'&obj=storage&idxformulaire=0&retour=tab&retourformulaire=sitadel';
1902 $tab_storage = sprintf(
1903 '<div id="sousform-storage-sitadel" class="sitadel-form-bloc-tab"></div>
1904 <script type="text/javascript" >
1905 ajaxIt(\'storage-sitadel\', \'%1$s\');
1906 </script>',
1907 $link_tab_storage
1908 );
1909 printf(
1910 "<div id=\"sitadel-form-histo\" class=\"sitadel-form-bloc-end\"><h3>%s</h3>%s</div>",
1911 __("Historique des exports"),
1912 $tab_storage
1913 );
1914
1915 printf("</form>");
1916 }
1917
1918 /**
1919 * VIEW - view_document_numerise.
1920 *
1921 * Vue du tableau des pièces du dossier d'autorisation.
1922 *
1923 * Cette vue permet de gérer le contenu de l'onglet "Pièce(s)" sur un
1924 * dossier d'autorisation. Cette vue spécifique est nécessaire car
1925 * l'ergonomie standard du framework ne prend pas en charge ce cas.
1926 * C'est ici la vue spécifique des pièces liées au dossier qui est
1927 * affichée directement au clic de l'onglet au lieu du soustab.
1928 *
1929 * L'idée est donc de simuler l'ergonomie standard en créant un container
1930 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
1931 * de la vue visualisation de l'objet lié.
1932 *
1933 * @return void
1934 */
1935 function view_document_numerise() {
1936 // Vérification de l'accessibilité sur l'élément
1937 $this->checkAccessibility();
1938 // Récupération des variables GET
1939 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
1940 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
1941 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
1942 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
1943 // Objet à charger
1944 $obj = "document_numerise";
1945 $type_aff_form = $this->get_type_affichage_formulaire();
1946 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
1947 $obj = "document_numerise_contexte_ctx";
1948 }
1949 // Construction de l'url de sousformulaire à appeler
1950 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
1951 $url .= "&idx=".$idxformulaire;
1952 $url .= "&action=4";
1953 $url .= "&retourformulaire=".$retourformulaire;
1954 $url .= "&idxformulaire=".$idxformulaire;
1955 $url .= "&retour=form";
1956 // Affichage du container permettant le reffraichissement du contenu
1957 // dans le cas des action-direct.
1958 printf('
1959 <div id="sousform-href" data-href="%s">
1960 </div>',
1961 $url
1962 );
1963 // Affichage du container permettant de charger le retour de la requête
1964 // ajax récupérant le sous formulaire.
1965 printf('
1966 <div id="sousform-%s">
1967 </div>
1968 <script>
1969 ajaxIt(\'%s\', \'%s\');
1970 </script>',
1971 $obj,
1972 $obj,
1973 $url
1974 );
1975 }
1976
1977
1978 /**
1979 * Traitement du numéro de version d'un dossier.
1980 * Renvoie le numéro de version.
1981 *
1982 * Récupère le numéro de version du dossier d'instruction (DI) à l'aide du
1983 * numéro de dossier d'autorisation (DA).
1984 * Si un numéro de version a été récupéré incremente également le numéro
1985 * de version du DA dans la base de données.
1986 *
1987 * @param array tableau contenant les valeurs du formulaire
1988 * @return integer|null numero de version du dossier si il a pu être récupéré
1989 */
1990 protected function traitementNumeroVersion($val = array()) {
1991 // Récupération du numéro de version du dossier d'instruction
1992 $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
1993 // Mise à jour du numéro de version du DA
1994 // La numérotation du DI est unique et basée sur celle du DA qui débute à -1.
1995 // Ainsi la version du DI initial est à 0.
1996 if (is_numeric($numeroVersion) or $numeroVersion == -1){
1997 $this->incrementNumeroVersion($val['dossier_autorisation'], ++$numeroVersion);
1998 }
1999 return $numeroVersion;
2000 }
2001
2002 /**
2003 * Traitement de la numérotation du dossier lors de la saisie manuelle du
2004 * numéro de dossier.
2005 * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2006 * dossier.
2007 *
2008 * Récupère le numéro de dossier issus du formulaire. Construis le libellé et
2009 * l'identifiant du dossier à partir du numéro saisie.
2010 *
2011 *
2012 * @param array tableau contenant les valeurs du formulaire.
2013 * @return array informations liées à la numérotation du dossier.
2014 */
2015 protected function traitementNumerotationDossierManuelle($val = array()) {
2016 // INitialisation des valeurs de la numérotation à partir des informations issues
2017 // du formulaire
2018 $num_doss_comp = $val['numero_dossier_complet'];
2019 $numerotation = array(
2020 $this->clePrimaire => $num_doss_comp,
2021 'dossier_libelle' => $num_doss_comp
2022 );
2023 // TODO : à commenter
2024 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2025 // TODO : à commenter
2026 if (empty($num_urba['di']) === false) {
2027 $dossier = sprintf("%s%s%s%s%s%s%s%s",
2028 $num_urba['di']['type'],
2029 $num_urba['di']['departement'],
2030 $num_urba['di']['commune'],
2031 $num_urba['di']['annee'],
2032 $num_urba['di']['division'],
2033 $num_urba['di']['numero'],
2034 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2035 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2036 );
2037 $dossierLibelle = sprintf("%s %s%s %s %s%s%s%s",
2038 $num_urba['di']['type'],
2039 $num_urba['di']['departement'],
2040 $num_urba['di']['commune'],
2041 $num_urba['di']['annee'],
2042 $num_urba['di']['division'],
2043 $num_urba['di']['numero'],
2044 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2045 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2046 );
2047 $numerotation = array(
2048 $this->clePrimaire => $dossier,
2049 'dossier_libelle' => $dossierLibelle,
2050 'numerotation_type' => $num_urba['di']['type'],
2051 'numerotation_dep' => $num_urba['di']['departement'],
2052 'numerotation_com' => $num_urba['di']['commune'],
2053 'numerotation_division' => $num_urba['di']['division'],
2054 'numerotation_num' => $num_urba['di']['numero'],
2055 'numerotation_suffixe' => isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : null,
2056 'numerotation_num_suffixe' => isset($num_urba['di']['num_suffixe']) === true ? $num_urba['di']['num_suffixe'] : null
2057 );
2058 }
2059 return $numerotation;
2060 }
2061
2062 /**
2063 * Traitement automatique de la numérotation du dossier.
2064 * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2065 * dossier.
2066 *
2067 * @param array tableau contenant les valeurs du formulaire.
2068 * @return array informations liées à la numérotation du dossier.
2069 */
2070 protected function traitementNumerotationDossierAuto($val = array()) {
2071 // GESTION DU SUFFIXE :
2072 // La version du suffixe est celle du type de DI : à ne pas confondre avec celle du DI lui même.
2073 // Exemple chronologique :
2074 // DI n° PC0130551600004 -> version 0
2075 // DI n° PC0130551600004M01 -> version 1
2076 // DI n° PC0130551600004PRO01 -> version 2 !!
2077 $code = null;
2078 $numeroVersionDossierInstructionType = null;
2079 $suffixe = "";
2080 // Si l'option suffixe de ce type de DI est activée
2081 if ( $this->getSuffixe($this->getDossierInstructionType()) === 't' ){
2082 // Récupération de la lettre associée au type de dossier d'instruction
2083 $code = $this->getCode($this->getDossierInstructionType());
2084 // Récupération du numéro de version en fonction du type de dossier d'instruction
2085 $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
2086 $numeroVersionDossierInstructionType = $this->getNumeroVersionDossierInstructionType(
2087 $val['dossier_autorisation'],
2088 $val['dossier_instruction_type'],
2089 $val['demande_type'],
2090 $numeroVersion
2091 );
2092 // Suffixe
2093 $suffixe = $code.$numeroVersionDossierInstructionType;
2094 }
2095
2096 // Récupération du DA pour aller chercher le type, le département, la commune, la division et le numéro
2097 // nécessaire à la numérotation du dossier.
2098 $da = $this->f->get_inst__om_dbform(array(
2099 "obj" => "dossier_autorisation",
2100 "idx" => $val['dossier_autorisation'],
2101 ));
2102
2103 return array(
2104 'dossier' => $val['dossier_autorisation'].$suffixe,
2105 'dossier_libelle' => $this->get_dossier_autorisation_libelle($val['dossier_autorisation']).$suffixe,
2106 'numerotation_type' => ! empty($da->getVal("numerotation_type")) ? $da->getVal("numerotation_type") : null,
2107 'numerotation_dep' => ! empty($da->getVal("numerotation_dep")) ? $da->getVal("numerotation_dep") : null,
2108 'numerotation_com' => ! empty($da->getVal("numerotation_com")) ? $da->getVal("numerotation_com") : null,
2109 'numerotation_division' => ! empty($da->getVal("numerotation_division")) ? $da->getVal("numerotation_division") : null,
2110 'numerotation_num' => ! empty($da->getVal("numerotation_num")) ? $da->getVal("numerotation_num") : null,
2111 'numerotation_suffixe' => $code,
2112 'numerotation_num_suffixe' => $numeroVersionDossierInstructionType
2113 );
2114 }
2115
2116 /**
2117 * Traitement spécifique pour la numérotation du dossier.
2118 * Renvoie un tableau contenant les valeurs à mettre à jour pour la numérotation.
2119 *
2120 * Le(s) traitement(s) effectué(s) dans cette méthode est(sont) :
2121 * - Si l'option om_collectivite_entite est active gère la numérotation de l'entité
2122 * du dossier.
2123 *
2124 * @param array tableau contenant les valeurs du formulaire.
2125 * @return array informations liées à la numérotation du dossier.
2126 */
2127 function traitementSpécifique($val = array()) {
2128 // TODO : commenter
2129 $numerotation = array();
2130 // Gestion du numéro entité du dossier (specifique au MC)
2131 $collectivite = $this->f->getCollectivite($val['om_collectivite']);
2132 if ($this->f->is_option_om_collectivite_entity_enabled($val['om_collectivite']) === true
2133 && $collectivite['code_entite'] !== null) {
2134 $numerotation_entite = $collectivite['code_entite'];
2135 $numerotation_num_entite = $this->increment_num_entite($val['dossier_autorisation']);
2136 $numerotation_num_entite = str_pad($numerotation_num_entite, 2, "0", STR_PAD_LEFT);
2137 $numerotation = array(
2138 $this->clePrimaire => $val[$this->clePrimaire].$numerotation_entite.$numerotation_num_entite,
2139 'dossier_libelle' => $val['dossier_libelle']." ".$numerotation_entite.$numerotation_num_entite,
2140 'numerotation_entite' => $numerotation_entite,
2141 'numerotation_num_entite' => $numerotation_num_entite
2142 );
2143 }
2144 return $numerotation;
2145 }
2146
2147 /**
2148 * Définition de la version et du suffixe du DI lors de sa création.
2149 *
2150 * @param array tableau contenant les valeurs du formulaire
2151 */
2152 function setValFAjout($val = array()) {
2153 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2154 // traitement lié à la récupération du numéro de version du dossier et stockage
2155 // de ce numéro de version
2156 $numeroVersion = $this->traitementNumeroVersion($val);
2157 $this->valF['version'] = $numeroVersion;
2158
2159 // Il y a deux possibilité de numérotation :
2160 // - la numérotation manuelle : le numéro de dossier est complétement saisis par l'utilisateur
2161 // - la numérotation automatique : le numéro de dossier est construis à partir du paramétrage
2162 // Selon les cas on va donc gérer la numérotation différemment.
2163 // Dans tous les cas on va récupérer les valeurs lié à la numérotation sous le forme d'un tableau.
2164 $isSaisieManuelle = ! empty($val['numero_dossier_complet']);
2165 if ($isSaisieManuelle) {
2166 $valNumerotationDossier = $this->traitementNumerotationDossierManuelle($val);
2167 } else {
2168 $valNumerotationDossier = $this->traitementNumerotationDossierAuto($val);
2169 }
2170 // Traitements spécifiques nécessaires à la numérotation du dossier.
2171 // Pour pouvoir réaliser les traitements spécifique on a besoin des infos de
2172 // numérotation. On l'ajoute donc au tableau des valeur pour pouvoir y accéder.
2173 $val = array_merge($val, $valNumerotationDossier);
2174 $valNumerotationSpecifique = $this->traitementSpécifique($val);
2175
2176
2177
2178 // Affectation automatique du dossier
2179 // Pour pouvoir réaliser l'affectation automatique on a besoin de la localisation.
2180 // On l'ajoute donc au tableau des valeur pour pouvoir y accéder
2181 // Récupération des références de localisation du dossier
2182 $valLocalisation = $this->localisation_dossier($val);
2183 $val = array_merge(
2184 $val,
2185 $valLocalisation
2186 );
2187 $valAffectation = $this->affectation_dossier($val);
2188
2189 // Construis le tableau des valeurs mise à jour à partir des valeurs issues de
2190 // tous les traitements précédents
2191 $this->valF = array_merge(
2192 $this->valF,
2193 $valNumerotationDossier,
2194 $valNumerotationSpecifique,
2195 $valAffectation
2196 );
2197
2198 $this->addToLog(__METHOD__."(): end", EXTRA_VERBOSE_MODE);
2199 }
2200
2201 /**
2202 * Traitement permettant de récupérer la localisation du dossier à partir de
2203 * ses références cadastrales.
2204 *
2205 * Récupère un tableau contenant les informations suivantes :
2206 * array(
2207 * 'quartier' => quartier,
2208 * 'arrondissement' => arrondissement
2209 * 'section' => section
2210 * )
2211 *
2212 * @param array tableau des valeurs du dossier
2213 * @param array tableau contenant la localisation du dossier
2214 */
2215 protected function localisation_dossier($val) {
2216 $quartier = 0;
2217 $arrondissement = 0;
2218 $section = '';
2219
2220 // Si la référence cadastrale n'est pas vide alors on récupère la
2221 // section, le quartier et l'arrondissement
2222 if ($val['terrain_references_cadastrales'] != '') {
2223
2224 // Récupère toutes les parcelles du dossier et sélectionne la première
2225 $list_parcelles = $this->f->parseParcelles($this->valF['terrain_references_cadastrales'], $this->valF['om_collectivite']);
2226 $parcelle = $list_parcelles[0];
2227
2228 // Récupère l'identifiant du quartier et de l'arrondissement
2229 $quartier_arrondissement = $this->get_quartier_arrondissement_by_code_impot($parcelle['quartier']);
2230 if ($quartier_arrondissement !== null
2231 && is_array($quartier_arrondissement) === true
2232 && isset($quartier_arrondissement['quartier']) === true
2233 && isset($quartier_arrondissement['arrondissement']) === true) {
2234 //
2235 $quartier = $quartier_arrondissement['quartier'];
2236 $arrondissement = $quartier_arrondissement['arrondissement'];
2237 }
2238
2239 // On récupère la section
2240 $section = $parcelle['section'];
2241 }
2242
2243 return array(
2244 'quartier' => $quartier,
2245 'arrondissement' => $arrondissement,
2246 'section' => $section
2247 );
2248 }
2249
2250 // Permet d'incrémenter le numéro de version de l'entité
2251 public function increment_num_entite($da) {
2252 if ($da === null || $da === '') {
2253 return false;
2254 }
2255 $last_entity_num = 0;
2256 //
2257 $inst_da = $this->f->get_inst__om_dbform(array(
2258 "obj" => "dossier_autorisation",
2259 "idx" => $da,
2260 ));
2261 $list_di = $inst_da->get_list_dossier_instruction();
2262 foreach ($list_di as $di) {
2263 $inst_di = $this->f->get_inst__om_dbform(array(
2264 "obj" => "dossier",
2265 "idx" => $di['dossier'],
2266 ));
2267 if (intval($inst_di->getVal('numerotation_num_entite')) > $last_entity_num) {
2268 $last_entity_num = intval($inst_di->getVal('numerotation_num_entite'));
2269 }
2270 }
2271 return ++$last_entity_num;
2272 }
2273
2274 /*Récupère la valeur du suffixe d'un dossier_instruction_type*/
2275 function getSuffixe($dossierInstructionType){
2276
2277 $suffixe = "";
2278
2279 $sql = "SELECT
2280 suffixe
2281 FROM
2282 ".DB_PREFIXE."dossier_instruction_type
2283 WHERE
2284 dossier_instruction_type = $dossierInstructionType";
2285 $res = $this->f->db->query($sql);
2286 $this->addToLog(
2287 __METHOD__."(): db->query(\"".$sql."\");",
2288 VERBOSE_MODE
2289 );
2290 $this->f->isDatabaseError($res);
2291 if ( $res->numRows() > 0 ){
2292
2293 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2294 $suffixe = $row['suffixe'];
2295 }
2296
2297 return $suffixe;
2298 }
2299
2300 /*Récupère dans la table de paramètrage la lettre correspondant
2301 * au dossier_instruction_type
2302 */
2303 function getCode($dossierInstructionType){
2304
2305 $code = "";
2306
2307 $sql = "SELECT
2308 code
2309 FROM
2310 ".DB_PREFIXE."dossier_instruction_type
2311 WHERE
2312 dossier_instruction_type = $dossierInstructionType";
2313 $res = $this->f->db->query($sql);
2314 $this->addToLog(
2315 __METHOD__."(): db->query(\"".$sql."\");",
2316 VERBOSE_MODE
2317 );
2318 $this->f->isDatabaseError($res);
2319 if ( $res->numRows() > 0 ){
2320
2321 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2322 $code = $row['code'];
2323 }
2324
2325 return $code;
2326 }
2327
2328 /**
2329 * Récupère le numéro de version d'un dossier_autorisation à l'aide d'une
2330 * requête sql.
2331 *
2332 * En cas d'erreur sur la requête arrête l'execution et affiche un message
2333 * d'erreur.
2334 *
2335 * @param string identifiant du dossier d'autorisation (DA)
2336 * @return integer numéro de version du DA
2337 */
2338 function getNumeroVersion($dossierAutorisation){
2339
2340 $numeroVersion = "";
2341
2342 $sql = "SELECT
2343 numero_version
2344 FROM
2345 ".DB_PREFIXE."dossier_autorisation
2346 WHERE
2347 dossier_autorisation = '$dossierAutorisation'";
2348 $res = $this->f->db->query($sql);
2349 $this->addToLog(
2350 __METHOD__."(): db->query(\"".$sql."\");",
2351 VERBOSE_MODE
2352 );
2353 $this->f->isDatabaseError($res);
2354 if ( $res->numRows() > 0 ){
2355
2356 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2357 $numeroVersion = $row['numero_version'];
2358 }
2359
2360 return $numeroVersion;
2361 }
2362
2363 /**
2364 * Retourne le numéro d'un dossier d'instruction et ses six parties.
2365 *
2366 * @param string $dossier_instruction Identifiant du dossier d'instruction (avec ou sans espace)
2367 *
2368 * @return array
2369 */
2370 function get_dossier_instruction_numero($dossier_instruction = null) {
2371
2372 // Si le DI n'a pas été fourni
2373 if ($dossier_instruction === null) {
2374 // On le récupère
2375 $dossier_instruction = $this->getVal($this->clePrimaire);
2376 }
2377
2378 /*
2379 Analyse du numéro du DI et extraction de ses parties
2380
2381 Retour : tableau associatif:
2382 - type : type du DA (2 ou 3 lettres)
2383 - depcom : code département + code communes(3 + 3 integer)
2384 - annee : année (2 integer)
2385 - division : division (une lettre ou un entier)
2386 - numero : numéro
2387 - mod : lettre(s) du type du dossier d'instruction (P, M, ANNUL, ...)
2388 - version : version du dossier d'instruction (1 ou 2 integer)
2389 */
2390 //if (preg_match_all('/^([A-Z]{2,3})\s{0,1}((\d{3}|02[AB])\d{3})\s{0,1}(\d{2})\s{0,1}([[:alnum:]]{5})([A-Z]{1,5})?(\d{1,2})?$/', $dossier_instruction, $return) === false) {
2391 $matches = array();
2392 if (! preg_match_all(
2393 '/^(?P<type>[A-Z]{2,3})'.'\s{0,1}'.
2394 '(?P<departement>(\d{3}|02[AB]))'.
2395 '(?P<commune>\d{3})'.'\s{0,1}'.
2396 '(?P<annee>\d{2})'.'\s{0,1}'.
2397 '(?P<division>[[:alnum:]])'.
2398 '(?P<numero>\d{4})'.
2399 '(?P<suffixe>[A-Z]{1,5})?'.
2400 '(?P<num_suffixe>\d{1,2})?'.'$/', $dossier_instruction, $matches)) {
2401 $this->f->addToLog(
2402 __METHOD__."()".sprintf(__("Échec du parsing du numéro de dossier %s."), $dossier_instruction),
2403 DEBUG_MODE);
2404 return false;
2405 }
2406 $res = array();
2407 foreach(array(
2408 'type', 'departement', 'commune', 'annee', 'division', 'numero', 'suffixe', 'num_suffixe')
2409 as $key) {
2410 if(isset($matches[$key][0])) {
2411 $res[$key] = $matches[$key][0];
2412 }
2413 }
2414 //$this->f->addToLog(__METHOD__."() res: ".var_export($res, true), DEBUG_MODE);
2415 return $res;
2416 }
2417
2418 /**
2419 * Récupère les arguments nécessaires à la construction d'une séquence de
2420 * dossier.
2421 *
2422 * @return array
2423 */
2424 function get_sequence_args() {
2425 //
2426 $result = array();
2427
2428 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
2429 $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
2430 $result['datc'] = $inst_dat->getVal('code');
2431 $result['annee'] = $this->getVal('annee');
2432
2433 $parse_id = $this->get_dossier_instruction_numero();
2434 if ($parse_id === false
2435 || (is_array($parse_id) && empty(array_filter($parse_id)) === true)) {
2436 // Message dans le log
2437 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de version du dossier d'instruction."), DEBUG_MODE);
2438 return false;
2439 }
2440
2441 $result['dep'] = $parse_id['departement'];
2442 $result['com'] = $parse_id['commune'];
2443 //$this->f->addToLog(__METHOD__."(): res: ".var_export($result, true), DEBUG_MODE);
2444 return $result;
2445 }
2446
2447 /**
2448 * Retourne le nom de la sequence du dossier d'instruction courant.
2449 *
2450 * @return String
2451 */
2452 function get_sequence_name() {
2453 $sequence_args = $this->get_sequence_args();
2454 if (empty($sequence_args) === true) {
2455 // Message dans le log
2456 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération des arguments de la séquence."), DEBUG_MODE);
2457 return false;
2458 }
2459 return $this->compose_sequence_name(
2460 $sequence_args['datc'], $sequence_args['annee'],
2461 $sequence_args['dep'], $sequence_args['com']);
2462 }
2463
2464 /**
2465 * Récupère le numéro de version du dossier d'instruction.
2466 *
2467 * @return string
2468 */
2469 function get_dossier_instruction_version($dossier_instruction = null) {
2470
2471 // Expression régulière qui découpe le numéro du dossier
2472 $return = $this->get_dossier_instruction_numero($dossier_instruction);
2473
2474 // Si l'expression régulière retourne une erreur
2475 if ($return == false) {
2476 // Message dans le log
2477 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de version du dossier d'instruction"), DEBUG_MODE);
2478 //
2479 return false;
2480 }
2481
2482 // Retourne seulement la version du dossier d'instruction.
2483 // Elle vaut 0 si le numéro du DI n'a pas de suffixe.
2484 if (isset($return['num_suffixe'])) {
2485 return $return['num_suffixe'];
2486 }
2487 return 0;
2488 }
2489
2490 /*Incrémente le numéro de version du dossier*/
2491 function incrementNumeroVersion($dossierAutorisation, $nouveauNumeroVersion) {
2492
2493 $valF = array (
2494 "numero_version" => $nouveauNumeroVersion
2495 );
2496
2497 $res = $this->f->db->autoexecute(
2498 DB_PREFIXE."dossier_autorisation",
2499 $valF,
2500 DB_AUTOQUERY_UPDATE,
2501 "dossier_autorisation = '$dossierAutorisation'"
2502 );
2503 $this->addToLog(
2504 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier_autorisation\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"dossier_autorisation = '".$dossierAutorisation."'\");",
2505 VERBOSE_MODE
2506 );
2507 $this->f->isDatabaseError($res);
2508 }
2509
2510 /**
2511 * Retourne un numéro de version en fonction du type de dossier d'instruction
2512 * @param string $dossier_autorisation
2513 * @param integer $dossier_instruction_type
2514 * @return int
2515 */
2516 public function getNumeroVersionDossierInstructionType($dossier_autorisation, $dossier_instruction_type, $demande_type, $numero_version, $increment = true){
2517
2518 $numeroVersionDossierInstructionType = $numero_version;
2519
2520 // Récupère la nature de la demande
2521 $inst_demande_type = $this->f->get_inst__om_dbform(array(
2522 "obj" => "demande_type",
2523 "idx" => $demande_type
2524 ));
2525 $inst_demande_nature = $this->f->get_inst__om_dbform(array(
2526 "obj" => "demande_nature",
2527 "idx" => $inst_demande_type->getVal('demande_nature')
2528 ));
2529
2530 // Si c'est un dossier d'instruction de type "Initial"
2531 if (strtolower($inst_demande_nature->getVal('code')) === 'nouv') {
2532 return 0;
2533 }
2534 //Si c'est un modificatif ou transfert on retourne un nombre correspondant au
2535 //nombre de dossier d'instruction de ce type, rattaché au dossier
2536 //d'autorisation complété par des 0 à gauche si besoin. Format du retour
2537 //attendu : 01 ou 02, etc.
2538 else {
2539
2540 //On récupère le nombre de dossier d'instruction de ce type rattaché au
2541 //dossier d'autorisation
2542 $sql = "SELECT
2543 count(dossier)
2544 FROM
2545 ".DB_PREFIXE."dossier
2546 LEFT JOIN
2547 ".DB_PREFIXE."dossier_autorisation
2548 ON
2549 dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
2550 WHERE
2551 dossier_autorisation.dossier_autorisation = '".$dossier_autorisation."'
2552 AND
2553 dossier.dossier_instruction_type = ".$dossier_instruction_type;
2554 $numeroVersionDossierInstructionType = $this->f->db->getone($sql);
2555 $this->addToLog(
2556 __METHOD__."(): db->getone(\"".$sql."\")",
2557 VERBOSE_MODE
2558 );
2559 if ($this->f->isDatabaseError($numeroVersionDossierInstructionType)) { // PP
2560 $this->f->addToError("", $numeroVersionDossierInstructionType, $numeroVersionDossierInstructionType);
2561 return false;
2562 }
2563
2564 // Requête SQL
2565 $sql = "SELECT
2566 substring(dossier, '\d*$')::int as last_num_dossier
2567 FROM ".DB_PREFIXE."dossier
2568 WHERE dossier_instruction_type = ".$dossier_instruction_type."
2569 AND dossier_autorisation = '".$dossier_autorisation."'
2570 AND version = (
2571 SELECT max(version)
2572 FROM ".DB_PREFIXE."dossier
2573 WHERE dossier_instruction_type = ".$dossier_instruction_type."
2574 AND dossier_autorisation = '".$dossier_autorisation."'
2575 GROUP BY dossier_instruction_type, dossier_autorisation
2576 )";
2577 $res = $this->f->db->query($sql);
2578 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
2579 $this->f->isDatabaseError($res);
2580 $num_version_last_dossier = null;
2581 if ($res->numRows() > 0) {
2582 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
2583 $num_version_last_dossier = $row['last_num_dossier'];
2584 }
2585
2586 if (!empty($num_version_last_dossier)
2587 && $num_version_last_dossier >= $numeroVersionDossierInstructionType) {
2588 // Modifie le numéro suivant
2589 $numeroVersionDossierInstructionType = $num_version_last_dossier;
2590 }
2591 //
2592 if ($increment === true) {
2593 $numeroVersionDossierInstructionType = ++$numeroVersionDossierInstructionType;
2594 }
2595 //On compléte par des 0 à gauche
2596 $numeroVersionDossierInstructionType = str_pad($numeroVersionDossierInstructionType, 2, "0", STR_PAD_LEFT);
2597
2598 return $numeroVersionDossierInstructionType;
2599 }
2600 }
2601 /**
2602 * Retourne le libellé du dossier d'autorisation
2603 * @param string $dossier_autorisation Identifiant du dossier d'autorisation
2604 * @return string Libellé dossier d'autorisation
2605 */
2606 function get_dossier_autorisation_libelle($dossier_autorisation) {
2607
2608 $dossier_autorisation_libelle = "";
2609
2610 // Requête SQL
2611 $sql = "SELECT
2612 dossier_autorisation_libelle
2613 FROM
2614 ".DB_PREFIXE."dossier_autorisation
2615 WHERE
2616 dossier_autorisation = '$dossier_autorisation'";
2617 $dossier_autorisation_libelle = $this->f->db->getone($sql);
2618 $this->addToLog(
2619 __METHOD__."(): db->getone(\"".$sql."\")",
2620 VERBOSE_MODE
2621 );
2622 $this->f->isDatabaseError($dossier_autorisation_libelle);
2623
2624 // Retourne le résultat
2625 return $dossier_autorisation_libelle;
2626 }
2627
2628 function setvalF($val = array()){
2629
2630 if (! $this->f->is_option_dossier_commune_enabled()) {
2631 // ajoute une "fausse" clé 'commune' dans le tableau des données envoyées
2632 // car la fonction 'setValF()' dans 'gen/obj/demande.class.php'
2633 // déclenche une erreur 'Undefined index: commune' sinon
2634 $val['commune'] = null;
2635 // idem pour cette valeur qui est passée au dossier d'instruction
2636 $this->valF['commune'] = null;
2637 }
2638
2639 parent::setvalF($val);
2640
2641 // Récupération des id demandeurs postés
2642 $this->getPostedValues();
2643
2644 // enlever les valeurs a ne pas saisir -> recherche en trigger ajouter et modifier
2645 unset ($this->valF['geom']);
2646 unset ($this->valF['geom1']);
2647 // valeurs hiddenstatic (calcule)
2648 if($this->maj==1){
2649 // par defaut
2650 unset ($this->valF['etat']);
2651 unset ($this->valF['delai']);
2652 unset ($this->valF['accord_tacite']);
2653 }
2654 unset ($this->valF['avis_decision']); // avis + libelle avis
2655 unset ($this->valF['terrain_surface_calcul']);
2656 unset ($this->valF['shon_calcul']);
2657 unset ($this->valF['date_notification_delai']);
2658 unset ($this->valF['date_decision']);
2659 unset ($this->valF['date_limite']);
2660 unset ($this->valF['date_validite']);
2661 unset ($this->valF['date_chantier']);
2662 unset ($this->valF['date_achevement']);
2663 unset ($this->valF['date_conformite']);
2664 // Ce champ est mis à jour uniquement par la gestion spécifique du log
2665 // et donc jamais par les actions ajouter/modifier
2666 unset ($this->valF['log_instructions']);
2667 // Ce champ n'est jamais mis à jour, seulement initialisé à la création
2668 // du dossier d'instruction
2669 unset($this->valF['initial_dt']);
2670
2671 // Vérification de la saisie manuelle du numéro complet
2672 $force_param_duree_val = false;
2673 $num_doss_comp = isset($val['numero_dossier_complet']) === true ? $val['numero_dossier_complet'] : null;
2674 if ($num_doss_comp !== null) {
2675 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2676 if (empty($num_urba['di']) === false) {
2677 $force_param_duree_val = true;
2678 }
2679 }
2680 // Durée de validité lors de la création du dossier d'instruction
2681 $this->valF['duree_validite'] = $this->get_duree_validite($this->valF['dossier_autorisation'], $force_param_duree_val);
2682 }
2683
2684
2685 /**
2686 * Retourne le type de formulaire : ADS, CTX RE, CTX IN ou DPC.
2687 *
2688 * @return mixed $type_aff_form Type de formulaire (string) ou false (bool) si erreur BDD.
2689 */
2690 function get_type_affichage_formulaire() {
2691 if (isset($this->type_aff_form) === true) {
2692 return $this->type_aff_form;
2693 }
2694 //
2695 if($this->getParameter('maj') == '0' OR $this->get_action_crud() === 'create') {
2696 $id_dossier_instruction_type = $this->valF["dossier_instruction_type"];
2697 } else {
2698 $id_dossier_instruction_type = $this->getVal("dossier_instruction_type");
2699 }
2700 $sql = "SELECT dossier_autorisation_type.affichage_form
2701 FROM " . DB_PREFIXE . "dossier_instruction_type
2702 INNER JOIN " . DB_PREFIXE . "dossier_autorisation_type_detaille
2703 ON dossier_instruction_type.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2704 INNER JOIN " . DB_PREFIXE . "dossier_autorisation_type
2705 ON dossier_autorisation_type.dossier_autorisation_type=dossier_autorisation_type_detaille.dossier_autorisation_type
2706 WHERE dossier_instruction_type.dossier_instruction_type=" . intval($id_dossier_instruction_type);
2707 $type_aff_form = $this->f->db->getOne($sql);
2708 $this->f->addToLog(__METHOD__ . " : db->getOne(\"" . $sql . "\")", VERBOSE_MODE);
2709 if($this->f->isDatabaseError($type_aff_form, true) === true) {
2710 return false;
2711 }
2712 $this->type_aff_form = $type_aff_form;
2713 //
2714 return $this->type_aff_form;
2715 }
2716
2717
2718 /**
2719 * Retourne le code du groupe du dossier d'instruction.
2720 *
2721 * @return string
2722 */
2723 public function get_groupe() {
2724 //
2725 if (isset($this->groupe) === true && $this->groupe !== null) {
2726 return $this->groupe;
2727 }
2728
2729 // Récupère le code du groupe
2730 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
2731 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
2732 $inst_groupe = $this->get_inst_groupe($inst_dossier_autorisation_type->getVal('groupe'));
2733 $groupe = $inst_groupe->getVal('code');
2734
2735 //
2736 $this->groupe = $groupe;
2737 //
2738 return $this->groupe;
2739 }
2740
2741 /**
2742 * @return void
2743 */
2744 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
2745 parent::verifier($val);
2746 // La date de dépôt est obligatoire
2747 if (isset($val['date_depot']) && ($val['date_depot'] === '' || $val['date_depot'] === null)) {
2748 //
2749 $this->correct = false;
2750 $this->addToMessage( _('Le champ').' <span class="bold">'.$this->getLibFromField('date_depot').'</span> '._('est obligatoire'));
2751 } else {
2752 //
2753 $date_depot = $val["date_depot"];
2754 if (preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', $val["date_depot"], $d_match)) {
2755 $date_depot = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
2756 }
2757 // Il faut avoir une date de dépôt pour pouvoir vérifier si elle est supérieure à la date du jour
2758 $date_depot = DateTime::createFromFormat('Y-m-d', $date_depot);
2759 $aujourdhui = new DateTime();
2760 try {
2761 if (! $date_depot instanceof DateTime) {
2762 throw new RuntimeException("Not a DateTime");
2763 }
2764 // Si la date issus du formulaire n'a pas pu être converti, date_demande vaudra
2765 // false. Avant de comparer on vérifie donc que la date a bien été récupérée
2766 if($date_depot > $aujourdhui) {
2767 $this->correct = false;
2768 $this->addToMessage(_("La date de depot ne peut pas être superieure à la date du jour."));
2769 }
2770 } catch (RuntimeException $e) {
2771 $this->correct = false;
2772 $this->addToLog($e.' : '._("Le format de la date de depot n'est pas valide."));
2773 $this->addToMessage(_("Erreur : le format de la date de depot n'est pas correct. Contactez votre administrateur."));
2774 }
2775 }
2776
2777 $type_aff_form = $this->get_type_affichage_formulaire();
2778 if ($type_aff_form ===false) {
2779 $this->correct = false;
2780 $this->addToMessage(_("Une erreur s'est produite lors de l'ajout de ce dossier. Veuillez contacter votre administrateur."));
2781 }
2782
2783 switch ($type_aff_form) {
2784 case 'ADS':
2785 case 'CTX RE':
2786 case 'CONSULTATION ENTRANTE':
2787 if (!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
2788 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
2789 !is_null($this->form)) {
2790 $this->correct = false;
2791 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
2792 }
2793 break;
2794 case 'CTX IN':
2795 if (!isset($this->postedIdDemandeur["contrevenant_principal"]) OR
2796 empty($this->postedIdDemandeur["contrevenant_principal"]) AND
2797 !is_null($this->form)) {
2798 $this->correct = false;
2799 $this->addToMessage(_("La saisie d'un contrevenant principal est obligatoire."));
2800 }
2801 break;
2802 case 'DPC':
2803 if(!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
2804 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
2805 !is_null($this->form)) {
2806 $this->correct = false;
2807 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
2808 }
2809 if(!isset($this->postedIdDemandeur["bailleur_principal"]) OR
2810 empty($this->postedIdDemandeur["bailleur_principal"]) AND
2811 !is_null($this->form)) {
2812 $this->correct = false;
2813 $this->addToMessage(_("La saisie d'un bailleur principal est obligatoire."));
2814 }
2815 break;
2816 }
2817
2818 // Récupération du crud par rapport au mode du formulaire
2819 $crud = $this->get_action_crud($this->getParameter("maj"));
2820
2821 // L'année de la date de dépot ne peut pas être modifiée
2822 if ($crud === 'update' && array_key_exists("date_depot", $val) === true && ($val["date_depot"] !== "" && $val["date_depot"] !== null)) {
2823 //
2824 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
2825 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
2826 if ($new_date->format("Y") != $old_date->format("Y")) {
2827 $this->addToMessage(_("L'année de la date de dépôt n'est pas modifiable."));
2828 $this->correct = false;
2829 }
2830 }
2831
2832 // L'année de la date de dépot en mairie ne peut pas être modifiée
2833 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)) {
2834 //
2835 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot_mairie"]);
2836 // Dans le cas où une date de dépôt en mairie est saisie et que l'option pour afficher
2837 // ce champ est désactivée, le champ sera mis en hidden et donc le format de la date
2838 // dans la valeur ne sera plus "d/m/Y" mais "Y-m-d".
2839 $new_date = $new_date !== false ? $new_date : DateTime::createFromFormat('Y-m-d', $val["date_depot_mairie"]);
2840 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot_mairie"));
2841 if ($old_date !== false && $new_date->format("Y") != $old_date->format("Y")) {
2842 $this->addToMessage(_("L'année de la date de dépôt en mairie n'est pas modifiable."));
2843 $this->correct = false;
2844 }
2845 }
2846
2847 // option dossier_commune activée
2848 if ($this->f->is_option_dossier_commune_enabled()) {
2849
2850 // La commune doit être définie
2851 if ($crud !== 'delete') {
2852 if (! array_key_exists("commune", $val) || empty($val["commune"])) {
2853 $this->addToMessage(__("La commune doit être définie."));
2854 $this->correct = false;
2855 }
2856 else {
2857 // récupération de la date de demande
2858 $date_demande = 'NOW';
2859 $d_match = array();
2860 if (isset($val["date_demande"])
2861 && preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/',
2862 $val["date_demande"], $d_match)) {
2863 $date_demande = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
2864 }
2865 $date_demande = new DateTime($date_demande);
2866
2867 // La commune doit exister
2868 $commune = $this->f->findObjectById("commune", $val["commune"]);
2869 if (empty($commune)) {
2870 $this->addToMessage(__("La commune doit exister."));
2871 $this->correct = false;
2872 }
2873 // La commune ne peut pas être modifiée
2874 elseif ($crud === 'update') {
2875 if ($val["commune"] != $this->getVal('commune')) {
2876 $this->addToMessage(__("La commune n'est pas modifiable."));
2877 $this->correct = false;
2878 }
2879 }
2880 // La commune doit être valide
2881 elseif (! $commune->valid($date_demande)) {
2882 $this->addToMessage(__(
2883 "La commune doit être valide ".
2884 "à la date du '".$date_demande->format('d/m/Y')."'."));
2885 $this->correct = false;
2886 }
2887 }
2888 }
2889 }
2890 }
2891
2892
2893 /**
2894 * Permet de vérifier si les champs requis Plat'AU ont été remplis
2895 *
2896 * @param $dossier l'identifiant du dossier
2897 *
2898 * @return array un tableau contenant une clé is_ok qui indique
2899 * si tous les champs sont saisis ou non et une clé
2900 * required_fields_empty qui contient les champs qui n'ont pas été saisis
2901 * | false si une erreur survient
2902 *
2903 */
2904 function check_platau_required_fields($dossier) {
2905
2906 // On récupère les champs Plat'AU requis
2907 $fields_list = $this->list_platau_required_fields_dossier;
2908
2909 // On fait un tableau qui contiendra les tables et un tableau
2910 // qui contient les champs au format 'table.champ'
2911 $tables = array();
2912 $champs = array();
2913
2914 foreach ($fields_list as $value) {
2915 $expl_tab = explode('.', $value);
2916 if (! in_array($expl_tab[0], $tables)) {
2917 $tables[] = $expl_tab[0];
2918 }
2919 $champs[] = $value;
2920 }
2921
2922 // Il y aura toujours la table dossier dans la requête
2923 if (in_array('dossier', $tables)) {
2924 $key = array_keys($tables, 'dossier');
2925 unset($tables[$key[0]]);
2926 }
2927
2928 $from_tables = array();
2929 // On construit le 'FROM' de la requête sql avec les jointures
2930 foreach($tables as $table) {
2931 // Cas particulier pour la table demandeur et architecte
2932 if ($table == "demandeur") {
2933 $from_tables[] = sprintf(
2934 ' LEFT JOIN %1$slien_dossier_demandeur ON lien_dossier_demandeur.dossier = dossier.dossier LEFT JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur',
2935 DB_PREFIXE
2936 );
2937 } elseif ($table == "architecte") {
2938 $from_tables[] = sprintf(
2939 ' LEFT JOIN %sarchitecte ON architecte.architecte = donnees_techniques.architecte',
2940 DB_PREFIXE
2941 );
2942 } else {
2943 $from_tables[] = sprintf(" LEFT JOIN %s$table ON dossier.dossier = $table.%s ", DB_PREFIXE, $table == 'donnees_techniques' ? 'dossier_instruction' : 'dossier');
2944 }
2945 }
2946
2947 // Construction de la requête sql
2948 $sql = sprintf(
2949 '
2950 SELECT
2951 %s,
2952 CASE WHEN demandeur.qualite=\'particulier\'
2953 THEN
2954 TRIM(CONCAT_WS(\' \', demandeur.particulier_nom, demandeur.particulier_prenom))
2955 ELSE
2956 CASE WHEN demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL
2957 THEN
2958 TRIM(CONCAT_WS(\' \', demandeur.personne_morale_raison_sociale, demandeur.personne_morale_denomination, \'%s\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
2959 ELSE
2960 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination))
2961 END
2962 END as petitionnaire,
2963 demandeur.demandeur
2964 FROM
2965 %sdossier
2966 %s
2967 WHERE dossier.dossier = \'%s\'
2968 ',
2969 implode(', ', $champs),
2970 __("représenté(e) par"),
2971 DB_PREFIXE,
2972 implode(' ', $from_tables),
2973 $dossier
2974 );
2975
2976 // On récupère les champs
2977 $result_fields = $this->f->get_all_results_from_db_query(
2978 $sql,
2979 array(
2980 "origin" => __METHOD__,
2981 )
2982 );
2983
2984 // Si il y a une erreur
2985 if ($result_fields['code'] == 'KO'
2986 || $result_fields['result'] == ''
2987 || $result_fields['result'] == null) {
2988
2989 $this->addToLog(__METHOD__."() query : ".var_export($sql, true)." error: ".var_export($result_fields['message'], true), DEBUG_MODE);
2990 return false;
2991 }
2992
2993 // On récupère le résultat de la requête
2994 $required_fields = $result_fields['result'];
2995
2996 $required_fields_with_tab = array();
2997
2998 // Pour chaque champ on récupère la table
2999 $demandeur_num = 1;
3000 foreach ($required_fields as $required_field) {
3001 foreach ($champs as $champ) {
3002 if ($champ == "demandeur.localite") {
3003 $required_fields_with_tab[$champ.','.$required_field['petitionnaire'].' '.$required_field['demandeur']] = $required_field[explode('.', $champ)[1]];
3004 } else {
3005 $required_fields_with_tab[$champ] = $required_field[explode('.', $champ)[1]];
3006 }
3007 }
3008 }
3009
3010 // On vérifie si un architecte est lié
3011 $qres = $this->f->get_one_result_from_db_query(
3012 sprintf(
3013 'SELECT
3014 architecte.*
3015 FROM
3016 %1$sdossier
3017 LEFT JOIN %1$sdonnees_techniques
3018 ON dossier.dossier = donnees_techniques.dossier_instruction
3019 LEFT JOIN %1$sarchitecte
3020 ON donnees_techniques.architecte = architecte.architecte
3021 WHERE
3022 dossier.dossier = \'%2$s\'',
3023 DB_PREFIXE,
3024 $this->f->db->escapeSimple($dossier)
3025 ),
3026 array(
3027 "origin" => __METHOD__,
3028 )
3029 );
3030
3031 if ($qres["code"] !== "OK") {
3032 $this->addToLog(__METHOD__."() plop error: ".var_export($qres["message"], true), DEBUG_MODE);
3033 return false;
3034 }
3035
3036 // Si il n'est pas lié on enlève le champs architecte
3037 if ($qres["result"] == '' || $qres["result"] == null) {
3038 unset($required_fields_with_tab['architecte.ville']);
3039 }
3040
3041 $result_tab = array(
3042 'is_ok' => false,
3043 'required_fields_empty' => array()
3044 );
3045
3046 // Construction du message avec les tables et les champs
3047 foreach ($required_fields_with_tab as $required_field => $value) {
3048 if ($value == null || $value == '') {
3049 $required_fields_splited = explode('.', $required_field);
3050 if (isset(explode(',', $required_fields_splited[1])[1])) {
3051 $required_fields_splited = explode('.', $required_field);
3052 // On enlève l'identifiant du demandeur dans le message
3053 $required_fields_splited[1] = preg_replace('/[0-9]*$/', '', $required_fields_splited[1]);
3054 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3055 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3056 __(" le champ : "),
3057 __(explode(',', $required_fields_splited[1])[0]).' pour '.explode(',', $required_fields_splited[1])[1]
3058 );
3059 } else {
3060 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3061 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3062 __(" le champ : "),
3063 __($required_fields_splited[1])
3064 );
3065 }
3066 }
3067 }
3068
3069 if (empty($result_tab['required_fields_empty'])) {
3070 $result_tab['is_ok'] = true;
3071 }
3072
3073 return $result_tab;
3074
3075 }
3076
3077
3078 /**
3079 * Permet de mettre à jour le state d'une task selon certains paramètre
3080 * Si le paramètre $dossier_autorisation est spécifié cela signifie que
3081 * le dossier a été transmis et qu'on doit modifier les state seulement
3082 * des tache de modification du di et d da
3083 *
3084 * @param dossier l'identifiant du dossier
3085 * @param state_prev le state de la tâche
3086 * @param state_wanted le state que doit avoir la tâche
3087 * @param dossier_autorisation l'identifiant du dossier d'autorisation
3088 *
3089 * @return void
3090 *
3091 */
3092 function update_task_state($dossier, $state_prev, $state_wanted, $dossier_autorisation=null, $modif_task=false) {
3093
3094 $already_transmitted_updated = '';
3095 $type_task_to_update = '';
3096
3097 $already_transmitted_updated = sprintf('OR task.dossier=\'%s\'', $dossier_autorisation !== null ? $dossier_autorisation : $this->valF['dossier_autorisation']);
3098 // Si le dossier_autorisation est spécifié on construit le WHERE
3099 if ($modif_task === true) {
3100 $type_task_to_update = sprintf('AND (type=\'modification_DI\' OR type=\'modification_DA\')');
3101 }
3102
3103 $sql = sprintf(
3104 'SELECT task FROM %stask WHERE task.state = \'%s\' AND (task.dossier=\'%s\' %s) %s %s',
3105 DB_PREFIXE,
3106 $state_prev,
3107 $dossier,
3108 $already_transmitted_updated,
3109 $type_task_to_update,
3110 " AND type NOT IN ('notification_recepisse', 'notification_instruction', 'notification_decision') "
3111 );
3112 $tasks_id = $this->f->get_all_results_from_db_query(
3113 $sql,
3114 array(
3115 "origin" => __METHOD__,
3116 )
3117 );
3118 $params = array('val' => array('state' => $state_wanted));
3119 foreach ($tasks_id['result'] as $task_id) {
3120 $inst_task = $this->f->get_inst__om_dbform(array(
3121 "obj" => "task",
3122 "idx" => intval($task_id['task'])
3123 ));
3124 $inst_task->update_task($params);
3125 }
3126 }
3127
3128
3129 function setType(&$form,$maj) {
3130 // Par défaut le type des champs est géré nativement par le framework
3131 parent::setType($form,$maj);
3132
3133 // Récupération du contexte : groupe, CRUD et paramètres
3134 $groupe = $this->get_type_affichage_formulaire();
3135 $crud = $this->get_action_crud($maj);
3136 $parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
3137
3138 //
3139 // Gestion du groupe
3140 //
3141
3142 // CONSULTATION ENTRANTE
3143 $ce_fields = array(
3144 'autorisation_contestee' => 'hidden',
3145 'cle_acces_citoyen' => 'static',
3146 'contrevenants' => 'hidden',
3147 'date_ait' => 'hidden',
3148 'date_audience' => 'hidden',
3149 'date_affichage' => 'datestatic',
3150 'date_cloture_instruction' => 'hidden',
3151 'date_contradictoire' => 'hidden',
3152 'date_derniere_visite' => 'hidden',
3153 'date_premiere_visite' => 'hidden',
3154 'date_transmission_parquet' => 'hidden',
3155 'dossier_autorisation_type_detaille' => 'hidden',
3156 'dossier_instruction_type' => 'selecthiddenstatic',
3157 'dossier_petitionnaires' => 'hidden',
3158 'dt_ctx_infraction' => 'hidden',
3159 'dt_ctx_regularisable' => 'hidden',
3160 'dt_ctx_synthese_anr' => 'hidden',
3161 'dt_ctx_synthese_nti' => 'hidden',
3162 'ctx_reference_dsj' => 'hidden',
3163 'enjeu_ctx' => 'static',
3164 'instructeur_2' => 'hidden',
3165 'requerants' => 'hidden',
3166 'bailleur' => 'hidden',
3167 'ctx_reference_sagace' => 'hidden',
3168 'pec_metier' => 'selecthiddenstatic',
3169 "consultation_entrante" => 'hidden',
3170 "delai_reponse" => 'hidden',
3171 "type_delai" => 'hidden',
3172 "objet_consultation" => 'hidden',
3173 "date_production_notification" => 'hidden',
3174 "date_premiere_consultation" => 'hidden',
3175 "date_consultation" => 'hidden',
3176 "date_emission" => 'hidden',
3177 "service_consultant_id" => 'hidden',
3178 "service_consultant_libelle" => 'hidden',
3179 "service_consultant_insee" => 'hidden',
3180 "service_consultant_mail" => 'hidden',
3181 "service_consultant_type" => 'hidden',
3182 "service_consultant__siren" => 'hidden',
3183 "etat_consultation" => 'hidden',
3184 "type_consultation" => 'hidden',
3185 "texte_fondement_reglementaire" => 'hidden',
3186 "texte_objet_consultation" => 'hidden',
3187 "dossier_consultation" => 'hidden',
3188 );
3189 // INFRACTION
3190 $inf_fields = array(
3191 'a_qualifier' => 'hidden',
3192 'autorisation_contestee' => 'hidden',
3193 'autorite_competente' => 'hidden',
3194 'cle_acces_citoyen' => 'hidden',
3195 'contrevenants' => 'static',
3196 'date_ait' => 'hiddenstaticdate',
3197 'date_audience' => 'hiddenstaticdate',
3198 'date_cloture_instruction' => 'hidden',
3199 'date_complet' => 'hidden',
3200 'date_contradictoire' => 'hiddenstaticdate',
3201 'date_decision' => 'hiddenstaticdate',
3202 'date_depot' => 'hiddenstaticdate',
3203 'date_depot_mairie' => 'hiddenstaticdate',
3204 'date_dernier_depot' => 'hidden',
3205 'date_derniere_visite' => 'hiddenstaticdate',
3206 'date_limite' => 'hidden',
3207 'date_limite_incompletude' => 'hidden',
3208 'date_premiere_visite' => 'hiddenstaticdate',
3209 'date_transmission_parquet' => 'hiddenstaticdate',
3210 'date_validite' => 'hidden',
3211 'delai' => 'hidden',
3212 'description_projet' => 'hidden',
3213 'dossier_autorisation_type_detaille' => 'hidden',
3214 'dossier_instruction_type' => 'hidden',
3215 'dossier_petitionnaire' => 'hidden',
3216 'dossier_petitionnaires' => 'hidden',
3217 'dt_ctx_infraction' => 'checkboxhiddenstatic',
3218 'dt_ctx_regularisable' => 'checkboxhiddenstatic',
3219 'dt_ctx_synthese_anr' => 'static',
3220 'dt_ctx_synthese_nti' => 'static',
3221 'ctx_reference_dsj' => 'static',
3222 'enjeu_ctx' => 'hidden',
3223 'enjeu_erp' => 'hidden',
3224 'enjeu_urba' => 'hidden',
3225 'erp' => 'hidden',
3226 'evenement_suivant_tacite' => 'hidden',
3227 'evenement_suivant_tacite_incompletude' => 'hidden',
3228 'numero_versement_archive' => 'hidden',
3229 'requerants' => 'hidden',
3230 'tax_mtn_part_commu' => 'hidden',
3231 'tax_mtn_part_depart' => 'hidden',
3232 'tax_mtn_part_reg' => 'hidden',
3233 'tax_mtn_total' => 'hidden',
3234 'tax_mtn_rap' => 'hidden',
3235 'tax_secteur' => 'hidden',
3236 'tax_mtn_part_commu_sans_exo' => 'hidden',
3237 'tax_mtn_part_depart_sans_exo' => 'hidden',
3238 'tax_mtn_part_reg_sans_exo' => 'hidden',
3239 'tax_mtn_total_sans_exo' => 'hidden',
3240 'tax_mtn_rap_sans_exo' => 'hidden',
3241 'bailleur' => 'hidden',
3242 'ctx_reference_sagace' => 'static',
3243 'pec_metier' => 'hidden',
3244 "consultation_entrante" => 'hidden',
3245 "delai_reponse" => 'hidden',
3246 "type_delai" => 'hidden',
3247 "objet_consultation" => 'hidden',
3248 "date_production_notification" => 'hidden',
3249 "date_premiere_consultation" => 'hidden',
3250 "date_consultation" => 'hidden',
3251 "date_emission" => 'hidden',
3252 "service_consultant_id" => 'hidden',
3253 "service_consultant_libelle" => 'hidden',
3254 "service_consultant_insee" => 'hidden',
3255 "service_consultant_mail" => 'hidden',
3256 "service_consultant_type" => 'hidden',
3257 "service_consultant__siren" => 'hidden',
3258 "etat_consultation" => 'hidden',
3259 "type_consultation" => 'hidden',
3260 "texte_fondement_reglementaire" => 'hidden',
3261 "texte_objet_consultation" => 'hidden',
3262 "dossier_consultation" => 'hidden',
3263 );
3264 // RECOURS
3265 $re_fields = array(
3266 'a_qualifier' => 'hidden',
3267 'autorite_competente' => 'hidden',
3268 'cle_acces_citoyen' => 'hidden',
3269 'contrevenants' => 'hidden',
3270 'date_ait' => 'hidden',
3271 'date_audience' => 'hidden',
3272 'date_cloture_instruction' => 'hiddenstaticdate',
3273 'date_complet' => 'hidden',
3274 'date_contradictoire' => 'hidden',
3275 'date_decision' => 'hiddenstaticdate',
3276 'date_depot' => 'hiddenstaticdate',
3277 'date_depot_mairie' => 'hiddenstaticdate',
3278 'date_dernier_depot' => 'hidden',
3279 'date_derniere_visite' => 'hidden',
3280 'date_limite' => 'hiddenstaticdate',
3281 'date_limite_incompletude' => 'hidden',
3282 'date_premiere_visite' => 'hidden',
3283 'date_transmission_parquet' => 'hidden',
3284 'date_validite' => 'hidden',
3285 'delai' => 'hidden',
3286 'description_projet' => 'hidden',
3287 'dossier_autorisation_type_detaille' => 'static',
3288 'dossier_instruction_type' => 'hidden',
3289 'dossier_petitionnaire' => 'hidden',
3290 'dossier_petitionnaires' => 'static',
3291 'dt_ctx_infraction' => 'hidden',
3292 'dt_ctx_regularisable' => 'hidden',
3293 'dt_ctx_synthese_anr' => 'hidden',
3294 'dt_ctx_synthese_nti' => 'hidden',
3295 'enjeu_ctx' => 'hidden',
3296 'enjeu_erp' => 'hidden',
3297 'enjeu_urba' => 'hidden',
3298 'erp' => 'hidden',
3299 'evenement_suivant_tacite' =>'selecthiddenstatic',
3300 'evenement_suivant_tacite_incompletude' => 'hidden',
3301 'instructeur_2' => 'hidden',
3302 'numero_versement_archive' => 'hidden',
3303 'requerants' => 'static',
3304 'tax_mtn_part_commu' => 'hidden',
3305 'tax_mtn_part_depart' => 'hidden',
3306 'tax_mtn_part_reg' => 'hidden',
3307 'tax_mtn_total' => 'hidden',
3308 'tax_mtn_rap' => 'hidden',
3309 'tax_secteur' => 'hidden',
3310 'tax_mtn_part_commu_sans_exo' => 'hidden',
3311 'tax_mtn_part_depart_sans_exo' => 'hidden',
3312 'tax_mtn_part_reg_sans_exo' => 'hidden',
3313 'tax_mtn_total_sans_exo' => 'hidden',
3314 'tax_mtn_rap_sans_exo' => 'hidden',
3315 'bailleur' => 'hidden',
3316 'ctx_reference_dsj' => 'static',
3317 'ctx_reference_sagace' => 'static',
3318 'pec_metier' => 'hidden',
3319 "consultation_entrante" => 'hidden',
3320 "delai_reponse" => 'hidden',
3321 "type_delai" => 'hidden',
3322 "objet_consultation" => 'hidden',
3323 "date_production_notification" => 'hidden',
3324 "date_premiere_consultation" => 'hidden',
3325 "date_consultation" => 'hidden',
3326 "date_emission" => 'hidden',
3327 "service_consultant_id" => 'hidden',
3328 "service_consultant_libelle" => 'hidden',
3329 "service_consultant_insee" => 'hidden',
3330 "service_consultant_mail" => 'hidden',
3331 "service_consultant_type" => 'hidden',
3332 "service_consultant__siren" => 'hidden',
3333 "etat_consultation" => 'hidden',
3334 "type_consultation" => 'hidden',
3335 "texte_fondement_reglementaire" => 'hidden',
3336 "texte_objet_consultation" => 'hidden',
3337 "dossier_consultation" => 'hidden',
3338 );
3339 // ADS
3340 $ads_fields = array(
3341 'autorisation_contestee' => 'hidden',
3342 'cle_acces_citoyen' => 'static',
3343 'contrevenants' => 'hidden',
3344 'date_ait' => 'hidden',
3345 'date_audience' => 'hidden',
3346 'date_affichage' => 'datestatic',
3347 'date_cloture_instruction' => 'hidden',
3348 'date_contradictoire' => 'hidden',
3349 'date_derniere_visite' => 'hidden',
3350 'date_premiere_visite' => 'hidden',
3351 'date_transmission_parquet' => 'hidden',
3352 'dossier_autorisation_type_detaille' => 'hidden',
3353 'dossier_instruction_type' => 'selecthiddenstatic',
3354 'dossier_petitionnaires' => 'hidden',
3355 'dt_ctx_infraction' => 'hidden',
3356 'dt_ctx_regularisable' => 'hidden',
3357 'dt_ctx_synthese_anr' => 'hidden',
3358 'dt_ctx_synthese_nti' => 'hidden',
3359 'ctx_reference_dsj' => 'hidden',
3360 'enjeu_ctx' => 'static',
3361 'instructeur_2' => 'selecthiddenstatic',
3362 'requerants' => 'hidden',
3363 'bailleur' => 'hidden',
3364 'ctx_reference_sagace' => 'hidden',
3365 'pec_metier' => 'selectstatic',
3366 "consultation_entrante" => 'hidden',
3367 "delai_reponse" => 'hidden',
3368 "type_delai" => 'hidden',
3369 "objet_consultation" => 'hidden',
3370 "date_production_notification" => 'hidden',
3371 "date_premiere_consultation" => 'hidden',
3372 "date_consultation" => 'hidden',
3373 "date_emission" => 'hidden',
3374 "service_consultant_id" => 'hidden',
3375 "service_consultant_libelle" => 'hidden',
3376 "service_consultant_insee" => 'hidden',
3377 "service_consultant_mail" => 'hidden',
3378 "service_consultant_type" => 'hidden',
3379 "service_consultant__siren" => 'hidden',
3380 "etat_consultation" => 'hidden',
3381 "type_consultation" => 'hidden',
3382 "texte_fondement_reglementaire" => 'hidden',
3383 "texte_objet_consultation" => 'hidden',
3384 "dossier_consultation" => 'hidden',
3385 );
3386 // DPC
3387 $dpc_fields = array(
3388 'autorisation_contestee' => 'hidden',
3389 'cle_acces_citoyen' => 'static',
3390 'contrevenants' => 'hidden',
3391 'date_ait' => 'hidden',
3392 'date_audience' => 'hidden',
3393 'date_cloture_instruction' => 'hidden',
3394 'date_contradictoire' => 'hidden',
3395 'date_derniere_visite' => 'hidden',
3396 'date_premiere_visite' => 'hidden',
3397 'date_transmission_parquet' => 'hidden',
3398 'dossier_autorisation_type_detaille' => 'hidden',
3399 'dossier_instruction_type' => 'selecthiddenstatic',
3400 'dossier_petitionnaires' => 'hidden',
3401 'dt_ctx_infraction' => 'hidden',
3402 'dt_ctx_regularisable' => 'hidden',
3403 'dt_ctx_synthese_anr' => 'hidden',
3404 'dt_ctx_synthese_nti' => 'hidden',
3405 'ctx_reference_dsj' => 'hidden',
3406 'enjeu_ctx' => 'static',
3407 'instructeur_2' => 'selecthiddenstatic',
3408 'requerants' => 'hidden',
3409 'bailleur' => 'static',
3410 'ctx_reference_sagace' => 'hidden',
3411 'pec_metier' => 'hidden',
3412 "consultation_entrante" => 'hidden',
3413 "delai_reponse" => 'hidden',
3414 "type_delai" => 'hidden',
3415 "objet_consultation" => 'hidden',
3416 "date_production_notification" => 'hidden',
3417 "date_premiere_consultation" => 'hidden',
3418 "date_consultation" => 'hidden',
3419 "date_emission" => 'hidden',
3420 "service_consultant_id" => 'hidden',
3421 "service_consultant_libelle" => 'hidden',
3422 "service_consultant_insee" => 'hidden',
3423 "service_consultant_mail" => 'hidden',
3424 "service_consultant_type" => 'hidden',
3425 "service_consultant__siren" => 'hidden',
3426 "etat_consultation" => 'hidden',
3427 "type_consultation" => 'hidden',
3428 "texte_fondement_reglementaire" => 'hidden',
3429 "texte_objet_consultation" => 'hidden',
3430 "dossier_consultation" => 'hidden',
3431 );
3432 // COMMUN
3433 $all_fields = array(
3434 'accord_tacite' => 'hidden',
3435 'annee' => 'hidden',
3436 'autres_demandeurs' => 'hidden',
3437 'date_achevement' => 'hidden',
3438 'date_chantier' => 'hidden',
3439 'date_conformite' => 'hidden',
3440 'date_notification_delai' => 'hidden',
3441 'date_rejet' => 'hidden',
3442 'date_retour_contradictoire' => 'hidden',
3443 'delai_incompletude' => 'hidden',
3444 'description' => 'hidden',
3445 'dossier' => 'hidden',
3446 'dossier_arrondissement' => 'hidden',
3447 'dossier_autorisation' => 'hidden',
3448 'dossier_autorisation_libelle' => 'hidden',
3449 'duree_validite' => 'hidden',
3450 'etat_pendant_incompletude' => 'hidden',
3451 'geom' => 'hiddenstatic',
3452 'geom1' => 'hidden',
3453 'incomplet_notifie' => 'hidden',
3454 'incompletude' => 'hidden',
3455 'interface_referentiel_erp' => 'hidden',
3456 'log_instructions' => 'nodisplay',
3457 'om_collectivite' => 'hidden',
3458 'quartier' => 'hidden',
3459 'version' => 'hidden',
3460 'date_modification' => 'hidden',
3461 'hash_sitadel' => 'hidden',
3462 'depot_electronique' => 'hidden',
3463 'version_clos' => 'hidden',
3464 'initial_dt' => 'hidden',
3465 'adresse_normalisee' => 'hidden',
3466 'adresse_normalisee_json' => 'hidden',
3467 'streetview' => 'hidden',
3468 'numerotation_type' => 'hidden',
3469 'numerotation_dep' => 'hidden',
3470 'numerotation_com' => 'hidden',
3471 'numerotation_division' => 'hidden',
3472 'numerotation_suffixe' => 'hidden',
3473 'numerotation_entite' => 'hidden',
3474 'numerotation_num' => 'hidden',
3475 'numerotation_num_suffixe' => 'hidden',
3476 'numerotation_num_entite' => 'hidden',
3477 'lien_iiue' => 'hidden',
3478 'dossier_parent' => 'hidden'
3479 );
3480 if (isset($parameters['option_afficher_division'])
3481 && $parameters['option_afficher_division'] !== 'true') {
3482 $all_fields['division'] = 'hidden';
3483 }
3484 if (isset($parameters['option_sig'])
3485 && $parameters['option_sig'] !== 'sig_interne'
3486 && $parameters['option_sig'] !== 'sig_externe'){
3487 $all_fields['geom'] = 'hidden';
3488 }
3489
3490 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3491 $all_fields['date_depot_mairie'] = 'hiddenstaticdate';
3492 } else {
3493 $all_fields['date_depot_mairie'] = 'hidden';
3494 }
3495
3496 // Affichage des identifiants techniques Plat'AU
3497 if ($crud === 'read'
3498 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
3499 && $this->f->is_option_mode_service_consulte_enabled() !== true
3500 || ($this->f->is_option_mode_service_consulte_enabled() === true
3501 && ($this->get_source_depot_from_demande() === PLATAU
3502 || $this->get_source_depot_from_demande() === PORTAL))) {
3503 //
3504 $all_fields['lien_iiue'] = 'jsontotab';
3505 }
3506
3507 //
3508 // Gestion du contexte
3509 //
3510
3511 // AJOUTER, MODIFIER
3512 if ($crud === 'create' OR $crud === 'update') {
3513
3514 $all_fields['avis_decision'] = 'selecthiddenstatic';
3515 $all_fields['etat'] = 'hiddenstatic';
3516 $all_fields['terrain'] = 'hiddenstatic';
3517 //
3518 $ads_fields['a_qualifier'] = 'checkbox';
3519 $ads_fields['accord_tacite'] = 'hiddenstatic';
3520 $ads_fields['autorite_competente'] = 'selecthiddenstatic';
3521 $ads_fields['date_achevement'] = 'hiddenstaticdate';
3522 $ads_fields['date_chantier'] = 'hiddenstaticdate';
3523 $ads_fields['date_conformite'] = 'hiddenstaticdate';
3524 $ads_fields['date_decision'] = 'hiddenstaticdate';
3525 $ads_fields['date_affichage'] = 'hiddenstaticdate';
3526 $ads_fields['date_depot'] = 'hiddenstaticdate';
3527 //
3528 $ce_fields['a_qualifier'] = 'checkbox';
3529 $ce_fields['accord_tacite'] = 'hiddenstatic';
3530 $ce_fields['autorite_competente'] = 'selecthiddenstatic';
3531 $ce_fields['date_achevement'] = 'hiddenstaticdate';
3532 $ce_fields['date_chantier'] = 'hiddenstaticdate';
3533 $ce_fields['date_conformite'] = 'hiddenstaticdate';
3534 $ce_fields['date_decision'] = 'hiddenstaticdate';
3535 $ce_fields['date_affichage'] = 'hiddenstaticdate';
3536 $ce_fields['date_depot'] = 'hiddenstaticdate';
3537 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3538 $ads_fields['date_depot_mairie'] = 'date';
3539 $ce_fields['date_depot_mairie'] = 'date';
3540 } else {
3541 $ads_fields['date_depot_mairie'] = 'hidden';
3542 $ce_fields['date_depot_mairie'] = 'hidden';
3543 }
3544 $ads_fields['date_dernier_depot'] = 'hiddenstaticdate';
3545 $ads_fields['date_notification_delai'] = 'hiddenstaticdate';
3546 $ads_fields['date_rejet'] = 'hiddenstaticdate';
3547 $ads_fields['date_validite'] = 'hiddenstaticdate';
3548 $ads_fields['delai'] = 'hiddenstatic';
3549 $ads_fields['description_projet'] = 'hiddenstatic';
3550 $ads_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3551 $ads_fields['shon_calcul'] = 'hiddenstatic';
3552 $ads_fields['tax_mtn_part_commu'] = 'hidden';
3553 $ads_fields['tax_mtn_part_depart'] = 'hidden';
3554 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3555 $ads_fields['tax_mtn_total'] = 'hidden';
3556 $ads_fields['tax_mtn_rap'] = 'hidden';
3557 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3558 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3559 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3560 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3561 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3562 $ads_fields['terrain_surface_calcul'] = 'hiddenstatic';
3563 //
3564 $ce_fields['date_dernier_depot'] = 'hiddenstaticdate';
3565 $ce_fields['date_notification_delai'] = 'hiddenstaticdate';
3566 $ce_fields['date_rejet'] = 'hiddenstaticdate';
3567 $ce_fields['date_validite'] = 'hiddenstaticdate';
3568 $ce_fields['delai'] = 'hiddenstatic';
3569 $ce_fields['description_projet'] = 'hiddenstatic';
3570 $ce_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3571 $ce_fields['shon_calcul'] = 'hiddenstatic';
3572 $ce_fields['tax_mtn_part_commu'] = 'hidden';
3573 $ce_fields['tax_mtn_part_depart'] = 'hidden';
3574 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3575 $ce_fields['tax_mtn_total'] = 'hidden';
3576 $ce_fields['tax_mtn_rap'] = 'hidden';
3577 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3578 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3579 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3580 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3581 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3582 $ce_fields['terrain_surface_calcul'] = 'hiddenstatic';
3583 //
3584 $dpc_fields['a_qualifier'] = 'checkbox';
3585 $dpc_fields['accord_tacite'] = 'hiddenstatic';
3586 $dpc_fields['autorite_competente'] = 'selecthiddenstatic';
3587 $dpc_fields['date_achevement'] = 'hiddenstaticdate';
3588 $dpc_fields['date_chantier'] = 'hiddenstaticdate';
3589 $dpc_fields['date_conformite'] = 'hiddenstaticdate';
3590 $dpc_fields['date_decision'] = 'hiddenstaticdate';
3591 $dpc_fields['date_depot'] = 'hiddenstaticdate';
3592 $dpc_fields['date_depot_mairie'] = 'hiddenstaticdate';
3593 $dpc_fields['date_dernier_depot'] = 'hiddenstaticdate';
3594 $dpc_fields['date_notification_delai'] = 'hiddenstaticdate';
3595 $dpc_fields['date_rejet'] = 'hiddenstaticdate';
3596 $dpc_fields['date_validite'] = 'hiddenstaticdate';
3597 $dpc_fields['delai'] = 'hiddenstatic';
3598 $dpc_fields['description_projet'] = 'hiddenstatic';
3599 $dpc_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3600 $dpc_fields['shon_calcul'] = 'hiddenstatic';
3601 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3602 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3603 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3604 $dpc_fields['tax_mtn_total'] = 'hidden';
3605 $dpc_fields['tax_mtn_rap'] = 'hidden';
3606 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3607 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3608 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3609 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3610 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3611 $dpc_fields['terrain_surface_calcul'] = 'hiddenstatic';
3612 //
3613 $re_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3614 $re_fields['dossier_petitionnaires'] = 'static';
3615 $re_fields['requerants'] = 'hiddenstatic';
3616 $inf_fields['contrevenants'] = 'hiddenstatic';
3617 $inf_fields['dt_ctx_synthese_anr'] = 'hiddenstatic';
3618 $inf_fields['dt_ctx_synthese_nti'] = 'hiddenstatic';
3619 //
3620 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3621 if ($this->get_source_depot_from_demande() === PLATAU
3622 || $this->get_source_depot_from_demande() === PORTAL) {
3623 //
3624 $ce_fields["consultation_entrante"] = 'hidden';
3625 $ce_fields["delai_reponse"] = 'static';
3626 $ce_fields["type_delai"] = 'static';
3627 $ce_fields["objet_consultation"] = 'static';
3628 $ce_fields["date_production_notification"] = 'datestatic';
3629 $ce_fields["date_premiere_consultation"] = 'datestatic';
3630 $ce_fields["date_consultation"] = 'datestatic';
3631 $ce_fields["date_emission"] = 'datestatic';
3632 $ce_fields["service_consultant_id"] = 'static';
3633 $ce_fields["service_consultant_libelle"] = 'static';
3634 $ce_fields["service_consultant_insee"] = 'static';
3635 $ce_fields["service_consultant_mail"] = 'static';
3636 $ce_fields["service_consultant_type"] = 'static';
3637 $ce_fields["service_consultant__siren"] = 'static';
3638 $ce_fields["etat_consultation"] = 'static';
3639 $ce_fields["type_consultation"] = 'static';
3640 $ce_fields["texte_fondement_reglementaire"] = 'static';
3641 $ce_fields["texte_objet_consultation"] = 'static';
3642 $ce_fields["dossier_consultation"] = 'hidden';
3643 }
3644 // Si l'état du dossier est incomplet
3645 if ($this->is_incomplet_notifie()) {
3646 // On cache les dates de complétude et de limite d'instruction
3647 $ads_fields['date_complet'] = 'hidden';
3648 $ads_fields['date_limite'] = 'hidden';
3649 $ads_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3650 $ads_fields['evenement_suivant_tacite'] ='hidden';
3651 $ads_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3652 //
3653 $dpc_fields['date_complet'] = 'hidden';
3654 $dpc_fields['date_limite'] = 'hidden';
3655 $dpc_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3656 $dpc_fields['evenement_suivant_tacite'] ='hidden';
3657 $dpc_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3658 //
3659 $ce_fields['date_complet'] = 'hidden';
3660 $ce_fields['date_limite'] = 'hidden';
3661 $ce_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3662 $ce_fields['evenement_suivant_tacite'] ='hidden';
3663 $ce_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3664 } else {
3665 // Sinon on cache la date de limite d'incomplétude
3666 $ads_fields['date_limite_incompletude'] = 'hidden';
3667 $ads_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3668 $ads_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3669 $ads_fields['date_complet'] = 'hiddenstaticdate';
3670 $ads_fields['date_limite'] = 'hiddenstaticdate';
3671 //
3672 $dpc_fields['date_limite_incompletude'] = 'hidden';
3673 $dpc_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3674 $dpc_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3675 $dpc_fields['date_complet'] = 'hiddenstaticdate';
3676 $dpc_fields['date_limite'] = 'hiddenstaticdate';
3677 //
3678 $ce_fields['date_limite_incompletude'] = 'hidden';
3679 $ce_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3680 $ce_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3681 $ce_fields['date_complet'] = 'hiddenstaticdate';
3682 $ce_fields['date_limite'] = 'hiddenstaticdate';
3683 }
3684
3685 // MODIFIER
3686 if ($crud ==='update') {
3687 $all_fields['dossier_libelle'] = 'hiddenstatic';
3688 $ads_fields['dossier_petitionnaire'] = 'static';
3689 $dpc_fields['dossier_petitionnaire'] = 'static';
3690 $ce_fields['dossier_petitionnaire'] = 'static';
3691
3692 if ($this->f->isAccredited("gestion_numero_versement_archive")) {
3693 $inf_fields['numero_versement_archive'] = 'text';
3694 }
3695
3696 //
3697 if ($this->f->isAccredited("dossier_modifier_instructeur")) {
3698 $all_fields['instructeur'] = 'select';
3699 $inf_fields['instructeur_2'] = 'select';
3700 $ads_fields['instructeur_2'] = 'select';
3701 $dpc_fields['instructeur_2'] = 'select';
3702 } else {
3703 $all_fields['instructeur'] = 'selecthiddenstatic';
3704 $inf_fields['instructeur_2'] = 'selecthiddenstatic';
3705 $ads_fields['instructeur_2'] = 'selecthiddenstatic';
3706 $dpc_fields['instructeur_2'] = 'selecthiddenstatic';
3707 }
3708 //
3709 if (isset($parameters['option_afficher_division'])
3710 && $parameters['option_afficher_division'] === 'true') {
3711 $all_fields['division'] = 'selecthiddenstatic';
3712 if ($this->f->isAccredited("dossier_modifier_division")) {
3713 $all_fields['division'] = 'select';
3714 }
3715 }
3716 // Si l'utilisateur ne peut pas qualifier un DI (guichet unique & guichet et suivi)
3717 if (!$this->f->isAccredited(array("dossier_instruction","dossier_instruction_qualifier"), "OR")) {
3718 // Il ne peut pas modifier les champs suivants
3719 $ads_fields['numero_versement_archive'] = 'hiddenstatic';
3720 $ads_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3721 $ads_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3722 $ads_fields['erp'] = 'checkboxhiddenstatic';
3723 $ads_fields['a_qualifier'] = 'checkboxhiddenstatic';
3724 //
3725 $dpc_fields['numero_versement_archive'] = 'hiddenstatic';
3726 $dpc_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3727 $dpc_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3728 $dpc_fields['erp'] = 'checkboxhiddenstatic';
3729 $dpc_fields['a_qualifier'] = 'checkboxhiddenstatic';
3730 //
3731 $ce_fields['numero_versement_archive'] = 'hiddenstatic';
3732 $ce_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3733 $ce_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3734 $ce_fields['erp'] = 'checkboxhiddenstatic';
3735 $ce_fields['a_qualifier'] = 'checkboxhiddenstatic';
3736 }
3737 // Le profil Qualificateur peut modifier seulement les champs
3738 // autorite_competente, a_qualifier et erp
3739 if ($this->f->isUserQualificateur()) {
3740 $ads_fields['numero_versement_archive'] = 'static';
3741 $ads_fields['enjeu_urba'] = 'checkboxstatic';
3742 $ads_fields['enjeu_erp'] = 'checkboxstatic';
3743 //
3744 $dpc_fields['numero_versement_archive'] = 'static';
3745 $dpc_fields['enjeu_urba'] = 'checkboxstatic';
3746 $dpc_fields['enjeu_erp'] = 'checkboxstatic';
3747 //
3748 $ce_fields['numero_versement_archive'] = 'static';
3749 $ce_fields['enjeu_urba'] = 'checkboxstatic';
3750 $ce_fields['enjeu_erp'] = 'checkboxstatic';
3751 }
3752 // Le dossier ne doit pas être instruit
3753 if ($this->has_only_recepisse() === true
3754 && $this->getStatut() !== 'cloture') {
3755 //
3756 $all_fields['date_depot'] = 'date';
3757 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3758 $all_fields['date_depot_mairie'] = 'date';
3759 } else {
3760 $all_fields['date_depot_mairie'] = 'hidden';
3761 }
3762 }
3763 // Gestion de la case à cocher ERP en cas d'interfaçage avec le
3764 // référentiel ERP
3765 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true) {
3766 // Par défaut la case à cocher ERP est non modifiable
3767 $all_fields['erp'] = 'checkboxhiddenstatic';
3768 // Si le type du dossier d'instruction en cours est présent
3769 // dans les paramètres autorisant l'interfaçage avec le référentiel ERP
3770 if (isset($parameters['erp__dossier__nature__at']) === true
3771 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__at']) {
3772 //
3773 $all_fields['erp'] = 'checkbox';
3774 }
3775 if (isset($parameters['erp__dossier__nature__pc']) === true
3776 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__pc']
3777 && isset($parameters['erp__dossier__type_di__pc']) === true) {
3778 //
3779 $erp_di_pc = explode(";", $parameters['erp__dossier__type_di__pc']);
3780 if (is_array($erp_di_pc) === true
3781 && in_array($this->getVal("dossier_instruction_type"), $erp_di_pc) === true) {
3782 //
3783 $all_fields['erp'] = 'checkbox';
3784 }
3785 }
3786 }
3787 // modification de la date d'affichage pour les ADS
3788 if ($this->f->isAccredited($this->get_absolute_class_name()."_modifier_date_affichage")) {
3789 $ads_fields['date_affichage'] = 'date';
3790 $ce_fields['date_affichage'] = 'date';
3791 }
3792
3793 // pas de modificiation de la commune associée au dossier (si l'option est activée)
3794 if ($this->f->is_option_dossier_commune_enabled($this->getVal('om_collectivite'))) {
3795 $ads_fields['commune'] = 'selecthiddenstatic';
3796 $ce_fields['commune'] = 'selecthiddenstatic';
3797 }
3798 }
3799 }
3800 // MODIFIER, SUPPRIMER, CONSULTER
3801 if ($crud !== 'create') {
3802 $re_fields['autorisation_contestee'] = 'selecthiddenstatic';
3803 $all_fields['date_demande'] = 'hidden';
3804 // La collectivité n'est jamais modifiable
3805 if ($_SESSION['niveau'] == 2) {
3806 $all_fields['om_collectivite'] = 'selecthiddenstatic';
3807 }
3808 // Instance du paramétrage des taxes
3809 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
3810 // Instance de cerfa
3811 $inst_cerfa = $this->get_inst_cerfa();
3812
3813 // Gestion du secteur pour la taxe d'aménagement
3814 // MODIFIER
3815 if ($crud === 'update') {
3816 //
3817 if ($this->is_in_context_of_foreign_key("tax_secteur", $this->getParameter("retourformulaire"))) {
3818 $ads_fields['tax_secteur'] = 'selecthiddenstatic';
3819 $dpc_fields['tax_secteur'] = 'selecthiddenstatic';
3820 $ce_fields['tax_secteur'] = 'selecthiddenstatic';
3821 } else {
3822 $ads_fields['tax_secteur'] = 'select';
3823 $dpc_fields['tax_secteur'] = 'select';
3824 $ce_fields['tax_secteur'] = 'select';
3825 }
3826 }
3827 // SUPPRIMER
3828 if ($crud === 'delete') {
3829 //
3830 $ads_fields['tax_secteur'] = 'selectstatic';
3831 $dpc_fields['tax_secteur'] = 'selectstatic';
3832 $ce_fields['tax_secteur'] = 'selectstatic';
3833 }
3834 // CONSULTER
3835 if ($crud === 'read') {
3836 //
3837 $ads_fields['tax_secteur'] = 'selectstatic';
3838 $dpc_fields['tax_secteur'] = 'selectstatic';
3839 $ce_fields['tax_secteur'] = 'selectstatic';
3840
3841 if ($this->f->isAccredited("gestion_numero_versement_archive")) {
3842 $inf_fields['numero_versement_archive'] = 'hiddenstatic';
3843 }
3844 }
3845
3846 // Si l'option de simulation est activée pour la collectivité du
3847 // dossier, l'utilisateur connecté a la permissions de voir
3848 // la simulation des taxes, la collectivité à un paramétrage pour
3849 // les taxes et que le cerfa du dossier à les champs requis
3850 if ($this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true
3851 && $this->f->isAccredited("dossier_instruction_simulation_taxes") === true
3852 && $inst_taxe_amenagement !== null
3853 && $inst_cerfa->can_simulate_taxe_amenagement() === true) {
3854
3855 // Si ce n'est pas une commune d'Île-de-France
3856 if ($inst_taxe_amenagement->getVal('en_ile_de_france') == 'f') {
3857 //
3858 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3859 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3860 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3861 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3862 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3863 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3864 }
3865 } else {
3866 // SUPPRIMER, CONSULTER
3867 if ($crud === 'delete' OR $crud ==='read') {
3868 $ads_fields['tax_mtn_part_commu'] = 'hidden';
3869 $ads_fields['tax_mtn_part_depart'] = 'hidden';
3870 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3871 $ads_fields['tax_mtn_total'] = 'hidden';
3872 $ads_fields['tax_mtn_rap'] = 'hidden';
3873 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3874 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3875 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3876 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3877 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3878 //
3879 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3880 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3881 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3882 $dpc_fields['tax_mtn_total'] = 'hidden';
3883 $dpc_fields['tax_mtn_rap'] = 'hidden';
3884 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3885 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3886 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3887 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3888 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3889 //
3890 $ce_fields['tax_mtn_part_commu'] = 'hidden';
3891 $ce_fields['tax_mtn_part_depart'] = 'hidden';
3892 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3893 $ce_fields['tax_mtn_total'] = 'hidden';
3894 $ce_fields['tax_mtn_rap'] = 'hidden';
3895 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3896 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3897 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3898 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3899 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3900 }
3901 }
3902 }
3903 // CONSULTER
3904 if ($crud ==='read') {
3905
3906 $ads_fields['geom'] = 'static';
3907 $ads_fields['a_qualifier'] = 'checkboxstatic';
3908 $ads_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3909 //
3910 $dpc_fields['geom'] = 'static';
3911 $dpc_fields['a_qualifier'] = 'checkboxstatic';
3912 $dpc_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3913 //
3914 $ce_fields['geom'] = 'static';
3915 $ce_fields['a_qualifier'] = 'checkboxstatic';
3916 $ce_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3917 // Affiche le champ streetview si l'option est active
3918 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true) {
3919 $all_fields['streetview'] = 'static';
3920 }
3921
3922 // Si l'état du dossier est incomplet
3923 if ($this->is_incomplet_notifie()) {
3924 // on cache les dates de complétude et de limite d'instruction
3925 $ads_fields['date_complet'] = 'hidden';
3926 $ads_fields['date_limite'] = 'hidden';
3927 $ads_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3928 $ads_fields['evenement_suivant_tacite'] = 'hidden';
3929 //
3930 $dpc_fields['date_complet'] = 'hidden';
3931 $dpc_fields['date_limite'] = 'hidden';
3932 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3933 $dpc_fields['evenement_suivant_tacite'] = 'hidden';
3934 //
3935 $ce_fields['date_complet'] = 'hidden';
3936 $ce_fields['date_limite'] = 'hidden';
3937 $ce_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3938 $ce_fields['evenement_suivant_tacite'] = 'hidden';
3939 } else {
3940 // sinon on cache la date de limite d'incomplétude
3941 $ads_fields['date_limite_incompletude'] = 'hidden';
3942 $ads_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3943 $ads_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3944 //
3945 $dpc_fields['date_limite_incompletude'] = 'hidden';
3946 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3947 $dpc_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3948 //
3949 $ce_fields['date_limite_incompletude'] = 'hidden';
3950 $ce_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3951 $ce_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3952 }
3953 if (isset($parameters['option_arrondissement'])
3954 && $parameters['option_arrondissement'] === 'true') {
3955 $all_fields['dossier_arrondissement'] = 'static';
3956 }
3957 //
3958 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3959 if ($this->get_source_depot_from_demande() === PLATAU
3960 || $this->get_source_depot_from_demande() === PORTAL) {
3961 //
3962 $ce_fields["consultation_entrante"] = 'hidden';
3963 $ce_fields["delai_reponse"] = 'static';
3964 $ce_fields["type_delai"] = 'static';
3965 $ce_fields["objet_consultation"] = 'static';
3966 $ce_fields["date_production_notification"] = 'datestatic';
3967 $ce_fields["date_premiere_consultation"] = 'datestatic';
3968 $ce_fields["date_consultation"] = 'datestatic';
3969 $ce_fields["date_emission"] = 'datestatic';
3970 $ce_fields["service_consultant_id"] = 'static';
3971 $ce_fields["service_consultant_libelle"] = 'static';
3972 $ce_fields["service_consultant_insee"] = 'static';
3973 $ce_fields["service_consultant_mail"] = 'static';
3974 $ce_fields["service_consultant_type"] = 'static';
3975 $ce_fields["service_consultant__siren"] = 'static';
3976 $ce_fields["etat_consultation"] = 'static';
3977 $ce_fields["type_consultation"] = 'static';
3978 $ce_fields["texte_fondement_reglementaire"] = 'static';
3979 $ce_fields["texte_objet_consultation"] = 'static';
3980 $ce_fields["dossier_consultation"] = 'hidden';
3981 }
3982 }
3983 // SUPPRIMER
3984 if($crud === 'delete') {
3985 // Cache tous les champs execepté le libellé du dossier
3986 foreach ($this->champs as $champ) {
3987 $all_fields[$champ] = 'hidden';
3988 }
3989 $all_fields['dossier_libelle'] = 'hiddenstatic';
3990 }
3991
3992 $all_fields['etat_transmission_platau'] = 'hidden';
3993 if ($crud !== 'create') {
3994 //
3995 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
3996 if ($inst_datd->getVal('dossier_platau') === 't') {
3997 //
3998 $all_fields['etat_transmission_platau'] = 'selecthiddenstatic';
3999 }
4000 }
4001
4002
4003 if ($crud == 'create' || $crud == 'update') {
4004 $required_fields_platau = $this->list_platau_required_fields_dossier;
4005 if ($this->f->is_option_mode_service_consulte_enabled() === false) {
4006 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
4007 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
4008 //
4009 foreach ($required_fields_platau as $required_field_platau) {
4010 $champ = explode('.', $required_field_platau)[1];
4011 if (in_array($champ, $this->champs)) {
4012 $form->setType($champ ,$form->type[$champ].'_demat_color');
4013 }
4014 }
4015 }
4016 }
4017 }
4018
4019 // Dans tous les cas si le champ accord_tacite est à non on veut insérer
4020 // du texte dans le champ "au terme du délai" et donc ce n'est plus un
4021 // selecthiddenstatic
4022 if ($this->getVal('accord_tacite') === 'Non') {
4023 if ($this->is_incomplet_notifie() === false) {
4024 $all_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4025 $ads_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4026 $ce_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4027 $dpc_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4028 } else {
4029 $all_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4030 $ads_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4031 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4032 $ce_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4033 }
4034 }
4035
4036 // Lorsque le statut de dossier est "cloture" on cache le champ "au terme du délai"
4037 if ($this->getStatut() === 'cloture') {
4038 $all_fields['evenement_suivant_tacite'] = 'hidden';
4039 $ads_fields['evenement_suivant_tacite'] = 'hidden';
4040 $dpc_fields['evenement_suivant_tacite'] = 'hidden';
4041 $ce_fields['evenement_suivant_tacite'] = 'hidden';
4042 }
4043
4044 //
4045 // Typage
4046 //
4047
4048 switch ($groupe) {
4049 case 'CTX IN':
4050 $this->manage_type($form, $inf_fields);
4051 break;
4052 case 'CTX RE':
4053 $this->manage_type($form, $re_fields);
4054 break;
4055 case 'ADS':
4056 $this->manage_type($form, $ads_fields);
4057 break;
4058 case 'DPC':
4059 $this->manage_type($form, $dpc_fields);
4060 break;
4061 case 'CONSULTATION ENTRANTE':
4062 $this->manage_type($form, $ce_fields);
4063 break;
4064 }
4065 $this->manage_type($form, $all_fields);
4066 }
4067
4068
4069 /**
4070 * Gestion du typage des champs
4071 *
4072 * @param object $form formulaire instancié
4073 * @param array $fields tableau associatif des champs avec leur widget de formulaire en valeur
4074 * @return void
4075 */
4076 protected function manage_type($form, $fields) {
4077 foreach ($this->champs as $key => $field) {
4078 if (array_key_exists($field, $fields) === true) {
4079 $form->setType($field, $fields[$field]);
4080 }
4081 }
4082 }
4083
4084
4085 /**
4086 * Retourne le nombre de parcelles qu'à en commun le dossier passé en
4087 * paramètre avec les dossiers contentieux en cours. Le nombre de parcelles
4088 * est groupé par type de dossier d'autorisation : RE ou IN.
4089 *
4090 * @param string $di identifiant du DI
4091 * @return array
4092 */
4093 function get_nb_parcelles_dossier_ciblees_par_contentieux($di) {
4094 $sql = "
4095 SELECT
4096 dossier_autorisation_type.code, COUNT(*) as nb
4097 FROM " . DB_PREFIXE . "dossier
4098 LEFT JOIN " . DB_PREFIXE . "dossier_parcelle
4099 ON dossier.dossier = dossier_parcelle.dossier
4100 LEFT JOIN " . DB_PREFIXE . "dossier_parcelle as parcelle_ctx
4101 ON dossier_parcelle.libelle = parcelle_ctx.libelle
4102 AND dossier_parcelle.dossier != parcelle_ctx.dossier
4103 LEFT JOIN " . DB_PREFIXE . "dossier as dossier_ctx
4104 ON dossier_ctx.dossier = parcelle_ctx.dossier
4105 INNER JOIN " . DB_PREFIXE . "etat
4106 ON dossier_ctx.etat = etat.etat AND etat.statut != 'cloture'
4107 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation
4108 ON dossier_ctx.dossier_autorisation = dossier_autorisation.dossier_autorisation
4109 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation_type_detaille
4110 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4111 = dossier_autorisation.dossier_autorisation_type_detaille
4112 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation_type
4113 ON dossier_autorisation_type_detaille.dossier_autorisation_type
4114 = dossier_autorisation_type.dossier_autorisation_type
4115 WHERE
4116 dossier.dossier = '" . $di . "'
4117 AND (dossier_autorisation_type.code = 'RE'
4118 OR dossier_autorisation_type.code = 'IN')
4119 GROUP BY dossier_autorisation_type.code
4120 ";
4121 $this->addToLog("get_nb_parcelles_dossier_ciblees_par_contentieux : db->query(\"$sql\")", VERBOSE_MODE);
4122 $res = $this->f->db->query($sql);
4123 $this->f->isDatabaseError($res);
4124
4125 $nb_re_inf = array('re' => 0, 'inf' => 0);
4126
4127 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
4128 if ($row["code"] == "RE"){
4129 $nb_re_inf['re'] += $row["nb"];
4130 }
4131 if ($row["code"] == "IN"){
4132 $nb_re_inf['inf'] += $row["nb"];
4133 }
4134 }
4135
4136 return $nb_re_inf;
4137 }
4138
4139 /**
4140 * SETTER_FORM - setVal (setVal).
4141 *
4142 * @return void
4143 */
4144 function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
4145 // parent::setVal($form, $maj, $validation);
4146 //
4147 $this->maj=$maj;
4148
4149 if ($this->f->is_option_sig_enabled($this->getVal("om_collectivite")) === true
4150 && $this->f->issetSIGParameter($this->getVal("dossier")) === true) {
4151
4152 // lien vers le SIG
4153 $geoLinksHtml = $this->getGeolocalisationLink();
4154 $form->setVal("geom", $geoLinksHtml);
4155 }
4156 // si l'option 'streetview' est activée ajoute un lien vers Google Maps Street View
4157 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true
4158 && $maj == 3) {
4159 //
4160 $gStreetViewLinkHtml = $this->getGoogleMapsStreetViewLink();
4161 $form->setVal("streetview", $gStreetViewLinkHtml);
4162 }
4163 //
4164 $affichage_form = $this->get_type_affichage_formulaire();
4165 if ($affichage_form === "ADS" || $affichage_form === "CONSULTATION ENTRANTE") {
4166 // Dans le cas d'un dépôt électronique un pictogramme apparait devant le demandeur
4167 if ($maj == 1 || $maj == 2 || $maj == 3) {
4168 if ($this->getVal("depot_electronique") === "t"
4169 || $this->getVal("depot_electronique") === true
4170 || $this->getVal("depot_electronique") === 1) {
4171 //
4172 $form->setVal(
4173 "dossier_petitionnaire",
4174 sprintf(
4175 '<span class="om-icon om-icon-16 om-icon-fix depot-electronique-16" title="%s"> </span>%s',
4176 "Dépôt électronique",
4177 $this->getVal("dossier_petitionnaire")
4178 )
4179 );
4180 }
4181 }
4182 if ($maj == 3) {
4183 $nb_re_inf = $this->get_nb_parcelles_dossier_ciblees_par_contentieux($this->getVal("dossier"));
4184 $message = "";
4185 if ($nb_re_inf["re"] > 0) {
4186 $message .= "<span class=\"label label-warning\" ";
4187 $message .= "title=\""._("Au moins un dossier de recours contentieux ou gracieux en cours concerne les références cadastrales du dossier courant.")."\">";
4188 $message .= _("RE");
4189 $message .= "</span>";
4190 if ($nb_re_inf["inf"] > 0) {
4191 $message .= " ";
4192 }
4193 }
4194 if ($nb_re_inf["inf"] > 0) {
4195 $message .= "<span class=\"label label-important\" ";
4196 $message .= "title=\""._("Au moins un dossier d'infraction en cours concerne les références cadastrales du dossier courant.")."\">";
4197 $message .= _("IN");
4198 $message .= "</span>";
4199 }
4200 $form->setVal("enjeu_ctx", $message);
4201 }
4202 } elseif ($affichage_form === "CTX RE") {
4203 // Récupération des demandeurs liés au dossier
4204 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4205 //
4206 $requerants = "";
4207 if ($this->getVal("requerants") != "") {
4208 $requerants = $this->getVal("requerants");
4209 if (isset($this->valIdDemandeur["requerant"]) === true
4210 && count($this->valIdDemandeur["requerant"]) > 0) {
4211 //
4212 $requerants .= " "._("et autres");
4213 }
4214 }
4215 $form->setVal("requerants", $requerants);
4216 //
4217 $dossier_petitionnaires = "";
4218 if ($this->getVal("dossier_petitionnaire") != "") {
4219 $dossier_petitionnaires = $this->getVal("dossier_petitionnaire");
4220 }
4221 if (isset($this->valIdDemandeur["petitionnaire"]) === true
4222 && count($this->valIdDemandeur["petitionnaire"]) > 0) {
4223 //
4224 $dossier_petitionnaires .= " "._("et autres");
4225 }
4226 $form->setVal("dossier_petitionnaires", $dossier_petitionnaires);
4227 } elseif ($affichage_form === "CTX IN") {
4228 // Récupération des demandeurs liés au dossier
4229 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4230 //
4231 $contrevenants = "";
4232 if ($this->getVal("contrevenants") != "") {
4233 $contrevenants = $this->getVal("contrevenants");
4234 if (isset($this->valIdDemandeur["contrevenant"]) === true
4235 && count($this->valIdDemandeur["contrevenant"]) > 0) {
4236 //
4237 $contrevenants .= " "._("et autres");
4238 }
4239 }
4240 $form->setVal("contrevenants", $contrevenants);
4241 } elseif ($affichage_form === "DPC") {
4242 // Récupération des demandeurs liés au dossier
4243 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4244 //
4245 $bailleurs = "";
4246 if ($this->getVal("bailleurs") != "") {
4247 $bailleurs = $this->getVal("bailleurs");
4248 if (isset($this->valIdDemandeur["bailleur"]) === true
4249 && count($this->valIdDemandeur["bailleur"]) > 0) {
4250 //
4251 $bailleurs .= " "._("et autres");
4252 }
4253 }
4254 $form->setVal("bailleurs", $bailleurs);
4255 }
4256 //
4257 if ($validation == 0) {
4258 if ($maj == 0) {
4259 $form->setVal("annee", date("y"));
4260 $form->setVal("date_demande", date("Y-m-d"));
4261 $form->setVal("date_depot", date("Y-m-d"));
4262 $form->setVal("accord_tacite", "Non");
4263 $form->setVal("etat", "initialiser");
4264 }
4265 }
4266 //
4267 if ($maj == 3) {
4268 $form->setVal("lien_iiue", $this->get_json_lien_iiue());
4269 }
4270
4271 // 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"
4272 if ($this->is_incomplet_notifie() === false) {
4273 if ($this->getVal('accord_tacite') === 'Non') {
4274 $form->setVal('evenement_suivant_tacite', __('N/A'));
4275 }
4276 } else {
4277 // Si le champ accord_tacite est à false alors on met "N/A" dans le champ evenement_suivant_tacite_incompletude
4278 if ($this->getVal('accord_tacite') === 'Non') {
4279 $form->setVal('evenement_suivant_tacite_incompletude', __('N/A'));
4280 }
4281 }
4282 }
4283
4284 /**
4285 * getGeolocalisationLink retourne le code HTML affichant l'icone du globe, ainsi que
4286 * les coordonnées du centroide du dossier, le tout étant un lien vers le SIG.
4287 *
4288 * @return string Lien vers le SIG
4289 */
4290 function getGeolocalisationLink() {
4291 //
4292 $link = "<a id='action-form-localiser'".
4293 " target='_SIG' href='".OM_ROUTE_FORM."&obj=dossier_instruction&action=140&idx=".$this->getVal("dossier")."'>".
4294 "<span class='om-icon om-icon-16 om-icon-fix sig-16' title='Localiser'>Localiser</span> ".
4295 $this->getVal('geom').
4296 " </a>";
4297 $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>";
4298 return $this->getVal('geom') ? $link : $nogeoloc;
4299 }
4300
4301
4302 /**
4303 * converti un geom au format Lat,Lon
4304 *
4305 * @param string $geom Le Geom
4306 * @param string $fromRefId Le référentiel dans lequel le geom est défini
4307 * @param string $toLongLatId Le référentiel dans lequel le geom doit être converti
4308 *
4309 * @return array[2] Long,Lat ou bien false,"message" en cas d'erreur
4310 */
4311 protected function convertGeomToLongLat(string $geom, string $fromRefId = '2154',
4312 string $toLongLatId = '4326') {
4313 $sql = "
4314 SELECT
4315 ST_X(ST_Transform(ST_GeomFromText('$geom', $fromRefId), $toLongLatId)) AS longitude,
4316 ST_Y(ST_Transform(ST_GeomFromText('$geom', $fromRefId), $toLongLatId)) AS latitude
4317 ";
4318 $res = $this->f->db->query($sql);
4319 $this->addToLog(
4320 __METHOD__."(): db->query(\"".$sql."\");",
4321 VERBOSE_MODE
4322 );
4323 if ($this->f->isDatabaseError($res)) { // PP
4324 $this->addToLog(__METHOD__."() error: ".var_export($res->getMessage(), true), DEBUG_MODE);
4325 return array(false, $res->getMessage());
4326 }
4327 if ($res->numRows() != 1) {
4328 $this->addToLog(__METHOD__."() error: ".var_export($res->numRows(), true), DEBUG_MODE);
4329 return array(false, __("Erreur: Plus d'un enregistrement retourné").
4330 '('.$res->numRows().')');
4331 }
4332 $coord = $res->fetchRow(DB_FETCHMODE_ASSOC);
4333 $this->addToLog(__METHOD__."() coord: ".var_export($coord, true), EXTRA_VERBOSE_MODE);
4334 return array_values($coord);
4335 }
4336
4337 /**
4338 * getGoogleMapsStreetViewLink retourne le code HTML affichant un lien vers une vue
4339 * Google Maps Street View à partir des coordonnées du geom.
4340 *
4341 * @return string Lien vers Google Maps Street View
4342 */
4343 protected function getGoogleMapsStreetViewLink() {
4344 // Récupération coordonnées du terrain
4345
4346 // Passage du numéro de dossier comme id pour pouvoir le récupérer dans le
4347 // jscript lors du clic
4348 $html = sprintf(
4349 "<a id='action-form-gstreetview' class='simple-btn' title='%s' onclick='get_adresse_terrain(this.id, \"%s\")'>
4350 <span class='om-icon om-icon-16 om-icon-fix consult-16'></span>%s
4351 </a>",
4352 __("Ouvrir dans Google Maps Street View"),
4353 $this->getVal($this->clePrimaire),
4354 __("Street View")
4355 );
4356 return $html;
4357 }
4358
4359 /**
4360 * SETTER_FORM - setSelect.
4361 *
4362 * @return void
4363 */
4364 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
4365 $crud = $this->get_action_crud($this->getParameter("maj"));
4366
4367 // XXX Commenté pour patcher le problème de montée en charge de la base
4368 // de données en cas de reprise de données d'un gros volume de dossier
4369 // d'instruction
4370 // parent::setSelect($form, $maj);
4371 // om_collectivite
4372 $this->init_select(
4373 $form,
4374 $this->f->db,
4375 $maj,
4376 null,
4377 "om_collectivite",
4378 $this->get_var_sql_forminc__sql("om_collectivite"),
4379 $this->get_var_sql_forminc__sql("om_collectivite_by_id"),
4380 false
4381 );
4382
4383 /*
4384 * Pour chaque init_select d'un select non modifiable on teste
4385 * si l'on est en mode modifier : si c'est le cas alors on initialise le
4386 * select en mode consulter (qui n'affiche rien s'il n'y a aucune valeur).
4387 */
4388
4389 $collectivite_idx = $this->getVal("om_collectivite");
4390 $affichage_form_dat = "";
4391 // Si recherche avancée om_collectivite = collectivité utilisateur
4392 if ($maj == 999) {
4393 $collectivite_idx = $this->f->getParameter("om_collectivite_idx");
4394 } else {
4395 $affichage_form_dat = $this->get_type_affichage_formulaire();
4396 }
4397 // Définition de la qualité et de la traduction de l'instructeur
4398 $lib_instructeur = __("l'instructeur");
4399 $lib_instructeur_2 = __("l'instructeur secondaire");
4400 $affichage_instr_2 = 'instr';
4401 $affichage_instr = '';
4402 switch ($affichage_form_dat) {
4403 case 'DPC':
4404 case 'ADS':
4405 case 'CONSULTATION ENTRANTE':
4406 $affichage_instr = "AND instructeur_qualite.code = 'instr'";
4407 break;
4408 case 'CTX RE':
4409 $lib_instructeur_2 = __("le technicien");
4410 $affichage_instr_2 = 'tech';
4411 break;
4412 case 'CTX IN':
4413 $affichage_instr = "AND instructeur_qualite.code = 'juri'";
4414 $lib_instructeur = __('le juriste');
4415 $lib_instructeur_2 = __("le technicien");
4416 $affichage_instr_2 = 'tech';
4417 break;
4418 default:
4419 $affichage_instr = "";
4420 break;
4421 }
4422
4423 // instructeur
4424 // on recupère les services des multicollectivités et de celle du DI
4425 if ($this->f->getParameter('option_afficher_division')==='true') {
4426 // instructeur
4427 $sql_instructeur_div_by_di = str_replace(
4428 '<collectivite_di>',
4429 $collectivite_idx,
4430 $this->get_var_sql_forminc__sql("instructeur_div_by_di")
4431 );
4432 $sql_instructeur_div_by_di = str_replace(
4433 '<instructeur_qualite>',
4434 $affichage_instr,
4435 $sql_instructeur_div_by_di
4436 );
4437 $this->init_select(
4438 $form,
4439 $this->f->db,
4440 $maj,
4441 null,
4442 "instructeur",
4443 $sql_instructeur_div_by_di,
4444 $this->get_var_sql_forminc__sql("instructeur_div_by_id"),
4445 true,
4446 false,
4447 $lib_instructeur
4448 );
4449 // instructeur_2
4450 $sql_instructeur_2_div_by_di = str_replace(
4451 '<collectivite_di>',
4452 $collectivite_idx,
4453 $this->get_var_sql_forminc__sql("instructeur_2_div_by_di")
4454 );
4455 $sql_instructeur_2_div_by_di = str_replace(
4456 '<instructeur_qualite>',
4457 $affichage_instr_2,
4458 $sql_instructeur_2_div_by_di
4459 );
4460 $this->init_select(
4461 $form,
4462 $this->f->db,
4463 $maj,
4464 null,
4465 "instructeur_2",
4466 $sql_instructeur_2_div_by_di,
4467 $this->get_var_sql_forminc__sql("instructeur_2_div_by_id"),
4468 true,
4469 false,
4470 $lib_instructeur_2
4471 );
4472 } else {
4473 $sql_instructeur_by_di = str_replace(
4474 '<collectivite_di>',
4475 $collectivite_idx,
4476 $this->get_var_sql_forminc__sql("instructeur_by_di")
4477 );
4478 $sql_instructeur_by_di = str_replace(
4479 '<instructeur_qualite>',
4480 $affichage_instr,
4481 $sql_instructeur_by_di
4482 );
4483 $this->init_select(
4484 $form,
4485 $this->f->db,
4486 $maj,
4487 null,
4488 "instructeur",
4489 $sql_instructeur_by_di,
4490 $this->get_var_sql_forminc__sql("instructeur_by_id"),
4491 true,
4492 false,
4493 $lib_instructeur
4494 );
4495 $sql_instructeur_2_by_di = str_replace(
4496 '<collectivite_di>',
4497 $collectivite_idx,
4498 $this->get_var_sql_forminc__sql("instructeur_2_by_di")
4499 );
4500 $sql_instructeur_2_by_di = str_replace(
4501 '<instructeur_qualite>',
4502 $affichage_instr_2,
4503 $sql_instructeur_2_by_di
4504 );
4505 $this->init_select(
4506 $form,
4507 $this->f->db,
4508 $maj,
4509 null,
4510 "instructeur_2",
4511 $sql_instructeur_2_by_di,
4512 $this->get_var_sql_forminc__sql("instructeur_2_by_id"),
4513 true,
4514 false,
4515 $lib_instructeur_2
4516 );
4517 }
4518
4519 // etat
4520 if ($maj == 1) {
4521 $this->init_select(
4522 $form,
4523 $this->f->db,
4524 3,
4525 null,
4526 "etat",
4527 $this->get_var_sql_forminc__sql("etat"),
4528 $this->get_var_sql_forminc__sql("etat_by_id"),
4529 false
4530 );
4531 } else {
4532 $this->init_select(
4533 $form,
4534 $this->f->db,
4535 $maj,
4536 null,
4537 "etat",
4538 $this->get_var_sql_forminc__sql("etat"),
4539 $this->get_var_sql_forminc__sql("etat_by_id"),
4540 false
4541 );
4542 }
4543
4544 // dossier_instruction_type
4545 $this->init_select(
4546 $form,
4547 $this->f->db,
4548 $maj,
4549 null,
4550 "dossier_instruction_type",
4551 $this->get_var_sql_forminc__sql("dossier_instruction_type"),
4552 $this->get_var_sql_forminc__sql("dossier_instruction_type_by_id"),
4553 false
4554 );
4555
4556 // division
4557 $sql_division_by_di = str_replace(
4558 '<collectivite_di>',
4559 $collectivite_idx,
4560 $this->get_var_sql_forminc__sql("division_by_di")
4561 );
4562 $this->init_select(
4563 $form,
4564 $this->f->db,
4565 $maj,
4566 null,
4567 "division",
4568 $sql_division_by_di,
4569 $this->get_var_sql_forminc__sql("division_by_id"),
4570 true
4571 );
4572
4573 // autorite_competente
4574 $this->init_select(
4575 $form,
4576 $this->f->db,
4577 $maj,
4578 null,
4579 "autorite_competente",
4580 $this->get_var_sql_forminc__sql("autorite_competente"),
4581 $this->get_var_sql_forminc__sql("autorite_competente_by_id"),
4582 false
4583 );
4584
4585 // avis_decision
4586 if ($maj == 1) {
4587 $this->init_select(
4588 $form,
4589 $this->f->db,
4590 3,
4591 null,
4592 "avis_decision",
4593 $this->get_var_sql_forminc__sql("avis_decision"),
4594 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4595 false
4596 );
4597 } else {
4598 $this->init_select(
4599 $form,
4600 $this->f->db,
4601 $maj,
4602 null,
4603 "avis_decision",
4604 $this->get_var_sql_forminc__sql("avis_decision"),
4605 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4606 false
4607 );
4608 }
4609
4610 // autorisation_contestee
4611 if ($affichage_form_dat === 'CTX RE'
4612 && ($maj == 1 || $maj == 3)) {
4613 // À exécuter seulement en mode modifier ou consulter des recours
4614 // pour éviter le ralentissement de l'affichage des listings des DI
4615 $this->init_select(
4616 $form,
4617 $this->f->db,
4618 $maj,
4619 null,
4620 "autorisation_contestee",
4621 $this->get_var_sql_forminc__sql("autorisation_contestee"),
4622 $this->get_var_sql_forminc__sql("autorisation_contestee_by_id"),
4623 false
4624 );
4625 }
4626
4627 // Si l'accord tacite est activé, on récupère la liste des évènements
4628 if ($this->getVal('accord_tacite') === 'Oui') {
4629
4630 // evenement_suivant_tacite
4631 $this->init_select(
4632 $form,
4633 $this->f->db,
4634 $maj,
4635 null,
4636 "evenement_suivant_tacite",
4637 $this->get_var_sql_forminc__sql("evenement_suivant_tacite"),
4638 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_by_id"),
4639 false
4640 );
4641
4642 // evenement_suivant_tacite_incompletude
4643 $this->init_select(
4644 $form,
4645 $this->f->db,
4646 $maj,
4647 null,
4648 "evenement_suivant_tacite_incompletude",
4649 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude"),
4650 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude_by_id"),
4651 false
4652 );
4653 }
4654
4655 // Ajout, modification et recherche avancée
4656 if ($maj == 0 || $maj == 1 || $maj == 999) {
4657 // accord tacite
4658 $contenu=array();
4659 $contenu[0]=array('Non','Oui');
4660 $contenu[1]=array('Non','Oui');
4661 $form->setSelect("accord_tacite", $contenu);
4662 // geom *** a voir
4663 if ($maj == 1) { //modification
4664 $contenu=array();
4665 $contenu[0]=array("dossier", $this->getParameter("idx"));
4666 $form->setSelect('geom', $contenu);
4667 }
4668 // arrondissement recherche avancée
4669 $this->init_select(
4670 $form,
4671 $this->f->db,
4672 $maj,
4673 null,
4674 "arrondissement",
4675 $this->get_var_sql_forminc__sql("arrondissement"),
4676 $this->get_var_sql_forminc__sql("arrondissement_by_id"),
4677 false
4678 );
4679 // dossier_autorisation_type_detaille recherche avancée
4680 $this->init_select(
4681 $form,
4682 $this->f->db,
4683 $maj,
4684 null,
4685 "dossier_autorisation_type_detaille",
4686 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille"),
4687 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille_by_id"),
4688 false
4689 );
4690 }
4691
4692 // Ce formulaire n'est pas accessible en ajout ni en recherche avancée
4693 // mais dans le cas où il le serait, rien ne doit être fait concernant
4694 // les taxes
4695 if ($maj != 0 && $maj != 999) {
4696 // Choix du secteur pour part communale
4697 $contenu = array();
4698 $contenu[0][0] = "";
4699 $contenu[1][0] = __('choisir')."&nbsp;".__("le")."&nbsp;".__("tax_secteur");
4700 if ($crud === 'read') {
4701 $contenu[1][0] = "";
4702 }
4703 // Instance du parmétrage des taxes
4704 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
4705 // Si la colletivité à un paramétrage pour la taxe d'aménagement
4706 if ($inst_taxe_amenagement !== null) {
4707 // Il y a 20 secteurs maximum dans une commune de France
4708 for ($i=1; $i < 21; $i++) {
4709 // Valeur du secteur
4710 $value = $inst_taxe_amenagement->getVal('tx_comm_secteur_'.$i);
4711 //
4712 if ($value !== null && $value !== '') {
4713 //
4714 $contenu[0][$i] = $i;
4715 $contenu[1][$i] = sprintf(__('Secteur %s'), $i);
4716 }
4717 }
4718 }
4719 //
4720 $form->setSelect("tax_secteur", $contenu);
4721 }
4722 // commune
4723 $this->init_select(
4724 $form,
4725 $this->f->db,
4726 $maj,
4727 null,
4728 "commune",
4729 $this->get_var_sql_forminc__sql("commune"),
4730 $this->get_var_sql_forminc__sql("commune_by_id"),
4731 false
4732 );
4733 // pec_metier
4734 $this->init_select(
4735 $form,
4736 $this->f->db,
4737 $maj,
4738 null,
4739 "pec_metier",
4740 $this->get_var_sql_forminc__sql("pec_metier"),
4741 $this->get_var_sql_forminc__sql("pec_metier_by_id"),
4742 false
4743 );
4744 // etat_transmission_platau
4745 $contenu = array();
4746 $contenu[0] = array(
4747 'jamais_transmissible',
4748 'non_transmissible',
4749 'transmis_mais_non_transmissible',
4750 'transmissible',
4751 );
4752 $contenu[1] = array(
4753 __('Ne sera jamais transmis'),
4754 __('Non transmissible'),
4755 __('Déjà transmis mais non transmissible'),
4756 __('Transmissible'),
4757 );
4758 $form->setSelect("etat_transmission_platau", $contenu);
4759 }
4760
4761 /**
4762 * SETTER_FORM - setLib.
4763 *
4764 * @return void
4765 */
4766 function setLib(&$form, $maj) {
4767 parent::setLib($form, $maj);
4768 // Les libellés généraux sont mis avant la modification des libellés
4769 // selon le contexte pour permettre de ne surcharger que les libellés
4770 // voulu et d'avoir les mêmes dans tous les autres cas.
4771 $form->setLib('accord_tacite',_("decision tacite"));
4772 $form->setLib('autorite_competente',_('competence'));
4773 $form->setLib('cle_acces_citoyen', _("cle_acces_citoyen"));
4774 $form->setLib('date_ait', _("Date d'AIT"));
4775 $form->setLib('date_audience', _("Date d'audience"));
4776 $form->setLib('date_complet', _("completude"));
4777 $form->setLib('date_contradictoire', _("Date de contradictoire"));
4778 $form->setLib('date_dernier_depot', _("dernier depot"));
4779 $form->setLib('date_derniere_visite', _("Date de dernière visite"));
4780 $form->setLib('date_limite_incompletude', _("limite d'instruction"));
4781 $form->setLib('date_premiere_visite', _("Date de 1ère visite"));
4782 $form->setLib('date_transmission_parquet', _('Date de transmission au Parquet'));
4783 $form->setLib('date_validite', _("fin de validite le"));
4784 $form->setLib('delai', _("delai (mois)"));
4785 $form->setLib('delai',_("delai d'instruction"));
4786 $form->setLib('description_projet',_('description du projet'));
4787 $form->setLib('dossier_arrondissement', _("Arrondissement"));
4788 $form->setLib('dossier_autorisation_libelle',_('dossier_autorisation_libelle'));
4789 $form->setLib('dossier_autorisation_type_detaille', _("Type"));
4790 $form->setLib('contrevenants', _("Contrevenant(s)"));
4791 $form->setLib('dossier_instruction_type',_('type de dossier'));
4792 $form->setLib('dossier_petitionnaire',_('demandeur'));
4793 $form->setLib('dossier_petitionnaires', _("Pétitionnaire(s)"));
4794 $form->setLib('requerants', _("Requérant(s)"));
4795 $form->setLib('dt_ctx_infraction', _("Infraction"));
4796 $form->setLib('dt_ctx_regularisable', _("Régularisable"));
4797 $form->setLib('dt_ctx_synthese_anr', _("Synthèse des ANR"));
4798 $form->setLib('dt_ctx_synthese_nti', _("Synthèse des NTI"));
4799 $form->setLib('ctx_reference_dsj', _("ctx_reference_dsj"));
4800 $form->setLib('ctx_reference_sagace', _("ctx_reference_sagace"));
4801 $form->setLib('enjeu_ctx', _("contentieux"));
4802 $form->setLib('enjeu_erp', _("ERP"));
4803 $form->setLib('enjeu_urba', _("urbanisme"));
4804 $form->setLib('erp', _("ERP"));
4805 $form->setLib('geom',_('geolocalisaion'));
4806 $form->setLib('instructeur_2', _('Technicien'));
4807 $form->setLib('numero_versement_archive', _("numero"));
4808 $form->setLib('bailleur', _("Bailleur(s)"));
4809 $form->setLib('terrain', _("Localisation"));
4810 $form->setLib('etat_transmission_platau', __("Statut Plat'AU"));
4811 $form->setLib('lien_iiue', '');
4812
4813 $affichage_form = $this->get_type_affichage_formulaire();
4814 if ($affichage_form === 'ADS') {
4815 $form->setLib('date_decision', _("date de la decision"));
4816 $form->setLib('date_limite', _("limite d'instruction"));
4817 $form->setLib('instructeur_2', __("instructeur secondaire"));
4818 }
4819 if ($affichage_form === 'CTX IN') {
4820 $form->setLib('avis_decision', _("Décision"));
4821 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
4822 $form->setLib('date_decision', _("Date de décision"));
4823 $form->setLib('date_depot', _("Date de réception"));
4824 $form->setLib('date_limite', _("Tacicité"));
4825 $form->setLib('instructeur',_('Juriste'));
4826 }
4827 if ($affichage_form === 'CTX RE') {
4828 $form->setLib('autorisation_contestee', _("Autorisation contestée"));
4829 $form->setLib('avis_decision', _("Décision"));
4830 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
4831 $form->setLib('date_decision', _("Date de décision"));
4832 $form->setLib('date_depot', _("Date de recours"));
4833 $form->setLib('date_limite', _("Tacicité"));
4834 $form->setLib('instructeur',_('Juriste'));
4835 }
4836 if ($affichage_form === 'DPC') {
4837 $form->setLib('instructeur_2', __("instructeur secondaire"));
4838 }
4839 if ($affichage_form === 'CONSULTATION ENTRANTE') {
4840 $form->setLib('date_decision', _("date de la decision"));
4841 $form->setLib('date_limite', _("limite d'instruction"));
4842 //
4843 $form->setLib('delai_reponse', __('Délai de réponse'));
4844 $form->setLib('date_consultation', __('Date de la consultation'));
4845 $form->setLib('date_emission', __("Date d'émission"));
4846 $form->setLib('etat_consultation', __('État de la consultation'));
4847 $form->setLib('type_consultation', __('Type de la consultation'));
4848 $form->setLib('texte_fondement_reglementaire', __('Article(s) réglementaire sur le(s)quel(s) se fonde la consultation'));
4849 $form->setLib('texte_objet_consultation', __("Texte de l'objet de la consultation"));
4850 $form->setLib('service_consultant_id', __('Service consultant : identifiant'));
4851 $form->setLib('service_consultant_libelle', __('Service consultant : libellé'));
4852 $form->setLib('service_consultant_insee', __('Service consultant : INSEE'));
4853 $form->setLib('service_consultant_mail', __('Service consultant : mail'));
4854 $form->setLib('service_consultant_type', __('Service consultant : type'));
4855 $form->setLib('service_consultant__siren', __('Service consultant : SIREN'));
4856
4857 $form->setLib('type_delai', __('Type de délai'));
4858 $form->setLib('objet_consultation', __('Objet de la consultation'));
4859 $form->setLib('date_production_notification', __('Date de production de la notification'));
4860 $form->setLib('date_premiere_consultation', __('Date de la première consultation'));
4861 }
4862 }
4863
4864 function setOnchange(&$form,$maj){
4865 parent::setOnchange($form,$maj);
4866 // mise en majuscule
4867 $form->setOnchange("demandeur_nom","this.value=this.value.toUpperCase()");
4868 $form->setOnchange("demandeur_societe","this.value=this.value.toUpperCase()");
4869 $form->setOnchange("delegataire_nom","this.value=this.value.toUpperCase()");
4870 $form->setOnchange("delegataire_societe","this.value=this.value.toUpperCase()");
4871 $form->setOnchange("architecte_nom","this.value=this.value.toUpperCase()");
4872 $form->setOnchange("terrain_adresse","this.value=this.value.toUpperCase()");
4873 $form->setOnchange('terrain_surface','VerifNumdec(this)');
4874 $form->setOnchange('tax_mtn_part_commu', 'VerifFloat(this, 0)');
4875 $form->setOnchange('tax_mtn_part_depart', 'VerifFloat(this, 0)');
4876 $form->setOnchange('tax_mtn_part_reg', 'VerifFloat(this, 0)');
4877 $form->setOnchange('tax_mtn_total', 'VerifFloat(this, 0)');
4878 $form->setOnchange('tax_mtn_rap', 'VerifFloat(this, 0)');
4879 $form->setOnchange('tax_mtn_part_commu_sans_exo', 'VerifFloat(this, 0)');
4880 $form->setOnchange('tax_mtn_part_depart_sans_exo', 'VerifFloat(this, 0)');
4881 $form->setOnchange('tax_mtn_part_reg_sans_exo', 'VerifFloat(this, 0)');
4882 $form->setOnchange('tax_mtn_total_sans_exo', 'VerifFloat(this, 0)');
4883 $form->setOnchange('tax_mtn_rap_sans_exo', 'VerifFloat(this, 0)');
4884 }
4885
4886 function setLayout(&$form, $maj) {
4887
4888 // Récupère le CRUD
4889 $crud = $this->get_action_crud($this->getParameter("maj"));
4890
4891 // Il n'y a pas d'affichage spécifique dans le cas d'une suppression
4892 if ($crud === 'delete') {
4893 return;
4894 }
4895
4896 $affichage_form = $this->get_type_affichage_formulaire();
4897 if ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE') {
4898 // Le contrôle de données est seulement possible si on est pas en mode service consulté.
4899 // et si le champ dossier_platau du dossier d'autorisation type detaillé est à true
4900 if ($this->f->is_option_mode_service_consulte_enabled() === false
4901 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
4902 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
4903 //
4904 $required_fields_platau = $this->check_platau_required_fields($this->getVal('dossier'));
4905
4906 if (isset($required_fields_platau['is_ok']) && $required_fields_platau['is_ok'] === false) {
4907 $class = 'demat-color demat-color-text';
4908 $message = __("La transmission à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
4909 if ($this->getVal('etat_transmission_platau') == "transmis_mais_non_transmissible") {
4910 $message = __("La transmission des modifications à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
4911 }
4912 $this->f->display_panel_information($class, $message, $required_fields_platau['required_fields_empty'], __('Champs requis'), 'demat-color');
4913 }
4914 }
4915 // En-tête
4916 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
4917
4918 // Col1 : Fieldset "Dossier d'Instruction"
4919 $form->setBloc('om_collectivite', 'D', '', 'col_9');
4920
4921 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
4922 $form->setFieldset('tax_secteur', 'F');
4923
4924
4925 $form->setBloc('tax_secteur', 'F');
4926
4927 // Col2 : 3 fieldsets
4928 $form->setBloc('enjeu_urba', 'D', '', 'col_3');
4929
4930 // Fieldset "Enjeu"
4931 $form->setFieldset('enjeu_urba', 'D', _("Enjeu"));
4932 $form->setFieldset('enjeu_ctx', 'F');
4933 // Fieldset "Qualification"
4934 $form->setFieldset('erp', 'D', _("Qualification"));
4935 $form->setFieldset('etat_transmission_platau', 'F');
4936 // Fieldset "Archive"
4937 $form->setFieldset('numero_versement_archive', 'D', _("Archive"));
4938 $form->setFieldset('date_demande', 'F');
4939
4940 $form->setBloc('date_demande', 'F');
4941 $form->setBloc('date_demande', 'F');
4942
4943 // Fieldset "Instruction"
4944 $form->setBloc('date_depot', 'D', '', 'col_12');
4945 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
4946
4947 // Fieldset "Suivi"
4948 $form->setBloc('date_depot', 'D', '', 'col_12');
4949
4950 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
4951 // Col 1
4952 $form->setBloc('date_depot', 'D', '', 'col_6');
4953 $form->setBloc('date_depot', 'D');
4954 $form->setBloc('date_dernier_depot', 'F');
4955 $form->setBloc('date_limite', 'D', '', 'interligne');
4956 $form->setBloc('date_limite_incompletude', 'F');
4957 $form->setBloc('date_limite_incompletude', 'F');
4958 // Col 2
4959 $form->setBloc('etat', 'D', '', 'col_6');
4960 $form->setBloc('etat', 'D');
4961 $form->setBloc('etat', 'F');
4962 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
4963 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4964 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4965 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
4966
4967 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
4968
4969 // Bloc 2 fieldsets
4970 $form->setBloc('date_decision', 'D', '', 'col_12');
4971
4972 // Col 1 Fieldset "Décision"
4973 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_6');
4974 $form->setFieldset('avis_decision','F','');
4975 // Col 2 Fieldset "Validité de l'autorisation"
4976 $form->setFieldset('date_validite', 'D', _("Validite de l'autorisation"), 'col_6');
4977 $form->setFieldset('date_validite','F','');
4978
4979 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
4980
4981 $form->setFieldset('date_conformite','F','');
4982 $form->setBloc('date_conformite', 'F'); // Fin Instruction
4983
4984 // Fieldset "Simulation des taxes"
4985 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
4986 $form->setFieldset('tax_mtn_part_commu', 'D', _("Simulation des taxes"), 'startClosed');
4987 //
4988 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
4989 $form->setFieldset('tax_mtn_part_commu', 'D', _("Taxe d'aménagement"), 'collapsible');
4990 $form->setFieldset('tax_mtn_total_sans_exo', 'F', '');
4991 $form->setBloc('tax_mtn_total_sans_exo', 'F');
4992 //
4993 $form->setBloc('tax_mtn_rap', 'D', '', 'col_12');
4994 $form->setFieldset('tax_mtn_rap', 'D', _("Redevance d'archéologie préventive"), 'collapsible');
4995 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
4996 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
4997 //
4998 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
4999 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
5000
5001 // Fieldset "Localisation"
5002 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5003
5004 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5005 // Col 1
5006 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5007 $form->setBloc('terrain_references_cadastrales', 'F');
5008 // Col 2
5009 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5010 $form->setBloc('terrain_superficie', 'F');
5011
5012 $form->setFieldset('terrain_superficie', 'F', '');
5013
5014 $form->setBloc('terrain_superficie', 'F');
5015
5016 // Fieldset "Plat'AU : identifiants techniques"
5017 $form->setBloc('lien_iiue', 'D', '', 'col_12');
5018 $form->setFieldset('lien_iiue', 'D', __("Plat'AU - Identifiants techniques"), 'demat-color-fieldset startClosed');
5019 $form->setFieldset('lien_iiue', 'F', '');
5020 $form->setBloc('lien_iiue', 'F');
5021 }
5022 // CONSULTATION ENTRANTE
5023 // Vérifie que le dossier a été déposé électroniquement
5024 if ($affichage_form === 'CONSULTATION ENTRANTE'
5025 && ($this->get_source_depot_from_demande() === PLATAU
5026 || $this->get_source_depot_from_demande() === PORTAL)) {
5027 // Fieldset "Consultation"
5028 $form->setBloc('consultation_entrante', 'D', '', 'col_12');
5029 $form->setFieldset('consultation_entrante', 'D', __('Consultation'), '');
5030 $form->setBloc('consultation_entrante', 'D', "", "col_6");
5031 $form->setBloc('type_consultation', 'F');
5032 $form->setBloc('texte_fondement_reglementaire', 'D', "", "col_6");
5033 $form->setBloc('dossier_consultation', 'F');
5034 $form->setFieldset('dossier_consultation', 'F', '');
5035 $form->setBloc('dossier_consultation', 'F');
5036 }
5037 // RECOURS
5038 if ($affichage_form === 'CTX RE') {
5039 // Fieldset "Dossier d'Instruction"
5040 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5041 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5042 $form->setFieldset('date_demande', 'F');
5043 $form->setBloc('date_demande', 'F');
5044
5045 // Fieldset "Instruction"
5046 $form->setBloc('date_depot', 'D', '', 'col_12');
5047 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
5048
5049 // Fieldset "Suivi"
5050 $form->setBloc('date_depot', 'D', '', 'col_12');
5051
5052 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5053 // Col 1
5054 $form->setBloc('date_depot', 'D', '', 'col_6');
5055 // $form->setBloc('date_depot', 'D');
5056 // $form->setBloc('date_dernier_depot', 'F');
5057 // $form->setBloc('date_limite', 'D', '');
5058 // $form->setBloc('date_limite_incompletude', 'F');
5059 $form->setBloc('date_cloture_instruction', 'F');
5060 // Col 2
5061 $form->setBloc('etat', 'D', '', 'col_6');
5062 $form->setBloc('etat', 'D');
5063 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5064 // $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5065 // $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5066 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5067 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5068
5069 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5070
5071 // Bloc 2 fieldsets
5072 $form->setBloc('date_decision', 'D', '', 'col_12');
5073
5074 // Col 1 Fieldset "Décision"
5075 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5076 $form->setFieldset('avis_decision','F','');
5077 // Col 2 Fieldset "Validité de l'autorisation"
5078
5079 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
5080
5081 $form->setFieldset('date_conformite','F','');
5082 $form->setBloc('date_conformite', 'F'); // Fin Instruction
5083
5084 // Fieldset "Localisation"
5085 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5086
5087 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5088 // Col 1
5089 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5090 $form->setBloc('terrain_references_cadastrales', 'F');
5091 // Col 2
5092 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5093 $form->setBloc('terrain_superficie', 'F');
5094
5095 $form->setFieldset('terrain_superficie', 'F', '');
5096
5097 $form->setBloc('terrain_superficie', 'F');
5098 }
5099
5100 // INFRACTION
5101 if ($affichage_form === 'CTX IN') {
5102
5103 // Fieldset "Dossier d'Instruction"
5104 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5105 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5106 $form->setFieldset('etat_transmission_platau', 'F');
5107 $form->setBloc('etat_transmission_platau', 'F');
5108
5109 // Fieldset "Archive"
5110 $form->setBloc('numero_versement_archive', 'D', '', 'col_12');
5111 $form->setFieldset('numero_versement_archive', 'DF', __("Archive"));
5112 $form->setBloc('numero_versement_archive', 'F', '');
5113
5114 // Fieldset "Instruction"
5115 $form->setBloc('date_depot', 'D', '', 'col_12');
5116 $form->setFieldset('date_depot', 'D', _('Instruction'));
5117 // Fieldset "Suivi"
5118 $form->setBloc('date_depot', 'D', '', '');
5119 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5120 // Col 1
5121 $form->setBloc('date_depot', 'D', '', 'col_6');
5122 $form->setBloc('date_depot', 'D');
5123 $form->setBloc('date_dernier_depot', 'F');
5124 $form->setBloc('date_limite', 'D', '', 'interligne');
5125 $form->setBloc('date_limite_incompletude', 'F');
5126 $form->setBloc('date_limite_incompletude', 'F');
5127 // Col 2
5128 $form->setBloc('etat', 'D', '', 'col_6');
5129 $form->setBloc('etat', 'D');
5130 $form->setBloc('etat', 'F');
5131 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5132 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5133 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5134 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5135 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5136 // Fieldset "Décision"
5137 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5138 $form->setFieldset('date_conformite','F',''); // Fin Décision
5139 $form->setFieldset('date_conformite','F','');
5140 $form->setBloc('date_conformite', 'F'); // Fin Instruction
5141
5142 // Fieldset "Localisation"
5143 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5144 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5145 // Col 1
5146 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5147 $form->setBloc('terrain_references_cadastrales', 'F');
5148 // Col 2
5149 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5150 $form->setBloc('terrain_superficie', 'F');
5151 $form->setFieldset('terrain_superficie', 'F', '');
5152 $form->setBloc('terrain_superficie', 'F');
5153
5154 // Fieldset "Demandeurs"
5155 // → cf. formSpecificContent()
5156 }
5157 }
5158
5159 /**
5160 * Permet de retourner si le dossier est incomplet notifié
5161 *
5162 * @return boolean true si incomplet notifié
5163 */
5164 function is_incomplet_notifie() {
5165 // Si le dossier est défini en tant qu'incomplet notifie
5166 if($this->getVal('incomplet_notifie') == 't' AND
5167 $this->getVal('incompletude') == 't') {
5168 return true;
5169 }
5170 return false;
5171 }
5172
5173
5174 /**
5175 * Vérifie que le dossier d'instruction en cours ne soit pas instruit.
5176 * Ne sont pas compté comme instruit les dossiers n'ayant que des événements
5177 * d'instruction de type 'affichage'.
5178 *
5179 * @return boolean
5180 */
5181 function has_only_recepisse() {
5182
5183 // Récupère la liste des instructions du dossier
5184 $list_instructions = $this->get_list_instructions(true);
5185
5186 // Si le dossier a pour seule instruction le récépissé de la demande
5187 if (count($list_instructions) === 1
5188 && $list_instructions[0] === $this->get_demande_instruction_recepisse()) {
5189 //
5190 return true;
5191 }
5192
5193 //
5194 return false;
5195 }
5196
5197
5198 /**
5199 * TRIGGER - triggerajouterapres.
5200 *
5201 * - Interface avec le référentiel ERP [108]
5202 * - Gestion des données techniques liées
5203 * - Mise à jour du DA
5204 * - Gestion des références cadastrales / parcelles liées
5205 *
5206 * @return boolean
5207 */
5208 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5209 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5210
5211 /**
5212 * Interface avec le référentiel ERP.
5213 *
5214 * (WS->ERP)[108] Dépôt de dossier DAT -> AT
5215 * Déclencheur :
5216 * - L'option ERP est activée
5217 * - Validation du formulaire d'ajout d'une demande de nouveau dossier
5218 * de type AT
5219 */
5220 //
5221 if ($this->f->is_option_referentiel_erp_enabled($this->valF['om_collectivite']) === true
5222 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')) {
5223 //
5224 $infos = array(
5225 "dossier_instruction" => $this->valF['dossier'],
5226 );
5227 //
5228 $ret = $this->f->send_message_to_referentiel_erp(108, $infos);
5229 if ($ret !== true) {
5230 $this->cleanMessage();
5231 $this->addToMessage(_("Une erreur s'est produite lors de la notification (108) du référentiel ERP. Contactez votre administrateur."));
5232 return false;
5233 }
5234 $this->addToMessage(_("Notification (108) du référentiel ERP OK."));
5235 }
5236
5237 /**
5238 * Gestion des données techniques liées.
5239 */
5240 // On ajoute les données techniques
5241 if ($this->ajoutDonneesTechniquesDI($id, $val) === false) {
5242 //
5243 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5244 $this->correct = false;
5245 return false;
5246 }
5247
5248 /**
5249 * Mise à jour des données du DA.
5250 */
5251 //
5252 $inst_da = $this->get_inst_dossier_autorisation($this->valF["dossier_autorisation"]);
5253 //
5254 $params = array(
5255 'di_id' => $this->valF[$this->clePrimaire],
5256 );
5257 if ($inst_da->majDossierAutorisation($params) === false) {
5258 //
5259 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5260 $this->correct = false;
5261 return false;
5262 }
5263
5264 /**
5265 * Gestion des références cadastrales / parcelles liées.
5266 */
5267 // Si le champ des références cadastrales n'est pas vide
5268 if ($this->valF['terrain_references_cadastrales'] != '') {
5269 // Ajout des parcelles dans la table dossier_parcelle
5270 $this->ajouter_dossier_parcelle(
5271 $this->valF['dossier'],
5272 $this->valF['terrain_references_cadastrales']
5273 );
5274 }
5275
5276 /**
5277 * Notification de l'éventuelle autorisation contestée
5278 */
5279 if ($this->valF['autorisation_contestee'] !== null) {
5280 // Instancie la classe dossier_message
5281 $dossier_message = $this->get_inst_dossier_message(']');
5282 // Ajoute le message de notification
5283 $dossier_message_val = array(
5284 'dossier' => $this->valF['autorisation_contestee'],
5285 'type' => __('Autorisation contestée'),
5286 'emetteur' => $this->f->get_connected_user_login_name(),
5287 'login' => $_SESSION['login'],
5288 'date_emission' => date('Y-m-d H:i:s'),
5289 'contenu' => sprintf(
5290 __('Cette autorisation a été contestée par le recours %s.'),
5291 $this->valF['dossier']
5292 )
5293 );
5294 // Si une erreur se produit lors de l'ajout
5295 if ($dossier_message->add_notification_message($dossier_message_val, false, true) !== true) {
5296 // Message d'erreur affiché à l'utilisateur
5297 $this->addToMessage(_("L'autorisation contestée n'a pas pu être notifiée du recours."));
5298 $this->correct = false;
5299 return false;
5300 }
5301 }
5302 // Gestion dossier operateur liées.
5303 //
5304 // En mode service consulté, on ajoute suite à la création du dossier un
5305 // élément dans la table dossier_operateur qui permettra par la suite d'effectuer
5306 // la désignation de l'opérateur
5307 if ($this->f->is_option_mode_service_consulte_enabled() === true) {
5308 // On ajoute le dossier opérateur
5309 if ($this->ajoutDossierOperateurDI($id, $val) === false) {
5310
5311 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5312 $this->correct = false;
5313 return false;
5314 }
5315 }
5316
5317 /**
5318 * Gestion des tâches pour la dématérialisation
5319 */
5320 //
5321 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
5322 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible') {
5323
5324 // Gérer l'ajout du DA si pas lié à un objet plat'au
5325 $inst_lien = $this->f->get_inst__om_dbform(array(
5326 "obj" => "lien_id_interne_uid_externe",
5327 "idx" => ']',
5328 ));
5329 $is_exists = $inst_lien->is_exists('dossier_autorisation', $inst_da->getVal('dossier_autorisation'));
5330 if (! $is_exists) {
5331 $inst_task = $this->f->get_inst__om_dbform(array(
5332 "obj" => "task",
5333 "idx" => 0,
5334 ));
5335 $task_val = array(
5336 'type' => 'creation_DA',
5337 'object_id' => $inst_da->getVal('dossier_autorisation'),
5338 'dossier' => $inst_da->getVal('dossier_autorisation'),
5339 );
5340
5341 $add_task = $inst_task->add_task(array('val' => $task_val));
5342 if ($add_task === false) {
5343 $this->addToMessage(sprintf('%s %s',
5344 __("Une erreur s'est produite lors de la création tâche."),
5345 __("Veuillez contacter votre administrateur.")
5346 ));
5347 $this->correct = false;
5348 return false;
5349 }
5350 }
5351 //
5352 if (isset($val['source_depot']) === false || $val['source_depot'] !== PLATAU) {
5353 $inst_task = $this->f->get_inst__om_dbform(array(
5354 "obj" => "task",
5355 "idx" => 0,
5356 ));
5357 $task_val = array(
5358 'type' => 'creation_DI',
5359 'object_id' => $id,
5360 'dossier' => $id,
5361 );
5362
5363 if ($this->f->is_option_mode_service_consulte_enabled() === false
5364 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5365 $task_val['state'] = $inst_task::STATUS_DRAFT;
5366 }
5367
5368 $add_task = $inst_task->add_task(array('val' => $task_val));
5369 if ($add_task === false) {
5370 $this->addToMessage(sprintf('%s %s',
5371 __("Une erreur s'est produite lors de la création tâche."),
5372 __("Veuillez contacter votre administrateur.")
5373 ));
5374 $this->correct = false;
5375 return false;
5376 }
5377 }
5378 if (isset($val['source_depot']) === true && $val['source_depot'] == PLATAU) {
5379 //
5380 $inst_task = $this->f->get_inst__om_dbform(array(
5381 "obj" => "task",
5382 "idx" => 0,
5383 ));
5384 $task_val = array(
5385 'type' => 'modification_DI',
5386 'object_id' => $id,
5387 'dossier' => $id,
5388 );
5389 $add_task = $inst_task->add_task(array('val' => $task_val));
5390 if ($add_task === false) {
5391 $this->addToMessage(sprintf('%s %s',
5392 __("Une erreur s'est produite lors de la création tâche."),
5393 __("Veuillez contacter votre administrateur.")
5394 ));
5395 $this->correct = false;
5396 return false;
5397 }
5398 }
5399 //
5400 $inst_task = $this->f->get_inst__om_dbform(array(
5401 "obj" => "task",
5402 "idx" => 0,
5403 ));
5404 $task_val = array(
5405 'type' => 'depot_DI',
5406 'object_id' => $id,
5407 'dossier' => $id,
5408 );
5409 // Change l'état de la tâche de notification en fonction de l'état de
5410 // transmission du dossier d'instruction
5411 if ($this->f->is_option_mode_service_consulte_enabled() === false
5412 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5413 //
5414 $task_val['state'] = $inst_task::STATUS_DRAFT;
5415 }
5416 $add_task = $inst_task->add_task(array('val' => $task_val));
5417 if ($add_task === false) {
5418 $this->addToMessage(sprintf('%s %s',
5419 __("Une erreur s'est produite lors de la création tâche."),
5420 __("Veuillez contacter votre administrateur.")
5421 ));
5422 $this->correct = false;
5423 return false;
5424 }
5425 }
5426 //
5427 return true;
5428 }
5429
5430 /**
5431 * Permet de vérifier que les champs requis pour platau ont été saisis
5432 * et si oui mettre à jour le statut des taches à new
5433 *
5434 * @param string $dossier L'identifiant du dossier.
5435 * @param string $add_or_update Permet de déterminer si on est en ajout ou en modification
5436 *
5437 * @return bool true|false
5438 */
5439 function trigger_platau_required_fields($dossier) {
5440 // Vérification des champs Plat'AU requis pour transmission
5441 $is_required_fields_fulfilled = $this->check_platau_required_fields($dossier);
5442
5443 // On récupère l'identifiant du dossier d'autorisation en fonction
5444 // de si on est en ajout ou en modification
5445 $dossier_autorisation = $this->getVal('dossier_autorisation') != "" ? $this->getVal('dossier_autorisation') : $this->valF['dossier_autorisation'];
5446
5447 $inst_task = $this->f->get_inst__om_dbform(array(
5448 "obj" => "task",
5449 "idx" => 0,
5450 ));
5451
5452 // Si les champs requis sont saisis on met à jour le flag
5453 // etat_transmission_platau à transmissible pour indiquer
5454 // que le dossier peut être transmis à Plat'AU et on met
5455 // l'état des tâches draft en new
5456 if ($is_required_fields_fulfilled['is_ok']) {
5457 $modif_task = false;
5458 if ($inst_task->task_exists('creation_DI', $dossier) === false) {
5459 $modif_task = true;
5460 }
5461
5462 // Valeurs à mettre à jour
5463 $valF = array();
5464 $valF['etat_transmission_platau'] = 'transmissible';
5465
5466 // Met à jour le quartier du dossier
5467 $cle = " dossier='".$dossier."'";
5468 $res = $this->f->db->autoExecute(
5469 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
5470 $this->addToLog(__METHOD__."(): db->autoexecute(\""
5471 .DB_PREFIXE."dossier\", ".print_r($valF, true)
5472 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
5473 if ($this->f->isDatabaseError($res, true)) {
5474 return false;
5475 }
5476 $this->update_task_state($dossier, 'draft', 'new', $dossier_autorisation, $modif_task);
5477 }
5478 // Si les champs requis ne sont pas saisis on marque
5479 // le dossier comme non transmissible ou transmis mais non transmissible
5480 // et on met l'état des tâches new en draft
5481 if (! $is_required_fields_fulfilled['is_ok']) {
5482 $valF = array();
5483 if ($inst_task->task_exists('creation_DI', $dossier)) {
5484 $valF['etat_transmission_platau'] = 'non_transmissible';
5485 $modif_task = false;
5486 } else {
5487 $valF['etat_transmission_platau'] = 'transmis_mais_non_transmissible';
5488 $modif_task = true;
5489 }
5490
5491 // Met à jour le quartier du dossier
5492 $cle = " dossier='".$dossier."'";
5493 $res = $this->f->db->autoExecute(
5494 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
5495 $this->addToLog(__METHOD__."(): db->autoexecute(\""
5496 .DB_PREFIXE."dossier\", ".print_r($valF, true)
5497 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
5498 if ($this->f->isDatabaseError($res, true)) {
5499 return false;
5500 }
5501 $this->update_task_state($dossier, 'new', 'draft', $dossier_autorisation, $modif_task);
5502 }
5503
5504 return true;
5505 }
5506
5507 /**
5508 * TODO: replace with '$this->f->findObjectById' ?
5509 *
5510 * Récupère l'instance de dossier message.
5511 *
5512 * @param string $dossier_message Identifiant du message.
5513 *
5514 * @return object
5515 */
5516 private function get_inst_dossier_message($dossier_message = null) {
5517 //
5518 return $this->get_inst_common("dossier_message", $dossier_message);
5519 }
5520
5521 /**
5522 * Récupère l'identifiant du quartier et de l'arrondissement depuis le code
5523 * impôt.
5524 *
5525 * @param string $code_impots Code impôt du quartier
5526 *
5527 * @return array
5528 */
5529 public function get_quartier_arrondissement_by_code_impot($code_impot) {
5530 if (empty($code_impot) === true) {
5531 return null;
5532 }
5533 $query = sprintf('
5534 SELECT
5535 quartier,
5536 arrondissement
5537 FROM
5538 %1$squartier
5539 WHERE
5540 code_impots = \'%2$s\'',
5541 DB_PREFIXE,
5542 $code_impot
5543 );
5544 $res = $this->f->get_all_results_from_db_query(
5545 $query,
5546 array(
5547 "origin" => __METHOD__,
5548 "force_return" => true,
5549 )
5550 );
5551 if ($res['code'] !== 'KO' &&
5552 count($res['result']) > 0) {
5553 //
5554 return $res['result'][0];
5555 }
5556 return null;
5557 }
5558
5559 /**
5560 * Retourne l'intructeur correspondant le mieux à la parcelle.
5561 *
5562 * @param int $quartier le numéro de quartier
5563 * @param int $arrondissement le numéro d'arrondissement
5564 * @param string $section la section
5565 * @param int $dadt le type détaillé de dossier d'autorisation
5566 * @param int $collectivite l'identifiant de la collectivité
5567 * @param int $commune_id l'identifiant de la commune (optionel)
5568 * @param int $demande_type l'identifiant du type de demande (optionel)
5569 * @param string $instructeurColumn l'identifiant de la colonne en BDD de l'instructeur (optionel)
5570 *
5571 * @return array contenant l'instructeur, et éventuellement sa division
5572 */
5573 public function getInstructeurDivision (
5574 int $quartier, int $arrondissement, $section,
5575 int $dadt, int $collectivite, int $commune_id = 0, int $demande_type = 0,
5576 string $instructeurColumn = 'instructeur') : array {
5577
5578 $instrAndDiv = array();
5579
5580 // requête de récupération de l'instructeur à affecter
5581 // (exclu les affectations manuelles supposées avoir été utilisées avant)
5582 $sql = sprintf("
5583 SELECT
5584 %1\$s, section, quartier, arrondissement, dossier_autorisation_type_detaille, dossier_instruction_type
5585 FROM
5586 ".DB_PREFIXE."affectation_automatique AS AA
5587 WHERE
5588 (AA.affectation_manuelle IS NULL OR AA.affectation_manuelle = '')
5589 AND AA.%1\$s IS NOT NULL
5590 ",
5591 $this->f->db->quoteIdentifier($instructeurColumn)
5592 );
5593
5594 // si l'identifiant de la demande_type est spécifié
5595 $dit = null;
5596 if (empty($demande_type) === false && $demande_type !== 0) {
5597 $demande_type_inst = $this->f->get_inst__om_dbform(array(
5598 "obj" => "demande_type",
5599 "idx" => $demande_type,
5600 ));
5601 $dit = $demande_type_inst->getVal('dossier_instruction_type');
5602 }
5603
5604 // ajoute les conditions SQL correspondantes aux paramètres de filtrage
5605 foreach(array(
5606 'om_collectivite ' => $collectivite,
5607 'dossier_autorisation_type_detaille' => $dadt,
5608 'dossier_instruction_type' => $dit,
5609 'quartier' => $quartier,
5610 'arrondissement' => $arrondissement,
5611 'section' => $section
5612 ) as $column => $value) {
5613 if (empty($value) === false) {
5614 $valType = 'd'; // int
5615 if ($column == 'section') {
5616 $valType = 's'; // string
5617 $value = $this->f->db->escapeSimple($value);
5618 }
5619 $sql .= sprintf(" AND (AA.$column IS NULL OR AA.$column = '%$valType') ",
5620 $value);
5621 }
5622 }
5623 if (!empty($commune_id) && $this->f->is_option_dossier_commune_enabled()) {
5624 $commune = $this->f->findObjectById('commune', $commune_id);
5625 if (!empty($commune)) {
5626 $code_departement = $commune->getVal('dep');
5627 $code_commune = preg_replace('/^'.$code_departement.'/', '', $commune->getVal('com'));
5628 $sql .= sprintf(
5629 " AND (AA.communes IS NULL OR AA.communes ~ '%s') ",
5630 "(^|,)$code_departement($code_commune)?(,|$)");
5631 }
5632 else {
5633 $this->addToLog(__METHOD__."(): commune '$commune_id' non trouvée", DEBUG_MODE);
5634 }
5635 }
5636
5637 // ordonnancement et limite à un seul résultat
5638 $sql .= sprintf("
5639 ORDER BY
5640 communes %s,
5641 section %s,
5642 quartier %s,
5643 arrondissement %s,
5644 dossier_instruction_type %s,
5645 dossier_autorisation_type_detaille %s
5646 LIMIT 1
5647 ",
5648 // on positionne les valeurs NULL en premier si le filtre sur ce champ n'a pas été saisi
5649 $commune_id === 0 ? 'NULLS FIRST' : '',
5650 empty($section) === true ? 'NULLS FIRST' : '',
5651 $quartier === 0 ? 'NULLS FIRST' : '',
5652 $arrondissement === 0 ? 'NULLS FIRST' : '',
5653 $dit === 0 ? 'NULLS FIRST' : '',
5654 $dadt === 0 ? 'NULLS FIRST' : ''
5655 );
5656
5657 // exécution de la requête
5658 $this->addToLog(__METHOD__."() : db->query(\"$sql\")", VERBOSE_MODE);
5659 $res = $this->f->db->query($sql);
5660 $this->f->isDatabaseError($res);
5661
5662 // si on a récupéré un instructeur correspondant aux critères
5663 if ($res->numRows() > 0) {
5664
5665 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
5666
5667 // récupère sa division
5668 $sql = sprintf(
5669 "SELECT division FROM ".DB_PREFIXE."instructeur WHERE instructeur = '%d'",
5670 intval($row[$instructeurColumn])
5671 );
5672 $this->addToLog(__METHOD__."() : db->getOne(\"$sql\")", VERBOSE_MODE);
5673 $divisionId = $this->f->db->getOne($sql);
5674 $this->f->isDatabaseError($divisionId);
5675
5676 // s'il a une division, retourne l'instructeur et sa division
5677 if (empty($divisionId === false)) {
5678 return array(
5679 'instructeur' => $row[$instructeurColumn],
5680 'division' => $divisionId,
5681 );
5682 }
5683
5684 // aucune division trouvée, retour uniquement l'instructeur
5685 return array('instructeur' => $row[$instructeurColumn]);
5686 }
5687
5688 return $instrAndDiv;
5689 }
5690
5691 /**
5692 * Récupère le type détaillé d'une dossier d'autorisation.
5693 *
5694 * @param integer $dossier_autorisation DA
5695 *
5696 * @return mixed
5697 */
5698 function get_dossier_autorisation_da_type_detaille($dossier_autorisation) {
5699
5700 //
5701 $resDATD = "";
5702
5703 //Récupération du dossier_autorisation_type_detaille concerné par le
5704 //$dossier_autorisation
5705 $sql = "
5706 SELECT
5707 dossier_autorisation_type_detaille
5708 FROM
5709 ".DB_PREFIXE."dossier_autorisation
5710 WHERE
5711 dossier_autorisation = '$dossier_autorisation'";
5712 $this->addToLog(__METHOD__." : db->query(\"$sql\")", VERBOSE_MODE);
5713 $resDATD = $this->f->db->getOne($sql);
5714 $this->f->isDatabaseError($resDATD);
5715
5716 //
5717 return $resDATD;
5718 }
5719
5720 /**
5721 * Cette méthode permet de gérer l'affectation du dossier.
5722 * Deux cas sont gérées :
5723 * - l'affectation a été sélectionnée par l'utilisateur
5724 * - l'affectation est réalisé automatiquement
5725 *
5726 * Renvoie un tableau associatif contenant l'instructeur, la division et
5727 * l'instructeur secondaire du dossier.
5728 *
5729 * Ex : array(
5730 * 'instructeur' => id_instructeur,
5731 * 'instructeur_2' => id_instructeur_2,
5732 * 'division' => id_division
5733 * )
5734 *
5735 * @param array valeurs récupérées à l'ajout du dossier
5736 * @return array tableau contenant l'affectation du dossier
5737 */
5738 protected function affectation_dossier($val) {
5739 $affectation = array(
5740 'instructeur' => null,
5741 'instructeur_2' => null,
5742 'division' => null,
5743 );
5744 // Cas 1 : Vérifie si une valeur d'affectation automatique
5745 // existe. Si c'est le cas c'est que l'affectation a été choisie
5746 // par l'utilisateur.
5747 // Il s'agit donc d'une affectation manuelle
5748 if (empty($val['affectation_automatique']) === false) {
5749 // Récupération de l'affectation automatique correspondante
5750 $idAffectationAuto = intval($val['affectation_automatique']);
5751 // Préparation des logs
5752 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5753 "non trouvée";
5754 $logMsgMode = DEBUG_MODE;
5755
5756 $affectationAuto = $this->f->get_inst__om_dbform(array(
5757 "obj" => "affectation_automatique",
5758 "idx" => $idAffectationAuto
5759 ));
5760 // Vérifie que l'affectation automatique a été correctement récupérée en regardant
5761 // si l'objet instancié a un identifiant non null
5762 if (empty($affectationAuto->getVal($affectationAuto->clePrimaire)) === false) {
5763 // log si l'instructeur n'est pas défini
5764 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5765 "pas d'instructeur défini";
5766 // On cherche maintenant à récupérer l'instructeur principal visé par cette affectation
5767 // et sa division
5768 $instructeurId = $affectationAuto->getVal('instructeur');
5769 if (! empty($instructeurId)) {
5770 // log si l'instructeur n'existe pas
5771 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5772 "instructeur '$instructeurId' non trouvé";
5773 // De la même manière que pour l'affectation automatique on instancie
5774 // l'instructeur avec l'identifiant issus de l'affectation et on vérifie
5775 // si l'instructeur a bien été récupéré.
5776 $instructeur = $this->f->get_inst__om_dbform(array(
5777 "obj" => "instructeur",
5778 "idx" => intval($instructeurId)
5779 ));
5780 if (empty($instructeur->getVal($instructeur->clePrimaire)) === false) {
5781 // Récupération de l'identifiant et de la division de l'instructeur principal
5782 $affectation['instructeur'] = $instructeurId;
5783 $affectation['division'] = $instructeur->getVal('division');
5784
5785 // log le succès
5786 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5787 "instructeur [".$affectation['instructeur']."] ".
5788 "'".$instructeur->getVal('nom')."' affecté, avec sa division ".
5789 "'".$affectation['division']."'";
5790 $logMsgMode = EXTRA_VERBOSE_MODE;
5791 }
5792 }
5793 // Affichage des log de la récupération de l'instructeur principal et de sa division
5794 $this->addToLog($logMsg, $logMsgMode);
5795
5796 // Si l'affectation donne aussi un instructeur secondaire on le récupère
5797 $instructeur2Id = $affectationAuto->getVal('instructeur_2');
5798 // log si aucun instructeur secondaire est défini
5799 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5800 "pas de second instructeur défini";
5801 $logMsgMode = EXTRA_VERBOSE_MODE;
5802 if (empty($instructeur2Id) === false) {
5803 // log si l'instructeur n'existe pas
5804 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5805 "second instructeur '$instructeur2Id' non trouvé";
5806 $logMsgMode = DEBUG_MODE;
5807 // Instancie l'instructeur secondaire et vérifie si il a bien été récupéré
5808 $instructeur2 = $this->f->get_inst__om_dbform(array(
5809 "obj" => "instructeur",
5810 "idx" => intval($instructeur2Id)
5811 ));
5812 if (empty($instructeur2) === false) {
5813 // Récupération de l'identifiant l'instructeur secondaire
5814 $affectation['instructeur_2'] = $instructeur2Id;
5815
5816 // log le succès
5817 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
5818 "second instructeur [".$affectation['instructeur_2']."] ".
5819 "'".$instructeur2->getVal('nom')."' affecté";
5820 $logMsgMode = EXTRA_VERBOSE_MODE;
5821 }
5822 }
5823 // Affichage des log de la récupération de l'instructeur secondaire
5824 $this->addToLog($logMsg, $logMsgMode);
5825
5826 // succès : plus rien à logger
5827 $logMsg = null;
5828 $logMsgMode = null;
5829 }
5830
5831 // affectation automatique inexistante
5832 if (empty($logMsg) === false && empty($logMsgMode) === false) {
5833 $this->addToLog($logMsg, $logMsgMode);
5834 }
5835 }
5836
5837
5838 // Cas 2 : Si aucune affectation automatique n'a été choisi alors on cherche la plus adaptée
5839
5840 // si l'instructeur n'a pas déjà été récupéré et si on a pas de numéro de dossier d'autorisation
5841 // alors l'affectation ne pourra pas être effectué sur ce dossier
5842 if (empty($affectation['instructeur']) === true
5843 && empty($val['dossier_autorisation']) === false) {
5844
5845 // Sinon on récupère le type détaillé du DA
5846 $dadt = $this->get_dossier_autorisation_da_type_detaille($val['dossier_autorisation']);
5847
5848 // si la commune est spécifiée
5849 $commune_id = 0;
5850 if (isset($val['commune']) && $this->f->is_option_dossier_commune_enabled()) {
5851 $commune_id = $val['commune'];
5852 }
5853
5854 // récupération de l'instructeur ainsi que de sa division
5855 $instructeurDivision = $this->getInstructeurDivision(
5856 intval($val['quartier']),
5857 intval($val['arrondissement']),
5858 $val['section'],
5859 intval($dadt),
5860 intval($val['om_collectivite']),
5861 intval($commune_id),
5862 intval($val['demande_type'])
5863 );
5864
5865 if (! empty($instructeurDivision['instructeur']) === true &&
5866 ! empty($instructeurDivision['division']) === true) {
5867 $affectation['instructeur'] = $instructeurDivision['instructeur'];
5868 $affectation['division'] = $instructeurDivision['division'];
5869 }
5870
5871 // récupération de l'instructeur secondaire
5872 $instr2 = $this->getInstructeurDivision(
5873 intval($val['quartier']),
5874 intval($val['arrondissement']),
5875 $val['section'],
5876 intval($dadt),
5877 intval($val['om_collectivite']),
5878 intval($commune_id),
5879 intval($val['demande_type']),
5880 'instructeur_2'
5881 );
5882 if (isset($instr2['instructeur']) === true) {
5883 $affectation['instructeur_2'] = $instr2['instructeur'];
5884 }
5885 }
5886
5887 // Préviens l'utilisateur si l'affectation du dossier n'a pas pu être réalisée.
5888 if (empty($affectation['instructeur']) === true) {
5889 $affMsg = "<br/> "._("Aucun instructeur compatible avec ce dossier trouve, ".
5890 "contactez votre administrateur afin d'en assigner un ".
5891 "a ce dossier.")." <br/>";
5892
5893 if ($this->f->isAccredited("dossier_modifier_instructeur") === true) {
5894 $affMsg = "<br/> "._("Pensez a assigner un instructeur a ce dossier.")." <br/>";
5895 }
5896 $this->addToMessage($affMsg);
5897 }
5898
5899 return $affectation;
5900 }
5901
5902 /**
5903 * TRIGGER - triggermodifierapres.
5904 *
5905 * - Interface avec le référentiel ERP [101]
5906 * - Interface avec le référentiel ERP [102][103]
5907 * - Interface avec le référentiel ERP [114]
5908 * - Gestion des demandeurs liés
5909 * - Gestion des références cadastrales / parcelles liées
5910 * - Gestion des taxes
5911 *
5912 * @return boolean
5913 */
5914 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5915 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5916
5917 // Mise à jour DA si miroir du DI
5918 $inst_da = $this->get_inst_dossier_autorisation($this->getVal('dossier_autorisation'));
5919 if ($inst_da->is_dossier_autorisation_visible() === false) {
5920 $params = array(
5921 'di_id' => $this->getVal($this->clePrimaire),
5922 );
5923 if ($inst_da->majDossierAutorisation($params) === false) {
5924 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5925 return false;
5926 }
5927 }
5928
5929 /**
5930 * Interface avec le référentiel ERP.
5931 *
5932 * (WS->ERP)[101] ERP Qualifié -> AT
5933 * Déclencheur :
5934 * - L'option ERP est activée
5935 * - Le dossier est de type AT
5936 * - Le dossier est marqué comme "connecté au référentiel ERP"
5937 * - Le formulaire de modification du dossier est validé avec le
5938 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
5939 * "OUI"
5940 */
5941 //
5942 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
5943 && $this->is_connected_to_referentiel_erp() === true
5944 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')
5945 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false) {
5946 // Récupère la liste des contraintes
5947 $contraintes_plu_list = $this->getListContrainte($this->valF['dossier'], false);
5948 // Extrait les libellés de chaque contraintes
5949 $contraintes_plu = array();
5950 $contraintes_plu_string = "";
5951 while ($row =& $contraintes_plu_list->fetchRow(DB_FETCHMODE_ASSOC)) {
5952 //
5953 $contraintes_plu[] = $row['contrainte_libelle'];
5954 }
5955 // Chaîne de caractère listant toutes les contraintes du dossier
5956 $contraintes_plu_string = implode(' ; ', $contraintes_plu);
5957 $competence = "";
5958 if ($this->valF['autorite_competente'] !== null) {
5959 $inst_ac = $this->get_inst_autorite_competente($this->valF['autorite_competente']);
5960 $competence = $inst_ac->getVal("libelle");
5961 }
5962 //
5963 $infos = array(
5964 "dossier_instruction" => $this->valF['dossier'],
5965 "competence" => $competence,
5966 "contraintes_plu" => $contraintes_plu_string,
5967 "references_cadastrales" => $this->getReferenceCadastrale($this->valF['dossier']),
5968 );
5969 //
5970 $ret = $this->f->send_message_to_referentiel_erp(101, $infos);
5971 if ($ret !== true) {
5972 $this->cleanMessage();
5973 $this->addToMessage(_("Une erreur s'est produite lors de la notification (101) du référentiel ERP. Contactez votre administrateur."));
5974 return false;
5975 }
5976 $this->addToMessage(_("Notification (101) du référentiel ERP OK."));
5977 }
5978
5979 /**
5980 * Interface avec le référentiel ERP.
5981 *
5982 * (WS->ERP)[102] Demande de complétude de dossier PC pour un ERP -> PC qui concerne un ERP
5983 * (WS->ERP)[103] Demande de qualification de dossier PC pour un ERP -> PC qui concerne un ERP
5984 * Déclencheur :
5985 * - L'option ERP est activée
5986 * - Le dossier est de type PC
5987 * - Le formulaire de modification du dossier est validé avec le
5988 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
5989 * "OUI"
5990 * - Le formulaire de modification du dossier est validé avec le
5991 * marqueur "ERP" à "OUI"
5992 */
5993 //
5994 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
5995 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
5996 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
5997 && $this->valF['erp'] == true) {
5998 //
5999 $infos = array(
6000 "dossier_instruction" => $this->valF['dossier'],
6001 );
6002 // [102] Demande de complétude de dossier PC pour un ERP
6003 $ret = $this->f->send_message_to_referentiel_erp(102, $infos);
6004 if ($ret !== true) {
6005 $this->cleanMessage();
6006 $this->addToMessage(_("Une erreur s'est produite lors de la notification (102) du référentiel ERP. Contactez votre administrateur."));
6007 return false;
6008 }
6009 $this->addToMessage(_("Notification (102) du référentiel ERP OK."));
6010 // [103] Demande de qualification de dossier PC pour un ERP
6011 $ret = $this->f->send_message_to_referentiel_erp(103, $infos);
6012 if ($ret !== true) {
6013 $this->cleanMessage();
6014 $this->addToMessage(_("Une erreur s'est produite lors de la notification (103) du référentiel ERP. Contactez votre administrateur."));
6015 return false;
6016 }
6017 $this->addToMessage(_("Notification (103) du référentiel ERP OK."));
6018 }
6019
6020 /**
6021 * Interface avec le référentiel ERP.
6022 *
6023 * (WS->ERP)[114] ERP Qualifié -> PC
6024 * Déclencheur :
6025 * - l'option ERP est activée
6026 * - ET le dossier est marqué comme "connecté au référentiel ERP"
6027 * - ET le dossier est de type PC
6028 * - ET
6029 * - soit le formulaire de modification du dossier est validé avec le
6030 * marqueur "enjeu_urba" qui change de statut
6031 * - soit ce marqueur est vrai et le dossier passe à qualifié
6032 */
6033 // Étant donné que l'objet a été modifié en base après sa création,
6034 // il faut le ré-instancier pour récupérer ses informations.
6035 $dossier = $this->f->get_inst__om_dbform(array(
6036 "obj" => "dossier",
6037 "idx" => $this->valF['dossier'],
6038 ));
6039 if ($dossier->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6040 && $dossier->is_connected_to_referentiel_erp() === true
6041 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
6042 && (($this->getVal('enjeu_urba') == 't') != $this->valF['enjeu_urba']
6043 || ($this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
6044 && $this->getVal('enjeu_urba') == 't'))) {
6045
6046 $enjeu = "non";
6047 if ($this->valF['enjeu_urba']) {
6048 $enjeu = "oui";
6049 }
6050
6051 $infos = array(
6052 "dossier_instruction" => $this->valF['dossier'],
6053 "Dossier à enjeu ADS" => $enjeu
6054 );
6055 //
6056 $ret = $this->f->send_message_to_referentiel_erp(114, $infos);
6057 if ($ret !== true) {
6058 $this->cleanMessage();
6059 $this->addToMessage(_("Une erreur s'est produite lors de la notification (114) du référentiel ERP. Contactez votre administrateur."));
6060 return false;
6061 }
6062 $this->addToMessage(_("Notification (114) du référentiel ERP OK."));
6063 }
6064
6065 /**
6066 * Gestion des demandeurs liés.
6067 */
6068 // Ajout ou modification des demandeurs
6069 $this->insertLinkDossierDemandeur();
6070
6071 /**
6072 * Gestion des références cadastrales / parcelles liées.
6073 */
6074 // Si le champ des références cadastrales n'est pas vide
6075 if ($this->getVal('terrain_references_cadastrales')
6076 != $this->valF['terrain_references_cadastrales']) {
6077
6078 // On supprime toutes les lignes de la table dossier_parcelle qui
6079 // font référence le dossier en cours de modification
6080 $this->supprimer_dossier_parcelle($val['dossier']);
6081
6082 // Ajout des parcelles dans la table dossier_parcelle
6083 $this->ajouter_dossier_parcelle($val['dossier'],
6084 $val['terrain_references_cadastrales']);
6085
6086 }
6087
6088 /**
6089 * Gestion des taxes.
6090 */
6091 // Si le champ tax_secteur est modifié et que l'option de simulation des
6092 // taxes est activée
6093 if ($this->getVal('tax_secteur') != $this->valF['tax_secteur']
6094 && $this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true) {
6095
6096 // Valeurs pour le calcul de la taxe d'aménagement
6097 $values = array();
6098 // Instance de la classe donnees_techniques
6099 $donnees_techniques = $this->get_inst_donnees_techniques();
6100 // Récupère les valeurs des données techniques
6101 $values = $donnees_techniques->get_form_val();
6102
6103 // Met à jour les montants du dossier
6104 $update_dossier_tax_mtn = $this->update_dossier_tax_mtn($this->valF['tax_secteur'], $values);
6105 if ($update_dossier_tax_mtn === false) {
6106 //
6107 $this->addToMessage(_("La mise a jour des montants de la simulation de la taxe d'amenagement a echouee."));
6108 //
6109 return false;
6110 }
6111 }
6112
6113 /**
6114 * Gestion des métadonées des pièces liés.
6115 * Vérifie les méthodes à exécuter configurées dans le connecteur du
6116 * filestorage.
6117 */
6118 //
6119 $ret = $this->post_update_metadata($val);
6120 //
6121 if ($ret === false) {
6122 //
6123 $this->cleanMessage();
6124 $this->addToMessage(_("La mise à jour des métadonnées des pièces liées à ce dossier a échouée."));
6125 return false;
6126 }
6127
6128 /**
6129 * Gestion des du changement de date de dépôt.
6130 * Vérification préalable de la présence de la date et de sa
6131 * modification.
6132 */
6133 //
6134 if (array_key_exists("date_depot", $val) === true) {
6135 //
6136 $inst_new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
6137 $inst_old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
6138 $new_date = $inst_new_date->format('d/m/Y');
6139 $old_date = $inst_old_date->format('d/m/Y');
6140
6141 //
6142 if ($new_date !== $old_date) {
6143 //
6144 $status = $this->update_date_depot($val["date_depot"]);
6145 //
6146 if ($status === false) {
6147 //
6148 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
6149 return false;
6150 }
6151
6152 }
6153 }
6154
6155 /**
6156 * Gestion de la normalisation de l'adresse.
6157 * En cas de modification de l'adresse du terrain, l'adresse normalisée
6158 * est supprimée.
6159 */
6160 $list_address_keys = array(
6161 'terrain_adresse_voie_numero',
6162 'terrain_adresse_voie',
6163 'terrain_adresse_lieu_dit',
6164 'terrain_adresse_localite',
6165 'terrain_adresse_code_postal',
6166 'terrain_adresse_bp',
6167 'terrain_adresse_cedex',
6168 );
6169 $change = false;
6170 foreach ($list_address_keys as $key) {
6171 if (array_key_exists($key, $val) === true
6172 && $val[$key] !== $this->getVal($key)) {
6173 //
6174 $change = true;
6175 break;
6176 }
6177 }
6178 if ($change === true) {
6179 $this->normalize_address();
6180 }
6181
6182 if ($this->f->is_option_mode_service_consulte_enabled() === false
6183 && $this->f->is_type_dossier_platau($this->valF['dossier_autorisation']) === true
6184 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
6185
6186 $trigger_platau_required_fields = $this->trigger_platau_required_fields($this->valF['dossier']);
6187 // Gestion de l'erreur
6188 if (! $trigger_platau_required_fields) {
6189 $this->addToMessage(sprintf('%s %s',
6190 __("Une erreur s'est produite lors de la mise à jour de l'état de transmission du dossier."),
6191 __("Veuillez contacter votre administrateur.")
6192 ));
6193 $this->correct = false;
6194 return false;
6195 }
6196 }
6197
6198 /**
6199 * Gestion des tâches pour la dématérialisation
6200 */
6201 // Qualification du dossier d'instruction
6202 if ($this->getVal('instructeur') != $this->valF['instructeur']
6203 || $this->getVal('division') != $this->valF['division']) {
6204 //
6205 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6206 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6207 && ($this->f->is_option_mode_service_consulte_enabled() !== true
6208 || ($this->f->is_option_mode_service_consulte_enabled() === true
6209 && ($this->get_source_depot_from_demande() === PLATAU
6210 || $this->get_source_depot_from_demande() === PORTAL)))) {
6211 //
6212 $inst_task = $this->f->get_inst__om_dbform(array(
6213 "obj" => "task",
6214 "idx" => 0,
6215 ));
6216 $task_val = array(
6217 'type' => 'qualification_DI',
6218 'object_id' => $id,
6219 'dossier' => $id,
6220 );
6221 if ($this->f->is_option_mode_service_consulte_enabled() === false
6222 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6223 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6224 $task_val['state'] = $inst_task::STATUS_DRAFT;
6225 }
6226 $add_task = $inst_task->add_task(array('val' => $task_val));
6227 if ($add_task === false) {
6228 $this->addToMessage(sprintf('%s %s',
6229 __("Une erreur s'est produite lors de la création tâche."),
6230 __("Veuillez contacter votre administrateur.")
6231 ));
6232 $this->correct = false;
6233 return false;
6234 }
6235 }
6236 }
6237 // Modification du dossier d'instruction
6238 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6239 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6240 && ($this->f->is_option_mode_service_consulte_enabled() !== true
6241 || ($this->f->is_option_mode_service_consulte_enabled() === true
6242 && ($this->get_source_depot_from_demande() === PLATAU
6243 || $this->get_source_depot_from_demande() === PORTAL)))) {
6244 //
6245 $inst_task = $this->f->get_inst__om_dbform(array(
6246 "obj" => "task",
6247 "idx" => 0,
6248 ));
6249 $task_val = array(
6250 'type' => 'modification_DI',
6251 'object_id' => $id,
6252 'dossier' => $id,
6253 );
6254 // Change l'état de la tâche de notification en fonction de l'état de
6255 // transmission du dossier d'instruction
6256 if ($this->f->is_option_mode_service_consulte_enabled() === false
6257 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6258 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6259 //
6260 $task_val['state'] = $inst_task::STATUS_DRAFT;
6261 }
6262 $add_task = $inst_task->add_task(array('val' => $task_val));
6263 if ($add_task === false) {
6264 $this->addToMessage(sprintf('%s %s',
6265 __("Une erreur s'est produite lors de la création tâche."),
6266 __("Veuillez contacter votre administrateur.")
6267 ));
6268 $this->correct = false;
6269 return false;
6270 }
6271 // XXX Les données du DA sont mises à jour seulement lors de l'ajout ou modification
6272 // d'une instruction du DI initial et lors de la décision sur le DI non initial.
6273 // Sachant ce comportement, voir si cette tâche modification_DA est bien située.
6274 // $inst_task = $this->f->get_inst__om_dbform(array(
6275 // "obj" => "task",
6276 // "idx" => 0,
6277 // ));
6278 // $task_val = array(
6279 // 'type' => 'modification_DA',
6280 // 'object_id' => $this->getVal('dossier_autorisation'),
6281 // 'dossier' => $this->getVal('dossier_autorisation'),
6282 // );
6283 // // Change l'état de la tâche de notification en fonction de l'état de
6284 // // transmission du dossier d'instruction
6285 // if ($this->f->is_option_mode_service_consulte_enabled() === false
6286 // && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6287 // || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6288 // //
6289 // $task_val['state'] = $inst_task::STATUS_DRAFT;
6290 // }
6291 // $add_task = $inst_task->add_task(array('val' => $task_val));
6292 // if ($add_task === false) {
6293 // $this->addToMessage(sprintf('%s %s',
6294 // __("Une erreur s'est produite lors de la création tâche."),
6295 // __("Veuillez contacter votre administrateur.")
6296 // ));
6297 // $this->correct = false;
6298 // return false;
6299 // }
6300 }
6301
6302 //
6303 return true;
6304 }
6305
6306 /**
6307 * TRIGGER - triggermodifier.
6308 *
6309 * @return boolean
6310 */
6311 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6312 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6313 // Si la date de dépôt a changé et si elle valait celle du dernier dépôt
6314 // alors cette dernière prend également sa valeur
6315 if ($this->f->formatDate($this->getVal('date_depot')) !== $val['date_depot']
6316 && $this->f->formatDate($this->getVal('date_depot')) === $this->f->formatDate($this->getVal('date_dernier_depot'))) {
6317 $this->valF['date_dernier_depot'] = $this->valF['date_depot'];
6318 }
6319 //
6320 return true;
6321 }
6322
6323 /**
6324 * Methode de traitement suite à la modification de la date de dépot.
6325 *
6326 * @param string $new_date_str Nouvelle date de dépot.
6327 *
6328 * @return boolean
6329 */
6330 function update_date_depot($new_date_str) {
6331 $demande = $this->get_inst_demande();
6332 // TODO: should return null instead of false
6333 if ($demande === false) {
6334 return false;
6335 }
6336
6337 $retour = $this->majDateInstruction($demande->getVal("instruction_recepisse"), $new_date_str);
6338 if ($retour === false) {
6339 return false;
6340 }
6341
6342 $valF = array();
6343 foreach ($demande->champs as $id => $champ) {
6344 $valF[$champ] = $demande->val[$id];
6345 }
6346 $valF['date_demande'] = $new_date_str;
6347 $modification = $demande->modifier($valF);
6348 if ($modification === false) {
6349 return false;
6350 }
6351
6352 $row_date = array("date_demande" => $new_date_str);
6353 $res = $this->f->db->autoExecute(
6354 DB_PREFIXE."dossier",
6355 $row_date,
6356 DB_AUTOQUERY_UPDATE,
6357 "dossier = '".$this->getVal("dossier")."'"
6358 );
6359 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6360 if ($this->f->isDatabaseError($res, true)) {
6361 return false;
6362 }
6363
6364 // Si c'est un dossier d'instruction initial
6365 $di_version = $this->get_dossier_instruction_version();
6366 if ($di_version === 0 || $di_version === '0') {
6367 //
6368 $row_date = array("depot_initial" => $new_date_str);
6369 $res = $this->f->db->autoExecute(
6370 DB_PREFIXE."dossier_autorisation",
6371 $row_date,
6372 DB_AUTOQUERY_UPDATE,
6373 "dossier_autorisation = '" . $this->getVal("dossier_autorisation") . "'"
6374 );
6375 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6376 if ($this->f->isDatabaseError($res, true)) {
6377 return false;
6378 }
6379 }
6380 }
6381
6382
6383 /**
6384 * Met à jour l'instruction en fonction de la nouvelle date
6385 * ou retourne false si il ya une erreur.
6386 *
6387 * @param integer $instruction_id Identifiant de l'instruction.
6388 * @param string $date_depot Nouvelle date de dépôt.
6389 *
6390 * @return boolean
6391 */
6392 public function majDateInstruction($instruction_id, $date_depot) {
6393
6394 // Definalise l'instruction de récépissé si nécessaire
6395 $instruction = $this->f->get_inst__om_dbform(array(
6396 "obj" => "instruction",
6397 "idx" => $instruction_id,
6398 ));
6399 $instruction->setParameter('maj', 110);
6400 //
6401 if ($instruction->is_unfinalizable_without_bypass() === true
6402 && $instruction->unfinalize($instruction->valF) === false) {
6403 return false;
6404 }
6405
6406 // Modifie la date d'événement
6407 $instruction->setParameter('maj', 1);
6408 //
6409 $valF = array();
6410 foreach ($instruction->champs as $id => $champ) {
6411 $valF[$champ] = $instruction->getVal($champ);
6412 }
6413 //
6414 $valF['date_evenement'] = $date_depot;
6415 $valF['date_finalisation_courrier'] = null;
6416 //
6417 $modification = $instruction->modifier($valF);
6418 //
6419 if ($modification === false) {
6420 return false;
6421 }
6422
6423 // Finalise l'instruction
6424 $instruction->setParameter('maj', 100);
6425 if ($instruction->finalize($instruction->valF) === false) {
6426 return false;
6427 }
6428
6429 //
6430 return true;
6431 }
6432
6433 /**
6434 * TODO: replace with '$this->f->findObjectById' ?
6435 *
6436 * Récupère l'instance de l'autorité compétente.
6437 *
6438 * @param string $autorite_competente Identifiant de l'autorité compétente.
6439 *
6440 * @return object
6441 */
6442 function get_inst_autorite_competente($autorite_competente = null) {
6443 //
6444 return $this->get_inst_common("autorite_competente", $autorite_competente);
6445 }
6446
6447
6448 /**
6449 * Met à jour les montants des taxes du dossier d'instruction.
6450 *
6451 * @param integer $tax_secteur Secteur communal.
6452 * @param array $val Valeurs des données techniques.
6453 *
6454 * @return boolean
6455 */
6456 public function update_dossier_tax_mtn($tax_secteur, $val = array()) {
6457 // Instance du paramétrage de la taxe d'aménagement
6458 $taxe_amenagement = $this->get_inst_taxe_amenagement();
6459
6460 // Liste des montants à mettre à jour
6461 $valF = array();
6462 $valF['tax_mtn_part_commu'] = null;
6463 $valF['tax_mtn_part_depart'] = null;
6464 $valF['tax_mtn_part_reg'] = null;
6465 $valF['tax_mtn_total'] = null;
6466 $valF['tax_mtn_rap'] = null;
6467 $valF['tax_mtn_part_commu_sans_exo'] = null;
6468 $valF['tax_mtn_part_depart_sans_exo'] = null;
6469 $valF['tax_mtn_part_reg_sans_exo'] = null;
6470 $valF['tax_mtn_total_sans_exo'] = null;
6471 $valF['tax_mtn_rap_sans_exo'] = null;
6472
6473 // Si le tableau des valeurs n'est pas vide
6474 if ($val !== array()) {
6475
6476 // Si le taux communal est renseigné
6477 if ($taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== null
6478 && $taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== '') {
6479
6480 // Calcul de la TA
6481 $calcul_ta = $taxe_amenagement->compute_ta($tax_secteur, $val);
6482
6483 // Si chaque résultat est calculable
6484 if ($calcul_ta !== null && is_array($calcul_ta) === true) {
6485
6486 // Total des parts de la TA avec exonération
6487 $total_ta = $calcul_ta['commu'] + $calcul_ta['depart'] + $calcul_ta['reg'];
6488 $total_ta_ss_exo = $calcul_ta['commu_ss_exo'] + $calcul_ta['depart_ss_exo'] + $calcul_ta['reg_ss_exo'];
6489
6490 // Valeurs à mettre à jour, les montants doivent être à l'entier
6491 // inférieur
6492 $valF['tax_mtn_part_commu'] = floor($calcul_ta['commu']);
6493 $valF['tax_mtn_part_depart'] = floor($calcul_ta['depart']);
6494 $valF['tax_mtn_part_reg'] = floor($calcul_ta['reg']);
6495 $valF['tax_mtn_total'] = floor($total_ta);
6496 $valF['tax_mtn_part_commu_sans_exo'] = floor($calcul_ta['commu_ss_exo']);
6497 $valF['tax_mtn_part_depart_sans_exo'] = floor($calcul_ta['depart_ss_exo']);
6498 $valF['tax_mtn_part_reg_sans_exo'] = floor($calcul_ta['reg_ss_exo']);
6499 $valF['tax_mtn_total_sans_exo'] = floor($total_ta_ss_exo);
6500 }
6501 }
6502
6503 // Calcul de la RAP
6504 $calcul_rap = $taxe_amenagement->compute_rap($val);
6505
6506 // Si chaque résultat est calculable
6507 if ($calcul_rap !== null && is_array($calcul_rap) === true) {
6508
6509 // RAP avec exonération
6510 $mtn_rap = $calcul_rap['rap'];
6511 // RAP sans exonération
6512 $mtn_rap_ss_exo = $calcul_rap['rap_ss_exo'];
6513
6514 // Valeurs à mettre à jour, les montants doivent être à l'entier
6515 // inférieur
6516 $valF['tax_mtn_rap'] = floor($mtn_rap);
6517 $valF['tax_mtn_rap_sans_exo'] = floor($mtn_rap_ss_exo);
6518 }
6519 }
6520
6521 // Met à jour l'enregistrement de dossier
6522 $res = $this->f->db->autoExecute(
6523 DB_PREFIXE.$this->table,
6524 $valF,
6525 DB_AUTOQUERY_UPDATE,
6526 $this->clePrimaire ."='".$this->getVal($this->clePrimaire)."'"
6527 );
6528 // Log
6529 $this->f->addToLog(__METHOD__."() : db->autoExecute(".$res.")", VERBOSE_MODE);
6530 //
6531 if ($this->f->isDatabaseError($res, true)) {
6532 //
6533 $this->correct = false;
6534 return false;
6535 }
6536
6537 //
6538 return true;
6539 }
6540
6541 /**
6542 * TRIGGER - triggersupprimer.
6543 *
6544 * @return boolean
6545 */
6546 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6547 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6548
6549 // Le dossier d'instruction n'est pas supprimé si celui-ci est lié à un
6550 // contentieux
6551 $autorisation_contestee = $this->get_idx_by_args('autorisation_contestee', 'dossier', 'autorisation_contestee', $this->getVal($this->clePrimaire));
6552 if ($autorisation_contestee !== null && $autorisation_contestee !== '') {
6553 $this->addToMessage("Le dossier d'instruction ne peut pas être supprimé car celui-ci est lié à un contentieux.");
6554 return false;
6555 }
6556
6557 // Permet de récupérer la le type de demande pour la gestion du numéro de dossier.
6558 $inst_demande = $this->get_inst_demande();
6559 $this->val['demande_type'] = $inst_demande->getVal('demande_type');
6560
6561 /**
6562 * Gestion de la suppression des tables liées au dossier d'instruction.
6563 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
6564 */
6565 // Tableau pour la conception des requêtes de suppression
6566 $related_tables = array(
6567 'lien_demande_demandeur' => array(
6568 'condition_field' => 'demande',
6569 'condition_value' => $this->get_idx_by_args('demande', 'demande', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6570 ),
6571 'demande' => array(
6572 'condition_field' => 'dossier_instruction',
6573 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6574 ),
6575 'lien_dossier_demandeur' => array(
6576 'condition_field' => 'dossier',
6577 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6578 ),
6579 'instruction_notification_document' => array(
6580 'condition_field' => 'instruction_notification',
6581 'condition_value' => sprintf('SELECT %2$s FROM %1$s%2$s WHERE %3$s IN (%4$s)', DB_PREFIXE, 'instruction_notification', 'instruction', sprintf('SELECT %2$s FROM %1$s%2$s WHERE %3$s = \'%4$s\'', DB_PREFIXE, 'instruction', 'dossier', $this->getVal($this->clePrimaire))),
6582 ),
6583 'instruction_notification' => array(
6584 'condition_field' => 'instruction',
6585 'condition_value' => sprintf('SELECT %2$s FROM %1$s%2$s WHERE %3$s = \'%4$s\'', DB_PREFIXE, 'instruction', 'dossier', $this->getVal($this->clePrimaire)),
6586 ),
6587 'instruction' => array(
6588 'condition_field' => 'dossier',
6589 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6590 ),
6591 'dossier_parcelle' => array(
6592 'condition_field' => 'dossier',
6593 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6594 ),
6595 'dossier_contrainte' => array(
6596 'condition_field' => 'dossier',
6597 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6598 ),
6599 'lien_donnees_techniques_moyen_retenu_juge' => array(
6600 'condition_field' => 'donnees_techniques',
6601 'condition_value' => $this->get_idx_by_args('donnees_techniques', 'donnees_techniques', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6602 ),
6603 'lien_donnees_techniques_moyen_souleve' => array(
6604 'condition_field' => 'donnees_techniques',
6605 'condition_value' => $this->get_idx_by_args('donnees_techniques', 'donnees_techniques', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6606 ),
6607 'donnees_techniques_di' => array(
6608 'table' => 'donnees_techniques',
6609 'condition_field' => 'dossier_instruction',
6610 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6611 ),
6612 'blocnote' => array(
6613 'condition_field' => 'dossier',
6614 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6615 ),
6616 'consultation_entrante' => array(
6617 'condition_field' => 'dossier',
6618 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6619 ),
6620 'consultation' => array(
6621 'condition_field' => 'dossier',
6622 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6623 ),
6624 'document_numerise' => array(
6625 'condition_field' => 'dossier',
6626 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6627 ),
6628 'rapport_instruction' => array(
6629 'condition_field' => 'dossier_instruction',
6630 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6631 ),
6632 'dossier_commission' => array(
6633 'condition_field' => 'dossier',
6634 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6635 ),
6636 'dossier_message' => array(
6637 'condition_field' => 'dossier',
6638 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6639 ),
6640 'lien_dossier_dossier_1' => array(
6641 'table' => 'lien_dossier_dossier',
6642 'condition_field' => 'dossier_src',
6643 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6644 ),
6645 'lien_dossier_dossier_2' => array(
6646 'table' => 'lien_dossier_dossier',
6647 'condition_field' => 'dossier_cible',
6648 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6649 ),
6650 'dossier_geolocalisation' => array(
6651 'condition_field' => 'dossier',
6652 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6653 ),
6654 'donnees_techniques_lot' => array(
6655 'table' => 'donnees_techniques',
6656 'condition_field' => 'lot',
6657 'condition_value' => $this->get_idx_by_args("string_agg(lot::text, ', ')", 'lot', 'dossier', $this->getVal($this->clePrimaire)),
6658 ),
6659 'lien_lot_demandeur' => array(
6660 'condition_field' => 'lot',
6661 'condition_value' => $this->get_idx_by_args("string_agg(lot::text, ', ')", 'lot', 'dossier', $this->getVal($this->clePrimaire)),
6662 ),
6663 'lot' => array(
6664 'condition_field' => 'dossier',
6665 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6666 ),
6667 'dossier_operateur' => array(
6668 'table' => 'dossier_operateur',
6669 'condition_field' => 'dossier_instruction',
6670 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6671 )
6672 );
6673 // Supprime les enregistrements des tables
6674 $delete = $this->delete_related_tables($related_tables);
6675 if ($delete === false) {
6676 return false;
6677 }
6678
6679 //
6680 return true;
6681 }
6682
6683 /**
6684 * TRIGGER - triggersupprimerapres.
6685 *
6686 * @return boolean
6687 */
6688 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6689 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6690
6691 /**
6692 * Gestion de la suppression des tables liées au dossier d'instruction.
6693 * Dans le cas d'un dossier d'instruction initial le dossier
6694 * d'autorisation est également supprimé pour libérer la numéroration.
6695 * S'il s'agit d'un dossier d'instruction sur exsitant alors le dossier
6696 * d'autorisation est mise à jour.
6697 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
6698 */
6699 // S'il s'agit d'une suppression de dossier d'instruction sur existant
6700 if ($this->has_only_initial_di(true) === false) {
6701 // Mise à jour des données du dossier d'autorisation
6702 $da = $this->f->get_inst__om_dbform(array(
6703 "obj" => "dossier_autorisation",
6704 "idx" => $this->getVal("dossier_autorisation"),
6705 ));
6706 $da->majDossierAutorisation();
6707
6708 } else {
6709 // S'il s'agit d'une suppression de dossier d'instruction initial
6710 // Tableau pour la conception des requêtes de suppression
6711 $related_tables = array(
6712 'lien_dossier_autorisation_demandeur' => array(
6713 'condition_field' => 'dossier_autorisation',
6714 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6715 ),
6716 'dossier_autorisation_parcelle' => array(
6717 'condition_field' => 'dossier_autorisation',
6718 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6719 ),
6720 'donnees_techniques' => array(
6721 'condition_field' => 'dossier_autorisation',
6722 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6723 ),
6724 'dossier_autorisation' => array(
6725 'condition_field' => 'dossier_autorisation',
6726 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6727 ),
6728 );
6729 // Supprime les tables
6730 $delete = $this->delete_related_tables($related_tables);
6731 if ($delete === false) {
6732 return false;
6733 }
6734
6735 if ($this->is_num_decomposed() === true) {
6736
6737 /**
6738 * Mise à jour de la séquence.
6739 */
6740 $curr_da_num = $this->get_max_da_num();
6741 if (is_integer($curr_da_num) !== true) {
6742 $this->addToMessage(__('Erreur lors du calcul du numéro de dossier.'));
6743 return false;
6744 }
6745
6746 $seq_name = $this->get_sequence_name();
6747 if (empty($seq_name) === true) {
6748 $this->f->addToLog(sprintf('%s() : %s',
6749 __METHOD__,
6750 __("Échec de la récupération du nom de la séquence.")
6751 ), DEBUG_MODE);
6752 return false;
6753 }
6754
6755 // Dans le cas de la suppression du dernier dossier d'instruction de
6756 // sa numérotation alors la séquence est supprimée
6757 if ($curr_da_num === 0) {
6758 $table_name = substr($seq_name, 0, -4);
6759 $res = $this->f->db->dropSequence($table_name);
6760 $this->f->addToLog(__METHOD__."(): db->dropSequence(\"".$table_name."\");", VERBOSE_MODE);
6761 $this->f->isDatabaseError($res);
6762 } else {
6763 // La méthode setval avec la valeur true en troisième argument
6764 // signifie que le prochain nextval avancera la séquence avant
6765 // de renvoyer une valeur.
6766 $sql = sprintf("
6767 SELECT setval('%s', %s, true)",
6768 $seq_name,
6769 $curr_da_num
6770 );
6771 $res = $this->f->db->query($sql);
6772 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
6773 $this->f->isDatabaseError($res);
6774 }
6775 }
6776 // Si le dossier n'est pas décomposable et donc que la séquence du dossier n'a pas
6777 // été mise à jour ajoute un message de log pour avoir un suivi
6778 else {
6779 $this->f->addToLog(
6780 sprintf(
6781 '%s() : %s %s : %s',
6782 __METHOD__,
6783 __('Le numéro de dossier n\'a pas pu être décomposé.'),
6784 __('La séquence n\'a pas été mise à jour pour le dossier'),
6785 $this->getVal('dossier')
6786 ),
6787 VERBOSE_MODE
6788 );
6789 }
6790 }
6791
6792 /**
6793 * Supprime le dossier d'instruction des derniers dossiers consultés,
6794 * sauvegardé en session
6795 */
6796 if (isset($_SESSION['dossiers_consulte']) !== false) {
6797 $id_di = $this->getVal($this->clePrimaire);
6798 if (in_array($id_di, $_SESSION['dossiers_consulte']) === true) {
6799 unset($_SESSION['dossiers_consulte'][$id_di]);
6800 }
6801 // Supprime le tableau s'il n'y a plus de dossier consulté
6802 if (count($_SESSION['dossiers_consulte']) === 0) {
6803 unset($_SESSION['dossiers_consulte']);
6804 }
6805 }
6806
6807 /**
6808 * Gestion des tâches pour la dématérialisation
6809 */
6810 $inst_task_empty = $this->f->get_inst__om_dbform(array(
6811 "obj" => "task",
6812 "idx" => 0,
6813 ));
6814 $task_types = array(
6815 "creation_DI",
6816 "depot_DI",
6817 );
6818 foreach ($task_types as $task_type) {
6819 $task_exists = $inst_task_empty->task_exists($task_type, $id);
6820 if ($task_exists !== false) {
6821 $inst_task = $this->f->get_inst__om_dbform(array(
6822 "obj" => "task",
6823 "idx" => $task_exists,
6824 ));
6825 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6826 $task_val = array(
6827 'state' => $inst_task::STATUS_CANCELED,
6828 );
6829 $update_task = $inst_task->update_task(array('val' => $task_val));
6830 if ($update_task === false) {
6831 $this->addToMessage(sprintf('%s %s',
6832 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6833 __("Veuillez contacter votre administrateur.")
6834 ));
6835 $this->correct = false;
6836 return false;
6837 }
6838 }
6839 }
6840 }
6841
6842 return true;
6843 }
6844
6845 /**
6846 * Vérifie si le numéro de dossier a été décomposé.
6847 *
6848 * @return bool
6849 */
6850 function is_num_decomposed() {
6851 $num_fields = array(
6852 "numerotation_type" => $this->getVal("numerotation_type"),
6853 "numerotation_dep" => $this->getVal("numerotation_dep"),
6854 "numerotation_com" => $this->getVal("numerotation_com"),
6855 "numerotation_division" => $this->getVal("numerotation_division"),
6856 "numerotation_num" => $this->getVal("numerotation_num"),
6857 );
6858 foreach ($num_fields as $key => $field) {
6859 if (is_null($field)) {
6860 return false;
6861 }
6862 }
6863
6864 // On vérifie que le type de demande dans le suffixe correspond à un type de demande enregistré
6865 $result_search_demande_type = $this->f->get_one_result_from_db_query(
6866 sprintf(
6867 'SELECT
6868 demande_nature.code
6869 FROM
6870 %1$sdemande_type
6871 LEFT JOIN %1$sdemande_nature
6872 ON demande_type.demande_nature = demande_nature.demande_nature
6873 LEFT JOIN %1$sdossier_instruction_type
6874 ON demande_type.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6875 WHERE
6876 dossier_instruction_type.dossier_instruction_type = %2$d
6877 AND demande_type = %3$d',
6878 DB_PREFIXE,
6879 intval($this->getVal('dossier_instruction_type')),
6880 intval($this->val['demande_type'])
6881 ),
6882 array(
6883 "origin" => __METHOD__,
6884 )
6885 );
6886
6887 return (
6888 $result_search_demande_type['code'] !== 'KO'
6889 && isset($result_search_demande_type['result']) === true
6890 && $result_search_demande_type['result'] === 'NOUV');
6891 }
6892
6893 /**
6894 * TREATMENT - delete_related_tables.
6895 *
6896 * Suppression par requête SQL les enregistrements des tables passées en
6897 * paramètre.
6898 *
6899 * @param array $related_tables Liste des enregistrements à supprimer
6900 *
6901 * @return boolean
6902 */
6903 function delete_related_tables(array $related_tables) {
6904 $this->begin_treatment(__METHOD__);
6905
6906 // Supprime chaque enregistrement liés au dossier d'instruction
6907 $template_delete_sql = 'DELETE FROM %s%s WHERE %s IN (%s)';
6908 foreach ($related_tables as $table => $value) {
6909 if (isset($value['table']) === true) {
6910 $table = $value['table'];
6911 }
6912 if ($value['condition_value'] !== '' && $value['condition_value'] !== null) {
6913 $sql = sprintf($template_delete_sql, DB_PREFIXE, $table, $value['condition_field'], $value['condition_value']);
6914 $res = $this->f->db->query($sql);
6915 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
6916 $this->f->isDatabaseError($res);
6917
6918 /**
6919 * Gestion des tâches pour la dématérialisation
6920 */
6921 // Annule toutes les tâches liées au dossier
6922 $inst_task_empty = $this->f->get_inst__om_dbform(array(
6923 "obj" => "task",
6924 "idx" => 0,
6925 ));
6926 $all_task_type = array_merge($inst_task_empty::TASK_TYPE_SI, $inst_task_empty::TASK_TYPE_SC);
6927 foreach ($all_task_type as $task_type) {
6928 $task_exists = $inst_task_empty->task_exists($task_type, $this->getVal($this->clePrimaire), $this->getVal($this->clePrimaire));
6929 if ($task_exists !== false) {
6930 $inst_task = $this->f->get_inst__om_dbform(array(
6931 "obj" => "task",
6932 "idx" => $task_exists,
6933 ));
6934 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6935 $task_val = array(
6936 'state' => $inst_task::STATUS_CANCELED,
6937 );
6938 $update_task = $inst_task->update_task(array('val' => $task_val));
6939 if ($update_task === false) {
6940 $this->addToMessage(sprintf('%s %s',
6941 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6942 __("Veuillez contacter votre administrateur.")
6943 ));
6944 $this->correct = false;
6945 return false;
6946 }
6947 }
6948 }
6949 }
6950 // Spécifique au dossier d'autorisation
6951 if ($table === 'dossier_autorisation') {
6952 $task_exists = $inst_task_empty->task_exists('creation_DA', $this->getVal($table));
6953 if ($task_exists !== false) {
6954 $inst_task = $this->f->get_inst__om_dbform(array(
6955 "obj" => "task",
6956 "idx" => $task_exists,
6957 ));
6958 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6959 $task_val = array(
6960 'state' => $inst_task::STATUS_CANCELED,
6961 );
6962 $update_task = $inst_task->update_task(array('val' => $task_val));
6963 if ($update_task === false) {
6964 $this->addToMessage(sprintf('%s %s',
6965 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6966 __("Veuillez contacter votre administrateur.")
6967 ));
6968 $this->correct = false;
6969 return false;
6970 }
6971 }
6972 }
6973 }
6974 }
6975 }
6976
6977 return $this->end_treatment(__METHOD__, true);
6978 }
6979
6980 /**
6981 * CONDITION - has_only_initial_di.
6982 *
6983 * Permet de vérifier qu'il s'agit du dossier d'instruction initial de
6984 * l'autorisation.
6985 *
6986 * @param boolean $after_delete À activer si la méthode est utilisée lors de
6987 * la suppression.
6988 *
6989 * @return boolean
6990 */
6991 function has_only_initial_di($after_delete=false) {
6992
6993 // Compte le nombre de dossier lié au dossier d'autorisation
6994 $res = $this->get_idx_by_args('COUNT(dossier)', 'dossier', 'dossier_autorisation', $this->getVal('dossier_autorisation'));
6995
6996 // Si la méthode est utilisé dans le triggersupprimerapres alors le
6997 // dossier d'instruction est déjà supprimé dans la base de données, le
6998 // retour doit donc être 0 pour prouver la suppression du DI initial
6999 if ($after_delete === true) {
7000 if ($res === '0') {
7001 return true;
7002 }
7003 //
7004 return false;
7005 }
7006
7007 // S'il y a qu'un seul dossier d'instruction alors le DI courant est
7008 // forcément l'initial
7009 if ($res === '1') {
7010 return true;
7011 }
7012 //
7013 return false;
7014 }
7015
7016 /**
7017 * Récupère la dernière valeur d'une séquence.
7018 *
7019 * @param string $sequence_name Nom de la séquence (optionnel)
7020 *
7021 * @return integer Dernière valeur de la séquence
7022 */
7023 function get_last_value_sequence($sequence_name=null) {
7024 // Récupère autoamtiquement le nom de la séquence du dossier
7025 // d'instruction courant
7026 if ($sequence_name === null) {
7027 $sequence_name = $this->get_sequence_name();
7028
7029 if (empty($sequence_name) === true) {
7030 $this->f->addToLog(sprintf('%s() : %s',
7031 __METHOD__,
7032 __("Échec de la récupération du nom de la séquence.")
7033 ), DEBUG_MODE);
7034 return false;
7035 }
7036 }
7037 $qres = $this->f->get_one_result_from_db_query(
7038 sprintf(
7039 'SELECT last_value FROM %s',
7040 $sequence_name
7041 ),
7042 array(
7043 "origin" => __METHOD__,
7044 "force_return" => true,
7045 )
7046 );
7047 if ($qres["code"] !== "OK") {
7048 return false;
7049 }
7050 return intval($qres["result"]);
7051 }
7052
7053 /**
7054 * [get_max_da_num description]
7055 * @param [type] $sequence_name [description]
7056 * @return [type] [description]
7057 */
7058 function get_max_da_num($sequence_name = null) {
7059 if ($sequence_name === null) {
7060 $sequence_name = $this->get_sequence_name();
7061 }
7062 $da = $this->f->get_inst__om_dbform(array(
7063 "obj" => "dossier_autorisation",
7064 "idx" => $this->getVal('dossier_autorisation'),
7065 ));
7066 if ($da->doesNumeroDossierSequenceExists($sequence_name) !== true) {
7067 return false;
7068 }
7069 $sequence_args = $this->get_sequence_args();
7070 return $da->getMaxDANumeroDossier($sequence_args['datc'], $sequence_args['annee'], $sequence_args['dep'], $sequence_args['com']);
7071 }
7072
7073 /**
7074 * Retourne la reference cadastrale de la demande attache a un dossier ERP
7075 * specifique
7076 * @param string $dossier L'identifiant du dossier
7077 * @return string|null La reference cadastrale si elle est trouve,
7078 * sinon NULL. En cas d'erreur de la BD, l'execution s'arrete.
7079 */
7080 function getReferenceCadastrale($dossier) {
7081 $sql = "SELECT terrain_references_cadastrales FROM ".DB_PREFIXE."demande WHERE dossier_instruction = '" . $dossier . "'";
7082 $res = $this->f->db->limitquery($sql, 0, 1);
7083 $this->addToLog(
7084 __METHOD__."(): db->limitquery(\"".$sql."\", 0, 1);",
7085 VERBOSE_MODE
7086 );
7087 if ($this->f->isDatabaseError($res, true) !== false) {
7088 // Appel de la methode de recuperation des erreurs
7089 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), 'demande');
7090 }
7091 // retourne la nature du dossier
7092 while ($row =& $res->fetchRow()) {
7093 return $row[0];
7094 }
7095 // la nature n'etait pas trouve, ce qui ne devrait pas se passer
7096 return NULL;
7097 }
7098
7099 /**
7100 * Supprime puis recrée tous les liens entre dossier et demandeurs
7101 **/
7102 function insertLinkDossierDemandeur() {
7103 // Suppression des anciens demandeurs
7104 $this->deleteLinkDossierDemandeur();
7105 $types_demandeur = array(
7106 "petitionnaire_principal",
7107 "delegataire",
7108 "petitionnaire",
7109 "plaignant_principal",
7110 "plaignant",
7111 "contrevenant_principal",
7112 "contrevenant",
7113 "requerant_principal",
7114 "requerant",
7115 "avocat_principal",
7116 "avocat",
7117 "bailleur_principal",
7118 "bailleur",
7119 "proprietaire",
7120 "architecte_lc",
7121 "paysagiste",
7122 );
7123 foreach ($types_demandeur as $type) {
7124 // Comparaison des autres demandeurs
7125 if(isset($this->postedIdDemandeur[$type]) === true) {
7126 // Ajout des nouveaux liens
7127 foreach ($this->postedIdDemandeur[$type] as $demandeur) {
7128 //
7129 $principal = false;
7130 if (strpos($type, '_principal') !== false) {
7131 $principal = true;
7132 }
7133 if ($this->addLinkDossierDemandeur($demandeur, $principal) === false) {
7134 //
7135 return false;
7136 }
7137 }
7138 }
7139 }
7140 }
7141
7142
7143 /**
7144 * Fonction permettant d'ajouter un lien
7145 * entre la table dossier et demandeur
7146 **/
7147 function addLinkDossierDemandeur($id, $principal) {
7148 $lienAjout = $this->f->get_inst__om_dbform(array(
7149 "obj" => "lien_dossier_demandeur",
7150 "idx" => "]",
7151 ));
7152 $lien = array('lien_dossier_demandeur' => "",
7153 'petitionnaire_principal' => (($principal)?"t":"f"),
7154 'dossier' => $this->valF['dossier'],
7155 'demandeur' => $id);
7156 $lienAjout->ajouter($lien);
7157 $lienAjout->__destruct();
7158 }
7159
7160 /**
7161 * Fonction permettant de supprimer un lien
7162 * entre la table demande et demandeur
7163 **/
7164 function deleteLinkDossierDemandeur() {
7165 // Suppression
7166 $sql = "DELETE FROM ".DB_PREFIXE."lien_dossier_demandeur ".
7167 "WHERE dossier='".$this->valF['dossier']."'";
7168 $res = $this->f->db->query($sql);
7169 $this->f->addToLog(
7170 __METHOD__."(): db->query(\"".$sql."\");",
7171 VERBOSE_MODE
7172 );
7173 $this->f->isDatabaseError($res);
7174 }
7175
7176 /**
7177 * Methode de recupération des valeurs postées
7178 **/
7179 function getPostedValues() {
7180 // Récupération des demandeurs dans POST
7181 $types_demandeur = array(
7182 "petitionnaire_principal",
7183 "delegataire",
7184 "petitionnaire",
7185 "plaignant_principal",
7186 "plaignant",
7187 "contrevenant_principal",
7188 "contrevenant",
7189 "requerant_principal",
7190 "requerant",
7191 "avocat_principal",
7192 "avocat",
7193 "bailleur_principal",
7194 "bailleur",
7195 "proprietaire",
7196 "architecte_lc",
7197 "paysagiste",
7198 );
7199 foreach ($types_demandeur as $type) {
7200 if($this->f->get_submitted_post_value($type) !== null AND
7201 $this->f->get_submitted_post_value($type) != '') {
7202 $this->postedIdDemandeur[$type] = $this->f->get_submitted_post_value($type);
7203 }
7204 }
7205 }
7206
7207 /**
7208 * Méthode permettant de récupérer les id des demandeurs liés à la table
7209 * liée passée en paramètre
7210 *
7211 * @param string $from Table liée : "demande", "dossier", dossier_autorisation"
7212 * @param string $id Identifiant (clé primaire de la table liée en question)
7213 */
7214 function listeDemandeur($from, $id) {
7215
7216 // Si la donnée membre a déjà été remplie par un précédent appel à cette méthode,
7217 // on sort.
7218 if ($this->valIdDemandeur["petitionnaire_principal"] !== array() or
7219 $this->valIdDemandeur["delegataire"] !== array() or
7220 $this->valIdDemandeur["petitionnaire"] !== array() or
7221 $this->valIdDemandeur["plaignant_principal"] !== array() or
7222 $this->valIdDemandeur["plaignant"] !== array() or
7223 $this->valIdDemandeur["contrevenant_principal"] !== array() or
7224 $this->valIdDemandeur["contrevenant"] !== array() or
7225 $this->valIdDemandeur["requerant_principal"] !== array() or
7226 $this->valIdDemandeur["requerant"] !== array() or
7227 $this->valIdDemandeur["avocat_principal"] !== array() or
7228 $this->valIdDemandeur["avocat"] !== array() or
7229 $this->valIdDemandeur["bailleur_principal"] !== array() or
7230 $this->valIdDemandeur["bailleur"] !== array() or
7231 $this->valIdDemandeur["proprietaire"] !== array() or
7232 $this->valIdDemandeur["architecte_lc"] !== array() or
7233 $this->valIdDemandeur["paysagiste"] !== array()) {
7234 return;
7235 }
7236
7237 // Récupération des demandeurs de la base
7238 $sql = "SELECT demandeur.demandeur,
7239 demandeur.type_demandeur,
7240 lien_".$from."_demandeur.petitionnaire_principal
7241 FROM ".DB_PREFIXE."lien_".$from."_demandeur
7242 INNER JOIN ".DB_PREFIXE."demandeur
7243 ON demandeur.demandeur=lien_".$from."_demandeur.demandeur
7244 WHERE ".$from." = '".$id."'";
7245 $res = $this->f->db->query($sql);
7246 $this->f->addToLog("listeDemandeur(): db->query(\"".$sql."\")", VERBOSE_MODE);
7247 $this->f->isDatabaseError($res);
7248
7249 // Stockage du résultat dans un tableau
7250 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
7251
7252 $demandeur_type = $row['type_demandeur'];
7253 if ($row['petitionnaire_principal'] == 't'){
7254 $demandeur_type .= "_principal";
7255 }
7256 $this->valIdDemandeur[$demandeur_type][] = $row['demandeur'];
7257 }
7258 }
7259
7260 /**
7261 * Récupère la liste des contraintes d'un dossier.
7262 *
7263 * @param string $dossier Identifiant du dossier.
7264 * @param boolean $for_di_view Liste avec condition affichage DI.
7265 *
7266 * @return object Résultat de la requête
7267 */
7268 function getListContrainte($dossier, $for_di_view = true) {
7269
7270 // Select
7271 $select = "SELECT dossier_contrainte.dossier_contrainte as dossier_contrainte_id,
7272 dossier_contrainte.texte_complete as dossier_contrainte_texte,
7273 dossier_contrainte.reference as dossier_contrainte_reference,
7274 contrainte.libelle as contrainte_libelle,
7275 contrainte.nature as contrainte_nature,
7276 contrainte.texte as contrainte_texte,
7277 contrainte.reference as contrainte_reference,
7278 lower(contrainte.groupe) as contrainte_groupe,
7279 lower(contrainte.sousgroupe) as contrainte_sousgroupe ";
7280
7281 // From
7282 $from = " FROM ".DB_PREFIXE."contrainte
7283 LEFT JOIN ".DB_PREFIXE."dossier_contrainte
7284 ON dossier_contrainte.contrainte = contrainte.contrainte ";
7285
7286 // Where
7287 $where = " WHERE dossier_contrainte.dossier = '".$dossier."' ";
7288
7289 // Si les contraintes sont listées pour être affichées dans le DI
7290 if ($for_di_view === true) {
7291 // Si le paramètre "option_contrainte_di" est défini
7292 if ($this->f->getParameter('option_contrainte_di') != 'aucun') {
7293 // Ajoute la condition
7294 $where .= $this->f->traitement_condition_contrainte(
7295 $this->f->getParameter('option_contrainte_di'));
7296 }
7297 }
7298
7299 // Tri
7300 $tri = " ORDER BY contrainte_groupe DESC, contrainte_sousgroupe,
7301 contrainte.no_ordre, contrainte.libelle ";
7302
7303 // Requête SQL
7304 $sql = $select.$from.$where.$tri;
7305 $res = $this->f->db->query($sql);
7306 $this->f->addToLog("listContrainte(): db->query(\"".$sql."\");", VERBOSE_MODE);
7307 $this->f->isDatabaseError($res);
7308
7309 // Retourne le résultat
7310 return $res;
7311 }
7312
7313 /**
7314 * Récupère les informations à afficher dans le tableau des identifiants
7315 * tehniques Plat'AU. Stocke ces informations dans un tableau.
7316 * Converti le tableau au format json et renvoi le json obtenu
7317 *
7318 * @return json
7319 */
7320 protected function get_json_lien_iiue() {
7321 // Tableau de retour
7322 $val_suivi = array();
7323
7324 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
7325 $liste_champs = array(
7326 'object' => __('type'),
7327 'object_id' => __('identifiant openADS'),
7328 'external_uid' => __("identifiant Plat'AU"),
7329 'state' => __('état du versement'),
7330 );
7331 // Mapping entre la valeur 'object' de la table de liaison des identifiants
7332 // et la valeur de 'object' dans la tables des tâches
7333 $mapping_one_to_one_object_liiue_task = array(
7334 'dossier_autorisation' => 'creation_DA',
7335 'dossier' => 'creation_DI',
7336 'piece' => 'ajout_piece',
7337 'consultation' => 'creation_consultation',
7338 'instruction_action_cl' => 'envoi_CL',
7339 );
7340 // Traduction des états de versement
7341 $trad_state = array(
7342 'done' => sprintf('%s %s', __('terminé'), '[V]'),
7343 'pending' => __('en cours'),
7344 'error' => __('en erreur'),
7345 'new' => __('à réaliser'),
7346 );
7347 // Traduction des objets
7348 $trad_object = array(
7349 'dossier_autorisation' => __('dossier_autorisation'),
7350 'dossier' => __('dossier'),
7351 'piece' => __('pièce'),
7352 'dossier_consultation' => __('consultation'),
7353 'pec_dossier_consultation' => __('prise en compte'),
7354 'avis_dossier_consultation' => __('avis'),
7355 'instruction_action_cl' => __('instruction transmise au CL'),
7356 );
7357 // Instance de la table de liaison des identifiants
7358 $inst_liiue = $this->f->get_inst__om_dbform(array(
7359 "obj" => "lien_id_interne_uid_externe",
7360 "idx" => 0,
7361 ));
7362 // Instance de la table des tâches
7363 $inst_task = $this->f->get_inst__om_dbform(array(
7364 "obj" => "task",
7365 "idx" => 0,
7366 ));
7367 // Récupération de toutes les occurences du dossier en cours dans la table des
7368 // liaisons des identifiants
7369 $external_uids = $inst_liiue->get_all_lien_id_interne_uid_externe_by_dossier($this->getVal('dossier'), PLATAU);
7370 if (is_array($external_uids) === true && count($external_uids) > 0) {
7371 //
7372 foreach ($external_uids as $external_uid) {
7373
7374 /**
7375 * Gestion de l'état du versement dans Plat'AU
7376 */
7377 // État par défaut
7378 $external_uid['state'] = __('N/A');
7379 // Tente d'identifier le type, dans certains cas il n'est pas
7380 // possible de le définir avec certitude
7381 $type = isset($mapping_one_to_one_object_liiue_task[$external_uid['object']]) === true ? $mapping_one_to_one_object_liiue_task[$external_uid['object']] : null;
7382 $search_values = array(
7383 sprintf('type = \'%s\'', $type),
7384 sprintf('object_id = \'%s\'', $external_uid['object_id']),
7385 sprintf('state != \'%s\'', $inst_task::STATUS_CANCELED),
7386 );
7387 // Si le type ne peut pas être défini avec certitude, alors on ne
7388 // l'inclut pas dans la recherche de la tâche
7389 if ($type === null) {
7390 unset($search_values[0]);
7391 }
7392 $task_exists = $inst_task->task_exists_multi_search($search_values);
7393 // Pour récupérer un état, il ne faut qu'un résultat
7394 if ($task_exists !== false) {
7395 //
7396 foreach ($task_exists as $task_value) {
7397 $external_uid['state'] = $task_value['state'];
7398 if ($task_value['state'] === 'pending') {
7399 break;
7400 }
7401 }
7402 }
7403 // Remplace les valeurs des états de versement par les traductions
7404 foreach ($trad_state as $key => $value) {
7405 if ($external_uid['state'] === $key) {
7406 $external_uid['state'] = $value;
7407 }
7408 }
7409
7410 // Remplace les valeurs des états de versement par les traductions
7411 foreach ($trad_object as $key => $value) {
7412 if ($external_uid['object'] === $key) {
7413 $external_uid['object'] = __($value);
7414 }
7415 }
7416
7417 //
7418 $val_notif = array();
7419 foreach($liste_champs as $key => $champ) {
7420 $val_notif[$champ] = $external_uid[$key];
7421 }
7422 array_push($val_suivi, $val_notif);
7423 }
7424 }
7425
7426 // Passage du tableau au format json
7427 return json_encode($val_suivi, JSON_HEX_APOS);
7428 }
7429
7430 /**
7431 * Ajout de la liste des contraintes et des demandeurs
7432 */
7433 function formSpecificContent($maj) {
7434
7435 // Récupère le CRUD
7436 $crud = $this->get_action_crud($this->getParameter("maj"));
7437
7438 // Les contenus spécifiques ne sont pas affichés en cas de suppression
7439 if ($crud === 'delete') {
7440 return;
7441 }
7442
7443 /**
7444 * Liste des contraintes
7445 */
7446 //
7447 $listContrainte = $this->getListContrainte($this->getVal('dossier'));
7448
7449 // Si le dossier possède des contraintes et qu'on n'est pas dans la vue "Journal d'instruction"
7450 if ($listContrainte->numRows() != 0 && $maj !== "200") {
7451
7452 // Affiche du fieldset
7453 printf("<div id=\"liste_contrainte\" class=\"demande_hidden_bloc\">");
7454 printf("<fieldset class=\"cadre ui-corner-all ui-widget-content col_12 startClosed\">");
7455 printf(" <legend class=\"ui-corner-all ui-widget-content ui-state-active\"
7456 id =\"fieldset_contraintes_liees\">"
7457 ._("dossier_contrainte")."</legend>");
7458 printf("<div class=\"fieldsetContent\" style=\"display: none;\">");
7459
7460 // Entête pour le groupe
7461 $groupeHeader = "
7462 <div class='dossier_contrainte_groupe'>
7463 <div class='dossier_contrainte_groupe_header'>
7464 <span class='name'>
7465 %s
7466 </span>
7467 </div>
7468 ";
7469
7470 // Entête pour le sous-groupe
7471 $sousgroupeHeader = "
7472 <div class='dossier_contrainte_sousgroupe'>
7473 <div class='dossier_contrainte_sousgroupe_header'>
7474 <span class='name'>
7475 %s
7476 </span>
7477 </div>
7478 ";
7479
7480 // Titres des colonnes
7481 $tableHeader = "
7482 <thead>
7483 <tr class='ui-tabs-nav ui-accordion ui-state-default tab-title'>
7484 <th class='title col-0 firstcol contrainte_th_texte_complete'>
7485 <span class='name'>
7486 "._('texte_complete')."
7487 </span>
7488 </th>
7489 <th class='title col-1 contrainte_th_reference'>
7490 <span class='name'>
7491 "._('reference')."
7492 </span>
7493 </th>
7494 <th class='title col-2 contrainte_th_nature'>
7495 <span class='name'>
7496 "._('nature')."
7497 </span>
7498 </th>
7499 </tr>
7500 </thead>
7501 ";
7502
7503 // Ligne de données
7504 $line = "
7505 <tr class='tab-data %s'>
7506 <td class='col-0 firstcol contrainte_th_texte_complete'>
7507 %s
7508 </td>
7509 <td class='col-1 contrainte_th_reference'>
7510 %s
7511 </td>
7512 <td class='col-2 contrainte_th_nature'>
7513 %s
7514 </td>
7515 ";
7516
7517 // Sauvegarde des données pour les comparer
7518 $lastRow = array();
7519 $lastRow['contrainte_groupe'] = 'empty';
7520 $lastRow['contrainte_sousgroupe'] = 'empty';
7521
7522 // Tant qu'il y a des résultats
7523 while($row = &$listContrainte->fetchRow(DB_FETCHMODE_ASSOC)) {
7524 // Si l'identifiant du groupe de la contrainte présente et
7525 // celle d'avant est différent
7526 if ($row['contrainte_groupe'] != $lastRow['contrainte_groupe']) {
7527
7528 // Si l'identifiant du groupe d'avant est vide
7529 if ($lastRow['contrainte_groupe'] != 'empty') {
7530 // Ferme le tableau
7531 printf("</table>");
7532 // Ferme le div
7533 printf("</div>");
7534 // Ferme le div
7535 printf("</div>");
7536 }
7537
7538 // Affiche le header du groupe
7539 printf($groupeHeader, $row['contrainte_groupe']);
7540 }
7541
7542 // Si l'identifiant du sous-groupe de la contrainte présente et
7543 // celle d'avant est différent
7544 // Ou qu'ils soient identique mais n'appartiennent pas au même groupe
7545 if ($row['contrainte_sousgroupe'] != $lastRow['contrainte_sousgroupe']
7546 || ($row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']
7547 && $row['contrainte_groupe'] != $lastRow['contrainte_groupe'])) {
7548
7549 //
7550 if($row['contrainte_groupe'] == $lastRow['contrainte_groupe']) {
7551 // Si l'identifiant de la sous-groupe d'avant est vide
7552 if ($lastRow['contrainte_sousgroupe'] != 'empty') {
7553 // Ferme le tableau
7554 printf("</table>");
7555 // Ferme le div
7556 printf("</div>");
7557 }
7558 }
7559
7560 // Affiche le header du sous-groupe
7561 printf($sousgroupeHeader, $row['contrainte_sousgroupe']);
7562
7563 // Ouvre le tableau
7564 printf("<table id='sousgroupe_".$row['contrainte_sousgroupe']."' class='tab-tab dossier_contrainte_view'>");
7565
7566 // Affiche le header des données
7567 printf($tableHeader);
7568
7569 // Définis le style des lignes
7570 $style = 'odd';
7571 }
7572
7573 // Si toujours dans la même groupe et même sous-groupe,
7574 // on change le style de la ligne
7575 if ($row['contrainte_groupe'] == $lastRow['contrainte_groupe']
7576 && $row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']) {
7577 // Définis le style
7578 $style = ($style=='even')?'odd':'even';
7579 }
7580
7581 // Affiche "Oui" ou "Non" pour le bouléen
7582 if ($row['dossier_contrainte_reference'] == 1
7583 || $row['dossier_contrainte_reference'] == "t"
7584 || $row['dossier_contrainte_reference'] == "Oui") {
7585 //
7586 $contrainte_reference = "Oui";
7587 } else {
7588 //
7589 $contrainte_reference = "Non";
7590 }
7591
7592 // Affiche les données
7593 printf($line, $style,
7594 $row['dossier_contrainte_texte'],
7595 $contrainte_reference,
7596 $row['contrainte_nature']
7597 );
7598
7599 // Sauvegarde les données
7600 $lastRow['contrainte_groupe'] = $row['contrainte_groupe'];
7601 $lastRow['contrainte_sousgroupe'] = $row['contrainte_sousgroupe'];
7602
7603 }
7604 // Ferme le tableau
7605 printf("</table>");
7606 // Ferme le sous-groupe
7607 printf("</div>");
7608 // Ferme le groupe
7609 printf("</div>");
7610
7611 printf("</div>");
7612
7613 printf("<div class=\"visualClear\"></div>");
7614 // Ferme le fieldset content
7615 printf("</div>");
7616 printf("</fieldset>");
7617 }
7618 /**
7619 * Fin Liste des contraintes
7620 */
7621
7622 /**
7623 * Liste des demandeurs
7624 */
7625 // Tableau des demandeurs selon le contexte
7626 $listeDemandeur = $this->valIdDemandeur;
7627 /**
7628 * Gestion du bloc des demandeurs
7629 */
7630 // Si le mode est (modification ou suppression ou consultation) ET que
7631 // le formulaire n'est pas correct (c'est-à-dire que le formulaire est
7632 // actif)
7633 if ($this->correct !== true AND
7634 $this->getParameter('validation') == 0 AND
7635 $this->getParameter("maj") != 0) {
7636 // Alors on récupère les demandeurs dans la table lien pour
7637 // affectation des résultats dans $this->valIdDemandeur
7638 $this->listeDemandeur("dossier", $this->getval($this->clePrimaire));
7639 $listeDemandeur = $this->valIdDemandeur;
7640 }
7641
7642 // Récupération des valeurs postées
7643 if ($this->getParameter('validation') != 0) {
7644 $listeDemandeur = $this->postedIdDemandeur;
7645 }
7646
7647 // Si le mode est (ajout ou modification)
7648 // ET que le mode n'est pas (journal d'instruction)
7649 // ET que le formulaire n'est pas correct
7650 // (c'est-à-dire que le formulaire est actif)
7651 if (($this->getParameter("maj") < 2 AND $this->correct !== true)) {
7652 // Alors on positionne le marqueur linkable a true qui permet
7653 // d'afficher ou non les actions de gestion des demandeurs
7654 $linkable = true;
7655 } else {
7656 // Sinon on positionne le marqueur linkable a false qui permet
7657 // d'afficher ou non les actions de gestion des demandeurs
7658 $linkable = false;
7659 }
7660 $affichage_form = $this->get_type_affichage_formulaire();
7661 // Pour les dossiers contentieux, il faut un droit spécifique pour visualiser le
7662 // fieldset "Demandeurs"
7663 if ($this->getParameter("maj") != 200 &&
7664 ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE')
7665 OR ($affichage_form === 'CTX RE' AND $this->f->isAccredited('dossier_contentieux_recours_afficher_demandeurs') === true)
7666 OR ($affichage_form === 'CTX IN' AND $this->f->isAccredited('dossier_contentieux_infractions_afficher_demandeurs') === true)
7667 ) {
7668
7669 // Conteneur de la listes des demandeurs
7670 echo "<div id=\"liste_demandeur\" class=\"demande_hidden_bloc col_12\">";
7671 echo "<fieldset id=\"fieldset-form-dossier_instruction-demandeur\" class=\"cadre ui-corner-all ui-widget-content startClosed\">";
7672 echo " <legend class=\"ui-corner-all ui-widget-content ui-state-active\">"
7673 ._("Demandeurs")."</legend>";
7674 echo "<div class=\"fieldsetContent\" style=\"display: none;\">";
7675
7676
7677 // Pour les DI avec DA visible, dans tous les modes excepté en ajout et si l'option d'accès au
7678 // portail citoyen est activée
7679 $inst_da = $this->get_inst_dossier_autorisation();
7680 if ($this->getParameter("maj") != 0
7681 && $this->f->is_option_citizen_access_portal_enabled() === true
7682 && $inst_da->is_dossier_autorisation_visible() === true) {
7683 // Instance du dossier d'autorisation
7684 //
7685 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'));
7686 }
7687 // Sélection des demandeur à afficher en fonction du paramétrage du type
7688 // du dossier d'autorisation.
7689 switch ($affichage_form) {
7690 case 'ADS':
7691 case 'CONSULTATION ENTRANTE':
7692 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7693 break;
7694 case 'CTX RE':
7695 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7696 $this->display_demandeur_requerant_avocat($listeDemandeur);
7697 break;
7698 case 'CTX IN':
7699 $this->display_demandeur_plaignant_contrevenant($listeDemandeur);
7700 break;
7701 case 'DPC':
7702 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7703 $this->display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur);
7704 break;
7705 }
7706
7707 }
7708
7709 echo "</fieldset>";
7710 echo "</div>";
7711 /**
7712 * Fin liste des demandeurs
7713 */
7714
7715 /**
7716 * Interface avec le référentiel ERP.
7717 *
7718 * On affiche le message uniquement si le dossier est connecté.
7719 */
7720 if ($this->getParameter('maj') == 3 && $this->is_connected_to_referentiel_erp() === true) {
7721 //
7722 printf(
7723 '<div class="col_12">
7724 Ce dossier est connecté au référentiel ERP.
7725 </div>'
7726 );
7727 }
7728
7729 }
7730
7731 /**
7732 * Affiche le bloc d'affichage des demandeurs pour dossiers ADS avec actions.
7733 *
7734 * @param array $listeDemandeur Liste des demandeurs.
7735 */
7736 function display_demandeur_petitionnaire_delegataire($listeDemandeur) {
7737
7738 // Affichage du bloc pétitionnaire principal / délégataire
7739 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7740 echo "<div id=\"petitionnaire_principal_delegataire\">";
7741 // Affichage de la synthèse du pétitionnaire principal
7742 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire_principal");
7743 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7744 echo "<div id=\"delegataire\">";
7745 // Affichage de la synthèse du délégataire
7746 $this->displaySyntheseDemandeur($listeDemandeur, "delegataire");
7747 echo "</div>";
7748 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7749 echo "<div id=\"proprietaire\">";
7750 // Affichage de la synthèse du délégataire
7751 $this->displaySyntheseDemandeur($listeDemandeur, "proprietaire");
7752 echo "</div>";
7753 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7754 echo "<div id=\"architecte_lc\">";
7755 // Affichage de la synthèse du délégataire
7756 $this->displaySyntheseDemandeur($listeDemandeur, "architecte_lc");
7757 echo "</div>";
7758 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7759 echo "<div id=\"paysagiste\">";
7760 // Affichage de la synthèse du délégataire
7761 $this->displaySyntheseDemandeur($listeDemandeur, "paysagiste");
7762 echo "</div>";
7763 echo "<div class=\"both\"></div>";
7764 echo "</div>";
7765 // Bloc des pétitionnaires secondaires
7766 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7767 echo "<div id=\"listePetitionnaires\">";
7768 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire");
7769 echo "</div>";
7770 }
7771
7772 /**
7773 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX recours
7774 * avec actions.
7775 *
7776 * @param array $listeDemandeur Liste des demandeurs.
7777 */
7778 function display_demandeur_plaignant_contrevenant($listeDemandeur) {
7779
7780 echo "<div id=\"plaignant_contrevenant\">";
7781 // Affichage du bloc contrevenant
7782 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7783 echo "<div id=\"listeContrevenants\" class=\"col_12\">";
7784 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7785 echo "<div id=\"contrevenant_principal\">";
7786 // Affichage de la synthèse
7787 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant_principal");
7788 echo "</div>";
7789 echo "<div id=\"listeAutresContrevenants\">";
7790 // Affichage de la synthèse
7791 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant");
7792 echo "</div>";
7793 echo "</div>";
7794 // Affichage du bloc plaignant
7795 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7796 echo "<div id=\"listePlaignants\" class=\"col_12\">";
7797 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7798 echo "<div id=\"plaignant_principal\">";
7799 // Affichage de la synthèse
7800 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant_principal");
7801 echo "</div>";
7802 echo "<div id=\"listeAutresPlaignants\">";
7803 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant");
7804 echo "</div>";
7805 echo "</div>";
7806 echo "</div>";
7807
7808 }
7809
7810 /**
7811 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX infraction
7812 * avec actions.
7813 *
7814 * @param array $listeDemandeur Liste des demandeurs.
7815 */
7816 function display_demandeur_requerant_avocat($listeDemandeur) {
7817 echo "<div id=\"requerant_avocat\">";
7818 // Affichage du bloc requérant
7819 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7820 echo "<div id=\"listeRequerants\" class=\"col_12\">";
7821 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7822 echo "<div id=\"requerant_principal\">";
7823 // Affichage de la synthèse
7824 $this->displaySyntheseDemandeur($listeDemandeur, "requerant_principal");
7825 echo "</div>";
7826 echo "<div id=\"listeAutresRequerants\">";
7827 $this->displaySyntheseDemandeur($listeDemandeur, "requerant");
7828 echo "</div>";
7829 echo "</div>";
7830 // Affichage du bloc avocat
7831 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7832 echo "<div id=\"listeAvocat\" class=\"col_12\">";
7833 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7834 echo "<div id=\"avocat_principal\">";
7835 $this->displaySyntheseDemandeur($listeDemandeur, "avocat_principal");
7836 echo "</div>";
7837 echo "<div id=\"listeAutresAvocats\">";
7838 $this->displaySyntheseDemandeur($listeDemandeur, "avocat");
7839 echo "</div>";
7840 echo "</div>";
7841 echo "</div>";
7842 echo "</fieldset>";
7843 // Champ flag permettant de récupérer la valeur de l'option sig pour
7844 // l'utiliser en javascript, notamment lors du chargement de l'interface
7845 // pour les références cadastrales
7846 // XXX Si un widget pour les références cadastrales existait, il n'y
7847 // aurait pas besoin de faire cela
7848 echo "<input id='option_sig' type='hidden' value='".$this->f->getParameter("option_sig")."' name='option_sig'>";
7849 echo "</div>";
7850 }
7851
7852
7853 /**
7854 * Affiche le bloc d'affichage des demandeurs pour dossiers DPC avec actions.
7855 *
7856 * @param array $listeDemandeur Liste des demandeurs.
7857 */
7858 function display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur) {
7859
7860 // Affichage du bloc pétitionnaire principal / délégataire / bailleur
7861 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7862 echo "<div id=\"petitionnaire_principal_delegataire_bailleur\">";
7863 // Doit être utilisé avec la div petitionnaire_principal_delegataire
7864 echo "<div id=\"listeBailleurs\" class=\"col_12\">";
7865 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7866 echo "<div id=\"bailleur_principal\">";
7867 // Affichage de la synthèse
7868 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur_principal");
7869 echo "</div>";
7870 echo "<div id=\"listeAutresBailleurs\">";
7871 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur");
7872 echo "</div>";
7873 echo "</div>";
7874 echo "</div>";
7875 }
7876
7877
7878 function displaySyntheseDemandeur($listeDemandeur, $type) {
7879 // Si le mode est (ajout ou modification) ET que le formulaire n'est pas
7880 // correct (c'est-à-dire que le formulaire est actif)
7881 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
7882 // Alors on positionne le marqueur linkable a true qui permet
7883 // d'afficher ou non les actions de gestion des demandeurs
7884 $linkable = true;
7885 } else {
7886 // Sinon on positionne le marqueur linkable a false qui permet
7887 // d'afficher ou non les actions de gestion des demandeurs
7888 $linkable = false;
7889 }
7890 // Récupération du type de demandeur pour l'affichage
7891 switch ($type) {
7892 case 'petitionnaire_principal':
7893 $legend = _("Petitionnaire principal");
7894 break;
7895
7896 case 'delegataire':
7897 $legend = _("Autre correspondant");
7898 break;
7899
7900 case 'petitionnaire':
7901 $legend = _("Petitionnaire");
7902 break;
7903
7904 case 'contrevenant_principal':
7905 $legend = _("Contrevenant principal");
7906 break;
7907
7908 case 'contrevenant':
7909 $legend = _("Autre contrevenant");
7910 break;
7911
7912 case 'plaignant_principal':
7913 $legend = _("Plaignant principal");
7914 break;
7915
7916 case 'plaignant':
7917 $legend = _("Autre plaignant");
7918 break;
7919
7920 case 'requerant_principal':
7921 $legend = _("Requérant principal");
7922 break;
7923
7924 case 'requerant':
7925 $legend = _("Autre requérant");
7926 break;
7927
7928 case 'avocat_principal':
7929 $legend = _("Avocat principal");
7930 break;
7931
7932 case 'avocat':
7933 $legend = _("Autre avocat");
7934 break;
7935
7936 case 'bailleur_principal':
7937 $legend = _("Bailleur principal");
7938 break;
7939
7940 case 'bailleur':
7941 $legend = _("Bailleur");
7942 break;
7943
7944 case 'proprietaire':
7945 $legend = __("Propriétaire");
7946 break;
7947
7948 case 'architecte_lc':
7949 $legend = __("Architecte législation connexe");
7950 break;
7951
7952 case 'paysagiste':
7953 $legend = __("Concepteur-Paysagiste");
7954 break;
7955 }
7956 foreach ($listeDemandeur[$type] as $demandeur_id) {
7957 $obj = str_replace('_principal', '', $type);
7958 $demandeur = $this->f->get_inst__om_dbform(array(
7959 "obj" => $obj,
7960 "idx" => $demandeur_id,
7961 ));
7962 $demandeur -> afficherSynthese($type, $linkable);
7963 $demandeur -> __destruct();
7964 }
7965 // Si en édition de formulaire
7966 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
7967 // Bouton d'ajout du avocat
7968 // L'ID DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7969 echo "<a id=\"add_".$type."\"
7970 class=\"om-form-button add-16\">".
7971 $legend.
7972 "</a>";
7973 }
7974 }
7975 /**
7976 * Retourne le statut du dossier
7977 * @return string Le statut du dossier d'instruction
7978 */
7979 function getStatut(){
7980
7981 $statut = '';
7982
7983 $etat = $this->getVal("etat");
7984 //Si l'état du dossier d'instruction n'est pas vide
7985 if ( $etat != '' ){
7986
7987 $sql = "SELECT statut
7988 FROM ".DB_PREFIXE."etat
7989 WHERE etat ='".$etat."'";
7990 $statut = $this->f->db->getone($sql);
7991 $this->addToLog(
7992 __METHOD__."(): db->getone(\"".$sql."\");",
7993 VERBOSE_MODE
7994 );
7995 $this->f->isDatabaseError($statut);
7996 }
7997 return $statut;
7998 }
7999
8000 /**
8001 * Retourne le dernier événement lié au dossier instancié
8002 *
8003 * @return [string] ID du dernier événement
8004 */
8005 function get_dernier_evenement() {
8006 $sql = "SELECT max(instruction)
8007 FROM ".DB_PREFIXE."instruction
8008 WHERE dossier = '".$this->getVal($this->clePrimaire)."'";
8009 $id_dernier_evenement = $this->f->db->getone($sql);
8010 $this->addToLog(
8011 __METHOD__."(): db->getone(\"".$sql."\");",
8012 VERBOSE_MODE
8013 );
8014 $this->f->isDatabaseError($id_dernier_evenement);
8015 return $id_dernier_evenement;
8016 }
8017
8018 /**
8019 * Retourne l'identifiant du rapport d'instruction lié du dossier
8020 * @return string L'identifiant du rapport d'instruction lié du dossier
8021 */
8022 function getRapportInstruction() {
8023
8024 $rapport_instruction = null;
8025
8026 $sql = "SELECT rapport_instruction
8027 FROM ".DB_PREFIXE."rapport_instruction
8028 WHERE dossier_instruction ='".$this->getVal($this->clePrimaire)."'";
8029 $rapport_instruction = $this->f->db->getone($sql);
8030 $this->addToLog(
8031 __METHOD__."(): db->getone(\"".$sql."\");",
8032 VERBOSE_MODE
8033 );
8034 $this->f->isDatabaseError($rapport_instruction);
8035
8036 return $rapport_instruction;
8037 }
8038
8039 /**
8040 * Retourne l'identifiant des données techniques liées du dossier
8041 * @return string L'identifiant des données techniques liées du dossier
8042 */
8043 function getDonneesTechniques() {
8044
8045 $donnees_techniques = '';
8046
8047 $sql = "SELECT donnees_techniques
8048 FROM ".DB_PREFIXE."donnees_techniques
8049 WHERE dossier_instruction ='".$this->getVal($this->clePrimaire)."'";
8050 $donnees_techniques = $this->f->db->getone($sql);
8051 $this->addToLog(
8052 __METHOD__."(): db->getone(\"".$sql."\");",
8053 VERBOSE_MODE
8054 );
8055 $this->f->isDatabaseError($donnees_techniques);
8056 return $donnees_techniques;
8057 }
8058
8059 /**
8060 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
8061 *
8062 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
8063 * la vue 'sousformulaire'.
8064 *
8065 * @return string
8066 */
8067 function get_back_link($view = "formulaire") {
8068 $baseURL = OM_ROUTE_TAB;
8069 $paramsHref = array(
8070 'premier' => $this->getParameter("premier"),
8071 'tricol' => $this->getParameter("tricol"),
8072 'advs_id' => $this->getParameter("advs_id"),
8073 'valide' => $this->getParameter("valide")
8074 );
8075
8076 // Si on vient d'un widget de recherche paramétrable avec un message d'aide paramétré
8077 if (empty($this->f->get_submitted_get_value("message_help")) === false) {
8078 // On ajoute le message d'aide dans l'url de retour
8079 $paramsHref['message_help'] = urlencode($this->f->get_submitted_get_value("message_help"));
8080 }
8081
8082 if($this->getParameter("idx_dossier") != "") {
8083 $paramsHref['obj'] = "recherche_dossier";
8084 } else {
8085 if($this->getParameter("retour") == "form") {
8086 $paramsHref['idx'] = $this->getParameter("idx");
8087 $paramsHref['action'] = '3';
8088 if (!($this->getParameter("validation") > 0 && $this->getParameter("maj") == 2 && $this->correct)) {
8089 $baseURL = OM_ROUTE_FORM;
8090
8091 }
8092 }
8093 $paramsHref['obj'] = $this->f->get_submitted_get_value('retour_widget') !== null ?
8094 $this->f->get_submitted_get_value('retour_widget') :
8095 $this->get_absolute_class_name();
8096
8097 if ($this->f->get_submitted_get_value('widget_recherche_id') !== null) {
8098 $paramsHref['widget_recherche_id'] = $this->f->get_submitted_get_value('widget_recherche_id');
8099 }
8100 if (empty($this->f->get_submitted_get_value('retourformulaire2')) === false) {
8101 $paramsHref['retourformulaire'] = $this->f->get_submitted_get_value('retourformulaire2');
8102 }
8103 }
8104
8105 // Construction du lien à partir des valeurs stockées dans le tableau
8106 $href = array_map(function ($key, $value) {
8107 return '&'.$key.'='.$value;
8108 }, array_keys($paramsHref), $paramsHref);
8109 $href = $baseURL.implode('', $href);
8110
8111 return $href;
8112 }
8113
8114 /**
8115 * Surcharge du bouton retour afin de retourner sur la recherche de dossiers
8116 * d'instruction existant.
8117 */
8118 function retour($premier = 0, $recherche = "", $tricol = "") {
8119 $css_class = "retour";
8120 // Récupération du lien de redirection
8121 $href = str_replace(
8122 "&",
8123 "&amp;",
8124 $this->get_back_link("formulaire")
8125 );
8126 // Affichage du bouton retour avec le lien et la classe voulues
8127 $this->f->layout->display_form_retour(array(
8128 "id" => "form-action-".$this->get_absolute_class_name()."-back-".uniqid(),
8129 "href" => $href,
8130 "class" => $css_class,
8131 ));
8132 }
8133
8134 /**
8135 * Permet de modifier le fil d'Ariane
8136 * @param string $ent Fil d'Ariane
8137 * @param array $val Valeurs de l'objet
8138 * @param intger $maj Mode du formulaire
8139 */
8140 function getFormTitle($ent) {
8141
8142 // Fil d'Ariane
8143 $type_aff_form = $this->get_type_affichage_formulaire();
8144 switch ($type_aff_form) {
8145 case 'DPC':
8146 case 'ADS':
8147 $ent = _("instruction")." -> "._("dossiers d'instruction");
8148 break;
8149 case 'CTX IN':
8150 $ent = _("contentieux")." -> "._("infraction");
8151 break;
8152 case 'CTX RE':
8153 $ent = _("contentieux")." -> "._("recours");
8154 break;
8155 case 'CONSULTATION ENTRANTE':
8156 $ent = __("instruction")." -> ".__("dossiers de consultation");
8157 }
8158
8159 // Si différent de l'ajout
8160 if($this->getParameter("maj") != 0) {
8161 // Si le champ dossier_libelle existe
8162 if (trim($this->getVal("dossier_libelle")) != '') {
8163 $ent .= " -> ".strtoupper($this->getVal("dossier_libelle"));
8164 }
8165 // Si contexte ADS
8166 if ($type_aff_form ==='ADS'
8167 && trim($this->getVal("dossier")) != '') {
8168 $demandeur = $this->get_demandeur($this->getVal("dossier"));
8169 // Si le demandeur existe
8170 if (isset($demandeur) && trim($demandeur) != '') {
8171 $ent .= " ".mb_strtoupper($demandeur, "UTF-8");
8172 }
8173 }
8174
8175 // Dans le cas d'un dossier d'instruction issu d'un dépôt électronique
8176 // applique un style spécifique sur le fil d'Arianne
8177 if ($this->getVal('depot_electronique') === 't') {
8178 $this->f->addStyleForTitle("demat-color-breadcrumb");
8179 }
8180 }
8181
8182 // Change le fil d'Ariane pour l'interface de géolocalisation automatique des DI
8183 if ($this->getParameter("maj") == 126) {
8184 $ent = _("administration")." -> "._("options avancées")." -> "._("Géolocalisation des dossiers");
8185 }
8186
8187 // Change le fil d'Ariane
8188 return $ent;
8189 }
8190
8191 /**
8192 * Récupère le demandeur du dossier
8193 * @return string Identifiant du dossier
8194 */
8195 private function get_demandeur($dossier) {
8196
8197 // init de la variable de retour
8198 $demandeur = '';
8199
8200 // Requête SQL
8201 $sql = "SELECT
8202 CASE WHEN demandeur.qualite='particulier'
8203 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
8204 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
8205 END as demandeur
8206 FROM ".DB_PREFIXE."dossier
8207 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
8208 ON lien_dossier_demandeur.dossier=dossier.dossier
8209 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
8210 LEFT JOIN ".DB_PREFIXE."demandeur
8211 ON lien_dossier_demandeur.demandeur=demandeur.demandeur
8212 WHERE dossier.dossier ='".$dossier."'";
8213 $demandeur = $this->f->db->getone($sql);
8214 $this->addToLog(
8215 __METHOD__."(): db->getone(\"".$sql."\");",
8216 VERBOSE_MODE
8217 );
8218 $this->f->isDatabaseError($demandeur);
8219 // Résultat retourné
8220 return $demandeur;
8221 }
8222
8223 /**
8224 * Récupère la durée de validité
8225 * @param string $dossier_autorisation Identifiant dossier d'autorisation
8226 * @return intger Durée de validité
8227 */
8228 function get_duree_validite($dossier_autorisation, $force_param = false) {
8229
8230 // Récupère le numéro de version
8231 $numeroVersion = $this->getNumeroVersion($dossier_autorisation);
8232
8233 // Si c'est l'ajout du dossier initial
8234 if ($numeroVersion < 0 || $force_param === true) {
8235
8236 // Récupération de la duree de validite depuis la table
8237 // "dossier_autorisation_type_detaille"
8238 $sql = "SELECT duree_validite_parametrage
8239 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
8240 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
8241 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8242 WHERE dossier_autorisation.dossier_autorisation='".$dossier_autorisation."'";
8243 $duree_validite = $this->f->db->getone($sql);
8244 $this->addToLog(
8245 __METHOD__."(): db->getone(\"".$sql."\");",
8246 VERBOSE_MODE
8247 );
8248 $this->f->isDatabaseError($duree_validite);
8249 } else {
8250
8251 // Récupération de la duree de validite depuis le P0
8252 $sql = "SELECT duree_validite
8253 FROM ".DB_PREFIXE."dossier
8254 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
8255 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
8256 WHERE dossier_autorisation.dossier_autorisation='".$dossier_autorisation."'
8257 AND dossier.version = 0";
8258 $duree_validite = $this->f->db->getone($sql);
8259 $this->addToLog(
8260 __METHOD__."(): db->getone(\"".$sql."\");",
8261 VERBOSE_MODE
8262 );
8263 $this->f->isDatabaseError($duree_validite);
8264 }
8265 // Vérifie si la duree de validité a bien été récupérée. Si ce n'est pas le cas
8266 // la duree de validite est mise à 0 par défaut pour ne pas bloquer le traitement
8267 // (notamment en modification du dossier) et on affiche le problème dans les logs.
8268 try {
8269 if (! isset($duree_validite) || $duree_validite == null || $duree_validite == '') {
8270 $duree_validite = '0';
8271 throw new UnexpectedValueException('Unexpected NULL value');
8272 }
8273 } catch (UnexpectedValueException $e) {
8274 $this->addToLog(
8275 $e.
8276 ' : '.
8277 _("Erreur : la récupération de la durée de validité à échouée pour le dossier : ").
8278 $dossier_autorisation
8279 );
8280 }
8281
8282 // retourne le résultat
8283 return $duree_validite;
8284
8285 }
8286
8287 /**
8288 * Ajoute les parcelles du dossier passé en paramètre et met à jour le
8289 * quartier du dossier.
8290 * @param string $dossier Identifiant du dossier
8291 * @param string $terrain_references_cadastrales Références cadastrales du
8292 * dossier
8293 */
8294 function ajouter_dossier_parcelle($dossier, $terrain_references_cadastrales) {
8295
8296 // Parse les parcelles
8297 $list_parcelles = $this->f->parseParcelles($terrain_references_cadastrales, $this->getVal('om_collectivite'));
8298
8299 // A chaque parcelle une nouvelle ligne est créée dans la table
8300 // dossier_parcelle
8301 foreach ($list_parcelles as $parcelle) {
8302
8303 // Instance de la classe dossier_parcelle
8304 $dossier_parcelle = $this->f->get_inst__om_dbform(array(
8305 "obj" => "dossier_parcelle",
8306 "idx" => "]",
8307 ));
8308
8309 // Valeurs à sauvegarder
8310 $value = array(
8311 'dossier_parcelle' => '',
8312 'dossier' => $dossier,
8313 'parcelle' => '',
8314 'libelle' => $parcelle['quartier']
8315 .$parcelle['section']
8316 .$parcelle['parcelle']
8317 );
8318
8319 // Ajout de la ligne
8320 $dossier_parcelle->ajouter($value);
8321 }
8322
8323 // Si la liste des parcelles n'est pas vide
8324 if (count($list_parcelles) > 0) {
8325
8326 // Récupère le code impôt de la première référence cadastrale
8327 $quartier_code_impots = $list_parcelles[0]['quartier'];
8328 // Récupère l'identifiant du quartier
8329 $quartier = $this->get_quartier_by_code_impot($quartier_code_impots);
8330
8331 // Ajoute le quartier au dossier
8332 $this->modifier_quartier_dossier($dossier, $quartier);
8333 }
8334 }
8335
8336 /**
8337 * Supprime les parcelles du dossier passé en paramètre et met à jour le
8338 * quartier du dossier.
8339 * @param string $dossier Identifiant du dossier
8340 */
8341 function supprimer_dossier_parcelle($dossier) {
8342
8343 // Suppression des parcelles du dossier
8344 $sql = "DELETE FROM ".DB_PREFIXE."dossier_parcelle
8345 WHERE dossier='".$dossier."'";
8346 $res = $this->f->db->query($sql);
8347 $this->addToLog(
8348 __METHOD__."(): db->query(\"".$sql."\");",
8349 VERBOSE_MODE
8350 );
8351 $this->f->isDatabaseError($res);
8352
8353 // Supprime le quartier dans dossier
8354 $this->modifier_quartier_dossier($dossier);
8355 }
8356
8357 /**
8358 * Modifie le quartier au dossier.
8359 * @param string $dossier Numéro du dossier
8360 * @param integer $quartier Identifiant du quartier
8361 */
8362 function modifier_quartier_dossier($dossier, $quartier = null) {
8363
8364 // Valeurs à mettre à jour
8365 $valF = array();
8366 $valF['quartier'] = $quartier;
8367
8368 // Met à jour le quartier du dossier
8369 $cle = " dossier='".$dossier."'";
8370 $res = $this->f->db->autoExecute(
8371 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
8372 $this->addToLog("ajouter_quartier_dossier(): db->autoexecute(\""
8373 .DB_PREFIXE."dossier\", ".print_r($valF, true)
8374 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
8375 $this->f->isDatabaseError($res);
8376 }
8377
8378 /**
8379 * Récupère le quartier par rapport au code impôts.
8380 * @param string $code_impots Code impôts du quartier
8381 *
8382 * @return integer Identifiant du quartier
8383 */
8384 function get_quartier_by_code_impot($code_impots) {
8385
8386 // Initialisation résultat
8387 $quartier = null;
8388
8389 // Si la condition n'est pas vide
8390 if ($code_impots != ""
8391 && $code_impots != null) {
8392
8393 // Requête SQL
8394 $sql = "SELECT quartier
8395 FROM ".DB_PREFIXE."quartier
8396 WHERE code_impots = '".$code_impots."'";
8397 $this->f->addToLog(
8398 "get_quartier_by_code_impots() : db->getOne(\"".$sql."\")",
8399 VERBOSE_MODE);
8400 $quartier = $this->f->db->getOne($sql);
8401 $this->f->isDatabaseError($quartier);
8402 }
8403
8404 // Retourne résultat
8405 return $quartier;
8406 }
8407
8408 /**
8409 * TREATMENT - update_initial_dt.
8410 *
8411 * Cette méthode ajoute les données techniques initiales d'un DI au format JSON.
8412 *
8413 * @return boolean
8414 */
8415 public function update_initial_dt($dt_json) {
8416 //
8417 $this->begin_treatment(__METHOD__);
8418 //
8419 if ($dt_json === null || $dt_json === '') {
8420 return $this->end_treatment(__METHOD__, false);
8421 }
8422 //
8423 $this->correct = true;
8424 $data = array();
8425 $data["initial_dt"] = $dt_json;
8426 //
8427 $res = $this->f->db->autoExecute(
8428 sprintf('%s%s', DB_PREFIXE, $this->table),
8429 $data,
8430 DB_AUTOQUERY_UPDATE,
8431 sprintf("%s = '%s'", $this->clePrimaire, $this->valF[$this->clePrimaire])
8432 );
8433 $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);
8434 if ($this->f->isDatabaseError($res, true) === true) {
8435 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
8436 $this->correct = false;
8437 return $this->end_treatment(__METHOD__, false);
8438 }
8439 return $this->end_treatment(__METHOD__, true);
8440 }
8441
8442
8443
8444 /**
8445 * Méthode permettant d'ajouter les données techniques d'un DI.
8446 *
8447 * @param integer $id identifiant de la demande
8448 * @param array $val tableau de valeurs postées via le formulaire
8449 *
8450 * @return boolean false si erreur
8451 */
8452 function ajoutDonneesTechniquesDI($id, $val) {
8453
8454 //On vérifie que le dossier d'autorisation a des données techniques
8455 $sql = "SELECT * "
8456 ."FROM ".DB_PREFIXE."donnees_techniques "
8457 ."WHERE dossier_autorisation = '".$this->valF["dossier_autorisation"]."'";
8458 $dtda = $this->f->db->query($sql);
8459 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
8460 if($this->f->isDatabaseError($dtda, true)){
8461 $this->f->addToLog(__METHOD__."() : ERROR - Erreur de base de données. Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
8462 return false;
8463 }
8464
8465 //Si le dossier d'autorisation a des données techniques
8466 if ( $dtda->numrows() == 1 ){
8467 //
8468 $dtdi = $this->f->get_inst__om_dbform(array(
8469 "obj" => "donnees_techniques",
8470 "idx" => "]",
8471 ));
8472 //Préparation des données
8473 $valF = $dtda->fetchRow(DB_FETCHMODE_ASSOC);
8474
8475 //Sauvegarde des données techniques initiales
8476 //Conversion en JSON
8477 $dt_json = json_encode($valF);
8478
8479 //Enregistrement en BDD
8480 $sauvegarde_bdd = $this->update_initial_dt($dt_json);
8481
8482 //Gestion des erreurs
8483 if ($sauvegarde_bdd === false){
8484 $msg_error = __("Erreur de base de données. Impossible de sauvegarder les données techniques du dossier d'instruction au format JSON.");
8485 $this->f->addToLog(sprintf(
8486 "%s() : ERREUR - %s",
8487 __METHOD__,
8488 $msg_error
8489 ));
8490 $this->addToMessage(sprintf(
8491 "%s %s",
8492 $msg_error,
8493 __("Veuillez contacter votre administrateur.")
8494 ));
8495
8496 return false;
8497 }
8498
8499 //Suppression de l'identifiant
8500 $valF["donnees_techniques"] = null;
8501 // Ajout du numéro de dossier d'instruction
8502 $valF['dossier_instruction'] = $this->valF['dossier'];
8503 // Suppression du numéro de dossier d'autorisation
8504 $valF['dossier_autorisation'] = null;
8505 // Ajout des données techniques
8506 if($dtdi->ajouter($valF) === false) {
8507 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
8508 return false;
8509 }
8510 }
8511 else {
8512 //Le dossier d'autorisation n'a pas de données techniques
8513 $this->f->addToLog(__METHOD__."() : ERROR - le DA n'a pas de données techniques.", DEBUG_MODE);
8514 return -1;
8515 }
8516
8517 //
8518 return true;
8519 }
8520
8521 /**
8522 * Méthode permettant d'ajouter le dossier operateur d'un DI.
8523 *
8524 * @param integer $id identifiant de la demande
8525 * @param array $val tableau de valeurs postées via le formulaire
8526 *
8527 * @return boolean false si erreur
8528 */
8529 function ajoutDossierOperateurDI($id, $val) {
8530 //
8531 $dodi = $this->f->get_inst__om_dbform(array(
8532 "obj" => "dossier_operateur",
8533 "idx" => "]",
8534 ));
8535
8536 $valF = array();
8537 foreach ($dodi->champs as $champ) {
8538 $valF[$champ] = null;
8539 }
8540 // Ajout du numéro de dossier d'instruction
8541 $valF['dossier_instruction'] = $this->valF['dossier'];
8542 // Ajout du dossier operateur
8543 if($dodi->ajouter($valF) === false) {
8544 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les dossier opérateur du dossier d'instruction.", DEBUG_MODE);
8545 return false;
8546 }
8547
8548 //
8549 return true;
8550 }
8551
8552 /**
8553 * VIEW - contrainte.
8554 *
8555 * Vue des contraintes du dossier
8556 *
8557 * Cette vue permet de gérer le contenu de l'onglet "Contrainte(s)" sur un
8558 * dossier. Cette vue spécifique est nécessaire car l'ergonomie standard du
8559 * framework ne prend pas en charge ce cas.
8560 * C'est ici la vue spécifique des contraintes liées au dossier qui est
8561 * affichée directement au clic de l'onglet au lieu du soustab.
8562 *
8563 * L'idée est donc de simuler l'ergonomie standard en créant un container
8564 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
8565 * de la vue visualisation de l'objet lié.
8566 *
8567 * @return void
8568 */
8569 function view_contrainte() {
8570 // Vérification de l'accessibilité sur l'élément
8571 $this->checkAccessibility();
8572 // Récupération des variables GET
8573 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
8574 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
8575 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
8576 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
8577 $obj = "dossier_contrainte";
8578 $type_aff_form = $this->get_type_affichage_formulaire();
8579 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
8580 $obj = "dossier_contrainte_contexte_ctx";
8581 }
8582 // Objet à charger
8583 // Construction de l'url de sousformulaire à appeler
8584 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
8585 $url .= "&action=4";
8586 $url .= "&idx=".$idxformulaire;
8587 $url .= "&retourformulaire=".$retourformulaire;
8588 $url .= "&idxformulaire=".$idxformulaire;
8589 $url .= "&retour=form";
8590 // Affichage du container permettant le reffraichissement du contenu
8591 // dans le cas des action-direct.
8592 printf('
8593 <div id="sousform-href" data-href="%s">
8594 </div>',
8595 $url
8596 );
8597 // Affichage du container permettant de charger le retour de la requête
8598 // ajax récupérant le sous formulaire.
8599 printf('
8600 <div id="sousform-%s">
8601 </div>
8602 <script>
8603 ajaxIt(\'%s\', \'%s\');
8604 </script>',
8605 $obj,
8606 $obj,
8607 $url
8608 );
8609 }
8610
8611 /**
8612 * Cette methode permet d'afficher le bouton de validation du formulaire
8613 *
8614 * @param integer $maj Mode de mise a jour
8615 * @return void
8616 */
8617 function bouton($maj) {
8618
8619 if (!$this->correct
8620 && $this->checkActionAvailability() == true) {
8621 //
8622 switch($maj) {
8623 case 0 :
8624 $bouton = _("Ajouter");
8625 break;
8626 case 1 :
8627 $bouton = _("Modifier");
8628 break;
8629 case 2 :
8630 $bouton = _("Supprimer");
8631 break;
8632 case 200 :
8633 return;
8634 default :
8635 // Actions specifiques
8636 if ($this->get_action_param($maj, "button") != null) {
8637 //
8638 $bouton = $this->get_action_param($maj, "button");
8639 } else {
8640 //
8641 $bouton = _("Valider");
8642 }
8643 break;
8644 }
8645 //
8646 $params = array(
8647 "value" => $bouton,
8648 "name" => "submit",
8649 "onclick"=>"return getDataFieldReferenceCadastrale();",
8650 );
8651 //
8652 $this->f->layout->display_form_button($params);
8653 }
8654
8655 }
8656
8657 /**
8658 * Récupère l'instance de paramétrage des taxes.
8659 *
8660 * @param integer $taxe_amenagement Identifiant
8661 *
8662 * @return object
8663 */
8664 function get_inst_taxe_amenagement($taxe_amenagement = null) {
8665 //
8666 if ($this->inst_taxe_amenagement === null) {
8667 //
8668 if ($taxe_amenagement === null) {
8669 //
8670 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($this->getVal('om_collectivite'));
8671
8672 // Si aucun paramétrage de taxe trouvé et que la collectivité
8673 // est mono
8674 if ($taxe_amenagement === null
8675 && $this->f->isCollectiviteMono($this->getVal('om_collectivite')) === true) {
8676 // Récupère la collectivité multi
8677 $om_collectivite_multi = $this->f->get_idx_collectivite_multi();
8678 //
8679 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($om_collectivite_multi);
8680 }
8681
8682 //
8683 if ($taxe_amenagement === null) {
8684 //
8685 return null;
8686 }
8687 }
8688 //
8689 $this->inst_taxe_amenagement = $this->f->get_inst__om_dbform(array(
8690 "obj" => "taxe_amenagement",
8691 "idx" => $taxe_amenagement,
8692 ));
8693 }
8694 //
8695 return $this->inst_taxe_amenagement;
8696 }
8697
8698 /**
8699 * Récupère l'identifiant de la taxe d'aménagement par rapport à la collectivité.
8700 *
8701 * @param integer $om_collectivite La collectivité
8702 *
8703 * @return integer
8704 */
8705 function get_taxe_amenagement_by_om_collectivite($om_collectivite) {
8706 //
8707 $taxe_amenagement = null;
8708
8709 // Si la collectivité n'est pas renseigné
8710 if ($om_collectivite !== '' && $om_collectivite !== null) {
8711
8712 // SQL
8713 $sql = "SELECT taxe_amenagement
8714 FROM ".DB_PREFIXE."taxe_amenagement
8715 WHERE om_collectivite = ".intval($om_collectivite);
8716 $taxe_amenagement = $this->f->db->getOne($sql);
8717 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
8718 $this->f->isDatabaseError($taxe_amenagement);
8719 }
8720
8721 //
8722 return $taxe_amenagement;
8723 }
8724
8725 /**
8726 * [get_inst_donnees_techniques description]
8727 *
8728 * @param [type] $donnees_techniques [description]
8729 *
8730 * @return [type] [description]
8731 */
8732 function get_inst_donnees_techniques($donnees_techniques = null) {
8733 //
8734 if (is_null($this->inst_donnees_techniques)) {
8735 //
8736 if (is_null($donnees_techniques)) {
8737 $donnees_techniques = $this->getDonneesTechniques();
8738 }
8739 //
8740 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
8741 "obj" => "donnees_techniques",
8742 "idx" => $donnees_techniques,
8743 ));
8744 }
8745 //
8746 return $this->inst_donnees_techniques;
8747 }
8748
8749
8750 /**
8751 * TODO: replace with '$this->f->findObjectById' ?
8752 *
8753 * Récupère l'instance du dossier d'autorisation.
8754 *
8755 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
8756 *
8757 * @return object
8758 */
8759 function get_inst_dossier_autorisation($dossier_autorisation = null) {
8760 //
8761 return $this->get_inst_common("dossier_autorisation", $dossier_autorisation);
8762 }
8763
8764
8765 /**
8766 * Récupère l'instance du dossier d'autorisation, puis la clé d'accès au portail
8767 * citoyen associée à ce DA.
8768 *
8769 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
8770 *
8771 * @return string $cle_acces_citoyen si la clé d'accès existe
8772 * boolean false si la clé n'existe pas
8773 */
8774 protected function get_citizen_access_key($dossier_autorisation = null) {
8775 //
8776 $inst_da = $this->get_inst_dossier_autorisation($dossier_autorisation);
8777 // Récupération de la valeur de la clé d'accès
8778 $cle_acces_citoyen = $inst_da->getVal('cle_acces_citoyen');
8779 if ($cle_acces_citoyen === '' OR $cle_acces_citoyen === null) {
8780 return false;
8781 }
8782 return $cle_acces_citoyen;
8783 }
8784
8785
8786 /**
8787 * Récupère l'instance du type détaillé du dossier d'autorisation.
8788 *
8789 * @param integer $dossier_autorisation_type_detaille Identifiant
8790 *
8791 * @return object
8792 */
8793 function get_inst_dossier_autorisation_type_detaille($dossier_autorisation_type_detaille = null) {
8794 //
8795 if (is_null($this->inst_dossier_autorisation_type_detaille)) {
8796 //
8797 if (is_null($dossier_autorisation_type_detaille)) {
8798 //
8799 $dossier_autorisation = $this->get_inst_dossier_autorisation();
8800 //
8801 $dossier_autorisation_type_detaille = $dossier_autorisation->getVal('dossier_autorisation_type_detaille');
8802 }
8803 //
8804 $this->inst_dossier_autorisation_type_detaille = $this->f->get_inst__om_dbform(array(
8805 "obj" => "dossier_autorisation_type_detaille",
8806 "idx" => $dossier_autorisation_type_detaille,
8807 ));
8808 }
8809 //
8810 return $this->inst_dossier_autorisation_type_detaille;
8811 }
8812
8813 /**
8814 * Récupère l'instance du cerfa
8815 *
8816 * @param integer $cerfa Identifiant du cerfa
8817 *
8818 * @return object
8819 */
8820 function get_inst_cerfa($cerfa = null) {
8821 //
8822 if (is_null($this->inst_cerfa)) {
8823 //
8824 if (is_null($cerfa)) {
8825 //
8826 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
8827 //
8828 $cerfa = $dossier_autorisation_type_detaille->getVal('cerfa');
8829 }
8830 //
8831 $this->inst_cerfa = $this->f->get_inst__om_dbform(array(
8832 "obj" => "cerfa",
8833 "idx" => $cerfa,
8834 ));
8835 }
8836 //
8837 return $this->inst_cerfa;
8838 }
8839
8840 /**
8841 * CONDITION - is_user_from_allowed_collectivite.
8842 *
8843 * Cette condition permet de vérifier si l'utilisateur connecté appartient
8844 * à une collectivité autorisée : c'est-à-dire de niveau 2 ou identique à
8845 * la collectivité de l'enregistrement sur lequel on se trouve.
8846 *
8847 * @return boolean
8848 */
8849 function is_user_from_allowed_collectivite() {
8850
8851 // Si l'utilisateur est de niveau 2
8852 if ($_SESSION["niveau"] == "2") {
8853 // Alors l'utilisateur fait partie d'une collectivité autorisée
8854 return true;
8855 }
8856
8857 // L'utilisateur est donc de niveau 1
8858 // On vérifie donc si la collectivité de l'utilisateur est la même
8859 // que la collectivité de l'élément sur lequel on se trouve
8860 if ($_SESSION["collectivite"] === $this->getVal("om_collectivite")) {
8861 // Alors l'utilisateur fait partie d'une collectivité autorisée
8862 return true;
8863 }
8864
8865 // L'utilisateur ne fait pas partie d'une collectivité autorisée
8866 return false;
8867 }
8868
8869 /**
8870 * Création ou mise à jour du répertoire de numérisation.
8871 *
8872 * L'objet de cette méthode est la création ou la mise à jour de la date de
8873 * modification du répertoire de numérisation destiné à recevoir les pièces
8874 * numérisées pour un import automatique.
8875 * À chaque saisie d'une nouvelle demande dans openADS, le répertoire est
8876 * soit créé soit mis à jour pour être disponible en dehors d'openADS
8877 * (point de montage sur le serveur) pour permettre de déposer les pièces
8878 * numérisées directement depuis le copieur. À intervalle régulier, un
8879 * service vérifie le contenu de ces répertoire pour importer
8880 * automatiquement ces fichiers dans l'onglet 'Pièce(s)' du dossier
8881 * concerné.
8882 * La mise à jour de la date de modification est importante pour réaliser
8883 * la purge des répertoires vides sur la base de la date de la dernière
8884 * demande qui concerne le dossier.
8885 *
8886 * @return boolean
8887 */
8888 function create_or_touch_digitalization_folder() {
8889
8890 // Nom du répertoire
8891 // Le répertoire créé possède comme nom le libellé du dossier avec
8892 // le suffixe séparé par un '.'. Exemple : PC0130551601234.P0
8893 $separateur = '';
8894 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
8895 $separateur = '.';
8896 }
8897
8898 $digitalization_folder_name = str_replace(
8899 $this->getVal("dossier_autorisation"),
8900 $this->getVal("dossier_autorisation").$separateur,
8901 $this->getVal($this->clePrimaire)
8902 );
8903
8904 // Vérifie que l'option de numérisation des dossiers est désactivée
8905 if ($this->f->is_option_digitalization_folder_enabled() !== true) {
8906 //
8907 $this->addToLog(
8908 _("L'option de numerisation des dossiers n'est pas activee").".",
8909 DEBUG_MODE
8910 );
8911 return false;
8912 }
8913
8914 // Vérifie le paramétrage du répertoire de numérisation
8915 if ($this->f->getParameter("digitalization_folder_path") === null) {
8916 //
8917 $this->addToLog(
8918 "Configuration du répertoire de numérisation incorrecte.",
8919 DEBUG_MODE
8920 );
8921 return false;
8922 }
8923
8924 // Répertoire cible
8925 $root_folder_path = $this->f->getParameter("digitalization_folder_path");
8926
8927 // Vérifie que le répertoire existe
8928 if (is_dir($root_folder_path) !== true) {
8929 //
8930 $this->addToLog(
8931 sprintf(
8932 "Le répertoire '%s' n'existe pas.",
8933 $root_folder_path
8934 ),
8935 DEBUG_MODE
8936 );
8937 return false;
8938 }
8939
8940 // Répertoire des "à traiter"
8941 $todo_folder_path = $root_folder_path."Todo/";
8942
8943 // Vérifie que le répertoire existe
8944 if (is_dir($todo_folder_path) !== true) {
8945 //
8946 $this->addToLog(
8947 sprintf(
8948 "Le répertoire '%s' n'existe pas.",
8949 $todo_folder_path
8950 ),
8951 DEBUG_MODE
8952 );
8953 return false;
8954 }
8955
8956 // Répertoire de numérisation.
8957 $digitalization_folder_path = $todo_folder_path.$digitalization_folder_name;
8958
8959 // Si le répertore existe déjà le répertoire n'est pas créé
8960 if (file_exists($digitalization_folder_path) == true) {
8961 // Mise à jour du répertoire
8962 if (touch($digitalization_folder_path) !== true) {
8963 // Si une erreur survient
8964 $this->addToLog(
8965 sprintf(
8966 "Erreur lors de la mise à jour du répertoire '%s'.",
8967 $digitalization_folder_path
8968 ),
8969 DEBUG_MODE
8970 );
8971 return false;
8972 }
8973 //
8974 return true;
8975 } else {
8976 // Création du répertoire
8977 if (mkdir($digitalization_folder_path) !== true) {
8978 //
8979 $this->addToLog(
8980 sprintf(
8981 "Erreur lors de la création du répertoire '%s'.",
8982 $digitalization_folder_path
8983 ),
8984 DEBUG_MODE
8985 );
8986 return false;
8987 }
8988 //
8989 return true;
8990 }
8991 }
8992
8993 /**
8994 * Récupère, convertit et retourne les logs de toutes les instructions
8995 *
8996 * @return array tableau indexé de logs
8997 */
8998 public function get_log_instructions() {
8999 $log_instructions = $this->getVal('log_instructions');
9000 // Gestion du premier log
9001 if ($log_instructions === '') {
9002 $log_instructions = json_encode(array());
9003 }
9004 // Gestion du log invalide
9005 if(!$this->isJson($log_instructions)) {
9006 return false;
9007 }
9008 return json_decode($log_instructions, true);
9009 }
9010
9011 /**
9012 * Ajoute un log d'instruction aux logs existants
9013 *
9014 * @param array $log valeurs de l'instruction
9015 * @return bool vrai si traitement effectué avec succès
9016 */
9017 public function add_log_instructions($log) {
9018 // Begin
9019 $this->begin_treatment(__METHOD__);
9020 // Ajout du log
9021 $log_instructions = $this->get_log_instructions();
9022 if ($log_instructions === false) {
9023 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9024 return $this->end_treatment(__METHOD__, false);
9025 }
9026 array_push($log_instructions, $log);
9027 $log_instructions = json_encode($log_instructions);
9028 // Mise à jour du DI
9029 $val = array("log_instructions"=>$log_instructions);
9030 $ret = $this->f->db->autoexecute(
9031 DB_PREFIXE."dossier",
9032 $val,
9033 DB_AUTOQUERY_UPDATE,
9034 "dossier = '".$this->getVal('dossier')."'"
9035 );
9036 $this->addToLog(
9037 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($val, true).", DB_AUTOQUERY_UPDATE, \"dossier = '".$this->getVal('dossier')."'\");",
9038 VERBOSE_MODE
9039 );
9040 if ($this->f->isDatabaseError($ret, true) !== false) {
9041 $this->erreur_db($ret->getDebugInfo(), $ret->getMessage(), 'dossier');
9042 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9043 return $this->end_treatment(__METHOD__, false);
9044 }
9045 return $this->end_treatment(__METHOD__, true);
9046 }
9047
9048 /**
9049 * TREATMENT - mark_as_connected_to_referentiel_erp.
9050 *
9051 * Cette méthode permet de positionner le marqueur
9052 * 'interface_referentiel_erp' à 'true'. Cela signifie que le dossier est
9053 * connecté au référentiel ERP.
9054 *
9055 * @return boolean
9056 */
9057 function mark_as_connected_to_referentiel_erp() {
9058 //
9059 $this->begin_treatment(__METHOD__);
9060 //
9061 $data = array("interface_referentiel_erp" => true, );
9062 // Exécution de la requête
9063 $res = $this->f->db->autoExecute(
9064 DB_PREFIXE.$this->table,
9065 $data,
9066 DB_AUTOQUERY_UPDATE,
9067 $this->getCle($this->getVal($this->clePrimaire))
9068 );
9069 // Logger
9070 $this->addToLog(
9071 __METHOD__."(): db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");",
9072 VERBOSE_MODE
9073 );
9074 //
9075 if ($this->f->isDatabaseError($res, true)) {
9076 // Appel de la methode de recuperation des erreurs
9077 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9078 $this->correct = false;
9079 $this->addToLog(
9080 __METHOD__."(): Problème erreur lors de la mise à jour du dossier",
9081 DEBUG_MODE
9082 );
9083 // Termine le traitement
9084 return $this->end_treatment(__METHOD__, false);
9085 }
9086 //
9087 $this->addToMessage(_("Le dossier est désormais 'connecté avec le référentiel ERP'."));
9088 return $this->end_treatment(__METHOD__, true);
9089 }
9090
9091 /**
9092 * CONDITION - is_connected_to_referentiel_erp.
9093 *
9094 * @return boolean
9095 */
9096 function is_connected_to_referentiel_erp() {
9097 //
9098 if ($this->getVal("interface_referentiel_erp") !== "t") {
9099 return false;
9100 }
9101 //
9102 return true;
9103 }
9104
9105
9106 /**
9107 * Retourne les données techniques applicables au dossier courant, càd les données
9108 * techniques liées au dossier avec seulement les champs du CERFA associé au type de
9109 * dossier.
9110 *
9111 * @return array $donnees_techniques_applicables Tableau associatif contenant
9112 * seulement les données techniques
9113 * applicables au dossier.
9114 */
9115 public function get_donnees_techniques_applicables() {
9116
9117 // Récupération de l'identifiant des données techniques liées au dossier
9118 $donnees_techniques = $this->getDonneesTechniques();
9119
9120 $inst_donnees_techniques = $this->get_inst_common('donnees_techniques', $donnees_techniques);
9121 $donnees_techniques_applicables = $inst_donnees_techniques->get_donnees_techniques_applicables();
9122 //
9123 return $donnees_techniques_applicables;
9124
9125 }
9126
9127
9128 /**
9129 * Retourne un tableau avec les données du dossier d'instruction.
9130 *
9131 * L'objectif est de mettre à disposition via un WS REST un ensemble
9132 * de données exploitable par une autre application.
9133 */
9134 function get_datas() {
9135
9136 /**
9137 *
9138 */
9139
9140 // TODO: replace '$this->get_inst_common' with '$this->f->findObjectById' ?
9141 $om_collectivite = $this->get_inst_common('om_collectivite', $this->getVal('om_collectivite'));
9142 $instructeur = $this->get_inst_common('instructeur', $this->getVal('instructeur'));
9143 $division = $this->get_inst_common('division', $this->getVal('division'));
9144 $etat = $this->get_inst_common('etat', $this->getVal('etat'));
9145 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9146 $dossier_autorisation_type = $this->get_inst_common('dossier_autorisation_type', $dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9147 $donnees_techniques = $this->get_donnees_techniques_applicables();
9148
9149 //
9150 $datas = array(
9151 //
9152 "dossier_instruction" => $this->getVal($this->clePrimaire),
9153 //
9154 "dossier_autorisation" => $this->getVal("dossier_autorisation"),
9155 //
9156 "terrain_adresse_voie_numero" => $this->getVal("terrain_adresse_voie_numero"),
9157 "terrain_adresse_lieu_dit" => $this->getVal("terrain_adresse_lieu_dit"),
9158 "terrain_adresse_code_postal" => $this->getVal("terrain_adresse_code_postal"),
9159 "terrain_adresse_cedex" => $this->getVal("terrain_adresse_cedex"),
9160 "terrain_adresse_voie" => $this->getVal("terrain_adresse_voie"),
9161 "terrain_adresse_bp" => $this->getVal("terrain_adresse_bp"),
9162 "terrain_adresse_localite" => $this->getVal("terrain_adresse_localite"),
9163 "terrain_superficie" => $this->getVal("terrain_superficie"),
9164 //
9165 "references_cadastrales" => $this->f->parseParcelles($this->getVal("terrain_references_cadastrales"), $this->getVal('om_collectivite')),
9166 "dossier_autorisation_type" => $dossier_autorisation_type->getVal("libelle"),
9167 "dossier_autorisation_type_detaille" => $dossier_autorisation_type_detaille->getVal("libelle"),
9168 "collectivite" => $om_collectivite->getVal("libelle"),
9169 "instructeur" => $instructeur->getVal("nom"),
9170 "division" => $division->getVal("libelle"),
9171 "etat_dossier" => $etat->getVal("libelle"),
9172 "statut_dossier" => $this->getStatut(),
9173 "date_depot_initial" => $this->getVal("date_depot"),
9174 "date_limite_instruction" => $this->getVal("date_limite"),
9175 "date_decision" => $this->getVal("date_decision"),
9176 "enjeu_urbanisme" => $this->getVal("enjeu_urba") == 't' ? 'true' : 'false',
9177 "enjeu_erp" => $this->getVal("enjeu_erp") == 't' ? 'true' : 'false',
9178 );
9179
9180 // Gestion des demandeurs.
9181 $this->listeDemandeur('dossier', $this->getVal($this->clePrimaire));
9182 //
9183 if (isset($this->valIdDemandeur["petitionnaire_principal"]) AND !empty($this->valIdDemandeur["petitionnaire_principal"])) {
9184 $demandeur = $this->f->get_inst__om_dbform(array(
9185 "obj" => "petitionnaire",
9186 "idx" => $this->valIdDemandeur["petitionnaire_principal"][0],
9187 ));
9188 $datas["petitionnaire_principal"] = $demandeur->get_datas();
9189 $demandeur->__destruct();
9190 }
9191 //
9192 if (isset($this->valIdDemandeur["delegataire"]) && !empty($this->valIdDemandeur["delegataire"])) {
9193 $demandeur = $this->f->get_inst__om_dbform(array(
9194 "obj" => "delegataire",
9195 "idx" => $this->valIdDemandeur["delegataire"][0],
9196 ));
9197 $datas["delegataire"] = $demandeur->get_datas();
9198 $demandeur->__destruct();
9199 }
9200 //
9201 if (isset($this->valIdDemandeur["petitionnaire"]) AND !empty($this->valIdDemandeur["petitionnaire"])) {
9202 $datas["autres_petitionnaires"] = array();
9203 foreach ($this->valIdDemandeur["petitionnaire"] as $petitionnaire) {
9204 $demandeur = $this->f->get_inst__om_dbform(array(
9205 "obj" => "petitionnaire",
9206 "idx" => $petitionnaire,
9207 ));
9208 $datas["autres_petitionnaires"][] = $demandeur->get_datas();
9209 $demandeur->__destruct();
9210 }
9211 }
9212
9213 // Tableau contenant le nom de chaque champ de données techniques à retourner
9214 $dt_a_afficher = array(
9215 "co_tot_log_nb",
9216 "co_cstr_exist",
9217 "co_uti_pers",
9218 "co_uti_vente",
9219 "co_uti_loc",
9220 "su_tot_shon_tot",
9221 "su_avt_shon_tot",
9222 "am_lot_max_nb",
9223 "am_empl_nb",
9224 );
9225
9226 // Tableau associatif contenant les données techniques voulues
9227 $tab_donnees_techniques = array();
9228 foreach ($dt_a_afficher as $key) {
9229 // On ajoute le champ de données techniques dans le retour seulement s'il
9230 // existe dans $donnees_techniques (s'il est applicable au dossier)
9231 if (array_key_exists($key, $donnees_techniques) === true) {
9232 if ($donnees_techniques[$key] === 't') {
9233 $donnees_techniques[$key] = 'true';
9234 };
9235 if ($donnees_techniques[$key] === 'f') {
9236 $donnees_techniques[$key] = 'false';
9237 };
9238 $tab_donnees_techniques[$key] = $donnees_techniques[$key];
9239 };
9240 };
9241
9242 $datas['donnees_techniques'] = $tab_donnees_techniques;
9243
9244 // Affiche le code INSEE de la collectivité du dossier d'instruction
9245 /*$collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
9246 $datas['collectivite_insee'] = $collectivite["insee"];*/
9247 $datas['collectivite_insee'] = $this->get_da_insee();
9248 //
9249 return $datas;
9250 }
9251
9252 /**
9253 * Renvoi le code INSEE du DA associé
9254 */
9255 protected function get_da_insee() {
9256 $inst_da = $this->f->get_inst__om_dbform(array(
9257 "obj" => "dossier_autorisation",
9258 "idx" => $this->getVal('dossier_autorisation')
9259 ));
9260 return $inst_da->getVal('insee');
9261 }
9262
9263 /**
9264 * CONDITION - is_class_dossier_corresponding_to_his_groupe
9265 *
9266 * Vérifie la correspondance groupe/classe du dossier instancié.
9267 *
9268 * @param string $classe
9269 * @return boolean
9270 */
9271 protected function is_class_dossier_corresponding_to_type_form($classe) {
9272 $type_form = $this->get_type_affichage_formulaire();
9273 switch ($type_form) {
9274 case 'DPC';
9275 case 'ADS':
9276 case 'CONSULTATION ENTRANTE':
9277 if ($this->f->starts_with($classe, 'dossier_instruction') === true) {
9278 return true;
9279 }
9280 return false;
9281 case 'CTX RE':
9282 if ($this->f->ends_with($classe, '_recours') === true) {
9283 return true;
9284 }
9285 return false;
9286 case 'CTX IN':
9287 if ($this->f->ends_with($classe, '_infractions') === true) {
9288 return true;
9289 }
9290 return false;
9291 default:
9292 return false;
9293 }
9294 }
9295
9296
9297 /**
9298 * CONDITION - check_context
9299 *
9300 * Vérifie la correspondance groupes dossier/utilisateur.
9301 * Vérifie l'accès aux dossiers confidentiels.
9302 * Vérifie la correspondance groupe/classe.
9303 *
9304 * @return boolean
9305 */
9306 public function check_context() {
9307 // Le dossier doit être un objet valide
9308 $id = $this->getVal($this->clePrimaire);
9309 if ($id === 0 OR $id === '0' OR $id === '' OR $id === ']') {
9310 return false;
9311 }
9312
9313 // Vérification que l'utilisateur a accès au dossier
9314 if ($this->can_user_access_dossier() === false) {
9315 return false;
9316 }
9317 // Vérification que la classe métier instanciée est adéquate.
9318 return $this->is_class_dossier_corresponding_to_type_form($this->get_absolute_class_name());
9319 }
9320
9321 /**
9322 * VIEW - redirect.
9323 *
9324 * Cette vue est appelée lorsque l'on souhaite consulter un dossier dont on ne connaît pas le groupe.
9325 * Ce fonctionnement est nécessaire car les classes métier filles de 'dossier' sont relatives à ce groupe.
9326 *
9327 * Par exemple, depuis l'onglet "Dossiers Liés" du DI, le listing ne permet pas d'instancier chaque résultat
9328 * et par conséquent on n'a pas accès au groupe du dossier. L'action tableau consulter y est surchargée afin
9329 * d'amener à cette vue qui se charge de faire la redirection adéquate.
9330 *
9331 * @return void
9332 */
9333 public function redirect() {
9334 // Redirection vers la classe métier adéquate
9335 $context = $this->get_type_affichage_formulaire();
9336 switch ($context) {
9337 case 'ADS':
9338 case 'CONSULTATION ENTRANTE':
9339 $obj = 'dossier_instruction';
9340 break;
9341 case 'CTX RE':
9342 $obj = 'dossier_contentieux_tous_recours';
9343 break;
9344 case 'CTX IN':
9345 $obj = 'dossier_contentieux_toutes_infractions';
9346 break;
9347 default:
9348 return;
9349 }
9350 $idx = $this->getVal($this->clePrimaire);
9351 $link = OM_ROUTE_FORM.'&obj='.$obj.'&action=3&idx='.$idx;
9352 if ($this->f->get_submitted_get_value('retourformulaire') !== null
9353 && $this->f->get_submitted_get_value('idxformulaire') !== null) {
9354 $link .= '&premier=0&tricol=&retourformulaire='.$this->f->get_submitted_get_value('retourformulaire');
9355 $link .= '&idxformulaire='.$this->f->get_submitted_get_value('idxformulaire');
9356 }
9357
9358 header('Location: '.$link);
9359 exit();
9360 }
9361
9362
9363 /**
9364 * CONDITION - is_confidentiel
9365 *
9366 * Permet de savoir si le type de dossier d'autorisation du dossier courant est
9367 * confidentiel.
9368 *
9369 * @return boolean true si le dossier est confidentiel, sinon false.
9370 *
9371 */
9372 public function is_confidentiel() {
9373 //
9374 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9375 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9376 $confidentiel = $inst_dossier_autorisation_type->getVal('confidentiel');
9377 //
9378 if ($confidentiel === 't') {
9379 return true;
9380 }
9381 return false;
9382 }
9383
9384
9385 /**
9386 * CONDITION - can_user_access_dossier
9387 *
9388 * Effectue les vérifications suivantes :
9389 * - L'utilisateur doit avoir accès au groupe du dossier
9390 * - Si le dossier est confidentiel, l'utilisateur doit avoir accès aux dossiers
9391 * confidentiels de ce groupe
9392 *
9393 * @return boolean true si les conditions ci-dessus sont réunies, sinon false
9394 *
9395 */
9396 public function can_user_access_dossier() {
9397 // Récupère le code du groupe
9398 $groupe_dossier = $this->get_groupe();
9399
9400 // Le groupe doit être accessible par l'utilisateur ;
9401 if ($this->f->is_user_in_group($groupe_dossier) === false) {
9402 return false;
9403 }
9404 if ($this->is_confidentiel() === true) {
9405 //
9406 if ($this->f->can_user_access_dossiers_confidentiels_from_groupe($groupe_dossier) === false) {
9407 return false;
9408 }
9409 }
9410 return true;
9411 }
9412
9413
9414 /**
9415 * Met à jour une métadonnée sur tous les fichiers liés au dossier.
9416 *
9417 * @param string $metadata Nom de la métadonnée.
9418 * @param string $metadata_value Nouvelle valeur de la métadonnée.
9419 *
9420 * @return boolean
9421 */
9422 public function update_metadata_by_dossier($metadata, $metadata_value) {
9423 // Rècupère la liste des fichiers stockés liés au dossier
9424 $sql = sprintf('
9425 SELECT uid AS uid
9426 FROM %1$sdocument_numerise
9427 WHERE dossier = \'%2$s\'
9428 AND document_numerise IS NOT NULL
9429 UNION
9430 SELECT fichier AS uid
9431 FROM %1$sconsultation
9432 WHERE dossier = \'%2$s\'
9433 AND fichier IS NOT NULL
9434 UNION
9435 SELECT om_fichier_consultation AS uid
9436 FROM %1$sconsultation
9437 WHERE dossier = \'%2$s\'
9438 AND om_fichier_consultation IS NOT NULL
9439 UNION
9440 SELECT om_fichier_instruction AS uid
9441 FROM %1$sinstruction
9442 WHERE dossier = \'%2$s\'
9443 AND om_fichier_instruction IS NOT NULL
9444 UNION
9445 SELECT om_fichier_rapport_instruction AS uid
9446 FROM %1$srapport_instruction
9447 WHERE dossier_instruction = \'%2$s\'
9448 AND om_fichier_rapport_instruction IS NOT NULL;
9449 ',
9450 DB_PREFIXE,
9451 $this->getVal($this->clePrimaire)
9452 );
9453 $res = $this->f->db->query($sql);
9454 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
9455 $this->f->isDatabaseError($res);
9456
9457 // Définit la métadonnée à mettre à jour
9458 $metadata_update = array();
9459 $metadata_update[$metadata] = $metadata_value;
9460
9461 // Pour chaque résultat
9462 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
9463 // Met à jour les métadonnées du fichier
9464 $uid_update = $this->f->storage->storage->update_metadata($row['uid'], $metadata_update);
9465
9466 // Si la méthode ne retourne pas l'uid du fichier alors la mise
9467 // à jour ne s'est pas réalisée
9468 if ($uid_update !== $row['uid']) {
9469 //
9470 return false;
9471 }
9472 }
9473 $res->free();
9474
9475 //
9476 return true;
9477 }
9478
9479
9480 /**
9481 * Traitement pour les ERP.
9482 * Si la valeur du champ 'erp' a été modifié, modifie la valeur de la
9483 * métadonnée concernceERP sur tous les fichiers liés au dossier.
9484 *
9485 * @param array $values Liste des nouvelles valeurs.
9486 *
9487 * @return boolean
9488 */
9489 public function update_concerneERP(array $values) {
9490 // Définit le champ et la métadonnée
9491 $champ = 'erp';
9492 $metadata = 'concerneERP';
9493
9494 // Définit les valeurs à comparer
9495 $value_after = $this->get_boolean_from_view_value($values[$champ]);
9496 $value_before = $this->get_boolean_from_pgsql_value($this->getVal($champ));
9497
9498 // Vérifie si la valeur du champ a été modifié
9499 if ($value_after !== $value_before) {
9500 // Transforme la valeur booléenne en string
9501 $metadata_value = 'false';
9502 if ($value_after === true) {
9503 $metadata_value = 'true';
9504 }
9505
9506 // Met à jour les métadonnées des fichiers liés au dossier
9507 $update = $this->update_metadata_by_dossier($metadata, $metadata_value);
9508 //
9509 if ($update !== true) {
9510 //
9511 return false;
9512 }
9513 }
9514
9515 //
9516 return true;
9517 }
9518
9519
9520 /**
9521 * TODO: replace with '$this->f->findObjectById' ?
9522 *
9523 * Récupère l'instance du groupe.
9524 *
9525 * @param string $groupe Identifiant du groupe.
9526 *
9527 * @return object
9528 */
9529 private function get_inst_groupe($groupe) {
9530 //
9531 return $this->get_inst_common("groupe", $groupe);
9532 }
9533
9534
9535 /**
9536 * TODO: replace with '$this->f->findObjectById' ?
9537 *
9538 * Récupère l'instance du type de dossier d'autorisation.
9539 *
9540 * @param string $dossier_autorisation_type Identifiant du type de dossier
9541 * d'autorisation.
9542 *
9543 * @return object
9544 */
9545 private function get_inst_dossier_autorisation_type($dossier_autorisation_type) {
9546 //
9547 return $this->get_inst_common("dossier_autorisation_type", $dossier_autorisation_type);
9548 }
9549
9550
9551 /**
9552 * Récupère l'instance de la demande du dossier
9553 *
9554 * @param mixed Identifiant de la demande
9555 *
9556 * @return object
9557 */
9558 function get_inst_demande($demande = null) {
9559 //
9560 if (is_null($this->inst_demande)) {
9561 //
9562 if (is_null($demande)) {
9563 $demande = $this->get_demande_by_dossier_instruction();
9564 }
9565 //
9566 return $this->get_inst_common("demande", $demande);
9567 }
9568 //
9569 return $this->inst_demande;
9570 }
9571
9572
9573 /**
9574 * Récupère l'identifiant de la demande initiale par le dossier d'instruction.
9575 *
9576 * @return integer
9577 */
9578 function get_demande_by_dossier_instruction() {
9579 // Initialisation de la variable de retour
9580 $res = null;
9581
9582 // SQL
9583 $sql = "SELECT demande
9584 FROM ".DB_PREFIXE."demande
9585 WHERE dossier_instruction = '".$this->getVal($this->clePrimaire)."'
9586 ORDER BY instruction_recepisse ASC
9587 LIMIT 1";
9588 $res = $this->f->db->getOne($sql);
9589 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
9590 $this->f->isDatabaseError($res);
9591
9592 //
9593 return $res;
9594 }
9595
9596 /**
9597 * TREATMENT - update_last_modification_date.
9598 *
9599 * Cette methode met à jour la date de dernière modification du dossier.
9600 *
9601 * @return boolean
9602 */
9603 public function update_last_modification_date() {
9604 //
9605 $this->begin_treatment(__METHOD__);
9606 //
9607 $this->correct = true;
9608 $valF = array();
9609 $valF["date_modification"] = 'NOW';
9610 //
9611 $res = $this->f->db->autoExecute(
9612 DB_PREFIXE.$this->table,
9613 $valF,
9614 DB_AUTOQUERY_UPDATE,
9615 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
9616 );
9617 if ($this->f->isDatabaseError($res, true)) {
9618 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9619 $this->correct = false;
9620 return $this->end_treatment(__METHOD__, false);
9621 } else {
9622 return $this->end_treatment(__METHOD__, true);
9623 }
9624 //
9625 return $this->end_treatment(__METHOD__, false);
9626 }
9627
9628 /**
9629 * TREATMENT - update_hash_sitadel.
9630 *
9631 * Cette methode met à jour le hash SITADEL du dossier.
9632 *
9633 * @return boolean
9634 */
9635 public function update_hash_sitadel($hash_sitadel = null) {
9636 //
9637 $this->begin_treatment(__METHOD__);
9638 //
9639 if ($hash_sitadel !== null && $hash_sitadel !== '') {
9640 //
9641 $this->correct = true;
9642 $valF = array();
9643 $valF["hash_sitadel"] = $hash_sitadel;
9644 //
9645 $res = $this->f->db->autoExecute(
9646 DB_PREFIXE.$this->table,
9647 $valF,
9648 DB_AUTOQUERY_UPDATE,
9649 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
9650 );
9651 if ($this->f->isDatabaseError($res, true)) {
9652 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9653 $this->correct = false;
9654 return $this->end_treatment(__METHOD__, false);
9655 } else {
9656 return $this->end_treatment(__METHOD__, true);
9657 }
9658 }
9659 //
9660 return $this->end_treatment(__METHOD__, false);
9661 }
9662
9663 /**
9664 * TREATMENT - update_version_clos
9665 *
9666 * @param string $mode Mode de mise à jour ("up" ou "down")
9667 *
9668 * @return boolean
9669 */
9670 public function update_version_clos($mode) {
9671 //
9672 $this->begin_treatment(__METHOD__);
9673 //
9674 if ($mode !== 'up' && $mode !== 'down') {
9675 return $this->end_treatment(__METHOD__, false);
9676 }
9677 //
9678 $inst_da = $this->get_inst_dossier_autorisation($this->getVal("dossier_autorisation"));
9679 $da_version_clos = $inst_da->getval('numero_version_clos');
9680 //
9681 $this->correct = true;
9682 $data = array();
9683 $data["version_clos"] = 0;
9684 if ($da_version_clos !== null
9685 && $da_version_clos !== '') {
9686 //
9687 if ($mode === 'up') {
9688 $data["version_clos"] = intval($da_version_clos)+1;
9689 $inst_da->update_numero_version_clos($data["version_clos"]);
9690 }
9691 if ($mode === 'down') {
9692 $data["version_clos"] = null;
9693 }
9694 } else {
9695 $inst_da->update_numero_version_clos($data["version_clos"]);
9696 }
9697 //
9698 $res = $this->f->db->autoExecute(
9699 sprintf('%s%s', DB_PREFIXE, $this->table),
9700 $data,
9701 DB_AUTOQUERY_UPDATE,
9702 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
9703 );
9704 $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);
9705 if ($this->f->isDatabaseError($res, true) === true) {
9706 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9707 $this->correct = false;
9708 return $this->end_treatment(__METHOD__, false);
9709 }
9710 return $this->end_treatment(__METHOD__, true);
9711 }
9712
9713 /**
9714 * Récupère l'identifiant de l'état car le getVal() récupère le libellé.
9715 *
9716 * @return mixed Soit un string, soit "false"
9717 */
9718 function get_id_etat() {
9719 $qres = $this->f->get_one_result_from_db_query(
9720 sprintf(
9721 'SELECT
9722 etat
9723 FROM
9724 %1$sdossier
9725 WHERE
9726 dossier = \'%2$s\'',
9727 DB_PREFIXE,
9728 $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
9729 ),
9730 array(
9731 "origin" => __METHOD__,
9732 "force_return" => true,
9733 )
9734 );
9735 if ($qres["code"] !== "OK") {
9736 return false;
9737 }
9738 return $qres["result"];
9739 }
9740
9741 /**
9742 * Surcharge de la méthode rechercheTable pour éviter de court-circuiter le
9743 * générateur en devant surcharger la méthode cleSecondaire afin de supprimer
9744 * les éléments liés dans les tables NaN.
9745 *
9746 * @param mixed $dnu1 Instance BDD - À ne pas utiliser
9747 * @param string $table Table
9748 * @param string $field Champ
9749 * @param mixed $id Identifiant
9750 * @param mixed $dnu2 Marqueur de débogage - À ne pas utiliser
9751 * @param string $selection Condition de la requête
9752 *
9753 * @return void
9754 */
9755 function rechercheTable(&$dnu1 = null, $table, $field, $id, $dnu2 = null, $selection = "") {
9756
9757 // Dans le cas d'une suppression du dossier d'instruction, les tables
9758 // liées ne sont pas vérifiées
9759 $liaison_suppr = array (
9760 "demande",
9761 "donnees_techniques",
9762 "instruction",
9763 "lien_dossier_demandeur",
9764 );
9765 if ($this->get_action_crud() === 'delete'
9766 && in_array($table, array_keys($liaison_suppr)) === true) {
9767 // Annule la vérid
9768 $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);
9769 return;
9770 }
9771 //
9772 parent::rechercheTable($this->f->db, $table, $field, $id, null, $selection);
9773 }
9774
9775 /**
9776 * Effectue une requête sql pour récupérer la liste des id des demandeurs
9777 * associé au dossier et l'indicateur permettant de savoir si c'est un
9778 * demandeur principal ou pas.
9779 * Renvoi les résultats sous la forme d'un tableau.
9780 *
9781 * @return array|boolean tableau contenant les infos des demandeurs et false
9782 * en cas d'erreur de base de données.
9783 */
9784 public function get_demandeurs() {
9785 $query = sprintf('
9786 SELECT
9787 demandeur.demandeur,
9788 lien_dossier_demandeur.petitionnaire_principal,
9789 demandeur.type_demandeur
9790 FROM
9791 %1$sdemandeur
9792 INNER JOIN %1$slien_dossier_demandeur
9793 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
9794 WHERE
9795 lien_dossier_demandeur.dossier = \'%2$s\'',
9796 DB_PREFIXE,
9797 $this->getVal($this->clePrimaire)
9798 );
9799 $res = $this->f->get_all_results_from_db_query(
9800 $query,
9801 array(
9802 "origin" => __METHOD__,
9803 "force_return" => true,
9804 )
9805 );
9806 if ($res['code'] === 'KO') {
9807 return false;
9808 }
9809 return $res['result'];
9810 }
9811
9812 /**
9813 * TREATMENT - normalize_address
9814 *
9815 * Enregistre en base de données les valeurs concernant l'adresse normalisée.
9816 *
9817 * @param string $address Valeur de l'adresse normalisée.
9818 * @param string $address_json JSON de toutes les données de l'adresse normalisée.
9819 * @return boolean
9820 */
9821 public function normalize_address(string $address = null, string $address_json = '{}') {
9822 //
9823 $this->begin_treatment(__METHOD__);
9824 // Valeurs par défaut si l'adresse normalisée est vide
9825 if ($address === '') {
9826 $address = null;
9827 $address_json = '{}';
9828 }
9829 // Valeur par défaut pour le JSON de l'adresse si l'adresse saisie ne
9830 // correspond au label du JSON, donc adresse non sélectionnée parmis les
9831 // résultats retourner par l'API adresse
9832 if ($address !== null) {
9833 $address_json_decode = json_decode($address_json, true);
9834 if (isset($address_json_decode['label']) === true
9835 && $address !== $address_json_decode['label']) {
9836 //
9837 $address_json = '{}';
9838 }
9839 }
9840 //
9841 $this->correct = true;
9842 $data = array();
9843 $data["adresse_normalisee"] = $address;
9844 $data["adresse_normalisee_json"] = $address_json;
9845 //
9846 $res = $this->f->db->autoExecute(
9847 sprintf('%s%s', DB_PREFIXE, $this->table),
9848 $data,
9849 DB_AUTOQUERY_UPDATE,
9850 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
9851 );
9852 $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);
9853 if ($this->f->isDatabaseError($res, true) === true) {
9854 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9855 $this->correct = false;
9856 return $this->end_treatment(__METHOD__, false);
9857 }
9858 return $this->end_treatment(__METHOD__, true);
9859 }
9860
9861 public function get_last_instruction_decision() {
9862 $qres = $this->f->get_one_result_from_db_query(
9863 sprintf(
9864 'SELECT
9865 instruction.instruction
9866 FROM
9867 %1$sinstruction
9868 INNER JOIN %1$sdossier
9869 ON dossier.dossier = instruction.dossier
9870 INNER JOIN %1$setat
9871 ON dossier.etat = etat.etat
9872 WHERE
9873 instruction.etat = dossier.etat
9874 AND instruction.dossier = \'%2$s\'
9875 AND etat.statut = \'cloture\'
9876 ORDER BY
9877 instruction.instruction DESC
9878 LIMIT 1',
9879 DB_PREFIXE,
9880 $this->f->db->escapeSimple($this->getVal('dossier'))
9881 ),
9882 array(
9883 "origin" => __METHOD__,
9884 "force_return" => true,
9885 )
9886 );
9887 if ($qres["code"] !== "OK") {
9888 return false;
9889 }
9890 return $qres["result"];
9891 }
9892
9893 /**
9894 * VIEW - view_normalize_address.
9895 *
9896 * Formulaire de recherche de l'adresse normalisée.
9897 *
9898 * @return void
9899 */
9900 public function view_normalize_address() {
9901 // Vérification de l'accessibilité sur l'élément
9902 $this->checkAccessibility();
9903
9904 // Par défaut l'adresse saisie est celle renseignée sur le dossier
9905 $address_val = trim(preg_replace('/\s\s+/', ' ', sprintf('%s %s %s %s %s %s %s',
9906 $this->getVal('terrain_adresse_voie_numero'),
9907 $this->getVal('terrain_adresse_voie'),
9908 $this->getVal('terrain_adresse_lieu_dit'),
9909 $this->getVal('terrain_adresse_localite'),
9910 $this->getVal('terrain_adresse_code_postal'),
9911 $this->getVal('terrain_adresse_bp'),
9912 $this->getVal('terrain_adresse_cedex')
9913 )));
9914 $address_val_json = '{}';
9915 if ($this->getVal('adresse_normalisee') !== null
9916 && $this->getVal('adresse_normalisee') !== '') {
9917 //
9918 $address_val = $this->getVal('adresse_normalisee');
9919 $address_val_json = htmlentities($this->getVal('adresse_normalisee_json'));
9920 if ($this->f->get_submitted_post_value("submit-normalize") === null) {
9921 $this->f->displayMessage("error", __("L'adresse de ce terrain a déjà été normalisée."));
9922 }
9923 }
9924
9925 /**
9926 * TREATMENT
9927 */
9928 // Traitement si validation du formulaire
9929 if ($this->f->get_submitted_post_value("submit-normalize") !== null) {
9930 //
9931 $this->normalize_address($_POST["address"], $_POST["address_json"]);
9932 return;
9933 }
9934
9935 // Formulaire de validation
9936 $this->f->layout->display__form_container__begin(array(
9937 "action" => "",
9938 "name" => "f2_normalize_address",
9939 "onsubmit" => "normalize_address(this);return false;",
9940 ));
9941 //
9942 printf('
9943 <div id="sousform-href" data-href="%s"></div>',
9944 $this->compose_form_url("form", array(
9945 "validation" => null,
9946 "maj" => 160,
9947 "retour" => "form",
9948 ))
9949 );
9950 $champs = array('address', 'address_json', );
9951 // Instanciation de l'objet formulaire
9952 $this->form = $this->f->get_inst__om_formulaire(array(
9953 "validation" => 0,
9954 "maj" => $this->getParameter("maj"),
9955 "champs" => $champs,
9956 ));
9957 // Paramétrage des champs du formulaire
9958 // address
9959 $this->form->setLib("address", __("adresse à normaliser"));
9960 $this->form->setTaille("address", 60);
9961 $this->form->setMax("address", 255);
9962 $this->form->setType("address", "text");
9963 $this->form->setVal('address', $address_val);
9964 // address_json
9965 $this->form->setType("address_json", "hidden");
9966 $this->form->setVal('address_json', $address_val_json);
9967 $this->f->displayDescription(__("Veuillez sélectionner l'adresse normalisée qui se rapproche le plus de l'adresse du terrain."));
9968 // Ouverture du conteneur de formulaire
9969 $this->form->entete();
9970 $this->form->afficher($champs, 0, false, false);
9971 $this->form->enpied();
9972 $this->f->layout->display__form_controls_container__begin(array(
9973 "controls" => "bottom",
9974 ));
9975 $this->f->layout->display__form_input_submit(array(
9976 "name" => "submit-normalize",
9977 "value" => __("Normaliser l'adresse"),
9978 "class" => "boutonFormulaire",
9979 ));
9980 $this->f->layout->display__form_controls_container__end();
9981 //
9982 $this->f->layout->display__form_container__end();
9983 }
9984
9985
9986 public function get_last_instruction_incompletude() {
9987 $qres = $this->f->get_one_result_from_db_query(
9988 sprintf(
9989 'SELECT
9990 instruction.instruction
9991 FROM
9992 %1$sinstruction
9993 INNER JOIN %1$sevenement
9994 ON evenement.evenement = instruction.evenement
9995 WHERE
9996 instruction.dossier = \'%2$s\'
9997 AND evenement.type = \'incompletude\'
9998 ORDER BY
9999 instruction.instruction DESC
10000 LIMIT 1',
10001 DB_PREFIXE,
10002 $this->f->db->escapeSimple($this->getVal('dossier'))
10003 ),
10004 array(
10005 "origin" => __METHOD__,
10006 "force_return" => true,
10007 )
10008 );
10009 if ($qres["code"] !== "OK") {
10010 return false;
10011 }
10012 return $qres["result"];
10013 }
10014
10015 function get_max_num_suffixe($dat_c, $annee, $dep_c, $com_c, $num) {
10016 $qres = $this->f->get_one_result_from_db_query(
10017 sprintf(
10018 'SELECT
10019 MAX(numerotation_num_suffixe) as max_num_suffixe
10020 FROM
10021 %1$sdossier
10022 WHERE
10023 numerotation_type = \'%2$s\'
10024 AND annee = \'%3$s\'
10025 AND numerotation_dep = \'%4$s\'
10026 AND numerotation_com = \'%5$s\'
10027 AND numerotation_num = \'%6$s\'',
10028 DB_PREFIXE,
10029 $this->f->db->escapeSimple($dat_c),
10030 $this->f->db->escapeSimple($annee),
10031 $this->f->db->escapeSimple($dep_c),
10032 $this->f->db->escapeSimple($com_c),
10033 $this->f->db->escapeSimple($num)
10034 ),
10035 array(
10036 "origin" => __METHOD__,
10037 "force_return" => true,
10038 )
10039 );
10040 if ($qres["code"] !== "OK") {
10041 return null;
10042 }
10043 return $qres["result"];
10044 }
10045
10046 public function view_json_data() {
10047 $this->checkAccessibility();
10048 $this->f->disableLog();
10049 $view = $this->get_json_data();
10050 printf(json_encode($view));
10051 }
10052
10053 public function get_json_data() {
10054 $val = array_combine($this->champs, $this->val);
10055 foreach ($val as $key => $value) {
10056 $val[$key] = strip_tags($value);
10057 }
10058 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
10059 $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
10060 $val['dossier_autorisation_type_detaille_code'] = $inst_datd->getVal('code');
10061 $val['dossier_autorisation_type_code'] = $inst_dat->getVal('code');
10062 $val['dossier_instruction_type_code'] = $this->getCode($this->getVal('dossier_instruction_type'));
10063 $val['dossier_suffixe'] = '';
10064 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
10065 $val['dossier_suffixe'] = sprintf('%s%s',
10066 $this->getCode($this->getVal('dossier_instruction_type')),
10067 $this->get_dossier_instruction_version()
10068 );
10069 }
10070 /*$parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
10071 $val['insee'] = $parameters['insee'];*/
10072 $val['insee'] = $this->get_da_insee();
10073 $inst_ac = $this->get_inst_autorite_competente($val['autorite_competente']);
10074 $val['autorite_competente_code'] = $inst_ac->getVal('code');
10075 $val['source_depot'] = $this->get_source_depot_from_demande();
10076 return $val;
10077 }
10078
10079 public function update_by_instruction(array $val, array $extra_params = array()) {
10080 $this->begin_treatment(__METHOD__);
10081 // XXX Supprime les champs qui n'existent pas dans dossier
10082 $valF = $val;
10083 unset($valF['instruction']);
10084 unset($valF['crud']);
10085 if (empty($valF) === false) {
10086 $res = $this->f->db->autoExecute(
10087 sprintf('%s%s', DB_PREFIXE, $this->table),
10088 $valF,
10089 DB_AUTOQUERY_UPDATE,
10090 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10091 );
10092 $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);
10093 if ($this->f->isDatabaseError($res, true) === true) {
10094 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10095 $this->correct = false;
10096 return $this->end_treatment(__METHOD__, false);
10097 }
10098 }
10099 $trigger = $this->trigger_update_by_instruction($val);
10100 if ($trigger === false) {
10101 $this->addToLog(__METHOD__."(): ".__("Erreur lors de la mise à jour par instruction."), DEBUG_MODE);
10102 $this->correct = false;
10103 return $this->end_treatment(__METHOD__, false);
10104 }
10105 return $this->end_treatment(__METHOD__, true);
10106 }
10107
10108 protected function trigger_update_by_instruction(array $val, array $extra_params = array()) {
10109 foreach ($this->task_types as $task_type) {
10110 $method = sprintf('add_task_%s', $task_type);
10111 if (method_exists($this, $method) === true) {
10112 //
10113 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
10114 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible'
10115 && ($this->f->is_option_mode_service_consulte_enabled() !== true
10116 || ($this->f->is_option_mode_service_consulte_enabled() === true
10117 && ($this->get_source_depot_from_demande() === PLATAU
10118 || $this->get_source_depot_from_demande() === PORTAL)))) {
10119 //
10120 $res = $this->$method($val, $extra_params);
10121 if ($res !== true) {
10122 return $res;
10123 }
10124 }
10125 }
10126 }
10127 return true;
10128 }
10129
10130 protected function add_task_pec_metier_consultation(array $val, array $extra_params = array()) {
10131 if (array_key_exists("pec_metier", $val) === true
10132 && $val['pec_metier'] !== null
10133 && $val['pec_metier'] !== '') {
10134 //
10135 $inst_task = $this->f->get_inst__om_dbform(array(
10136 "obj" => "task",
10137 "idx" => 0,
10138 ));
10139 $task_val = array(
10140 'type' => 'pec_metier_consultation',
10141 'object_id' => $val['instruction'],
10142 'dossier' => $this->getVal($this->clePrimaire),
10143 );
10144 if ($this->f->is_option_mode_service_consulte_enabled() === false
10145 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10146 $task_val['state'] = $inst_task::STATUS_DRAFT;
10147 }
10148 $add_task = $inst_task->add_task(array('val' => $task_val));
10149 if ($add_task === false) {
10150 return false;
10151 }
10152 }
10153 return true;
10154 }
10155
10156 protected function add_task_qualification_DI(array $val, array $extra_params = array()) {
10157 if (array_key_exists("autorite_competente", $val) === true
10158 && $val["autorite_competente"] !== $this->getVal('autorite_competente')) {
10159 //
10160 $inst_task = $this->f->get_inst__om_dbform(array(
10161 "obj" => "task",
10162 "idx" => 0,
10163 ));
10164 $task_val = array(
10165 'type' => 'qualification_DI',
10166 'object_id' => $val['instruction'],
10167 'dossier' => $this->getVal($this->clePrimaire),
10168 );
10169 if ($this->f->is_option_mode_service_consulte_enabled() === false
10170 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10171 $task_val['state'] = $inst_task::STATUS_DRAFT;
10172 }
10173 $add_task = $inst_task->add_task(array('val' => $task_val));
10174 if ($add_task === false) {
10175 return false;
10176 }
10177 }
10178 return true;
10179 }
10180
10181 protected function add_task_decision_DI(array $val, array $extra_params = array()) {
10182 if (array_key_exists("date_decision", $val) === true
10183 && array_key_exists("avis_decision", $val) === true
10184 && $val['date_decision'] !== null
10185 && $val['date_decision'] !== ''
10186 && $val['avis_decision'] !== null
10187 && $val['avis_decision'] !== '') {
10188 //
10189 $inst_ad = $this->f->get_inst__om_dbform(array(
10190 "obj" => "avis_decision",
10191 "idx" => $val['avis_decision'],
10192 ));
10193 if ($inst_ad->getVal('prescription') === 'f') {
10194 //
10195 $inst_task = $this->f->get_inst__om_dbform(array(
10196 "obj" => "task",
10197 "idx" => 0,
10198 ));
10199 $task_val = array(
10200 'type' => 'decision_DI',
10201 'object_id' => $val['instruction'],
10202 'dossier' => $this->getVal($this->clePrimaire),
10203 );
10204 if ($this->f->is_option_mode_service_consulte_enabled() === false
10205 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10206 $task_val['state'] = $inst_task::STATUS_DRAFT;
10207 }
10208 $add_task = $inst_task->add_task(array('val' => $task_val));
10209 if ($add_task === false) {
10210 return false;
10211 }
10212 }
10213 }
10214 return true;
10215 }
10216
10217 protected function add_task_avis_consultation(array $val, array $extra_params = array()) {
10218 if (array_key_exists("date_decision", $val) === true
10219 && array_key_exists("avis_decision", $val) === true
10220 && $val['date_decision'] !== null
10221 && $val['date_decision'] !== ''
10222 && $val['avis_decision'] !== null
10223 && $val['avis_decision'] !== '') {
10224 //
10225 $inst_ad = $this->f->get_inst__om_dbform(array(
10226 "obj" => "avis_decision",
10227 "idx" => $val['avis_decision'],
10228 ));
10229 if ($inst_ad->getVal('prescription') === 'f') {
10230 //
10231 $inst_task = $this->f->get_inst__om_dbform(array(
10232 "obj" => "task",
10233 "idx" => 0,
10234 ));
10235 $task_val = array(
10236 'type' => 'avis_consultation',
10237 'object_id' => $val['instruction'],
10238 'dossier' => $this->getVal($this->clePrimaire),
10239 );
10240 if ($this->f->is_option_mode_service_consulte_enabled() === false
10241 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10242 $task_val['state'] = $inst_task::STATUS_DRAFT;
10243 }
10244 $add_task = $inst_task->add_task(array('val' => $task_val));
10245 if ($add_task === false) {
10246 return false;
10247 }
10248 }
10249 }
10250 return true;
10251 }
10252
10253 protected function add_task_prescription(array $val, array $extra_params = array()) {
10254 if (array_key_exists("date_decision", $val) === true
10255 && array_key_exists("avis_decision", $val) === true
10256 && $val['date_decision'] !== null
10257 && $val['date_decision'] !== ''
10258 && $val['avis_decision'] !== null
10259 && $val['avis_decision'] !== '') {
10260 //
10261 $inst_ad = $this->f->get_inst__om_dbform(array(
10262 "obj" => "avis_decision",
10263 "idx" => $val['avis_decision'],
10264 ));
10265 if ($inst_ad->getVal('prescription') === 't') {
10266 //
10267 $inst_task = $this->f->get_inst__om_dbform(array(
10268 "obj" => "task",
10269 "idx" => 0,
10270 ));
10271 $task_val = array(
10272 'type' => 'prescription',
10273 'object_id' => $val['instruction'],
10274 'dossier' => $this->getVal($this->clePrimaire),
10275 );
10276 if ($this->f->is_option_mode_service_consulte_enabled() === false
10277 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10278 $task_val['state'] = $inst_task::STATUS_DRAFT;
10279 }
10280 $add_task = $inst_task->add_task(array('val' => $task_val));
10281 if ($add_task === false) {
10282 return false;
10283 }
10284 }
10285 }
10286 return true;
10287 }
10288
10289 protected function add_task_completude_DI(array $val, array $extra_params = array()) {
10290 if (array_key_exists("incomplet_notifie", $val) === true
10291 && $val['incomplet_notifie'] === 'f'
10292 && array_key_exists("crud", $val) === true
10293 && $val['crud'] !== 'delete') {
10294 //
10295 $inst_task = $this->f->get_inst__om_dbform(array(
10296 "obj" => "task",
10297 "idx" => 0,
10298 ));
10299 $task_val = array(
10300 'type' => 'completude_DI',
10301 'object_id' => $val['instruction'],
10302 'dossier' => $this->getVal($this->clePrimaire),
10303 );
10304 if ($this->f->is_option_mode_service_consulte_enabled() === false
10305 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10306 $task_val['state'] = $inst_task::STATUS_DRAFT;
10307 }
10308 $add_task = $inst_task->add_task(array('val' => $task_val));
10309 if ($add_task === false) {
10310 return false;
10311 }
10312 }
10313 return true;
10314 }
10315
10316 public function add_task_incompletude_DI(array $val, array $extra_params = array()) {
10317 if (array_key_exists("incomplet_notifie", $val) === true
10318 && $val['incomplet_notifie'] === 't'
10319 && array_key_exists("crud", $val) === true
10320 && $val['crud'] !== 'delete') {
10321 //
10322 $inst_task = $this->f->get_inst__om_dbform(array(
10323 "obj" => "task",
10324 "idx" => 0,
10325 ));
10326 $task_val = array(
10327 'type' => 'incompletude_DI',
10328 'object_id' => $val['instruction'],
10329 'dossier' => $this->getVal($this->clePrimaire),
10330 );
10331 if ($this->f->is_option_mode_service_consulte_enabled() === false
10332 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10333 $task_val['state'] = $inst_task::STATUS_DRAFT;
10334 }
10335 $add_task = $inst_task->add_task(array('val' => $task_val));
10336 if ($add_task === false) {
10337 return false;
10338 }
10339 }
10340 return true;
10341 }
10342
10343 public function get_parcelles($dossier = null) {
10344 if ($dossier === null) {
10345 $dossier = $this->getVal('dossier');
10346 }
10347 $query = sprintf('
10348 SELECT *
10349 FROM %1$sdossier_parcelle
10350 WHERE dossier = \'%2$s\'
10351 ORDER BY dossier_parcelle
10352 ',
10353 DB_PREFIXE,
10354 $dossier
10355 );
10356 $res = $this->f->get_all_results_from_db_query(
10357 $query,
10358 array(
10359 "origin" => __METHOD__,
10360 "force_return" => true,
10361 )
10362 );
10363 if ($res['code'] === 'KO') {
10364 return false;
10365 }
10366 return $res['result'];
10367 }
10368
10369 protected function getDossier($champ = null) {
10370 return $this->getVal($this->clePrimaire);
10371 }
10372
10373 protected function getDossierObject() {
10374 return $this;
10375 }
10376
10377 /**
10378 * Recupère la source du dépôt
10379 *
10380 * @return string source du dépôt
10381 */
10382 public function get_source_depot_from_demande() {
10383 $demande = $this->get_inst_demande();
10384 return $demande->getVal('source_depot');
10385 }
10386
10387 /**
10388 * Récupère l'instance de consultation entrante associé au dossier.
10389 *
10390 * @return consultation_entrante
10391 */
10392 public function get_inst_consultation_entrante() {
10393 $dossier = $this->getVal($this->clePrimaire);
10394 $qres = $this->f->get_one_result_from_db_query(
10395 sprintf(
10396 'SELECT
10397 consultation_entrante
10398 FROM
10399 %1$sconsultation_entrante
10400 WHERE
10401 dossier = \'%2$s\'',
10402 DB_PREFIXE,
10403 $this->f->db->escapeSimple($dossier)
10404 ),
10405 array(
10406 "origin" => __METHOD__
10407 )
10408 );
10409 $consultationEntrante = $this->f->get_inst__om_dbform(array(
10410 'obj' => 'consultation_entrante',
10411 'idx' => $qres['result']
10412 ));
10413 return $consultationEntrante;
10414 }
10415
10416 /**
10417 * Récupère l'instance du département lié à la commune du dossier.
10418 *
10419 * @return departement
10420 */
10421 public function get_inst_departement_dossier() {
10422 // Si le dossier n'a pas de commune associé alors il n'est pas non
10423 // plus associé à un département. On renvoie donc null.
10424 if (empty($this->getVal('commune'))) {
10425 return null;
10426 }
10427 $qres = $this->f->get_one_result_from_db_query(
10428 sprintf(
10429 'SELECT
10430 departement
10431 FROM
10432 %1$scommune
10433 LEFT JOIN %1$sdepartement
10434 ON commune.dep = departement.dep
10435 WHERE
10436 commune = %2$s',
10437 DB_PREFIXE,
10438 $this->f->db->escapeSimple($this->getVal('commune'))
10439 ),
10440 array(
10441 "origin" => __METHOD__
10442 )
10443 );
10444 $departement = $this->f->get_inst__om_dbform(array(
10445 'obj' => 'departement',
10446 'idx' => $qres['result']
10447 ));
10448 return $departement;
10449 }
10450 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26