Skip to content

Commit

Permalink
Ajout de la durée de vie et du taux d'utilisation sur la liste d'équi…
Browse files Browse the repository at this point in the history
…pements
  • Loading branch information
NerOcrO committed May 2, 2024
1 parent 92bf2c3 commit e39533e
Show file tree
Hide file tree
Showing 13 changed files with 93 additions and 53 deletions.
3 changes: 2 additions & 1 deletion src/components/CreerUnInventaire/CreerUnInventaire.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { ReactElement } from 'react'

import { useCreerUnInventaire } from './useCreerUnInventaire'
import { formaterLeNomEtablissement } from '../../presenters/sharedPresenter'
import InfoBulle from '../commun/Infobulle'

type CreerUnInventaireProps = Readonly<{
Expand All @@ -21,7 +22,7 @@ export default function CreerUnInventaire({ nomEtablissement }: CreerUnInventair
<p className="fw-bold">
pour l’établissement
{' '}
{nomEtablissement.split('$$')[0]}
{formaterLeNomEtablissement(nomEtablissement)}
</p>
<p>
Pour créer un inventaire, vous aurez besoin de renseigner les modèles des équipements de votre parc informatique et leur quantité.
Expand Down
5 changes: 3 additions & 2 deletions src/components/IndicateursCles/Transcription.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ReactElement } from 'react'

import { IndicateurImpactEquipementSomme, toLowerCase } from '../../presenters/indicateursClesPresenter'
import { IndicateurImpactEquipementSomme } from '../../presenters/indicateursClesPresenter'
import { mettreEnBasDeCasse } from '../../presenters/sharedPresenter'

type TranscriptionProps = Readonly<{
indicateursImpactsEquipementsSommes: ReadonlyArray<IndicateurImpactEquipementSomme>
Expand Down Expand Up @@ -33,7 +34,7 @@ export default function Transcription({ indicateursImpactsEquipementsSommes }: T
{indicateurImpactEquipementSomme.typeEquipement}
</td>
<td>
{toLowerCase(indicateurImpactEquipementSomme.etapeAcv)}
{mettreEnBasDeCasse(indicateurImpactEquipementSomme.etapeAcv)}
</td>
<td>
{Number(indicateurImpactEquipementSomme.impact.toFixed(2)).toLocaleString()}
Expand Down
9 changes: 5 additions & 4 deletions src/components/IndicateursCles/graphiques.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Chart, CategoryScale, LinearScale, BarElement, Tooltip, Legend, ArcElement, ChartData, ChartOptions, ChartDataset } from 'chart.js'

import { EtapesAcv, IndicateurImpactEquipementSomme, toLowerCase } from '../../presenters/indicateursClesPresenter'
import { EtapesAcv, IndicateurImpactEquipementSomme } from '../../presenters/indicateursClesPresenter'
import { mettreEnBasDeCasse } from '../../presenters/sharedPresenter'

Chart.register(
ArcElement,
Expand Down Expand Up @@ -91,7 +92,7 @@ export function donneesParTypeEquipement(indicateursImpactsEquipementsSommes: Re
data: indicateursImpactsEquipementsSommes
.filter(filtrerParEtapeAcv(etapeAcv))
.reduce(cumulerParImpact, Array<number>()),
label: toLowerCase(etapeAcv),
label: mettreEnBasDeCasse(etapeAcv),
}
})

Expand All @@ -104,7 +105,7 @@ export function donneesParTypeEquipement(indicateursImpactsEquipementsSommes: Re
export function donneesParCycleDeVie(indicateursImpactsEquipementsSommes: ReadonlyArray<IndicateurImpactEquipementSomme>, referentielsTypesEquipements: ReadonlyArray<string>): ChartData<'bar'> {
const etapesAcv = indicateursImpactsEquipementsSommes.reduce(
(quantiteAccumulee, indicateurImpactEquipementSomme): Set<string> => {
return quantiteAccumulee.add(toLowerCase(indicateurImpactEquipementSomme.etapeAcv))
return quantiteAccumulee.add(mettreEnBasDeCasse(indicateurImpactEquipementSomme.etapeAcv))
},
new Set<string>()
)
Expand Down Expand Up @@ -153,7 +154,7 @@ export function donneesRepartitionParTypeEquipement(
{
backgroundColor: colors,
data: impactsParTypeEquipement.flat(),
label: toLowerCase(etapeAcv),
label: mettreEnBasDeCasse(etapeAcv),
},
],
labels: Array.from(nomTypesEquipement),
Expand Down
3 changes: 2 additions & 1 deletion src/components/Inventaire/Inventaire.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Actions from './Actions'
import Equipement from './Equipement'
import { useInventaire } from './useInventaire'
import { InventairePresenter } from '../../presenters/inventairePresenter'
import { formaterLeNomEtablissement } from '../../presenters/sharedPresenter'

type InventaireProps = Readonly<{
nomEtablissement: string
Expand Down Expand Up @@ -35,7 +36,7 @@ export default function Inventaire({
{nomInventaire}
</div>
<div>
{nomEtablissement.split('$$')[0]}
{formaterLeNomEtablissement(nomEtablissement)}
{' - '}
{presenter.dateInventaire}
</div>
Expand Down
5 changes: 3 additions & 2 deletions src/components/Inventaires/Inventaires.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import React, { ReactElement } from 'react'
import ActionSupprimer from './ActionSupprimer'
import styles from './Inventaires.module.css'
import { InventairePresenter } from '../../presenters/inventairesPresenter'
import { formaterLeNomEtablissement } from '../../presenters/sharedPresenter'

type InventairesProps = Readonly<{
inventaires: Array<InventairePresenter>
inventaires: ReadonlyArray<InventairePresenter>
}>

export default function Inventaires({ inventaires }: InventairesProps): ReactElement {
Expand Down Expand Up @@ -47,7 +48,7 @@ export default function Inventaires({ inventaires }: InventairesProps): ReactEle
</Link>
</td>
<td>
{inventaire.nomEtablissement.split('$$')[0]}
{formaterLeNomEtablissement(inventaire.nomEtablissement)}
</td>
<td>
{inventaire.dateInventaire}
Expand Down
15 changes: 14 additions & 1 deletion src/components/ListeEquipements/Equipement.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { ReactElement } from 'react'

import { EquipementPresenter } from '../../presenters/listeEquipementsPresenter'
import { genererUnIdentifiantUnique } from '../../presenters/sharedPresenter'

type EquipementProps = Readonly<{
equipements: ReadonlyArray<EquipementPresenter>
Expand All @@ -22,18 +23,30 @@ export default function Equipement({ equipements }: EquipementProps): ReactEleme
<th scope="col">
Quantité
</th>
<th scope="col">
Durée de vie en années
</th>
<th scope="col">
Heures d’utilisation par jour
</th>
</tr>
</thead>
<tbody>
{
equipements.map((equipement): ReactElement => (
<tr key={equipement.modele + crypto.randomUUID()}>
<tr key={equipement.modele + genererUnIdentifiantUnique()}>
<td>
{equipement.modele}
</td>
<td>
{equipement.quantite}
</td>
<td>
{equipement.dureeDeVie}
</td>
<td>
{equipement.heuresUtilisation}
</td>
</tr>
))
}
Expand Down
6 changes: 3 additions & 3 deletions src/components/commun/Actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { ReactElement } from 'react'
import styles from './Action.module.css'
import SupprimerUnInventaire from './SupprimerUnInventaire'
import { useModale } from './useModale'
import { StatutsInventaire } from '../../presenters/sharedPresenter'
import { StatutsInventaire, formaterLeNomEtablissement } from '../../presenters/sharedPresenter'

type IndicateursClesProps = Readonly<{
dateInventaire: string
Expand All @@ -24,7 +24,7 @@ export default function Actions({ dateInventaire, nomEtablissement, nomInventair
{nomInventaire}
</div>
<div>
{nomEtablissement.split('$$')[0]}
{formaterLeNomEtablissement(nomEtablissement)}
{' - '}
{dateInventaire}
</div>
Expand All @@ -39,7 +39,7 @@ export default function Actions({ dateInventaire, nomEtablissement, nomInventair
</button>
<Link
className={`btn btn--plain btn--primary ${styles.middle}`}
href={`/inventaire?nomEtablissement=${encodeURI(nomEtablissement)}&nomInventaire=${encodeURI(nomInventaire)}&statut=${StatutsInventaire.TRAITE}`}
href={encodeURI(`/inventaire?nomEtablissement=${nomEtablissement}&nomInventaire=${nomInventaire}&statut=${StatutsInventaire.TRAITE}`)}
>
Modifier l’inventaire
</Link>
Expand Down
4 changes: 2 additions & 2 deletions src/components/commun/Onglets.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export default function Onglets({ isSelected, nomEtablissement, nomInventaire }:
<Link
aria-selected={isSelected ? true : false}
className={`js-tablist__link ${isSelected ? 'selected' : ''}`}
href={`indicateurs-cles?nomEtablissement=${encodeURI(nomEtablissement)}&nomInventaire=${encodeURI(nomInventaire)}`}
href={encodeURI(`indicateurs-cles?nomEtablissement=${nomEtablissement}&nomInventaire=${nomInventaire}`)}
>
{titreIndicateursCles}
</Link>
Expand All @@ -53,7 +53,7 @@ export default function Onglets({ isSelected, nomEtablissement, nomInventaire }:
<Link
aria-selected={isSelected ? false : true}
className={`js-tablist__link ${isSelected ? '' : 'selected'}`}
href={`liste-equipements?nomEtablissement=${encodeURI(nomEtablissement)}&nomInventaire=${encodeURI(nomInventaire)}`}
href={encodeURI(`liste-equipements?nomEtablissement=${nomEtablissement}&nomInventaire=${nomInventaire}`)}
>
{titreListeEquipements}
</Link>
Expand Down
33 changes: 12 additions & 21 deletions src/presenters/indicateursClesPresenter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { indicateurImpactEquipementModel } from '@prisma/client'

import { formaterDeuxChiffresApresLaVirgule, formaterLaDateEnFrancais } from './sharedPresenter'
import { IndicateurImpactEquipementSommeModel } from '../repository/indicateursRepository'
import { ReferentielTypeEquipementModel } from '../repository/typesEquipementsRepository'

Expand Down Expand Up @@ -49,7 +50,7 @@ export function indicateursClesPresenter(
indicateursImpactsEquipementsSommesModel: ReadonlyArray<IndicateurImpactEquipementSommeModel>,
indicateursImpactsEquipementsModel: ReadonlyArray<indicateurImpactEquipementModel>
): IndicateursClesPresenter {
const dateInventaire = indicateursImpactsEquipementsModel[0].dateInventaire.toLocaleDateString('fr-FR')
const dateInventaire = formaterLaDateEnFrancais(indicateursImpactsEquipementsModel[0].dateInventaire)
const referentielsTypesEquipements = referentielsTypesEquipementsPresenter(referentielsTypesEquipementsModel)
const indicateursImpactsEquipementsSommes = indicateursImpactsEquipementsSommesPresenter(
indicateursImpactsEquipementsSommesModel,
Expand All @@ -65,10 +66,6 @@ export function indicateursClesPresenter(
}
}

export function toLowerCase(text: string): string {
return (text[0] + text.slice(1).toLowerCase()).replaceAll('_', ' ')
}

function indicateursImpactsEquipementsPresenter(
indicateursImpactsEquipementsModel: ReadonlyArray<indicateurImpactEquipementModel>
): IndicateursImpactsEquipements {
Expand Down Expand Up @@ -111,16 +108,16 @@ function indicateursImpactsEquipementsPresenter(
}

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

Expand All @@ -139,16 +136,10 @@ function indicateursImpactsEquipementsSommesPresenter(
.sort(sortByTypeEquipementAndEtapeAcv(referentielsEquipements))
}

function referentielsTypesEquipementsPresenter(
referentielsTypesEquipementsModel: ReadonlyArray<ReferentielTypeEquipementModel>
): Array<string> {
function referentielsTypesEquipementsPresenter(referentielsTypesEquipementsModel: ReadonlyArray<ReferentielTypeEquipementModel>): Array<string> {
return referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): string => referentielTypeEquipementModel.type)
}

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

function sortByTypeEquipementAndEtapeAcv(referentielsEquipements: Array<string>) {
return (a: IndicateurImpactEquipementSomme, b: IndicateurImpactEquipementSomme) => {
let etapeAcvA = '0'
Expand Down
17 changes: 8 additions & 9 deletions src/presenters/inventairePresenter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { modeleModel } from '@prisma/client'

import { StatutsInventaire } from './sharedPresenter'
import { StatutsInventaire, calculerLaDureeDeVie, convertirLeTauxUtilisationEnHeureUtilisation, formaterLaDateEnFrancais, genererUnIdentifiantUnique } from './sharedPresenter'
import { ModeleReducer } from '../components/Inventaire/useEquipement'
import { ReferentielTypeEquipementModel } from '../repository/typesEquipementsRepository'

Expand All @@ -16,8 +16,8 @@ export type InventairePresenter = Readonly<{
}>

export function inventairePresenter(
referentielsTypesEquipementsModel: Array<ReferentielTypeEquipementModel>,
modelesModel: Array<modeleModel>,
referentielsTypesEquipementsModel: ReadonlyArray<ReferentielTypeEquipementModel>,
modelesModel: ReadonlyArray<modeleModel>,
statut: StatutsInventaire
): InventairePresenter {
const equipementsAvecSesModeles = referentielsTypesEquipementsModel.map((referentielTypeEquipementModel): EquipementAvecSesModelesPresenter => {
Expand All @@ -27,19 +27,18 @@ export function inventairePresenter(
let quantite = 0
let dureeDeVie = referentielTypeEquipementModel.dureeDeVie
let heureUtilisation = 24
const equipementsModelFiltre = modelesModel
.filter((modeleModel): boolean => modeleModel.nom === modele.relationModeles.nom)
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)
dureeDeVie = calculerLaDureeDeVie(equipementsModelFiltre[0].dateAchat)
heureUtilisation = convertirLeTauxUtilisationEnHeureUtilisation(equipementsModelFiltre[0].tauxUtilisation)
}

return {
dureeDeVie,
heureUtilisation,
id: crypto.randomUUID(),
id: genererUnIdentifiantUnique(),
nomModele: modele.relationModeles.nom,
quantite,
}
Expand All @@ -51,7 +50,7 @@ export function inventairePresenter(
const dateInventaire = modelesModel.length === 0 ? new Date() : modelesModel[0].dateInventaire

return {
dateInventaire: dateInventaire.toLocaleDateString('fr-FR'),
dateInventaire: formaterLaDateEnFrancais(dateInventaire),
equipementsAvecSesModeles,
isNonCalcule: statut === StatutsInventaire.TRAITE,
}
Expand Down
10 changes: 5 additions & 5 deletions src/presenters/inventairesPresenter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { inventaireModel } from '@prisma/client'

import { StatutsInventaire } from './sharedPresenter'
import { StatutsInventaire, formaterLaDateEnFrancais } from './sharedPresenter'
import { ProfileAtih } from '../authentification'

export type InventairePresenter = Readonly<{
Expand All @@ -15,20 +15,20 @@ export type InventairePresenter = Readonly<{

export type InventairesPresenter = Readonly<{
isAdmin: boolean
inventaires: Array<InventairePresenter>
inventaires: ReadonlyArray<InventairePresenter>
}>

export function inventairesPresenter(inventairesModel: Array<inventaireModel>, profile: ProfileAtih): InventairesPresenter {
export function inventairesPresenter(inventairesModel: ReadonlyArray<inventaireModel>, profile: ProfileAtih): InventairesPresenter {
const inventaires = inventairesModel.map((inventaireModel): InventairePresenter => {
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'),
dateInventaire: formaterLaDateEnFrancais(inventaireModel.dateInventaire),
id: inventaireModel.id,
link: `${path}?nomEtablissement=${encodeURI(inventaireModel.nomEtablissement)}&nomInventaire=${encodeURI(inventaireModel.nomInventaire)}${statusParam}`,
link: encodeURI(`${path}?nomEtablissement=${inventaireModel.nomEtablissement}&nomInventaire=${inventaireModel.nomInventaire}${statusParam}`),
nomEtablissement: inventaireModel.nomEtablissement,
nomInventaire: inventaireModel.nomInventaire,
statut,
Expand Down
8 changes: 6 additions & 2 deletions src/presenters/listeEquipementsPresenter.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { modeleModel } from '@prisma/client'

import { calculerLaDureeDeVie, convertirLeTauxUtilisationEnHeureUtilisation, formaterLaDateEnFrancais } from './sharedPresenter'
import { ReferentielTypeEquipementModel } from '../repository/typesEquipementsRepository'

export type EquipementPresenter = Readonly<{
dateInventaire: Readonly<Date>
dureeDeVie: number
heuresUtilisation: number
modele: string
nomInventaire: string
nomEtablissement: string
Expand All @@ -29,6 +32,8 @@ export function listeEquipementsPresenter(
...ancienModeleModel,
{
dateInventaire: modeleModel.dateInventaire,
dureeDeVie: calculerLaDureeDeVie(modeleModel.dateAchat),
heuresUtilisation: convertirLeTauxUtilisationEnHeureUtilisation(modeleModel.tauxUtilisation),
modele: modeleModel.nom,
nomEtablissement: modeleModel.nomEtablissement,
nomInventaire: modeleModel.nomInventaire,
Expand All @@ -39,8 +44,7 @@ export function listeEquipementsPresenter(
}

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

const dateInventaire = formaterLaDateEnFrancais(equipements[modeles[0]][0].dateInventaire)

return {
dateInventaire,
Expand Down
Loading

0 comments on commit e39533e

Please sign in to comment.