| | 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="⚠️") |
| |
|