statistiques/src/data/nettoyage/nettoyerDonneesFamilles.ts

125 lines
3.5 KiB
TypeScript
Raw Normal View History

import { EvenementFamille } from "../EvenementFamille";
2024-10-12 18:54:11 +02:00
import { Famille } from "../Famille";
import { checkDataConsistency } from "./checkDataConsistency";
import {
MessageDeNettoyage,
msgDonneeBloquante,
msgDonneeIgnoree,
msgDonneeSuspecte,
} from "./MessageDeNettoyage";
type DonneesNettoyees = {
familles: Famille[];
messages: MessageDeNettoyage[];
};
export function nettoyerDonneesFamilles(
donneesFamillesBrutes: Famille[]
): DonneesNettoyees {
let familles = donneesFamillesBrutes;
let messages: MessageDeNettoyage[] = [];
const output1 = supprimerLesEntreesVide(familles);
messages = [...messages, ...output1.messages];
familles = output1.familles;
2024-10-12 18:54:11 +02:00
// TODO convert checkDataConsistency to filters
const consistencyReport = checkDataConsistency(familles);
// Adapte les message
const errorMessages: MessageDeNettoyage[] = consistencyReport.errors.map(
(e) => msgDonneeBloquante(`${e.familyId} - ${e.issueType}`)
);
const warnings: MessageDeNettoyage[] = consistencyReport.warnings.map((e) =>
msgDonneeSuspecte(`${e.familyId} - ${e.issueType}`)
);
messages = [...messages, ...errorMessages, ...warnings];
const output2 = supprimerLesEvenementsSansDate(familles);
messages = [...messages, ...output2.messages];
familles = output2.familles;
const output3 = supprimerLesEvenementsHorsResisstance(familles);
messages = [...messages, ...output3.messages];
familles = output3.familles;
2024-10-12 18:54:11 +02:00
return {
familles,
messages,
};
}
/**
* Supprime "Famille de résistant" qui sont souvent créé par erreur
*/
function supprimerLesEntreesVide(familles: Famille[]): DonneesNettoyees {
const nettoyees = familles.filter((f) => f.Titre !== "Famille de résistant");
const ignorees = familles.filter((f) => f.Titre === "Famille de résistant");
if (ignorees.length > 0) {
return {
familles: nettoyees,
messages: [
msgDonneeIgnoree(
`${
nettoyees.length - familles.length
} enregistrement(s) famille "vide" ignoré(s)`
),
],
};
} else {
return {
familles: nettoyees,
messages: [],
};
}
}
function supprimerLesEvenementsSansDate(familles: Famille[]): DonneesNettoyees {
return ignorerEvenements(
familles,
(e: EvenementFamille) => e.Date === null,
(e, f) =>
`Evenement "${f.Titre} - ${e.Évènement}" [${e.notionId}] n'as pas de Date il sera ignoré`
);
}
function supprimerLesEvenementsHorsResisstance(
familles: Famille[]
): DonneesNettoyees {
return ignorerEvenements(
familles,
(e: EvenementFamille, f: Famille) => {
return (
e.Date !== null &&
((f.Integration !== null && e.Date < f.Integration) ||
(f.Sortie !== null && e.Date > f.Sortie))
);
},
(e, f) =>
`Evenement "${f.Titre} - ${e.Évènement}" [${e.notionId}] hors période de résistance il sera ignoré`
);
}
function ignorerEvenements(
familles: Famille[],
conditionAIgnoree: (evt: EvenementFamille, f: Famille) => boolean,
messageIgnoreeFn: (evt: EvenementFamille, f: Famille) => string
): DonneesNettoyees {
let messages: MessageDeNettoyage[] = [];
const nettoyees = familles.map((f) => {
const nettoyees = f.Evenements.filter((e) => !conditionAIgnoree(e, f));
const evtIgnorees = f.Evenements.filter((e) => conditionAIgnoree(e, f));
messages = [
...messages,
...evtIgnorees.map((e) => msgDonneeIgnoree(messageIgnoreeFn(e, f))),
];
return { ...f, Evenements: nettoyees };
});
return {
familles: nettoyees,
messages,
};
}