| 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'] |
| |
| 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, |
|
|
| |
| |
| |
| |
| "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, |
| |
| "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() |
| |
| 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="⚠️") |
|
|