calendar_streamlit / pages /2_🚚_Excel_de Rutas.py
Raul Garcia
Push
eb0b2fd
raw
history blame contribute delete
No virus
4.75 kB
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")