File size: 12,533 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 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
import os
import numpy as np
import pandas as pd
import streamlit as st
import datetime as dt
from data.cli_dropbox import dropbox_upload_file
from data.datastructures import generate_intervenant_fit, generate_intervenant_monthly_payroll, generate_society_fit, generate_society_payroll
from data.excels import get_fit_totals, update_historical_week, update_monthly_payroll, update_society_fit, update_society_payroll, write_excel_fit
from utils.indemnites import calculate_arrets
from utils.times import date_to_week_day, date_to_week_number
from utils.device import get_current_ip, get_device_id
from const import root_path
import asyncio
def merge_dicts(list_of_dicts):
merged_dict = {}
for dictionary in list_of_dicts:
for key, value in dictionary.items():
if key not in merged_dict:
merged_dict[key] = []
merged_dict[key].append(value)
return merged_dict
@st.cache_resource
async def read_transform_write_excel(datapath: str = f'{root_path}/data/output', form: dict = None):
fit_data = {
"year": form["year"],
"month": form["month"],
"week": form["week"],
"intervenant": form["intervenant"],
}
fit_dict = generate_intervenant_fit(form)
fit_df = pd.DataFrame(fit_dict, index=[0])
if 'fit' in st.session_state.keys() \
and form["intervenant"] in st.session_state['fit'].keys() \
and form["year"] in st.session_state['fit'][form["intervenant"]].keys() \
and form["month"] in st.session_state['fit'][form["intervenant"]][form["year"]].keys() \
and form["week"] in st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]].keys():
df = st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]][form["week"]]['data']
# Concatenate DataFrame and dictionary DataFrame
fit_df = pd.concat([df, fit_df], ignore_index=True)
totals = get_fit_totals(fit_df)
fit_data['data'] = fit_df
fit_data['totals'] = totals
path = f'{form["intervenant"]}_{form["year"]}_{form["month"]}_{form["week"]}_FIT.xlsx'
write_excel_fit(datapath, path, fit_data)
dropbox_upload_file(datapath, path, f'/SEC_IND_GTP2023_OUTPUT/FIT/{form["intervenant"]}/{form["year"]}/{form["month"]}/{form["week"]}', path)
if 'fit' not in st.session_state.keys():
st.session_state['fit'] = {}
if form["intervenant"] not in st.session_state['fit'].keys():
st.session_state['fit'][form["intervenant"]] = {}
if form["year"] not in st.session_state['fit'][form["intervenant"]].keys():
st.session_state['fit'][form["intervenant"]][form["year"]] = {}
if form["month"] not in st.session_state['fit'][form["intervenant"]][form["year"]].keys():
st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]] = {}
if form["week"] not in st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]].keys():
st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]][form["week"]] = {}
st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]][form["week"]] = {
'data': fit_data['data'],
'totals': totals
}
st.toast('Fiche de temps envoyée', icon="📨")
return st.session_state['fit'][form["intervenant"]][form["year"]][form["month"]][form["week"]]
def validate():
data_dict = {
"intervenant": st.session_state.intervenant,
"nom": st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['Nom'].values[0],
"prenom": st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['Prénom'].values[0],
"employeur": st.session_state.df['intervenants'][st.session_state.df['intervenants']['intervenant'] == st.session_state.intervenant]['Employeur'].values[0],
"client": st.session_state.client,
"affaire": st.session_state.affaire,
"prestataire": st.session_state.prestataire,
"vehicule": st.session_state.vehicules,
"location": st.session_state.location,
"activities": st.session_state.activities_text_area,
"date": st.session_state.date_input,
"year": st.session_state.date_input.year,
"month": st.session_state.date_input.month,
"week": date_to_week_number(st.session_state.date_input),
"public_holyday": st.session_state.public_holyday,
"start_time": st.session_state.start_time_input,
"end_time": st.session_state.end_time_input,
"pause_time": st.session_state.pause_time_input,
"supplement_1": st.session_state.supplement1,
"supplement_2": st.session_state.supplement2,
"supplement_3": st.session_state.supplement3,
# "contract_hours": st.session_state.df['all'].contract_hours[st.session_state.indexes_all['contract_hours']],
# "maladie": st.session_state.total_hours if st.session_state.affaire.find('Absence Maladie Individuelle') != -1 or \
# st.session_state.affaire.find('Absence Maladie Professionnelle') != -1 \
# else 0,
"maladie": calculate_arrets() if st.session_state.affaire.find('Absence Maladie Individuelle') != -1 or \
st.session_state.affaire.find('Absence Maladie Professionnelle') != -1 \
else 0,
"arret_travail": calculate_arrets() if st.session_state.affaire.find('Absence Accident du Travail') != -1 else 0,
"conges_payes": calculate_arrets() if st.session_state.affaire.find('Absence Congés payés') != -1 else 0,
"conges_sans_solde": calculate_arrets() if st.session_state.affaire.find('Absence Congés sans solde') != -1 else 0,
"rtt": calculate_arrets() if st.session_state.affaire.find('Absence RTT') != -1 else 0,
"formation": calculate_arrets() if st.session_state.affaire.find('Absence Formation') != -1 else 0,
"evenement_familial": calculate_arrets() if st.session_state.affaire.find('Absence Evénement Familial') != -1 else 0,
"worked_hours": st.session_state.total_hours if st.session_state.total_hours else 0,
"night_hours": st.session_state.night_hours if st.session_state.night_hours else 0,
"contract_hours": st.session_state.contract_hours if st.session_state.contract_hours else 0,
"supp_contract_hours": st.session_state.supp_contract_hours if st.session_state.supp_contract_hours else 0,
"day_hours": st.session_state.total_hours - st.session_state.night_hours if st.session_state.total_hours and st.session_state.night_hours else 0,
"drive_hours": st.session_state.drive_hours if st.session_state.drive_hours else 0,
"saturday_hours": st.session_state.total_hours if date_to_week_day(st.session_state.date_input) == 'samedi' else 0,
"sunday_hours": st.session_state.total_hours if date_to_week_day(st.session_state.date_input) == 'dimanche' else 0,
"holyday_hours": st.session_state.total_hours if st.session_state.public_holyday else 0,
"overtime_25": st.session_state.overtime25 if st.session_state.overtime25 else 0,
"overtime_50": st.session_state.overtime50 if st.session_state.overtime50 else 0,
"overtime_100": st.session_state.overtime100 if st.session_state.overtime100 else 0,
"meal_nonus": st.session_state.meal_bonus if st.session_state.meal_bonus else 0,
"mileage_allowances_bonus": st.session_state.mileage_allowances_bonus if st.session_state.mileage_allowances_bonus else 0,
"personal_tools_bonus": st.session_state.personal_tools_bonus if st.session_state.personal_tools_bonus else 0,
"intervention_bonus": st.session_state.intervention_bonus if st.session_state.intervention_bonus else 0,
"on_call_bonus": st.session_state.on_call_bonus if st.session_state.on_call_bonus else 0,
"team_leader_bonus": st.session_state.team_leader_bonus if st.session_state.team_leader_bonus else 0,
# "other_bonus": st.session_state.electrical_bonus + st.session_state.painting_bonus + st.session_state.welding_bonus if st.session_state.electrical_bonus + st.session_state.painting_bonus + st.session_state.welding_bonus else 0,
"device_model": get_device_id(),
"device_ip": get_current_ip(),
"modified": dt.datetime.now(),
}
if 'completed_forms' not in st.session_state:
st.session_state['completed_forms'] = []
st.session_state.completed_forms.append(data_dict)
st.toast('Fiche de temps validée et enregistrée', icon="✅")
def reset(df):
st.session_state.df = df
st.session_state.indexes_all = {k: 0 for k in df['all'].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.session_state.indexes_vehicules = {k: 0 for k in df['vehicules'].columns}
st.session_state.intervenant = df['intervenants'].intervenant[0]
st.session_state.client = df['affaire'].client[0]
st.session_state.affaire = df['affaire'].affaire[0]
st.session_state.prestataire = df['affaire'].prestataire[0]
st.session_state.vehicules = df['vehicules'].vehicules[0]
st.session_state.activities_text_area = ""
st.session_state.date_input = dt.datetime.now()
st.session_state.public_holyday = False
st.session_state.start_time_input = dt.time(8, 00)
st.session_state.end_time_input = dt.time(17, 00)
st.session_state.pause_time_input = dt.time(0, 00)
st.session_state.supplement1 = df['supplements'].supplements[0]
st.session_state.supplement2 = df['supplements'].supplements[0]
st.session_state.supplement3 = df['supplements'].supplements[0]
st.toast('Nouvelle fiche de temps ', icon="🔃")
async def run_async_tasks():
await read_transform_write_excel(form=st.session_state.completed_forms[-1])
st.toast('Mise à jour de votre historique, veuillez patienter', icon="💾")
historic_df = await update_historical_week(dropbox_datapath='/SEC_IND_GTP2023_OUTPUT', form=st.session_state.completed_forms[-1])
st.toast('Historique mis à jour', icon="✅")
st.toast('Mise à jour du Tableau de société, veuillez patienter', icon="💾")
society_form = generate_society_fit(form=st.session_state.completed_forms[-1])
society_df = await update_society_fit(dropbox_datapath='/SEC_IND_GTP2023_OUTPUT', form=society_form)
st.toast('Tableau de société mis à jour', icon="✅")
st.toast('Mise à jour des Prestations croisées, veuillez patienter', icon="💾")
society_form = generate_society_payroll(form=st.session_state.completed_forms[-1])
society_df = await update_society_payroll(dropbox_datapath='/SEC_IND_GTP2023_OUTPUT', form=society_form)
st.toast('Prestations croisées mis à jour', icon="✅")
st.toast('Mise à jour du Tableau de paye, veuillez patienter', icon="💾")
payroll = generate_intervenant_monthly_payroll(form=historic_df)
await update_monthly_payroll(dropbox_datapath='/SEC_IND_GTP2023_OUTPUT', payroll_dict=payroll, year=st.session_state.completed_forms[-1]['year'] , month=st.session_state.completed_forms[-1]['month'], week=st.session_state.completed_forms[-1]['week'])
st.toast('Tableau de paye mis à jour', icon="✅")
st.toast('Fiche de temps dupliquée', icon="📄")
def validate_duplicate():
if st.session_state.intervenant != '-' and st.session_state.client != '-' and st.session_state.affaire != '-':
validate()
# print(st.session_state.completed_forms[-1])
if st.session_state.date_input < dt.datetime.now().date():
st.session_state.date_input += dt.timedelta(days=1)
asyncio.run(run_async_tasks())
else:
st.toast('Veuillez remplir les champs intervenant, client et affaire', icon="⚠️")
def validate_end():
if st.session_state.intervenant != '-' and st.session_state.client != '-' and st.session_state.affaire != '-':
validate()
asyncio.run(run_async_tasks())
st.session_state.completed_forms = []
st.toast('Vous pouvez fermer l\'application ', icon="👍")
else:
st.toast('Veuillez remplir les champs intervenant, client et affaire', icon="⚠️")
|