Files
2022-11-08 21:19:51 +01:00

260 lines
18 KiB
Python

import datetime
from enum import Enum, EnumMeta, unique
from typing import Any, Dict, List, Union
import numpy as np
import pandas as pd
def excel_date_converter(value) -> Union[str, float]:
"""
convertit la valeur en date (sans information de temps)
note : type(np.nan) => <class 'float'>
"""
if isinstance(value, datetime.datetime):
return value.date().isoformat()
if isinstance(value, str):
val = '-'.join(list(reversed(value.split('/'))))
return datetime.datetime.strptime(val, "%Y-%m-%d").date().isoformat() if val else np.nan
return str(value) if value else np.nan
def excel_int64_converter(value) -> Union[int, float]:
"""
convertit la valeur en entier
note : type(np.nan) => <class 'float'>
"""
if isinstance(value, int):
return value
val = value.strip() if isinstance(value, str) else value
return np.int64(val) if val else np.nan
def excel_uint64_converter(value) -> Union[int, float]:
"""
convertit la valeur en entier non signé
note : type(np.nan) => <class 'float'>
"""
if isinstance(value, int):
return value
val = value.strip() if isinstance(value, str) else value
return np.uint64(val) if val else np.nan
class FileCols(str, Enum):
""" Classe de base pour les colonnes d'un fichier """
converter: str
def __new__(metacls, value: str, converter=None):
obj = str.__new__(metacls, value)
obj._value_ = value
obj.converter = converter
return obj
def __repr__(self):
return self.__str__()
@classmethod
def columns(cls, *args: 'FileCols') -> List[str]:
"""
Renvoie les noms de colonnes. Deux cas :
- il n'y a pas d'argument : tous les noms de colonnes
- il y a des arguments : uniquement leurs noms de colonnes
:param args: membres de l'enum
:type args: class:`FileCols` (multiple)
:return: noms de colonnes
:rtype: List[str]
"""
return [member.value for member in (args or cls)]
@classmethod
def col_mapping(cls, mapping: Dict[Union[str, 'FileCols'], Any]) -> Dict[str, Any]:
"""
Renvoie un mapping de noms pour utiliser avec pandas.DataFrame.rename.
Les clés du dictionnaire initial peut être des membres de l'enum, elles seront converties
en noms de colonnes.
:param mapping: correspondances initiales
:type mapping: Dict[Union[str, FileCols], Any]
:return: nouvelles correspondances
:rtype: Dict[str, Any]
"""
return {k.value if isinstance(k, cls) else k: v for k, v in mapping.items()}
@classmethod
def converters(cls, *args: 'FileCols') -> Dict[str, Any]:
"""
Renvoie un mapping de conversion pour Pandas. Deux cas :
- il n'y a pas d'argument : mapping de toutes les colonnes qui ont un convertisseur explicite
- il y a des arguments : mapping des colonnes fournies qui ont un convertisseur explicite
:return: mapping entre noms de colonnes et convertisseur
:rtype: Dict[str, Any]
"""
return {member.value: member.converter for member in (args or cls) if member.converter is not None}
class BOCols(FileCols):
""" Colonnes du fichier BO """
AFFECTATION_1 = ('Affectation -1 L', str) # AV
AFFECTATION_2 = ('Affectation -2 L', str) # AX
AFFECTATION_3 = ('Affectation -3 L', str) # AZ
AFFECTATION_4 = ('Affectation -4 L', str) # BB
AFFECTATION_5 = ('Affectation -5 L', str) # BD
AFFECTATION_6 = ('Affectation -6 L', str) # BF
AFFECTATION_7 = ('Affectation -7 L', str) # BH
AFFECTATION_8 = ('Affectation -8 L', str) # BJ
AFFECTATION_9 = ('Affectation -9 L', str) # BL
AGE_ANNEES = ('Age en années (au 31/12)', excel_uint64_converter) # CG
ANNEE_NOTATION = ('Année notation A', excel_uint64_converter) # CL
ANNEE_NOTATION_1 = ('Année notation A-1', excel_uint64_converter) # CR
ANNEE_NOTATION_2 = ('Année notation A-2', excel_uint64_converter) # CX
ANNEE_NOTATION_3 = ('Année notation A-3', excel_uint64_converter) # DD
ANNEE_NOTATION_4 = ('Année notation A-4', excel_uint64_converter) # DJ
ANNEE_NOTATION_5 = ('Année notation A-5', excel_uint64_converter) # DP
APTITUDE_EMPLOI_SUP = ('Apt resp / Emp sup A', str) # CP
APTITUDE_EMPLOI_SUP_1 = ('Apt resp / Emp sup A-1', str) # CV
APTITUDE_EMPLOI_SUP_2 = ('Apt resp / Emp sup A-2', str) # DB
APTITUDE_EMPLOI_SUP_3 = ('Apt resp / Emp sup A-3', str) # DH
APTITUDE_EMPLOI_SUP_4 = ('Apt resp / Emp sup A-4', str) # DN
APTITUDE_EMPLOI_SUP_5 = ('Apt resp / Emp sup A-5', str) # DT
ARME = ('Arme', str) # L
CREDO_FE = ('CREDO FE act', str) # X
DATE_AFFECTATION_1 = ('Affectation -1 DD', excel_date_converter) # AU
DATE_AFFECTATION_2 = ('Affectation -2 DD', excel_date_converter) # AW
DATE_AFFECTATION_3 = ('Affectation -3 DD', excel_date_converter) # AY
DATE_AFFECTATION_4 = ('Affectation -4 DD', excel_date_converter) # BA
DATE_AFFECTATION_5 = ('Affectation -5 DD', excel_date_converter) # BC
DATE_AFFECTATION_6 = ('Affectation -6 DD', excel_date_converter) # BE
DATE_AFFECTATION_7 = ('Affectation -7 DD', excel_date_converter) # BG
DATE_AFFECTATION_8 = ('Affectation -8 DD', excel_date_converter) # BI
DATE_AFFECTATION_9 = ('Affectation -9 DD', excel_date_converter) # BK
DATE_ARRIVEE_FE = ('Date arrivée FE', excel_date_converter) # AA
DATE_DEBUT_GRADE = ('Grade act DD', excel_date_converter) # AH
DATE_DERNIER_ACR = ('Dernière mutation ACR D', excel_date_converter) # AC
DATE_ENTREE_SERVICE = ('Entrée en Service', excel_date_converter) # N
DATE_FONCTION_1 = ('Fonction -1 DD', excel_date_converter) # BM
DATE_FONCTION_2 = ('Fonction -2 DD', excel_date_converter) # BO
DATE_FONCTION_3 = ('Fonction -3 DD', excel_date_converter) # BQ
DATE_FONCTION_4 = ('Fonction -4 DD', excel_date_converter) # BS
DATE_FONCTION_5 = ('Fonction -5 DD', excel_date_converter) # BU
DATE_FONCTION_6 = ('Fonction -6 DD', excel_date_converter) # BW
DATE_FONCTION_7 = ('Fonction -7 DD', excel_date_converter) # BY
DATE_FONCTION_8 = ('Fonction -8 DD', excel_date_converter) # CA
DATE_FONCTION_9 = ('Fonction -9 DD', excel_date_converter) # CC
DATE_FUD = ('Date prise effet FUD départ', excel_date_converter) # DV
DATE_LIEN_SERVICE = ('Lien au service DF', excel_date_converter) # EG
DATE_NAISSANCE = ('Naissance', excel_date_converter) # R
DATE_POSITION_STATUAIRE = ('Date Position statutaire', excel_date_converter) # AF
DATE_RDC = ('Date Radiation des contrôles', excel_date_converter) # W
DATE_STATUT_CONCERTO = ('Situation administrative act DD', excel_date_converter) # DX
DATE_STATUT_CONCERTO_FUTUR = ('Date Position statu future', excel_date_converter) # DZ
DATE_MARIAGE = ('Situation familiale (IT0002) DD', excel_date_converter) # CH
DERNIER_DIPLOME = ('Dernier diplôme militaire LA', str) # V
DIPLOME_PLUS_HAUT_NIVEAU = ('Diplôme militaire de plus haut niveau', str) # U
DOMAINE = ('Domaine EIP act LA', str) # I
DOMAINE_GESTION = ('Domaine de gestion act LA', str) # H
DOMAINE_POSTE = ('Domaine emploi occupé act LA', str) # ED
EIP = ('EIP act LA', str) # F
EIS = ('EIS act LA', str) # G
ENFANTS = ('Enfants', str) # EK
FILIERE = ('Filière EIP act LA', str) # J
FILIERE_POSTE = ('Nature de filière emploi occupé act LA', str) # EE
FONCTION = ('Fonction act L', str) # T
FONCTION_1 = ('Fonction -1 L', str) # BN
FONCTION_2 = ('Fonction -2 L', str) # BP
FONCTION_3 = ('Fonction -3 L', str) # BR
FONCTION_4 = ('Fonction -4 L', str) # BT
FONCTION_5 = ('Fonction -5 L', str) # BV
FONCTION_6 = ('Fonction -6 L', str) # BX
FONCTION_7 = ('Fonction -7 L', str) # BZ
FONCTION_8 = ('Fonction -8 L', str) # CB
FONCTION_9 = ('Fonction -9 L', str) # CD
FUD = ('Type de FUD départ') # DW
GARNISON = ('Garnison act', str) # Z
GRADE = ('GRADE TA', str) # B
ID_DEF = ('Identifiant défense', str) # E
ID_DEF_CONJOINT = ('Identifiant défense du conjoint militaire', str) # AN
ID_SAP = ('Matricule SAP', excel_int64_converter) # A
ID_SAP_CONJOINT = ('Identifiant SAP du conjoint militaire', excel_int64_converter) # AM
INTERRUPTION_SERVICE = ('Interruption de service', str) # AG
MARQUEUR_PN = ('Marquant Personnel Navigant') # EH
NF = ('Niveau fonctionnel EIP act', str) # K
NF_POSTE = ('Niveau fonctionnel emploi occupé act C', str) # EF
NOM = ('NOM', str) # C
NOMBRE_ENFANTS = ("Nbr total d'enfants", excel_uint64_converter) # O
NR_OU_IRIS = ('IRIS / RAC retenu A', excel_int64_converter) # CN
NR_OU_IRIS_1 = ('IRIS / RAC retenu A-1', excel_int64_converter) # CT
NR_OU_IRIS_2 = ('IRIS / RAC retenu A-2', excel_int64_converter) # CZ
NR_OU_IRIS_3 = ('IRIS / RAC retenu A-3', excel_int64_converter) # DF
NR_OU_IRIS_4 = ('IRIS / RAC retenu A-4', excel_int64_converter) # DL
NR_OU_IRIS_5 = ('IRIS / RAC retenu A-5', excel_int64_converter) # DR
ORIGINE_RECRUTEMENT = ('Origine recrutement LA', str) # Q
PLS_GB_MAX = ('PLS GB Max') # EI
POSITION_STATUTAIRE = ('Position statutaire act L', str) # AE
POTENTIEL_RESPONSABILITE_SUP = ('Potentiel responsabilités catégorie sup A', str) # CQ
POTENTIEL_RESPONSABILITE_SUP_1 = ('Potentiel responsabilités catégorie sup A-1', str) # CW
POTENTIEL_RESPONSABILITE_SUP_2 = ('Potentiel responsabilités catégorie sup A-2', str) # DC
POTENTIEL_RESPONSABILITE_SUP_3 = ('Potentiel responsabilités catégorie sup A-3', str) # DI
POTENTIEL_RESPONSABILITE_SUP_4 = ('Potentiel responsabilités catégorie sup A-4', str) # DO
POTENTIEL_RESPONSABILITE_SUP_5 = ('Potentiel responsabilités catégorie sup A-5', str) # DU
PRENOM = ('Prénom', str) # D
PROFESSION_CONJOINT = ('Profession conjoint Act L', str) # AL
RAC_OU_IRIS_CUMULE = ('NR/NGC cumulé A', excel_int64_converter) # CM
RAC_OU_IRIS_CUMULE_1 = ('NR/NGC cumulé A-1', excel_int64_converter) # CS
RAC_OU_IRIS_CUMULE_2 = ('NR/NGC cumulé A-2', excel_int64_converter) # CY
RAC_OU_IRIS_CUMULE_3 = ('NR/NGC cumulé A-3', excel_int64_converter) # DE
RAC_OU_IRIS_CUMULE_4 = ('NR/NGC cumulé A-4', excel_int64_converter) # DK
RAC_OU_IRIS_CUMULE_5 = ('NR/NGC cumulé A-5', excel_int64_converter) # DQ
REGROUPEMENT_ORIGINE_RECRUTEMENT = ('Regroupement origine recrutement C', str) # M
RF_QSR = ('QSR A', str) # CO
RF_QSR_1 = ('QSR A-1', str) # CU
RF_QSR_2 = ('QSR A-2', str) # DA
RF_QSR_3 = ('QSR A-3', str) # DG
RF_QSR_4 = ('QSR A-4', str) # DM
RF_QSR_5 = ('QSR A-5', str) # DS
SEXE = ('Sexe', str) # CJ
SEXE_CONJOINT = ('Sexe du conjoint', str) # AT
SITUATION_FAMILIALE = ('Situation familiale (IT0002) L', str) # CI
STATUT_CONCERTO = ('Situation admi actuelle', str) # DY
STATUT_CONCERTO_FUTUR = ('Position statutaire future', str) # EA
class FmobCols(FileCols):
""" Colonnes du fichier FMOB """
ID_SAP = ('Matricule SAP', excel_int64_converter) # A
class InseeCols(FileCols):
""" Colonnes du fichier INSEE """
CODE_INSEE = ('CODE INSEE', str) # D
CODE_POSTAL = ('CODE POSTAL', str) # C
CREDO_FE = ('CREDO FE act', str) # B
ID_SAP = ('Matricule SAP', excel_int64_converter) # A
class ReoCols(FileCols):
""" Colonnes du fichier REO """
ANNEE_PROJET = ('Année Projet', str) # B
CATEGORIE = ('Catégorie /EFF CELL', str) # P
CODE_NF = ('NFEO', str) # W
CODE_POSTAL = ('Code Postal /OB G', str) # J
DOMAINE = ('DEO', str) # U
DOMAINE_GESTION = ('Postes NFS', str) # AA
EIP = ('MGS gestionnaire / EFF CELL', str) # T
FONCTION_ID = ('ETR Code / EFF CELL', str) # Y
FONCTION_LIBELLE = ('ETR Libellé / EFF CELL', str) # Z
FORMATION_EMPLOI = ('Code CREDO Long OB', str) # F
FILIERE = ('FEO', str) # V
ID_POSTE = ('N° De Poste', str) # X