Skip to content

Commit

Permalink
Mise en place des presenters
Browse files Browse the repository at this point in the history
  • Loading branch information
NerOcrO committed May 2, 2024
1 parent f7089ae commit 92bf2c3
Show file tree
Hide file tree
Showing 21 changed files with 514 additions and 478 deletions.
145 changes: 4 additions & 141 deletions src/app/(connecte)/indicateurs-cles/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
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, IndicateurImpactEquipementSommeViewModel, IndicateursImpactsEquipementsViewModel } from '../../../components/viewModel'
import { IndicateurImpactEquipementSommeModel, recupererLesIndicateursImpactsEquipementsRepository, recupererLesIndicateursImpactsEquipementsSommesRepository } from '../../../repository/indicateursRepository'
import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository'
import { indicateursClesPresenter } from '../../../presenters/indicateursClesPresenter'
import { recupererLesIndicateursImpactsEquipementsRepository, recupererLesIndicateursImpactsEquipementsSommesRepository } from '../../../repository/indicateursRepository'
import { recupererLesReferentielsTypesEquipementsRepository } from '../../../repository/typesEquipementsRepository'

const title = 'Indicateurs clés'
export const metadata: Metadata = {
Expand Down Expand Up @@ -49,150 +48,14 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl

const referentielsTypesEquipementsModel = await recupererLesReferentielsTypesEquipementsRepository()

const referentielsTypesEquipementsViewModel = tranformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel)

const indicateursImpactsEquipementsSommesViewModel = transformerLesIndicateursImpactsEquipementsSommesModelEnViewModel(
indicateursImpactsEquipementsSommesModel,
referentielsTypesEquipementsViewModel
)

const indicateursImpactsEquipementsViewModel = transformerLesIndicateursImpactsEquipementsModelEnViewModel(indicateursImpactsEquipementsModel)

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

return (
<>
<Breadcrumb label={title} />
<IndicateursCles
dateInventaire={dateInventaire}
indicateursImpactsEquipementsSommesViewModel={indicateursImpactsEquipementsSommesViewModel}
indicateursImpactsEquipementsViewModel={indicateursImpactsEquipementsViewModel}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
referentielsTypesEquipementsViewModel={referentielsTypesEquipementsViewModel}
presenter={indicateursClesPresenter(referentielsTypesEquipementsModel, indicateursImpactsEquipementsSommesModel, indicateursImpactsEquipementsModel)}
/>
</>
)
}

function transformerLesIndicateursImpactsEquipementsModelEnViewModel(
indicateursImpactsEquipementsModel: Array<indicateurImpactEquipementModel>
): IndicateursImpactsEquipementsViewModel {
let radiationIonisantes = 0
let epuisementDesRessources = 0
let emissionsDeParticulesFines = 0
let acidification = 0
let empreinteCarbone = 0
let fabrication = 0
let distribution = 0
let utilisation = 0
let finDeVie = 0
const kilometresEquivalent1TonneCO2 = 5181

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

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

if (etapeacv === EtapesAcv.fabrication) {
fabrication += indicateurImpactEquipementModel.impactUnitaire / 1000
} else if (etapeacv === EtapesAcv.distribution) {
distribution += indicateurImpactEquipementModel.impactUnitaire / 1000
} else if (etapeacv === EtapesAcv.utilisation) {
utilisation += indicateurImpactEquipementModel.impactUnitaire / 1000
} else {
finDeVie += indicateurImpactEquipementModel.impactUnitaire / 1000
}
}
}

return {
acidification: deuxChiffresApresLaVirgule(acidification),
distribution: deuxChiffresApresLaVirgule(distribution),
emissionsDeParticulesFines: deuxChiffresApresLaVirgule(emissionsDeParticulesFines),
empreinteCarbone: deuxChiffresApresLaVirgule(empreinteCarbone),
epuisementDesRessources: deuxChiffresApresLaVirgule(epuisementDesRessources),
fabrication: deuxChiffresApresLaVirgule(fabrication),
finDeVie: deuxChiffresApresLaVirgule(finDeVie),
kilometresEnVoiture: Math.round(empreinteCarbone * kilometresEquivalent1TonneCO2).toLocaleString(),
radiationIonisantes: deuxChiffresApresLaVirgule(radiationIonisantes),
utilisation: deuxChiffresApresLaVirgule(utilisation),
}
}

function transformerLesIndicateursImpactsEquipementsSommesModelEnViewModel(
indicateursImpactsEquipementsSommesModel: Array<IndicateurImpactEquipementSommeModel>,
referentielsEquipementsViewModel: Array<string>
): Array<IndicateurImpactEquipementSommeViewModel> {
return indicateursImpactsEquipementsSommesModel
.map((indicateurImpactEquipementSommeModel): IndicateurImpactEquipementSommeViewModel => {
return {
etapeAcv: indicateurImpactEquipementSommeModel.etapeAcv as `${EtapesAcv}`,
impact: indicateurImpactEquipementSommeModel._sum.impactUnitaire,
typeEquipement: indicateurImpactEquipementSommeModel.typeEquipement,
}
})
.sort(sortByTypeEquipementAndEtapeAcv(referentielsEquipementsViewModel))
}

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: Array<string>) {
return (a: IndicateurImpactEquipementSommeViewModel, b: IndicateurImpactEquipementSommeViewModel) => {
let etapeAcvA = '0'
let etapeAcvB = '0'

const cyclesDeVie = [
'FABRICATION',
'DISTRIBUTION',
'UTILISATION',
'FIN_DE_VIE',
]

for (let poids = 0; poids < referentielsEquipementsViewModel.length; poids++) {
if (a.typeEquipement === referentielsEquipementsViewModel[poids]) {
etapeAcvA = poids.toString()
}

if (b.typeEquipement === referentielsEquipementsViewModel[poids]) {
etapeAcvB = poids.toString()
}
}

for (let poids = 0; poids < cyclesDeVie.length; poids++) {
if (a.etapeAcv === cyclesDeVie[poids]) {
etapeAcvA += poids.toString()
}

if (b.etapeAcv === cyclesDeVie[poids]) {
etapeAcvB += poids.toString()
}
}

if (etapeAcvA > etapeAcvB) {
return 1
}

if (etapeAcvA < etapeAcvB) {
return -1
}

return 0
}
}
47 changes: 4 additions & 43 deletions src/app/(connecte)/inventaire/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import { modeleModel } 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 Inventaire from '../../../components/Inventaire/Inventaire'
import { ModeleReducer } from '../../../components/Inventaire/useEquipement'
import { EquipementAvecSesModelesViewModel, StatutsInventaire } from '../../../components/viewModel'
import { inventairePresenter } from '../../../presenters/inventairePresenter'
import { StatutsInventaire } from '../../../presenters/sharedPresenter'
import { recupererLesModelesRepository } from '../../../repository/modelesRepository'
import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository'
import { recupererLesReferentielsTypesEquipementsRepository } from '../../../repository/typesEquipementsRepository'

const title = 'Renseigner les équipements'
export const metadata: Metadata = {
Expand Down Expand Up @@ -39,54 +38,16 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl

const referentielsTypesEquipementsModel = await recupererLesReferentielsTypesEquipementsRepository()

const equipementsAvecSesModelesViewModel = transformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel, modelesModel)

const statut = searchParams.statut === undefined ? StatutsInventaire.EN_ATTENTE : searchParams.statut as StatutsInventaire
const dateInventaire = modelesModel.length === 0 ? new Date() : modelesModel[0].dateInventaire

return (
<>
<Breadcrumb label={title} />
<Inventaire
dateInventaire={dateInventaire.toLocaleDateString('fr-FR')}
equipementsAvecSesModelesViewModel={equipementsAvecSesModelesViewModel}
isNonCalcule={statut === StatutsInventaire.TRAITE}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
presenter={inventairePresenter(referentielsTypesEquipementsModel, modelesModel, statut)}
/>
</>
)
}

function transformerLesReferentielsTypesEquipementsModelEnViewModel(
referentielsTypesEquipementsModel: Array<ReferentielTypeEquipementModel>,
modelesModel: Array<modeleModel>
): Array<EquipementAvecSesModelesViewModel> {
return referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): EquipementAvecSesModelesViewModel => {
return {
modeles: referentielTypeEquipementModel.modeles
.map((modele): ModeleReducer => {
let quantite = 0
let dureeDeVie = referentielTypeEquipementModel.dureeDeVie
let heureUtilisation = 24
const equipementsModelFiltre = modelesModel
.filter((modeleModel): boolean => modeleModel.nom === modele.relationModeles.nom)

if (equipementsModelFiltre.length > 0) {
quantite = equipementsModelFiltre[0].quantite
dureeDeVie = new Date().getFullYear() - equipementsModelFiltre[0].dateAchat.getFullYear()
heureUtilisation = Math.round(equipementsModelFiltre[0].tauxUtilisation * 24)
}

return {
dureeDeVie,
heureUtilisation,
id: crypto.randomUUID(),
nomModele: modele.relationModeles.nom,
quantite,
}
}),
type: referentielTypeEquipementModel.type,
}
})
}
65 changes: 3 additions & 62 deletions src/app/(connecte)/liste-equipements/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { modeleModel } 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 ListeEquipements from '../../../components/ListeEquipements/ListeEquipements'
import { EquipementsViewModel } from '../../../components/viewModel'
import { listeEquipementsPresenter } from '../../../presenters/listeEquipementsPresenter'
import { recupererLesModelesRepository } from '../../../repository/modelesRepository'
import { recupererLesReferentielsTypesEquipementsRepository, ReferentielTypeEquipementModel } from '../../../repository/typesEquipementsRepository'
import { recupererLesReferentielsTypesEquipementsRepository } from '../../../repository/typesEquipementsRepository'

const title = 'Liste d’équipements'
export const metadata: Metadata = {
Expand Down Expand Up @@ -40,73 +39,15 @@ export default async function Page({ searchParams }: PageProps): Promise<ReactEl
}

const referentielsTypesEquipementsModel = await recupererLesReferentielsTypesEquipementsRepository()
const equipementsViewModel = transformerLesReferentielsTypesEquipementsModelEnViewModel(referentielsTypesEquipementsModel, modelesModel)

const modeles = Object.keys(equipementsViewModel)
const dateInventaire = equipementsViewModel[modeles[0]][0].dateInventaire.toLocaleDateString('fr-FR')

return (
<>
<Breadcrumb label={title} />
<ListeEquipements
dateInventaire={dateInventaire}
equipementsViewModel={equipementsViewModel}
nomEtablissement={searchParams.nomEtablissement}
nomInventaire={searchParams.nomInventaire}
presenter={listeEquipementsPresenter(referentielsTypesEquipementsModel, modelesModel)}
/>
</>
)
}

function transformerLesReferentielsTypesEquipementsModelEnViewModel(
referentielsTypesEquipementsModel: Array<ReferentielTypeEquipementModel>,
modelesModel: Array<modeleModel>
): EquipementsViewModel {
const types: EquipementsViewModel = {}

for (const modeleModel of modelesModel.sort(trierParTypeEquipementEtEtapeAcv(referentielsTypesEquipementsModel))) {
const ancienModeleModel = types[modeleModel.type] ?? []

// @ts-expect-error
types[modeleModel.type] = [
...ancienModeleModel,
{
dateInventaire: modeleModel.dateInventaire,
modele: modeleModel.nom,
nomEtablissement: modeleModel.nomEtablissement,
nomInventaire: modeleModel.nomInventaire,
quantite: modeleModel.quantite,
type: modeleModel.type,
},
]
}

return types
}

function trierParTypeEquipementEtEtapeAcv(referentielsTypesEquipementsModel: Array<ReferentielTypeEquipementModel>) {
return (a: modeleModel, b: modeleModel) => {
let etapeAcvA = 0
let etapeAcvB = 0

for (let poids = 0; poids < referentielsTypesEquipementsModel.length; poids++) {
if (a.type === referentielsTypesEquipementsModel[poids].type) {
etapeAcvA = poids
}

if (b.type === referentielsTypesEquipementsModel[poids].type) {
etapeAcvB = poids
}
}

if (etapeAcvA > etapeAcvB) {
return 1
}

if (etapeAcvA < etapeAcvB) {
return -1
}

return 0
}
}
26 changes: 2 additions & 24 deletions src/app/(connecte)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { inventaireModel } from '@prisma/client'
import { Metadata } from 'next'
import { ReactElement } from 'react'

import { getProfileAtih } from '../../authentification'
import InventairesLayout from '../../components/Inventaires/InventairesLayout'
import { InventaireViewModel, StatutsInventaire } from '../../components/viewModel'
import { inventairesPresenter } from '../../presenters/inventairesPresenter'
import { recupererLesInventairesRepository } from '../../repository/inventairesRepository'

export const metadata: Metadata = {
Expand All @@ -16,30 +15,9 @@ export default async function Page(): Promise<ReactElement> {

const inventairesModel = await recupererLesInventairesRepository(profile.nomEtablissement, profile.isAdmin)

const inventairesViewModel = transformerLesInventairesModelEnViewModel(inventairesModel)

return (
<InventairesLayout
inventairesViewModel={inventairesViewModel}
isAdmin={profile.isAdmin}
presenter={inventairesPresenter(inventairesModel, profile)}
/>
)
}

function transformerLesInventairesModelEnViewModel(inventairesModel: Array<inventaireModel>): Array<InventaireViewModel> {
return inventairesModel.map((inventaireModel): InventaireViewModel => {
const statut = StatutsInventaire[inventaireModel.statut as keyof typeof StatutsInventaire]
const path = statut === StatutsInventaire.EN_ATTENTE ? '/inventaire' : '/indicateurs-cles'
const statusParam = statut === StatutsInventaire.EN_ATTENTE ? `&statut=${StatutsInventaire.EN_ATTENTE}` : ''

return {
className: statut.toLowerCase().replace(' ', '_'),
dateInventaire: inventaireModel.dateInventaire.toLocaleDateString('fr-FR'),
id: inventaireModel.id,
link: `${path}?nomEtablissement=${encodeURI(inventaireModel.nomEtablissement)}&nomInventaire=${encodeURI(inventaireModel.nomInventaire)}${statusParam}`,
nomEtablissement: inventaireModel.nomEtablissement,
nomInventaire: inventaireModel.nomInventaire,
statut,
}
})
}
Loading

0 comments on commit 92bf2c3

Please sign in to comment.