File size: 4,769 Bytes
2145052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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