|
from typing import List |
|
import pandas as pd |
|
|
|
|
|
def merge_clients(data): |
|
mnr_df = data['MNR_Client'] |
|
mnr_df['Prestataire'] = 'MNR' |
|
|
|
stm_df = data['STM_Client'] |
|
stm_df['Prestataire'] = 'STM' |
|
|
|
valm_df = data['VALM_Client'] |
|
valm_df['Prestataire'] = 'VALM' |
|
|
|
data['Clients'] = pd.concat([mnr_df, stm_df, valm_df], ignore_index=True) |
|
data['Clients'].rename(columns=dict(zip(data['Clients'].columns,['Code client', 'Type client', 'Nom client', 'Dist STE', 'Duration STE', 'Dist VAL', 'Duration VAL', 'Prestataire'])), inplace=True) |
|
data['Clients'] = data['Clients'][data['Clients']['Type client'] == 'Client'] |
|
|
|
data['Clients']['Dist STE'] = data['Clients']['Dist STE'].fillna(0) |
|
data['Clients']['Duration STE'] = data['Clients']['Duration STE'].fillna(0) |
|
data['Clients']['Dist VAL'] = data['Clients']['Dist VAL'].fillna(0) |
|
data['Clients']['Duration VAL'] = data['Clients']['Duration VAL'].fillna(0) |
|
|
|
del data['MNR_Client'] |
|
del data['STM_Client'] |
|
del data['VALM_Client'] |
|
|
|
|
|
def add_motifs_absences(df: pd.DataFrame, motifs: List[str]): |
|
filtered_df = df[df['Nom client'].isin(['SECMI'])] |
|
intervenants = df['Code intervenant (Identifiant du document de référence -> Document de vente)'].unique() |
|
|
|
for intervenant in intervenants: |
|
rows = [] |
|
for motif in motifs['Libellé GTP2023'].tolist(): |
|
rows.append({ |
|
'Code intervenant (Identifiant du document de référence -> Document de vente)': intervenant, |
|
'Code client': filtered_df.iloc[0]['Code client'] if filtered_df.shape[0] > 0 else 'SECMI', |
|
'Nom client': filtered_df.iloc[0]['Nom client'] if filtered_df.shape[0] > 0 else 'SECMI', |
|
'Code chantier': '000000', |
|
'Libellé': motif |
|
|
|
}) |
|
df = pd.concat([df, pd.DataFrame(rows)], ignore_index=True) |
|
return df |
|
|
|
|
|
def merge_affaires(data): |
|
mnr_df = data['MNR_Affaire'] |
|
mnr_df = add_motifs_absences(mnr_df, data['absences']) |
|
mnr_df['Prestataire'] = 'MNR' |
|
|
|
stm_df = data['STM_Affaire'] |
|
stm_df = add_motifs_absences(stm_df, data['absences']) |
|
stm_df['Prestataire'] = 'STM' |
|
|
|
valm_df = data['VALM_Affaire'] |
|
valm_df = add_motifs_absences(valm_df, data['absences']) |
|
valm_df['Prestataire'] = 'VALM' |
|
|
|
data['affaire'] = pd.concat([mnr_df, stm_df, valm_df], ignore_index=True) |
|
data['affaire']['Code affaire'] = data['affaire']['Code chantier'] + ' - ' + data['affaire']['Libellé'] |
|
del data['affaire']['Code chantier'] |
|
del data['affaire']['Libellé'] |
|
data['affaire'].rename(columns=dict(zip(data['affaire'].columns,['Code intervenant', 'Code client', 'Nom client', 'prestataire', 'Code affaire'])), inplace=True) |
|
del data['MNR_Affaire'] |
|
del data['STM_Affaire'] |
|
del data['VALM_Affaire'] |
|
|
|
def merge_intervenants_affaires(data): |
|
data['all'] = data['affaire'].merge(data['intervenants'], on='Code intervenant', how='left') |
|
data['all'].rename(columns=dict(zip(['Code intervenant', 'Code affaire', 'Nom client', 'Code secteur géographique', 'Veh_Affecte', 'Durée Hebdo', 'Coût horaire'],['intervenant', 'affaire', 'client', 'secteur', 'vehicule affecte', 'contrat heures', 'cout horaire'])), inplace=True) |
|
new_row = pd.DataFrame([['-'] * (data['all'].shape[1])], columns=data['all'].columns) |
|
data['all'] = pd.concat([new_row, data['all']], ignore_index=True) |
|
data['all']['secteur'] = data['all']['secteur'].fillna('STE') |
|
data['all']['contrat heures'] = data['all']['contrat heures'].fillna(0) |
|
data['all']['cout horaire'] = data['all']['cout horaire'].fillna(0) |
|
data['all'] = data['all'].dropna(subset=['intervenant', 'client', 'affaire']) |
|
|
|
def complete_vehicules(data): |
|
data['vehicules']['vehicules'] = 'Collectif - ' + data['vehicules']['IMMAT'] + ' - ' + data['vehicules']['Description'] |
|
data['vehicules'].loc[len(data['vehicules'])] = [None, None, 'Perso'] |
|
data['vehicules'].loc[len(data['vehicules'])] = [None, None, 'Service affecté'] |
|
|
|
def complete_supplements(data): |
|
data['supplements'].rename(columns=dict(zip(data['supplements'].columns,['supplements'])), inplace=True) |
|
data['supplements']['supplements'] = data['supplements']['supplements'].str.replace('_x000D_', ' ') |
|
new_row = pd.DataFrame([['-'] * (data['supplements'].shape[1])], columns=data['supplements'].columns) |
|
data['supplements'] = pd.concat([new_row, data['supplements']], ignore_index=True) |
|
data['supplements'] = data['supplements'][~data['supplements']['supplements'].isin([' H Peinture ', ' H Qualif. Électrique ', ' H Soudure '])] |
|
|
|
def complete_affaires(data): |
|
data['affaire'].rename(columns=dict(zip(['Code intervenant', 'Code affaire', 'Nom client'],['intervenant', 'affaire', 'client'])), inplace=True) |
|
new_row = pd.DataFrame([['-'] * (data['affaire'].shape[1])], columns=data['affaire'].columns) |
|
data['affaire'] = pd.concat([new_row, data['affaire']], ignore_index=True) |
|
|
|
def complete_intervenants(data): |
|
data['intervenants'].rename(columns=dict(zip(['Code intervenant', 'Code secteur géographique', 'Veh_Affecte', 'Durée Hebdo', 'Coût horaire'],['intervenant', 'secteur', 'vehicule affecte', 'contrat heures', 'cout horaire'])), inplace=True) |
|
data['intervenants']['Employeur'] = data['intervenants']['Employeur'].apply(lambda x: x.split()[1] if pd.notna(x) else None) |
|
data['intervenants']['Employeur'] = data['intervenants']['Employeur'].fillna('SECMI') |
|
new_row = pd.DataFrame([['-'] * (data['intervenants'].shape[1])], columns=data['intervenants'].columns) |
|
data['intervenants'] = pd.concat([new_row, data['intervenants']], ignore_index=True) |
|
|
|
data['intervenants']['contrat heures'] = data['intervenants']['contrat heures'].fillna(35) |
|
|
|
def complete_arrets(data): |
|
data['arrets'].rename(columns=dict(zip(data['arrets'].columns,['code_absence', 'H-35.0', 'H-37.0', 'H-37.5', 'H-39.0'])), inplace=True) |
|
data['arrets']['code_absence'] = data['arrets']['code_absence'].str.replace('_x000D_', ' ') |
|
data['arrets'].fillna(0, inplace=True) |
|
|
|
def cast_specifics_to_str(data): |
|
data['all'] = data['all'].astype({'intervenant': str, 'affaire': str, 'client': str, 'prestataire': str}) |
|
data['vehicules'] = data['vehicules'].astype({'IMMAT': str, 'Description': str}) |
|
|
|
data['affaire'] = data['affaire'].astype({'intervenant': str, 'affaire': str, 'client': str, 'prestataire': str}) |
|
data['intervenants'] = data['intervenants'].astype({'intervenant': str, 'secteur': str, 'vehicule affecte': str}) |