Skip to content

Commit

Permalink
Mapping des tables et champs de la BDD via Prisma pour mieux correspo…
Browse files Browse the repository at this point in the history
…ndre au métier
  • Loading branch information
NerOcrO committed May 2, 2024
1 parent 9839c62 commit f7089ae
Show file tree
Hide file tree
Showing 38 changed files with 495 additions and 420 deletions.
26 changes: 24 additions & 2 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
{
"extends": [
"next/core-web-vitals",
"plugin:@typescript-eslint/strict-type-checked",
"plugin:@typescript-eslint/stylistic-type-checked",
"plugin:@typescript-eslint/all",
"plugin:react/all",
"plugin:import/recommended",
"plugin:import/typescript",
Expand All @@ -29,6 +28,7 @@
"parser": "@typescript-eslint/parser",
"plugins": ["sort-keys-fix", "unused-imports"],
"rules": {

"array-bracket-newline": "error",
"array-bracket-spacing": "error",
"array-element-newline": ["error", "consistent"],
Expand Down Expand Up @@ -102,7 +102,29 @@
"react/jsx-no-literals": "off",
"react/react-in-jsx-scope": "off",
"sort-keys-fix/sort-keys-fix": "error",
"@typescript-eslint/array-type": ["error", { "default": "generic", "readonly": "generic" }],
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/consistent-type-imports": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/max-params": "off",
"@typescript-eslint/no-magic-numbers": "off",
"@typescript-eslint/no-shadow": "off",
"@typescript-eslint/no-use-before-define": "off",
"@typescript-eslint/prefer-destructuring": "off",
"@typescript-eslint/prefer-readonly-parameter-types": ["off", {
"allow": [
"FormEvent",
"HTMLFormElement",
"HTMLInputElement",
"SubmitEvent",
"SyntheticEvent",
"ReactElement",
"ChartDataset",
"ClientSafeProvider",
"inventaireModel"
]
}],
"unused-imports/no-unused-imports": "error"
}
}
2 changes: 1 addition & 1 deletion prisma/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const prismaClientSingleton = (): PrismaClient<Prisma.PrismaClientOptions, never
}

declare global {
const prismaGlobal: undefined | ReturnType<typeof prismaClientSingleton>
const prismaGlobal: ReturnType<typeof prismaClientSingleton> | undefined
}

// @ts-expect-error
Expand Down
120 changes: 50 additions & 70 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -7,91 +7,71 @@ datasource db {
url = env("DATABASE_URL")
}

model en_donnees_entrees {
model inventaireModel {
id Int @id
date_creation DateTime
date_lot DateTime
date_update DateTime
nom_organisation String
nom_lot String
statut_traitement String
dateCreation DateTime @map("date_creation")
dateInventaire DateTime @map("date_lot")
dateMiseAJour DateTime @map("date_update")
nomEtablissement String @map("nom_organisation")
nomInventaire String @map("nom_lot")
statut String @map("statut_traitement")
@@map("en_donnees_entrees")
}

model en_equipement_physique {
model modeleModel {
id Int @id
date_creation DateTime
date_update DateTime
date_lot DateTime
nom_lot String
nom_organisation String
nom_source_donnee String?
conso_elec_annuelle Float?
date_achat DateTime
date_retrait DateTime
duree_vie_defaut Float?
go_telecharge Float?
modele String
nb_coeur String?
nb_jour_utilise_an Float
nom_court_datacenter String?
nom_entite String?
nom_equipement_physique String?
pays_utilisation String?
dateInventaire DateTime @map("date_lot")
nomInventaire String @map("nom_lot")
nomEtablissement String @map("nom_organisation")
dateAchat DateTime @map("date_achat")
nom String @map("modele")
quantite Float
serveur Boolean
statut String?
type String
utilisateur String?
mode_utilisation String?
taux_utilisation Float
statut_traitement String
stockage_total_virtuel Float?
ref_equipement_par_defaut String?
ref_equipement_retenu String?
tauxUtilisation Float @map("taux_utilisation")
@@map("en_equipement_physique")
}

model ind_indicateur_impact_equipement_physique {
date_calcul DateTime
date_lot DateTime
nom_lot String @unique
etapeacv String
model indicateurImpactEquipementModel {
dateInventaire DateTime @map("date_lot")
nomInventaire String @unique @map("nom_lot")
etapeAcv String @map("etapeacv")
critere String
source String?
statut_indicateur String
trace String
version_calcul String
conso_elec_moyenne Float?
impact_unitaire Float
quantite Int
statut_equipement_physique String?
type_equipement String
unite String
nom_entite String?
nom_organisation String
nom_source_donnee String?
nom_equipement String?
date_lot_discriminator DateTime
nom_organisation_discriminator String
nom_entite_discriminator String
nom_source_donnee_discriminator String
statutIndicateur String @map("statut_indicateur")
impactUnitaire Float @map("impact_unitaire")
typeEquipement String @map("type_equipement")
nomEtablissement String @map("nom_organisation")
@@map("ind_indicateur_impact_equipement_physique")
}

model ref_correspondance_type_equipement {
ref_correspondance_ref_eqp ref_correspondance_ref_eqp @relation(fields: [equipement_id], references: [ref_equipement_cible])
equipement_id String @id
model correspondanceTypeEquipementModeleModel {
relationModeles referentielModeleModel @relation(fields: [modeleId], references: [id])
modeleId String @id @map("equipement_id")
relationTypesEquipement referentielTypeEquipementModel @relation(fields: [typeEquipementId], references: [type])
ref_type_equipement ref_type_equipement @relation(fields: [type_equipement_id], references: [type])
type_equipement_id String
typeEquipementId String @map("type_equipement_id")
@@map("ref_correspondance_type_equipement")
}

model ref_correspondance_ref_eqp {
modele_equipement_source String @unique
ref_equipement_cible String @id
equipements ref_correspondance_type_equipement[]
model referentielModeleModel {
nom String @unique @map("modele_equipement_source")
id String @id @map("ref_equipement_cible")
typesEquipement correspondanceTypeEquipementModeleModel[]
@@map("ref_correspondance_ref_eqp")
}

model ref_type_equipement {
model referentielTypeEquipementModel {
type String @unique
duree_vie_defaut Float
modeles ref_correspondance_type_equipement[]
dureeDeVie Float @map("duree_vie_defaut")
modeles correspondanceTypeEquipementModeleModel[]
@@map("ref_type_equipement")
}
93 changes: 52 additions & 41 deletions src/app/(connecte)/indicateurs-cles/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { ind_indicateur_impact_equipement_physique } from '@prisma/client'
import { indicateurImpactEquipementModel } from '@prisma/client'
import { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { ReactElement } from 'react'

import { getProfileAtih } from '../../../authentification'
import Breadcrumb from '../../../components/commun/Breadcrumb'
import IndicateursCles from '../../../components/IndicateursCles/IndicateursCles'
import { Criteres, EtapesAcv, IndicateursSommesViewModel, IndicateursViewModel } from '../../../components/viewModel'
import { EquipementPhysiqueModel, recupererLesReferentielsEquipementsRepository } from '../../../repository/equipementsRepository'
import { IndicateursSommesModel, recupererIndicateursEquipementsPhysiquesRepository, recupererIndicateursEquipementsPhysiquesSommesRepository } from '../../../repository/indicateursRepository'
import { Criteres, EtapesAcv, IndicateurImpactEquipementSommeViewModel, IndicateursImpactsEquipementsViewModel } from '../../../components/viewModel'
import { IndicateurImpactEquipementSommeModel, recupererLesIndicateursImpactsEquipementsRepository, recupererLesIndicateursImpactsEquipementsSommesRepository } from '../../../repository/indicateursRepository'
import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository'

const title = 'Indicateurs clés'
export const metadata: Metadata = {
Expand All @@ -33,40 +33,51 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl
notFound()
}

const indicateursModel = await recupererIndicateursEquipementsPhysiquesRepository(searchParams.nomEtablissement, searchParams.nomInventaire)
const indicateursImpactsEquipementsModel = await recupererLesIndicateursImpactsEquipementsRepository(
searchParams.nomEtablissement,
searchParams.nomInventaire
)

if (indicateursModel.length === 0) {
if (indicateursImpactsEquipementsModel.length === 0) {
notFound()
}

const indicateursSommesModel = await recupererIndicateursEquipementsPhysiquesSommesRepository(searchParams.nomEtablissement, searchParams.nomInventaire)
const indicateursImpactsEquipementsSommesModel = await recupererLesIndicateursImpactsEquipementsSommesRepository(
searchParams.nomEtablissement,
searchParams.nomInventaire
)

const referentielsEquipementsModel = await recupererLesReferentielsEquipementsRepository()
const referentielsTypesEquipementsModel = await recupererLesReferentielsTypesEquipementsRepository()

const referentielsEquipementsViewModel = tranformReferentielsEquipementsToViewModel(referentielsEquipementsModel)
const referentielsTypesEquipementsViewModel = tranformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel)

const indicateursSommesViewModel = transformIndicateursSommesModelToViewModel(indicateursSommesModel, referentielsEquipementsViewModel)
const indicateursImpactsEquipementsSommesViewModel = transformerLesIndicateursImpactsEquipementsSommesModelEnViewModel(
indicateursImpactsEquipementsSommesModel,
referentielsTypesEquipementsViewModel
)

const indicateursViewModel = transformIndicateursModelToViewModel(indicateursModel)
const indicateursImpactsEquipementsViewModel = transformerLesIndicateursImpactsEquipementsModelEnViewModel(indicateursImpactsEquipementsModel)

const dateInventaire = indicateursModel[0].date_lot.toLocaleDateString('fr-FR')
const dateInventaire = indicateursImpactsEquipementsModel[0].dateInventaire.toLocaleDateString('fr-FR')

return (
<>
<Breadcrumb label={title} />
<IndicateursCles
dateInventaire={dateInventaire}
indicateursSommesViewModel={indicateursSommesViewModel}
indicateursViewModel={indicateursViewModel}
indicateursImpactsEquipementsSommesViewModel={indicateursImpactsEquipementsSommesViewModel}
indicateursImpactsEquipementsViewModel={indicateursImpactsEquipementsViewModel}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
referentielsEquipementsViewModel={referentielsEquipementsViewModel}
referentielsTypesEquipementsViewModel={referentielsTypesEquipementsViewModel}
/>
</>
)
}

function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_impact_equipement_physique[]): IndicateursViewModel {
function transformerLesIndicateursImpactsEquipementsModelEnViewModel(
indicateursImpactsEquipementsModel: Array<indicateurImpactEquipementModel>
): IndicateursImpactsEquipementsViewModel {
let radiationIonisantes = 0
let epuisementDesRessources = 0
let emissionsDeParticulesFines = 0
Expand All @@ -78,29 +89,29 @@ function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_i
let finDeVie = 0
const kilometresEquivalent1TonneCO2 = 5181

for (const indicateur of indicateursModel) {
const critere = indicateur.critere as Criteres
const etapeacv = indicateur.etapeacv as EtapesAcv
for (const indicateurImpactEquipementModel of indicateursImpactsEquipementsModel) {
const critere = indicateurImpactEquipementModel.critere as Criteres
const etapeacv = indicateurImpactEquipementModel.etapeAcv as EtapesAcv

if (critere === Criteres.radiationIonisantes) {
radiationIonisantes += indicateur.impact_unitaire
radiationIonisantes += indicateurImpactEquipementModel.impactUnitaire
} else if (critere === Criteres.epuisementDesRessources) {
epuisementDesRessources += indicateur.impact_unitaire
epuisementDesRessources += indicateurImpactEquipementModel.impactUnitaire
} else if (critere === Criteres.emissionsDeParticulesFines) {
emissionsDeParticulesFines += indicateur.impact_unitaire
emissionsDeParticulesFines += indicateurImpactEquipementModel.impactUnitaire
} else if (critere === Criteres.acidification) {
acidification += indicateur.impact_unitaire
acidification += indicateurImpactEquipementModel.impactUnitaire
} else {
empreinteCarbone += indicateur.impact_unitaire / 1000
empreinteCarbone += indicateurImpactEquipementModel.impactUnitaire / 1000

if (etapeacv === EtapesAcv.fabrication) {
fabrication += indicateur.impact_unitaire / 1000
fabrication += indicateurImpactEquipementModel.impactUnitaire / 1000
} else if (etapeacv === EtapesAcv.distribution) {
distribution += indicateur.impact_unitaire / 1000
distribution += indicateurImpactEquipementModel.impactUnitaire / 1000
} else if (etapeacv === EtapesAcv.utilisation) {
utilisation += indicateur.impact_unitaire / 1000
utilisation += indicateurImpactEquipementModel.impactUnitaire / 1000
} else {
finDeVie += indicateur.impact_unitaire / 1000
finDeVie += indicateurImpactEquipementModel.impactUnitaire / 1000
}
}
}
Expand All @@ -119,31 +130,31 @@ function transformIndicateursModelToViewModel(indicateursModel: ind_indicateur_i
}
}

function transformIndicateursSommesModelToViewModel(
indicateursSommesModel: IndicateursSommesModel[],
referentielsEquipementsViewModel: string[]
): IndicateursSommesViewModel[] {
return indicateursSommesModel
.map((indicateurSomme): IndicateursSommesViewModel => {
function transformerLesIndicateursImpactsEquipementsSommesModelEnViewModel(
indicateursImpactsEquipementsSommesModel: Array<IndicateurImpactEquipementSommeModel>,
referentielsEquipementsViewModel: Array<string>
): Array<IndicateurImpactEquipementSommeViewModel> {
return indicateursImpactsEquipementsSommesModel
.map((indicateurImpactEquipementSommeModel): IndicateurImpactEquipementSommeViewModel => {
return {
etapeAcv: indicateurSomme.etapeacv as `${EtapesAcv}`,
impact: indicateurSomme._sum.impact_unitaire,
typeEquipement: indicateurSomme.type_equipement,
etapeAcv: indicateurImpactEquipementSommeModel.etapeAcv as `${EtapesAcv}`,
impact: indicateurImpactEquipementSommeModel._sum.impactUnitaire,
typeEquipement: indicateurImpactEquipementSommeModel.typeEquipement,
}
})
.sort(sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel))
}

function tranformReferentielsEquipementsToViewModel(referentielsEquipementsModel: EquipementPhysiqueModel[]): string[] {
return referentielsEquipementsModel.map((referentielEquipementModel): string => referentielEquipementModel.type)
function tranformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel: Array<ReferentielTypeEquipementModel>): Array<string> {
return referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): string => referentielTypeEquipementModel.type)
}

function deuxChiffresApresLaVirgule(chiffre: number): string {
return Number(chiffre.toFixed(2)).toLocaleString()
}

function sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel: string[]) {
return (a: IndicateursSommesViewModel, b: IndicateursSommesViewModel) => {
function sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel: Array<string>) {
return (a: IndicateurImpactEquipementSommeViewModel, b: IndicateurImpactEquipementSommeViewModel) => {
let etapeAcvA = '0'
let etapeAcvB = '0'

Expand Down
Loading

0 comments on commit f7089ae

Please sign in to comment.