from datetime import datetime from io import BytesIO from openpyxl import load_workbook import streamlit as st from excel import Formatter from data import Data from api import Api, RouteInput, CollectionInput, EstimatedContainerInput from utils import friendly_date from auth import get_id_cliente_reciclador EXCEL_MIME_TYPE="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" now = datetime.now() api = None data = None is_auth = False try: api = Api() # Inicializar API y obtener id del cliente reciclador data = Data(recycler_id=api.recycler_id) # Crear instancia de "conseguidor" de datos is_auth = get_id_cliente_reciclador(st.experimental_get_query_params().get("t", [""])[0]) is not None except Exception as e: print(e) def get_excel_data(date: datetime): # Crear archivo de Excel en memoria para descargar wb = Formatter.format_workbook( drivers = data.get_drivers(), vehicles = data.get_vehicles(), routes = data.get_routes(date=now), branches = data.get_branches(), date = now ) output = BytesIO() wb.save(output) return output def main(): st.set_page_config(page_title="Rutas en Excel", page_icon="🚚", layout="wide") st.markdown("", unsafe_allow_html=True) st.title("Carga y descarga de Excel de rutas 🚚📍") st.markdown('### © Blau tecnología para residuos | blaucorp.com ', unsafe_allow_html=True) selected_date = st.date_input( label = "Selecciona una fecha", value = now, format= "DD/MM/YYYY" ) selected_datetime = datetime(year=selected_date.year, month=selected_date.month, day=selected_date.day) friendly_selected_date = friendly_date(selected_datetime) create_routes_file_btn = st.button( label="Crear Excel de rutas de día para descarga" ) if create_routes_file_btn: st.write("Creando Excel, esto puede tomar unos momentos...") st.download_button( label = f"📥 Descargar recolecciones del día {friendly_selected_date}", data = get_excel_data(now), file_name = f"Rutas {friendly_selected_date}.xlsx", mime = EXCEL_MIME_TYPE, ) st.write("¡Listo! Puedes descargar tus rutas 👆") upload_routes_btn = st.button("Cargar rutas") uploaded_file = None if upload_routes_btn: uploaded_file = st.file_uploader( label = f"📤 Subir modificaciones de rutas del día {friendly_selected_date}", type = ["xlsx"], accept_multiple_files = False ) if uploaded_file is not None: print("[UPLOAD]", uploaded_file) parsed_routes = Formatter.parse_workbook(load_workbook(uploaded_file)) print("[PARSER] Parsed excel file") route_inputs: list[RouteInput] = [] for pr in parsed_routes: collections_inputs: list[CollectionInput] = [] route_containers = data.get_estimated_containers(branch_ids=[bid for _, bid in pr.collection_points]) for i in range(0, len(pr.collection_points)): # print("[ROUTE_CONTAINERS]", route_containers) # print("[COLLECTION_POINTS]", pr.collection_points) containers = route_containers[i] customer_id, branch_id = pr.collection_points[i] collection = CollectionInput( branch_id = branch_id, driver_id = pr.driver_id, vehicle_id= pr.vehicle_id, estimated_containers=[ EstimatedContainerInput( amount = c["amount"], container_type_id = c["containerTypeId"], material_type_id = c["materialTypeId"], weight_kg = c["weightKg"], ) for c in containers ] ) collections_inputs.append(collection) route_inputs.append(RouteInput(id=pr.route_id, ordered_collections=collections_inputs)) created_collection_ids = api.modify_daily_routes(date=now, routes=route_inputs) print(f"[UPDATE] Succesfully created {len(created_collection_ids)} collections!") print(created_collection_ids) if is_auth: main() else: st.write("🔒 Parece que no tienes permiso para ver esto")