File size: 10,685 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import datetime as dt
import os
import numpy as np
import pandas as pd
import streamlit as st
import yaml
from yaml.loader import SafeLoader
from data.cli_dropbox import dropbox_load_config_files

from data.excels import load_fit, load_transform_data, filter_multiple_conditions_data
from utils.times import calculate_night_time, calculate_work_time, date_to_week_number
from utils.btn_behaviors import reset, validate_duplicate, validate_end
from utils.indemnites import calculate_astreinte, calculate_indemnites_km, calculate_overtimes

from const import root_path 

st.set_page_config(layout="wide") 

with open(os.path.join(root_path, 'config.yaml')) as file:
    config = yaml.load(file, Loader=SafeLoader)
pd.set_option('display.max_columns', None)

#TODO download dropbox config files
if not 'dropbox_update' in st.session_state.keys():
    dropbox_load_config_files('/SEC_IND_GTP2023_INPUT', os.path.join(root_path, 'data/input'), config['data'])
    st.session_state.dropbox_update = True
df = load_transform_data(os.path.join(root_path, 'data/input'), config['data'])

# print("session_state", st.session_state)
def affaire_change(indexes, df_key):
    filters = {}
    new_values = []
    
    for key, value in st.session_state.items():
        if key in df[df_key].columns and key not in ['intervenant', 'prestataire']:
            if st.session_state[key] != '-':
                filters[key] = value
                new_values.insert(len(new_values), value)
            indexes[key] = 0
    
    st.session_state.df[df_key] = filter_multiple_conditions_data(df[df_key], filters)

    new_row  = pd.DataFrame([['-'] * (df[df_key].shape[1])], columns=df[df_key].columns)
    for key, value in filters.items():
        indexes[key] = 1 if value != '-'else 0
            
    st.session_state.df[df_key] = pd.concat([new_row, st.session_state.df[df_key]], ignore_index=True)

def intervenant_change():            
    if "intervenant" in st.session_state and st.session_state.intervenant != '-':
        st.session_state.contract_hours = st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['contrat heures'].values[0]
        st.session_state.supp_contract_hours = st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['contrat heures'].values[0]
        load_fit(datapath=os.path.join(root_path, 'data/output'), 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 'df' not in st.session_state:
    st.session_state.df = df
    st.session_state.indexes_all = {k: 0 for k in df['all'].columns}
    st.session_state.indexes_vehicules = {k: 0 for k in df['vehicules'].columns}
    st.session_state.indexes_affaire = {k: 0 for k in df['affaire'].columns}
    st.session_state.indexes_intervenants = {k: 0 for k in df['intervenants'].columns}


st.title('SECMI - Gestion des temps passés')
codes = st.columns(3)

intervenant = codes[0].selectbox('Intervenant', np.sort(st.session_state.df['intervenants'].intervenant.unique()), key='intervenant', on_change=intervenant_change)
client = codes[1].selectbox('Client', np.sort(st.session_state.df['affaire'].client.unique()), key='client', on_change=affaire_change, kwargs={'indexes': st.session_state.indexes_affaire, 'df_key': 'affaire'}, index=st.session_state.indexes_affaire['client'])
location = codes[2].selectbox('Localisation', np.sort(['En Atelier', 'En Clientèle']), key='location')

# prestataire = codes[3].selectbox('Prestataire', np.sort(st.session_state.df['all'].prestataire.unique()), key='prestataire', on_change=value_change, kwargs={'indexes': st.session_state.indexes_all, 'df_key': 'all'}, index=st.session_state.indexes_all['prestataire'])
st.session_state.prestataire = st.session_state.df['affaire']['prestataire'][1]
affaire = st.selectbox('Affaire', np.sort(st.session_state.df['affaire'].affaire.unique()), key='affaire', on_change=affaire_change, kwargs={'indexes': st.session_state.indexes_affaire, 'df_key': 'affaire'}, index=st.session_state.indexes_affaire['affaire'])
vehicules = st.selectbox('vehicules', np.sort(st.session_state.df['vehicules'].vehicules.unique()), key='vehicules')#, on_change=value_change,kwargs={'indexes': st.session_state.indexes_vehicules, 'df_key': 'vehicules'}, index=st.session_state.indexes_vehicules['Description'])

absences = st.session_state.df['absences']['Libellé GTP2023'].tolist()
absences.remove('Absence Formation')
st.session_state.disable_times = True if len([string for string in absences if affaire.find(string) != -1]) else False

st.divider()
activites = st.text_area('Description des activités effectuées', key="activities_text_area")

st.divider()
temps = st.columns(5)

if 'date_input' not in st.session_state:
    st.session_state.date_input = dt.datetime.now()

# print(df['arrets'])
date = temps[0].date_input(
    label="Date de la mission", 
    value=st.session_state.date_input, 
    min_value=dt.datetime.now() - dt.timedelta(days=15),
    max_value=dt.datetime.now(),
    on_change=load_fit,
    kwargs={'datapath': os.path.join(root_path, 'data/output'), '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)},
    key='date_input')

# if 'fit' in st.session_state.keys():
#     print(st.session_state.fit)
# print(date_to_week_number(date), date_to_week_day(date))
public_holyday = temps[0].checkbox('Jour Férié', key="public_holyday")
start_time = temps[1].time_input('heure début', dt.time(8, 00), key='start_time_input', disabled=st.session_state.disable_times)
end_time = temps[2].time_input('heure fin', dt.time(16, 00), key='end_time_input', disabled=st.session_state.disable_times)


pause_time = temps[3].time_input('temps de pause', dt.time(1, 00), step=300, key='pause_time_input')

st.session_state.total_hours = calculate_work_time(start_time, end_time, pause_time, date)
st.session_state.night_hours = calculate_night_time(start_time, end_time, pause_time, date)

if st.session_state.total_hours > 8:
    st.warning('Les heures de travail enregistrées sont supérieures à 8 heures !')


# print(st.session_state.df['supplements'].columns)
supplements = temps[4]
supplement1 = supplements.selectbox('Supplement 1', st.session_state.df['supplements'].supplements, key = 'supplement1')
supplement2 = supplements.selectbox('Supplement 2', st.session_state.df['supplements'].supplements, key = 'supplement2')
supplement3 = supplements.selectbox('Supplement 3', st.session_state.df['supplements'].supplements, key = 'supplement3')

st.session_state.meal_bonus = 9.15 if st.session_state.total_hours >= 6.15 else 0
st.session_state.personal_tools_bonus = 3.2 if ' Transp.  Caisse ' in [supplement1, supplement2, supplement3 ] else 0
st.session_state.intervention_bonus = 1 * st.session_state.total_hours if 'Prime Interv°' in [supplement1, supplement2, supplement3 ] else 0
st.session_state.on_call_bonus = calculate_astreinte() if st.session_state.intervenant != '-' and 'Astreinte Sem' in [supplement1, supplement2, supplement3 ] else 0
st.session_state.team_leader_bonus =  10 if 'Prime Chef Equ' in [supplement1, supplement2, supplement3 ] else 0

# st.session_state.painting_bonus = 1 * st.session_state.total_hours if ' H Peinture ' in [supplement1, supplement2, supplement3 ] else 0
# st.session_state.electrical_bonus = 1 * st.session_state.total_hours if ' H  Qualif. Électrique ' in [supplement1, supplement2, supplement3 ] else 0
# st.session_state.welding_bonus = 1 * st.session_state.total_hours if ' H Soudure ' in [supplement1, supplement2, supplement3 ] else 0

st.session_state.overtime25, st.session_state.overtime50, st.session_state.overtime100 = calculate_overtimes()

st.session_state.mileage_allowances_bonus , st.session_state.drive_hours = calculate_indemnites_km()

year = st.session_state.date_input.year
month = st.session_state.date_input.month
week = date_to_week_number(st.session_state.date_input)
st.divider()
infos = st.columns(3, gap="large")
infos[0].header(f'Temps total: ')
infos[0].write(f'Temps de travail: {st.session_state.total_hours } heure(s)')
infos[0].write(f'Temps de pause: {pause_time.hour + (pause_time.minute / 60)} heure(s)')
infos[0].write(f'Heure de nuit: {st.session_state.night_hours} heure(s)')
infos[0].write(f'Jour Férié: {"oui" if public_holyday else "non"}')

if 'fit' in st.session_state.keys() and  st.session_state.intervenant in st.session_state['fit'].keys() and year in st.session_state.fit[st.session_state.intervenant].keys() and month in st.session_state.fit[st.session_state.intervenant][year].keys() and week in st.session_state.fit[st.session_state.intervenant][year][month].keys():
    infos[0].write(f'Heures indiquées dans le contrat de travail: {st.session_state.contract_hours} heures')
    if st.session_state.contract_hours > 35:
        infos[0].write(f'Dont Heures supplémentaires inclues dans le contrat: {st.session_state.supp_contract_hours} heures')

    infos[0].write(f'Heures totales de travail pour la semaine {week} : {st.session_state.fit[st.session_state["intervenant"]][year][month][week]["totals"]["worked_hours"]} heures')

    infos[0].write(f'Heure supp 25%: {st.session_state.overtime25} heure(s)')
    infos[0].write(f'Heure supp 50%: {st.session_state.overtime50} heure(s)')
    infos[0].write(f'Heure supp 100%: {st.session_state.overtime100} heure(s)')

infos[1].header('Informations:')
if st.session_state.mileage_allowances_bonus > 0:
    infos[0].write(f'Heure route: {st.session_state.drive_hours} heure(s)')
    infos[1].write(f'Indemnités kilométriques: {st.session_state.mileage_allowances_bonus}€')

infos[1].write(f'Panier: {st.session_state.meal_bonus}€')
infos[1].write(f'Transport de caisse: {st.session_state.personal_tools_bonus}€')
infos[1].write(f'Prime d\'intervention: {st.session_state.intervention_bonus}€')
infos[1].write(f'Prime d\'astreinte: {st.session_state.on_call_bonus}€')
infos[1].write(f'Prime chef d\'équipe: {st.session_state.team_leader_bonus}€')
# infos[1].write(f'Autre (Peinture, Soudure, Electricité): {st.session_state.electrical_bonus + st.session_state.painting_bonus + st.session_state.welding_bonus}€')

reset_btn = infos[2].button('Effacer', on_click=reset, kwargs={"df": df})
validate_duplicate_btn = infos[2].button('Valider et Dupliquer', on_click=validate_duplicate)
validate_end_btn = infos[2].button('Valider et Terminer', on_click=validate_end)