develop #195

Merged
judaur2005 merged 2 commits from develop into main 2026-03-23 19:56:07 +00:00
6 changed files with 257 additions and 108 deletions

View File

@@ -136,6 +136,7 @@ public class SecteurDecoupageServiceImpl implements SecteurDecoupageService {
.map(Secteur::getId) .map(Secteur::getId)
.toList(); .toList();
System.out.println(statutEnquete); System.out.println(statutEnquete);
System.out.println(secteurIds);
return enqueteBatimentRepository.findStatsEnqueteBatimentBySecteurs(secteurIds,statutEnquete); return enqueteBatimentRepository.findStatsEnqueteBatimentBySecteurs(secteurIds,statutEnquete);
} }

View File

@@ -551,19 +551,19 @@ BEGIN
CASE WHEN eb.categorie_usage = 'HABITATION' CASE WHEN eb.categorie_usage = 'HABITATION'
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
ELSE 0 ELSE 0
END, END,
-- tfu_calcule_taux_prop_parc -- tfu_calcule_taux_prop_parc
CASE WHEN eb.categorie_usage = 'HABITATION' CASE WHEN eb.categorie_usage = 'HABITATION'
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio
ELSE 0 ELSE 0
END, END,
-- valeur_locative_adm_sup_reel -- valeur_locative_adm_sup_reel
CASE WHEN eb.categorie_usage = 'HABITATION' CASE WHEN eb.categorie_usage = 'HABITATION'
THEN eb.superficie_au_sol * brb.valeur_locative THEN eb.superficie_au_sol * brb.valeur_locative
ELSE 0 ELSE 0
END, END,
-- --------------------------------------------------------------- -- ---------------------------------------------------------------
-- 🔧 CORRECTION : valeur_locative_adm avec tests explicites -- 🔧 CORRECTION : valeur_locative_adm avec tests explicites
@@ -597,13 +597,13 @@ BEGIN
NULLIF(eb.montant_locatif_annuel_estime, 0), 0) NULLIF(eb.montant_locatif_annuel_estime, 0), 0)
ELSE 0 ELSE 0
END, END,
-- tfu_superficie_au_sol_reel -- tfu_superficie_au_sol_reel
CASE WHEN eb.categorie_usage = 'HABITATION' CASE WHEN eb.categorie_usage = 'HABITATION'
THEN eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio THEN eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio * eb.nombre_piscine * v_tfu_piscine_unitaire
ELSE 0 ELSE 0
END, END,
-- tfu_piscine -- tfu_piscine
eb.nombre_piscine * v_tfu_piscine_unitaire, eb.nombre_piscine * v_tfu_piscine_unitaire,
@@ -654,14 +654,12 @@ BEGIN
END END
FROM calc FROM calc
), ),
v_taux_tfu, v_taux_tfu,
p.id, p.id,
b.id, b.id,
NULL, NULL,
ep.personne_id ep.personne_id
FROM parcelle p FROM parcelle p
-- Dernière enquête parcelle -- Dernière enquête parcelle
LEFT JOIN LATERAL ( LEFT JOIN LATERAL (
SELECT SELECT

View File

@@ -256,46 +256,95 @@ public interface EnqueteRepository extends JpaRepository<Enquete, Long> {
List<Enquete> findAllByParcelle_Id(Long parcelleId); List<Enquete> findAllByParcelle_Id(Long parcelleId);
// @Query(
// value = """
// SELECT DISTINCT
// d.id AS departement_id,
// d.code AS departement_code,
// d.nom AS departement_nom,
// COUNT(e.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement,
//
// c.id AS commune_id,
// c.code AS commune_code,
// c.nom AS commune_nom,
// COUNT(e.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune,
//
// a.id AS arrondissement_id,
// a.code AS arrondissement_code,
// a.nom AS arrondissement_nom,
// COUNT(e.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement,
//
// q.id AS quartier_id,
// q.code AS quartier_code,
// q.nom AS quartier_nom,
// COUNT(e.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier
//
// FROM enquete e
// JOIN parcelle p ON p.id = e.parcelle_id
// JOIN quartier q ON q.id = p.quartier_id
// JOIN arrondissement a ON a.id = q.arrondissement_id
// JOIN commune c ON c.id = a.commune_id
// JOIN departement d ON d.id = c.departement_id
//
// WHERE EXISTS (
// SELECT 1
// FROM secteur_decoupage sd
// WHERE sd.quartier_id = q.id
// AND sd.secteur_id IN (:secteurIds)
// )
// AND e.statut_enquete = :statutEnqueteParam
//
// ORDER BY d.nom, c.nom, a.nom, q.nom;
// """,
// nativeQuery = true
// )
// List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBySecteurs(
// @Param("secteurIds") List<Long> secteurIds,
// @Param("statutEnqueteParam") String statutEnqueteParam
// );
@Query( @Query(
value = """ value = """
SELECT DISTINCT SELECT DISTINCT
d.id AS departement_id, d.id AS departementId,
d.code AS departement_code, d.code AS departementCode,
d.nom AS departement_nom, d.nom AS departementNom,
COUNT(e.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement, COUNT(e.id) OVER (PARTITION BY d.id) AS nbParcellesDepartement,
c.id AS commune_id, c.id AS communeId,
c.code AS commune_code, c.code AS communeCode,
c.nom AS commune_nom, c.nom AS communeNom,
COUNT(e.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune, COUNT(e.id) OVER (PARTITION BY c.id) AS nbParcellesCommune,
a.id AS arrondissement_id, a.id AS arrondissementId,
a.code AS arrondissement_code, a.code AS arrondissementCode,
a.nom AS arrondissement_nom, a.nom AS arrondissementNom,
COUNT(e.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement, COUNT(e.id) OVER (PARTITION BY a.id) AS nbParcellesArrondissement,
q.id AS quartier_id, q.id AS quartierId,
q.code AS quartier_code, q.code AS quartierCode,
q.nom AS quartier_nom, q.nom AS quartierNom,
COUNT(e.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier COUNT(e.id) OVER (PARTITION BY q.id) AS nbParcellesQuartier
FROM enquete e FROM quartier q
JOIN parcelle p ON p.id = e.parcelle_id JOIN arrondissement a ON a.id = q.arrondissement_id
JOIN quartier q ON q.id = p.quartier_id JOIN commune c ON c.id = a.commune_id
JOIN arrondissement a ON a.id = q.arrondissement_id JOIN departement d ON d.id = c.departement_id
JOIN commune c ON c.id = a.commune_id JOIN parcelle p ON p.quartier_id = q.id
JOIN departement d ON d.id = c.departement_id
LEFT JOIN enquete e
WHERE EXISTS ( ON e.parcelle_id = p.id
SELECT 1 AND e.statut_enquete = :statutEnqueteParam
FROM secteur_decoupage sd
WHERE sd.quartier_id = q.id WHERE EXISTS (
AND sd.secteur_id IN (:secteurIds) SELECT 1
) FROM secteur_decoupage sd
AND e.statut_enquete = :statutEnqueteParam WHERE sd.quartier_id = q.id
AND sd.secteur_id IN (:secteurIds)
ORDER BY d.nom, c.nom, a.nom, q.nom; )
""",
ORDER BY d.nom, c.nom, a.nom, q.nom
""",
nativeQuery = true nativeQuery = true
) )
List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBySecteurs( List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBySecteurs(

View File

@@ -98,22 +98,22 @@ public interface ParcelleRepository extends JpaRepository<Parcelle, Long>, JpaSp
d.id AS departement_id, d.id AS departement_id,
d.code AS departement_code, d.code AS departement_code,
d.nom AS departement_nom, d.nom AS departement_nom,
COUNT(p.id) OVER (PARTITION BY d.id) AS nb_parcelles_departement, COUNT(p.id) OVER (PARTITION BY d.id) AS nbParcellesDepartement,
c.id AS commune_id, c.id AS commune_id,
c.code AS commune_code, c.code AS commune_code,
c.nom AS commune_nom, c.nom AS commune_nom,
COUNT(p.id) OVER (PARTITION BY c.id) AS nb_parcelles_commune, COUNT(p.id) OVER (PARTITION BY c.id) AS nbParcellesCommune,
a.id AS arrondissement_id, a.id AS arrondissement_id,
a.code AS arrondissement_code, a.code AS arrondissement_code,
a.nom AS arrondissement_nom, a.nom AS arrondissement_nom,
COUNT(p.id) OVER (PARTITION BY a.id) AS nb_parcelles_arrondissement, COUNT(p.id) OVER (PARTITION BY a.id) AS nbParcellesArrondissement,
q.id AS quartier_id, q.id AS quartier_id,
q.code AS quartier_code, q.code AS quartier_code,
q.nom AS quartier_nom, q.nom AS quartier_nom,
COUNT(p.id) OVER (PARTITION BY q.id) AS nb_parcelles_quartier COUNT(p.id) OVER (PARTITION BY q.id) AS nbParcellesQuartier
FROM quartier q FROM quartier q
JOIN arrondissement a ON a.id = q.arrondissement_id JOIN arrondissement a ON a.id = q.arrondissement_id

View File

@@ -480,36 +480,89 @@ public interface EnqueteBatimentRepository extends JpaRepository<EnqueteBatiment
); );
// @Query(
// value = """
// SELECT DISTINCT
// d.id AS departement_id,
// d.code AS departement_code,
// d.nom AS departement_nom,
// COUNT(eb.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement,
//
// c.id AS commune_id,
// c.code AS commune_code,
// c.nom AS commune_nom,
// COUNT(eb.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune,
//
// a.id AS arrondissement_id,
// a.code AS arrondissement_code,
// a.nom AS arrondissement_nom,
// COUNT(eb.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement,
//
// q.id AS quartier_id,
// q.code AS quartier_code,
// q.nom AS quartier_nom,
// COUNT(eb.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier
//
// FROM enquete_batiment eb
// JOIN batiment b ON b.id = eb.batiment_id
// JOIN parcelle p ON p.id = b.parcelle_id
// JOIN quartier q ON q.id = p.quartier_id
// JOIN arrondissement a ON a.id = q.arrondissement_id
// JOIN commune c ON c.id = a.commune_id
// JOIN departement d ON d.id = c.departement_id
//
// WHERE EXISTS (
// SELECT 1
// FROM secteur_decoupage sd
// WHERE sd.quartier_id = q.id
// AND sd.secteur_id IN (:secteurIds)
// )
// AND eb.statut_enquete = :statutEnqueteParam
//
// ORDER BY d.nom, c.nom, a.nom, q.nom;
// """,
// nativeQuery = true
// )
// List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBatimentBySecteurs(
// @Param("secteurIds") List<Long> secteurIds,
// @Param("statutEnqueteParam") String statutEnqueteParam
// );
@Query( @Query(
value = """ value = """
SELECT DISTINCT SELECT DISTINCT
d.id AS departement_id, d.id AS departement_id,
d.code AS departement_code, d.code AS departement_code,
d.nom AS departement_nom, d.nom AS departement_nom,
COUNT(e.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement, COUNT(eb.id) OVER (PARTITION BY d.id) AS nbParcellesDepartement,
c.id AS commune_id, c.id AS commune_id,
c.code AS commune_code, c.code AS commune_code,
c.nom AS commune_nom, c.nom AS commune_nom,
COUNT(e.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune, COUNT(eb.id) OVER (PARTITION BY c.id) AS nbParcellesCommune,
a.id AS arrondissement_id, a.id AS arrondissement_id,
a.code AS arrondissement_code, a.code AS arrondissement_code,
a.nom AS arrondissement_nom, a.nom AS arrondissement_nom,
COUNT(e.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement, COUNT(eb.id) OVER (PARTITION BY a.id) AS nbParcellesArrondissement,
q.id AS quartier_id, q.id AS quartier_id,
q.code AS quartier_code, q.code AS quartier_code,
q.nom AS quartier_nom, q.nom AS quartier_nom,
COUNT(e.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier COUNT(eb.id) OVER (PARTITION BY q.id) AS nbParcellesQuartier
FROM enquete_batiment eb FROM quartier q
JOIN batiment b ON b.id = eb.batiment_id
JOIN parcelle p ON p.id = b.parcelle_id
JOIN quartier q ON q.id = p.quartier_id
JOIN arrondissement a ON a.id = q.arrondissement_id JOIN arrondissement a ON a.id = q.arrondissement_id
JOIN commune c ON c.id = a.commune_id JOIN commune c ON c.id = a.commune_id
JOIN departement d ON d.id = c.departement_id JOIN departement d ON d.id = c.departement_id
JOIN parcelle p ON p.quartier_id = q.id
JOIN batiment b ON b.parcelle_id = p.id
-- LEFT JOIN ici
LEFT JOIN enquete_batiment eb
ON eb.batiment_id = b.id
AND eb.statut_enquete = :statutEnqueteParam
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
@@ -517,7 +570,6 @@ public interface EnqueteBatimentRepository extends JpaRepository<EnqueteBatiment
WHERE sd.quartier_id = q.id WHERE sd.quartier_id = q.id
AND sd.secteur_id IN (:secteurIds) AND sd.secteur_id IN (:secteurIds)
) )
AND e.statut_enquete = :statutEnqueteParam
ORDER BY d.nom, c.nom, a.nom, q.nom; ORDER BY d.nom, c.nom, a.nom, q.nom;
""", """,

View File

@@ -602,55 +602,104 @@ public interface EnqueteUniteLogementRepository extends JpaRepository<EnqueteUni
); );
@Query( // @Query(
value = """ // value = """
SELECT DISTINCT // SELECT DISTINCT
d.id AS departement_id, // d.id AS departement_id,
d.code AS departement_code, // d.code AS departement_code,
d.nom AS departement_nom, // d.nom AS departement_nom,
COUNT(e.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement, // COUNT(eul.id) OVER (PARTITION BY d.id) AS nb_enquetes_departement,
//
c.id AS commune_id, // c.id AS commune_id,
c.code AS commune_code, // c.code AS commune_code,
c.nom AS commune_nom, // c.nom AS commune_nom,
COUNT(e.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune, // COUNT(eul.id) OVER (PARTITION BY c.id) AS nb_enquetes_commune,
//
a.id AS arrondissement_id, // a.id AS arrondissement_id,
a.code AS arrondissement_code, // a.code AS arrondissement_code,
a.nom AS arrondissement_nom, // a.nom AS arrondissement_nom,
COUNT(e.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement, // COUNT(eul.id) OVER (PARTITION BY a.id) AS nb_enquetes_arrondissement,
//
q.id AS quartier_id, // q.id AS quartier_id,
q.code AS quartier_code, // q.code AS quartier_code,
q.nom AS quartier_nom, // q.nom AS quartier_nom,
COUNT(e.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier // COUNT(eul.id) OVER (PARTITION BY q.id) AS nb_enquetes_quartier
//
FROM enquete_unite_logement eul // FROM enquete_unite_logement eul
JOIN unite_logement ul on ul.id = eul.unite_logement_id // JOIN unite_logement ul on ul.id = eul.unite_logement_id
JOIN batiment b ON b.id = ul.batiment_id // JOIN batiment b ON b.id = ul.batiment_id
JOIN parcelle p ON p.id = b.parcelle_id // JOIN parcelle p ON p.id = b.parcelle_id
JOIN quartier q ON q.id = p.quartier_id // JOIN quartier q ON q.id = p.quartier_id
JOIN arrondissement a ON a.id = q.arrondissement_id // JOIN arrondissement a ON a.id = q.arrondissement_id
JOIN commune c ON c.id = a.commune_id // JOIN commune c ON c.id = a.commune_id
JOIN departement d ON d.id = c.departement_id // JOIN departement d ON d.id = c.departement_id
//
WHERE EXISTS ( // WHERE EXISTS (
SELECT 1 // SELECT 1
FROM secteur_decoupage sd // FROM secteur_decoupage sd
WHERE sd.quartier_id = q.id // WHERE sd.quartier_id = q.id
AND sd.secteur_id IN (:secteurIds) // AND sd.secteur_id IN (:secteurIds)
) // )
AND e.statut_enquete = :statutEnqueteParam // AND eul.statut_enquete = :statutEnqueteParam
//
ORDER BY d.nom, c.nom, a.nom, q.nom; // ORDER BY d.nom, c.nom, a.nom, q.nom;
""", // """,
nativeQuery = true // nativeQuery = true
) // )
List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBatimentBySecteurs( // List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBatimentBySecteurs(
@Param("secteurIds") List<Long> secteurIds, // @Param("secteurIds") List<Long> secteurIds,
@Param("statutEnqueteParam") String statutEnqueteParam // @Param("statutEnqueteParam") String statutEnqueteParam
); // );
@Query(
value = """
SELECT DISTINCT
d.id AS departementId,
d.code AS departementCode,
d.nom AS departementNom,
COUNT(eul.id) OVER (PARTITION BY d.id) AS nbParcellesDepartement,
c.id AS communeId,
c.code AS communeCode,
c.nom AS communeNom,
COUNT(eul.id) OVER (PARTITION BY c.id) AS nbParcellesCommune,
a.id AS arrondissementId,
a.code AS arrondissementCode,
a.nom AS arrondissementNom,
COUNT(eul.id) OVER (PARTITION BY a.id) AS nbParcellesArrondissement,
q.id AS quartierId,
q.code AS quartierCode,
q.nom AS quartierNom,
COUNT(eul.id) OVER (PARTITION BY q.id) AS nbParcellesQuartier
FROM quartier q
JOIN arrondissement a ON a.id = q.arrondissement_id
JOIN commune c ON c.id = a.commune_id
JOIN departement d ON d.id = c.departement_id
JOIN parcelle p ON p.quartier_id = q.id
JOIN batiment b ON b.parcelle_id = p.id
JOIN unite_logement ul ON ul.batiment_id = b.id
LEFT JOIN enquete_unite_logement eul
ON eul.unite_logement_id = ul.id
AND eul.statut_enquete = :statutEnqueteParam
WHERE EXISTS (
SELECT 1
FROM secteur_decoupage sd
WHERE sd.quartier_id = q.id
AND sd.secteur_id IN (:secteurIds)
)
ORDER BY d.nom, c.nom, a.nom, q.nom
""",
nativeQuery = true
)
List<ParcelleStatsProjectionUnSecteur> findStatsEnqueteBatimentBySecteurs(
@Param("secteurIds") List<Long> secteurIds,
@Param("statutEnqueteParam") String statutEnqueteParam
);
@Query( @Query(