From d998e46beba409b8a5845a5d54cdd9d9fa7f96a6 Mon Sep 17 00:00:00 2001 From: Yassine R Date: Tue, 2 Jan 2024 23:20:41 +0100 Subject: [PATCH] feat(stats): add 'actifs' in dashboard --- packages/backend/src/_common/model/index.ts | 1 - .../stats/AdminStructureStatsData.type.ts | 31 --- .../_common/model/stats/StatsPeriod.type.ts | 1 - .../backend/src/_common/model/stats/index.ts | 3 - .../_common/model/structure-stats/index.ts | 1 + ...76787763-fix-last-interaction-migration.ts | 1 + .../admin-structures.controller.ts | 2 +- .../services/admin-structures.service.ts | 11 +- .../usager/usagerRepository.service.ts | 21 +- .../_templates/export-stats-deploiement.xlsx | Bin 17306 -> 17397 bytes .../StatsDeploiementExportModel.type.ts | 5 + .../exportStatsGlobalesWorksheetRenderer.ts | 22 +- .../src/stats/services/publicStats.service.ts | 2 +- .../AdminStructureStatsData.interface.ts | 25 +++ packages/common/src/stats/interfaces/index.ts | 1 + .../components/home/home.component.html | 2 +- .../manage-usagers-table.component.ts | 7 +- .../manage-usagers-table.html | 3 +- .../stats-charts/stats-charts.component.html | 2 +- .../step-footer/step-footer.component.html | 2 +- .../step-footer/step-footer.component.ts | 8 + ...profil-historique-decisions.component.html | 2 +- .../profil-courriers.component.html | 2 +- .../delete-usager-menu.component.html | 198 +++++++++--------- .../delete-usager-menu.component.ts | 3 + .../stats/AdminStructureStatsData.type.ts | 36 ---- .../src/_common/stats/StatsTerritory.type.ts | 7 - .../portail-admins/src/_common/stats/index.ts | 2 - .../admin-structures-stats.component.html | 26 ++- .../admin-structures-stats.component.ts | 7 +- .../vm/AdminStructuresStatsVM.type.ts | 9 +- .../adminStructuresStatsVmBuilder.service.ts | 2 +- .../admin-structures-api-client.service.ts | 3 +- .../shared/store/AppStoreAction.type.ts | 6 +- .../shared/store/AppStoreModel.type.ts | 6 +- .../shared/store/structuresCache.service.ts | 6 +- 36 files changed, 242 insertions(+), 224 deletions(-) delete mode 100644 packages/backend/src/_common/model/stats/AdminStructureStatsData.type.ts delete mode 100644 packages/backend/src/_common/model/stats/StatsPeriod.type.ts delete mode 100644 packages/backend/src/_common/model/stats/index.ts create mode 100644 packages/common/src/stats/interfaces/AdminStructureStatsData.interface.ts delete mode 100644 packages/portail-admins/src/_common/stats/AdminStructureStatsData.type.ts delete mode 100644 packages/portail-admins/src/_common/stats/StatsTerritory.type.ts diff --git a/packages/backend/src/_common/model/index.ts b/packages/backend/src/_common/model/index.ts index c743fdefad..7bd9cfb909 100644 --- a/packages/backend/src/_common/model/index.ts +++ b/packages/backend/src/_common/model/index.ts @@ -7,7 +7,6 @@ export * from "./contact-support"; export * from "./interaction"; export * from "./jwt"; export * from "./message-sms"; -export * from "./stats"; export * from "./structure"; export * from "./structure-doc"; export * from "./structure-stats"; diff --git a/packages/backend/src/_common/model/stats/AdminStructureStatsData.type.ts b/packages/backend/src/_common/model/stats/AdminStructureStatsData.type.ts deleted file mode 100644 index e93df7ba3e..0000000000 --- a/packages/backend/src/_common/model/stats/AdminStructureStatsData.type.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { InteractionType } from "@domifa/common"; - -export type AdminStructureStatsData = { - usersCount: number; - structuresCount: number; - usagersDocumentsCount: number; - // structures: StructureAdminForList[]; - structuresCountByRegion: { - region: string; - count: number; - }[]; - structuresCountByTypeMap: { - [type: string]: number; - }; - structuresCountBySmsEnabled: number; - interactionsCountByTypeMap: { - [statut in InteractionType]: number; - }; - usagersCountByStatutMap: { - [statut: string]: number; - }; - usagersValidCountByStructureMap: { - [structureId: string]: number; - }; - usagersAllCountByStructureMap: { - [structureId: string]: number; - }; - usagersAyantsDroitsCountByStructureMap: { - [structureId: string]: number; - }; -}; diff --git a/packages/backend/src/_common/model/stats/StatsPeriod.type.ts b/packages/backend/src/_common/model/stats/StatsPeriod.type.ts deleted file mode 100644 index af0ba0e197..0000000000 --- a/packages/backend/src/_common/model/stats/StatsPeriod.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type StatsPeriod = "days" | "months"; diff --git a/packages/backend/src/_common/model/stats/index.ts b/packages/backend/src/_common/model/stats/index.ts deleted file mode 100644 index 64cdbbbc36..0000000000 --- a/packages/backend/src/_common/model/stats/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -//@index('./*', f => `export * from '${f.path}'`) -export * from "./AdminStructureStatsData.type"; -export * from "./StatsPeriod.type"; diff --git a/packages/backend/src/_common/model/structure-stats/index.ts b/packages/backend/src/_common/model/structure-stats/index.ts index b14e660758..7ac364075c 100644 --- a/packages/backend/src/_common/model/structure-stats/index.ts +++ b/packages/backend/src/_common/model/structure-stats/index.ts @@ -1,3 +1,4 @@ +// @index('./*', f => `export * from '${f.path}'`) export * from "./StructureStats.type"; export * from "./StructureStatsFull.type"; export * from "./StructureStatsQuestionsAtDateValidUsagers.type"; diff --git a/packages/backend/src/_migrations/1703676787763-fix-last-interaction-migration.ts b/packages/backend/src/_migrations/1703676787763-fix-last-interaction-migration.ts index 7576f2ba90..4cc53682f7 100644 --- a/packages/backend/src/_migrations/1703676787763-fix-last-interaction-migration.ts +++ b/packages/backend/src/_migrations/1703676787763-fix-last-interaction-migration.ts @@ -72,6 +72,7 @@ export class FixLastInteractionMigration1703676787763 ) > 0 ) { const log = { + ref: usager.ref, structureId: usager.structureId, before: usager.lastInteraction.dateInteraction, after: dateInteractionOut, diff --git a/packages/backend/src/_portail-admin/admin-structures/controllers/admin-structures.controller.ts b/packages/backend/src/_portail-admin/admin-structures/controllers/admin-structures.controller.ts index 465cd29be0..dd2e7f907f 100644 --- a/packages/backend/src/_portail-admin/admin-structures/controllers/admin-structures.controller.ts +++ b/packages/backend/src/_portail-admin/admin-structures/controllers/admin-structures.controller.ts @@ -35,7 +35,6 @@ import { dataCompare } from "../../../util/dataCompare.service"; import { ExpressResponse } from "../../../util/express"; import { AdminStructureListData, - AdminStructureStatsData, Structure, StructureAdmin, UserStructureAuthenticated, @@ -47,6 +46,7 @@ import { UsersController } from "../../../users/users.controller"; import { RegisterUserAdminDto } from "../../../users/dto"; import { format } from "date-fns"; import { structureCreatorService } from "../../../structures/services"; +import { AdminStructureStatsData } from "@domifa/common"; @UseGuards(AuthGuard("jwt"), AppUserGuard) @Controller("admin/structures") diff --git a/packages/backend/src/_portail-admin/admin-structures/services/admin-structures.service.ts b/packages/backend/src/_portail-admin/admin-structures/services/admin-structures.service.ts index 3153b1a7c4..2b338c6a0f 100644 --- a/packages/backend/src/_portail-admin/admin-structures/services/admin-structures.service.ts +++ b/packages/backend/src/_portail-admin/admin-structures/services/admin-structures.service.ts @@ -16,17 +16,14 @@ import { usagerDocsRepository } from "../../../database/services/usager/usagerDo import { StatsDeploiementExportModel } from "../../../excel/export-stats-deploiement"; import { StatsDeploiementStructureExportModel } from "../../../excel/export-stats-deploiement/StatsDeploiementStructureExportModel.type"; import { FranceRegion } from "../../../util/territoires"; -import { - AdminStructureListData, - AdminStructureStatsData, - StructureAdmin, -} from "../../../_common/model"; +import { AdminStructureListData, StructureAdmin } from "../../../_common/model"; import { StatsByLocality, StatsByMonth, StructureType, InteractionType, UsagerDecisionStatut, + AdminStructureStatsData, } from "@domifa/common"; @Injectable() @@ -55,8 +52,10 @@ export class AdminStructuresService { const structuresCountBySmsEnabled = await this.getStructuresWithSms(); const structuresCount = await structureRepository.count(); + const usagersActifs = await usagerRepository.countTotalActifs(); const stats: AdminStructureStatsData = { + usagersActifs, structuresCount, usagersValidCountByStructureMap, usagersAyantsDroitsCountByStructureMap, @@ -345,10 +344,12 @@ export class AdminStructuresService { const interactionsCountByStatut = await this.getInteractionsCountByTypeMap(); + const usagersActifs = await usagerRepository.countTotalActifs(); const stats: StatsDeploiementExportModel = { exportDate: new Date(), structures: structuresModels, + usagersActifs, usagersAllCountByStructureId: usagersAllCountByStructureMap, usagersValideCountByStructureId: usagersValidCountByStructureMap, usagersAyantsDroitsByStructureId: usagersAyantsDroitsCountByStructureMap, diff --git a/packages/backend/src/database/services/usager/usagerRepository.service.ts b/packages/backend/src/database/services/usager/usagerRepository.service.ts index e74fb5c442..a4077a5eb4 100644 --- a/packages/backend/src/database/services/usager/usagerRepository.service.ts +++ b/packages/backend/src/database/services/usager/usagerRepository.service.ts @@ -127,9 +127,19 @@ async function countTotalUsagers(structuresId?: number[]): Promise { return usagers + ayantsDroits; } -async function countTotalActifs(): Promise { - const usagers: [{ actifs: string }] = await usagerRepository.query(` +async function countTotalActifs(): Promise<{ + domicilies: number; + ayantsDroits: number; + actifs: number; +}> { + const usagers: { + domicilies: string; + ayantsDroits: string; + actifs: string; + }[] = await usagerRepository.query(` SELECT + COUNT(DISTINCT uh."usagerUUID") as "domicilies", + COALESCE(SUM(jsonb_array_length(state->'ayantsDroits')), 0) as "ayantsDroits", COUNT(DISTINCT uh."usagerUUID") + COALESCE(SUM(jsonb_array_length(state->'ayantsDroits')), 0) AS "actifs" FROM "usager_history" uh JOIN usager u ON uh."usagerUUID" = u.uuid JOIN jsonb_array_elements(uh.states) AS state ON true WHERE @@ -137,8 +147,11 @@ async function countTotalActifs(): Promise { AND (state->>'historyBeginDate')::timestamptz < CURRENT_DATE + INTERVAL '1 day' AND (state->>'historyEndDate' is null OR (state->>'historyEndDate')::timestamptz >= CURRENT_DATE + INTERVAL '1 day' ) `); - - return parseInt(usagers[0].actifs, 10); + return { + domicilies: parseInt(usagers[0].domicilies, 10), + ayantsDroits: parseInt(usagers[0].ayantsDroits, 10), + actifs: parseInt(usagers[0].actifs, 10), + }; } async function countMigratedUsagers(): Promise { diff --git a/packages/backend/src/excel/_templates/export-stats-deploiement.xlsx b/packages/backend/src/excel/_templates/export-stats-deploiement.xlsx index 5678753a0c52ea77b0ad052a57d0a7451e22ea7e..aa06c7830f2383b59cd5f8e5899812578f9af75b 100644 GIT binary patch delta 4370 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 diff --git a/packages/backend/src/excel/export-stats-deploiement/StatsDeploiementExportModel.type.ts b/packages/backend/src/excel/export-stats-deploiement/StatsDeploiementExportModel.type.ts index b2535352a8..4c6c9b61c0 100644 --- a/packages/backend/src/excel/export-stats-deploiement/StatsDeploiementExportModel.type.ts +++ b/packages/backend/src/excel/export-stats-deploiement/StatsDeploiementExportModel.type.ts @@ -12,6 +12,11 @@ export type StatsDeploiementExportModel = { region: string; count: number; }[]; + usagersActifs: { + domicilies: number; + ayantsDroits: number; + actifs: number; + }; usersCount: number; docsCount: number; interactionsCountByStatut: { diff --git a/packages/backend/src/excel/export-stats-deploiement/worksheet-renderer/exportStatsGlobalesWorksheetRenderer.ts b/packages/backend/src/excel/export-stats-deploiement/worksheet-renderer/exportStatsGlobalesWorksheetRenderer.ts index 1c6ab3d56a..bcce486d1c 100644 --- a/packages/backend/src/excel/export-stats-deploiement/worksheet-renderer/exportStatsGlobalesWorksheetRenderer.ts +++ b/packages/backend/src/excel/export-stats-deploiement/worksheet-renderer/exportStatsGlobalesWorksheetRenderer.ts @@ -35,6 +35,7 @@ function renderWorksheet({ renderExportDate(); renderUsagersCountByStatus(); renderStructuresCountByRegion(); + renderTotalActifs(); renderStructuresCountByType(); renderUsersDocsCount(); renderInteractionsCountByType(); @@ -63,9 +64,21 @@ function renderWorksheet({ value: stats.usagersCountByStatut.AYANTS_DROITS, }); } + function renderTotalActifs() { + let i = 13; + worksheetRendered.renderCell(i++, "b", { + value: stats.usagersActifs.actifs, + }); + worksheetRendered.renderCell(i++, "b", { + value: stats.usagersActifs.domicilies, + }); + worksheetRendered.renderCell(i++, "b", { + value: stats.usagersActifs.ayantsDroits, + }); + } function renderStructuresCountByType() { - let i = 13; + let i = 18; worksheetRendered.renderCell(i++, "b", { value: stats.structures.length, }); @@ -82,8 +95,9 @@ function renderWorksheet({ value: stats.structuresCountByType["mairie"], }); } + function renderInteractionsCountByType() { - let i = 23; + let i = 28; worksheetRendered.renderCell(i++, "b", { value: stats.interactionsCountByStatut["appel" as InteractionType], }); @@ -127,10 +141,10 @@ function renderWorksheet({ } function renderUsersDocsCount() { - worksheetRendered.renderCell(19, "b", { + worksheetRendered.renderCell(24, "b", { value: stats.usersCount, }); - worksheetRendered.renderCell(20, "b", { + worksheetRendered.renderCell(25, "b", { value: stats.docsCount, }); } diff --git a/packages/backend/src/stats/services/publicStats.service.ts b/packages/backend/src/stats/services/publicStats.service.ts index c92b9db7b2..be403bec3a 100644 --- a/packages/backend/src/stats/services/publicStats.service.ts +++ b/packages/backend/src/stats/services/publicStats.service.ts @@ -71,7 +71,7 @@ export class PublicStatsService implements OnModuleInit { "courrierIn" ), usagers: await usagerRepository.countTotalUsagers(), - actifs: await usagerRepository.countTotalActifs(), + actifs: (await usagerRepository.countTotalActifs()).actifs, }; await this.cacheManager.set("home-stats", homeStats); diff --git a/packages/common/src/stats/interfaces/AdminStructureStatsData.interface.ts b/packages/common/src/stats/interfaces/AdminStructureStatsData.interface.ts new file mode 100644 index 0000000000..76a17c5e1b --- /dev/null +++ b/packages/common/src/stats/interfaces/AdminStructureStatsData.interface.ts @@ -0,0 +1,25 @@ +import { type InteractionType } from "../../interactions"; + +export interface AdminStructureStatsData { + usersCount: number; + structuresCount: number; + usagersDocumentsCount: number; + usagersActifs: { + domicilies: number; + ayantsDroits: number; + actifs: number; + }; + structuresCountByRegion: Array<{ + region: string; + count: number; + }>; + structuresCountByTypeMap: Record; + structuresCountBySmsEnabled: number; + interactionsCountByTypeMap: { + [statut in InteractionType]: number; + }; + usagersCountByStatutMap: Record; + usagersValidCountByStructureMap: Record; + usagersAllCountByStructureMap: Record; + usagersAyantsDroitsCountByStructureMap: Record; +} diff --git a/packages/common/src/stats/interfaces/index.ts b/packages/common/src/stats/interfaces/index.ts index f31e834d58..1f5171f06d 100644 --- a/packages/common/src/stats/interfaces/index.ts +++ b/packages/common/src/stats/interfaces/index.ts @@ -1,2 +1,3 @@ // @index('./*', f => `export * from '${f.path}'`) +export * from "./AdminStructureStatsData.interface"; export * from "./HomeStats.interface"; diff --git a/packages/frontend/src/app/modules/general/components/home/home.component.html b/packages/frontend/src/app/modules/general/components/home/home.component.html index 6ef4371386..3cf82e792c 100644 --- a/packages/frontend/src/app/modules/general/components/home/home.component.html +++ b/packages/frontend/src/app/modules/general/components/home/home.component.html @@ -262,7 +262,7 @@

[options]="countOptions" class="display-4 fw-bold text-primary" > -
domiciliés
+
dossiers enregistrés
diff --git a/packages/frontend/src/app/modules/usager-dossier/components/step-footer/step-footer.component.html b/packages/frontend/src/app/modules/usager-dossier/components/step-footer/step-footer.component.html index 43b177ee99..be8c86ace6 100644 --- a/packages/frontend/src/app/modules/usager-dossier/components/step-footer/step-footer.component.html +++ b/packages/frontend/src/app/modules/usager-dossier/components/step-footer/step-footer.component.html @@ -6,7 +6,7 @@

Commentaires privés

Historique des décisions

{{ histo.userName }} diff --git a/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.html b/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.html index b1d4a88222..3efec5f567 100644 --- a/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.html +++ b/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.html @@ -1,108 +1,110 @@ -
-
- -
- +
- +
+ +
- - Supprimer cette demande - + +
- - + - - - + - - + Annuler + + + - - - + + + + diff --git a/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.ts b/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.ts index 100ebda91b..79d844962c 100644 --- a/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.ts +++ b/packages/frontend/src/app/modules/usager-shared/components/delete-usager-menu/delete-usager-menu.component.ts @@ -12,6 +12,7 @@ import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; import { DEFAULT_MODAL_OPTIONS, UsagerLight, + UserStructure, } from "../../../../../_common/model"; import { CustomToastService } from "../../../shared/services/custom-toast.service"; @@ -39,6 +40,7 @@ export class DeleteUsagerMenuComponent implements OnInit, OnDestroy { public previousStatus: string; public loading: boolean; public isAdmin: boolean; + public me!: UserStructure | null; public readonly DECISION_LABELS: { [key in UsagerDecisionStatut]: string; @@ -61,6 +63,7 @@ export class DeleteUsagerMenuComponent implements OnInit, OnDestroy { this.loading = false; this.previousStatus = ""; + this.me = this.authService.currentUserValue; } public ngOnInit(): void { diff --git a/packages/portail-admins/src/_common/stats/AdminStructureStatsData.type.ts b/packages/portail-admins/src/_common/stats/AdminStructureStatsData.type.ts deleted file mode 100644 index 6b0e81599f..0000000000 --- a/packages/portail-admins/src/_common/stats/AdminStructureStatsData.type.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { - InteractionType, - StructureType, - UsagerDecisionStatut, -} from "@domifa/common"; -import { StructureAdmin } from "../structure/StructureAdmin.type"; -import { StatsByRegion } from "./StatsByRegion.type"; - -export type AdminStructureStatsData = { - usersCount: number; - structuresCount: number; - usagersDocumentsCount: number; - structures: (StructureAdmin & { - usersCount?: number; // dashboard only - })[]; - structuresCountByRegion: StatsByRegion; - structuresCountByTypeMap: { - [type in StructureType | "total"]: number; - }; - structuresCountBySmsEnabled: number; - interactionsCountByTypeMap: { - [type in InteractionType]: number; - }; - usagersCountByStatutMap: { - [statut in UsagerDecisionStatut | "TOUS"]: number; - }; - usagersAyantsDroitsCountByStructureMap: { - [structureId: string]: number; - }; - usagersValidCountByStructureMap: { - [structureId: string]: number; - }; - usagersAllCountByStructureMap: { - [structureId: string]: number; - }; -}; diff --git a/packages/portail-admins/src/_common/stats/StatsTerritory.type.ts b/packages/portail-admins/src/_common/stats/StatsTerritory.type.ts deleted file mode 100644 index b1dee9e1d5..0000000000 --- a/packages/portail-admins/src/_common/stats/StatsTerritory.type.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type StatsTerritory = { - [regionCode: string]: { - x: number; - y: number; - path: string; - }; -}; diff --git a/packages/portail-admins/src/_common/stats/index.ts b/packages/portail-admins/src/_common/stats/index.ts index 7b2d2cf3ac..405c12a2c0 100644 --- a/packages/portail-admins/src/_common/stats/index.ts +++ b/packages/portail-admins/src/_common/stats/index.ts @@ -1,4 +1,2 @@ // @index('./*', f => `export * from '${f.path}'`) -export * from "./AdminStructureStatsData.type"; export * from "./StatsByRegion.type"; -export * from "./StatsTerritory.type"; diff --git a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.html b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.html index 811e2cb832..1af3dcbdab 100644 --- a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.html +++ b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.html @@ -50,7 +50,31 @@

Statistiques de déploiement

- +
+
+
+ Domiciliés actifs +
+
+
+ + {{ stats.usagersActifs.actifs | formatBigNumber }} + + Total actifs +
+
+ + {{ stats.usagersActifs.domicilies | formatBigNumber }} + + Domiciliés +
+
+ + {{ stats.usagersActifs.ayantsDroits | formatBigNumber }} + + Ayants-droits +
+


diff --git a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.ts b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.ts index f2dfbc7455..bb9153bd61 100644 --- a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.ts +++ b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/admin-structures-stats.component.ts @@ -1,10 +1,7 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; import { Subscription } from "rxjs"; -import { - AdminStructureStatsData, - PortailAdminProfile, -} from "../../../../../_common"; +import { PortailAdminProfile } from "../../../../../_common"; import { DASHBOARD_STATUS_LABELS } from "../../../../../_common/usager/constants"; import { AdminAuthService } from "../../../admin-auth/services/admin-auth.service"; @@ -15,6 +12,7 @@ import { AdminStructuresStatsVM, adminStructuresStatsVmBuilder } from "./vm"; import { STRUCTURE_TYPE_LABELS, INTERACTIONS_LABELS_PLURIEL, + AdminStructureStatsData, } from "@domifa/common"; @Component({ @@ -57,6 +55,7 @@ export class AdminStructuresStatsComponent implements OnInit, OnDestroy { .subscribe((data: AdminStructureStatsData) => { this.data = data; this.stats = adminStructuresStatsVmBuilder.buildViewModel(data); + console.log(this.stats.usagersActifs); }) ); } diff --git a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/AdminStructuresStatsVM.type.ts b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/AdminStructuresStatsVM.type.ts index bd9c2abac9..22c5ab06a4 100644 --- a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/AdminStructuresStatsVM.type.ts +++ b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/AdminStructuresStatsVM.type.ts @@ -5,10 +5,15 @@ import { } from "@domifa/common"; import { StatsByRegion } from "../../../../../../_common"; -export type AdminStructuresStatsVM = { +export interface AdminStructuresStatsVM { usersCount: number; structuresCount: number; usagersCount: number; + usagersActifs: { + domicilies: number; + ayantsDroits: number; + actifs: number; + }; usagersCountByStatut: { status: UsagerDecisionStatut; label: string; @@ -37,4 +42,4 @@ export type AdminStructuresStatsVM = { usagersAllCountByStructureMap: { [structureId: string]: number; }; -}; +} diff --git a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/adminStructuresStatsVmBuilder.service.ts b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/adminStructuresStatsVmBuilder.service.ts index b3ee693e28..b16d303dee 100644 --- a/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/adminStructuresStatsVmBuilder.service.ts +++ b/packages/portail-admins/src/app/modules/admin-structures/components/admin-structures-stats/vm/adminStructuresStatsVmBuilder.service.ts @@ -4,8 +4,8 @@ import { UsagerDecisionStatut, INTERACTIONS_LABELS_PLURIEL, STRUCTURE_TYPE_LABELS, + AdminStructureStatsData, } from "@domifa/common"; -import { AdminStructureStatsData } from "../../../../../../_common"; import { DASHBOARD_STATUS_LABELS } from "../../../../../../_common/usager/constants"; import { AdminStructuresStatsVM } from "./AdminStructuresStatsVM.type"; diff --git a/packages/portail-admins/src/app/modules/shared/services/api/admin-structures-api-client.service.ts b/packages/portail-admins/src/app/modules/shared/services/api/admin-structures-api-client.service.ts index a0aa1131e7..5616d07710 100644 --- a/packages/portail-admins/src/app/modules/shared/services/api/admin-structures-api-client.service.ts +++ b/packages/portail-admins/src/app/modules/shared/services/api/admin-structures-api-client.service.ts @@ -5,12 +5,11 @@ import { filter, Observable, startWith, tap } from "rxjs"; import { environment } from "src/environments/environment"; import { AdminStructureListData, - AdminStructureStatsData, StructureAdmin, UserNewAdmin, } from "../../../../../_common"; import { structuresCache } from "../../store/structuresCache.service"; -import { ApiMessage } from "@domifa/common"; +import { ApiMessage, AdminStructureStatsData } from "@domifa/common"; const BASE_URL = environment.apiUrl + "admin/structures"; @Injectable() diff --git a/packages/portail-admins/src/app/modules/shared/store/AppStoreAction.type.ts b/packages/portail-admins/src/app/modules/shared/store/AppStoreAction.type.ts index ef97319719..ff7b85957d 100644 --- a/packages/portail-admins/src/app/modules/shared/store/AppStoreAction.type.ts +++ b/packages/portail-admins/src/app/modules/shared/store/AppStoreAction.type.ts @@ -1,7 +1,5 @@ -import { - AdminStructureListData, - AdminStructureStatsData, -} from "../../../../_common"; +import { AdminStructureStatsData } from "@domifa/common"; +import { AdminStructureListData } from "../../../../_common"; export type AppStoreAction = | { diff --git a/packages/portail-admins/src/app/modules/shared/store/AppStoreModel.type.ts b/packages/portail-admins/src/app/modules/shared/store/AppStoreModel.type.ts index 0adb13709a..a1651b1528 100644 --- a/packages/portail-admins/src/app/modules/shared/store/AppStoreModel.type.ts +++ b/packages/portail-admins/src/app/modules/shared/store/AppStoreModel.type.ts @@ -1,7 +1,5 @@ -import { - AdminStructureListData, - AdminStructureStatsData, -} from "../../../../_common"; +import { AdminStructureStatsData } from "@domifa/common"; +import { AdminStructureListData } from "../../../../_common"; export type AppStoreModel = { structureListData?: AdminStructureListData; diff --git a/packages/portail-admins/src/app/modules/shared/store/structuresCache.service.ts b/packages/portail-admins/src/app/modules/shared/store/structuresCache.service.ts index 47cffd315e..b4d31eeaa3 100644 --- a/packages/portail-admins/src/app/modules/shared/store/structuresCache.service.ts +++ b/packages/portail-admins/src/app/modules/shared/store/structuresCache.service.ts @@ -1,7 +1,5 @@ -import { - AdminStructureListData, - AdminStructureStatsData, -} from "../../../../_common"; +import { AdminStructureStatsData } from "@domifa/common"; +import { AdminStructureListData } from "../../../../_common"; import { appStore } from "./appStore.service"; export const structuresCache = {