From 799917c2e7b6526c85038e3223dc4ccfb650c0e0 Mon Sep 17 00:00:00 2001
From: "Yassine R." <riffi.yassine@gmail.com>
Date: Mon, 25 Mar 2024 14:59:02 +0100
Subject: [PATCH] fix(stats): add new age range

---
 .../usagerHistoryStatesRepository.service.ts  |  29 ++++++++----------
 .../_templates/export-structure-stats.xlsx    | Bin 14543 -> 14508 bytes
 ...StructureStatsWorksheetSection1Renderer.ts |  10 ++----
 ...tureStatsInPeriodGenerator.service.spec.ts |   7 ++---
 .../StructureStatsTranchesAge.interface.ts    |   7 ++---
 .../structure-stats.component.html            |  20 +++---------
 6 files changed, 25 insertions(+), 48 deletions(-)

diff --git a/packages/backend/src/database/services/usager/usagerHistoryStatesRepository.service.ts b/packages/backend/src/database/services/usager/usagerHistoryStatesRepository.service.ts
index 059c0a3a3f..1d6d76dcf9 100644
--- a/packages/backend/src/database/services/usager/usagerHistoryStatesRepository.service.ts
+++ b/packages/backend/src/database/services/usager/usagerHistoryStatesRepository.service.ts
@@ -59,10 +59,10 @@ async function getStructureStatsQuestionsAtDateValidUsagers({
       ,count(distinct uh."usagerUUID") filter (where date_part('year', age( $3, u."dateNaissance" at time zone 'utc')) :: int < 18) as v_u_age_mineur
       ,count(distinct uh."usagerUUID") filter (where date_part('year', age( $3, u."dateNaissance" at time zone 'utc')) :: int >= 18) as v_u_age_majeur
 
-      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_0_14' ) as v_u_age_0_14
-      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_15_19' ) as v_u_age_15_19
-      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_20_24' ) as v_u_age_20_24
-      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_25_29' ) as v_u_age_25_29
+
+      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_0_17' ) as v_u_age_0_17
+      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_18_25' ) as v_u_age_18_25
+      ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_26_29' ) as v_u_age_26_29
       ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_30_34' ) as v_u_age_30_34
       ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_35_39' ) as v_u_age_35_39
       ,count(distinct usager_tranche.uuid) filter ( where usager_tranche.tranche_age = 'T_40_44' ) as v_u_age_40_44
@@ -138,10 +138,9 @@ async function getStructureStatsQuestionsAtDateValidUsagers({
         select
           u2.uuid,
           CASE
-            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 15 THEN 'T_0_14'
-            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 20 THEN 'T_15_19'
-            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 25 THEN 'T_20_24'
-            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 30 THEN 'T_25_29'
+            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 18 THEN 'T_0_17'
+            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 26 THEN 'T_18_25'
+            WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 30 THEN 'T_26_29'
             WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 35 THEN 'T_30_34'
             WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 40 THEN 'T_35_39'
             WHEN date_part('year',  age( $3, u2."dateNaissance" at time zone 'utc' )) :: int < 45 THEN 'T_40_44'
@@ -256,10 +255,9 @@ async function getStructureStatsQuestionsAtDateValidUsagers({
         usagers: {
           mineurs: parseInt(r.v_u_age_mineur, 10),
           majeurs: parseInt(r.v_u_age_majeur, 10),
-          t_0_14: parseInt(r.v_u_age_0_14, 10),
-          t_15_19: parseInt(r.v_u_age_15_19, 10),
-          t_20_24: parseInt(r.v_u_age_20_24, 10),
-          t_25_29: parseInt(r.v_u_age_25_29, 10),
+          t_0_17: parseInt(r.v_u_age_0_17, 10),
+          t_18_25: parseInt(r.v_u_age_18_25, 10),
+          t_26_29: parseInt(r.v_u_age_26_29, 10),
           t_30_34: parseInt(r.v_u_age_30_34, 10),
           t_35_39: parseInt(r.v_u_age_35_39, 10),
           t_40_44: parseInt(r.v_u_age_40_44, 10),
@@ -346,10 +344,9 @@ async function getStructureStatsQuestionsAtDateValidUsagers({
       usagers: {
         mineurs: 0,
         majeurs: 0,
-        t_0_14: 0,
-        t_15_19: 0,
-        t_20_24: 0,
-        t_25_29: 0,
+        t_0_17: 0,
+        t_18_25: 0,
+        t_26_29: 0,
         t_30_34: 0,
         t_35_39: 0,
         t_40_44: 0,
diff --git a/packages/backend/src/excel/_templates/export-structure-stats.xlsx b/packages/backend/src/excel/_templates/export-structure-stats.xlsx
index c324492aaf19dee6a3a36a0dcd1d07d4cf24700a..8473959ddf4d91e7a308f555ef2a653e91e43334 100644
GIT binary patch
delta 6008
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
R$bly40x`%VUg3X~{{y-SOv(TN

delta 6069
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
BbC>`C

diff --git a/packages/backend/src/excel/export-structure-stats/worksheet-renderer/exportStructureStatsWorksheetSection1Renderer.ts b/packages/backend/src/excel/export-structure-stats/worksheet-renderer/exportStructureStatsWorksheetSection1Renderer.ts
index 2b08b5fa45..afdb38f802 100644
--- a/packages/backend/src/excel/export-structure-stats/worksheet-renderer/exportStructureStatsWorksheetSection1Renderer.ts
+++ b/packages/backend/src/excel/export-structure-stats/worksheet-renderer/exportStructureStatsWorksheetSection1Renderer.ts
@@ -64,16 +64,10 @@ function renderSection1ValidUsagers(context: {
     value: data.age.usagers.majeurs,
   });
   worksheetRendered.renderCell(i++, "c", {
-    value: data.age.usagers.t_0_14,
+    value: data.age.usagers.t_18_25,
   });
   worksheetRendered.renderCell(i++, "c", {
-    value: data.age.usagers.t_15_19,
-  });
-  worksheetRendered.renderCell(i++, "c", {
-    value: data.age.usagers.t_20_24,
-  });
-  worksheetRendered.renderCell(i++, "c", {
-    value: data.age.usagers.t_25_29,
+    value: data.age.usagers.t_26_29,
   });
   worksheetRendered.renderCell(i++, "c", {
     value: data.age.usagers.t_30_34,
diff --git a/packages/backend/src/stats/services/structureStatsInPeriodGenerator.service.spec.ts b/packages/backend/src/stats/services/structureStatsInPeriodGenerator.service.spec.ts
index 868d0c06f9..90513d6545 100644
--- a/packages/backend/src/stats/services/structureStatsInPeriodGenerator.service.spec.ts
+++ b/packages/backend/src/stats/services/structureStatsInPeriodGenerator.service.spec.ts
@@ -78,10 +78,9 @@ describe("structureStatsInPeriodGenerator", () => {
           usagers: {
             majeurs: 3,
             mineurs: 0,
-            t_0_14: 0,
-            t_15_19: 0,
-            t_20_24: 1,
-            t_25_29: 0,
+            t_0_17: 1,
+            t_18_25: 1,
+            t_26_29: 0,
             t_30_34: 1,
             t_35_39: 0,
             t_40_44: 1,
diff --git a/packages/common/src/structure-stats/interfaces/StructureStatsTranchesAge.interface.ts b/packages/common/src/structure-stats/interfaces/StructureStatsTranchesAge.interface.ts
index 11bfacd583..2f08e889fe 100644
--- a/packages/common/src/structure-stats/interfaces/StructureStatsTranchesAge.interface.ts
+++ b/packages/common/src/structure-stats/interfaces/StructureStatsTranchesAge.interface.ts
@@ -1,10 +1,9 @@
 export interface StructureStatsTranchesAge {
   mineurs: number;
   majeurs: number;
-  t_0_14: number;
-  t_15_19: number;
-  t_20_24: number;
-  t_25_29: number;
+  t_0_17: number;
+  t_18_25: number;
+  t_26_29: number;
   t_30_34: number;
   t_35_39: number;
   t_40_44: number;
diff --git a/packages/frontend/src/app/modules/stats/components/structure-stats/structure-stats.component.html b/packages/frontend/src/app/modules/stats/components/structure-stats/structure-stats.component.html
index ee9a069214..009ae96c3f 100644
--- a/packages/frontend/src/app/modules/stats/components/structure-stats/structure-stats.component.html
+++ b/packages/frontend/src/app/modules/stats/components/structure-stats/structure-stats.component.html
@@ -299,27 +299,15 @@ <h2>
               </td>
             </tr>
             <tr>
-              <th scope="row" class="soustable">Moins de 15 ans</th>
+              <th scope="row" class="soustable">18-25 ans</th>
               <td class="stats-table-value">
-                {{ stats.data.validUsagers.age.usagers.t_0_14 }}
+                {{ stats.data.validUsagers.age.usagers.t_18_25 }}
               </td>
             </tr>
             <tr>
-              <th scope="row" class="soustable">15-19 ans</th>
+              <th scope="row" class="soustable">26-29 ans</th>
               <td class="stats-table-value">
-                {{ stats.data.validUsagers.age.usagers.t_15_19 }}
-              </td>
-            </tr>
-            <tr>
-              <th scope="row" class="soustable">20-24 ans</th>
-              <td class="stats-table-value">
-                {{ stats.data.validUsagers.age.usagers.t_20_24 }}
-              </td>
-            </tr>
-            <tr>
-              <th scope="row" class="soustable">25-29 ans</th>
-              <td class="stats-table-value">
-                {{ stats.data.validUsagers.age.usagers.t_25_29 }}
+                {{ stats.data.validUsagers.age.usagers.t_26_29 }}
               </td>
             </tr>
             <tr>