Skip to content

Commit

Permalink
L'admin peut télécharger tous les inventaires au format CSV
Browse files Browse the repository at this point in the history
  • Loading branch information
NerOcrO committed May 10, 2024
1 parent e4af1eb commit 40df394
Show file tree
Hide file tree
Showing 9 changed files with 133 additions and 5 deletions.
36 changes: 36 additions & 0 deletions src/app/api/exporter-les-inventaires/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { indicateurImpactEquipementModel } from '@prisma/client'
import { notFound } from 'next/navigation'

import { getProfilAtih } from '../../../authentification'
import { recupererTousLesIndicateursImpactsEquipementsRepository } from '../../../repositories/indicateursRepository'

export async function GET(): Promise<Response> {
const profil = await getProfilAtih()

if (!profil.isAdmin) {
notFound()
}

const indicateurs = await recupererTousLesIndicateursImpactsEquipementsRepository()

const fichierCsv = creerLeFichierAExporter(indicateurs)

return new Response(
fichierCsv,
{
headers: {
'content-disposition': `attachment; filename="${fichierCsv.name}"`,
},
}
)
}

function creerLeFichierAExporter(indicateurs: Array<indicateurImpactEquipementModel>): File {
const data = ['date_calcul;date_lot;nom_lot;etapeacv;critere;source;statut_indicateur;trace;version_calcul;conso_elec_moyenne;impact_unitaire;quantite;statut_equipement_physique;type_equipement;unite;nom_entite;nom_organisation;nom_source_donnee;nom_equipement;date_lot_discriminator;nom_organisation_discriminator;nom_entite_discriminator;nom_source_donnee_discriminator']

for (const indicateur of indicateurs) {
data.push(`${indicateur.date_calcul?.toLocaleString('fr-FR')};${indicateur.dateInventaire.toLocaleString('fr-FR')};${indicateur.nomInventaire};${indicateur.etapeAcv};${indicateur.critere};${indicateur.source};${indicateur.statutIndicateur};${indicateur.trace};${indicateur.version_calcul};${indicateur.conso_elec_moyenne};${indicateur.impactUnitaire};${indicateur.quantite};${indicateur.statut_equipement_physique};${indicateur.typeEquipement};${indicateur.unite};${indicateur.nom_entite};${indicateur.nomEtablissement};${indicateur.nom_source_donnee};${indicateur.nom_equipement};${indicateur.date_lot_discriminator?.toLocaleString('fr-FR')};${indicateur.nom_organisation_discriminator};${indicateur.nom_entite_discriminator};${indicateur.nom_source_donnee_discriminator}`)
}

return new File([data.join('\n')], `EvalCarboneSIH_Inventaires_${new Date().toLocaleDateString('fr-FR')}.csv`, { type: 'text/csv' })
}
2 changes: 1 addition & 1 deletion src/components/CreerUneSimulation/useCreerUneSimulation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type UseCreerUneSimulation = Readonly<{
export function useCreerUneSimulation(ancienNomInventaire: string): UseCreerUneSimulation {
const date = new Date()
const router = useRouter()
const { modifierNouveauNomInventaire, setState, state } = useModifierNouveauNomInventaire(`${ancienNomInventaire} - simulation ${date.toLocaleString()}`, false)
const { modifierNouveauNomInventaire, setState, state } = useModifierNouveauNomInventaire(`${ancienNomInventaire} - simulation ${date.toLocaleString('fr-FR')}`, false)

const creerUneSimulation = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type UseCreerUneSimulation = Readonly<{
export function useDupliquerUnInventaire(ancienNomInventaire: string): UseCreerUneSimulation {
const date = new Date()
const router = useRouter()
const { modifierNouveauNomInventaire, setState, state } = useModifierNouveauNomInventaire(`${ancienNomInventaire} - duplication ${date.toLocaleString()}`, false)
const { modifierNouveauNomInventaire, setState, state } = useModifierNouveauNomInventaire(`${ancienNomInventaire} - duplication ${date.toLocaleString('fr-FR')}`, false)

const creerUneSimulation = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault()
Expand Down
40 changes: 40 additions & 0 deletions src/components/Inventaires/Inventaires.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,26 @@ describe('page inventaires', () => {
expect(cellsRow2[4]).toHaveTextContent('Supprimer l’inventaire')
})

it('quand j’affiche la page alors je ne peux pas télécharger l’export CSV', async () => {
// GIVEN
jeSuisUnUtilisateur()

vi.spyOn(repositoryInventaires, 'recupererLesInventairesRepository').mockResolvedValueOnce([
inventaireModelFactory({
id: 1,
nomEtablissement: 'Hopital A$$00000001K',
nomInventaire: 'mon inventaire A',
}),
])

// WHEN
renderComponent(await PageInventaires())

// THEN
const lienExporterLesInventaires = screen.queryByRole('link', { name: 'Exporter les inventaires' })
expect(lienExporterLesInventaires).not.toBeInTheDocument()
})

it('quand je clique pour supprimer un inventaire alors l’inventaire est supprimé et ne s’affiche plus', async () => {
// GIVEN
jeSuisUnUtilisateur()
Expand Down Expand Up @@ -190,6 +210,26 @@ describe('page inventaires', () => {
const lienDupliquer = within(cellsRow1[4]).queryByRole('link', { name: 'Dupliquer l’inventaire' })
expect(lienDupliquer).not.toBeInTheDocument()
})

it('quand j’affiche la page alors je télécharge l’export CSV', async () => {
// GIVEN
jeSuisUnAdmin()

vi.spyOn(repositoryInventaires, 'recupererLesInventairesRepository').mockResolvedValueOnce([
inventaireModelFactory({
id: 1,
nomEtablissement: 'Hopital A$$00000001K',
nomInventaire: 'mon inventaire A',
}),
])

// WHEN
renderComponent(await PageInventaires())

// THEN
const lienExporterLesInventaires = screen.getByRole('link', { name: 'Exporter les inventaires' })
expect(lienExporterLesInventaires).toHaveAttribute('href', '/api/exporter-les-inventaires')
})
})
})
})
18 changes: 17 additions & 1 deletion src/components/Inventaires/InventairesLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function InventairesLayout({ presenter }: InventairesLayoutProps)
</div>
</div>
{
!presenter.isAdmin && (
!presenter.isAdmin ? (
<div>
<Link
className="btn btn--plain btn--primary"
Expand All @@ -33,6 +33,22 @@ export default function InventairesLayout({ presenter }: InventairesLayoutProps)
Créer un inventaire
</Link>
</div>
) : (
<div>
<Link
className="btn btn--ghost btn--default"
href="/api/exporter-les-inventaires"
>
<svg
aria-hidden
className="svg-icon svg-download mr-1"
focusable="false"
>
<use xlinkHref="/svg-icons/icon-sprite.svg#download" />
</svg>
Exporter les inventaires
</Link>
</div>
)
}
</div>
Expand Down
4 changes: 4 additions & 0 deletions src/repositories/indicateursRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ export type IndicateurImpactEquipementSommeModel = Readonly<{
typeEquipement: string
}>

export async function recupererTousLesIndicateursImpactsEquipementsRepository(): Promise<Array<indicateurImpactEquipementModel>> {
return prisma.indicateurImpactEquipementModel.findMany()
}

export async function recupererLesIndicateursImpactsEquipementsRepository(
nomEtablissement: string,
nomInventaire: string
Expand Down
4 changes: 2 additions & 2 deletions src/repositories/modelesRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ export async function enregistrerLesModelesRepository(

data.push(`;${modele.modele};${modele.quantite};;${dateAchat.toISOString().split('T')[0]};${dateRetrait};${modele.type};;France;;;;;;365;;;${modele.heureUtilisation / 24}`)
}
const csvFile = new File([data.join('\n')], 'EquipementPhysique.csv', { type: 'text/csv' })
const fichierCsv = new File([data.join('\n')], 'EquipementPhysique.csv', { type: 'text/csv' })

const formData = new FormData()
formData.append('csvEquipementPhysique', csvFile)
formData.append('csvEquipementPhysique', fichierCsv)

const responseEntrees = await fetch(urlEntrees, {
body: formData,
Expand Down
17 changes: 17 additions & 0 deletions src/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,23 @@ model indicateurImpactEquipementModel {
typeEquipement String @map("type_equipement")
nomEtablissement String @map("nom_organisation")
// Utiliser que pour l'export CSV
date_calcul DateTime?
source String?
trace String?
version_calcul String?
conso_elec_moyenne Float?
quantite Int?
statut_equipement_physique String?
unite String?
nom_entite 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?
@@map("ind_indicateur_impact_equipement_physique")
}

Expand Down
15 changes: 15 additions & 0 deletions src/testShared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,29 @@ export function indicateurImpactEquipementModelFactory(override?: Partial<indica
const date = new Date()

return {
conso_elec_moyenne: 1,
critere: 'Climate change',
dateInventaire: date,
date_calcul: date,
date_lot_discriminator: date,
etapeAcv: EtapesAcv.distribution,
impactUnitaire: 646.886,
nomEtablissement: 'Hopital de Bordeaux$$00000001J',
nomInventaire: 'Centre hospitalier',
nom_entite: 'String',
nom_entite_discriminator: 'String',
nom_equipement: 'String',
nom_organisation_discriminator: 'String',
nom_source_donnee: 'String',
nom_source_donnee_discriminator: 'String',
quantite: 1,
source: 'String',
statutIndicateur: 'OK',
statut_equipement_physique: 'String',
trace: 'String',
typeEquipement: 'Ordinateur portable',
unite: 'String',
version_calcul: 'String',
...override,
}
}
Expand Down

0 comments on commit 40df394

Please sign in to comment.