from typing import List import streamlit as st from utils.times import date_to_week_day, date_to_week_number def calculate_indemnites_km(indem_vehicles: List[str] = ['Perso']) -> (float, float): location = st.session_state.location vehicule = st.session_state.vehicules prestataire = st.session_state.df['affaire'][st.session_state.df['affaire']['affaire'] == st.session_state.affaire]['prestataire'].values[0] if st.session_state.intervenant == '-' \ or st.session_state.client == '-' \ or location == 'En Atelier' \ or not vehicule in indem_vehicles: return 0, 0 else: secteur = st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['secteur'].values[0] distance = st.session_state.df['Clients'][(st.session_state.df['Clients']['Nom client'] == st.session_state.client) & (st.session_state.df['Clients']['Prestataire'] == prestataire)][f'Dist {secteur}'].values[0] duration = st.session_state.df['Clients'][(st.session_state.df['Clients']['Nom client'] == st.session_state.client) & (st.session_state.df['Clients']['Prestataire'] == prestataire)][f'Duration {secteur}'].values[0] if distance * 2 < 35: return 0, 0 indemnites = float(distance) * 2 * 0.35 drive_hours = float(duration) * 2 indemnites = round(indemnites, 2) hours, minutes = divmod(drive_hours, 60) return indemnites, hours + (minutes / 60) def calculate_astreinte(): public_holyday = st.session_state.public_holyday intervenant = st.session_state.intervenant year = st.session_state.date_input.year month = st.session_state.date_input.month week = date_to_week_number(st.session_state.date_input) if 'fit' in st.session_state.keys() and intervenant in st.session_state.fit.keys() and year in st.session_state.fit[intervenant].keys() and month in st.session_state.fit[intervenant][year].keys() and week in st.session_state.fit[intervenant][year][month].keys(): totals = st.session_state.fit[intervenant][year][month][week]['totals'] if totals['worked_hours'] >= st.session_state.contract_hours and st.session_state.contract_hours != 0: if public_holyday: return 321.0 return 321.0 return 0.0 def calculate_overtimes(): overtime25, overtime50, overtime100 = 0., 0., 0. intervenant = st.session_state.intervenant year = st.session_state.date_input.year month = st.session_state.date_input.month week = date_to_week_number(st.session_state.date_input) weekday = date_to_week_day(st.session_state.date_input) hour_price = st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['cout horaire'].values[0] if 'fit' in st.session_state.keys() and intervenant in st.session_state.fit.keys() and year in st.session_state.fit[intervenant].keys() and month in st.session_state.fit[intervenant][year].keys() and week in st.session_state.fit[intervenant][year][month].keys(): week_hours = st.session_state.fit[intervenant][year][month][week]['totals']['worked_hours'] if st.session_state.contract_hours != 0 and st.session_state.contract_hours < week_hours: overtime25 = max(0, min(8, week_hours - 35)) if st.session_state.contract_hours != 0 and week_hours >= 43: overtime50 = (week_hours - 43) if weekday == 'samedi': overtime50 = st.session_state.total_hours if weekday == 'dimanche' or st.session_state.public_holyday: overtime100 = st.session_state.total_hours return overtime25, overtime50, overtime100 def calculate_arrets(): secteur = st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['secteur'].values[0] mask = st.session_state.df['absences'].applymap(lambda x: isinstance(x, str) and st.session_state.affaire.find(x) != -1) mask = st.session_state.df['absences']['Libellé GTP2023'].apply(lambda x: st.session_state.affaire.find(x) != -1) hr_code = st.session_state.df['absences'][mask]['Code_RH'].values[0] contract_hours = st.session_state.contract_hours if not contract_hours in [35., 37., 37.5, 39.]: return 0 weekday = date_to_week_day(st.session_state.date_input) weekday = 'JS_' if weekday != 'vendredi' else 'V_' weekday = weekday if secteur == 'STE' else '' am_values = st.session_state.df['arrets'][st.session_state.df['arrets']['code_absence'] == f'{hr_code}1_{weekday}{secteur}'][f'H-{float(contract_hours)}'].values return am_values[0] if len(am_values) > 0 else 0