Skip to content

Commit

Permalink
Ajout de la durée de vie et des heures d'utilisation
Browse files Browse the repository at this point in the history
  • Loading branch information
NerOcrO committed Apr 30, 2024
1 parent 2e37ddf commit f325def
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 36 deletions.
7 changes: 4 additions & 3 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ model en_equipement_physique {
nom_organisation String
nom_source_donnee String?
conso_elec_annuelle Float?
date_achat DateTime?
date_retrait DateTime?
date_achat DateTime
date_retrait DateTime
duree_vie_defaut Float?
go_telecharge Float?
modele String
Expand All @@ -43,7 +43,7 @@ model en_equipement_physique {
type String
utilisateur String?
mode_utilisation String?
taux_utilisation Float?
taux_utilisation Float
statut_traitement String
stockage_total_virtuel Float?
ref_equipement_par_defaut String?
Expand Down Expand Up @@ -92,5 +92,6 @@ model ref_correspondance_ref_eqp {

model ref_type_equipement {
type String @unique
duree_vie_defaut Float
modeles ref_correspondance_type_equipement[]
}
6 changes: 6 additions & 0 deletions src/app/(connecte)/inventaire/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,20 @@ function transformTypesEquipementModelToViewModel(
modeles: equipementReferentielModel.modeles
.map((modele): ModeleReducer => {
let quantite = 0
let dureeDeVie = equipementReferentielModel.duree_vie_defaut
let heureUtilisation = 24
const equipementsModelFiltre = equipementsEnregistresModel
.filter((equipementEnregistreModel): boolean => equipementEnregistreModel.modele === modele.ref_correspondance_ref_eqp.modele_equipement_source)

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

return {
dureeDeVie,
heureUtilisation,
id: crypto.randomUUID(),
nomModele: modele.ref_correspondance_ref_eqp.modele_equipement_source,
quantite,
Expand Down
8 changes: 4 additions & 4 deletions src/components/Inventaire/Actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@ import { ReactElement } from 'react'
import { StatutsInventaire } from '../viewModel'

type ModaleProps = Readonly<{
enregistrerUnInventaireNonCalcule: () => void
quantiteGlobale: number
statut: StatutsInventaire
}>

export default function Actions({ enregistrerUnInventaireNonCalcule, quantiteGlobale, statut }: ModaleProps): ReactElement {
export default function Actions({ quantiteGlobale, statut }: ModaleProps): ReactElement {
const isNonCalcule = statut === StatutsInventaire.TRAITE

return (
Expand All @@ -19,8 +18,8 @@ export default function Actions({ enregistrerUnInventaireNonCalcule, quantiteGlo
isNonCalcule ? null : (
<button
className="btn btn--ghost btn--default"
onClick={enregistrerUnInventaireNonCalcule}
type="button"
name="enregistrer"
type="submit"
>
Enregistrer
</button>
Expand All @@ -29,6 +28,7 @@ export default function Actions({ enregistrerUnInventaireNonCalcule, quantiteGlo
<button
className="btn btn--plain btn--primary"
disabled={quantiteGlobale > 0 ? false : true}
name="calculer"
type="submit"
>
Calculer l’empreinte
Expand Down
6 changes: 2 additions & 4 deletions src/components/Inventaire/Inventaire.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ export default function Inventaire({
nomInventaire,
statut,
}: InventaireProps): ReactElement {
const { enregistrerUnInventaireNonCalcule, isInventaireEnregistre, lancerLeCalcul, quantiteGlobale, setQuantiteGlobale } = useInventaire(nomInventaire)
const { enregistrerUnInventaire, isInventaireEnregistre, quantiteGlobale, setQuantiteGlobale } = useInventaire(nomInventaire)

const actions = (): ReactElement => (
<Actions
// eslint-disable-next-line @typescript-eslint/no-misused-promises
enregistrerUnInventaireNonCalcule={enregistrerUnInventaireNonCalcule}
quantiteGlobale={quantiteGlobale}
statut={statut}
/>
Expand All @@ -40,7 +38,7 @@ export default function Inventaire({
className="inventaire"
method="post"
// eslint-disable-next-line @typescript-eslint/no-misused-promises
onSubmit={lancerLeCalcul}
onSubmit={enregistrerUnInventaire}
>
<div className="d-flex justify-content-between">
<div>
Expand Down
53 changes: 43 additions & 10 deletions src/components/Inventaire/Modele.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,26 @@ type ModeleProps = Readonly<{
}>

export default function Modele({ id, ligneModele, modifierUnModele, nomEquipement, nomModele }: ModeleProps): ReactElement {
const modifierQuantite = (event: FormEvent<HTMLInputElement>) => {
const modifierUneValeurDuModele = (clef: string) => (event: FormEvent<HTMLInputElement>) => {
modifierUnModele({
...ligneModele,
quantite: event.currentTarget.valueAsNumber,
[clef]: event.currentTarget.valueAsNumber,
})
}

return (
<div className="row">
<div className="form-group col-md-7">
<div className="form-group col-md-4">
<label htmlFor={`inventaire-${id}`}>
Modèle
<InfoBulle label="Un modèle d’équipement fait référence à un produit spécifique tel que MacBook Pro, Dell XPS, etc. La connaissance précise du nombre d’équipement de chaque modèle permet une estimation plus précise." />
</label>
<input
className="form-control"
<div
className="ml-1"
data-nom-equipement={nomEquipement}
disabled
value={nomModele}
/>
>
{nomModele}
</div>
</div>
<div className="form-group col-md-2">
<label htmlFor={`quantite-${id}`}>
Expand All @@ -40,15 +40,48 @@ export default function Modele({ id, ligneModele, modifierUnModele, nomEquipemen
</label>
<input
className="form-control"
data-nom-quantite={ligneModele.quantite}
data-quantite
id={`quantite-${id}`}
min={0}
name={`quantite-${id}`}
onChange={modifierQuantite}
onChange={modifierUneValeurDuModele('quantite')}
type="number"
value={ligneModele.quantite}
/>
</div>
<div className="form-group col-md-3">
<label htmlFor={`duree-de-vie-${id}`}>
Durée de vie en années
<InfoBulle label="La durée de vie correspond à la période souhaitée pendant laquelle un équipement devrait être opérationnel et fonctionner de manière satisfaisante, exprimée en années." />
</label>
<input
className="form-control"
data-duree-de-vie
id={`duree-de-vie-${id}`}
min={1}
name={`duree-de-vie-${id}`}
onChange={modifierUneValeurDuModele('dureeDeVie')}
type="number"
value={ligneModele.dureeDeVie}
/>
</div>
<div className="form-group col-md-3">
<label htmlFor={`heure-${id}`}>
Heures d’utilisation par jour
<InfoBulle label="Le nombre d’heures d’utilisation quotidienne d’un équipement représente le temps moyen passé à utiliser cet appareil sur 24h, exprimé en heures." />
</label>
<input
className="form-control"
data-heure-utilisation
id={`heure-${id}`}
max={24}
min={1}
name={`heure-${id}`}
onChange={modifierUneValeurDuModele('heureUtilisation')}
type="number"
value={ligneModele.heureUtilisation}
/>
</div>
</div>
)
}
18 changes: 11 additions & 7 deletions src/components/Inventaire/modele.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import { EquipementPhysique } from '../../repository/equipementsRepository'

export const modelesSelectionnes = () => {
const selects = document.querySelectorAll<HTMLSelectElement>('form [data-nom-equipement]')
const inputs = document.querySelectorAll<HTMLInputElement>('form [data-nom-quantite]')
const equipements = document.querySelectorAll<HTMLDivElement>('form [data-nom-equipement]')
const quantites = document.querySelectorAll<HTMLInputElement>('form [data-quantite]')
const dureesDeVie = document.querySelectorAll<HTMLInputElement>('form [data-duree-de-vie]')
const heuresUtilisation = document.querySelectorAll<HTMLInputElement>('form [data-heure-utilisation]')
const modeles: EquipementPhysique[] = []

for (let index = 0; index < selects.length; index++) {
if (inputs[index].valueAsNumber > 0) {
for (let index = 0; index < equipements.length; index++) {
if (quantites[index].valueAsNumber > 0) {
modeles.push({
modele: selects[index].value,
quantite: inputs[index].valueAsNumber,
type: selects[index].dataset.nomEquipement ?? '',
dureeDeVie: dureesDeVie[index].valueAsNumber,
heureUtilisation: heuresUtilisation[index].valueAsNumber,
modele: equipements[index].innerText,
quantite: quantites[index].valueAsNumber,
type: equipements[index].dataset.nomEquipement ?? '',
})
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/components/Inventaire/useEquipement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { modelesSelectionnes } from './modele'

export type ModeleReducer = Readonly<{
id: string
dureeDeVie: number
heureUtilisation: number
nomModele: string
quantite: number
}>
Expand Down
20 changes: 14 additions & 6 deletions src/components/Inventaire/useInventaire.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useRouter } from 'next/navigation'
import { FormEvent, useEffect, useState } from 'react'
import { SyntheticEvent, useEffect, useState } from 'react'

import { creerUnInventaireAction, enregistrerUnInventaireNonCalculeAction } from './action'
import { modelesSelectionnes } from './modele'
Expand All @@ -19,9 +19,7 @@ export function useInventaire(nomInventaire: string) {
router.refresh()
}

const lancerLeCalcul = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault()

const lancerLeCalcul = async () => {
setQuantiteGlobale(0)
await creerUnInventaireAction(nomInventaire, modelesSelectionnes())

Expand All @@ -31,15 +29,25 @@ export function useInventaire(nomInventaire: string) {
router.refresh()
}

const enregistrerUnInventaire = async (event: SyntheticEvent<HTMLFormElement, SubmitEvent>) => {
event.preventDefault()

// @ts-expect-error
if (event.nativeEvent.submitter?.name === 'enregistrer') {
await enregistrerUnInventaireNonCalcule()
} else {
await lancerLeCalcul()
}
}

useEffect(() => {
const quantiteGlobale = modelesSelectionnes().reduce((quantiteAccumulee, modele): number => quantiteAccumulee + modele.quantite, 0)
setQuantiteGlobale(quantiteGlobale)
}, [])

return {
enregistrerUnInventaireNonCalcule,
enregistrerUnInventaire,
isInventaireEnregistre,
lancerLeCalcul,
quantiteGlobale,
setQuantiteGlobale,
}
Expand Down
12 changes: 10 additions & 2 deletions src/repository/equipementsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,27 @@ type ApiErrorJava = Readonly<{
}>

export type EquipementPhysique = Readonly<{
dureeDeVie: number
heureUtilisation: number
modele: string
quantite: number
type: string
}>

export type EquipementPhysiqueModel = Readonly<{
type: string
duree_vie_defaut: number
modeles: readonly {
ref_correspondance_ref_eqp: Readonly<{
modele_equipement_source: string
}>
}[]
type: string
}>

export async function recupererLesReferentielsEquipementsRepository(): Promise<EquipementPhysiqueModel[]> {
return await prisma.ref_type_equipement.findMany({
select: {
duree_vie_defaut: true,
modeles: {
select: {
ref_correspondance_ref_eqp: {
Expand Down Expand Up @@ -78,14 +82,18 @@ async function ajouterEquipementsPhysiquesRepository(
nomInventaire: string,
modeles: EquipementPhysique[]
): Promise<boolean> {
const dateRetrait = new Date().toISOString().split('T')[0]
const urlEntrees = new URL(`${process.env.EXPOSITION_DONNEES_ENTREES_URL}/entrees/csv`)
urlEntrees.searchParams.append('nomLot', nomInventaire)
urlEntrees.searchParams.append('nomOrganisation', nomEtablissement)
urlEntrees.searchParams.append('dateLot', dateInventaire.toISOString().split('T')[0])

let data = 'nomEquipementPhysique;modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;nomSourceDonnee;nomEntite;nbCoeur;nbJourUtiliseAn;goTelecharge;modeUtilisation;tauxUtilisation\n'
for (const modele of modeles) {
data += `;${modele.modele};${modele.quantite};;;;${modele.type};;France;;;;;;365;;;\n`
const dateAchat = new Date()
dateAchat.setFullYear(dateAchat.getFullYear() - modele.dureeDeVie)

data += `;${modele.modele};${modele.quantite};;${dateAchat.toISOString().split('T')[0]};${dateRetrait};${modele.type};;France;;;;;;365;;;${modele.heureUtilisation / 24}\n`
}

const responseEntrees = await fetch(urlEntrees, {
Expand Down

0 comments on commit f325def

Please sign in to comment.