-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Redirige vers le site qui centralise
- Loading branch information
Showing
1 changed file
with
2 additions
and
152 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,169 +1,19 @@ | ||
import {useCallback, useEffect, useState, useReducer} from 'react' | ||
import Head from 'next/head' | ||
import { push } from "@socialgouv/matomo-next" | ||
import styles from '../styles/Home.module.css' | ||
|
||
|
||
function init() { | ||
return [] | ||
} | ||
|
||
function reducer(state, action) { | ||
switch (action.type) { | ||
case 'append': | ||
push(['trackEvent', 'Test', JSON.stringify(action.item)]) | ||
return [action.item, ...state] | ||
case 'reset': | ||
return init() | ||
default: | ||
throw new Error() | ||
} | ||
} | ||
|
||
export default function Home() { | ||
const defaultColor = 'white' | ||
const [color, setColor] = useState(defaultColor) | ||
const [file, setFile] = useState(null) | ||
const [total, setTotal] = useState('?') | ||
const [countWithEmail, setCountWithEmail] = useState('?') | ||
const [countWithUsableEmail, setCountWithUsableEmail] = useState('?') | ||
|
||
const [runs, dispatchRuns] = useReducer(reducer, [], init) | ||
|
||
const dragHandler = color => useCallback((event) => { | ||
setColor(color) | ||
event.preventDefault() // Prevent file from being open on drop | ||
}) | ||
|
||
const fileHandler = (file) => { | ||
var reader = new FileReader() | ||
reader.onload = function(event) { | ||
const parser = new DOMParser() | ||
const dom = parser.parseFromString(event.target.result, "application/xml") | ||
|
||
const items = new Array(...dom.getElementsByTagName('InfoDemandeRSA')) | ||
const withEmail = items.filter(i => i.getElementsByTagName('ADRELEC').length) | ||
const withUsableEmail = items.filter(i => { | ||
const ok = i.getElementsByTagName('AUTORUTIADRELEC')[0] | ||
return i.getElementsByTagName('ADRELEC').length && ok && ok.innerHTML == "A" | ||
}) | ||
|
||
dispatchRuns({ | ||
type: 'append', | ||
item: { | ||
timetamp: (new Date()).toISOString().slice(0,19), | ||
filename: file.name, | ||
error: dom.activeElement.nodeName == "parsererror", | ||
total: items.length, | ||
withEmail: withEmail.length, | ||
withAutorisation: withUsableEmail.length | ||
} | ||
}) | ||
} | ||
reader.readAsText(file) | ||
} | ||
|
||
const dropHandler = useCallback((event) => { | ||
event.preventDefault() | ||
setColor(defaultColor) | ||
for (var i = 0; i<event.dataTransfer.files.length; i++) { | ||
fileHandler(event.dataTransfer.files[i]) | ||
} | ||
}) | ||
|
||
const selectHandler = useCallback((event) => { | ||
for (var i = 0; i<event.target.files.length; i++) { | ||
fileHandler(event.target.files[i]) | ||
} | ||
event.target.value = '' | ||
}) | ||
|
||
const round = (value) => Math.round(value) | ||
return ( | ||
<div className={styles.container} style={{backgroundColor:color}} onDragOver={dragHandler('#0070f3')} onDragLeave={dragHandler(defaultColor)} onDrop={dropHandler}> | ||
<div className={styles.container}> | ||
<Head> | ||
<title>Lecteur de fichier CNAF</title> | ||
<link rel="icon" href="/favicon.ico" /> | ||
</Head> | ||
|
||
<main className={styles.main}> | ||
<h1 className={styles.title}> | ||
Lecteur de fichier CNAF | ||
Ça a changé d'endroit, maintenant c'est <a href="https://betagouv.github.io/analyse-flux-insertion/">betagouv.github.io/analyse-flux-insertion</a> ! | ||
</h1> | ||
|
||
<p className={styles.description}> | ||
Glissez et déposez le fichier CNAF à analyser ou sélectionnez le.<br/> | ||
<input type="file" onChange={selectHandler} multiple/> | ||
</p> | ||
|
||
<p className={styles.description}> | ||
Les opérations sont toutes réalisées sur votre ordinateur.<br/> | ||
Aucune donnée personnelle n'est transférée. | ||
</p> | ||
|
||
<p className={styles.description}> | ||
<a href="#pourquoi">Pourquoi un tel lecteur ?</a> | ||
</p> | ||
|
||
{ runs && runs.length > 0 && (<> | ||
<h2 className={styles.subtitle}> | ||
Historique | ||
</h2> | ||
|
||
<table> | ||
<tbody> | ||
<tr> | ||
<th>Date</th> | ||
<th>Fichier</th> | ||
<th>Dossiers</th> | ||
<th>avec email</th> | ||
<th>et autorisation</th> | ||
<th>Erreur</th> | ||
</tr> | ||
{runs.map(r => (<tr key={`${r.timetamp}-${r.filename}` }> | ||
<td>{r.timetamp}</td> | ||
<td>{r.filename}</td> | ||
<td className={styles.numeric}>{r.total}</td> | ||
<td className={styles.numeric}>{r.withEmail} ({round(r.withEmail/r.total*100)}%)</td> | ||
<td className={styles.numeric}>{r.withAutorisation} ({round(r.withAutorisation/r.total*100)}%)</td> | ||
<td>{r.error ? 'Oui' : 'Non'}</td> | ||
</tr> | ||
))} | ||
</tbody> | ||
</table> | ||
|
||
<button onClick={() => dispatchRuns({type: 'reset'})}>Vider l'historique</button> | ||
</>)} | ||
|
||
<p className={styles.description}> | ||
Un problème, une question ? Contactez-nous à <a href="mailto:data.insertion@beta.gouv.fr?subject=[Flux CNAF]">data.insertion@beta.gouv.fr</a> | ||
</p> | ||
|
||
<h2 id="pourquoi" className={styles.subtitle}> | ||
Pourquoi un lecteur de fichier CNAF ? | ||
</h2> | ||
|
||
<p className={styles.text}> | ||
Tous les départements n'ont pas les outils pour analyser les fichiers envoyés par la CNAF. Cela peut ralentir et compliquer nos échanges. | ||
</p> | ||
<p className={styles.text}> | ||
Avec cet outil, nous souhaitons permettre aux personnes qui ont accès à ces fichiers d'en extraire des statistiques générales sans avoir à mettre les mains dans le camboui elles-même. | ||
</p> | ||
<p className={styles.text}> | ||
Aujourd'hui, nous cherchons à comprendre pourquoi pour la CNAF 90% des dossiers présents dans les fichiers quotidiens d'instructions contiennent des emails alors que ce taux est de 30% à 50% pour certains départements. | ||
</p> | ||
|
||
</main> | ||
|
||
<footer className={styles.footer}> | ||
<a | ||
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app" | ||
target="_blank" | ||
rel="noopener noreferrer" | ||
> | ||
Propulsé par data.insertion | ||
</a> | ||
</footer> | ||
</div> | ||
) | ||
} |