efe_erreur <- efe_erreur |>
mutate(erreur0 = ifelse(c0tot > a2tot & !is.na(c0tot), 1, 0))Contrôles embarqués dans EFE
📄 Consulter le questionnaire de contrôle (connexion GitLab requise)
📄 lien de test Voxco avec controle effectif sexe
Erreur 0 — L’effectifs de formé toutes formations supérieur à effectif salarié
Cette erreur détecte les cas où le nombre de salariés formés toutes formations confondues (c0tot) est supérieur au nombre total de salariés (a2tot), ce qui est incohérent.
Proposition de doubler la question c0tot avec message d’avertissement quand c0tot>a2tot.
“Attention le nombre de salarié formé est superieur à l’effectif total (A2TOT salariés) Merci de corriger ou de valider en cliquant sur suivant.”
Erreur 1 — Répartition des salariés par sexe incohérente
Ce test vérifie que le total par sexe correspond bien au total des salariés (a2tot),
avec une tolérance de ±20 % pour les entreprises de plus de 50 salariés.
efe_erreur <- efe_erreur |>
mutate(
erreur1 = ifelse(a2tot < 50 & ((a2totsexe != a2tot) | a2f > a2tot | a2m > a2tot), 1, 0),
erreur1 = ifelse(a2tot > 50 & (
(a2totsexe > round(a2tot*1.20)) |
(a2totsexe < round(a2tot*0.80))
), 1, erreur1)
)Proposition de doubler la question a2sexe avec message d’avertissement quand a2sexe > a2tot ou a2sexe < a2tot. Message différencier quand la répartition par sexe et supérieur ou inférieur. (voir test dans la questionnaire voxco)
Erreur 1 bis — ⚠️ nouveau controle ⚠️ Répartition des salariés par CS et SEXE incohérente
Proposition de doubler la question a2tot_sexe_cs avec un message d’avertissement : “La répartition des hommes par catégorie socioprofessionnelle ne correspond pas à l’effectif total masculin. Merci de corriger.” ou “La répartition des hommes par catégorie socioprofessionnelle ne correspond pas à l’effectif total féminin. Merci de corriger.”
voir questionnaire voxco
Erreur 1 ter — ⚠️ nouveau controle ⚠️ Répartition des salariés par age
Proposition de doubler la question a2tot_age avec un message d’avertissement :
“La répartition des salariés par catégorie d’age ne correspond pas à l’effectif total (a2tot salariés). Merci de corriger.”
Tests sur les formés
Erreur 2 — Formés cours et stages > formés toutes formations
Cette erreur signale les cas où c1tot (cours ou stages) dépasse c0tot (toutes formations).
efe_erreur <- efe_erreur |>
mutate(
erreur2 = ifelse(entform == 1 & c1tot > c0tot, 1, 0),
erreur2 = ifelse(is.na(erreur2), 0, erreur2)
)Proposition de doubler la question c1tot avec un avertissement. “Attention, le nombre de salariés formés de votre structure (c0tot salariés) est supérieur au nombre de salarié formé uniquement en cours et stages (c1tot). Merci de corriger.”
Tableau pré rempli avec les anciennes valeurs c0tot et c1tot qui sont modifiables
Erreur 2bis — Formés cours/stages renseignés mais pas de total de formé toutes formes
efe_erreur <- efe_erreur |>
mutate(erreur2bis = ifelse(is.na(c0tot) & c1tot > 0, 1, 0))Proposition de suppression de ce controle ou rendre obligatoire c0tot
Erreur 4 — Formés cours et stages superieur à l’effectif salarié total
seuil 10 %
efe_erreur <- efe_erreur |>
mutate(
erreur4 = ifelse(c1tot * 0.90 > a2tot, 1, 0)
)Proposition de doubler la question c1tot avec message un message d’avertissement sans seuil.
“Attention le nombre de salarié formé en cours et satge (c1tot salariés) de votre structure est supérieure au l’effectif total (a2tot salariés). Merci de corriger le nombre de salarié formé.”
Erreur 5 — Répartition par sexe des formés incohérente
Vérifie que la somme des formés hommes et femmes (c2m + c2f) correspond au total (c1tot). Seuil ±20 % pour les entreprises de plus de 50 salariés.
efe_erreur <- efe_erreur |>
mutate(
erreur5 = ifelse(a2tot <= 50 & (c2m + c2f != c1tot), 1, 0),
erreur5 = ifelse(a2tot > 50 & (
(c2m + c2f > round(c1tot * 1.20)) |
(c2m + c2f < round(c1tot * 0.80))
), 1, erreur5),
erreur5 = ifelse((b1a == "Oui" | b1b == "Oui") & c1tot == 0, 1, erreur5)
)proposition équivalente a celle pour les répartitions d’effectif
Erreur 5 bis — ⚠️ nouveau controle ⚠️ Répartition par sexe et CS des formés incohérente
proposition équivalente a celle pour les répartitions d’effectif
Erreur 5 ter — ⚠️ nouveau controle ⚠️ Répartition par age des formés incohérente
proposition équivalente a celle pour les répartitions d’effectif
Erreur 6 — Formations indiquées mais aucune heure déclarée
efe_erreur <- efe_erreur |>
mutate(
erreur6 = ifelse((b1a == "Oui" | b1b == "Oui") & c3tot == 0, 1, 0)
)Proposition de rendre la question obligatoire ou semi bloquante.
Tests sur les dépenses et masse salariale
Erreur 9 — Taux de participation financière trop élevé
TPF>20
efe_erreur <- efe_erreur |>
mutate(
tpf = ifelse((entform == 1 & ms > 0), c7sub/ms*100, 9998),
erreur9 = ifelse((entform == 1 & tpf > 20 & tpf != 9998), 1, 0)
)Proposition message d’avertissement si la MS dépasse un certain seuil à définir en fonction de a2tot alors : “Attention votre masse salariale nous semble élevé/faible au regarde de votre nombre de salariés (a2tot). Merci de la corriger.”
Proposition de message d’avertissement si c7sub trop élevé. c7sub > 5 x MS “Attention, les dépenses pour les cours ou stages de form pro, nous semble trop élevé au regard de votre MS €. Merci de corriger”
Tests sur les heures de formation
Erreur 11 — Heures de formation > heures travaillées
efe_erreur <- efe_erreur |>
mutate(
a4 = as.numeric(a4),
c3tot = as.numeric(c3tot),
erreur11 = ifelse(
entform == 1 & ((a2tot < 50 & c3tot > a4) | (a2tot >= 50 & c3tot > a4 * 1.20)),
1, 0)
)Proposition de suppression du seuil et message d’avertissement dès lors que c3tot > a4 : “Attention, le nb d’heure de formation (c3tot heures) est supérieur au nb d’heure travaillé a4. Merci de corriger.”
Erreur 12 — Durée moyenne de formation trop élevée
supérieur à 200h par tête
efe_erreur <- efe_erreur |>
mutate(erreur12 = ifelse(c1tot > 1 & c3tot / c1tot > 200, 1, 0))Proposition de message d’avertissement dès lors que c3tot> 200 x c1tot.
“Attention le nb d’heure de formation déclaré nous parait élevé au regard du nombre de salarié formé. Merci de corriger.”
Tests sur les recettes et dépenses de formation
###Erreur 17 — Non déclaration des remboursements OPCO
efe_erreur <- efe_erreur |>
mutate(
erreur17 = ifelse(
((b6b == "Oui" & a7f == "Oui" & b6bsom_ht %in% c(0, NA)) |
(b6b == "Oui" & a7f == "Non" & b6bsomttc %in% c(0, NA))),
1, 0
)
)Proposition rendre la question obligatoire ou semi bloquante
Préparation des cas pour erreurs 45 et 46
Cas 1 — Frais pédagogiques vides
efe_erreur <- efe_erreur |>
mutate(
cas1ht = ifelse(
(a7f == "Oui" & (b1a == "Oui" | b1b == "Oui") &
(c7aflag1 == "Oui" | c7aflag2 == "Oui" | c7aflag3 == "Oui") &
(c7a1a %in% c(0, NA) | c7a2ht %in% c(0, NA))),
1, 0
),
cas1ttc = ifelse(
(a7f == "Non" & (b1a == "Oui" | b1b == "Oui") &
(c7aflag1 == "Oui" | c7aflag2 == "Oui" | c7aflag3 == "Oui") &
(c7a1b %in% c(0, NA) | c7a2ttc %in% c(0, NA))),
1, 0
)
)Cas 2 — Frais de déplacement et hébergement vides
efe_erreur <- efe_erreur |>
mutate(
cas2ht = ifelse(
(a7f == "Oui" & (b1a == "Oui" | b1b == "Oui") &
c7bflag == "Oui" & c7bht %in% c(0, NA)),
1, 0
),
cas2ttc = ifelse(
(a7f == "Non" & (b1a == "Oui" | b1b == "Oui") &
c7bflag == "Oui" & c7bttc %in% c(0, NA)),
1, 0
)
)Cas 3 — Frais de personnel des formateurs internes vides
efe_erreur <- efe_erreur |>
mutate(
cas3ht = ifelse(
(a7f == "Oui" & (b1a == "Oui" | b1b == "Oui") &
c7cflag == "Oui" & c7c %in% c(0, NA)),
1, 0
),
cas3ttc = ifelse(
(a7f == "Non" & (b1a == "Oui" | b1b == "Oui") &
c7cflag == "Oui" & c7c %in% c(0, NA)),
1, 0
)
)Cas 4 — Frais liés à l’organisation de la formation vides
efe_erreur <- efe_erreur |>
mutate(
cas4ht = ifelse(
(a7f == "Oui" & (b1a == "Oui" | b1b == "Oui") &
c7dflag == "Oui" & c7dht %in% c(0, NA)),
1, 0
),
cas4ttc = ifelse(
(a7f == "Non" & (b1a == "Oui" | b1b == "Oui") &
c7dflag == "Oui" & c7dttc %in% c(0, NA)),
1, 0
)
)— Au moins un flag vide → demande de C7sub
efe_erreur <- efe_erreur |>
mutate(
cas5 = ifelse(
(b1a == "Oui" | b1b == "Oui") &
((c7aflag1 == "" & c7aflag2 == "" & c7aflag3 == "") |
c7bflag == "" |
((c6f3a %in% c("Oui, à temps plein", "Oui, occasionnellement") | c6f3b == "Oui") &
c7cflag == "") |
c7dflag == ""),
1, 0
)
)Erreurs 45 et 46 — Montants totaux manquants selon cas
Demande de C7sub ttc ou ht
efe_erreur <- efe_erreur |>
mutate(
erreur45 = ifelse(
(cas1ht == 1 | cas2ht == 1 | cas3ht == 1 | cas4ht == 1 | cas5 == 1) &
c7sub == 0 & a7f == "Non",
1, 0
),
erreur46 = ifelse(
(cas1ttc == 1 | cas2ttc == 1 | cas3ttc == 1 | cas4ttc == 1 | cas5 == 1) &
c7sub == 0 & a7f == "Oui",
1, 0
)
)Proposition de rendre C7sub bloquant ou semi bloquant