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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11418 - (show annotations)
Mon Feb 7 14:59:54 2022 UTC (2 years, 11 months ago) by softime
File size: 432579 byte(s)
* Fusion de la branche d'intégration 5.7.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 // description/nature des travaux. En cas de modif, bloc de code aussi
273 // présent dans 'dossier_instruction.inc.php','om_requete'
274 // et 'stats à la demande'.
275 "CONCAT_WS(
276 '<br/>',
277 CASE WHEN co_projet_desc = '' THEN
278 NULL
279 ELSE
280 TRIM(co_projet_desc)
281 END,
282 CASE WHEN ope_proj_desc = '' THEN
283 NULL
284 ELSE
285 TRIM(ope_proj_desc)
286 END,
287 CASE WHEN am_projet_desc = '' THEN
288 NULL
289 ELSE
290 TRIM(am_projet_desc)
291 END,
292 CASE WHEN dm_projet_desc = '' THEN
293 NULL
294 ELSE
295 TRIM(dm_projet_desc)
296 END,
297 CASE WHEN donnees_techniques.erp_cstr_neuve IS TRUE
298 THEN '".str_replace("'", "''", _('erp_cstr_neuve'))."' END,
299 CASE WHEN donnees_techniques.erp_trvx_acc IS TRUE
300 THEN '".str_replace("'", "''", _('erp_trvx_acc'))."' END,
301 CASE WHEN donnees_techniques.erp_extension IS TRUE
302 THEN '".str_replace("'", "''", _('erp_extension'))."' END,
303 CASE WHEN donnees_techniques.erp_rehab IS TRUE
304 THEN '".str_replace("'", "''", _('erp_rehab'))."' END,
305 CASE WHEN donnees_techniques.erp_trvx_am IS TRUE
306 THEN '".str_replace("'", "''", _('erp_trvx_am'))."' END,
307 CASE WHEN donnees_techniques.erp_vol_nouv_exist IS TRUE
308 THEN '".str_replace("'", "''", _('erp_vol_nouv_exist'))."' END
309 ) as \"description_projet\"",
310 //
311 "donnees_techniques.ctx_synthese_nti as dt_ctx_synthese_nti",
312 "donnees_techniques.ctx_synthese_anr as dt_ctx_synthese_anr ",
313 "donnees_techniques.ctx_infraction as dt_ctx_infraction ",
314 "donnees_techniques.ctx_regularisable as dt_ctx_regularisable ",
315 "dossier_autorisation.dossier_autorisation",
316 "dossier_autorisation.dossier_autorisation_libelle",
317 "annee",
318 "autorite_competente",
319 "dossier.instructeur",
320 "instructeur_2",
321 "dossier.division",
322 "public.ST_AsText(dossier.geom::geometry) as geom",
323 "'' as streetview",
324 "tax_secteur",
325 // Enjeu
326 "enjeu_urba",
327 "enjeu_erp",
328 "'' as enjeu_ctx",
329 // Qualification
330 "erp",
331 "a_qualifier",
332 "pec_metier",
333 "etat_transmission_platau",
334 // Archive
335 "numero_versement_archive",
336 "date_demande",
337 // Fieldset instruction
338 // Suivi
339 // Col 1
340 "dossier.date_depot",
341 "dossier.date_depot_mairie",
342 "dossier.date_affichage",
343 "date_premiere_visite",
344 "date_derniere_visite",
345 "date_contradictoire",
346 "date_retour_contradictoire",
347 "date_ait",
348 "date_transmission_parquet",
349 "donnees_techniques.ctx_date_audience as date_audience",
350 "delai",
351 "delai_incompletude",
352 "date_dernier_depot",
353 "date_limite",
354 "date_complet",
355 "date_limite_incompletude",
356 "date_cloture_instruction",
357 // Col 2
358 "dossier.etat",
359 "evenement_suivant_tacite",
360 "evenement_suivant_tacite_incompletude",
361 // Bloc 2 fieldsets
362 // Col 1 : Fieldset "Décision"
363 "dossier.date_decision",
364 "dossier.avis_decision",
365 // Col 2 : Fieldset "Validité de l'autorisation"
366 "dossier.date_validite",
367 // Autre
368 // Col 1
369 "accord_tacite",
370 // Col 2
371 "date_rejet",
372 "date_notification_delai",
373 "dossier.date_chantier",
374 "dossier.date_achevement",
375 // Col 3
376 "date_conformite",
377 // Fieldset "Simulation des taxes"
378 "tax_mtn_part_commu",
379 "tax_mtn_part_commu_sans_exo",
380 "tax_mtn_part_depart",
381 "tax_mtn_part_depart_sans_exo",
382 "tax_mtn_part_reg",
383 "tax_mtn_part_reg_sans_exo",
384 "tax_mtn_total",
385 "tax_mtn_total_sans_exo",
386 "tax_mtn_rap",
387 "tax_mtn_rap_sans_exo",
388 // Fieldset "Localisation du terrain"
389 // Col 1
390 "dossier.terrain_adresse_voie_numero",
391 "dossier.terrain_adresse_lieu_dit",
392 "dossier.terrain_adresse_code_postal",
393 "dossier.terrain_adresse_cedex",
394 "dossier.parcelle_temporaire",
395 "dossier.terrain_references_cadastrales",
396 // Col 2
397 "dossier.terrain_adresse_voie",
398 "dossier.terrain_adresse_bp",
399 "dossier.terrain_adresse_localite",
400 "dossier.terrain_superficie",
401 //
402 "geom1",
403 "dossier.description",
404 "version",
405 "incompletude",
406 "incomplet_notifie",
407 "etat_pendant_incompletude",
408 "dossier.duree_validite",
409 "quartier",
410 "dossier.log_instructions",
411 "interface_referentiel_erp",
412 "date_modification",
413 "hash_sitadel",
414 "version_clos",
415 "initial_dt",
416 // POC
417 "dossier.numerotation_type",
418 "dossier.numerotation_dep",
419 "dossier.numerotation_com",
420 "dossier.numerotation_division",
421 "dossier.numerotation_suffixe",
422 "dossier.numerotation_entite",
423 "dossier.numerotation_num",
424 "dossier.numerotation_num_suffixe",
425 "dossier.numerotation_num_entite",
426 // CONSULTATION ENTRANTE
427 "consultation_entrante.consultation_entrante",
428 "consultation_entrante.delai_reponse",
429 "consultation_entrante.type_delai",
430 "consultation_entrante.date_consultation",
431 "consultation_entrante.date_emission",
432 "consultation_entrante.date_production_notification",
433 "consultation_entrante.date_premiere_consultation",
434 "consultation_entrante.objet_consultation",
435 "consultation_entrante.etat_consultation",
436 "consultation_entrante.type_consultation",
437 "consultation_entrante.texte_fondement_reglementaire",
438 "consultation_entrante.texte_objet_consultation",
439 "consultation_entrante.service_consultant_id",
440 "consultation_entrante.service_consultant_libelle",
441 "consultation_entrante.service_consultant_insee",
442 "consultation_entrante.service_consultant_mail",
443 "consultation_entrante.service_consultant_type",
444 "consultation_entrante.service_consultant__siren",
445 "consultation_entrante.dossier as dossier_consultation"
446 );
447 return $champs;
448 }
449
450 /**
451 * Clause from pour la requête de sélection des données de l'enregistrement.
452 *
453 * @return string
454 */
455 function get_var_sql_forminc__tableSelect() {
456 return sprintf(
457 '%1$s%2$s
458 LEFT JOIN %1$savis_decision
459 ON avis_decision.avis_decision=dossier.avis_decision
460 LEFT JOIN %1$sdossier_autorisation
461 ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
462 LEFT JOIN %1$sdossier_autorisation_type_detaille
463 ON dossier_autorisation.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
464 LEFT JOIN (
465 SELECT *
466 FROM %1$slien_dossier_demandeur
467 INNER JOIN %1$sdemandeur
468 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
469 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
470 AND LOWER(demandeur.type_demandeur) = LOWER(\'petitionnaire\')
471 ) as petitionnaire_principal
472 ON petitionnaire_principal.dossier = dossier.dossier
473 LEFT JOIN (
474 SELECT *
475 FROM %1$slien_dossier_demandeur
476 INNER JOIN %1$sdemandeur
477 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
478 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
479 AND LOWER(demandeur.type_demandeur) = LOWER(\'requerant\')
480 ) as requerant_principal
481 ON requerant_principal.dossier = dossier.dossier
482 LEFT JOIN (
483 SELECT *
484 FROM %1$slien_dossier_demandeur
485 INNER JOIN %1$sdemandeur
486 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
487 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
488 AND LOWER(demandeur.type_demandeur) = LOWER(\'contrevenant\')
489 ) as contrevenant_principal
490 ON contrevenant_principal.dossier = dossier.dossier
491 LEFT JOIN %1$sdonnees_techniques
492 ON donnees_techniques.dossier_instruction = dossier.dossier
493 LEFT JOIN %1$setat
494 ON dossier.etat = etat.etat
495 LEFT JOIN %1$sarrondissement
496 ON dossier.terrain_adresse_code_postal = arrondissement.code_postal
497 LEFT JOIN %1$sconsultation_entrante
498 ON dossier.dossier = consultation_entrante.dossier',
499 DB_PREFIXE,
500 $this->table
501 );
502 }
503
504 /**
505 *
506 * @return string
507 */
508 function get_var_sql_forminc__sql_avis_decision() {
509 return "SELECT avis_decision,libelle from ".DB_PREFIXE."avis_decision order by libelle";
510 }
511
512 /**
513 *
514 * @return string
515 */
516 function get_var_sql_forminc__sql_avis_decision_by_id() {
517 return "SELECT avis_decision.avis_decision, libelle FROM ".DB_PREFIXE."avis_decision WHERE avis_decision = '<idx>'";
518 }
519
520 /**
521 *
522 * @return string
523 */
524 function get_var_sql_forminc__sql_dossier_autorisation() {
525 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation ORDER BY dossier_autorisation.dossier_autorisation ASC";
526 }
527
528 /**
529 *
530 * @return string
531 */
532 function get_var_sql_forminc__sql_dossier_autorisation_by_id() {
533 return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation WHERE dossier_autorisation = '<idx>'";
534 }
535
536 /**
537 *
538 * @return string
539 */
540 function get_var_sql_forminc__sql_arrondissement() {
541 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement ORDER BY arrondissement.libelle ASC";
542 }
543
544 /**
545 *
546 * @return string
547 */
548 function get_var_sql_forminc__sql_arrondissement_by_id() {
549 return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement WHERE arrondissement = <idx>";
550 }
551
552 /**
553 *
554 * @return string
555 */
556 function get_var_sql_forminc__sql_autorisation_contestee() {
557 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier ORDER BY dossier.annee ASC";
558 }
559
560 /**
561 *
562 * @return string
563 */
564 function get_var_sql_forminc__sql_autorisation_contestee_by_id() {
565 return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier WHERE dossier = '<idx>'";
566 }
567
568 /**
569 *
570 * @return string
571 */
572 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille() {
573 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.code
574 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
575 ORDER BY dossier_autorisation_type_detaille.libelle";
576 }
577
578 /**
579 *
580 * @return string
581 */
582 function get_var_sql_forminc__sql_dossier_autorisation_type_detaille_by_id() {
583 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>";
584 }
585
586 /**
587 *
588 * @return string
589 */
590 function get_var_sql_forminc__sql_demandeur() {
591 return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.libelle
592 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
593 ORDER BY dossier_autorisation_type_detaille.libelle";
594 }
595
596 /**
597 *
598 * @return string
599 */
600 function get_var_sql_forminc__sql_demandeur_by_id() {
601 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>";
602 }
603
604 /**
605 *
606 * @return string
607 */
608 function get_var_sql_forminc__sql_instructeur_div() {
609 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
610 FROM ".DB_PREFIXE."instructeur
611 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
612 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
613 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)))
614 <instructeur_qualite>
615 ORDER BY nom";
616 }
617
618 /**
619 *
620 * @return string
621 */
622 function get_var_sql_forminc__sql_instructeur_div_by_id() {
623 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
624 FROM ".DB_PREFIXE."instructeur
625 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
626 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
627 WHERE instructeur = <idx>";
628 }
629
630 /**
631 *
632 * @return string
633 */
634 function get_var_sql_forminc__sql_instructeur_div_by_di() {
635 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
636 FROM ".DB_PREFIXE."instructeur
637 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
638 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
639 LEFT JOIN ".DB_PREFIXE."direction
640 ON division.direction = direction.direction
641 LEFT JOIN ".DB_PREFIXE."om_collectivite
642 ON direction.om_collectivite = om_collectivite.om_collectivite
643 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)))
644 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
645 <instructeur_qualite>
646 ORDER BY nom";
647 }
648
649 /**
650 *
651 * @return string
652 */
653 function get_var_sql_forminc__sql_instructeur_by_di() {
654 return "SELECT instructeur.instructeur, instructeur.nom
655 FROM ".DB_PREFIXE."instructeur
656 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
657 LEFT JOIN ".DB_PREFIXE."division
658 ON instructeur.division = division.division
659 LEFT JOIN ".DB_PREFIXE."direction
660 ON division.direction = direction.direction
661 LEFT JOIN ".DB_PREFIXE."om_collectivite
662 ON direction.om_collectivite = om_collectivite.om_collectivite
663 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)))
664 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
665 <instructeur_qualite>
666 ORDER BY instructeur.nom ASC";
667 }
668
669 /**
670 *
671 * @return string
672 */
673 function get_var_sql_forminc__sql_instructeur_2_div() {
674 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
675 FROM ".DB_PREFIXE."instructeur
676 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
677 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
678 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)))
679 AND instructeur_qualite.code = 'tech'
680 ORDER BY nom";
681 }
682
683 /**
684 *
685 * @return string
686 */
687 function get_var_sql_forminc__sql_instructeur_2_div_by_id() {
688 return $this->get_var_sql_forminc__sql("instructeur_div_by_id");
689 }
690
691 /**
692 *
693 * @return string
694 */
695 function get_var_sql_forminc__sql_instructeur_2_div_by_di() {
696 return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
697 FROM ".DB_PREFIXE."instructeur
698 INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
699 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
700 LEFT JOIN ".DB_PREFIXE."direction
701 ON division.direction = direction.direction
702 LEFT JOIN ".DB_PREFIXE."om_collectivite
703 ON direction.om_collectivite = om_collectivite.om_collectivite
704 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)))
705 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
706 AND instructeur_qualite.code = 'tech'
707 ORDER BY nom";
708 }
709
710 /**
711 *
712 * @return string
713 */
714 function get_var_sql_forminc__sql_instructeur_2_by_di() {
715 return "SELECT instructeur.instructeur, instructeur.nom
716 FROM ".DB_PREFIXE."instructeur
717 INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
718 LEFT JOIN ".DB_PREFIXE."division
719 ON instructeur.division = division.division
720 LEFT JOIN ".DB_PREFIXE."direction
721 ON division.direction = direction.direction
722 LEFT JOIN ".DB_PREFIXE."om_collectivite
723 ON direction.om_collectivite = om_collectivite.om_collectivite
724 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)))
725 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
726 AND instructeur_qualite.code = 'tech'
727 ORDER BY instructeur.nom ASC";
728 }
729
730 /**
731 *
732 * @return string
733 */
734 function get_var_sql_forminc__sql_division_by_di() {
735 return "SELECT division.division, division.libelle
736 FROM ".DB_PREFIXE."division
737 LEFT JOIN ".DB_PREFIXE."direction
738 ON division.direction = direction.direction
739 LEFT JOIN ".DB_PREFIXE."om_collectivite
740 ON direction.om_collectivite = om_collectivite.om_collectivite
741 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)))
742 AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
743 ORDER BY division.libelle ASC";
744 }
745
746 /**
747 *
748 * @return string
749 */
750 function get_var_sql_forminc__sql_commune() {
751 return "
752 SELECT
753 commune.commune, commune.libelle AS libelle
754 FROM
755 ".DB_PREFIXE."commune
756 WHERE (commune.om_validite_debut IS NULL OR commune.om_validite_debut <= CURRENT_DATE)
757 AND (commune.om_validite_fin IS NULL OR commune.om_validite_fin > CURRENT_DATE)
758 ORDER BY commune.libelle ASC
759 ";
760 }
761
762 /**
763 * VIEW - view_sitadel.
764 *
765 * @return void
766 */
767 function view_sitadel() {
768 // Affichage du formulaire permettant le choix d'un interval de date
769 // ainsi que le numéro de d'ordre qui est le numéro de la version de
770 // l'export
771 if (empty($this->f->get_submitted_post_value())) {
772 // Affichage du formulaire
773 $this->affichageFormulaire();
774 }
775 else {
776 // Initialisation des variables pour les messages de fin de traitement
777 $correct=true;
778 // Initialisation de la chaîne contenant le message d'erreur
779 $erreur = "";
780 //
781 $message_valid = '';
782 $message_info = '';
783
784 // Initialisation des dates de début et de fin
785 $datedebut ='';
786 $datefin='';
787
788 // Traitement des erreurs
789 if ($this->f->get_submitted_post_value("datedebut") == "") {
790 $correct=false;
791 } else {
792 $datedebut = substr($this->f->get_submitted_post_value("datedebut"),6,4).
793 "-".substr($this->f->get_submitted_post_value("datedebut"),3,2)."-".
794 substr($this->f->get_submitted_post_value("datedebut"),0,2);
795 }
796 if ($this->f->get_submitted_post_value("datefin") == "") {
797 $correct=false;
798 } else {
799 $datefin = substr($this->f->get_submitted_post_value("datefin"),6,4).
800 "-".substr($this->f->get_submitted_post_value("datefin"),3,2)."-".
801 substr($this->f->get_submitted_post_value("datefin"),0,2);
802 }
803 $numero = $this->f->get_submitted_post_value("numero");
804 //
805 if ($correct === true){ // ***
806 // Requête permettant de lister tous les dossiers de l'export
807 $sql= "SELECT dossier.dossier,
808 dossier.om_collectivite as collectivite,
809 dossier.dossier_autorisation,
810 dossier_instruction_type.mouvement_sitadel,
811 dossier_instruction_type.code as dossier_instruction_type_code,
812 dossier.date_depot,
813 dossier.date_decision,
814 dossier.date_chantier,
815 dossier.date_achevement,
816 dossier.terrain_references_cadastrales as dossier_terrain_references_cadastrales,
817 dossier.terrain_adresse_voie_numero as dossier_terrain_adresse_voie_numero,
818 dossier.terrain_adresse_voie as dossier_terrain_adresse_voie,
819 dossier.terrain_adresse_lieu_dit as dossier_terrain_adresse_lieu_dit,
820 dossier.terrain_adresse_localite as dossier_terrain_adresse_localite,
821 dossier.terrain_adresse_code_postal as dossier_terrain_adresse_code_postal,
822 dossier.terrain_adresse_bp as dossier_terrain_adresse_bp,
823 dossier.terrain_adresse_cedex as dossier_terrain_adresse_cedex,
824 dossier_autorisation_type.code,
825 dossier.date_limite,
826 dossier.date_limite_incompletude,
827 dossier.date_notification_delai,
828 dossier.terrain_superficie as dossier_terrain_superficie,
829 dossier.date_modification,
830 dossier.hash_sitadel,
831
832 arrondissement.code_impots as code_impots,
833
834 autorite_competente.autorite_competente_sitadel,
835 pp.type_demandeur,
836 pp.qualite,
837 civilite_pp.libelle as civilite_pp,
838 pp.particulier_nom as pp_particulier_nom,
839 pp.particulier_prenom as pp_particulier_prenom,
840 pp.personne_morale_denomination as pp_personne_morale_denomination,
841 pp.personne_morale_raison_sociale as pp_personne_morale_raison_sociale,
842 pp.personne_morale_siret as pp_personne_morale_siret,
843 pp.personne_morale_categorie_juridique as pp_personne_morale_categorie_juridique,
844 civilite_pm.libelle as civilite_pm_libelle,
845 pp.personne_morale_nom as pp_personne_morale_nom,
846 pp.personne_morale_prenom as pp_personne_morale_prenom,
847
848 pp.numero as pp_numero,
849 pp.voie as pp_voie,
850 pp.complement as pp_complement,
851 pp.lieu_dit as pp_lieu_dit,
852 pp.localite as pp_localite,
853 pp.code_postal as pp_code_postal,
854 pp.bp as pp_bp,
855 pp.cedex as pp_cedex,
856 pp.pays as pp_pays,
857 pp.division_territoriale as pp_division_territoriale,
858
859 pp.telephone_fixe as pp_telephone_fixe,
860 pp.courriel as pp_courriel,
861
862 donnees_techniques.co_archi_recours,
863 donnees_techniques.am_terr_surf,
864 donnees_techniques.am_lotiss,
865 donnees_techniques.terr_juri_zac,
866 donnees_techniques.terr_juri_afu,
867 donnees_techniques.co_projet_desc,
868 donnees_techniques.am_projet_desc,
869 donnees_techniques.dm_projet_desc,
870 donnees_techniques.co_cstr_nouv,
871 donnees_techniques.co_cstr_exist,
872 donnees_techniques.co_modif_aspect,
873 donnees_techniques.co_modif_struct,
874 donnees_techniques.co_cloture,
875 donnees_techniques.co_trx_exten,
876 donnees_techniques.co_trx_surelev,
877 donnees_techniques.co_trx_nivsup,
878 donnees_techniques.co_trx_amgt,
879 donnees_techniques.co_anx_pisc,
880 donnees_techniques.co_anx_gara,
881 donnees_techniques.co_anx_veran,
882 donnees_techniques.co_anx_abri,
883 donnees_techniques.co_anx_autr,
884 donnees_techniques.co_bat_niv_nb,
885
886 -- Tableau des destinations
887 donnees_techniques.su_avt_shon1,
888 donnees_techniques.su_avt_shon2,
889 donnees_techniques.su_avt_shon3,
890 donnees_techniques.su_avt_shon4,
891 donnees_techniques.su_avt_shon5,
892 donnees_techniques.su_avt_shon6,
893 donnees_techniques.su_avt_shon7,
894 donnees_techniques.su_avt_shon8,
895 donnees_techniques.su_avt_shon9,
896 donnees_techniques.su_demo_shon1,
897 donnees_techniques.su_demo_shon2,
898 donnees_techniques.su_demo_shon3,
899 donnees_techniques.su_demo_shon4,
900 donnees_techniques.su_demo_shon5,
901 donnees_techniques.su_demo_shon6,
902 donnees_techniques.su_demo_shon7,
903 donnees_techniques.su_demo_shon8,
904 donnees_techniques.su_demo_shon9,
905 donnees_techniques.su_chge_shon1,
906 donnees_techniques.su_chge_shon2,
907 donnees_techniques.su_chge_shon3,
908 donnees_techniques.su_chge_shon4,
909 donnees_techniques.su_chge_shon5,
910 donnees_techniques.su_chge_shon6,
911 donnees_techniques.su_chge_shon7,
912 donnees_techniques.su_chge_shon8,
913 donnees_techniques.su_chge_shon9,
914 donnees_techniques.su_sup_shon1,
915 donnees_techniques.su_sup_shon2,
916 donnees_techniques.su_sup_shon3,
917 donnees_techniques.su_sup_shon4,
918 donnees_techniques.su_sup_shon5,
919 donnees_techniques.su_sup_shon6,
920 donnees_techniques.su_sup_shon7,
921 donnees_techniques.su_sup_shon8,
922 donnees_techniques.su_sup_shon9,
923 donnees_techniques.su_cstr_shon1,
924 donnees_techniques.su_cstr_shon2,
925 donnees_techniques.su_cstr_shon3,
926 donnees_techniques.su_cstr_shon4,
927 donnees_techniques.su_cstr_shon5,
928 donnees_techniques.su_cstr_shon6,
929 donnees_techniques.su_cstr_shon7,
930 donnees_techniques.su_cstr_shon8,
931 donnees_techniques.su_cstr_shon9,
932 donnees_techniques.su_tot_shon1,
933 donnees_techniques.su_tot_shon2,
934 donnees_techniques.su_tot_shon3,
935 donnees_techniques.su_tot_shon4,
936 donnees_techniques.su_tot_shon5,
937 donnees_techniques.su_tot_shon6,
938 donnees_techniques.su_tot_shon7,
939 donnees_techniques.su_tot_shon8,
940 donnees_techniques.su_tot_shon9,
941 -- XXX valeurs obsolètes mais utilisées dans les conditions
942 -- pour afficher les messages d'incohérence
943 donnees_techniques.su_trsf_shon1,
944 donnees_techniques.su_trsf_shon2,
945 donnees_techniques.su_trsf_shon3,
946 donnees_techniques.su_trsf_shon4,
947 donnees_techniques.su_trsf_shon5,
948 donnees_techniques.su_trsf_shon6,
949 donnees_techniques.su_trsf_shon7,
950 donnees_techniques.su_trsf_shon8,
951 donnees_techniques.su_trsf_shon9,
952
953 -- Tableau des sous-destinations
954 donnees_techniques.su2_avt_shon1,
955 donnees_techniques.su2_avt_shon2,
956 donnees_techniques.su2_avt_shon3,
957 donnees_techniques.su2_avt_shon4,
958 donnees_techniques.su2_avt_shon5,
959 donnees_techniques.su2_avt_shon6,
960 donnees_techniques.su2_avt_shon7,
961 donnees_techniques.su2_avt_shon8,
962 donnees_techniques.su2_avt_shon9,
963 donnees_techniques.su2_avt_shon10,
964 donnees_techniques.su2_avt_shon11,
965 donnees_techniques.su2_avt_shon12,
966 donnees_techniques.su2_avt_shon13,
967 donnees_techniques.su2_avt_shon14,
968 donnees_techniques.su2_avt_shon15,
969 donnees_techniques.su2_avt_shon16,
970 donnees_techniques.su2_avt_shon17,
971 donnees_techniques.su2_avt_shon18,
972 donnees_techniques.su2_avt_shon19,
973 donnees_techniques.su2_avt_shon20,
974 donnees_techniques.su2_demo_shon1,
975 donnees_techniques.su2_demo_shon2,
976 donnees_techniques.su2_demo_shon3,
977 donnees_techniques.su2_demo_shon4,
978 donnees_techniques.su2_demo_shon5,
979 donnees_techniques.su2_demo_shon6,
980 donnees_techniques.su2_demo_shon7,
981 donnees_techniques.su2_demo_shon8,
982 donnees_techniques.su2_demo_shon9,
983 donnees_techniques.su2_demo_shon10,
984 donnees_techniques.su2_demo_shon11,
985 donnees_techniques.su2_demo_shon12,
986 donnees_techniques.su2_demo_shon13,
987 donnees_techniques.su2_demo_shon14,
988 donnees_techniques.su2_demo_shon15,
989 donnees_techniques.su2_demo_shon16,
990 donnees_techniques.su2_demo_shon17,
991 donnees_techniques.su2_demo_shon18,
992 donnees_techniques.su2_demo_shon19,
993 donnees_techniques.su2_demo_shon20,
994 donnees_techniques.su2_chge_shon1,
995 donnees_techniques.su2_chge_shon2,
996 donnees_techniques.su2_chge_shon3,
997 donnees_techniques.su2_chge_shon4,
998 donnees_techniques.su2_chge_shon5,
999 donnees_techniques.su2_chge_shon6,
1000 donnees_techniques.su2_chge_shon7,
1001 donnees_techniques.su2_chge_shon8,
1002 donnees_techniques.su2_chge_shon9,
1003 donnees_techniques.su2_chge_shon10,
1004 donnees_techniques.su2_chge_shon11,
1005 donnees_techniques.su2_chge_shon12,
1006 donnees_techniques.su2_chge_shon13,
1007 donnees_techniques.su2_chge_shon14,
1008 donnees_techniques.su2_chge_shon15,
1009 donnees_techniques.su2_chge_shon16,
1010 donnees_techniques.su2_chge_shon17,
1011 donnees_techniques.su2_chge_shon18,
1012 donnees_techniques.su2_chge_shon19,
1013 donnees_techniques.su2_chge_shon20,
1014 donnees_techniques.su2_sup_shon1,
1015 donnees_techniques.su2_sup_shon2,
1016 donnees_techniques.su2_sup_shon3,
1017 donnees_techniques.su2_sup_shon4,
1018 donnees_techniques.su2_sup_shon5,
1019 donnees_techniques.su2_sup_shon6,
1020 donnees_techniques.su2_sup_shon7,
1021 donnees_techniques.su2_sup_shon8,
1022 donnees_techniques.su2_sup_shon9,
1023 donnees_techniques.su2_sup_shon10,
1024 donnees_techniques.su2_sup_shon11,
1025 donnees_techniques.su2_sup_shon12,
1026 donnees_techniques.su2_sup_shon13,
1027 donnees_techniques.su2_sup_shon14,
1028 donnees_techniques.su2_sup_shon15,
1029 donnees_techniques.su2_sup_shon16,
1030 donnees_techniques.su2_sup_shon17,
1031 donnees_techniques.su2_sup_shon18,
1032 donnees_techniques.su2_sup_shon19,
1033 donnees_techniques.su2_sup_shon20,
1034 donnees_techniques.su2_cstr_shon1,
1035 donnees_techniques.su2_cstr_shon2,
1036 donnees_techniques.su2_cstr_shon3,
1037 donnees_techniques.su2_cstr_shon4,
1038 donnees_techniques.su2_cstr_shon5,
1039 donnees_techniques.su2_cstr_shon6,
1040 donnees_techniques.su2_cstr_shon7,
1041 donnees_techniques.su2_cstr_shon8,
1042 donnees_techniques.su2_cstr_shon9,
1043 donnees_techniques.su2_cstr_shon10,
1044 donnees_techniques.su2_cstr_shon11,
1045 donnees_techniques.su2_cstr_shon12,
1046 donnees_techniques.su2_cstr_shon13,
1047 donnees_techniques.su2_cstr_shon14,
1048 donnees_techniques.su2_cstr_shon15,
1049 donnees_techniques.su2_cstr_shon16,
1050 donnees_techniques.su2_cstr_shon17,
1051 donnees_techniques.su2_cstr_shon18,
1052 donnees_techniques.su2_cstr_shon19,
1053 donnees_techniques.su2_cstr_shon20,
1054 donnees_techniques.su2_tot_shon1,
1055 donnees_techniques.su2_tot_shon2,
1056 donnees_techniques.su2_tot_shon3,
1057 donnees_techniques.su2_tot_shon4,
1058 donnees_techniques.su2_tot_shon5,
1059 donnees_techniques.su2_tot_shon6,
1060 donnees_techniques.su2_tot_shon7,
1061 donnees_techniques.su2_tot_shon8,
1062 donnees_techniques.su2_tot_shon9,
1063 donnees_techniques.su2_tot_shon10,
1064 donnees_techniques.su2_tot_shon11,
1065 donnees_techniques.su2_tot_shon12,
1066 donnees_techniques.su2_tot_shon13,
1067 donnees_techniques.su2_tot_shon14,
1068 donnees_techniques.su2_tot_shon15,
1069 donnees_techniques.su2_tot_shon16,
1070 donnees_techniques.su2_tot_shon17,
1071 donnees_techniques.su2_tot_shon18,
1072 donnees_techniques.su2_tot_shon19,
1073 donnees_techniques.su2_tot_shon20,
1074
1075 donnees_techniques.co_sp_transport,
1076 donnees_techniques.co_sp_enseign,
1077 donnees_techniques.co_sp_sante,
1078 donnees_techniques.co_sp_act_soc,
1079 donnees_techniques.co_sp_ouvr_spe,
1080 donnees_techniques.co_sp_culture,
1081 donnees_techniques.dm_tot_log_nb,
1082 donnees_techniques.co_tot_ind_nb,
1083 donnees_techniques.co_tot_coll_nb,
1084 donnees_techniques.co_tot_log_nb,
1085 donnees_techniques.co_resid_agees,
1086 donnees_techniques.co_resid_etud,
1087 donnees_techniques.co_resid_tourism,
1088 donnees_techniques.co_resid_hot_soc,
1089 donnees_techniques.co_resid_hand,
1090 donnees_techniques.co_resid_autr,
1091 donnees_techniques.co_resid_autr_desc,
1092 donnees_techniques.co_uti_pers,
1093 donnees_techniques.co_uti_princ,
1094 donnees_techniques.co_uti_secon,
1095 donnees_techniques.co_uti_vente,
1096 donnees_techniques.co_uti_loc,
1097 donnees_techniques.co_foyer_chamb_nb,
1098 donnees_techniques.co_fin_lls_nb,
1099 donnees_techniques.co_fin_aa_nb,
1100 donnees_techniques.co_fin_ptz_nb,
1101 donnees_techniques.co_fin_autr_nb,
1102 donnees_techniques.co_mais_piece_nb,
1103 donnees_techniques.co_log_1p_nb,
1104 donnees_techniques.co_log_2p_nb,
1105 donnees_techniques.co_log_3p_nb,
1106 donnees_techniques.co_log_4p_nb,
1107 donnees_techniques.co_log_5p_nb,
1108 donnees_techniques.co_log_6p_nb,
1109 donnees_techniques.mod_desc,
1110
1111 donnees_techniques.doc_date,
1112 donnees_techniques.terr_div_surf_av_div,
1113 donnees_techniques.doc_tot_trav,
1114 donnees_techniques.doc_tranche_trav,
1115 donnees_techniques.doc_tranche_trav_desc,
1116 donnees_techniques.doc_surf,
1117 donnees_techniques.doc_nb_log,
1118 donnees_techniques.doc_nb_log_indiv,
1119 donnees_techniques.doc_nb_log_coll,
1120 donnees_techniques.doc_nb_log_lls,
1121 donnees_techniques.doc_nb_log_aa,
1122 donnees_techniques.doc_nb_log_ptz,
1123 donnees_techniques.doc_nb_log_autre,
1124 donnees_techniques.daact_date,
1125 donnees_techniques.daact_date_chgmt_dest,
1126 donnees_techniques.daact_tot_trav,
1127 donnees_techniques.daact_tranche_trav,
1128 donnees_techniques.daact_tranche_trav_desc,
1129 donnees_techniques.daact_surf,
1130 donnees_techniques.daact_nb_log,
1131 donnees_techniques.daact_nb_log_indiv,
1132 donnees_techniques.daact_nb_log_coll,
1133 donnees_techniques.daact_nb_log_lls,
1134 donnees_techniques.daact_nb_log_aa,
1135 donnees_techniques.daact_nb_log_ptz,
1136 donnees_techniques.daact_nb_log_autre,
1137
1138 dossier_autorisation.date_depot as date_depot_da,
1139 dossier_autorisation.date_decision as date_decision_da,
1140 dossier_autorisation.date_validite as date_validite_da,
1141 dossier_autorisation.date_chantier as date_chantier_da,
1142 dossier_autorisation.date_achevement as date_achevement_da,
1143 avis_decision.typeavis as typeavis_da,
1144 avis_decision.sitadel,
1145 avis_decision.sitadel_motif,
1146 avis_decision.typeavis,
1147 etat.statut as statut_di
1148
1149 FROM ".DB_PREFIXE."dossier
1150
1151 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
1152 ON dossier.dossier_instruction_type =
1153 dossier_instruction_type.dossier_instruction_type
1154 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1155 ON dossier_instruction_type.dossier_autorisation_type_detaille
1156 =dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1157 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
1158 ON dossier_autorisation_type.dossier_autorisation_type
1159 =dossier_autorisation_type_detaille.dossier_autorisation_type
1160 INNER JOIN ".DB_PREFIXE."groupe
1161 ON dossier_autorisation_type.groupe = groupe.groupe
1162 AND groupe.code != 'CTX'
1163 INNER JOIN ".DB_PREFIXE."dossier_autorisation
1164 ON dossier_autorisation.dossier_autorisation
1165 =dossier.dossier_autorisation
1166 INNER JOIN ".DB_PREFIXE."autorite_competente
1167 ON autorite_competente.autorite_competente
1168 =dossier.autorite_competente
1169
1170 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1171 ON donnees_techniques.dossier_instruction = dossier.dossier
1172 LEFT JOIN ".DB_PREFIXE."avis_decision
1173 ON avis_decision.avis_decision = dossier.avis_decision
1174 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur as ldd_pp
1175 ON ldd_pp.dossier = dossier.dossier
1176 LEFT JOIN ".DB_PREFIXE."demandeur as pp
1177 ON ldd_pp.demandeur = pp.demandeur
1178 LEFT JOIN ".DB_PREFIXE."civilite as civilite_pp
1179 ON civilite_pp.civilite = pp.particulier_civilite
1180 LEFT JOIN ".DB_PREFIXE."civilite as civilite_pm
1181 ON civilite_pm.civilite = pp.personne_morale_civilite
1182 LEFT JOIN ".DB_PREFIXE."etat
1183 ON etat.etat = dossier.etat
1184 LEFT JOIN ".DB_PREFIXE."arrondissement
1185 ON dossier_autorisation.arrondissement=arrondissement.arrondissement
1186
1187 WHERE dossier_instruction_type.mouvement_sitadel IS NOT NULL
1188 AND ldd_pp.petitionnaire_principal is TRUE
1189 AND (dossier.date_modification >= '".$datedebut."' AND dossier.date_modification <= '".$datefin."')
1190 ORDER by dossier_instruction_type.mouvement_sitadel, dossier.dossier";
1191 //Exécution de la requête
1192 $res = $this->f->db -> query ($sql);
1193 $this->f->addToLog("dossier.class.php : db->query(\"".$sql."\")", VERBOSE_MODE);
1194 $this->f->isDatabaseError($res);
1195 $export="";
1196 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
1197 // initialisation de la classe permettant la mise en forme de chaque ligne de l'export
1198 require_once "../obj/export_sitadel.class.php";
1199 $export_sitadel = new export_sitadel($row['dossier'], $this->f);
1200 $export_sitadel->setRow($row);
1201 //Ajout du fichier de variable
1202 if(file_exists ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php")) {
1203 include ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php");
1204 }
1205 //
1206 $export_sitadel->setVal($val);
1207 $departement = $export_sitadel->getDepartement($row["collectivite"]);
1208 $commune = $export_sitadel->getCommune($row["collectivite"]);
1209 $region = $this->f->getParameter("region");
1210
1211 // Initialisation des variables pour le tableau des
1212 // surfaces en version 1
1213 $prefix_su = 'su';
1214 $count_su = 9;
1215 // S'il faut utiliser le tableau des surfaces en
1216 // version 2
1217 if ($export_sitadel->get_tab_su_version() === 2) {
1218 //
1219 $prefix_su = 'su2';
1220 $count_su = 20;
1221 }
1222
1223 // Récupère la version du dossier d'instruction depuis son
1224 // numéro
1225 $version = 0;
1226 $version = intval($this->get_dossier_instruction_version($row['dossier']));
1227
1228 // Mouvement de dépôt
1229 $depot="";
1230
1231 // Tous les mouvements autres que transfert ont comme mouvement le code DEPOT
1232 // les décisions devant êtres précédées par le dépôt correspondant,
1233 // les dossiers avec date de décision comprise dans l'interval fourni sont
1234 // réaffichés en tant que dépôts (mouvement DEPOT)
1235 if (($row['mouvement_sitadel'] == 'DEPOT'||($row['mouvement_sitadel'] == 'MODIFICATIF'
1236 AND $row['statut_di']=='cloture' AND $row['typeavis']=='F'))) {
1237 $depot.=$export_sitadel->entete("DEPOT",$departement,$commune, $version);
1238 $depot.=$export_sitadel->etatcivil();
1239 $depot.=$export_sitadel->adresse();
1240 $depot.=$export_sitadel->delegataire();
1241 $depot.=$export_sitadel->meltel($row['mouvement_sitadel']);
1242 $depot.=$export_sitadel->adresse_terrain();
1243 $depot.=$export_sitadel->parcelle();
1244 // ===========================
1245 // contrat maison individuelle
1246 // ===========================
1247 // sitadel : contrat|
1248 // openads : non renseigne
1249 $depot.= $export_sitadel->defaultValue('contrat')."|";
1250 // ==========
1251 // architecte
1252 // ==========
1253 // sitadel : architecte|
1254 // openads : données techniques.co_archi_recours
1255 $depot.= ($row['co_archi_recours'] == "t")?"1|":"0|";
1256 // =====================
1257 // utilisation data cnil
1258 // ======================
1259 // sitadel : cnil
1260 // openads : non renseigne
1261 $depot.= $export_sitadel->defaultValue('cnil');
1262 // fin d enregistrement depot
1263 $depot.="\n";
1264 }
1265
1266 // Seuls les dossier de type transfert ont comme mouvement le code TRANSFERT
1267 $transfert ="";
1268 if ($row['mouvement_sitadel']=='TRANSFERT') {
1269 $transfert.=$export_sitadel->entete("TRANSFERT",$departement,$commune, $version);
1270 $transfert.=$export_sitadel->etatcivil();
1271 $transfert.=$export_sitadel->adresse();
1272 $transfert.=$export_sitadel->meltel($row['mouvement_sitadel']);
1273 $transfert.="\n";
1274 }
1275
1276
1277 // Une ligne de mouvement DECISION est insérée après chaque ligne
1278 // de mouvement DEPOT
1279 $decision="";
1280 if ($row['mouvement_sitadel'] != 'TRANSFERT'
1281 and $row['mouvement_sitadel'] != 'SUPPRESSION'
1282 and $row['mouvement_sitadel'] == 'DEPOT') {
1283
1284 //Ajout de l'entête
1285 $decision.=$export_sitadel->entete("DECISION",$departement,$commune, $version);
1286
1287 //Ajout du groupe 1
1288 $decision.= $export_sitadel->decision_groupe1();
1289 // Si la décision est favorable, on remplit le groupe 2
1290 if ( $row['sitadel'] == 2 || $row['sitadel'] == 4 || $row['sitadel'] == 5
1291 || $row['sitadel'] == 0 ){
1292 //
1293 $decision.= $export_sitadel->amenagement_terrain();
1294 //Nature du projet
1295 $natproj = 2;
1296 $natprojlib= array(
1297 1=>_("Nouvelle construction"),
1298 2=>_("Travaux sur construction existante"),
1299 3=>_("Nouvelle construction et travaux sur construction"),
1300 );
1301 if ( isset($row['co_cstr_nouv']) && isset($row['co_cstr_exist']) &&
1302 $row['co_cstr_nouv'] == 't' &&
1303 $row['co_cstr_exist'] == 't' ){
1304 $natproj = 3;
1305 }
1306 //Nouvelle construction
1307 elseif ( isset($row['co_cstr_nouv']) && $row['co_cstr_nouv'] == 't' ) {
1308 $natproj = 1;
1309 }
1310 //
1311 $su_avt_shon = $export_sitadel->shon("avt");
1312 //Si la SHON existante avant travaux est supérieur à la SHON
1313 //démolie alors la variable natproj est égale à 2
1314 $shonExistante = 0;
1315 $shonDemolie = 0;
1316 // Pour chaque ligne du tableau
1317 for ($i = 1; $i <= $count_su; $i++) {
1318 //
1319 $shonExistante += floor($row[$prefix_su.'_avt_shon'.$i]);
1320 $shonDemolie += floor($row[$prefix_su.'_demo_shon'.$i]);
1321 }
1322 //Si la SHON existante avant travaux et la SHON démolie sont
1323 //égales alors la variable natproj est égale à 1
1324 if ( $shonExistante == 0 && $shonDemolie == 0 && $natproj != 1 &&
1325 $row['code'] != 'DP' && $row['code'] != 'PA') {
1326 $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";
1327 } elseif ( $shonExistante > $shonDemolie && $natproj != 2 ){
1328 $erreur .= _("Dossier ").$row['dossier']." \"".$natprojlib[$natproj]."\" "._("La SHON existante avant travaux ne doit pas être supérieure à la SHON démolie.")."\n";
1329 }
1330 $decision .= $su_avt_shon;
1331
1332 $su_demo_shon = $export_sitadel->shon("demo");
1333 //La SHON démolie s'accompagne obligatoirement de la shon
1334 //existante avant travaux
1335 if ( $shonDemolie != 0 && $shonExistante == 0 ){
1336 $erreur .= _("Dossier ").$row['dossier']." "._("La SHON demolie s'accompagne obligatoirement de la SHON existante avant travaux.")."\n";
1337 }
1338 $decision .= $su_demo_shon;
1339 //
1340 $su_sup_shon = $export_sitadel->shon("sup");
1341 $su_chge_shon = $export_sitadel->shon("chge");
1342 if ( strcasecmp($su_sup_shon, $su_chge_shon) != 0){
1343 //
1344 $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";
1345 }
1346 $decision .= $su_sup_shon;
1347 $decision .= $su_chge_shon;
1348 $decision .= $export_sitadel->shon("cstr");
1349 $decision .= "0|0|0|0|0|0|0|0|0|";
1350 // Les SHON créées par changement de destination ou
1351 // de sous-destination s'accompagnent obligatoirement
1352 // de SHON existante avant travaux non nulle
1353 if (preg_match("/[0|]{7}/", $su_chge_shon) &&
1354 preg_match("/[0|]{7}/", $su_avt_shon)){
1355
1356 $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";
1357 }
1358 // Un nombre de logements démolis strictement positif doit
1359 // s'accompagner obligatoirement de SHON démolie.
1360 if($row['dm_tot_log_nb'] > 0) {
1361 if($export_sitadel->get_shon_val('demo', 1) <= 0) {
1362 //
1363 $erreur .= _("Dossier ").$row['dossier']." "._("Un nombre de logements demolis strictement positif doit s'accompagner obligatoirement de SHON demolie.")."\n";
1364 }
1365 }
1366 // Un nombre de logements créés strictement positif doit
1367 // s'accompagner obligatoirement de SHON créée ou de SHON
1368 // créée par changement de destination ou de sous-destination
1369 // ayant pour destination l'habitation.
1370 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)) {
1371 //
1372 $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";
1373 }
1374
1375 // La SHON créée ou issue de la transformation
1376 // suffixée par 9 (intérêt collectif ou service public) doit
1377 // obligatoirement s'accompagner de la décomposition
1378 // en sous modalité renseignée par la variable cpublic et réciproquement.
1379
1380 // Test si une valeur est true
1381 $cpublic = FALSE;
1382 if (isset($row['co_sp_transport']) && $row['co_sp_transport'] == 't') {
1383 $cpublic = TRUE;
1384 }
1385 if (isset($row['co_sp_enseign']) && $row['co_sp_enseign'] == 't') {
1386 $cpublic = TRUE;
1387 }
1388 if (isset($row['co_sp_sante']) && $row['co_sp_sante'] == 't') {
1389 $cpublic = TRUE;
1390 }
1391 if (isset($row['co_sp_act_soc']) && $row['co_sp_act_soc'] == 't') {
1392 $cpublic = TRUE;
1393 }
1394 if (isset($row['co_sp_ouvr_spe']) && $row['co_sp_ouvr_spe'] == 't') {
1395 $cpublic = TRUE;
1396 }
1397 if (isset($row['co_sp_culture']) && $row['co_sp_culture'] == 't') {
1398 $cpublic = TRUE;
1399 }
1400 //
1401 if($cpublic !== TRUE AND ($export_sitadel->get_shon_val('cstr', 9) > 0 OR $export_sitadel->get_shon_val('chge', 9) > 0)) {
1402 $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";
1403 }
1404
1405 // La destination principale du logement mise à résidence
1406 // principale ou résidence secondaire doit obligatoirement
1407 // s'accompagner d'un mode d'utilisation à occupation personnelle
1408 if($row['co_uti_princ'] == 't' OR $row['co_uti_secon'] == 't') {
1409 if($row['co_uti_pers'] != 't') {
1410
1411 $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";
1412 }
1413 }
1414
1415 $decision.= $export_sitadel->destination($row['mouvement_sitadel']);
1416
1417 // Le nombre total de logements créés (variable nbtotlog)
1418 // doit être égal à la somme des nombres de logements créés
1419 // ventilés par type de financement
1420 if(intval($row['co_tot_log_nb']) != (intval($row['co_fin_lls_nb']) + intval($row['co_fin_aa_nb']) +
1421 intval($row['co_fin_ptz_nb']) + intval($row['co_fin_autr_nb']))) {
1422
1423 $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";
1424 }
1425
1426 $decision.= $export_sitadel->repartitionFinan();
1427
1428 // Le nombre total de logements créés (variable nbtotlog)
1429 // doit être égal à la totalisation de la répartition des
1430 // logements par nombre de pièces
1431 if(intval($row['co_tot_log_nb']) != (intval($row['co_log_1p_nb']) + intval($row['co_log_2p_nb']) +
1432 intval($row['co_log_3p_nb']) + intval($row['co_log_4p_nb']) + intval($row['co_log_5p_nb']) +
1433 intval($row['co_log_6p_nb']))) {
1434
1435 $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";
1436 }
1437
1438 $decision.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1439 }
1440 else {
1441 //
1442 $decision.= str_repeat("|", 6);
1443 if($row['code']=='DP'){
1444 $decision .= "00000|";
1445 }else{
1446 $decision .= "|";
1447 }
1448 $decision .= "0000|00000|";
1449 $decision.= str_repeat("|", 74);
1450 }
1451 $decision.="\n";
1452 }
1453
1454 // modificatif
1455 $modificatif='';
1456 if($row['mouvement_sitadel'] == 'MODIFICATIF' AND $row['statut_di']=='cloture' AND
1457 $row['typeavis']=='F') {
1458 $modificatif.=$export_sitadel->entete("MODIFICATIF",$departement,$commune, $version);
1459
1460 $modificatif.= $export_sitadel->decision_groupe1();
1461
1462 if(isset($row['date_decision']) or $row['date_decision']==""){
1463 // avis_sitadel et avis_sitadel_motif
1464 // si la decision est favorable, envoi des informations statistiques
1465 if($row["sitadel"] == 2 or $row["sitadel"] == 4
1466 or $row["sitadel"] == 5){
1467 // si accordé : ajout du 2nd groupe d'informations
1468 $modificatif .= $export_sitadel->adresse_terrain(); // adresse du terrain
1469 $modificatif .= $export_sitadel->parcelle(); // 3 premières parcelles
1470 $modificatif .= $export_sitadel->modificatif_terrain(); // Informations complémentaires
1471
1472 $modificatif.= $export_sitadel->shon("avt");
1473 $modificatif.= $export_sitadel->shon("demo");
1474 $modificatif.= $export_sitadel->shon("chge");
1475 $modificatif.= $export_sitadel->shon("trsf");
1476 $modificatif.= $export_sitadel->shon("cstr");
1477
1478 $modificatif.= "|||||||||";
1479 $modificatif.= $export_sitadel->destination($row['mouvement_sitadel']);
1480 $modificatif.= $export_sitadel->repartitionFinan();
1481 $modificatif.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1482 }
1483 else {
1484 $modificatif .= str_repeat("|", 90);
1485 }
1486 }
1487 else {
1488 $modificatif .= str_repeat("|", 90);
1489 }
1490
1491 $modificatif.="\n";
1492 }
1493
1494 // Mouvement suppression
1495 $suppression = '';
1496 if($row['mouvement_sitadel'] == 'SUPPRESSION') {
1497 $suppression .= $export_sitadel->entete("SUPPRESSION",$departement,$commune, $version);
1498 $suppression .= "\n";
1499 }
1500
1501 // Règles sur le mouvement suivi
1502 $suivi="";
1503 if($row['mouvement_sitadel'] == 'SUIVI' and
1504 ($row['date_chantier'] >= $datedebut and $row['date_chantier']<=$datefin) ||
1505 ($row['date_achevement'] >= $datedebut and $row['date_achevement']<=$datefin)){
1506 // Si le dossier est une DOC
1507 if($row['dossier_instruction_type_code']=='DOC'){
1508 // Une ouverture de chantier ne peut concerner qu'un permis autorisé
1509 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1510 $erreur .= _("Dossier ").$row['dossier']." "._("Une ouverture de chantier ne peut concerner qu'un permis autorise.")."\n";
1511 }
1512 // La date d'ouverture de chantier doit être supérieur à la date d'autorisation
1513 if($row['doc_date'] > $row['date_decision_da']) {
1514 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'ouverture de chantier doit être superieur a la date d'autorisation.")."\n";
1515 }
1516 // Un achèvement de chantier ne peut concerner qu'un permis autorisé
1517 if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1518 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis autorise.")."\n";
1519 }
1520 if( $row['date_chantier_da'] == "" && $row['date_achevement']!="") {
1521 $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis sur lequel un chantier a ete ouvert.")."\n";
1522 }
1523 // La date d'achevement de travaux doit être supérieur à la date d'ouverture des travaux
1524 if($row['daact_date'] > $row['date_chantier_da']) {
1525 $erreur .= _("Dossier ").$row['dossier']." "._("La date d'achevement de travaux doit etre superieur a la date d'ouverture des travaux.")."\n";
1526 }
1527 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1528 $suivi.=$export_sitadel->chantier($row);
1529 //On récupère la DAACT si elle existe
1530 $sqlDAACT = "SELECT
1531 donnees_techniques.daact_date,
1532 donnees_techniques.daact_date_chgmt_dest,
1533 donnees_techniques.daact_tot_trav,
1534 donnees_techniques.daact_tranche_trav,
1535 donnees_techniques.daact_tranche_trav_desc,
1536 donnees_techniques.daact_surf,
1537 donnees_techniques.daact_nb_log,
1538 donnees_techniques.daact_nb_log_indiv,
1539 donnees_techniques.daact_nb_log_coll,
1540 donnees_techniques.daact_nb_log_lls,
1541 donnees_techniques.daact_nb_log_aa,
1542 donnees_techniques.daact_nb_log_ptz,
1543 donnees_techniques.daact_nb_log_autre,
1544 etat.statut as statut_di
1545
1546 FROM ".DB_PREFIXE."dossier
1547 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1548 ON dossier.dossier=donnees_techniques.dossier_instruction
1549 LEFT JOIN ".DB_PREFIXE."etat
1550 ON dossier.etat = etat.etat
1551 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1552 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
1553 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1554 dossier_instruction_type.code = 'DAACT' and mouvement_sitadel='SUIVI'";
1555 $resDAACT = $this->f->db -> query ($sqlDAACT);
1556 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDAACT."\")", VERBOSE_MODE);
1557 $this->f->isDatabaseError($resDAACT);
1558 $rowDAACT=& $resDAACT->fetchRow(DB_FETCHMODE_ASSOC);
1559 $suivi.=$export_sitadel->achevement($rowDAACT);
1560 $suivi.="\n";
1561 }
1562 elseif($row['dossier_instruction_type_code']=='DAACT'){
1563
1564 //On vérifie qu'une DOC existe
1565 $sqlDOC = "SELECT dossier.dossier,
1566 dossier.date_chantier,
1567 donnees_techniques.doc_date,
1568 donnees_techniques.terr_div_surf_av_div,
1569 donnees_techniques.doc_tot_trav,
1570 donnees_techniques.doc_tranche_trav,
1571 donnees_techniques.doc_tranche_trav_desc,
1572 donnees_techniques.doc_surf,
1573 donnees_techniques.doc_nb_log,
1574 donnees_techniques.doc_nb_log_indiv,
1575 donnees_techniques.doc_nb_log_coll,
1576 donnees_techniques.doc_nb_log_lls,
1577 donnees_techniques.doc_nb_log_aa,
1578 donnees_techniques.doc_nb_log_ptz,
1579 donnees_techniques.doc_nb_log_autre
1580 FROM ".DB_PREFIXE."dossier
1581 LEFT JOIN ".DB_PREFIXE."donnees_techniques
1582 ON dossier.dossier=donnees_techniques.dossier_instruction
1583 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1584 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
1585 WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1586 dossier_instruction_type.code = 'DOC' and mouvement_sitadel='SUIVI'";
1587 $resDOC = $this->f->db -> query ($sqlDOC);
1588 $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDOC."\")", VERBOSE_MODE);
1589 $this->f->isDatabaseError($resDOC);
1590 $rowDOC=& $resDOC->fetchRow(DB_FETCHMODE_ASSOC);
1591
1592 if((isset($rowDOC['dossier']) &&
1593 $rowDOC['date_chantier']<$datedebut || $rowDOC['date_chantier']>$datefin) ||
1594 !isset($rowDOC['dossier'])) {
1595 //
1596 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1597 $suivi.=$export_sitadel->chantier($rowDOC);
1598 $suivi.=$export_sitadel->achevement($row);
1599 $suivi.="\n";
1600 }
1601 }
1602 }
1603 // Ligne SITADEL généré
1604 $line_sitadel = $depot.$decision.$transfert.$modificatif.$suivi.$suppression;
1605 if ($line_sitadel !== '') {
1606 // Hash la ligne SITADEL
1607 $hash_sitadel = md5($line_sitadel);
1608 // Si le hash de la ligne générée est différent du hash
1609 // sauvegardé sur le dossier
1610 if ($row['hash_sitadel'] !== $hash_sitadel) {
1611 // Met la ligne dans l'export
1612 $export .= $line_sitadel;
1613 // Met à jour le hash SITADEL du dossier
1614 $inst_di = $this->get_inst_dossier($row['dossier']);
1615 $inst_di->update_hash_sitadel($hash_sitadel);
1616 } else {
1617 // Supprime les erreurs liées à la ligne qui ne sera
1618 // pas exportée
1619 $erreur = '';
1620 }
1621 }
1622 } // fin while
1623
1624 /**
1625 *
1626 */
1627 //
1628 if (DBCHARSET == 'UTF8') {
1629 $export = utf8_decode($export);
1630 }
1631
1632 /**
1633 * En-tête de fichier.
1634 *
1635 * C'est la première ligne du fichier.
1636 */
1637 // on éclate la chaîne export par ligne pour calculer le nombre
1638 // d'enregistrements et la longueur maximale des enregistrements
1639 $export_by_line = explode("\n", $export);
1640 // longueur maximale des enregistrements
1641 // (Num)(6) longueur de l’enregistrement le plus long contenu dans le
1642 // fichier (sans compter la fin d’enregistrement ou la fin de fichier)
1643 $longueur_maximale_des_enregistrements = 0;
1644 foreach ($export_by_line as $export_line) {
1645 if ($longueur_maximale_des_enregistrements > strlen($export_line)) {
1646 continue;
1647 }
1648 $longueur_maximale_des_enregistrements = strlen($export_line);
1649 }
1650 // nombre d'enregistrements
1651 // (Num)(6) nombre d’enregistrements présents dans le fichier en
1652 // comptant l’en-tête du fichier
1653 // XXX Ne faut-il pas ajouter +1 pour la ligne d'en-tête ?
1654 $nombre_d_enregistrements = count($export_by_line);
1655 // code application
1656 // (Alphanum)(7) = SITADEL
1657 $code_application = "SITADEL";
1658 // code département
1659 // (Alphanum)(3) département dans lequel se trouve le service instructeur
1660 // nomenclature : 001 à 095, 02A, 02B, 971...974
1661 $code_departement = $this->f->getParameter("departement");
1662 // service expéditeur
1663 // (Alphanum)(3) DDE ou commune (la plus grosse en cas d'EPCI) ou DGI
1664 // nomenclature : 'ADS', ‘DGI ou code commune INSEE
1665 $service_expediteur = $this->f->getParameter("commune");
1666 // service destinataire
1667 // (Alphanum)(2) DRE
1668 // nomenclature : code région INSEE (exemple : Ile-de-France=11)
1669 $service_destinataire = $this->f->getParameter("region");
1670 // code du fichier transmis
1671 // (AlphaNum)(12) AAMMjjdddccc
1672 // ddd = département du service instructeur
1673 // ccc = code du service expéditeur
1674 // AAMMjj = date
1675 // par exemple : 090531093ADS dans le cas de la transmission mensuelle
1676 // des événements intervenus au mois de mai communiqués par la DDE de
1677 // Seine-Saint-Denis.
1678 // XXX La date du jour correspond bien à la date demandée ?
1679 $code_du_fichier_transmis = sprintf(
1680 "%s%s%s",
1681 date('ymd'),
1682 $code_departement,
1683 $service_expediteur
1684 );
1685 // numéro d'ordre
1686 // (AlphaNum)(1) numéro d’ordre du fichier en cas de rectificatif
1687 // XXX Le formulaire propose jusqu'à la valeur 10 alors que la taille
1688 // de la châine doit être (1) ?
1689 $numero_d_ordre = $this->f->get_submitted_post_value("numero");
1690 // date de création
1691 // (Alphanum)(6) AAMMjj date de création du fichier transmis
1692 $date_de_creation = date('ymd');
1693 // nom de l'applicatif expéditeur
1694 // (Alphanum)(20) Exemple : GESTIO
1695 $nom_de_l_applicatif_expediteur = "openADS";
1696 // version de l'applicatif expéditeur
1697 // (Alphanum)(8) Exemple : 2.05
1698 $version_de_l_applicatif_expediteur = substr($this->f->get_application_version(), 0, 8);
1699 // Consititution de la ligne d'en-tête.
1700 $entete = sprintf(
1701 "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\n",
1702 $code_application,
1703 $code_departement,
1704 $service_expediteur,
1705 $service_destinataire,
1706 $code_du_fichier_transmis,
1707 $numero_d_ordre,
1708 $longueur_maximale_des_enregistrements,
1709 $date_de_creation,
1710 $nombre_d_enregistrements,
1711 $nom_de_l_applicatif_expediteur,
1712 $version_de_l_applicatif_expediteur
1713 );
1714
1715 /**
1716 *
1717 */
1718 //
1719 $export = $entete.$export;
1720
1721 /**
1722 * Écriture de l'export dans un fichier sur le disque et affichage du
1723 * lien de téléchargement.
1724 */
1725 // Composition du nom du fichier
1726 $nom_fichier = "SITADEL".substr($this->f->get_submitted_post_value("datedebut"),3,2)."".substr($this->f->get_submitted_post_value("datedebut"),8,4).".txt";
1727 // Composition des métadonnées du fichier
1728 $metadata_fichier = array(
1729 "filename" => $nom_fichier,
1730 "size" => strlen($export),
1731 "mimetype" => "text/csv",
1732 );
1733 // Écriture du fichier
1734 $id_fichier = $this->f->store_file(
1735 $export,
1736 $metadata_fichier,
1737 "sitadel",
1738 json_encode(array(
1739 'date_debut' => $datedebut,
1740 'date_fin' => $datefin,
1741 ))
1742 );
1743 if ($id_fichier === false) {
1744 $msg_error = __("Erreur lors du stockage/enregistrement du fichier SITADEL.").' '.__("Veuillez contacter votre administrateur.");
1745 $this->f->displayMessage("error", $msg_error);
1746 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
1747 return;
1748 }
1749 //
1750 $message_valid = sprintf(
1751 "%s<br/>%s",
1752 sprintf(__("Le fichier %s a été généré."), $nom_fichier),
1753 sprintf(
1754 '<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>',
1755 OM_ROUTE_FORM,
1756 $id_fichier,
1757 __("Télécharger le fichier SITADEL")
1758 )
1759 );
1760
1761 /**
1762 * Écriture d'une éventuelle erreur durant l'export dans un fichier sur
1763 * le disque et affichage du lien de téléchargement.
1764 */
1765 //
1766 if ($erreur != "") {
1767 // Composition du nom du fichier
1768 $nom_fichier_erreur = "probleme_".$nom_fichier;
1769 // Composition des métadonnées du fichier
1770 $metadata_fichier_erreur = array(
1771 "filename" => $nom_fichier_erreur,
1772 "size" => strlen($erreur),
1773 "mimetype" => "application/octet-stream",
1774 );
1775 // Écriture du fichier
1776 $id_fichier_erreur = $this->f->store_file(
1777 $erreur,
1778 $metadata_fichier_erreur,
1779 "sitadel",
1780 json_encode(array(
1781 'date_debut' => $datedebut,
1782 'date_fin' => $datefin,
1783 ))
1784 );
1785 if ($id_fichier_erreur === false) {
1786 $msg_error = __("Erreur lors du stockage/enregistrement du fichier des incohérences SITADEL.").' '.__("Veuillez contacter votre administrateur.");
1787 $this->f->displayMessage("error", $msg_error);
1788 $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
1789 return;
1790 }
1791 //
1792 $message_info .= sprintf(
1793 "%s<br/>%s",
1794 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),
1795 sprintf(
1796 '<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>',
1797 OM_ROUTE_FORM,
1798 $id_fichier_erreur,
1799 __("Télécharger le fichier d'incohérence SITADEL")
1800 )
1801 );
1802 }
1803
1804 //
1805 $this->f->displayMessage("valid",
1806 sprintf(
1807 '%s%s%s',
1808 $message_valid,
1809 $message_info !== '' ? '<br/><br/>' : '',
1810 $message_info
1811 )
1812 );
1813
1814 //
1815 if (DEBUG > 0) {
1816 printf($export);
1817 }
1818
1819 } else {// correct = false
1820 $this->f->displayMessage("error", __("Les champs dates sont obligatoires."));
1821 }
1822 }
1823 }
1824
1825
1826 function affichageFormulaire() {
1827 printf("<form method=\"POST\" name=f1>");
1828 //
1829 printf(
1830 "<div id=\"sitadel-form-fonctionnement\" class=\"sitadel-form-bloc\"><h3>%s</h3><p>%s</p></div>",
1831 __("Fonctionnement"),
1832 __("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.")
1833 );
1834 //
1835 printf(
1836 "<div id=\"sitadel-form-export\" class=\"sitadel-form-bloc\"><h3>%s</h3>",
1837 __("Export")
1838 );
1839 //Description de la page
1840 $description = __("Saisissez la période pour laquelle vous souhaitez exporter les mouvements des dossiers au format SITADEL.");
1841 $this->f->displayDescription($description);
1842 //
1843 $input = "<input type=\"text\" name=\"%s\" id=\"%s\" value=\"%s\" size=\"15\" class=\"champFormulaire datepicker\" onchange=\"fdate(this)\" />";
1844 // champ date debut
1845 printf(" "._("Date de début")." ");
1846 printf($input, "datedebut", "datedebut", '');
1847 // champ date fin
1848 printf(" "._("Date de fin")." ");
1849 printf($input, "datefin", "datefin", '');
1850 // numero d'ordre d'envoi
1851 printf(" "._("Numero d'ordre d'envoi")." : "."<select name=\"numero\">");
1852 for ($i = 1; $i < 11; $i++) {
1853 printf("<option value =\"%d\" ", $i);
1854 printf(">%d</option>", $i);
1855 }
1856 printf("</select>");
1857 printf(
1858 "<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\" />",
1859 __("Exporter le fichier SITADEL"),
1860 addslashes(sprintf(
1861 "<b>%s</b><br/><br/>%s",
1862 __("Important à lire avant de confirmer le message de validation."),
1863 __("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.")
1864 )),
1865 OM_ROUTE_FORM
1866 );
1867 printf("</div>");
1868
1869 // Affiche le tableau des fichiers sitadel stocké
1870 $link_tab_storage = OM_ROUTE_SOUSTAB.'&obj=storage&idxformulaire=0&retour=tab&retourformulaire=sitadel';
1871 $tab_storage = sprintf(
1872 '<div id="sousform-storage-sitadel" class="sitadel-form-bloc-tab"></div>
1873 <script type="text/javascript" >
1874 ajaxIt(\'storage-sitadel\', \'%1$s\');
1875 </script>',
1876 $link_tab_storage
1877 );
1878 printf(
1879 "<div id=\"sitadel-form-histo\" class=\"sitadel-form-bloc-end\"><h3>%s</h3>%s</div>",
1880 __("Historique des exports"),
1881 $tab_storage
1882 );
1883
1884 printf("</form>");
1885 }
1886
1887 /**
1888 * VIEW - view_document_numerise.
1889 *
1890 * Vue du tableau des pièces du dossier d'autorisation.
1891 *
1892 * Cette vue permet de gérer le contenu de l'onglet "Pièce(s)" sur un
1893 * dossier d'autorisation. Cette vue spécifique est nécessaire car
1894 * l'ergonomie standard du framework ne prend pas en charge ce cas.
1895 * C'est ici la vue spécifique des pièces liées au dossier qui est
1896 * affichée directement au clic de l'onglet au lieu du soustab.
1897 *
1898 * L'idée est donc de simuler l'ergonomie standard en créant un container
1899 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
1900 * de la vue visualisation de l'objet lié.
1901 *
1902 * @return void
1903 */
1904 function view_document_numerise() {
1905 // Vérification de l'accessibilité sur l'élément
1906 $this->checkAccessibility();
1907 // Récupération des variables GET
1908 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
1909 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
1910 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
1911 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
1912 // Objet à charger
1913 $obj = "document_numerise";
1914 $type_aff_form = $this->get_type_affichage_formulaire();
1915 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
1916 $obj = "document_numerise_contexte_ctx";
1917 }
1918 // Construction de l'url de sousformulaire à appeler
1919 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
1920 $url .= "&idx=".$idxformulaire;
1921 $url .= "&action=4";
1922 $url .= "&retourformulaire=".$retourformulaire;
1923 $url .= "&idxformulaire=".$idxformulaire;
1924 $url .= "&retour=form";
1925 // Affichage du container permettant le reffraichissement du contenu
1926 // dans le cas des action-direct.
1927 printf('
1928 <div id="sousform-href" data-href="%s">
1929 </div>',
1930 $url
1931 );
1932 // Affichage du container permettant de charger le retour de la requête
1933 // ajax récupérant le sous formulaire.
1934 printf('
1935 <div id="sousform-%s">
1936 </div>
1937 <script>
1938 ajaxIt(\'%s\', \'%s\');
1939 </script>',
1940 $obj,
1941 $obj,
1942 $url
1943 );
1944 }
1945
1946 /*
1947 * Définition de la version et du suffixe du DI lors de sa création.
1948 */
1949 function setValFAjout($val = array()) {
1950
1951 /**
1952 * GESTION DE LA NUMÉROTATION
1953 */
1954
1955 //
1956 // GESTION DE LA VERSION DU DI
1957 // Elle est unique et basée sur celle du DA qui débute à -1.
1958 // Ainsi la version du DI initial est à 0.
1959 //
1960 $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
1961 if (is_numeric($numeroVersion) or $numeroVersion == -1){
1962 $this->incrementNumeroVersion($val['dossier_autorisation'], ++$numeroVersion);
1963 }
1964 // Version du dossier
1965 $this->valF['version'] = $numeroVersion;
1966
1967 // Vérification de la saisie manuelle du numéro complet
1968 $num_doss_comp = isset($val['numero_dossier_complet']) === true ? $val['numero_dossier_complet'] : null;
1969
1970 if ($num_doss_comp !== null) {
1971 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
1972 if (empty($num_urba['di']) === false) {
1973
1974 //
1975 $this->valF[$this->clePrimaire] = sprintf("%s%s%s%s%s%s%s%s",
1976 $num_urba['di']['type'],
1977 $num_urba['di']['departement'],
1978 $num_urba['di']['commune'],
1979 $num_urba['di']['annee'],
1980 $num_urba['di']['division'],
1981 $num_urba['di']['numero'],
1982 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
1983 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
1984 );
1985 $this->valF["dossier_libelle"] = sprintf("%s %s%s %s %s%s%s%s",
1986 $num_urba['di']['type'],
1987 $num_urba['di']['departement'],
1988 $num_urba['di']['commune'],
1989 $num_urba['di']['annee'],
1990 $num_urba['di']['division'],
1991 $num_urba['di']['numero'],
1992 isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
1993 isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
1994 );
1995
1996 $this->valF["numerotation_type"] = $num_urba['di']['type'];
1997 $this->valF["numerotation_dep"] = $num_urba['di']['departement'];
1998 $this->valF["numerotation_com"] = $num_urba['di']['commune'];
1999 $this->valF["numerotation_division"] = $num_urba['di']['division'];
2000 $this->valF["numerotation_num"] = $num_urba['di']['numero'];
2001 $this->valF["numerotation_suffixe"] = isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : null;
2002 $this->valF["numerotation_num_suffixe"] = isset($num_urba['di']['num_suffixe']) === true ? $num_urba['di']['num_suffixe'] : null;
2003 }
2004 else {
2005 $this->valF[$this->clePrimaire] = $num_doss_comp;
2006 $this->valF["dossier_libelle"] = $num_doss_comp;
2007 }
2008 }
2009 else {
2010
2011 //
2012 // GESTION DU SUFFIXE
2013 // La version du suffixe est celle du type de DI : à ne pas confondre
2014 // avec celle du DI lui même.
2015 // Exemple chronologique :
2016 // DI n° PC0130551600004 -> version 0
2017 // DI n° PC0130551600004M01 -> version 1
2018 // DI n° PC0130551600004PRO01 -> version 2 !!
2019 //
2020 $code = null;
2021 $numeroVersionDossierInstructionType = null;
2022 $suffixe = "";
2023 // Si l'option suffixe de ce type de DI est activée
2024 if ( $this->getSuffixe($this->getDossierInstructionType()) === 't' ){
2025 // Récupération de la lettre associée au type de dossier d'instruction
2026 $code = $this->getCode($this->getDossierInstructionType());
2027 // Récupération du numéro de version en fonction du type de dossier d'instruction
2028 $numeroVersionDossierInstructionType = $this->getNumeroVersionDossierInstructionType($val['dossier_autorisation'], $val['dossier_instruction_type'], $val['demande_type'], $numeroVersion);
2029 // Suffixe
2030 $suffixe = $code.$numeroVersionDossierInstructionType;
2031 }
2032
2033 // Numéro de dossier
2034 $this->valF['dossier'] = $val['dossier_autorisation'].$suffixe;
2035 // Identifiant du dossier d'instruction lisible
2036 $this->valF['dossier_libelle'] = $this->get_dossier_autorisation_libelle($val['dossier_autorisation']).$suffixe;
2037
2038
2039 // Sauvegarde les valeurs composants la numérotation
2040 $da = $this->f->get_inst__om_dbform(array(
2041 "obj" => "dossier_autorisation",
2042 "idx" => $val['dossier_autorisation'],
2043 ));
2044 $this->valF["numerotation_type"] = ($da->getVal("numerotation_type") !== null && $da->getVal("numerotation_type") !== '') ? $da->getVal("numerotation_type") : null;
2045 $this->valF["numerotation_dep"] = ($da->getVal("numerotation_dep") !== null && $da->getVal("numerotation_dep") !== '') ? $da->getVal("numerotation_dep") : null;
2046 $this->valF["numerotation_com"] = ($da->getVal("numerotation_com") !== null && $da->getVal("numerotation_com") !== '') ? $da->getVal("numerotation_com") : null;
2047 $this->valF["numerotation_division"] = ($da->getVal("numerotation_division") !== null && $da->getVal("numerotation_division") !== '') ? $da->getVal("numerotation_division") : null;
2048 $this->valF["numerotation_num"] = ($da->getVal("numerotation_num") !== null && $da->getVal("numerotation_num") !== '') ? $da->getVal("numerotation_num") : null;
2049 $this->valF["numerotation_suffixe"] = $code;
2050 $this->valF["numerotation_num_suffixe"] = $numeroVersionDossierInstructionType;
2051 }
2052
2053 $collectivite = $this->f->getCollectivite($val['om_collectivite']);
2054 if ($this->f->is_option_om_collectivite_entity_enabled($val['om_collectivite']) === true
2055 && $collectivite['code_entite'] !== null) {
2056 //
2057 $this->valF["numerotation_entite"] = $collectivite['code_entite'];
2058 $this->valF["numerotation_num_entite"] = $this->increment_num_entite($val['dossier_autorisation']);
2059 $numerotation_num_entite = str_pad($this->valF["numerotation_num_entite"], 2, "0", STR_PAD_LEFT);
2060 $this->valF[$this->clePrimaire] = $this->valF[$this->clePrimaire].$this->valF["numerotation_entite"].$numerotation_num_entite;
2061 $this->valF['dossier_libelle'] = $this->valF['dossier_libelle']." ".$this->valF["numerotation_entite"].$numerotation_num_entite;
2062 }
2063
2064 }
2065
2066 // Permet d'incrémenter le numéro de version de l'entité
2067 public function increment_num_entite($da) {
2068 if ($da === null || $da === '') {
2069 return false;
2070 }
2071 $last_entity_num = 0;
2072 //
2073 $inst_da = $this->f->get_inst__om_dbform(array(
2074 "obj" => "dossier_autorisation",
2075 "idx" => $da,
2076 ));
2077 $list_di = $inst_da->get_list_dossier_instruction();
2078 foreach ($list_di as $di) {
2079 $inst_di = $this->f->get_inst__om_dbform(array(
2080 "obj" => "dossier",
2081 "idx" => $di['dossier'],
2082 ));
2083 if (intval($inst_di->getVal('numerotation_num_entite')) > $last_entity_num) {
2084 $last_entity_num = intval($inst_di->getVal('numerotation_num_entite'));
2085 }
2086 }
2087 return ++$last_entity_num;
2088 }
2089
2090 /*Récupère la valeur du suffixe d'un dossier_instruction_type*/
2091 function getSuffixe($dossierInstructionType){
2092
2093 $suffixe = "";
2094
2095 $sql = "SELECT
2096 suffixe
2097 FROM
2098 ".DB_PREFIXE."dossier_instruction_type
2099 WHERE
2100 dossier_instruction_type = $dossierInstructionType";
2101
2102 $this->addToLog("getSuffixe(): db->query(\"".$sql."\")", VERBOSE_MODE);
2103 $res = $this->f->db->query($sql);
2104 if (database :: isError($res))
2105 die($res->getMessage()."erreur ".$sql);
2106
2107 if ( $res->numRows() > 0 ){
2108
2109 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2110 $suffixe = $row['suffixe'];
2111 }
2112
2113 return $suffixe;
2114 }
2115
2116 /*Récupère dans la table de paramètrage la lettre correspondant
2117 * au dossier_instruction_type
2118 */
2119 function getCode($dossierInstructionType){
2120
2121 $code = "";
2122
2123 $sql = "SELECT
2124 code
2125 FROM
2126 ".DB_PREFIXE."dossier_instruction_type
2127 WHERE
2128 dossier_instruction_type = $dossierInstructionType";
2129
2130 $this->addToLog("getCode(): db->query(\"".$sql."\")", VERBOSE_MODE);
2131 $res = $this->f->db->query($sql);
2132 if (database :: isError($res))
2133 die($res->getMessage()."erreur ".$sql);
2134
2135 if ( $res->numRows() > 0 ){
2136
2137 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2138 $code = $row['code'];
2139 }
2140
2141 return $code;
2142 }
2143
2144 /*Récupère le numéro de version d'un dossier_autorisation*/
2145 function getNumeroVersion($dossierAutorisation){
2146
2147 $numeroVersion = "";
2148
2149 $sql = "SELECT
2150 numero_version
2151 FROM
2152 ".DB_PREFIXE."dossier_autorisation
2153 WHERE
2154 dossier_autorisation = '$dossierAutorisation'";
2155
2156 $this->addToLog("getNumeroVersion(): db->query(\"".$sql."\")", VERBOSE_MODE);
2157 $res = $this->f->db->query($sql);
2158 if (database :: isError($res))
2159 die($res->getMessage()."erreur ".$sql);
2160
2161 if ( $res->numRows() > 0 ){
2162
2163 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
2164 $numeroVersion = $row['numero_version'];
2165 }
2166
2167 return $numeroVersion;
2168 }
2169
2170 /**
2171 * Retourne le numéro d'un dossier d'instruction et ses six parties.
2172 *
2173 * @param string $dossier_instruction Identifiant du dossier d'instruction (avec ou sans espace)
2174 *
2175 * @return array
2176 */
2177 function get_dossier_instruction_numero($dossier_instruction = null) {
2178
2179 // Si le DI n'a pas été fourni
2180 if ($dossier_instruction === null) {
2181 // On le récupère
2182 $dossier_instruction = $this->getVal($this->clePrimaire);
2183 }
2184
2185 /*
2186 Analyse du numéro du DI et extraction de ses parties
2187
2188 Retour : tableau associatif:
2189 - type : type du DA (2 ou 3 lettres)
2190 - depcom : code département + code communes(3 + 3 integer)
2191 - annee : année (2 integer)
2192 - division : division (une lettre ou un entier)
2193 - numero : numéro
2194 - mod : lettre(s) du type du dossier d'instruction (P, M, ANNUL, ...)
2195 - version : version du dossier d'instruction (1 ou 2 integer)
2196 */
2197 //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) {
2198 $matches = array();
2199 if (! preg_match_all(
2200 '/^(?P<type>[A-Z]{2,3})'.'\s{0,1}'.
2201 '(?P<departement>(\d{3}|02[AB]))'.
2202 '(?P<commune>\d{3})'.'\s{0,1}'.
2203 '(?P<annee>\d{2})'.'\s{0,1}'.
2204 '(?P<division>[[:alnum:]])'.
2205 '(?P<numero>\d{4})'.
2206 '(?P<suffixe>[A-Z]{1,5})?'.
2207 '(?P<num_suffixe>\d{1,2})?'.'$/', $dossier_instruction, $matches)) {
2208 $this->f->addToLog(
2209 __METHOD__."()".sprintf(__("Échec du parsing du numéro de dossier %s."), $dossier_instruction),
2210 DEBUG_MODE);
2211 return false;
2212 }
2213 $res = array();
2214 foreach(array(
2215 'type', 'departement', 'commune', 'annee', 'division', 'numero', 'suffixe', 'num_suffixe')
2216 as $key) {
2217 if(isset($matches[$key][0])) {
2218 $res[$key] = $matches[$key][0];
2219 }
2220 }
2221 //$this->f->addToLog(__METHOD__."() res: ".var_export($res, true), DEBUG_MODE);
2222 return $res;
2223 }
2224
2225 /**
2226 * Récupère les arguments nécessaires à la construction d'une séquence de
2227 * dossier.
2228 *
2229 * @return array
2230 */
2231 function get_sequence_args() {
2232 //
2233 $result = array();
2234
2235 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
2236 $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
2237 $result['datc'] = $inst_dat->getVal('code');
2238 $result['annee'] = $this->getVal('annee');
2239
2240 $parse_id = $this->get_dossier_instruction_numero();
2241 if ($parse_id === false
2242 || (is_array($parse_id) && empty(array_filter($parse_id)) === true)) {
2243 // Message dans le log
2244 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de version du dossier d'instruction."), DEBUG_MODE);
2245 return false;
2246 }
2247
2248 $result['dep'] = $parse_id['departement'];
2249 $result['com'] = $parse_id['commune'];
2250 //$this->f->addToLog(__METHOD__."(): res: ".var_export($result, true), DEBUG_MODE);
2251 return $result;
2252 }
2253
2254 /**
2255 * Retourne le nom de la sequence du dossier d'instruction courant.
2256 *
2257 * @return String
2258 */
2259 function get_sequence_name() {
2260 $sequence_args = $this->get_sequence_args();
2261 if (empty($sequence_args) === true) {
2262 // Message dans le log
2263 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération des arguments de la séquence."), DEBUG_MODE);
2264 return false;
2265 }
2266 return $this->compose_sequence_name(
2267 $sequence_args['datc'], $sequence_args['annee'],
2268 $sequence_args['dep'], $sequence_args['com']);
2269 }
2270
2271 /**
2272 * Récupère le numéro de version du dossier d'instruction.
2273 *
2274 * @return string
2275 */
2276 function get_dossier_instruction_version($dossier_instruction = null) {
2277
2278 // Expression régulière qui découpe le numéro du dossier
2279 $return = $this->get_dossier_instruction_numero($dossier_instruction);
2280
2281 // Si l'expression régulière retourne une erreur
2282 if ($return == false) {
2283 // Message dans le log
2284 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de version du dossier d'instruction"), DEBUG_MODE);
2285 //
2286 return false;
2287 }
2288
2289 // Retourne seulement la version du dossier d'instruction.
2290 // Elle vaut 0 si le numéro du DI n'a pas de suffixe.
2291 if (isset($return['num_suffixe'])) {
2292 return $return['num_suffixe'];
2293 }
2294 return 0;
2295 }
2296
2297 /*Incrémente le numéro de version du dossier*/
2298 function incrementNumeroVersion($dossierAutorisation, $nouveauNumeroVersion) {
2299
2300 $valF = array (
2301 "numero_version" => $nouveauNumeroVersion
2302 );
2303
2304 $res = $this->f->db->autoExecute(DB_PREFIXE."dossier_autorisation",
2305 $valF,
2306 DB_AUTOQUERY_UPDATE,
2307 "dossier_autorisation = '$dossierAutorisation'");
2308
2309 if (database :: isError($res))
2310 die($res->getMessage()."erreur ".$sql);
2311
2312 }
2313
2314 /**
2315 * Retourne un numéro de version en fonction du type de dossier d'instruction
2316 * @param string $dossier_autorisation
2317 * @param integer $dossier_instruction_type
2318 * @return int
2319 */
2320 public function getNumeroVersionDossierInstructionType($dossier_autorisation, $dossier_instruction_type, $demande_type, $numero_version, $increment = true){
2321
2322 $numeroVersionDossierInstructionType = $numero_version;
2323
2324 // Récupère la nature de la demande
2325 $inst_demande_type = $this->f->get_inst__om_dbform(array(
2326 "obj" => "demande_type",
2327 "idx" => $demande_type
2328 ));
2329 $inst_demande_nature = $this->f->get_inst__om_dbform(array(
2330 "obj" => "demande_nature",
2331 "idx" => $inst_demande_type->getVal('demande_nature')
2332 ));
2333
2334 // Si c'est un dossier d'instruction de type "Initial"
2335 if (strtolower($inst_demande_nature->getVal('code')) === 'nouv') {
2336 return 0;
2337 }
2338 //Si c'est un modificatif ou transfert on retourne un nombre correspondant au
2339 //nombre de dossier d'instruction de ce type, rattaché au dossier
2340 //d'autorisation complété par des 0 à gauche si besoin. Format du retour
2341 //attendu : 01 ou 02, etc.
2342 else {
2343
2344 //On récupère le nombre de dossier d'instruction de ce type rattaché au
2345 //dossier d'autorisation
2346 $sql = "SELECT
2347 count(dossier)
2348 FROM
2349 ".DB_PREFIXE."dossier
2350 LEFT JOIN
2351 ".DB_PREFIXE."dossier_autorisation
2352 ON
2353 dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
2354 WHERE
2355 dossier_autorisation.dossier_autorisation = '".$dossier_autorisation."'
2356 AND
2357 dossier.dossier_instruction_type = ".$dossier_instruction_type;
2358 $numeroVersionDossierInstructionType = $this->f->db->getOne($sql);
2359 $this->f->addToLog("getNumeroVersionDossierInstructionType(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
2360 if ( database::isError($numeroVersionDossierInstructionType)){
2361 $this->f->addToError("", $numeroVersionDossierInstructionType, $numeroVersionDossierInstructionType);
2362 return false;
2363 }
2364
2365 // Requête SQL
2366 $sql = "SELECT
2367 substring(dossier, '\d*$')::int as last_num_dossier
2368 FROM ".DB_PREFIXE."dossier
2369 WHERE dossier_instruction_type = ".$dossier_instruction_type."
2370 AND dossier_autorisation = '".$dossier_autorisation."'
2371 AND version = (
2372 SELECT max(version)
2373 FROM ".DB_PREFIXE."dossier
2374 WHERE dossier_instruction_type = ".$dossier_instruction_type."
2375 AND dossier_autorisation = '".$dossier_autorisation."'
2376 GROUP BY dossier_instruction_type, dossier_autorisation
2377 )";
2378 $res = $this->f->db->query($sql);
2379 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
2380 $this->f->isDatabaseError($res);
2381 $num_version_last_dossier = null;
2382 if ($res->numRows() > 0) {
2383 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
2384 $num_version_last_dossier = $row['last_num_dossier'];
2385 }
2386
2387 if (!empty($num_version_last_dossier)
2388 && $num_version_last_dossier >= $numeroVersionDossierInstructionType) {
2389 // Modifie le numéro suivant
2390 $numeroVersionDossierInstructionType = $num_version_last_dossier;
2391 }
2392 //
2393 if ($increment === true) {
2394 $numeroVersionDossierInstructionType = ++$numeroVersionDossierInstructionType;
2395 }
2396 //On compléte par des 0 à gauche
2397 $numeroVersionDossierInstructionType = str_pad($numeroVersionDossierInstructionType, 2, "0", STR_PAD_LEFT);
2398
2399 return $numeroVersionDossierInstructionType;
2400 }
2401 }
2402 /**
2403 * Retourne le libellé du dossier d'autorisation
2404 * @param string $dossier_autorisation Identifiant du dossier d'autorisation
2405 * @return string Libellé dossier d'autorisation
2406 */
2407 function get_dossier_autorisation_libelle($dossier_autorisation) {
2408
2409 $dossier_autorisation_libelle = "";
2410
2411 // Requête SQL
2412 $sql = "SELECT
2413 dossier_autorisation_libelle
2414 FROM
2415 ".DB_PREFIXE."dossier_autorisation
2416 WHERE
2417 dossier_autorisation = '$dossier_autorisation'";
2418
2419 $dossier_autorisation_libelle = $this->f->db->getOne($sql);
2420 $this->addToLog("get_dossier_autorisation_libelle(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
2421 database::isError($dossier_autorisation_libelle);
2422
2423 // Retourne le résultat
2424 return $dossier_autorisation_libelle;
2425 }
2426
2427 function setvalF($val = array()){
2428
2429 if (! $this->f->is_option_dossier_commune_enabled()) {
2430 // ajoute une "fausse" clé 'commune' dans le tableau des données envoyées
2431 // car la fonction 'setValF()' dans 'gen/obj/demande.class.php'
2432 // déclenche une erreur 'Undefined index: commune' sinon
2433 $val['commune'] = null;
2434 // idem pour cette valeur qui est passée au dossier d'instruction
2435 $this->valF['commune'] = null;
2436 }
2437
2438 parent::setvalF($val);
2439
2440 // Récupération des id demandeurs postés
2441 $this->getPostedValues();
2442
2443 // enlever les valeurs a ne pas saisir -> recherche en trigger ajouter et modifier
2444 unset ($this->valF['geom']);
2445 unset ($this->valF['geom1']);
2446 // valeurs hiddenstatic (calcule)
2447 if($this->maj==1){
2448 // par defaut
2449 unset ($this->valF['etat']);
2450 unset ($this->valF['delai']);
2451 unset ($this->valF['accord_tacite']);
2452 }
2453 unset ($this->valF['avis_decision']); // avis + libelle avis
2454 unset ($this->valF['terrain_surface_calcul']);
2455 unset ($this->valF['shon_calcul']);
2456 unset ($this->valF['date_notification_delai']);
2457 unset ($this->valF['date_decision']);
2458 unset ($this->valF['date_limite']);
2459 unset ($this->valF['date_validite']);
2460 unset ($this->valF['date_chantier']);
2461 unset ($this->valF['date_achevement']);
2462 unset ($this->valF['date_conformite']);
2463 // Ce champ est mis à jour uniquement par la gestion spécifique du log
2464 // et donc jamais par les actions ajouter/modifier
2465 unset ($this->valF['log_instructions']);
2466 // Ce champ n'est jamais mis à jour, seulement initialisé à la création
2467 // du dossier d'instruction
2468 unset($this->valF['initial_dt']);
2469
2470 // Vérification de la saisie manuelle du numéro complet
2471 $force_param_duree_val = false;
2472 $num_doss_comp = isset($val['numero_dossier_complet']) === true ? $val['numero_dossier_complet'] : null;
2473 if ($num_doss_comp !== null) {
2474 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2475 if (empty($num_urba['di']) === false) {
2476 $force_param_duree_val = true;
2477 }
2478 }
2479 // Durée de validité lors de la création du dossier d'instruction
2480 $this->valF['duree_validite'] = $this->get_duree_validite($this->valF['dossier_autorisation'], $force_param_duree_val);
2481 }
2482
2483
2484 /**
2485 * Retourne le type de formulaire : ADS, CTX RE, CTX IN ou DPC.
2486 *
2487 * @return mixed $type_aff_form Type de formulaire (string) ou false (bool) si erreur BDD.
2488 */
2489 function get_type_affichage_formulaire() {
2490 if (isset($this->type_aff_form) === true) {
2491 return $this->type_aff_form;
2492 }
2493 //
2494 if($this->getParameter('maj') == '0' OR $this->get_action_crud() === 'create') {
2495 $id_dossier_instruction_type = $this->valF["dossier_instruction_type"];
2496 } else {
2497 $id_dossier_instruction_type = $this->getVal("dossier_instruction_type");
2498 }
2499 $sql = "SELECT dossier_autorisation_type.affichage_form
2500 FROM " . DB_PREFIXE . "dossier_instruction_type
2501 INNER JOIN " . DB_PREFIXE . "dossier_autorisation_type_detaille
2502 ON dossier_instruction_type.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2503 INNER JOIN " . DB_PREFIXE . "dossier_autorisation_type
2504 ON dossier_autorisation_type.dossier_autorisation_type=dossier_autorisation_type_detaille.dossier_autorisation_type
2505 WHERE dossier_instruction_type.dossier_instruction_type=" . intval($id_dossier_instruction_type);
2506 $type_aff_form = $this->f->db->getOne($sql);
2507 $this->f->addToLog(__METHOD__ . " : db->getOne(\"" . $sql . "\")", VERBOSE_MODE);
2508 if($this->f->isDatabaseError($type_aff_form, true) === true) {
2509 return false;
2510 }
2511 $this->type_aff_form = $type_aff_form;
2512 //
2513 return $this->type_aff_form;
2514 }
2515
2516
2517 /**
2518 * Retourne le code du groupe du dossier d'instruction.
2519 *
2520 * @return string
2521 */
2522 public function get_groupe() {
2523 //
2524 if (isset($this->groupe) === true && $this->groupe !== null) {
2525 return $this->groupe;
2526 }
2527
2528 // Récupère le code du groupe
2529 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
2530 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
2531 $inst_groupe = $this->get_inst_groupe($inst_dossier_autorisation_type->getVal('groupe'));
2532 $groupe = $inst_groupe->getVal('code');
2533
2534 //
2535 $this->groupe = $groupe;
2536 //
2537 return $this->groupe;
2538 }
2539
2540 /**
2541 * @return void
2542 */
2543 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
2544 parent::verifier($val);
2545 // La date de dépôt est obligatoire
2546 if ($val['date_depot'] === '' || $val['date_depot'] === null) {
2547 //
2548 $this->correct = false;
2549 $this->addToMessage( _('Le champ').' <span class="bold">'.$this->getLibFromField('date_depot').'</span> '._('est obligatoire'));
2550 }
2551
2552 $type_aff_form = $this->get_type_affichage_formulaire();
2553 if ($type_aff_form ===false) {
2554 $this->correct = false;
2555 $this->addToMessage(_("Une erreur s'est produite lors de l'ajout de ce dossier. Veuillez contacter votre administrateur."));
2556 }
2557
2558 switch ($type_aff_form) {
2559 case 'ADS':
2560 case 'CTX RE':
2561 case 'CONSULTATION ENTRANTE':
2562 if (!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
2563 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
2564 !is_null($this->form)) {
2565 $this->correct = false;
2566 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
2567 }
2568 break;
2569 case 'CTX IN':
2570 if (!isset($this->postedIdDemandeur["contrevenant_principal"]) OR
2571 empty($this->postedIdDemandeur["contrevenant_principal"]) AND
2572 !is_null($this->form)) {
2573 $this->correct = false;
2574 $this->addToMessage(_("La saisie d'un contrevenant principal est obligatoire."));
2575 }
2576 break;
2577 case 'DPC':
2578 if(!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
2579 empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
2580 !is_null($this->form)) {
2581 $this->correct = false;
2582 $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
2583 }
2584 if(!isset($this->postedIdDemandeur["bailleur_principal"]) OR
2585 empty($this->postedIdDemandeur["bailleur_principal"]) AND
2586 !is_null($this->form)) {
2587 $this->correct = false;
2588 $this->addToMessage(_("La saisie d'un bailleur principal est obligatoire."));
2589 }
2590 break;
2591 }
2592
2593 // Récupération du crud par rapport au mode du formulaire
2594 $crud = $this->get_action_crud($this->getParameter("maj"));
2595
2596 // L'année de la date de dépot ne peut pas être modifiée
2597 if ($crud === 'update' && array_key_exists("date_depot", $val) === true && ($val["date_depot"] !== "" && $val["date_depot"] !== null)) {
2598 //
2599 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
2600 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
2601 if ($new_date->format("Y") != $old_date->format("Y")) {
2602 $this->addToMessage(_("L'année de la date de dépôt n'est pas modifiable."));
2603 $this->correct = false;
2604 }
2605 }
2606
2607 // L'année de la date de dépot en mairie ne peut pas être modifiée
2608 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)) {
2609 //
2610 $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot_mairie"]);
2611 // Dans le cas où une date de dépôt en mairie est saisie et que l'option pour afficher
2612 // ce champ est désactivée, le champ sera mis en hidden et donc le format de la date
2613 // dans la valeur ne sera plus "d/m/Y" mais "Y-m-d".
2614 $new_date = $new_date !== false ? $new_date : DateTime::createFromFormat('Y-m-d', $val["date_depot_mairie"]);
2615 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot_mairie"));
2616 if ($old_date !== false && $new_date->format("Y") != $old_date->format("Y")) {
2617 $this->addToMessage(_("L'année de la date de dépôt en mairie n'est pas modifiable."));
2618 $this->correct = false;
2619 }
2620 }
2621
2622 // option dossier_commune activée
2623 if ($this->f->is_option_dossier_commune_enabled()) {
2624
2625 // La commune doit être définie
2626 if ($crud !== 'delete') {
2627 if (! array_key_exists("commune", $val) || empty($val["commune"])) {
2628 $this->addToMessage(__("La commune doit être définie."));
2629 $this->correct = false;
2630 }
2631 else {
2632 // récupération de la date de demande
2633 $date_demande = 'NOW';
2634 $d_match = array();
2635 if (isset($val["date_demande"])
2636 && preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/',
2637 $val["date_demande"], $d_match)) {
2638 $date_demande = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
2639 }
2640 $date_demande = new DateTime($date_demande);
2641
2642 // La commune doit exister
2643 $commune = $this->f->findObjectById("commune", $val["commune"]);
2644 if (empty($commune)) {
2645 $this->addToMessage(__("La commune doit exister."));
2646 $this->correct = false;
2647 }
2648 // La commune ne peut pas être modifiée
2649 elseif ($crud === 'update') {
2650 if ($val["commune"] != $this->getVal('commune')) {
2651 $this->addToMessage(__("La commune n'est pas modifiable."));
2652 $this->correct = false;
2653 }
2654 }
2655 // La commune doit être valide
2656 elseif (! $commune->valid($date_demande)) {
2657 $this->addToMessage(__(
2658 "La commune doit être valide ".
2659 "à la date du '".$date_demande->format('d/m/Y')."'."));
2660 $this->correct = false;
2661 }
2662 }
2663 }
2664 }
2665 }
2666
2667
2668 /**
2669 * Permet de vérifier si les champs requis Plat'AU ont été remplis
2670 *
2671 * @param $dossier l'identifiant du dossier
2672 *
2673 * @return array un tableau contenant une clé is_ok qui indique
2674 * si tous les champs sont saisis ou non et une clé
2675 * required_fields_empty qui contient les champs qui n'ont pas été saisis
2676 * | false si une erreur survient
2677 *
2678 */
2679 function check_platau_required_fields($dossier) {
2680
2681 // On récupère les champs Plat'AU requis
2682 $fields_list = $this->list_platau_required_fields_dossier;
2683
2684 // On fait un tableau qui contiendra les tables et un tableau
2685 // qui contient les champs au format 'table.champ'
2686 $tables = array();
2687 $champs = array();
2688
2689 foreach ($fields_list as $value) {
2690 $expl_tab = explode('.', $value);
2691 if (! in_array($expl_tab[0], $tables)) {
2692 $tables[] = $expl_tab[0];
2693 }
2694 $champs[] = $value;
2695 }
2696
2697 // Il y aura toujours la table dossier dans la requête
2698 if (in_array('dossier', $tables)) {
2699 $key = array_keys($tables, 'dossier');
2700 unset($tables[$key[0]]);
2701 }
2702
2703 $from_tables = array();
2704 // On construit le 'FROM' de la requête sql avec les jointures
2705 foreach($tables as $table) {
2706 // Cas particulier pour la table demandeur et architecte
2707 if ($table == "demandeur") {
2708 $from_tables[] = sprintf(
2709 ' LEFT JOIN %1$slien_dossier_demandeur ON lien_dossier_demandeur.dossier = dossier.dossier LEFT JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur',
2710 DB_PREFIXE
2711 );
2712 } elseif ($table == "architecte") {
2713 $from_tables[] = sprintf(
2714 ' LEFT JOIN %sarchitecte ON architecte.architecte = donnees_techniques.architecte',
2715 DB_PREFIXE
2716 );
2717 } else {
2718 $from_tables[] = sprintf(" LEFT JOIN %s$table ON dossier.dossier = $table.%s ", DB_PREFIXE, $table == 'donnees_techniques' ? 'dossier_instruction' : 'dossier');
2719 }
2720 }
2721
2722 // Construction de la requête sql
2723 $sql = sprintf(
2724 '
2725 SELECT
2726 %s,
2727 CASE WHEN demandeur.qualite=\'particulier\'
2728 THEN
2729 TRIM(CONCAT_WS(\' \', demandeur.particulier_nom, demandeur.particulier_prenom))
2730 ELSE
2731 CASE WHEN demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL
2732 THEN
2733 TRIM(CONCAT_WS(\' \', demandeur.personne_morale_raison_sociale, demandeur.personne_morale_denomination, \'%s\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
2734 ELSE
2735 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination))
2736 END
2737 END as petitionnaire,
2738 demandeur.demandeur
2739 FROM
2740 %sdossier
2741 %s
2742 WHERE dossier.dossier = \'%s\'
2743 ',
2744 implode(', ', $champs),
2745 __("représenté(e) par"),
2746 DB_PREFIXE,
2747 implode(' ', $from_tables),
2748 $dossier
2749 );
2750
2751 // On récupère les champs
2752 $result_fields = $this->f->get_all_results_from_db_query($sql);
2753
2754 // Si il y a une erreur
2755 if ($result_fields['code'] == 'KO'
2756 || $result_fields['result'] == ''
2757 || $result_fields['result'] == null) {
2758
2759 $this->addToLog(__METHOD__."() query : ".var_export($sql, true)." error: ".var_export($result_fields['message'], true), DEBUG_MODE);
2760 return false;
2761 }
2762
2763 // On récupère le résultat de la requête
2764 $required_fields = $result_fields['result'];
2765
2766 $required_fields_with_tab = array();
2767
2768 // Pour chaque champ on récupère la table
2769 $demandeur_num = 1;
2770 foreach ($required_fields as $required_field) {
2771 foreach ($champs as $champ) {
2772 if ($champ == "demandeur.localite") {
2773 $required_fields_with_tab[$champ.','.$required_field['petitionnaire'].' '.$required_field['demandeur']] = $required_field[explode('.', $champ)[1]];
2774 } else {
2775 $required_fields_with_tab[$champ] = $required_field[explode('.', $champ)[1]];
2776 }
2777 }
2778 }
2779
2780 // On vérifie si un architecte est lié
2781 $sql_architecte = sprintf(
2782 'SELECT
2783 architecte.*
2784 FROM
2785 %1$sdossier
2786 LEFT JOIN %1$sdonnees_techniques on dossier.dossier = donnees_techniques.dossier_instruction
2787 LEFT JOIN %1$sarchitecte ON donnees_techniques.architecte = architecte.architecte
2788 WHERE
2789 dossier.dossier = \'%2$s\'',
2790 DB_PREFIXE,
2791 $this->f->db->escapeSimple($dossier)
2792 );
2793
2794 $result_architecte = $this->f->get_one_result_from_db_query($sql_architecte);
2795
2796 if ($result_architecte['code'] == 'KO') {
2797 $this->addToLog(__METHOD__."() plop error: ".var_export($result_architecte['message'], true), DEBUG_MODE);
2798 return false;
2799 }
2800
2801 // Si il n'est pas lié on enlève le champs architecte
2802 if ($result_architecte['result'] == '' || $result_architecte['result'] == null) {
2803 unset($required_fields_with_tab['architecte.ville']);
2804 }
2805
2806 $result_tab = array(
2807 'is_ok' => false,
2808 'required_fields_empty' => array()
2809 );
2810
2811 // Construction du message avec les tables et les champs
2812 foreach ($required_fields_with_tab as $required_field => $value) {
2813 if ($value == null || $value == '') {
2814 $required_fields_splited = explode('.', $required_field);
2815 if (isset(explode(',', $required_fields_splited[1])[1])) {
2816 $required_fields_splited = explode('.', $required_field);
2817 // On enlève l'identifiant du demandeur dans le message
2818 $required_fields_splited[1] = preg_replace('/[0-9]*$/', '', $required_fields_splited[1]);
2819 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
2820 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
2821 __(" le champ : "),
2822 __(explode(',', $required_fields_splited[1])[0]).' pour '.explode(',', $required_fields_splited[1])[1]
2823 );
2824 } else {
2825 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
2826 sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
2827 __(" le champ : "),
2828 __($required_fields_splited[1])
2829 );
2830 }
2831 }
2832 }
2833
2834 if (empty($result_tab['required_fields_empty'])) {
2835 $result_tab['is_ok'] = true;
2836 }
2837
2838 return $result_tab;
2839
2840 }
2841
2842
2843 /**
2844 * Permet de mettre à jour le state d'une task selon certains paramètre
2845 * Si le paramètre $dossier_autorisation est spécifié cela signifie que
2846 * le dossier a été transmis et qu'on doit modifier les state seulement
2847 * des tache de modification du di et d da
2848 *
2849 * @param dossier l'identifiant du dossier
2850 * @param state_prev le state de la tâche
2851 * @param state_wanted le state que doit avoir la tâche
2852 * @param dossier_autorisation l'identifiant du dossier d'autorisation
2853 *
2854 * @return void
2855 *
2856 */
2857 function update_task_state($dossier, $state_prev, $state_wanted, $dossier_autorisation=null, $modif_task=false) {
2858
2859 $already_transmitted_updated = '';
2860 $type_task_to_update = '';
2861
2862 $already_transmitted_updated = sprintf('OR task.dossier=\'%s\'', $dossier_autorisation !== null ? $dossier_autorisation : $this->valF['dossier_autorisation']);
2863 // Si le dossier_autorisation est spécifié on construit le WHERE
2864 if ($modif_task === true) {
2865 $type_task_to_update = sprintf('AND (type=\'modification_DI\' OR type=\'modification_DA\')');
2866 }
2867
2868 $sql = sprintf(
2869 'SELECT task FROM %stask WHERE task.state = \'%s\' AND (task.dossier=\'%s\' %s) %s %s',
2870 DB_PREFIXE,
2871 $state_prev,
2872 $dossier,
2873 $already_transmitted_updated,
2874 $type_task_to_update,
2875 " AND type NOT IN ('notification_recepisse', 'notification_instruction', 'notification_decision') "
2876 );
2877 $tasks_id = $this->f->get_all_results_from_db_query($sql);
2878 $params = array('val' => array('state' => $state_wanted));
2879 foreach ($tasks_id['result'] as $task_id) {
2880 $inst_task = $this->f->get_inst__om_dbform(array(
2881 "obj" => "task",
2882 "idx" => intval($task_id['task'])
2883 ));
2884 $inst_task->update_task($params);
2885 }
2886 }
2887
2888
2889 function setType(&$form,$maj) {
2890 // Par défaut le type des champs est géré nativement par le framework
2891 parent::setType($form,$maj);
2892
2893 // Récupération du contexte : groupe, CRUD et paramètres
2894 $groupe = $this->get_type_affichage_formulaire();
2895 $crud = $this->get_action_crud($maj);
2896 $parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
2897
2898 //
2899 // Gestion du groupe
2900 //
2901
2902 // CONSULTATION ENTRANTE
2903 $ce_fields = array(
2904 'autorisation_contestee' => 'hidden',
2905 'cle_acces_citoyen' => 'static',
2906 'contrevenants' => 'hidden',
2907 'date_ait' => 'hidden',
2908 'date_audience' => 'hidden',
2909 'date_affichage' => 'datestatic',
2910 'date_cloture_instruction' => 'hidden',
2911 'date_contradictoire' => 'hidden',
2912 'date_derniere_visite' => 'hidden',
2913 'date_premiere_visite' => 'hidden',
2914 'date_transmission_parquet' => 'hidden',
2915 'dossier_autorisation_type_detaille' => 'hidden',
2916 'dossier_instruction_type' => 'selecthiddenstatic',
2917 'dossier_petitionnaires' => 'hidden',
2918 'dt_ctx_infraction' => 'hidden',
2919 'dt_ctx_regularisable' => 'hidden',
2920 'dt_ctx_synthese_anr' => 'hidden',
2921 'dt_ctx_synthese_nti' => 'hidden',
2922 'ctx_reference_dsj' => 'hidden',
2923 'enjeu_ctx' => 'static',
2924 'instructeur_2' => 'hidden',
2925 'requerants' => 'hidden',
2926 'bailleur' => 'hidden',
2927 'ctx_reference_sagace' => 'hidden',
2928 'pec_metier' => 'selecthiddenstatic',
2929 "consultation_entrante" => 'hidden',
2930 "delai_reponse" => 'hidden',
2931 "type_delai" => 'hidden',
2932 "objet_consultation" => 'hidden',
2933 "date_production_notification" => 'hidden',
2934 "date_premiere_consultation" => 'hidden',
2935 "date_consultation" => 'hidden',
2936 "date_emission" => 'hidden',
2937 "service_consultant_id" => 'hidden',
2938 "service_consultant_libelle" => 'hidden',
2939 "service_consultant_insee" => 'hidden',
2940 "service_consultant_mail" => 'hidden',
2941 "service_consultant_type" => 'hidden',
2942 "service_consultant__siren" => 'hidden',
2943 "etat_consultation" => 'hidden',
2944 "type_consultation" => 'hidden',
2945 "texte_fondement_reglementaire" => 'hidden',
2946 "texte_objet_consultation" => 'hidden',
2947 "dossier_consultation" => 'hidden',
2948 );
2949 // INFRACTION
2950 $inf_fields = array(
2951 'a_qualifier' => 'hidden',
2952 'autorisation_contestee' => 'hidden',
2953 'autorite_competente' => 'hidden',
2954 'cle_acces_citoyen' => 'hidden',
2955 'contrevenants' => 'static',
2956 'date_ait' => 'hiddenstaticdate',
2957 'date_audience' => 'hiddenstaticdate',
2958 'date_cloture_instruction' => 'hidden',
2959 'date_complet' => 'hidden',
2960 'date_contradictoire' => 'hiddenstaticdate',
2961 'date_decision' => 'hiddenstaticdate',
2962 'date_depot' => 'hiddenstaticdate',
2963 'date_depot_mairie' => 'hiddenstaticdate',
2964 'date_dernier_depot' => 'hidden',
2965 'date_derniere_visite' => 'hiddenstaticdate',
2966 'date_limite' => 'hidden',
2967 'date_limite_incompletude' => 'hidden',
2968 'date_premiere_visite' => 'hiddenstaticdate',
2969 'date_transmission_parquet' => 'hiddenstaticdate',
2970 'date_validite' => 'hidden',
2971 'delai' => 'hidden',
2972 'description_projet' => 'hidden',
2973 'dossier_autorisation_type_detaille' => 'hidden',
2974 'dossier_instruction_type' => 'hidden',
2975 'dossier_petitionnaire' => 'hidden',
2976 'dossier_petitionnaires' => 'hidden',
2977 'dt_ctx_infraction' => 'checkboxhiddenstatic',
2978 'dt_ctx_regularisable' => 'checkboxhiddenstatic',
2979 'dt_ctx_synthese_anr' => 'static',
2980 'dt_ctx_synthese_nti' => 'static',
2981 'ctx_reference_dsj' => 'static',
2982 'enjeu_ctx' => 'hidden',
2983 'enjeu_erp' => 'hidden',
2984 'enjeu_urba' => 'hidden',
2985 'erp' => 'hidden',
2986 'evenement_suivant_tacite' => 'hidden',
2987 'evenement_suivant_tacite_incompletude' => 'hidden',
2988 'numero_versement_archive' => 'hidden',
2989 'requerants' => 'hidden',
2990 'tax_mtn_part_commu' => 'hidden',
2991 'tax_mtn_part_depart' => 'hidden',
2992 'tax_mtn_part_reg' => 'hidden',
2993 'tax_mtn_total' => 'hidden',
2994 'tax_mtn_rap' => 'hidden',
2995 'tax_secteur' => 'hidden',
2996 'tax_mtn_part_commu_sans_exo' => 'hidden',
2997 'tax_mtn_part_depart_sans_exo' => 'hidden',
2998 'tax_mtn_part_reg_sans_exo' => 'hidden',
2999 'tax_mtn_total_sans_exo' => 'hidden',
3000 'tax_mtn_rap_sans_exo' => 'hidden',
3001 'bailleur' => 'hidden',
3002 'ctx_reference_sagace' => 'static',
3003 'pec_metier' => 'hidden',
3004 "consultation_entrante" => 'hidden',
3005 "delai_reponse" => 'hidden',
3006 "type_delai" => 'hidden',
3007 "objet_consultation" => 'hidden',
3008 "date_production_notification" => 'hidden',
3009 "date_premiere_consultation" => 'hidden',
3010 "date_consultation" => 'hidden',
3011 "date_emission" => 'hidden',
3012 "service_consultant_id" => 'hidden',
3013 "service_consultant_libelle" => 'hidden',
3014 "service_consultant_insee" => 'hidden',
3015 "service_consultant_mail" => 'hidden',
3016 "service_consultant_type" => 'hidden',
3017 "service_consultant__siren" => 'hidden',
3018 "etat_consultation" => 'hidden',
3019 "type_consultation" => 'hidden',
3020 "texte_fondement_reglementaire" => 'hidden',
3021 "texte_objet_consultation" => 'hidden',
3022 "dossier_consultation" => 'hidden',
3023 );
3024 // RECOURS
3025 $re_fields = array(
3026 'a_qualifier' => 'hidden',
3027 'autorite_competente' => 'hidden',
3028 'cle_acces_citoyen' => 'hidden',
3029 'contrevenants' => 'hidden',
3030 'date_ait' => 'hidden',
3031 'date_audience' => 'hidden',
3032 'date_cloture_instruction' => 'hiddenstaticdate',
3033 'date_complet' => 'hidden',
3034 'date_contradictoire' => 'hidden',
3035 'date_decision' => 'hiddenstaticdate',
3036 'date_depot' => 'hiddenstaticdate',
3037 'date_depot_mairie' => 'hiddenstaticdate',
3038 'date_dernier_depot' => 'hidden',
3039 'date_derniere_visite' => 'hidden',
3040 'date_limite' => 'hiddenstaticdate',
3041 'date_limite_incompletude' => 'hidden',
3042 'date_premiere_visite' => 'hidden',
3043 'date_transmission_parquet' => 'hidden',
3044 'date_validite' => 'hidden',
3045 'delai' => 'hidden',
3046 'description_projet' => 'hidden',
3047 'dossier_autorisation_type_detaille' => 'static',
3048 'dossier_instruction_type' => 'hidden',
3049 'dossier_petitionnaire' => 'hidden',
3050 'dossier_petitionnaires' => 'static',
3051 'dt_ctx_infraction' => 'hidden',
3052 'dt_ctx_regularisable' => 'hidden',
3053 'dt_ctx_synthese_anr' => 'hidden',
3054 'dt_ctx_synthese_nti' => 'hidden',
3055 'enjeu_ctx' => 'hidden',
3056 'enjeu_erp' => 'hidden',
3057 'enjeu_urba' => 'hidden',
3058 'erp' => 'hidden',
3059 'evenement_suivant_tacite' =>'selecthiddenstatic',
3060 'evenement_suivant_tacite_incompletude' => 'hidden',
3061 'instructeur_2' => 'hidden',
3062 'numero_versement_archive' => 'hidden',
3063 'requerants' => 'static',
3064 'tax_mtn_part_commu' => 'hidden',
3065 'tax_mtn_part_depart' => 'hidden',
3066 'tax_mtn_part_reg' => 'hidden',
3067 'tax_mtn_total' => 'hidden',
3068 'tax_mtn_rap' => 'hidden',
3069 'tax_secteur' => 'hidden',
3070 'tax_mtn_part_commu_sans_exo' => 'hidden',
3071 'tax_mtn_part_depart_sans_exo' => 'hidden',
3072 'tax_mtn_part_reg_sans_exo' => 'hidden',
3073 'tax_mtn_total_sans_exo' => 'hidden',
3074 'tax_mtn_rap_sans_exo' => 'hidden',
3075 'bailleur' => 'hidden',
3076 'ctx_reference_dsj' => 'static',
3077 'ctx_reference_sagace' => 'static',
3078 'pec_metier' => 'hidden',
3079 "consultation_entrante" => 'hidden',
3080 "delai_reponse" => 'hidden',
3081 "type_delai" => 'hidden',
3082 "objet_consultation" => 'hidden',
3083 "date_production_notification" => 'hidden',
3084 "date_premiere_consultation" => 'hidden',
3085 "date_consultation" => 'hidden',
3086 "date_emission" => 'hidden',
3087 "service_consultant_id" => 'hidden',
3088 "service_consultant_libelle" => 'hidden',
3089 "service_consultant_insee" => 'hidden',
3090 "service_consultant_mail" => 'hidden',
3091 "service_consultant_type" => 'hidden',
3092 "service_consultant__siren" => 'hidden',
3093 "etat_consultation" => 'hidden',
3094 "type_consultation" => 'hidden',
3095 "texte_fondement_reglementaire" => 'hidden',
3096 "texte_objet_consultation" => 'hidden',
3097 "dossier_consultation" => 'hidden',
3098 );
3099 // ADS
3100 $ads_fields = array(
3101 'autorisation_contestee' => 'hidden',
3102 'cle_acces_citoyen' => 'static',
3103 'contrevenants' => 'hidden',
3104 'date_ait' => 'hidden',
3105 'date_audience' => 'hidden',
3106 'date_affichage' => 'datestatic',
3107 'date_cloture_instruction' => 'hidden',
3108 'date_contradictoire' => 'hidden',
3109 'date_derniere_visite' => 'hidden',
3110 'date_premiere_visite' => 'hidden',
3111 'date_transmission_parquet' => 'hidden',
3112 'dossier_autorisation_type_detaille' => 'hidden',
3113 'dossier_instruction_type' => 'selecthiddenstatic',
3114 'dossier_petitionnaires' => 'hidden',
3115 'dt_ctx_infraction' => 'hidden',
3116 'dt_ctx_regularisable' => 'hidden',
3117 'dt_ctx_synthese_anr' => 'hidden',
3118 'dt_ctx_synthese_nti' => 'hidden',
3119 'ctx_reference_dsj' => 'hidden',
3120 'enjeu_ctx' => 'static',
3121 'instructeur_2' => 'hidden',
3122 'requerants' => 'hidden',
3123 'bailleur' => 'hidden',
3124 'ctx_reference_sagace' => 'hidden',
3125 'pec_metier' => 'selectstatic',
3126 "consultation_entrante" => 'hidden',
3127 "delai_reponse" => 'hidden',
3128 "type_delai" => 'hidden',
3129 "objet_consultation" => 'hidden',
3130 "date_production_notification" => 'hidden',
3131 "date_premiere_consultation" => 'hidden',
3132 "date_consultation" => 'hidden',
3133 "date_emission" => 'hidden',
3134 "service_consultant_id" => 'hidden',
3135 "service_consultant_libelle" => 'hidden',
3136 "service_consultant_insee" => 'hidden',
3137 "service_consultant_mail" => 'hidden',
3138 "service_consultant_type" => 'hidden',
3139 "service_consultant__siren" => 'hidden',
3140 "etat_consultation" => 'hidden',
3141 "type_consultation" => 'hidden',
3142 "texte_fondement_reglementaire" => 'hidden',
3143 "texte_objet_consultation" => 'hidden',
3144 "dossier_consultation" => 'hidden',
3145 );
3146 // DPC
3147 $dpc_fields = array(
3148 'autorisation_contestee' => 'hidden',
3149 'cle_acces_citoyen' => 'static',
3150 'contrevenants' => 'hidden',
3151 'date_ait' => 'hidden',
3152 'date_audience' => 'hidden',
3153 'date_cloture_instruction' => 'hidden',
3154 'date_contradictoire' => 'hidden',
3155 'date_derniere_visite' => 'hidden',
3156 'date_premiere_visite' => 'hidden',
3157 'date_transmission_parquet' => 'hidden',
3158 'dossier_autorisation_type_detaille' => 'hidden',
3159 'dossier_instruction_type' => 'selecthiddenstatic',
3160 'dossier_petitionnaires' => 'hidden',
3161 'dt_ctx_infraction' => 'hidden',
3162 'dt_ctx_regularisable' => 'hidden',
3163 'dt_ctx_synthese_anr' => 'hidden',
3164 'dt_ctx_synthese_nti' => 'hidden',
3165 'ctx_reference_dsj' => 'hidden',
3166 'enjeu_ctx' => 'static',
3167 'instructeur_2' => 'hidden',
3168 'requerants' => 'hidden',
3169 'bailleur' => 'static',
3170 'ctx_reference_sagace' => 'hidden',
3171 'pec_metier' => 'hidden',
3172 "consultation_entrante" => 'hidden',
3173 "delai_reponse" => 'hidden',
3174 "type_delai" => 'hidden',
3175 "objet_consultation" => 'hidden',
3176 "date_production_notification" => 'hidden',
3177 "date_premiere_consultation" => 'hidden',
3178 "date_consultation" => 'hidden',
3179 "date_emission" => 'hidden',
3180 "service_consultant_id" => 'hidden',
3181 "service_consultant_libelle" => 'hidden',
3182 "service_consultant_insee" => 'hidden',
3183 "service_consultant_mail" => 'hidden',
3184 "service_consultant_type" => 'hidden',
3185 "service_consultant__siren" => 'hidden',
3186 "etat_consultation" => 'hidden',
3187 "type_consultation" => 'hidden',
3188 "texte_fondement_reglementaire" => 'hidden',
3189 "texte_objet_consultation" => 'hidden',
3190 "dossier_consultation" => 'hidden',
3191 );
3192 // COMMUN
3193 $all_fields = array(
3194 'accord_tacite' => 'hidden',
3195 'annee' => 'hidden',
3196 'autres_demandeurs' => 'hidden',
3197 'date_achevement' => 'hidden',
3198 'date_chantier' => 'hidden',
3199 'date_conformite' => 'hidden',
3200 'date_notification_delai' => 'hidden',
3201 'date_rejet' => 'hidden',
3202 'date_retour_contradictoire' => 'hidden',
3203 'delai_incompletude' => 'hidden',
3204 'description' => 'hidden',
3205 'dossier' => 'hidden',
3206 'dossier_arrondissement' => 'hidden',
3207 'dossier_autorisation' => 'hidden',
3208 'dossier_autorisation_libelle' => 'hidden',
3209 'duree_validite' => 'hidden',
3210 'etat_pendant_incompletude' => 'hidden',
3211 'geom' => 'hiddenstatic',
3212 'geom1' => 'hidden',
3213 'incomplet_notifie' => 'hidden',
3214 'incompletude' => 'hidden',
3215 'interface_referentiel_erp' => 'hidden',
3216 'log_instructions' => 'nodisplay',
3217 'om_collectivite' => 'hidden',
3218 'quartier' => 'hidden',
3219 'version' => 'hidden',
3220 'date_modification' => 'hidden',
3221 'hash_sitadel' => 'hidden',
3222 'depot_electronique' => 'hidden',
3223 'version_clos' => 'hidden',
3224 'initial_dt' => 'hidden',
3225 'adresse_normalisee' => 'hidden',
3226 'adresse_normalisee_json' => 'hidden',
3227 'streetview' => 'hidden',
3228 'numerotation_type' => 'hidden',
3229 'numerotation_dep' => 'hidden',
3230 'numerotation_com' => 'hidden',
3231 'numerotation_division' => 'hidden',
3232 'numerotation_suffixe' => 'hidden',
3233 'numerotation_entite' => 'hidden',
3234 'numerotation_num' => 'hidden',
3235 'numerotation_num_suffixe' => 'hidden',
3236 'numerotation_num_entite' => 'hidden',
3237 );
3238 if (isset($parameters['option_afficher_division'])
3239 && $parameters['option_afficher_division'] !== 'true') {
3240 $all_fields['division'] = 'hidden';
3241 }
3242 if (isset($parameters['option_sig'])
3243 && $parameters['option_sig'] !== 'sig_interne'
3244 && $parameters['option_sig'] !== 'sig_externe'){
3245 $all_fields['geom'] = 'hidden';
3246 }
3247
3248 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3249 $all_fields['date_depot_mairie'] = 'hiddenstaticdate';
3250 } else {
3251 $all_fields['date_depot_mairie'] = 'hidden';
3252 }
3253
3254 //
3255 // Gestion du contexte
3256 //
3257
3258 // AJOUTER, MODIFIER
3259 if ($crud === 'create' OR $crud === 'update') {
3260
3261 $all_fields['avis_decision'] = 'selecthiddenstatic';
3262 $all_fields['etat'] = 'hiddenstatic';
3263 $all_fields['terrain'] = 'hiddenstatic';
3264 //
3265 $ads_fields['a_qualifier'] = 'checkbox';
3266 $ads_fields['accord_tacite'] = 'hiddenstatic';
3267 $ads_fields['autorite_competente'] = 'selecthiddenstatic';
3268 $ads_fields['date_achevement'] = 'hiddenstaticdate';
3269 $ads_fields['date_chantier'] = 'hiddenstaticdate';
3270 $ads_fields['date_conformite'] = 'hiddenstaticdate';
3271 $ads_fields['date_decision'] = 'hiddenstaticdate';
3272 $ads_fields['date_affichage'] = 'hiddenstaticdate';
3273 $ads_fields['date_depot'] = 'hiddenstaticdate';
3274 //
3275 $ce_fields['a_qualifier'] = 'checkbox';
3276 $ce_fields['accord_tacite'] = 'hiddenstatic';
3277 $ce_fields['autorite_competente'] = 'selecthiddenstatic';
3278 $ce_fields['date_achevement'] = 'hiddenstaticdate';
3279 $ce_fields['date_chantier'] = 'hiddenstaticdate';
3280 $ce_fields['date_conformite'] = 'hiddenstaticdate';
3281 $ce_fields['date_decision'] = 'hiddenstaticdate';
3282 $ce_fields['date_affichage'] = 'hiddenstaticdate';
3283 $ce_fields['date_depot'] = 'hiddenstaticdate';
3284 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3285 $ads_fields['date_depot_mairie'] = 'date';
3286 $ce_fields['date_depot_mairie'] = 'date';
3287 } else {
3288 $ads_fields['date_depot_mairie'] = 'hidden';
3289 $ce_fields['date_depot_mairie'] = 'hidden';
3290 }
3291 $ads_fields['date_dernier_depot'] = 'hiddenstaticdate';
3292 $ads_fields['date_notification_delai'] = 'hiddenstaticdate';
3293 $ads_fields['date_rejet'] = 'hiddenstaticdate';
3294 $ads_fields['date_validite'] = 'hiddenstaticdate';
3295 $ads_fields['delai'] = 'hiddenstatic';
3296 $ads_fields['description_projet'] = 'hiddenstatic';
3297 $ads_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3298 $ads_fields['shon_calcul'] = 'hiddenstatic';
3299 $ads_fields['tax_mtn_part_commu'] = 'hidden';
3300 $ads_fields['tax_mtn_part_depart'] = 'hidden';
3301 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3302 $ads_fields['tax_mtn_total'] = 'hidden';
3303 $ads_fields['tax_mtn_rap'] = 'hidden';
3304 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3305 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3306 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3307 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3308 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3309 $ads_fields['terrain_surface_calcul'] = 'hiddenstatic';
3310 //
3311 $ce_fields['date_dernier_depot'] = 'hiddenstaticdate';
3312 $ce_fields['date_notification_delai'] = 'hiddenstaticdate';
3313 $ce_fields['date_rejet'] = 'hiddenstaticdate';
3314 $ce_fields['date_validite'] = 'hiddenstaticdate';
3315 $ce_fields['delai'] = 'hiddenstatic';
3316 $ce_fields['description_projet'] = 'hiddenstatic';
3317 $ce_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3318 $ce_fields['shon_calcul'] = 'hiddenstatic';
3319 $ce_fields['tax_mtn_part_commu'] = 'hidden';
3320 $ce_fields['tax_mtn_part_depart'] = 'hidden';
3321 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3322 $ce_fields['tax_mtn_total'] = 'hidden';
3323 $ce_fields['tax_mtn_rap'] = 'hidden';
3324 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3325 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3326 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3327 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3328 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3329 $ce_fields['terrain_surface_calcul'] = 'hiddenstatic';
3330 //
3331 $dpc_fields['a_qualifier'] = 'checkbox';
3332 $dpc_fields['accord_tacite'] = 'hiddenstatic';
3333 $dpc_fields['autorite_competente'] = 'selecthiddenstatic';
3334 $dpc_fields['date_achevement'] = 'hiddenstaticdate';
3335 $dpc_fields['date_chantier'] = 'hiddenstaticdate';
3336 $dpc_fields['date_conformite'] = 'hiddenstaticdate';
3337 $dpc_fields['date_decision'] = 'hiddenstaticdate';
3338 $dpc_fields['date_depot'] = 'hiddenstaticdate';
3339 $dpc_fields['date_depot_mairie'] = 'hiddenstaticdate';
3340 $dpc_fields['date_dernier_depot'] = 'hiddenstaticdate';
3341 $dpc_fields['date_notification_delai'] = 'hiddenstaticdate';
3342 $dpc_fields['date_rejet'] = 'hiddenstaticdate';
3343 $dpc_fields['date_validite'] = 'hiddenstaticdate';
3344 $dpc_fields['delai'] = 'hiddenstatic';
3345 $dpc_fields['description_projet'] = 'hiddenstatic';
3346 $dpc_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3347 $dpc_fields['shon_calcul'] = 'hiddenstatic';
3348 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3349 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3350 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3351 $dpc_fields['tax_mtn_total'] = 'hidden';
3352 $dpc_fields['tax_mtn_rap'] = 'hidden';
3353 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3354 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3355 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3356 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3357 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3358 $dpc_fields['terrain_surface_calcul'] = 'hiddenstatic';
3359 //
3360 $re_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3361 $re_fields['dossier_petitionnaires'] = 'static';
3362 $re_fields['requerants'] = 'hiddenstatic';
3363 $inf_fields['contrevenants'] = 'hiddenstatic';
3364 $inf_fields['dt_ctx_synthese_anr'] = 'hiddenstatic';
3365 $inf_fields['dt_ctx_synthese_nti'] = 'hiddenstatic';
3366 //
3367 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3368 if ($this->get_source_depot_from_demande() === 'platau'
3369 || $this->get_source_depot_from_demande() === 'portal') {
3370 //
3371 $ce_fields["consultation_entrante"] = 'hidden';
3372 $ce_fields["delai_reponse"] = 'static';
3373 $ce_fields["type_delai"] = 'static';
3374 $ce_fields["objet_consultation"] = 'static';
3375 $ce_fields["date_production_notification"] = 'datestatic';
3376 $ce_fields["date_premiere_consultation"] = 'datestatic';
3377 $ce_fields["date_consultation"] = 'datestatic';
3378 $ce_fields["date_emission"] = 'datestatic';
3379 $ce_fields["service_consultant_id"] = 'static';
3380 $ce_fields["service_consultant_libelle"] = 'static';
3381 $ce_fields["service_consultant_insee"] = 'static';
3382 $ce_fields["service_consultant_mail"] = 'static';
3383 $ce_fields["service_consultant_type"] = 'static';
3384 $ce_fields["service_consultant__siren"] = 'static';
3385 $ce_fields["etat_consultation"] = 'static';
3386 $ce_fields["type_consultation"] = 'static';
3387 $ce_fields["texte_fondement_reglementaire"] = 'static';
3388 $ce_fields["texte_objet_consultation"] = 'static';
3389 $ce_fields["dossier_consultation"] = 'hidden';
3390 }
3391 // Si l'état du dossier est incomplet
3392 if ($this->is_incomplet_notifie()) {
3393 // On cache les dates de complétude et de limite d'instruction
3394 $ads_fields['date_complet'] = 'hidden';
3395 $ads_fields['date_limite'] = 'hidden';
3396 $ads_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3397 $ads_fields['evenement_suivant_tacite'] ='hidden';
3398 $ads_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3399 //
3400 $dpc_fields['date_complet'] = 'hidden';
3401 $dpc_fields['date_limite'] = 'hidden';
3402 $dpc_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3403 $dpc_fields['evenement_suivant_tacite'] ='hidden';
3404 $dpc_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3405 //
3406 $ce_fields['date_complet'] = 'hidden';
3407 $ce_fields['date_limite'] = 'hidden';
3408 $ce_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3409 $ce_fields['evenement_suivant_tacite'] ='hidden';
3410 $ce_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3411 } else {
3412 // Sinon on cache la date de limite d'incomplétude
3413 $ads_fields['date_limite_incompletude'] = 'hidden';
3414 $ads_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3415 $ads_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3416 $ads_fields['date_complet'] = 'hiddenstaticdate';
3417 $ads_fields['date_limite'] = 'hiddenstaticdate';
3418 //
3419 $dpc_fields['date_limite_incompletude'] = 'hidden';
3420 $dpc_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3421 $dpc_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3422 $dpc_fields['date_complet'] = 'hiddenstaticdate';
3423 $dpc_fields['date_limite'] = 'hiddenstaticdate';
3424 //
3425 $ce_fields['date_limite_incompletude'] = 'hidden';
3426 $ce_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3427 $ce_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3428 $ce_fields['date_complet'] = 'hiddenstaticdate';
3429 $ce_fields['date_limite'] = 'hiddenstaticdate';
3430 }
3431
3432 // MODIFIER
3433 if ($crud ==='update') {
3434 $all_fields['dossier_libelle'] = 'hiddenstatic';
3435 $ads_fields['dossier_petitionnaire'] = 'static';
3436 $dpc_fields['dossier_petitionnaire'] = 'static';
3437 $ce_fields['dossier_petitionnaire'] = 'static';
3438 //
3439 if ($this->f->isAccredited("dossier_modifier_instructeur")) {
3440 $all_fields['instructeur'] = 'select';
3441 $inf_fields['instructeur_2'] = 'select';
3442 } else {
3443 $all_fields['instructeur'] = 'selecthiddenstatic';
3444 $inf_fields['instructeur_2'] = 'selecthiddenstatic';
3445 }
3446 //
3447 if (isset($parameters['option_afficher_division'])
3448 && $parameters['option_afficher_division'] === 'true') {
3449 $all_fields['division'] = 'selecthiddenstatic';
3450 if ($this->f->isAccredited("dossier_modifier_division")) {
3451 $all_fields['division'] = 'select';
3452 }
3453 }
3454 // Si l'utilisateur ne peut pas qualifier un DI (guichet unique & guichet et suivi)
3455 if (!$this->f->isAccredited(array("dossier_instruction","dossier_instruction_qualifier"), "OR")) {
3456 // Il ne peut pas modifier les champs suivants
3457 $ads_fields['numero_versement_archive'] = 'hiddenstatic';
3458 $ads_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3459 $ads_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3460 $ads_fields['erp'] = 'checkboxhiddenstatic';
3461 $ads_fields['a_qualifier'] = 'checkboxhiddenstatic';
3462 //
3463 $dpc_fields['numero_versement_archive'] = 'hiddenstatic';
3464 $dpc_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3465 $dpc_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3466 $dpc_fields['erp'] = 'checkboxhiddenstatic';
3467 $dpc_fields['a_qualifier'] = 'checkboxhiddenstatic';
3468 //
3469 $ce_fields['numero_versement_archive'] = 'hiddenstatic';
3470 $ce_fields['enjeu_urba'] = 'checkboxhiddenstatic';
3471 $ce_fields['enjeu_erp'] = 'checkboxhiddenstatic';
3472 $ce_fields['erp'] = 'checkboxhiddenstatic';
3473 $ce_fields['a_qualifier'] = 'checkboxhiddenstatic';
3474 }
3475 // Le profil Qualificateur peut modifier seulement les champs
3476 // autorite_competente, a_qualifier et erp
3477 if ($this->f->isUserQualificateur()) {
3478 $ads_fields['numero_versement_archive'] = 'static';
3479 $ads_fields['enjeu_urba'] = 'checkboxstatic';
3480 $ads_fields['enjeu_erp'] = 'checkboxstatic';
3481 //
3482 $dpc_fields['numero_versement_archive'] = 'static';
3483 $dpc_fields['enjeu_urba'] = 'checkboxstatic';
3484 $dpc_fields['enjeu_erp'] = 'checkboxstatic';
3485 //
3486 $ce_fields['numero_versement_archive'] = 'static';
3487 $ce_fields['enjeu_urba'] = 'checkboxstatic';
3488 $ce_fields['enjeu_erp'] = 'checkboxstatic';
3489 }
3490 // Le dossier ne doit pas être instruit
3491 if ($this->has_only_recepisse() === true
3492 && $this->getStatut() !== 'cloture') {
3493 //
3494 $all_fields['date_depot'] = 'date';
3495 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3496 $all_fields['date_depot_mairie'] = 'date';
3497 } else {
3498 $all_fields['date_depot_mairie'] = 'hidden';
3499 }
3500 }
3501 // Gestion de la case à cocher ERP en cas d'interfaçage avec le
3502 // référentiel ERP
3503 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true) {
3504 // Par défaut la case à cocher ERP est non modifiable
3505 $all_fields['erp'] = 'checkboxhiddenstatic';
3506 // Si le type du dossier d'instruction en cours est présent
3507 // dans les paramètres autorisant l'interfaçage avec le référentiel ERP
3508 if (isset($parameters['erp__dossier__nature__at']) === true
3509 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__at']) {
3510 //
3511 $all_fields['erp'] = 'checkbox';
3512 }
3513 if (isset($parameters['erp__dossier__nature__pc']) === true
3514 && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__pc']
3515 && isset($parameters['erp__dossier__type_di__pc']) === true) {
3516 //
3517 $erp_di_pc = explode(";", $parameters['erp__dossier__type_di__pc']);
3518 if (is_array($erp_di_pc) === true
3519 && in_array($this->getVal("dossier_instruction_type"), $erp_di_pc) === true) {
3520 //
3521 $all_fields['erp'] = 'checkbox';
3522 }
3523 }
3524 }
3525 // modification de la date d'affichage pour les ADS
3526 if ($this->f->isAccredited($this->get_absolute_class_name()."_modifier_date_affichage")) {
3527 $ads_fields['date_affichage'] = 'date';
3528 $ce_fields['date_affichage'] = 'date';
3529 }
3530
3531 // pas de modificiation de la commune associée au dossier (si l'option est activée)
3532 if ($this->f->is_option_dossier_commune_enabled($this->getVal('om_collectivite'))) {
3533 $ads_fields['commune'] = 'selecthiddenstatic';
3534 $ce_fields['commune'] = 'selecthiddenstatic';
3535 }
3536 }
3537 }
3538 // MODIFIER, SUPPRIMER, CONSULTER
3539 if ($crud !== 'create') {
3540 $re_fields['autorisation_contestee'] = 'selecthiddenstatic';
3541 $all_fields['date_demande'] = 'hidden';
3542 // La collectivité n'est jamais modifiable
3543 if ($_SESSION['niveau'] == 2) {
3544 $all_fields['om_collectivite'] = 'selecthiddenstatic';
3545 }
3546 // Instance du paramétrage des taxes
3547 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
3548 // Instance de cerfa
3549 $inst_cerfa = $this->get_inst_cerfa();
3550
3551 // Gestion du secteur pour la taxe d'aménagement
3552 // MODIFIER
3553 if ($crud === 'update') {
3554 //
3555 if ($this->is_in_context_of_foreign_key("tax_secteur", $this->getParameter("retourformulaire"))) {
3556 $ads_fields['tax_secteur'] = 'selecthiddenstatic';
3557 $dpc_fields['tax_secteur'] = 'selecthiddenstatic';
3558 $ce_fields['tax_secteur'] = 'selecthiddenstatic';
3559 } else {
3560 $ads_fields['tax_secteur'] = 'select';
3561 $dpc_fields['tax_secteur'] = 'select';
3562 $ce_fields['tax_secteur'] = 'select';
3563 }
3564 }
3565 // SUPPRIMER
3566 if ($crud === 'delete') {
3567 //
3568 $ads_fields['tax_secteur'] = 'selectstatic';
3569 $dpc_fields['tax_secteur'] = 'selectstatic';
3570 $ce_fields['tax_secteur'] = 'selectstatic';
3571 }
3572 // CONSULTER
3573 if ($crud === 'read') {
3574 //
3575 $ads_fields['tax_secteur'] = 'selectstatic';
3576 $dpc_fields['tax_secteur'] = 'selectstatic';
3577 $ce_fields['tax_secteur'] = 'selectstatic';
3578 }
3579
3580 // Si l'option de simulation est activée pour la collectivité du
3581 // dossier, l'utilisateur connecté a la permissions de voir
3582 // la simulation des taxes, la collectivité à un paramétrage pour
3583 // les taxes et que le cerfa du dossier à les champs requis
3584 if ($this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true
3585 && $this->f->isAccredited("dossier_instruction_simulation_taxes") === true
3586 && $inst_taxe_amenagement !== null
3587 && $inst_cerfa->can_simulate_taxe_amenagement() === true) {
3588
3589 // Si ce n'est pas une commune d'Île-de-France
3590 if ($inst_taxe_amenagement->getVal('en_ile_de_france') == 'f') {
3591 //
3592 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3593 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3594 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3595 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3596 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3597 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3598 }
3599 } else {
3600 // SUPPRIMER, CONSULTER
3601 if ($crud === 'delete' OR $crud ==='read') {
3602 $ads_fields['tax_mtn_part_commu'] = 'hidden';
3603 $ads_fields['tax_mtn_part_depart'] = 'hidden';
3604 $ads_fields['tax_mtn_part_reg'] = 'hidden';
3605 $ads_fields['tax_mtn_total'] = 'hidden';
3606 $ads_fields['tax_mtn_rap'] = 'hidden';
3607 $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3608 $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3609 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3610 $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3611 $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3612 //
3613 $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3614 $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3615 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3616 $dpc_fields['tax_mtn_total'] = 'hidden';
3617 $dpc_fields['tax_mtn_rap'] = 'hidden';
3618 $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3619 $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3620 $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3621 $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3622 $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3623 //
3624 $ce_fields['tax_mtn_part_commu'] = 'hidden';
3625 $ce_fields['tax_mtn_part_depart'] = 'hidden';
3626 $ce_fields['tax_mtn_part_reg'] = 'hidden';
3627 $ce_fields['tax_mtn_total'] = 'hidden';
3628 $ce_fields['tax_mtn_rap'] = 'hidden';
3629 $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3630 $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3631 $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3632 $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3633 $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3634 }
3635 }
3636 }
3637 // CONSULTER
3638 if ($crud ==='read') {
3639
3640 $ads_fields['geom'] = 'static';
3641 $ads_fields['a_qualifier'] = 'checkboxstatic';
3642 $ads_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3643 //
3644 $dpc_fields['geom'] = 'static';
3645 $dpc_fields['a_qualifier'] = 'checkboxstatic';
3646 $dpc_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3647 //
3648 $ce_fields['geom'] = 'static';
3649 $ce_fields['a_qualifier'] = 'checkboxstatic';
3650 $ce_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
3651 // Affiche le champ streetview si l'option est active
3652 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true) {
3653 $all_fields['streetview'] = 'static';
3654 }
3655
3656 // Si l'état du dossier est incomplet
3657 if ($this->is_incomplet_notifie()) {
3658 // on cache les dates de complétude et de limite d'instruction
3659 $ads_fields['date_complet'] = 'hidden';
3660 $ads_fields['date_limite'] = 'hidden';
3661 $ads_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3662 $ads_fields['evenement_suivant_tacite'] = 'hidden';
3663 //
3664 $dpc_fields['date_complet'] = 'hidden';
3665 $dpc_fields['date_limite'] = 'hidden';
3666 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3667 $dpc_fields['evenement_suivant_tacite'] = 'hidden';
3668 //
3669 $ce_fields['date_complet'] = 'hidden';
3670 $ce_fields['date_limite'] = 'hidden';
3671 $ce_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
3672 $ce_fields['evenement_suivant_tacite'] = 'hidden';
3673 } else {
3674 // sinon on cache la date de limite d'incomplétude
3675 $ads_fields['date_limite_incompletude'] = 'hidden';
3676 $ads_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3677 $ads_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3678 //
3679 $dpc_fields['date_limite_incompletude'] = 'hidden';
3680 $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3681 $dpc_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3682 //
3683 $ce_fields['date_limite_incompletude'] = 'hidden';
3684 $ce_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
3685 $ce_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
3686 }
3687 if (isset($parameters['option_arrondissement'])
3688 && $parameters['option_arrondissement'] === 'true') {
3689 $all_fields['dossier_arrondissement'] = 'static';
3690 }
3691 //
3692 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3693 if ($this->get_source_depot_from_demande() === 'platau'
3694 || $this->get_source_depot_from_demande() === 'portal') {
3695 //
3696 $ce_fields["consultation_entrante"] = 'hidden';
3697 $ce_fields["delai_reponse"] = 'static';
3698 $ce_fields["type_delai"] = 'static';
3699 $ce_fields["objet_consultation"] = 'static';
3700 $ce_fields["date_production_notification"] = 'datestatic';
3701 $ce_fields["date_premiere_consultation"] = 'datestatic';
3702 $ce_fields["date_consultation"] = 'datestatic';
3703 $ce_fields["date_emission"] = 'datestatic';
3704 $ce_fields["service_consultant_id"] = 'static';
3705 $ce_fields["service_consultant_libelle"] = 'static';
3706 $ce_fields["service_consultant_insee"] = 'static';
3707 $ce_fields["service_consultant_mail"] = 'static';
3708 $ce_fields["service_consultant_type"] = 'static';
3709 $ce_fields["service_consultant__siren"] = 'static';
3710 $ce_fields["etat_consultation"] = 'static';
3711 $ce_fields["type_consultation"] = 'static';
3712 $ce_fields["texte_fondement_reglementaire"] = 'static';
3713 $ce_fields["texte_objet_consultation"] = 'static';
3714 $ce_fields["dossier_consultation"] = 'hidden';
3715 }
3716 }
3717 // SUPPRIMER
3718 if($crud === 'delete') {
3719 // Cache tous les champs execepté le libellé du dossier
3720 foreach ($this->champs as $champ) {
3721 $all_fields[$champ] = 'hidden';
3722 }
3723 $all_fields['dossier_libelle'] = 'hiddenstatic';
3724 }
3725
3726 $all_fields['etat_transmission_platau'] = 'hidden';
3727 if ($crud !== 'create') {
3728 //
3729 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
3730 if ($inst_datd->getVal('dossier_platau') === 't') {
3731 //
3732 $all_fields['etat_transmission_platau'] = 'selecthiddenstatic';
3733 }
3734 }
3735
3736
3737 if ($crud == 'create' || $crud == 'update') {
3738 $required_fields_platau = $this->list_platau_required_fields_dossier;
3739 if ($this->f->is_option_mode_service_consulte_enabled() === false) {
3740 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
3741 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
3742 //
3743 foreach ($required_fields_platau as $required_field_platau) {
3744 $champ = explode('.', $required_field_platau)[1];
3745 if (in_array($champ, $this->champs)) {
3746 $form->setType($champ ,$form->type[$champ].'_demat_color');
3747 }
3748 }
3749 }
3750 }
3751 }
3752
3753 //
3754 // Typage
3755 //
3756
3757 switch ($groupe) {
3758 case 'CTX IN':
3759 $this->manage_type($form, $inf_fields);
3760 break;
3761 case 'CTX RE':
3762 $this->manage_type($form, $re_fields);
3763 break;
3764 case 'ADS':
3765 $this->manage_type($form, $ads_fields);
3766 break;
3767 case 'DPC':
3768 $this->manage_type($form, $dpc_fields);
3769 break;
3770 case 'CONSULTATION ENTRANTE':
3771 $this->manage_type($form, $ce_fields);
3772 break;
3773 }
3774 $this->manage_type($form, $all_fields);
3775 }
3776
3777
3778 /**
3779 * Gestion du typage des champs
3780 *
3781 * @param object $form formulaire instancié
3782 * @param array $fields tableau associatif des champs avec leur widget de formulaire en valeur
3783 * @return void
3784 */
3785 protected function manage_type($form, $fields) {
3786 foreach ($this->champs as $key => $field) {
3787 if (array_key_exists($field, $fields) === true) {
3788 $form->setType($field, $fields[$field]);
3789 }
3790 }
3791 }
3792
3793
3794 /**
3795 * Retourne le nombre de parcelles qu'à en commun le dossier passé en
3796 * paramètre avec les dossiers contentieux en cours. Le nombre de parcelles
3797 * est groupé par type de dossier d'autorisation : RE ou IN.
3798 *
3799 * @param string $di identifiant du DI
3800 * @return array
3801 */
3802 function get_nb_parcelles_dossier_ciblees_par_contentieux($di) {
3803 $sql = "
3804 SELECT
3805 dossier_autorisation_type.code, COUNT(*) as nb
3806 FROM " . DB_PREFIXE . "dossier
3807 LEFT JOIN " . DB_PREFIXE . "dossier_parcelle
3808 ON dossier.dossier = dossier_parcelle.dossier
3809 LEFT JOIN " . DB_PREFIXE . "dossier_parcelle as parcelle_ctx
3810 ON dossier_parcelle.libelle = parcelle_ctx.libelle
3811 AND dossier_parcelle.dossier != parcelle_ctx.dossier
3812 LEFT JOIN " . DB_PREFIXE . "dossier as dossier_ctx
3813 ON dossier_ctx.dossier = parcelle_ctx.dossier
3814 INNER JOIN " . DB_PREFIXE . "etat
3815 ON dossier_ctx.etat = etat.etat AND etat.statut != 'cloture'
3816 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation
3817 ON dossier_ctx.dossier_autorisation = dossier_autorisation.dossier_autorisation
3818 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation_type_detaille
3819 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
3820 = dossier_autorisation.dossier_autorisation_type_detaille
3821 LEFT JOIN " . DB_PREFIXE . "dossier_autorisation_type
3822 ON dossier_autorisation_type_detaille.dossier_autorisation_type
3823 = dossier_autorisation_type.dossier_autorisation_type
3824 WHERE
3825 dossier.dossier = '" . $di . "'
3826 AND (dossier_autorisation_type.code = 'RE'
3827 OR dossier_autorisation_type.code = 'IN')
3828 GROUP BY dossier_autorisation_type.code
3829 ";
3830 $this->addToLog("get_nb_parcelles_dossier_ciblees_par_contentieux : db->query(\"$sql\")", VERBOSE_MODE);
3831 $res = $this->f->db->query($sql);
3832 $this->f->isDatabaseError($res);
3833
3834 $nb_re_inf = array('re' => 0, 'inf' => 0);
3835
3836 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3837 if ($row["code"] == "RE"){
3838 $nb_re_inf['re'] += $row["nb"];
3839 }
3840 if ($row["code"] == "IN"){
3841 $nb_re_inf['inf'] += $row["nb"];
3842 }
3843 }
3844
3845 return $nb_re_inf;
3846 }
3847
3848 /**
3849 * SETTER_FORM - setVal (setVal).
3850 *
3851 * @return void
3852 */
3853 function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
3854 // parent::setVal($form, $maj, $validation);
3855 //
3856 $this->maj=$maj;
3857
3858 if ($this->f->is_option_sig_enabled($this->getVal("om_collectivite")) === true
3859 && $this->f->issetSIGParameter($this->getVal("dossier")) === true) {
3860
3861 // lien vers le SIG
3862 $geoLinksHtml = $this->getGeolocalisationLink();
3863 $form->setVal("geom", $geoLinksHtml);
3864 }
3865 // si l'option 'streetview' est activée ajoute un lien vers Google Maps Street View
3866 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true
3867 && $maj == 3) {
3868 //
3869 $gStreetViewLinkHtml = $this->getGoogleMapsStreetViewLink();
3870 $form->setVal("streetview", $gStreetViewLinkHtml);
3871 }
3872 //
3873 $affichage_form = $this->get_type_affichage_formulaire();
3874 if ($affichage_form === "ADS" || $affichage_form === "CONSULTATION ENTRANTE") {
3875 // Dans le cas d'un dépôt électronique un pictogramme apparait devant le demandeur
3876 if ($maj == 1 || $maj == 2 || $maj == 3) {
3877 if ($this->getVal("depot_electronique") === "t"
3878 || $this->getVal("depot_electronique") === true
3879 || $this->getVal("depot_electronique") === 1) {
3880 //
3881 $form->setVal(
3882 "dossier_petitionnaire",
3883 sprintf(
3884 '<span class="om-icon om-icon-16 om-icon-fix depot-electronique-16" title="%s"> </span>%s',
3885 "Dépôt électronique",
3886 $this->getVal("dossier_petitionnaire")
3887 )
3888 );
3889 }
3890 }
3891 if ($maj == 3) {
3892 $nb_re_inf = $this->get_nb_parcelles_dossier_ciblees_par_contentieux($this->getVal("dossier"));
3893 $message = "";
3894 if ($nb_re_inf["re"] > 0) {
3895 $message .= "<span class=\"label label-warning\" ";
3896 $message .= "title=\""._("Au moins un dossier de recours contentieux ou gracieux en cours concerne les références cadastrales du dossier courant.")."\">";
3897 $message .= _("RE");
3898 $message .= "</span>";
3899 if ($nb_re_inf["inf"] > 0) {
3900 $message .= " ";
3901 }
3902 }
3903 if ($nb_re_inf["inf"] > 0) {
3904 $message .= "<span class=\"label label-important\" ";
3905 $message .= "title=\""._("Au moins un dossier d'infraction en cours concerne les références cadastrales du dossier courant.")."\">";
3906 $message .= _("IN");
3907 $message .= "</span>";
3908 }
3909 $form->setVal("enjeu_ctx", $message);
3910 }
3911 } elseif ($affichage_form === "CTX RE") {
3912 // Récupération des demandeurs liés au dossier
3913 $this->listeDemandeur("dossier", $this->getVal("dossier"));
3914 //
3915 $requerants = "";
3916 if ($this->getVal("requerants") != "") {
3917 $requerants = $this->getVal("requerants");
3918 if (isset($this->valIdDemandeur["requerant"]) === true
3919 && count($this->valIdDemandeur["requerant"]) > 0) {
3920 //
3921 $requerants .= " "._("et autres");
3922 }
3923 }
3924 $form->setVal("requerants", $requerants);
3925 //
3926 $dossier_petitionnaires = "";
3927 if ($this->getVal("dossier_petitionnaire") != "") {
3928 $dossier_petitionnaires = $this->getVal("dossier_petitionnaire");
3929 }
3930 if (isset($this->valIdDemandeur["petitionnaire"]) === true
3931 && count($this->valIdDemandeur["petitionnaire"]) > 0) {
3932 //
3933 $dossier_petitionnaires .= " "._("et autres");
3934 }
3935 $form->setVal("dossier_petitionnaires", $dossier_petitionnaires);
3936 } elseif ($affichage_form === "CTX IN") {
3937 // Récupération des demandeurs liés au dossier
3938 $this->listeDemandeur("dossier", $this->getVal("dossier"));
3939 //
3940 $contrevenants = "";
3941 if ($this->getVal("contrevenants") != "") {
3942 $contrevenants = $this->getVal("contrevenants");
3943 if (isset($this->valIdDemandeur["contrevenant"]) === true
3944 && count($this->valIdDemandeur["contrevenant"]) > 0) {
3945 //
3946 $contrevenants .= " "._("et autres");
3947 }
3948 }
3949 $form->setVal("contrevenants", $contrevenants);
3950 } elseif ($affichage_form === "DPC") {
3951 // Récupération des demandeurs liés au dossier
3952 $this->listeDemandeur("dossier", $this->getVal("dossier"));
3953 //
3954 $bailleurs = "";
3955 if ($this->getVal("bailleurs") != "") {
3956 $bailleurs = $this->getVal("bailleurs");
3957 if (isset($this->valIdDemandeur["bailleur"]) === true
3958 && count($this->valIdDemandeur["bailleur"]) > 0) {
3959 //
3960 $bailleurs .= " "._("et autres");
3961 }
3962 }
3963 $form->setVal("bailleurs", $bailleurs);
3964 }
3965 //
3966 if ($validation == 0) {
3967 if ($maj == 0) {
3968 $form->setVal("annee", date("y"));
3969 $form->setVal("date_demande", date("Y-m-d"));
3970 $form->setVal("date_depot", date("Y-m-d"));
3971 $form->setVal("accord_tacite", "Non");
3972 $form->setVal("etat", "initialiser");
3973 }
3974 }
3975 }
3976
3977 /**
3978 * getGeolocalisationLink retourne le code HTML affichant l'icone du globe, ainsi que
3979 * les coordonnées du centroide du dossier, le tout étant un lien vers le SIG.
3980 *
3981 * @return string Lien vers le SIG
3982 */
3983 function getGeolocalisationLink() {
3984 //
3985 $link = "<a id='action-form-localiser'".
3986 " target='_SIG' href='".OM_ROUTE_FORM."&obj=dossier_instruction&action=140&idx=".$this->getVal("dossier")."'>".
3987 "<span class='om-icon om-icon-16 om-icon-fix sig-16' title='Localiser'>Localiser</span> ".
3988 $this->getVal('geom').
3989 " </a>";
3990 return $link;
3991 }
3992
3993
3994 /**
3995 * converti un geom au format Lat,Lon
3996 *
3997 * @param string $geom Le Geom
3998 * @param string $fromRefId Le référentiel dans lequel le geom est défini
3999 * @param string $toLongLatId Le référentiel dans lequel le geom doit être converti
4000 *
4001 * @return array[2] Long,Lat ou bien false,"message" en cas d'erreur
4002 */
4003 protected function convertGeomToLongLat(string $geom, string $fromRefId = '2154',
4004 string $toLongLatId = '4326') {
4005 $sql = "
4006 SELECT
4007 ST_X(ST_Transform(ST_GeomFromText('$geom', $fromRefId), $toLongLatId)) AS longitude,
4008 ST_Y(ST_Transform(ST_GeomFromText('$geom', $fromRefId), $toLongLatId)) AS latitude
4009 ";
4010 $this->addToLog(__METHOD__."() sql: '$sql'", EXTRA_VERBOSE_MODE);
4011 $res = $this->f->db->query($sql);
4012 if(database::isError($res)) {
4013 $this->addToLog(__METHOD__."() error: ".var_export($res->getMessage(), true), DEBUG_MODE);
4014 return array(false, $res->getMessage());
4015 }
4016 if ($res->numRows() != 1) {
4017 $this->addToLog(__METHOD__."() error: ".var_export($res->numRows(), true), DEBUG_MODE);
4018 return array(false, __("Erreur: Plus d'un enregistrement retourné").
4019 '('.$res->numRows().')');
4020 }
4021 $coord = $res->fetchRow(DB_FETCHMODE_ASSOC);
4022 $this->addToLog(__METHOD__."() coord: ".var_export($coord, true), EXTRA_VERBOSE_MODE);
4023 return array_values($coord);
4024 }
4025
4026 /**
4027 * getGoogleMapsStreetViewLink retourne le code HTML affichant un lien vers une vue
4028 * Google Maps Street View à partir des coordonnées du geom.
4029 *
4030 * @return string Lien vers Google Maps Street View
4031 */
4032 protected function getGoogleMapsStreetViewLink() {
4033 // Récupération coordonnées du terrain
4034
4035 // Passage du numéro de dossier comme id pour pouvoir le récupérer dans le
4036 // jscript lors du clic
4037 $html = sprintf(
4038 "<a id='action-form-gstreetview' class='simple-btn' title='%s' onclick='get_adresse_terrain(this.id, \"%s\")'>
4039 <span class='om-icon om-icon-16 om-icon-fix consult-16'></span>%s
4040 </a>",
4041 __("Ouvrir dans Google Maps Street View"),
4042 $this->getVal($this->clePrimaire),
4043 __("Street View")
4044 );
4045 return $html;
4046 }
4047
4048 /**
4049 * SETTER_FORM - setSelect.
4050 *
4051 * @return void
4052 */
4053 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
4054 $crud = $this->get_action_crud($this->getParameter("maj"));
4055
4056 // XXX Commenté pour patcher le problème de montée en charge de la base
4057 // de données en cas de reprise de données d'un gros volume de dossier
4058 // d'instruction
4059 // parent::setSelect($form, $maj);
4060 // om_collectivite
4061 $this->init_select(
4062 $form,
4063 $this->f->db,
4064 $maj,
4065 null,
4066 "om_collectivite",
4067 $this->get_var_sql_forminc__sql("om_collectivite"),
4068 $this->get_var_sql_forminc__sql("om_collectivite_by_id"),
4069 false
4070 );
4071
4072 /*
4073 * Pour chaque init_select d'un select non modifiable on teste
4074 * si l'on est en mode modifier : si c'est le cas alors on initialise le
4075 * select en mode consulter (qui n'affiche rien s'il n'y a aucune valeur).
4076 */
4077
4078 $collectivite_idx = $this->getVal("om_collectivite");
4079 $affichage_form_dat = "";
4080 // Si recherche avancée om_collectivite = collectivité utilisateur
4081 if ($maj == 999) {
4082 $collectivite_idx = $this->f->getParameter("om_collectivite_idx");
4083 } else {
4084 $affichage_form_dat = $this->get_type_affichage_formulaire();
4085 }
4086 // Définition de la qualité et de la traduction de l'instructeur
4087 switch ($affichage_form_dat) {
4088 case 'DPC':
4089 case 'ADS':
4090 case 'CONSULTATION ENTRANTE':
4091 $affichage_instr = "AND instructeur_qualite.code = 'instr'";
4092 $lib_instructeur = _("l'instructeur");
4093 break;
4094 case 'CTX RE':
4095 case 'CTX IN':
4096 $affichage_instr = "AND instructeur_qualite.code = 'juri'";
4097 $lib_instructeur = _('le juriste');
4098 break;
4099 default:
4100 $affichage_instr = "";
4101 $lib_instructeur = _("l'instructeur");
4102 break;
4103 }
4104
4105 // instructeur
4106 // on recupère les services des multicollectivités et de celle du DI
4107 if ($this->f->getParameter('option_afficher_division')==='true') {
4108 // instructeur
4109 $sql_instructeur_div_by_di = str_replace(
4110 '<collectivite_di>',
4111 $collectivite_idx,
4112 $this->get_var_sql_forminc__sql("instructeur_div_by_di")
4113 );
4114 $sql_instructeur_div_by_di = str_replace(
4115 '<instructeur_qualite>',
4116 $affichage_instr,
4117 $sql_instructeur_div_by_di
4118 );
4119 $this->init_select(
4120 $form,
4121 $this->f->db,
4122 $maj,
4123 null,
4124 "instructeur",
4125 $sql_instructeur_div_by_di,
4126 $this->get_var_sql_forminc__sql("instructeur_div_by_id"),
4127 true,
4128 false,
4129 $lib_instructeur
4130 );
4131 // instructeur_2
4132 $sql_instructeur_2_div_by_di = str_replace(
4133 '<collectivite_di>',
4134 $collectivite_idx,
4135 $this->get_var_sql_forminc__sql("instructeur_2_div_by_di")
4136 );
4137 $this->init_select(
4138 $form,
4139 $this->f->db,
4140 $maj,
4141 null,
4142 "instructeur_2",
4143 $sql_instructeur_2_div_by_di,
4144 $this->get_var_sql_forminc__sql("instructeur_2_div_by_id"),
4145 true,
4146 false,
4147 _('le technicien')
4148 );
4149 } else {
4150 $sql_instructeur_by_di = str_replace(
4151 '<collectivite_di>',
4152 $collectivite_idx,
4153 $this->get_var_sql_forminc__sql("instructeur_by_di")
4154 );
4155 $sql_instructeur_by_di = str_replace(
4156 '<instructeur_qualite>',
4157 $affichage_instr,
4158 $sql_instructeur_by_di
4159 );
4160 $this->init_select(
4161 $form,
4162 $this->f->db,
4163 $maj,
4164 null,
4165 "instructeur",
4166 $sql_instructeur_by_di,
4167 $this->get_var_sql_forminc__sql("instructeur_by_id"),
4168 true,
4169 false,
4170 $lib_instructeur
4171 );
4172 $sql_instructeur_2_by_di = str_replace(
4173 '<collectivite_di>',
4174 $collectivite_idx,
4175 $this->get_var_sql_forminc__sql("instructeur_2_by_di")
4176 );
4177 $this->init_select(
4178 $form,
4179 $this->f->db,
4180 $maj,
4181 null,
4182 "instructeur_2",
4183 $sql_instructeur_2_by_di,
4184 $this->get_var_sql_forminc__sql("instructeur_2_by_id"),
4185 true,
4186 false,
4187 _('le technicien')
4188 );
4189 }
4190
4191 // etat
4192 if ($maj == 1) {
4193 $this->init_select(
4194 $form,
4195 $this->f->db,
4196 3,
4197 null,
4198 "etat",
4199 $this->get_var_sql_forminc__sql("etat"),
4200 $this->get_var_sql_forminc__sql("etat_by_id"),
4201 false
4202 );
4203 } else {
4204 $this->init_select(
4205 $form,
4206 $this->f->db,
4207 $maj,
4208 null,
4209 "etat",
4210 $this->get_var_sql_forminc__sql("etat"),
4211 $this->get_var_sql_forminc__sql("etat_by_id"),
4212 false
4213 );
4214 }
4215
4216 // dossier_instruction_type
4217 $this->init_select(
4218 $form,
4219 $this->f->db,
4220 $maj,
4221 null,
4222 "dossier_instruction_type",
4223 $this->get_var_sql_forminc__sql("dossier_instruction_type"),
4224 $this->get_var_sql_forminc__sql("dossier_instruction_type_by_id"),
4225 false
4226 );
4227
4228 // division
4229 $sql_division_by_di = str_replace(
4230 '<collectivite_di>',
4231 $collectivite_idx,
4232 $this->get_var_sql_forminc__sql("division_by_di")
4233 );
4234 $this->init_select(
4235 $form,
4236 $this->f->db,
4237 $maj,
4238 null,
4239 "division",
4240 $sql_division_by_di,
4241 $this->get_var_sql_forminc__sql("division_by_id"),
4242 true
4243 );
4244
4245 // autorite_competente
4246 $this->init_select(
4247 $form,
4248 $this->f->db,
4249 $maj,
4250 null,
4251 "autorite_competente",
4252 $this->get_var_sql_forminc__sql("autorite_competente"),
4253 $this->get_var_sql_forminc__sql("autorite_competente_by_id"),
4254 false
4255 );
4256
4257 // avis_decision
4258 if ($maj == 1) {
4259 $this->init_select(
4260 $form,
4261 $this->f->db,
4262 3,
4263 null,
4264 "avis_decision",
4265 $this->get_var_sql_forminc__sql("avis_decision"),
4266 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4267 false
4268 );
4269 } else {
4270 $this->init_select(
4271 $form,
4272 $this->f->db,
4273 $maj,
4274 null,
4275 "avis_decision",
4276 $this->get_var_sql_forminc__sql("avis_decision"),
4277 $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4278 false
4279 );
4280 }
4281
4282 // autorisation_contestee
4283 if ($affichage_form_dat === 'CTX RE'
4284 && ($maj == 1 || $maj == 3)) {
4285 // À exécuter seulement en mode modifier ou consulter des recours
4286 // pour éviter le ralentissement de l'affichage des listings des DI
4287 $this->init_select(
4288 $form,
4289 $this->f->db,
4290 $maj,
4291 null,
4292 "autorisation_contestee",
4293 $this->get_var_sql_forminc__sql("autorisation_contestee"),
4294 $this->get_var_sql_forminc__sql("autorisation_contestee_by_id"),
4295 false
4296 );
4297 }
4298
4299 // evenement_suivant_tacite
4300 $this->init_select(
4301 $form,
4302 $this->f->db,
4303 $maj,
4304 null,
4305 "evenement_suivant_tacite",
4306 $this->get_var_sql_forminc__sql("evenement_suivant_tacite"),
4307 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_by_id"),
4308 false
4309 );
4310
4311 // evenement_suivant_tacite_incompletude
4312 $this->init_select(
4313 $form,
4314 $this->f->db,
4315 $maj,
4316 null,
4317 "evenement_suivant_tacite_incompletude",
4318 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude"),
4319 $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude_by_id"),
4320 false
4321 );
4322
4323 // Ajout, modification et recherche avancée
4324 if ($maj == 0 || $maj == 1 || $maj == 999) {
4325 // accord tacite
4326 $contenu=array();
4327 $contenu[0]=array('Non','Oui');
4328 $contenu[1]=array('Non','Oui');
4329 $form->setSelect("accord_tacite", $contenu);
4330 // geom *** a voir
4331 if ($maj == 1) { //modification
4332 $contenu=array();
4333 $contenu[0]=array("dossier", $this->getParameter("idx"));
4334 $form->setSelect('geom', $contenu);
4335 }
4336 // arrondissement recherche avancée
4337 $this->init_select(
4338 $form,
4339 $this->f->db,
4340 $maj,
4341 null,
4342 "arrondissement",
4343 $this->get_var_sql_forminc__sql("arrondissement"),
4344 $this->get_var_sql_forminc__sql("arrondissement_by_id"),
4345 false
4346 );
4347 // dossier_autorisation_type_detaille recherche avancée
4348 $this->init_select(
4349 $form,
4350 $this->f->db,
4351 $maj,
4352 null,
4353 "dossier_autorisation_type_detaille",
4354 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille"),
4355 $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille_by_id"),
4356 false
4357 );
4358 }
4359
4360 // Ce formulaire n'est pas accessible en ajout ni en recherche avancée
4361 // mais dans le cas où il le serait, rien ne doit être fait concernant
4362 // les taxes
4363 if ($maj != 0 && $maj != 999) {
4364 // Choix du secteur pour part communale
4365 $contenu = array();
4366 $contenu[0][0] = "";
4367 $contenu[1][0] = __('choisir')."&nbsp;".__("le")."&nbsp;".__("tax_secteur");
4368 if ($crud === 'read') {
4369 $contenu[1][0] = "";
4370 }
4371 // Instance du parmétrage des taxes
4372 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
4373 // Si la colletivité à un paramétrage pour la taxe d'aménagement
4374 if ($inst_taxe_amenagement !== null) {
4375 // Il y a 20 secteurs maximum dans une commune de France
4376 for ($i=1; $i < 21; $i++) {
4377 // Valeur du secteur
4378 $value = $inst_taxe_amenagement->getVal('tx_comm_secteur_'.$i);
4379 //
4380 if ($value !== null && $value !== '') {
4381 //
4382 $contenu[0][$i] = $i;
4383 $contenu[1][$i] = sprintf(__('Secteur %s'), $i);
4384 }
4385 }
4386 }
4387 //
4388 $form->setSelect("tax_secteur", $contenu);
4389 }
4390 // commune
4391 $this->init_select(
4392 $form,
4393 $this->f->db,
4394 $maj,
4395 null,
4396 "commune",
4397 $this->get_var_sql_forminc__sql("commune"),
4398 $this->get_var_sql_forminc__sql("commune_by_id"),
4399 false
4400 );
4401 // pec_metier
4402 $this->init_select(
4403 $form,
4404 $this->f->db,
4405 $maj,
4406 null,
4407 "pec_metier",
4408 $this->get_var_sql_forminc__sql("pec_metier"),
4409 $this->get_var_sql_forminc__sql("pec_metier_by_id"),
4410 false
4411 );
4412 // etat_transmission_platau
4413 $contenu = array();
4414 $contenu[0] = array(
4415 'jamais_transmissible',
4416 'non_transmissible',
4417 'transmis_mais_non_transmissible',
4418 'transmissible',
4419 );
4420 $contenu[1] = array(
4421 __('Ne sera jamais transmis'),
4422 __('Non transmissible'),
4423 __('Déjà transmis mais non transmissible'),
4424 __('Transmissible'),
4425 );
4426 $form->setSelect("etat_transmission_platau", $contenu);
4427 }
4428
4429 /**
4430 * SETTER_FORM - setLib.
4431 *
4432 * @return void
4433 */
4434 function setLib(&$form, $maj) {
4435 parent::setLib($form, $maj);
4436 //
4437 $affichage_form = $this->get_type_affichage_formulaire();
4438 if ($affichage_form === 'ADS') {
4439 $form->setLib('date_decision', _("date de la decision"));
4440 $form->setLib('date_limite', _("limite d'instruction"));
4441 }
4442 if ($affichage_form === 'CTX IN') {
4443 $form->setLib('avis_decision', _("Décision"));
4444 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
4445 $form->setLib('date_decision', _("Date de décision"));
4446 $form->setLib('date_depot', _("Date de réception"));
4447 $form->setLib('date_limite', _("Tacicité"));
4448 $form->setLib('instructeur',_('Juriste'));
4449 }
4450 if ($affichage_form === 'CTX RE') {
4451 $form->setLib('autorisation_contestee', _("Autorisation contestée"));
4452 $form->setLib('avis_decision', _("Décision"));
4453 $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
4454 $form->setLib('date_decision', _("Date de décision"));
4455 $form->setLib('date_depot', _("Date de recours"));
4456 $form->setLib('date_limite', _("Tacicité"));
4457 $form->setLib('instructeur',_('Juriste'));
4458 }
4459 if ($affichage_form === 'DPC') {
4460 //
4461 }
4462 if ($affichage_form === 'CONSULTATION ENTRANTE') {
4463 $form->setLib('date_decision', _("date de la decision"));
4464 $form->setLib('date_limite', _("limite d'instruction"));
4465 //
4466 $form->setLib('delai_reponse', __('Délai de réponse'));
4467 $form->setLib('date_consultation', __('Date de la consultation'));
4468 $form->setLib('date_emission', __("Date d'émission"));
4469 $form->setLib('etat_consultation', __('État de la consultation'));
4470 $form->setLib('type_consultation', __('Type de la consultation'));
4471 $form->setLib('texte_fondement_reglementaire', __('Article(s) réglementaire sur le(s)quel(s) se fonde la consultation'));
4472 $form->setLib('texte_objet_consultation', __("Texte de l'objet de la consultation"));
4473 $form->setLib('service_consultant_id', __('Service consultant : identifiant'));
4474 $form->setLib('service_consultant_libelle', __('Service consultant : libellé'));
4475 $form->setLib('service_consultant_insee', __('Service consultant : INSEE'));
4476 $form->setLib('service_consultant_mail', __('Service consultant : mail'));
4477 $form->setLib('service_consultant_type', __('Service consultant : type'));
4478 $form->setLib('service_consultant__siren', __('Service consultant : SIREN'));
4479
4480 $form->setLib('type_delai', __('Type de délai'));
4481 $form->setLib('objet_consultation', __('Objet de la consultation'));
4482 $form->setLib('date_production_notification', __('Date de production de la notification'));
4483 $form->setLib('date_premiere_consultation', __('Date de la première consultation'));
4484 }
4485 $form->setLib('accord_tacite',_("decision tacite"));
4486 $form->setLib('autorite_competente',_('competence'));
4487 $form->setLib('cle_acces_citoyen', _("cle_acces_citoyen"));
4488 $form->setLib('date_ait', _("Date d'AIT"));
4489 $form->setLib('date_audience', _("Date d'audience"));
4490 $form->setLib('date_complet', _("completude"));
4491 $form->setLib('date_contradictoire', _("Date de contradictoire"));
4492 $form->setLib('date_dernier_depot', _("dernier depot"));
4493 $form->setLib('date_derniere_visite', _("Date de dernière visite"));
4494 $form->setLib('date_limite_incompletude', _("limite d'instruction"));
4495 $form->setLib('date_premiere_visite', _("Date de 1ère visite"));
4496 $form->setLib('date_transmission_parquet', _('Date de transmission au Parquet'));
4497 $form->setLib('date_validite', _("fin de validite le"));
4498 $form->setLib('delai', _("delai (mois)"));
4499 $form->setLib('delai',_("delai d'instruction"));
4500 $form->setLib('description_projet',_('description du projet'));
4501 $form->setLib('dossier_arrondissement', _("Arrondissement"));
4502 $form->setLib('dossier_autorisation_libelle',_('dossier_autorisation_libelle'));
4503 $form->setLib('dossier_autorisation_type_detaille', _("Type"));
4504 $form->setLib('contrevenants', _("Contrevenant(s)"));
4505 $form->setLib('dossier_instruction_type',_('type de dossier'));
4506 $form->setLib('dossier_petitionnaire',_('demandeur'));
4507 $form->setLib('dossier_petitionnaires', _("Pétitionnaire(s)"));
4508 $form->setLib('requerants', _("Requérant(s)"));
4509 $form->setLib('dt_ctx_infraction', _("Infraction"));
4510 $form->setLib('dt_ctx_regularisable', _("Régularisable"));
4511 $form->setLib('dt_ctx_synthese_anr', _("Synthèse des ANR"));
4512 $form->setLib('dt_ctx_synthese_nti', _("Synthèse des NTI"));
4513 $form->setLib('ctx_reference_dsj', _("ctx_reference_dsj"));
4514 $form->setLib('ctx_reference_sagace', _("ctx_reference_sagace"));
4515 $form->setLib('enjeu_ctx', _("contentieux"));
4516 $form->setLib('enjeu_erp', _("ERP"));
4517 $form->setLib('enjeu_urba', _("urbanisme"));
4518 $form->setLib('erp', _("ERP"));
4519 $form->setLib('geom',_('geolocalisaion'));
4520 $form->setLib('instructeur_2', _('Technicien'));
4521 $form->setLib('numero_versement_archive', _("numero"));
4522 $form->setLib('bailleur', _("Bailleur(s)"));
4523 $form->setLib('terrain', _("Localisation"));
4524 $form->setLib('etat_transmission_platau', __("Statut Plat'AU"));
4525 }
4526
4527 function setOnchange(&$form,$maj){
4528 parent::setOnchange($form,$maj);
4529 // mise en majuscule
4530 $form->setOnchange("demandeur_nom","this.value=this.value.toUpperCase()");
4531 $form->setOnchange("demandeur_societe","this.value=this.value.toUpperCase()");
4532 $form->setOnchange("delegataire_nom","this.value=this.value.toUpperCase()");
4533 $form->setOnchange("delegataire_societe","this.value=this.value.toUpperCase()");
4534 $form->setOnchange("architecte_nom","this.value=this.value.toUpperCase()");
4535 $form->setOnchange("terrain_adresse","this.value=this.value.toUpperCase()");
4536 $form->setOnchange('terrain_surface','VerifNumdec(this)');
4537 $form->setOnchange('tax_mtn_part_commu', 'VerifFloat(this, 0)');
4538 $form->setOnchange('tax_mtn_part_depart', 'VerifFloat(this, 0)');
4539 $form->setOnchange('tax_mtn_part_reg', 'VerifFloat(this, 0)');
4540 $form->setOnchange('tax_mtn_total', 'VerifFloat(this, 0)');
4541 $form->setOnchange('tax_mtn_rap', 'VerifFloat(this, 0)');
4542 $form->setOnchange('tax_mtn_part_commu_sans_exo', 'VerifFloat(this, 0)');
4543 $form->setOnchange('tax_mtn_part_depart_sans_exo', 'VerifFloat(this, 0)');
4544 $form->setOnchange('tax_mtn_part_reg_sans_exo', 'VerifFloat(this, 0)');
4545 $form->setOnchange('tax_mtn_total_sans_exo', 'VerifFloat(this, 0)');
4546 $form->setOnchange('tax_mtn_rap_sans_exo', 'VerifFloat(this, 0)');
4547 }
4548
4549 function setLayout(&$form, $maj) {
4550
4551 // Récupère le CRUD
4552 $crud = $this->get_action_crud($this->getParameter("maj"));
4553
4554 // Il n'y a pas d'affichage spécifique dans le cas d'une suppression
4555 if ($crud === 'delete') {
4556 return;
4557 }
4558
4559 $affichage_form = $this->get_type_affichage_formulaire();
4560 if ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE') {
4561 // Le contrôle de données est seulement possible si on est pas en mode service consulté.
4562 // et si le champ dossier_platau du dossier d'autorisation type detaillé est à true
4563 if ($this->f->is_option_mode_service_consulte_enabled() === false
4564 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
4565 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
4566 //
4567 $required_fields_platau = $this->check_platau_required_fields($this->getVal('dossier'));
4568
4569 if (isset($required_fields_platau['is_ok']) && $required_fields_platau['is_ok'] === false) {
4570 $class = 'demat-color demat-color-text';
4571 $message = __("La transmission à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
4572 if ($this->getVal('etat_transmission_platau') == "transmis_mais_non_transmissible") {
4573 $message = __("La transmission des modifications à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
4574 }
4575 $this->f->display_panel_information($class, $message, $required_fields_platau['required_fields_empty'], __('Champs requis'), 'demat-color');
4576 }
4577 }
4578 // En-tête
4579 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
4580
4581 // Col1 : Fieldset "Dossier d'Instruction"
4582 $form->setBloc('om_collectivite', 'D', '', 'col_9');
4583
4584 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
4585 $form->setFieldset('tax_secteur', 'F');
4586
4587
4588 $form->setBloc('tax_secteur', 'F');
4589
4590 // Col2 : 3 fieldsets
4591 $form->setBloc('enjeu_urba', 'D', '', 'col_3');
4592
4593 // Fieldset "Enjeu"
4594 $form->setFieldset('enjeu_urba', 'D', _("Enjeu"));
4595 $form->setFieldset('enjeu_ctx', 'F');
4596 // Fieldset "Qualification"
4597 $form->setFieldset('erp', 'D', _("Qualification"));
4598 $form->setFieldset('etat_transmission_platau', 'F');
4599 // Fieldset "Archive"
4600 $form->setFieldset('numero_versement_archive', 'D', _("Archive"));
4601 $form->setFieldset('date_demande', 'F');
4602
4603 $form->setBloc('date_demande', 'F');
4604 $form->setBloc('date_demande', 'F');
4605
4606 // Fieldset "Instruction"
4607 $form->setBloc('date_depot', 'D', '', 'col_12');
4608 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
4609
4610 // Fieldset "Suivi"
4611 $form->setBloc('date_depot', 'D', '', 'col_12');
4612
4613 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
4614 // Col 1
4615 $form->setBloc('date_depot', 'D', '', 'col_6');
4616 $form->setBloc('date_depot', 'D');
4617 $form->setBloc('date_dernier_depot', 'F');
4618 $form->setBloc('date_limite', 'D', '', 'interligne');
4619 $form->setBloc('date_limite_incompletude', 'F');
4620 $form->setBloc('date_limite_incompletude', 'F');
4621 // Col 2
4622 $form->setBloc('etat', 'D', '', 'col_6');
4623 $form->setBloc('etat', 'D');
4624 $form->setBloc('etat', 'F');
4625 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
4626 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4627 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4628 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
4629
4630 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
4631
4632 // Bloc 2 fieldsets
4633 $form->setBloc('date_decision', 'D', '', 'col_12');
4634
4635 // Col 1 Fieldset "Décision"
4636 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_6');
4637 $form->setFieldset('avis_decision','F','');
4638 // Col 2 Fieldset "Validité de l'autorisation"
4639 $form->setFieldset('date_validite', 'D', _("Validite de l'autorisation"), 'col_6');
4640 $form->setFieldset('date_validite','F','');
4641
4642 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
4643
4644 $form->setFieldset('date_conformite','F','');
4645 $form->setBloc('date_conformite', 'F'); // Fin Instruction
4646
4647 // Fieldset "Simulation des taxes"
4648 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
4649 $form->setFieldset('tax_mtn_part_commu', 'D', _("Simulation des taxes"), 'startClosed');
4650 //
4651 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
4652 $form->setFieldset('tax_mtn_part_commu', 'D', _("Taxe d'aménagement"), 'collapsible');
4653 $form->setFieldset('tax_mtn_total_sans_exo', 'F', '');
4654 $form->setBloc('tax_mtn_total_sans_exo', 'F');
4655 //
4656 $form->setBloc('tax_mtn_rap', 'D', '', 'col_12');
4657 $form->setFieldset('tax_mtn_rap', 'D', _("Redevance d'archéologie préventive"), 'collapsible');
4658 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
4659 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
4660 //
4661 $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
4662 $form->setBloc('tax_mtn_rap_sans_exo', 'F');
4663
4664 // Fieldset "Localisation"
4665 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
4666
4667 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
4668 // Col 1
4669 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
4670 $form->setBloc('terrain_references_cadastrales', 'F');
4671 // Col 2
4672 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
4673 $form->setBloc('terrain_superficie', 'F');
4674
4675 $form->setFieldset('terrain_superficie', 'F', '');
4676
4677 $form->setBloc('terrain_superficie', 'F');
4678 }
4679 // CONSULTATION ENTRANTE
4680 // Vérifie que le dossier a été déposé électroniquement
4681 if ($affichage_form === 'CONSULTATION ENTRANTE'
4682 && ($this->get_source_depot_from_demande() === 'platau'
4683 || $this->get_source_depot_from_demande() === 'portal')) {
4684 // Fieldset "Consultation"
4685 $form->setBloc('consultation_entrante', 'D', '', 'col_12');
4686 $form->setFieldset('consultation_entrante', 'D', __('Consultation'), '');
4687 $form->setBloc('consultation_entrante', 'D', "", "col_6");
4688 $form->setBloc('type_consultation', 'F');
4689 $form->setBloc('texte_fondement_reglementaire', 'D', "", "col_6");
4690 $form->setBloc('dossier_consultation', 'F');
4691 $form->setFieldset('dossier_consultation', 'F', '');
4692 $form->setBloc('dossier_consultation', 'F');
4693 }
4694 // RECOURS
4695 if ($affichage_form === 'CTX RE') {
4696 // Fieldset "Dossier d'Instruction"
4697 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
4698 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
4699 $form->setFieldset('date_demande', 'F');
4700 $form->setBloc('date_demande', 'F');
4701
4702 // Fieldset "Instruction"
4703 $form->setBloc('date_depot', 'D', '', 'col_12');
4704 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
4705
4706 // Fieldset "Suivi"
4707 $form->setBloc('date_depot', 'D', '', 'col_12');
4708
4709 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
4710 // Col 1
4711 $form->setBloc('date_depot', 'D', '', 'col_6');
4712 // $form->setBloc('date_depot', 'D');
4713 // $form->setBloc('date_dernier_depot', 'F');
4714 // $form->setBloc('date_limite', 'D', '');
4715 // $form->setBloc('date_limite_incompletude', 'F');
4716 $form->setBloc('date_cloture_instruction', 'F');
4717 // Col 2
4718 $form->setBloc('etat', 'D', '', 'col_6');
4719 $form->setBloc('etat', 'D');
4720 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4721 // $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
4722 // $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4723 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4724 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
4725
4726 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
4727
4728 // Bloc 2 fieldsets
4729 $form->setBloc('date_decision', 'D', '', 'col_12');
4730
4731 // Col 1 Fieldset "Décision"
4732 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
4733 $form->setFieldset('avis_decision','F','');
4734 // Col 2 Fieldset "Validité de l'autorisation"
4735
4736 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
4737
4738 $form->setFieldset('date_conformite','F','');
4739 $form->setBloc('date_conformite', 'F'); // Fin Instruction
4740
4741 // Fieldset "Localisation"
4742 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
4743
4744 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
4745 // Col 1
4746 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
4747 $form->setBloc('terrain_references_cadastrales', 'F');
4748 // Col 2
4749 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
4750 $form->setBloc('terrain_superficie', 'F');
4751
4752 $form->setFieldset('terrain_superficie', 'F', '');
4753
4754 $form->setBloc('terrain_superficie', 'F');
4755 }
4756
4757 // INFRACTION
4758 if ($affichage_form === 'CTX IN') {
4759
4760 // Fieldset "Dossier d'Instruction"
4761 $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
4762 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
4763 $form->setFieldset('date_demande', 'F');
4764 $form->setBloc('date_demande', 'F');
4765
4766 // Fieldset "Instruction"
4767 $form->setBloc('date_depot', 'D', '', 'col_12');
4768 $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
4769 // Fieldset "Suivi"
4770 $form->setBloc('date_depot', 'D', '', 'col_12');
4771 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
4772 // Col 1
4773 $form->setBloc('date_depot', 'D', '', 'col_6');
4774 $form->setBloc('date_depot', 'D');
4775 $form->setBloc('date_dernier_depot', 'F');
4776 $form->setBloc('date_limite', 'D', '', 'interligne');
4777 $form->setBloc('date_limite_incompletude', 'F');
4778 $form->setBloc('date_limite_incompletude', 'F');
4779 // Col 2
4780 $form->setBloc('etat', 'D', '', 'col_6');
4781 $form->setBloc('etat', 'D');
4782 $form->setBloc('etat', 'F');
4783 $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
4784 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4785 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
4786 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
4787 $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
4788 // Fieldset "Décision"
4789 $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
4790 $form->setFieldset('date_conformite','F',''); // Fin Décision
4791 $form->setFieldset('date_conformite','F','');
4792 $form->setBloc('date_conformite', 'F'); // Fin Instruction
4793
4794 // Fieldset "Localisation"
4795 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
4796 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
4797 // Col 1
4798 $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
4799 $form->setBloc('terrain_references_cadastrales', 'F');
4800 // Col 2
4801 $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
4802 $form->setBloc('terrain_superficie', 'F');
4803 $form->setFieldset('terrain_superficie', 'F', '');
4804 $form->setBloc('terrain_superficie', 'F');
4805
4806 // Fieldset "Demandeurs"
4807 // → cf. formSpecificContent()
4808 }
4809 }
4810
4811 /**
4812 * Permet de retourner si le dossier est incomplet notifié
4813 *
4814 * @return boolean true si incomplet notifié
4815 */
4816 function is_incomplet_notifie() {
4817 // Si le dossier est défini en tant qu'incomplet notifie
4818 if($this->getVal('incomplet_notifie') == 't' AND
4819 $this->getVal('incompletude') == 't') {
4820 return true;
4821 }
4822 return false;
4823 }
4824
4825
4826 /**
4827 * Vérifie que le dossier d'instruction en cours ne soit pas instruit.
4828 * Ne sont pas compté comme instruit les dossiers n'ayant que des événements
4829 * d'instruction de type 'affichage'.
4830 *
4831 * @return boolean
4832 */
4833 function has_only_recepisse() {
4834
4835 // Récupère la liste des instructions du dossier
4836 $list_instructions = $this->get_list_instructions(true);
4837
4838 // Si le dossier a pour seule instruction le récépissé de la demande
4839 if (count($list_instructions) === 1
4840 && $list_instructions[0] === $this->get_demande_instruction_recepisse()) {
4841 //
4842 return true;
4843 }
4844
4845 //
4846 return false;
4847 }
4848
4849
4850 /**
4851 * TRIGGER - triggerajouterapres.
4852 *
4853 * - Interface avec le référentiel ERP [108]
4854 * - Gestion des données techniques liées
4855 * - Mise à jour du DA
4856 * - Gestion des références cadastrales / parcelles liées
4857 *
4858 * @return boolean
4859 */
4860 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4861 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4862
4863 /**
4864 * Interface avec le référentiel ERP.
4865 *
4866 * (WS->ERP)[108] Dépôt de dossier DAT -> AT
4867 * Déclencheur :
4868 * - L'option ERP est activée
4869 * - Validation du formulaire d'ajout d'une demande de nouveau dossier
4870 * de type AT
4871 */
4872 //
4873 if ($this->f->is_option_referentiel_erp_enabled($this->valF['om_collectivite']) === true
4874 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')) {
4875 //
4876 $infos = array(
4877 "dossier_instruction" => $this->valF['dossier'],
4878 );
4879 //
4880 $ret = $this->f->send_message_to_referentiel_erp(108, $infos);
4881 if ($ret !== true) {
4882 $this->cleanMessage();
4883 $this->addToMessage(_("Une erreur s'est produite lors de la notification (108) du référentiel ERP. Contactez votre administrateur."));
4884 return false;
4885 }
4886 $this->addToMessage(_("Notification (108) du référentiel ERP OK."));
4887 }
4888
4889 /**
4890 * Gestion des données techniques liées.
4891 */
4892 // On ajoute les données techniques
4893 if ($this->ajoutDonneesTechniquesDI($id, $val) === false) {
4894 //
4895 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
4896 $this->correct = false;
4897 return false;
4898 }
4899
4900 /**
4901 * Mise à jour des données du DA.
4902 */
4903 //
4904 $inst_da = $this->get_inst_dossier_autorisation($this->valF["dossier_autorisation"]);
4905 //
4906 $params = array(
4907 'di_id' => $this->valF[$this->clePrimaire],
4908 );
4909 if ($inst_da->majDossierAutorisation($params) === false) {
4910 //
4911 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4912 $this->correct = false;
4913 return false;
4914 }
4915
4916 /**
4917 * Gestion des références cadastrales / parcelles liées.
4918 */
4919 // Si le champ des références cadastrales n'est pas vide
4920 if ($this->valF['terrain_references_cadastrales'] != '') {
4921 // Ajout des parcelles dans la table dossier_parcelle
4922 $this->ajouter_dossier_parcelle(
4923 $this->valF['dossier'],
4924 $this->valF['terrain_references_cadastrales']
4925 );
4926 }
4927
4928 /**
4929 * Notification de l'éventuelle autorisation contestée
4930 */
4931 if ($this->valF['autorisation_contestee'] !== null) {
4932 // Instancie la classe dossier_message
4933 $dossier_message = $this->get_inst_dossier_message(']');
4934 // Ajoute le message de notification
4935 $dossier_message_val = array();
4936 $dossier_message_val['dossier'] = $this->valF['autorisation_contestee'];
4937 $dossier_message_val['type'] = _('Autorisation contestée');
4938 $dossier_message_val['emetteur'] = $this->f->get_connected_user_login_name();
4939 $dossier_message_val['login'] = $_SESSION['login'];
4940 $dossier_message_val['date_emission'] = date('Y-m-d H:i:s');
4941 $dossier_message_val['contenu'] = sprintf(_('Cette autorisation a été contestée par le recours %s.'), $this->valF['dossier']);
4942 // Si une erreur se produit lors de l'ajout
4943 if ($dossier_message->add_notification_message($dossier_message_val) !== true) {
4944 // Message d'erreur affiché à l'utilisateur
4945 $this->addToMessage(_("L'autorisation contestée n'a pas pu être notifiée du recours."));
4946 $this->correct = false;
4947 return false;
4948 }
4949 }
4950
4951 if ($this->f->is_option_mode_service_consulte_enabled() === false
4952 && $this->f->is_type_dossier_platau($this->valF['dossier_autorisation']) === true
4953 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible') {
4954 //
4955 $trigger_platau_required_fields = $this->trigger_platau_required_fields($this->valF['dossier'], 'add');
4956 }
4957
4958 /**
4959 * Gestion des tâches pour la dématérialisation
4960 */
4961 //
4962 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
4963 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible') {
4964 //
4965 if (isset($val['source_depot']) === false || $val['source_depot'] !== 'platau') {
4966 $inst_task = $this->f->get_inst__om_dbform(array(
4967 "obj" => "task",
4968 "idx" => 0,
4969 ));
4970 $task_val = array(
4971 'type' => 'creation_DI',
4972 'object_id' => $id,
4973 'dossier' => $id,
4974 );
4975
4976 if ($this->f->is_option_mode_service_consulte_enabled() === false
4977 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
4978 $task_val['state'] = $inst_task::STATUS_DRAFT;
4979 }
4980
4981 $add_task = $inst_task->add_task(array('val' => $task_val));
4982 if ($add_task === false) {
4983 $this->addToMessage(sprintf('%s %s',
4984 __("Une erreur s'est produite lors de la création tâche."),
4985 __("Veuillez contacter votre administrateur.")
4986 ));
4987 $this->correct = false;
4988 return false;
4989 }
4990 }
4991 if (isset($val['source_depot']) === true && $val['source_depot'] == 'platau') {
4992 //
4993 $inst_task = $this->f->get_inst__om_dbform(array(
4994 "obj" => "task",
4995 "idx" => 0,
4996 ));
4997 $task_val = array(
4998 'type' => 'modification_DI',
4999 'object_id' => $id,
5000 'dossier' => $id,
5001 );
5002 $add_task = $inst_task->add_task(array('val' => $task_val));
5003 if ($add_task === false) {
5004 $this->addToMessage(sprintf('%s %s',
5005 __("Une erreur s'est produite lors de la création tâche."),
5006 __("Veuillez contacter votre administrateur.")
5007 ));
5008 $this->correct = false;
5009 return false;
5010 }
5011 }
5012 //
5013 $inst_task = $this->f->get_inst__om_dbform(array(
5014 "obj" => "task",
5015 "idx" => 0,
5016 ));
5017 $task_val = array(
5018 'type' => 'depot_DI',
5019 'object_id' => $id,
5020 'dossier' => $id,
5021 );
5022 // Change l'état de la tâche de notification en fonction de l'état de
5023 // transmission du dossier d'instruction
5024 if ($this->f->is_option_mode_service_consulte_enabled() === false
5025 && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5026 //
5027 $task_val['state'] = $inst_task::STATUS_DRAFT;
5028 }
5029 $add_task = $inst_task->add_task(array('val' => $task_val));
5030 if ($add_task === false) {
5031 $this->addToMessage(sprintf('%s %s',
5032 __("Une erreur s'est produite lors de la création tâche."),
5033 __("Veuillez contacter votre administrateur.")
5034 ));
5035 $this->correct = false;
5036 return false;
5037 }
5038 }
5039
5040 //
5041 return true;
5042 }
5043
5044 /**
5045 * Permet de vérifier que les champs requis pour platau ont été saisis
5046 * et si oui mettre à jour le statut des taches à new
5047 *
5048 * @param string $dossier L'identifiant du dossier.
5049 * @param string $add_or_update Permet de déterminer si on est en ajout ou en modification
5050 *
5051 * @return bool true|false
5052 */
5053 function trigger_platau_required_fields($dossier, $add_or_update) {
5054 // Vérification des champs Plat'AU requis pour transmission
5055 // Si les champs requis sont saisis on met à jour le flag
5056 // etat_transmission_platau à transmitted pour indiquer que le dossier a été transmis à Plat'AU
5057 $is_required_fields_fulfilled = $this->check_platau_required_fields($dossier);
5058
5059 // Instanciation de l'objet formulaire
5060 $this->form = $this->f->get_inst__om_formulaire(array(
5061 "validation" => 0,
5062 "maj" => $this->getParameter("maj"),
5063 "champs" => $this->champs,
5064 ));
5065
5066 if ($add_or_update == 'add') {
5067 if ($is_required_fields_fulfilled['is_ok']) {
5068 $this->form->setVal('etat_transmission_platau', 'transmissible');
5069 return true;
5070 } elseif (isset($this->valF['etat_transmission_platau'])
5071 && $this->valF['etat_transmission_platau'] === 'transmissible'
5072 || $this->getVal('etat_transmission_platau') === 'transmissible') {
5073 //
5074 $this->update_task_state($dossier, 'draft', 'new');
5075 } else {
5076 $this->update_task_state($dossier, 'new', 'draft');
5077 }
5078 }
5079
5080 $dossier_autorisation = null;
5081
5082 if ($add_or_update === 'update') {
5083 $inst_task = $this->f->get_inst__om_dbform(array(
5084 "obj" => "task",
5085 "idx" => 0,
5086 ));
5087 if ($is_required_fields_fulfilled['is_ok'] == true) {
5088 if (isset($this->valF['etat_transmission_platau'])
5089 && ($this->valF['etat_transmission_platau'] === 'non_transmissible'
5090 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible')
5091 || $this->getVal('etat_transmission_platau') == 'non_transmissible'
5092 || $this->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible') {
5093 //
5094 $modif_task = false;
5095 if ($inst_task->task_exists('creation_DI', $dossier) === false) {
5096 $modif_task = true;
5097 }
5098
5099 $dossier_autorisation = $this->getVal('dossier_autorisation');
5100
5101 // Valeurs à mettre à jour
5102 $valF = array();
5103 $valF['etat_transmission_platau'] = 'transmissible';
5104
5105 // Met à jour le quartier du dossier
5106 $cle = " dossier='".$dossier."'";
5107 $res = $this->f->db->autoExecute(
5108 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
5109 $this->addToLog(__METHOD__."(): db->autoexecute(\""
5110 .DB_PREFIXE."dossier\", ".print_r($valF, true)
5111 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
5112 $this->f->isDatabaseError($res);
5113
5114 $this->update_task_state($dossier, 'draft', 'new', $dossier_autorisation, $modif_task);
5115 }
5116 } else {
5117 if ((isset($this->valF['etat_transmission_platau']) && $this->valF['etat_transmission_platau'] === 'transmissible' || $this->getVal('etat_transmission_platau') === 'transmissible')) {
5118
5119 $valF = array();
5120 $dossier_autorisation = $this->getVal('dossier_autorisation');
5121 if ($inst_task->task_exists('creation_DI', $dossier)) {
5122 $valF['etat_transmission_platau'] = 'non_transmissible';
5123 $modif_task = false;
5124 } else {
5125 $valF['etat_transmission_platau'] = 'transmis_mais_non_transmissible';
5126 $modif_task = true;
5127 }
5128
5129 // Met à jour le quartier du dossier
5130 $cle = " dossier='".$dossier."'";
5131 $res = $this->f->db->autoExecute(
5132 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
5133 $this->addToLog(__METHOD__."(): db->autoexecute(\""
5134 .DB_PREFIXE."dossier\", ".print_r($valF, true)
5135 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
5136 $this->f->isDatabaseError($res);
5137 $this->update_task_state($dossier, 'new', 'draft', $dossier_autorisation, $modif_task);
5138 }
5139 }
5140
5141 return true;
5142 }
5143 }
5144
5145 /**
5146 * TODO: replace with '$this->f->findObjectById' ?
5147 *
5148 * Récupère l'instance de dossier message.
5149 *
5150 * @param string $dossier_message Identifiant du message.
5151 *
5152 * @return object
5153 */
5154 private function get_inst_dossier_message($dossier_message = null) {
5155 //
5156 return $this->get_inst_common("dossier_message", $dossier_message);
5157 }
5158
5159 /**
5160 * Récupère l'identifiant du quartier et d'un arrondissement d'une référence
5161 * cadastrale
5162 * @param string $reference_cadastrale
5163 *
5164 * @return array
5165 */
5166 function getQuartierArrondissement($reference_cadastrale) {
5167
5168 $reference_cadastrale = trim($reference_cadastrale);
5169 $quartier = '';
5170
5171 //Récupère le code impot du quartier dans la référence cadastrale
5172 for ( $i = 0 ; $i < strlen($reference_cadastrale) ; $i++ ){
5173
5174 //Si c'est un chiffre, c'est le code quartier
5175 if (is_numeric($reference_cadastrale[$i]) ){
5176
5177 $quartier .= $reference_cadastrale[$i];
5178 }
5179 //Sinon c'est la section
5180 else{
5181 break;
5182 }
5183 }
5184
5185 //Si le code impôt du quartier a bien été renseigné
5186 if ( $quartier !== '' ){
5187
5188 //Requête de récupération de l'identifiantdu quartier et de
5189 //l'arrondissement
5190 $sql = "SELECT
5191 quartier, arrondissement
5192 FROM
5193 ".DB_PREFIXE."quartier
5194 WHERE
5195 code_impots='$quartier'";
5196 $this->addToLog("getQuartierArrondissement() : db->query(\"$sql\")", VERBOSE_MODE);
5197 $res = $this->f->db->query($sql);
5198 if (database::isError($res)) {
5199 die();
5200 }
5201
5202 //Si on a un résultat
5203 if ( $res->numRows() == 1 ){
5204 //
5205 return $res->fetchRow(DB_FETCHMODE_ASSOC);
5206 }
5207 }
5208
5209 return NULL;
5210 }
5211
5212 /**
5213 * Récupère la section d'une référence cadastrale
5214 * @param string $reference_cadastrale
5215 *
5216 * @return string
5217 */
5218 function getSection($reference_cadastrale){
5219
5220 $reference_cadastrale = trim($reference_cadastrale);
5221 $section = NULL;
5222
5223 for ( $i = 0 ; $i < strlen($reference_cadastrale) ; $i++ )
5224 if (ctype_alnum($reference_cadastrale[$i]) === true && $reference_cadastrale[$i] !== ' ')
5225 $section .= $reference_cadastrale[$i];
5226
5227 return $section;
5228 }
5229
5230 /**
5231 * Retourne l'intructeur correspondant le mieux à la parcelle.
5232 *
5233 * @param int $quartier le numéro de quartier
5234 * @param int $arrondissement le numéro d'arrondissement
5235 * @param string $section la section
5236 * @param int $dadt le type détaillé de dossier d'autorisation
5237 * @param int $collectivite l'identifiant de la collectivité
5238 * @param int $commune_id l'identifiant de la commune (optionel)
5239 * @param string $instructeurColumn l'identifiant de la colonne en BDD de l'instructeur (optionel)
5240 *
5241 * @return array contenant l'instructeur, et éventuellement sa division
5242 */
5243 public function getInstructeurDivision (
5244 int $quartier, int $arrondissement, string $section,
5245 int $dadt, int $collectivite, int $commune_id = 0,
5246 string $instructeurColumn = 'instructeur') : array {
5247
5248 $instrAndDiv = array();
5249
5250 // requête de récupération de l'instructeur à affecter
5251 // (exclu les affectations manuelles supposées avoir été utilisées avant)
5252 $sql = sprintf("
5253 SELECT
5254 %1\$s, section, quartier, arrondissement, dossier_autorisation_type_detaille
5255 FROM
5256 ".DB_PREFIXE."affectation_automatique AS AA
5257 WHERE
5258 (AA.affectation_manuelle IS NULL OR AA.affectation_manuelle = '')
5259 AND AA.%1\$s IS NOT NULL
5260 ",
5261 $this->f->db->quoteIdentifier($instructeurColumn)
5262 );
5263
5264 // ajoute les conditions SQL correspondantes aux paramètres de filtrage
5265 foreach(array(
5266 'om_collectivite ' => $collectivite,
5267 'dossier_autorisation_type_detaille' => $dadt,
5268 'quartier' => $quartier,
5269 'arrondissement' => $arrondissement,
5270 'section' => $section
5271 ) as $column => $value) {
5272 if (empty($value) === false) {
5273 $valType = 'd'; // int
5274 if ($column == 'section') {
5275 $valType = 's'; // string
5276 $value = $this->f->db->escapeSimple($value);
5277 }
5278 $sql .= sprintf(" AND (AA.$column IS NULL OR AA.$column = '%$valType') ",
5279 $value);
5280 }
5281 }
5282 if (!empty($commune_id) && $this->f->is_option_dossier_commune_enabled()) {
5283 $commune = $this->f->findObjectById('commune', $commune_id);
5284 if (!empty($commune)) {
5285 $code_departement = $commune->getVal('dep');
5286 $code_commune = preg_replace('/^'.$code_departement.'/', '', $commune->getVal('com'));
5287 $sql .= sprintf(
5288 " AND (AA.communes IS NULL OR AA.communes ~ '%s') ",
5289 "(^|,)$code_departement($code_commune)?(,|$)");
5290 }
5291 else {
5292 $this->addToLog(__METHOD__."(): commune '$commune_id' non trouvée", DEBUG_MODE);
5293 }
5294 }
5295
5296 // ordonnancement et limite à un seul résultat
5297 $sql .= sprintf("
5298 ORDER BY
5299 communes %s,
5300 dossier_autorisation_type_detaille %s,
5301 section %s,
5302 quartier %s,
5303 arrondissement %s
5304 LIMIT 1
5305 ",
5306 // on positionne les valeurs NULL en premier si le filtre sur ce champ n'a pas été saisi
5307 $commune_id === 0 ? 'NULLS FIRST' : '',
5308 $dadt === 0 ? 'NULLS FIRST' : '',
5309 empty($section) === true ? 'NULLS FIRST' : '',
5310 $quartier === 0 ? 'NULLS FIRST' : '',
5311 $arrondissement === 0 ? 'NULLS FIRST' : ''
5312 );
5313
5314 // exécution de la requête
5315 $this->addToLog(__METHOD__."() : db->query(\"$sql\")", VERBOSE_MODE);
5316 $res = $this->f->db->query($sql);
5317 $this->f->isDatabaseError($res);
5318
5319 // si on a récupéré un instructeur correspondant aux critères
5320 if ($res->numRows() > 0) {
5321
5322 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
5323
5324 // récupère sa division
5325 $sql = sprintf(
5326 "SELECT division FROM ".DB_PREFIXE."instructeur WHERE instructeur = '%d'",
5327 intval($row[$instructeurColumn])
5328 );
5329 $this->addToLog(__METHOD__."() : db->getOne(\"$sql\")", VERBOSE_MODE);
5330 $divisionId = $this->f->db->getOne($sql);
5331 $this->f->isDatabaseError($divisionId);
5332
5333 // s'il a une division, retourne l'instructeur et sa division
5334 if (empty($divisionId === false)) {
5335 return array(
5336 'instructeur' => $row[$instructeurColumn],
5337 'division' => $divisionId,
5338 );
5339 }
5340
5341 // aucune division trouvée, retour uniquement l'instructeur
5342 return array('instructeur' => $row[$instructeurColumn]);
5343 }
5344
5345 return $instrAndDiv;
5346 }
5347
5348 /**
5349 * Récupère le type détaillé d'une dossier d'autorisation.
5350 *
5351 * @param integer $dossier_autorisation DA
5352 *
5353 * @return mixed
5354 */
5355 function get_dossier_autorisation_da_type_detaille($dossier_autorisation) {
5356
5357 //
5358 $resDATD = "";
5359
5360 //Récupération du dossier_autorisation_type_detaille concerné par le
5361 //$dossier_autorisation
5362 $sql = "
5363 SELECT
5364 dossier_autorisation_type_detaille
5365 FROM
5366 ".DB_PREFIXE."dossier_autorisation
5367 WHERE
5368 dossier_autorisation = '$dossier_autorisation'";
5369 $this->addToLog(__METHOD__." : db->query(\"$sql\")", VERBOSE_MODE);
5370 $resDATD = $this->f->db->getOne($sql);
5371 $this->f->isDatabaseError($resDATD);
5372
5373 //
5374 return $resDATD;
5375 }
5376
5377 /**
5378 * TRIGGER - triggerajouter.
5379 *
5380 * @return boolean
5381 */
5382 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5383 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5384
5385 // Initialisation des variables nécessaires à l'affectation automatique
5386 $quartier = 0;
5387 $arrondissement = 0;
5388 $section = '';
5389
5390 // Si la référence cadastrale n'est pas vide alors on récupère la
5391 // section, le quartier et l'arrondissement
5392 if ($this->valF['terrain_references_cadastrales'] != '') {
5393
5394 // Cette méthode récupère l'arrondissement et le quartier de la
5395 // référence cadastrale saisie
5396 $quartierArr = $this->getQuartierArrondissement(
5397 $this->valF['terrain_references_cadastrales']);
5398 if ($quartierArr != null) {
5399 $quartier = $quartierArr['quartier'];
5400 $arrondissement = $quartierArr['arrondissement'];
5401 }
5402
5403 // Si il n'y a pas d'arrondissement alors on vide le quartier
5404 if (strcmp($arrondissement, '') == 0) {
5405 $arrondissement = null;
5406 $quartier = null;
5407 }
5408
5409 // On récupère la section
5410 $section = $this->getSection($this->valF['terrain_references_cadastrales']);
5411 }
5412
5413 // Si une affectation automatique a été spécifiée
5414 if (isset($val['affectation_automatique']) === true &&
5415 empty($val['affectation_automatique']) === false) {
5416 //
5417 $affect_auto_id = intval($val['affectation_automatique']);
5418
5419 // log si l'affectation automatique n'existe pas
5420 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5421 "non trouvée";
5422 $logMsgMode = DEBUG_MODE;
5423
5424 // si l'affectation automatique existe
5425 $affectation_auto = $this->f->get_inst__om_dbform(array(
5426 "obj" => "affectation_automatique",
5427 "idx" => $affect_auto_id
5428 ));
5429 if (empty($affectation_auto->getVal($affectation_auto->clePrimaire)) === false) {
5430
5431 // log si l'instructeur n'est pas défini
5432 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5433 "pas d'instructeur défini";
5434
5435 // si un instructeur est défini
5436 $instructeur_id = $affectation_auto->getVal('instructeur');
5437 if (empty($instructeur_id) === false) {
5438
5439 // log si l'instructeur n'existe pas
5440 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5441 "instructeur '$instructeur_id' non trouvé";
5442
5443 // si l'instructeur existe
5444 $instructeur = $this->f->get_inst__om_dbform(array(
5445 "obj" => "instructeur",
5446 "idx" => intval($instructeur_id)
5447 ));
5448 if (empty($instructeur->getVal($instructeur->clePrimaire)) === false) {
5449
5450 // récupère son ID et sa division
5451 $this->valF['instructeur'] = $instructeur_id;
5452 $this->valF['division'] = $instructeur->getVal('division');
5453
5454 // log le succès
5455 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5456 "instructeur [".$this->valF['instructeur']."] ".
5457 "'".$instructeur->getVal('nom')."' affecté, avec sa division ".
5458 "'".$this->valF['division']."'";
5459 $logMsgMode = EXTRA_VERBOSE_MODE;
5460 }
5461 }
5462 $this->addToLog($logMsg, $logMsgMode);
5463
5464 // log si aucun instructeur secondaire est défini
5465 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5466 "pas de second instructeur défini";
5467 $logMsgMode = EXTRA_VERBOSE_MODE;
5468
5469 // si l'instructeur secondaire est défini
5470 $instructeur2_id = $affectation_auto->getVal('instructeur_2');
5471 if (empty($instructeur2_id) === false) {
5472
5473 // log si l'instructeur n'existe pas
5474 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5475 "second instructeur '$instructeur2_id' non trouvé";
5476 $logMsgMode = DEBUG_MODE;
5477
5478 // si l'instructeur existe
5479 $instructeur2 = $this->f->get_inst__om_dbform(array(
5480 "obj" => "instructeur",
5481 "idx" => intval($instructeur2_id)
5482 ));
5483 if (empty($instructeur2) === false) {
5484
5485 // récupère son ID
5486 $this->valF['instructeur_2'] = $instructeur2_id;
5487
5488 // log le succès
5489 $logMsg = __METHOD__."(): affectation automatique '$affect_auto_id' ".
5490 "second instructeur [".$this->valF['instructeur_2']."] ".
5491 "'".$instructeur2->getVal('nom')."' affecté";
5492 $logMsgMode = EXTRA_VERBOSE_MODE;
5493 }
5494 }
5495 $this->addToLog($logMsg, $logMsgMode);
5496
5497 // succès : plus rien à logger
5498 $logMsg = null;
5499 $logMsgMode = null;
5500 }
5501
5502 // affectation automatique inexistante
5503 if (empty($logMsg) === false && empty($logMsgMode) === false) {
5504 $this->addToLog($logMsg, $logMsgMode);
5505 }
5506 }
5507
5508 // message affiché si aucune instructeur défini/récupéré
5509 $affMsg = "<br/> "._("Aucun instructeur compatible avec ce dossier trouve, ".
5510 "contactez votre administrateur afin d'en assigner un ".
5511 "a ce dossier.")." <br/>";
5512 if ($this->f->isAccredited("dossier_modifier_instructeur") === true) {
5513 $affMsg = "<br/> "._("Pensez a assigner un instructeur a ce dossier.")." <br/>";
5514 }
5515
5516 // si aucun instructeur n'est saisi et que le dossier_autorisation_type_detaille n'est pas
5517 // vide alors on récupère l'instructeur et la division depuis l'affectation automatique
5518 if (empty($this->valF['instructeur']) === true && empty($val['dossier_autorisation']) === false) {
5519
5520 // récupère le type détaillé du DA
5521 $dadt = $this->get_dossier_autorisation_da_type_detaille(
5522 $this->valF['dossier_autorisation']);
5523
5524 // si la commune est spécifiée
5525 $commune_id = 0;
5526 if (isset($this->valF['commune']) && $this->f->is_option_dossier_commune_enabled()) {
5527 $commune_id = $this->valF['commune'];
5528 }
5529
5530 // récupération de l'instructeur ainsi que de sa division
5531 $instructeurDivision = $this->getInstructeurDivision(
5532 intval($quartier), intval($arrondissement), $section,
5533 intval($dadt), intval($this->valF['om_collectivite']),
5534 intval($commune_id)
5535 );
5536
5537 // si un instructeur et sa division ont été récupérés
5538 if (isset($instructeurDivision['instructeur']) === true &&
5539 isset($instructeurDivision['division']) === true) {
5540
5541 // stocke les valeurs dans les données de formulaire
5542 // (pour pouvoir être exploitées ensuite)
5543 $this->valF['instructeur'] = $instructeurDivision['instructeur'];
5544 $this->valF['division'] = $instructeurDivision['division'];
5545
5546 // n'affiche aucun message à l'utilisateur
5547 $affMsg = null;
5548 }
5549
5550 // récupération de l'instructeur secondaire
5551 $instr2 = $this->getInstructeurDivision(
5552 intval($quartier), intval($arrondissement), $section,
5553 intval($dadt), intval($this->valF['om_collectivite']),
5554 intval($commune_id), 'instructeur_2'
5555 );
5556 if (isset($instr2['instructeur']) === true) {
5557 $this->valF['instructeur_2'] = $instr2['instructeur'];
5558 }
5559 }
5560
5561 // si on doit afficher un message à l'utilisateur
5562 if (empty($affMsg) === false) {
5563 $this->addToMessage($affMsg);
5564 }
5565
5566 $this->addToLog(__METHOD__."(): end", EXTRA_VERBOSE_MODE);
5567 }
5568
5569 /**
5570 * TRIGGER - triggermodifierapres.
5571 *
5572 * - Interface avec le référentiel ERP [101]
5573 * - Interface avec le référentiel ERP [102][103]
5574 * - Interface avec le référentiel ERP [114]
5575 * - Gestion des demandeurs liés
5576 * - Gestion des références cadastrales / parcelles liées
5577 * - Gestion des taxes
5578 *
5579 * @return boolean
5580 */
5581 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5582 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5583
5584 // Mise à jour DA si miroir du DI
5585 $inst_da = $this->get_inst_dossier_autorisation($this->getVal('dossier_autorisation'));
5586 if ($inst_da->is_dossier_autorisation_visible() === false) {
5587 $params = array(
5588 'di_id' => $this->getVal($this->clePrimaire),
5589 );
5590 if ($inst_da->majDossierAutorisation($params) === false) {
5591 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5592 return false;
5593 }
5594 }
5595
5596 /**
5597 * Interface avec le référentiel ERP.
5598 *
5599 * (WS->ERP)[101] ERP Qualifié -> AT
5600 * Déclencheur :
5601 * - L'option ERP est activée
5602 * - Le dossier est de type AT
5603 * - Le dossier est marqué comme "connecté au référentiel ERP"
5604 * - Le formulaire de modification du dossier est validé avec le
5605 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
5606 * "OUI"
5607 */
5608 //
5609 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
5610 && $this->is_connected_to_referentiel_erp() === true
5611 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')
5612 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false) {
5613 // Récupère la liste des contraintes
5614 $contraintes_plu_list = $this->getListContrainte($this->valF['dossier'], false);
5615 // Extrait les libellés de chaque contraintes
5616 $contraintes_plu = array();
5617 $contraintes_plu_string = "";
5618 while ($row =& $contraintes_plu_list->fetchRow(DB_FETCHMODE_ASSOC)) {
5619 //
5620 $contraintes_plu[] = $row['contrainte_libelle'];
5621 }
5622 // Chaîne de caractère listant toutes les contraintes du dossier
5623 $contraintes_plu_string = implode(' ; ', $contraintes_plu);
5624 $competence = "";
5625 if ($this->valF['autorite_competente'] !== null) {
5626 $inst_ac = $this->get_inst_autorite_competente($this->valF['autorite_competente']);
5627 $competence = $inst_ac->getVal("libelle");
5628 }
5629 //
5630 $infos = array(
5631 "dossier_instruction" => $this->valF['dossier'],
5632 "competence" => $competence,
5633 "contraintes_plu" => $contraintes_plu_string,
5634 "references_cadastrales" => $this->getReferenceCadastrale($this->valF['dossier']),
5635 );
5636 //
5637 $ret = $this->f->send_message_to_referentiel_erp(101, $infos);
5638 if ($ret !== true) {
5639 $this->cleanMessage();
5640 $this->addToMessage(_("Une erreur s'est produite lors de la notification (101) du référentiel ERP. Contactez votre administrateur."));
5641 return false;
5642 }
5643 $this->addToMessage(_("Notification (101) du référentiel ERP OK."));
5644 }
5645
5646 /**
5647 * Interface avec le référentiel ERP.
5648 *
5649 * (WS->ERP)[102] Demande de complétude de dossier PC pour un ERP -> PC qui concerne un ERP
5650 * (WS->ERP)[103] Demande de qualification de dossier PC pour un ERP -> PC qui concerne un ERP
5651 * Déclencheur :
5652 * - L'option ERP est activée
5653 * - Le dossier est de type PC
5654 * - Le formulaire de modification du dossier est validé avec le
5655 * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
5656 * "OUI"
5657 * - Le formulaire de modification du dossier est validé avec le
5658 * marqueur "ERP" à "OUI"
5659 */
5660 //
5661 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
5662 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
5663 && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
5664 && $this->valF['erp'] == true) {
5665 //
5666 $infos = array(
5667 "dossier_instruction" => $this->valF['dossier'],
5668 );
5669 // [102] Demande de complétude de dossier PC pour un ERP
5670 $ret = $this->f->send_message_to_referentiel_erp(102, $infos);
5671 if ($ret !== true) {
5672 $this->cleanMessage();
5673 $this->addToMessage(_("Une erreur s'est produite lors de la notification (102) du référentiel ERP. Contactez votre administrateur."));
5674 return false;
5675 }
5676 $this->addToMessage(_("Notification (102) du référentiel ERP OK."));
5677 // [103] Demande de qualification de dossier PC pour un ERP
5678 $ret = $this->f->send_message_to_referentiel_erp(103, $infos);
5679 if ($ret !== true) {
5680 $this->cleanMessage();
5681 $this->addToMessage(_("Une erreur s'est produite lors de la notification (103) du référentiel ERP. Contactez votre administrateur."));
5682 return false;
5683 }
5684 $this->addToMessage(_("Notification (103) du référentiel ERP OK."));
5685 }
5686
5687 /**
5688 * Interface avec le référentiel ERP.
5689 *
5690 * (WS->ERP)[114] ERP Qualifié -> PC
5691 * Déclencheur :
5692 * - l'option ERP est activée
5693 * - ET le dossier est marqué comme "connecté au référentiel ERP"
5694 * - ET le dossier est de type PC
5695 * - ET
5696 * - soit le formulaire de modification du dossier est validé avec le
5697 * marqueur "enjeu_urba" qui change de statut
5698 * - soit ce marqueur est vrai et le dossier passe à qualifié
5699 */
5700 // Étant donné que l'objet a été modifié en base après sa création,
5701 // il faut le ré-instancier pour récupérer ses informations.
5702 $dossier = $this->f->get_inst__om_dbform(array(
5703 "obj" => "dossier",
5704 "idx" => $this->valF['dossier'],
5705 ));
5706 if ($dossier->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
5707 && $dossier->is_connected_to_referentiel_erp() === true
5708 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
5709 && (($this->getVal('enjeu_urba') == 't') != $this->valF['enjeu_urba']
5710 || ($this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
5711 && $this->getVal('enjeu_urba') == 't'))) {
5712
5713 $enjeu = "non";
5714 if ($this->valF['enjeu_urba']) {
5715 $enjeu = "oui";
5716 }
5717
5718 $infos = array(
5719 "dossier_instruction" => $this->valF['dossier'],
5720 "Dossier à enjeu ADS" => $enjeu
5721 );
5722 //
5723 $ret = $this->f->send_message_to_referentiel_erp(114, $infos);
5724 if ($ret !== true) {
5725 $this->cleanMessage();
5726 $this->addToMessage(_("Une erreur s'est produite lors de la notification (114) du référentiel ERP. Contactez votre administrateur."));
5727 return false;
5728 }
5729 $this->addToMessage(_("Notification (114) du référentiel ERP OK."));
5730 }
5731
5732 /**
5733 * Gestion des demandeurs liés.
5734 */
5735 // Ajout ou modification des demandeurs
5736 $this->insertLinkDossierDemandeur();
5737
5738 /**
5739 * Gestion des références cadastrales / parcelles liées.
5740 */
5741 // Si le champ des références cadastrales n'est pas vide
5742 if ($this->getVal('terrain_references_cadastrales')
5743 != $this->valF['terrain_references_cadastrales']) {
5744
5745 // On supprime toutes les lignes de la table dossier_parcelle qui
5746 // font référence le dossier en cours de modification
5747 $this->supprimer_dossier_parcelle($val['dossier']);
5748
5749 // Ajout des parcelles dans la table dossier_parcelle
5750 $this->ajouter_dossier_parcelle($val['dossier'],
5751 $val['terrain_references_cadastrales']);
5752
5753 }
5754
5755 /**
5756 * Gestion des taxes.
5757 */
5758 // Si le champ tax_secteur est modifié et que l'option de simulation des
5759 // taxes est activée
5760 if ($this->getVal('tax_secteur') != $this->valF['tax_secteur']
5761 && $this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true) {
5762
5763 // Valeurs pour le calcul de la taxe d'aménagement
5764 $values = array();
5765 // Instance de la classe donnees_techniques
5766 $donnees_techniques = $this->get_inst_donnees_techniques();
5767 // Récupère les valeurs des données techniques
5768 $values = $donnees_techniques->get_form_val();
5769
5770 // Met à jour les montants du dossier
5771 $update_dossier_tax_mtn = $this->update_dossier_tax_mtn($this->valF['tax_secteur'], $values);
5772 if ($update_dossier_tax_mtn === false) {
5773 //
5774 $this->addToMessage(_("La mise a jour des montants de la simulation de la taxe d'amenagement a echouee."));
5775 //
5776 return false;
5777 }
5778 }
5779
5780 /**
5781 * Gestion des métadonées des pièces liés.
5782 * Vérifie les méthodes à exécuter configurées dans le connecteur du
5783 * filestorage.
5784 */
5785 //
5786 $ret = $this->post_update_metadata($val);
5787 //
5788 if ($ret === false) {
5789 //
5790 $this->cleanMessage();
5791 $this->addToMessage(_("La mise à jour des métadonnées des pièces liées à ce dossier a échouée."));
5792 return false;
5793 }
5794
5795 /**
5796 * Gestion des du changement de date de dépôt.
5797 * Vérification préalable de la présence de la date et de sa
5798 * modification.
5799 */
5800 //
5801 if (array_key_exists("date_depot", $val) === true) {
5802 //
5803 $inst_new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
5804 $inst_old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
5805 $new_date = $inst_new_date->format('d/m/Y');
5806 $old_date = $inst_old_date->format('d/m/Y');
5807
5808 //
5809 if ($new_date !== $old_date) {
5810 //
5811 $status = $this->update_date_depot($val["date_depot"]);
5812 //
5813 if ($status === false) {
5814 //
5815 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
5816 return false;
5817 }
5818
5819 }
5820 }
5821
5822 /**
5823 * Gestion de la normalisation de l'adresse.
5824 * En cas de modification de l'adresse du terrain, l'adresse normalisée
5825 * est supprimée.
5826 */
5827 $list_address_keys = array(
5828 'terrain_adresse_voie_numero',
5829 'terrain_adresse_voie',
5830 'terrain_adresse_lieu_dit',
5831 'terrain_adresse_localite',
5832 'terrain_adresse_code_postal',
5833 'terrain_adresse_bp',
5834 'terrain_adresse_cedex',
5835 );
5836 $change = false;
5837 foreach ($list_address_keys as $key) {
5838 if (array_key_exists($key, $val) === true
5839 && $val[$key] !== $this->getVal($key)) {
5840 //
5841 $change = true;
5842 break;
5843 }
5844 }
5845 if ($change === true) {
5846 $this->normalize_address();
5847 }
5848
5849 if ($this->f->is_option_mode_service_consulte_enabled() === false
5850 && $this->f->is_type_dossier_platau($this->valF['dossier_autorisation']) === true
5851 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
5852 //
5853 $trigger_platau_required_fields = $this->trigger_platau_required_fields($this->valF['dossier'], 'update');
5854 }
5855
5856 /**
5857 * Gestion des tâches pour la dématérialisation
5858 */
5859 // Qualification du dossier d'instruction
5860 if ($this->getVal('instructeur') != $this->valF['instructeur']
5861 || $this->getVal('division') != $this->valF['division']) {
5862 //
5863 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
5864 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
5865 && ($this->f->is_option_mode_service_consulte_enabled() !== true
5866 || ($this->f->is_option_mode_service_consulte_enabled() === true
5867 && ($this->get_source_depot_from_demande() === 'platau'
5868 || $this->get_source_depot_from_demande() === 'portal')))) {
5869 //
5870 $inst_task = $this->f->get_inst__om_dbform(array(
5871 "obj" => "task",
5872 "idx" => 0,
5873 ));
5874 $task_val = array(
5875 'type' => 'qualification_DI',
5876 'object_id' => $id,
5877 'dossier' => $id,
5878 );
5879 if ($this->f->is_option_mode_service_consulte_enabled() === false
5880 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
5881 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
5882 $task_val['state'] = $inst_task::STATUS_DRAFT;
5883 }
5884 $add_task = $inst_task->add_task(array('val' => $task_val));
5885 if ($add_task === false) {
5886 $this->addToMessage(sprintf('%s %s',
5887 __("Une erreur s'est produite lors de la création tâche."),
5888 __("Veuillez contacter votre administrateur.")
5889 ));
5890 $this->correct = false;
5891 return false;
5892 }
5893 }
5894 }
5895 // Modification du dossier d'instruction
5896 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
5897 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
5898 && ($this->f->is_option_mode_service_consulte_enabled() !== true
5899 || ($this->f->is_option_mode_service_consulte_enabled() === true
5900 && ($this->get_source_depot_from_demande() === 'platau'
5901 || $this->get_source_depot_from_demande() === 'portal')))) {
5902 //
5903 $inst_task = $this->f->get_inst__om_dbform(array(
5904 "obj" => "task",
5905 "idx" => 0,
5906 ));
5907 $task_val = array(
5908 'type' => 'modification_DI',
5909 'object_id' => $id,
5910 'dossier' => $id,
5911 );
5912 // Change l'état de la tâche de notification en fonction de l'état de
5913 // transmission du dossier d'instruction
5914 if ($this->f->is_option_mode_service_consulte_enabled() === false
5915 && $this->valF['etat_transmission_platau'] === 'non_transmissible'
5916 || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
5917 //
5918 $task_val['state'] = $inst_task::STATUS_DRAFT;
5919 }
5920 $add_task = $inst_task->add_task(array('val' => $task_val));
5921 if ($add_task === false) {
5922 $this->addToMessage(sprintf('%s %s',
5923 __("Une erreur s'est produite lors de la création tâche."),
5924 __("Veuillez contacter votre administrateur.")
5925 ));
5926 $this->correct = false;
5927 return false;
5928 }
5929 // XXX Les données du DA sont mises à jour seulement lors de l'ajout ou modification
5930 // d'une instruction du DI initial et lors de la décision sur le DI non initial.
5931 // Sachant ce comportement, voir si cette tâche modification_DA est bien située.
5932 // $inst_task = $this->f->get_inst__om_dbform(array(
5933 // "obj" => "task",
5934 // "idx" => 0,
5935 // ));
5936 // $task_val = array(
5937 // 'type' => 'modification_DA',
5938 // 'object_id' => $this->getVal('dossier_autorisation'),
5939 // 'dossier' => $this->getVal('dossier_autorisation'),
5940 // );
5941 // // Change l'état de la tâche de notification en fonction de l'état de
5942 // // transmission du dossier d'instruction
5943 // if ($this->f->is_option_mode_service_consulte_enabled() === false
5944 // && $this->valF['etat_transmission_platau'] === 'non_transmissible'
5945 // || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
5946 // //
5947 // $task_val['state'] = $inst_task::STATUS_DRAFT;
5948 // }
5949 // $add_task = $inst_task->add_task(array('val' => $task_val));
5950 // if ($add_task === false) {
5951 // $this->addToMessage(sprintf('%s %s',
5952 // __("Une erreur s'est produite lors de la création tâche."),
5953 // __("Veuillez contacter votre administrateur.")
5954 // ));
5955 // $this->correct = false;
5956 // return false;
5957 // }
5958 }
5959
5960 //
5961 return true;
5962 }
5963
5964 /**
5965 * TRIGGER - triggermodifier.
5966 *
5967 * @return boolean
5968 */
5969 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5970 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5971 // Si la date de dépôt a changé et si elle valait celle du dernier dépôt
5972 // alors cette dernière prend également sa valeur
5973 if ($this->f->formatDate($this->getVal('date_depot')) !== $val['date_depot']
5974 && $this->f->formatDate($this->getVal('date_depot')) === $this->f->formatDate($this->getVal('date_dernier_depot'))) {
5975 $this->valF['date_dernier_depot'] = $this->valF['date_depot'];
5976 }
5977 //
5978 return true;
5979 }
5980
5981 /**
5982 * Methode de traitement suite à la modification de la date de dépot.
5983 *
5984 * @param string $new_date_str Nouvelle date de dépot.
5985 *
5986 * @return boolean
5987 */
5988 function update_date_depot($new_date_str) {
5989 $demande = $this->get_inst_demande();
5990 // TODO: should return null instead of false
5991 if ($demande === false) {
5992 return false;
5993 }
5994
5995 $retour = $this->majDateInstruction($demande->getVal("instruction_recepisse"), $new_date_str);
5996 if ($retour === false) {
5997 return false;
5998 }
5999
6000 $valF = array();
6001 foreach ($demande->champs as $id => $champ) {
6002 $valF[$champ] = $demande->val[$id];
6003 }
6004 $valF['date_demande'] = $new_date_str;
6005 $modification = $demande->modifier($valF);
6006 if ($modification === false) {
6007 return false;
6008 }
6009
6010 $row_date = array("date_demande" => $new_date_str);
6011 $res = $this->f->db->autoExecute(
6012 DB_PREFIXE."dossier",
6013 $row_date,
6014 DB_AUTOQUERY_UPDATE,
6015 "dossier = '".$this->getVal("dossier")."'"
6016 );
6017 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6018 if ($this->f->isDatabaseError($res, true)) {
6019 return false;
6020 }
6021
6022 // Si c'est un dossier d'instruction initial
6023 $di_version = $this->get_dossier_instruction_version();
6024 if ($di_version === 0 || $di_version === '0') {
6025 //
6026 $row_date = array("depot_initial" => $new_date_str);
6027 $res = $this->f->db->autoExecute(
6028 DB_PREFIXE."dossier_autorisation",
6029 $row_date,
6030 DB_AUTOQUERY_UPDATE,
6031 "dossier_autorisation = '" . $this->getVal("dossier_autorisation") . "'"
6032 );
6033 $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6034 if ($this->f->isDatabaseError($res, true)) {
6035 return false;
6036 }
6037 }
6038 }
6039
6040
6041 /**
6042 * Met à jour l'instruction en fonction de la nouvelle date
6043 * ou retourne false si il ya une erreur.
6044 *
6045 * @param integer $instruction_id Identifiant de l'instruction.
6046 * @param string $date_depot Nouvelle date de dépôt.
6047 *
6048 * @return boolean
6049 */
6050 public function majDateInstruction($instruction_id, $date_depot) {
6051
6052 // Definalise l'instruction de récépissé si nécessaire
6053 $instruction = $this->f->get_inst__om_dbform(array(
6054 "obj" => "instruction",
6055 "idx" => $instruction_id,
6056 ));
6057 $instruction->setParameter('maj', 110);
6058 //
6059 if ($instruction->is_unfinalizable_without_bypass() === true
6060 && $instruction->unfinalize($instruction->valF) === false) {
6061 return false;
6062 }
6063
6064 // Modifie la date d'événement
6065 $instruction->setParameter('maj', 1);
6066 //
6067 $valF = array();
6068 foreach ($instruction->champs as $id => $champ) {
6069 $valF[$champ] = $instruction->getVal($champ);
6070 }
6071 //
6072 $valF['date_evenement'] = $date_depot;
6073 $valF['date_finalisation_courrier'] = null;
6074 //
6075 $modification = $instruction->modifier($valF);
6076 //
6077 if ($modification === false) {
6078 return false;
6079 }
6080
6081 // Finalise l'instruction
6082 $instruction->setParameter('maj', 100);
6083 if ($instruction->finalize($instruction->valF) === false) {
6084 return false;
6085 }
6086
6087 //
6088 return true;
6089 }
6090
6091 /**
6092 * TODO: replace with '$this->f->findObjectById' ?
6093 *
6094 * Récupère l'instance de l'autorité compétente.
6095 *
6096 * @param string $autorite_competente Identifiant de l'autorité compétente.
6097 *
6098 * @return object
6099 */
6100 function get_inst_autorite_competente($autorite_competente = null) {
6101 //
6102 return $this->get_inst_common("autorite_competente", $autorite_competente);
6103 }
6104
6105
6106 /**
6107 * Met à jour les montants des taxes du dossier d'instruction.
6108 *
6109 * @param integer $tax_secteur Secteur communal.
6110 * @param array $val Valeurs des données techniques.
6111 *
6112 * @return boolean
6113 */
6114 public function update_dossier_tax_mtn($tax_secteur, $val = array()) {
6115 // Instance du paramétrage de la taxe d'aménagement
6116 $taxe_amenagement = $this->get_inst_taxe_amenagement();
6117
6118 // Liste des montants à mettre à jour
6119 $valF = array();
6120 $valF['tax_mtn_part_commu'] = null;
6121 $valF['tax_mtn_part_depart'] = null;
6122 $valF['tax_mtn_part_reg'] = null;
6123 $valF['tax_mtn_total'] = null;
6124 $valF['tax_mtn_rap'] = null;
6125 $valF['tax_mtn_part_commu_sans_exo'] = null;
6126 $valF['tax_mtn_part_depart_sans_exo'] = null;
6127 $valF['tax_mtn_part_reg_sans_exo'] = null;
6128 $valF['tax_mtn_total_sans_exo'] = null;
6129 $valF['tax_mtn_rap_sans_exo'] = null;
6130
6131 // Si le tableau des valeurs n'est pas vide
6132 if ($val !== array()) {
6133
6134 // Si le taux communal est renseigné
6135 if ($taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== null
6136 && $taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== '') {
6137
6138 // Calcul de la TA
6139 $calcul_ta = $taxe_amenagement->compute_ta($tax_secteur, $val);
6140
6141 // Si chaque résultat est calculable
6142 if ($calcul_ta !== null && is_array($calcul_ta) === true) {
6143
6144 // Total des parts de la TA avec exonération
6145 $total_ta = $calcul_ta['commu'] + $calcul_ta['depart'] + $calcul_ta['reg'];
6146 $total_ta_ss_exo = $calcul_ta['commu_ss_exo'] + $calcul_ta['depart_ss_exo'] + $calcul_ta['reg_ss_exo'];
6147
6148 // Valeurs à mettre à jour, les montants doivent être à l'entier
6149 // inférieur
6150 $valF['tax_mtn_part_commu'] = floor($calcul_ta['commu']);
6151 $valF['tax_mtn_part_depart'] = floor($calcul_ta['depart']);
6152 $valF['tax_mtn_part_reg'] = floor($calcul_ta['reg']);
6153 $valF['tax_mtn_total'] = floor($total_ta);
6154 $valF['tax_mtn_part_commu_sans_exo'] = floor($calcul_ta['commu_ss_exo']);
6155 $valF['tax_mtn_part_depart_sans_exo'] = floor($calcul_ta['depart_ss_exo']);
6156 $valF['tax_mtn_part_reg_sans_exo'] = floor($calcul_ta['reg_ss_exo']);
6157 $valF['tax_mtn_total_sans_exo'] = floor($total_ta_ss_exo);
6158 }
6159 }
6160
6161 // Calcul de la RAP
6162 $calcul_rap = $taxe_amenagement->compute_rap($val);
6163
6164 // Si chaque résultat est calculable
6165 if ($calcul_rap !== null && is_array($calcul_rap) === true) {
6166
6167 // RAP avec exonération
6168 $mtn_rap = $calcul_rap['rap'];
6169 // RAP sans exonération
6170 $mtn_rap_ss_exo = $calcul_rap['rap_ss_exo'];
6171
6172 // Valeurs à mettre à jour, les montants doivent être à l'entier
6173 // inférieur
6174 $valF['tax_mtn_rap'] = floor($mtn_rap);
6175 $valF['tax_mtn_rap_sans_exo'] = floor($mtn_rap_ss_exo);
6176 }
6177 }
6178
6179 // Met à jour l'enregistrement de dossier
6180 $res = $this->f->db->autoExecute(
6181 DB_PREFIXE.$this->table,
6182 $valF,
6183 DB_AUTOQUERY_UPDATE,
6184 $this->clePrimaire ."='".$this->getVal($this->clePrimaire)."'"
6185 );
6186 // Log
6187 $this->f->addToLog(__METHOD__."() : db->autoExecute(".$res.")", VERBOSE_MODE);
6188 //
6189 if ($this->f->isDatabaseError($res, true)) {
6190 //
6191 $this->correct = false;
6192 return false;
6193 }
6194
6195 //
6196 return true;
6197 }
6198
6199 /**
6200 * TRIGGER - triggersupprimer.
6201 *
6202 * @return boolean
6203 */
6204 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6205 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6206
6207 // Le dossier d'instruction n'est pas supprimé si celui-ci est lié à un
6208 // contentieux
6209 $autorisation_contestee = $this->get_idx_by_args('autorisation_contestee', 'dossier', 'autorisation_contestee', $this->getVal($this->clePrimaire));
6210 if ($autorisation_contestee !== null && $autorisation_contestee !== '') {
6211 $this->addToMessage("Le dossier d'instruction ne peut pas être supprimé car celui-ci est lié à un contentieux.");
6212 return false;
6213 }
6214
6215 /**
6216 * Gestion de la suppression des tables liées au dossier d'instruction.
6217 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
6218 */
6219 // Tableau pour la conception des requêtes de suppression
6220 $related_tables = array(
6221 'lien_demande_demandeur' => array(
6222 'condition_field' => 'demande',
6223 'condition_value' => $this->get_idx_by_args('demande', 'demande', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6224 ),
6225 'demande' => array(
6226 'condition_field' => 'dossier_instruction',
6227 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6228 ),
6229 'lien_dossier_demandeur' => array(
6230 'condition_field' => 'dossier',
6231 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6232 ),
6233 'instruction_notification_document' => array(
6234 'condition_field' => 'instruction_notification',
6235 '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))),
6236 ),
6237 'instruction_notification' => array(
6238 'condition_field' => 'instruction',
6239 'condition_value' => sprintf('SELECT %2$s FROM %1$s%2$s WHERE %3$s = \'%4$s\'', DB_PREFIXE, 'instruction', 'dossier', $this->getVal($this->clePrimaire)),
6240 ),
6241 'instruction' => array(
6242 'condition_field' => 'dossier',
6243 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6244 ),
6245 'dossier_parcelle' => array(
6246 'condition_field' => 'dossier',
6247 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6248 ),
6249 'dossier_contrainte' => array(
6250 'condition_field' => 'dossier',
6251 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6252 ),
6253 'lien_donnees_techniques_moyen_retenu_juge' => array(
6254 'condition_field' => 'donnees_techniques',
6255 'condition_value' => $this->get_idx_by_args('donnees_techniques', 'donnees_techniques', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6256 ),
6257 'lien_donnees_techniques_moyen_souleve' => array(
6258 'condition_field' => 'donnees_techniques',
6259 'condition_value' => $this->get_idx_by_args('donnees_techniques', 'donnees_techniques', 'dossier_instruction', $this->getVal($this->clePrimaire)),
6260 ),
6261 'donnees_techniques_di' => array(
6262 'table' => 'donnees_techniques',
6263 'condition_field' => 'dossier_instruction',
6264 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6265 ),
6266 'blocnote' => array(
6267 'condition_field' => 'dossier',
6268 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6269 ),
6270 'consultation_entrante' => array(
6271 'condition_field' => 'dossier',
6272 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6273 ),
6274 'consultation' => array(
6275 'condition_field' => 'dossier',
6276 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6277 ),
6278 'document_numerise' => array(
6279 'condition_field' => 'dossier',
6280 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6281 ),
6282 'rapport_instruction' => array(
6283 'condition_field' => 'dossier_instruction',
6284 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6285 ),
6286 'dossier_commission' => array(
6287 'condition_field' => 'dossier',
6288 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6289 ),
6290 'dossier_message' => array(
6291 'condition_field' => 'dossier',
6292 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6293 ),
6294 'lien_dossier_dossier_1' => array(
6295 'table' => 'lien_dossier_dossier',
6296 'condition_field' => 'dossier_src',
6297 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6298 ),
6299 'lien_dossier_dossier_2' => array(
6300 'table' => 'lien_dossier_dossier',
6301 'condition_field' => 'dossier_cible',
6302 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6303 ),
6304 'dossier_geolocalisation' => array(
6305 'condition_field' => 'dossier',
6306 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6307 ),
6308 'donnees_techniques_lot' => array(
6309 'table' => 'donnees_techniques',
6310 'condition_field' => 'lot',
6311 'condition_value' => $this->get_idx_by_args("string_agg(lot::text, ', ')", 'lot', 'dossier', $this->getVal($this->clePrimaire)),
6312 ),
6313 'lien_lot_demandeur' => array(
6314 'condition_field' => 'lot',
6315 'condition_value' => $this->get_idx_by_args("string_agg(lot::text, ', ')", 'lot', 'dossier', $this->getVal($this->clePrimaire)),
6316 ),
6317 'lot' => array(
6318 'condition_field' => 'dossier',
6319 'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
6320 ),
6321 );
6322 // Supprime les enregistrements des tables
6323 $delete = $this->delete_related_tables($related_tables);
6324 if ($delete === false) {
6325 return false;
6326 }
6327
6328 //
6329 return true;
6330 }
6331
6332 /**
6333 * TRIGGER - triggersupprimerapres.
6334 *
6335 * @return boolean
6336 */
6337 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6338 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6339
6340 /**
6341 * Gestion de la suppression des tables liées au dossier d'instruction.
6342 * Dans le cas d'un dossier d'instruction initial le dossier
6343 * d'autorisation est également supprimé pour libérer la numéroration.
6344 * S'il s'agit d'un dossier d'instruction sur exsitant alors le dossier
6345 * d'autorisation est mise à jour.
6346 * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
6347 */
6348 // S'il s'agit d'une suppression de dossier d'instruction sur existant
6349 if ($this->has_only_initial_di(true) === false) {
6350 // Mise à jour des données du dossier d'autorisation
6351 $da = $this->f->get_inst__om_dbform(array(
6352 "obj" => "dossier_autorisation",
6353 "idx" => $this->getVal("dossier_autorisation"),
6354 ));
6355 $da->majDossierAutorisation();
6356
6357 } else {
6358 // S'il s'agit d'une suppression de dossier d'instruction initial
6359 // Tableau pour la conception des requêtes de suppression
6360 $related_tables = array(
6361 'lien_dossier_autorisation_demandeur' => array(
6362 'condition_field' => 'dossier_autorisation',
6363 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6364 ),
6365 'dossier_autorisation_parcelle' => array(
6366 'condition_field' => 'dossier_autorisation',
6367 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6368 ),
6369 'donnees_techniques' => array(
6370 'condition_field' => 'dossier_autorisation',
6371 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6372 ),
6373 'dossier_autorisation' => array(
6374 'condition_field' => 'dossier_autorisation',
6375 'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
6376 ),
6377 );
6378 // Supprime les tables
6379 $delete = $this->delete_related_tables($related_tables);
6380 if ($delete === false) {
6381 return false;
6382 }
6383
6384 /**
6385 * Mise à jour de la séquence.
6386 */
6387 $curr_da_num = $this->get_max_da_num();
6388 if (is_integer($curr_da_num) !== true) {
6389 $this->addToMessage(__('Erreur lors du calcul du numéro de dossier.'));
6390 return false;
6391 }
6392
6393 $seq_name = $this->get_sequence_name();
6394 if (empty($seq_name) === true) {
6395 $this->f->addToLog(sprintf('%s() : %s',
6396 __METHOD__,
6397 __("Échec de la récupération du nom de la séquence.")
6398 ), DEBUG_MODE);
6399 return false;
6400 }
6401
6402 // Dans le cas de la suppression du dernier dossier d'instruction de
6403 // sa numérotation alors la séquence est supprimée
6404 if ($curr_da_num === 0) {
6405 $table_name = substr($seq_name, 0, -4);
6406 $res = $this->f->db->dropSequence($table_name);
6407 $this->f->addToLog(__METHOD__."(): db->createSequence(\"".$table_name."\");", VERBOSE_MODE);
6408 $this->f->isDatabaseError($res);
6409
6410 } else {
6411 // La méthode setval avec la valeur true en troisième argument
6412 // signifie que le prochain nextval avancera la séquence avant
6413 // de renvoyer une valeur.
6414 $sql = sprintf("
6415 SELECT setval('%s', %s, true)",
6416 $seq_name,
6417 $curr_da_num
6418 );
6419 $res = $this->f->db->query($sql);
6420 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
6421 $this->f->isDatabaseError($res);
6422 }
6423 }
6424
6425 /**
6426 * Supprime le dossier d'instruction des derniers dossiers consultés,
6427 * sauvegardé en session
6428 */
6429 if (isset($_SESSION['dossiers_consulte']) !== false) {
6430 $id_di = $this->getVal($this->clePrimaire);
6431 if (in_array($id_di, $_SESSION['dossiers_consulte']) === true) {
6432 unset($_SESSION['dossiers_consulte'][$id_di]);
6433 }
6434 // Supprime le tableau s'il n'y a plus de dossier consulté
6435 if (count($_SESSION['dossiers_consulte']) === 0) {
6436 unset($_SESSION['dossiers_consulte']);
6437 }
6438 }
6439
6440 /**
6441 * Gestion des tâches pour la dématérialisation
6442 */
6443 $inst_task_empty = $this->f->get_inst__om_dbform(array(
6444 "obj" => "task",
6445 "idx" => 0,
6446 ));
6447 $task_types = array(
6448 "creation_DI",
6449 "depot_DI",
6450 );
6451 foreach ($task_types as $task_type) {
6452 $task_exists = $inst_task_empty->task_exists($task_type, $id);
6453 if ($task_exists !== false) {
6454 $inst_task = $this->f->get_inst__om_dbform(array(
6455 "obj" => "task",
6456 "idx" => $task_exists,
6457 ));
6458 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6459 $task_val = array(
6460 'state' => $inst_task::STATUS_CANCELED,
6461 );
6462 $update_task = $inst_task->update_task(array('val' => $task_val));
6463 if ($update_task === false) {
6464 $this->addToMessage(sprintf('%s %s',
6465 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6466 __("Veuillez contacter votre administrateur.")
6467 ));
6468 $this->correct = false;
6469 return false;
6470 }
6471 }
6472 }
6473 }
6474
6475 return true;
6476 }
6477
6478 /**
6479 * TREATMENT - delete_related_tables.
6480 *
6481 * Suppression par requête SQL les enregistrements des tables passées en
6482 * paramètre.
6483 *
6484 * @param array $related_tables Liste des enregistrements à supprimer
6485 *
6486 * @return boolean
6487 */
6488 function delete_related_tables(array $related_tables) {
6489 $this->begin_treatment(__METHOD__);
6490
6491 // Supprime chaque enregistrement liés au dossier d'instruction
6492 $template_delete_sql = 'DELETE FROM %s%s WHERE %s IN (%s)';
6493 foreach ($related_tables as $table => $value) {
6494 if (isset($value['table']) === true) {
6495 $table = $value['table'];
6496 }
6497 if ($value['condition_value'] !== '' && $value['condition_value'] !== null) {
6498 $sql = sprintf($template_delete_sql, DB_PREFIXE, $table, $value['condition_field'], $value['condition_value']);
6499 $res = $this->f->db->query($sql);
6500 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
6501 $this->f->isDatabaseError($res);
6502
6503 /**
6504 * Gestion des tâches pour la dématérialisation
6505 */
6506 // Annule toutes les tâches liées au dossier
6507 $inst_task_empty = $this->f->get_inst__om_dbform(array(
6508 "obj" => "task",
6509 "idx" => 0,
6510 ));
6511 $all_task_type = array_merge($inst_task_empty::TASK_TYPE_SI, $inst_task_empty::TASK_TYPE_SC);
6512 foreach ($all_task_type as $task_type) {
6513 $task_exists = $inst_task_empty->task_exists($task_type, $this->getVal($this->clePrimaire), $this->getVal($this->clePrimaire));
6514 if ($task_exists !== false) {
6515 $inst_task = $this->f->get_inst__om_dbform(array(
6516 "obj" => "task",
6517 "idx" => $task_exists,
6518 ));
6519 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6520 $task_val = array(
6521 'state' => $inst_task::STATUS_CANCELED,
6522 );
6523 $update_task = $inst_task->update_task(array('val' => $task_val));
6524 if ($update_task === false) {
6525 $this->addToMessage(sprintf('%s %s',
6526 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6527 __("Veuillez contacter votre administrateur.")
6528 ));
6529 $this->correct = false;
6530 return false;
6531 }
6532 }
6533 }
6534 }
6535 // Spécifique au dossier d'autorisation
6536 if ($table === 'dossier_autorisation') {
6537 $task_exists = $inst_task_empty->task_exists('creation_DA', $this->getVal($table));
6538 if ($task_exists !== false) {
6539 $inst_task = $this->f->get_inst__om_dbform(array(
6540 "obj" => "task",
6541 "idx" => $task_exists,
6542 ));
6543 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
6544 $task_val = array(
6545 'state' => $inst_task::STATUS_CANCELED,
6546 );
6547 $update_task = $inst_task->update_task(array('val' => $task_val));
6548 if ($update_task === false) {
6549 $this->addToMessage(sprintf('%s %s',
6550 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
6551 __("Veuillez contacter votre administrateur.")
6552 ));
6553 $this->correct = false;
6554 return false;
6555 }
6556 }
6557 }
6558 }
6559 }
6560 }
6561
6562 return $this->end_treatment(__METHOD__, true);
6563 }
6564
6565 /**
6566 * CONDITION - has_only_initial_di.
6567 *
6568 * Permet de vérifier qu'il s'agit du dossier d'instruction initial de
6569 * l'autorisation.
6570 *
6571 * @param boolean $after_delete À activer si la méthode est utilisée lors de
6572 * la suppression.
6573 *
6574 * @return boolean
6575 */
6576 function has_only_initial_di($after_delete=false) {
6577
6578 // Compte le nombre de dossier lié au dossier d'autorisation
6579 $res = $this->get_idx_by_args('COUNT(dossier)', 'dossier', 'dossier_autorisation', $this->getVal('dossier_autorisation'));
6580
6581 // Si la méthode est utilisé dans le triggersupprimerapres alors le
6582 // dossier d'instruction est déjà supprimé dans la base de données, le
6583 // retour doit donc être 0 pour prouver la suppression du DI initial
6584 if ($after_delete === true) {
6585 if ($res === '0') {
6586 return true;
6587 }
6588 //
6589 return false;
6590 }
6591
6592 // S'il y a qu'un seul dossier d'instruction alors le DI courant est
6593 // forcément l'initial
6594 if ($res === '1') {
6595 return true;
6596 }
6597 //
6598 return false;
6599 }
6600
6601 /**
6602 * Récupère la dernière valeur d'une séquence.
6603 *
6604 * @param string $sequence_name Nom de la séquence (optionnel)
6605 *
6606 * @return integer Dernière valeur de la séquence
6607 */
6608 function get_last_value_sequence($sequence_name=null) {
6609 // Récupère autoamtiquement le nom de la séquence du dossier
6610 // d'instruction courant
6611 if ($sequence_name === null) {
6612 $sequence_name = $this->get_sequence_name();
6613
6614 if (empty($sequence_name) === true) {
6615 $this->f->addToLog(sprintf('%s() : %s',
6616 __METHOD__,
6617 __("Échec de la récupération du nom de la séquence.")
6618 ), DEBUG_MODE);
6619 return false;
6620 }
6621 }
6622
6623 $sql = sprintf(
6624 "SELECT last_value FROM %s",
6625 $sequence_name
6626 );
6627 $res = $this->f->get_one_result_from_db_query($sql, true);
6628 if ($res['code'] === 'KO') {
6629 return false;
6630 }
6631
6632 return intval($res['result']);
6633 }
6634
6635 /**
6636 * [get_max_da_num description]
6637 * @param [type] $sequence_name [description]
6638 * @return [type] [description]
6639 */
6640 function get_max_da_num($sequence_name = null) {
6641 if ($sequence_name === null) {
6642 $sequence_name = $this->get_sequence_name();
6643 }
6644 $da = $this->f->get_inst__om_dbform(array(
6645 "obj" => "dossier_autorisation",
6646 "idx" => $this->getVal('dossier_autorisation'),
6647 ));
6648 if ($da->doesNumeroDossierSequenceExists($sequence_name) !== true) {
6649 return false;
6650 }
6651 $sequence_args = $this->get_sequence_args();
6652 return $da->getMaxDANumeroDossier($sequence_args['datc'], $sequence_args['annee'], $sequence_args['dep'], $sequence_args['com']);
6653 }
6654
6655 /**
6656 * Retourne la reference cadastrale de la demande attache a un dossier ERP
6657 * specifique
6658 * @param string $dossier L'identifiant du dossier
6659 * @return string|null La reference cadastrale si elle est trouve,
6660 * sinon NULL. En cas d'erreur de la BD, l'execution s'arrete.
6661 */
6662 function getReferenceCadastrale($dossier) {
6663 $sql = "SELECT terrain_references_cadastrales FROM ".DB_PREFIXE."demande WHERE dossier_instruction = '" . $dossier . "'";
6664 $res = $this->f->db->limitquery($sql, 0, 1);
6665 $this->addToLog("getReferenceCadastrale(): db->limitquery(\"".
6666 str_replace(",",", ",$sql)."\", 0, 1);", VERBOSE_MODE);
6667 // Si une erreur survient on die
6668 if (database::isError($res, true)) {
6669 // Appel de la methode de recuperation des erreurs
6670 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), 'demande');
6671 }
6672 // retourne la nature du dossier
6673 while ($row =& $res->fetchRow()) {
6674 return $row[0];
6675 }
6676 // la nature n'etait pas trouve, ce qui ne devrait pas se passer
6677 return NULL;
6678 }
6679
6680 /**
6681 * Supprime puis recrée tous les liens entre dossier et demandeurs
6682 **/
6683 function insertLinkDossierDemandeur() {
6684 // Suppression des anciens demandeurs
6685 $this->deleteLinkDossierDemandeur();
6686 $types_demandeur = array(
6687 "petitionnaire_principal",
6688 "delegataire",
6689 "petitionnaire",
6690 "plaignant_principal",
6691 "plaignant",
6692 "contrevenant_principal",
6693 "contrevenant",
6694 "requerant_principal",
6695 "requerant",
6696 "avocat_principal",
6697 "avocat",
6698 "bailleur_principal",
6699 "bailleur",
6700 "proprietaire",
6701 "architecte_lc",
6702 "paysagiste",
6703 );
6704 foreach ($types_demandeur as $type) {
6705 // Comparaison des autres demandeurs
6706 if(isset($this->postedIdDemandeur[$type]) === true) {
6707 // Ajout des nouveaux liens
6708 foreach ($this->postedIdDemandeur[$type] as $demandeur) {
6709 //
6710 $principal = false;
6711 if (strpos($type, '_principal') !== false) {
6712 $principal = true;
6713 }
6714 if ($this->addLinkDossierDemandeur($demandeur, $principal) === false) {
6715 //
6716 return false;
6717 }
6718 }
6719 }
6720 }
6721 }
6722
6723
6724 /**
6725 * Fonction permettant d'ajouter un lien
6726 * entre la table dossier et demandeur
6727 **/
6728 function addLinkDossierDemandeur($id, $principal) {
6729 $lienAjout = $this->f->get_inst__om_dbform(array(
6730 "obj" => "lien_dossier_demandeur",
6731 "idx" => "]",
6732 ));
6733 $lien = array('lien_dossier_demandeur' => "",
6734 'petitionnaire_principal' => (($principal)?"t":"f"),
6735 'dossier' => $this->valF['dossier'],
6736 'demandeur' => $id);
6737 $lienAjout->ajouter($lien);
6738 $lienAjout->__destruct();
6739 }
6740
6741 /**
6742 * Fonction permettant de supprimer un lien
6743 * entre la table demande et demandeur
6744 **/
6745 function deleteLinkDossierDemandeur() {
6746 // Suppression
6747 $sql = "DELETE FROM ".DB_PREFIXE."lien_dossier_demandeur ".
6748 "WHERE dossier='".$this->valF['dossier']."'";
6749 // Execution de la requete de suppression de l'objet
6750 $res = $this->f->db->query($sql);
6751 // Logger
6752 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
6753 if ( database::isError($res)){
6754 die();
6755 }
6756 }
6757
6758 /**
6759 * Methode de recupération des valeurs postées
6760 **/
6761 function getPostedValues() {
6762 // Récupération des demandeurs dans POST
6763 $types_demandeur = array(
6764 "petitionnaire_principal",
6765 "delegataire",
6766 "petitionnaire",
6767 "plaignant_principal",
6768 "plaignant",
6769 "contrevenant_principal",
6770 "contrevenant",
6771 "requerant_principal",
6772 "requerant",
6773 "avocat_principal",
6774 "avocat",
6775 "bailleur_principal",
6776 "bailleur",
6777 "proprietaire",
6778 "architecte_lc",
6779 "paysagiste",
6780 );
6781 foreach ($types_demandeur as $type) {
6782 if($this->f->get_submitted_post_value($type) !== null AND
6783 $this->f->get_submitted_post_value($type) != '') {
6784 $this->postedIdDemandeur[$type] = $this->f->get_submitted_post_value($type);
6785 }
6786 }
6787 }
6788
6789 /**
6790 * Méthode permettant de récupérer les id des demandeurs liés à la table
6791 * liée passée en paramètre
6792 *
6793 * @param string $from Table liée : "demande", "dossier", dossier_autorisation"
6794 * @param string $id Identifiant (clé primaire de la table liée en question)
6795 */
6796 function listeDemandeur($from, $id) {
6797
6798 // Si la donnée membre a déjà été remplie par un précédent appel à cette méthode,
6799 // on sort.
6800 if ($this->valIdDemandeur["petitionnaire_principal"] !== array() or
6801 $this->valIdDemandeur["delegataire"] !== array() or
6802 $this->valIdDemandeur["petitionnaire"] !== array() or
6803 $this->valIdDemandeur["plaignant_principal"] !== array() or
6804 $this->valIdDemandeur["plaignant"] !== array() or
6805 $this->valIdDemandeur["contrevenant_principal"] !== array() or
6806 $this->valIdDemandeur["contrevenant"] !== array() or
6807 $this->valIdDemandeur["requerant_principal"] !== array() or
6808 $this->valIdDemandeur["requerant"] !== array() or
6809 $this->valIdDemandeur["avocat_principal"] !== array() or
6810 $this->valIdDemandeur["avocat"] !== array() or
6811 $this->valIdDemandeur["bailleur_principal"] !== array() or
6812 $this->valIdDemandeur["bailleur"] !== array() or
6813 $this->valIdDemandeur["proprietaire"] !== array() or
6814 $this->valIdDemandeur["architecte_lc"] !== array() or
6815 $this->valIdDemandeur["paysagiste"] !== array()) {
6816 return;
6817 }
6818
6819 // Récupération des demandeurs de la base
6820 $sql = "SELECT demandeur.demandeur,
6821 demandeur.type_demandeur,
6822 lien_".$from."_demandeur.petitionnaire_principal
6823 FROM ".DB_PREFIXE."lien_".$from."_demandeur
6824 INNER JOIN ".DB_PREFIXE."demandeur
6825 ON demandeur.demandeur=lien_".$from."_demandeur.demandeur
6826 WHERE ".$from." = '".$id."'";
6827 $res = $this->f->db->query($sql);
6828 $this->f->addToLog("listeDemandeur(): db->query(\"".$sql."\")", VERBOSE_MODE);
6829 $this->f->isDatabaseError($res);
6830
6831 // Stockage du résultat dans un tableau
6832 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6833
6834 $demandeur_type = $row['type_demandeur'];
6835 if ($row['petitionnaire_principal'] == 't'){
6836 $demandeur_type .= "_principal";
6837 }
6838 $this->valIdDemandeur[$demandeur_type][] = $row['demandeur'];
6839 }
6840 }
6841
6842 /**
6843 * Récupère la liste des contraintes d'un dossier.
6844 *
6845 * @param string $dossier Identifiant du dossier.
6846 * @param boolean $for_di_view Liste avec condition affichage DI.
6847 *
6848 * @return object Résultat de la requête
6849 */
6850 function getListContrainte($dossier, $for_di_view = true) {
6851
6852 // Select
6853 $select = "SELECT dossier_contrainte.dossier_contrainte as dossier_contrainte_id,
6854 dossier_contrainte.texte_complete as dossier_contrainte_texte,
6855 dossier_contrainte.reference as dossier_contrainte_reference,
6856 contrainte.libelle as contrainte_libelle,
6857 contrainte.nature as contrainte_nature,
6858 contrainte.texte as contrainte_texte,
6859 contrainte.reference as contrainte_reference,
6860 lower(contrainte.groupe) as contrainte_groupe,
6861 lower(contrainte.sousgroupe) as contrainte_sousgroupe ";
6862
6863 // From
6864 $from = " FROM ".DB_PREFIXE."contrainte
6865 LEFT JOIN ".DB_PREFIXE."dossier_contrainte
6866 ON dossier_contrainte.contrainte = contrainte.contrainte ";
6867
6868 // Where
6869 $where = " WHERE dossier_contrainte.dossier = '".$dossier."' ";
6870
6871 // Si les contraintes sont listées pour être affichées dans le DI
6872 if ($for_di_view === true) {
6873 // Si le paramètre "option_contrainte_di" est défini
6874 if ($this->f->getParameter('option_contrainte_di') != 'aucun') {
6875 // Ajoute la condition
6876 $where .= $this->f->traitement_condition_contrainte(
6877 $this->f->getParameter('option_contrainte_di'));
6878 }
6879 }
6880
6881 // Tri
6882 $tri = " ORDER BY contrainte_groupe DESC, contrainte_sousgroupe,
6883 contrainte.no_ordre, contrainte.libelle ";
6884
6885 // Requête SQL
6886 $sql = $select.$from.$where.$tri;
6887 $res = $this->f->db->query($sql);
6888 $this->f->addToLog("listContrainte(): db->query(\"".$sql."\");", VERBOSE_MODE);
6889 $this->f->isDatabaseError($res);
6890
6891 // Retourne le résultat
6892 return $res;
6893 }
6894
6895 /**
6896 * Ajout de la liste des contraintes et des demandeurs
6897 */
6898 function formSpecificContent($maj) {
6899
6900 // Récupère le CRUD
6901 $crud = $this->get_action_crud($this->getParameter("maj"));
6902
6903 // Les contenus spécifiques ne sont pas affichés en cas de suppression
6904 if ($crud === 'delete') {
6905 return;
6906 }
6907
6908 /**
6909 * Liste des identifiants externes
6910 */
6911 //
6912 if ($this->f->is_option_mode_service_consulte_enabled() !== true
6913 || ($this->f->is_option_mode_service_consulte_enabled() === true
6914 && ($this->get_source_depot_from_demande() === 'platau'
6915 || $this->get_source_depot_from_demande() === 'portal'))) {
6916 //
6917 $template_label = '<label for="%1$s" class="libelle-%1$s" id="lib-%1$s">%2$s</label>';
6918 $template_value = '<span class="field_value" id="%s">%s</span>';
6919 $inst_liiue = $this->f->get_inst__om_dbform(array(
6920 "obj" => "lien_id_interne_uid_externe",
6921 "idx" => 0,
6922 ));
6923 $external_uids = $inst_liiue->get_all_lien_id_interne_uid_externe_by_dossier($this->getVal('dossier'), 'platau');
6924 if ($external_uids === false) {
6925 printf('<span class="col_12">%s %s</span>',
6926 __("Impossible d'afficher la liste des identifiants externes liés à ce dossier."),
6927 __("Veuillez contacter votre administrateur.")
6928 );
6929 }
6930 if (is_array($external_uids) === true && count($external_uids) > 0) {
6931 $this->f->display_formulaire_debutFieldset(array(
6932 "identifier" => "fieldset-form-dossier_instruction-lien_id_interne_uid_externe",
6933 "action2" => "col_12 startClosed",
6934 "action1" => __("Plat'AU : identifiants techniques"),
6935 "legend_class" => 'demat-color-fieldset',
6936 ));
6937 foreach ($external_uids as $external_uid) {
6938 $object = $external_uid['object'];
6939 if ($external_uid['object'] === 'dossier_consultation') {
6940 $object = 'Consultation';
6941 }
6942 if ($external_uid['object'] === 'pec_dossier_consultation') {
6943 $object = 'PeC';
6944 }
6945 if ($external_uid['object'] === 'avis_dossier_consultation') {
6946 $object = 'Avis';
6947 }
6948 $this->f->layout->display_formulaire_conteneur_libelle_widget("statiq");
6949 $this->f->layout->display_formulaire_conteneur_libelle_champs();
6950 printf($template_label,
6951 sprintf('%s-%s', $inst_liiue->table, $external_uid['lien_id_interne_uid_externe']),
6952 __($object)
6953 );
6954 $this->f->layout->display_formulaire_fin_conteneur_champs();
6955 $this->f->layout->display_formulaire_conteneur_champs();
6956 printf($template_value,
6957 sprintf('%s-%s', $inst_liiue->table, $external_uid['lien_id_interne_uid_externe']),
6958 $external_uid['external_uid']
6959 );
6960 $this->f->layout->display_formulaire_fin_conteneur_champs();
6961 $this->f->layout->display_formulaire_fin_conteneur_champs();
6962 }
6963 $this->f->layout->display_formulaire_finFieldset(array());
6964 }
6965 }
6966
6967 /**
6968 * Liste des contraintes
6969 */
6970 //
6971 $listContrainte = $this->getListContrainte($this->getVal('dossier'));
6972
6973 // Si le dossier possède des contraintes
6974 if ($listContrainte->numRows() != 0) {
6975
6976 // Affiche du fieldset
6977 printf("<div id=\"liste_contrainte\" class=\"demande_hidden_bloc\">");
6978 printf("<fieldset class=\"cadre ui-corner-all ui-widget-content col_12 startClosed\">");
6979 printf(" <legend class=\"ui-corner-all ui-widget-content ui-state-active\"
6980 id =\"fieldset_contraintes_liees\">"
6981 ._("dossier_contrainte")."</legend>");
6982 printf("<div class=\"fieldsetContent\" style=\"display: none;\">");
6983
6984 // Entête pour le groupe
6985 $groupeHeader = "
6986 <div class='dossier_contrainte_groupe'>
6987 <div class='dossier_contrainte_groupe_header'>
6988 <span class='name'>
6989 %s
6990 </span>
6991 </div>
6992 ";
6993
6994 // Entête pour le sous-groupe
6995 $sousgroupeHeader = "
6996 <div class='dossier_contrainte_sousgroupe'>
6997 <div class='dossier_contrainte_sousgroupe_header'>
6998 <span class='name'>
6999 %s
7000 </span>
7001 </div>
7002 ";
7003
7004 // Titres des colonnes
7005 $tableHeader = "
7006 <thead>
7007 <tr class='ui-tabs-nav ui-accordion ui-state-default tab-title'>
7008 <th class='title col-0 firstcol contrainte_th_texte_complete'>
7009 <span class='name'>
7010 "._('texte_complete')."
7011 </span>
7012 </th>
7013 <th class='title col-1 contrainte_th_reference'>
7014 <span class='name'>
7015 "._('reference')."
7016 </span>
7017 </th>
7018 <th class='title col-2 contrainte_th_nature'>
7019 <span class='name'>
7020 "._('nature')."
7021 </span>
7022 </th>
7023 </tr>
7024 </thead>
7025 ";
7026
7027 // Ligne de données
7028 $line = "
7029 <tr class='tab-data %s'>
7030 <td class='col-0 firstcol contrainte_th_texte_complete'>
7031 %s
7032 </td>
7033 <td class='col-1 contrainte_th_reference'>
7034 %s
7035 </td>
7036 <td class='col-2 contrainte_th_nature'>
7037 %s
7038 </td>
7039 ";
7040
7041 // Sauvegarde des données pour les comparer
7042 $lastRow = array();
7043 $lastRow['contrainte_groupe'] = 'empty';
7044 $lastRow['contrainte_sousgroupe'] = 'empty';
7045
7046 // Tant qu'il y a des résultats
7047 while($row = &$listContrainte->fetchRow(DB_FETCHMODE_ASSOC)) {
7048 // Si l'identifiant du groupe de la contrainte présente et
7049 // celle d'avant est différent
7050 if ($row['contrainte_groupe'] != $lastRow['contrainte_groupe']) {
7051
7052 // Si l'identifiant du groupe d'avant est vide
7053 if ($lastRow['contrainte_groupe'] != 'empty') {
7054 // Ferme le tableau
7055 printf("</table>");
7056 // Ferme le div
7057 printf("</div>");
7058 // Ferme le div
7059 printf("</div>");
7060 }
7061
7062 // Affiche le header du groupe
7063 printf($groupeHeader, $row['contrainte_groupe']);
7064 }
7065
7066 // Si l'identifiant du sous-groupe de la contrainte présente et
7067 // celle d'avant est différent
7068 // Ou qu'ils soient identique mais n'appartiennent pas au même groupe
7069 if ($row['contrainte_sousgroupe'] != $lastRow['contrainte_sousgroupe']
7070 || ($row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']
7071 && $row['contrainte_groupe'] != $lastRow['contrainte_groupe'])) {
7072
7073 //
7074 if($row['contrainte_groupe'] == $lastRow['contrainte_groupe']) {
7075 // Si l'identifiant de la sous-groupe d'avant est vide
7076 if ($lastRow['contrainte_sousgroupe'] != 'empty') {
7077 // Ferme le tableau
7078 printf("</table>");
7079 // Ferme le div
7080 printf("</div>");
7081 }
7082 }
7083
7084 // Affiche le header du sous-groupe
7085 printf($sousgroupeHeader, $row['contrainte_sousgroupe']);
7086
7087 // Ouvre le tableau
7088 printf("<table id='sousgroupe_".$row['contrainte_sousgroupe']."' class='tab-tab dossier_contrainte_view'>");
7089
7090 // Affiche le header des données
7091 printf($tableHeader);
7092
7093 // Définis le style des lignes
7094 $style = 'odd';
7095 }
7096
7097 // Si toujours dans la même groupe et même sous-groupe,
7098 // on change le style de la ligne
7099 if ($row['contrainte_groupe'] == $lastRow['contrainte_groupe']
7100 && $row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']) {
7101 // Définis le style
7102 $style = ($style=='even')?'odd':'even';
7103 }
7104
7105 // Affiche "Oui" ou "Non" pour le bouléen
7106 if ($row['dossier_contrainte_reference'] == 1
7107 || $row['dossier_contrainte_reference'] == "t"
7108 || $row['dossier_contrainte_reference'] == "Oui") {
7109 //
7110 $contrainte_reference = "Oui";
7111 } else {
7112 //
7113 $contrainte_reference = "Non";
7114 }
7115
7116 // Affiche les données
7117 printf($line, $style,
7118 $row['dossier_contrainte_texte'],
7119 $contrainte_reference,
7120 $row['contrainte_nature']
7121 );
7122
7123 // Sauvegarde les données
7124 $lastRow['contrainte_groupe'] = $row['contrainte_groupe'];
7125 $lastRow['contrainte_sousgroupe'] = $row['contrainte_sousgroupe'];
7126
7127 }
7128 // Ferme le tableau
7129 printf("</table>");
7130 // Ferme le sous-groupe
7131 printf("</div>");
7132 // Ferme le groupe
7133 printf("</div>");
7134
7135 printf("</div>");
7136
7137 printf("<div class=\"visualClear\"></div>");
7138 // Ferme le fieldset content
7139 printf("</div>");
7140 printf("</fieldset>");
7141 }
7142 /**
7143 * Fin Liste des contraintes
7144 */
7145
7146 /**
7147 * Liste des demandeurs
7148 */
7149 // Tableau des demandeurs selon le contexte
7150 $listeDemandeur = $this->valIdDemandeur;
7151 /**
7152 * Gestion du bloc des demandeurs
7153 */
7154 // Si le mode est (modification ou suppression ou consultation) ET que
7155 // le formulaire n'est pas correct (c'est-à-dire que le formulaire est
7156 // actif)
7157 if ($this->correct !== true AND
7158 $this->getParameter('validation') == 0 AND
7159 $this->getParameter("maj") != 0) {
7160 // Alors on récupère les demandeurs dans la table lien pour
7161 // affectation des résultats dans $this->valIdDemandeur
7162 $this->listeDemandeur("dossier", $this->getval($this->clePrimaire));
7163 $listeDemandeur = $this->valIdDemandeur;
7164 }
7165
7166 // Récupération des valeurs postées
7167 if ($this->getParameter('validation') != 0) {
7168 $listeDemandeur = $this->postedIdDemandeur;
7169 }
7170
7171 // Si le mode est (ajout ou modification) ET que le formulaire n'est pas
7172 // correct (c'est-à-dire que le formulaire est actif)
7173 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
7174 // Alors on positionne le marqueur linkable a true qui permet
7175 // d'afficher ou non les actions de gestion des demandeurs
7176 $linkable = true;
7177 } else {
7178 // Sinon on positionne le marqueur linkable a false qui permet
7179 // d'afficher ou non les actions de gestion des demandeurs
7180 $linkable = false;
7181 }
7182 $affichage_form = $this->get_type_affichage_formulaire();
7183 // Pour les dossiers contentieux, il faut un droit spécifique pour visualiser le
7184 // fieldset "Demandeurs"
7185 if (($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE')
7186 OR ($affichage_form === 'CTX RE' AND $this->f->isAccredited('dossier_contentieux_recours_afficher_demandeurs') === true)
7187 OR ($affichage_form === 'CTX IN' AND $this->f->isAccredited('dossier_contentieux_infractions_afficher_demandeurs') === true)) {
7188
7189 // Conteneur de la listes des demandeurs
7190 echo "<div id=\"liste_demandeur\" class=\"demande_hidden_bloc col_12\">";
7191 echo "<fieldset id=\"fieldset-form-dossier_instruction-demandeur\" class=\"cadre ui-corner-all ui-widget-content startClosed\">";
7192 echo " <legend class=\"ui-corner-all ui-widget-content ui-state-active\">"
7193 ._("Demandeurs")."</legend>";
7194 echo "<div class=\"fieldsetContent\" style=\"display: none;\">";
7195
7196
7197 // Pour les DI avec DA visible, dans tous les modes excepté en ajout et si l'option d'accès au
7198 // portail citoyen est activée
7199 $inst_da = $this->get_inst_dossier_autorisation();
7200 if ($this->getParameter("maj") != 0
7201 && $this->f->is_option_citizen_access_portal_enabled() === true
7202 && $inst_da->is_dossier_autorisation_visible() === true) {
7203 // Instance du dossier d'autorisation
7204 //
7205 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'));
7206 }
7207 // Sélection des demandeur à afficher en fonction du paramétrage du type
7208 // du dossier d'autorisation.
7209 switch ($affichage_form) {
7210 case 'ADS':
7211 case 'CONSULTATION ENTRANTE':
7212 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7213 break;
7214 case 'CTX RE':
7215 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7216 $this->display_demandeur_requerant_avocat($listeDemandeur);
7217 break;
7218 case 'CTX IN':
7219 $this->display_demandeur_plaignant_contrevenant($listeDemandeur);
7220 break;
7221 case 'DPC':
7222 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
7223 $this->display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur);
7224 break;
7225 }
7226
7227 }
7228
7229 echo "</fieldset>";
7230 echo "</div>";
7231 /**
7232 * Fin liste des demandeurs
7233 */
7234
7235 /**
7236 * Interface avec le référentiel ERP.
7237 *
7238 * On affiche le message uniquement si le dossier est connecté.
7239 */
7240 if ($this->getParameter('maj') == 3 && $this->is_connected_to_referentiel_erp() === true) {
7241 //
7242 printf(
7243 '<div class="col_12">
7244 Ce dossier est connecté au référentiel ERP.
7245 </div>'
7246 );
7247 }
7248
7249 }
7250
7251 /**
7252 * Affiche le bloc d'affichage des demandeurs pour dossiers ADS avec actions.
7253 *
7254 * @param array $listeDemandeur Liste des demandeurs.
7255 */
7256 function display_demandeur_petitionnaire_delegataire($listeDemandeur) {
7257
7258 // Affichage du bloc pétitionnaire principal / délégataire
7259 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7260 echo "<div id=\"petitionnaire_principal_delegataire\">";
7261 // Affichage de la synthèse du pétitionnaire principal
7262 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire_principal");
7263 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7264 echo "<div id=\"delegataire\">";
7265 // Affichage de la synthèse du délégataire
7266 $this->displaySyntheseDemandeur($listeDemandeur, "delegataire");
7267 echo "</div>";
7268 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7269 echo "<div id=\"proprietaire\">";
7270 // Affichage de la synthèse du délégataire
7271 $this->displaySyntheseDemandeur($listeDemandeur, "proprietaire");
7272 echo "</div>";
7273 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7274 echo "<div id=\"architecte_lc\">";
7275 // Affichage de la synthèse du délégataire
7276 $this->displaySyntheseDemandeur($listeDemandeur, "architecte_lc");
7277 echo "</div>";
7278 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7279 echo "<div id=\"paysagiste\">";
7280 // Affichage de la synthèse du délégataire
7281 $this->displaySyntheseDemandeur($listeDemandeur, "paysagiste");
7282 echo "</div>";
7283 echo "<div class=\"both\"></div>";
7284 echo "</div>";
7285 // Bloc des pétitionnaires secondaires
7286 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7287 echo "<div id=\"listePetitionnaires\">";
7288 $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire");
7289 echo "</div>";
7290 }
7291
7292 /**
7293 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX recours
7294 * avec actions.
7295 *
7296 * @param array $listeDemandeur Liste des demandeurs.
7297 */
7298 function display_demandeur_plaignant_contrevenant($listeDemandeur) {
7299
7300 echo "<div id=\"plaignant_contrevenant\">";
7301 // Affichage du bloc contrevenant
7302 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7303 echo "<div id=\"listeContrevenants\" class=\"col_12\">";
7304 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7305 echo "<div id=\"contrevenant_principal\">";
7306 // Affichage de la synthèse
7307 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant_principal");
7308 echo "</div>";
7309 echo "<div id=\"listeAutresContrevenants\">";
7310 // Affichage de la synthèse
7311 $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant");
7312 echo "</div>";
7313 echo "</div>";
7314 // Affichage du bloc plaignant
7315 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7316 echo "<div id=\"listePlaignants\" class=\"col_12\">";
7317 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7318 echo "<div id=\"plaignant_principal\">";
7319 // Affichage de la synthèse
7320 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant_principal");
7321 echo "</div>";
7322 echo "<div id=\"listeAutresPlaignants\">";
7323 $this->displaySyntheseDemandeur($listeDemandeur, "plaignant");
7324 echo "</div>";
7325 echo "</div>";
7326 echo "</div>";
7327
7328 }
7329
7330 /**
7331 * Affiche le bloc d'affichage des demandeurs pour dossiers CTX infraction
7332 * avec actions.
7333 *
7334 * @param array $listeDemandeur Liste des demandeurs.
7335 */
7336 function display_demandeur_requerant_avocat($listeDemandeur) {
7337 echo "<div id=\"requerant_avocat\">";
7338 // Affichage du bloc requérant
7339 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7340 echo "<div id=\"listeRequerants\" class=\"col_12\">";
7341 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7342 echo "<div id=\"requerant_principal\">";
7343 // Affichage de la synthèse
7344 $this->displaySyntheseDemandeur($listeDemandeur, "requerant_principal");
7345 echo "</div>";
7346 echo "<div id=\"listeAutresRequerants\">";
7347 $this->displaySyntheseDemandeur($listeDemandeur, "requerant");
7348 echo "</div>";
7349 echo "</div>";
7350 // Affichage du bloc avocat
7351 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7352 echo "<div id=\"listeAvocat\" class=\"col_12\">";
7353 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7354 echo "<div id=\"avocat_principal\">";
7355 $this->displaySyntheseDemandeur($listeDemandeur, "avocat_principal");
7356 echo "</div>";
7357 echo "<div id=\"listeAutresAvocats\">";
7358 $this->displaySyntheseDemandeur($listeDemandeur, "avocat");
7359 echo "</div>";
7360 echo "</div>";
7361 echo "</div>";
7362 echo "</fieldset>";
7363 // Champ flag permettant de récupérer la valeur de l'option sig pour
7364 // l'utiliser en javascript, notamment lors du chargement de l'interface
7365 // pour les références cadastrales
7366 // XXX Si un widget pour les références cadastrales existait, il n'y
7367 // aurait pas besoin de faire cela
7368 echo "<input id='option_sig' type='hidden' value='".$this->f->getParameter("option_sig")."' name='option_sig'>";
7369 echo "</div>";
7370 }
7371
7372
7373 /**
7374 * Affiche le bloc d'affichage des demandeurs pour dossiers DPC avec actions.
7375 *
7376 * @param array $listeDemandeur Liste des demandeurs.
7377 */
7378 function display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur) {
7379
7380 // Affichage du bloc pétitionnaire principal / délégataire / bailleur
7381 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7382 echo "<div id=\"petitionnaire_principal_delegataire_bailleur\">";
7383 // Doit être utilisé avec la div petitionnaire_principal_delegataire
7384 echo "<div id=\"listeBailleurs\" class=\"col_12\">";
7385 // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7386 echo "<div id=\"bailleur_principal\">";
7387 // Affichage de la synthèse
7388 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur_principal");
7389 echo "</div>";
7390 echo "<div id=\"listeAutresBailleurs\">";
7391 $this->displaySyntheseDemandeur($listeDemandeur, "bailleur");
7392 echo "</div>";
7393 echo "</div>";
7394 echo "</div>";
7395 }
7396
7397
7398 function displaySyntheseDemandeur($listeDemandeur, $type) {
7399 // Si le mode est (ajout ou modification) ET que le formulaire n'est pas
7400 // correct (c'est-à-dire que le formulaire est actif)
7401 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
7402 // Alors on positionne le marqueur linkable a true qui permet
7403 // d'afficher ou non les actions de gestion des demandeurs
7404 $linkable = true;
7405 } else {
7406 // Sinon on positionne le marqueur linkable a false qui permet
7407 // d'afficher ou non les actions de gestion des demandeurs
7408 $linkable = false;
7409 }
7410 // Récupération du type de demandeur pour l'affichage
7411 switch ($type) {
7412 case 'petitionnaire_principal':
7413 $legend = _("Petitionnaire principal");
7414 break;
7415
7416 case 'delegataire':
7417 $legend = _("Autre correspondant");
7418 break;
7419
7420 case 'petitionnaire':
7421 $legend = _("Petitionnaire");
7422 break;
7423
7424 case 'contrevenant_principal':
7425 $legend = _("Contrevenant principal");
7426 break;
7427
7428 case 'contrevenant':
7429 $legend = _("Autre contrevenant");
7430 break;
7431
7432 case 'plaignant_principal':
7433 $legend = _("Plaignant principal");
7434 break;
7435
7436 case 'plaignant':
7437 $legend = _("Autre plaignant");
7438 break;
7439
7440 case 'requerant_principal':
7441 $legend = _("Requérant principal");
7442 break;
7443
7444 case 'requerant':
7445 $legend = _("Autre requérant");
7446 break;
7447
7448 case 'avocat_principal':
7449 $legend = _("Avocat principal");
7450 break;
7451
7452 case 'avocat':
7453 $legend = _("Autre avocat");
7454 break;
7455
7456 case 'bailleur_principal':
7457 $legend = _("Bailleur principal");
7458 break;
7459
7460 case 'bailleur':
7461 $legend = _("Bailleur");
7462 break;
7463
7464 case 'proprietaire':
7465 $legend = __("Propriétaire");
7466 break;
7467
7468 case 'architecte_lc':
7469 $legend = __("Architecte législation connexe");
7470 break;
7471
7472 case 'paysagiste':
7473 $legend = __("Concepteur-Paysagiste");
7474 break;
7475 }
7476 foreach ($listeDemandeur[$type] as $demandeur_id) {
7477 $obj = str_replace('_principal', '', $type);
7478 $demandeur = $this->f->get_inst__om_dbform(array(
7479 "obj" => $obj,
7480 "idx" => $demandeur_id,
7481 ));
7482 $demandeur -> afficherSynthese($type, $linkable);
7483 $demandeur -> __destruct();
7484 }
7485 // Si en édition de formulaire
7486 if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
7487 // Bouton d'ajout du avocat
7488 // L'ID DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
7489 echo "<a id=\"add_".$type."\"
7490 class=\"om-form-button add-16\">".
7491 $legend.
7492 "</a>";
7493 }
7494 }
7495 /**
7496 * Retourne le statut du dossier
7497 * @return string Le statut du dossier d'instruction
7498 */
7499 function getStatut(){
7500
7501 $statut = '';
7502
7503 $etat = $this->getVal("etat");
7504 //Si l'état du dossier d'instruction n'est pas vide
7505 if ( $etat != '' ){
7506
7507 $sql = "SELECT statut
7508 FROM ".DB_PREFIXE."etat
7509 WHERE etat ='".$etat."'";
7510 $statut = $this->f->db->getOne($sql);
7511 $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
7512 if ( database::isError($statut, true)){
7513 die();
7514 }
7515 }
7516 return $statut;
7517 }
7518
7519 /**
7520 * Retourne le dernier événement lié au dossier instancié
7521 *
7522 * @return [string] ID du dernier événement
7523 */
7524 function get_dernier_evenement() {
7525 $sql = "SELECT max(instruction)
7526 FROM ".DB_PREFIXE."instruction
7527 WHERE dossier = '".$this->getVal($this->clePrimaire)."'";
7528 $id_dernier_evenement = $this->f->db->getOne($sql);
7529 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
7530 $this->f->isDatabaseError($id_dernier_evenement);
7531 return $id_dernier_evenement;
7532 }
7533
7534 /**
7535 * Retourne l'identifiant du rapport d'instruction lié du dossier
7536 * @return string L'identifiant du rapport d'instruction lié du dossier
7537 */
7538 function getRapportInstruction() {
7539
7540 $rapport_instruction = null;
7541
7542 $sql = "SELECT rapport_instruction
7543 FROM ".DB_PREFIXE."rapport_instruction
7544 WHERE dossier_instruction ='".$this->getVal($this->clePrimaire)."'";
7545 $rapport_instruction = $this->f->db->getOne($sql);
7546 $this->f->addToLog(__METHOD__."() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
7547 $this->f->isDatabaseError($rapport_instruction);
7548
7549 return $rapport_instruction;
7550 }
7551
7552 /**
7553 * Retourne l'identifiant des données techniques liées du dossier
7554 * @return string L'identifiant des données techniques liées du dossier
7555 */
7556 function getDonneesTechniques() {
7557
7558 $donnees_techniques = '';
7559
7560 $sql = "SELECT donnees_techniques
7561 FROM ".DB_PREFIXE."donnees_techniques
7562 WHERE dossier_instruction ='".$this->getVal($this->clePrimaire)."'";
7563 $donnees_techniques = $this->f->db->getOne($sql);
7564 $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
7565 if ( database::isError($donnees_techniques)){
7566 die();
7567 }
7568
7569 return $donnees_techniques;
7570 }
7571
7572 /**
7573 * Surcharge du bouton retour afin de retourner sur la recherche de dossiers
7574 * d'instruction existant
7575 */
7576 function retour($premier = 0, $recherche = "", $tricol = "") {
7577
7578 echo "\n<a class=\"retour\" ";
7579 echo "href=\"";
7580 //
7581 if($this->getParameter("idx_dossier") != "") {
7582 echo OM_ROUTE_TAB;
7583 echo "&obj=recherche_dossier";
7584
7585 } else {
7586 if($this->getParameter("retour")=="form" AND !($this->getParameter("validation")>0 AND $this->getParameter("maj")==2 AND $this->correct)) {
7587 echo OM_ROUTE_FORM;
7588 } else {
7589 echo OM_ROUTE_TAB;
7590 }
7591 if ($this->f->get_submitted_get_value('retour_widget') !== null) {
7592 echo "&obj=".$this->f->get_submitted_get_value('retour_widget');
7593 } else {
7594 echo "&obj=".$this->get_absolute_class_name();
7595 }
7596 if ($this->f->get_submitted_get_value('widget_recherche_id') !== null) {
7597 echo "&widget_recherche_id=".$this->f->get_submitted_get_value('widget_recherche_id');
7598 }
7599 if ($this->f->get_submitted_get_value('retourformulaire2') !== null && $this->f->get_submitted_get_value('retourformulaire2') != '') {
7600 echo "&retourformulaire=".$this->f->get_submitted_get_value('retourformulaire2');
7601 }
7602 if($this->getParameter("retour")=="form") {
7603 $idx = $this->getParameter("idx");
7604 echo "&amp;idx=".$idx;
7605 echo "&amp;action=3";
7606 }
7607 }
7608 echo "&amp;premier=".$this->getParameter("premier");
7609 echo "&amp;tricol=".$this->getParameter("tricol");
7610 echo "&amp;advs_id=".$this->getParameter("advs_id");
7611 echo "&amp;valide=".$this->getParameter("valide");
7612 // Si on vient d'un widget de recherche paramétrable avec un message d'aide paramétré
7613 if ($this->f->get_submitted_get_value("message_help") !== null && $this->f->get_submitted_get_value("message_help") !== "") {
7614 // On ajoute le message d'aide dans l'url de retour
7615 echo "&amp;message_help=".urlencode($this->f->get_submitted_get_value("message_help"));
7616 }
7617 //
7618 echo "\"";
7619 echo ">";
7620 //
7621 echo _("Retour");
7622 //
7623 echo "</a>\n";
7624
7625 }
7626
7627 /**
7628 * Permet de modifier le fil d'Ariane
7629 * @param string $ent Fil d'Ariane
7630 * @param array $val Valeurs de l'objet
7631 * @param intger $maj Mode du formulaire
7632 */
7633 function getFormTitle($ent) {
7634
7635 // Fil d'Ariane
7636 $type_aff_form = $this->get_type_affichage_formulaire();
7637 switch ($type_aff_form) {
7638 case 'DPC':
7639 case 'ADS':
7640 $ent = _("instruction")." -> "._("dossiers d'instruction");
7641 break;
7642 case 'CTX IN':
7643 $ent = _("contentieux")." -> "._("infraction");
7644 break;
7645 case 'CTX RE':
7646 $ent = _("contentieux")." -> "._("recours");
7647 break;
7648 case 'CONSULTATION ENTRANTE':
7649 $ent = __("instruction")." -> ".__("dossiers de consultation");
7650 }
7651
7652 // Si différent de l'ajout
7653 if($this->getParameter("maj") != 0) {
7654 // Si le champ dossier_libelle existe
7655 if (trim($this->getVal("dossier_libelle")) != '') {
7656 $ent .= " -> ".strtoupper($this->getVal("dossier_libelle"));
7657 }
7658 // Si contexte ADS
7659 if ($type_aff_form ==='ADS'
7660 && trim($this->getVal("dossier")) != '') {
7661 $demandeur = $this->get_demandeur($this->getVal("dossier"));
7662 // Si le demandeur existe
7663 if (isset($demandeur) && trim($demandeur) != '') {
7664 $ent .= " ".mb_strtoupper($demandeur, "UTF-8");
7665 }
7666 }
7667
7668 // Dans le cas d'un dossier d'instruction issu d'un dépôt électronique
7669 // applique un style spécifique sur le fil d'Arianne
7670 if ($this->getVal('depot_electronique') === 't') {
7671 $this->f->addStyleForTitle("demat-color-breadcrumb");
7672 }
7673 }
7674
7675 // Change le fil d'Ariane pour l'interface de géolocalisation automatique des DI
7676 if ($this->getParameter("maj") == 126) {
7677 $ent = _("administration")." -> "._("options avancées")." -> "._("Géolocalisation des dossiers");
7678 }
7679
7680 // Change le fil d'Ariane
7681 return $ent;
7682 }
7683
7684 /**
7685 * Récupère le demandeur du dossier
7686 * @return string Identifiant du dossier
7687 */
7688 private function get_demandeur($dossier) {
7689
7690 // init de la variable de retour
7691 $demandeur = '';
7692
7693 // Requête SQL
7694 $sql = "SELECT
7695 CASE WHEN demandeur.qualite='particulier'
7696 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
7697 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
7698 END as demandeur
7699 FROM ".DB_PREFIXE."dossier
7700 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
7701 ON lien_dossier_demandeur.dossier=dossier.dossier
7702 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7703 LEFT JOIN ".DB_PREFIXE."demandeur
7704 ON lien_dossier_demandeur.demandeur=demandeur.demandeur
7705 WHERE dossier.dossier ='".$dossier."'";
7706 $demandeur = $this->f->db->getOne($sql);
7707 $this->f->addToLog("get_demandeur() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
7708 database::isError($demandeur);
7709
7710 // Résultat retourné
7711 return $demandeur;
7712 }
7713
7714 /**
7715 * Récupère la durée de validité
7716 * @param string $dossier_autorisation Identifiant dossier d'autorisation
7717 * @return intger Durée de validité
7718 */
7719 function get_duree_validite($dossier_autorisation, $force_param = false) {
7720
7721 // init de la variable de retour
7722 $duree_validite = "";
7723
7724 // Récupère le numéro de version
7725 $numeroVersion = $this->getNumeroVersion($dossier_autorisation);
7726
7727 // Si c'est l'ajout du dossier initial
7728 if ($numeroVersion < 0 || $force_param === true) {
7729
7730 // Récupération de la duree de validite depuis la table
7731 // "dossier_autorisation_type_detaille"
7732 $sql = "SELECT duree_validite_parametrage
7733 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
7734 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7735 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7736 WHERE dossier_autorisation.dossier_autorisation='".$dossier_autorisation."'";
7737 $duree_validite = $this->f->db->getOne($sql);
7738 $this->f->addToLog("get_duree_validite(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
7739 database::isError($duree_validite);
7740
7741 } else {
7742
7743 // Récupération de la duree de validite depuis le P0
7744 $sql = "SELECT duree_validite
7745 FROM ".DB_PREFIXE."dossier
7746 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7747 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
7748 WHERE dossier_autorisation.dossier_autorisation='".$dossier_autorisation."'
7749 AND dossier.version = 0";
7750 $duree_validite = $this->f->db->getOne($sql);
7751 $this->f->addToLog("get_duree_validite(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
7752 database::isError($duree_validite);
7753 }
7754
7755 // retourne le résultat
7756 return $duree_validite;
7757
7758 }
7759
7760 /**
7761 * Ajoute les parcelles du dossier passé en paramètre et met à jour le
7762 * quartier du dossier.
7763 * @param string $dossier Identifiant du dossier
7764 * @param string $terrain_references_cadastrales Références cadastrales du
7765 * dossier
7766 */
7767 function ajouter_dossier_parcelle($dossier, $terrain_references_cadastrales) {
7768
7769 // Parse les parcelles
7770 $list_parcelles = $this->f->parseParcelles($terrain_references_cadastrales, $this->getVal('om_collectivite'));
7771
7772 // A chaque parcelle une nouvelle ligne est créée dans la table
7773 // dossier_parcelle
7774 foreach ($list_parcelles as $parcelle) {
7775
7776 // Instance de la classe dossier_parcelle
7777 $dossier_parcelle = $this->f->get_inst__om_dbform(array(
7778 "obj" => "dossier_parcelle",
7779 "idx" => "]",
7780 ));
7781
7782 // Valeurs à sauvegarder
7783 $value = array(
7784 'dossier_parcelle' => '',
7785 'dossier' => $dossier,
7786 'parcelle' => '',
7787 'libelle' => $parcelle['quartier']
7788 .$parcelle['section']
7789 .$parcelle['parcelle']
7790 );
7791
7792 // Ajout de la ligne
7793 $dossier_parcelle->ajouter($value);
7794 }
7795
7796 // Si la liste des parcelles n'est pas vide
7797 if (count($list_parcelles) > 0) {
7798
7799 // Récupère le code impôt de la première référence cadastrale
7800 $quartier_code_impots = $list_parcelles[0]['quartier'];
7801 // Récupère l'identifiant du quartier
7802 $quartier = $this->get_quartier_by_code_impot($quartier_code_impots);
7803
7804 // Ajoute le quartier au dossier
7805 $this->modifier_quartier_dossier($dossier, $quartier);
7806 }
7807 }
7808
7809 /**
7810 * Supprime les parcelles du dossier passé en paramètre et met à jour le
7811 * quartier du dossier.
7812 * @param string $dossier Identifiant du dossier
7813 */
7814 function supprimer_dossier_parcelle($dossier) {
7815
7816 // Suppression des parcelles du dossier
7817 $sql = "DELETE FROM ".DB_PREFIXE."dossier_parcelle
7818 WHERE dossier='".$dossier."'";
7819 $res = $this->f->db->query($sql);
7820 $this->addToLog("supprimer_dossier_parcelle() db->query(\"".$sql."\");",
7821 VERBOSE_MODE);
7822 database::isError($res);
7823
7824 // Supprime le quartier dans dossier
7825 $this->modifier_quartier_dossier($dossier);
7826 }
7827
7828 /**
7829 * Modifie le quartier au dossier.
7830 * @param string $dossier Numéro du dossier
7831 * @param integer $quartier Identifiant du quartier
7832 */
7833 function modifier_quartier_dossier($dossier, $quartier = null) {
7834
7835 // Valeurs à mettre à jour
7836 $valF = array();
7837 $valF['quartier'] = $quartier;
7838
7839 // Met à jour le quartier du dossier
7840 $cle = " dossier='".$dossier."'";
7841 $res = $this->f->db->autoExecute(
7842 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
7843 $this->addToLog("ajouter_quartier_dossier(): db->autoexecute(\""
7844 .DB_PREFIXE."dossier\", ".print_r($valF, true)
7845 .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
7846 $this->f->isDatabaseError($res);
7847 }
7848
7849 /**
7850 * Récupère le quartier par rapport au code impôts.
7851 * @param string $code_impots Code impôts du quartier
7852 *
7853 * @return integer Identifiant du quartier
7854 */
7855 function get_quartier_by_code_impot($code_impots) {
7856
7857 // Initialisation résultat
7858 $quartier = null;
7859
7860 // Si la condition n'est pas vide
7861 if ($code_impots != ""
7862 && $code_impots != null) {
7863
7864 // Requête SQL
7865 $sql = "SELECT quartier
7866 FROM ".DB_PREFIXE."quartier
7867 WHERE code_impots = '".$code_impots."'";
7868 $this->f->addToLog(
7869 "get_quartier_by_code_impots() : db->getOne(\"".$sql."\")",
7870 VERBOSE_MODE);
7871 $quartier = $this->f->db->getOne($sql);
7872 $this->f->isDatabaseError($quartier);
7873 }
7874
7875 // Retourne résultat
7876 return $quartier;
7877 }
7878
7879 /**
7880 * TREATMENT - update_initial_dt.
7881 *
7882 * Cette méthode ajoute les données techniques initiales d'un DI au format JSON.
7883 *
7884 * @return boolean
7885 */
7886 public function update_initial_dt($dt_json) {
7887 //
7888 $this->begin_treatment(__METHOD__);
7889 //
7890 if ($dt_json === null || $dt_json === '') {
7891 return $this->end_treatment(__METHOD__, false);
7892 }
7893 //
7894 $this->correct = true;
7895 $data = array();
7896 $data["initial_dt"] = $dt_json;
7897 //
7898 $res = $this->f->db->autoExecute(
7899 sprintf('%s%s', DB_PREFIXE, $this->table),
7900 $data,
7901 DB_AUTOQUERY_UPDATE,
7902 sprintf("%s = '%s'", $this->clePrimaire, $this->valF[$this->clePrimaire])
7903 );
7904 $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);
7905 if ($this->f->isDatabaseError($res, true) === true) {
7906 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
7907 $this->correct = false;
7908 return $this->end_treatment(__METHOD__, false);
7909 }
7910 return $this->end_treatment(__METHOD__, true);
7911 }
7912
7913
7914
7915 /**
7916 * Méthode permettant d'ajouter les données techniques d'un DI.
7917 *
7918 * @param integer $id identifiant de la demande
7919 * @param array $val tableau de valeurs postées via le formulaire
7920 *
7921 * @return boolean false si erreur
7922 */
7923 function ajoutDonneesTechniquesDI($id, $val) {
7924
7925 //On vérifie que le dossier d'autorisation a des données techniques
7926 $sql = "SELECT * "
7927 ."FROM ".DB_PREFIXE."donnees_techniques "
7928 ."WHERE dossier_autorisation = '".$this->valF["dossier_autorisation"]."'";
7929 $dtda = $this->f->db->query($sql);
7930 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
7931 if($this->f->isDatabaseError($dtda, true)){
7932 $this->f->addToLog(__METHOD__."() : ERROR - Erreur de base de données. Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
7933 return false;
7934 }
7935
7936 //Si le dossier d'autorisation a des données techniques
7937 if ( $dtda->numrows() == 1 ){
7938 //
7939 $dtdi = $this->f->get_inst__om_dbform(array(
7940 "obj" => "donnees_techniques",
7941 "idx" => "]",
7942 ));
7943 //Préparation des données
7944 $valF = $dtda->fetchRow(DB_FETCHMODE_ASSOC);
7945
7946 //Sauvegarde des données techniques initiales
7947 //Conversion en JSON
7948 $dt_json = json_encode($valF);
7949
7950 //Enregistrement en BDD
7951 $sauvegarde_bdd = $this->update_initial_dt($dt_json);
7952
7953 //Gestion des erreurs
7954 if ($sauvegarde_bdd === false){
7955 $msg_error = __("Erreur de base de données. Impossible de sauvegarder les données techniques du dossier d'instruction au format JSON.");
7956 $this->f->addToLog(sprintf(
7957 "%s() : ERREUR - %s",
7958 __METHOD__,
7959 $msg_error
7960 ));
7961 $this->addToMessage(sprintf(
7962 "%s %s",
7963 $msg_error,
7964 __("Veuillez contacter votre administrateur.")
7965 ));
7966
7967 return false;
7968 }
7969
7970 //Suppression de l'identifiant
7971 $valF["donnees_techniques"] = null;
7972 // Ajout du numéro de dossier d'instruction
7973 $valF['dossier_instruction'] = $this->valF['dossier'];
7974 // Suppression du numéro de dossier d'autorisation
7975 $valF['dossier_autorisation'] = null;
7976 // Ajout des données techniques
7977 if($dtdi->ajouter($valF) === false) {
7978 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
7979 return false;
7980 }
7981 }
7982 else {
7983 //Le dossier d'autorisation n'a pas de données techniques
7984 $this->f->addToLog(__METHOD__."() : ERROR - le DA n'a pas de données techniques.", DEBUG_MODE);
7985 return -1;
7986 }
7987
7988 //
7989 return true;
7990 }
7991
7992 /**
7993 * VIEW - contrainte.
7994 *
7995 * Vue des contraintes du dossier
7996 *
7997 * Cette vue permet de gérer le contenu de l'onglet "Contrainte(s)" sur un
7998 * dossier. Cette vue spécifique est nécessaire car l'ergonomie standard du
7999 * framework ne prend pas en charge ce cas.
8000 * C'est ici la vue spécifique des contraintes liées au dossier qui est
8001 * affichée directement au clic de l'onglet au lieu du soustab.
8002 *
8003 * L'idée est donc de simuler l'ergonomie standard en créant un container
8004 * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
8005 * de la vue visualisation de l'objet lié.
8006 *
8007 * @return void
8008 */
8009 function view_contrainte() {
8010 // Vérification de l'accessibilité sur l'élément
8011 $this->checkAccessibility();
8012 // Récupération des variables GET
8013 ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
8014 $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
8015 ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
8016 $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
8017 $obj = "dossier_contrainte";
8018 $type_aff_form = $this->get_type_affichage_formulaire();
8019 if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
8020 $obj = "dossier_contrainte_contexte_ctx";
8021 }
8022 // Objet à charger
8023 // Construction de l'url de sousformulaire à appeler
8024 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
8025 $url .= "&action=4";
8026 $url .= "&idx=".$idxformulaire;
8027 $url .= "&retourformulaire=".$retourformulaire;
8028 $url .= "&idxformulaire=".$idxformulaire;
8029 $url .= "&retour=form";
8030 // Affichage du container permettant le reffraichissement du contenu
8031 // dans le cas des action-direct.
8032 printf('
8033 <div id="sousform-href" data-href="%s">
8034 </div>',
8035 $url
8036 );
8037 // Affichage du container permettant de charger le retour de la requête
8038 // ajax récupérant le sous formulaire.
8039 printf('
8040 <div id="sousform-%s">
8041 </div>
8042 <script>
8043 ajaxIt(\'%s\', \'%s\');
8044 </script>',
8045 $obj,
8046 $obj,
8047 $url
8048 );
8049 }
8050
8051 /**
8052 * Cette methode permet d'afficher le bouton de validation du formulaire
8053 *
8054 * @param integer $maj Mode de mise a jour
8055 * @return void
8056 */
8057 function bouton($maj) {
8058
8059 if (!$this->correct
8060 && $this->checkActionAvailability() == true) {
8061 //
8062 switch($maj) {
8063 case 0 :
8064 $bouton = _("Ajouter");
8065 break;
8066 case 1 :
8067 $bouton = _("Modifier");
8068 break;
8069 case 2 :
8070 $bouton = _("Supprimer");
8071 break;
8072 default :
8073 // Actions specifiques
8074 if ($this->get_action_param($maj, "button") != null) {
8075 //
8076 $bouton = $this->get_action_param($maj, "button");
8077 } else {
8078 //
8079 $bouton = _("Valider");
8080 }
8081 break;
8082 }
8083 //
8084 $params = array(
8085 "value" => $bouton,
8086 "name" => "submit",
8087 "onclick"=>"return getDataFieldReferenceCadastrale();",
8088 );
8089 //
8090 $this->f->layout->display_form_button($params);
8091 }
8092
8093 }
8094
8095 /**
8096 * Récupère l'instance de paramétrage des taxes.
8097 *
8098 * @param integer $taxe_amenagement Identifiant
8099 *
8100 * @return object
8101 */
8102 function get_inst_taxe_amenagement($taxe_amenagement = null) {
8103 //
8104 if ($this->inst_taxe_amenagement === null) {
8105 //
8106 if ($taxe_amenagement === null) {
8107 //
8108 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($this->getVal('om_collectivite'));
8109
8110 // Si aucun paramétrage de taxe trouvé et que la collectivité
8111 // est mono
8112 if ($taxe_amenagement === null
8113 && $this->f->isCollectiviteMono($this->getVal('om_collectivite')) === true) {
8114 // Récupère la collectivité multi
8115 $om_collectivite_multi = $this->f->get_idx_collectivite_multi();
8116 //
8117 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($om_collectivite_multi);
8118 }
8119
8120 //
8121 if ($taxe_amenagement === null) {
8122 //
8123 return null;
8124 }
8125 }
8126 //
8127 $this->inst_taxe_amenagement = $this->f->get_inst__om_dbform(array(
8128 "obj" => "taxe_amenagement",
8129 "idx" => $taxe_amenagement,
8130 ));
8131 }
8132 //
8133 return $this->inst_taxe_amenagement;
8134 }
8135
8136 /**
8137 * Récupère l'identifiant de la taxe d'aménagement par rapport à la collectivité.
8138 *
8139 * @param integer $om_collectivite La collectivité
8140 *
8141 * @return integer
8142 */
8143 function get_taxe_amenagement_by_om_collectivite($om_collectivite) {
8144 //
8145 $taxe_amenagement = null;
8146
8147 // Si la collectivité n'est pas renseigné
8148 if ($om_collectivite !== '' && $om_collectivite !== null) {
8149
8150 // SQL
8151 $sql = "SELECT taxe_amenagement
8152 FROM ".DB_PREFIXE."taxe_amenagement
8153 WHERE om_collectivite = ".intval($om_collectivite);
8154 $taxe_amenagement = $this->f->db->getOne($sql);
8155 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
8156 $this->f->isDatabaseError($taxe_amenagement);
8157 }
8158
8159 //
8160 return $taxe_amenagement;
8161 }
8162
8163 /**
8164 * [get_inst_donnees_techniques description]
8165 *
8166 * @param [type] $donnees_techniques [description]
8167 *
8168 * @return [type] [description]
8169 */
8170 function get_inst_donnees_techniques($donnees_techniques = null) {
8171 //
8172 if (is_null($this->inst_donnees_techniques)) {
8173 //
8174 if (is_null($donnees_techniques)) {
8175 $donnees_techniques = $this->getDonneesTechniques();
8176 }
8177 //
8178 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
8179 "obj" => "donnees_techniques",
8180 "idx" => $donnees_techniques,
8181 ));
8182 }
8183 //
8184 return $this->inst_donnees_techniques;
8185 }
8186
8187
8188 /**
8189 * TODO: replace with '$this->f->findObjectById' ?
8190 *
8191 * Récupère l'instance du dossier d'autorisation.
8192 *
8193 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
8194 *
8195 * @return object
8196 */
8197 function get_inst_dossier_autorisation($dossier_autorisation = null) {
8198 //
8199 return $this->get_inst_common("dossier_autorisation", $dossier_autorisation);
8200 }
8201
8202
8203 /**
8204 * Récupère l'instance du dossier d'autorisation, puis la clé d'accès au portail
8205 * citoyen associée à ce DA.
8206 *
8207 * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
8208 *
8209 * @return string $cle_acces_citoyen si la clé d'accès existe
8210 * boolean false si la clé n'existe pas
8211 */
8212 protected function get_citizen_access_key($dossier_autorisation = null) {
8213 //
8214 $inst_da = $this->get_inst_dossier_autorisation($dossier_autorisation);
8215 // Récupération de la valeur de la clé d'accès
8216 $cle_acces_citoyen = $inst_da->getVal('cle_acces_citoyen');
8217 if ($cle_acces_citoyen === '' OR $cle_acces_citoyen === null) {
8218 return false;
8219 }
8220 return $cle_acces_citoyen;
8221 }
8222
8223
8224 /**
8225 * Récupère l'instance du type détaillé du dossier d'autorisation.
8226 *
8227 * @param integer $dossier_autorisation_type_detaille Identifiant
8228 *
8229 * @return object
8230 */
8231 function get_inst_dossier_autorisation_type_detaille($dossier_autorisation_type_detaille = null) {
8232 //
8233 if (is_null($this->inst_dossier_autorisation_type_detaille)) {
8234 //
8235 if (is_null($dossier_autorisation_type_detaille)) {
8236 //
8237 $dossier_autorisation = $this->get_inst_dossier_autorisation();
8238 //
8239 $dossier_autorisation_type_detaille = $dossier_autorisation->getVal('dossier_autorisation_type_detaille');
8240 }
8241 //
8242 $this->inst_dossier_autorisation_type_detaille = $this->f->get_inst__om_dbform(array(
8243 "obj" => "dossier_autorisation_type_detaille",
8244 "idx" => $dossier_autorisation_type_detaille,
8245 ));
8246 }
8247 //
8248 return $this->inst_dossier_autorisation_type_detaille;
8249 }
8250
8251 /**
8252 * Récupère l'instance du cerfa
8253 *
8254 * @param integer $cerfa Identifiant du cerfa
8255 *
8256 * @return object
8257 */
8258 function get_inst_cerfa($cerfa = null) {
8259 //
8260 if (is_null($this->inst_cerfa)) {
8261 //
8262 if (is_null($cerfa)) {
8263 //
8264 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
8265 //
8266 $cerfa = $dossier_autorisation_type_detaille->getVal('cerfa');
8267 }
8268 //
8269 $this->inst_cerfa = $this->f->get_inst__om_dbform(array(
8270 "obj" => "cerfa",
8271 "idx" => $cerfa,
8272 ));
8273 }
8274 //
8275 return $this->inst_cerfa;
8276 }
8277
8278 /**
8279 * CONDITION - is_user_from_allowed_collectivite.
8280 *
8281 * Cette condition permet de vérifier si l'utilisateur connecté appartient
8282 * à une collectivité autorisée : c'est-à-dire de niveau 2 ou identique à
8283 * la collectivité de l'enregistrement sur lequel on se trouve.
8284 *
8285 * @return boolean
8286 */
8287 function is_user_from_allowed_collectivite() {
8288
8289 // Si l'utilisateur est de niveau 2
8290 if ($_SESSION["niveau"] == "2") {
8291 // Alors l'utilisateur fait partie d'une collectivité autorisée
8292 return true;
8293 }
8294
8295 // L'utilisateur est donc de niveau 1
8296 // On vérifie donc si la collectivité de l'utilisateur est la même
8297 // que la collectivité de l'élément sur lequel on se trouve
8298 if ($_SESSION["collectivite"] === $this->getVal("om_collectivite")) {
8299 // Alors l'utilisateur fait partie d'une collectivité autorisée
8300 return true;
8301 }
8302
8303 // L'utilisateur ne fait pas partie d'une collectivité autorisée
8304 return false;
8305 }
8306
8307 /**
8308 * Création ou mise à jour du répertoire de numérisation.
8309 *
8310 * L'objet de cette méthode est la création ou la mise à jour de la date de
8311 * modification du répertoire de numérisation destiné à recevoir les pièces
8312 * numérisées pour un import automatique.
8313 * À chaque saisie d'une nouvelle demande dans openADS, le répertoire est
8314 * soit créé soit mis à jour pour être disponible en dehors d'openADS
8315 * (point de montage sur le serveur) pour permettre de déposer les pièces
8316 * numérisées directement depuis le copieur. À intervalle régulier, un
8317 * service vérifie le contenu de ces répertoire pour importer
8318 * automatiquement ces fichiers dans l'onglet 'Pièce(s)' du dossier
8319 * concerné.
8320 * La mise à jour de la date de modification est importante pour réaliser
8321 * la purge des répertoires vides sur la base de la date de la dernière
8322 * demande qui concerne le dossier.
8323 *
8324 * @return boolean
8325 */
8326 function create_or_touch_digitalization_folder() {
8327
8328 // Nom du répertoire
8329 // Le répertoire créé possède comme nom le libellé du dossier avec
8330 // le suffixe séparé par un '.'. Exemple : PC0130551601234.P0
8331 $separateur = '';
8332 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
8333 $separateur = '.';
8334 }
8335
8336 $digitalization_folder_name = str_replace(
8337 $this->getVal("dossier_autorisation"),
8338 $this->getVal("dossier_autorisation").$separateur,
8339 $this->getVal($this->clePrimaire)
8340 );
8341
8342 // Vérifie que l'option de numérisation des dossiers est désactivée
8343 if ($this->f->is_option_digitalization_folder_enabled() !== true) {
8344 //
8345 $this->addToLog(
8346 _("L'option de numerisation des dossiers n'est pas activee").".",
8347 DEBUG_MODE
8348 );
8349 return false;
8350 }
8351
8352 // Vérifie le paramétrage du répertoire de numérisation
8353 if ($this->f->getParameter("digitalization_folder_path") === null) {
8354 //
8355 $this->addToLog(
8356 "Configuration du répertoire de numérisation incorrecte.",
8357 DEBUG_MODE
8358 );
8359 return false;
8360 }
8361
8362 // Répertoire cible
8363 $root_folder_path = $this->f->getParameter("digitalization_folder_path");
8364
8365 // Vérifie que le répertoire existe
8366 if (is_dir($root_folder_path) !== true) {
8367 //
8368 $this->addToLog(
8369 sprintf(
8370 "Le répertoire '%s' n'existe pas.",
8371 $root_folder_path
8372 ),
8373 DEBUG_MODE
8374 );
8375 return false;
8376 }
8377
8378 // Répertoire des "à traiter"
8379 $todo_folder_path = $root_folder_path."Todo/";
8380
8381 // Vérifie que le répertoire existe
8382 if (is_dir($todo_folder_path) !== true) {
8383 //
8384 $this->addToLog(
8385 sprintf(
8386 "Le répertoire '%s' n'existe pas.",
8387 $todo_folder_path
8388 ),
8389 DEBUG_MODE
8390 );
8391 return false;
8392 }
8393
8394 // Répertoire de numérisation.
8395 $digitalization_folder_path = $todo_folder_path.$digitalization_folder_name;
8396
8397 // Si le répertore existe déjà le répertoire n'est pas créé
8398 if (file_exists($digitalization_folder_path) == true) {
8399 // Mise à jour du répertoire
8400 if (touch($digitalization_folder_path) !== true) {
8401 // Si une erreur survient
8402 $this->addToLog(
8403 sprintf(
8404 "Erreur lors de la mise à jour du répertoire '%s'.",
8405 $digitalization_folder_path
8406 ),
8407 DEBUG_MODE
8408 );
8409 return false;
8410 }
8411 //
8412 return true;
8413 } else {
8414 // Création du répertoire
8415 if (mkdir($digitalization_folder_path) !== true) {
8416 //
8417 $this->addToLog(
8418 sprintf(
8419 "Erreur lors de la création du répertoire '%s'.",
8420 $digitalization_folder_path
8421 ),
8422 DEBUG_MODE
8423 );
8424 return false;
8425 }
8426 //
8427 return true;
8428 }
8429 }
8430
8431 /**
8432 * Récupère, convertit et retourne les logs de toutes les instructions
8433 *
8434 * @return array tableau indexé de logs
8435 */
8436 public function get_log_instructions() {
8437 $log_instructions = $this->getVal('log_instructions');
8438 // Gestion du premier log
8439 if ($log_instructions === '') {
8440 $log_instructions = json_encode(array());
8441 }
8442 // Gestion du log invalide
8443 if(!$this->isJson($log_instructions)) {
8444 return false;
8445 }
8446 return json_decode($log_instructions, true);
8447 }
8448
8449 /**
8450 * Ajoute un log d'instruction aux logs existants
8451 *
8452 * @param array $log valeurs de l'instruction
8453 * @return bool vrai si traitement effectué avec succès
8454 */
8455 public function add_log_instructions($log) {
8456 // Begin
8457 $this->begin_treatment(__METHOD__);
8458 // Ajout du log
8459 $log_instructions = $this->get_log_instructions();
8460 if ($log_instructions === false) {
8461 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
8462 return $this->end_treatment(__METHOD__, false);
8463 }
8464 array_push($log_instructions, $log);
8465 $log_instructions = json_encode($log_instructions);
8466 // Mise à jour du DI
8467 $val = array("log_instructions"=>$log_instructions);
8468 $ret = $this->f->db->autoExecute(
8469 DB_PREFIXE."dossier",
8470 $val,
8471 DB_AUTOQUERY_UPDATE,
8472 "dossier = '".$this->getVal('dossier')."'");
8473 if (database::isError($ret, true)) {
8474 $this->erreur_db($ret->getDebugInfo(), $ret->getMessage(), 'dossier');
8475 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
8476 return $this->end_treatment(__METHOD__, false);
8477 }
8478 return $this->end_treatment(__METHOD__, true);
8479 }
8480
8481 /**
8482 * TREATMENT - mark_as_connected_to_referentiel_erp.
8483 *
8484 * Cette méthode permet de positionner le marqueur
8485 * 'interface_referentiel_erp' à 'true'. Cela signifie que le dossier est
8486 * connecté au référentiel ERP.
8487 *
8488 * @return boolean
8489 */
8490 function mark_as_connected_to_referentiel_erp() {
8491 //
8492 $this->begin_treatment(__METHOD__);
8493 //
8494 $data = array("interface_referentiel_erp" => true, );
8495 // Exécution de la requête
8496 $res = $this->f->db->autoExecute(
8497 DB_PREFIXE.$this->table,
8498 $data,
8499 DB_AUTOQUERY_UPDATE,
8500 $this->getCle($this->getVal($this->clePrimaire))
8501 );
8502 // Logger
8503 $this->addToLog(
8504 __METHOD__."(): db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");",
8505 VERBOSE_MODE
8506 );
8507 //
8508 if ($this->f->isDatabaseError($res, true)) {
8509 // Appel de la methode de recuperation des erreurs
8510 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
8511 $this->correct = false;
8512 $this->addToLog(
8513 __METHOD__."(): Problème erreur lors de la mise à jour du dossier",
8514 DEBUG_MODE
8515 );
8516 // Termine le traitement
8517 return $this->end_treatment(__METHOD__, false);
8518 }
8519 //
8520 $this->addToMessage(_("Le dossier est désormais 'connecté avec le référentiel ERP'."));
8521 return $this->end_treatment(__METHOD__, true);
8522 }
8523
8524 /**
8525 * CONDITION - is_connected_to_referentiel_erp.
8526 *
8527 * @return boolean
8528 */
8529 function is_connected_to_referentiel_erp() {
8530 //
8531 if ($this->getVal("interface_referentiel_erp") !== "t") {
8532 return false;
8533 }
8534 //
8535 return true;
8536 }
8537
8538
8539 /**
8540 * Retourne les données techniques applicables au dossier courant, càd les données
8541 * techniques liées au dossier avec seulement les champs du CERFA associé au type de
8542 * dossier.
8543 *
8544 * @return array $donnees_techniques_applicables Tableau associatif contenant
8545 * seulement les données techniques
8546 * applicables au dossier.
8547 */
8548 public function get_donnees_techniques_applicables() {
8549
8550 // Récupération de l'identifiant des données techniques liées au dossier
8551 $donnees_techniques = $this->getDonneesTechniques();
8552
8553 $inst_donnees_techniques = $this->get_inst_common('donnees_techniques', $donnees_techniques);
8554 $donnees_techniques_applicables = $inst_donnees_techniques->get_donnees_techniques_applicables();
8555 //
8556 return $donnees_techniques_applicables;
8557
8558 }
8559
8560
8561 /**
8562 * Retourne un tableau avec les données du dossier d'instruction.
8563 *
8564 * L'objectif est de mettre à disposition via un WS REST un ensemble
8565 * de données exploitable par une autre application.
8566 */
8567 function get_datas() {
8568
8569 /**
8570 *
8571 */
8572
8573 // TODO: replace '$this->get_inst_common' with '$this->f->findObjectById' ?
8574 $om_collectivite = $this->get_inst_common('om_collectivite', $this->getVal('om_collectivite'));
8575 $instructeur = $this->get_inst_common('instructeur', $this->getVal('instructeur'));
8576 $division = $this->get_inst_common('division', $this->getVal('division'));
8577 $etat = $this->get_inst_common('etat', $this->getVal('etat'));
8578 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
8579 $dossier_autorisation_type = $this->get_inst_common('dossier_autorisation_type', $dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
8580 $donnees_techniques = $this->get_donnees_techniques_applicables();
8581
8582 //
8583 $datas = array(
8584 //
8585 "dossier_instruction" => $this->getVal($this->clePrimaire),
8586 //
8587 "dossier_autorisation" => $this->getVal("dossier_autorisation"),
8588 //
8589 "terrain_adresse_voie_numero" => $this->getVal("terrain_adresse_voie_numero"),
8590 "terrain_adresse_lieu_dit" => $this->getVal("terrain_adresse_lieu_dit"),
8591 "terrain_adresse_code_postal" => $this->getVal("terrain_adresse_code_postal"),
8592 "terrain_adresse_cedex" => $this->getVal("terrain_adresse_cedex"),
8593 "terrain_adresse_voie" => $this->getVal("terrain_adresse_voie"),
8594 "terrain_adresse_bp" => $this->getVal("terrain_adresse_bp"),
8595 "terrain_adresse_localite" => $this->getVal("terrain_adresse_localite"),
8596 "terrain_superficie" => $this->getVal("terrain_superficie"),
8597 //
8598 "references_cadastrales" => $this->f->parseParcelles($this->getVal("terrain_references_cadastrales"), $this->getVal('om_collectivite')),
8599 "dossier_autorisation_type" => $dossier_autorisation_type->getVal("libelle"),
8600 "dossier_autorisation_type_detaille" => $dossier_autorisation_type_detaille->getVal("libelle"),
8601 "collectivite" => $om_collectivite->getVal("libelle"),
8602 "instructeur" => $instructeur->getVal("nom"),
8603 "division" => $division->getVal("libelle"),
8604 "etat_dossier" => $etat->getVal("libelle"),
8605 "statut_dossier" => $this->getStatut(),
8606 "date_depot_initial" => $this->getVal("date_depot"),
8607 "date_limite_instruction" => $this->getVal("date_limite"),
8608 "date_decision" => $this->getVal("date_decision"),
8609 "enjeu_urbanisme" => $this->getVal("enjeu_urba") == 't' ? 'true' : 'false',
8610 "enjeu_erp" => $this->getVal("enjeu_erp") == 't' ? 'true' : 'false',
8611 );
8612
8613 // Gestion des demandeurs.
8614 $this->listeDemandeur('dossier', $this->getVal($this->clePrimaire));
8615 //
8616 if (isset($this->valIdDemandeur["petitionnaire_principal"]) AND !empty($this->valIdDemandeur["petitionnaire_principal"])) {
8617 $demandeur = $this->f->get_inst__om_dbform(array(
8618 "obj" => "petitionnaire",
8619 "idx" => $this->valIdDemandeur["petitionnaire_principal"][0],
8620 ));
8621 $datas["petitionnaire_principal"] = $demandeur->get_datas();
8622 $demandeur->__destruct();
8623 }
8624 //
8625 if (isset($this->valIdDemandeur["delegataire"]) && !empty($this->valIdDemandeur["delegataire"])) {
8626 $demandeur = $this->f->get_inst__om_dbform(array(
8627 "obj" => "delegataire",
8628 "idx" => $this->valIdDemandeur["delegataire"][0],
8629 ));
8630 $datas["delegataire"] = $demandeur->get_datas();
8631 $demandeur->__destruct();
8632 }
8633 //
8634 if (isset($this->valIdDemandeur["petitionnaire"]) AND !empty($this->valIdDemandeur["petitionnaire"])) {
8635 $datas["autres_petitionnaires"] = array();
8636 foreach ($this->valIdDemandeur["petitionnaire"] as $petitionnaire) {
8637 $demandeur = $this->f->get_inst__om_dbform(array(
8638 "obj" => "petitionnaire",
8639 "idx" => $petitionnaire,
8640 ));
8641 $datas["autres_petitionnaires"][] = $demandeur->get_datas();
8642 $demandeur->__destruct();
8643 }
8644 }
8645
8646 // Tableau contenant le nom de chaque champ de données techniques à retourner
8647 $dt_a_afficher = array(
8648 "co_tot_log_nb",
8649 "co_cstr_exist",
8650 "co_uti_pers",
8651 "co_uti_vente",
8652 "co_uti_loc",
8653 "su_tot_shon_tot",
8654 "su_avt_shon_tot",
8655 "am_lot_max_nb",
8656 "am_empl_nb",
8657 );
8658
8659 // Tableau associatif contenant les données techniques voulues
8660 $tab_donnees_techniques = array();
8661 foreach ($dt_a_afficher as $key) {
8662 // On ajoute le champ de données techniques dans le retour seulement s'il
8663 // existe dans $donnees_techniques (s'il est applicable au dossier)
8664 if (array_key_exists($key, $donnees_techniques) === true) {
8665 if ($donnees_techniques[$key] === 't') {
8666 $donnees_techniques[$key] = 'true';
8667 };
8668 if ($donnees_techniques[$key] === 'f') {
8669 $donnees_techniques[$key] = 'false';
8670 };
8671 $tab_donnees_techniques[$key] = $donnees_techniques[$key];
8672 };
8673 };
8674
8675 $datas['donnees_techniques'] = $tab_donnees_techniques;
8676
8677 // Affiche le code INSEE de la collectivité du dossier d'instruction
8678 /*$collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
8679 $datas['collectivite_insee'] = $collectivite["insee"];*/
8680 $datas['collectivite_insee'] = $this->get_da_insee();
8681 //
8682 return $datas;
8683 }
8684
8685 /**
8686 * Renvoi le code INSEE du DA associé
8687 */
8688 protected function get_da_insee() {
8689 $inst_da = $this->f->get_inst__om_dbform(array(
8690 "obj" => "dossier_autorisation",
8691 "idx" => $this->getVal('dossier_autorisation')
8692 ));
8693 return $inst_da->getVal('insee');
8694 }
8695
8696 /**
8697 * CONDITION - is_class_dossier_corresponding_to_his_groupe
8698 *
8699 * Vérifie la correspondance groupe/classe du dossier instancié.
8700 *
8701 * @param string $classe
8702 * @return boolean
8703 */
8704 protected function is_class_dossier_corresponding_to_type_form($classe) {
8705 $type_form = $this->get_type_affichage_formulaire();
8706 switch ($type_form) {
8707 case 'DPC';
8708 case 'ADS':
8709 case 'CONSULTATION ENTRANTE':
8710 if ($this->f->starts_with($classe, 'dossier_instruction') === true) {
8711 return true;
8712 }
8713 return false;
8714 case 'CTX RE':
8715 if ($this->f->ends_with($classe, '_recours') === true) {
8716 return true;
8717 }
8718 return false;
8719 case 'CTX IN':
8720 if ($this->f->ends_with($classe, '_infractions') === true) {
8721 return true;
8722 }
8723 return false;
8724 default:
8725 return false;
8726 }
8727 }
8728
8729
8730 /**
8731 * CONDITION - check_context
8732 *
8733 * Vérifie la correspondance groupes dossier/utilisateur.
8734 * Vérifie l'accès aux dossiers confidentiels.
8735 * Vérifie la correspondance groupe/classe.
8736 *
8737 * @return boolean
8738 */
8739 public function check_context() {
8740 // Le dossier doit être un objet valide
8741 $id = $this->getVal($this->clePrimaire);
8742 if ($id === 0 OR $id === '0' OR $id === '' OR $id === ']') {
8743 return false;
8744 }
8745
8746 // Vérification que l'utilisateur a accès au dossier
8747 if ($this->can_user_access_dossier() === false) {
8748 return false;
8749 }
8750 // Vérification que la classe métier instanciée est adéquate.
8751 return $this->is_class_dossier_corresponding_to_type_form($this->get_absolute_class_name());
8752 }
8753
8754 /**
8755 * VIEW - redirect.
8756 *
8757 * Cette vue est appelée lorsque l'on souhaite consulter un dossier dont on ne connaît pas le groupe.
8758 * Ce fonctionnement est nécessaire car les classes métier filles de 'dossier' sont relatives à ce groupe.
8759 *
8760 * Par exemple, depuis l'onglet "Dossiers Liés" du DI, le listing ne permet pas d'instancier chaque résultat
8761 * et par conséquent on n'a pas accès au groupe du dossier. L'action tableau consulter y est surchargée afin
8762 * d'amener à cette vue qui se charge de faire la redirection adéquate.
8763 *
8764 * @return void
8765 */
8766 public function redirect() {
8767 // Redirection vers la classe métier adéquate
8768 $context = $this->get_type_affichage_formulaire();
8769 switch ($context) {
8770 case 'ADS':
8771 case 'CONSULTATION ENTRANTE':
8772 $obj = 'dossier_instruction';
8773 break;
8774 case 'CTX RE':
8775 $obj = 'dossier_contentieux_tous_recours';
8776 break;
8777 case 'CTX IN':
8778 $obj = 'dossier_contentieux_toutes_infractions';
8779 break;
8780 default:
8781 return;
8782 }
8783 $idx = $this->getVal($this->clePrimaire);
8784 $link = OM_ROUTE_FORM.'&obj='.$obj.'&action=3&idx='.$idx;
8785 if ($this->f->get_submitted_get_value('retourformulaire') !== null
8786 && $this->f->get_submitted_get_value('idxformulaire') !== null) {
8787 $link .= '&premier=0&tricol=&retourformulaire='.$this->f->get_submitted_get_value('retourformulaire');
8788 $link .= '&idxformulaire='.$this->f->get_submitted_get_value('idxformulaire');
8789 }
8790
8791 header('Location: '.$link);
8792 exit();
8793 }
8794
8795
8796 /**
8797 * CONDITION - is_confidentiel
8798 *
8799 * Permet de savoir si le type de dossier d'autorisation du dossier courant est
8800 * confidentiel.
8801 *
8802 * @return boolean true si le dossier est confidentiel, sinon false.
8803 *
8804 */
8805 public function is_confidentiel() {
8806 //
8807 $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
8808 $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
8809 $confidentiel = $inst_dossier_autorisation_type->getVal('confidentiel');
8810 //
8811 if ($confidentiel === 't') {
8812 return true;
8813 }
8814 return false;
8815 }
8816
8817
8818 /**
8819 * CONDITION - can_user_access_dossier
8820 *
8821 * Effectue les vérifications suivantes :
8822 * - L'utilisateur doit avoir accès au groupe du dossier
8823 * - Si le dossier est confidentiel, l'utilisateur doit avoir accès aux dossiers
8824 * confidentiels de ce groupe
8825 *
8826 * @return boolean true si les conditions ci-dessus sont réunies, sinon false
8827 *
8828 */
8829 public function can_user_access_dossier() {
8830 // Récupère le code du groupe
8831 $groupe_dossier = $this->get_groupe();
8832
8833 // Le groupe doit être accessible par l'utilisateur ;
8834 if ($this->f->is_user_in_group($groupe_dossier) === false) {
8835 return false;
8836 }
8837 if ($this->is_confidentiel() === true) {
8838 //
8839 if ($this->f->can_user_access_dossiers_confidentiels_from_groupe($groupe_dossier) === false) {
8840 return false;
8841 }
8842 }
8843 return true;
8844 }
8845
8846
8847 /**
8848 * Met à jour une métadonnée sur tous les fichiers liés au dossier.
8849 *
8850 * @param string $metadata Nom de la métadonnée.
8851 * @param string $metadata_value Nouvelle valeur de la métadonnée.
8852 *
8853 * @return boolean
8854 */
8855 public function update_metadata_by_dossier($metadata, $metadata_value) {
8856 // Rècupère la liste des fichiers stockés liés au dossier
8857 $sql = sprintf('
8858 SELECT uid AS uid
8859 FROM %1$sdocument_numerise
8860 WHERE dossier = \'%2$s\'
8861 AND document_numerise IS NOT NULL
8862 UNION
8863 SELECT fichier AS uid
8864 FROM %1$sconsultation
8865 WHERE dossier = \'%2$s\'
8866 AND fichier IS NOT NULL
8867 UNION
8868 SELECT om_fichier_consultation AS uid
8869 FROM %1$sconsultation
8870 WHERE dossier = \'%2$s\'
8871 AND om_fichier_consultation IS NOT NULL
8872 UNION
8873 SELECT om_fichier_instruction AS uid
8874 FROM %1$sinstruction
8875 WHERE dossier = \'%2$s\'
8876 AND om_fichier_instruction IS NOT NULL
8877 UNION
8878 SELECT om_fichier_rapport_instruction AS uid
8879 FROM %1$srapport_instruction
8880 WHERE dossier_instruction = \'%2$s\'
8881 AND om_fichier_rapport_instruction IS NOT NULL;
8882 ',
8883 DB_PREFIXE,
8884 $this->getVal($this->clePrimaire)
8885 );
8886 $res = $this->f->db->query($sql);
8887 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
8888 $this->f->isDatabaseError($res);
8889
8890 // Définit la métadonnée à mettre à jour
8891 $metadata_update = array();
8892 $metadata_update[$metadata] = $metadata_value;
8893
8894 // Pour chaque résultat
8895 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
8896 // Met à jour les métadonnées du fichier
8897 $uid_update = $this->f->storage->storage->update_metadata($row['uid'], $metadata_update);
8898
8899 // Si la méthode ne retourne pas l'uid du fichier alors la mise
8900 // à jour ne s'est pas réalisée
8901 if ($uid_update !== $row['uid']) {
8902 //
8903 return false;
8904 }
8905 }
8906 $res->free();
8907
8908 //
8909 return true;
8910 }
8911
8912
8913 /**
8914 * Traitement pour les ERP.
8915 * Si la valeur du champ 'erp' a été modifié, modifie la valeur de la
8916 * métadonnée concernceERP sur tous les fichiers liés au dossier.
8917 *
8918 * @param array $values Liste des nouvelles valeurs.
8919 *
8920 * @return boolean
8921 */
8922 public function update_concerneERP(array $values) {
8923 // Définit le champ et la métadonnée
8924 $champ = 'erp';
8925 $metadata = 'concerneERP';
8926
8927 // Définit les valeurs à comparer
8928 $value_after = $this->get_boolean_from_view_value($values[$champ]);
8929 $value_before = $this->get_boolean_from_pgsql_value($this->getVal($champ));
8930
8931 // Vérifie si la valeur du champ a été modifié
8932 if ($value_after !== $value_before) {
8933 // Transforme la valeur booléenne en string
8934 $metadata_value = 'false';
8935 if ($value_after === true) {
8936 $metadata_value = 'true';
8937 }
8938
8939 // Met à jour les métadonnées des fichiers liés au dossier
8940 $update = $this->update_metadata_by_dossier($metadata, $metadata_value);
8941 //
8942 if ($update !== true) {
8943 //
8944 return false;
8945 }
8946 }
8947
8948 //
8949 return true;
8950 }
8951
8952
8953 /**
8954 * TODO: replace with '$this->f->findObjectById' ?
8955 *
8956 * Récupère l'instance du groupe.
8957 *
8958 * @param string $groupe Identifiant du groupe.
8959 *
8960 * @return object
8961 */
8962 private function get_inst_groupe($groupe) {
8963 //
8964 return $this->get_inst_common("groupe", $groupe);
8965 }
8966
8967
8968 /**
8969 * TODO: replace with '$this->f->findObjectById' ?
8970 *
8971 * Récupère l'instance du type de dossier d'autorisation.
8972 *
8973 * @param string $dossier_autorisation_type Identifiant du type de dossier
8974 * d'autorisation.
8975 *
8976 * @return object
8977 */
8978 private function get_inst_dossier_autorisation_type($dossier_autorisation_type) {
8979 //
8980 return $this->get_inst_common("dossier_autorisation_type", $dossier_autorisation_type);
8981 }
8982
8983
8984 /**
8985 * Récupère l'instance de la demande du dossier
8986 *
8987 * @param mixed Identifiant de la demande
8988 *
8989 * @return object
8990 */
8991 function get_inst_demande($demande = null) {
8992 //
8993 if (is_null($this->inst_demande)) {
8994 //
8995 if (is_null($demande)) {
8996 $demande = $this->get_demande_by_dossier_instruction();
8997 }
8998 //
8999 return $this->get_inst_common("demande", $demande);
9000 }
9001 //
9002 return $this->inst_demande;
9003 }
9004
9005
9006 /**
9007 * Récupère l'identifiant de la demande initiale par le dossier d'instruction.
9008 *
9009 * @return integer
9010 */
9011 function get_demande_by_dossier_instruction() {
9012 // Initialisation de la variable de retour
9013 $res = null;
9014
9015 // SQL
9016 $sql = "SELECT demande
9017 FROM ".DB_PREFIXE."demande
9018 WHERE dossier_instruction = '".$this->getVal($this->clePrimaire)."'
9019 ORDER BY instruction_recepisse ASC
9020 LIMIT 1";
9021 $res = $this->f->db->getOne($sql);
9022 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
9023 $this->f->isDatabaseError($res);
9024
9025 //
9026 return $res;
9027 }
9028
9029 /**
9030 * TREATMENT - update_last_modification_date.
9031 *
9032 * Cette methode met à jour la date de dernière modification du dossier.
9033 *
9034 * @return boolean
9035 */
9036 public function update_last_modification_date() {
9037 //
9038 $this->begin_treatment(__METHOD__);
9039 //
9040 $this->correct = true;
9041 $valF = array();
9042 $valF["date_modification"] = 'NOW';
9043 //
9044 $res = $this->f->db->autoExecute(
9045 DB_PREFIXE.$this->table,
9046 $valF,
9047 DB_AUTOQUERY_UPDATE,
9048 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
9049 );
9050 if ($this->f->isDatabaseError($res, true)) {
9051 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9052 $this->correct = false;
9053 return $this->end_treatment(__METHOD__, false);
9054 } else {
9055 return $this->end_treatment(__METHOD__, true);
9056 }
9057 //
9058 return $this->end_treatment(__METHOD__, false);
9059 }
9060
9061 /**
9062 * TREATMENT - update_hash_sitadel.
9063 *
9064 * Cette methode met à jour le hash SITADEL du dossier.
9065 *
9066 * @return boolean
9067 */
9068 public function update_hash_sitadel($hash_sitadel = null) {
9069 //
9070 $this->begin_treatment(__METHOD__);
9071 //
9072 if ($hash_sitadel !== null && $hash_sitadel !== '') {
9073 //
9074 $this->correct = true;
9075 $valF = array();
9076 $valF["hash_sitadel"] = $hash_sitadel;
9077 //
9078 $res = $this->f->db->autoExecute(
9079 DB_PREFIXE.$this->table,
9080 $valF,
9081 DB_AUTOQUERY_UPDATE,
9082 $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
9083 );
9084 if ($this->f->isDatabaseError($res, true)) {
9085 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9086 $this->correct = false;
9087 return $this->end_treatment(__METHOD__, false);
9088 } else {
9089 return $this->end_treatment(__METHOD__, true);
9090 }
9091 }
9092 //
9093 return $this->end_treatment(__METHOD__, false);
9094 }
9095
9096 /**
9097 * TREATMENT - update_version_clos
9098 *
9099 * @param string $mode Mode de mise à jour ("up" ou "down")
9100 *
9101 * @return boolean
9102 */
9103 public function update_version_clos($mode) {
9104 //
9105 $this->begin_treatment(__METHOD__);
9106 //
9107 if ($mode !== 'up' && $mode !== 'down') {
9108 return $this->end_treatment(__METHOD__, false);
9109 }
9110 //
9111 $inst_da = $this->get_inst_dossier_autorisation($this->getVal("dossier_autorisation"));
9112 $da_version_clos = $inst_da->getval('numero_version_clos');
9113 //
9114 $this->correct = true;
9115 $data = array();
9116 $data["version_clos"] = 0;
9117 if ($da_version_clos !== null
9118 && $da_version_clos !== '') {
9119 //
9120 if ($mode === 'up') {
9121 $data["version_clos"] = intval($da_version_clos)+1;
9122 $inst_da->update_numero_version_clos($data["version_clos"]);
9123 }
9124 if ($mode === 'down') {
9125 $data["version_clos"] = null;
9126 }
9127 } else {
9128 $inst_da->update_numero_version_clos($data["version_clos"]);
9129 }
9130 //
9131 $res = $this->f->db->autoExecute(
9132 sprintf('%s%s', DB_PREFIXE, $this->table),
9133 $data,
9134 DB_AUTOQUERY_UPDATE,
9135 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
9136 );
9137 $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);
9138 if ($this->f->isDatabaseError($res, true) === true) {
9139 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9140 $this->correct = false;
9141 return $this->end_treatment(__METHOD__, false);
9142 }
9143 return $this->end_treatment(__METHOD__, true);
9144 }
9145
9146 /**
9147 * Récupère l'identifiant de l'état car le getVal() récupère le libellé.
9148 *
9149 * @return mixed Soit un string, soit "false"
9150 */
9151 function get_id_etat() {
9152 $query = sprintf('
9153 SELECT etat
9154 FROM %1$sdossier
9155 WHERE dossier = \'%2$s\'
9156 ',
9157 DB_PREFIXE,
9158 $this->getVal($this->clePrimaire)
9159 );
9160 $res = $this->f->get_one_result_from_db_query(
9161 $query,
9162 true
9163 );
9164 if ($res['code'] === 'KO') {
9165 return false;
9166 }
9167 return $res['result'];
9168 }
9169
9170 /**
9171 * Surcharge de la méthode rechercheTable pour éviter de court-circuiter le
9172 * générateur en devant surcharger la méthode cleSecondaire afin de supprimer
9173 * les éléments liés dans les tables NaN.
9174 *
9175 * @param mixed $dnu1 Instance BDD - À ne pas utiliser
9176 * @param string $table Table
9177 * @param string $field Champ
9178 * @param mixed $id Identifiant
9179 * @param mixed $dnu2 Marqueur de débogage - À ne pas utiliser
9180 * @param string $selection Condition de la requête
9181 *
9182 * @return void
9183 */
9184 function rechercheTable(&$dnu1 = null, $table, $field, $id, $dnu2 = null, $selection = "") {
9185
9186 // Dans le cas d'une suppression du dossier d'instruction, les tables
9187 // liées ne sont pas vérifiées
9188 $liaison_suppr = array (
9189 "demande",
9190 "donnees_techniques",
9191 "instruction",
9192 "lien_dossier_demandeur",
9193 );
9194 if ($this->get_action_crud() === 'delete'
9195 && in_array($table, array_keys($liaison_suppr)) === true) {
9196 // Annule la vérid
9197 $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);
9198 return;
9199 }
9200 //
9201 parent::rechercheTable($this->f->db, $table, $field, $id, null, $selection);
9202 }
9203
9204 public function get_demandeurs() {
9205 $query = sprintf('
9206 SELECT demandeur.demandeur,
9207 lien_dossier_demandeur.petitionnaire_principal
9208 FROM %1$sdemandeur
9209 INNER JOIN %1$slien_dossier_demandeur
9210 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
9211 WHERE lien_dossier_demandeur.dossier = \'%2$s\'
9212 ',
9213 DB_PREFIXE,
9214 $this->getVal($this->clePrimaire)
9215 );
9216 $res = $this->f->get_all_results_from_db_query($query, true);
9217 if ($res['code'] === 'KO') {
9218 return false;
9219 }
9220 return $res['result'];
9221 }
9222
9223 /**
9224 * TREATMENT - normalize_address
9225 *
9226 * Enregistre en base de données les valeurs concernant l'adresse normalisée.
9227 *
9228 * @param string $address Valeur de l'adresse normalisée.
9229 * @param string $address_json JSON de toutes les données de l'adresse normalisée.
9230 * @return boolean
9231 */
9232 public function normalize_address(string $address = null, string $address_json = '{}') {
9233 //
9234 $this->begin_treatment(__METHOD__);
9235 // Valeurs par défaut si l'adresse normalisée est vide
9236 if ($address === '') {
9237 $address = null;
9238 $address_json = '{}';
9239 }
9240 // Valeur par défaut pour le JSON de l'adresse si l'adresse saisie ne
9241 // correspond au label du JSON, donc adresse non sélectionnée parmis les
9242 // résultats retourner par l'API adresse
9243 if ($address !== null) {
9244 $address_json_decode = json_decode($address_json, true);
9245 if (isset($address_json_decode['label']) === true
9246 && $address !== $address_json_decode['label']) {
9247 //
9248 $address_json = '{}';
9249 }
9250 }
9251 //
9252 $this->correct = true;
9253 $data = array();
9254 $data["adresse_normalisee"] = $address;
9255 $data["adresse_normalisee_json"] = $address_json;
9256 //
9257 $res = $this->f->db->autoExecute(
9258 sprintf('%s%s', DB_PREFIXE, $this->table),
9259 $data,
9260 DB_AUTOQUERY_UPDATE,
9261 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
9262 );
9263 $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);
9264 if ($this->f->isDatabaseError($res, true) === true) {
9265 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9266 $this->correct = false;
9267 return $this->end_treatment(__METHOD__, false);
9268 }
9269 return $this->end_treatment(__METHOD__, true);
9270 }
9271
9272 public function get_last_instruction_decision() {
9273 $query = sprintf('
9274 SELECT
9275 instruction.instruction
9276 FROM %1$sinstruction
9277 INNER JOIN %1$sdossier
9278 ON dossier.dossier = instruction.dossier
9279 INNER JOIN %1$setat
9280 ON dossier.etat = etat.etat
9281 WHERE instruction.etat = dossier.etat
9282 AND instruction.dossier = \'%2$s\'
9283 AND etat.statut = \'%3$s\'
9284 ORDER BY instruction.instruction DESC
9285 LIMIT 1
9286 ',
9287 DB_PREFIXE,
9288 $this->getVal('dossier'),
9289 'cloture'
9290 );
9291 $res = $this->f->get_one_result_from_db_query($query, true);
9292 if ($res['code'] === 'KO') {
9293 return false;
9294 }
9295 return $res['result'];
9296 }
9297
9298 /**
9299 * VIEW - view_normalize_address.
9300 *
9301 * Formulaire de recherche de l'adresse normalisée.
9302 *
9303 * @return void
9304 */
9305 public function view_normalize_address() {
9306 // Vérification de l'accessibilité sur l'élément
9307 $this->checkAccessibility();
9308
9309 // Par défaut l'adresse saisie est celle renseignée sur le dossier
9310 $address_val = trim(preg_replace('/\s\s+/', ' ', sprintf('%s %s %s %s %s %s %s',
9311 $this->getVal('terrain_adresse_voie_numero'),
9312 $this->getVal('terrain_adresse_voie'),
9313 $this->getVal('terrain_adresse_lieu_dit'),
9314 $this->getVal('terrain_adresse_localite'),
9315 $this->getVal('terrain_adresse_code_postal'),
9316 $this->getVal('terrain_adresse_bp'),
9317 $this->getVal('terrain_adresse_cedex')
9318 )));
9319 $address_val_json = '{}';
9320 if ($this->getVal('adresse_normalisee') !== null
9321 && $this->getVal('adresse_normalisee') !== '') {
9322 //
9323 $address_val = $this->getVal('adresse_normalisee');
9324 $address_val_json = htmlentities($this->getVal('adresse_normalisee_json'));
9325 if ($this->f->get_submitted_post_value("submit-normalize") === null) {
9326 $this->f->displayMessage("error", __("L'adresse de ce terrain a déjà été normalisée."));
9327 }
9328 }
9329
9330 /**
9331 * TREATMENT
9332 */
9333 // Traitement si validation du formulaire
9334 if ($this->f->get_submitted_post_value("submit-normalize") !== null) {
9335 //
9336 $this->normalize_address($_POST["address"], $_POST["address_json"]);
9337 return;
9338 }
9339
9340 // Formulaire de validation
9341 $this->f->layout->display__form_container__begin(array(
9342 "action" => "",
9343 "name" => "f2_normalize_address",
9344 "onsubmit" => "normalize_address(this);return false;",
9345 ));
9346 //
9347 printf('
9348 <div id="sousform-href" data-href="%s"></div>',
9349 $this->compose_form_url("form", array(
9350 "validation" => null,
9351 "maj" => 160,
9352 "retour" => "form",
9353 ))
9354 );
9355 $champs = array('address', 'address_json', );
9356 // Instanciation de l'objet formulaire
9357 $this->form = $this->f->get_inst__om_formulaire(array(
9358 "validation" => 0,
9359 "maj" => $this->getParameter("maj"),
9360 "champs" => $champs,
9361 ));
9362 // Paramétrage des champs du formulaire
9363 // address
9364 $this->form->setLib("address", __("adresse à normaliser"));
9365 $this->form->setTaille("address", 60);
9366 $this->form->setMax("address", 255);
9367 $this->form->setType("address", "text");
9368 $this->form->setVal('address', $address_val);
9369 // address_json
9370 $this->form->setType("address_json", "hidden");
9371 $this->form->setVal('address_json', $address_val_json);
9372 $this->f->displayDescription(__("Veuillez sélectionner l'adresse normalisée qui se rapproche le plus de l'adresse du terrain."));
9373 // Ouverture du conteneur de formulaire
9374 $this->form->entete();
9375 $this->form->afficher($champs, 0, false, false);
9376 $this->form->enpied();
9377 $this->f->layout->display__form_controls_container__begin(array(
9378 "controls" => "bottom",
9379 ));
9380 $this->f->layout->display__form_input_submit(array(
9381 "name" => "submit-normalize",
9382 "value" => __("Normaliser l'adresse"),
9383 "class" => "boutonFormulaire",
9384 ));
9385 $this->f->layout->display__form_controls_container__end();
9386 //
9387 $this->f->layout->display__form_container__end();
9388 }
9389
9390
9391 public function get_last_instruction_incompletude() {
9392 $query = sprintf('
9393 SELECT
9394 instruction.instruction
9395 FROM %1$sinstruction
9396 INNER JOIN %1$sevenement
9397 ON evenement.evenement = instruction.evenement
9398 WHERE instruction.dossier = \'%2$s\'
9399 AND evenement.type = \'%3$s\'
9400 ORDER BY instruction.instruction DESC
9401 LIMIT 1
9402 ',
9403 DB_PREFIXE,
9404 $this->getVal('dossier'),
9405 'incompletude'
9406 );
9407 $res = $this->f->get_one_result_from_db_query($query, true);
9408 if ($res['code'] === 'KO') {
9409 return false;
9410 }
9411 return $res['result'];
9412 }
9413
9414 function get_max_num_suffixe($dat_c, $annee, $dep_c, $com_c, $num) {
9415 //
9416 $query = sprintf('
9417 SELECT MAX(numerotation_num_suffixe) as max_num_suffixe
9418 FROM %1$sdossier
9419 WHERE numerotation_type = \'%2$s\'
9420 AND annee = \'%3$s\'
9421 AND numerotation_dep = \'%4$s\'
9422 AND numerotation_com = \'%5$s\'
9423 AND numerotation_num = \'%6$s\'
9424 ',
9425 DB_PREFIXE,
9426 $dat_c,
9427 $annee,
9428 $dep_c,
9429 $com_c,
9430 $num
9431 );
9432 $res = $this->f->get_one_result_from_db_query($query, true);
9433 if ($res['code'] === 'KO') {
9434 return null;
9435 }
9436 //
9437 return $res['result'];
9438 }
9439
9440 public function view_json_data() {
9441 $this->checkAccessibility();
9442 $this->f->disableLog();
9443 $view = $this->get_json_data();
9444 printf(json_encode($view));
9445 }
9446
9447 public function get_json_data() {
9448 $val = array_combine($this->champs, $this->val);
9449 foreach ($val as $key => $value) {
9450 $val[$key] = strip_tags($value);
9451 }
9452 $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
9453 $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
9454 $val['dossier_autorisation_type_detaille_code'] = $inst_datd->getVal('code');
9455 $val['dossier_autorisation_type_code'] = $inst_dat->getVal('code');
9456 $val['dossier_instruction_type_code'] = $this->getCode($this->getVal('dossier_instruction_type'));
9457 $val['dossier_suffixe'] = '';
9458 if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
9459 $val['dossier_suffixe'] = sprintf('%s%s',
9460 $this->getCode($this->getVal('dossier_instruction_type')),
9461 $this->get_dossier_instruction_version()
9462 );
9463 }
9464 /*$parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
9465 $val['insee'] = $parameters['insee'];*/
9466 $val['insee'] = $this->get_da_insee();
9467 $inst_ac = $this->get_inst_autorite_competente($val['autorite_competente']);
9468 $val['autorite_competente_code'] = $inst_ac->getVal('code');
9469 $val['source_depot'] = $this->get_source_depot_from_demande();
9470 return $val;
9471 }
9472
9473 public function update_by_instruction(array $val, array $extra_params = array()) {
9474 $this->begin_treatment(__METHOD__);
9475 // XXX Supprime les champs qui n'existent pas dans dossier
9476 $valF = $val;
9477 unset($valF['instruction']);
9478 unset($valF['crud']);
9479 if (empty($valF) === false) {
9480 $res = $this->f->db->autoExecute(
9481 sprintf('%s%s', DB_PREFIXE, $this->table),
9482 $valF,
9483 DB_AUTOQUERY_UPDATE,
9484 sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
9485 );
9486 $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);
9487 if ($this->f->isDatabaseError($res, true) === true) {
9488 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9489 $this->correct = false;
9490 return $this->end_treatment(__METHOD__, false);
9491 }
9492 }
9493 $trigger = $this->trigger_update_by_instruction($val);
9494 if ($trigger === false) {
9495 $this->addToLog(__METHOD__."(): ".__("Erreur lors de la mise à jour par instruction."), DEBUG_MODE);
9496 $this->correct = false;
9497 return $this->end_treatment(__METHOD__, false);
9498 }
9499 return $this->end_treatment(__METHOD__, true);
9500 }
9501
9502 protected function trigger_update_by_instruction(array $val, array $extra_params = array()) {
9503 foreach ($this->task_types as $task_type) {
9504 $method = sprintf('add_task_%s', $task_type);
9505 if (method_exists($this, $method) === true) {
9506 //
9507 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
9508 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible'
9509 && ($this->f->is_option_mode_service_consulte_enabled() !== true
9510 || ($this->f->is_option_mode_service_consulte_enabled() === true
9511 && ($this->get_source_depot_from_demande() === 'platau'
9512 || $this->get_source_depot_from_demande() === 'portal')))) {
9513 //
9514 $res = $this->$method($val, $extra_params);
9515 if ($res !== true) {
9516 return $res;
9517 }
9518 }
9519 }
9520 }
9521 return true;
9522 }
9523
9524 protected function add_task_pec_metier_consultation(array $val, array $extra_params = array()) {
9525 if (array_key_exists("pec_metier", $val) === true
9526 && $val['pec_metier'] !== null
9527 && $val['pec_metier'] !== '') {
9528 //
9529 $inst_task = $this->f->get_inst__om_dbform(array(
9530 "obj" => "task",
9531 "idx" => 0,
9532 ));
9533 $task_val = array(
9534 'type' => 'pec_metier_consultation',
9535 'object_id' => $val['instruction'],
9536 'dossier' => $this->getVal($this->clePrimaire),
9537 );
9538 if ($this->f->is_option_mode_service_consulte_enabled() === false
9539 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9540 $task_val['state'] = $inst_task::STATUS_DRAFT;
9541 }
9542 $add_task = $inst_task->add_task(array('val' => $task_val));
9543 if ($add_task === false) {
9544 return false;
9545 }
9546 }
9547 return true;
9548 }
9549
9550 protected function add_task_qualification_DI(array $val, array $extra_params = array()) {
9551 if (array_key_exists("autorite_competente", $val) === true
9552 && $val["autorite_competente"] !== $this->getVal('autorite_competente')) {
9553 //
9554 $inst_task = $this->f->get_inst__om_dbform(array(
9555 "obj" => "task",
9556 "idx" => 0,
9557 ));
9558 $task_val = array(
9559 'type' => 'qualification_DI',
9560 'object_id' => $val['instruction'],
9561 'dossier' => $this->getVal($this->clePrimaire),
9562 );
9563 if ($this->f->is_option_mode_service_consulte_enabled() === false
9564 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9565 $task_val['state'] = $inst_task::STATUS_DRAFT;
9566 }
9567 $add_task = $inst_task->add_task(array('val' => $task_val));
9568 if ($add_task === false) {
9569 return false;
9570 }
9571 }
9572 return true;
9573 }
9574
9575 protected function add_task_decision_DI(array $val, array $extra_params = array()) {
9576 if (array_key_exists("date_decision", $val) === true
9577 && array_key_exists("avis_decision", $val) === true
9578 && $val['date_decision'] !== null
9579 && $val['date_decision'] !== ''
9580 && $val['avis_decision'] !== null
9581 && $val['avis_decision'] !== '') {
9582 //
9583 $inst_ad = $this->f->get_inst__om_dbform(array(
9584 "obj" => "avis_decision",
9585 "idx" => $val['avis_decision'],
9586 ));
9587 if ($inst_ad->getVal('prescription') === 'f') {
9588 //
9589 $inst_task = $this->f->get_inst__om_dbform(array(
9590 "obj" => "task",
9591 "idx" => 0,
9592 ));
9593 $task_val = array(
9594 'type' => 'decision_DI',
9595 'object_id' => $val['instruction'],
9596 'dossier' => $this->getVal($this->clePrimaire),
9597 );
9598 if ($this->f->is_option_mode_service_consulte_enabled() === false
9599 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9600 $task_val['state'] = $inst_task::STATUS_DRAFT;
9601 }
9602 $add_task = $inst_task->add_task(array('val' => $task_val));
9603 if ($add_task === false) {
9604 return false;
9605 }
9606 }
9607 }
9608 return true;
9609 }
9610
9611 protected function add_task_avis_consultation(array $val, array $extra_params = array()) {
9612 if (array_key_exists("date_decision", $val) === true
9613 && array_key_exists("avis_decision", $val) === true
9614 && $val['date_decision'] !== null
9615 && $val['date_decision'] !== ''
9616 && $val['avis_decision'] !== null
9617 && $val['avis_decision'] !== '') {
9618 //
9619 $inst_ad = $this->f->get_inst__om_dbform(array(
9620 "obj" => "avis_decision",
9621 "idx" => $val['avis_decision'],
9622 ));
9623 if ($inst_ad->getVal('prescription') === 'f') {
9624 //
9625 $inst_task = $this->f->get_inst__om_dbform(array(
9626 "obj" => "task",
9627 "idx" => 0,
9628 ));
9629 $task_val = array(
9630 'type' => 'avis_consultation',
9631 'object_id' => $val['instruction'],
9632 'dossier' => $this->getVal($this->clePrimaire),
9633 );
9634 if ($this->f->is_option_mode_service_consulte_enabled() === false
9635 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9636 $task_val['state'] = $inst_task::STATUS_DRAFT;
9637 }
9638 $add_task = $inst_task->add_task(array('val' => $task_val));
9639 if ($add_task === false) {
9640 return false;
9641 }
9642 }
9643 }
9644 return true;
9645 }
9646
9647 protected function add_task_prescription(array $val, array $extra_params = array()) {
9648 if (array_key_exists("date_decision", $val) === true
9649 && array_key_exists("avis_decision", $val) === true
9650 && $val['date_decision'] !== null
9651 && $val['date_decision'] !== ''
9652 && $val['avis_decision'] !== null
9653 && $val['avis_decision'] !== '') {
9654 //
9655 $inst_ad = $this->f->get_inst__om_dbform(array(
9656 "obj" => "avis_decision",
9657 "idx" => $val['avis_decision'],
9658 ));
9659 if ($inst_ad->getVal('prescription') === 't') {
9660 //
9661 $inst_task = $this->f->get_inst__om_dbform(array(
9662 "obj" => "task",
9663 "idx" => 0,
9664 ));
9665 $task_val = array(
9666 'type' => 'prescription',
9667 'object_id' => $val['instruction'],
9668 'dossier' => $this->getVal($this->clePrimaire),
9669 );
9670 if ($this->f->is_option_mode_service_consulte_enabled() === false
9671 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9672 $task_val['state'] = $inst_task::STATUS_DRAFT;
9673 }
9674 $add_task = $inst_task->add_task(array('val' => $task_val));
9675 if ($add_task === false) {
9676 return false;
9677 }
9678 }
9679 }
9680 return true;
9681 }
9682
9683 protected function add_task_completude_DI(array $val, array $extra_params = array()) {
9684 if (array_key_exists("incomplet_notifie", $val) === true
9685 && $val['incomplet_notifie'] === 'f'
9686 && array_key_exists("crud", $val) === true
9687 && $val['crud'] !== 'delete') {
9688 //
9689 $inst_task = $this->f->get_inst__om_dbform(array(
9690 "obj" => "task",
9691 "idx" => 0,
9692 ));
9693 $task_val = array(
9694 'type' => 'completude_DI',
9695 'object_id' => $val['instruction'],
9696 'dossier' => $this->getVal($this->clePrimaire),
9697 );
9698 if ($this->f->is_option_mode_service_consulte_enabled() === false
9699 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9700 $task_val['state'] = $inst_task::STATUS_DRAFT;
9701 }
9702 $add_task = $inst_task->add_task(array('val' => $task_val));
9703 if ($add_task === false) {
9704 return false;
9705 }
9706 }
9707 return true;
9708 }
9709
9710 public function add_task_incompletude_DI(array $val, array $extra_params = array()) {
9711 if (array_key_exists("incomplet_notifie", $val) === true
9712 && $val['incomplet_notifie'] === 't'
9713 && array_key_exists("crud", $val) === true
9714 && $val['crud'] !== 'delete') {
9715 //
9716 $inst_task = $this->f->get_inst__om_dbform(array(
9717 "obj" => "task",
9718 "idx" => 0,
9719 ));
9720 $task_val = array(
9721 'type' => 'incompletude_DI',
9722 'object_id' => $val['instruction'],
9723 'dossier' => $this->getVal($this->clePrimaire),
9724 );
9725 if ($this->f->is_option_mode_service_consulte_enabled() === false
9726 && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
9727 $task_val['state'] = $inst_task::STATUS_DRAFT;
9728 }
9729 $add_task = $inst_task->add_task(array('val' => $task_val));
9730 if ($add_task === false) {
9731 return false;
9732 }
9733 }
9734 return true;
9735 }
9736
9737 public function get_parcelles($dossier = null) {
9738 if ($dossier === null) {
9739 $dossier = $this->getVal('dossier');
9740 }
9741 $query = sprintf('
9742 SELECT *
9743 FROM %1$sdossier_parcelle
9744 WHERE dossier = \'%2$s\'
9745 ORDER BY dossier_parcelle
9746 ',
9747 DB_PREFIXE,
9748 $dossier
9749 );
9750 $res = $this->f->get_all_results_from_db_query($query, true);
9751 if ($res['code'] === 'KO') {
9752 return false;
9753 }
9754 return $res['result'];
9755 }
9756
9757 protected function getDossier($champ = null) {
9758 return $this->getVal($this->clePrimaire);
9759 }
9760
9761 protected function getDossierObject() {
9762 return $this;
9763 }
9764
9765 /**
9766 * Recupère la source du dépôt
9767 *
9768 * @return string source du dépôt
9769 */
9770 public function get_source_depot_from_demande() {
9771 $demande = $this->get_inst_demande();
9772 return $demande->getVal('source_depot');
9773 }
9774
9775 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26