From 1d08e14f5648bccf58e753878359a01cf7a94dfd Mon Sep 17 00:00:00 2001 From: Nicolas KREMER Date: Fri, 19 Jan 2024 11:41:30 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20mise=20=C3=A0=20jour=20des=20champs=20ty?= =?UTF-8?q?pe=5Fcfa,=20nom=20,=20prenom=20pour=20SIFA=20(#3516)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/sifa.actions/sifa.actions.ts | 54 +++++-------------- .../actions/sifa.actions/sifaCsvFields.ts | 35 ++++++++++++ 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/server/src/common/actions/sifa.actions/sifa.actions.ts b/server/src/common/actions/sifa.actions/sifa.actions.ts index 6ac733405..36d1a6488 100644 --- a/server/src/common/actions/sifa.actions/sifa.actions.ts +++ b/server/src/common/actions/sifa.actions/sifa.actions.ts @@ -9,39 +9,7 @@ import { getCodePostalInfo } from "@/common/apis/apiTablesCorrespondances"; import { Effectif } from "@/common/model/@types/Effectif"; import { effectifsDb } from "@/common/model/collections"; -import { SIFA_FIELDS, formatAN_FORM } from "./sifaCsvFields"; - -const formatStringForSIFA = (str) => { - if (!str) return undefined; - const accent = [ - /[\300-\306]/g, - /[\340-\346]/g, // A, a - /[\310-\313]/g, - /[\350-\353]/g, // E, e - /[\314-\317]/g, - /[\354-\357]/g, // I, i - /[\322-\330]/g, - /[\362-\370]/g, // O, o - /[\331-\334]/g, - /[\371-\374]/g, // U, u - /[\321]/g, - /[\361]/g, // N, n - /[\307]/g, - /[\347]/g, // C, c - ]; - const noaccent = ["A", "a", "E", "e", "I", "i", "O", "o", "U", "u", "N", "n", "C", "c"]; - - for (var i = 0; i < accent.length; i++) { - str = str.replace(accent[i], noaccent[i]); - } - - return str.replaceAll(/[^0-9a-zA-Z\- ]/g, "") ?? undefined; -}; - -const wrapNumString = (str) => { - if (!str) return str; - return `="${str}"`; -}; +import { SIFA_FIELDS, formatAN_FORM, formatStringForSIFA, wrapNumString } from "./sifaCsvFields"; export const isEligibleSIFA = (historique_statut: Effectif["apprenant"]["historique_statut"]) => { const endOfyear = getSIFADate(new Date()); @@ -137,11 +105,18 @@ export const generateSifa = async (organisme_id: ObjectId) => { // Extraction du code diplome cfd const codeDiplome = wrapNumString(formationBcn?.cfd || effectif.formation.cfd); + // Adresse de l'effectif + const effectifAddress = effectif.apprenant.adresse + ? effectif.apprenant.adresse?.complete ?? + `${effectif.apprenant.adresse?.numero ?? ""} ${effectif.apprenant.adresse?.repetition_voie ?? ""} ${ + effectif.apprenant.adresse?.voie ?? "" + }` + : undefined; const requiredFields = { NUMERO_UAI: organismeResponsableUai, - NOM: formatStringForSIFA(effectif.apprenant.nom), - PRENOM1: formatStringForSIFA(effectif.apprenant.prenom), + NOM: formatStringForSIFA(effectif.apprenant.nom)?.slice(0, 100), + PRENOM1: formatStringForSIFA(effectif.apprenant.prenom)?.slice(0, 100), DATE_NAIS: effectif.apprenant.date_de_naissance ? wrapNumString( DateTime.fromJSDate(new Date(effectif.apprenant.date_de_naissance)) @@ -153,12 +128,7 @@ export const generateSifa = async (organisme_id: ObjectId) => { LIEU_NAIS: wrapNumString(cpNaissanceInfo?.code_commune_insee), SEXE: effectif.apprenant.sexe === "M" ? "1" : "2", - ADRESSE: effectif.apprenant.adresse - ? effectif.apprenant.adresse?.complete ?? - `${effectif.apprenant.adresse?.numero ?? ""} ${effectif.apprenant.adresse?.repetition_voie ?? ""} ${ - effectif.apprenant.adresse?.voie ?? "" - }` - : undefined, + ADRESSE: effectifAddress?.slice(0, 200) || "", SIT_N_1: effectif.apprenant.derniere_situation, ETAB_N_1: effectif.apprenant.dernier_organisme_uai ? effectif.apprenant.dernier_organisme_uai.length === 8 @@ -179,7 +149,7 @@ export const generateSifa = async (organisme_id: ObjectId) => { AN_FORM: formatAN_FORM(effectif.formation.annee), SIT_FORM: organismeFormateurUai, STATUT: "APP", // STATUT courant - TYPE_CFA: wrapNumString(effectif.apprenant.type_cfa), + TYPE_CFA: wrapNumString(String(effectif.apprenant.type_cfa).padStart(2, "0")), UAI_EPLE: "NC", NAT_STR_JUR: "NC", // Unknown for now }; diff --git a/server/src/common/actions/sifa.actions/sifaCsvFields.ts b/server/src/common/actions/sifa.actions/sifaCsvFields.ts index d0cef47b1..9d2a14761 100644 --- a/server/src/common/actions/sifa.actions/sifaCsvFields.ts +++ b/server/src/common/actions/sifa.actions/sifaCsvFields.ts @@ -189,7 +189,42 @@ export const SIFA_FIELDS = [ }, ]; +// Detecter la durée de formation export const formatAN_FORM = (year: number | undefined) => { if (year == null) return year; return `${year}A`; }; + +export const formatStringForSIFA = (str: string | undefined) => { + if (typeof str !== "string" || str.length === 0) return undefined; + + const accentsMap = { + A: /[\300-\306]/g, + a: /[\340-\346]/g, + E: /[\310-\313]/g, + e: /[\350-\353]/g, + I: /[\314-\317]/g, + i: /[\354-\357]/g, + O: /[\322-\330]/g, + o: /[\362-\370]/g, + U: /[\331-\334]/g, + u: /[\371-\374]/g, + N: /[\321]/g, + n: /[\361]/g, + C: /[\307]/g, + c: /[\347]/g, + }; + + // Remplace chaque accent par son homologue non accentué + for (const [replacement, regex] of Object.entries(accentsMap)) { + str = str.replace(regex, replacement); + } + + // Remplacez les traits d'union par des espaces et supprimez tous les caractères non alphanumériques (hors espaces) + return str.replace(/-/g, " ").replace(/[^0-9a-zA-Z ]/g, ""); +}; + +export const wrapNumString = (str: string | number | null | undefined) => { + if (str === null || str === undefined) return str; + return `="${str}"`; +};