| 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 | |