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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15218 - (hide annotations)
Thu Jul 13 10:31:27 2023 UTC (18 months, 2 weeks ago) by softime
File size: 519868 byte(s)
chore(branch): fusion de la branche d'intégration 5.19.0-develop dans le trunk

1 mbroquet 3730 <?php
2 softime 7996 /**
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 mbroquet 3730
9 softime 6565 require_once "../gen/obj/dossier.class.php";
10 mbroquet 3730
11 softime 13528 require_once "../obj/geoads.class.php";
12 softime 14542 require_once "../obj/task.class.php";
13 softime 13528
14 mbroquet 3730 class dossier extends dossier_gen {
15    
16 softime 14064 const LAT_LON_REGEX = "/^(?P<deg>\d+)(°|d) *(?P<min>\d+)[.,](?P<dec>\d+)('|`|′)? *(?P<dir>[NSEOW])\$/";
17    
18 mbroquet 3730 var $maj;
19     var $dossier_instruction_type;
20     var $is_incomplet_notifie = null;
21 softime 6565 var $valIdDemandeur = array("petitionnaire_principal" => array(),
22     "delegataire" => array(),
23     "petitionnaire" => array(),
24     "plaignant_principal" => array(),
25     "plaignant" => array(),
26     "contrevenant_principal" => array(),
27     "contrevenant" => array(),
28     "requerant_principal" => array(),
29     "requerant" => array(),
30     "avocat_principal" => array(),
31     "avocat" => array(),
32 softime 7067 "bailleur_principal" => array(),
33     "bailleur" => array(),
34 softime 10573 "proprietaire" => array(),
35     "architecte_lc" => array(),
36     "paysagiste" => array(),
37 softime 6565 );
38     var $postedIdDemandeur = array("petitionnaire_principal" => array(),
39     "delegataire" => array(),
40     "petitionnaire" => array(),
41     "plaignant_principal" => array(),
42     "plaignant" => array(),
43     "contrevenant_principal" => array(),
44     "contrevenant" => array(),
45     "requerant_principal" => array(),
46     "requerant" => array(),
47     "avocat_principal" => array(),
48     "avocat" => array(),
49 softime 7067 "bailleur_principal" => array(),
50     "bailleur" => array(),
51 softime 10573 "proprietaire" => array(),
52     "architecte_lc" => array(),
53     "paysagiste" => array(),
54 softime 6565 );
55 mbroquet 3730 /**
56     * Instance de la classe taxe_amenagement.
57     *
58     * @var null
59     */
60     var $inst_taxe_amenagement = null;
61    
62     /**
63     * Instance de la classe donnees_techniques.
64     *
65     * @var null
66     */
67     var $inst_donnees_techniques = null;
68    
69     /**
70     * Instance de la classe dossier_autorisation.
71     *
72     * @var mixed (resource | null)
73     */
74     var $inst_dossier_autorisation = null;
75    
76     /**
77     * Instance de la classe dossier_autorisation_type_detaille.
78     *
79     * @var null
80     */
81     var $inst_dossier_autorisation_type_detaille = null;
82    
83     /**
84     * Instance de la classe cerfa.
85     *
86     * @var null
87     */
88     var $inst_cerfa = null;
89    
90 softime 6565 /**
91     * Groupe du dossier d'instruction.
92     *
93     * @var null
94     */
95     var $groupe = null;
96 mbroquet 3730
97 softime 6565 /**
98     * Instance de la classe groupe.
99     */
100     var $inst_groupe = null;
101    
102     /**
103     * Instance de la classe dossier_autorisation_type.
104     *
105     * @var null
106     */
107     var $inst_dossier_autorisation_type = null;
108    
109 softime 7366 /**
110     * Instance de la classe demande.
111     *
112     * @var mixed (resource | null)
113     */
114     var $inst_demande = null;
115 softime 10573
116     /**
117     * Liste des types de tâches.
118     *
119     * @var array
120     */
121     var $task_types = array(
122     'incompletude_DI',
123     'qualification_DI',
124     'decision_DI',
125     'completude_DI',
126     'pec_metier_consultation',
127     'avis_consultation',
128     'modification_DI',
129 softime 10869 'prescription',
130 softime 14064 'lettre_incompletude',
131     'lettre_majoration'
132 softime 10573 );
133    
134     /**
135     * Liste des champs requis dans Plat'AU.
136     *
137     * @var array
138     */
139     var $list_platau_required_fields_dossier = array(
140     'donnees_techniques.enga_decla_date',
141     'donnees_techniques.enga_decla_lieu',
142     'dossier.terrain_adresse_localite',
143     'demandeur.localite',
144     'architecte.ville'
145     );
146    
147 softime 14542
148 softime 13528 /**
149 softime 14542 * Liaison NaN
150     *
151     * Tableau contenant les objets qui représente les liaisons.
152     */
153     var $liaisons_nan = array(
154     "lien_dossier_nature_travaux" => array(
155     "table_l" => "lien_dossier_nature_travaux",
156     "table_f" => "nature_travaux",
157     "field" => "nature_travaux",
158     )
159     );
160    
161     /**
162 softime 15218 * [$portal_code_suivi description]
163     * @var boolean
164     */
165     var $is_portal_code_suivi = false;
166    
167     /**
168 softime 13528 * Set un tableau pour la conception des requêtes de suppression des éléments
169     * dans les tables de liaisons.
170     * Le tableau est constitué de la manière suivante :
171     * 'nom_de_la_table' => array(
172     * 'table' => "nom de la table à supprimer si il
173     * n'a pas pu être renseigné comme clé du tableau",
174     * 'condition_field' => 'nom du champs utilisée pour identifier
175     * les éléments liés',
176     * 'condition_value' => 'valeur utilisée pour identifier les
177     * éléments liés'
178     * ),
179     *
180     * @var array
181     */
182     public function set_related_tables() {
183     $this->related_tables = array(
184     'lien_demande_demandeur' => array(
185     'condition_field' => 'demande',
186     'condition_value' => $this->get_idx_by_args(
187     'demande',
188     'demande',
189     'dossier_instruction',
190     $this->getVal($this->clePrimaire)),
191     ),
192     'demande' => array(
193     'condition_field' => 'dossier_instruction',
194     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
195     ),
196     'lien_dossier_demandeur' => array(
197     'condition_field' => 'dossier',
198     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
199     ),
200     'instruction_notification_document' => array(
201     'condition_field' => 'instruction_notification',
202     'condition_value' => sprintf(
203     'SELECT
204     %2$s
205     FROM
206     %1$s%2$s
207     WHERE
208     %3$s IN (%4$s)',
209     DB_PREFIXE,
210     'instruction_notification',
211     'instruction',
212     sprintf(
213     'SELECT
214     %2$s
215     FROM
216     %1$s%2$s
217     WHERE
218     %3$s = \'%4$s\'',
219     DB_PREFIXE,
220     'instruction',
221     'dossier',
222     $this->getVal($this->clePrimaire)
223     )
224     ),
225     ),
226     'instruction_notification' => array(
227     'condition_field' => 'instruction',
228     'condition_value' => sprintf(
229     'SELECT
230     %2$s
231     FROM
232     %1$s%2$s
233     WHERE
234     %3$s = \'%4$s\'',
235     DB_PREFIXE,
236     'instruction',
237     'dossier',
238     $this->getVal($this->clePrimaire)
239     ),
240     ),
241     'instruction' => array(
242     'condition_field' => 'dossier',
243     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
244     ),
245     'dossier_parcelle' => array(
246     'condition_field' => 'dossier',
247     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
248     ),
249     'dossier_contrainte' => array(
250     'condition_field' => 'dossier',
251     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
252     ),
253     'lien_donnees_techniques_moyen_retenu_juge' => array(
254     'condition_field' => 'donnees_techniques',
255     'condition_value' => $this->get_idx_by_args(
256     'donnees_techniques',
257     'donnees_techniques',
258     'dossier_instruction',
259     $this->getVal($this->clePrimaire)),
260     ),
261     'lien_donnees_techniques_moyen_souleve' => array(
262     'condition_field' => 'donnees_techniques',
263     'condition_value' => $this->get_idx_by_args(
264     'donnees_techniques',
265     'donnees_techniques',
266     'dossier_instruction',
267     $this->getVal($this->clePrimaire)),
268     ),
269     'donnees_techniques_di' => array(
270     'table' => 'donnees_techniques',
271     'condition_field' => 'dossier_instruction',
272     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
273     ),
274     'blocnote' => array(
275     'condition_field' => 'dossier',
276     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
277     ),
278     'consultation_entrante' => array(
279     'condition_field' => 'dossier',
280     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
281     ),
282     'consultation' => array(
283     'condition_field' => 'dossier',
284     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
285     ),
286     'document_numerise' => array(
287     'condition_field' => 'dossier',
288     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
289     ),
290     'rapport_instruction' => array(
291     'condition_field' => 'dossier_instruction',
292     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
293     ),
294     'dossier_commission' => array(
295     'condition_field' => 'dossier',
296     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
297     ),
298     'dossier_message' => array(
299     'condition_field' => 'dossier',
300     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
301     ),
302     'lien_dossier_dossier_1' => array(
303     'table' => 'lien_dossier_dossier',
304     'condition_field' => 'dossier_src',
305     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
306     ),
307     'lien_dossier_dossier_2' => array(
308     'table' => 'lien_dossier_dossier',
309     'condition_field' => 'dossier_cible',
310     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
311     ),
312     'dossier_geolocalisation' => array(
313     'condition_field' => 'dossier',
314     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
315     ),
316     'donnees_techniques_lot' => array(
317     'table' => 'donnees_techniques',
318     'condition_field' => 'lot',
319     'condition_value' => $this->get_idx_by_args(
320     "string_agg(lot::text, ', ')",
321     'lot',
322     'dossier',
323     $this->getVal($this->clePrimaire)),
324     ),
325     'lien_lot_demandeur' => array(
326     'condition_field' => 'lot',
327     'condition_value' => $this->get_idx_by_args(
328     "string_agg(lot::text, ', ')",
329     'lot',
330     'dossier',
331     $this->getVal($this->clePrimaire)),
332     ),
333     'lot' => array(
334     'condition_field' => 'dossier',
335     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
336     ),
337     'dossier_operateur' => array(
338     'condition_field' => 'dossier_instruction',
339     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
340 softime 14542 ),
341     'lien_dossier_nature_travaux' => array(
342     'condition_field' => 'dossier',
343     'condition_value' => sprintf("'%s'", $this->getVal($this->clePrimaire)),
344 softime 13528 )
345     );
346     }
347 softime 10573
348 softime 13528
349 mbroquet 3730 /*Mutateur pour ma variable dossier_instruction_type*/
350     public function getDossierInstructionType(){
351     return $this->dossier_instruction_type;
352     }
353     public function setDossierInstructionType($dossier_instruction_type){
354     $this->dossier_instruction_type = $dossier_instruction_type;
355     }
356    
357     /**
358 softime 15218 * Récupère l'attribut is_portal_code_suivi.
359     * @return boolean
360     */
361     public function get_is_portal_code_suivi(){
362     return $this->is_portal_code_suivi;
363     }
364    
365     /**
366     * Change la valeur de l'attribut is_portal_code_suivi.
367     * @param boolean $value
368     */
369     public function set_is_portal_code_suivi($value){
370     $this->is_portal_code_suivi = is_bool($value) === true ? $value : false;
371     }
372    
373     /**
374 mbroquet 3730 * Définition des actions disponibles sur la classe.
375     *
376     * @return void
377     */
378     function init_class_actions() {
379    
380     parent::init_class_actions();
381    
382     // ACTION - 003 - consulter
383     //
384 softime 6565 $this->class_actions[3]["condition"] = array(
385     "is_user_from_allowed_collectivite",
386     "check_context",
387     );
388 mbroquet 3730
389     // ACTION - 004 - contrainte
390     //
391     $this->class_actions[4] = array(
392     "identifier" => "contrainte",
393     "view" => "view_contrainte",
394     "permission_suffix" => "contrainte_tab",
395     "condition" => array(
396     "is_user_from_allowed_collectivite",
397     ),
398     );
399    
400     // ACTION - 005 - view_document_numerise
401     // Interface spécifique du tableau des pièces
402     $this->class_actions[5] = array(
403     "identifier" => "view_document_numerise",
404     "view" => "view_document_numerise",
405     "permission_suffix" => "document_numerise",
406     "condition" => array(
407     "is_user_from_allowed_collectivite",
408     ),
409     );
410    
411     // ACTION - 006 - view_sitadel
412     //
413     $this->class_actions[6] = array(
414     "identifier" => "sitadel",
415     "view" => "view_sitadel",
416     "permission_suffix" => "export_sitadel",
417     );
418 softime 6565
419     // ACTION - 777 - Redirection vers la classe fille adéquate
420     //
421     $this->class_actions[777] = array(
422     "identifier" => "redirect",
423     "view" => "redirect",
424     "permission_suffix" => "consulter",
425     );
426 softime 10573
427     //
428     //
429     $this->class_actions[998] = array(
430     "identifier" => "json_data",
431     "view" => "view_json_data",
432     "permission_suffix" => "consulter",
433     );
434 mbroquet 3730 }
435    
436     /**
437 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
438     *
439     * @return array
440     */
441     function get_var_sql_forminc__champs() {
442 softime 10573 $champs = array(
443 softime 8989 "dossier.dossier",
444 softime 10573 "dossier.om_collectivite AS om_collectivite"
445     );
446     if ($this->f->is_option_dossier_commune_enabled()) {
447     $champs[] = "dossier.commune AS commune";
448     }
449     array_push($champs,
450 softime 8989 "dossier.dossier_libelle",
451     "dossier.dossier_instruction_type",
452     "dossier_autorisation_type_detaille.libelle as dossier_autorisation_type_detaille",
453     "autorisation_contestee",
454     "donnees_techniques.ctx_reference_dsj as ctx_reference_dsj",
455     "donnees_techniques.ctx_reference_sagace as ctx_reference_sagace",
456     "dossier.depot_electronique",
457     "CASE WHEN requerant_principal.qualite='particulier' THEN
458     TRIM(CONCAT(requerant_principal.particulier_nom, ' ', requerant_principal.particulier_prenom))
459     ELSE
460     TRIM(CONCAT(requerant_principal.personne_morale_raison_sociale, ' ', requerant_principal.personne_morale_denomination))
461     END as requerants",
462     "CASE WHEN petitionnaire_principal.qualite='particulier' THEN
463     TRIM(CONCAT(petitionnaire_principal.particulier_nom, ' ', petitionnaire_principal.particulier_prenom))
464     ELSE
465     TRIM(CONCAT(petitionnaire_principal.personne_morale_raison_sociale, ' ', petitionnaire_principal.personne_morale_denomination))
466     END as dossier_petitionnaire",
467     "'' as dossier_petitionnaires",
468     "CASE WHEN contrevenant_principal.qualite='particulier' THEN
469     TRIM(CONCAT(contrevenant_principal.particulier_nom, ' ', contrevenant_principal.particulier_prenom))
470     ELSE
471     TRIM(CONCAT(contrevenant_principal.personne_morale_raison_sociale, ' ', contrevenant_principal.personne_morale_denomination))
472     END as contrevenants",
473 softime 10573 "TRIM(
474     CONCAT_WS(
475     ' ',
476     replace(dossier.terrain_references_cadastrales,';',' '),
477     '<br/>',
478 softime 11057 CASE
479     WHEN dossier.adresse_normalisee IS NULL
480     OR TRIM(dossier.adresse_normalisee) = ''
481     THEN
482 softime 14542 ".DB_PREFIXE."adresse(
483     dossier.terrain_adresse_voie_numero::text,
484     dossier.terrain_adresse_voie::text,
485     ''::text,
486     dossier.terrain_adresse_lieu_dit::text,
487     dossier.terrain_adresse_bp::text,
488     dossier.terrain_adresse_code_postal::text,
489     dossier.terrain_adresse_localite::text,
490     dossier.terrain_adresse_cedex::text,
491     ''::text,
492     ', '::text
493     )
494 softime 11057 ELSE
495     dossier.adresse_normalisee
496     END
497 softime 10573 )
498     ) as terrain",
499 softime 8989 "arrondissement.libelle as dossier_arrondissement",
500 softime 10573 'dossier.adresse_normalisee',
501     'dossier.adresse_normalisee_json',
502 softime 12847 'dossier.dossier_parent',
503 softime 14542 sprintf("(SELECT string_agg(nature_travaux::text, ';') FROM %slien_dossier_nature_travaux WHERE dossier = dossier.dossier) as nature_travaux",
504     DB_PREFIXE),
505 softime 8989 // description/nature des travaux. En cas de modif, bloc de code aussi
506     // présent dans 'dossier_instruction.inc.php','om_requete'
507     // et 'stats à la demande'.
508     "CONCAT_WS(
509     '<br/>',
510     CASE WHEN co_projet_desc = '' THEN
511     NULL
512     ELSE
513     TRIM(co_projet_desc)
514     END,
515     CASE WHEN ope_proj_desc = '' THEN
516     NULL
517     ELSE
518     TRIM(ope_proj_desc)
519     END,
520     CASE WHEN am_projet_desc = '' THEN
521     NULL
522     ELSE
523     TRIM(am_projet_desc)
524     END,
525     CASE WHEN dm_projet_desc = '' THEN
526     NULL
527     ELSE
528     TRIM(dm_projet_desc)
529     END,
530     CASE WHEN donnees_techniques.erp_cstr_neuve IS TRUE
531     THEN '".str_replace("'", "''", _('erp_cstr_neuve'))."' END,
532     CASE WHEN donnees_techniques.erp_trvx_acc IS TRUE
533     THEN '".str_replace("'", "''", _('erp_trvx_acc'))."' END,
534     CASE WHEN donnees_techniques.erp_extension IS TRUE
535     THEN '".str_replace("'", "''", _('erp_extension'))."' END,
536     CASE WHEN donnees_techniques.erp_rehab IS TRUE
537     THEN '".str_replace("'", "''", _('erp_rehab'))."' END,
538     CASE WHEN donnees_techniques.erp_trvx_am IS TRUE
539     THEN '".str_replace("'", "''", _('erp_trvx_am'))."' END,
540     CASE WHEN donnees_techniques.erp_vol_nouv_exist IS TRUE
541     THEN '".str_replace("'", "''", _('erp_vol_nouv_exist'))."' END
542     ) as \"description_projet\"",
543     //
544     "donnees_techniques.ctx_synthese_nti as dt_ctx_synthese_nti",
545     "donnees_techniques.ctx_synthese_anr as dt_ctx_synthese_anr ",
546     "donnees_techniques.ctx_infraction as dt_ctx_infraction ",
547     "donnees_techniques.ctx_regularisable as dt_ctx_regularisable ",
548     "dossier_autorisation.dossier_autorisation",
549     "dossier_autorisation.dossier_autorisation_libelle",
550     "annee",
551     "autorite_competente",
552     "dossier.instructeur",
553     "instructeur_2",
554     "dossier.division",
555     "public.ST_AsText(dossier.geom::geometry) as geom",
556 softime 10573 "'' as streetview",
557     "tax_secteur",
558 softime 8989 // Enjeu
559     "enjeu_urba",
560     "enjeu_erp",
561     "'' as enjeu_ctx",
562     // Qualification
563     "erp",
564     "a_qualifier",
565 softime 10573 "pec_metier",
566 softime 10968 "etat_transmission_platau",
567 softime 8989 // Archive
568     "numero_versement_archive",
569     "date_demande",
570     // Fieldset instruction
571     // Suivi
572     // Col 1
573     "dossier.date_depot",
574 softime 10573 "dossier.date_depot_mairie",
575 softime 8989 "dossier.date_affichage",
576     "date_premiere_visite",
577     "date_derniere_visite",
578     "date_contradictoire",
579     "date_retour_contradictoire",
580     "date_ait",
581     "date_transmission_parquet",
582     "donnees_techniques.ctx_date_audience as date_audience",
583     "delai",
584     "delai_incompletude",
585     "date_dernier_depot",
586     "date_limite",
587     "date_complet",
588     "date_limite_incompletude",
589     "date_cloture_instruction",
590     // Col 2
591 softime 9282 "dossier.etat",
592 softime 8989 "evenement_suivant_tacite",
593     "evenement_suivant_tacite_incompletude",
594     // Bloc 2 fieldsets
595     // Col 1 : Fieldset "Décision"
596     "dossier.date_decision",
597     "dossier.avis_decision",
598     // Col 2 : Fieldset "Validité de l'autorisation"
599     "dossier.date_validite",
600     // Autre
601     // Col 1
602     "accord_tacite",
603     // Col 2
604     "date_rejet",
605     "date_notification_delai",
606     "dossier.date_chantier",
607     "dossier.date_achevement",
608     // Col 3
609     "date_conformite",
610     // Fieldset "Simulation des taxes"
611     "tax_mtn_part_commu",
612     "tax_mtn_part_commu_sans_exo",
613     "tax_mtn_part_depart",
614     "tax_mtn_part_depart_sans_exo",
615     "tax_mtn_part_reg",
616     "tax_mtn_part_reg_sans_exo",
617     "tax_mtn_total",
618     "tax_mtn_total_sans_exo",
619     "tax_mtn_rap",
620     "tax_mtn_rap_sans_exo",
621     // Fieldset "Localisation du terrain"
622     // Col 1
623     "dossier.terrain_adresse_voie_numero",
624     "dossier.terrain_adresse_lieu_dit",
625     "dossier.terrain_adresse_code_postal",
626     "dossier.terrain_adresse_cedex",
627     "dossier.parcelle_temporaire",
628     "dossier.terrain_references_cadastrales",
629 softime 14064 "dossier.geoloc_latitude",
630     "dossier.geoloc_longitude",
631     "dossier.geoloc_rayon",
632 softime 8989 // Col 2
633     "dossier.terrain_adresse_voie",
634     "dossier.terrain_adresse_bp",
635     "dossier.terrain_adresse_localite",
636     "dossier.terrain_superficie",
637 softime 13528 "dossier.terrain_superficie_calculee",
638 softime 8989 //
639     "geom1",
640     "dossier.description",
641     "version",
642     "incompletude",
643     "incomplet_notifie",
644     "etat_pendant_incompletude",
645     "dossier.duree_validite",
646     "quartier",
647     "dossier.log_instructions",
648     "interface_referentiel_erp",
649     "date_modification",
650     "hash_sitadel",
651 softime 9245 "version_clos",
652     "initial_dt",
653 softime 10573 // POC
654     "dossier.numerotation_type",
655     "dossier.numerotation_dep",
656     "dossier.numerotation_com",
657     "dossier.numerotation_division",
658     "dossier.numerotation_suffixe",
659     "dossier.numerotation_entite",
660     "dossier.numerotation_num",
661     "dossier.numerotation_num_suffixe",
662     "dossier.numerotation_num_entite",
663     // CONSULTATION ENTRANTE
664     "consultation_entrante.consultation_entrante",
665     "consultation_entrante.delai_reponse",
666     "consultation_entrante.type_delai",
667     "consultation_entrante.date_consultation",
668     "consultation_entrante.date_emission",
669     "consultation_entrante.date_production_notification",
670     "consultation_entrante.date_premiere_consultation",
671     "consultation_entrante.objet_consultation",
672     "consultation_entrante.etat_consultation",
673     "consultation_entrante.type_consultation",
674     "consultation_entrante.texte_fondement_reglementaire",
675     "consultation_entrante.texte_objet_consultation",
676     "consultation_entrante.service_consultant_id",
677     "consultation_entrante.service_consultant_libelle",
678     "consultation_entrante.service_consultant_insee",
679     "consultation_entrante.service_consultant_mail",
680     "consultation_entrante.service_consultant_type",
681     "consultation_entrante.service_consultant__siren",
682 softime 11585 "consultation_entrante.dossier as dossier_consultation",
683     //
684 softime 15218 "'' as lien_iiue_portal",
685 softime 11585 "'' as lien_iiue"
686 softime 8989 );
687 softime 10573 return $champs;
688 softime 8989 }
689    
690     /**
691     * Clause from pour la requête de sélection des données de l'enregistrement.
692     *
693     * @return string
694     */
695     function get_var_sql_forminc__tableSelect() {
696     return sprintf(
697     '%1$s%2$s
698     LEFT JOIN %1$savis_decision
699     ON avis_decision.avis_decision=dossier.avis_decision
700     LEFT JOIN %1$sdossier_autorisation
701     ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
702     LEFT JOIN %1$sdossier_autorisation_type_detaille
703     ON dossier_autorisation.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
704     LEFT JOIN (
705     SELECT *
706     FROM %1$slien_dossier_demandeur
707     INNER JOIN %1$sdemandeur
708     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
709     WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
710     AND LOWER(demandeur.type_demandeur) = LOWER(\'petitionnaire\')
711     ) as petitionnaire_principal
712     ON petitionnaire_principal.dossier = dossier.dossier
713     LEFT JOIN (
714     SELECT *
715     FROM %1$slien_dossier_demandeur
716     INNER JOIN %1$sdemandeur
717     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
718     WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
719     AND LOWER(demandeur.type_demandeur) = LOWER(\'requerant\')
720     ) as requerant_principal
721     ON requerant_principal.dossier = dossier.dossier
722     LEFT JOIN (
723     SELECT *
724     FROM %1$slien_dossier_demandeur
725     INNER JOIN %1$sdemandeur
726     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
727     WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
728     AND LOWER(demandeur.type_demandeur) = LOWER(\'contrevenant\')
729     ) as contrevenant_principal
730     ON contrevenant_principal.dossier = dossier.dossier
731     LEFT JOIN %1$sdonnees_techniques
732     ON donnees_techniques.dossier_instruction = dossier.dossier
733     LEFT JOIN %1$setat
734     ON dossier.etat = etat.etat
735     LEFT JOIN %1$sarrondissement
736 softime 10573 ON dossier.terrain_adresse_code_postal = arrondissement.code_postal
737     LEFT JOIN %1$sconsultation_entrante
738     ON dossier.dossier = consultation_entrante.dossier',
739 softime 8989 DB_PREFIXE,
740     $this->table
741     );
742     }
743    
744     /**
745     *
746     * @return string
747     */
748     function get_var_sql_forminc__sql_avis_decision() {
749     return "SELECT avis_decision,libelle from ".DB_PREFIXE."avis_decision order by libelle";
750     }
751    
752     /**
753     *
754     * @return string
755     */
756     function get_var_sql_forminc__sql_avis_decision_by_id() {
757     return "SELECT avis_decision.avis_decision, libelle FROM ".DB_PREFIXE."avis_decision WHERE avis_decision = '<idx>'";
758     }
759    
760     /**
761     *
762     * @return string
763     */
764     function get_var_sql_forminc__sql_dossier_autorisation() {
765     return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation ORDER BY dossier_autorisation.dossier_autorisation ASC";
766     }
767    
768     /**
769     *
770     * @return string
771     */
772     function get_var_sql_forminc__sql_dossier_autorisation_by_id() {
773     return "SELECT dossier_autorisation.dossier_autorisation, dossier_autorisation.dossier_autorisation FROM ".DB_PREFIXE."dossier_autorisation WHERE dossier_autorisation = '<idx>'";
774     }
775    
776     /**
777     *
778     * @return string
779     */
780     function get_var_sql_forminc__sql_arrondissement() {
781     return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement ORDER BY arrondissement.libelle ASC";
782     }
783    
784     /**
785     *
786     * @return string
787     */
788     function get_var_sql_forminc__sql_arrondissement_by_id() {
789     return "SELECT arrondissement.arrondissement, arrondissement.libelle FROM ".DB_PREFIXE."arrondissement WHERE arrondissement = <idx>";
790     }
791    
792     /**
793     *
794     * @return string
795     */
796     function get_var_sql_forminc__sql_autorisation_contestee() {
797     return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier ORDER BY dossier.annee ASC";
798     }
799    
800     /**
801     *
802     * @return string
803     */
804     function get_var_sql_forminc__sql_autorisation_contestee_by_id() {
805     return "SELECT dossier.dossier, dossier.dossier_libelle FROM ".DB_PREFIXE."dossier WHERE dossier = '<idx>'";
806     }
807    
808     /**
809     *
810     * @return string
811     */
812     function get_var_sql_forminc__sql_dossier_autorisation_type_detaille() {
813     return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.code
814     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
815     ORDER BY dossier_autorisation_type_detaille.libelle";
816     }
817    
818     /**
819     *
820     * @return string
821     */
822     function get_var_sql_forminc__sql_dossier_autorisation_type_detaille_by_id() {
823     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>";
824     }
825    
826     /**
827     *
828     * @return string
829     */
830     function get_var_sql_forminc__sql_demandeur() {
831     return "SELECT dossier_autorisation_type_detaille.dossier_autorisation_type_detaille, dossier_autorisation_type_detaille.libelle
832     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
833     ORDER BY dossier_autorisation_type_detaille.libelle";
834     }
835    
836     /**
837     *
838     * @return string
839     */
840     function get_var_sql_forminc__sql_demandeur_by_id() {
841     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>";
842     }
843    
844     /**
845     *
846     * @return string
847     */
848     function get_var_sql_forminc__sql_instructeur_div() {
849     return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
850     FROM ".DB_PREFIXE."instructeur
851     INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
852     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
853     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)))
854     <instructeur_qualite>
855     ORDER BY nom";
856     }
857    
858     /**
859     *
860     * @return string
861     */
862 softime 14542 function get_var_sql_forminc__sql_nature_travaux_by_dit() {
863     return sprintf('SELECT
864     nature_travaux.nature_travaux,
865     CONCAT_WS(\' / \', famille_travaux.libelle, nature_travaux.libelle) as lib
866     FROM %1$snature_travaux LEFT JOIN %1$sfamille_travaux ON nature_travaux.famille_travaux = famille_travaux.famille_travaux
867     LEFT JOIN %1$slien_dit_nature_travaux ON lien_dit_nature_travaux.nature_travaux = nature_travaux.nature_travaux
868     WHERE
869     lien_dit_nature_travaux.dossier_instruction_type = <dossier_instruction_type>
870     AND
871     (
872     nature_travaux.om_validite_debut IS NULL
873     OR nature_travaux.om_validite_debut <= CURRENT_DATE
874     )
875     AND (
876     nature_travaux.om_validite_fin IS NULL
877     OR nature_travaux.om_validite_fin > CURRENT_DATE
878     )
879     AND
880     (
881     famille_travaux.om_validite_debut IS NULL
882     OR famille_travaux.om_validite_debut <= CURRENT_DATE
883     )
884     AND (
885     famille_travaux.om_validite_fin IS NULL
886     OR famille_travaux.om_validite_fin > CURRENT_DATE
887     )
888     ORDER BY famille_travaux.libelle, nature_travaux.libelle',
889     DB_PREFIXE);
890     }
891    
892     /**
893     *
894     * @return string
895     */
896     function get_var_sql_forminc__sql_nature_travaux_by_id() {
897     return sprintf('SELECT
898     nature_travaux.nature_travaux,
899     CONCAT_WS(\' / \', famille_travaux.libelle, nature_travaux.libelle) as lib
900     FROM
901     %1$snature_travaux
902     INNER JOIN
903     %1$sfamille_travaux ON nature_travaux.famille_travaux = famille_travaux.famille_travaux
904     WHERE
905     nature_travaux.nature_travaux IN (<idx>)
906     ORDER BY
907     nature_travaux.libelle',
908     DB_PREFIXE);
909     }
910    
911     /**
912     *
913     * @return string
914     */
915 softime 8989 function get_var_sql_forminc__sql_instructeur_div_by_id() {
916     return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
917     FROM ".DB_PREFIXE."instructeur
918     INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
919     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
920     WHERE instructeur = <idx>";
921     }
922    
923     /**
924     *
925     * @return string
926     */
927     function get_var_sql_forminc__sql_instructeur_div_by_di() {
928     return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
929     FROM ".DB_PREFIXE."instructeur
930     INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
931     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
932     LEFT JOIN ".DB_PREFIXE."direction
933     ON division.direction = direction.direction
934     LEFT JOIN ".DB_PREFIXE."om_collectivite
935     ON direction.om_collectivite = om_collectivite.om_collectivite
936     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)))
937     AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
938     <instructeur_qualite>
939     ORDER BY nom";
940     }
941    
942     /**
943     *
944     * @return string
945     */
946     function get_var_sql_forminc__sql_instructeur_by_di() {
947     return "SELECT instructeur.instructeur, instructeur.nom
948     FROM ".DB_PREFIXE."instructeur
949     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
950     LEFT JOIN ".DB_PREFIXE."division
951     ON instructeur.division = division.division
952     LEFT JOIN ".DB_PREFIXE."direction
953     ON division.direction = direction.direction
954     LEFT JOIN ".DB_PREFIXE."om_collectivite
955     ON direction.om_collectivite = om_collectivite.om_collectivite
956     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)))
957     AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
958     <instructeur_qualite>
959     ORDER BY instructeur.nom ASC";
960     }
961    
962     /**
963     *
964     * @return string
965     */
966     function get_var_sql_forminc__sql_instructeur_2_div() {
967     return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
968     FROM ".DB_PREFIXE."instructeur
969     INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
970     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
971     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)))
972 softime 13137 AND instructeur_qualite.code = <instructeur_qualite>
973 softime 8989 ORDER BY nom";
974     }
975    
976     /**
977     *
978     * @return string
979     */
980     function get_var_sql_forminc__sql_instructeur_2_div_by_id() {
981     return $this->get_var_sql_forminc__sql("instructeur_div_by_id");
982     }
983    
984     /**
985     *
986     * @return string
987     */
988     function get_var_sql_forminc__sql_instructeur_2_div_by_di() {
989     return "SELECT instructeur.instructeur, instructeur.nom||' ('||division.code||')'
990     FROM ".DB_PREFIXE."instructeur
991     INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division
992     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
993     LEFT JOIN ".DB_PREFIXE."direction
994     ON division.direction = direction.direction
995     LEFT JOIN ".DB_PREFIXE."om_collectivite
996     ON direction.om_collectivite = om_collectivite.om_collectivite
997     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)))
998     AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
999 softime 13137 AND instructeur_qualite.code = '<instructeur_qualite>'
1000 softime 8989 ORDER BY nom";
1001     }
1002    
1003     /**
1004     *
1005     * @return string
1006     */
1007     function get_var_sql_forminc__sql_instructeur_2_by_di() {
1008     return "SELECT instructeur.instructeur, instructeur.nom
1009     FROM ".DB_PREFIXE."instructeur
1010     INNER JOIN ".DB_PREFIXE."instructeur_qualite ON instructeur_qualite.instructeur_qualite=instructeur.instructeur_qualite
1011     LEFT JOIN ".DB_PREFIXE."division
1012     ON instructeur.division = division.division
1013     LEFT JOIN ".DB_PREFIXE."direction
1014     ON division.direction = direction.direction
1015     LEFT JOIN ".DB_PREFIXE."om_collectivite
1016     ON direction.om_collectivite = om_collectivite.om_collectivite
1017     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)))
1018     AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
1019 softime 13137 AND instructeur_qualite.code = '<instructeur_qualite>'
1020 softime 8989 ORDER BY instructeur.nom ASC";
1021     }
1022    
1023     /**
1024     *
1025     * @return string
1026     */
1027     function get_var_sql_forminc__sql_division_by_di() {
1028     return "SELECT division.division, division.libelle
1029     FROM ".DB_PREFIXE."division
1030     LEFT JOIN ".DB_PREFIXE."direction
1031     ON division.direction = direction.direction
1032     LEFT JOIN ".DB_PREFIXE."om_collectivite
1033     ON direction.om_collectivite = om_collectivite.om_collectivite
1034     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)))
1035     AND (om_collectivite.niveau = '2' OR direction.om_collectivite = '<collectivite_di>')
1036     ORDER BY division.libelle ASC";
1037     }
1038    
1039     /**
1040 softime 10573 *
1041     * @return string
1042     */
1043     function get_var_sql_forminc__sql_commune() {
1044     return "
1045     SELECT
1046 softime 11228 commune.commune, commune.libelle AS libelle
1047 softime 10573 FROM
1048     ".DB_PREFIXE."commune
1049 softime 11228 WHERE (commune.om_validite_debut IS NULL OR commune.om_validite_debut <= CURRENT_DATE)
1050     AND (commune.om_validite_fin IS NULL OR commune.om_validite_fin > CURRENT_DATE)
1051     ORDER BY commune.libelle ASC
1052 softime 10573 ";
1053     }
1054    
1055     /**
1056 softime 11585 *
1057     * @return string
1058     */
1059     function get_var_sql_forminc__sql_dossier_instruction_type_by_id() {
1060     return sprintf('
1061     SELECT dossier_instruction_type.dossier_instruction_type,
1062     CONCAT_WS(\' - \', dossier_autorisation_type_detaille.libelle, dossier_instruction_type.libelle)
1063     FROM %1$sdossier_instruction_type
1064     LEFT JOIN %1$sdossier_autorisation_type_detaille ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1065     WHERE dossier_instruction_type = <idx>
1066     ',
1067     DB_PREFIXE
1068     );
1069     }
1070    
1071     /**
1072 mbroquet 3730 * VIEW - view_sitadel.
1073     *
1074     * @return void
1075     */
1076     function view_sitadel() {
1077 softime 8989 // Affichage du formulaire permettant le choix d'un interval de date
1078 mbroquet 3730 // ainsi que le numéro de d'ordre qui est le numéro de la version de
1079     // l'export
1080 softime 8989 if (empty($this->f->get_submitted_post_value())) {
1081 mbroquet 3730 // Affichage du formulaire
1082 softime 8989 $this->affichageFormulaire();
1083 mbroquet 3730 }
1084     else {
1085     // Initialisation des variables pour les messages de fin de traitement
1086     $correct=true;
1087     // Initialisation de la chaîne contenant le message d'erreur
1088     $erreur = "";
1089 softime 8989 //
1090     $message_valid = '';
1091     $message_info = '';
1092 mbroquet 3730
1093     // Initialisation des dates de début et de fin
1094     $datedebut ='';
1095     $datefin='';
1096    
1097     // Traitement des erreurs
1098     if ($this->f->get_submitted_post_value("datedebut") == "") {
1099     $correct=false;
1100     } else {
1101     $datedebut = substr($this->f->get_submitted_post_value("datedebut"),6,4).
1102     "-".substr($this->f->get_submitted_post_value("datedebut"),3,2)."-".
1103     substr($this->f->get_submitted_post_value("datedebut"),0,2);
1104     }
1105     if ($this->f->get_submitted_post_value("datefin") == "") {
1106     $correct=false;
1107     } else {
1108     $datefin = substr($this->f->get_submitted_post_value("datefin"),6,4).
1109     "-".substr($this->f->get_submitted_post_value("datefin"),3,2)."-".
1110     substr($this->f->get_submitted_post_value("datefin"),0,2);
1111     }
1112     $numero = $this->f->get_submitted_post_value("numero");
1113 softime 13528
1114     if ($correct === true){
1115     // Vérifie la collectivité de l'utilisateur et si c'est un utilisateur
1116     // mono les résultats de l'exports concerneront uniquement sa collectivité
1117     $filtreCollectivite = '';
1118     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1119     $filtreCollectivite = sprintf(
1120     'AND dossier_autorisation.om_collectivite = %d',
1121     intval($_SESSION['collectivite'])
1122     );
1123     }
1124 mbroquet 3730 // Requête permettant de lister tous les dossiers de l'export
1125 softime 13528 $sql = sprintf(
1126     "SELECT
1127     dossier.dossier,
1128     dossier.om_collectivite as collectivite,
1129     dossier.dossier_autorisation,
1130     dossier_instruction_type.mouvement_sitadel,
1131     dossier_instruction_type.code as dossier_instruction_type_code,
1132     dossier.date_depot,
1133     dossier.date_decision,
1134     dossier.date_chantier,
1135     dossier.date_achevement,
1136     dossier.terrain_references_cadastrales as dossier_terrain_references_cadastrales,
1137 softime 14064 dossier.geoloc_latitude as dossier_geoloc_latitude,
1138     dossier.geoloc_longitude as dossier_geoloc_longitude,
1139     dossier.geoloc_rayon as dossier_geoloc_rayon,
1140 softime 13528 dossier.terrain_adresse_voie_numero as dossier_terrain_adresse_voie_numero,
1141     dossier.terrain_adresse_voie as dossier_terrain_adresse_voie,
1142     dossier.terrain_adresse_lieu_dit as dossier_terrain_adresse_lieu_dit,
1143     dossier.terrain_adresse_localite as dossier_terrain_adresse_localite,
1144     dossier.terrain_adresse_code_postal as dossier_terrain_adresse_code_postal,
1145     dossier.terrain_adresse_bp as dossier_terrain_adresse_bp,
1146     dossier.terrain_adresse_cedex as dossier_terrain_adresse_cedex,
1147     dossier_autorisation_type.code,
1148     dossier.date_limite,
1149     dossier.date_limite_incompletude,
1150     dossier.date_notification_delai,
1151     dossier.terrain_superficie as dossier_terrain_superficie,
1152     dossier.terrain_superficie_calculee as dossier_terrain_superficie_calculee,
1153     dossier.date_modification,
1154     dossier.hash_sitadel,
1155 mbroquet 3730
1156 softime 13528 arrondissement.code_impots as code_impots,
1157 mbroquet 3730
1158 softime 13528 autorite_competente.autorite_competente_sitadel,
1159     pp.type_demandeur,
1160     pp.qualite,
1161     civilite_pp.libelle as civilite_pp,
1162     pp.particulier_nom as pp_particulier_nom,
1163     pp.particulier_prenom as pp_particulier_prenom,
1164     pp.personne_morale_denomination as pp_personne_morale_denomination,
1165     pp.personne_morale_raison_sociale as pp_personne_morale_raison_sociale,
1166     pp.personne_morale_siret as pp_personne_morale_siret,
1167     pp.personne_morale_categorie_juridique as pp_personne_morale_categorie_juridique,
1168     civilite_pm.libelle as civilite_pm_libelle,
1169     pp.personne_morale_nom as pp_personne_morale_nom,
1170     pp.personne_morale_prenom as pp_personne_morale_prenom,
1171 mbroquet 3730
1172 softime 13528 pp.numero as pp_numero,
1173     pp.voie as pp_voie,
1174     pp.complement as pp_complement,
1175     pp.lieu_dit as pp_lieu_dit,
1176     pp.localite as pp_localite,
1177     pp.code_postal as pp_code_postal,
1178     pp.bp as pp_bp,
1179     pp.cedex as pp_cedex,
1180     pp.pays as pp_pays,
1181     pp.division_territoriale as pp_division_territoriale,
1182 mbroquet 3730
1183 softime 13528 pp.telephone_fixe as pp_telephone_fixe,
1184     pp.courriel as pp_courriel,
1185 mbroquet 3730
1186 softime 13528 donnees_techniques.co_archi_recours,
1187     donnees_techniques.am_terr_surf,
1188     donnees_techniques.am_lotiss,
1189     donnees_techniques.terr_juri_zac,
1190     donnees_techniques.terr_juri_afu,
1191     donnees_techniques.co_projet_desc,
1192     donnees_techniques.am_projet_desc,
1193     donnees_techniques.dm_projet_desc,
1194     donnees_techniques.co_cstr_nouv,
1195     donnees_techniques.co_cstr_exist,
1196     donnees_techniques.co_modif_aspect,
1197     donnees_techniques.co_modif_struct,
1198     donnees_techniques.co_cloture,
1199     donnees_techniques.co_trx_exten,
1200     donnees_techniques.co_trx_surelev,
1201     donnees_techniques.co_trx_nivsup,
1202     donnees_techniques.co_trx_amgt,
1203     donnees_techniques.co_anx_pisc,
1204     donnees_techniques.co_anx_gara,
1205     donnees_techniques.co_anx_veran,
1206     donnees_techniques.co_anx_abri,
1207     donnees_techniques.co_anx_autr,
1208     donnees_techniques.co_bat_niv_nb,
1209 softime 4636
1210 softime 13528 -- Tableau des destinations
1211     donnees_techniques.su_avt_shon1,
1212     donnees_techniques.su_avt_shon2,
1213     donnees_techniques.su_avt_shon3,
1214     donnees_techniques.su_avt_shon4,
1215     donnees_techniques.su_avt_shon5,
1216     donnees_techniques.su_avt_shon6,
1217     donnees_techniques.su_avt_shon7,
1218     donnees_techniques.su_avt_shon8,
1219     donnees_techniques.su_avt_shon9,
1220     donnees_techniques.su_demo_shon1,
1221     donnees_techniques.su_demo_shon2,
1222     donnees_techniques.su_demo_shon3,
1223     donnees_techniques.su_demo_shon4,
1224     donnees_techniques.su_demo_shon5,
1225     donnees_techniques.su_demo_shon6,
1226     donnees_techniques.su_demo_shon7,
1227     donnees_techniques.su_demo_shon8,
1228     donnees_techniques.su_demo_shon9,
1229     donnees_techniques.su_chge_shon1,
1230     donnees_techniques.su_chge_shon2,
1231     donnees_techniques.su_chge_shon3,
1232     donnees_techniques.su_chge_shon4,
1233     donnees_techniques.su_chge_shon5,
1234     donnees_techniques.su_chge_shon6,
1235     donnees_techniques.su_chge_shon7,
1236     donnees_techniques.su_chge_shon8,
1237     donnees_techniques.su_chge_shon9,
1238     donnees_techniques.su_sup_shon1,
1239     donnees_techniques.su_sup_shon2,
1240     donnees_techniques.su_sup_shon3,
1241     donnees_techniques.su_sup_shon4,
1242     donnees_techniques.su_sup_shon5,
1243     donnees_techniques.su_sup_shon6,
1244     donnees_techniques.su_sup_shon7,
1245     donnees_techniques.su_sup_shon8,
1246     donnees_techniques.su_sup_shon9,
1247     donnees_techniques.su_cstr_shon1,
1248     donnees_techniques.su_cstr_shon2,
1249     donnees_techniques.su_cstr_shon3,
1250     donnees_techniques.su_cstr_shon4,
1251     donnees_techniques.su_cstr_shon5,
1252     donnees_techniques.su_cstr_shon6,
1253     donnees_techniques.su_cstr_shon7,
1254     donnees_techniques.su_cstr_shon8,
1255     donnees_techniques.su_cstr_shon9,
1256     donnees_techniques.su_tot_shon1,
1257     donnees_techniques.su_tot_shon2,
1258     donnees_techniques.su_tot_shon3,
1259     donnees_techniques.su_tot_shon4,
1260     donnees_techniques.su_tot_shon5,
1261     donnees_techniques.su_tot_shon6,
1262     donnees_techniques.su_tot_shon7,
1263     donnees_techniques.su_tot_shon8,
1264     donnees_techniques.su_tot_shon9,
1265     -- XXX valeurs obsolètes mais utilisées dans les conditions
1266     -- pour afficher les messages d'incohérence
1267     donnees_techniques.su_trsf_shon1,
1268     donnees_techniques.su_trsf_shon2,
1269     donnees_techniques.su_trsf_shon3,
1270     donnees_techniques.su_trsf_shon4,
1271     donnees_techniques.su_trsf_shon5,
1272     donnees_techniques.su_trsf_shon6,
1273     donnees_techniques.su_trsf_shon7,
1274     donnees_techniques.su_trsf_shon8,
1275     donnees_techniques.su_trsf_shon9,
1276 softime 4636
1277 softime 13528 -- Tableau des sous-destinations
1278     donnees_techniques.su2_avt_shon1,
1279     donnees_techniques.su2_avt_shon2,
1280     donnees_techniques.su2_avt_shon3,
1281     donnees_techniques.su2_avt_shon4,
1282     donnees_techniques.su2_avt_shon5,
1283     donnees_techniques.su2_avt_shon6,
1284     donnees_techniques.su2_avt_shon7,
1285     donnees_techniques.su2_avt_shon8,
1286     donnees_techniques.su2_avt_shon9,
1287     donnees_techniques.su2_avt_shon10,
1288     donnees_techniques.su2_avt_shon11,
1289     donnees_techniques.su2_avt_shon12,
1290     donnees_techniques.su2_avt_shon13,
1291     donnees_techniques.su2_avt_shon14,
1292     donnees_techniques.su2_avt_shon15,
1293     donnees_techniques.su2_avt_shon16,
1294     donnees_techniques.su2_avt_shon17,
1295     donnees_techniques.su2_avt_shon18,
1296     donnees_techniques.su2_avt_shon19,
1297     donnees_techniques.su2_avt_shon20,
1298     donnees_techniques.su2_avt_shon21,
1299     donnees_techniques.su2_avt_shon22,
1300     donnees_techniques.su2_demo_shon1,
1301     donnees_techniques.su2_demo_shon2,
1302     donnees_techniques.su2_demo_shon3,
1303     donnees_techniques.su2_demo_shon4,
1304     donnees_techniques.su2_demo_shon5,
1305     donnees_techniques.su2_demo_shon6,
1306     donnees_techniques.su2_demo_shon7,
1307     donnees_techniques.su2_demo_shon8,
1308     donnees_techniques.su2_demo_shon9,
1309     donnees_techniques.su2_demo_shon10,
1310     donnees_techniques.su2_demo_shon11,
1311     donnees_techniques.su2_demo_shon12,
1312     donnees_techniques.su2_demo_shon13,
1313     donnees_techniques.su2_demo_shon14,
1314     donnees_techniques.su2_demo_shon15,
1315     donnees_techniques.su2_demo_shon16,
1316     donnees_techniques.su2_demo_shon17,
1317     donnees_techniques.su2_demo_shon18,
1318     donnees_techniques.su2_demo_shon19,
1319     donnees_techniques.su2_demo_shon20,
1320     donnees_techniques.su2_demo_shon21,
1321     donnees_techniques.su2_demo_shon22,
1322     donnees_techniques.su2_chge_shon1,
1323     donnees_techniques.su2_chge_shon2,
1324     donnees_techniques.su2_chge_shon3,
1325     donnees_techniques.su2_chge_shon4,
1326     donnees_techniques.su2_chge_shon5,
1327     donnees_techniques.su2_chge_shon6,
1328     donnees_techniques.su2_chge_shon7,
1329     donnees_techniques.su2_chge_shon8,
1330     donnees_techniques.su2_chge_shon9,
1331     donnees_techniques.su2_chge_shon10,
1332     donnees_techniques.su2_chge_shon11,
1333     donnees_techniques.su2_chge_shon12,
1334     donnees_techniques.su2_chge_shon13,
1335     donnees_techniques.su2_chge_shon14,
1336     donnees_techniques.su2_chge_shon15,
1337     donnees_techniques.su2_chge_shon16,
1338     donnees_techniques.su2_chge_shon17,
1339     donnees_techniques.su2_chge_shon18,
1340     donnees_techniques.su2_chge_shon19,
1341     donnees_techniques.su2_chge_shon20,
1342     donnees_techniques.su2_chge_shon21,
1343     donnees_techniques.su2_chge_shon22,
1344     donnees_techniques.su2_sup_shon1,
1345     donnees_techniques.su2_sup_shon2,
1346     donnees_techniques.su2_sup_shon3,
1347     donnees_techniques.su2_sup_shon4,
1348     donnees_techniques.su2_sup_shon5,
1349     donnees_techniques.su2_sup_shon6,
1350     donnees_techniques.su2_sup_shon7,
1351     donnees_techniques.su2_sup_shon8,
1352     donnees_techniques.su2_sup_shon9,
1353     donnees_techniques.su2_sup_shon10,
1354     donnees_techniques.su2_sup_shon11,
1355     donnees_techniques.su2_sup_shon12,
1356     donnees_techniques.su2_sup_shon13,
1357     donnees_techniques.su2_sup_shon14,
1358     donnees_techniques.su2_sup_shon15,
1359     donnees_techniques.su2_sup_shon16,
1360     donnees_techniques.su2_sup_shon17,
1361     donnees_techniques.su2_sup_shon18,
1362     donnees_techniques.su2_sup_shon19,
1363     donnees_techniques.su2_sup_shon20,
1364     donnees_techniques.su2_sup_shon21,
1365     donnees_techniques.su2_sup_shon22,
1366     donnees_techniques.su2_cstr_shon1,
1367     donnees_techniques.su2_cstr_shon2,
1368     donnees_techniques.su2_cstr_shon3,
1369     donnees_techniques.su2_cstr_shon4,
1370     donnees_techniques.su2_cstr_shon5,
1371     donnees_techniques.su2_cstr_shon6,
1372     donnees_techniques.su2_cstr_shon7,
1373     donnees_techniques.su2_cstr_shon8,
1374     donnees_techniques.su2_cstr_shon9,
1375     donnees_techniques.su2_cstr_shon10,
1376     donnees_techniques.su2_cstr_shon11,
1377     donnees_techniques.su2_cstr_shon12,
1378     donnees_techniques.su2_cstr_shon13,
1379     donnees_techniques.su2_cstr_shon14,
1380     donnees_techniques.su2_cstr_shon15,
1381     donnees_techniques.su2_cstr_shon16,
1382     donnees_techniques.su2_cstr_shon17,
1383     donnees_techniques.su2_cstr_shon18,
1384     donnees_techniques.su2_cstr_shon19,
1385     donnees_techniques.su2_cstr_shon20,
1386     donnees_techniques.su2_cstr_shon21,
1387     donnees_techniques.su2_cstr_shon22,
1388     donnees_techniques.su2_tot_shon1,
1389     donnees_techniques.su2_tot_shon2,
1390     donnees_techniques.su2_tot_shon3,
1391     donnees_techniques.su2_tot_shon4,
1392     donnees_techniques.su2_tot_shon5,
1393     donnees_techniques.su2_tot_shon6,
1394     donnees_techniques.su2_tot_shon7,
1395     donnees_techniques.su2_tot_shon8,
1396     donnees_techniques.su2_tot_shon9,
1397     donnees_techniques.su2_tot_shon10,
1398     donnees_techniques.su2_tot_shon11,
1399     donnees_techniques.su2_tot_shon12,
1400     donnees_techniques.su2_tot_shon13,
1401     donnees_techniques.su2_tot_shon14,
1402     donnees_techniques.su2_tot_shon15,
1403     donnees_techniques.su2_tot_shon16,
1404     donnees_techniques.su2_tot_shon17,
1405     donnees_techniques.su2_tot_shon18,
1406     donnees_techniques.su2_tot_shon19,
1407     donnees_techniques.su2_tot_shon20,
1408     donnees_techniques.su2_tot_shon21,
1409     donnees_techniques.su2_tot_shon22,
1410 softime 4636
1411 softime 13528 donnees_techniques.co_sp_transport,
1412     donnees_techniques.co_sp_enseign,
1413     donnees_techniques.co_sp_sante,
1414     donnees_techniques.co_sp_act_soc,
1415     donnees_techniques.co_sp_ouvr_spe,
1416     donnees_techniques.co_sp_culture,
1417     donnees_techniques.dm_tot_log_nb,
1418     donnees_techniques.co_tot_ind_nb,
1419     donnees_techniques.co_tot_coll_nb,
1420     donnees_techniques.co_tot_log_nb,
1421     donnees_techniques.co_resid_agees,
1422     donnees_techniques.co_resid_etud,
1423     donnees_techniques.co_resid_tourism,
1424     donnees_techniques.co_resid_hot_soc,
1425     donnees_techniques.co_resid_hand,
1426     donnees_techniques.co_resid_autr,
1427     donnees_techniques.co_resid_autr_desc,
1428     donnees_techniques.co_uti_pers,
1429     donnees_techniques.co_uti_princ,
1430     donnees_techniques.co_uti_secon,
1431     donnees_techniques.co_uti_vente,
1432     donnees_techniques.co_uti_loc,
1433     donnees_techniques.co_foyer_chamb_nb,
1434     donnees_techniques.co_fin_lls_nb,
1435     donnees_techniques.co_fin_aa_nb,
1436     donnees_techniques.co_fin_ptz_nb,
1437     donnees_techniques.co_fin_autr_nb,
1438     donnees_techniques.co_mais_piece_nb,
1439     donnees_techniques.co_log_1p_nb,
1440     donnees_techniques.co_log_2p_nb,
1441     donnees_techniques.co_log_3p_nb,
1442     donnees_techniques.co_log_4p_nb,
1443     donnees_techniques.co_log_5p_nb,
1444     donnees_techniques.co_log_6p_nb,
1445     donnees_techniques.mod_desc,
1446 mbroquet 3730
1447 softime 13528 donnees_techniques.doc_date,
1448     donnees_techniques.terr_div_surf_av_div,
1449     donnees_techniques.doc_tot_trav,
1450     donnees_techniques.doc_tranche_trav,
1451     donnees_techniques.doc_tranche_trav_desc,
1452     donnees_techniques.doc_surf,
1453     donnees_techniques.doc_nb_log,
1454     donnees_techniques.doc_nb_log_indiv,
1455     donnees_techniques.doc_nb_log_coll,
1456     donnees_techniques.doc_nb_log_lls,
1457     donnees_techniques.doc_nb_log_aa,
1458     donnees_techniques.doc_nb_log_ptz,
1459     donnees_techniques.doc_nb_log_autre,
1460     donnees_techniques.daact_date,
1461     donnees_techniques.daact_date_chgmt_dest,
1462     donnees_techniques.daact_tot_trav,
1463     donnees_techniques.daact_tranche_trav,
1464     donnees_techniques.daact_tranche_trav_desc,
1465     donnees_techniques.daact_surf,
1466     donnees_techniques.daact_nb_log,
1467     donnees_techniques.daact_nb_log_indiv,
1468     donnees_techniques.daact_nb_log_coll,
1469     donnees_techniques.daact_nb_log_lls,
1470     donnees_techniques.daact_nb_log_aa,
1471     donnees_techniques.daact_nb_log_ptz,
1472     donnees_techniques.daact_nb_log_autre,
1473 mbroquet 3730
1474 softime 13528 dossier_autorisation.date_depot as date_depot_da,
1475     dossier_autorisation.date_decision as date_decision_da,
1476     dossier_autorisation.date_validite as date_validite_da,
1477     dossier_autorisation.date_chantier as date_chantier_da,
1478     dossier_autorisation.date_achevement as date_achevement_da,
1479     avis_decision.typeavis as typeavis_da,
1480     avis_decision.sitadel,
1481     avis_decision.sitadel_motif,
1482     avis_decision.typeavis,
1483     etat.statut as statut_di
1484 mbroquet 3730
1485 softime 13528 FROM
1486     %1\$sdossier
1487     INNER JOIN %1\$sdossier_instruction_type
1488     ON dossier.dossier_instruction_type =
1489     dossier_instruction_type.dossier_instruction_type
1490     INNER JOIN %1\$sdossier_autorisation_type_detaille
1491     ON dossier_instruction_type.dossier_autorisation_type_detaille
1492     =dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1493     INNER JOIN %1\$sdossier_autorisation_type
1494     ON dossier_autorisation_type.dossier_autorisation_type
1495     =dossier_autorisation_type_detaille.dossier_autorisation_type
1496     INNER JOIN %1\$sgroupe
1497     ON dossier_autorisation_type.groupe = groupe.groupe
1498     AND groupe.code != 'CTX'
1499     INNER JOIN %1\$sdossier_autorisation
1500     ON dossier_autorisation.dossier_autorisation
1501     =dossier.dossier_autorisation
1502     INNER JOIN %1\$sautorite_competente
1503     ON autorite_competente.autorite_competente
1504     =dossier.autorite_competente
1505 mbroquet 3730
1506 softime 13528 LEFT JOIN %1\$sdonnees_techniques
1507     ON donnees_techniques.dossier_instruction = dossier.dossier
1508     LEFT JOIN %1\$savis_decision
1509     ON avis_decision.avis_decision = dossier.avis_decision
1510     LEFT JOIN %1\$slien_dossier_demandeur as ldd_pp
1511     ON ldd_pp.dossier = dossier.dossier
1512     LEFT JOIN %1\$sdemandeur as pp
1513     ON ldd_pp.demandeur = pp.demandeur
1514     LEFT JOIN %1\$scivilite as civilite_pp
1515     ON civilite_pp.civilite = pp.particulier_civilite
1516     LEFT JOIN %1\$scivilite as civilite_pm
1517     ON civilite_pm.civilite = pp.personne_morale_civilite
1518     LEFT JOIN %1\$setat
1519     ON etat.etat = dossier.etat
1520     LEFT JOIN %1\$sarrondissement
1521     ON dossier_autorisation.arrondissement=arrondissement.arrondissement
1522    
1523     WHERE
1524     dossier_instruction_type.mouvement_sitadel IS NOT NULL
1525     AND ldd_pp.petitionnaire_principal is TRUE
1526     AND (dossier.date_modification >= '%2\$s'
1527     AND dossier.date_modification <= '%3\$s')
1528     %4\$s
1529     ORDER
1530     by dossier_instruction_type.mouvement_sitadel,
1531     dossier.dossier",
1532     DB_PREFIXE,
1533     $this->f->db->escapeSimple($datedebut),
1534     $this->f->db->escapeSimple($datefin),
1535     $filtreCollectivite
1536     );
1537 mbroquet 3730 //Exécution de la requête
1538 softime 13528 $query = $this->f->get_all_results_from_db_query(
1539     $sql,
1540     array(
1541     'origin' => __METHOD__
1542     ));
1543 mbroquet 3730 $export="";
1544 softime 13528 foreach ($query['result'] as $row) {
1545 mbroquet 3730 // initialisation de la classe permettant la mise en forme de chaque ligne de l'export
1546     require_once "../obj/export_sitadel.class.php";
1547     $export_sitadel = new export_sitadel($row['dossier'], $this->f);
1548     $export_sitadel->setRow($row);
1549     //Ajout du fichier de variable
1550     if(file_exists ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php")) {
1551     include ("../sql/".OM_DB_PHPTYPE."/export_sitadel.inc.php");
1552     }
1553     //
1554 softime 13528 $export_sitadel->setVal($val);
1555 mbroquet 3730 $departement = $export_sitadel->getDepartement($row["collectivite"]);
1556     $commune = $export_sitadel->getCommune($row["collectivite"]);
1557     $region = $this->f->getParameter("region");
1558 softime 4636
1559     // Initialisation des variables pour le tableau des
1560     // surfaces en version 1
1561     $prefix_su = 'su';
1562     $count_su = 9;
1563     // S'il faut utiliser le tableau des surfaces en
1564     // version 2
1565     if ($export_sitadel->get_tab_su_version() === 2) {
1566     //
1567     $prefix_su = 'su2';
1568     $count_su = 20;
1569     }
1570    
1571 softime 4838 // Récupère la version du dossier d'instruction depuis son
1572     // numéro
1573     $version = 0;
1574 softime 14064 $version = intval($this->get_di_numero_suffixe($row['dossier']));
1575 softime 4838
1576 mbroquet 3730 // Mouvement de dépôt
1577     $depot="";
1578    
1579     // Tous les mouvements autres que transfert ont comme mouvement le code DEPOT
1580     // les décisions devant êtres précédées par le dépôt correspondant,
1581     // les dossiers avec date de décision comprise dans l'interval fourni sont
1582     // réaffichés en tant que dépôts (mouvement DEPOT)
1583     if (($row['mouvement_sitadel'] == 'DEPOT'||($row['mouvement_sitadel'] == 'MODIFICATIF'
1584 softime 7996 AND $row['statut_di']=='cloture' AND $row['typeavis']=='F'))) {
1585 softime 4838 $depot.=$export_sitadel->entete("DEPOT",$departement,$commune, $version);
1586 mbroquet 3730 $depot.=$export_sitadel->etatcivil();
1587     $depot.=$export_sitadel->adresse();
1588     $depot.=$export_sitadel->delegataire();
1589     $depot.=$export_sitadel->meltel($row['mouvement_sitadel']);
1590 softime 13528 $depot.=$export_sitadel->adresse_terrain();
1591 mbroquet 3730 $depot.=$export_sitadel->parcelle();
1592     // ===========================
1593     // contrat maison individuelle
1594     // ===========================
1595     // sitadel : contrat|
1596     // openads : non renseigne
1597     $depot.= $export_sitadel->defaultValue('contrat')."|";
1598     // ==========
1599     // architecte
1600     // ==========
1601     // sitadel : architecte|
1602     // openads : données techniques.co_archi_recours
1603     $depot.= ($row['co_archi_recours'] == "t")?"1|":"0|";
1604     // =====================
1605     // utilisation data cnil
1606     // ======================
1607     // sitadel : cnil
1608     // openads : non renseigne
1609     $depot.= $export_sitadel->defaultValue('cnil');
1610 softime 13528 // fin d enregistrement depot
1611 mbroquet 3730 $depot.="\n";
1612     }
1613    
1614     // Seuls les dossier de type transfert ont comme mouvement le code TRANSFERT
1615     $transfert ="";
1616 softime 7996 if ($row['mouvement_sitadel']=='TRANSFERT') {
1617 softime 4838 $transfert.=$export_sitadel->entete("TRANSFERT",$departement,$commune, $version);
1618 mbroquet 3730 $transfert.=$export_sitadel->etatcivil();
1619 softime 13528 $transfert.=$export_sitadel->adresse();
1620 mbroquet 3730 $transfert.=$export_sitadel->meltel($row['mouvement_sitadel']);
1621     $transfert.="\n";
1622     }
1623    
1624    
1625     // Une ligne de mouvement DECISION est insérée après chaque ligne
1626     // de mouvement DEPOT
1627     $decision="";
1628     if ($row['mouvement_sitadel'] != 'TRANSFERT'
1629     and $row['mouvement_sitadel'] != 'SUPPRESSION'
1630 softime 7996 and $row['mouvement_sitadel'] == 'DEPOT') {
1631 mbroquet 3730
1632     //Ajout de l'entête
1633 softime 4838 $decision.=$export_sitadel->entete("DECISION",$departement,$commune, $version);
1634 mbroquet 3730
1635     //Ajout du groupe 1
1636     $decision.= $export_sitadel->decision_groupe1();
1637     // Si la décision est favorable, on remplit le groupe 2
1638     if ( $row['sitadel'] == 2 || $row['sitadel'] == 4 || $row['sitadel'] == 5
1639 softime 13528 || $row['sitadel'] === '' || $row['sitadel'] === 0){
1640 mbroquet 3730 //
1641     $decision.= $export_sitadel->amenagement_terrain();
1642     //Nature du projet
1643     $natproj = 2;
1644     $natprojlib= array(
1645     1=>_("Nouvelle construction"),
1646     2=>_("Travaux sur construction existante"),
1647     3=>_("Nouvelle construction et travaux sur construction"),
1648     );
1649     if ( isset($row['co_cstr_nouv']) && isset($row['co_cstr_exist']) &&
1650     $row['co_cstr_nouv'] == 't' &&
1651     $row['co_cstr_exist'] == 't' ){
1652     $natproj = 3;
1653     }
1654     //Nouvelle construction
1655     elseif ( isset($row['co_cstr_nouv']) && $row['co_cstr_nouv'] == 't' ) {
1656     $natproj = 1;
1657     }
1658     //
1659 softime 4636 $su_avt_shon = $export_sitadel->shon("avt");
1660 mbroquet 3730 //Si la SHON existante avant travaux est supérieur à la SHON
1661     //démolie alors la variable natproj est égale à 2
1662     $shonExistante = 0;
1663     $shonDemolie = 0;
1664 softime 4636 // Pour chaque ligne du tableau
1665     for ($i = 1; $i <= $count_su; $i++) {
1666     //
1667 softime 13528 $shonExistante += floor(floatval($row[$prefix_su.'_avt_shon'.$i]));
1668     $shonDemolie += floor(floatval($row[$prefix_su.'_demo_shon'.$i]));
1669 mbroquet 3730 }
1670     //Si la SHON existante avant travaux et la SHON démolie sont
1671     //égales alors la variable natproj est égale à 1
1672     if ( $shonExistante == 0 && $shonDemolie == 0 && $natproj != 1 &&
1673     $row['code'] != 'DP' && $row['code'] != 'PA') {
1674     $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";
1675     } elseif ( $shonExistante > $shonDemolie && $natproj != 2 ){
1676 softime 4640 $erreur .= _("Dossier ").$row['dossier']." \"".$natprojlib[$natproj]."\" "._("La SHON existante avant travaux ne doit pas être supérieure à la SHON démolie.")."\n";
1677 mbroquet 3730 }
1678     $decision .= $su_avt_shon;
1679    
1680 softime 4636 $su_demo_shon = $export_sitadel->shon("demo");
1681 mbroquet 3730 //La SHON démolie s'accompagne obligatoirement de la shon
1682     //existante avant travaux
1683     if ( $shonDemolie != 0 && $shonExistante == 0 ){
1684     $erreur .= _("Dossier ").$row['dossier']." "._("La SHON demolie s'accompagne obligatoirement de la SHON existante avant travaux.")."\n";
1685     }
1686     $decision .= $su_demo_shon;
1687     //
1688 softime 4636 $su_sup_shon = $export_sitadel->shon("sup");
1689     $su_chge_shon = $export_sitadel->shon("chge");
1690 mbroquet 3730 if ( strcasecmp($su_sup_shon, $su_chge_shon) != 0){
1691     //
1692 softime 4640 $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";
1693 mbroquet 3730 }
1694     $decision .= $su_sup_shon;
1695     $decision .= $su_chge_shon;
1696 softime 4636 $decision .= $export_sitadel->shon("cstr");
1697 mbroquet 3730 $decision .= "0|0|0|0|0|0|0|0|0|";
1698 softime 4640 // Les SHON créées par changement de destination ou
1699     // de sous-destination s'accompagnent obligatoirement
1700     // de SHON existante avant travaux non nulle
1701 mbroquet 3730 if (preg_match("/[0|]{7}/", $su_chge_shon) &&
1702     preg_match("/[0|]{7}/", $su_avt_shon)){
1703    
1704 softime 4640 $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";
1705 mbroquet 3730 }
1706     // Un nombre de logements démolis strictement positif doit
1707     // s'accompagner obligatoirement de SHON démolie.
1708     if($row['dm_tot_log_nb'] > 0) {
1709 softime 4636 if($export_sitadel->get_shon_val('demo', 1) <= 0) {
1710 mbroquet 3730 //
1711     $erreur .= _("Dossier ").$row['dossier']." "._("Un nombre de logements demolis strictement positif doit s'accompagner obligatoirement de SHON demolie.")."\n";
1712     }
1713     }
1714     // Un nombre de logements créés strictement positif doit
1715     // s'accompagner obligatoirement de SHON créée ou de SHON
1716 softime 4640 // créée par changement de destination ou de sous-destination
1717     // ayant pour destination l'habitation.
1718     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)) {
1719 mbroquet 3730 //
1720 softime 4640 $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";
1721 mbroquet 3730 }
1722    
1723     // La SHON créée ou issue de la transformation
1724     // suffixée par 9 (intérêt collectif ou service public) doit
1725     // obligatoirement s'accompagner de la décomposition
1726     // en sous modalité renseignée par la variable cpublic et réciproquement.
1727    
1728     // Test si une valeur est true
1729     $cpublic = FALSE;
1730     if (isset($row['co_sp_transport']) && $row['co_sp_transport'] == 't') {
1731     $cpublic = TRUE;
1732     }
1733     if (isset($row['co_sp_enseign']) && $row['co_sp_enseign'] == 't') {
1734     $cpublic = TRUE;
1735     }
1736     if (isset($row['co_sp_sante']) && $row['co_sp_sante'] == 't') {
1737     $cpublic = TRUE;
1738     }
1739     if (isset($row['co_sp_act_soc']) && $row['co_sp_act_soc'] == 't') {
1740     $cpublic = TRUE;
1741     }
1742     if (isset($row['co_sp_ouvr_spe']) && $row['co_sp_ouvr_spe'] == 't') {
1743     $cpublic = TRUE;
1744     }
1745     if (isset($row['co_sp_culture']) && $row['co_sp_culture'] == 't') {
1746     $cpublic = TRUE;
1747     }
1748     //
1749 softime 4640 if($cpublic !== TRUE AND ($export_sitadel->get_shon_val('cstr', 9) > 0 OR $export_sitadel->get_shon_val('chge', 9) > 0)) {
1750     $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";
1751 mbroquet 3730 }
1752    
1753     // La destination principale du logement mise à résidence
1754     // principale ou résidence secondaire doit obligatoirement
1755     // s'accompagner d'un mode d'utilisation à occupation personnelle
1756     if($row['co_uti_princ'] == 't' OR $row['co_uti_secon'] == 't') {
1757     if($row['co_uti_pers'] != 't') {
1758    
1759     $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";
1760     }
1761     }
1762    
1763     $decision.= $export_sitadel->destination($row['mouvement_sitadel']);
1764    
1765     // Le nombre total de logements créés (variable nbtotlog)
1766     // doit être égal à la somme des nombres de logements créés
1767     // ventilés par type de financement
1768 softime 9245 if(intval($row['co_tot_log_nb']) != (intval($row['co_fin_lls_nb']) + intval($row['co_fin_aa_nb']) +
1769     intval($row['co_fin_ptz_nb']) + intval($row['co_fin_autr_nb']))) {
1770 mbroquet 3730
1771     $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";
1772     }
1773    
1774     $decision.= $export_sitadel->repartitionFinan();
1775    
1776     // Le nombre total de logements créés (variable nbtotlog)
1777     // doit être égal à la totalisation de la répartition des
1778     // logements par nombre de pièces
1779 softime 9245 if(intval($row['co_tot_log_nb']) != (intval($row['co_log_1p_nb']) + intval($row['co_log_2p_nb']) +
1780     intval($row['co_log_3p_nb']) + intval($row['co_log_4p_nb']) + intval($row['co_log_5p_nb']) +
1781     intval($row['co_log_6p_nb']))) {
1782 mbroquet 3730
1783     $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";
1784     }
1785    
1786     $decision.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1787     }
1788     else {
1789     //
1790     $decision.= str_repeat("|", 6);
1791     if($row['code']=='DP'){
1792     $decision .= "00000|";
1793     }else{
1794     $decision .= "|";
1795     }
1796     $decision .= "0000|00000|";
1797     $decision.= str_repeat("|", 74);
1798     }
1799     $decision.="\n";
1800     }
1801    
1802     // modificatif
1803     $modificatif='';
1804     if($row['mouvement_sitadel'] == 'MODIFICATIF' AND $row['statut_di']=='cloture' AND
1805 softime 7996 $row['typeavis']=='F') {
1806 softime 4838 $modificatif.=$export_sitadel->entete("MODIFICATIF",$departement,$commune, $version);
1807 mbroquet 3730
1808     $modificatif.= $export_sitadel->decision_groupe1();
1809    
1810     if(isset($row['date_decision']) or $row['date_decision']==""){
1811     // avis_sitadel et avis_sitadel_motif
1812     // si la decision est favorable, envoi des informations statistiques
1813     if($row["sitadel"] == 2 or $row["sitadel"] == 4
1814     or $row["sitadel"] == 5){
1815     // si accordé : ajout du 2nd groupe d'informations
1816     $modificatif .= $export_sitadel->adresse_terrain(); // adresse du terrain
1817     $modificatif .= $export_sitadel->parcelle(); // 3 premières parcelles
1818     $modificatif .= $export_sitadel->modificatif_terrain(); // Informations complémentaires
1819    
1820 softime 4636 $modificatif.= $export_sitadel->shon("avt");
1821     $modificatif.= $export_sitadel->shon("demo");
1822     $modificatif.= $export_sitadel->shon("chge");
1823     $modificatif.= $export_sitadel->shon("trsf");
1824     $modificatif.= $export_sitadel->shon("cstr");
1825 mbroquet 3730
1826     $modificatif.= "|||||||||";
1827     $modificatif.= $export_sitadel->destination($row['mouvement_sitadel']);
1828     $modificatif.= $export_sitadel->repartitionFinan();
1829     $modificatif.= $export_sitadel->repartitionNbPiece($row['mouvement_sitadel']);
1830     }
1831     else {
1832     $modificatif .= str_repeat("|", 90);
1833     }
1834     }
1835     else {
1836     $modificatif .= str_repeat("|", 90);
1837     }
1838    
1839     $modificatif.="\n";
1840     }
1841    
1842     // Mouvement suppression
1843     $suppression = '';
1844     if($row['mouvement_sitadel'] == 'SUPPRESSION') {
1845 softime 4838 $suppression .= $export_sitadel->entete("SUPPRESSION",$departement,$commune, $version);
1846 mbroquet 3730 $suppression .= "\n";
1847     }
1848    
1849     // Règles sur le mouvement suivi
1850     $suivi="";
1851     if($row['mouvement_sitadel'] == 'SUIVI' and
1852     ($row['date_chantier'] >= $datedebut and $row['date_chantier']<=$datefin) ||
1853     ($row['date_achevement'] >= $datedebut and $row['date_achevement']<=$datefin)){
1854     // Si le dossier est une DOC
1855     if($row['dossier_instruction_type_code']=='DOC'){
1856     // Une ouverture de chantier ne peut concerner qu'un permis autorisé
1857     if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1858     $erreur .= _("Dossier ").$row['dossier']." "._("Une ouverture de chantier ne peut concerner qu'un permis autorise.")."\n";
1859     }
1860     // La date d'ouverture de chantier doit être supérieur à la date d'autorisation
1861     if($row['doc_date'] > $row['date_decision_da']) {
1862     $erreur .= _("Dossier ").$row['dossier']." "._("La date d'ouverture de chantier doit être superieur a la date d'autorisation.")."\n";
1863     }
1864     // Un achèvement de chantier ne peut concerner qu'un permis autorisé
1865     if($row['typeavis_da'] != 'F'&&$row['typeavis_da'] != '') {
1866     $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis autorise.")."\n";
1867     }
1868     if( $row['date_chantier_da'] == "" && $row['date_achevement']!="") {
1869     $erreur .= _("Dossier ").$row['dossier']." "._("Un achevement de chantier ne peut concerner qu'un permis sur lequel un chantier a ete ouvert.")."\n";
1870     }
1871     // La date d'achevement de travaux doit être supérieur à la date d'ouverture des travaux
1872     if($row['daact_date'] > $row['date_chantier_da']) {
1873     $erreur .= _("Dossier ").$row['dossier']." "._("La date d'achevement de travaux doit etre superieur a la date d'ouverture des travaux.")."\n";
1874     }
1875 softime 4838 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1876 mbroquet 3730 $suivi.=$export_sitadel->chantier($row);
1877     //On récupère la DAACT si elle existe
1878     $sqlDAACT = "SELECT
1879     donnees_techniques.daact_date,
1880     donnees_techniques.daact_date_chgmt_dest,
1881     donnees_techniques.daact_tot_trav,
1882     donnees_techniques.daact_tranche_trav,
1883     donnees_techniques.daact_tranche_trav_desc,
1884     donnees_techniques.daact_surf,
1885     donnees_techniques.daact_nb_log,
1886     donnees_techniques.daact_nb_log_indiv,
1887     donnees_techniques.daact_nb_log_coll,
1888     donnees_techniques.daact_nb_log_lls,
1889     donnees_techniques.daact_nb_log_aa,
1890     donnees_techniques.daact_nb_log_ptz,
1891     donnees_techniques.daact_nb_log_autre,
1892     etat.statut as statut_di
1893    
1894     FROM ".DB_PREFIXE."dossier
1895     LEFT JOIN ".DB_PREFIXE."donnees_techniques
1896     ON dossier.dossier=donnees_techniques.dossier_instruction
1897     LEFT JOIN ".DB_PREFIXE."etat
1898     ON dossier.etat = etat.etat
1899     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1900     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
1901     WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1902     dossier_instruction_type.code = 'DAACT' and mouvement_sitadel='SUIVI'";
1903     $resDAACT = $this->f->db -> query ($sqlDAACT);
1904     $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDAACT."\")", VERBOSE_MODE);
1905     $this->f->isDatabaseError($resDAACT);
1906     $rowDAACT=& $resDAACT->fetchRow(DB_FETCHMODE_ASSOC);
1907     $suivi.=$export_sitadel->achevement($rowDAACT);
1908     $suivi.="\n";
1909     }
1910     elseif($row['dossier_instruction_type_code']=='DAACT'){
1911    
1912     //On vérifie qu'une DOC existe
1913     $sqlDOC = "SELECT dossier.dossier,
1914     dossier.date_chantier,
1915     donnees_techniques.doc_date,
1916     donnees_techniques.terr_div_surf_av_div,
1917     donnees_techniques.doc_tot_trav,
1918     donnees_techniques.doc_tranche_trav,
1919     donnees_techniques.doc_tranche_trav_desc,
1920     donnees_techniques.doc_surf,
1921     donnees_techniques.doc_nb_log,
1922     donnees_techniques.doc_nb_log_indiv,
1923     donnees_techniques.doc_nb_log_coll,
1924     donnees_techniques.doc_nb_log_lls,
1925     donnees_techniques.doc_nb_log_aa,
1926     donnees_techniques.doc_nb_log_ptz,
1927     donnees_techniques.doc_nb_log_autre
1928     FROM ".DB_PREFIXE."dossier
1929     LEFT JOIN ".DB_PREFIXE."donnees_techniques
1930     ON dossier.dossier=donnees_techniques.dossier_instruction
1931     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
1932     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
1933     WHERE dossier.dossier_autorisation ='".$row['dossier_autorisation']."' AND
1934     dossier_instruction_type.code = 'DOC' and mouvement_sitadel='SUIVI'";
1935     $resDOC = $this->f->db -> query ($sqlDOC);
1936     $this->f->addToLog("dossier.class.php : db->query(\"".$sqlDOC."\")", VERBOSE_MODE);
1937     $this->f->isDatabaseError($resDOC);
1938     $rowDOC=& $resDOC->fetchRow(DB_FETCHMODE_ASSOC);
1939 softime 15037 // Vérifie si il y a une DOC en cours de validité associé au dossier. Cad si :
1940     // - la requête retourne un dossier avec une DOC mais le chantier n'a pas débuter ou est fini
1941     // - la requête ne retourne pas de dossier, il n'y a donc pas de DOC associée au dossier
1942     if ((isset($rowDOC['dossier'])
1943     && ($rowDOC['date_chantier'] < $datedebut
1944     || $rowDOC['date_chantier'] > $datefin))
1945     || ! isset($rowDOC['dossier'])) {
1946 mbroquet 3730 //
1947 softime 4838 $suivi.=$export_sitadel->entete("SUIVI",$departement,$commune, $version);//8|
1948 mbroquet 3730 $suivi.=$export_sitadel->chantier($rowDOC);
1949     $suivi.=$export_sitadel->achevement($row);
1950 softime 7996 $suivi.="\n";
1951 mbroquet 3730 }
1952     }
1953 softime 7996 }
1954     // Ligne SITADEL généré
1955     $line_sitadel = $depot.$decision.$transfert.$modificatif.$suivi.$suppression;
1956     if ($line_sitadel !== '') {
1957     // Hash la ligne SITADEL
1958     $hash_sitadel = md5($line_sitadel);
1959     // Si le hash de la ligne générée est différent du hash
1960     // sauvegardé sur le dossier
1961     if ($row['hash_sitadel'] !== $hash_sitadel) {
1962     // Met la ligne dans l'export
1963     $export .= $line_sitadel;
1964     // Met à jour le hash SITADEL du dossier
1965     $inst_di = $this->get_inst_dossier($row['dossier']);
1966     $inst_di->update_hash_sitadel($hash_sitadel);
1967     } else {
1968     // Supprime les erreurs liées à la ligne qui ne sera
1969     // pas exportée
1970     $erreur = '';
1971     }
1972     }
1973 mbroquet 3730 } // fin while
1974    
1975     /**
1976     *
1977     */
1978     //
1979     if (DBCHARSET == 'UTF8') {
1980     $export = utf8_decode($export);
1981     }
1982    
1983     /**
1984     * En-tête de fichier.
1985     *
1986     * C'est la première ligne du fichier.
1987     */
1988     // on éclate la chaîne export par ligne pour calculer le nombre
1989     // d'enregistrements et la longueur maximale des enregistrements
1990     $export_by_line = explode("\n", $export);
1991     // longueur maximale des enregistrements
1992     // (Num)(6) longueur de l’enregistrement le plus long contenu dans le
1993     // fichier (sans compter la fin d’enregistrement ou la fin de fichier)
1994     $longueur_maximale_des_enregistrements = 0;
1995     foreach ($export_by_line as $export_line) {
1996     if ($longueur_maximale_des_enregistrements > strlen($export_line)) {
1997     continue;
1998     }
1999     $longueur_maximale_des_enregistrements = strlen($export_line);
2000     }
2001     // nombre d'enregistrements
2002     // (Num)(6) nombre d’enregistrements présents dans le fichier en
2003     // comptant l’en-tête du fichier
2004     // XXX Ne faut-il pas ajouter +1 pour la ligne d'en-tête ?
2005     $nombre_d_enregistrements = count($export_by_line);
2006     // code application
2007     // (Alphanum)(7) = SITADEL
2008     $code_application = "SITADEL";
2009     // code département
2010     // (Alphanum)(3) département dans lequel se trouve le service instructeur
2011     // nomenclature : 001 à 095, 02A, 02B, 971...974
2012     $code_departement = $this->f->getParameter("departement");
2013     // service expéditeur
2014     // (Alphanum)(3) DDE ou commune (la plus grosse en cas d'EPCI) ou DGI
2015     // nomenclature : 'ADS', ‘DGI ou code commune INSEE
2016     $service_expediteur = $this->f->getParameter("commune");
2017     // service destinataire
2018     // (Alphanum)(2) DRE
2019     // nomenclature : code région INSEE (exemple : Ile-de-France=11)
2020     $service_destinataire = $this->f->getParameter("region");
2021     // code du fichier transmis
2022     // (AlphaNum)(12) AAMMjjdddccc
2023     // ddd = département du service instructeur
2024     // ccc = code du service expéditeur
2025     // AAMMjj = date
2026     // par exemple : 090531093ADS dans le cas de la transmission mensuelle
2027     // des événements intervenus au mois de mai communiqués par la DDE de
2028     // Seine-Saint-Denis.
2029     // XXX La date du jour correspond bien à la date demandée ?
2030     $code_du_fichier_transmis = sprintf(
2031     "%s%s%s",
2032     date('ymd'),
2033     $code_departement,
2034     $service_expediteur
2035     );
2036     // numéro d'ordre
2037     // (AlphaNum)(1) numéro d’ordre du fichier en cas de rectificatif
2038     // XXX Le formulaire propose jusqu'à la valeur 10 alors que la taille
2039     // de la châine doit être (1) ?
2040     $numero_d_ordre = $this->f->get_submitted_post_value("numero");
2041     // date de création
2042     // (Alphanum)(6) AAMMjj date de création du fichier transmis
2043     $date_de_creation = date('ymd');
2044     // nom de l'applicatif expéditeur
2045     // (Alphanum)(20) Exemple : GESTIO
2046     $nom_de_l_applicatif_expediteur = "openADS";
2047     // version de l'applicatif expéditeur
2048     // (Alphanum)(8) Exemple : 2.05
2049 softime 7996 $version_de_l_applicatif_expediteur = substr($this->f->get_application_version(), 0, 8);
2050 mbroquet 3730 // Consititution de la ligne d'en-tête.
2051     $entete = sprintf(
2052     "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\n",
2053     $code_application,
2054     $code_departement,
2055     $service_expediteur,
2056     $service_destinataire,
2057     $code_du_fichier_transmis,
2058     $numero_d_ordre,
2059     $longueur_maximale_des_enregistrements,
2060     $date_de_creation,
2061     $nombre_d_enregistrements,
2062     $nom_de_l_applicatif_expediteur,
2063     $version_de_l_applicatif_expediteur
2064     );
2065    
2066     /**
2067     *
2068     */
2069     //
2070     $export = $entete.$export;
2071    
2072     /**
2073     * Écriture de l'export dans un fichier sur le disque et affichage du
2074     * lien de téléchargement.
2075     */
2076     // Composition du nom du fichier
2077     $nom_fichier = "SITADEL".substr($this->f->get_submitted_post_value("datedebut"),3,2)."".substr($this->f->get_submitted_post_value("datedebut"),8,4).".txt";
2078     // Composition des métadonnées du fichier
2079     $metadata_fichier = array(
2080     "filename" => $nom_fichier,
2081     "size" => strlen($export),
2082 softime 8989 "mimetype" => "text/csv",
2083 mbroquet 3730 );
2084     // Écriture du fichier
2085 softime 8989 $id_fichier = $this->f->store_file(
2086     $export,
2087     $metadata_fichier,
2088     "sitadel",
2089     json_encode(array(
2090     'date_debut' => $datedebut,
2091     'date_fin' => $datefin,
2092     ))
2093     );
2094     if ($id_fichier === false) {
2095     $msg_error = __("Erreur lors du stockage/enregistrement du fichier SITADEL.").' '.__("Veuillez contacter votre administrateur.");
2096     $this->f->displayMessage("error", $msg_error);
2097     $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
2098     return;
2099     }
2100 mbroquet 3730 //
2101 softime 8989 $message_valid = sprintf(
2102     "%s<br/>%s",
2103     sprintf(__("Le fichier %s a été généré."), $nom_fichier),
2104     sprintf(
2105     '<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>',
2106     OM_ROUTE_FORM,
2107     $id_fichier,
2108     __("Télécharger le fichier SITADEL")
2109     )
2110     );
2111 mbroquet 3730
2112     /**
2113     * Écriture d'une éventuelle erreur durant l'export dans un fichier sur
2114     * le disque et affichage du lien de téléchargement.
2115     */
2116     //
2117     if ($erreur != "") {
2118     // Composition du nom du fichier
2119     $nom_fichier_erreur = "probleme_".$nom_fichier;
2120     // Composition des métadonnées du fichier
2121     $metadata_fichier_erreur = array(
2122     "filename" => $nom_fichier_erreur,
2123     "size" => strlen($erreur),
2124 softime 8989 "mimetype" => "application/octet-stream",
2125 mbroquet 3730 );
2126     // Écriture du fichier
2127 softime 8989 $id_fichier_erreur = $this->f->store_file(
2128     $erreur,
2129     $metadata_fichier_erreur,
2130     "sitadel",
2131     json_encode(array(
2132     'date_debut' => $datedebut,
2133     'date_fin' => $datefin,
2134     ))
2135     );
2136     if ($id_fichier_erreur === false) {
2137     $msg_error = __("Erreur lors du stockage/enregistrement du fichier des incohérences SITADEL.").' '.__("Veuillez contacter votre administrateur.");
2138     $this->f->displayMessage("error", $msg_error);
2139     $this->f->addToLog(__METHOD__."(): ".$msg_error, DEBUG_MODE);
2140     return;
2141     }
2142 mbroquet 3730 //
2143 softime 8989 $message_info .= sprintf(
2144     "%s<br/>%s",
2145     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),
2146     sprintf(
2147     '<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>',
2148     OM_ROUTE_FORM,
2149     $id_fichier_erreur,
2150     __("Télécharger le fichier d'incohérence SITADEL")
2151     )
2152     );
2153 mbroquet 3730 }
2154 softime 8989
2155     //
2156     $this->f->displayMessage("valid",
2157     sprintf(
2158     '%s%s%s',
2159     $message_valid,
2160     $message_info !== '' ? '<br/><br/>' : '',
2161     $message_info
2162     )
2163     );
2164    
2165     //
2166 mbroquet 3730 if (DEBUG > 0) {
2167     printf($export);
2168     }
2169    
2170     } else {// correct = false
2171 softime 8989 $this->f->displayMessage("error", __("Les champs dates sont obligatoires."));
2172 mbroquet 3730 }
2173     }
2174     }
2175    
2176    
2177 softime 8989 function affichageFormulaire() {
2178     printf("<form method=\"POST\" name=f1>");
2179     //
2180     printf(
2181     "<div id=\"sitadel-form-fonctionnement\" class=\"sitadel-form-bloc\"><h3>%s</h3><p>%s</p></div>",
2182     __("Fonctionnement"),
2183     __("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.")
2184     );
2185     //
2186     printf(
2187     "<div id=\"sitadel-form-export\" class=\"sitadel-form-bloc\"><h3>%s</h3>",
2188     __("Export")
2189     );
2190 mbroquet 3730 //Description de la page
2191 softime 8989 $description = __("Saisissez la période pour laquelle vous souhaitez exporter les mouvements des dossiers au format SITADEL.");
2192 mbroquet 3730 $this->f->displayDescription($description);
2193     //
2194 softime 8989 $input = "<input type=\"text\" name=\"%s\" id=\"%s\" value=\"%s\" size=\"15\" class=\"champFormulaire datepicker\" onchange=\"fdate(this)\" />";
2195 mbroquet 3730 // champ date debut
2196 softime 8989 printf(" "._("Date de début")." ");
2197     printf($input, "datedebut", "datedebut", '');
2198 mbroquet 3730 // champ date fin
2199 softime 8989 printf(" "._("Date de fin")." ");
2200     printf($input, "datefin", "datefin", '');
2201 mbroquet 3730 // numero d'ordre d'envoi
2202     printf(" "._("Numero d'ordre d'envoi")." : "."<select name=\"numero\">");
2203     for ($i = 1; $i < 11; $i++) {
2204     printf("<option value =\"%d\" ", $i);
2205     printf(">%d</option>", $i);
2206     }
2207     printf("</select>");
2208 softime 8989 printf(
2209     "<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\" />",
2210     __("Exporter le fichier SITADEL"),
2211     addslashes(sprintf(
2212     "<b>%s</b><br/><br/>%s",
2213     __("Important à lire avant de confirmer le message de validation."),
2214     __("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.")
2215     )),
2216     OM_ROUTE_FORM
2217     );
2218     printf("</div>");
2219    
2220     // Affiche le tableau des fichiers sitadel stocké
2221     $link_tab_storage = OM_ROUTE_SOUSTAB.'&obj=storage&idxformulaire=0&retour=tab&retourformulaire=sitadel';
2222     $tab_storage = sprintf(
2223     '<div id="sousform-storage-sitadel" class="sitadel-form-bloc-tab"></div>
2224     <script type="text/javascript" >
2225     ajaxIt(\'storage-sitadel\', \'%1$s\');
2226     </script>',
2227     $link_tab_storage
2228     );
2229     printf(
2230     "<div id=\"sitadel-form-histo\" class=\"sitadel-form-bloc-end\"><h3>%s</h3>%s</div>",
2231     __("Historique des exports"),
2232     $tab_storage
2233     );
2234    
2235 mbroquet 3730 printf("</form>");
2236     }
2237    
2238     /**
2239     * VIEW - view_document_numerise.
2240     *
2241     * Vue du tableau des pièces du dossier d'autorisation.
2242     *
2243     * Cette vue permet de gérer le contenu de l'onglet "Pièce(s)" sur un
2244     * dossier d'autorisation. Cette vue spécifique est nécessaire car
2245     * l'ergonomie standard du framework ne prend pas en charge ce cas.
2246     * C'est ici la vue spécifique des pièces liées au dossier qui est
2247     * affichée directement au clic de l'onglet au lieu du soustab.
2248     *
2249     * L'idée est donc de simuler l'ergonomie standard en créant un container
2250     * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
2251     * de la vue visualisation de l'objet lié.
2252     *
2253     * @return void
2254     */
2255     function view_document_numerise() {
2256     // Vérification de l'accessibilité sur l'élément
2257     $this->checkAccessibility();
2258     // Récupération des variables GET
2259     ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
2260     $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
2261     ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
2262     $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
2263     // Objet à charger
2264     $obj = "document_numerise";
2265 softime 6565 $type_aff_form = $this->get_type_affichage_formulaire();
2266     if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
2267     $obj = "document_numerise_contexte_ctx";
2268     }
2269 mbroquet 3730 // Construction de l'url de sousformulaire à appeler
2270 softime 7996 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
2271 mbroquet 3730 $url .= "&idx=".$idxformulaire;
2272     $url .= "&action=4";
2273     $url .= "&retourformulaire=".$retourformulaire;
2274     $url .= "&idxformulaire=".$idxformulaire;
2275     $url .= "&retour=form";
2276     // Affichage du container permettant le reffraichissement du contenu
2277     // dans le cas des action-direct.
2278     printf('
2279     <div id="sousform-href" data-href="%s">
2280     </div>',
2281     $url
2282     );
2283     // Affichage du container permettant de charger le retour de la requête
2284     // ajax récupérant le sous formulaire.
2285     printf('
2286     <div id="sousform-%s">
2287     </div>
2288     <script>
2289     ajaxIt(\'%s\', \'%s\');
2290     </script>',
2291     $obj,
2292     $obj,
2293     $url
2294     );
2295     }
2296    
2297 softime 12847
2298     /**
2299     * Traitement du numéro de version d'un dossier.
2300     * Renvoie le numéro de version.
2301     *
2302     * Récupère le numéro de version du dossier d'instruction (DI) à l'aide du
2303     * numéro de dossier d'autorisation (DA).
2304     * Si un numéro de version a été récupéré incremente également le numéro
2305     * de version du DA dans la base de données.
2306     *
2307     * @param array tableau contenant les valeurs du formulaire
2308     * @return integer|null numero de version du dossier si il a pu être récupéré
2309 mbroquet 3730 */
2310 softime 12847 protected function traitementNumeroVersion($val = array()) {
2311     // Récupération du numéro de version du dossier d'instruction
2312     $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
2313     // Mise à jour du numéro de version du DA
2314     // La numérotation du DI est unique et basée sur celle du DA qui débute à -1.
2315 nmeucci 4526 // Ainsi la version du DI initial est à 0.
2316     if (is_numeric($numeroVersion) or $numeroVersion == -1){
2317     $this->incrementNumeroVersion($val['dossier_autorisation'], ++$numeroVersion);
2318     }
2319 softime 12847 return $numeroVersion;
2320     }
2321 nmeucci 4526
2322 softime 12847 /**
2323     * Traitement de la numérotation du dossier lors de la saisie manuelle du
2324     * numéro de dossier.
2325     * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2326     * dossier.
2327     *
2328     * Récupère le numéro de dossier issus du formulaire. Construis le libellé et
2329     * l'identifiant du dossier à partir du numéro saisie.
2330     *
2331     *
2332     * @param array tableau contenant les valeurs du formulaire.
2333     * @return array informations liées à la numérotation du dossier.
2334     */
2335     protected function traitementNumerotationDossierManuelle($val = array()) {
2336     // INitialisation des valeurs de la numérotation à partir des informations issues
2337     // du formulaire
2338     $num_doss_comp = $val['numero_dossier_complet'];
2339     $numerotation = array(
2340     $this->clePrimaire => $num_doss_comp,
2341     'dossier_libelle' => $num_doss_comp
2342     );
2343     // TODO : à commenter
2344     $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2345     // TODO : à commenter
2346     if (empty($num_urba['di']) === false) {
2347     $dossier = sprintf("%s%s%s%s%s%s%s%s",
2348     $num_urba['di']['type'],
2349     $num_urba['di']['departement'],
2350     $num_urba['di']['commune'],
2351     $num_urba['di']['annee'],
2352     $num_urba['di']['division'],
2353     $num_urba['di']['numero'],
2354     isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2355     isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2356     );
2357     $dossierLibelle = sprintf("%s %s%s %s %s%s%s%s",
2358     $num_urba['di']['type'],
2359     $num_urba['di']['departement'],
2360     $num_urba['di']['commune'],
2361     $num_urba['di']['annee'],
2362     $num_urba['di']['division'],
2363     $num_urba['di']['numero'],
2364     isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : '',
2365     isset($num_urba['di']['num_suffixe']) === true ? str_pad($num_urba['di']['num_suffixe'], 2, '0', STR_PAD_LEFT) : ''
2366     );
2367     $numerotation = array(
2368     $this->clePrimaire => $dossier,
2369     'dossier_libelle' => $dossierLibelle,
2370     'numerotation_type' => $num_urba['di']['type'],
2371     'numerotation_dep' => $num_urba['di']['departement'],
2372     'numerotation_com' => $num_urba['di']['commune'],
2373     'numerotation_division' => $num_urba['di']['division'],
2374     'numerotation_num' => $num_urba['di']['numero'],
2375     'numerotation_suffixe' => isset($num_urba['di']['suffixe']) === true ? $num_urba['di']['suffixe'] : null,
2376     'numerotation_num_suffixe' => isset($num_urba['di']['num_suffixe']) === true ? $num_urba['di']['num_suffixe'] : null
2377     );
2378     }
2379     return $numerotation;
2380     }
2381 softime 10573
2382 softime 12847 /**
2383     * Traitement automatique de la numérotation du dossier.
2384     * Renvoie un tableau contenant les valeurs nécessaires à la numérotation du
2385     * dossier.
2386     *
2387     * @param array tableau contenant les valeurs du formulaire.
2388     * @return array informations liées à la numérotation du dossier.
2389     */
2390     protected function traitementNumerotationDossierAuto($val = array()) {
2391     // GESTION DU SUFFIXE :
2392     // La version du suffixe est celle du type de DI : à ne pas confondre avec celle du DI lui même.
2393     // Exemple chronologique :
2394     // DI n° PC0130551600004 -> version 0
2395     // DI n° PC0130551600004M01 -> version 1
2396     // DI n° PC0130551600004PRO01 -> version 2 !!
2397     $code = null;
2398     $numeroVersionDossierInstructionType = null;
2399     $suffixe = "";
2400     // Si l'option suffixe de ce type de DI est activée
2401     if ( $this->getSuffixe($this->getDossierInstructionType()) === 't' ){
2402     // Récupération de la lettre associée au type de dossier d'instruction
2403     $code = $this->getCode($this->getDossierInstructionType());
2404     // Récupération du numéro de version en fonction du type de dossier d'instruction
2405     $numeroVersion = $this->getNumeroVersion($val['dossier_autorisation']);
2406     $numeroVersionDossierInstructionType = $this->getNumeroVersionDossierInstructionType(
2407     $val['dossier_autorisation'],
2408     $val['dossier_instruction_type'],
2409     $val['demande_type'],
2410     $numeroVersion
2411     );
2412     // Suffixe
2413     $suffixe = $code.$numeroVersionDossierInstructionType;
2414 softime 10573 }
2415    
2416 softime 12847 // Récupération du DA pour aller chercher le type, le département, la commune, la division et le numéro
2417     // nécessaire à la numérotation du dossier.
2418     $da = $this->f->get_inst__om_dbform(array(
2419     "obj" => "dossier_autorisation",
2420     "idx" => $val['dossier_autorisation'],
2421     ));
2422 softime 10573
2423 softime 12847 return array(
2424     'dossier' => $val['dossier_autorisation'].$suffixe,
2425 softime 14064 'dossier_libelle' => $da->getVal('dossier_autorisation_libelle').$suffixe,
2426 softime 12847 'numerotation_type' => ! empty($da->getVal("numerotation_type")) ? $da->getVal("numerotation_type") : null,
2427     'numerotation_dep' => ! empty($da->getVal("numerotation_dep")) ? $da->getVal("numerotation_dep") : null,
2428     'numerotation_com' => ! empty($da->getVal("numerotation_com")) ? $da->getVal("numerotation_com") : null,
2429     'numerotation_division' => ! empty($da->getVal("numerotation_division")) ? $da->getVal("numerotation_division") : null,
2430     'numerotation_num' => ! empty($da->getVal("numerotation_num")) ? $da->getVal("numerotation_num") : null,
2431     'numerotation_suffixe' => $code,
2432     'numerotation_num_suffixe' => $numeroVersionDossierInstructionType
2433     );
2434     }
2435 softime 10573
2436 softime 12847 /**
2437     * Traitement spécifique pour la numérotation du dossier.
2438     * Renvoie un tableau contenant les valeurs à mettre à jour pour la numérotation.
2439     *
2440     * Le(s) traitement(s) effectué(s) dans cette méthode est(sont) :
2441     * - Si l'option om_collectivite_entite est active gère la numérotation de l'entité
2442     * du dossier.
2443     *
2444     * @param array tableau contenant les valeurs du formulaire.
2445     * @return array informations liées à la numérotation du dossier.
2446     */
2447     function traitementSpécifique($val = array()) {
2448     // TODO : commenter
2449     $numerotation = array();
2450     // Gestion du numéro entité du dossier (specifique au MC)
2451 softime 14542 $numerotation_entite = $this->f->get_collectivite_code_entite($val['om_collectivite']);
2452 softime 10573 if ($this->f->is_option_om_collectivite_entity_enabled($val['om_collectivite']) === true
2453 softime 14542 && $numerotation_entite !== null) {
2454 softime 12847 $numerotation_num_entite = $this->increment_num_entite($val['dossier_autorisation']);
2455     $numerotation_num_entite = str_pad($numerotation_num_entite, 2, "0", STR_PAD_LEFT);
2456     $numerotation = array(
2457     $this->clePrimaire => $val[$this->clePrimaire].$numerotation_entite.$numerotation_num_entite,
2458     'dossier_libelle' => $val['dossier_libelle']." ".$numerotation_entite.$numerotation_num_entite,
2459     'numerotation_entite' => $numerotation_entite,
2460     'numerotation_num_entite' => $numerotation_num_entite
2461     );
2462 softime 10573 }
2463 softime 12847 return $numerotation;
2464     }
2465 softime 10573
2466 softime 12847 /**
2467     * Définition de la version et du suffixe du DI lors de sa création.
2468     *
2469     * @param array tableau contenant les valeurs du formulaire
2470     */
2471     function setValFAjout($val = array()) {
2472     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2473     // traitement lié à la récupération du numéro de version du dossier et stockage
2474     // de ce numéro de version
2475     $numeroVersion = $this->traitementNumeroVersion($val);
2476     $this->valF['version'] = $numeroVersion;
2477    
2478     // Il y a deux possibilité de numérotation :
2479     // - la numérotation manuelle : le numéro de dossier est complétement saisis par l'utilisateur
2480     // - la numérotation automatique : le numéro de dossier est construis à partir du paramétrage
2481     // Selon les cas on va donc gérer la numérotation différemment.
2482     // Dans tous les cas on va récupérer les valeurs lié à la numérotation sous le forme d'un tableau.
2483     $isSaisieManuelle = ! empty($val['numero_dossier_complet']);
2484     if ($isSaisieManuelle) {
2485     $valNumerotationDossier = $this->traitementNumerotationDossierManuelle($val);
2486     } else {
2487     $valNumerotationDossier = $this->traitementNumerotationDossierAuto($val);
2488     }
2489     // Traitements spécifiques nécessaires à la numérotation du dossier.
2490     // Pour pouvoir réaliser les traitements spécifique on a besoin des infos de
2491     // numérotation. On l'ajoute donc au tableau des valeur pour pouvoir y accéder.
2492     $val = array_merge($val, $valNumerotationDossier);
2493     $valNumerotationSpecifique = $this->traitementSpécifique($val);
2494    
2495    
2496    
2497     // Affectation automatique du dossier
2498     // Pour pouvoir réaliser l'affectation automatique on a besoin de la localisation.
2499     // On l'ajoute donc au tableau des valeur pour pouvoir y accéder
2500     // Récupération des références de localisation du dossier
2501     $valLocalisation = $this->localisation_dossier($val);
2502     $val = array_merge(
2503     $val,
2504     $valLocalisation
2505     );
2506     $valAffectation = $this->affectation_dossier($val);
2507    
2508     // Construis le tableau des valeurs mise à jour à partir des valeurs issues de
2509     // tous les traitements précédents
2510     $this->valF = array_merge(
2511     $this->valF,
2512     $valNumerotationDossier,
2513     $valNumerotationSpecifique,
2514     $valAffectation
2515     );
2516    
2517     $this->addToLog(__METHOD__."(): end", EXTRA_VERBOSE_MODE);
2518 softime 10573 }
2519    
2520 softime 12847 /**
2521     * Traitement permettant de récupérer la localisation du dossier à partir de
2522     * ses références cadastrales.
2523     *
2524     * Récupère un tableau contenant les informations suivantes :
2525     * array(
2526     * 'quartier' => quartier,
2527     * 'arrondissement' => arrondissement
2528     * 'section' => section
2529     * )
2530     *
2531     * @param array tableau des valeurs du dossier
2532     * @param array tableau contenant la localisation du dossier
2533     */
2534     protected function localisation_dossier($val) {
2535     $quartier = 0;
2536     $arrondissement = 0;
2537     $section = '';
2538    
2539     // Si la référence cadastrale n'est pas vide alors on récupère la
2540     // section, le quartier et l'arrondissement
2541     if ($val['terrain_references_cadastrales'] != '') {
2542    
2543 softime 13137 // Récupère toutes les parcelles du dossier et sélectionne la première
2544     $list_parcelles = $this->f->parseParcelles($this->valF['terrain_references_cadastrales'], $this->valF['om_collectivite']);
2545 softime 14542 if (count($list_parcelles) > 0) {
2546     $parcelle = $list_parcelles[0];
2547 softime 12847
2548 softime 14542 // Récupère l'identifiant du quartier et de l'arrondissement
2549     $quartier_arrondissement = $this->get_quartier_arrondissement_by_code_impot($parcelle['quartier']);
2550     if ($quartier_arrondissement !== null
2551     && is_array($quartier_arrondissement) === true
2552     && isset($quartier_arrondissement['quartier']) === true
2553     && isset($quartier_arrondissement['arrondissement']) === true) {
2554     //
2555     $quartier = $quartier_arrondissement['quartier'];
2556     $arrondissement = $quartier_arrondissement['arrondissement'];
2557     }
2558    
2559     // On récupère la section
2560     $section = $parcelle['section'];
2561 softime 12847 }
2562     }
2563    
2564     return array(
2565 softime 13137 'quartier' => $quartier,
2566     'arrondissement' => $arrondissement,
2567 softime 12847 'section' => $section
2568     );
2569     }
2570    
2571 softime 10573 // Permet d'incrémenter le numéro de version de l'entité
2572     public function increment_num_entite($da) {
2573     if ($da === null || $da === '') {
2574     return false;
2575     }
2576     $last_entity_num = 0;
2577 nmeucci 4526 //
2578 softime 10573 $inst_da = $this->f->get_inst__om_dbform(array(
2579     "obj" => "dossier_autorisation",
2580     "idx" => $da,
2581     ));
2582     $list_di = $inst_da->get_list_dossier_instruction();
2583     foreach ($list_di as $di) {
2584     $inst_di = $this->f->get_inst__om_dbform(array(
2585     "obj" => "dossier",
2586     "idx" => $di['dossier'],
2587     ));
2588     if (intval($inst_di->getVal('numerotation_num_entite')) > $last_entity_num) {
2589     $last_entity_num = intval($inst_di->getVal('numerotation_num_entite'));
2590     }
2591 mbroquet 3730 }
2592 softime 10573 return ++$last_entity_num;
2593 mbroquet 3730 }
2594    
2595     /*Récupère la valeur du suffixe d'un dossier_instruction_type*/
2596 softime 14542 function getSuffixe($idDIType){
2597     $dossierInstructionType = $this->f->get_inst__om_dbform(array(
2598     'obj' => 'dossier_instruction_type',
2599     'idx' => $idDIType
2600     ));
2601     return $dossierInstructionType->getVal('suffixe');
2602 mbroquet 3730 }
2603    
2604     /*Récupère dans la table de paramètrage la lettre correspondant
2605     * au dossier_instruction_type
2606     */
2607 softime 14542 function getCode($idDIType){
2608     $dossierInstructionType = $this->f->get_inst__om_dbform(array(
2609     'obj' => 'dossier_instruction_type',
2610     'idx' => $idDIType
2611     ));
2612     return $dossierInstructionType->getVal('code');
2613 mbroquet 3730 }
2614    
2615 softime 12847 /**
2616     * Récupère le numéro de version d'un dossier_autorisation à l'aide d'une
2617     * requête sql.
2618     *
2619     * En cas d'erreur sur la requête arrête l'execution et affiche un message
2620     * d'erreur.
2621     *
2622     * @param string identifiant du dossier d'autorisation (DA)
2623     * @return integer numéro de version du DA
2624     */
2625 softime 14542 function getNumeroVersion($idDA){
2626     $dossierAutorisation = $this->f->get_inst__om_dbform(array(
2627     'obj' => 'dossier_autorisation',
2628     'idx' => $idDA
2629     ));
2630     return $dossierAutorisation->getVal('numero_version');
2631 mbroquet 3730 }
2632 fmichon 3892
2633 softime 14064
2634 fmichon 3892 /**
2635 softime 14064 * Récupère le numéro de suffixe du dossier d'instruction.
2636 fmichon 3892 *
2637 softime 14064 * @return string
2638 fmichon 3892 */
2639 softime 14064 function get_di_numero_suffixe($dossier_instruction = null) {
2640 fmichon 3892
2641 softime 14064 $ref_dossier = $this;
2642     if (! empty($dossier_instruction)) {
2643     if(empty($ref_dossier = $this->f->findObjectById('dossier', $dossier_instruction))) {
2644     $this->f->addToLog(__METHOD__."(): Dossier '$dossier_instruction' non trouvé", DEBUG_MODE);
2645     return false;
2646     }
2647 fmichon 3892 }
2648 softime 14064 else {
2649     $dossier_instruction = $ref_dossier->getVal($this->clePrimaire);
2650     }
2651 fmichon 3892
2652 softime 14064 $dossier_suffixe = intval($ref_dossier->getVal('numerotation_num_suffixe'));
2653 fmichon 3892
2654 softime 14064 // TODO si les tests se déroulent bien:
2655     // - supprimer le code ci-dessous et la fonction 'numerotation_urbanisme'
2656     // - retourner le résultat de la ligne ci-dessus en tant que valeur de retour de la fonction
2657 fmichon 3892
2658 softime 14064 $dossier_ref_id = $dossier_instruction;
2659     $collectivite_id = $ref_dossier->getVal('om_collectivite');
2660 softime 10573
2661 softime 14064 // si l'option 'code_entité' est activée pour la collectivité
2662     if ($this->f->is_option_om_collectivite_entity_enabled($collectivite_id)) {
2663 softime 10573
2664 softime 14064 // si le code entité n'est pas défini ou vide
2665 softime 14542 if ($this->f->get_collectivite_code_entite($collectivite_id) === null) {
2666 softime 10573
2667 softime 14064 // affiche un message d'alerte
2668     $err_msg = sprintf(__("Paramètre '%s' manquant ou vide pour la collectivité '%s'"),
2669     'code_entite',
2670     $collectivite_id);
2671     $this->f->addToLog(__METHOD__."() : $err_msg", DEBUG_MODE);
2672     }
2673     // si le code entité est défini et non-vide
2674     else {
2675 softime 8989
2676 softime 14064 // supprime le code entité du numéro de dossier
2677 softime 14542 $code_entite = $this->f->get_collectivite_code_entite($collectivite_id);
2678 softime 14064 $dossier_ref_id = preg_replace('/'.$code_entite.'[0-9]+$/', '', $dossier_ref_id);
2679     $this->f->addToLog(__METHOD__."(): suppression (temporaire) du code entité '$code_entite' du dossier $dossier_ref_id (complet: $dossier_instruction)", DEBUG_MODE);
2680     }
2681 softime 10573 }
2682 softime 8477
2683 softime 14064 $num_urba = $this->f->numerotation_urbanisme($dossier_ref_id);
2684 fmichon 3892
2685     // Si l'expression régulière retourne une erreur
2686 softime 14064 if ($num_urba == false) {
2687 fmichon 3892 // Message dans le log
2688 softime 14064 $this->f->addToLog(__METHOD__."(): ".__("Erreur lors de la récupération du numéro de suffixe du dossier d'instruction"), DEBUG_MODE);
2689 fmichon 3892 return false;
2690     }
2691    
2692 softime 14064 $suffixe = 0;
2693    
2694     // Retourne seulement la suffixe du dossier d'instruction.
2695 nmeucci 4526 // Elle vaut 0 si le numéro du DI n'a pas de suffixe.
2696 softime 14064 if (isset($num_urba['di']['num_suffixe'])) {
2697     $suffixe = $num_urba['di']['num_suffixe'];
2698 nmeucci 4526 }
2699 softime 14064
2700     if ($dossier_suffixe != intval($suffixe)) {
2701     //throw new RuntimeException("Dossier '".$ref_dossier->getVal('dossier')."' suffixes differs ($dossier_suffixe != $suffixe)");
2702     $this->f->addToLog(__METHOD__."(): Dossier '".$ref_dossier->getVal('dossier')."' suffixes differs (new:$dossier_suffixe != old:$suffixe)", DEBUG_MODE);
2703     }
2704    
2705     return $suffixe;
2706 fmichon 3892 }
2707 mbroquet 3730
2708     /*Incrémente le numéro de version du dossier*/
2709     function incrementNumeroVersion($dossierAutorisation, $nouveauNumeroVersion) {
2710    
2711     $valF = array (
2712     "numero_version" => $nouveauNumeroVersion
2713     );
2714    
2715 softime 12847 $res = $this->f->db->autoexecute(
2716     DB_PREFIXE."dossier_autorisation",
2717     $valF,
2718     DB_AUTOQUERY_UPDATE,
2719     "dossier_autorisation = '$dossierAutorisation'"
2720     );
2721     $this->addToLog(
2722     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier_autorisation\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"dossier_autorisation = '".$dossierAutorisation."'\");",
2723     VERBOSE_MODE
2724     );
2725     $this->f->isDatabaseError($res);
2726 mbroquet 3730 }
2727    
2728     /**
2729     * Retourne un numéro de version en fonction du type de dossier d'instruction
2730     * @param string $dossier_autorisation
2731     * @param integer $dossier_instruction_type
2732     * @return int
2733     */
2734 softime 10573 public function getNumeroVersionDossierInstructionType($dossier_autorisation, $dossier_instruction_type, $demande_type, $numero_version, $increment = true){
2735    
2736 mbroquet 3730 $numeroVersionDossierInstructionType = $numero_version;
2737 softime 10573
2738     // Récupère la nature de la demande
2739     $inst_demande_type = $this->f->get_inst__om_dbform(array(
2740     "obj" => "demande_type",
2741     "idx" => $demande_type
2742     ));
2743     $inst_demande_nature = $this->f->get_inst__om_dbform(array(
2744     "obj" => "demande_nature",
2745     "idx" => $inst_demande_type->getVal('demande_nature')
2746     ));
2747    
2748     // Si c'est un dossier d'instruction de type "Initial"
2749     if (strtolower($inst_demande_nature->getVal('code')) === 'nouv') {
2750 mbroquet 3730 return 0;
2751     }
2752     //Si c'est un modificatif ou transfert on retourne un nombre correspondant au
2753     //nombre de dossier d'instruction de ce type, rattaché au dossier
2754     //d'autorisation complété par des 0 à gauche si besoin. Format du retour
2755     //attendu : 01 ou 02, etc.
2756     else {
2757     //On récupère le nombre de dossier d'instruction de ce type rattaché au
2758     //dossier d'autorisation
2759 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2760     sprintf(
2761     'SELECT
2762     count(dossier)
2763     FROM
2764     %1$sdossier
2765     LEFT JOIN %1$sdossier_autorisation
2766     ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
2767     WHERE
2768     dossier_autorisation.dossier_autorisation = \'%2$s\'
2769     AND dossier.dossier_instruction_type = \'%3$d\'',
2770     DB_PREFIXE,
2771     $this->f->db->escapeSimple($dossier_autorisation),
2772     intval($dossier_instruction_type)
2773     ),
2774     array(
2775     "origin" => __METHOD__,
2776     "force_return" => true
2777     )
2778 softime 12847 );
2779 softime 14064 $numeroVersionDossierInstructionType = $qres['result'];
2780    
2781     if ($qres["code"] !== "OK") { // PP
2782 mbroquet 3730 $this->f->addToError("", $numeroVersionDossierInstructionType, $numeroVersionDossierInstructionType);
2783     return false;
2784     }
2785    
2786     // Requête SQL
2787 softime 14542 $qres = $this->f->get_all_results_from_db_query(
2788     sprintf(
2789     'SELECT
2790     substring(dossier, \'\d*$\')::int as last_num_dossier
2791     FROM
2792     %1$sdossier
2793     WHERE
2794     dossier_instruction_type = %2$s
2795     AND dossier_autorisation = \'%3$s\'
2796     AND version = (
2797     SELECT
2798     max(version)
2799     FROM
2800     %1$sdossier
2801     WHERE
2802     dossier_instruction_type = %2$s
2803     AND dossier_autorisation = \'%3$s\'
2804     GROUP BY
2805     dossier_instruction_type,
2806     dossier_autorisation
2807     )',
2808     DB_PREFIXE,
2809     intval($dossier_instruction_type),
2810     $this->f->db->escapeSimple($dossier_autorisation)
2811     ),
2812     array(
2813     'origin' => __METHOD__
2814     )
2815     );
2816 softime 9282 $num_version_last_dossier = null;
2817 softime 14542 if (count($qres['result']) > 0) {
2818     $row = array_shift($qres['result']);
2819 softime 9282 $num_version_last_dossier = $row['last_num_dossier'];
2820     }
2821 mbroquet 3730
2822     if (!empty($num_version_last_dossier)
2823     && $num_version_last_dossier >= $numeroVersionDossierInstructionType) {
2824     // Modifie le numéro suivant
2825     $numeroVersionDossierInstructionType = $num_version_last_dossier;
2826     }
2827     //
2828     if ($increment === true) {
2829     $numeroVersionDossierInstructionType = ++$numeroVersionDossierInstructionType;
2830     }
2831     //On compléte par des 0 à gauche
2832     $numeroVersionDossierInstructionType = str_pad($numeroVersionDossierInstructionType, 2, "0", STR_PAD_LEFT);
2833    
2834     return $numeroVersionDossierInstructionType;
2835     }
2836     }
2837    
2838 softime 6929 function setvalF($val = array()){
2839 softime 10573
2840     if (! $this->f->is_option_dossier_commune_enabled()) {
2841     // ajoute une "fausse" clé 'commune' dans le tableau des données envoyées
2842     // car la fonction 'setValF()' dans 'gen/obj/demande.class.php'
2843     // déclenche une erreur 'Undefined index: commune' sinon
2844     $val['commune'] = null;
2845     // idem pour cette valeur qui est passée au dossier d'instruction
2846     $this->valF['commune'] = null;
2847     }
2848    
2849 softime 14064 // normalise les coordonnées géographiques
2850     foreach(array('latitude', 'longitude') as $key) {
2851     if (isset($val["geoloc_$key"]) && ! empty($val["geoloc_$key"])) {
2852     $m = array();
2853     if (preg_match(self::LAT_LON_REGEX, $val["geoloc_$key"], $m)) {
2854     $val["geoloc_$key"] = sprintf('%d° %d.%d %1s', $m['deg'], $m['min'], $m['dec'], $m['dir']);
2855     }
2856     }
2857     }
2858    
2859 mbroquet 3730 parent::setvalF($val);
2860    
2861     // Récupération des id demandeurs postés
2862     $this->getPostedValues();
2863    
2864     // enlever les valeurs a ne pas saisir -> recherche en trigger ajouter et modifier
2865     unset ($this->valF['geom']);
2866     unset ($this->valF['geom1']);
2867     // valeurs hiddenstatic (calcule)
2868     if($this->maj==1){
2869     // par defaut
2870     unset ($this->valF['etat']);
2871     unset ($this->valF['delai']);
2872     unset ($this->valF['accord_tacite']);
2873     }
2874     unset ($this->valF['avis_decision']); // avis + libelle avis
2875     unset ($this->valF['terrain_surface_calcul']);
2876     unset ($this->valF['shon_calcul']);
2877     unset ($this->valF['date_notification_delai']);
2878     unset ($this->valF['date_decision']);
2879     unset ($this->valF['date_limite']);
2880     unset ($this->valF['date_validite']);
2881     unset ($this->valF['date_chantier']);
2882     unset ($this->valF['date_achevement']);
2883     unset ($this->valF['date_conformite']);
2884 nmeucci 3887 // Ce champ est mis à jour uniquement par la gestion spécifique du log
2885     // et donc jamais par les actions ajouter/modifier
2886     unset ($this->valF['log_instructions']);
2887 softime 9245 // Ce champ n'est jamais mis à jour, seulement initialisé à la création
2888     // du dossier d'instruction
2889     unset($this->valF['initial_dt']);
2890 mbroquet 3730
2891 softime 10573 // Vérification de la saisie manuelle du numéro complet
2892     $force_param_duree_val = false;
2893     $num_doss_comp = isset($val['numero_dossier_complet']) === true ? $val['numero_dossier_complet'] : null;
2894     if ($num_doss_comp !== null) {
2895 softime 14064
2896     // si l'option 'code_entité' est activée pour la collectivité
2897     if ($this->f->is_option_om_collectivite_entity_enabled($this->valF['om_collectivite'])) {
2898    
2899     // si le code entité n'est pas défini ou vide
2900 softime 14542 if ($this->f->get_collectivite_code_entite($this->valF['om_collectivite']) === null) {
2901 softime 14064
2902     // affiche un message d'alerte
2903     $err_msg = sprintf(__("Paramètre '%s' manquant ou vide pour la collectivité '%s'"),
2904     'code_entite',
2905     $this->valF['om_collectivite']);
2906     $this->f->addToLog(__METHOD__."() : $err_msg", DEBUG_MODE);
2907     }
2908     // si le code entité est défini et non-vide
2909     else {
2910    
2911     // supprime le code entité du numéro de dossier
2912 softime 14542 $code_entite = $this->f->get_collectivite_code_entite($this->valF['om_collectivite']);
2913 softime 14064 $num_doss_comp = preg_replace('/'.$code_entite.'[0-9]+$/', '', $num_doss_comp);
2914     $this->f->addToLog(
2915     __METHOD__."(): suppression (temporaire) du code entité '$code_entite' ".
2916     "du dossier $num_doss_comp (complet: ".$val['numero_dossier_complet'].")", DEBUG_MODE);
2917     }
2918     }
2919    
2920 softime 10573 $num_urba = $this->f->numerotation_urbanisme($num_doss_comp);
2921     if (empty($num_urba['di']) === false) {
2922     $force_param_duree_val = true;
2923     }
2924     }
2925 mbroquet 3730 // Durée de validité lors de la création du dossier d'instruction
2926 softime 10573 $this->valF['duree_validite'] = $this->get_duree_validite($this->valF['dossier_autorisation'], $force_param_duree_val);
2927 mbroquet 3730 }
2928    
2929 softime 6929
2930 softime 6565 /**
2931 softime 7067 * Retourne le type de formulaire : ADS, CTX RE, CTX IN ou DPC.
2932 softime 6565 *
2933     * @return mixed $type_aff_form Type de formulaire (string) ou false (bool) si erreur BDD.
2934     */
2935     function get_type_affichage_formulaire() {
2936     if (isset($this->type_aff_form) === true) {
2937     return $this->type_aff_form;
2938 mbroquet 3730 }
2939 softime 14064
2940     $id_dossier_instruction_type = $this->getVal("dossier_instruction_type");
2941 softime 7996 if($this->getParameter('maj') == '0' OR $this->get_action_crud() === 'create') {
2942 softime 6565 $id_dossier_instruction_type = $this->valF["dossier_instruction_type"];
2943 softime 14064 }
2944    
2945     $qres = $this->f->get_one_result_from_db_query(
2946     sprintf(
2947     'SELECT
2948     dossier_autorisation_type.affichage_form
2949     FROM
2950     %1$sdossier_instruction_type
2951     INNER JOIN %1$sdossier_autorisation_type_detaille
2952     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2953     INNER JOIN %1$sdossier_autorisation_type
2954     ON dossier_autorisation_type.dossier_autorisation_type = dossier_autorisation_type_detaille.dossier_autorisation_type
2955     WHERE
2956     dossier_instruction_type.dossier_instruction_type = \'%2$d\'',
2957     DB_PREFIXE,
2958     intval($id_dossier_instruction_type)
2959     ),
2960     array(
2961     "origin" => __METHOD__,
2962     "force_return" => true
2963     )
2964     );
2965    
2966     if ($qres["code"] !== "OK") {
2967 softime 6565 return false;
2968     }
2969 softime 14064
2970     $this->type_aff_form = $qres["result"];
2971    
2972 softime 6565 return $this->type_aff_form;
2973     }
2974 mbroquet 3730
2975    
2976 softime 6565 /**
2977     * Retourne le code du groupe du dossier d'instruction.
2978     *
2979     * @return string
2980     */
2981     public function get_groupe() {
2982     //
2983     if (isset($this->groupe) === true && $this->groupe !== null) {
2984     return $this->groupe;
2985 mbroquet 3730 }
2986    
2987 softime 6565 // Récupère le code du groupe
2988     $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
2989     $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
2990     $inst_groupe = $this->get_inst_groupe($inst_dossier_autorisation_type->getVal('groupe'));
2991     $groupe = $inst_groupe->getVal('code');
2992 mbroquet 3730
2993 softime 6565 //
2994     $this->groupe = $groupe;
2995     //
2996     return $this->groupe;
2997     }
2998 mbroquet 3730
2999 softime 6565 /**
3000 softime 8989 * @return void
3001 softime 6565 */
3002 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
3003     parent::verifier($val);
3004 softime 7366 // La date de dépôt est obligatoire
3005 softime 11876 if (isset($val['date_depot']) && ($val['date_depot'] === '' || $val['date_depot'] === null)) {
3006 softime 7366 //
3007     $this->correct = false;
3008     $this->addToMessage( _('Le champ').' <span class="bold">'.$this->getLibFromField('date_depot').'</span> '._('est obligatoire'));
3009 softime 11876 } else {
3010     //
3011     $date_depot = $val["date_depot"];
3012     if (preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', $val["date_depot"], $d_match)) {
3013     $date_depot = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
3014     }
3015     // Il faut avoir une date de dépôt pour pouvoir vérifier si elle est supérieure à la date du jour
3016     $date_depot = DateTime::createFromFormat('Y-m-d', $date_depot);
3017     $aujourdhui = new DateTime();
3018     try {
3019     if (! $date_depot instanceof DateTime) {
3020     throw new RuntimeException("Not a DateTime");
3021     }
3022     // Si la date issus du formulaire n'a pas pu être converti, date_demande vaudra
3023     // false. Avant de comparer on vérifie donc que la date a bien été récupérée
3024     if($date_depot > $aujourdhui) {
3025     $this->correct = false;
3026     $this->addToMessage(_("La date de depot ne peut pas être superieure à la date du jour."));
3027     }
3028     } catch (RuntimeException $e) {
3029     $this->correct = false;
3030     $this->addToLog($e.' : '._("Le format de la date de depot n'est pas valide."));
3031     $this->addToMessage(_("Erreur : le format de la date de depot n'est pas correct. Contactez votre administrateur."));
3032     }
3033 softime 7366 }
3034    
3035 softime 6565 $type_aff_form = $this->get_type_affichage_formulaire();
3036     if ($type_aff_form ===false) {
3037     $this->correct = false;
3038     $this->addToMessage(_("Une erreur s'est produite lors de l'ajout de ce dossier. Veuillez contacter votre administrateur."));
3039 mbroquet 3730 }
3040 softime 6565
3041     switch ($type_aff_form) {
3042     case 'ADS':
3043     case 'CTX RE':
3044 softime 10573 case 'CONSULTATION ENTRANTE':
3045 softime 6565 if (!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
3046     empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
3047     !is_null($this->form)) {
3048     $this->correct = false;
3049     $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
3050 mbroquet 3730 }
3051 softime 6565 break;
3052     case 'CTX IN':
3053     if (!isset($this->postedIdDemandeur["contrevenant_principal"]) OR
3054     empty($this->postedIdDemandeur["contrevenant_principal"]) AND
3055     !is_null($this->form)) {
3056     $this->correct = false;
3057     $this->addToMessage(_("La saisie d'un contrevenant principal est obligatoire."));
3058     }
3059     break;
3060 softime 7067 case 'DPC':
3061     if(!isset($this->postedIdDemandeur["petitionnaire_principal"]) OR
3062     empty($this->postedIdDemandeur["petitionnaire_principal"]) AND
3063     !is_null($this->form)) {
3064     $this->correct = false;
3065     $this->addToMessage(_("La saisie d'un petitionnaire principal est obligatoire."));
3066     }
3067     if(!isset($this->postedIdDemandeur["bailleur_principal"]) OR
3068     empty($this->postedIdDemandeur["bailleur_principal"]) AND
3069     !is_null($this->form)) {
3070     $this->correct = false;
3071     $this->addToMessage(_("La saisie d'un bailleur principal est obligatoire."));
3072     }
3073     break;
3074 mbroquet 3730 }
3075 softime 7366
3076     // Récupération du crud par rapport au mode du formulaire
3077     $crud = $this->get_action_crud($this->getParameter("maj"));
3078    
3079     // L'année de la date de dépot ne peut pas être modifiée
3080     if ($crud === 'update' && array_key_exists("date_depot", $val) === true && ($val["date_depot"] !== "" && $val["date_depot"] !== null)) {
3081     //
3082     $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
3083     $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
3084     if ($new_date->format("Y") != $old_date->format("Y")) {
3085     $this->addToMessage(_("L'année de la date de dépôt n'est pas modifiable."));
3086     $this->correct = false;
3087     }
3088     }
3089 softime 10573
3090     // L'année de la date de dépot en mairie ne peut pas être modifiée
3091 softime 10869 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)) {
3092 softime 10573 //
3093     $new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot_mairie"]);
3094 softime 10869 // Dans le cas où une date de dépôt en mairie est saisie et que l'option pour afficher
3095     // ce champ est désactivée, le champ sera mis en hidden et donc le format de la date
3096     // dans la valeur ne sera plus "d/m/Y" mais "Y-m-d".
3097     $new_date = $new_date !== false ? $new_date : DateTime::createFromFormat('Y-m-d', $val["date_depot_mairie"]);
3098 softime 10573 $old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot_mairie"));
3099 softime 10869 if ($old_date !== false && $new_date->format("Y") != $old_date->format("Y")) {
3100 softime 10573 $this->addToMessage(_("L'année de la date de dépôt en mairie n'est pas modifiable."));
3101     $this->correct = false;
3102     }
3103     }
3104    
3105     // option dossier_commune activée
3106     if ($this->f->is_option_dossier_commune_enabled()) {
3107    
3108     // La commune doit être définie
3109     if ($crud !== 'delete') {
3110     if (! array_key_exists("commune", $val) || empty($val["commune"])) {
3111     $this->addToMessage(__("La commune doit être définie."));
3112     $this->correct = false;
3113     }
3114     else {
3115     // récupération de la date de demande
3116     $date_demande = 'NOW';
3117     $d_match = array();
3118     if (isset($val["date_demande"])
3119     && preg_match('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/',
3120     $val["date_demande"], $d_match)) {
3121     $date_demande = $d_match[3].'-'.$d_match[2].'-'.$d_match[1];
3122     }
3123     $date_demande = new DateTime($date_demande);
3124    
3125     // La commune doit exister
3126     $commune = $this->f->findObjectById("commune", $val["commune"]);
3127     if (empty($commune)) {
3128     $this->addToMessage(__("La commune doit exister."));
3129     $this->correct = false;
3130     }
3131     // La commune ne peut pas être modifiée
3132     elseif ($crud === 'update') {
3133     if ($val["commune"] != $this->getVal('commune')) {
3134     $this->addToMessage(__("La commune n'est pas modifiable."));
3135     $this->correct = false;
3136     }
3137     }
3138     // La commune doit être valide
3139     elseif (! $commune->valid($date_demande)) {
3140     $this->addToMessage(__(
3141     "La commune doit être valide ".
3142     "à la date du '".$date_demande->format('d/m/Y')."'."));
3143     $this->correct = false;
3144     }
3145     }
3146     }
3147     }
3148 softime 14064
3149     // coordonnées géographiques
3150     if (isset($val['geoloc_rayon']) && ! empty($val['geoloc_rayon'])) {
3151     if (! ctype_digit(strval($val['geoloc_rayon']))) {
3152     $this->addToMessage(__("Le rayon (coordonnées géographiques) est invalide: doit être un nombre"));
3153     $this->correct = false;
3154     }
3155     }
3156     foreach(array('latitude', 'longitude') as $key) {
3157     if (isset($val["geoloc_$key"]) && ! empty($val["geoloc_$key"])) {
3158     $coord = $val["geoloc_$key"];
3159     if (! preg_match(self::LAT_LON_REGEX, $coord)) {
3160     $this->addToMessage(sprintf(
3161     __("%s '%s' invalide: le format à respecter est 'd° min.dec N/S/E/O'"), ucfirst($key), $coord));
3162     $this->correct = false;
3163     }
3164     }
3165     }
3166 softime 6565 }
3167 mbroquet 3730
3168    
3169 softime 10573 /**
3170     * Permet de vérifier si les champs requis Plat'AU ont été remplis
3171     *
3172     * @param $dossier l'identifiant du dossier
3173     *
3174     * @return array un tableau contenant une clé is_ok qui indique
3175     * si tous les champs sont saisis ou non et une clé
3176     * required_fields_empty qui contient les champs qui n'ont pas été saisis
3177     * | false si une erreur survient
3178     *
3179     */
3180     function check_platau_required_fields($dossier) {
3181    
3182     // On récupère les champs Plat'AU requis
3183     $fields_list = $this->list_platau_required_fields_dossier;
3184    
3185     // On fait un tableau qui contiendra les tables et un tableau
3186     // qui contient les champs au format 'table.champ'
3187     $tables = array();
3188     $champs = array();
3189    
3190     foreach ($fields_list as $value) {
3191     $expl_tab = explode('.', $value);
3192     if (! in_array($expl_tab[0], $tables)) {
3193     $tables[] = $expl_tab[0];
3194     }
3195     $champs[] = $value;
3196     }
3197    
3198     // Il y aura toujours la table dossier dans la requête
3199     if (in_array('dossier', $tables)) {
3200     $key = array_keys($tables, 'dossier');
3201     unset($tables[$key[0]]);
3202     }
3203    
3204     $from_tables = array();
3205     // On construit le 'FROM' de la requête sql avec les jointures
3206     foreach($tables as $table) {
3207     // Cas particulier pour la table demandeur et architecte
3208     if ($table == "demandeur") {
3209     $from_tables[] = sprintf(
3210     ' LEFT JOIN %1$slien_dossier_demandeur ON lien_dossier_demandeur.dossier = dossier.dossier LEFT JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur',
3211     DB_PREFIXE
3212     );
3213     } elseif ($table == "architecte") {
3214     $from_tables[] = sprintf(
3215     ' LEFT JOIN %sarchitecte ON architecte.architecte = donnees_techniques.architecte',
3216     DB_PREFIXE
3217     );
3218     } else {
3219     $from_tables[] = sprintf(" LEFT JOIN %s$table ON dossier.dossier = $table.%s ", DB_PREFIXE, $table == 'donnees_techniques' ? 'dossier_instruction' : 'dossier');
3220     }
3221     }
3222    
3223     // Construction de la requête sql
3224     $sql = sprintf(
3225     '
3226     SELECT
3227     %s,
3228     CASE WHEN demandeur.qualite=\'particulier\'
3229     THEN
3230     TRIM(CONCAT_WS(\' \', demandeur.particulier_nom, demandeur.particulier_prenom))
3231     ELSE
3232     CASE WHEN demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL
3233     THEN
3234     TRIM(CONCAT_WS(\' \', demandeur.personne_morale_raison_sociale, demandeur.personne_morale_denomination, \'%s\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
3235     ELSE
3236     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination))
3237     END
3238 softime 10713 END as petitionnaire,
3239     demandeur.demandeur
3240 softime 10573 FROM
3241     %sdossier
3242     %s
3243     WHERE dossier.dossier = \'%s\'
3244     ',
3245     implode(', ', $champs),
3246     __("représenté(e) par"),
3247     DB_PREFIXE,
3248     implode(' ', $from_tables),
3249     $dossier
3250     );
3251    
3252     // On récupère les champs
3253 softime 13137 $result_fields = $this->f->get_all_results_from_db_query(
3254     $sql,
3255     array(
3256     "origin" => __METHOD__,
3257     )
3258     );
3259 softime 10573
3260     // Si il y a une erreur
3261     if ($result_fields['code'] == 'KO'
3262     || $result_fields['result'] == ''
3263     || $result_fields['result'] == null) {
3264    
3265     $this->addToLog(__METHOD__."() query : ".var_export($sql, true)." error: ".var_export($result_fields['message'], true), DEBUG_MODE);
3266     return false;
3267     }
3268    
3269     // On récupère le résultat de la requête
3270     $required_fields = $result_fields['result'];
3271    
3272     $required_fields_with_tab = array();
3273    
3274     // Pour chaque champ on récupère la table
3275     $demandeur_num = 1;
3276     foreach ($required_fields as $required_field) {
3277     foreach ($champs as $champ) {
3278     if ($champ == "demandeur.localite") {
3279 softime 10713 $required_fields_with_tab[$champ.','.$required_field['petitionnaire'].' '.$required_field['demandeur']] = $required_field[explode('.', $champ)[1]];
3280 softime 10573 } else {
3281     $required_fields_with_tab[$champ] = $required_field[explode('.', $champ)[1]];
3282     }
3283     }
3284     }
3285    
3286     // On vérifie si un architecte est lié
3287 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3288     sprintf(
3289     'SELECT
3290     architecte.*
3291     FROM
3292     %1$sdossier
3293 softime 14064 LEFT JOIN %1$sdonnees_techniques
3294     ON dossier.dossier = donnees_techniques.dossier_instruction
3295     LEFT JOIN %1$sarchitecte
3296     ON donnees_techniques.architecte = architecte.architecte
3297 softime 13137 WHERE
3298     dossier.dossier = \'%2$s\'',
3299     DB_PREFIXE,
3300     $this->f->db->escapeSimple($dossier)
3301     ),
3302     array(
3303     "origin" => __METHOD__,
3304 softime 14064 "force_return" => true
3305 softime 13137 )
3306 softime 10573 );
3307    
3308 softime 13137 if ($qres["code"] !== "OK") {
3309     $this->addToLog(__METHOD__."() plop error: ".var_export($qres["message"], true), DEBUG_MODE);
3310 softime 10573 return false;
3311     }
3312    
3313     // Si il n'est pas lié on enlève le champs architecte
3314 softime 13137 if ($qres["result"] == '' || $qres["result"] == null) {
3315 softime 10573 unset($required_fields_with_tab['architecte.ville']);
3316     }
3317    
3318     $result_tab = array(
3319     'is_ok' => false,
3320     'required_fields_empty' => array()
3321     );
3322    
3323     // Construction du message avec les tables et les champs
3324     foreach ($required_fields_with_tab as $required_field => $value) {
3325     if ($value == null || $value == '') {
3326     $required_fields_splited = explode('.', $required_field);
3327     if (isset(explode(',', $required_fields_splited[1])[1])) {
3328     $required_fields_splited = explode('.', $required_field);
3329 softime 10713 // On enlève l'identifiant du demandeur dans le message
3330     $required_fields_splited[1] = preg_replace('/[0-9]*$/', '', $required_fields_splited[1]);
3331 softime 10573 $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3332     sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3333     __(" le champ : "),
3334     __(explode(',', $required_fields_splited[1])[0]).' pour '.explode(',', $required_fields_splited[1])[1]
3335     );
3336     } else {
3337     $result_tab['required_fields_empty'][] = sprintf("%s %s <i>%s</i>",
3338     sprintf(__("Dans le formulaire %s"), "<i>".__($required_fields_splited[0])."</i>"),
3339     __(" le champ : "),
3340     __($required_fields_splited[1])
3341     );
3342     }
3343     }
3344     }
3345    
3346     if (empty($result_tab['required_fields_empty'])) {
3347     $result_tab['is_ok'] = true;
3348     }
3349    
3350     return $result_tab;
3351    
3352     }
3353    
3354    
3355     /**
3356     * Permet de mettre à jour le state d'une task selon certains paramètre
3357     * Si le paramètre $dossier_autorisation est spécifié cela signifie que
3358     * le dossier a été transmis et qu'on doit modifier les state seulement
3359     * des tache de modification du di et d da
3360     *
3361     * @param dossier l'identifiant du dossier
3362     * @param state_prev le state de la tâche
3363     * @param state_wanted le state que doit avoir la tâche
3364     * @param dossier_autorisation l'identifiant du dossier d'autorisation
3365     *
3366     * @return void
3367     *
3368     */
3369 softime 13528 function update_task_state($dossier, $state_prev, $state_wanted, $dossier_autorisation=null) {
3370 softime 10573
3371     $already_transmitted_updated = '';
3372     $type_task_to_update = '';
3373 softime 10808
3374     $already_transmitted_updated = sprintf('OR task.dossier=\'%s\'', $dossier_autorisation !== null ? $dossier_autorisation : $this->valF['dossier_autorisation']);
3375 softime 10573
3376     $sql = sprintf(
3377 softime 10808 'SELECT task FROM %stask WHERE task.state = \'%s\' AND (task.dossier=\'%s\' %s) %s %s',
3378 softime 10573 DB_PREFIXE,
3379     $state_prev,
3380     $dossier,
3381     $already_transmitted_updated,
3382 softime 10808 $type_task_to_update,
3383     " AND type NOT IN ('notification_recepisse', 'notification_instruction', 'notification_decision') "
3384 softime 10573 );
3385 softime 13137 $tasks_id = $this->f->get_all_results_from_db_query(
3386     $sql,
3387     array(
3388     "origin" => __METHOD__,
3389     )
3390     );
3391 softime 10573 $params = array('val' => array('state' => $state_wanted));
3392     foreach ($tasks_id['result'] as $task_id) {
3393     $inst_task = $this->f->get_inst__om_dbform(array(
3394     "obj" => "task",
3395     "idx" => intval($task_id['task'])
3396     ));
3397     $inst_task->update_task($params);
3398     }
3399     }
3400    
3401    
3402 softime 6565 function setType(&$form,$maj) {
3403     // Par défaut le type des champs est géré nativement par le framework
3404     parent::setType($form,$maj);
3405    
3406     // Récupération du contexte : groupe, CRUD et paramètres
3407     $groupe = $this->get_type_affichage_formulaire();
3408     $crud = $this->get_action_crud($maj);
3409     $parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
3410    
3411 mbroquet 3730 //
3412 softime 6565 // Gestion du groupe
3413 mbroquet 3730 //
3414    
3415 softime 10573 // CONSULTATION ENTRANTE
3416     $ce_fields = array(
3417     'autorisation_contestee' => 'hidden',
3418     'cle_acces_citoyen' => 'static',
3419     'contrevenants' => 'hidden',
3420     'date_ait' => 'hidden',
3421     'date_audience' => 'hidden',
3422     'date_affichage' => 'datestatic',
3423     'date_cloture_instruction' => 'hidden',
3424     'date_contradictoire' => 'hidden',
3425     'date_derniere_visite' => 'hidden',
3426     'date_premiere_visite' => 'hidden',
3427     'date_transmission_parquet' => 'hidden',
3428     'dossier_autorisation_type_detaille' => 'hidden',
3429     'dossier_instruction_type' => 'selecthiddenstatic',
3430     'dossier_petitionnaires' => 'hidden',
3431     'dt_ctx_infraction' => 'hidden',
3432     'dt_ctx_regularisable' => 'hidden',
3433     'dt_ctx_synthese_anr' => 'hidden',
3434     'dt_ctx_synthese_nti' => 'hidden',
3435     'ctx_reference_dsj' => 'hidden',
3436     'enjeu_ctx' => 'static',
3437 softime 13528 'instructeur_2' => 'selecthiddenstatic',
3438 softime 10573 'requerants' => 'hidden',
3439     'bailleur' => 'hidden',
3440     'ctx_reference_sagace' => 'hidden',
3441 softime 10808 'pec_metier' => 'selecthiddenstatic',
3442 softime 10573 "consultation_entrante" => 'hidden',
3443     "delai_reponse" => 'hidden',
3444     "type_delai" => 'hidden',
3445     "objet_consultation" => 'hidden',
3446     "date_production_notification" => 'hidden',
3447     "date_premiere_consultation" => 'hidden',
3448     "date_consultation" => 'hidden',
3449     "date_emission" => 'hidden',
3450     "service_consultant_id" => 'hidden',
3451     "service_consultant_libelle" => 'hidden',
3452     "service_consultant_insee" => 'hidden',
3453     "service_consultant_mail" => 'hidden',
3454     "service_consultant_type" => 'hidden',
3455     "service_consultant__siren" => 'hidden',
3456     "etat_consultation" => 'hidden',
3457     "type_consultation" => 'hidden',
3458     "texte_fondement_reglementaire" => 'hidden',
3459     "texte_objet_consultation" => 'hidden',
3460     "dossier_consultation" => 'hidden',
3461     );
3462 softime 6565 // INFRACTION
3463     $inf_fields = array(
3464     'a_qualifier' => 'hidden',
3465     'autorisation_contestee' => 'hidden',
3466     'autorite_competente' => 'hidden',
3467     'cle_acces_citoyen' => 'hidden',
3468     'contrevenants' => 'static',
3469     'date_ait' => 'hiddenstaticdate',
3470     'date_audience' => 'hiddenstaticdate',
3471     'date_cloture_instruction' => 'hidden',
3472     'date_complet' => 'hidden',
3473     'date_contradictoire' => 'hiddenstaticdate',
3474     'date_decision' => 'hiddenstaticdate',
3475     'date_depot' => 'hiddenstaticdate',
3476 softime 10573 'date_depot_mairie' => 'hiddenstaticdate',
3477 softime 6565 'date_dernier_depot' => 'hidden',
3478     'date_derniere_visite' => 'hiddenstaticdate',
3479     'date_limite' => 'hidden',
3480     'date_limite_incompletude' => 'hidden',
3481     'date_premiere_visite' => 'hiddenstaticdate',
3482     'date_transmission_parquet' => 'hiddenstaticdate',
3483     'date_validite' => 'hidden',
3484     'delai' => 'hidden',
3485     'description_projet' => 'hidden',
3486     'dossier_autorisation_type_detaille' => 'hidden',
3487     'dossier_instruction_type' => 'hidden',
3488     'dossier_petitionnaire' => 'hidden',
3489     'dossier_petitionnaires' => 'hidden',
3490     'dt_ctx_infraction' => 'checkboxhiddenstatic',
3491     'dt_ctx_regularisable' => 'checkboxhiddenstatic',
3492     'dt_ctx_synthese_anr' => 'static',
3493     'dt_ctx_synthese_nti' => 'static',
3494 softime 8477 'ctx_reference_dsj' => 'static',
3495 softime 6565 'enjeu_ctx' => 'hidden',
3496     'enjeu_erp' => 'hidden',
3497     'enjeu_urba' => 'hidden',
3498     'erp' => 'hidden',
3499     'evenement_suivant_tacite' => 'hidden',
3500     'evenement_suivant_tacite_incompletude' => 'hidden',
3501     'numero_versement_archive' => 'hidden',
3502     'requerants' => 'hidden',
3503     'tax_mtn_part_commu' => 'hidden',
3504     'tax_mtn_part_depart' => 'hidden',
3505     'tax_mtn_part_reg' => 'hidden',
3506     'tax_mtn_total' => 'hidden',
3507 softime 6929 'tax_mtn_rap' => 'hidden',
3508 softime 6565 'tax_secteur' => 'hidden',
3509 softime 6929 'tax_mtn_part_commu_sans_exo' => 'hidden',
3510     'tax_mtn_part_depart_sans_exo' => 'hidden',
3511     'tax_mtn_part_reg_sans_exo' => 'hidden',
3512     'tax_mtn_total_sans_exo' => 'hidden',
3513     'tax_mtn_rap_sans_exo' => 'hidden',
3514 softime 7067 'bailleur' => 'hidden',
3515 softime 8477 'ctx_reference_sagace' => 'static',
3516 softime 10573 'pec_metier' => 'hidden',
3517     "consultation_entrante" => 'hidden',
3518     "delai_reponse" => 'hidden',
3519     "type_delai" => 'hidden',
3520     "objet_consultation" => 'hidden',
3521     "date_production_notification" => 'hidden',
3522     "date_premiere_consultation" => 'hidden',
3523     "date_consultation" => 'hidden',
3524     "date_emission" => 'hidden',
3525     "service_consultant_id" => 'hidden',
3526     "service_consultant_libelle" => 'hidden',
3527     "service_consultant_insee" => 'hidden',
3528     "service_consultant_mail" => 'hidden',
3529     "service_consultant_type" => 'hidden',
3530     "service_consultant__siren" => 'hidden',
3531     "etat_consultation" => 'hidden',
3532     "type_consultation" => 'hidden',
3533     "texte_fondement_reglementaire" => 'hidden',
3534     "texte_objet_consultation" => 'hidden',
3535     "dossier_consultation" => 'hidden',
3536 softime 6565 );
3537     // RECOURS
3538     $re_fields = array(
3539     'a_qualifier' => 'hidden',
3540     'autorite_competente' => 'hidden',
3541     'cle_acces_citoyen' => 'hidden',
3542     'contrevenants' => 'hidden',
3543     'date_ait' => 'hidden',
3544     'date_audience' => 'hidden',
3545     'date_cloture_instruction' => 'hiddenstaticdate',
3546     'date_complet' => 'hidden',
3547     'date_contradictoire' => 'hidden',
3548     'date_decision' => 'hiddenstaticdate',
3549     'date_depot' => 'hiddenstaticdate',
3550 softime 10573 'date_depot_mairie' => 'hiddenstaticdate',
3551 softime 6565 'date_dernier_depot' => 'hidden',
3552     'date_derniere_visite' => 'hidden',
3553     'date_limite' => 'hiddenstaticdate',
3554     'date_limite_incompletude' => 'hidden',
3555     'date_premiere_visite' => 'hidden',
3556     'date_transmission_parquet' => 'hidden',
3557     'date_validite' => 'hidden',
3558     'delai' => 'hidden',
3559     'description_projet' => 'hidden',
3560     'dossier_autorisation_type_detaille' => 'static',
3561     'dossier_instruction_type' => 'hidden',
3562     'dossier_petitionnaire' => 'hidden',
3563     'dossier_petitionnaires' => 'static',
3564     'dt_ctx_infraction' => 'hidden',
3565     'dt_ctx_regularisable' => 'hidden',
3566     'dt_ctx_synthese_anr' => 'hidden',
3567     'dt_ctx_synthese_nti' => 'hidden',
3568     'enjeu_ctx' => 'hidden',
3569     'enjeu_erp' => 'hidden',
3570     'enjeu_urba' => 'hidden',
3571     'erp' => 'hidden',
3572     'evenement_suivant_tacite' =>'selecthiddenstatic',
3573     'evenement_suivant_tacite_incompletude' => 'hidden',
3574     'instructeur_2' => 'hidden',
3575     'numero_versement_archive' => 'hidden',
3576     'requerants' => 'static',
3577     'tax_mtn_part_commu' => 'hidden',
3578     'tax_mtn_part_depart' => 'hidden',
3579     'tax_mtn_part_reg' => 'hidden',
3580     'tax_mtn_total' => 'hidden',
3581 softime 6929 'tax_mtn_rap' => 'hidden',
3582 softime 6565 'tax_secteur' => 'hidden',
3583 softime 6929 'tax_mtn_part_commu_sans_exo' => 'hidden',
3584     'tax_mtn_part_depart_sans_exo' => 'hidden',
3585     'tax_mtn_part_reg_sans_exo' => 'hidden',
3586     'tax_mtn_total_sans_exo' => 'hidden',
3587     'tax_mtn_rap_sans_exo' => 'hidden',
3588 softime 7067 'bailleur' => 'hidden',
3589 softime 8477 'ctx_reference_dsj' => 'static',
3590     'ctx_reference_sagace' => 'static',
3591 softime 10573 'pec_metier' => 'hidden',
3592     "consultation_entrante" => 'hidden',
3593     "delai_reponse" => 'hidden',
3594     "type_delai" => 'hidden',
3595     "objet_consultation" => 'hidden',
3596     "date_production_notification" => 'hidden',
3597     "date_premiere_consultation" => 'hidden',
3598     "date_consultation" => 'hidden',
3599     "date_emission" => 'hidden',
3600     "service_consultant_id" => 'hidden',
3601     "service_consultant_libelle" => 'hidden',
3602     "service_consultant_insee" => 'hidden',
3603     "service_consultant_mail" => 'hidden',
3604     "service_consultant_type" => 'hidden',
3605     "service_consultant__siren" => 'hidden',
3606     "etat_consultation" => 'hidden',
3607     "type_consultation" => 'hidden',
3608     "texte_fondement_reglementaire" => 'hidden',
3609     "texte_objet_consultation" => 'hidden',
3610     "dossier_consultation" => 'hidden',
3611 softime 6565 );
3612     // ADS
3613     $ads_fields = array(
3614     'autorisation_contestee' => 'hidden',
3615     'cle_acces_citoyen' => 'static',
3616     'contrevenants' => 'hidden',
3617     'date_ait' => 'hidden',
3618     'date_audience' => 'hidden',
3619 softime 8989 'date_affichage' => 'datestatic',
3620 softime 6565 'date_cloture_instruction' => 'hidden',
3621     'date_contradictoire' => 'hidden',
3622     'date_derniere_visite' => 'hidden',
3623     'date_premiere_visite' => 'hidden',
3624     'date_transmission_parquet' => 'hidden',
3625     'dossier_autorisation_type_detaille' => 'hidden',
3626     'dossier_instruction_type' => 'selecthiddenstatic',
3627     'dossier_petitionnaires' => 'hidden',
3628     'dt_ctx_infraction' => 'hidden',
3629     'dt_ctx_regularisable' => 'hidden',
3630     'dt_ctx_synthese_anr' => 'hidden',
3631     'dt_ctx_synthese_nti' => 'hidden',
3632 softime 8477 'ctx_reference_dsj' => 'hidden',
3633 softime 6565 'enjeu_ctx' => 'static',
3634 softime 13137 'instructeur_2' => 'selecthiddenstatic',
3635 softime 6565 'requerants' => 'hidden',
3636 softime 7067 'bailleur' => 'hidden',
3637 softime 8477 'ctx_reference_sagace' => 'hidden',
3638 softime 14064 'pec_metier' => 'selecthiddenstatic',
3639 softime 10573 "consultation_entrante" => 'hidden',
3640     "delai_reponse" => 'hidden',
3641     "type_delai" => 'hidden',
3642     "objet_consultation" => 'hidden',
3643     "date_production_notification" => 'hidden',
3644     "date_premiere_consultation" => 'hidden',
3645     "date_consultation" => 'hidden',
3646     "date_emission" => 'hidden',
3647     "service_consultant_id" => 'hidden',
3648     "service_consultant_libelle" => 'hidden',
3649     "service_consultant_insee" => 'hidden',
3650     "service_consultant_mail" => 'hidden',
3651     "service_consultant_type" => 'hidden',
3652     "service_consultant__siren" => 'hidden',
3653     "etat_consultation" => 'hidden',
3654     "type_consultation" => 'hidden',
3655     "texte_fondement_reglementaire" => 'hidden',
3656     "texte_objet_consultation" => 'hidden',
3657     "dossier_consultation" => 'hidden',
3658 softime 6565 );
3659 softime 7067 // DPC
3660     $dpc_fields = array(
3661     'autorisation_contestee' => 'hidden',
3662     'cle_acces_citoyen' => 'static',
3663     'contrevenants' => 'hidden',
3664     'date_ait' => 'hidden',
3665     'date_audience' => 'hidden',
3666     'date_cloture_instruction' => 'hidden',
3667     'date_contradictoire' => 'hidden',
3668     'date_derniere_visite' => 'hidden',
3669     'date_premiere_visite' => 'hidden',
3670     'date_transmission_parquet' => 'hidden',
3671     'dossier_autorisation_type_detaille' => 'hidden',
3672     'dossier_instruction_type' => 'selecthiddenstatic',
3673     'dossier_petitionnaires' => 'hidden',
3674     'dt_ctx_infraction' => 'hidden',
3675     'dt_ctx_regularisable' => 'hidden',
3676     'dt_ctx_synthese_anr' => 'hidden',
3677     'dt_ctx_synthese_nti' => 'hidden',
3678 softime 8477 'ctx_reference_dsj' => 'hidden',
3679 softime 7067 'enjeu_ctx' => 'static',
3680 softime 13137 'instructeur_2' => 'selecthiddenstatic',
3681 softime 7067 'requerants' => 'hidden',
3682     'bailleur' => 'static',
3683 softime 8477 'ctx_reference_sagace' => 'hidden',
3684 softime 10573 'pec_metier' => 'hidden',
3685     "consultation_entrante" => 'hidden',
3686     "delai_reponse" => 'hidden',
3687     "type_delai" => 'hidden',
3688     "objet_consultation" => 'hidden',
3689     "date_production_notification" => 'hidden',
3690     "date_premiere_consultation" => 'hidden',
3691     "date_consultation" => 'hidden',
3692     "date_emission" => 'hidden',
3693     "service_consultant_id" => 'hidden',
3694     "service_consultant_libelle" => 'hidden',
3695     "service_consultant_insee" => 'hidden',
3696     "service_consultant_mail" => 'hidden',
3697     "service_consultant_type" => 'hidden',
3698     "service_consultant__siren" => 'hidden',
3699     "etat_consultation" => 'hidden',
3700     "type_consultation" => 'hidden',
3701     "texte_fondement_reglementaire" => 'hidden',
3702     "texte_objet_consultation" => 'hidden',
3703     "dossier_consultation" => 'hidden',
3704 softime 7067 );
3705 softime 6565 // COMMUN
3706     $all_fields = array(
3707     'accord_tacite' => 'hidden',
3708     'annee' => 'hidden',
3709     'autres_demandeurs' => 'hidden',
3710     'date_achevement' => 'hidden',
3711     'date_chantier' => 'hidden',
3712     'date_conformite' => 'hidden',
3713     'date_notification_delai' => 'hidden',
3714     'date_rejet' => 'hidden',
3715     'date_retour_contradictoire' => 'hidden',
3716     'delai_incompletude' => 'hidden',
3717     'description' => 'hidden',
3718     'dossier' => 'hidden',
3719     'dossier_arrondissement' => 'hidden',
3720     'dossier_autorisation' => 'hidden',
3721     'dossier_autorisation_libelle' => 'hidden',
3722     'duree_validite' => 'hidden',
3723     'etat_pendant_incompletude' => 'hidden',
3724     'geom' => 'hiddenstatic',
3725     'geom1' => 'hidden',
3726     'incomplet_notifie' => 'hidden',
3727     'incompletude' => 'hidden',
3728     'interface_referentiel_erp' => 'hidden',
3729     'log_instructions' => 'nodisplay',
3730     'om_collectivite' => 'hidden',
3731     'quartier' => 'hidden',
3732     'version' => 'hidden',
3733 softime 7996 'date_modification' => 'hidden',
3734     'hash_sitadel' => 'hidden',
3735 softime 8329 'depot_electronique' => 'hidden',
3736 softime 9245 'version_clos' => 'hidden',
3737     'initial_dt' => 'hidden',
3738 softime 10573 'adresse_normalisee' => 'hidden',
3739     'adresse_normalisee_json' => 'hidden',
3740     'streetview' => 'hidden',
3741     'numerotation_type' => 'hidden',
3742     'numerotation_dep' => 'hidden',
3743     'numerotation_com' => 'hidden',
3744     'numerotation_division' => 'hidden',
3745     'numerotation_suffixe' => 'hidden',
3746     'numerotation_entite' => 'hidden',
3747     'numerotation_num' => 'hidden',
3748     'numerotation_num_suffixe' => 'hidden',
3749     'numerotation_num_entite' => 'hidden',
3750 softime 15218 'lien_iiue_portal' => 'hidden',
3751 softime 11585 'lien_iiue' => 'hidden',
3752 softime 14064 'dossier_parent' => 'hidden',
3753     'terrain_superficie_calculee' => 'static',
3754 softime 14542 'nature_travaux' => 'static',
3755 softime 6565 );
3756     if (isset($parameters['option_afficher_division'])
3757     && $parameters['option_afficher_division'] !== 'true') {
3758     $all_fields['division'] = 'hidden';
3759 mbroquet 3730 }
3760 softime 6565 if (isset($parameters['option_sig'])
3761     && $parameters['option_sig'] !== 'sig_interne'
3762     && $parameters['option_sig'] !== 'sig_externe'){
3763     $all_fields['geom'] = 'hidden';
3764 mbroquet 3730 }
3765    
3766 softime 10573 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3767 softime 10869 $all_fields['date_depot_mairie'] = 'hiddenstaticdate';
3768 softime 10573 } else {
3769     $all_fields['date_depot_mairie'] = 'hidden';
3770     }
3771    
3772 softime 11585 // Affichage des identifiants techniques Plat'AU
3773     if ($crud === 'read'
3774     && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
3775 softime 14542 && ($this->f->is_option_mode_service_consulte_enabled() !== true
3776     || ($this->f->is_option_mode_service_consulte_enabled() === true
3777     && ($this->get_source_depot_from_demande() === PLATAU
3778     || $this->get_source_depot_from_demande() === PORTAL)))) {
3779 softime 11585 //
3780     $all_fields['lien_iiue'] = 'jsontotab';
3781     }
3782    
3783 softime 15218 if ($crud === 'read'
3784     && $this->get_is_portal_code_suivi() === true) {
3785     // Utilisation d'un type non existant pour que le label du champ
3786     // ne soit pas généré
3787     $all_fields['lien_iiue_portal'] = 'staticnolabel';
3788     }
3789    
3790 softime 6565 //
3791     // Gestion du contexte
3792     //
3793 mbroquet 3730
3794 softime 6565 // AJOUTER, MODIFIER
3795     if ($crud === 'create' OR $crud === 'update') {
3796 mbroquet 3730
3797 softime 7366 $all_fields['avis_decision'] = 'selecthiddenstatic';
3798 softime 6565 $all_fields['etat'] = 'hiddenstatic';
3799     $all_fields['terrain'] = 'hiddenstatic';
3800 softime 14064 $all_fields['terrain_superficie_calculee'] = 'hiddenstatic';
3801 softime 6565 //
3802     $ads_fields['a_qualifier'] = 'checkbox';
3803     $ads_fields['accord_tacite'] = 'hiddenstatic';
3804     $ads_fields['autorite_competente'] = 'selecthiddenstatic';
3805     $ads_fields['date_achevement'] = 'hiddenstaticdate';
3806     $ads_fields['date_chantier'] = 'hiddenstaticdate';
3807     $ads_fields['date_conformite'] = 'hiddenstaticdate';
3808     $ads_fields['date_decision'] = 'hiddenstaticdate';
3809 softime 8989 $ads_fields['date_affichage'] = 'hiddenstaticdate';
3810 softime 6565 $ads_fields['date_depot'] = 'hiddenstaticdate';
3811 softime 10573 //
3812     $ce_fields['a_qualifier'] = 'checkbox';
3813     $ce_fields['accord_tacite'] = 'hiddenstatic';
3814     $ce_fields['autorite_competente'] = 'selecthiddenstatic';
3815     $ce_fields['date_achevement'] = 'hiddenstaticdate';
3816     $ce_fields['date_chantier'] = 'hiddenstaticdate';
3817     $ce_fields['date_conformite'] = 'hiddenstaticdate';
3818     $ce_fields['date_decision'] = 'hiddenstaticdate';
3819     $ce_fields['date_affichage'] = 'hiddenstaticdate';
3820     $ce_fields['date_depot'] = 'hiddenstaticdate';
3821     if ($this->f->is_option_date_depot_mairie_enabled() === true) {
3822     $ads_fields['date_depot_mairie'] = 'date';
3823     $ce_fields['date_depot_mairie'] = 'date';
3824     } else {
3825     $ads_fields['date_depot_mairie'] = 'hidden';
3826     $ce_fields['date_depot_mairie'] = 'hidden';
3827     }
3828 softime 6565 $ads_fields['date_dernier_depot'] = 'hiddenstaticdate';
3829     $ads_fields['date_notification_delai'] = 'hiddenstaticdate';
3830     $ads_fields['date_rejet'] = 'hiddenstaticdate';
3831     $ads_fields['date_validite'] = 'hiddenstaticdate';
3832     $ads_fields['delai'] = 'hiddenstatic';
3833     $ads_fields['description_projet'] = 'hiddenstatic';
3834 softime 7366 $ads_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3835 softime 6565 $ads_fields['shon_calcul'] = 'hiddenstatic';
3836     $ads_fields['tax_mtn_part_commu'] = 'hidden';
3837     $ads_fields['tax_mtn_part_depart'] = 'hidden';
3838     $ads_fields['tax_mtn_part_reg'] = 'hidden';
3839     $ads_fields['tax_mtn_total'] = 'hidden';
3840 softime 6929 $ads_fields['tax_mtn_rap'] = 'hidden';
3841     $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3842     $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3843     $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3844     $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
3845     $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3846 softime 6565 $ads_fields['terrain_surface_calcul'] = 'hiddenstatic';
3847 softime 7067 //
3848 softime 10573 $ce_fields['date_dernier_depot'] = 'hiddenstaticdate';
3849     $ce_fields['date_notification_delai'] = 'hiddenstaticdate';
3850     $ce_fields['date_rejet'] = 'hiddenstaticdate';
3851     $ce_fields['date_validite'] = 'hiddenstaticdate';
3852     $ce_fields['delai'] = 'hiddenstatic';
3853     $ce_fields['description_projet'] = 'hiddenstatic';
3854     $ce_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3855     $ce_fields['shon_calcul'] = 'hiddenstatic';
3856     $ce_fields['tax_mtn_part_commu'] = 'hidden';
3857     $ce_fields['tax_mtn_part_depart'] = 'hidden';
3858     $ce_fields['tax_mtn_part_reg'] = 'hidden';
3859     $ce_fields['tax_mtn_total'] = 'hidden';
3860     $ce_fields['tax_mtn_rap'] = 'hidden';
3861     $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3862     $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3863     $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3864     $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
3865     $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3866     $ce_fields['terrain_surface_calcul'] = 'hiddenstatic';
3867     //
3868 softime 7067 $dpc_fields['a_qualifier'] = 'checkbox';
3869     $dpc_fields['accord_tacite'] = 'hiddenstatic';
3870     $dpc_fields['autorite_competente'] = 'selecthiddenstatic';
3871     $dpc_fields['date_achevement'] = 'hiddenstaticdate';
3872     $dpc_fields['date_chantier'] = 'hiddenstaticdate';
3873     $dpc_fields['date_conformite'] = 'hiddenstaticdate';
3874     $dpc_fields['date_decision'] = 'hiddenstaticdate';
3875     $dpc_fields['date_depot'] = 'hiddenstaticdate';
3876 softime 10573 $dpc_fields['date_depot_mairie'] = 'hiddenstaticdate';
3877 softime 7067 $dpc_fields['date_dernier_depot'] = 'hiddenstaticdate';
3878     $dpc_fields['date_notification_delai'] = 'hiddenstaticdate';
3879     $dpc_fields['date_rejet'] = 'hiddenstaticdate';
3880     $dpc_fields['date_validite'] = 'hiddenstaticdate';
3881     $dpc_fields['delai'] = 'hiddenstatic';
3882     $dpc_fields['description_projet'] = 'hiddenstatic';
3883 softime 7366 $dpc_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3884 softime 7067 $dpc_fields['shon_calcul'] = 'hiddenstatic';
3885     $dpc_fields['tax_mtn_part_commu'] = 'hidden';
3886     $dpc_fields['tax_mtn_part_depart'] = 'hidden';
3887     $dpc_fields['tax_mtn_part_reg'] = 'hidden';
3888     $dpc_fields['tax_mtn_total'] = 'hidden';
3889     $dpc_fields['tax_mtn_rap'] = 'hidden';
3890     $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
3891     $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
3892     $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
3893     $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
3894     $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
3895     $dpc_fields['terrain_surface_calcul'] = 'hiddenstatic';
3896 softime 7366 //
3897     $re_fields['dossier_autorisation_type_detaille'] = 'hiddenstatic';
3898 softime 10573 $re_fields['dossier_petitionnaires'] = 'static';
3899 softime 7366 $re_fields['requerants'] = 'hiddenstatic';
3900     $inf_fields['contrevenants'] = 'hiddenstatic';
3901     $inf_fields['dt_ctx_synthese_anr'] = 'hiddenstatic';
3902     $inf_fields['dt_ctx_synthese_nti'] = 'hiddenstatic';
3903 softime 10573 //
3904 softime 10808 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
3905 softime 13137 if ($this->get_source_depot_from_demande() === PLATAU
3906     || $this->get_source_depot_from_demande() === PORTAL) {
3907 softime 10808 //
3908 softime 10573 $ce_fields["consultation_entrante"] = 'hidden';
3909     $ce_fields["delai_reponse"] = 'static';
3910     $ce_fields["type_delai"] = 'static';
3911     $ce_fields["objet_consultation"] = 'static';
3912     $ce_fields["date_production_notification"] = 'datestatic';
3913     $ce_fields["date_premiere_consultation"] = 'datestatic';
3914     $ce_fields["date_consultation"] = 'datestatic';
3915     $ce_fields["date_emission"] = 'datestatic';
3916     $ce_fields["service_consultant_id"] = 'static';
3917     $ce_fields["service_consultant_libelle"] = 'static';
3918     $ce_fields["service_consultant_insee"] = 'static';
3919     $ce_fields["service_consultant_mail"] = 'static';
3920     $ce_fields["service_consultant_type"] = 'static';
3921     $ce_fields["service_consultant__siren"] = 'static';
3922     $ce_fields["etat_consultation"] = 'static';
3923     $ce_fields["type_consultation"] = 'static';
3924     $ce_fields["texte_fondement_reglementaire"] = 'static';
3925     $ce_fields["texte_objet_consultation"] = 'static';
3926     $ce_fields["dossier_consultation"] = 'hidden';
3927     }
3928 softime 6565 // Si l'état du dossier est incomplet
3929     if ($this->is_incomplet_notifie()) {
3930     // On cache les dates de complétude et de limite d'instruction
3931     $ads_fields['date_complet'] = 'hidden';
3932     $ads_fields['date_limite'] = 'hidden';
3933     $ads_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3934     $ads_fields['evenement_suivant_tacite'] ='hidden';
3935     $ads_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3936 softime 7067 //
3937     $dpc_fields['date_complet'] = 'hidden';
3938     $dpc_fields['date_limite'] = 'hidden';
3939     $dpc_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3940     $dpc_fields['evenement_suivant_tacite'] ='hidden';
3941     $dpc_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3942 softime 10573 //
3943     $ce_fields['date_complet'] = 'hidden';
3944     $ce_fields['date_limite'] = 'hidden';
3945     $ce_fields['evenement_suivant_tacite_incompletude'] ='selecthiddenstatic';
3946     $ce_fields['evenement_suivant_tacite'] ='hidden';
3947     $ce_fields['date_limite_incompletude'] = 'hiddenstaticdate';
3948 softime 6565 } else {
3949     // Sinon on cache la date de limite d'incomplétude
3950     $ads_fields['date_limite_incompletude'] = 'hidden';
3951     $ads_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3952     $ads_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3953     $ads_fields['date_complet'] = 'hiddenstaticdate';
3954     $ads_fields['date_limite'] = 'hiddenstaticdate';
3955 softime 7067 //
3956     $dpc_fields['date_limite_incompletude'] = 'hidden';
3957     $dpc_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3958     $dpc_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3959     $dpc_fields['date_complet'] = 'hiddenstaticdate';
3960     $dpc_fields['date_limite'] = 'hiddenstaticdate';
3961 softime 10573 //
3962     $ce_fields['date_limite_incompletude'] = 'hidden';
3963     $ce_fields['evenement_suivant_tacite_incompletude'] ='hidden';
3964     $ce_fields['evenement_suivant_tacite'] ='selecthiddenstatic';
3965     $ce_fields['date_complet'] = 'hiddenstaticdate';
3966     $ce_fields['date_limite'] = 'hiddenstaticdate';
3967 softime 6565 }
3968    
3969     // MODIFIER
3970     if ($crud ==='update') {
3971     $all_fields['dossier_libelle'] = 'hiddenstatic';
3972 softime 10573 $ads_fields['dossier_petitionnaire'] = 'static';
3973     $dpc_fields['dossier_petitionnaire'] = 'static';
3974     $ce_fields['dossier_petitionnaire'] = 'static';
3975 softime 13528 $inf_fields['numero_versement_archive'] = 'text';
3976 softime 15037 $re_fields['numero_versement_archive'] = 'text';
3977 softime 14542 $all_fields['nature_travaux'] = 'select_multiple';
3978 softime 6565 //
3979     if ($this->f->isAccredited("dossier_modifier_instructeur")) {
3980     $all_fields['instructeur'] = 'select';
3981     $inf_fields['instructeur_2'] = 'select';
3982 softime 13137 $ads_fields['instructeur_2'] = 'select';
3983     $dpc_fields['instructeur_2'] = 'select';
3984 softime 13528 $ce_fields['instructeur_2'] = 'select';
3985 softime 6565 } else {
3986     $all_fields['instructeur'] = 'selecthiddenstatic';
3987     $inf_fields['instructeur_2'] = 'selecthiddenstatic';
3988 softime 13137 $ads_fields['instructeur_2'] = 'selecthiddenstatic';
3989     $dpc_fields['instructeur_2'] = 'selecthiddenstatic';
3990 softime 13528 $ce_fields['instructeur_2'] = 'selecthiddenstatic';
3991 softime 6565 }
3992     //
3993     if (isset($parameters['option_afficher_division'])
3994     && $parameters['option_afficher_division'] === 'true') {
3995     $all_fields['division'] = 'selecthiddenstatic';
3996     if ($this->f->isAccredited("dossier_modifier_division")) {
3997     $all_fields['division'] = 'select';
3998     }
3999     }
4000     // Si l'utilisateur ne peut pas qualifier un DI (guichet unique & guichet et suivi)
4001     if (!$this->f->isAccredited(array("dossier_instruction","dossier_instruction_qualifier"), "OR")) {
4002     // Il ne peut pas modifier les champs suivants
4003     $ads_fields['numero_versement_archive'] = 'hiddenstatic';
4004     $ads_fields['enjeu_urba'] = 'checkboxhiddenstatic';
4005     $ads_fields['enjeu_erp'] = 'checkboxhiddenstatic';
4006     $ads_fields['erp'] = 'checkboxhiddenstatic';
4007     $ads_fields['a_qualifier'] = 'checkboxhiddenstatic';
4008 softime 7067 //
4009     $dpc_fields['numero_versement_archive'] = 'hiddenstatic';
4010     $dpc_fields['enjeu_urba'] = 'checkboxhiddenstatic';
4011     $dpc_fields['enjeu_erp'] = 'checkboxhiddenstatic';
4012     $dpc_fields['erp'] = 'checkboxhiddenstatic';
4013     $dpc_fields['a_qualifier'] = 'checkboxhiddenstatic';
4014 softime 10573 //
4015     $ce_fields['numero_versement_archive'] = 'hiddenstatic';
4016     $ce_fields['enjeu_urba'] = 'checkboxhiddenstatic';
4017     $ce_fields['enjeu_erp'] = 'checkboxhiddenstatic';
4018     $ce_fields['erp'] = 'checkboxhiddenstatic';
4019     $ce_fields['a_qualifier'] = 'checkboxhiddenstatic';
4020 softime 6565 }
4021     // Le profil Qualificateur peut modifier seulement les champs
4022     // autorite_competente, a_qualifier et erp
4023     if ($this->f->isUserQualificateur()) {
4024     $ads_fields['numero_versement_archive'] = 'static';
4025     $ads_fields['enjeu_urba'] = 'checkboxstatic';
4026     $ads_fields['enjeu_erp'] = 'checkboxstatic';
4027 softime 7067 //
4028     $dpc_fields['numero_versement_archive'] = 'static';
4029     $dpc_fields['enjeu_urba'] = 'checkboxstatic';
4030     $dpc_fields['enjeu_erp'] = 'checkboxstatic';
4031 softime 10573 //
4032     $ce_fields['numero_versement_archive'] = 'static';
4033     $ce_fields['enjeu_urba'] = 'checkboxstatic';
4034     $ce_fields['enjeu_erp'] = 'checkboxstatic';
4035 softime 6565 }
4036 softime 7366 // Le dossier ne doit pas être instruit
4037     if ($this->has_only_recepisse() === true
4038     && $this->getStatut() !== 'cloture') {
4039     //
4040     $all_fields['date_depot'] = 'date';
4041 softime 10573 if ($this->f->is_option_date_depot_mairie_enabled() === true) {
4042     $all_fields['date_depot_mairie'] = 'date';
4043     } else {
4044     $all_fields['date_depot_mairie'] = 'hidden';
4045     }
4046 softime 7366 }
4047 softime 8593 // Gestion de la case à cocher ERP en cas d'interfaçage avec le
4048     // référentiel ERP
4049     if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true) {
4050     // Par défaut la case à cocher ERP est non modifiable
4051     $all_fields['erp'] = 'checkboxhiddenstatic';
4052     // Si le type du dossier d'instruction en cours est présent
4053     // dans les paramètres autorisant l'interfaçage avec le référentiel ERP
4054     if (isset($parameters['erp__dossier__nature__at']) === true
4055     && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__at']) {
4056     //
4057     $all_fields['erp'] = 'checkbox';
4058     }
4059     if (isset($parameters['erp__dossier__nature__pc']) === true
4060     && $this->f->getDATCode($this->getVal($this->clePrimaire)) == $parameters['erp__dossier__nature__pc']
4061     && isset($parameters['erp__dossier__type_di__pc']) === true) {
4062     //
4063     $erp_di_pc = explode(";", $parameters['erp__dossier__type_di__pc']);
4064     if (is_array($erp_di_pc) === true
4065     && in_array($this->getVal("dossier_instruction_type"), $erp_di_pc) === true) {
4066     //
4067     $all_fields['erp'] = 'checkbox';
4068     }
4069     }
4070     }
4071 softime 8989 // modification de la date d'affichage pour les ADS
4072     if ($this->f->isAccredited($this->get_absolute_class_name()."_modifier_date_affichage")) {
4073     $ads_fields['date_affichage'] = 'date';
4074 softime 10573 $ce_fields['date_affichage'] = 'date';
4075 softime 8989 }
4076 softime 10573
4077     // pas de modificiation de la commune associée au dossier (si l'option est activée)
4078     if ($this->f->is_option_dossier_commune_enabled($this->getVal('om_collectivite'))) {
4079     $ads_fields['commune'] = 'selecthiddenstatic';
4080     $ce_fields['commune'] = 'selecthiddenstatic';
4081     }
4082 softime 6565 }
4083     }
4084     // MODIFIER, SUPPRIMER, CONSULTER
4085     if ($crud !== 'create') {
4086     $re_fields['autorisation_contestee'] = 'selecthiddenstatic';
4087     $all_fields['date_demande'] = 'hidden';
4088     // La collectivité n'est jamais modifiable
4089     if ($_SESSION['niveau'] == 2) {
4090     $all_fields['om_collectivite'] = 'selecthiddenstatic';
4091     }
4092 softime 6929 // Instance du paramétrage des taxes
4093 mbroquet 3730 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
4094     // Instance de cerfa
4095     $inst_cerfa = $this->get_inst_cerfa();
4096 softime 10573
4097     // Gestion du secteur pour la taxe d'aménagement
4098     // MODIFIER
4099     if ($crud === 'update') {
4100     //
4101     if ($this->is_in_context_of_foreign_key("tax_secteur", $this->getParameter("retourformulaire"))) {
4102     $ads_fields['tax_secteur'] = 'selecthiddenstatic';
4103     $dpc_fields['tax_secteur'] = 'selecthiddenstatic';
4104     $ce_fields['tax_secteur'] = 'selecthiddenstatic';
4105     } else {
4106     $ads_fields['tax_secteur'] = 'select';
4107     $dpc_fields['tax_secteur'] = 'select';
4108     $ce_fields['tax_secteur'] = 'select';
4109     }
4110     }
4111     // SUPPRIMER
4112     if ($crud === 'delete') {
4113     //
4114     $ads_fields['tax_secteur'] = 'selectstatic';
4115     $dpc_fields['tax_secteur'] = 'selectstatic';
4116     $ce_fields['tax_secteur'] = 'selectstatic';
4117     }
4118     // CONSULTER
4119     if ($crud === 'read') {
4120     //
4121     $ads_fields['tax_secteur'] = 'selectstatic';
4122     $dpc_fields['tax_secteur'] = 'selectstatic';
4123     $ce_fields['tax_secteur'] = 'selectstatic';
4124 softime 13528 $inf_fields['numero_versement_archive'] = 'hiddenstatic';
4125 softime 15037 $re_fields['numero_versement_archive'] = 'hiddenstatic';
4126 softime 10573 }
4127    
4128 softime 6929 // Si l'option de simulation est activée pour la collectivité du
4129     // dossier, l'utilisateur connecté a la permissions de voir
4130     // la simulation des taxes, la collectivité à un paramétrage pour
4131     // les taxes et que le cerfa du dossier à les champs requis
4132     if ($this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true
4133     && $this->f->isAccredited("dossier_instruction_simulation_taxes") === true
4134     && $inst_taxe_amenagement !== null
4135     && $inst_cerfa->can_simulate_taxe_amenagement() === true) {
4136 mbroquet 3730
4137 softime 6565 // Si ce n'est pas une commune d'Île-de-France
4138 mbroquet 3730 if ($inst_taxe_amenagement->getVal('en_ile_de_france') == 'f') {
4139     //
4140 softime 6565 $ads_fields['tax_mtn_part_reg'] = 'hidden';
4141 softime 6929 $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4142 softime 7067 $dpc_fields['tax_mtn_part_reg'] = 'hidden';
4143     $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4144 softime 10573 $ce_fields['tax_mtn_part_reg'] = 'hidden';
4145     $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4146 mbroquet 3730 }
4147     } else {
4148 softime 6565 // SUPPRIMER, CONSULTER
4149     if ($crud === 'delete' OR $crud ==='read') {
4150     $ads_fields['tax_mtn_part_commu'] = 'hidden';
4151     $ads_fields['tax_mtn_part_depart'] = 'hidden';
4152     $ads_fields['tax_mtn_part_reg'] = 'hidden';
4153     $ads_fields['tax_mtn_total'] = 'hidden';
4154 softime 6929 $ads_fields['tax_mtn_rap'] = 'hidden';
4155     $ads_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4156     $ads_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4157     $ads_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4158     $ads_fields['tax_mtn_total_sans_exo'] = 'hidden';
4159     $ads_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4160 softime 7067 //
4161     $dpc_fields['tax_mtn_part_commu'] = 'hidden';
4162     $dpc_fields['tax_mtn_part_depart'] = 'hidden';
4163     $dpc_fields['tax_mtn_part_reg'] = 'hidden';
4164     $dpc_fields['tax_mtn_total'] = 'hidden';
4165     $dpc_fields['tax_mtn_rap'] = 'hidden';
4166     $dpc_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4167     $dpc_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4168     $dpc_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4169     $dpc_fields['tax_mtn_total_sans_exo'] = 'hidden';
4170     $dpc_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4171 softime 10573 //
4172     $ce_fields['tax_mtn_part_commu'] = 'hidden';
4173     $ce_fields['tax_mtn_part_depart'] = 'hidden';
4174     $ce_fields['tax_mtn_part_reg'] = 'hidden';
4175     $ce_fields['tax_mtn_total'] = 'hidden';
4176     $ce_fields['tax_mtn_rap'] = 'hidden';
4177     $ce_fields['tax_mtn_part_commu_sans_exo'] = 'hidden';
4178     $ce_fields['tax_mtn_part_depart_sans_exo'] = 'hidden';
4179     $ce_fields['tax_mtn_part_reg_sans_exo'] = 'hidden';
4180     $ce_fields['tax_mtn_total_sans_exo'] = 'hidden';
4181     $ce_fields['tax_mtn_rap_sans_exo'] = 'hidden';
4182 mbroquet 3730 }
4183     }
4184     }
4185 softime 8477 // CONSULTER
4186     if ($crud ==='read') {
4187 mbroquet 3730
4188 softime 6565 $ads_fields['geom'] = 'static';
4189     $ads_fields['a_qualifier'] = 'checkboxstatic';
4190     $ads_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4191 softime 7067 //
4192     $dpc_fields['geom'] = 'static';
4193     $dpc_fields['a_qualifier'] = 'checkboxstatic';
4194     $dpc_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4195 softime 10573 //
4196     $ce_fields['geom'] = 'static';
4197     $ce_fields['a_qualifier'] = 'checkboxstatic';
4198     $ce_fields['terrain_references_cadastrales'] = 'referencescadastralesstatic';
4199 softime 14542
4200     $all_fields['nature_travaux'] = 'select_multiple_static';
4201    
4202 softime 10573 // Affiche le champ streetview si l'option est active
4203     if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true) {
4204     $all_fields['streetview'] = 'static';
4205     }
4206    
4207 softime 6565 // Si l'état du dossier est incomplet
4208     if ($this->is_incomplet_notifie()) {
4209     // on cache les dates de complétude et de limite d'instruction
4210     $ads_fields['date_complet'] = 'hidden';
4211     $ads_fields['date_limite'] = 'hidden';
4212     $ads_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4213     $ads_fields['evenement_suivant_tacite'] = 'hidden';
4214 softime 7067 //
4215     $dpc_fields['date_complet'] = 'hidden';
4216     $dpc_fields['date_limite'] = 'hidden';
4217     $dpc_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4218     $dpc_fields['evenement_suivant_tacite'] = 'hidden';
4219 softime 10573 //
4220     $ce_fields['date_complet'] = 'hidden';
4221     $ce_fields['date_limite'] = 'hidden';
4222     $ce_fields['evenement_suivant_tacite_incompletude'] = 'selecthiddenstatic';
4223     $ce_fields['evenement_suivant_tacite'] = 'hidden';
4224 softime 6565 } else {
4225     // sinon on cache la date de limite d'incomplétude
4226     $ads_fields['date_limite_incompletude'] = 'hidden';
4227     $ads_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4228     $ads_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4229 softime 7067 //
4230     $dpc_fields['date_limite_incompletude'] = 'hidden';
4231     $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4232     $dpc_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4233 softime 10573 //
4234     $ce_fields['date_limite_incompletude'] = 'hidden';
4235     $ce_fields['evenement_suivant_tacite_incompletude'] = 'hidden';
4236     $ce_fields['evenement_suivant_tacite'] = 'selecthiddenstatic';
4237 softime 6565 }
4238     if (isset($parameters['option_arrondissement'])
4239     && $parameters['option_arrondissement'] === 'true') {
4240     $all_fields['dossier_arrondissement'] = 'static';
4241     }
4242 softime 10573 //
4243 softime 10808 // Vérifie que le dossier a été déposé depuis Plat'AU ou le portail citoyen
4244 softime 13137 if ($this->get_source_depot_from_demande() === PLATAU
4245     || $this->get_source_depot_from_demande() === PORTAL) {
4246 softime 10808 //
4247 softime 10573 $ce_fields["consultation_entrante"] = 'hidden';
4248     $ce_fields["delai_reponse"] = 'static';
4249     $ce_fields["type_delai"] = 'static';
4250     $ce_fields["objet_consultation"] = 'static';
4251     $ce_fields["date_production_notification"] = 'datestatic';
4252     $ce_fields["date_premiere_consultation"] = 'datestatic';
4253     $ce_fields["date_consultation"] = 'datestatic';
4254     $ce_fields["date_emission"] = 'datestatic';
4255     $ce_fields["service_consultant_id"] = 'static';
4256     $ce_fields["service_consultant_libelle"] = 'static';
4257     $ce_fields["service_consultant_insee"] = 'static';
4258     $ce_fields["service_consultant_mail"] = 'static';
4259     $ce_fields["service_consultant_type"] = 'static';
4260     $ce_fields["service_consultant__siren"] = 'static';
4261     $ce_fields["etat_consultation"] = 'static';
4262     $ce_fields["type_consultation"] = 'static';
4263     $ce_fields["texte_fondement_reglementaire"] = 'static';
4264     $ce_fields["texte_objet_consultation"] = 'static';
4265     $ce_fields["dossier_consultation"] = 'hidden';
4266     }
4267 softime 6565 }
4268 softime 8477 // SUPPRIMER
4269     if($crud === 'delete') {
4270     // Cache tous les champs execepté le libellé du dossier
4271     foreach ($this->champs as $champ) {
4272     $all_fields[$champ] = 'hidden';
4273     }
4274     $all_fields['dossier_libelle'] = 'hiddenstatic';
4275     }
4276 softime 6565
4277 softime 10573 $all_fields['etat_transmission_platau'] = 'hidden';
4278 softime 10968 if ($crud !== 'create') {
4279     //
4280     $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
4281     if ($inst_datd->getVal('dossier_platau') === 't') {
4282     //
4283     $all_fields['etat_transmission_platau'] = 'selecthiddenstatic';
4284     }
4285     }
4286    
4287    
4288 softime 10573 if ($crud == 'create' || $crud == 'update') {
4289     $required_fields_platau = $this->list_platau_required_fields_dossier;
4290     if ($this->f->is_option_mode_service_consulte_enabled() === false) {
4291 softime 10808 if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
4292     && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
4293     //
4294 softime 10573 foreach ($required_fields_platau as $required_field_platau) {
4295     $champ = explode('.', $required_field_platau)[1];
4296     if (in_array($champ, $this->champs)) {
4297     $form->setType($champ ,$form->type[$champ].'_demat_color');
4298     }
4299     }
4300     }
4301     }
4302     }
4303    
4304 softime 12847 // Dans tous les cas si le champ accord_tacite est à non on veut insérer
4305     // du texte dans le champ "au terme du délai" et donc ce n'est plus un
4306     // selecthiddenstatic
4307 softime 13528 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4308 softime 12847 if ($this->is_incomplet_notifie() === false) {
4309     $all_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4310     $ads_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4311     $ce_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4312     $dpc_fields['evenement_suivant_tacite'] = 'hiddenstatic';
4313     } else {
4314     $all_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4315     $ads_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4316     $dpc_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4317     $ce_fields['evenement_suivant_tacite_incompletude'] = 'hiddenstatic';
4318     }
4319     }
4320    
4321     // Lorsque le statut de dossier est "cloture" on cache le champ "au terme du délai"
4322     if ($this->getStatut() === 'cloture') {
4323     $all_fields['evenement_suivant_tacite'] = 'hidden';
4324     $ads_fields['evenement_suivant_tacite'] = 'hidden';
4325     $dpc_fields['evenement_suivant_tacite'] = 'hidden';
4326     $ce_fields['evenement_suivant_tacite'] = 'hidden';
4327     }
4328    
4329 softime 6565 //
4330     // Typage
4331     //
4332    
4333     switch ($groupe) {
4334     case 'CTX IN':
4335     $this->manage_type($form, $inf_fields);
4336     break;
4337     case 'CTX RE':
4338     $this->manage_type($form, $re_fields);
4339     break;
4340     case 'ADS':
4341     $this->manage_type($form, $ads_fields);
4342     break;
4343 softime 7067 case 'DPC':
4344     $this->manage_type($form, $dpc_fields);
4345     break;
4346 softime 10573 case 'CONSULTATION ENTRANTE':
4347     $this->manage_type($form, $ce_fields);
4348     break;
4349 softime 6565 }
4350     $this->manage_type($form, $all_fields);
4351 mbroquet 3730 }
4352    
4353 softime 6929
4354 softime 6565 /**
4355     * Gestion du typage des champs
4356     *
4357     * @param object $form formulaire instancié
4358     * @param array $fields tableau associatif des champs avec leur widget de formulaire en valeur
4359     * @return void
4360     */
4361     protected function manage_type($form, $fields) {
4362     foreach ($this->champs as $key => $field) {
4363     if (array_key_exists($field, $fields) === true) {
4364     $form->setType($field, $fields[$field]);
4365     }
4366     }
4367     }
4368    
4369    
4370     /**
4371 softime 7067 * Retourne le nombre de parcelles qu'à en commun le dossier passé en
4372     * paramètre avec les dossiers contentieux en cours. Le nombre de parcelles
4373     * est groupé par type de dossier d'autorisation : RE ou IN.
4374 softime 15037 * Permet également de vérifier si au moins un des dossiers contentieux liés,
4375     * est clôturé ou non, ce résultat est regroupé par type RE ou IN.
4376 softime 6565 *
4377 softime 7067 * @param string $di identifiant du DI
4378 softime 15037 *
4379 softime 6565 * @return array
4380     */
4381 softime 15037 function get_data_dossier_ctx_lie($di) {
4382 softime 14542 $qres = $this->f->get_all_results_from_db_query(
4383     sprintf(
4384     'SELECT
4385     dossier_autorisation_type.code,
4386 softime 15037 dossier_ctx.dossier,
4387     etat.statut
4388 softime 14542 FROM %1$sdossier
4389     LEFT JOIN %1$sdossier_parcelle
4390     ON dossier.dossier = dossier_parcelle.dossier
4391     LEFT JOIN %1$sdossier_parcelle as parcelle_ctx
4392     ON dossier_parcelle.libelle = parcelle_ctx.libelle
4393     AND dossier_parcelle.dossier != parcelle_ctx.dossier
4394     LEFT JOIN %1$sdossier as dossier_ctx
4395     ON dossier_ctx.dossier = parcelle_ctx.dossier
4396     INNER JOIN %1$setat
4397     ON dossier_ctx.etat = etat.etat
4398     LEFT JOIN %1$sdossier_autorisation
4399     ON dossier_ctx.dossier_autorisation = dossier_autorisation.dossier_autorisation
4400     LEFT JOIN %1$sdossier_autorisation_type_detaille
4401     ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4402     = dossier_autorisation.dossier_autorisation_type_detaille
4403     LEFT JOIN %1$sdossier_autorisation_type
4404     ON dossier_autorisation_type_detaille.dossier_autorisation_type
4405     = dossier_autorisation_type.dossier_autorisation_type
4406     WHERE
4407     dossier.dossier = \'%2$s\'
4408     AND (dossier_autorisation_type.code = \'RE\'
4409 softime 15037 OR dossier_autorisation_type.code = \'IN\')',
4410 softime 14542 DB_PREFIXE,
4411     $this->f->db->escapeSimple($di)
4412     ),
4413     array(
4414     'origin' => __METHOD__
4415     )
4416     );
4417 softime 15037
4418     // Nombre de dossier de chaque type
4419 softime 6565 $nb_re_inf = array('re' => 0, 'inf' => 0);
4420 softime 15037 // Au moins un dossier est clôturé, par type
4421     $cloture_re_inf = array('re' => true, 'inf' => true);
4422 softime 14542 foreach ($qres['result'] as $row) {
4423 softime 15037 // Compte le nombre de RE et vérifie si au moins l'un d'entre eux
4424     // n'est pas clôturé
4425 softime 6565 if ($row["code"] == "RE"){
4426 softime 15037 $nb_re_inf['re']++;
4427     if ($row['statut'] != "cloture") {
4428     $cloture_re_inf['re'] = false;
4429     }
4430 softime 6565 }
4431 softime 15037 // Compte le nombre de IN et vérifie si au moins l'un d'entre eux
4432     // n'est pas clôturé
4433 softime 6565 if ($row["code"] == "IN"){
4434 softime 15037 $nb_re_inf['inf']++;
4435     if ($row['statut'] != "cloture") {
4436     $cloture_re_inf['inf'] = false;
4437     }
4438 softime 6565 }
4439     }
4440    
4441 softime 15037 // Tableau de résultat
4442     $result = array(
4443     'nb_re_inf' => $nb_re_inf,
4444     'cloture_re_inf' => $cloture_re_inf,
4445     );
4446     return $result;
4447 softime 6565 }
4448    
4449 softime 8989 /**
4450     * SETTER_FORM - setVal (setVal).
4451     *
4452     * @return void
4453     */
4454     function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
4455     // parent::setVal($form, $maj, $validation);
4456     //
4457 mbroquet 3730 $this->maj=$maj;
4458 softime 10573
4459     if ($this->f->is_option_sig_enabled($this->getVal("om_collectivite")) === true
4460 softime 8989 && $this->f->issetSIGParameter($this->getVal("dossier")) === true) {
4461 softime 10573
4462     // lien vers le SIG
4463     $geoLinksHtml = $this->getGeolocalisationLink();
4464     $form->setVal("geom", $geoLinksHtml);
4465 mbroquet 3730 }
4466 softime 10573 // si l'option 'streetview' est activée ajoute un lien vers Google Maps Street View
4467 softime 10713 if ($this->f->is_option_streetview_enabled($this->getVal("om_collectivite")) === true
4468 softime 10808 && $maj == 3) {
4469     //
4470 softime 10573 $gStreetViewLinkHtml = $this->getGoogleMapsStreetViewLink();
4471     $form->setVal("streetview", $gStreetViewLinkHtml);
4472     }
4473 softime 8989 //
4474 softime 6565 $affichage_form = $this->get_type_affichage_formulaire();
4475 softime 10573 if ($affichage_form === "ADS" || $affichage_form === "CONSULTATION ENTRANTE") {
4476 softime 8989 // Dans le cas d'un dépôt électronique un pictogramme apparait devant le demandeur
4477     if ($maj == 1 || $maj == 2 || $maj == 3) {
4478     if ($this->getVal("depot_electronique") === "t"
4479     || $this->getVal("depot_electronique") === true
4480     || $this->getVal("depot_electronique") === 1) {
4481 softime 8329 //
4482 softime 8989 $form->setVal(
4483     "dossier_petitionnaire",
4484     sprintf(
4485     '<span class="om-icon om-icon-16 om-icon-fix depot-electronique-16" title="%s"> </span>%s',
4486     "Dépôt électronique",
4487     $this->getVal("dossier_petitionnaire")
4488     )
4489     );
4490 softime 8329 }
4491     }
4492 softime 6565 if ($maj == 3) {
4493 softime 15037 // Attribution d'une classe CSS aux éventuelles pastilles indiquant les recours et infractions
4494     $re_inf = $this->get_data_dossier_ctx_lie($this->getVal("dossier"));
4495 softime 6565 $message = "";
4496 softime 15037 if ($re_inf['nb_re_inf']["re"] > 0) {
4497     // On teste si le dossier recours est clôturé (vert) ou non (orange) pour lui attribuer une couleur via la classe CSS
4498     $message = sprintf(
4499     '<span class=\'label %1$s\' name= \'%2$s\' title=\'%3$s\'> %2$s </span>',
4500     $re_inf['cloture_re_inf']['re'] ? "label-success" : "label-warning",
4501     __("RE"),
4502     __("Au moins un dossier de recours contentieux ou gracieux en cours concerne les références cadastrales du dossier courant.")
4503     );
4504     if ($re_inf['nb_re_inf']["inf"] > 0) {
4505 softime 6565 $message .= " ";
4506     }
4507     }
4508 softime 15037 if ($re_inf['nb_re_inf']["inf"] > 0) {
4509     // On teste si le dossier infraction est clôturé (vert) ou non (rouge) pour lui attribuer une couleur via la classe CSS
4510     $message .= sprintf(
4511     '<span class=\'label %1$s\' name= \'%2$s\' title=\'%3$s\'> %2$s </span>',
4512     $re_inf['cloture_re_inf']['inf'] ? "label-success" : "label-important",
4513     __("IN"),
4514     __("Au moins un dossier d'infraction en cours concerne les références cadastrales du dossier courant.")
4515     );
4516     }
4517 softime 8989 $form->setVal("enjeu_ctx", $message);
4518 softime 6565 }
4519 softime 8989 } elseif ($affichage_form === "CTX RE") {
4520 softime 6565 // Récupération des demandeurs liés au dossier
4521 softime 8989 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4522 softime 6565 //
4523 softime 8989 $requerants = "";
4524     if ($this->getVal("requerants") != "") {
4525     $requerants = $this->getVal("requerants");
4526     if (isset($this->valIdDemandeur["requerant"]) === true
4527     && count($this->valIdDemandeur["requerant"]) > 0) {
4528     //
4529     $requerants .= " "._("et autres");
4530 softime 6565 }
4531     }
4532 softime 8989 $form->setVal("requerants", $requerants);
4533 softime 6565 //
4534 softime 8989 $dossier_petitionnaires = "";
4535     if ($this->getVal("dossier_petitionnaire") != "") {
4536     $dossier_petitionnaires = $this->getVal("dossier_petitionnaire");
4537 softime 6565 }
4538 softime 8989 if (isset($this->valIdDemandeur["petitionnaire"]) === true
4539     && count($this->valIdDemandeur["petitionnaire"]) > 0) {
4540     //
4541     $dossier_petitionnaires .= " "._("et autres");
4542 softime 6565 }
4543 softime 8989 $form->setVal("dossier_petitionnaires", $dossier_petitionnaires);
4544     } elseif ($affichage_form === "CTX IN") {
4545 softime 6565 // Récupération des demandeurs liés au dossier
4546 softime 8989 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4547 softime 6565 //
4548 softime 8989 $contrevenants = "";
4549     if ($this->getVal("contrevenants") != "") {
4550     $contrevenants = $this->getVal("contrevenants");
4551     if (isset($this->valIdDemandeur["contrevenant"]) === true
4552     && count($this->valIdDemandeur["contrevenant"]) > 0) {
4553     //
4554     $contrevenants .= " "._("et autres");
4555 softime 6565 }
4556     }
4557 softime 8989 $form->setVal("contrevenants", $contrevenants);
4558     } elseif ($affichage_form === "DPC") {
4559 softime 7067 // Récupération des demandeurs liés au dossier
4560 softime 8989 $this->listeDemandeur("dossier", $this->getVal("dossier"));
4561 softime 7067 //
4562 softime 8989 $bailleurs = "";
4563     if ($this->getVal("bailleurs") != "") {
4564     $bailleurs = $this->getVal("bailleurs");
4565     if (isset($this->valIdDemandeur["bailleur"]) === true
4566     && count($this->valIdDemandeur["bailleur"]) > 0) {
4567     //
4568     $bailleurs .= " "._("et autres");
4569 softime 7067 }
4570     }
4571 softime 8989 $form->setVal("bailleurs", $bailleurs);
4572 softime 7067 }
4573 softime 8989 //
4574 softime 6565 if ($validation == 0) {
4575 softime 8989 if ($maj == 0) {
4576     $form->setVal("annee", date("y"));
4577     $form->setVal("date_demande", date("Y-m-d"));
4578     $form->setVal("date_depot", date("Y-m-d"));
4579     $form->setVal("accord_tacite", "Non");
4580     $form->setVal("etat", "initialiser");
4581 mbroquet 3730 }
4582     }
4583 softime 11585 //
4584     if ($maj == 3) {
4585 softime 15218 $form->setVal("lien_iiue_portal", $this->get_json_lien_iiue_portal());
4586     $form->setVal("lien_iiue", $this->get_json_lien_iiue_platau());
4587 softime 11585 }
4588 softime 12847
4589     // Dans tous les cas si le champ accord_tacite est à non on veut insérer du texte dans le champ "au terme du délai"
4590     if ($this->is_incomplet_notifie() === false) {
4591 softime 13528 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4592 softime 12847 $form->setVal('evenement_suivant_tacite', __('N/A'));
4593     }
4594     } else {
4595     // Si le champ accord_tacite est à false alors on met "N/A" dans le champ evenement_suivant_tacite_incompletude
4596 softime 13528 if ($this->getVal('accord_tacite') === 'Non' || trim($this->getVal('accord_tacite')) === '') {
4597 softime 12847 $form->setVal('evenement_suivant_tacite_incompletude', __('N/A'));
4598     }
4599     }
4600 mbroquet 3730 }
4601    
4602     /**
4603     * getGeolocalisationLink retourne le code HTML affichant l'icone du globe, ainsi que
4604     * les coordonnées du centroide du dossier, le tout étant un lien vers le SIG.
4605     *
4606     * @return string Lien vers le SIG
4607     */
4608     function getGeolocalisationLink() {
4609     //
4610     $link = "<a id='action-form-localiser'".
4611 softime 7996 " target='_SIG' href='".OM_ROUTE_FORM."&obj=dossier_instruction&action=140&idx=".$this->getVal("dossier")."'>".
4612 mbroquet 3730 "<span class='om-icon om-icon-16 om-icon-fix sig-16' title='Localiser'>Localiser</span> ".
4613     $this->getVal('geom').
4614     " </a>";
4615 softime 12654 $nogeoloc = "<div class='no-geoloc_label'><span class='om-icon om-icon-16 om-icon-fix sig-16 no-geoloc' title='Localiser'></span><span>"._("Aucune geolocalisation")."</span></div>";
4616 softime 12433 return $this->getVal('geom') ? $link : $nogeoloc;
4617 mbroquet 3730 }
4618    
4619 softime 10573
4620 softime 8989 /**
4621 softime 10573 * converti un geom au format Lat,Lon
4622     *
4623     * @param string $geom Le Geom
4624     * @param string $fromRefId Le référentiel dans lequel le geom est défini
4625     * @param string $toLongLatId Le référentiel dans lequel le geom doit être converti
4626     *
4627     * @return array[2] Long,Lat ou bien false,"message" en cas d'erreur
4628     */
4629     protected function convertGeomToLongLat(string $geom, string $fromRefId = '2154',
4630     string $toLongLatId = '4326') {
4631 softime 14542
4632     $qres = $this->f->get_all_results_from_db_query(
4633     sprintf(
4634     'SELECT
4635     ST_X(ST_Transform(ST_GeomFromText(\'%1$s\', %2$s), %3$s)) AS longitude,
4636     ST_Y(ST_Transform(ST_GeomFromText(\'%1$s\', %2$s), %3$s)) AS latitude',
4637     $this->f->db->escapeSimple($geom),
4638     $this->f->db->escapeSimple($fromRefId),
4639     $this->f->db->escapeSimple($toLongLatId)
4640     ),
4641     array(
4642     'origin' => __METHOD__
4643     )
4644 softime 12847 );
4645 softime 14542
4646     if ($qres['code'] !== 'OK') { // PP
4647     $this->addToLog(__METHOD__."() error: ".var_export($qres['message'], true), DEBUG_MODE);
4648     return array(false, $qres['message'],);
4649 softime 10573 }
4650 softime 14542 if (count($qres['result']) != 1) {
4651     $this->addToLog(__METHOD__."() error: ".var_export(count($qres['result']), true), DEBUG_MODE);
4652 softime 10573 return array(false, __("Erreur: Plus d'un enregistrement retourné").
4653 softime 14542 '('.count($qres['result']).')');
4654 softime 10573 }
4655 softime 14542 $coord = array_shift($qres['result']);
4656 softime 10573 $this->addToLog(__METHOD__."() coord: ".var_export($coord, true), EXTRA_VERBOSE_MODE);
4657     return array_values($coord);
4658     }
4659    
4660     /**
4661     * getGoogleMapsStreetViewLink retourne le code HTML affichant un lien vers une vue
4662     * Google Maps Street View à partir des coordonnées du geom.
4663     *
4664     * @return string Lien vers Google Maps Street View
4665     */
4666     protected function getGoogleMapsStreetViewLink() {
4667     // Récupération coordonnées du terrain
4668    
4669     // Passage du numéro de dossier comme id pour pouvoir le récupérer dans le
4670     // jscript lors du clic
4671     $html = sprintf(
4672     "<a id='action-form-gstreetview' class='simple-btn' title='%s' onclick='get_adresse_terrain(this.id, \"%s\")'>
4673     <span class='om-icon om-icon-16 om-icon-fix consult-16'></span>%s
4674     </a>",
4675     __("Ouvrir dans Google Maps Street View"),
4676     $this->getVal($this->clePrimaire),
4677     __("Street View")
4678     );
4679     return $html;
4680     }
4681    
4682     /**
4683 softime 8989 * SETTER_FORM - setSelect.
4684     *
4685     * @return void
4686     */
4687     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
4688 softime 10573 $crud = $this->get_action_crud($this->getParameter("maj"));
4689    
4690 mbroquet 3730 // XXX Commenté pour patcher le problème de montée en charge de la base
4691     // de données en cas de reprise de données d'un gros volume de dossier
4692     // d'instruction
4693 softime 8989 // parent::setSelect($form, $maj);
4694 mbroquet 3730 // om_collectivite
4695 softime 8989 $this->init_select(
4696     $form,
4697     $this->f->db,
4698     $maj,
4699     null,
4700     "om_collectivite",
4701     $this->get_var_sql_forminc__sql("om_collectivite"),
4702     $this->get_var_sql_forminc__sql("om_collectivite_by_id"),
4703     false
4704     );
4705 mbroquet 3730
4706 softime 14542 if ($maj == 1 || $maj == 3) {
4707     $sql_nature_travaux_by_dit = str_replace(
4708     '<dossier_instruction_type>',
4709     $this->getVal('dossier_instruction_type'),
4710     $this->get_var_sql_forminc__sql("nature_travaux_by_dit")
4711     );
4712     // Initialisation du selecteur multiple nature_travaux
4713     $this->init_select(
4714     $form,
4715     $this->f->db,
4716     $maj,
4717     null,
4718     "nature_travaux",
4719     $sql_nature_travaux_by_dit,
4720     $this->get_var_sql_forminc__sql("nature_travaux_by_id"),
4721     false,
4722     true
4723     );
4724     }
4725    
4726 mbroquet 3730 /*
4727     * Pour chaque init_select d'un select non modifiable on teste
4728     * si l'on est en mode modifier : si c'est le cas alors on initialise le
4729     * select en mode consulter (qui n'affiche rien s'il n'y a aucune valeur).
4730     */
4731    
4732     $collectivite_idx = $this->getVal("om_collectivite");
4733 softime 6565 $affichage_form_dat = "";
4734 mbroquet 3730 // Si recherche avancée om_collectivite = collectivité utilisateur
4735 softime 8989 if ($maj == 999) {
4736 mbroquet 3730 $collectivite_idx = $this->f->getParameter("om_collectivite_idx");
4737 softime 6565 } else {
4738     $affichage_form_dat = $this->get_type_affichage_formulaire();
4739 mbroquet 3730 }
4740 softime 6565 // Définition de la qualité et de la traduction de l'instructeur
4741 softime 13137 $lib_instructeur = __("l'instructeur");
4742     $lib_instructeur_2 = __("l'instructeur secondaire");
4743     $affichage_instr_2 = 'instr';
4744     $affichage_instr = '';
4745 softime 6565 switch ($affichage_form_dat) {
4746 softime 7067 case 'DPC':
4747 softime 6565 case 'ADS':
4748 softime 10573 case 'CONSULTATION ENTRANTE':
4749 softime 6565 $affichage_instr = "AND instructeur_qualite.code = 'instr'";
4750     break;
4751     case 'CTX RE':
4752 softime 13137 $lib_instructeur_2 = __("le technicien");
4753     $affichage_instr_2 = 'tech';
4754     break;
4755 softime 6565 case 'CTX IN':
4756     $affichage_instr = "AND instructeur_qualite.code = 'juri'";
4757 softime 13137 $lib_instructeur = __('le juriste');
4758     $lib_instructeur_2 = __("le technicien");
4759     $affichage_instr_2 = 'tech';
4760 softime 6565 break;
4761     default:
4762     $affichage_instr = "";
4763     break;
4764     }
4765 mbroquet 3730
4766     // instructeur
4767     // on recupère les services des multicollectivités et de celle du DI
4768 softime 8989 if ($this->f->getParameter('option_afficher_division')==='true') {
4769 mbroquet 3730 // instructeur
4770 softime 8989 $sql_instructeur_div_by_di = str_replace(
4771     '<collectivite_di>',
4772     $collectivite_idx,
4773     $this->get_var_sql_forminc__sql("instructeur_div_by_di")
4774     );
4775     $sql_instructeur_div_by_di = str_replace(
4776     '<instructeur_qualite>',
4777     $affichage_instr,
4778     $sql_instructeur_div_by_di
4779     );
4780     $this->init_select(
4781     $form,
4782     $this->f->db,
4783     $maj,
4784     null,
4785     "instructeur",
4786     $sql_instructeur_div_by_di,
4787     $this->get_var_sql_forminc__sql("instructeur_div_by_id"),
4788     true,
4789     false,
4790     $lib_instructeur
4791     );
4792     // instructeur_2
4793     $sql_instructeur_2_div_by_di = str_replace(
4794     '<collectivite_di>',
4795     $collectivite_idx,
4796     $this->get_var_sql_forminc__sql("instructeur_2_div_by_di")
4797     );
4798 softime 13137 $sql_instructeur_2_div_by_di = str_replace(
4799     '<instructeur_qualite>',
4800     $affichage_instr_2,
4801     $sql_instructeur_2_div_by_di
4802     );
4803 softime 8989 $this->init_select(
4804     $form,
4805     $this->f->db,
4806     $maj,
4807     null,
4808     "instructeur_2",
4809     $sql_instructeur_2_div_by_di,
4810     $this->get_var_sql_forminc__sql("instructeur_2_div_by_id"),
4811     true,
4812     false,
4813 softime 13137 $lib_instructeur_2
4814 softime 8989 );
4815 mbroquet 3730 } else {
4816 softime 8989 $sql_instructeur_by_di = str_replace(
4817     '<collectivite_di>',
4818     $collectivite_idx,
4819     $this->get_var_sql_forminc__sql("instructeur_by_di")
4820     );
4821     $sql_instructeur_by_di = str_replace(
4822     '<instructeur_qualite>',
4823     $affichage_instr,
4824     $sql_instructeur_by_di
4825     );
4826     $this->init_select(
4827     $form,
4828     $this->f->db,
4829     $maj,
4830     null,
4831     "instructeur",
4832     $sql_instructeur_by_di,
4833     $this->get_var_sql_forminc__sql("instructeur_by_id"),
4834     true,
4835     false,
4836     $lib_instructeur
4837     );
4838     $sql_instructeur_2_by_di = str_replace(
4839     '<collectivite_di>',
4840     $collectivite_idx,
4841     $this->get_var_sql_forminc__sql("instructeur_2_by_di")
4842     );
4843 softime 13137 $sql_instructeur_2_by_di = str_replace(
4844     '<instructeur_qualite>',
4845     $affichage_instr_2,
4846     $sql_instructeur_2_by_di
4847     );
4848 softime 8989 $this->init_select(
4849     $form,
4850     $this->f->db,
4851     $maj,
4852     null,
4853     "instructeur_2",
4854     $sql_instructeur_2_by_di,
4855     $this->get_var_sql_forminc__sql("instructeur_2_by_id"),
4856     true,
4857     false,
4858 softime 13137 $lib_instructeur_2
4859 softime 8989 );
4860 mbroquet 3730 }
4861 softime 6565
4862 mbroquet 3730 // etat
4863     if ($maj == 1) {
4864 softime 8989 $this->init_select(
4865     $form,
4866     $this->f->db,
4867     3,
4868     null,
4869     "etat",
4870     $this->get_var_sql_forminc__sql("etat"),
4871     $this->get_var_sql_forminc__sql("etat_by_id"),
4872     false
4873     );
4874 mbroquet 3730 } else {
4875 softime 8989 $this->init_select(
4876     $form,
4877     $this->f->db,
4878     $maj,
4879     null,
4880     "etat",
4881     $this->get_var_sql_forminc__sql("etat"),
4882     $this->get_var_sql_forminc__sql("etat_by_id"),
4883     false
4884     );
4885 mbroquet 3730 }
4886    
4887     // dossier_instruction_type
4888 softime 8989 $this->init_select(
4889     $form,
4890     $this->f->db,
4891     $maj,
4892     null,
4893     "dossier_instruction_type",
4894     $this->get_var_sql_forminc__sql("dossier_instruction_type"),
4895     $this->get_var_sql_forminc__sql("dossier_instruction_type_by_id"),
4896     false
4897     );
4898 mbroquet 3730
4899     // division
4900 softime 8989 $sql_division_by_di = str_replace(
4901     '<collectivite_di>',
4902     $collectivite_idx,
4903     $this->get_var_sql_forminc__sql("division_by_di")
4904     );
4905     $this->init_select(
4906     $form,
4907     $this->f->db,
4908     $maj,
4909     null,
4910     "division",
4911     $sql_division_by_di,
4912     $this->get_var_sql_forminc__sql("division_by_id"),
4913     true
4914     );
4915 mbroquet 3730
4916     // autorite_competente
4917 softime 8989 $this->init_select(
4918     $form,
4919     $this->f->db,
4920     $maj,
4921     null,
4922     "autorite_competente",
4923     $this->get_var_sql_forminc__sql("autorite_competente"),
4924     $this->get_var_sql_forminc__sql("autorite_competente_by_id"),
4925     false
4926     );
4927 mbroquet 3730
4928     // avis_decision
4929     if ($maj == 1) {
4930 softime 8989 $this->init_select(
4931     $form,
4932     $this->f->db,
4933     3,
4934     null,
4935     "avis_decision",
4936     $this->get_var_sql_forminc__sql("avis_decision"),
4937     $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4938     false
4939     );
4940 mbroquet 3730 } else {
4941 softime 8989 $this->init_select(
4942     $form,
4943     $this->f->db,
4944     $maj,
4945     null,
4946     "avis_decision",
4947     $this->get_var_sql_forminc__sql("avis_decision"),
4948     $this->get_var_sql_forminc__sql("avis_decision_by_id"),
4949     false
4950     );
4951 mbroquet 3730 }
4952 softime 7366
4953 softime 6565 // autorisation_contestee
4954 softime 7366 if ($affichage_form_dat === 'CTX RE'
4955     && ($maj == 1 || $maj == 3)) {
4956     // À exécuter seulement en mode modifier ou consulter des recours
4957     // pour éviter le ralentissement de l'affichage des listings des DI
4958 softime 8989 $this->init_select(
4959     $form,
4960     $this->f->db,
4961     $maj,
4962     null,
4963     "autorisation_contestee",
4964     $this->get_var_sql_forminc__sql("autorisation_contestee"),
4965     $this->get_var_sql_forminc__sql("autorisation_contestee_by_id"),
4966     false
4967     );
4968 softime 6565 }
4969 mbroquet 3730
4970 softime 12847 // Si l'accord tacite est activé, on récupère la liste des évènements
4971     if ($this->getVal('accord_tacite') === 'Oui') {
4972 mbroquet 3730
4973 softime 12847 // evenement_suivant_tacite
4974     $this->init_select(
4975     $form,
4976     $this->f->db,
4977     $maj,
4978     null,
4979     "evenement_suivant_tacite",
4980     $this->get_var_sql_forminc__sql("evenement_suivant_tacite"),
4981     $this->get_var_sql_forminc__sql("evenement_suivant_tacite_by_id"),
4982     false
4983     );
4984 mbroquet 3730
4985 softime 12847 // evenement_suivant_tacite_incompletude
4986     $this->init_select(
4987     $form,
4988     $this->f->db,
4989     $maj,
4990     null,
4991     "evenement_suivant_tacite_incompletude",
4992     $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude"),
4993     $this->get_var_sql_forminc__sql("evenement_suivant_tacite_incompletude_by_id"),
4994     false
4995     );
4996     }
4997    
4998 mbroquet 3730 // Ajout, modification et recherche avancée
4999 softime 8989 if ($maj == 0 || $maj == 1 || $maj == 999) {
5000 mbroquet 3730 // accord tacite
5001     $contenu=array();
5002     $contenu[0]=array('Non','Oui');
5003     $contenu[1]=array('Non','Oui');
5004 softime 8989 $form->setSelect("accord_tacite", $contenu);
5005 mbroquet 3730 // geom *** a voir
5006 softime 8989 if ($maj == 1) { //modification
5007 mbroquet 3730 $contenu=array();
5008 softime 8989 $contenu[0]=array("dossier", $this->getParameter("idx"));
5009     $form->setSelect('geom', $contenu);
5010 mbroquet 3730 }
5011 softime 6565 // arrondissement recherche avancée
5012 softime 8989 $this->init_select(
5013     $form,
5014     $this->f->db,
5015     $maj,
5016     null,
5017     "arrondissement",
5018     $this->get_var_sql_forminc__sql("arrondissement"),
5019     $this->get_var_sql_forminc__sql("arrondissement_by_id"),
5020     false
5021     );
5022 softime 6565 // dossier_autorisation_type_detaille recherche avancée
5023 softime 8989 $this->init_select(
5024     $form,
5025     $this->f->db,
5026     $maj,
5027     null,
5028     "dossier_autorisation_type_detaille",
5029     $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille"),
5030     $this->get_var_sql_forminc__sql("dossier_autorisation_type_detaille_by_id"),
5031     false
5032     );
5033 mbroquet 3730 }
5034    
5035     // Ce formulaire n'est pas accessible en ajout ni en recherche avancée
5036     // mais dans le cas où il le serait, rien ne doit être fait concernant
5037 softime 6929 // les taxes
5038 mbroquet 3730 if ($maj != 0 && $maj != 999) {
5039 softime 10573 // Choix du secteur pour part communale
5040     $contenu = array();
5041     $contenu[0][0] = "";
5042     $contenu[1][0] = __('choisir')."&nbsp;".__("le")."&nbsp;".__("tax_secteur");
5043     if ($crud === 'read') {
5044     $contenu[1][0] = "";
5045     }
5046 softime 6929 // Instance du parmétrage des taxes
5047 mbroquet 3730 $inst_taxe_amenagement = $this->get_inst_taxe_amenagement();
5048     // Si la colletivité à un paramétrage pour la taxe d'aménagement
5049 softime 6929 if ($inst_taxe_amenagement !== null) {
5050 mbroquet 3730 // Il y a 20 secteurs maximum dans une commune de France
5051     for ($i=1; $i < 21; $i++) {
5052     // Valeur du secteur
5053     $value = $inst_taxe_amenagement->getVal('tx_comm_secteur_'.$i);
5054     //
5055 softime 6929 if ($value !== null && $value !== '') {
5056 mbroquet 3730 //
5057     $contenu[0][$i] = $i;
5058 softime 10573 $contenu[1][$i] = sprintf(__('Secteur %s'), $i);
5059 mbroquet 3730 }
5060     }
5061     }
5062 softime 10573 //
5063     $form->setSelect("tax_secteur", $contenu);
5064 mbroquet 3730 }
5065 softime 10573 // commune
5066     $this->init_select(
5067     $form,
5068     $this->f->db,
5069     $maj,
5070     null,
5071     "commune",
5072     $this->get_var_sql_forminc__sql("commune"),
5073     $this->get_var_sql_forminc__sql("commune_by_id"),
5074     false
5075     );
5076     // pec_metier
5077     $this->init_select(
5078     $form,
5079     $this->f->db,
5080     $maj,
5081     null,
5082     "pec_metier",
5083     $this->get_var_sql_forminc__sql("pec_metier"),
5084     $this->get_var_sql_forminc__sql("pec_metier_by_id"),
5085     false
5086     );
5087 softime 10968 // etat_transmission_platau
5088     $contenu = array();
5089     $contenu[0] = array(
5090     'jamais_transmissible',
5091     'non_transmissible',
5092     'transmis_mais_non_transmissible',
5093     'transmissible',
5094     );
5095     $contenu[1] = array(
5096     __('Ne sera jamais transmis'),
5097     __('Non transmissible'),
5098     __('Déjà transmis mais non transmissible'),
5099     __('Transmissible'),
5100     );
5101     $form->setSelect("etat_transmission_platau", $contenu);
5102 mbroquet 3730 }
5103    
5104 softime 8989 /**
5105     * SETTER_FORM - setLib.
5106     *
5107     * @return void
5108     */
5109     function setLib(&$form, $maj) {
5110     parent::setLib($form, $maj);
5111 softime 13137 // Les libellés généraux sont mis avant la modification des libellés
5112     // selon le contexte pour permettre de ne surcharger que les libellés
5113     // voulu et d'avoir les mêmes dans tous les autres cas.
5114     $form->setLib('accord_tacite',_("decision tacite"));
5115     $form->setLib('autorite_competente',_('competence'));
5116     $form->setLib('cle_acces_citoyen', _("cle_acces_citoyen"));
5117     $form->setLib('date_ait', _("Date d'AIT"));
5118     $form->setLib('date_audience', _("Date d'audience"));
5119     $form->setLib('date_complet', _("completude"));
5120     $form->setLib('date_contradictoire', _("Date de contradictoire"));
5121     $form->setLib('date_dernier_depot', _("dernier depot"));
5122     $form->setLib('date_derniere_visite', _("Date de dernière visite"));
5123     $form->setLib('date_limite_incompletude', _("limite d'instruction"));
5124     $form->setLib('date_premiere_visite', _("Date de 1ère visite"));
5125     $form->setLib('date_transmission_parquet', _('Date de transmission au Parquet'));
5126     $form->setLib('date_validite', _("fin de validite le"));
5127     $form->setLib('delai', _("delai (mois)"));
5128     $form->setLib('delai',_("delai d'instruction"));
5129 softime 14542 $form->setLib('nature_travaux',__('Nature des travaux'));
5130 softime 13137 $form->setLib('description_projet',_('description du projet'));
5131     $form->setLib('dossier_arrondissement', _("Arrondissement"));
5132     $form->setLib('dossier_autorisation_libelle',_('dossier_autorisation_libelle'));
5133     $form->setLib('dossier_autorisation_type_detaille', _("Type"));
5134     $form->setLib('contrevenants', _("Contrevenant(s)"));
5135     $form->setLib('dossier_instruction_type',_('type de dossier'));
5136     $form->setLib('dossier_petitionnaire',_('demandeur'));
5137     $form->setLib('dossier_petitionnaires', _("Pétitionnaire(s)"));
5138     $form->setLib('requerants', _("Requérant(s)"));
5139     $form->setLib('dt_ctx_infraction', _("Infraction"));
5140     $form->setLib('dt_ctx_regularisable', _("Régularisable"));
5141     $form->setLib('dt_ctx_synthese_anr', _("Synthèse des ANR"));
5142     $form->setLib('dt_ctx_synthese_nti', _("Synthèse des NTI"));
5143     $form->setLib('ctx_reference_dsj', _("ctx_reference_dsj"));
5144     $form->setLib('ctx_reference_sagace', _("ctx_reference_sagace"));
5145     $form->setLib('enjeu_ctx', _("contentieux"));
5146     $form->setLib('enjeu_erp', _("ERP"));
5147     $form->setLib('enjeu_urba', _("urbanisme"));
5148     $form->setLib('erp', _("ERP"));
5149     $form->setLib('geom',_('geolocalisaion'));
5150     $form->setLib('instructeur_2', _('Technicien'));
5151     $form->setLib('numero_versement_archive', _("numero"));
5152     $form->setLib('bailleur', _("Bailleur(s)"));
5153     $form->setLib('terrain', _("Localisation"));
5154     $form->setLib('etat_transmission_platau', __("Statut Plat'AU"));
5155 softime 15218 $form->setLib('lien_iiue_portal', '');
5156 softime 13137 $form->setLib('lien_iiue', '');
5157 softime 14064 $form->setLib('geoloc_latitude', __('Latitude (d° min.dec N/S)'));
5158     $form->setLib('geoloc_longitude', __('Longitude (d° min.dec E/O)'));
5159     $form->setLib('geoloc_rayon', __("Rayon d'emprise (m)"));
5160 softime 13528 $form->setLib('terrain_superficie_calculee', __("Superficie calculée (m²)"));
5161 softime 13137
5162 softime 6565 $affichage_form = $this->get_type_affichage_formulaire();
5163     if ($affichage_form === 'ADS') {
5164     $form->setLib('date_decision', _("date de la decision"));
5165     $form->setLib('date_limite', _("limite d'instruction"));
5166 softime 13137 $form->setLib('instructeur_2', __("instructeur secondaire"));
5167 softime 6565 }
5168     if ($affichage_form === 'CTX IN') {
5169     $form->setLib('avis_decision', _("Décision"));
5170     $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
5171     $form->setLib('date_decision', _("Date de décision"));
5172     $form->setLib('date_depot', _("Date de réception"));
5173     $form->setLib('date_limite', _("Tacicité"));
5174     $form->setLib('instructeur',_('Juriste'));
5175     }
5176     if ($affichage_form === 'CTX RE') {
5177     $form->setLib('autorisation_contestee', _("Autorisation contestée"));
5178     $form->setLib('avis_decision', _("Décision"));
5179     $form->setLib('date_cloture_instruction', _("Date de clôture d'instruction"));
5180     $form->setLib('date_decision', _("Date de décision"));
5181     $form->setLib('date_depot', _("Date de recours"));
5182     $form->setLib('date_limite', _("Tacicité"));
5183     $form->setLib('instructeur',_('Juriste'));
5184     }
5185 softime 7067 if ($affichage_form === 'DPC') {
5186 softime 13137 $form->setLib('instructeur_2', __("instructeur secondaire"));
5187 softime 7067 }
5188 softime 10573 if ($affichage_form === 'CONSULTATION ENTRANTE') {
5189     $form->setLib('date_decision', _("date de la decision"));
5190     $form->setLib('date_limite', _("limite d'instruction"));
5191     //
5192     $form->setLib('delai_reponse', __('Délai de réponse'));
5193     $form->setLib('date_consultation', __('Date de la consultation'));
5194     $form->setLib('date_emission', __("Date d'émission"));
5195     $form->setLib('etat_consultation', __('État de la consultation'));
5196     $form->setLib('type_consultation', __('Type de la consultation'));
5197     $form->setLib('texte_fondement_reglementaire', __('Article(s) réglementaire sur le(s)quel(s) se fonde la consultation'));
5198     $form->setLib('texte_objet_consultation', __("Texte de l'objet de la consultation"));
5199     $form->setLib('service_consultant_id', __('Service consultant : identifiant'));
5200     $form->setLib('service_consultant_libelle', __('Service consultant : libellé'));
5201     $form->setLib('service_consultant_insee', __('Service consultant : INSEE'));
5202     $form->setLib('service_consultant_mail', __('Service consultant : mail'));
5203     $form->setLib('service_consultant_type', __('Service consultant : type'));
5204     $form->setLib('service_consultant__siren', __('Service consultant : SIREN'));
5205    
5206     $form->setLib('type_delai', __('Type de délai'));
5207     $form->setLib('objet_consultation', __('Objet de la consultation'));
5208     $form->setLib('date_production_notification', __('Date de production de la notification'));
5209     $form->setLib('date_premiere_consultation', __('Date de la première consultation'));
5210 softime 13528 $form->setLib('instructeur_2', __("instructeur secondaire"));
5211 softime 10573 }
5212 softime 6565 }
5213 mbroquet 3730
5214     function setOnchange(&$form,$maj){
5215     parent::setOnchange($form,$maj);
5216     // mise en majuscule
5217     $form->setOnchange("demandeur_nom","this.value=this.value.toUpperCase()");
5218     $form->setOnchange("demandeur_societe","this.value=this.value.toUpperCase()");
5219     $form->setOnchange("delegataire_nom","this.value=this.value.toUpperCase()");
5220     $form->setOnchange("delegataire_societe","this.value=this.value.toUpperCase()");
5221     $form->setOnchange("architecte_nom","this.value=this.value.toUpperCase()");
5222     $form->setOnchange("terrain_adresse","this.value=this.value.toUpperCase()");
5223     $form->setOnchange('terrain_surface','VerifNumdec(this)');
5224     $form->setOnchange('tax_mtn_part_commu', 'VerifFloat(this, 0)');
5225     $form->setOnchange('tax_mtn_part_depart', 'VerifFloat(this, 0)');
5226     $form->setOnchange('tax_mtn_part_reg', 'VerifFloat(this, 0)');
5227     $form->setOnchange('tax_mtn_total', 'VerifFloat(this, 0)');
5228 softime 6929 $form->setOnchange('tax_mtn_rap', 'VerifFloat(this, 0)');
5229     $form->setOnchange('tax_mtn_part_commu_sans_exo', 'VerifFloat(this, 0)');
5230     $form->setOnchange('tax_mtn_part_depart_sans_exo', 'VerifFloat(this, 0)');
5231     $form->setOnchange('tax_mtn_part_reg_sans_exo', 'VerifFloat(this, 0)');
5232     $form->setOnchange('tax_mtn_total_sans_exo', 'VerifFloat(this, 0)');
5233     $form->setOnchange('tax_mtn_rap_sans_exo', 'VerifFloat(this, 0)');
5234 mbroquet 3730 }
5235    
5236     function setLayout(&$form, $maj) {
5237    
5238 softime 8477 // Récupère le CRUD
5239     $crud = $this->get_action_crud($this->getParameter("maj"));
5240    
5241     // Il n'y a pas d'affichage spécifique dans le cas d'une suppression
5242     if ($crud === 'delete') {
5243     return;
5244     }
5245    
5246 softime 6565 $affichage_form = $this->get_type_affichage_formulaire();
5247 softime 10573 if ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE') {
5248     // Le contrôle de données est seulement possible si on est pas en mode service consulté.
5249     // et si le champ dossier_platau du dossier d'autorisation type detaillé est à true
5250     if ($this->f->is_option_mode_service_consulte_enabled() === false
5251 softime 10808 && $this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
5252     && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
5253     //
5254 softime 10573 $required_fields_platau = $this->check_platau_required_fields($this->getVal('dossier'));
5255    
5256     if (isset($required_fields_platau['is_ok']) && $required_fields_platau['is_ok'] === false) {
5257     $class = 'demat-color demat-color-text';
5258     $message = __("La transmission à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
5259     if ($this->getVal('etat_transmission_platau') == "transmis_mais_non_transmissible") {
5260     $message = __("La transmission des modifications à Plat'AU n'est pas possible car certains champs requis ne sont pas saisis.");
5261     }
5262     $this->f->display_panel_information($class, $message, $required_fields_platau['required_fields_empty'], __('Champs requis'), 'demat-color');
5263     }
5264     }
5265 softime 6565 // En-tête
5266     $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5267 mbroquet 3730
5268 softime 6565 // Col1 : Fieldset "Dossier d'Instruction"
5269     $form->setBloc('om_collectivite', 'D', '', 'col_9');
5270 mbroquet 3730
5271 softime 6565 $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5272 softime 10573 $form->setFieldset('tax_secteur', 'F');
5273 softime 6565
5274 mbroquet 3730
5275 softime 10573 $form->setBloc('tax_secteur', 'F');
5276 softime 6565
5277     // Col2 : 3 fieldsets
5278     $form->setBloc('enjeu_urba', 'D', '', 'col_3');
5279 mbroquet 3730
5280 softime 6565 // Fieldset "Enjeu"
5281     $form->setFieldset('enjeu_urba', 'D', _("Enjeu"));
5282     $form->setFieldset('enjeu_ctx', 'F');
5283     // Fieldset "Qualification"
5284     $form->setFieldset('erp', 'D', _("Qualification"));
5285 softime 10968 $form->setFieldset('etat_transmission_platau', 'F');
5286 softime 6565 // Fieldset "Archive"
5287     $form->setFieldset('numero_versement_archive', 'D', _("Archive"));
5288     $form->setFieldset('date_demande', 'F');
5289    
5290     $form->setBloc('date_demande', 'F');
5291 mbroquet 3730 $form->setBloc('date_demande', 'F');
5292    
5293 softime 6565 // Fieldset "Instruction"
5294     $form->setBloc('date_depot', 'D', '', 'col_12');
5295     $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
5296 mbroquet 3730
5297 softime 6565 // Fieldset "Suivi"
5298     $form->setBloc('date_depot', 'D', '', 'col_12');
5299    
5300     $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5301     // Col 1
5302     $form->setBloc('date_depot', 'D', '', 'col_6');
5303     $form->setBloc('date_depot', 'D');
5304     $form->setBloc('date_dernier_depot', 'F');
5305     $form->setBloc('date_limite', 'D', '', 'interligne');
5306     $form->setBloc('date_limite_incompletude', 'F');
5307 mbroquet 3730 $form->setBloc('date_limite_incompletude', 'F');
5308 softime 6565 // Col 2
5309     $form->setBloc('etat', 'D', '', 'col_6');
5310     $form->setBloc('etat', 'D');
5311     $form->setBloc('etat', 'F');
5312     $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5313     $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5314 mbroquet 3730 $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5315 softime 6565 $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5316    
5317     $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5318 mbroquet 3730
5319 softime 6565 // Bloc 2 fieldsets
5320     $form->setBloc('date_decision', 'D', '', 'col_12');
5321 mbroquet 3730
5322 softime 6565 // Col 1 Fieldset "Décision"
5323     $form->setFieldset('date_decision', 'D', _('Decision'), 'col_6');
5324     $form->setFieldset('avis_decision','F','');
5325     // Col 2 Fieldset "Validité de l'autorisation"
5326     $form->setFieldset('date_validite', 'D', _("Validite de l'autorisation"), 'col_6');
5327     $form->setFieldset('date_validite','F','');
5328 mbroquet 3730
5329 softime 6565 $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
5330 mbroquet 3730
5331 softime 6565 $form->setFieldset('date_conformite','F','');
5332     $form->setBloc('date_conformite', 'F'); // Fin Instruction
5333 mbroquet 3730
5334 softime 6929 // Fieldset "Simulation des taxes"
5335 softime 10573 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
5336     $form->setFieldset('tax_mtn_part_commu', 'D', _("Simulation des taxes"), 'startClosed');
5337 softime 6929 //
5338 softime 10573 $form->setBloc('tax_mtn_part_commu', 'D', '', 'col_12');
5339     $form->setFieldset('tax_mtn_part_commu', 'D', _("Taxe d'aménagement"), 'collapsible');
5340 softime 6929 $form->setFieldset('tax_mtn_total_sans_exo', 'F', '');
5341     $form->setBloc('tax_mtn_total_sans_exo', 'F');
5342     //
5343     $form->setBloc('tax_mtn_rap', 'D', '', 'col_12');
5344     $form->setFieldset('tax_mtn_rap', 'D', _("Redevance d'archéologie préventive"), 'collapsible');
5345     $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
5346     $form->setBloc('tax_mtn_rap_sans_exo', 'F');
5347     //
5348     $form->setFieldset('tax_mtn_rap_sans_exo', 'F', '');
5349     $form->setBloc('tax_mtn_rap_sans_exo', 'F');
5350 mbroquet 3730
5351 softime 7067 // Fieldset "Localisation"
5352 softime 6565 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5353 mbroquet 3730
5354 softime 7067 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5355 softime 6565 // Col 1
5356     $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5357 softime 14064 $form->setBloc('geoloc_rayon', 'F');
5358 softime 6565 // Col 2
5359     $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5360 softime 13528 $form->setBloc('terrain_superficie_calculee', 'F');
5361 mbroquet 3730
5362 softime 13528 $form->setFieldset('terrain_superficie_calculee', 'F', '');
5363 mbroquet 3730
5364 softime 13528 $form->setBloc('terrain_superficie_calculee', 'F');
5365 softime 11585
5366 softime 15218 // Fieldset "iDE’AU / codes de suivi"
5367     $form->setBloc('lien_iiue_portal', 'D', '', 'col_12');
5368     $form->setFieldset('lien_iiue_portal', 'D', __("iDE'AU - Codes de suivi"), 'startClosed');
5369     $form->setFieldset('lien_iiue_portal', 'F', '');
5370     $form->setBloc('lien_iiue_portal', 'F');
5371    
5372 softime 11585 // Fieldset "Plat'AU : identifiants techniques"
5373     $form->setBloc('lien_iiue', 'D', '', 'col_12');
5374     $form->setFieldset('lien_iiue', 'D', __("Plat'AU - Identifiants techniques"), 'demat-color-fieldset startClosed');
5375     $form->setFieldset('lien_iiue', 'F', '');
5376     $form->setBloc('lien_iiue', 'F');
5377 softime 6565 }
5378 softime 10573 // CONSULTATION ENTRANTE
5379     // Vérifie que le dossier a été déposé électroniquement
5380 softime 10808 if ($affichage_form === 'CONSULTATION ENTRANTE'
5381 softime 13137 && ($this->get_source_depot_from_demande() === PLATAU
5382     || $this->get_source_depot_from_demande() === PORTAL)) {
5383 softime 10573 // Fieldset "Consultation"
5384     $form->setBloc('consultation_entrante', 'D', '', 'col_12');
5385     $form->setFieldset('consultation_entrante', 'D', __('Consultation'), '');
5386     $form->setBloc('consultation_entrante', 'D', "", "col_6");
5387     $form->setBloc('type_consultation', 'F');
5388     $form->setBloc('texte_fondement_reglementaire', 'D', "", "col_6");
5389     $form->setBloc('dossier_consultation', 'F');
5390     $form->setFieldset('dossier_consultation', 'F', '');
5391     $form->setBloc('dossier_consultation', 'F');
5392     }
5393 softime 6565 // RECOURS
5394     if ($affichage_form === 'CTX RE') {
5395     // Fieldset "Dossier d'Instruction"
5396     $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5397     $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5398 softime 15037 $form->setFieldset('etat_transmission_platau', 'F');
5399     $form->setBloc('etat_transmission_platau', 'F');
5400 mbroquet 3730
5401 softime 15037 // Fieldset "Archive"
5402     $form->setBloc('numero_versement_archive', 'D', '', 'col_12');
5403     $form->setFieldset('numero_versement_archive', 'DF', __("Archive"));
5404     $form->setBloc('numero_versement_archive', 'F', '');
5405    
5406 softime 6565 // Fieldset "Instruction"
5407     $form->setBloc('date_depot', 'D', '', 'col_12');
5408     $form->setFieldset('date_depot', 'D', _('Instruction'), 'col_12');
5409 mbroquet 3730
5410 softime 6565 // Fieldset "Suivi"
5411     $form->setBloc('date_depot', 'D', '', 'col_12');
5412    
5413     $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5414 mbroquet 3730 // Col 1
5415 softime 6565 $form->setBloc('date_depot', 'D', '', 'col_6');
5416     // $form->setBloc('date_depot', 'D');
5417     // $form->setBloc('date_dernier_depot', 'F');
5418     // $form->setBloc('date_limite', 'D', '');
5419     // $form->setBloc('date_limite_incompletude', 'F');
5420     $form->setBloc('date_cloture_instruction', 'F');
5421 mbroquet 3730 // Col 2
5422 softime 6565 $form->setBloc('etat', 'D', '', 'col_6');
5423     $form->setBloc('etat', 'D');
5424     $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5425     // $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5426     // $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5427     $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5428     $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5429    
5430     $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5431 mbroquet 3730
5432 softime 6565 // Bloc 2 fieldsets
5433     $form->setBloc('date_decision', 'D', '', 'col_12');
5434 mbroquet 3730
5435 softime 6565 // Col 1 Fieldset "Décision"
5436     $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5437     $form->setFieldset('avis_decision','F','');
5438     // Col 2 Fieldset "Validité de l'autorisation"
5439    
5440     $form->setBloc('date_validite', 'F'); // Fin bloc 2 fieldsets
5441    
5442     $form->setFieldset('date_conformite','F','');
5443     $form->setBloc('date_conformite', 'F'); // Fin Instruction
5444    
5445 softime 7067 // Fieldset "Localisation"
5446 softime 6565 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5447    
5448 softime 7067 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5449 softime 6565 // Col 1
5450     $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5451 softime 14064 $form->setBloc('geoloc_rayon', 'F');
5452 softime 6565 // Col 2
5453     $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5454 softime 13528 $form->setBloc('terrain_superficie_calculee', 'F');
5455 softime 6565
5456 softime 13528 $form->setFieldset('terrain_superficie_calculee', 'F', '');
5457 softime 6565
5458 softime 13528 $form->setBloc('terrain_superficie_calculee', 'F');
5459 softime 6565 }
5460    
5461     // INFRACTION
5462     if ($affichage_form === 'CTX IN') {
5463    
5464     // Fieldset "Dossier d'Instruction"
5465     $form->setBloc('om_collectivite', 'D', '', ($maj == 3 ? 'col_9':'col_12'));
5466     $form->setFieldset('om_collectivite', 'D', _("Dossier d'instruction"));
5467 softime 13137 $form->setFieldset('etat_transmission_platau', 'F');
5468     $form->setBloc('etat_transmission_platau', 'F');
5469 softime 6565
5470 softime 13137 // Fieldset "Archive"
5471     $form->setBloc('numero_versement_archive', 'D', '', 'col_12');
5472     $form->setFieldset('numero_versement_archive', 'DF', __("Archive"));
5473     $form->setBloc('numero_versement_archive', 'F', '');
5474    
5475 softime 6565 // Fieldset "Instruction"
5476     $form->setBloc('date_depot', 'D', '', 'col_12');
5477 softime 13137 $form->setFieldset('date_depot', 'D', _('Instruction'));
5478 softime 6565 // Fieldset "Suivi"
5479 softime 13137 $form->setBloc('date_depot', 'D', '', '');
5480 softime 6565 $form->setFieldset('date_depot', 'D', _('Suivi'), 'col_12');
5481     // Col 1
5482     $form->setBloc('date_depot', 'D', '', 'col_6');
5483     $form->setBloc('date_depot', 'D');
5484     $form->setBloc('date_dernier_depot', 'F');
5485     $form->setBloc('date_limite', 'D', '', 'interligne');
5486     $form->setBloc('date_limite_incompletude', 'F');
5487     $form->setBloc('date_limite_incompletude', 'F');
5488     // Col 2
5489     $form->setBloc('etat', 'D', '', 'col_6');
5490     $form->setBloc('etat', 'D');
5491     $form->setBloc('etat', 'F');
5492     $form->setBloc('evenement_suivant_tacite', 'D', '', 'evmt_suivant_tacite_di');
5493     $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5494     $form->setBloc('evenement_suivant_tacite_incompletude', 'F');
5495     $form->setFieldset('evenement_suivant_tacite_incompletude','F','');
5496     $form->setBloc('evenement_suivant_tacite_incompletude', 'F'); // Fin Suivi
5497     // Fieldset "Décision"
5498     $form->setFieldset('date_decision', 'D', _('Decision'), 'col_12');
5499     $form->setFieldset('date_conformite','F',''); // Fin Décision
5500     $form->setFieldset('date_conformite','F','');
5501     $form->setBloc('date_conformite', 'F'); // Fin Instruction
5502    
5503 softime 7067 // Fieldset "Localisation"
5504 softime 6565 $form->setBloc('terrain_adresse_voie_numero', 'D', '', 'col_12');
5505 softime 7067 $form->setFieldset('terrain_adresse_voie_numero', 'D', _('Localisation'), 'startClosed');
5506 softime 6565 // Col 1
5507     $form->setBloc('terrain_adresse_voie_numero', 'D', "", "col_6");
5508 softime 14064 $form->setBloc('geoloc_rayon', 'F');
5509 softime 6565 // Col 2
5510     $form->setBloc('terrain_adresse_voie', 'D', "", "col_6");
5511 softime 13528 $form->setBloc('terrain_superficie_calculee', 'F');
5512     $form->setFieldset('terrain_superficie_calculee', 'F', '');
5513     $form->setBloc('terrain_superficie_calculee', 'F');
5514 softime 6565
5515     // Fieldset "Demandeurs"
5516     // → cf. formSpecificContent()
5517     }
5518 mbroquet 3730 }
5519    
5520     /**
5521     * Permet de retourner si le dossier est incomplet notifié
5522     *
5523     * @return boolean true si incomplet notifié
5524     */
5525     function is_incomplet_notifie() {
5526     // Si le dossier est défini en tant qu'incomplet notifie
5527     if($this->getVal('incomplet_notifie') == 't' AND
5528     $this->getVal('incompletude') == 't') {
5529     return true;
5530     }
5531     return false;
5532     }
5533    
5534 softime 6929
5535 fmichon 4708 /**
5536 softime 7366 * Vérifie que le dossier d'instruction en cours ne soit pas instruit.
5537     * Ne sont pas compté comme instruit les dossiers n'ayant que des événements
5538     * d'instruction de type 'affichage'.
5539 softime 6929 *
5540     * @return boolean
5541     */
5542 softime 7366 function has_only_recepisse() {
5543 softime 6929
5544 softime 7366 // Récupère la liste des instructions du dossier
5545 softime 6929 $list_instructions = $this->get_list_instructions(true);
5546    
5547 softime 7366 // Si le dossier a pour seule instruction le récépissé de la demande
5548     if (count($list_instructions) === 1
5549     && $list_instructions[0] === $this->get_demande_instruction_recepisse()) {
5550 softime 6929 //
5551 softime 7366 return true;
5552 softime 6929 }
5553    
5554     //
5555 softime 7366 return false;
5556 softime 6929 }
5557    
5558    
5559     /**
5560 fmichon 4708 * TRIGGER - triggerajouterapres.
5561     *
5562     * - Interface avec le référentiel ERP [108]
5563     * - Gestion des données techniques liées
5564     * - Mise à jour du DA
5565     * - Gestion des références cadastrales / parcelles liées
5566     *
5567     * @return boolean
5568     */
5569 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5570     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5571 mbroquet 3730
5572 softime 13528 // si la version du DI n'est pas zéro
5573     $version = $this->valF['version'];
5574     if (intval($version) > 0) {
5575    
5576     // récupération du DI qui vient d'être créé
5577     $di = $this->valF['dossier'];
5578     if (empty($di_inst = $this->f->findObjectById('dossier', $di))) {
5579     $this->addToMessage(sprintf(
5580     __("Erreur lors de la récupération du DI %s (dossier non-trouvé)"),
5581     $di));
5582     $this->correct = false;
5583     return false;
5584     }
5585    
5586     $collectivite = $this->valF['om_collectivite'];
5587     $da = $this->valF['dossier_autorisation'];
5588     $commune = $this->f->get_submitted_post_value("commune");
5589    
5590     $ret = $di_inst->replicate_geolocalisation($di, $da, $collectivite, $commune);
5591 softime 15037 if (is_string($ret)) {
5592     $this->addToMessage($ret);
5593 softime 13528 }
5594     }
5595    
5596 fmichon 4708 /**
5597     * Interface avec le référentiel ERP.
5598     *
5599 softime 14542 * (WS->ERP)[108] Dépôt de dossier DAT -> AT
5600 fmichon 4708 * Déclencheur :
5601     * - L'option ERP est activée
5602     * - Validation du formulaire d'ajout d'une demande de nouveau dossier
5603     * de type AT
5604     */
5605     //
5606 softime 8989 if ($this->f->is_option_referentiel_erp_enabled($this->valF['om_collectivite']) === true
5607 fmichon 4708 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')) {
5608     //
5609     $infos = array(
5610     "dossier_instruction" => $this->valF['dossier'],
5611     );
5612     //
5613     $ret = $this->f->send_message_to_referentiel_erp(108, $infos);
5614     if ($ret !== true) {
5615     $this->cleanMessage();
5616     $this->addToMessage(_("Une erreur s'est produite lors de la notification (108) du référentiel ERP. Contactez votre administrateur."));
5617     return false;
5618 mbroquet 3730 }
5619 fmichon 4708 $this->addToMessage(_("Notification (108) du référentiel ERP OK."));
5620     }
5621    
5622     /**
5623     * Gestion des données techniques liées.
5624     */
5625     // On ajoute les données techniques
5626 softime 8989 if ($this->ajoutDonneesTechniquesDI($id, $val) === false) {
5627 mbroquet 3730 //
5628 fmichon 4708 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5629 mbroquet 3730 $this->correct = false;
5630     return false;
5631     }
5632    
5633 fmichon 4708 /**
5634     * Mise à jour des données du DA.
5635     */
5636     //
5637     $inst_da = $this->get_inst_dossier_autorisation($this->valF["dossier_autorisation"]);
5638     //
5639 softime 8640 $params = array(
5640     'di_id' => $this->valF[$this->clePrimaire],
5641     );
5642     if ($inst_da->majDossierAutorisation($params) === false) {
5643 fmichon 4708 //
5644     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5645     $this->correct = false;
5646     return false;
5647     }
5648    
5649     /**
5650     * Gestion des références cadastrales / parcelles liées.
5651     */
5652 mbroquet 3730 // Si le champ des références cadastrales n'est pas vide
5653     if ($this->valF['terrain_references_cadastrales'] != '') {
5654     // Ajout des parcelles dans la table dossier_parcelle
5655 softime 8989 $this->ajouter_dossier_parcelle(
5656     $this->valF['dossier'],
5657     $this->valF['terrain_references_cadastrales']
5658     );
5659 softime 6565 }
5660 mbroquet 3730
5661 softime 6565 /**
5662     * Notification de l'éventuelle autorisation contestée
5663     */
5664     if ($this->valF['autorisation_contestee'] !== null) {
5665     // Instancie la classe dossier_message
5666     $dossier_message = $this->get_inst_dossier_message(']');
5667     // Ajoute le message de notification
5668 softime 12124 $dossier_message_val = array(
5669     'dossier' => $this->valF['autorisation_contestee'],
5670     'type' => __('Autorisation contestée'),
5671     'emetteur' => $this->f->get_connected_user_login_name(),
5672     'login' => $_SESSION['login'],
5673     'date_emission' => date('Y-m-d H:i:s'),
5674     'contenu' => sprintf(
5675     __('Cette autorisation a été contestée par le recours %s.'),
5676     $this->valF['dossier']
5677     )
5678     );
5679 softime 6565 // Si une erreur se produit lors de l'ajout
5680 softime 12124 if ($dossier_message->add_notification_message($dossier_message_val, false, true) !== true) {
5681 softime 6565 // Message d'erreur affiché à l'utilisateur
5682     $this->addToMessage(_("L'autorisation contestée n'a pas pu être notifiée du recours."));
5683     $this->correct = false;
5684     return false;
5685     }
5686 mbroquet 3730 }
5687 softime 12433 // Gestion dossier operateur liées.
5688     //
5689     // En mode service consulté, on ajoute suite à la création du dossier un
5690     // élément dans la table dossier_operateur qui permettra par la suite d'effectuer
5691     // la désignation de l'opérateur
5692     if ($this->f->is_option_mode_service_consulte_enabled() === true) {
5693     // On ajoute le dossier opérateur
5694     if ($this->ajoutDossierOperateurDI($id, $val) === false) {
5695 mbroquet 3730
5696 softime 12433 $this->addToMessage(_("Erreur lors de l'enregistrement du dossier.")." "._("Contactez votre administrateur."));
5697     $this->correct = false;
5698     return false;
5699     }
5700     }
5701    
5702 softime 10573 /**
5703     * Gestion des tâches pour la dématérialisation
5704     */
5705 softime 6565 //
5706 softime 10808 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
5707     && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible') {
5708 softime 13528 // Pour les dossiers d'instruction dont la source de dépôt est différent de PLAT'AU
5709     if (isset($val['source_depot']) === false || $val['source_depot'] !== PLATAU) {
5710     // Gérer l'ajout du DA si pas lié à un objet PLAT'AU
5711     // Nécessaire pour les dossiers d'instruction sur existant dont l'initial n'est pas
5712     // transmis à PLAT'AU
5713     $inst_lien = $this->f->get_inst__om_dbform(array(
5714     "obj" => "lien_id_interne_uid_externe",
5715     "idx" => ']',
5716 softime 13137 ));
5717 softime 13528 $is_exists = $inst_lien->is_exists('dossier_autorisation', $inst_da->getVal('dossier_autorisation'));
5718     if (! $is_exists) {
5719     $inst_task = $this->f->get_inst__om_dbform(array(
5720     "obj" => "task",
5721     "idx" => 0,
5722 softime 13137 ));
5723 softime 13528 $task_val = array(
5724     'type' => 'creation_DA',
5725     'object_id' => $inst_da->getVal('dossier_autorisation'),
5726     'dossier' => $inst_da->getVal('dossier_autorisation'),
5727     );
5728     // Si le mode service consulté n'est pas activé
5729     // et que le dossier est dans l'état 'non_transmissible'
5730     if ($this->f->is_option_mode_service_consulte_enabled() === false
5731     && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5732     // Passage du statut de la task en draft
5733     $task_val['state'] = $inst_task::STATUS_DRAFT;
5734     }
5735     $add_task = $inst_task->add_task(array('val' => $task_val));
5736     if ($add_task === false) {
5737     $this->addToMessage(sprintf('%s %s',
5738     __("Une erreur s'est produite lors de la création tâche."),
5739     __("Veuillez contacter votre administrateur.")
5740     ));
5741     $this->correct = false;
5742     return false;
5743     }
5744 softime 13137 }
5745 softime 13528
5746     // Ajout de la task creation_DI
5747 softime 10573 $inst_task = $this->f->get_inst__om_dbform(array(
5748     "obj" => "task",
5749     "idx" => 0,
5750     ));
5751     $task_val = array(
5752     'type' => 'creation_DI',
5753     'object_id' => $id,
5754     'dossier' => $id,
5755     );
5756 softime 13528 // Si le mode service consulté n'est pas activé
5757     // et que le dossier est dans l'état 'non_transmissible'
5758 softime 10573 if ($this->f->is_option_mode_service_consulte_enabled() === false
5759     && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5760 softime 13528 // Passage du statut de la task en draft
5761 softime 10573 $task_val['state'] = $inst_task::STATUS_DRAFT;
5762     }
5763     $add_task = $inst_task->add_task(array('val' => $task_val));
5764     if ($add_task === false) {
5765     $this->addToMessage(sprintf('%s %s',
5766     __("Une erreur s'est produite lors de la création tâche."),
5767     __("Veuillez contacter votre administrateur.")
5768     ));
5769     $this->correct = false;
5770     return false;
5771     }
5772     }
5773 softime 13528 // Pour les dossier d'instruction dont la source de dépôt est PLAT'AU
5774 softime 13137 if (isset($val['source_depot']) === true && $val['source_depot'] == PLATAU) {
5775 softime 10573 //
5776     $inst_task = $this->f->get_inst__om_dbform(array(
5777     "obj" => "task",
5778     "idx" => 0,
5779     ));
5780     $task_val = array(
5781     'type' => 'modification_DI',
5782     'object_id' => $id,
5783     'dossier' => $id,
5784     );
5785     $add_task = $inst_task->add_task(array('val' => $task_val));
5786     if ($add_task === false) {
5787     $this->addToMessage(sprintf('%s %s',
5788     __("Une erreur s'est produite lors de la création tâche."),
5789     __("Veuillez contacter votre administrateur.")
5790     ));
5791     $this->correct = false;
5792     return false;
5793 softime 10808 }
5794 softime 10573 }
5795 softime 13528 // Dans tous les cas
5796 softime 10573 $inst_task = $this->f->get_inst__om_dbform(array(
5797     "obj" => "task",
5798     "idx" => 0,
5799     ));
5800     $task_val = array(
5801     'type' => 'depot_DI',
5802     'object_id' => $id,
5803     'dossier' => $id,
5804     );
5805     // Change l'état de la tâche de notification en fonction de l'état de
5806     // transmission du dossier d'instruction
5807     if ($this->f->is_option_mode_service_consulte_enabled() === false
5808     && $this->valF['etat_transmission_platau'] === 'non_transmissible') {
5809     //
5810     $task_val['state'] = $inst_task::STATUS_DRAFT;
5811     }
5812     $add_task = $inst_task->add_task(array('val' => $task_val));
5813     if ($add_task === false) {
5814     $this->addToMessage(sprintf('%s %s',
5815     __("Une erreur s'est produite lors de la création tâche."),
5816     __("Veuillez contacter votre administrateur.")
5817     ));
5818     $this->correct = false;
5819     return false;
5820     }
5821     }
5822 softime 14542 // Ajout automatique des acteurs au dossier si l'option est activée
5823     if ($this->f->is_option_enabled('option_module_acteur') === true) {
5824     if ($this->add_dossier_actors($id) === false) {
5825     $this->addToMessage(__('ATTENTION : Les acteurs n\'ont pas été rattachés au dossier.'));
5826     }
5827     }
5828    
5829     // On duplique les nature du travaux du dossier initial ou du dernier dossier clôturé
5830    
5831     // Récupération du numéro de dossier initial ou dernier dossier clôturé
5832     $qres = $this->f->get_one_result_from_db_query(
5833     sprintf(
5834     'SELECT
5835     dossier.dossier
5836     FROM
5837     %1$sdossier
5838     WHERE
5839     dossier.dossier_autorisation = \'%2$s\'
5840     AND dossier.dossier != \'%3$s\'
5841     ORDER BY
5842     dossier.version DESC,
5843     dossier.date_depot DESC
5844     LIMIT 1',
5845     DB_PREFIXE,
5846     $this->f->db->escapeSimple($this->valF['dossier_autorisation']),
5847     $id
5848     ),
5849     array(
5850     'origin' => __METHOD__,
5851     'force_return' => true
5852     )
5853     );
5854     if ($qres['code'] !== 'OK') {
5855     return false;
5856     }
5857     $di_id = $qres['result'];
5858     // Duplication des lien de nature de travaux pour le nouveau dossier
5859     if ($this->lienNatureTravauxDossierInstruction($di_id, $id) === false) {
5860     $this->addToMessage(sprintf('%s %s',
5861     __("Une erreur s'est produite lors de l'ajout des nature de travaux sur le nouveau dossier."),
5862     __("Veuillez contacter votre administrateur.")
5863     ));
5864     $this->correct = false;
5865     return false;
5866     }
5867 softime 6565 return true;
5868 mbroquet 3730 }
5869 softime 6565
5870 mbroquet 3730 /**
5871 softime 14542 * Gestion des liens entre les natures de travaux et le nouveau dossier
5872     **/
5873     function lienNatureTravauxDossierInstruction($di_orig, $di_id) {
5874     $inst_ldnt = $this->f->get_inst__om_dbform(array(
5875     "obj" => "lien_dossier_nature_travaux",
5876     "idx" => "]",
5877     ));
5878    
5879     $qres = $this->f->get_all_results_from_db_query(
5880     sprintf(
5881     'SELECT
5882     *
5883     FROM
5884     %1$slien_dossier_nature_travaux INNER JOIN %1$snature_travaux ON nature_travaux.nature_travaux = lien_dossier_nature_travaux.nature_travaux INNER JOIN %1$slien_dit_nature_travaux ON lien_dossier_nature_travaux.nature_travaux = lien_dit_nature_travaux.nature_travaux
5885     WHERE
5886     dossier = \'%2$s\' AND lien_dit_nature_travaux.dossier_instruction_type = %3$d',
5887     DB_PREFIXE,
5888     $di_orig,
5889     $this->valF['dossier_instruction_type']
5890     ),
5891     array(
5892     "origin" => __METHOD__,
5893     "force_return" => true,
5894     )
5895     );
5896     if ($qres["code"] !== "OK") {
5897     return false;
5898     }
5899     $liens_dossier_nature_travaux = $qres["result"];
5900     $valnaturetravaux = array();
5901    
5902     foreach ($liens_dossier_nature_travaux as $lien) {
5903     $valnaturetravaux['lien_dossier_nature_travaux'] = '';
5904     $valnaturetravaux['dossier'] = $di_id;
5905     $valnaturetravaux['nature_travaux'] = $lien['nature_travaux'];
5906    
5907     if ($inst_ldnt->ajouter($valnaturetravaux) === false) {
5908     $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter le lien entre la nature de travaux et le dossier d'instruction.", DEBUG_MODE);
5909     return false;
5910     }
5911     }
5912    
5913     return true;
5914     }
5915    
5916    
5917     /**
5918     * Ajoute à l'aide d'une requête sql tous les acteurs (lien dossier - tiers) paramétrés pour
5919     * être ajoutés automatiquement.
5920     *
5921     * Pour être ajoutés automatiquement un acteur doit :
5922     * - avoir une catégorie paramétré en tant qu'ajout automatique pour le type de DI du dossier
5923     * - avoir une catégorie liée à la même collectivité que celle du dossier
5924     * - accepter les notifications par mail
5925     * - ne pas avoir d'uid platau ou sa liste d'uid ne doit pas contenir celui de la consultation
5926     * entrante (acteur != du service en charge du dossier)
5927     * - ne pas avoir d'habilitation en cours de validité
5928     * OU avoir une (ou +) habilitation sans division territoriale (commune ou département)
5929     * OU avoir une (ou +) habilitation avec division territoriale commune lié à la commune du dossier
5930     * OU avoir une (ou +) habilitation avec division territoriale département lié au département du dossier
5931     *
5932     * @param string $idDossier : identifiant du dossier
5933     * @return boolean résultat de l'ajout. true : ok, false : l'ajout a échoué
5934     */
5935     protected function add_dossier_actors($idDossier) {
5936     // Sql de récupération de tous les acteurs qui doivent automatiquement être associé au dossier.
5937     $actor_auto_dossier_sql = sprintf(
5938     'SELECT DISTINCT
5939     nextval(\'%1$slien_dossier_tiers_seq\') AS lien_dossier_tiers_seq,
5940     dossier.dossier,
5941     tiers_consulte.tiers_consulte
5942     FROM
5943     %1$stiers_consulte
5944 softime 15037 INNER JOIN %1$scategorie_tiers_consulte
5945 softime 14542 ON tiers_consulte.categorie_tiers_consulte = categorie_tiers_consulte.categorie_tiers_consulte
5946     -- Filtre les tiers a ajouter automatiquement au dossier
5947 softime 15037 INNER JOIN %1$slien_dossier_instruction_type_categorie_tiers
5948 softime 14542 ON lien_dossier_instruction_type_categorie_tiers.ajout_automatique IS TRUE
5949     AND categorie_tiers_consulte.categorie_tiers_consulte = lien_dossier_instruction_type_categorie_tiers.categorie_tiers
5950 softime 15037 INNER JOIN %1$slien_categorie_tiers_consulte_om_collectivite
5951 softime 14542 ON categorie_tiers_consulte.categorie_tiers_consulte = lien_categorie_tiers_consulte_om_collectivite.categorie_tiers_consulte
5952     -- Filtre les tiers dont la collectivité et le type correspondent à celle du dossier
5953 softime 15037 INNER JOIN %1$sdossier
5954 softime 14542 ON lien_dossier_instruction_type_categorie_tiers.dossier_instruction_type = dossier.dossier_instruction_type
5955     AND lien_categorie_tiers_consulte_om_collectivite.om_collectivite = dossier.om_collectivite
5956     AND dossier.dossier = \'%2$s\'
5957 softime 15037 -- Filtre pour garder uniquement les habilitations en cours de validité
5958     LEFT JOIN %1$shabilitation_tiers_consulte
5959     ON tiers_consulte.tiers_consulte = habilitation_tiers_consulte.tiers_consulte
5960     AND (habilitation_tiers_consulte.om_validite_debut IS NULL
5961     OR habilitation_tiers_consulte.om_validite_debut <= CURRENT_DATE)
5962     AND (habilitation_tiers_consulte.om_validite_fin IS NULL
5963     OR habilitation_tiers_consulte.om_validite_fin > CURRENT_DATE)
5964     -- Récupère uniquement les habilitations liées à la commune du dossier
5965     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
5966     ON dossier.commune = lien_habilitation_tiers_consulte_commune.commune
5967     AND habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
5968     -- Récupère uniquement les habilitations liées au département du dossier
5969     LEFT JOIN %1$scommune
5970     ON dossier.commune = commune.commune
5971     LEFT JOIN %1$sdepartement
5972     ON commune.dep = departement.dep
5973     LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
5974     ON departement.departement = lien_habilitation_tiers_consulte_departement.departement
5975     AND habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
5976 softime 14542 WHERE
5977     -- Garde les tiers notifiable ayant un id platau différent de celui du service consultant du dossier
5978     tiers_consulte.accepte_notification_email IS TRUE
5979     AND tiers_consulte.liste_diffusion IS NOT NULL
5980     AND TRIM(tiers_consulte.liste_diffusion) != \'\'
5981     -- Garde les tiers n ayant pas d habilitation en cours de validite
5982     -- OU ayant une habilitation liée à la commune du dossier
5983     -- OU ayant une habilitation liée au département d appartenance de la commune du dossier
5984     -- OU n étant lié à aucune commune ou département
5985 softime 15037 AND (
5986     -- Pas d habilitation en cours de validité
5987     habilitation_tiers_consulte.habilitation_tiers_consulte IS NULL
5988     OR (-- Habilitation associée à la commune du dossier
5989     lien_habilitation_tiers_consulte_commune.lien_habilitation_tiers_consulte_commune IS NOT NULL
5990     -- Habilitation associée au département du dossier
5991     OR lien_habilitation_tiers_consulte_departement.lien_habilitation_tiers_consulte_departement IS NOT NULL
5992     -- Habilitation non liée à une commune ou à un département
5993     OR (NOT EXISTS(
5994     SELECT lien_habilitation_tiers_consulte_departement
5995     FROM %1$slien_habilitation_tiers_consulte_departement AS lhtcd
5996     WHERE lhtcd.habilitation_tiers_consulte = habilitation_tiers_consulte.habilitation_tiers_consulte)
5997     AND NOT EXISTS(
5998     SELECT lien_habilitation_tiers_consulte_commune
5999     FROM %1$slien_habilitation_tiers_consulte_commune AS lhtcc
6000     WHERE lhtcc.habilitation_tiers_consulte = habilitation_tiers_consulte.habilitation_tiers_consulte))))',
6001 softime 14542 DB_PREFIXE,
6002     $this->f->db->escapeSimple($idDossier)
6003     );
6004     // Création d'un lien entre le dossier et les tiers pour chaque tiers en ajout auto
6005     $qres = $this->f->execute_db_query(
6006     sprintf(
6007     'INSERT INTO %1$slien_dossier_tiers (lien_dossier_tiers, dossier, tiers)
6008 softime 15037 (%2$s)
6009     ON CONFLICT (dossier,tiers) DO NOTHING',
6010 softime 14542 DB_PREFIXE,
6011     $actor_auto_dossier_sql
6012     ),
6013     array(
6014     'origin' => __METHOD__,
6015     'force_return' => true
6016     )
6017     );
6018     return $qres['code'] === 'OK';
6019     }
6020    
6021     /**
6022 softime 10573 * Permet de vérifier que les champs requis pour platau ont été saisis
6023     * et si oui mettre à jour le statut des taches à new
6024     *
6025     * @param string $dossier L'identifiant du dossier.
6026     * @param string $add_or_update Permet de déterminer si on est en ajout ou en modification
6027     *
6028     * @return bool true|false
6029     */
6030 softime 13137 function trigger_platau_required_fields($dossier) {
6031 softime 10573 // Vérification des champs Plat'AU requis pour transmission
6032     $is_required_fields_fulfilled = $this->check_platau_required_fields($dossier);
6033    
6034 softime 13137 // On récupère l'identifiant du dossier d'autorisation en fonction
6035     // de si on est en ajout ou en modification
6036     $dossier_autorisation = $this->getVal('dossier_autorisation') != "" ? $this->getVal('dossier_autorisation') : $this->valF['dossier_autorisation'];
6037    
6038     $inst_task = $this->f->get_inst__om_dbform(array(
6039     "obj" => "task",
6040     "idx" => 0,
6041 softime 10573 ));
6042 softime 10968
6043 softime 13137 // Si les champs requis sont saisis on met à jour le flag
6044     // etat_transmission_platau à transmissible pour indiquer
6045     // que le dossier peut être transmis à Plat'AU et on met
6046     // l'état des tâches draft en new
6047     if ($is_required_fields_fulfilled['is_ok']) {
6048     // Valeurs à mettre à jour
6049     $valF = array();
6050     $valF['etat_transmission_platau'] = 'transmissible';
6051 softime 10573
6052 softime 13137 // Met à jour le quartier du dossier
6053     $cle = " dossier='".$dossier."'";
6054     $res = $this->f->db->autoExecute(
6055     DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
6056     $this->addToLog(__METHOD__."(): db->autoexecute(\""
6057     .DB_PREFIXE."dossier\", ".print_r($valF, true)
6058     .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
6059     if ($this->f->isDatabaseError($res, true)) {
6060     return false;
6061     }
6062 softime 13528 $this->update_task_state($dossier, 'draft', 'new', $dossier_autorisation);
6063 softime 13137 }
6064     // Si les champs requis ne sont pas saisis on marque
6065     // le dossier comme non transmissible ou transmis mais non transmissible
6066     // et on met l'état des tâches new en draft
6067     if (! $is_required_fields_fulfilled['is_ok']) {
6068     $valF = array();
6069     if ($inst_task->task_exists('creation_DI', $dossier)) {
6070     $valF['etat_transmission_platau'] = 'non_transmissible';
6071 softime 10573 } else {
6072 softime 13137 $valF['etat_transmission_platau'] = 'transmis_mais_non_transmissible';
6073     }
6074 softime 10808
6075 softime 13137 // Met à jour le quartier du dossier
6076     $cle = " dossier='".$dossier."'";
6077     $res = $this->f->db->autoExecute(
6078     DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
6079     $this->addToLog(__METHOD__."(): db->autoexecute(\""
6080     .DB_PREFIXE."dossier\", ".print_r($valF, true)
6081     .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
6082     if ($this->f->isDatabaseError($res, true)) {
6083     return false;
6084 softime 10573 }
6085 softime 13528 $this->update_task_state($dossier, 'new', 'draft', $dossier_autorisation);
6086 softime 13137 }
6087 softime 10573
6088 softime 13137 return true;
6089 softime 10573 }
6090    
6091     /**
6092     * TODO: replace with '$this->f->findObjectById' ?
6093     *
6094 softime 6565 * Récupère l'instance de dossier message.
6095     *
6096     * @param string $dossier_message Identifiant du message.
6097     *
6098     * @return object
6099     */
6100     private function get_inst_dossier_message($dossier_message = null) {
6101     //
6102     return $this->get_inst_common("dossier_message", $dossier_message);
6103     }
6104    
6105     /**
6106 softime 13137 * Récupère l'identifiant du quartier et de l'arrondissement depuis le code
6107     * impôt.
6108     *
6109     * @param string $code_impots Code impôt du quartier
6110 mbroquet 3730 *
6111     * @return array
6112     */
6113 softime 13137 public function get_quartier_arrondissement_by_code_impot($code_impot) {
6114     if (empty($code_impot) === true) {
6115     return null;
6116 mbroquet 3730 }
6117 softime 13137 $query = sprintf('
6118     SELECT
6119     quartier,
6120     arrondissement
6121     FROM
6122     %1$squartier
6123     WHERE
6124     code_impots = \'%2$s\'',
6125     DB_PREFIXE,
6126     $code_impot
6127     );
6128     $res = $this->f->get_all_results_from_db_query(
6129     $query,
6130     array(
6131     "origin" => __METHOD__,
6132     "force_return" => true,
6133     )
6134     );
6135     if ($res['code'] !== 'KO' &&
6136     count($res['result']) > 0) {
6137     //
6138     return $res['result'][0];
6139 mbroquet 3730 }
6140 softime 13137 return null;
6141 mbroquet 3730 }
6142 softime 10573
6143 mbroquet 3730 /**
6144 softime 10573 * Retourne l'intructeur correspondant le mieux à la parcelle.
6145     *
6146     * @param int $quartier le numéro de quartier
6147     * @param int $arrondissement le numéro d'arrondissement
6148     * @param string $section la section
6149     * @param int $dadt le type détaillé de dossier d'autorisation
6150     * @param int $collectivite l'identifiant de la collectivité
6151     * @param int $commune_id l'identifiant de la commune (optionel)
6152 softime 13137 * @param int $demande_type l'identifiant du type de demande (optionel)
6153 softime 10573 *
6154     * @return array contenant l'instructeur, et éventuellement sa division
6155     */
6156     public function getInstructeurDivision (
6157 softime 11585 int $quartier, int $arrondissement, $section,
6158 softime 13528 int $dadt, int $collectivite, int $commune_id = 0, int $demande_type = 0) : array {
6159 mbroquet 3730
6160 softime 10573 // requête de récupération de l'instructeur à affecter
6161     // (exclu les affectations manuelles supposées avoir été utilisées avant)
6162 softime 13528 $sql = sprintf('
6163 softime 10573 SELECT
6164 softime 13528 instructeur, instructeur_2, section, quartier, arrondissement, dossier_autorisation_type_detaille, dossier_instruction_type
6165 softime 10573 FROM
6166 softime 13528 %1$saffectation_automatique AS AA
6167 softime 10573 WHERE
6168 softime 13528 (AA.affectation_manuelle IS NULL OR AA.affectation_manuelle = \'\')
6169     AND AA.instructeur IS NOT NULL
6170     ',
6171     DB_PREFIXE
6172 softime 10573 );
6173    
6174 softime 13528 // si l'identifiant de la demande_type est spécifié, récupère
6175     // le type de dossier d'instruction
6176 softime 13137 $dit = null;
6177     if (empty($demande_type) === false && $demande_type !== 0) {
6178     $demande_type_inst = $this->f->get_inst__om_dbform(array(
6179     "obj" => "demande_type",
6180     "idx" => $demande_type,
6181     ));
6182     $dit = $demande_type_inst->getVal('dossier_instruction_type');
6183     }
6184    
6185 softime 10573 // ajoute les conditions SQL correspondantes aux paramètres de filtrage
6186     foreach(array(
6187     'om_collectivite ' => $collectivite,
6188     'dossier_autorisation_type_detaille' => $dadt,
6189 softime 13137 'dossier_instruction_type' => $dit,
6190 softime 10573 'quartier' => $quartier,
6191     'arrondissement' => $arrondissement,
6192     'section' => $section
6193     ) as $column => $value) {
6194     if (empty($value) === false) {
6195     if ($column == 'section') {
6196     $valType = 's'; // string
6197     $value = $this->f->db->escapeSimple($value);
6198 softime 13528 } else {
6199     $valType = 'd'; // int
6200     $value = intval($value);
6201 mbroquet 3730 }
6202 softime 10573 $sql .= sprintf(" AND (AA.$column IS NULL OR AA.$column = '%$valType') ",
6203     $value);
6204 mbroquet 3730 }
6205 softime 13528 else {
6206     $sql .= " AND AA.$column IS NULL ";
6207     }
6208 mbroquet 3730 }
6209 softime 10573 if (!empty($commune_id) && $this->f->is_option_dossier_commune_enabled()) {
6210     $commune = $this->f->findObjectById('commune', $commune_id);
6211     if (!empty($commune)) {
6212     $code_departement = $commune->getVal('dep');
6213     $code_commune = preg_replace('/^'.$code_departement.'/', '', $commune->getVal('com'));
6214     $sql .= sprintf(
6215     " AND (AA.communes IS NULL OR AA.communes ~ '%s') ",
6216     "(^|,)$code_departement($code_commune)?(,|$)");
6217     }
6218     else {
6219     $this->addToLog(__METHOD__."(): commune '$commune_id' non trouvée", DEBUG_MODE);
6220     }
6221     }
6222 mbroquet 3730
6223 softime 10573 // ordonnancement et limite à un seul résultat
6224     $sql .= sprintf("
6225     ORDER BY
6226     communes %s,
6227 softime 13528 dossier_instruction_type %s,
6228     dossier_autorisation_type_detaille %s,
6229     quartier %s,
6230 softime 10573 section %s,
6231 softime 13528 arrondissement %s
6232 softime 10573 LIMIT 1
6233     ",
6234     // on positionne les valeurs NULL en premier si le filtre sur ce champ n'a pas été saisi
6235     $commune_id === 0 ? 'NULLS FIRST' : '',
6236 softime 13528 $dit === 0 ? 'NULLS FIRST' : '',
6237     $dadt === 0 ? 'NULLS FIRST' : '',
6238     $quartier === 0 ? 'NULLS FIRST' : '',
6239 softime 10573 empty($section) === true ? 'NULLS FIRST' : '',
6240 softime 13528 $arrondissement === 0 ? 'NULLS FIRST' : ''
6241 softime 10573 );
6242    
6243     // exécution de la requête
6244 softime 13528 $res = $this->f->get_all_results_from_db_query(
6245     $sql,
6246     array(
6247     "origin" => __METHOD__,
6248     )
6249     );
6250     $result = $res['result'];
6251 softime 10573
6252     // si on a récupéré un instructeur correspondant aux critères
6253 softime 13528 if (is_array($result) && count($result) > 0) {
6254 softime 10573
6255 softime 14064 $instructeur = $this->f->get_inst__om_dbform(array(
6256     'obj' => 'instructeur',
6257     'idx' => $result[0]['instructeur'],
6258     ));
6259     $divisionId = $instructeur->getVal('division');
6260 softime 10573
6261     // s'il a une division, retourne l'instructeur et sa division
6262 softime 14064 if (empty($divisionId) === false) {
6263 softime 10573 return array(
6264 softime 13528 'instructeur' => $result[0]['instructeur'],
6265     'instructeur_2' => $result[0]['instructeur_2'],
6266 softime 10573 'division' => $divisionId,
6267     );
6268     }
6269    
6270     // aucune division trouvée, retour uniquement l'instructeur
6271 softime 13528 return array(
6272 softime 14064 'instructeur' => $result[0]['instructeur'],
6273 softime 13528 'instructeur_2' => $result[0]['instructeur_2'],
6274     );
6275 softime 10573 }
6276    
6277 softime 13528 return array();
6278 mbroquet 3730 }
6279    
6280     /**
6281     * Récupère le type détaillé d'une dossier d'autorisation.
6282     *
6283 softime 14064 * @param string $dossier_autorisation DA
6284 mbroquet 3730 *
6285 softime 14064 * @return string identifiant du type détaillé de dossier d'autorisation
6286 mbroquet 3730 */
6287     function get_dossier_autorisation_da_type_detaille($dossier_autorisation) {
6288     //Récupération du dossier_autorisation_type_detaille concerné par le
6289     //$dossier_autorisation
6290 softime 14064 $dossierAutorisation = $this->f->get_inst__om_dbform(array(
6291     "obj" => "dossier_autorisation",
6292     "idx" => $dossier_autorisation
6293     ));
6294     return $dossierAutorisation->getVal('dossier_autorisation_type_detaille');
6295 softime 12847 }
6296 mbroquet 3730
6297 softime 8989 /**
6298 softime 12847 * Cette méthode permet de gérer l'affectation du dossier.
6299     * Deux cas sont gérées :
6300     * - l'affectation a été sélectionnée par l'utilisateur
6301     * - l'affectation est réalisé automatiquement
6302     *
6303     * Renvoie un tableau associatif contenant l'instructeur, la division et
6304     * l'instructeur secondaire du dossier.
6305     *
6306     * Ex : array(
6307     * 'instructeur' => id_instructeur,
6308     * 'instructeur_2' => id_instructeur_2,
6309     * 'division' => id_division
6310     * )
6311 softime 8989 *
6312 softime 12847 * @param array valeurs récupérées à l'ajout du dossier
6313     * @return array tableau contenant l'affectation du dossier
6314 softime 8989 */
6315 softime 12847 protected function affectation_dossier($val) {
6316     $affectation = array(
6317     'instructeur' => null,
6318     'instructeur_2' => null,
6319     'division' => null,
6320     );
6321     // Cas 1 : Vérifie si une valeur d'affectation automatique
6322     // existe. Si c'est le cas c'est que l'affectation a été choisie
6323     // par l'utilisateur.
6324 softime 13137 // Il s'agit donc d'une affectation manuelle
6325 softime 12847 if (empty($val['affectation_automatique']) === false) {
6326     // Récupération de l'affectation automatique correspondante
6327     $idAffectationAuto = intval($val['affectation_automatique']);
6328     // Préparation des logs
6329     $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6330     "non trouvée";
6331 softime 10573 $logMsgMode = DEBUG_MODE;
6332    
6333 softime 12847 $affectationAuto = $this->f->get_inst__om_dbform(array(
6334 softime 10573 "obj" => "affectation_automatique",
6335 softime 12847 "idx" => $idAffectationAuto
6336 softime 10573 ));
6337 softime 12847 // Vérifie que l'affectation automatique a été correctement récupérée en regardant
6338     // si l'objet instancié a un identifiant non null
6339     if (empty($affectationAuto->getVal($affectationAuto->clePrimaire)) === false) {
6340 softime 10573 // log si l'instructeur n'est pas défini
6341 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6342 softime 10573 "pas d'instructeur défini";
6343 softime 12847 // On cherche maintenant à récupérer l'instructeur principal visé par cette affectation
6344     // et sa division
6345     $instructeurId = $affectationAuto->getVal('instructeur');
6346     if (! empty($instructeurId)) {
6347 softime 10573 // log si l'instructeur n'existe pas
6348 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6349     "instructeur '$instructeurId' non trouvé";
6350     // De la même manière que pour l'affectation automatique on instancie
6351     // l'instructeur avec l'identifiant issus de l'affectation et on vérifie
6352     // si l'instructeur a bien été récupéré.
6353 softime 10573 $instructeur = $this->f->get_inst__om_dbform(array(
6354     "obj" => "instructeur",
6355 softime 12847 "idx" => intval($instructeurId)
6356 softime 10573 ));
6357     if (empty($instructeur->getVal($instructeur->clePrimaire)) === false) {
6358 softime 12847 // Récupération de l'identifiant et de la division de l'instructeur principal
6359     $affectation['instructeur'] = $instructeurId;
6360     $affectation['division'] = $instructeur->getVal('division');
6361 softime 10573
6362     // log le succès
6363 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6364     "instructeur [".$affectation['instructeur']."] ".
6365 softime 10573 "'".$instructeur->getVal('nom')."' affecté, avec sa division ".
6366 softime 12847 "'".$affectation['division']."'";
6367 softime 10573 $logMsgMode = EXTRA_VERBOSE_MODE;
6368     }
6369 mbroquet 3730 }
6370 softime 12847 // Affichage des log de la récupération de l'instructeur principal et de sa division
6371 softime 10573 $this->addToLog($logMsg, $logMsgMode);
6372    
6373 softime 12847 // Si l'affectation donne aussi un instructeur secondaire on le récupère
6374     $instructeur2Id = $affectationAuto->getVal('instructeur_2');
6375 softime 10573 // log si aucun instructeur secondaire est défini
6376 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6377 softime 10573 "pas de second instructeur défini";
6378     $logMsgMode = EXTRA_VERBOSE_MODE;
6379 softime 12847 if (empty($instructeur2Id) === false) {
6380 softime 10573 // log si l'instructeur n'existe pas
6381 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6382     "second instructeur '$instructeur2Id' non trouvé";
6383 softime 10573 $logMsgMode = DEBUG_MODE;
6384 softime 12847 // Instancie l'instructeur secondaire et vérifie si il a bien été récupéré
6385 softime 10573 $instructeur2 = $this->f->get_inst__om_dbform(array(
6386     "obj" => "instructeur",
6387 softime 12847 "idx" => intval($instructeur2Id)
6388 softime 10573 ));
6389     if (empty($instructeur2) === false) {
6390 softime 12847 // Récupération de l'identifiant l'instructeur secondaire
6391     $affectation['instructeur_2'] = $instructeur2Id;
6392 softime 10573
6393     // log le succès
6394 softime 12847 $logMsg = __METHOD__."(): affectation automatique '$idAffectationAuto' ".
6395     "second instructeur [".$affectation['instructeur_2']."] ".
6396 softime 10573 "'".$instructeur2->getVal('nom')."' affecté";
6397     $logMsgMode = EXTRA_VERBOSE_MODE;
6398     }
6399     }
6400 softime 12847 // Affichage des log de la récupération de l'instructeur secondaire
6401 softime 10573 $this->addToLog($logMsg, $logMsgMode);
6402    
6403     // succès : plus rien à logger
6404     $logMsg = null;
6405     $logMsgMode = null;
6406 mbroquet 3730 }
6407 softime 10573
6408     // affectation automatique inexistante
6409     if (empty($logMsg) === false && empty($logMsgMode) === false) {
6410     $this->addToLog($logMsg, $logMsgMode);
6411 softime 6565 }
6412 mbroquet 3730 }
6413 softime 10573
6414    
6415 softime 12847 // Cas 2 : Si aucune affectation automatique n'a été choisi alors on cherche la plus adaptée
6416 softime 10573
6417 softime 12847 // si l'instructeur n'a pas déjà été récupéré et si on a pas de numéro de dossier d'autorisation
6418     // alors l'affectation ne pourra pas être effectué sur ce dossier
6419 softime 13137 if (empty($affectation['instructeur']) === true
6420     && empty($val['dossier_autorisation']) === false) {
6421 softime 10573
6422 softime 12847 // Sinon on récupère le type détaillé du DA
6423     $dadt = $this->get_dossier_autorisation_da_type_detaille($val['dossier_autorisation']);
6424    
6425 softime 10573 // si la commune est spécifiée
6426     $commune_id = 0;
6427 softime 12847 if (isset($val['commune']) && $this->f->is_option_dossier_commune_enabled()) {
6428     $commune_id = $val['commune'];
6429 softime 10573 }
6430    
6431     // récupération de l'instructeur ainsi que de sa division
6432     $instructeurDivision = $this->getInstructeurDivision(
6433 softime 12847 intval($val['quartier']),
6434     intval($val['arrondissement']),
6435     $val['section'],
6436     intval($dadt),
6437     intval($val['om_collectivite']),
6438 softime 13137 intval($commune_id),
6439     intval($val['demande_type'])
6440 softime 10573 );
6441    
6442 softime 12847 if (! empty($instructeurDivision['instructeur']) === true &&
6443     ! empty($instructeurDivision['division']) === true) {
6444     $affectation['instructeur'] = $instructeurDivision['instructeur'];
6445     $affectation['division'] = $instructeurDivision['division'];
6446 softime 10573 }
6447    
6448 softime 13528 if (isset($instructeurDivision['instructeur_2']) === true
6449     && empty($instructeurDivision['instructeur_2']) === false) {
6450     //
6451     $affectation['instructeur_2'] = $instructeurDivision['instructeur_2'];
6452 softime 10573 }
6453     }
6454 softime 12847
6455     // Préviens l'utilisateur si l'affectation du dossier n'a pas pu être réalisée.
6456     if (empty($affectation['instructeur']) === true) {
6457     $affMsg = "<br/> "._("Aucun instructeur compatible avec ce dossier trouve, ".
6458     "contactez votre administrateur afin d'en assigner un ".
6459     "a ce dossier.")." <br/>";
6460 softime 10573
6461 softime 12847 if ($this->f->isAccredited("dossier_modifier_instructeur") === true) {
6462     $affMsg = "<br/> "._("Pensez a assigner un instructeur a ce dossier.")." <br/>";
6463     }
6464 softime 10573 $this->addToMessage($affMsg);
6465     }
6466    
6467 softime 12847 return $affectation;
6468 mbroquet 3730 }
6469    
6470 fmichon 4708 /**
6471     * TRIGGER - triggermodifierapres.
6472     *
6473     * - Interface avec le référentiel ERP [101]
6474     * - Interface avec le référentiel ERP [102][103]
6475 softime 6272 * - Interface avec le référentiel ERP [114]
6476 fmichon 4708 * - Gestion des demandeurs liés
6477     * - Gestion des références cadastrales / parcelles liées
6478     * - Gestion des taxes
6479 softime 8989 *
6480 fmichon 4708 * @return boolean
6481     */
6482 softime 8989 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6483     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6484    
6485 softime 14542 // Liaisons NaN
6486     foreach ($this->liaisons_nan as $liaison_nan) {
6487     // Suppression des liaisons table NaN
6488     $this->supprimer_liaisons_table_nan($liaison_nan["table_l"]);
6489     // Ajout des liaisons table Nan
6490     $nb_liens = $this->ajouter_liaisons_table_nan(
6491     $liaison_nan["table_l"],
6492     $liaison_nan["table_f"],
6493     $liaison_nan["field"],
6494     $val[$liaison_nan["field"]]
6495     );
6496     // Message de confirmation
6497     if ($nb_liens > 0) {
6498     $this->addToMessage(__("Mise à jour des liaisons realisée avec succès."));
6499     }
6500     }
6501    
6502 softime 6565 // Mise à jour DA si miroir du DI
6503     $inst_da = $this->get_inst_dossier_autorisation($this->getVal('dossier_autorisation'));
6504     if ($inst_da->is_dossier_autorisation_visible() === false) {
6505 softime 8640 $params = array(
6506     'di_id' => $this->getVal($this->clePrimaire),
6507     );
6508     if ($inst_da->majDossierAutorisation($params) === false) {
6509 softime 6565 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
6510     return false;
6511     }
6512     }
6513 fmichon 4708
6514     /**
6515     * Interface avec le référentiel ERP.
6516     *
6517     * (WS->ERP)[101] ERP Qualifié -> AT
6518     * Déclencheur :
6519     * - L'option ERP est activée
6520     * - Le dossier est de type AT
6521     * - Le dossier est marqué comme "connecté au référentiel ERP"
6522     * - Le formulaire de modification du dossier est validé avec le
6523     * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
6524     * "OUI"
6525     */
6526 softime 8989 //
6527 softime 7366 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6528 fmichon 4708 && $this->is_connected_to_referentiel_erp() === true
6529     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__at')
6530     && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false) {
6531 softime 4740 // Récupère la liste des contraintes
6532     $contraintes_plu_list = $this->getListContrainte($this->valF['dossier'], false);
6533     // Extrait les libellés de chaque contraintes
6534     $contraintes_plu = array();
6535     $contraintes_plu_string = "";
6536 softime 14542 foreach ($contraintes_plu_list as $row) {
6537 softime 4740 //
6538     $contraintes_plu[] = $row['contrainte_libelle'];
6539     }
6540     // Chaîne de caractère listant toutes les contraintes du dossier
6541     $contraintes_plu_string = implode(' ; ', $contraintes_plu);
6542 nhaye 6052 $competence = "";
6543     if ($this->valF['autorite_competente'] !== null) {
6544     $inst_ac = $this->get_inst_autorite_competente($this->valF['autorite_competente']);
6545     $competence = $inst_ac->getVal("libelle");
6546     }
6547 fmichon 4708 //
6548     $infos = array(
6549     "dossier_instruction" => $this->valF['dossier'],
6550 nhaye 6052 "competence" => $competence,
6551 softime 4740 "contraintes_plu" => $contraintes_plu_string,
6552 fmichon 4708 "references_cadastrales" => $this->getReferenceCadastrale($this->valF['dossier']),
6553     );
6554     //
6555     $ret = $this->f->send_message_to_referentiel_erp(101, $infos);
6556     if ($ret !== true) {
6557     $this->cleanMessage();
6558     $this->addToMessage(_("Une erreur s'est produite lors de la notification (101) du référentiel ERP. Contactez votre administrateur."));
6559     return false;
6560 mbroquet 3730 }
6561 fmichon 4708 $this->addToMessage(_("Notification (101) du référentiel ERP OK."));
6562     }
6563 mbroquet 3730
6564 fmichon 4708 /**
6565     * Interface avec le référentiel ERP.
6566     *
6567     * (WS->ERP)[102] Demande de complétude de dossier PC pour un ERP -> PC qui concerne un ERP
6568     * (WS->ERP)[103] Demande de qualification de dossier PC pour un ERP -> PC qui concerne un ERP
6569     * Déclencheur :
6570     * - L'option ERP est activée
6571     * - Le dossier est de type PC
6572     * - Le formulaire de modification du dossier est validé avec le
6573     * marqueur "à qualifier" à "NON" alors qu'il était précédemment à
6574     * "OUI"
6575     * - Le formulaire de modification du dossier est validé avec le
6576     * marqueur "ERP" à "OUI"
6577     */
6578     //
6579 softime 7366 if ($this->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6580 fmichon 4708 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
6581     && $this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
6582     && $this->valF['erp'] == true) {
6583     //
6584     $infos = array(
6585     "dossier_instruction" => $this->valF['dossier'],
6586     );
6587     // [102] Demande de complétude de dossier PC pour un ERP
6588     $ret = $this->f->send_message_to_referentiel_erp(102, $infos);
6589     if ($ret !== true) {
6590     $this->cleanMessage();
6591     $this->addToMessage(_("Une erreur s'est produite lors de la notification (102) du référentiel ERP. Contactez votre administrateur."));
6592     return false;
6593     }
6594     $this->addToMessage(_("Notification (102) du référentiel ERP OK."));
6595     // [103] Demande de qualification de dossier PC pour un ERP
6596     $ret = $this->f->send_message_to_referentiel_erp(103, $infos);
6597     if ($ret !== true) {
6598     $this->cleanMessage();
6599     $this->addToMessage(_("Une erreur s'est produite lors de la notification (103) du référentiel ERP. Contactez votre administrateur."));
6600     return false;
6601     }
6602     $this->addToMessage(_("Notification (103) du référentiel ERP OK."));
6603     }
6604    
6605     /**
6606 softime 6272 * Interface avec le référentiel ERP.
6607     *
6608     * (WS->ERP)[114] ERP Qualifié -> PC
6609     * Déclencheur :
6610     * - l'option ERP est activée
6611     * - ET le dossier est marqué comme "connecté au référentiel ERP"
6612     * - ET le dossier est de type PC
6613     * - ET
6614     * - soit le formulaire de modification du dossier est validé avec le
6615     * marqueur "enjeu_urba" qui change de statut
6616     * - soit ce marqueur est vrai et le dossier passe à qualifié
6617     */
6618     // Étant donné que l'objet a été modifié en base après sa création,
6619     // il faut le ré-instancier pour récupérer ses informations.
6620 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6621     "obj" => "dossier",
6622     "idx" => $this->valF['dossier'],
6623     ));
6624 softime 7366 if ($dossier->f->is_option_referentiel_erp_enabled($this->getVal('om_collectivite')) === true
6625 softime 6272 && $dossier->is_connected_to_referentiel_erp() === true
6626     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
6627     && (($this->getVal('enjeu_urba') == 't') != $this->valF['enjeu_urba']
6628     || ($this->getVal('a_qualifier') == 't' && $this->valF['a_qualifier'] === false
6629     && $this->getVal('enjeu_urba') == 't'))) {
6630    
6631     $enjeu = "non";
6632     if ($this->valF['enjeu_urba']) {
6633     $enjeu = "oui";
6634     }
6635    
6636     $infos = array(
6637     "dossier_instruction" => $this->valF['dossier'],
6638     "Dossier à enjeu ADS" => $enjeu
6639     );
6640     //
6641     $ret = $this->f->send_message_to_referentiel_erp(114, $infos);
6642     if ($ret !== true) {
6643     $this->cleanMessage();
6644     $this->addToMessage(_("Une erreur s'est produite lors de la notification (114) du référentiel ERP. Contactez votre administrateur."));
6645     return false;
6646     }
6647     $this->addToMessage(_("Notification (114) du référentiel ERP OK."));
6648     }
6649    
6650     /**
6651 fmichon 4708 * Gestion des demandeurs liés.
6652     */
6653 mbroquet 3730 // Ajout ou modification des demandeurs
6654 softime 8989 $this->insertLinkDossierDemandeur();
6655 mbroquet 3730
6656 fmichon 4708 /**
6657     * Gestion des références cadastrales / parcelles liées.
6658     */
6659 mbroquet 3730 // Si le champ des références cadastrales n'est pas vide
6660     if ($this->getVal('terrain_references_cadastrales')
6661     != $this->valF['terrain_references_cadastrales']) {
6662    
6663     // On supprime toutes les lignes de la table dossier_parcelle qui
6664     // font référence le dossier en cours de modification
6665     $this->supprimer_dossier_parcelle($val['dossier']);
6666    
6667     // Ajout des parcelles dans la table dossier_parcelle
6668     $this->ajouter_dossier_parcelle($val['dossier'],
6669     $val['terrain_references_cadastrales']);
6670    
6671     }
6672    
6673 fmichon 4708 /**
6674     * Gestion des taxes.
6675     */
6676 softime 6929 // Si le champ tax_secteur est modifié et que l'option de simulation des
6677     // taxes est activée
6678     if ($this->getVal('tax_secteur') != $this->valF['tax_secteur']
6679     && $this->f->is_option_simulation_taxes_enabled($this->getVal('om_collectivite')) === true) {
6680 mbroquet 3730
6681     // Valeurs pour le calcul de la taxe d'aménagement
6682 softime 6929 $values = array();
6683     // Instance de la classe donnees_techniques
6684     $donnees_techniques = $this->get_inst_donnees_techniques();
6685     // Récupère les valeurs des données techniques
6686     $values = $donnees_techniques->get_form_val();
6687 mbroquet 3730
6688     // Met à jour les montants du dossier
6689 softime 6929 $update_dossier_tax_mtn = $this->update_dossier_tax_mtn($this->valF['tax_secteur'], $values);
6690     if ($update_dossier_tax_mtn === false) {
6691 mbroquet 3730 //
6692     $this->addToMessage(_("La mise a jour des montants de la simulation de la taxe d'amenagement a echouee."));
6693 softime 6929 //
6694 mbroquet 3730 return false;
6695     }
6696     }
6697    
6698 softime 6272 /**
6699     * Gestion des métadonées des pièces liés.
6700     * Vérifie les méthodes à exécuter configurées dans le connecteur du
6701     * filestorage.
6702     */
6703 mbroquet 3730 //
6704 softime 6272 $ret = $this->post_update_metadata($val);
6705     //
6706     if ($ret === false) {
6707     //
6708     $this->cleanMessage();
6709     $this->addToMessage(_("La mise à jour des métadonnées des pièces liées à ce dossier a échouée."));
6710     return false;
6711     }
6712    
6713 softime 7366 /**
6714     * Gestion des du changement de date de dépôt.
6715     * Vérification préalable de la présence de la date et de sa
6716     * modification.
6717     */
6718 softime 6272 //
6719 softime 7366 if (array_key_exists("date_depot", $val) === true) {
6720     //
6721 softime 7540 $inst_new_date = DateTime::createFromFormat('d/m/Y', $val["date_depot"]);
6722     $inst_old_date = DateTime::createFromFormat('Y-m-d', $this->getVal("date_depot"));
6723     $new_date = $inst_new_date->format('d/m/Y');
6724     $old_date = $inst_old_date->format('d/m/Y');
6725 softime 7366
6726     //
6727     if ($new_date !== $old_date) {
6728     //
6729     $status = $this->update_date_depot($val["date_depot"]);
6730     //
6731     if ($status === false) {
6732     //
6733     $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
6734     return false;
6735     }
6736    
6737     }
6738     }
6739 softime 10573
6740     /**
6741     * Gestion de la normalisation de l'adresse.
6742     * En cas de modification de l'adresse du terrain, l'adresse normalisée
6743     * est supprimée.
6744     */
6745     $list_address_keys = array(
6746     'terrain_adresse_voie_numero',
6747     'terrain_adresse_voie',
6748     'terrain_adresse_lieu_dit',
6749     'terrain_adresse_localite',
6750     'terrain_adresse_code_postal',
6751     'terrain_adresse_bp',
6752     'terrain_adresse_cedex',
6753     );
6754     $change = false;
6755     foreach ($list_address_keys as $key) {
6756     if (array_key_exists($key, $val) === true
6757     && $val[$key] !== $this->getVal($key)) {
6758     //
6759     $change = true;
6760     break;
6761     }
6762     }
6763     if ($change === true) {
6764     $this->normalize_address();
6765     }
6766    
6767     if ($this->f->is_option_mode_service_consulte_enabled() === false
6768 softime 10808 && $this->f->is_type_dossier_platau($this->valF['dossier_autorisation']) === true
6769     && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
6770 softime 13137
6771     $trigger_platau_required_fields = $this->trigger_platau_required_fields($this->valF['dossier']);
6772     // Gestion de l'erreur
6773     if (! $trigger_platau_required_fields) {
6774     $this->addToMessage(sprintf('%s %s',
6775     __("Une erreur s'est produite lors de la mise à jour de l'état de transmission du dossier."),
6776     __("Veuillez contacter votre administrateur.")
6777     ));
6778     $this->correct = false;
6779     return false;
6780     }
6781 softime 10573 }
6782    
6783     /**
6784     * Gestion des tâches pour la dématérialisation
6785     */
6786     // Qualification du dossier d'instruction
6787     if ($this->getVal('instructeur') != $this->valF['instructeur']
6788     || $this->getVal('division') != $this->valF['division']) {
6789     //
6790 softime 10808 if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6791     && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6792     && ($this->f->is_option_mode_service_consulte_enabled() !== true
6793     || ($this->f->is_option_mode_service_consulte_enabled() === true
6794 softime 13137 && ($this->get_source_depot_from_demande() === PLATAU
6795     || $this->get_source_depot_from_demande() === PORTAL)))) {
6796 softime 10573 //
6797     $inst_task = $this->f->get_inst__om_dbform(array(
6798     "obj" => "task",
6799     "idx" => 0,
6800     ));
6801     $task_val = array(
6802     'type' => 'qualification_DI',
6803     'object_id' => $id,
6804     'dossier' => $id,
6805     );
6806     if ($this->f->is_option_mode_service_consulte_enabled() === false
6807     && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6808     || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6809     $task_val['state'] = $inst_task::STATUS_DRAFT;
6810     }
6811     $add_task = $inst_task->add_task(array('val' => $task_val));
6812     if ($add_task === false) {
6813     $this->addToMessage(sprintf('%s %s',
6814     __("Une erreur s'est produite lors de la création tâche."),
6815     __("Veuillez contacter votre administrateur.")
6816     ));
6817     $this->correct = false;
6818     return false;
6819     }
6820     }
6821     }
6822     // Modification du dossier d'instruction
6823     if ($this->f->is_type_dossier_platau($this->valF['dossier_autorisation'])
6824 softime 10808 && $this->valF['etat_transmission_platau'] !== 'jamais_transmissible'
6825 softime 10573 && ($this->f->is_option_mode_service_consulte_enabled() !== true
6826     || ($this->f->is_option_mode_service_consulte_enabled() === true
6827 softime 13137 && ($this->get_source_depot_from_demande() === PLATAU
6828     || $this->get_source_depot_from_demande() === PORTAL)))) {
6829 softime 10573 //
6830     $inst_task = $this->f->get_inst__om_dbform(array(
6831     "obj" => "task",
6832     "idx" => 0,
6833     ));
6834     $task_val = array(
6835     'type' => 'modification_DI',
6836     'object_id' => $id,
6837     'dossier' => $id,
6838     );
6839     // Change l'état de la tâche de notification en fonction de l'état de
6840     // transmission du dossier d'instruction
6841     if ($this->f->is_option_mode_service_consulte_enabled() === false
6842     && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6843     || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6844     //
6845     $task_val['state'] = $inst_task::STATUS_DRAFT;
6846     }
6847     $add_task = $inst_task->add_task(array('val' => $task_val));
6848     if ($add_task === false) {
6849     $this->addToMessage(sprintf('%s %s',
6850     __("Une erreur s'est produite lors de la création tâche."),
6851     __("Veuillez contacter votre administrateur.")
6852     ));
6853     $this->correct = false;
6854     return false;
6855     }
6856     // XXX Les données du DA sont mises à jour seulement lors de l'ajout ou modification
6857     // d'une instruction du DI initial et lors de la décision sur le DI non initial.
6858     // Sachant ce comportement, voir si cette tâche modification_DA est bien située.
6859 softime 10968 // $inst_task = $this->f->get_inst__om_dbform(array(
6860     // "obj" => "task",
6861     // "idx" => 0,
6862     // ));
6863     // $task_val = array(
6864     // 'type' => 'modification_DA',
6865     // 'object_id' => $this->getVal('dossier_autorisation'),
6866     // 'dossier' => $this->getVal('dossier_autorisation'),
6867     // );
6868     // // Change l'état de la tâche de notification en fonction de l'état de
6869     // // transmission du dossier d'instruction
6870     // if ($this->f->is_option_mode_service_consulte_enabled() === false
6871     // && $this->valF['etat_transmission_platau'] === 'non_transmissible'
6872     // || $this->valF['etat_transmission_platau'] === 'transmis_mais_non_transmissible') {
6873     // //
6874     // $task_val['state'] = $inst_task::STATUS_DRAFT;
6875     // }
6876     // $add_task = $inst_task->add_task(array('val' => $task_val));
6877     // if ($add_task === false) {
6878     // $this->addToMessage(sprintf('%s %s',
6879     // __("Une erreur s'est produite lors de la création tâche."),
6880     // __("Veuillez contacter votre administrateur.")
6881     // ));
6882     // $this->correct = false;
6883     // return false;
6884     // }
6885 softime 10573 }
6886    
6887 softime 7366 //
6888 mbroquet 3730 return true;
6889     }
6890    
6891 softime 7366 /**
6892 softime 8989 * TRIGGER - triggermodifier.
6893     *
6894     * @return boolean
6895 softime 7366 */
6896 softime 8989 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
6897     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
6898 softime 7366 // Si la date de dépôt a changé et si elle valait celle du dernier dépôt
6899     // alors cette dernière prend également sa valeur
6900     if ($this->f->formatDate($this->getVal('date_depot')) !== $val['date_depot']
6901     && $this->f->formatDate($this->getVal('date_depot')) === $this->f->formatDate($this->getVal('date_dernier_depot'))) {
6902     $this->valF['date_dernier_depot'] = $this->valF['date_depot'];
6903     }
6904     //
6905     return true;
6906     }
6907    
6908 mbroquet 3730 /**
6909 softime 7366 * Methode de traitement suite à la modification de la date de dépot.
6910     *
6911     * @param string $new_date_str Nouvelle date de dépot.
6912     *
6913     * @return boolean
6914     */
6915     function update_date_depot($new_date_str) {
6916     $demande = $this->get_inst_demande();
6917 softime 10573 // TODO: should return null instead of false
6918 softime 7366 if ($demande === false) {
6919     return false;
6920     }
6921    
6922     $retour = $this->majDateInstruction($demande->getVal("instruction_recepisse"), $new_date_str);
6923     if ($retour === false) {
6924     return false;
6925     }
6926 softime 11876
6927 softime 7366 $valF = array();
6928     foreach ($demande->champs as $id => $champ) {
6929     $valF[$champ] = $demande->val[$id];
6930     }
6931     $valF['date_demande'] = $new_date_str;
6932 softime 8989 $modification = $demande->modifier($valF);
6933 softime 7366 if ($modification === false) {
6934     return false;
6935     }
6936    
6937     $row_date = array("date_demande" => $new_date_str);
6938 softime 8989 $res = $this->f->db->autoExecute(
6939 softime 7366 DB_PREFIXE."dossier",
6940     $row_date,
6941     DB_AUTOQUERY_UPDATE,
6942     "dossier = '".$this->getVal("dossier")."'"
6943     );
6944     $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6945     if ($this->f->isDatabaseError($res, true)) {
6946     return false;
6947     }
6948    
6949 softime 7541 // Si c'est un dossier d'instruction initial
6950 softime 14064 $di_version = $this->get_di_numero_suffixe();
6951 softime 7541 if ($di_version === 0 || $di_version === '0') {
6952     //
6953     $row_date = array("depot_initial" => $new_date_str);
6954 softime 8989 $res = $this->f->db->autoExecute(
6955 softime 7541 DB_PREFIXE."dossier_autorisation",
6956     $row_date,
6957     DB_AUTOQUERY_UPDATE,
6958     "dossier_autorisation = '" . $this->getVal("dossier_autorisation") . "'"
6959     );
6960     $this->f->addToLog(__METHOD__ . "() : db->autoExecute(" . $res . ")", VERBOSE_MODE);
6961     if ($this->f->isDatabaseError($res, true)) {
6962     return false;
6963     }
6964 softime 7366 }
6965     }
6966    
6967    
6968     /**
6969     * Met à jour l'instruction en fonction de la nouvelle date
6970     * ou retourne false si il ya une erreur.
6971     *
6972     * @param integer $instruction_id Identifiant de l'instruction.
6973     * @param string $date_depot Nouvelle date de dépôt.
6974     *
6975     * @return boolean
6976     */
6977     public function majDateInstruction($instruction_id, $date_depot) {
6978    
6979     // Definalise l'instruction de récépissé si nécessaire
6980 softime 7996 $instruction = $this->f->get_inst__om_dbform(array(
6981     "obj" => "instruction",
6982     "idx" => $instruction_id,
6983     ));
6984 softime 7366 $instruction->setParameter('maj', 110);
6985     //
6986     if ($instruction->is_unfinalizable_without_bypass() === true
6987     && $instruction->unfinalize($instruction->valF) === false) {
6988     return false;
6989     }
6990    
6991     // Modifie la date d'événement
6992     $instruction->setParameter('maj', 1);
6993     //
6994     $valF = array();
6995     foreach ($instruction->champs as $id => $champ) {
6996     $valF[$champ] = $instruction->getVal($champ);
6997     }
6998     //
6999     $valF['date_evenement'] = $date_depot;
7000     $valF['date_finalisation_courrier'] = null;
7001     //
7002 softime 8989 $modification = $instruction->modifier($valF);
7003 softime 7366 //
7004     if ($modification === false) {
7005     return false;
7006     }
7007    
7008     // Finalise l'instruction
7009     $instruction->setParameter('maj', 100);
7010     if ($instruction->finalize($instruction->valF) === false) {
7011     return false;
7012     }
7013    
7014     //
7015     return true;
7016     }
7017    
7018     /**
7019 softime 10573 * TODO: replace with '$this->f->findObjectById' ?
7020     *
7021 softime 6272 * Récupère l'instance de l'autorité compétente.
7022     *
7023     * @param string $autorite_competente Identifiant de l'autorité compétente.
7024     *
7025     * @return object
7026     */
7027     function get_inst_autorite_competente($autorite_competente = null) {
7028     //
7029     return $this->get_inst_common("autorite_competente", $autorite_competente);
7030     }
7031    
7032    
7033     /**
7034 softime 6929 * Met à jour les montants des taxes du dossier d'instruction.
7035 mbroquet 3730 *
7036 softime 6929 * @param integer $tax_secteur Secteur communal.
7037     * @param array $val Valeurs des données techniques.
7038 mbroquet 3730 *
7039     * @return boolean
7040     */
7041 softime 6929 public function update_dossier_tax_mtn($tax_secteur, $val = array()) {
7042 mbroquet 3730 // Instance du paramétrage de la taxe d'aménagement
7043     $taxe_amenagement = $this->get_inst_taxe_amenagement();
7044    
7045 softime 6929 // Liste des montants à mettre à jour
7046     $valF = array();
7047     $valF['tax_mtn_part_commu'] = null;
7048     $valF['tax_mtn_part_depart'] = null;
7049     $valF['tax_mtn_part_reg'] = null;
7050     $valF['tax_mtn_total'] = null;
7051     $valF['tax_mtn_rap'] = null;
7052     $valF['tax_mtn_part_commu_sans_exo'] = null;
7053     $valF['tax_mtn_part_depart_sans_exo'] = null;
7054     $valF['tax_mtn_part_reg_sans_exo'] = null;
7055     $valF['tax_mtn_total_sans_exo'] = null;
7056     $valF['tax_mtn_rap_sans_exo'] = null;
7057 mbroquet 3730
7058 softime 6929 // Si le tableau des valeurs n'est pas vide
7059     if ($val !== array()) {
7060 mbroquet 3730
7061 softime 6929 // Si le taux communal est renseigné
7062     if ($taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== null
7063     && $taxe_amenagement->getVal('tx_comm_secteur_'.$tax_secteur) !== '') {
7064 mbroquet 3730
7065 softime 6929 // Calcul de la TA
7066     $calcul_ta = $taxe_amenagement->compute_ta($tax_secteur, $val);
7067    
7068     // Si chaque résultat est calculable
7069     if ($calcul_ta !== null && is_array($calcul_ta) === true) {
7070    
7071     // Total des parts de la TA avec exonération
7072     $total_ta = $calcul_ta['commu'] + $calcul_ta['depart'] + $calcul_ta['reg'];
7073     $total_ta_ss_exo = $calcul_ta['commu_ss_exo'] + $calcul_ta['depart_ss_exo'] + $calcul_ta['reg_ss_exo'];
7074    
7075     // Valeurs à mettre à jour, les montants doivent être à l'entier
7076     // inférieur
7077 softime 13528 $valF['tax_mtn_part_commu'] = floor(floatval($calcul_ta['commu']));
7078     $valF['tax_mtn_part_depart'] = floor(floatval($calcul_ta['depart']));
7079     $valF['tax_mtn_part_reg'] = floor(floatval($calcul_ta['reg']));
7080     $valF['tax_mtn_total'] = floor(floatval($total_ta));
7081     $valF['tax_mtn_part_commu_sans_exo'] = floor(floatval($calcul_ta['commu_ss_exo']));
7082     $valF['tax_mtn_part_depart_sans_exo'] = floor(floatval($calcul_ta['depart_ss_exo']));
7083     $valF['tax_mtn_part_reg_sans_exo'] = floor(floatval($calcul_ta['reg_ss_exo']));
7084     $valF['tax_mtn_total_sans_exo'] = floor(floatval($total_ta_ss_exo));
7085 softime 6929 }
7086     }
7087    
7088     // Calcul de la RAP
7089     $calcul_rap = $taxe_amenagement->compute_rap($val);
7090    
7091     // Si chaque résultat est calculable
7092     if ($calcul_rap !== null && is_array($calcul_rap) === true) {
7093    
7094     // RAP avec exonération
7095     $mtn_rap = $calcul_rap['rap'];
7096     // RAP sans exonération
7097     $mtn_rap_ss_exo = $calcul_rap['rap_ss_exo'];
7098    
7099     // Valeurs à mettre à jour, les montants doivent être à l'entier
7100     // inférieur
7101 softime 13528 $valF['tax_mtn_rap'] = floor(floatval($mtn_rap));
7102     $valF['tax_mtn_rap_sans_exo'] = floor(floatval($mtn_rap_ss_exo));
7103 softime 6929 }
7104 mbroquet 3730 }
7105    
7106     // Met à jour l'enregistrement de dossier
7107 softime 8989 $res = $this->f->db->autoExecute(
7108 softime 6929 DB_PREFIXE.$this->table,
7109     $valF,
7110     DB_AUTOQUERY_UPDATE,
7111     $this->clePrimaire ."='".$this->getVal($this->clePrimaire)."'"
7112     );
7113 mbroquet 3730 // Log
7114     $this->f->addToLog(__METHOD__."() : db->autoExecute(".$res.")", VERBOSE_MODE);
7115     //
7116     if ($this->f->isDatabaseError($res, true)) {
7117     //
7118     $this->correct = false;
7119     return false;
7120     }
7121    
7122     //
7123     return true;
7124     }
7125    
7126 softime 8477 /**
7127 softime 8989 * TRIGGER - triggersupprimer.
7128 softime 8477 *
7129     * @return boolean
7130     */
7131 softime 8989 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
7132     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
7133 softime 6929
7134 softime 12654 // Permet de récupérer la le type de demande pour la gestion du numéro de dossier.
7135     $inst_demande = $this->get_inst_demande();
7136     $this->val['demande_type'] = $inst_demande->getVal('demande_type');
7137    
7138 softime 8477 /**
7139     * Gestion de la suppression des tables liées au dossier d'instruction.
7140     * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
7141     */
7142 softime 13528 if (! isset($this->related_tables)) {
7143     $this->set_related_tables();
7144     }
7145 softime 8477 // Supprime les enregistrements des tables
7146 softime 13528 $delete = $this->delete_related_tables($this->related_tables);
7147 softime 8477 if ($delete === false) {
7148     return false;
7149     }
7150    
7151     //
7152     return true;
7153     }
7154    
7155 mbroquet 3730 /**
7156 softime 8989 * TRIGGER - triggersupprimerapres.
7157 softime 8477 *
7158     * @return boolean
7159 mbroquet 3730 */
7160 softime 8989 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
7161     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
7162 mbroquet 3730
7163 softime 8477 /**
7164     * Gestion de la suppression des tables liées au dossier d'instruction.
7165     * Dans le cas d'un dossier d'instruction initial le dossier
7166     * d'autorisation est également supprimé pour libérer la numéroration.
7167     * S'il s'agit d'un dossier d'instruction sur exsitant alors le dossier
7168     * d'autorisation est mise à jour.
7169     * Les fichiers potentiellement liés aux tables ne sont pas supprimés.
7170     */
7171     // S'il s'agit d'une suppression de dossier d'instruction sur existant
7172     if ($this->has_only_initial_di(true) === false) {
7173     // Mise à jour des données du dossier d'autorisation
7174     $da = $this->f->get_inst__om_dbform(array(
7175     "obj" => "dossier_autorisation",
7176     "idx" => $this->getVal("dossier_autorisation"),
7177     ));
7178     $da->majDossierAutorisation();
7179 mbroquet 3730
7180 softime 8477 } else {
7181     // S'il s'agit d'une suppression de dossier d'instruction initial
7182     // Tableau pour la conception des requêtes de suppression
7183     $related_tables = array(
7184     'lien_dossier_autorisation_demandeur' => array(
7185     'condition_field' => 'dossier_autorisation',
7186     'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7187     ),
7188     'dossier_autorisation_parcelle' => array(
7189     'condition_field' => 'dossier_autorisation',
7190     'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7191     ),
7192     'donnees_techniques' => array(
7193     'condition_field' => 'dossier_autorisation',
7194     'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7195     ),
7196     'dossier_autorisation' => array(
7197     'condition_field' => 'dossier_autorisation',
7198     'condition_value' => sprintf("'%s'", $val['dossier_autorisation']),
7199     ),
7200     );
7201     // Supprime les tables
7202     $delete = $this->delete_related_tables($related_tables);
7203     if ($delete === false) {
7204     return false;
7205     }
7206    
7207 softime 13528 // Compose le nom de la séquence
7208 softime 14064 $seq_name = null;
7209 softime 13528 $datc = $this->getVal('numerotation_type');
7210     $annee = $this->getVal('annee');
7211     $dep = $this->getVal('numerotation_dep');
7212     $com = $this->getVal('numerotation_com');
7213 softime 14064 // TODO si les tests se déroulent bien;
7214     // - supprimer la création manuelle de la séquence avec 'sprintf(...)'
7215     // - conserver uniquement l'usage de 'compose_sequence_name(...)'
7216     if (! empty($datc) && ! empty($annee) && ! empty($dep) && ! empty($com)) {
7217     $seq_name = strtolower(sprintf(
7218 softime 13528 '%sdossier_%s_%s_%s_%s_seq',
7219     DB_PREFIXE,
7220     $datc,
7221     $annee,
7222     $dep,
7223     $com
7224 softime 14064 ));
7225     $alt_seq_name = $this->compose_sequence_name($datc, $annee, $dep, $com);
7226     if ($seq_name != $alt_seq_name) {
7227     throw new RuntimeException("Sequence names differs ($seq_name != $alt_seq_name) for $id");
7228     }
7229     }
7230    
7231     // si il manque l'une des données, c'est que le dossier a un numéro qui ne respecte pas
7232     // la norme urbanisme et donc on a pas su le décomposer lors de la création du dossier
7233     // (moment où ces données sont renseignées) et la séquence (qui utilise ces données) n'a
7234     // pas pu être constituée et donc pas incrémentée lors de la création du dossier.
7235     // C'est pourquoi il ne faut pas modifier la séquence non-plus lors de la suppression.
7236     else {
7237     foreach(array('numerotation_type', 'annee', 'numerotation_dep', 'numerotation_com') as $key) {
7238     if (empty($this->getVal($key) )) {
7239     $this->f->addToLog("Valeur vide pour le champ '$key' du dossier $id", VERBOSE_MODE);
7240     }
7241     }
7242     }
7243 softime 13528 // Instancie le dossier d'autorisation sans identifiant
7244     $da = $this->f->get_inst__om_dbform(array(
7245     "obj" => "dossier_autorisation",
7246     "idx" => 0,
7247     ));
7248 softime 10573
7249 softime 13528 // Si la séquence a pu être composée et que celle-ci existe
7250     if (! empty($seq_name ) && $da->doesNumeroDossierSequenceExists($seq_name) === true){
7251 softime 12654 /**
7252     * Mise à jour de la séquence.
7253     */
7254 softime 14064 $curr_da_num = $da->getMaxDANumeroDossier($datc, $annee, $dep, $com);
7255 softime 12654 if (is_integer($curr_da_num) !== true) {
7256     $this->addToMessage(__('Erreur lors du calcul du numéro de dossier.'));
7257     return false;
7258     }
7259 softime 10573
7260 softime 12654 // Dans le cas de la suppression du dernier dossier d'instruction de
7261     // sa numérotation alors la séquence est supprimée
7262     if ($curr_da_num === 0) {
7263     $table_name = substr($seq_name, 0, -4);
7264     $res = $this->f->db->dropSequence($table_name);
7265 softime 13137 $this->f->addToLog(__METHOD__."(): db->dropSequence(\"".$table_name."\");", VERBOSE_MODE);
7266 softime 12654 $this->f->isDatabaseError($res);
7267     } else {
7268     // La méthode setval avec la valeur true en troisième argument
7269     // signifie que le prochain nextval avancera la séquence avant
7270     // de renvoyer une valeur.
7271 softime 14542 // TODO : cette requête ne sert pas à récupérer des résultats mais
7272     // juste à mettre à un numéro de séquence. Voir si il n'est pas judicieux
7273     // d'avoir une autre méthode plutôt qu'un get_result pour ce genre de cas
7274     $this->f->get_all_results_from_db_query(
7275     sprintf(
7276     'SELECT
7277     setval(\'%s\', %s, true)',
7278     $this->f->db->escapeSimple($seq_name),
7279     $this->f->db->escapeSimple($curr_da_num)
7280     ),
7281     array(
7282     'origin' => __METHOD__
7283     )
7284 softime 12654 );
7285     }
7286 softime 8477 }
7287 softime 13137 // Si le dossier n'est pas décomposable et donc que la séquence du dossier n'a pas
7288 softime 14064 // été mise à jour
7289 softime 13137 else {
7290 softime 14064 $id_di = $this->getVal($this->clePrimaire);
7291    
7292     // si l'option de saisie complète du numéro de dossier n'est pas activée, c'est un
7293     // bug (ou défaut de paramétrage)
7294     if (! $this->f->is_option_dossier_saisie_numero_complet_enabled($this->getVal('om_collectivite'))) {
7295     throw new RuntimeException(
7296     "Le dossier supprimé '$id_di' n'a pas de séquence correspondante, ".
7297     "alors que l'option 'dossier_saisie_numero_complet' n'est pas activée: BUG ?!");
7298     }
7299    
7300     // ajoute un message de log pour avoir un suivi
7301 softime 13137 $this->f->addToLog(
7302 softime 14064 __METHOD__."(): INFO: le dossier '$id_di' n'étant pas à la norme urba, ".
7303     "la séquence correspondante n'a pas besoin d'être mise à jour.",
7304     DEBUG_MODE
7305 softime 13137 );
7306     }
7307 softime 8477 }
7308    
7309     /**
7310     * Supprime le dossier d'instruction des derniers dossiers consultés,
7311     * sauvegardé en session
7312     */
7313     if (isset($_SESSION['dossiers_consulte']) !== false) {
7314     $id_di = $this->getVal($this->clePrimaire);
7315     if (in_array($id_di, $_SESSION['dossiers_consulte']) === true) {
7316     unset($_SESSION['dossiers_consulte'][$id_di]);
7317     }
7318     // Supprime le tableau s'il n'y a plus de dossier consulté
7319     if (count($_SESSION['dossiers_consulte']) === 0) {
7320     unset($_SESSION['dossiers_consulte']);
7321     }
7322     }
7323 softime 10573
7324     /**
7325     * Gestion des tâches pour la dématérialisation
7326     */
7327     $inst_task_empty = $this->f->get_inst__om_dbform(array(
7328     "obj" => "task",
7329     "idx" => 0,
7330     ));
7331     $task_types = array(
7332     "creation_DI",
7333     "depot_DI",
7334     );
7335     foreach ($task_types as $task_type) {
7336     $task_exists = $inst_task_empty->task_exists($task_type, $id);
7337     if ($task_exists !== false) {
7338     $inst_task = $this->f->get_inst__om_dbform(array(
7339     "obj" => "task",
7340     "idx" => $task_exists,
7341     ));
7342     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
7343     $task_val = array(
7344     'state' => $inst_task::STATUS_CANCELED,
7345     );
7346     $update_task = $inst_task->update_task(array('val' => $task_val));
7347     if ($update_task === false) {
7348     $this->addToMessage(sprintf('%s %s',
7349     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
7350     __("Veuillez contacter votre administrateur.")
7351     ));
7352     $this->correct = false;
7353     return false;
7354     }
7355     }
7356     }
7357     }
7358    
7359     return true;
7360 mbroquet 3730 }
7361 softime 8477
7362 mbroquet 3730 /**
7363 softime 8477 * TREATMENT - delete_related_tables.
7364     *
7365     * Suppression par requête SQL les enregistrements des tables passées en
7366     * paramètre.
7367     *
7368     * @param array $related_tables Liste des enregistrements à supprimer
7369     *
7370     * @return boolean
7371     */
7372     function delete_related_tables(array $related_tables) {
7373     $this->begin_treatment(__METHOD__);
7374    
7375     // Supprime chaque enregistrement liés au dossier d'instruction
7376     $template_delete_sql = 'DELETE FROM %s%s WHERE %s IN (%s)';
7377     foreach ($related_tables as $table => $value) {
7378     if (isset($value['table']) === true) {
7379     $table = $value['table'];
7380     }
7381     if ($value['condition_value'] !== '' && $value['condition_value'] !== null) {
7382 softime 13528 $sql = sprintf(
7383     $template_delete_sql,
7384     DB_PREFIXE,
7385     $table,
7386     $value['condition_field'],
7387     $value['condition_value']
7388     );
7389 softime 8477 $res = $this->f->db->query($sql);
7390     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
7391     $this->f->isDatabaseError($res);
7392 softime 14542 }
7393     }
7394 softime 10573
7395 softime 14542 /**
7396     * Gestion des tâches pour la dématérialisation
7397     */
7398    
7399     // Annule toutes les tâches liées au dossier
7400     $inst_task_empty = $this->f->get_inst__om_dbform(array(
7401     "obj" => "task",
7402     "idx" => 0,
7403     ));
7404     $all_task_type = array_merge(task::TASK_TYPE_SI, task::TASK_TYPE_SC);
7405     $search_values = array(
7406     sprintf('(state = \'%s\' OR state = \'%s\')', task::STATUS_NEW, task::STATUS_DRAFT),
7407     isset($related_tables['dossier_autorisation']) === false
7408     ? sprintf(
7409     'type IN (%s) AND (object_id = \'%s\' OR dossier = \'%s\')',
7410     implode( // liste (string) des type de tâches concernés
7411     ',',
7412     array_map(
7413     function ($t) { return "'$t'"; },
7414     array_merge(
7415     task::TASK_TYPE_SI,
7416     task::TASK_TYPE_SC)
7417     )
7418     ),
7419     $this->getVal($this->clePrimaire),
7420     $this->getVal($this->clePrimaire)
7421     )
7422     : sprintf(
7423     '((type IN (%s) AND (object_id = \'%s\' OR dossier = \'%s\'))
7424     OR (type IN (%s) AND object_id = \'%s\'))',
7425     implode( // liste (string) des type de tâches concernés
7426     ',',
7427     array_map(
7428     function ($t) { return "'$t'"; },
7429     array_merge(
7430     task::TASK_TYPE_SI,
7431     task::TASK_TYPE_SC)
7432     )
7433     ),
7434     $this->getVal($this->clePrimaire),
7435     $this->getVal($this->clePrimaire),
7436     "'creation_DA', 'modification_DA'",
7437     $this->getVal('dossier_autorisation')
7438     ),
7439     );
7440     $task_exists = $inst_task_empty->task_exists_multi_search($search_values);
7441     if ($task_exists !== false) {
7442     foreach ($task_exists as $task) {
7443     $inst_task = $this->f->get_inst__om_dbform(array(
7444 softime 10573 "obj" => "task",
7445 softime 14542 "idx" => $task['task'],
7446 softime 10573 ));
7447 softime 14542 $task_val = array(
7448     'state' => task::STATUS_CANCELED,
7449     );
7450     $update_task = $inst_task->update_task(array('val' => $task_val));
7451     if ($update_task === false) {
7452     $this->addToMessage(sprintf('%s %s',
7453     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
7454     __("Veuillez contacter votre administrateur.")
7455     ));
7456     $this->correct = false;
7457     return $this->end_treatment(__METHOD__, false);
7458 softime 10573 }
7459 softime 8477 }
7460     }
7461    
7462     return $this->end_treatment(__METHOD__, true);
7463     }
7464    
7465     /**
7466     * CONDITION - has_only_initial_di.
7467     *
7468     * Permet de vérifier qu'il s'agit du dossier d'instruction initial de
7469     * l'autorisation.
7470     *
7471     * @param boolean $after_delete À activer si la méthode est utilisée lors de
7472     * la suppression.
7473     *
7474     * @return boolean
7475     */
7476     function has_only_initial_di($after_delete=false) {
7477    
7478     // Compte le nombre de dossier lié au dossier d'autorisation
7479     $res = $this->get_idx_by_args('COUNT(dossier)', 'dossier', 'dossier_autorisation', $this->getVal('dossier_autorisation'));
7480    
7481     // Si la méthode est utilisé dans le triggersupprimerapres alors le
7482     // dossier d'instruction est déjà supprimé dans la base de données, le
7483     // retour doit donc être 0 pour prouver la suppression du DI initial
7484     if ($after_delete === true) {
7485     if ($res === '0') {
7486     return true;
7487     }
7488     //
7489     return false;
7490     }
7491    
7492     // S'il y a qu'un seul dossier d'instruction alors le DI courant est
7493     // forcément l'initial
7494     if ($res === '1') {
7495     return true;
7496     }
7497     //
7498     return false;
7499     }
7500    
7501     /**
7502 mbroquet 3730 * Retourne la reference cadastrale de la demande attache a un dossier ERP
7503     * specifique
7504     * @param string $dossier L'identifiant du dossier
7505     * @return string|null La reference cadastrale si elle est trouve,
7506     * sinon NULL. En cas d'erreur de la BD, l'execution s'arrete.
7507     */
7508     function getReferenceCadastrale($dossier) {
7509 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7510     sprintf(
7511     'SELECT
7512     terrain_references_cadastrales
7513     FROM
7514     %1$sdemande
7515     WHERE
7516     dossier_instruction = \'%2$s\'
7517     LIMIT 1',
7518     DB_PREFIXE,
7519     $this->f->db->escapeSimple($dossier)
7520     ),
7521     array(
7522     'origin' => __METHOD__,
7523     'force_return' => true
7524     )
7525 softime 12847 );
7526 softime 14542 if ($qres['code'] !== 'OK') {
7527 mbroquet 3730 // Appel de la methode de recuperation des erreurs
7528 softime 14542 // TODO : pas de correspondance pour la méthode getDebugInfo() voir si
7529     // il faut faire évoluer ce code ou si la modif est ok
7530     // Ancien code : $this->erreur_db($res->getDebugInfo(), $res->getMessage(), 'demande');
7531     $this->erreur_db($qres['message'], $qres['message'], 'demande');
7532 mbroquet 3730 }
7533     // retourne la nature du dossier
7534 softime 14542 foreach ($qres['result'] as $row) {
7535     return $row['terrain_references_cadastrales'];
7536 mbroquet 3730 }
7537     // la nature n'etait pas trouve, ce qui ne devrait pas se passer
7538     return NULL;
7539     }
7540    
7541     /**
7542 softime 6565 * Supprime puis recrée tous les liens entre dossier et demandeurs
7543 mbroquet 3730 **/
7544 softime 8989 function insertLinkDossierDemandeur() {
7545 softime 6565 // Suppression des anciens demandeurs
7546 softime 8989 $this->deleteLinkDossierDemandeur();
7547 softime 6565 $types_demandeur = array(
7548     "petitionnaire_principal",
7549     "delegataire",
7550     "petitionnaire",
7551     "plaignant_principal",
7552     "plaignant",
7553     "contrevenant_principal",
7554     "contrevenant",
7555     "requerant_principal",
7556     "requerant",
7557     "avocat_principal",
7558     "avocat",
7559 softime 7067 "bailleur_principal",
7560     "bailleur",
7561 softime 10573 "proprietaire",
7562     "architecte_lc",
7563     "paysagiste",
7564 softime 6565 );
7565     foreach ($types_demandeur as $type) {
7566     // Comparaison des autres demandeurs
7567     if(isset($this->postedIdDemandeur[$type]) === true) {
7568     // Ajout des nouveaux liens
7569     foreach ($this->postedIdDemandeur[$type] as $demandeur) {
7570     //
7571     $principal = false;
7572     if (strpos($type, '_principal') !== false) {
7573     $principal = true;
7574     }
7575 softime 8989 if ($this->addLinkDossierDemandeur($demandeur, $principal) === false) {
7576 softime 6565 //
7577     return false;
7578     }
7579     }
7580 mbroquet 3730 }
7581     }
7582     }
7583    
7584    
7585     /**
7586     * Fonction permettant d'ajouter un lien
7587 softime 6565 * entre la table dossier et demandeur
7588 mbroquet 3730 **/
7589 softime 8989 function addLinkDossierDemandeur($id, $principal) {
7590 softime 7996 $lienAjout = $this->f->get_inst__om_dbform(array(
7591     "obj" => "lien_dossier_demandeur",
7592     "idx" => "]",
7593     ));
7594 mbroquet 3730 $lien = array('lien_dossier_demandeur' => "",
7595     'petitionnaire_principal' => (($principal)?"t":"f"),
7596     'dossier' => $this->valF['dossier'],
7597     'demandeur' => $id);
7598 softime 8989 $lienAjout->ajouter($lien);
7599 mbroquet 3730 $lienAjout->__destruct();
7600     }
7601    
7602     /**
7603     * Fonction permettant de supprimer un lien
7604     * entre la table demande et demandeur
7605     **/
7606 softime 8989 function deleteLinkDossierDemandeur() {
7607 mbroquet 3730 // Suppression
7608     $sql = "DELETE FROM ".DB_PREFIXE."lien_dossier_demandeur ".
7609     "WHERE dossier='".$this->valF['dossier']."'";
7610 softime 8989 $res = $this->f->db->query($sql);
7611 softime 12847 $this->f->addToLog(
7612     __METHOD__."(): db->query(\"".$sql."\");",
7613     VERBOSE_MODE
7614     );
7615     $this->f->isDatabaseError($res);
7616 mbroquet 3730 }
7617    
7618     /**
7619     * Methode de recupération des valeurs postées
7620     **/
7621     function getPostedValues() {
7622     // Récupération des demandeurs dans POST
7623 softime 6565 $types_demandeur = array(
7624     "petitionnaire_principal",
7625     "delegataire",
7626     "petitionnaire",
7627     "plaignant_principal",
7628     "plaignant",
7629     "contrevenant_principal",
7630     "contrevenant",
7631     "requerant_principal",
7632     "requerant",
7633     "avocat_principal",
7634     "avocat",
7635 softime 7067 "bailleur_principal",
7636     "bailleur",
7637 softime 10573 "proprietaire",
7638     "architecte_lc",
7639     "paysagiste",
7640 softime 6565 );
7641     foreach ($types_demandeur as $type) {
7642     if($this->f->get_submitted_post_value($type) !== null AND
7643     $this->f->get_submitted_post_value($type) != '') {
7644     $this->postedIdDemandeur[$type] = $this->f->get_submitted_post_value($type);
7645 mbroquet 3730 }
7646     }
7647     }
7648    
7649     /**
7650     * Méthode permettant de récupérer les id des demandeurs liés à la table
7651     * liée passée en paramètre
7652     *
7653     * @param string $from Table liée : "demande", "dossier", dossier_autorisation"
7654     * @param string $id Identifiant (clé primaire de la table liée en question)
7655     */
7656     function listeDemandeur($from, $id) {
7657 softime 6565
7658     // Si la donnée membre a déjà été remplie par un précédent appel à cette méthode,
7659     // on sort.
7660     if ($this->valIdDemandeur["petitionnaire_principal"] !== array() or
7661     $this->valIdDemandeur["delegataire"] !== array() or
7662     $this->valIdDemandeur["petitionnaire"] !== array() or
7663     $this->valIdDemandeur["plaignant_principal"] !== array() or
7664     $this->valIdDemandeur["plaignant"] !== array() or
7665     $this->valIdDemandeur["contrevenant_principal"] !== array() or
7666     $this->valIdDemandeur["contrevenant"] !== array() or
7667     $this->valIdDemandeur["requerant_principal"] !== array() or
7668     $this->valIdDemandeur["requerant"] !== array() or
7669     $this->valIdDemandeur["avocat_principal"] !== array() or
7670 softime 7067 $this->valIdDemandeur["avocat"] !== array() or
7671     $this->valIdDemandeur["bailleur_principal"] !== array() or
7672 softime 10573 $this->valIdDemandeur["bailleur"] !== array() or
7673     $this->valIdDemandeur["proprietaire"] !== array() or
7674     $this->valIdDemandeur["architecte_lc"] !== array() or
7675     $this->valIdDemandeur["paysagiste"] !== array()) {
7676 softime 6565 return;
7677     }
7678    
7679 mbroquet 3730 // Récupération des demandeurs de la base
7680 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7681     sprintf(
7682     'SELECT
7683     demandeur.demandeur,
7684     demandeur.type_demandeur,
7685     lien_%2$s_demandeur.petitionnaire_principal
7686     FROM
7687     %1$slien_%2$s_demandeur
7688     INNER JOIN %1$sdemandeur
7689     ON demandeur.demandeur=lien_%2$s_demandeur.demandeur
7690     WHERE
7691     %2$s = \'%3$s\'',
7692     DB_PREFIXE,
7693     $from,
7694     $this->f->db->escapeSimple($id)
7695     ),
7696     array(
7697     'origin' => __METHOD__
7698     )
7699     );
7700 softime 6565
7701 mbroquet 3730 // Stockage du résultat dans un tableau
7702 softime 14542 foreach ($qres['result'] as $row) {
7703 softime 6565
7704     $demandeur_type = $row['type_demandeur'];
7705     if ($row['petitionnaire_principal'] == 't'){
7706     $demandeur_type .= "_principal";
7707 mbroquet 3730 }
7708 softime 6565 $this->valIdDemandeur[$demandeur_type][] = $row['demandeur'];
7709 mbroquet 3730 }
7710     }
7711    
7712     /**
7713     * Récupère la liste des contraintes d'un dossier.
7714     *
7715 softime 4740 * @param string $dossier Identifiant du dossier.
7716     * @param boolean $for_di_view Liste avec condition affichage DI.
7717     *
7718 mbroquet 3730 * @return object Résultat de la requête
7719     */
7720 softime 4740 function getListContrainte($dossier, $for_di_view = true) {
7721 mbroquet 3730
7722     // Select
7723     $select = "SELECT dossier_contrainte.dossier_contrainte as dossier_contrainte_id,
7724     dossier_contrainte.texte_complete as dossier_contrainte_texte,
7725     dossier_contrainte.reference as dossier_contrainte_reference,
7726     contrainte.libelle as contrainte_libelle,
7727     contrainte.nature as contrainte_nature,
7728     contrainte.texte as contrainte_texte,
7729     contrainte.reference as contrainte_reference,
7730     lower(contrainte.groupe) as contrainte_groupe,
7731     lower(contrainte.sousgroupe) as contrainte_sousgroupe ";
7732    
7733     // From
7734     $from = " FROM ".DB_PREFIXE."contrainte
7735     LEFT JOIN ".DB_PREFIXE."dossier_contrainte
7736     ON dossier_contrainte.contrainte = contrainte.contrainte ";
7737    
7738     // Where
7739     $where = " WHERE dossier_contrainte.dossier = '".$dossier."' ";
7740    
7741 softime 4740 // Si les contraintes sont listées pour être affichées dans le DI
7742     if ($for_di_view === true) {
7743     // Si le paramètre "option_contrainte_di" est défini
7744     if ($this->f->getParameter('option_contrainte_di') != 'aucun') {
7745     // Ajoute la condition
7746     $where .= $this->f->traitement_condition_contrainte(
7747     $this->f->getParameter('option_contrainte_di'));
7748     }
7749 mbroquet 3730 }
7750    
7751     // Tri
7752     $tri = " ORDER BY contrainte_groupe DESC, contrainte_sousgroupe,
7753     contrainte.no_ordre, contrainte.libelle ";
7754    
7755     // Requête SQL
7756 softime 14542 $qres = $this->f->get_all_results_from_db_query($select.$from.$where.$tri, array(
7757     'origin' => __METHOD__
7758     )
7759     );
7760 mbroquet 3730
7761     // Retourne le résultat
7762 softime 14542 return $qres['result'];
7763 mbroquet 3730 }
7764    
7765     /**
7766 softime 11585 * Récupère les informations à afficher dans le tableau des identifiants
7767     * tehniques Plat'AU. Stocke ces informations dans un tableau.
7768     * Converti le tableau au format json et renvoi le json obtenu
7769     *
7770     * @return json
7771     */
7772 softime 15218 protected function get_json_lien_iiue_platau() {
7773 softime 11585 // Tableau de retour
7774     $val_suivi = array();
7775    
7776     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
7777     $liste_champs = array(
7778     'object' => __('type'),
7779     'object_id' => __('identifiant openADS'),
7780     'external_uid' => __("identifiant Plat'AU"),
7781     'state' => __('état du versement'),
7782     );
7783     // Mapping entre la valeur 'object' de la table de liaison des identifiants
7784     // et la valeur de 'object' dans la tables des tâches
7785     $mapping_one_to_one_object_liiue_task = array(
7786     'dossier_autorisation' => 'creation_DA',
7787     'dossier' => 'creation_DI',
7788     'piece' => 'ajout_piece',
7789     'consultation' => 'creation_consultation',
7790     'instruction_action_cl' => 'envoi_CL',
7791     );
7792     // Traduction des états de versement
7793     $trad_state = array(
7794     'done' => sprintf('%s %s', __('terminé'), '[V]'),
7795     'pending' => __('en cours'),
7796     'error' => __('en erreur'),
7797     'new' => __('à réaliser'),
7798     );
7799     // Traduction des objets
7800     $trad_object = array(
7801     'dossier_autorisation' => __('dossier_autorisation'),
7802     'dossier' => __('dossier'),
7803     'piece' => __('pièce'),
7804     'dossier_consultation' => __('consultation'),
7805     'pec_dossier_consultation' => __('prise en compte'),
7806     'avis_dossier_consultation' => __('avis'),
7807     'instruction_action_cl' => __('instruction transmise au CL'),
7808     );
7809     // Instance de la table de liaison des identifiants
7810     $inst_liiue = $this->f->get_inst__om_dbform(array(
7811     "obj" => "lien_id_interne_uid_externe",
7812     "idx" => 0,
7813     ));
7814     // Instance de la table des tâches
7815     $inst_task = $this->f->get_inst__om_dbform(array(
7816     "obj" => "task",
7817     "idx" => 0,
7818     ));
7819     // Récupération de toutes les occurences du dossier en cours dans la table des
7820     // liaisons des identifiants
7821 softime 13137 $external_uids = $inst_liiue->get_all_lien_id_interne_uid_externe_by_dossier($this->getVal('dossier'), PLATAU);
7822 softime 11585 if (is_array($external_uids) === true && count($external_uids) > 0) {
7823     //
7824     foreach ($external_uids as $external_uid) {
7825    
7826     /**
7827     * Gestion de l'état du versement dans Plat'AU
7828     */
7829     // État par défaut
7830 softime 12654 $external_uid['state'] = __('N/A');
7831 softime 11585 // Tente d'identifier le type, dans certains cas il n'est pas
7832     // possible de le définir avec certitude
7833     $type = isset($mapping_one_to_one_object_liiue_task[$external_uid['object']]) === true ? $mapping_one_to_one_object_liiue_task[$external_uid['object']] : null;
7834     $search_values = array(
7835     sprintf('type = \'%s\'', $type),
7836     sprintf('object_id = \'%s\'', $external_uid['object_id']),
7837     sprintf('state != \'%s\'', $inst_task::STATUS_CANCELED),
7838     );
7839     // Si le type ne peut pas être défini avec certitude, alors on ne
7840     // l'inclut pas dans la recherche de la tâche
7841     if ($type === null) {
7842     unset($search_values[0]);
7843     }
7844     $task_exists = $inst_task->task_exists_multi_search($search_values);
7845     // Pour récupérer un état, il ne faut qu'un résultat
7846     if ($task_exists !== false) {
7847     //
7848     foreach ($task_exists as $task_value) {
7849     $external_uid['state'] = $task_value['state'];
7850     if ($task_value['state'] === 'pending') {
7851     break;
7852     }
7853     }
7854     }
7855     // Remplace les valeurs des états de versement par les traductions
7856     foreach ($trad_state as $key => $value) {
7857     if ($external_uid['state'] === $key) {
7858     $external_uid['state'] = $value;
7859     }
7860     }
7861    
7862     // Remplace les valeurs des états de versement par les traductions
7863     foreach ($trad_object as $key => $value) {
7864     if ($external_uid['object'] === $key) {
7865     $external_uid['object'] = __($value);
7866     }
7867     }
7868    
7869     //
7870     $val_notif = array();
7871     foreach($liste_champs as $key => $champ) {
7872     $val_notif[$champ] = $external_uid[$key];
7873     }
7874     array_push($val_suivi, $val_notif);
7875     }
7876     }
7877    
7878     // Passage du tableau au format json
7879     return json_encode($val_suivi, JSON_HEX_APOS);
7880     }
7881    
7882     /**
7883 softime 15218 * Récupère les codes de suivi du dossier et construit les liens pour afficher
7884     * le suivi de la demande dans le portail SVE.
7885     *
7886     * @return string
7887     */
7888     protected function get_json_lien_iiue_portal() {
7889     $portal_link_list = array();
7890     $display = __("Aucun enregistrement.");
7891     $this->set_is_portal_code_suivi(false);
7892     //
7893     $portal_link = $this->f->get_portal_code_suivi_base_url($this->getVal('om_collectivite'));
7894     if ($portal_link === null) {
7895     return __("Veuillez contacter votre administrateur pour configurer le lien vers iDE'AU avec le paramètre <i>portal_code_suivi_base_url</i>.");
7896     }
7897     // Instance de la table de liaison des identifiants
7898     $inst_liiue = $this->f->get_inst__om_dbform(array(
7899     "obj" => "lien_id_interne_uid_externe",
7900     "idx" => 0,
7901     ));
7902     // Instance de la table des tâches
7903     $inst_task = $this->f->get_inst__om_dbform(array(
7904     "obj" => "task",
7905     "idx" => 0,
7906     ));
7907     $external_uids = $inst_liiue->get_all_lien_id_interne_uid_externe_by_dossier($this->getVal('dossier'), PORTAL, 'code-suivi');
7908     if (is_array($external_uids) === true && count($external_uids) > 0) {
7909     foreach ($external_uids as $external_uid) {
7910     list($prefixe, $rest) = explode($inst_task::CS_PREFIX, $external_uid['external_uid'], 2);
7911     $portal_code_suivi = $rest;
7912     $portal_link_list[] = sprintf(
7913     '<a id="action-form-portal-suivi-demande-%s" class="simple-btn" title="%s" target="_blank" href="%s"><span class="om-icon om-icon-16 om-icon-fix consult-demat consult-16"></span>%s</a>',
7914     $external_uid['lien_id_interne_uid_externe'],
7915     __("Ouvrir le suivi de demande dans iDE'AU"),
7916     str_replace("[PORTAL_CODE_SUIVI]", $portal_code_suivi, $portal_link),
7917     $portal_code_suivi
7918     );
7919     }
7920     $display = implode('<br/>', $portal_link_list);
7921     $this->set_is_portal_code_suivi(true);
7922     }
7923     return $display;
7924     }
7925    
7926     /**
7927 mbroquet 3730 * Ajout de la liste des contraintes et des demandeurs
7928     */
7929     function formSpecificContent($maj) {
7930    
7931 softime 8477 // Récupère le CRUD
7932     $crud = $this->get_action_crud($this->getParameter("maj"));
7933    
7934     // Les contenus spécifiques ne sont pas affichés en cas de suppression
7935     if ($crud === 'delete') {
7936     return;
7937     }
7938    
7939 mbroquet 3730 /**
7940     * Liste des contraintes
7941     */
7942     //
7943     $listContrainte = $this->getListContrainte($this->getVal('dossier'));
7944    
7945 softime 12654 // Si le dossier possède des contraintes et qu'on n'est pas dans la vue "Journal d'instruction"
7946 softime 14542 if (count($listContrainte) != 0 && $maj !== "200") {
7947 mbroquet 3730
7948     // Affiche du fieldset
7949     printf("<div id=\"liste_contrainte\" class=\"demande_hidden_bloc\">");
7950     printf("<fieldset class=\"cadre ui-corner-all ui-widget-content col_12 startClosed\">");
7951     printf(" <legend class=\"ui-corner-all ui-widget-content ui-state-active\"
7952     id =\"fieldset_contraintes_liees\">"
7953     ._("dossier_contrainte")."</legend>");
7954     printf("<div class=\"fieldsetContent\" style=\"display: none;\">");
7955    
7956     // Entête pour le groupe
7957     $groupeHeader = "
7958     <div class='dossier_contrainte_groupe'>
7959     <div class='dossier_contrainte_groupe_header'>
7960     <span class='name'>
7961     %s
7962     </span>
7963     </div>
7964     ";
7965    
7966     // Entête pour le sous-groupe
7967     $sousgroupeHeader = "
7968     <div class='dossier_contrainte_sousgroupe'>
7969     <div class='dossier_contrainte_sousgroupe_header'>
7970     <span class='name'>
7971     %s
7972     </span>
7973     </div>
7974     ";
7975    
7976     // Titres des colonnes
7977     $tableHeader = "
7978     <thead>
7979     <tr class='ui-tabs-nav ui-accordion ui-state-default tab-title'>
7980     <th class='title col-0 firstcol contrainte_th_texte_complete'>
7981     <span class='name'>
7982     "._('texte_complete')."
7983     </span>
7984     </th>
7985     <th class='title col-1 contrainte_th_reference'>
7986     <span class='name'>
7987     "._('reference')."
7988     </span>
7989     </th>
7990     <th class='title col-2 contrainte_th_nature'>
7991     <span class='name'>
7992     "._('nature')."
7993     </span>
7994     </th>
7995     </tr>
7996     </thead>
7997     ";
7998    
7999     // Ligne de données
8000     $line = "
8001     <tr class='tab-data %s'>
8002     <td class='col-0 firstcol contrainte_th_texte_complete'>
8003     %s
8004     </td>
8005     <td class='col-1 contrainte_th_reference'>
8006     %s
8007     </td>
8008     <td class='col-2 contrainte_th_nature'>
8009     %s
8010     </td>
8011     ";
8012    
8013     // Sauvegarde des données pour les comparer
8014     $lastRow = array();
8015     $lastRow['contrainte_groupe'] = 'empty';
8016     $lastRow['contrainte_sousgroupe'] = 'empty';
8017    
8018     // Tant qu'il y a des résultats
8019 softime 14542 foreach ($listContrainte as $row) {
8020 mbroquet 3730 // Si l'identifiant du groupe de la contrainte présente et
8021     // celle d'avant est différent
8022     if ($row['contrainte_groupe'] != $lastRow['contrainte_groupe']) {
8023    
8024     // Si l'identifiant du groupe d'avant est vide
8025     if ($lastRow['contrainte_groupe'] != 'empty') {
8026     // Ferme le tableau
8027     printf("</table>");
8028     // Ferme le div
8029     printf("</div>");
8030     // Ferme le div
8031     printf("</div>");
8032     }
8033    
8034     // Affiche le header du groupe
8035     printf($groupeHeader, $row['contrainte_groupe']);
8036     }
8037    
8038     // Si l'identifiant du sous-groupe de la contrainte présente et
8039     // celle d'avant est différent
8040     // Ou qu'ils soient identique mais n'appartiennent pas au même groupe
8041     if ($row['contrainte_sousgroupe'] != $lastRow['contrainte_sousgroupe']
8042     || ($row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']
8043     && $row['contrainte_groupe'] != $lastRow['contrainte_groupe'])) {
8044    
8045     //
8046     if($row['contrainte_groupe'] == $lastRow['contrainte_groupe']) {
8047     // Si l'identifiant de la sous-groupe d'avant est vide
8048     if ($lastRow['contrainte_sousgroupe'] != 'empty') {
8049     // Ferme le tableau
8050     printf("</table>");
8051     // Ferme le div
8052     printf("</div>");
8053     }
8054     }
8055    
8056     // Affiche le header du sous-groupe
8057     printf($sousgroupeHeader, $row['contrainte_sousgroupe']);
8058    
8059     // Ouvre le tableau
8060     printf("<table id='sousgroupe_".$row['contrainte_sousgroupe']."' class='tab-tab dossier_contrainte_view'>");
8061    
8062     // Affiche le header des données
8063     printf($tableHeader);
8064    
8065     // Définis le style des lignes
8066     $style = 'odd';
8067     }
8068    
8069     // Si toujours dans la même groupe et même sous-groupe,
8070     // on change le style de la ligne
8071     if ($row['contrainte_groupe'] == $lastRow['contrainte_groupe']
8072     && $row['contrainte_sousgroupe'] == $lastRow['contrainte_sousgroupe']) {
8073     // Définis le style
8074     $style = ($style=='even')?'odd':'even';
8075     }
8076    
8077     // Affiche "Oui" ou "Non" pour le bouléen
8078     if ($row['dossier_contrainte_reference'] == 1
8079     || $row['dossier_contrainte_reference'] == "t"
8080     || $row['dossier_contrainte_reference'] == "Oui") {
8081     //
8082     $contrainte_reference = "Oui";
8083     } else {
8084     //
8085     $contrainte_reference = "Non";
8086     }
8087    
8088     // Affiche les données
8089     printf($line, $style,
8090     $row['dossier_contrainte_texte'],
8091     $contrainte_reference,
8092     $row['contrainte_nature']
8093     );
8094    
8095     // Sauvegarde les données
8096     $lastRow['contrainte_groupe'] = $row['contrainte_groupe'];
8097     $lastRow['contrainte_sousgroupe'] = $row['contrainte_sousgroupe'];
8098    
8099     }
8100     // Ferme le tableau
8101     printf("</table>");
8102     // Ferme le sous-groupe
8103     printf("</div>");
8104     // Ferme le groupe
8105     printf("</div>");
8106    
8107     printf("</div>");
8108    
8109     printf("<div class=\"visualClear\"></div>");
8110     // Ferme le fieldset content
8111     printf("</div>");
8112     printf("</fieldset>");
8113     }
8114     /**
8115     * Fin Liste des contraintes
8116     */
8117    
8118     /**
8119     * Liste des demandeurs
8120     */
8121 softime 6565 // Tableau des demandeurs selon le contexte
8122     $listeDemandeur = $this->valIdDemandeur;
8123     /**
8124     * Gestion du bloc des demandeurs
8125     */
8126     // Si le mode est (modification ou suppression ou consultation) ET que
8127     // le formulaire n'est pas correct (c'est-à-dire que le formulaire est
8128     // actif)
8129     if ($this->correct !== true AND
8130 softime 7996 $this->getParameter('validation') == 0 AND
8131     $this->getParameter("maj") != 0) {
8132 softime 6565 // Alors on récupère les demandeurs dans la table lien pour
8133     // affectation des résultats dans $this->valIdDemandeur
8134     $this->listeDemandeur("dossier", $this->getval($this->clePrimaire));
8135     $listeDemandeur = $this->valIdDemandeur;
8136     }
8137 mbroquet 3730
8138 softime 6565 // Récupération des valeurs postées
8139 softime 7996 if ($this->getParameter('validation') != 0) {
8140 softime 6565 $listeDemandeur = $this->postedIdDemandeur;
8141     }
8142    
8143 softime 12124 // Si le mode est (ajout ou modification)
8144     // ET que le mode n'est pas (journal d'instruction)
8145     // ET que le formulaire n'est pas correct
8146     // (c'est-à-dire que le formulaire est actif)
8147     if (($this->getParameter("maj") < 2 AND $this->correct !== true)) {
8148 softime 6565 // Alors on positionne le marqueur linkable a true qui permet
8149     // d'afficher ou non les actions de gestion des demandeurs
8150 mbroquet 3730 $linkable = true;
8151     } else {
8152 softime 6565 // Sinon on positionne le marqueur linkable a false qui permet
8153     // d'afficher ou non les actions de gestion des demandeurs
8154 mbroquet 3730 $linkable = false;
8155     }
8156 softime 6565 $affichage_form = $this->get_type_affichage_formulaire();
8157     // Pour les dossiers contentieux, il faut un droit spécifique pour visualiser le
8158     // fieldset "Demandeurs"
8159 softime 12124 if ($this->getParameter("maj") != 200 &&
8160     ($affichage_form === 'ADS' || $affichage_form === 'DPC' || $affichage_form === 'CONSULTATION ENTRANTE')
8161 softime 6565 OR ($affichage_form === 'CTX RE' AND $this->f->isAccredited('dossier_contentieux_recours_afficher_demandeurs') === true)
8162 softime 12124 OR ($affichage_form === 'CTX IN' AND $this->f->isAccredited('dossier_contentieux_infractions_afficher_demandeurs') === true)
8163     ) {
8164 mbroquet 3730
8165 softime 6565 // Conteneur de la listes des demandeurs
8166     echo "<div id=\"liste_demandeur\" class=\"demande_hidden_bloc col_12\">";
8167     echo "<fieldset id=\"fieldset-form-dossier_instruction-demandeur\" class=\"cadre ui-corner-all ui-widget-content startClosed\">";
8168     echo " <legend class=\"ui-corner-all ui-widget-content ui-state-active\">"
8169     ._("Demandeurs")."</legend>";
8170     echo "<div class=\"fieldsetContent\" style=\"display: none;\">";
8171 mbroquet 3730
8172 softime 6565
8173     // Pour les DI avec DA visible, dans tous les modes excepté en ajout et si l'option d'accès au
8174     // portail citoyen est activée
8175 mbroquet 3730 $inst_da = $this->get_inst_dossier_autorisation();
8176 softime 6565 if ($this->getParameter("maj") != 0
8177     && $this->f->is_option_citizen_access_portal_enabled() === true
8178     && $inst_da->is_dossier_autorisation_visible() === true) {
8179     // Instance du dossier d'autorisation
8180     //
8181     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'));
8182     }
8183     // Sélection des demandeur à afficher en fonction du paramétrage du type
8184     // du dossier d'autorisation.
8185     switch ($affichage_form) {
8186     case 'ADS':
8187 softime 10573 case 'CONSULTATION ENTRANTE':
8188 softime 6565 $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8189     break;
8190     case 'CTX RE':
8191     $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8192     $this->display_demandeur_requerant_avocat($listeDemandeur);
8193     break;
8194     case 'CTX IN':
8195     $this->display_demandeur_plaignant_contrevenant($listeDemandeur);
8196     break;
8197 softime 7067 case 'DPC':
8198     $this->display_demandeur_petitionnaire_delegataire($listeDemandeur);
8199     $this->display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur);
8200     break;
8201 softime 6565 }
8202 mbroquet 3730
8203     }
8204    
8205     echo "</fieldset>";
8206     echo "</div>";
8207     /**
8208     * Fin liste des demandeurs
8209     */
8210 fmichon 4708
8211     /**
8212     * Interface avec le référentiel ERP.
8213     *
8214     * On affiche le message uniquement si le dossier est connecté.
8215     */
8216 softime 6565 if ($this->getParameter('maj') == 3 && $this->is_connected_to_referentiel_erp() === true) {
8217 fmichon 4708 //
8218     printf(
8219     '<div class="col_12">
8220     Ce dossier est connecté au référentiel ERP.
8221     </div>'
8222     );
8223     }
8224    
8225 mbroquet 3730 }
8226    
8227     /**
8228 softime 6565 * Affiche le bloc d'affichage des demandeurs pour dossiers ADS avec actions.
8229     *
8230     * @param array $listeDemandeur Liste des demandeurs.
8231     */
8232     function display_demandeur_petitionnaire_delegataire($listeDemandeur) {
8233    
8234     // Affichage du bloc pétitionnaire principal / délégataire
8235     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8236     echo "<div id=\"petitionnaire_principal_delegataire\">";
8237     // Affichage de la synthèse du pétitionnaire principal
8238     $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire_principal");
8239     // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8240     echo "<div id=\"delegataire\">";
8241     // Affichage de la synthèse du délégataire
8242     $this->displaySyntheseDemandeur($listeDemandeur, "delegataire");
8243     echo "</div>";
8244 softime 10573 // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8245     echo "<div id=\"proprietaire\">";
8246     // Affichage de la synthèse du délégataire
8247     $this->displaySyntheseDemandeur($listeDemandeur, "proprietaire");
8248     echo "</div>";
8249     // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8250     echo "<div id=\"architecte_lc\">";
8251     // Affichage de la synthèse du délégataire
8252     $this->displaySyntheseDemandeur($listeDemandeur, "architecte_lc");
8253     echo "</div>";
8254     // L'ID DU DIV ET DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8255     echo "<div id=\"paysagiste\">";
8256     // Affichage de la synthèse du délégataire
8257     $this->displaySyntheseDemandeur($listeDemandeur, "paysagiste");
8258     echo "</div>";
8259 softime 6565 echo "<div class=\"both\"></div>";
8260     echo "</div>";
8261     // Bloc des pétitionnaires secondaires
8262     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8263     echo "<div id=\"listePetitionnaires\">";
8264     $this->displaySyntheseDemandeur($listeDemandeur, "petitionnaire");
8265     echo "</div>";
8266     }
8267    
8268     /**
8269     * Affiche le bloc d'affichage des demandeurs pour dossiers CTX recours
8270     * avec actions.
8271     *
8272     * @param array $listeDemandeur Liste des demandeurs.
8273     */
8274     function display_demandeur_plaignant_contrevenant($listeDemandeur) {
8275    
8276     echo "<div id=\"plaignant_contrevenant\">";
8277     // Affichage du bloc contrevenant
8278     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8279     echo "<div id=\"listeContrevenants\" class=\"col_12\">";
8280     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8281     echo "<div id=\"contrevenant_principal\">";
8282     // Affichage de la synthèse
8283     $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant_principal");
8284     echo "</div>";
8285     echo "<div id=\"listeAutresContrevenants\">";
8286     // Affichage de la synthèse
8287     $this->displaySyntheseDemandeur($listeDemandeur, "contrevenant");
8288     echo "</div>";
8289     echo "</div>";
8290     // Affichage du bloc plaignant
8291     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8292     echo "<div id=\"listePlaignants\" class=\"col_12\">";
8293     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8294     echo "<div id=\"plaignant_principal\">";
8295     // Affichage de la synthèse
8296     $this->displaySyntheseDemandeur($listeDemandeur, "plaignant_principal");
8297     echo "</div>";
8298     echo "<div id=\"listeAutresPlaignants\">";
8299     $this->displaySyntheseDemandeur($listeDemandeur, "plaignant");
8300     echo "</div>";
8301     echo "</div>";
8302     echo "</div>";
8303    
8304     }
8305    
8306     /**
8307     * Affiche le bloc d'affichage des demandeurs pour dossiers CTX infraction
8308     * avec actions.
8309     *
8310     * @param array $listeDemandeur Liste des demandeurs.
8311     */
8312     function display_demandeur_requerant_avocat($listeDemandeur) {
8313     echo "<div id=\"requerant_avocat\">";
8314     // Affichage du bloc requérant
8315     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8316     echo "<div id=\"listeRequerants\" class=\"col_12\">";
8317     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8318     echo "<div id=\"requerant_principal\">";
8319     // Affichage de la synthèse
8320     $this->displaySyntheseDemandeur($listeDemandeur, "requerant_principal");
8321     echo "</div>";
8322     echo "<div id=\"listeAutresRequerants\">";
8323     $this->displaySyntheseDemandeur($listeDemandeur, "requerant");
8324     echo "</div>";
8325     echo "</div>";
8326     // Affichage du bloc avocat
8327     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8328     echo "<div id=\"listeAvocat\" class=\"col_12\">";
8329     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8330     echo "<div id=\"avocat_principal\">";
8331     $this->displaySyntheseDemandeur($listeDemandeur, "avocat_principal");
8332     echo "</div>";
8333     echo "<div id=\"listeAutresAvocats\">";
8334     $this->displaySyntheseDemandeur($listeDemandeur, "avocat");
8335     echo "</div>";
8336     echo "</div>";
8337     echo "</div>";
8338     echo "</fieldset>";
8339     // Champ flag permettant de récupérer la valeur de l'option sig pour
8340     // l'utiliser en javascript, notamment lors du chargement de l'interface
8341     // pour les références cadastrales
8342     // XXX Si un widget pour les références cadastrales existait, il n'y
8343     // aurait pas besoin de faire cela
8344     echo "<input id='option_sig' type='hidden' value='".$this->f->getParameter("option_sig")."' name='option_sig'>";
8345     echo "</div>";
8346     }
8347    
8348    
8349 softime 7067 /**
8350     * Affiche le bloc d'affichage des demandeurs pour dossiers DPC avec actions.
8351     *
8352     * @param array $listeDemandeur Liste des demandeurs.
8353     */
8354     function display_demandeur_petitionnaire_delegataire_bailleur($listeDemandeur) {
8355    
8356     // Affichage du bloc pétitionnaire principal / délégataire / bailleur
8357     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8358     echo "<div id=\"petitionnaire_principal_delegataire_bailleur\">";
8359     // Doit être utilisé avec la div petitionnaire_principal_delegataire
8360     echo "<div id=\"listeBailleurs\" class=\"col_12\">";
8361     // L'ID DU DIV SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8362     echo "<div id=\"bailleur_principal\">";
8363     // Affichage de la synthèse
8364     $this->displaySyntheseDemandeur($listeDemandeur, "bailleur_principal");
8365     echo "</div>";
8366     echo "<div id=\"listeAutresBailleurs\">";
8367     $this->displaySyntheseDemandeur($listeDemandeur, "bailleur");
8368     echo "</div>";
8369     echo "</div>";
8370     echo "</div>";
8371     }
8372    
8373    
8374 softime 6565 function displaySyntheseDemandeur($listeDemandeur, $type) {
8375     // Si le mode est (ajout ou modification) ET que le formulaire n'est pas
8376     // correct (c'est-à-dire que le formulaire est actif)
8377     if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
8378     // Alors on positionne le marqueur linkable a true qui permet
8379     // d'afficher ou non les actions de gestion des demandeurs
8380     $linkable = true;
8381     } else {
8382     // Sinon on positionne le marqueur linkable a false qui permet
8383     // d'afficher ou non les actions de gestion des demandeurs
8384     $linkable = false;
8385     }
8386     // Récupération du type de demandeur pour l'affichage
8387     switch ($type) {
8388     case 'petitionnaire_principal':
8389     $legend = _("Petitionnaire principal");
8390     break;
8391    
8392     case 'delegataire':
8393     $legend = _("Autre correspondant");
8394     break;
8395    
8396     case 'petitionnaire':
8397     $legend = _("Petitionnaire");
8398     break;
8399    
8400     case 'contrevenant_principal':
8401     $legend = _("Contrevenant principal");
8402     break;
8403    
8404     case 'contrevenant':
8405     $legend = _("Autre contrevenant");
8406     break;
8407    
8408     case 'plaignant_principal':
8409     $legend = _("Plaignant principal");
8410     break;
8411    
8412     case 'plaignant':
8413     $legend = _("Autre plaignant");
8414     break;
8415    
8416     case 'requerant_principal':
8417     $legend = _("Requérant principal");
8418     break;
8419    
8420     case 'requerant':
8421     $legend = _("Autre requérant");
8422     break;
8423    
8424     case 'avocat_principal':
8425     $legend = _("Avocat principal");
8426     break;
8427    
8428     case 'avocat':
8429     $legend = _("Autre avocat");
8430     break;
8431 softime 7067
8432     case 'bailleur_principal':
8433     $legend = _("Bailleur principal");
8434     break;
8435    
8436     case 'bailleur':
8437     $legend = _("Bailleur");
8438     break;
8439 softime 10573
8440     case 'proprietaire':
8441     $legend = __("Propriétaire");
8442     break;
8443    
8444     case 'architecte_lc':
8445     $legend = __("Architecte législation connexe");
8446     break;
8447    
8448     case 'paysagiste':
8449     $legend = __("Concepteur-Paysagiste");
8450     break;
8451 softime 6565 }
8452     foreach ($listeDemandeur[$type] as $demandeur_id) {
8453     $obj = str_replace('_principal', '', $type);
8454 softime 7996 $demandeur = $this->f->get_inst__om_dbform(array(
8455     "obj" => $obj,
8456     "idx" => $demandeur_id,
8457     ));
8458 softime 6565 $demandeur -> afficherSynthese($type, $linkable);
8459     $demandeur -> __destruct();
8460     }
8461     // Si en édition de formulaire
8462     if ($this->getParameter("maj") < 2 AND $this->correct !== true) {
8463     // Bouton d'ajout du avocat
8464     // L'ID DE L'INPUT SUIVANT EST NECESSAIRE AU BON FONCTIONNEMENT DU JS
8465     echo "<a id=\"add_".$type."\"
8466     class=\"om-form-button add-16\">".
8467     $legend.
8468     "</a>";
8469     }
8470     }
8471 softime 14064
8472 softime 6565 /**
8473 mbroquet 3730 * Retourne le statut du dossier
8474     * @return string Le statut du dossier d'instruction
8475     */
8476     function getStatut(){
8477 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
8478     "obj" => 'etat',
8479     "idx" => $this->getVal("etat"),
8480     ));
8481     return $etat->getVal('statut');
8482 mbroquet 3730 }
8483 softime 5024
8484 mbroquet 3730 /**
8485 softime 5024 * Retourne le dernier événement lié au dossier instancié
8486     *
8487     * @return [string] ID du dernier événement
8488     */
8489     function get_dernier_evenement() {
8490 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8491     sprintf(
8492     'SELECT
8493     MAX(instruction)
8494     FROM
8495     %1$sinstruction
8496     WHERE
8497     dossier = \'%2$s\'',
8498     DB_PREFIXE,
8499     $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8500     ),
8501     array(
8502     "origin" => __METHOD__,
8503     )
8504 softime 12847 );
8505 softime 14064
8506     return $qres["result"];
8507 softime 5024 }
8508    
8509     /**
8510 mbroquet 3730 * Retourne l'identifiant du rapport d'instruction lié du dossier
8511     * @return string L'identifiant du rapport d'instruction lié du dossier
8512     */
8513 softime 6565 function getRapportInstruction() {
8514 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8515     sprintf(
8516     'SELECT
8517     rapport_instruction
8518     FROM
8519     %1$srapport_instruction
8520     WHERE
8521     dossier_instruction = \'%2$s\'',
8522     DB_PREFIXE,
8523     $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8524     ),
8525     array(
8526     "origin" => __METHOD__
8527     )
8528 softime 12847 );
8529 mbroquet 3730
8530 softime 14064 return $qres["result"];
8531 mbroquet 3730 }
8532    
8533     /**
8534     * Retourne l'identifiant des données techniques liées du dossier
8535     * @return string L'identifiant des données techniques liées du dossier
8536     */
8537 softime 6565 function getDonneesTechniques() {
8538 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8539     sprintf(
8540     'SELECT
8541     donnees_techniques
8542     FROM
8543     %1$sdonnees_techniques
8544     WHERE
8545     dossier_instruction = \'%2$s\'',
8546     DB_PREFIXE,
8547     $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
8548     ),
8549     array(
8550     "origin" => __METHOD__,
8551     )
8552     );
8553 mbroquet 3730
8554 softime 14064 return $qres["result"];
8555 mbroquet 3730 }
8556    
8557     /**
8558 softime 12847 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
8559     *
8560     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
8561     * la vue 'sousformulaire'.
8562     *
8563     * @return string
8564 mbroquet 3730 */
8565 softime 12847 function get_back_link($view = "formulaire") {
8566     $baseURL = OM_ROUTE_TAB;
8567     $paramsHref = array(
8568     'premier' => $this->getParameter("premier"),
8569     'tricol' => $this->getParameter("tricol"),
8570     'advs_id' => $this->getParameter("advs_id"),
8571     'valide' => $this->getParameter("valide")
8572     );
8573 mbroquet 3730
8574 softime 12847 // Si on vient d'un widget de recherche paramétrable avec un message d'aide paramétré
8575     if (empty($this->f->get_submitted_get_value("message_help")) === false) {
8576     // On ajoute le message d'aide dans l'url de retour
8577     $paramsHref['message_help'] = urlencode($this->f->get_submitted_get_value("message_help"));
8578     }
8579    
8580 mbroquet 3730 if($this->getParameter("idx_dossier") != "") {
8581 softime 12847 $paramsHref['obj'] = "recherche_dossier";
8582     } else {
8583     if($this->getParameter("retour") == "form") {
8584     $paramsHref['idx'] = $this->getParameter("idx");
8585     $paramsHref['action'] = '3';
8586     if (!($this->getParameter("validation") > 0 && $this->getParameter("maj") == 2 && $this->correct)) {
8587     $baseURL = OM_ROUTE_FORM;
8588 mbroquet 3730
8589 softime 12847 }
8590 mbroquet 3730 }
8591 softime 12847 $paramsHref['obj'] = $this->f->get_submitted_get_value('retour_widget') !== null ?
8592     $this->f->get_submitted_get_value('retour_widget') :
8593     $this->get_absolute_class_name();
8594    
8595 softime 11228 if ($this->f->get_submitted_get_value('widget_recherche_id') !== null) {
8596 softime 12847 $paramsHref['widget_recherche_id'] = $this->f->get_submitted_get_value('widget_recherche_id');
8597 softime 11228 }
8598 softime 12847 if (empty($this->f->get_submitted_get_value('retourformulaire2')) === false) {
8599     $paramsHref['retourformulaire'] = $this->f->get_submitted_get_value('retourformulaire2');
8600 mbroquet 3730 }
8601     }
8602    
8603 softime 12847 // Construction du lien à partir des valeurs stockées dans le tableau
8604     $href = array_map(function ($key, $value) {
8605     return '&'.$key.'='.$value;
8606     }, array_keys($paramsHref), $paramsHref);
8607     $href = $baseURL.implode('', $href);
8608    
8609     return $href;
8610 mbroquet 3730 }
8611    
8612     /**
8613 softime 12847 * Surcharge du bouton retour afin de retourner sur la recherche de dossiers
8614     * d'instruction existant.
8615     */
8616     function retour($premier = 0, $recherche = "", $tricol = "") {
8617     $css_class = "retour";
8618     // Récupération du lien de redirection
8619     $href = str_replace(
8620     "&",
8621     "&amp;",
8622     $this->get_back_link("formulaire")
8623     );
8624     // Affichage du bouton retour avec le lien et la classe voulues
8625     $this->f->layout->display_form_retour(array(
8626     "id" => "form-action-".$this->get_absolute_class_name()."-back-".uniqid(),
8627     "href" => $href,
8628     "class" => $css_class,
8629     ));
8630     }
8631    
8632     /**
8633 mbroquet 3730 * Permet de modifier le fil d'Ariane
8634     * @param string $ent Fil d'Ariane
8635     * @param array $val Valeurs de l'objet
8636     * @param intger $maj Mode du formulaire
8637     */
8638     function getFormTitle($ent) {
8639    
8640     // Fil d'Ariane
8641 softime 6565 $type_aff_form = $this->get_type_affichage_formulaire();
8642     switch ($type_aff_form) {
8643 softime 7067 case 'DPC':
8644 softime 6565 case 'ADS':
8645     $ent = _("instruction")." -> "._("dossiers d'instruction");
8646     break;
8647     case 'CTX IN':
8648     $ent = _("contentieux")." -> "._("infraction");
8649     break;
8650     case 'CTX RE':
8651     $ent = _("contentieux")." -> "._("recours");
8652     break;
8653 softime 10573 case 'CONSULTATION ENTRANTE':
8654     $ent = __("instruction")." -> ".__("dossiers de consultation");
8655 softime 6565 }
8656 mbroquet 3730
8657     // Si différent de l'ajout
8658     if($this->getParameter("maj") != 0) {
8659     // Si le champ dossier_libelle existe
8660     if (trim($this->getVal("dossier_libelle")) != '') {
8661     $ent .= " -> ".strtoupper($this->getVal("dossier_libelle"));
8662     }
8663 softime 6565 // Si contexte ADS
8664     if ($type_aff_form ==='ADS'
8665     && trim($this->getVal("dossier")) != '') {
8666 mbroquet 3730 $demandeur = $this->get_demandeur($this->getVal("dossier"));
8667     // Si le demandeur existe
8668     if (isset($demandeur) && trim($demandeur) != '') {
8669     $ent .= " ".mb_strtoupper($demandeur, "UTF-8");
8670     }
8671     }
8672 softime 10968
8673     // Dans le cas d'un dossier d'instruction issu d'un dépôt électronique
8674     // applique un style spécifique sur le fil d'Arianne
8675     if ($this->getVal('depot_electronique') === 't') {
8676     $this->f->addStyleForTitle("demat-color-breadcrumb");
8677     }
8678 mbroquet 3730 }
8679    
8680 softime 7996 // Change le fil d'Ariane pour l'interface de géolocalisation automatique des DI
8681     if ($this->getParameter("maj") == 126) {
8682     $ent = _("administration")." -> "._("options avancées")." -> "._("Géolocalisation des dossiers");
8683     }
8684    
8685 mbroquet 3730 // Change le fil d'Ariane
8686     return $ent;
8687     }
8688    
8689     /**
8690     * Récupère le demandeur du dossier
8691     * @return string Identifiant du dossier
8692     */
8693     private function get_demandeur($dossier) {
8694 softime 14064 // Requête SQL
8695     $qres = $this->f->get_one_result_from_db_query(
8696     sprintf(
8697     'SELECT
8698     CASE
8699     WHEN demandeur.qualite = \'particulier\' THEN TRIM(
8700     CONCAT(
8701     demandeur.particulier_nom,
8702     \' \',
8703     demandeur.particulier_prenom
8704     )
8705     )
8706     ELSE TRIM(
8707     CONCAT(
8708     demandeur.personne_morale_raison_sociale,
8709     \' \',
8710     demandeur.personne_morale_denomination
8711     )
8712     )
8713 mbroquet 3730 END as demandeur
8714 softime 14064 FROM
8715     %1$sdossier
8716     LEFT JOIN %1$slien_dossier_demandeur
8717     ON lien_dossier_demandeur.dossier=dossier.dossier
8718     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
8719     LEFT JOIN %1$sdemandeur
8720 mbroquet 3730 ON lien_dossier_demandeur.demandeur=demandeur.demandeur
8721 softime 14064 WHERE
8722     dossier.dossier = \'%2$s\'',
8723     DB_PREFIXE,
8724     $this->f->db->escapeSimple($dossier)
8725     ),
8726     array(
8727     "origin" => __METHOD__,
8728     )
8729 softime 12847 );
8730 softime 14064
8731     return $qres["result"];
8732 mbroquet 3730 }
8733    
8734     /**
8735     * Récupère la durée de validité
8736     * @param string $dossier_autorisation Identifiant dossier d'autorisation
8737     * @return intger Durée de validité
8738     */
8739 softime 10573 function get_duree_validite($dossier_autorisation, $force_param = false) {
8740 mbroquet 3730
8741     // Récupère le numéro de version
8742     $numeroVersion = $this->getNumeroVersion($dossier_autorisation);
8743    
8744     // Si c'est l'ajout du dossier initial
8745 softime 10573 if ($numeroVersion < 0 || $force_param === true) {
8746 mbroquet 3730
8747     // Récupération de la duree de validite depuis la table
8748     // "dossier_autorisation_type_detaille"
8749 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8750     sprintf(
8751     'SELECT
8752     duree_validite_parametrage
8753     FROM
8754     %1$sdossier_autorisation_type_detaille
8755     LEFT JOIN %1$sdossier_autorisation
8756     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8757     WHERE
8758     dossier_autorisation.dossier_autorisation = \'%2$s\'',
8759     DB_PREFIXE,
8760     $this->f->db->escapeSimple($dossier_autorisation)
8761     ),
8762     array(
8763     "origin" => __METHOD__,
8764     )
8765 softime 12847 );
8766 softime 14064 $duree_validite = $qres["result"];
8767    
8768 mbroquet 3730 } else {
8769    
8770     // Récupération de la duree de validite depuis le P0
8771 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8772     sprintf(
8773     'SELECT
8774     duree_validite
8775     FROM
8776     %1$sdossier
8777     LEFT JOIN %1$sdossier_autorisation
8778     ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
8779     WHERE
8780     dossier_autorisation.dossier_autorisation = \'%2$s\'
8781     AND dossier.version = 0',
8782     DB_PREFIXE,
8783     $this->f->db->escapeSimple($dossier_autorisation)
8784     ),
8785     array(
8786     "origin" => __METHOD__,
8787     )
8788 softime 12847 );
8789 softime 14064 $duree_validite = $qres["result"];
8790 mbroquet 3730 }
8791 softime 11876 // Vérifie si la duree de validité a bien été récupérée. Si ce n'est pas le cas
8792     // la duree de validite est mise à 0 par défaut pour ne pas bloquer le traitement
8793     // (notamment en modification du dossier) et on affiche le problème dans les logs.
8794     try {
8795     if (! isset($duree_validite) || $duree_validite == null || $duree_validite == '') {
8796     $duree_validite = '0';
8797     throw new UnexpectedValueException('Unexpected NULL value');
8798     }
8799     } catch (UnexpectedValueException $e) {
8800     $this->addToLog(
8801     $e.
8802     ' : '.
8803     _("Erreur : la récupération de la durée de validité à échouée pour le dossier : ").
8804     $dossier_autorisation
8805     );
8806     }
8807 mbroquet 3730
8808     // retourne le résultat
8809     return $duree_validite;
8810    
8811     }
8812    
8813     /**
8814     * Ajoute les parcelles du dossier passé en paramètre et met à jour le
8815     * quartier du dossier.
8816     * @param string $dossier Identifiant du dossier
8817     * @param string $terrain_references_cadastrales Références cadastrales du
8818     * dossier
8819     */
8820     function ajouter_dossier_parcelle($dossier, $terrain_references_cadastrales) {
8821    
8822     // Parse les parcelles
8823     $list_parcelles = $this->f->parseParcelles($terrain_references_cadastrales, $this->getVal('om_collectivite'));
8824    
8825     // A chaque parcelle une nouvelle ligne est créée dans la table
8826     // dossier_parcelle
8827     foreach ($list_parcelles as $parcelle) {
8828    
8829     // Instance de la classe dossier_parcelle
8830 softime 7996 $dossier_parcelle = $this->f->get_inst__om_dbform(array(
8831     "obj" => "dossier_parcelle",
8832     "idx" => "]",
8833     ));
8834 mbroquet 3730
8835     // Valeurs à sauvegarder
8836     $value = array(
8837     'dossier_parcelle' => '',
8838     'dossier' => $dossier,
8839     'parcelle' => '',
8840     'libelle' => $parcelle['quartier']
8841     .$parcelle['section']
8842     .$parcelle['parcelle']
8843     );
8844    
8845     // Ajout de la ligne
8846 softime 8989 $dossier_parcelle->ajouter($value);
8847 mbroquet 3730 }
8848    
8849     // Si la liste des parcelles n'est pas vide
8850     if (count($list_parcelles) > 0) {
8851    
8852     // Récupère le code impôt de la première référence cadastrale
8853     $quartier_code_impots = $list_parcelles[0]['quartier'];
8854     // Récupère l'identifiant du quartier
8855     $quartier = $this->get_quartier_by_code_impot($quartier_code_impots);
8856    
8857     // Ajoute le quartier au dossier
8858     $this->modifier_quartier_dossier($dossier, $quartier);
8859     }
8860     }
8861    
8862     /**
8863     * Supprime les parcelles du dossier passé en paramètre et met à jour le
8864     * quartier du dossier.
8865     * @param string $dossier Identifiant du dossier
8866     */
8867     function supprimer_dossier_parcelle($dossier) {
8868    
8869     // Suppression des parcelles du dossier
8870     $sql = "DELETE FROM ".DB_PREFIXE."dossier_parcelle
8871     WHERE dossier='".$dossier."'";
8872 softime 8989 $res = $this->f->db->query($sql);
8873 softime 12847 $this->addToLog(
8874     __METHOD__."(): db->query(\"".$sql."\");",
8875     VERBOSE_MODE
8876     );
8877     $this->f->isDatabaseError($res);
8878 mbroquet 3730
8879     // Supprime le quartier dans dossier
8880     $this->modifier_quartier_dossier($dossier);
8881     }
8882    
8883     /**
8884     * Modifie le quartier au dossier.
8885     * @param string $dossier Numéro du dossier
8886     * @param integer $quartier Identifiant du quartier
8887     */
8888     function modifier_quartier_dossier($dossier, $quartier = null) {
8889    
8890     // Valeurs à mettre à jour
8891     $valF = array();
8892     $valF['quartier'] = $quartier;
8893    
8894     // Met à jour le quartier du dossier
8895     $cle = " dossier='".$dossier."'";
8896 softime 8989 $res = $this->f->db->autoExecute(
8897 mbroquet 3730 DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
8898     $this->addToLog("ajouter_quartier_dossier(): db->autoexecute(\""
8899     .DB_PREFIXE."dossier\", ".print_r($valF, true)
8900     .", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
8901     $this->f->isDatabaseError($res);
8902     }
8903    
8904     /**
8905     * Récupère le quartier par rapport au code impôts.
8906     * @param string $code_impots Code impôts du quartier
8907     *
8908     * @return integer Identifiant du quartier
8909     */
8910     function get_quartier_by_code_impot($code_impots) {
8911    
8912     // Initialisation résultat
8913     $quartier = null;
8914    
8915     // Si la condition n'est pas vide
8916     if ($code_impots != ""
8917     && $code_impots != null) {
8918    
8919     // Requête SQL
8920 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8921     sprintf(
8922     'SELECT
8923     quartier
8924     FROM
8925     %1$squartier
8926     WHERE
8927     code_impots = \'%2$s\'',
8928     DB_PREFIXE,
8929     $this->f->db->escapeSimple($code_impots)
8930     ),
8931     array(
8932     "origin" => __METHOD__,
8933     )
8934     );
8935     $quartier = $qres["result"];
8936 mbroquet 3730 }
8937    
8938     // Retourne résultat
8939     return $quartier;
8940     }
8941 softime 9245
8942     /**
8943     * TREATMENT - update_initial_dt.
8944     *
8945     * Cette méthode ajoute les données techniques initiales d'un DI au format JSON.
8946     *
8947     * @return boolean
8948     */
8949     public function update_initial_dt($dt_json) {
8950     //
8951     $this->begin_treatment(__METHOD__);
8952     //
8953     if ($dt_json === null || $dt_json === '') {
8954     return $this->end_treatment(__METHOD__, false);
8955     }
8956     //
8957     $this->correct = true;
8958     $data = array();
8959     $data["initial_dt"] = $dt_json;
8960     //
8961     $res = $this->f->db->autoExecute(
8962     sprintf('%s%s', DB_PREFIXE, $this->table),
8963     $data,
8964     DB_AUTOQUERY_UPDATE,
8965     sprintf("%s = '%s'", $this->clePrimaire, $this->valF[$this->clePrimaire])
8966     );
8967     $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);
8968     if ($this->f->isDatabaseError($res, true) === true) {
8969     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
8970     $this->correct = false;
8971     return $this->end_treatment(__METHOD__, false);
8972     }
8973     return $this->end_treatment(__METHOD__, true);
8974     }
8975    
8976    
8977 mbroquet 3730
8978     /**
8979     * Méthode permettant d'ajouter les données techniques d'un DI.
8980     *
8981 softime 14064 * @param integer $id identifiant du dossier d'instruction
8982 mbroquet 3730 * @param array $val tableau de valeurs postées via le formulaire
8983     *
8984     * @return boolean false si erreur
8985     */
8986 softime 8989 function ajoutDonneesTechniquesDI($id, $val) {
8987 mbroquet 3730
8988     //On vérifie que le dossier d'autorisation a des données techniques
8989 softime 14064 $qres = $this->f->get_all_results_from_db_query(
8990     sprintf(
8991     'SELECT
8992     *
8993     FROM
8994     %1$sdonnees_techniques
8995     WHERE
8996     dossier_autorisation = \'%2$s\'',
8997     DB_PREFIXE,
8998     $this->f->db->escapeSimple($this->valF["dossier_autorisation"])
8999     ),
9000     array(
9001     "origin" => __METHOD__,
9002     "force_return" => true,
9003     )
9004     );
9005     if ($qres['code'] === 'KO') {
9006 mbroquet 3730 $this->f->addToLog(__METHOD__."() : ERROR - Erreur de base de données. Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
9007     return false;
9008     }
9009 softime 14064 $valF = $qres['result'][0];
9010    
9011 mbroquet 3730 //Si le dossier d'autorisation a des données techniques
9012 softime 14064 if (count($valF) > 0) {
9013 mbroquet 3730 //
9014 softime 7996 $dtdi = $this->f->get_inst__om_dbform(array(
9015     "obj" => "donnees_techniques",
9016     "idx" => "]",
9017     ));
9018 softime 14064 // Récupération de la dernière version du CERFA
9019     $inst_da = $this->get_inst_dossier_autorisation($valF['dossier_autorisation']);
9020     $inst_datd = $this->get_inst_dossier_autorisation_type_detaille($inst_da->getVal('dossier_autorisation_type_detaille'));
9021     $inst_cerfa = $this->get_inst_cerfa($inst_datd->getVal('cerfa'));
9022     // Conserve seulement les données affichées par la nouvelle version du CERFA
9023     foreach ($valF as $champ => $value) {
9024     if (array_search($champ, $inst_cerfa->champs) !== false) {
9025     if ($inst_cerfa->getVal($champ) == 'f') {
9026     $valF[$champ] = null;
9027     }
9028     }
9029     }
9030 softime 9245
9031     //Sauvegarde des données techniques initiales
9032     //Conversion en JSON
9033     $dt_json = json_encode($valF);
9034    
9035     //Enregistrement en BDD
9036     $sauvegarde_bdd = $this->update_initial_dt($dt_json);
9037    
9038     //Gestion des erreurs
9039     if ($sauvegarde_bdd === false){
9040     $msg_error = __("Erreur de base de données. Impossible de sauvegarder les données techniques du dossier d'instruction au format JSON.");
9041     $this->f->addToLog(sprintf(
9042     "%s() : ERREUR - %s",
9043     __METHOD__,
9044     $msg_error
9045     ));
9046     $this->addToMessage(sprintf(
9047     "%s %s",
9048     $msg_error,
9049     __("Veuillez contacter votre administrateur.")
9050     ));
9051    
9052     return false;
9053     }
9054    
9055 softime 14064 // Modification pour avoir la dernière version du CERFA
9056     $valF["cerfa"] = $inst_cerfa->getVal($inst_cerfa->clePrimaire);
9057 mbroquet 3730 //Suppression de l'identifiant
9058     $valF["donnees_techniques"] = null;
9059     // Ajout du numéro de dossier d'instruction
9060     $valF['dossier_instruction'] = $this->valF['dossier'];
9061     // Suppression du numéro de dossier d'autorisation
9062     $valF['dossier_autorisation'] = null;
9063     // Ajout des données techniques
9064 softime 8989 if($dtdi->ajouter($valF) === false) {
9065 mbroquet 3730 $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les données techniques du dossier d'instruction.", DEBUG_MODE);
9066 softime 14064 $this->f->addToLog(__METHOD__."() : ".$dtdi->msg, DEBUG_MODE);
9067 mbroquet 3730 return false;
9068     }
9069     }
9070     else {
9071     //Le dossier d'autorisation n'a pas de données techniques
9072     $this->f->addToLog(__METHOD__."() : ERROR - le DA n'a pas de données techniques.", DEBUG_MODE);
9073     return -1;
9074     }
9075    
9076     //
9077     return true;
9078     }
9079    
9080     /**
9081 softime 12433 * Méthode permettant d'ajouter le dossier operateur d'un DI.
9082     *
9083     * @param integer $id identifiant de la demande
9084     * @param array $val tableau de valeurs postées via le formulaire
9085     *
9086     * @return boolean false si erreur
9087     */
9088     function ajoutDossierOperateurDI($id, $val) {
9089     //
9090     $dodi = $this->f->get_inst__om_dbform(array(
9091     "obj" => "dossier_operateur",
9092     "idx" => "]",
9093     ));
9094    
9095     $valF = array();
9096     foreach ($dodi->champs as $champ) {
9097     $valF[$champ] = null;
9098     }
9099     // Ajout du numéro de dossier d'instruction
9100     $valF['dossier_instruction'] = $this->valF['dossier'];
9101     // Ajout du dossier operateur
9102     if($dodi->ajouter($valF) === false) {
9103     $this->f->addToLog(__METHOD__."() : ERROR - Impossible d'ajouter les dossier opérateur du dossier d'instruction.", DEBUG_MODE);
9104     return false;
9105     }
9106    
9107     //
9108     return true;
9109     }
9110    
9111     /**
9112 mbroquet 3730 * VIEW - contrainte.
9113     *
9114     * Vue des contraintes du dossier
9115     *
9116     * Cette vue permet de gérer le contenu de l'onglet "Contrainte(s)" sur un
9117     * dossier. Cette vue spécifique est nécessaire car l'ergonomie standard du
9118     * framework ne prend pas en charge ce cas.
9119     * C'est ici la vue spécifique des contraintes liées au dossier qui est
9120     * affichée directement au clic de l'onglet au lieu du soustab.
9121     *
9122     * L'idée est donc de simuler l'ergonomie standard en créant un container
9123     * et d'appeler la méthode javascript 'ajaxit' pour charger le contenu
9124     * de la vue visualisation de l'objet lié.
9125     *
9126     * @return void
9127     */
9128     function view_contrainte() {
9129     // Vérification de l'accessibilité sur l'élément
9130     $this->checkAccessibility();
9131     // Récupération des variables GET
9132     ($this->f->get_submitted_get_value('idxformulaire')!==null ? $idxformulaire =
9133     $this->f->get_submitted_get_value('idxformulaire') : $idxformulaire = "");
9134     ($this->f->get_submitted_get_value('retourformulaire')!==null ? $retourformulaire =
9135     $this->f->get_submitted_get_value('retourformulaire') : $retourformulaire = "");
9136 softime 6565 $obj = "dossier_contrainte";
9137     $type_aff_form = $this->get_type_affichage_formulaire();
9138     if ($type_aff_form === 'CTX RE' OR $type_aff_form === 'CTX IN') {
9139     $obj = "dossier_contrainte_contexte_ctx";
9140     }
9141 mbroquet 3730 // Objet à charger
9142     // Construction de l'url de sousformulaire à appeler
9143 softime 7996 $url = OM_ROUTE_SOUSFORM."&obj=".$obj;
9144 mbroquet 3730 $url .= "&action=4";
9145 softime 6929 $url .= "&idx=".$idxformulaire;
9146 mbroquet 3730 $url .= "&retourformulaire=".$retourformulaire;
9147     $url .= "&idxformulaire=".$idxformulaire;
9148     $url .= "&retour=form";
9149     // Affichage du container permettant le reffraichissement du contenu
9150     // dans le cas des action-direct.
9151     printf('
9152     <div id="sousform-href" data-href="%s">
9153     </div>',
9154     $url
9155     );
9156     // Affichage du container permettant de charger le retour de la requête
9157     // ajax récupérant le sous formulaire.
9158     printf('
9159     <div id="sousform-%s">
9160     </div>
9161     <script>
9162     ajaxIt(\'%s\', \'%s\');
9163     </script>',
9164     $obj,
9165     $obj,
9166     $url
9167     );
9168     }
9169    
9170     /**
9171     * Cette methode permet d'afficher le bouton de validation du formulaire
9172     *
9173     * @param integer $maj Mode de mise a jour
9174     * @return void
9175     */
9176     function bouton($maj) {
9177    
9178     if (!$this->correct
9179     && $this->checkActionAvailability() == true) {
9180     //
9181     switch($maj) {
9182     case 0 :
9183     $bouton = _("Ajouter");
9184     break;
9185     case 1 :
9186     $bouton = _("Modifier");
9187     break;
9188     case 2 :
9189     $bouton = _("Supprimer");
9190     break;
9191 softime 12124 case 200 :
9192     return;
9193 mbroquet 3730 default :
9194     // Actions specifiques
9195     if ($this->get_action_param($maj, "button") != null) {
9196     //
9197     $bouton = $this->get_action_param($maj, "button");
9198     } else {
9199     //
9200     $bouton = _("Valider");
9201     }
9202     break;
9203     }
9204     //
9205     $params = array(
9206     "value" => $bouton,
9207     "name" => "submit",
9208     "onclick"=>"return getDataFieldReferenceCadastrale();",
9209     );
9210     //
9211     $this->f->layout->display_form_button($params);
9212     }
9213    
9214     }
9215    
9216     /**
9217 softime 6929 * Récupère l'instance de paramétrage des taxes.
9218 mbroquet 3730 *
9219     * @param integer $taxe_amenagement Identifiant
9220     *
9221     * @return object
9222     */
9223     function get_inst_taxe_amenagement($taxe_amenagement = null) {
9224     //
9225 softime 6929 if ($this->inst_taxe_amenagement === null) {
9226 mbroquet 3730 //
9227 softime 6929 if ($taxe_amenagement === null) {
9228     //
9229 mbroquet 3730 $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($this->getVal('om_collectivite'));
9230 softime 6929
9231     // Si aucun paramétrage de taxe trouvé et que la collectivité
9232     // est mono
9233     if ($taxe_amenagement === null
9234     && $this->f->isCollectiviteMono($this->getVal('om_collectivite')) === true) {
9235     // Récupère la collectivité multi
9236     $om_collectivite_multi = $this->f->get_idx_collectivite_multi();
9237     //
9238     $taxe_amenagement = $this->get_taxe_amenagement_by_om_collectivite($om_collectivite_multi);
9239     }
9240    
9241     //
9242     if ($taxe_amenagement === null) {
9243     //
9244     return null;
9245     }
9246 mbroquet 3730 }
9247     //
9248 softime 7996 $this->inst_taxe_amenagement = $this->f->get_inst__om_dbform(array(
9249     "obj" => "taxe_amenagement",
9250     "idx" => $taxe_amenagement,
9251     ));
9252 mbroquet 3730 }
9253     //
9254     return $this->inst_taxe_amenagement;
9255     }
9256    
9257     /**
9258     * Récupère l'identifiant de la taxe d'aménagement par rapport à la collectivité.
9259     *
9260     * @param integer $om_collectivite La collectivité
9261     *
9262     * @return integer
9263     */
9264     function get_taxe_amenagement_by_om_collectivite($om_collectivite) {
9265 softime 6929 //
9266     $taxe_amenagement = null;
9267    
9268 mbroquet 3730 // Si la collectivité n'est pas renseigné
9269 softime 6929 if ($om_collectivite !== '' && $om_collectivite !== null) {
9270    
9271     // SQL
9272 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9273     sprintf(
9274     'SELECT
9275     taxe_amenagement
9276     FROM
9277     %1$staxe_amenagement
9278     WHERE
9279     om_collectivite = %2$d',
9280     DB_PREFIXE,
9281     intval($om_collectivite)
9282     ),
9283     array(
9284     "origin" => __METHOD__,
9285     )
9286     );
9287     $taxe_amenagement = $qres["result"];
9288 mbroquet 3730 }
9289    
9290     //
9291 softime 6929 return $taxe_amenagement;
9292 mbroquet 3730 }
9293    
9294     /**
9295     * [get_inst_donnees_techniques description]
9296     *
9297     * @param [type] $donnees_techniques [description]
9298     *
9299     * @return [type] [description]
9300     */
9301     function get_inst_donnees_techniques($donnees_techniques = null) {
9302     //
9303     if (is_null($this->inst_donnees_techniques)) {
9304     //
9305     if (is_null($donnees_techniques)) {
9306     $donnees_techniques = $this->getDonneesTechniques();
9307     }
9308     //
9309 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
9310     "obj" => "donnees_techniques",
9311     "idx" => $donnees_techniques,
9312     ));
9313 mbroquet 3730 }
9314     //
9315     return $this->inst_donnees_techniques;
9316     }
9317    
9318    
9319     /**
9320 softime 10573 * TODO: replace with '$this->f->findObjectById' ?
9321     *
9322 mbroquet 3730 * Récupère l'instance du dossier d'autorisation.
9323     *
9324     * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
9325     *
9326     * @return object
9327     */
9328 fmichon 4708 function get_inst_dossier_autorisation($dossier_autorisation = null) {
9329 mbroquet 3730 //
9330     return $this->get_inst_common("dossier_autorisation", $dossier_autorisation);
9331     }
9332    
9333    
9334     /**
9335     * Récupère l'instance du dossier d'autorisation, puis la clé d'accès au portail
9336     * citoyen associée à ce DA.
9337     *
9338     * @param string $dossier_autorisation Identifiant du dossier d'autorisation.
9339     *
9340     * @return string $cle_acces_citoyen si la clé d'accès existe
9341     * boolean false si la clé n'existe pas
9342     */
9343     protected function get_citizen_access_key($dossier_autorisation = null) {
9344     //
9345     $inst_da = $this->get_inst_dossier_autorisation($dossier_autorisation);
9346     // Récupération de la valeur de la clé d'accès
9347     $cle_acces_citoyen = $inst_da->getVal('cle_acces_citoyen');
9348     if ($cle_acces_citoyen === '' OR $cle_acces_citoyen === null) {
9349     return false;
9350     }
9351     return $cle_acces_citoyen;
9352     }
9353    
9354    
9355     /**
9356     * Récupère l'instance du type détaillé du dossier d'autorisation.
9357     *
9358     * @param integer $dossier_autorisation_type_detaille Identifiant
9359     *
9360     * @return object
9361     */
9362     function get_inst_dossier_autorisation_type_detaille($dossier_autorisation_type_detaille = null) {
9363     //
9364     if (is_null($this->inst_dossier_autorisation_type_detaille)) {
9365     //
9366     if (is_null($dossier_autorisation_type_detaille)) {
9367     //
9368     $dossier_autorisation = $this->get_inst_dossier_autorisation();
9369     //
9370     $dossier_autorisation_type_detaille = $dossier_autorisation->getVal('dossier_autorisation_type_detaille');
9371     }
9372     //
9373 softime 7996 $this->inst_dossier_autorisation_type_detaille = $this->f->get_inst__om_dbform(array(
9374     "obj" => "dossier_autorisation_type_detaille",
9375     "idx" => $dossier_autorisation_type_detaille,
9376     ));
9377 mbroquet 3730 }
9378     //
9379     return $this->inst_dossier_autorisation_type_detaille;
9380     }
9381    
9382     /**
9383     * Récupère l'instance du cerfa
9384     *
9385     * @param integer $cerfa Identifiant du cerfa
9386     *
9387     * @return object
9388     */
9389     function get_inst_cerfa($cerfa = null) {
9390     //
9391     if (is_null($this->inst_cerfa)) {
9392     //
9393     if (is_null($cerfa)) {
9394     //
9395     $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9396     //
9397     $cerfa = $dossier_autorisation_type_detaille->getVal('cerfa');
9398     }
9399     //
9400 softime 7996 $this->inst_cerfa = $this->f->get_inst__om_dbform(array(
9401     "obj" => "cerfa",
9402     "idx" => $cerfa,
9403     ));
9404 mbroquet 3730 }
9405     //
9406     return $this->inst_cerfa;
9407     }
9408    
9409     /**
9410     * CONDITION - is_user_from_allowed_collectivite.
9411     *
9412     * Cette condition permet de vérifier si l'utilisateur connecté appartient
9413     * à une collectivité autorisée : c'est-à-dire de niveau 2 ou identique à
9414     * la collectivité de l'enregistrement sur lequel on se trouve.
9415     *
9416     * @return boolean
9417     */
9418     function is_user_from_allowed_collectivite() {
9419    
9420     // Si l'utilisateur est de niveau 2
9421     if ($_SESSION["niveau"] == "2") {
9422     // Alors l'utilisateur fait partie d'une collectivité autorisée
9423     return true;
9424     }
9425    
9426     // L'utilisateur est donc de niveau 1
9427     // On vérifie donc si la collectivité de l'utilisateur est la même
9428     // que la collectivité de l'élément sur lequel on se trouve
9429     if ($_SESSION["collectivite"] === $this->getVal("om_collectivite")) {
9430     // Alors l'utilisateur fait partie d'une collectivité autorisée
9431     return true;
9432     }
9433    
9434     // L'utilisateur ne fait pas partie d'une collectivité autorisée
9435     return false;
9436     }
9437    
9438     /**
9439     * Création ou mise à jour du répertoire de numérisation.
9440     *
9441     * L'objet de cette méthode est la création ou la mise à jour de la date de
9442     * modification du répertoire de numérisation destiné à recevoir les pièces
9443     * numérisées pour un import automatique.
9444     * À chaque saisie d'une nouvelle demande dans openADS, le répertoire est
9445     * soit créé soit mis à jour pour être disponible en dehors d'openADS
9446     * (point de montage sur le serveur) pour permettre de déposer les pièces
9447     * numérisées directement depuis le copieur. À intervalle régulier, un
9448     * service vérifie le contenu de ces répertoire pour importer
9449     * automatiquement ces fichiers dans l'onglet 'Pièce(s)' du dossier
9450     * concerné.
9451     * La mise à jour de la date de modification est importante pour réaliser
9452     * la purge des répertoires vides sur la base de la date de la dernière
9453     * demande qui concerne le dossier.
9454     *
9455     * @return boolean
9456     */
9457     function create_or_touch_digitalization_folder() {
9458    
9459     // Nom du répertoire
9460     // Le répertoire créé possède comme nom le libellé du dossier avec
9461     // le suffixe séparé par un '.'. Exemple : PC0130551601234.P0
9462 nmeucci 4526 $separateur = '';
9463     if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
9464     $separateur = '.';
9465     }
9466    
9467 mbroquet 3730 $digitalization_folder_name = str_replace(
9468     $this->getVal("dossier_autorisation"),
9469 nmeucci 4526 $this->getVal("dossier_autorisation").$separateur,
9470 mbroquet 3730 $this->getVal($this->clePrimaire)
9471     );
9472    
9473     // Vérifie que l'option de numérisation des dossiers est désactivée
9474     if ($this->f->is_option_digitalization_folder_enabled() !== true) {
9475     //
9476     $this->addToLog(
9477     _("L'option de numerisation des dossiers n'est pas activee").".",
9478     DEBUG_MODE
9479     );
9480     return false;
9481     }
9482    
9483     // Vérifie le paramétrage du répertoire de numérisation
9484     if ($this->f->getParameter("digitalization_folder_path") === null) {
9485     //
9486     $this->addToLog(
9487     "Configuration du répertoire de numérisation incorrecte.",
9488     DEBUG_MODE
9489     );
9490     return false;
9491     }
9492    
9493     // Répertoire cible
9494     $root_folder_path = $this->f->getParameter("digitalization_folder_path");
9495    
9496     // Vérifie que le répertoire existe
9497     if (is_dir($root_folder_path) !== true) {
9498     //
9499     $this->addToLog(
9500     sprintf(
9501     "Le répertoire '%s' n'existe pas.",
9502     $root_folder_path
9503     ),
9504     DEBUG_MODE
9505     );
9506     return false;
9507     }
9508    
9509     // Répertoire des "à traiter"
9510     $todo_folder_path = $root_folder_path."Todo/";
9511    
9512     // Vérifie que le répertoire existe
9513     if (is_dir($todo_folder_path) !== true) {
9514     //
9515     $this->addToLog(
9516     sprintf(
9517     "Le répertoire '%s' n'existe pas.",
9518     $todo_folder_path
9519     ),
9520     DEBUG_MODE
9521     );
9522     return false;
9523     }
9524    
9525     // Répertoire de numérisation.
9526     $digitalization_folder_path = $todo_folder_path.$digitalization_folder_name;
9527    
9528     // Si le répertore existe déjà le répertoire n'est pas créé
9529     if (file_exists($digitalization_folder_path) == true) {
9530     // Mise à jour du répertoire
9531     if (touch($digitalization_folder_path) !== true) {
9532     // Si une erreur survient
9533     $this->addToLog(
9534     sprintf(
9535     "Erreur lors de la mise à jour du répertoire '%s'.",
9536     $digitalization_folder_path
9537     ),
9538     DEBUG_MODE
9539     );
9540     return false;
9541     }
9542     //
9543     return true;
9544     } else {
9545     // Création du répertoire
9546     if (mkdir($digitalization_folder_path) !== true) {
9547     //
9548     $this->addToLog(
9549     sprintf(
9550     "Erreur lors de la création du répertoire '%s'.",
9551     $digitalization_folder_path
9552     ),
9553     DEBUG_MODE
9554     );
9555     return false;
9556     }
9557     //
9558     return true;
9559     }
9560     }
9561    
9562 nmeucci 3876 /**
9563     * Récupère, convertit et retourne les logs de toutes les instructions
9564     *
9565     * @return array tableau indexé de logs
9566     */
9567     public function get_log_instructions() {
9568     $log_instructions = $this->getVal('log_instructions');
9569     // Gestion du premier log
9570 nmeucci 3887 if ($log_instructions === '') {
9571 nmeucci 3876 $log_instructions = json_encode(array());
9572     }
9573 nmeucci 3887 // Gestion du log invalide
9574     if(!$this->isJson($log_instructions)) {
9575     return false;
9576     }
9577 nmeucci 3876 return json_decode($log_instructions, true);
9578     }
9579    
9580     /**
9581     * Ajoute un log d'instruction aux logs existants
9582     *
9583     * @param array $log valeurs de l'instruction
9584     * @return bool vrai si traitement effectué avec succès
9585     */
9586     public function add_log_instructions($log) {
9587     // Begin
9588     $this->begin_treatment(__METHOD__);
9589     // Ajout du log
9590     $log_instructions = $this->get_log_instructions();
9591 nmeucci 3887 if ($log_instructions === false) {
9592     $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9593     return $this->end_treatment(__METHOD__, false);
9594     }
9595 nmeucci 3876 array_push($log_instructions, $log);
9596 nmeucci 3907 $log_instructions = json_encode($log_instructions);
9597 nmeucci 3876 // Mise à jour du DI
9598     $val = array("log_instructions"=>$log_instructions);
9599 softime 12847 $ret = $this->f->db->autoexecute(
9600 nmeucci 3876 DB_PREFIXE."dossier",
9601     $val,
9602     DB_AUTOQUERY_UPDATE,
9603 softime 12847 "dossier = '".$this->getVal('dossier')."'"
9604     );
9605     $this->addToLog(
9606     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($val, true).", DB_AUTOQUERY_UPDATE, \"dossier = '".$this->getVal('dossier')."'\");",
9607     VERBOSE_MODE
9608     );
9609     if ($this->f->isDatabaseError($ret, true) !== false) {
9610 nmeucci 3876 $this->erreur_db($ret->getDebugInfo(), $ret->getMessage(), 'dossier');
9611     $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
9612     return $this->end_treatment(__METHOD__, false);
9613     }
9614     return $this->end_treatment(__METHOD__, true);
9615     }
9616    
9617 nmeucci 3887 /**
9618 fmichon 4708 * TREATMENT - mark_as_connected_to_referentiel_erp.
9619     *
9620     * Cette méthode permet de positionner le marqueur
9621     * 'interface_referentiel_erp' à 'true'. Cela signifie que le dossier est
9622     * connecté au référentiel ERP.
9623     *
9624     * @return boolean
9625     */
9626     function mark_as_connected_to_referentiel_erp() {
9627     //
9628     $this->begin_treatment(__METHOD__);
9629     //
9630     $data = array("interface_referentiel_erp" => true, );
9631     // Exécution de la requête
9632     $res = $this->f->db->autoExecute(
9633     DB_PREFIXE.$this->table,
9634     $data,
9635     DB_AUTOQUERY_UPDATE,
9636     $this->getCle($this->getVal($this->clePrimaire))
9637     );
9638     // Logger
9639     $this->addToLog(
9640     __METHOD__."(): db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($data, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");",
9641     VERBOSE_MODE
9642     );
9643     //
9644     if ($this->f->isDatabaseError($res, true)) {
9645     // Appel de la methode de recuperation des erreurs
9646     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
9647     $this->correct = false;
9648     $this->addToLog(
9649     __METHOD__."(): Problème erreur lors de la mise à jour du dossier",
9650     DEBUG_MODE
9651     );
9652     // Termine le traitement
9653     return $this->end_treatment(__METHOD__, false);
9654     }
9655     //
9656     $this->addToMessage(_("Le dossier est désormais 'connecté avec le référentiel ERP'."));
9657     return $this->end_treatment(__METHOD__, true);
9658     }
9659 nmeucci 3887
9660 fmichon 4708 /**
9661     * CONDITION - is_connected_to_referentiel_erp.
9662     *
9663     * @return boolean
9664     */
9665     function is_connected_to_referentiel_erp() {
9666     //
9667     if ($this->getVal("interface_referentiel_erp") !== "t") {
9668     return false;
9669     }
9670     //
9671     return true;
9672     }
9673    
9674 nhaye 4777
9675 fmichon 4708 /**
9676 nhaye 4777 * Retourne les données techniques applicables au dossier courant, càd les données
9677     * techniques liées au dossier avec seulement les champs du CERFA associé au type de
9678     * dossier.
9679     *
9680     * @return array $donnees_techniques_applicables Tableau associatif contenant
9681     * seulement les données techniques
9682     * applicables au dossier.
9683     */
9684     public function get_donnees_techniques_applicables() {
9685    
9686     // Récupération de l'identifiant des données techniques liées au dossier
9687     $donnees_techniques = $this->getDonneesTechniques();
9688    
9689     $inst_donnees_techniques = $this->get_inst_common('donnees_techniques', $donnees_techniques);
9690     $donnees_techniques_applicables = $inst_donnees_techniques->get_donnees_techniques_applicables();
9691     //
9692     return $donnees_techniques_applicables;
9693    
9694     }
9695    
9696    
9697     /**
9698 fmichon 4708 * Retourne un tableau avec les données du dossier d'instruction.
9699     *
9700 jymadier 5275 * L'objectif est de mettre à disposition via un WS REST un ensemble
9701 fmichon 4708 * de données exploitable par une autre application.
9702     */
9703     function get_datas() {
9704    
9705     /**
9706     *
9707     */
9708 nhaye 4777
9709 softime 10573 // TODO: replace '$this->get_inst_common' with '$this->f->findObjectById' ?
9710 nhaye 4777 $om_collectivite = $this->get_inst_common('om_collectivite', $this->getVal('om_collectivite'));
9711     $instructeur = $this->get_inst_common('instructeur', $this->getVal('instructeur'));
9712     $division = $this->get_inst_common('division', $this->getVal('division'));
9713 softime 9282 $etat = $this->get_inst_common('etat', $this->getVal('etat'));
9714 nhaye 4777 $dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9715     $dossier_autorisation_type = $this->get_inst_common('dossier_autorisation_type', $dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9716     $donnees_techniques = $this->get_donnees_techniques_applicables();
9717    
9718 fmichon 4708 //
9719     $datas = array(
9720     //
9721     "dossier_instruction" => $this->getVal($this->clePrimaire),
9722     //
9723     "dossier_autorisation" => $this->getVal("dossier_autorisation"),
9724     //
9725     "terrain_adresse_voie_numero" => $this->getVal("terrain_adresse_voie_numero"),
9726     "terrain_adresse_lieu_dit" => $this->getVal("terrain_adresse_lieu_dit"),
9727     "terrain_adresse_code_postal" => $this->getVal("terrain_adresse_code_postal"),
9728     "terrain_adresse_cedex" => $this->getVal("terrain_adresse_cedex"),
9729     "terrain_adresse_voie" => $this->getVal("terrain_adresse_voie"),
9730     "terrain_adresse_bp" => $this->getVal("terrain_adresse_bp"),
9731     "terrain_adresse_localite" => $this->getVal("terrain_adresse_localite"),
9732     "terrain_superficie" => $this->getVal("terrain_superficie"),
9733 softime 13528 "terrain_superficie_calculee" => $this->getVal("terrain_superficie_calculee"),
9734 fmichon 4708 //
9735     "references_cadastrales" => $this->f->parseParcelles($this->getVal("terrain_references_cadastrales"), $this->getVal('om_collectivite')),
9736 softime 14064 "geoloc_latitude" => $this->getVal("geoloc_latitude"),
9737     "geoloc_longitude" => $this->getVal("geoloc_longitude"),
9738     "geoloc_rayon" => $this->getVal("geoloc_rayon"),
9739 nhaye 4777 "dossier_autorisation_type" => $dossier_autorisation_type->getVal("libelle"),
9740     "dossier_autorisation_type_detaille" => $dossier_autorisation_type_detaille->getVal("libelle"),
9741     "collectivite" => $om_collectivite->getVal("libelle"),
9742     "instructeur" => $instructeur->getVal("nom"),
9743     "division" => $division->getVal("libelle"),
9744 softime 9282 "etat_dossier" => $etat->getVal("libelle"),
9745 nhaye 4777 "statut_dossier" => $this->getStatut(),
9746     "date_depot_initial" => $this->getVal("date_depot"),
9747     "date_limite_instruction" => $this->getVal("date_limite"),
9748     "date_decision" => $this->getVal("date_decision"),
9749     "enjeu_urbanisme" => $this->getVal("enjeu_urba") == 't' ? 'true' : 'false',
9750     "enjeu_erp" => $this->getVal("enjeu_erp") == 't' ? 'true' : 'false',
9751 fmichon 4708 );
9752    
9753 softime 6565 // Gestion des demandeurs.
9754 fmichon 4708 $this->listeDemandeur('dossier', $this->getVal($this->clePrimaire));
9755     //
9756 softime 6565 if (isset($this->valIdDemandeur["petitionnaire_principal"]) AND !empty($this->valIdDemandeur["petitionnaire_principal"])) {
9757 softime 7996 $demandeur = $this->f->get_inst__om_dbform(array(
9758     "obj" => "petitionnaire",
9759     "idx" => $this->valIdDemandeur["petitionnaire_principal"][0],
9760     ));
9761 softime 6565 $datas["petitionnaire_principal"] = $demandeur->get_datas();
9762     $demandeur->__destruct();
9763     }
9764 fmichon 4708 //
9765     if (isset($this->valIdDemandeur["delegataire"]) && !empty($this->valIdDemandeur["delegataire"])) {
9766 softime 7996 $demandeur = $this->f->get_inst__om_dbform(array(
9767     "obj" => "delegataire",
9768     "idx" => $this->valIdDemandeur["delegataire"][0],
9769     ));
9770 fmichon 4708 $datas["delegataire"] = $demandeur->get_datas();
9771     $demandeur->__destruct();
9772     }
9773     //
9774     if (isset($this->valIdDemandeur["petitionnaire"]) AND !empty($this->valIdDemandeur["petitionnaire"])) {
9775     $datas["autres_petitionnaires"] = array();
9776     foreach ($this->valIdDemandeur["petitionnaire"] as $petitionnaire) {
9777 softime 7996 $demandeur = $this->f->get_inst__om_dbform(array(
9778     "obj" => "petitionnaire",
9779     "idx" => $petitionnaire,
9780     ));
9781 fmichon 4708 $datas["autres_petitionnaires"][] = $demandeur->get_datas();
9782     $demandeur->__destruct();
9783     }
9784     }
9785    
9786 nhaye 4777 // Tableau contenant le nom de chaque champ de données techniques à retourner
9787     $dt_a_afficher = array(
9788     "co_tot_log_nb",
9789     "co_cstr_exist",
9790     "co_uti_pers",
9791     "co_uti_vente",
9792     "co_uti_loc",
9793     "su_tot_shon_tot",
9794     "su_avt_shon_tot",
9795     "am_lot_max_nb",
9796     "am_empl_nb",
9797     );
9798    
9799 jymadier 4785 // Tableau associatif contenant les données techniques voulues
9800     $tab_donnees_techniques = array();
9801 nhaye 4777 foreach ($dt_a_afficher as $key) {
9802     // On ajoute le champ de données techniques dans le retour seulement s'il
9803     // existe dans $donnees_techniques (s'il est applicable au dossier)
9804 jymadier 4785 if (array_key_exists($key, $donnees_techniques) === true) {
9805 nhaye 4777 if ($donnees_techniques[$key] === 't') {
9806     $donnees_techniques[$key] = 'true';
9807     };
9808     if ($donnees_techniques[$key] === 'f') {
9809     $donnees_techniques[$key] = 'false';
9810     };
9811 jymadier 4785 $tab_donnees_techniques[$key] = $donnees_techniques[$key];
9812 nhaye 4777 };
9813     };
9814    
9815 jymadier 4785 $datas['donnees_techniques'] = $tab_donnees_techniques;
9816 softime 10573
9817     // Affiche le code INSEE de la collectivité du dossier d'instruction
9818     /*$collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
9819     $datas['collectivite_insee'] = $collectivite["insee"];*/
9820     $datas['collectivite_insee'] = $this->get_da_insee();
9821 fmichon 4708 //
9822     return $datas;
9823     }
9824    
9825 softime 6565 /**
9826 softime 10573 * Renvoi le code INSEE du DA associé
9827     */
9828     protected function get_da_insee() {
9829     $inst_da = $this->f->get_inst__om_dbform(array(
9830     "obj" => "dossier_autorisation",
9831     "idx" => $this->getVal('dossier_autorisation')
9832     ));
9833     return $inst_da->getVal('insee');
9834     }
9835    
9836     /**
9837 softime 6565 * CONDITION - is_class_dossier_corresponding_to_his_groupe
9838     *
9839     * Vérifie la correspondance groupe/classe du dossier instancié.
9840     *
9841     * @param string $classe
9842     * @return boolean
9843     */
9844     protected function is_class_dossier_corresponding_to_type_form($classe) {
9845     $type_form = $this->get_type_affichage_formulaire();
9846     switch ($type_form) {
9847 softime 7067 case 'DPC';
9848 softime 6565 case 'ADS':
9849 softime 10573 case 'CONSULTATION ENTRANTE':
9850 softime 6565 if ($this->f->starts_with($classe, 'dossier_instruction') === true) {
9851     return true;
9852     }
9853     return false;
9854     case 'CTX RE':
9855     if ($this->f->ends_with($classe, '_recours') === true) {
9856     return true;
9857     }
9858     return false;
9859     case 'CTX IN':
9860     if ($this->f->ends_with($classe, '_infractions') === true) {
9861     return true;
9862     }
9863     return false;
9864     default:
9865     return false;
9866     }
9867     }
9868 nhaye 4777
9869 softime 6565
9870 softime 6272 /**
9871 softime 6565 * CONDITION - check_context
9872     *
9873     * Vérifie la correspondance groupes dossier/utilisateur.
9874     * Vérifie l'accès aux dossiers confidentiels.
9875     * Vérifie la correspondance groupe/classe.
9876     *
9877     * @return boolean
9878     */
9879     public function check_context() {
9880     // Le dossier doit être un objet valide
9881     $id = $this->getVal($this->clePrimaire);
9882     if ($id === 0 OR $id === '0' OR $id === '' OR $id === ']') {
9883     return false;
9884     }
9885    
9886     // Vérification que l'utilisateur a accès au dossier
9887     if ($this->can_user_access_dossier() === false) {
9888     return false;
9889     }
9890     // Vérification que la classe métier instanciée est adéquate.
9891 softime 7996 return $this->is_class_dossier_corresponding_to_type_form($this->get_absolute_class_name());
9892 softime 6565 }
9893    
9894     /**
9895     * VIEW - redirect.
9896     *
9897     * Cette vue est appelée lorsque l'on souhaite consulter un dossier dont on ne connaît pas le groupe.
9898     * Ce fonctionnement est nécessaire car les classes métier filles de 'dossier' sont relatives à ce groupe.
9899     *
9900     * Par exemple, depuis l'onglet "Dossiers Liés" du DI, le listing ne permet pas d'instancier chaque résultat
9901     * et par conséquent on n'a pas accès au groupe du dossier. L'action tableau consulter y est surchargée afin
9902     * d'amener à cette vue qui se charge de faire la redirection adéquate.
9903     *
9904     * @return void
9905     */
9906     public function redirect() {
9907     // Redirection vers la classe métier adéquate
9908     $context = $this->get_type_affichage_formulaire();
9909     switch ($context) {
9910     case 'ADS':
9911 softime 10573 case 'CONSULTATION ENTRANTE':
9912 softime 6565 $obj = 'dossier_instruction';
9913     break;
9914     case 'CTX RE':
9915     $obj = 'dossier_contentieux_tous_recours';
9916     break;
9917     case 'CTX IN':
9918     $obj = 'dossier_contentieux_toutes_infractions';
9919     break;
9920     default:
9921     return;
9922     }
9923     $idx = $this->getVal($this->clePrimaire);
9924 softime 7996 $link = OM_ROUTE_FORM.'&obj='.$obj.'&action=3&idx='.$idx;
9925 softime 6565 if ($this->f->get_submitted_get_value('retourformulaire') !== null
9926     && $this->f->get_submitted_get_value('idxformulaire') !== null) {
9927 softime 7996 $link .= '&premier=0&tricol=&retourformulaire='.$this->f->get_submitted_get_value('retourformulaire');
9928 softime 6565 $link .= '&idxformulaire='.$this->f->get_submitted_get_value('idxformulaire');
9929     }
9930    
9931     header('Location: '.$link);
9932     exit();
9933     }
9934    
9935    
9936     /**
9937     * CONDITION - is_confidentiel
9938     *
9939     * Permet de savoir si le type de dossier d'autorisation du dossier courant est
9940     * confidentiel.
9941     *
9942     * @return boolean true si le dossier est confidentiel, sinon false.
9943     *
9944     */
9945     public function is_confidentiel() {
9946     //
9947     $inst_dossier_autorisation_type_detaille = $this->get_inst_dossier_autorisation_type_detaille();
9948     $inst_dossier_autorisation_type = $this->get_inst_dossier_autorisation_type($inst_dossier_autorisation_type_detaille->getVal('dossier_autorisation_type'));
9949     $confidentiel = $inst_dossier_autorisation_type->getVal('confidentiel');
9950     //
9951     if ($confidentiel === 't') {
9952     return true;
9953     }
9954     return false;
9955     }
9956    
9957    
9958     /**
9959     * CONDITION - can_user_access_dossier
9960     *
9961     * Effectue les vérifications suivantes :
9962     * - L'utilisateur doit avoir accès au groupe du dossier
9963     * - Si le dossier est confidentiel, l'utilisateur doit avoir accès aux dossiers
9964     * confidentiels de ce groupe
9965     *
9966     * @return boolean true si les conditions ci-dessus sont réunies, sinon false
9967     *
9968     */
9969     public function can_user_access_dossier() {
9970     // Récupère le code du groupe
9971     $groupe_dossier = $this->get_groupe();
9972    
9973     // Le groupe doit être accessible par l'utilisateur ;
9974     if ($this->f->is_user_in_group($groupe_dossier) === false) {
9975     return false;
9976     }
9977     if ($this->is_confidentiel() === true) {
9978     //
9979     if ($this->f->can_user_access_dossiers_confidentiels_from_groupe($groupe_dossier) === false) {
9980     return false;
9981     }
9982     }
9983     return true;
9984     }
9985    
9986    
9987     /**
9988 softime 6272 * Met à jour une métadonnée sur tous les fichiers liés au dossier.
9989     *
9990     * @param string $metadata Nom de la métadonnée.
9991     * @param string $metadata_value Nouvelle valeur de la métadonnée.
9992     *
9993     * @return boolean
9994     */
9995     public function update_metadata_by_dossier($metadata, $metadata_value) {
9996     // Rècupère la liste des fichiers stockés liés au dossier
9997 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9998     sprintf(
9999     'SELECT
10000     uid AS uid
10001     FROM
10002     %1$sdocument_numerise
10003     WHERE
10004     dossier = \'%2$s\'
10005     AND document_numerise IS NOT NULL
10006     UNION
10007     SELECT
10008     fichier AS uid
10009     FROM
10010     %1$sconsultation
10011     WHERE
10012     dossier = \'%2$s\'
10013     AND fichier IS NOT NULL
10014     UNION
10015     SELECT
10016     om_fichier_consultation AS uid
10017     FROM
10018     %1$sconsultation
10019     WHERE
10020     dossier = \'%2$s\'
10021     AND om_fichier_consultation IS NOT NULL
10022     UNION
10023     SELECT
10024     om_fichier_instruction AS uid
10025     FROM
10026     %1$sinstruction
10027     WHERE
10028     dossier = \'%2$s\'
10029     AND om_fichier_instruction IS NOT NULL
10030     UNION
10031     SELECT
10032     om_fichier_rapport_instruction AS uid
10033     FROM
10034     %1$srapport_instruction
10035     WHERE
10036     dossier_instruction = \'%2$s\'
10037     AND om_fichier_rapport_instruction IS NOT NULL;',
10038     DB_PREFIXE,
10039     $this->f->db->escapeSimple($this->getVal($this->clePrimaire))
10040     ),
10041     array(
10042     'origin' => __METHOD__
10043     )
10044 softime 6272 );
10045    
10046     // Définit la métadonnée à mettre à jour
10047     $metadata_update = array();
10048     $metadata_update[$metadata] = $metadata_value;
10049    
10050     // Pour chaque résultat
10051 softime 14542 foreach ($qres['result'] as $row) {
10052 softime 6272 // Met à jour les métadonnées du fichier
10053     $uid_update = $this->f->storage->storage->update_metadata($row['uid'], $metadata_update);
10054    
10055     // Si la méthode ne retourne pas l'uid du fichier alors la mise
10056     // à jour ne s'est pas réalisée
10057     if ($uid_update !== $row['uid']) {
10058     //
10059     return false;
10060     }
10061     }
10062    
10063     //
10064     return true;
10065     }
10066    
10067    
10068     /**
10069     * Traitement pour les ERP.
10070     * Si la valeur du champ 'erp' a été modifié, modifie la valeur de la
10071     * métadonnée concernceERP sur tous les fichiers liés au dossier.
10072     *
10073     * @param array $values Liste des nouvelles valeurs.
10074     *
10075     * @return boolean
10076     */
10077     public function update_concerneERP(array $values) {
10078     // Définit le champ et la métadonnée
10079     $champ = 'erp';
10080     $metadata = 'concerneERP';
10081    
10082     // Définit les valeurs à comparer
10083     $value_after = $this->get_boolean_from_view_value($values[$champ]);
10084     $value_before = $this->get_boolean_from_pgsql_value($this->getVal($champ));
10085    
10086     // Vérifie si la valeur du champ a été modifié
10087     if ($value_after !== $value_before) {
10088     // Transforme la valeur booléenne en string
10089     $metadata_value = 'false';
10090     if ($value_after === true) {
10091     $metadata_value = 'true';
10092     }
10093    
10094     // Met à jour les métadonnées des fichiers liés au dossier
10095     $update = $this->update_metadata_by_dossier($metadata, $metadata_value);
10096     //
10097     if ($update !== true) {
10098     //
10099     return false;
10100     }
10101     }
10102    
10103     //
10104     return true;
10105     }
10106    
10107    
10108 softime 6565 /**
10109 softime 10573 * TODO: replace with '$this->f->findObjectById' ?
10110     *
10111 softime 6565 * Récupère l'instance du groupe.
10112     *
10113     * @param string $groupe Identifiant du groupe.
10114     *
10115     * @return object
10116     */
10117     private function get_inst_groupe($groupe) {
10118     //
10119     return $this->get_inst_common("groupe", $groupe);
10120     }
10121    
10122    
10123     /**
10124 softime 10573 * TODO: replace with '$this->f->findObjectById' ?
10125     *
10126 softime 6565 * Récupère l'instance du type de dossier d'autorisation.
10127     *
10128     * @param string $dossier_autorisation_type Identifiant du type de dossier
10129     * d'autorisation.
10130     *
10131     * @return object
10132     */
10133     private function get_inst_dossier_autorisation_type($dossier_autorisation_type) {
10134     //
10135     return $this->get_inst_common("dossier_autorisation_type", $dossier_autorisation_type);
10136     }
10137    
10138    
10139 softime 7366 /**
10140     * Récupère l'instance de la demande du dossier
10141     *
10142     * @param mixed Identifiant de la demande
10143     *
10144     * @return object
10145     */
10146     function get_inst_demande($demande = null) {
10147     //
10148     if (is_null($this->inst_demande)) {
10149     //
10150     if (is_null($demande)) {
10151     $demande = $this->get_demande_by_dossier_instruction();
10152     }
10153     //
10154     return $this->get_inst_common("demande", $demande);
10155     }
10156     //
10157     return $this->inst_demande;
10158     }
10159    
10160    
10161     /**
10162 softime 7541 * Récupère l'identifiant de la demande initiale par le dossier d'instruction.
10163 softime 7366 *
10164 softime 14064 * @return integer|null renvoie l'identifiant de la demande ou null si
10165     * rien n'a été récupéré
10166 softime 7366 */
10167     function get_demande_by_dossier_instruction() {
10168 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10169     sprintf(
10170     'SELECT
10171     demande
10172     FROM
10173     %1$sdemande
10174     WHERE
10175     dossier_instruction = \'%2$s\'
10176     ORDER BY
10177     instruction_recepisse ASC
10178     LIMIT 1',
10179     DB_PREFIXE,
10180     $this->getVal($this->clePrimaire)
10181     ),
10182     array(
10183     "origin" => __METHOD__,
10184     )
10185     );
10186 softime 7366
10187 softime 14064 return $qres["result"];
10188 softime 7366 }
10189    
10190 softime 7996 /**
10191     * TREATMENT - update_last_modification_date.
10192     *
10193     * Cette methode met à jour la date de dernière modification du dossier.
10194     *
10195     * @return boolean
10196     */
10197     public function update_last_modification_date() {
10198     //
10199     $this->begin_treatment(__METHOD__);
10200     //
10201     $this->correct = true;
10202 softime 9245 $valF = array();
10203     $valF["date_modification"] = 'NOW';
10204 softime 7996 //
10205     $res = $this->f->db->autoExecute(
10206     DB_PREFIXE.$this->table,
10207 softime 9245 $valF,
10208 softime 7996 DB_AUTOQUERY_UPDATE,
10209     $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
10210     );
10211     if ($this->f->isDatabaseError($res, true)) {
10212     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10213     $this->correct = false;
10214     return $this->end_treatment(__METHOD__, false);
10215     } else {
10216     return $this->end_treatment(__METHOD__, true);
10217     }
10218     //
10219     return $this->end_treatment(__METHOD__, false);
10220     }
10221 softime 7366
10222 softime 7996 /**
10223     * TREATMENT - update_hash_sitadel.
10224     *
10225     * Cette methode met à jour le hash SITADEL du dossier.
10226     *
10227     * @return boolean
10228     */
10229     public function update_hash_sitadel($hash_sitadel = null) {
10230     //
10231     $this->begin_treatment(__METHOD__);
10232     //
10233     if ($hash_sitadel !== null && $hash_sitadel !== '') {
10234     //
10235     $this->correct = true;
10236 softime 9245 $valF = array();
10237     $valF["hash_sitadel"] = $hash_sitadel;
10238 softime 7996 //
10239     $res = $this->f->db->autoExecute(
10240     DB_PREFIXE.$this->table,
10241 softime 9245 $valF,
10242 softime 7996 DB_AUTOQUERY_UPDATE,
10243     $this->clePrimaire." = '".$this->getVal($this->clePrimaire)."'"
10244     );
10245     if ($this->f->isDatabaseError($res, true)) {
10246     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10247     $this->correct = false;
10248     return $this->end_treatment(__METHOD__, false);
10249     } else {
10250     return $this->end_treatment(__METHOD__, true);
10251     }
10252     }
10253     //
10254     return $this->end_treatment(__METHOD__, false);
10255     }
10256    
10257 softime 8477 /**
10258 softime 9245 * TREATMENT - update_version_clos
10259     *
10260     * @param string $mode Mode de mise à jour ("up" ou "down")
10261     *
10262     * @return boolean
10263     */
10264     public function update_version_clos($mode) {
10265     //
10266     $this->begin_treatment(__METHOD__);
10267     //
10268     if ($mode !== 'up' && $mode !== 'down') {
10269     return $this->end_treatment(__METHOD__, false);
10270     }
10271     //
10272     $inst_da = $this->get_inst_dossier_autorisation($this->getVal("dossier_autorisation"));
10273     $da_version_clos = $inst_da->getval('numero_version_clos');
10274     //
10275     $this->correct = true;
10276     $data = array();
10277     $data["version_clos"] = 0;
10278     if ($da_version_clos !== null
10279     && $da_version_clos !== '') {
10280     //
10281     if ($mode === 'up') {
10282     $data["version_clos"] = intval($da_version_clos)+1;
10283     $inst_da->update_numero_version_clos($data["version_clos"]);
10284     }
10285     if ($mode === 'down') {
10286     $data["version_clos"] = null;
10287     }
10288     } else {
10289     $inst_da->update_numero_version_clos($data["version_clos"]);
10290     }
10291     //
10292     $res = $this->f->db->autoExecute(
10293     sprintf('%s%s', DB_PREFIXE, $this->table),
10294     $data,
10295     DB_AUTOQUERY_UPDATE,
10296     sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10297     );
10298     $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);
10299     if ($this->f->isDatabaseError($res, true) === true) {
10300     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10301     $this->correct = false;
10302     return $this->end_treatment(__METHOD__, false);
10303     }
10304     return $this->end_treatment(__METHOD__, true);
10305     }
10306    
10307     /**
10308     * Récupère l'identifiant de l'état car le getVal() récupère le libellé.
10309     *
10310     * @return mixed Soit un string, soit "false"
10311     */
10312     function get_id_etat() {
10313 softime 14064 $dossier = $this->f->get_inst__om_dbform(array(
10314     'obj' => 'dossier',
10315     'idx' => $this->getVal($this->clePrimaire)
10316     ));
10317     return $dossier->getVal('etat');
10318 softime 9245 }
10319    
10320     /**
10321 softime 13528 * Methode clesecondaire
10322     *
10323     * Vérifications Effectuées :
10324     * - Vérifie si le dossier est lié à un contentieux. Si c'est le cas
10325     * affiche un message d'erreur personnalisé et ne lance pas la
10326     * la vérification des clé étrangère.
10327     */
10328     function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
10329     // Le dossier d'instruction n'est pas supprimé si celui-ci est lié à un contentieux
10330     $autorisation_contestee = $this->get_idx_by_args(
10331     'autorisation_contestee',
10332     'dossier',
10333     'autorisation_contestee',
10334     $this->getVal($this->clePrimaire)
10335     );
10336     if (! empty($autorisation_contestee)) {
10337     $this->addToMessage(__("Le dossier d'instruction ne peut pas être supprimé car celui-ci est lié à un contentieux."));
10338     $this->correct = false;
10339     return;
10340     }
10341     parent::cleSecondaire($id, $dnu1, $val, $dnu2);
10342     }
10343    
10344     /**
10345 softime 8477 * Surcharge de la méthode rechercheTable pour éviter de court-circuiter le
10346     * générateur en devant surcharger la méthode cleSecondaire afin de supprimer
10347     * les éléments liés dans les tables NaN.
10348     *
10349 softime 13528 * Vérifications Effectuées :
10350     * - Vérifie si la table à chercher fait partie des tables que l'on va
10351     * supprimer si c'est le cas la vérification de la présence d'élement
10352     * n'est pas faite
10353     *
10354 softime 8477 * @param mixed $dnu1 Instance BDD - À ne pas utiliser
10355     * @param string $table Table
10356     * @param string $field Champ
10357     * @param mixed $id Identifiant
10358     * @param mixed $dnu2 Marqueur de débogage - À ne pas utiliser
10359     * @param string $selection Condition de la requête
10360     *
10361     * @return void
10362     */
10363 softime 13528 function rechercheTable(&$dnu1 = null, $table = "", $field = "", $id = null, $dnu2 = null, $selection = "") {
10364 softime 8477 // Dans le cas d'une suppression du dossier d'instruction, les tables
10365     // liées ne sont pas vérifiées
10366 softime 13528 if (! isset($this->related_tables)) {
10367     $this->set_related_tables();
10368     }
10369     // Récupère le nom des tables de liaison à partir de la liste des tables liées.
10370     // Vérifie pour chaque élément du tableau des liaisons si il existe une clé "table".
10371     // Si c'est le cas on récupère le nom de la table dans cette entrée si ce n'est pas
10372     // le cas on récupère la clé de l'élement car il dois contenir le nom de la table.
10373     // Ensuite supprime les doublons et renvoie un tableau contenant le nom des tables
10374     // liées pour lesquels la suppression va être effectuée.
10375     $liaison_suppr = array_unique( // supprime les doublons
10376     array_map(function($value, $key) { // Récupère le nom des tables de liaison
10377     return ! empty($value['table']) ? $value['table'] : $key;
10378     },
10379     $this->related_tables,
10380     array_keys($this->related_tables)
10381     ),
10382     SORT_STRING
10383 softime 8477 );
10384 softime 13528
10385 softime 8477 if ($this->get_action_crud() === 'delete'
10386 softime 13528 && in_array($table, $liaison_suppr) === true) {
10387     // Annule la vérif
10388 softime 8477 $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);
10389     return;
10390     }
10391 softime 13528
10392 softime 8477 parent::rechercheTable($this->f->db, $table, $field, $id, null, $selection);
10393     }
10394    
10395 softime 12124 /**
10396     * Effectue une requête sql pour récupérer la liste des id des demandeurs
10397     * associé au dossier et l'indicateur permettant de savoir si c'est un
10398     * demandeur principal ou pas.
10399     * Renvoi les résultats sous la forme d'un tableau.
10400     *
10401     * @return array|boolean tableau contenant les infos des demandeurs et false
10402     * en cas d'erreur de base de données.
10403     */
10404 softime 10573 public function get_demandeurs() {
10405     $query = sprintf('
10406 softime 12847 SELECT
10407     demandeur.demandeur,
10408     lien_dossier_demandeur.petitionnaire_principal,
10409     demandeur.type_demandeur
10410     FROM
10411     %1$sdemandeur
10412     INNER JOIN %1$slien_dossier_demandeur
10413     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
10414     WHERE
10415     lien_dossier_demandeur.dossier = \'%2$s\'',
10416 softime 10573 DB_PREFIXE,
10417     $this->getVal($this->clePrimaire)
10418     );
10419 softime 13137 $res = $this->f->get_all_results_from_db_query(
10420     $query,
10421     array(
10422     "origin" => __METHOD__,
10423     "force_return" => true,
10424     )
10425     );
10426 softime 10573 if ($res['code'] === 'KO') {
10427     return false;
10428     }
10429     return $res['result'];
10430     }
10431 softime 8477
10432 softime 10573 /**
10433     * TREATMENT - normalize_address
10434     *
10435     * Enregistre en base de données les valeurs concernant l'adresse normalisée.
10436     *
10437     * @param string $address Valeur de l'adresse normalisée.
10438     * @param string $address_json JSON de toutes les données de l'adresse normalisée.
10439     * @return boolean
10440     */
10441     public function normalize_address(string $address = null, string $address_json = '{}') {
10442     //
10443     $this->begin_treatment(__METHOD__);
10444     // Valeurs par défaut si l'adresse normalisée est vide
10445     if ($address === '') {
10446     $address = null;
10447     $address_json = '{}';
10448     }
10449     // Valeur par défaut pour le JSON de l'adresse si l'adresse saisie ne
10450     // correspond au label du JSON, donc adresse non sélectionnée parmis les
10451     // résultats retourner par l'API adresse
10452     if ($address !== null) {
10453     $address_json_decode = json_decode($address_json, true);
10454     if (isset($address_json_decode['label']) === true
10455     && $address !== $address_json_decode['label']) {
10456     //
10457     $address_json = '{}';
10458     }
10459     }
10460     //
10461     $this->correct = true;
10462     $data = array();
10463     $data["adresse_normalisee"] = $address;
10464     $data["adresse_normalisee_json"] = $address_json;
10465     //
10466     $res = $this->f->db->autoExecute(
10467     sprintf('%s%s', DB_PREFIXE, $this->table),
10468     $data,
10469     DB_AUTOQUERY_UPDATE,
10470     sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10471     );
10472     $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);
10473     if ($this->f->isDatabaseError($res, true) === true) {
10474     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10475     $this->correct = false;
10476     return $this->end_treatment(__METHOD__, false);
10477     }
10478     return $this->end_treatment(__METHOD__, true);
10479     }
10480 mbroquet 3730
10481 softime 10573 public function get_last_instruction_decision() {
10482 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10483     sprintf(
10484     'SELECT
10485     instruction.instruction
10486     FROM
10487     %1$sinstruction
10488 softime 14064 INNER JOIN %1$sdossier
10489     ON dossier.dossier = instruction.dossier
10490     INNER JOIN %1$setat
10491     ON dossier.etat = etat.etat
10492 softime 13137 WHERE
10493     instruction.etat = dossier.etat
10494     AND instruction.dossier = \'%2$s\'
10495     AND etat.statut = \'cloture\'
10496     ORDER BY
10497     instruction.instruction DESC
10498     LIMIT 1',
10499     DB_PREFIXE,
10500     $this->f->db->escapeSimple($this->getVal('dossier'))
10501     ),
10502     array(
10503     "origin" => __METHOD__,
10504     "force_return" => true,
10505     )
10506 softime 10573 );
10507 softime 13137 if ($qres["code"] !== "OK") {
10508 softime 10573 return false;
10509     }
10510 softime 13137 return $qres["result"];
10511 softime 10573 }
10512 softime 7996
10513 softime 10573 /**
10514     * VIEW - view_normalize_address.
10515     *
10516     * Formulaire de recherche de l'adresse normalisée.
10517     *
10518     * @return void
10519     */
10520     public function view_normalize_address() {
10521     // Vérification de l'accessibilité sur l'élément
10522     $this->checkAccessibility();
10523    
10524     // Par défaut l'adresse saisie est celle renseignée sur le dossier
10525     $address_val = trim(preg_replace('/\s\s+/', ' ', sprintf('%s %s %s %s %s %s %s',
10526     $this->getVal('terrain_adresse_voie_numero'),
10527     $this->getVal('terrain_adresse_voie'),
10528     $this->getVal('terrain_adresse_lieu_dit'),
10529     $this->getVal('terrain_adresse_localite'),
10530     $this->getVal('terrain_adresse_code_postal'),
10531     $this->getVal('terrain_adresse_bp'),
10532     $this->getVal('terrain_adresse_cedex')
10533     )));
10534     $address_val_json = '{}';
10535     if ($this->getVal('adresse_normalisee') !== null
10536     && $this->getVal('adresse_normalisee') !== '') {
10537     //
10538     $address_val = $this->getVal('adresse_normalisee');
10539     $address_val_json = htmlentities($this->getVal('adresse_normalisee_json'));
10540     if ($this->f->get_submitted_post_value("submit-normalize") === null) {
10541     $this->f->displayMessage("error", __("L'adresse de ce terrain a déjà été normalisée."));
10542     }
10543     }
10544    
10545     /**
10546     * TREATMENT
10547     */
10548     // Traitement si validation du formulaire
10549     if ($this->f->get_submitted_post_value("submit-normalize") !== null) {
10550     //
10551     $this->normalize_address($_POST["address"], $_POST["address_json"]);
10552     return;
10553     }
10554    
10555     // Formulaire de validation
10556     $this->f->layout->display__form_container__begin(array(
10557     "action" => "",
10558     "name" => "f2_normalize_address",
10559     "onsubmit" => "normalize_address(this);return false;",
10560     ));
10561     //
10562     printf('
10563     <div id="sousform-href" data-href="%s"></div>',
10564     $this->compose_form_url("form", array(
10565     "validation" => null,
10566     "maj" => 160,
10567     "retour" => "form",
10568     ))
10569     );
10570     $champs = array('address', 'address_json', );
10571     // Instanciation de l'objet formulaire
10572     $this->form = $this->f->get_inst__om_formulaire(array(
10573     "validation" => 0,
10574     "maj" => $this->getParameter("maj"),
10575     "champs" => $champs,
10576     ));
10577     // Paramétrage des champs du formulaire
10578     // address
10579     $this->form->setLib("address", __("adresse à normaliser"));
10580     $this->form->setTaille("address", 60);
10581     $this->form->setMax("address", 255);
10582     $this->form->setType("address", "text");
10583     $this->form->setVal('address', $address_val);
10584     // address_json
10585     $this->form->setType("address_json", "hidden");
10586     $this->form->setVal('address_json', $address_val_json);
10587     $this->f->displayDescription(__("Veuillez sélectionner l'adresse normalisée qui se rapproche le plus de l'adresse du terrain."));
10588     // Ouverture du conteneur de formulaire
10589     $this->form->entete();
10590     $this->form->afficher($champs, 0, false, false);
10591     $this->form->enpied();
10592     $this->f->layout->display__form_controls_container__begin(array(
10593     "controls" => "bottom",
10594     ));
10595     $this->f->layout->display__form_input_submit(array(
10596     "name" => "submit-normalize",
10597     "value" => __("Normaliser l'adresse"),
10598     "class" => "boutonFormulaire",
10599     ));
10600     $this->f->layout->display__form_controls_container__end();
10601     //
10602     $this->f->layout->display__form_container__end();
10603     }
10604    
10605    
10606     public function get_last_instruction_incompletude() {
10607 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10608     sprintf(
10609     'SELECT
10610     instruction.instruction
10611     FROM
10612     %1$sinstruction
10613 softime 14064 INNER JOIN %1$sevenement
10614     ON evenement.evenement = instruction.evenement
10615 softime 13137 WHERE
10616     instruction.dossier = \'%2$s\'
10617     AND evenement.type = \'incompletude\'
10618     ORDER BY
10619     instruction.instruction DESC
10620     LIMIT 1',
10621     DB_PREFIXE,
10622     $this->f->db->escapeSimple($this->getVal('dossier'))
10623     ),
10624     array(
10625     "origin" => __METHOD__,
10626     "force_return" => true,
10627     )
10628 softime 10573 );
10629 softime 13137 if ($qres["code"] !== "OK") {
10630 softime 10573 return false;
10631     }
10632 softime 13137 return $qres["result"];
10633 softime 10573 }
10634    
10635     function get_max_num_suffixe($dat_c, $annee, $dep_c, $com_c, $num) {
10636 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10637     sprintf(
10638     'SELECT
10639 softime 14064 MAX(numerotation_num_suffixe) AS max_num_suffixe
10640 softime 13137 FROM
10641     %1$sdossier
10642     WHERE
10643     numerotation_type = \'%2$s\'
10644     AND annee = \'%3$s\'
10645     AND numerotation_dep = \'%4$s\'
10646     AND numerotation_com = \'%5$s\'
10647     AND numerotation_num = \'%6$s\'',
10648     DB_PREFIXE,
10649     $this->f->db->escapeSimple($dat_c),
10650     $this->f->db->escapeSimple($annee),
10651     $this->f->db->escapeSimple($dep_c),
10652     $this->f->db->escapeSimple($com_c),
10653     $this->f->db->escapeSimple($num)
10654     ),
10655     array(
10656     "origin" => __METHOD__,
10657     "force_return" => true,
10658     )
10659 softime 10573 );
10660 softime 13137 if ($qres["code"] !== "OK") {
10661 softime 10573 return null;
10662     }
10663 softime 13137 return $qres["result"];
10664 softime 10573 }
10665    
10666     public function view_json_data() {
10667     $this->checkAccessibility();
10668     $this->f->disableLog();
10669     $view = $this->get_json_data();
10670     printf(json_encode($view));
10671     }
10672    
10673     public function get_json_data() {
10674     $val = array_combine($this->champs, $this->val);
10675     foreach ($val as $key => $value) {
10676     $val[$key] = strip_tags($value);
10677     }
10678     $inst_datd = $this->get_inst_dossier_autorisation_type_detaille();
10679     $inst_dat = $this->get_inst_dossier_autorisation_type($inst_datd->getVal('dossier_autorisation_type'));
10680     $val['dossier_autorisation_type_detaille_code'] = $inst_datd->getVal('code');
10681     $val['dossier_autorisation_type_code'] = $inst_dat->getVal('code');
10682     $val['dossier_instruction_type_code'] = $this->getCode($this->getVal('dossier_instruction_type'));
10683     $val['dossier_suffixe'] = '';
10684     if ($this->getSuffixe($this->getVal('dossier_instruction_type')) === 't') {
10685     $val['dossier_suffixe'] = sprintf('%s%s',
10686     $this->getCode($this->getVal('dossier_instruction_type')),
10687 softime 14064 $this->get_di_numero_suffixe()
10688 softime 10573 );
10689     }
10690     /*$parameters = $this->f->getCollectivite($this->getVal('om_collectivite'));
10691     $val['insee'] = $parameters['insee'];*/
10692     $val['insee'] = $this->get_da_insee();
10693     $inst_ac = $this->get_inst_autorite_competente($val['autorite_competente']);
10694     $val['autorite_competente_code'] = $inst_ac->getVal('code');
10695 softime 10808 $val['source_depot'] = $this->get_source_depot_from_demande();
10696 softime 10573 return $val;
10697     }
10698    
10699     public function update_by_instruction(array $val, array $extra_params = array()) {
10700     $this->begin_treatment(__METHOD__);
10701     // XXX Supprime les champs qui n'existent pas dans dossier
10702     $valF = $val;
10703     unset($valF['instruction']);
10704 softime 10968 unset($valF['crud']);
10705 softime 10573 if (empty($valF) === false) {
10706     $res = $this->f->db->autoExecute(
10707     sprintf('%s%s', DB_PREFIXE, $this->table),
10708     $valF,
10709     DB_AUTOQUERY_UPDATE,
10710     sprintf("%s = '%s'", $this->clePrimaire, $this->getVal($this->clePrimaire))
10711     );
10712     $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);
10713     if ($this->f->isDatabaseError($res, true) === true) {
10714     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
10715     $this->correct = false;
10716     return $this->end_treatment(__METHOD__, false);
10717     }
10718     }
10719     $trigger = $this->trigger_update_by_instruction($val);
10720     if ($trigger === false) {
10721 softime 10808 $this->addToLog(__METHOD__."(): ".__("Erreur lors de la mise à jour par instruction."), DEBUG_MODE);
10722 softime 10573 $this->correct = false;
10723     return $this->end_treatment(__METHOD__, false);
10724     }
10725     return $this->end_treatment(__METHOD__, true);
10726     }
10727    
10728     protected function trigger_update_by_instruction(array $val, array $extra_params = array()) {
10729     foreach ($this->task_types as $task_type) {
10730     $method = sprintf('add_task_%s', $task_type);
10731     if (method_exists($this, $method) === true) {
10732     //
10733     if ($this->f->is_type_dossier_platau($this->getVal('dossier_autorisation')) === true
10734 softime 10808 && $this->getVal('etat_transmission_platau') !== 'jamais_transmissible'
10735     && ($this->f->is_option_mode_service_consulte_enabled() !== true
10736     || ($this->f->is_option_mode_service_consulte_enabled() === true
10737 softime 13137 && ($this->get_source_depot_from_demande() === PLATAU
10738     || $this->get_source_depot_from_demande() === PORTAL)))) {
10739 softime 10573 //
10740     $res = $this->$method($val, $extra_params);
10741     if ($res !== true) {
10742     return $res;
10743     }
10744     }
10745     }
10746     }
10747     return true;
10748     }
10749    
10750 softime 14064 /**
10751     * Ajoute une tâche pec_metier_consultation, sortante si le tableau des valeurs
10752     * contiens :
10753     * - une entrée "pec_metier" n'ont vide
10754     *
10755     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10756     * la tâche sera à l'état "draft". Sinon son état est "New".
10757     *
10758     * @param array $val : tableau de valeur servant à l'ajout de la tâche
10759     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10760     * à l'ajout de la tâche
10761     *
10762     * @return boolean true : traitement ok, false : erreur de traitement
10763     */
10764 softime 10573 protected function add_task_pec_metier_consultation(array $val, array $extra_params = array()) {
10765     if (array_key_exists("pec_metier", $val) === true
10766 softime 11228 && $val['pec_metier'] !== null
10767     && $val['pec_metier'] !== '') {
10768 softime 10573 //
10769     $inst_task = $this->f->get_inst__om_dbform(array(
10770     "obj" => "task",
10771     "idx" => 0,
10772     ));
10773     $task_val = array(
10774     'type' => 'pec_metier_consultation',
10775     'object_id' => $val['instruction'],
10776     'dossier' => $this->getVal($this->clePrimaire),
10777     );
10778     if ($this->f->is_option_mode_service_consulte_enabled() === false
10779     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10780     $task_val['state'] = $inst_task::STATUS_DRAFT;
10781     }
10782     $add_task = $inst_task->add_task(array('val' => $task_val));
10783     if ($add_task === false) {
10784     return false;
10785     }
10786     }
10787     return true;
10788     }
10789    
10790 softime 14064 /**
10791     * Ajoute une tâche qualification_DI, sortante si le tableau des valeurs
10792     * contiens :
10793     * - une entrée "autorite_competente" ayant une valeur différente de celle du dossier
10794     *
10795     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10796     * la tâche sera à l'état "draft". Sinon son état est "New".
10797     *
10798     * @param array $val : tableau de valeur servant à l'ajout de la tâche
10799     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10800     * à l'ajout de la tâche
10801     *
10802     * @return boolean true : traitement ok, false : erreur de traitement
10803     */
10804 softime 10573 protected function add_task_qualification_DI(array $val, array $extra_params = array()) {
10805     if (array_key_exists("autorite_competente", $val) === true
10806     && $val["autorite_competente"] !== $this->getVal('autorite_competente')) {
10807     //
10808     $inst_task = $this->f->get_inst__om_dbform(array(
10809     "obj" => "task",
10810     "idx" => 0,
10811     ));
10812     $task_val = array(
10813     'type' => 'qualification_DI',
10814     'object_id' => $val['instruction'],
10815     'dossier' => $this->getVal($this->clePrimaire),
10816     );
10817     if ($this->f->is_option_mode_service_consulte_enabled() === false
10818     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10819     $task_val['state'] = $inst_task::STATUS_DRAFT;
10820     }
10821     $add_task = $inst_task->add_task(array('val' => $task_val));
10822     if ($add_task === false) {
10823     return false;
10824     }
10825     }
10826     return true;
10827     }
10828    
10829 softime 14064 /**
10830     * Ajoute une tâche decision_DI, sortante si le tableau des valeurs
10831     * contiens :
10832     * - une entrée "date_decision" non vide
10833     * - une entrée "avis_decision" non vide
10834     * - une entrée "crud" qui n'a pas pour valeur 'delete'
10835     * et si l'avis de décision n'a pas de prescription.
10836     *
10837     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10838     * la tâche sera à l'état "draft". Sinon son état est "New".
10839     *
10840     * @param array $val : tableau de valeur servant à l'ajout de la tâche
10841     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10842     * à l'ajout de la tâche
10843     *
10844     * @return boolean true : traitement ok, false : erreur de traitement
10845     */
10846 softime 10573 protected function add_task_decision_DI(array $val, array $extra_params = array()) {
10847     if (array_key_exists("date_decision", $val) === true
10848     && array_key_exists("avis_decision", $val) === true
10849 softime 14542 && !empty($val['date_decision'])
10850     && !empty($val['avis_decision'])
10851 softime 14064 && array_key_exists("crud", $val) === true
10852     && $val['crud'] !== 'delete') {
10853 softime 10573 //
10854 softime 10869 $inst_ad = $this->f->get_inst__om_dbform(array(
10855     "obj" => "avis_decision",
10856     "idx" => $val['avis_decision'],
10857 softime 10573 ));
10858 softime 10869 if ($inst_ad->getVal('prescription') === 'f') {
10859     //
10860     $inst_task = $this->f->get_inst__om_dbform(array(
10861     "obj" => "task",
10862     "idx" => 0,
10863     ));
10864     $task_val = array(
10865     'type' => 'decision_DI',
10866     'object_id' => $val['instruction'],
10867     'dossier' => $this->getVal($this->clePrimaire),
10868     );
10869     if ($this->f->is_option_mode_service_consulte_enabled() === false
10870     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10871     $task_val['state'] = $inst_task::STATUS_DRAFT;
10872     }
10873     $add_task = $inst_task->add_task(array('val' => $task_val));
10874     if ($add_task === false) {
10875     return false;
10876     }
10877 softime 10573 }
10878     }
10879     return true;
10880     }
10881    
10882 softime 14064 /**
10883     * Ajoute une tâche avis_consultation, sortante si le tableau des valeurs
10884     * contiens :
10885     * - une entrée "date_decision" non vide
10886     * - une entrée "avis_decision" non vide
10887     * - une entrée "crud" qui n'a pas pour valeur 'delete'
10888     * et si l'avis de décision n'a pas de prescription.
10889     *
10890     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10891     * la tâche sera à l'état "draft". Sinon son état est "New".
10892     *
10893     * @param array $val : tableau de valeur servant à l'ajout de la tâche
10894     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10895     * à l'ajout de la tâche
10896     *
10897     * @return boolean true : traitement ok, false : erreur de traitement
10898     */
10899 softime 10573 protected function add_task_avis_consultation(array $val, array $extra_params = array()) {
10900     if (array_key_exists("date_decision", $val) === true
10901     && array_key_exists("avis_decision", $val) === true
10902 softime 14542 && !empty($val['date_decision'])
10903     && !empty($val['avis_decision'])
10904 softime 14064 && array_key_exists("crud", $val) === true
10905     && $val['crud'] !== 'delete') {
10906 softime 10573 //
10907 softime 10869 $inst_ad = $this->f->get_inst__om_dbform(array(
10908     "obj" => "avis_decision",
10909     "idx" => $val['avis_decision'],
10910 softime 10573 ));
10911 softime 10869 if ($inst_ad->getVal('prescription') === 'f') {
10912     //
10913     $inst_task = $this->f->get_inst__om_dbform(array(
10914     "obj" => "task",
10915     "idx" => 0,
10916     ));
10917     $task_val = array(
10918     'type' => 'avis_consultation',
10919     'object_id' => $val['instruction'],
10920     'dossier' => $this->getVal($this->clePrimaire),
10921     );
10922     if ($this->f->is_option_mode_service_consulte_enabled() === false
10923     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10924     $task_val['state'] = $inst_task::STATUS_DRAFT;
10925     }
10926     $add_task = $inst_task->add_task(array('val' => $task_val));
10927     if ($add_task === false) {
10928     return false;
10929     }
10930 softime 10573 }
10931 softime 10869 }
10932     return true;
10933     }
10934    
10935 softime 14064 /**
10936     * Ajoute une tâche prescription, sortante si le tableau des valeurs
10937     * contiens :
10938     * - une entrée "date_decision" non vide
10939     * - une entrée "avis_decision" non vide
10940     * - une entrée "crud" qui n'a pas pour valeur 'delete'
10941     * et si l'avis de décision à une prescription.
10942     *
10943     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10944     * la tâche sera à l'état "draft". Sinon son état est "New".
10945     *
10946     * @param array $val : tableau de valeur servant à l'ajout de la tâche
10947     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
10948     * à l'ajout de la tâche
10949     *
10950     * @return boolean true : traitement ok, false : erreur de traitement
10951     */
10952 softime 10869 protected function add_task_prescription(array $val, array $extra_params = array()) {
10953     if (array_key_exists("date_decision", $val) === true
10954     && array_key_exists("avis_decision", $val) === true
10955 softime 14542 && !empty($val['date_decision'])
10956     && !empty($val['avis_decision'])
10957 softime 14064 && array_key_exists("crud", $val) === true
10958     && $val['crud'] !== 'delete') {
10959 softime 10869 //
10960     $inst_ad = $this->f->get_inst__om_dbform(array(
10961     "obj" => "avis_decision",
10962     "idx" => $val['avis_decision'],
10963     ));
10964     if ($inst_ad->getVal('prescription') === 't') {
10965     //
10966     $inst_task = $this->f->get_inst__om_dbform(array(
10967     "obj" => "task",
10968     "idx" => 0,
10969     ));
10970     $task_val = array(
10971     'type' => 'prescription',
10972     'object_id' => $val['instruction'],
10973     'dossier' => $this->getVal($this->clePrimaire),
10974     );
10975     if ($this->f->is_option_mode_service_consulte_enabled() === false
10976     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
10977     $task_val['state'] = $inst_task::STATUS_DRAFT;
10978     }
10979     $add_task = $inst_task->add_task(array('val' => $task_val));
10980     if ($add_task === false) {
10981     return false;
10982     }
10983 softime 10573 }
10984     }
10985     return true;
10986     }
10987    
10988 softime 14064 /**
10989     * Ajoute une tâche completude_DI, sortante à l'état "draft" si le tableau des valeurs
10990     * contiens :
10991     * - une entrée "incomplet_notifie" qui a pour valeur 'f'
10992     * - une entrée "crud" qui n'a pas pour valeur 'delete'
10993     * - pas d'entrée "avis_decision"
10994     * - pas d'entrée "date_decision"
10995     *
10996     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
10997     * la tâche sera à l'état "draft". Sinon son état est "New".
10998     *
10999     * @param array $val : tableau de valeur servant à l'ajout de la tâche
11000     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11001     * à l'ajout de la tâche
11002     *
11003     * @return boolean true : traitement ok, false : erreur de traitement
11004     */
11005 softime 10573 protected function add_task_completude_DI(array $val, array $extra_params = array()) {
11006     if (array_key_exists("incomplet_notifie", $val) === true
11007 softime 10968 && $val['incomplet_notifie'] === 'f'
11008 softime 14064 && $this->getVal('incomplet_notifie') === 't'
11009 softime 10968 && array_key_exists("crud", $val) === true
11010 softime 14064 && $val['crud'] !== 'delete'
11011 softime 14542 && empty($val['date_decision'])
11012     && empty($val['avis_decision'])) {
11013 softime 10573 //
11014     $inst_task = $this->f->get_inst__om_dbform(array(
11015     "obj" => "task",
11016     "idx" => 0,
11017     ));
11018     $task_val = array(
11019     'type' => 'completude_DI',
11020     'object_id' => $val['instruction'],
11021     'dossier' => $this->getVal($this->clePrimaire),
11022     );
11023     if ($this->f->is_option_mode_service_consulte_enabled() === false
11024     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
11025     $task_val['state'] = $inst_task::STATUS_DRAFT;
11026     }
11027     $add_task = $inst_task->add_task(array('val' => $task_val));
11028     if ($add_task === false) {
11029     return false;
11030     }
11031     }
11032     return true;
11033     }
11034    
11035 softime 14064 /**
11036     * Ajoute une tâche incompletude_DI, sortante à l'état "draft" si le tableau des valeurs
11037     * contiens une entrée "incomplet_notifie" qui a pour valeur 't' et une entrée "crud"
11038     * qui n'a pas pour valeur 'delete'.
11039     * Si la tâche d'incompletude est bien ajoute une tâche lettre_incompletude est également
11040     * ajoutée.
11041     *
11042     * Si le mode service consulte n'est pas activé et que le dossier est "non transmissible"
11043     * la tâche incompletude_DI sera à l'état "draft". Sinon son état est "New".
11044     *
11045     * @param array $val : tableau de valeur servant à l'ajout de la tâche
11046     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11047     * à l'ajout de la tâche
11048     *
11049     * @return boolean true : traitement ok, false : erreur de traitement
11050     */
11051 softime 10573 public function add_task_incompletude_DI(array $val, array $extra_params = array()) {
11052     if (array_key_exists("incomplet_notifie", $val) === true
11053 softime 10968 && $val['incomplet_notifie'] === 't'
11054 softime 14064 && $this->getVal('incomplet_notifie') !== 't'
11055 softime 10968 && array_key_exists("crud", $val) === true
11056     && $val['crud'] !== 'delete') {
11057 softime 10573 //
11058     $inst_task = $this->f->get_inst__om_dbform(array(
11059     "obj" => "task",
11060     "idx" => 0,
11061     ));
11062     $task_val = array(
11063     'type' => 'incompletude_DI',
11064     'object_id' => $val['instruction'],
11065     'dossier' => $this->getVal($this->clePrimaire),
11066     );
11067     if ($this->f->is_option_mode_service_consulte_enabled() === false
11068     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
11069     $task_val['state'] = $inst_task::STATUS_DRAFT;
11070     }
11071     $add_task = $inst_task->add_task(array('val' => $task_val));
11072     if ($add_task === false) {
11073     return false;
11074     }
11075     }
11076     return true;
11077     }
11078    
11079 softime 14064 /**
11080     * Ajoute une tâche lettre_incompletude, sortante si le tableau des valeurs contiens une
11081     * entrée "incomplet_notifie" qui a pour valeur 't', que le dossier visé n'est pas déjà en
11082     * incomplet notifié, et une entrée "crud" qui n'a pas pour valeur
11083     * 'delete'.
11084     *
11085     * @param array $val : tableau de valeur servant à l'ajout de la tâche
11086     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11087     * à l'ajout de la tâche
11088     *
11089     * @return boolean true : traitement ok, false : erreur de traitement
11090     */
11091     public function add_task_lettre_incompletude(array $val, array $extra_params = array()) {
11092     if (array_key_exists("incomplet_notifie", $val) === true
11093     && $val['incomplet_notifie'] === 't'
11094     && $this->getVal('incomplet_notifie') !== 't'
11095     && array_key_exists("crud", $val) === true
11096     && $val['crud'] !== 'delete') {
11097     // Ajout de la tâche de lettre du premier mois
11098     $extra_params['type'] = 'incompletude';
11099     if ($this->add_task_lettre_petitionnaire($val, $extra_params) === false) {
11100     return false;
11101     }
11102     }
11103     return true;
11104     }
11105    
11106     /**
11107     * Ajoute une tâche lettre_majoration, sortante si le tableau des valeurs contiens une
11108     * entrée "delai" qui a une valeur différente du "delai" du dossier d'instruction
11109     * et une entrée "crud" qui n'a pas pour valeur 'delete'.
11110     *
11111     * @param array $val : tableau de valeur servant à l'ajout de la tâche
11112     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11113     * à l'ajout de la tâche
11114     *
11115     * @return boolean true : traitement ok, false : erreur de traitement
11116     */
11117     public function add_task_lettre_majoration(array $val, array $extra_params = array()) {
11118     if (array_key_exists("delai", $val) === true
11119     && $val['delai'] !== null
11120     && $val['delai'] !== ''
11121     && intval($this->getVal('delai')) !== 0
11122     && array_key_exists("crud", $val) === true
11123     && $val['crud'] !== 'delete') {
11124     // Ajout de la tâche de lettre du premier mois
11125     $extra_params['type'] = 'majoration';
11126     if ($this->add_task_lettre_petitionnaire($val, $extra_params) === false) {
11127     return false;
11128     }
11129     }
11130     return true;
11131     }
11132    
11133     /**
11134     * Ajoute une tâche de lettre au pétitionnaire en fonction du type fournis dans les
11135     * extra_params.
11136     * - si extra_params n'a pas d'entrée type ou que cette entrée est vide, ajoute une
11137     * tâche lettre_petitionnaire
11138     * - si l'entrée type existe et n'est pas vide ajoute une tâche lettre_[type fourni]
11139     * /!\ Seule les tâches lettre_majoration et lettre_incompletude existent pour le moment
11140     * et peuvent être ajoutée.
11141     *
11142     * L'instruction doit être liée directement ou indirectement à un courrier.
11143     *
11144     * @param array $val : tableau de valeur servant à l'ajout de la tâche
11145     * @param array $extra_params : tableau contenant des paramètres supplémentaire servant
11146     * à l'ajout de la tâche
11147     *
11148     * @return boolean true : traitement ok, false : erreur de traitement
11149     */
11150     public function add_task_lettre_petitionnaire(array $val, array $extra_params = array()) {
11151     // Vérification de l'existance d'un courrier
11152     $with_doc = false;
11153     if (array_key_exists("instruction", $val) === true
11154     && $val['instruction'] !== ''
11155     && $val['instruction'] !== null) {
11156     //
11157     $inst_instruction = $this->f->get_inst__om_dbform(array(
11158     'obj' => 'instruction',
11159     'idx' => $val['instruction']
11160     ));
11161     // L'instruction executant ce code n'est pas porteur du document
11162     if ($inst_instruction->getVal('lettretype') !== null
11163     && $inst_instruction->getVal('lettretype') !== '') {
11164     //
11165     $with_doc = true;
11166     } else {
11167     // Recherche dans les instructions liés s'il y a un document
11168     $inst_ev = $this->f->get_inst__om_dbform(array(
11169     "obj" => "evenement",
11170     "idx" => $inst_instruction->getVal('evenement'),
11171     ));
11172     if ($inst_ev->getVal('retour') === 't') {
11173     $instructions_related = $inst_instruction->get_related_instructions();
11174     foreach ($instructions_related as $instruction) {
11175     if ($instruction !== null && $instruction !== '') {
11176     $inst_related_instruction = $this->f->get_inst__om_dbform(array(
11177     "obj" => "instruction",
11178     "idx" => $instruction,
11179     ));
11180     if ($inst_related_instruction->getVal('om_fichier_instruction') !== null
11181     && $inst_related_instruction->getVal('om_fichier_instruction') !== '') {
11182     //
11183     $with_doc = true;
11184     }
11185     }
11186     }
11187     }
11188     }
11189     }
11190     //
11191     if ($with_doc === true) {
11192     $inst_task = $this->f->get_inst__om_dbform(array(
11193     "obj" => "task",
11194     "idx" => 0,
11195     ));
11196     $task_val = array(
11197     'type' => (! empty($extra_params['type']) ? 'lettre_'.$extra_params['type'] : 'lettre_petitionnaire'),
11198     'object_id' => $val['instruction'],
11199     'dossier' => $this->getVal($this->clePrimaire),
11200     );
11201     if ($this->f->is_option_mode_service_consulte_enabled() === false
11202     && $this->getVal('etat_transmission_platau') === 'non_transmissible') {
11203     $task_val['state'] = $inst_task::STATUS_DRAFT;
11204     }
11205     $add_task_lettre = $inst_task->add_task(array('val' => $task_val));
11206     return $add_task_lettre !== false;
11207     }
11208     return true;
11209     }
11210    
11211 softime 10573 public function get_parcelles($dossier = null) {
11212     if ($dossier === null) {
11213     $dossier = $this->getVal('dossier');
11214     }
11215     $query = sprintf('
11216     SELECT *
11217     FROM %1$sdossier_parcelle
11218     WHERE dossier = \'%2$s\'
11219     ORDER BY dossier_parcelle
11220     ',
11221     DB_PREFIXE,
11222     $dossier
11223     );
11224 softime 13137 $res = $this->f->get_all_results_from_db_query(
11225     $query,
11226     array(
11227     "origin" => __METHOD__,
11228     "force_return" => true,
11229     )
11230     );
11231 softime 10573 if ($res['code'] === 'KO') {
11232     return false;
11233     }
11234     return $res['result'];
11235     }
11236    
11237     protected function getDossier($champ = null) {
11238     return $this->getVal($this->clePrimaire);
11239     }
11240    
11241     protected function getDossierObject() {
11242     return $this;
11243     }
11244    
11245     /**
11246     * Recupère la source du dépôt
11247     *
11248     * @return string source du dépôt
11249     */
11250     public function get_source_depot_from_demande() {
11251     $demande = $this->get_inst_demande();
11252     return $demande->getVal('source_depot');
11253     }
11254    
11255 softime 13137 /**
11256     * Récupère l'instance de consultation entrante associé au dossier.
11257     *
11258     * @return consultation_entrante
11259     */
11260     public function get_inst_consultation_entrante() {
11261     $dossier = $this->getVal($this->clePrimaire);
11262     $qres = $this->f->get_one_result_from_db_query(
11263     sprintf(
11264     'SELECT
11265     consultation_entrante
11266     FROM
11267     %1$sconsultation_entrante
11268     WHERE
11269     dossier = \'%2$s\'',
11270     DB_PREFIXE,
11271     $this->f->db->escapeSimple($dossier)
11272     ),
11273     array(
11274     "origin" => __METHOD__
11275     )
11276     );
11277     $consultationEntrante = $this->f->get_inst__om_dbform(array(
11278     'obj' => 'consultation_entrante',
11279     'idx' => $qres['result']
11280     ));
11281     return $consultationEntrante;
11282     }
11283    
11284     /**
11285     * Récupère l'instance du département lié à la commune du dossier.
11286     *
11287     * @return departement
11288     */
11289     public function get_inst_departement_dossier() {
11290     // Si le dossier n'a pas de commune associé alors il n'est pas non
11291     // plus associé à un département. On renvoie donc null.
11292     if (empty($this->getVal('commune'))) {
11293     return null;
11294     }
11295     $qres = $this->f->get_one_result_from_db_query(
11296     sprintf(
11297     'SELECT
11298     departement
11299     FROM
11300     %1$scommune
11301     LEFT JOIN %1$sdepartement
11302     ON commune.dep = departement.dep
11303     WHERE
11304     commune = %2$s',
11305     DB_PREFIXE,
11306     $this->f->db->escapeSimple($this->getVal('commune'))
11307     ),
11308     array(
11309     "origin" => __METHOD__
11310     )
11311     );
11312     $departement = $this->f->get_inst__om_dbform(array(
11313     'obj' => 'departement',
11314     'idx' => $qres['result']
11315     ));
11316     return $departement;
11317     }
11318 softime 13528
11319    
11320     /**
11321     * Met à jour les informations (log) d'actions de localisation sur un dossier.
11322     *
11323     * @param string $action Nom de l'action.
11324     * @param string $date Date de l'action.
11325     * @param boolean $etat Etat de l'action.
11326     * @param string $message Message de retour de l'action.
11327     *
11328     * @return boolean false si erreur de traitement, true sinon.
11329     */
11330     public function update_dossier_geolocalisation($action, $date, $etat, $message, $dossier = null) {
11331     if ($dossier == null) {
11332     $dossier = $this->getVal('dossier');
11333     }
11334     require_once "../obj/dossier_geolocalisation.class.php";
11335     $dossier_geolocalisation = new dossier_geolocalisation(
11336     null,
11337     null,
11338     null,
11339     $dossier
11340     );
11341    
11342     return $dossier_geolocalisation->set_geolocalisation_state(
11343     $action,
11344     $date,
11345     $etat,
11346     $message
11347     );
11348     }
11349    
11350    
11351     /**
11352     * Retourne une instance du connecteur geoads, et la créer si elle n'existe pas.
11353     *
11354     * @param array $collectivite Informations de la collectivité.
11355     *
11356     * @return geoads Instance du connecteur.
11357     */
11358     protected function get_geoads_instance(array $collectivite, string $dossierIdx) {
11359     $extra_params = array(
11360     "inst_framework" => $this->f,
11361     "dossier_idx" => $dossierIdx,
11362     );
11363     // Instanciation de l'abstracteur geoads
11364     try {
11365     $this->geoads_instance = new geoads($collectivite, $extra_params);
11366     } catch (geoads_exception $e) {
11367     $this->handle_geoads_exception($e, $dossierIdx);
11368     return false;
11369     }
11370     return $this->geoads_instance;
11371     }
11372    
11373    
11374     /**
11375     * Traitement des erreurs retournées par l'abstracteur geoads.
11376     *
11377     * @param geoads_exception $exception Exception retournée par l'abstracteur.
11378     *
11379     * @return void
11380     */
11381     protected function handle_geoads_exception(geoads_exception $exception, $dossierId = null) {
11382     if ($dossierId == null) {
11383     $dossierId = $this->getVal("dossier");
11384     }
11385     // log le message d'erreur retourné par le webservice
11386     $this->f->addToLog(
11387     "geolocalisation : Traitement webservice SIG: id dossier = ".
11388     $dossierId." : ".$exception->getMessage(), DEBUG_MODE
11389     );
11390     $return['log'] = array(
11391     "date" => date('d/m/Y H:i:s'),
11392     "etat" => false,
11393     "message" => $exception->getMessage(),
11394     );
11395     if ($this->f->isAjaxRequest()) {
11396     echo json_encode($return);
11397     die(); // TODO traiter correctement les erreurs !
11398     } else {
11399     $this->f->displayMessage('error', $return["log"]["message"]);
11400     }
11401     }
11402    
11403    
11404     /**
11405     * Réplication de la géolocalisation d'un dossier sur un autre.
11406     *
11407     * @param string $di Identifiant du DI qui va être mis à jour
11408     * @param string $da Identifiant du DA associé au DI
11409     * @param string $collectivite Identifiant de la collectivité associée au DI
11410     * @param string $commune (Optionel) Identifiant de la commune associée au DI
11411     * @param string $ref (Optionel) Identifiant de DI contenant la géolocalisation à répliquer
11412     *
11413     * @return bool|string 'true' si tout s'est bien passé, sinon un message d'erreur
11414     */
11415     public function replicate_geolocalisation(string $di, string $da, string $collectivite,
11416     string $commune = null, string $ref = null) {
11417     $this->addToLog(__METHOD__."() BEGIN", EXTRA_VERBOSE_MODE);
11418    
11419     if (empty($di)) {
11420     $di = $this->getVal('dossier');
11421     }
11422    
11423     // si le sig est activé/configuré
11424     if ($this->f->is_option_sig_enabled($collectivite)) {
11425    
11426     // récupération du DI qui vient d'être créé
11427     if (empty($di_inst = $this->f->findObjectById('dossier', $di))) {
11428     return sprintf(
11429     __("Erreur lors de la récupération du DI %s (dossier non-trouvé)"),
11430     $di);
11431     }
11432    
11433     // si un dossier référence est spécifié
11434     if (! empty($ref)) {
11435     $prev_di_idx = $ref;
11436     $err_msg = sprintf(__("Erreur lors de la récupération du DI référence %s"), $ref);
11437     }
11438    
11439     // aucun dossier référence spécifié
11440     else {
11441    
11442     // si on est en mode service consulté, cela concerne des consultations
11443     // et il faut également rechercher un dossier de même type DI
11444     $sameTypeWhereCond = '';
11445     if ($this->f->is_option_mode_service_consulte_enabled($collectivite)) {
11446     $sameTypeWhereCond = 'AND dossier_instruction_type = '.
11447     intval($di_inst->getVal('dossier_instruction_type'));
11448     }
11449    
11450     // récupération du DI le plus récent sur le DA
11451     $qres = $this->f->get_one_result_from_db_query(
11452     sprintf("
11453     SELECT
11454     dossier
11455     FROM
11456     ".DB_PREFIXE."dossier
11457     WHERE
11458     om_collectivite = '%s'
11459     AND dossier_autorisation = '%s'
11460     AND version < %d
11461     AND dossier != '%s'
11462     $sameTypeWhereCond
11463     ORDER BY
11464     version DESC
11465     LIMIT 1
11466     ",
11467     $this->f->db->escapeSimple($collectivite),
11468     $this->f->db->escapeSimple($da),
11469     intval($di_inst->getVal('version')),
11470     $this->f->db->escapeSimple($di)),
11471     array(
11472     "origin" => __METHOD__,
11473     "force_return" => true,
11474     )
11475     );
11476     $err_msg = sprintf(
11477     __("Erreur lors de la récupération du DI le plus récent pour le DA %s"),
11478     $da);
11479     if ($qres["code"] !== "OK") {
11480     $this->addToLog(__METHOD__.'() '.$err_msg);
11481     return $err_msg;
11482     }
11483     if (empty($prev_di_idx = $qres["result"])) {
11484     $this->addToLog(__METHOD__.'() '.$err_msg." (pas de DI trouvé)");
11485     return $err_msg;
11486     }
11487     }
11488    
11489     $prev_di_inst = $this->f->findObjectById('dossier', $prev_di_idx);
11490     if (empty($prev_di_inst)) {
11491     $this->addToLog(__METHOD__.'() '.$err_msg);
11492     return $err_msg;
11493     }
11494    
11495     // si le DI le plus récent est géolocalisé
11496     if (! empty($prev_di_inst->getVal('geom'))) {
11497    
11498     // récupère une instance du connecteur SIG
11499     $collectivite_param = $this->f->getCollectivite($collectivite);
11500     $extra_params = array(
11501     "inst_framework" => $this->f,
11502     );
11503     if ($this->f->is_option_dossier_commune_enabled() === true
11504     && !empty($commune)) {
11505     $extra_params['commune_idx'] = $commune;
11506     }
11507     try {
11508     $geoads = new geoads($collectivite_param, $extra_params);
11509 softime 15037 } catch (Exception $e) {
11510 softime 13528 return __("Erreur lors de l'instanciation du connecteur sig").
11511     ' '.__("Détail: ").json_encode($e->getMessage());
11512     }
11513    
11514     // si le SIG implémente la fonctionnalité de réplication de la
11515     // géolocalisation d'un dossier à partir d'un autre
11516     if (method_exists($geoads, 'methodIsImplemented')
11517     && $geoads->methodIsImplemented('replicate_geolocalisation')) {
11518     try {
11519    
11520     // réplication de sa géolocalisation sur le DI courant
11521     if (! $geoads->replicate_geolocalisation($prev_di_idx, $di)) {
11522     $err_msg = sprintf(
11523     __("Erreur lors de la réplication de la géolocalisation du DI %s sur le DI %"),
11524     $prev_di_idx,
11525     $di);
11526     $this->addToLog(__METHOD__.'() '.$err_msg);
11527     return $err_msg;
11528     }
11529    
11530     // enregistrement du succès de la création du dossier/emprise
11531     $msg = sprintf(
11532     __("Emprise/dossier créé à partir du dossier %s"),
11533     $prev_di_idx);
11534 softime 14064 $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11535 softime 13528 $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11536     if (! $di_inst->update_dossier_geolocalisation('calcul_emprise', $now_dt_text, true, $msg)) {
11537     $err_msg = sprintf(
11538     __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information n'a pas pu être enregistré)"),
11539     $di, $prev_di_idx);
11540     $this->addToLog(__METHOD__.'() '.$err_msg);
11541     }
11542    
11543     // enregistrement du geom (centroide)
11544     $sql = sprintf("
11545     UPDATE
11546     ".DB_PREFIXE."dossier
11547     SET
11548     geom = public.ST_GeomFromText('%s', %s)
11549     WHERE
11550     dossier = '%s'",
11551     $prev_di_inst->getVal('geom'),
11552     $collectivite_param['sig']['sig_referentiel'],
11553     $this->f->db->escapeSimple($di)
11554     );
11555     $qres = $this->f->db->query($sql);
11556     if ($this->f->isDatabaseError($qres, true)) {
11557     $err_msg = sprintf(
11558     __("Erreur lors de l'enregistrement du centroide dans le dossier %s (le dossier a bien été créé/géolocalisé dans le SIG)"),
11559     $di);
11560     $this->addToLog(__METHOD__.'() '.$err_msg);
11561     }
11562     else {
11563    
11564     // enregistrement du message pour le centroide
11565     $msg = sprintf(
11566     __("Centroide récupéré à partir du dossier %s"),
11567     $prev_di_idx);
11568 softime 14064 $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11569 softime 13528 $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11570     if (! $di_inst->update_dossier_geolocalisation('calcul_centroide', $now_dt_text, true, $msg)) {
11571     $err_msg = sprintf(
11572     __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information sur le centroide n'a pas pu être enregistré)"),
11573     $di, $prev_di_idx);
11574     $this->addToLog(__METHOD__.'() '.$err_msg);
11575     }
11576    
11577     // réplication des contraintes
11578 softime 14064 $res = $this->f->get_all_results_from_db_query(
11579     sprintf('
11580     SELECT
11581     contrainte,
11582     texte_complete,
11583     reference
11584     FROM
11585     %1$sdossier_contrainte
11586     WHERE
11587     dossier = \'%2$s\'',
11588     DB_PREFIXE,
11589     $this->f->db->escapeSimple($prev_di_idx)
11590     ),
11591     array(
11592     "origin" => __METHOD__,
11593     "force_return" => true,
11594     )
11595     );
11596     if ($res['code'] === 'KO') {
11597 softime 13528 $err_msg = sprintf(
11598 softime 14064 __("Erreur lors de la récupération des contraintes sig du dossier %s."),
11599     $di);
11600 softime 13528 $this->addToLog(__METHOD__.'() '.$err_msg);
11601 softime 14064 } else {
11602     $add_all_dc = true;
11603     foreach ($res['result'] as $result) {
11604     $inst_dc = $this->f->get_inst__om_dbform(array(
11605     "obj" => "dossier_contrainte",
11606     "idx" => "]",
11607     ));
11608     $valF = array();
11609     foreach ($inst_dc->champs as $champ) {
11610     $valF[$champ] = null;
11611     }
11612     $valF['dossier'] = $di;
11613     $valF['contrainte'] = $result['contrainte'];
11614     $valF['texte_complete'] = $result['texte_complete'];
11615     $valF['reference'] = $result['reference'];
11616     $add_dc = $inst_dc->ajouter($valF);
11617     if ($add_dc === false) {
11618     $add_all_dc = false;
11619     $this->addToLog(__METHOD__."() ".sprintf(__("Erreur lors de l'enregistrement de la contrainte %s sur le dossier %s."), $valF['contrainte'], $valF['dossier'])." : ".$inst_dc->msg);
11620     }
11621     }
11622     if ($add_all_dc === false) {
11623 softime 13528 $err_msg = sprintf(
11624 softime 14064 __("Erreur lors de la réplication d'une ou des contraintes sig du dossier %s à partir du dossier %s (le dossier a bien été créé/géolocalisé dans le SIG)"),
11625 softime 13528 $di, $prev_di_idx);
11626     $this->addToLog(__METHOD__.'() '.$err_msg);
11627     }
11628 softime 14064
11629     // TODO recopie-t-on les données de la géolocalisation par disque (latitude/longitude/rayon) ?
11630    
11631     else {
11632    
11633     // enregistrement du message pour les contraintes
11634     $msg = sprintf(
11635     __("Contraintes récupérées à partir du dossier %s"),
11636     $prev_di_idx);
11637     $this->addToLog(__METHOD__."() msg: $msg", VERBOSE_MODE);
11638     $now_dt_text = (new Datetime())->format('Y-m-d H:i:s');
11639     if (! $di_inst->update_dossier_geolocalisation('recup_contrainte', $now_dt_text, true, $msg)) {
11640     $err_msg = sprintf(
11641     __("Erreur lors de la réplication de la géolocalisation du DI %s à partir du %s (le dossier a bien été créé/géolocalisé dans le SIG mais le message d'information sur les contraintes n'a pas pu être enregistré)"),
11642     $di, $prev_di_idx);
11643     $this->addToLog(__METHOD__.'() '.$err_msg);
11644     }
11645     }
11646 softime 13528 }
11647     }
11648     }
11649     catch(geoads_connector_method_not_implemented_exception $e) {
11650     $this->addToLog(__METHOD__."() Method not impletemented 'replicate_geolocalisation'");
11651     }
11652 softime 15037 catch(Exception $e) {
11653     $this->addToLog(__METHOD__."() ".get_class($e)." ".$e->getMessage());
11654     return false;
11655     }
11656 softime 13528 }
11657     }
11658     }
11659    
11660     return true;
11661     }
11662 softime 10573 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26