".__("dossiers d'instruction"); $tab_title = __("DI"); // Pour le formulaire de géocodage par lot // Change le nom de l'onglet principal et cache les autres onglets if ($f->get_submitted_get_value('action') === '126'){ $tab_title = __("Géolocalisation des dossiers"); $sousformulaire = array(); } /* Test SQL pour récupérer les bons champs selon la qualité du demandeur : * particulier ou personne morale*/ $case_demandeur = "CASE WHEN demandeur.qualite='particulier' THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom)) ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination)) END"; /* Section de construction de la variable $table : tables sur lequels la recherche va s'effectuer cette variable sera utiliée comme FROM pour les écrans incluant dossier_instruction.inc.php nous ajoutons donc des paramètres d'Optimisation des requetes SQL selon les écrans */ // Traitement des 1ers tables à inclure // SQL d'origine de la recherche $table_debut_old = sprintf(' -- Recherche le pétitionnaire principal du dossier (unique !) LEFT JOIN %1$slien_dossier_demandeur ON lien_dossier_demandeur.dossier = dossier.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE INNER JOIN %1$sdemandeur ON demandeur.demandeur = lien_dossier_demandeur.demandeur AND demandeur.type_demandeur = \'petitionnaire\' -- Recherche l etat du dossier LEFT JOIN %1$setat ON dossier.etat = etat.etat ', DB_PREFIXE ); // SQL permetant d'accelere les 'encours' et les 'clotures' $table_debut_optimiser_lien_demandeurs = sprintf( '-- Recherche l etat du dossier JOIN %1$setat ON dossier.etat = etat.etat', DB_PREFIXE ); // Traitement des tables générales // SQL d'origine de la recherche $table_middle = sprintf( '-- Recherche le type de DATD INNER JOIN %1$sdossier_instruction_type ON dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type INNER JOIN %1$sdossier_autorisation_type_detaille ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_instruction_type.dossier_autorisation_type_detaille -- Recherche l instructeur du dossier LEFT JOIN %1$sinstructeur ON dossier.instructeur = instructeur.instructeur LEFT JOIN %1$som_utilisateur ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur -- Recherche l instructeur 2 du dossier LEFT JOIN %1$sinstructeur as instructeur_secondaire ON dossier.instructeur_2 = instructeur_secondaire.instructeur LEFT JOIN %1$som_utilisateur as utilisateur_2 ON instructeur_secondaire.om_utilisateur = utilisateur_2.om_utilisateur -- Recherche la division de rattachement du dossier (différente de celle de l instructeur) LEFT JOIN %1$sdivision ON dossier.division = division.division -- Recherche l avis de décision LEFT JOIN %1$savis_decision ON avis_decision.avis_decision=dossier.avis_decision -- Recherche la collectivite de rattachement du dossier INNER JOIN %1$som_collectivite ON dossier.om_collectivite=om_collectivite.om_collectivite -- Recherche l arrondissement du dossier LEFT JOIN %1$sarrondissement ON arrondissement.code_postal = dossier.terrain_adresse_code_postal -- Récupère la demande qui a créé le type dossier du dossier LEFT JOIN (%1$sdemande JOIN %1$sdemande_type ON demande.demande_type = demande_type.demande_type ) ON demande.dossier_instruction = dossier.dossier AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type ', DB_PREFIXE ); // Traitement des dernières tables à inclure // SQL d'origine de la recherche $table_end_old = ""; // SQL permetant d'accelere les 'encours' et les 'clotures' $table_end_optimiser_lien_demandeurs = sprintf(' -- Recherche le pétitionnaire principal du dossier (unique !) JOIN %1$slien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur AND demandeur.type_demandeur = \'petitionnaire\' ', DB_PREFIXE ); $table = sprintf( '%1$sdossier %2$s %3$s %4$s', DB_PREFIXE, $table_debut_old, $table_middle, $table_end_old ); // Génération de la sortie selon le paramètrage if ( isset($optimisation_demandeurs) && $optimisation_demandeurs == true ){ $table = sprintf( '%1$sdossier %2$s %3$s %4$s', DB_PREFIXE, $table_debut_optimiser_lien_demandeurs, $table_middle, $table_end_optimiser_lien_demandeurs ); } if ($f->is_option_dossier_commune_enabled()) { $table .= " LEFT OUTER JOIN ".DB_PREFIXE."commune ON commune.commune = dossier.commune "; } $champ_date_depot_mairie = 'to_char(dossier.date_depot_mairie ,\'DD/MM/YYYY\') as "'.__("dépôt mairie").'"'; /*Champs du début de la requête*/ $champAffiche_debut_commun = $array_base_ct_select_champaffiche; if ($f->is_option_dossier_commune_enabled()) { $champAffiche_debut_commun[] = 'commune.libelle as "'.__("commune").'"'; } array_push($champAffiche_debut_commun, $case_demandeur.' as "'.__("petitionnaire").'"', $trim_concat_terrain.'as "'.__("localisation").'"', 'dossier_autorisation_type_detaille.libelle as "'.__("type").'"', 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("dépôt").'"', 'to_char(dossier.date_complet ,\'DD/MM/YYYY\') as "'.__("complétude").'"', 'CASE WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE THEN to_char(dossier.date_limite_incompletude ,\'DD/MM/YYYY\') ELSE to_char(dossier.date_limite ,\'DD/MM/YYYY\') END as "'.__("limite").'"' ); if ($f->is_option_date_depot_mairie_enabled() === true) { $champAffiche_debut_commun[] = $champ_date_depot_mairie; } /** * Colonne "Nature des travaux" (regroupe les descriptions des données * techniques). */ // Nombre max de caractères à afficher dans la colonne de la nature des travaux // avant de tronquer la valeur et d'ajouter une ellipse "…" $max_chars = 40; // // description/nature des travaux. En cas de modif, bloc de code aussi présent dans // dossier.form.inc.php (le formulaire du DI)', 'om_requete' et 'stats à la demande' $description_projet_select = sprintf( "-- use_column_name_to_sort ( SELECT CASE WHEN nature_travaux.libelle IS NULL AND char_length(description_projet.libelle) <= %2\$s THEN CONCAT( '', REPLACE(description_projet.libelle, '\n', '
'), '
') WHEN nature_travaux.libelle IS NULL AND char_length(description_projet.libelle) > %2\$s THEN CONCAT( '', REPLACE(left (description_projet.libelle, %2\$s), '\n', '
') || '…', '
') WHEN nature_travaux.libelle IS NOT NULL AND ARRAY_LENGTH(STRING_TO_ARRAY(nature_travaux.libelle, '\n'), 1) = 1 THEN CONCAT( '', REPLACE(nature_travaux.libelle, '\n', '
'), '
') WHEN nature_travaux.libelle IS NOT NULL AND ARRAY_LENGTH(STRING_TO_ARRAY(nature_travaux.libelle, '\n'), 1) > 1 THEN CONCAT( '', SPLIT_PART(nature_travaux.libelle, '\n', 1), '
', '[...]', '
') END AS \"nature des travaux\" FROM ( SELECT dossier_instruction, CONCAT_WS( '\n', CASE WHEN co_projet_desc = '' THEN NULL ELSE TRIM(co_projet_desc) END, CASE WHEN ope_proj_desc = '' THEN NULL ELSE TRIM(ope_proj_desc) END, CASE WHEN am_projet_desc = '' THEN NULL ELSE TRIM(am_projet_desc) END, CASE WHEN dm_projet_desc = '' THEN NULL ELSE TRIM(dm_projet_desc) END, CASE WHEN donnees_techniques.erp_cstr_neuve IS TRUE THEN '".str_replace("'", "''", __('erp_cstr_neuve'))."' END, CASE WHEN donnees_techniques.erp_trvx_acc IS TRUE THEN '".str_replace("'", "''", __('erp_trvx_acc'))."' END, CASE WHEN donnees_techniques.erp_extension IS TRUE THEN '".str_replace("'", "''", __('erp_extension'))."' END, CASE WHEN donnees_techniques.erp_rehab IS TRUE THEN '".str_replace("'", "''", __('erp_rehab'))."' END, CASE WHEN donnees_techniques.erp_trvx_am IS TRUE THEN '".str_replace("'", "''", __('erp_trvx_am'))."' END, CASE WHEN donnees_techniques.erp_vol_nouv_exist IS TRUE THEN '".str_replace("'", "''", __('erp_vol_nouv_exist'))."' END, CASE WHEN mh_design_appel_denom = '' THEN NULL ELSE TRIM(mh_design_appel_denom) END, CASE WHEN mh_loc_denom = '' THEN NULL ELSE TRIM(mh_loc_denom) END ) as libelle FROM %1\$sdonnees_techniques WHERE donnees_techniques.dossier_instruction = dossier.dossier ) as description_projet LEFT JOIN ( SELECT ntc.dossier, string_agg(ntc.libelle::text, '\n' ORDER BY ntc.libelle) AS libelle FROM ( SELECT DISTINCT dossier, famille_travaux.libelle AS famille_travaux, CONCAT(famille_travaux.libelle, ' / ', nature_travaux.libelle) AS libelle FROM %1\$slien_dossier_nature_travaux INNER JOIN %1\$snature_travaux ON lien_dossier_nature_travaux.nature_travaux = nature_travaux.nature_travaux INNER JOIN %1\$sfamille_travaux ON nature_travaux.famille_travaux = famille_travaux.famille_travaux WHERE lien_dossier_nature_travaux.dossier = dossier.dossier ORDER BY famille_travaux.libelle ) AS ntc GROUP BY dossier ORDER BY libelle ) AS nature_travaux ON description_projet.dossier_instruction = nature_travaux.dossier ) AS \"".__("nature des travaux").'"', DB_PREFIXE, $max_chars ); // On ne veut cette colonne que dans les trois listings "Recherche", // "Mes encours" et "Tous les encours" $listings = array("dossier_instruction", "dossier_instruction_mes_encours", "dossier_instruction_tous_encours"); // $is_in_obj_whitelist = in_array($obj, $listings); // La variable $retourformulaire permet de s'assurer que l'on est pas dans un // sous-tableau if ($is_in_obj_whitelist === true && $retourformulaire === '') { // Modifie les colonnes à afficher en début du tableau $champAffiche_debut_commun = $array_base_ct_select_champaffiche; if ($f->is_option_dossier_commune_enabled()) { $champAffiche_debut_commun[] = 'commune.libelle as "'.__("commune").'"'; } array_push($champAffiche_debut_commun, $case_demandeur.' as "'.__("petitionnaire").'"', $trim_concat_terrain.'as "'.__("localisation").'"', 'dossier_autorisation_type_detaille.libelle as "'.__("type").'"', $description_projet_select, 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("dépôt").'"', 'to_char(dossier.date_complet ,\'DD/MM/YYYY\') as "'.__("complétude").'"', 'CASE WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE THEN to_char(dossier.date_limite_incompletude ,\'DD/MM/YYYY\') ELSE to_char(dossier.date_limite ,\'DD/MM/YYYY\') END as "'.__("limite").'"' ); if ($f->is_option_date_depot_mairie_enabled() === true) { $champAffiche_debut_commun[] = $champ_date_depot_mairie; } } /*Champs de la fin de la requête*/ $champAffiche_fin_commun = array( 'etat.libelle as "'.__("etat").'"', $select_enjeux_dossier, ); // if ($_SESSION['niveau'] == '2') { array_push($champAffiche_fin_commun, "om_collectivite.libelle as \"".__("collectivite")."\""); } // Identifie s'il y a déjà un WHERE dans la requête if (stripos($selection, "WHERE") === false) { $selection .= " WHERE "; } else { $selection .= " AND "; } // Les dossiers des contentieux sont gérés dans un autre listing, il ne doivent // pas apparaître dans la liste des dossiers d'instruction de l'onglet instruction -> recherche // /!\ l'opérateur != exclus les valeurs null. Il faut donc préciser que les groupe ayant un // code NULL doivent bien être récupérés. $selection .= " (groupe.code IS NULL OR groupe.code != 'CTX')"; $instructeur_nom = 'CASE WHEN instructeur.nom IS NOT NULL AND division.code IS NOT NULL THEN CONCAT(\'\', instructeur.nom, \' (\', division.code, \')\', \'\') WHEN instructeur.nom IS NOT NULL AND division.code IS NULL THEN instructeur.nom ELSE instructeur.nom END as "'.__("instructeur").'"'; /*Liste des champs affichés dans le tableau de résultat*/ $champAffiche = array_merge( $champAffiche_debut_commun, array( $instructeur_nom, ), $champAffiche_fin_commun ); // Suppression du bouton d'ajout, qui n'est pas affiché par défaut dans les listings de // dossiers d'instruction $tab_actions['corner']['ajouter'] = NULL; if (isset($_GET['message_help']) && ! is_null($_GET['message_help']) && $_GET['message_help'] != "" && $_GET['module'] == 'tab') { $tab_actions['left']["consulter"]['id'] .= '&message_help='.urlencode($_GET['message_help']); $tab_actions['content'] = $tab_actions['left']["consulter"]; } // Liste des autres dossiers d'instructions if ($retourformulaire== 'dossier_instruction'){ $champAffiche = array( 'dossier.dossier as "'.__("dossier_instruction").'"', 'dossier.geom as "geom_picto"', 'demande.source_depot as "demat_picto"', $select__dossier_libelle__column_as, ); if ($f->is_option_dossier_commune_enabled()) { $champAffiche[] = 'c.libelle as "'.__("commune").'"'; } array_push($champAffiche, 'dossier_instruction_type.libelle as "'.__("demande_type").'"', 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("dépôt").'"', 'dossier.etat as "'.__("etat").'"' ); $table =DB_PREFIXE.'dossier as a JOIN '.DB_PREFIXE.'dossier_autorisation ON a.dossier_autorisation=dossier_autorisation.dossier_autorisation JOIN '.DB_PREFIXE.'dossier as dossier ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation JOIN '.DB_PREFIXE.'dossier_instruction_type ON dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type'; if ($f->is_option_dossier_commune_enabled()) { $table .= ' JOIN '.DB_PREFIXE.'commune as c ON c.commune = dossier.commune'; } $selection = 'WHERE a.dossier=\''.$f->db->escapeSimple($idxformulaire).'\''; $tri= "order by dossier.date_depot ASC"; // $tab_actions['left']["consulter"] = array('lien' => ''.OM_ROUTE_FORM.'&obj=dossier_instruction&action=3'.'&idx=', 'id' => '&retourformulaire='.$retourformulaire.'&retour=', 'lib' => ''.__('Consulter').'', 'rights' => array('list' => array('dossier_instruction', 'dossier_instruction_consulter'), 'operator' => 'OR'), 'ordre' => 10, 'ajax' => false); $tab_actions['content'] = $tab_actions['left']["consulter"]; $options[] = array( "type"=>"pagination_select", "display"=>false, ); } if ( $retourformulaire == "dossier_autorisation") { // $tab_actions['left']["consulter"] = array('lien' => ''.OM_ROUTE_FORM.'&obj=dossier_instruction&action=3&idx=', 'id' => '&retourformulaire='.$retourformulaire, 'lib' => ''.__('Consulter').'', 'rights' => array('list' => array('dossier_instruction', 'dossier_instruction_consulter'), 'operator' => 'OR'), 'ordre' => 10, 'ajax' => false); $tab_actions['content'] = $tab_actions['left']["consulter"] ; } // Affichage du bouton de redirection vers le SIG externe si configuré // XXX Ajouter filtre pour afficher l'icone géolocalisation en fonction de la conf SIG du dossier if($f->getParameter('option_sig') == 'sig_externe') { $tab_actions['left']["localiser-sig-externe"] = array( 'lien' => ''.OM_ROUTE_FORM.'&obj=dossier_instruction&action=140&idx=', 'id' => '', 'lib' => ''.__('Localiser').'', 'rights' => array('list' => array('dossier_instruction', 'dossier_instruction_consulter'), 'operator' => 'OR'), 'ordre' => 20, 'target' => "_SIG", 'ajax' => false); } // Si filtre DI auxquels on peut proposer une autre décision // /!\ Requête lié à celles permettant de savoir si l'instructeur peut changer la // décision et à l'affichage du widgets des dossiers éligibles au changement : // * instruction.class.php : isInstrCanChangeDecision() // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise() // TODO ; faire évoluer cette affichage pour reprendre celui des DI (avec la recherche avancée) if (isset($extra_parameters["filtre_decision"]) && $extra_parameters["filtre_decision"] == true) { // Augmentation de la limite $serie = 50; // Réinitialisation des options $options = array(); // Suppression de la recherche avancée $options[] = array( 'type' => 'search', 'display' => false); // Suppression du sélecteur de pages $options[] = array( 'type' => 'pagination_select', 'display' => false); // Ajout jointure $table = sprintf( '%1$sdossier JOIN %1$setat ON dossier.etat = etat.etat AND etat.statut = \'encours\' JOIN %1$slien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE JOIN %1$sdossier_instruction_type ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type JOIN %1$sdossier_autorisation_type_detaille ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille -- Récupère la demande qui a créé le type dossier du dossier LEFT JOIN (%1$sdemande JOIN %1$sdemande_type ON demande.demande_type = demande_type.demande_type ) ON demande.dossier_instruction = dossier.dossier AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type JOIN %1$sinstruction -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour ON instruction.instruction = ( SELECT instruction FROM %1$sinstruction JOIN %1$sevenement ON instruction.evenement=evenement.evenement AND evenement.retour IS FALSE WHERE instruction.dossier = dossier.dossier ORDER BY date_evenement DESC, instruction DESC LIMIT 1 ) -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée -- ou alors pour laquelle l instruction a été ajouté par la commune et est -- non signée, non notifié, etc. AND (instruction.om_final_instruction IS TRUE OR instruction.created_by_commune IS TRUE) AND instruction.date_retour_signature IS NULL AND instruction.date_envoi_rar IS NULL AND instruction.date_retour_rar IS NULL AND instruction.date_envoi_controle_legalite IS NULL AND instruction.date_retour_controle_legalite IS NULL -- On vérifie que l instruction soit un arrêté ou un changement de décision JOIN %1$sevenement ON instruction.evenement=evenement.evenement AND (evenement.type = \'arrete\' OR evenement.type = \'changement_decision\') -- Recherche les informations du pétitionnaire principal pour l affichage JOIN %1$sdemandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur -- Recherche la collectivité rattachée à l instructeur JOIN %1$sinstructeur ON dossier.instructeur=instructeur.instructeur JOIN %1$sdivision ON instructeur.division=division.division JOIN %1$sdirection ON division.direction=direction.direction JOIN %1$som_collectivite ON direction.om_collectivite=om_collectivite.om_collectivite ', DB_PREFIXE ); // Modification sélection $selection = "WHERE dossier_instruction_type.sous_dossier IS NOT TRUE AND om_collectivite.niveau = '2'"; // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci if ($f->isCollectiviteMono($_SESSION['collectivite']) === true) { $selection .= " AND dossier.om_collectivite=".$_SESSION['collectivite']; } // Modification tri $tri = " ORDER BY dossier.dossier "; } // Ajout de la gestion des groupes et confidentialité à la requête du listing $sqlFiltreGroup = $this->get_sql_filtre_groupe($table.$selection); $selection .= $sqlFiltreGroup['WHERE']; $table .= $sqlFiltreGroup['FROM']; // Ajout du filtrage des sous dossier à la requête d'affichage du listing $sqlFiltreSD = $this->get_sql_filtre_sous_dossier($table.$selection); $selection .= $sqlFiltreSD['WHERE']; $table .= $sqlFiltreSD['FROM']; // Si l'option qui permet de masquer les colonnes comporte la localisation // ou le champ date_complet alors on masque la colonne $param_affichage_col = $f->get_affichage_di_listing_colonnes_masquees(); if (! empty($param_affichage_col)) { if (array_search('localisation', $param_affichage_col) !== false) { $key_champaff = array_search($trim_concat_terrain.'as "'.__("localisation").'"', $champAffiche); unset($champAffiche[$key_champaff]); $champAffiche = array_values($champAffiche); // Gestion pour les listings tous_encours et tous_cloture $key_champaff_commun = array_search($trim_concat_terrain.'as "'.__("localisation").'"', $champAffiche_debut_commun); unset($champAffiche_debut_commun[$key_champaff_commun]); $champAffiche_debut_commun = array_values($champAffiche_debut_commun); } if (array_search('date_complet', $param_affichage_col) !== false) { $key_champaff = array_search('to_char(dossier.date_complet ,\'DD/MM/YYYY\') as "'.__("complétude").'"', $champAffiche); unset($champAffiche[$key_champaff]); $champAffiche = array_values($champAffiche); // Gestion pour les listings tous_encours et tous_cloture $key_champaff_commun = array_search('to_char(dossier.date_complet ,\'DD/MM/YYYY\') as "'.__("complétude").'"', $champAffiche_debut_commun); unset($champAffiche_debut_commun[$key_champaff_commun]); $champAffiche_debut_commun = array_values($champAffiche_debut_commun); } } ?>