File size: 4,747 Bytes
eb0b2fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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")