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