Spaces:
Running
Running
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("<style>#MainMenu {visibility: hidden;} footer {visibility: hidden;} /*header {visibility: hidden;}*/</style>", unsafe_allow_html=True) | |
st.title("Carga y descarga de Excel de rutas 🚚📍") | |
st.markdown('### <span style="color:#9656E2; text-align: center">© Blau tecnología para residuos | blaucorp.com </span>', 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") | |