File size: 45,570 Bytes
4d3fe59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff
import numpy as np

# Configuración de la aplicación
st.set_page_config(page_title="4 Types of Problems", page_icon="📊",layout="wide")
# Display the image above the title
st.image('4Papps.jpg', use_container_width=True)
st.title("4 Tipos de problemas")
# Definir pestañas
tabs = st.tabs(["Contención", "Desviación del Estándar", "Condición Objetivo", "Innovación"])

# Trabajamos solo en la pestaña "Contención"
with tabs[0]:
    # 📌 Resumen del Método 4C’s de Art Smalley
    st.markdown("""

    ## 🛠 Método 4C’s - Resolución Rápida de Problemas (Troubleshooting)

    El método **4C’s** es una estrategia de resolución de problemas tipo 1 (Troubleshooting), utilizado en Toyota y propuesto por **Art Smalley** para abordar **problemas inmediatos sin un análisis profundo**.

    

    - **❗ Concern (Preocupación):** Identificar claramente el problema o anomalía detectada.  

    - **🔍 Cause (Causa):** Determinar la causa raíz probable o el factor que contribuyó al problema.  

    - **🛠 Countermeasure (Acción Correctiva):** Implementar una solución inmediata para restaurar el estándar.  

    - **📊 Check (Seguimiento):** Evaluar si la contramedida funcionó y si se requiere más análisis.  



    👉 *Este método se enfoca en restaurar la operación de manera rápida y efectiva, sin necesidad de un análisis profundo como en los problemas tipo 2.*  

    """)

    # Inicializar DataFrame en sesión si no existe
    if "df_problemas" not in st.session_state:
        data_inicial = [
            # 🚧 Seguridad: Emergencia con equipo de producción
            {"Categoría": "Seguridad", "Fecha Ocurrencia": "2024-01-10", 
            "Problema": "Derrame de aceite en zona de trabajo", 
            "Causa": "Fuga en manguera hidráulica de prensa", 
            "Contramedida": "Limpieza inmediata y cambio de manguera", 
            "Seguimiento": "Sí", "Fecha Seguimiento": "2024-01-15", "Estatus Seguimiento": "Cerrada", 
            "Investigación Tipo 2": "No", "Estatus": "Cerrado"},

            # 🔍 Calidad: Defectos en piezas recién producidas
            {"Categoría": "Calidad", "Fecha Ocurrencia": "2024-02-05", 
            "Problema": "Riesgo de contaminación en piezas mecanizadas", 
            "Causa": "Exceso de virutas en la máquina CNC", 
            "Contramedida": "Limpieza del área y ajuste en frecuencia de mantenimiento", 
            "Seguimiento": "Sí", "Fecha Seguimiento": "2024-02-09", "Estatus Seguimiento": "En proceso", 
            "Investigación Tipo 2": "Sí", "Estatus": "Abierto"},

            # 💲 Costo: Pérdidas por mal funcionamiento de equipos
            {"Categoría": "Costo", "Fecha Ocurrencia": "2024-03-01", 
            "Problema": "Paro de línea por falla en sensor de temperatura", 
            "Causa": "Sensor descalibrado tras última inspección", 
            "Contramedida": "Reemplazo de sensor y recalibración", 
            "Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-05", "Estatus Seguimiento": "En proceso", 
            "Investigación Tipo 2": "No", "Estatus": "En proceso"},

            # 📦 Entrega: Retraso en abastecimiento de materiales
            {"Categoría": "Entrega", "Fecha Ocurrencia": "2024-03-10", 
            "Problema": "Retraso en entrega de materiales a producción", 
            "Causa": "Error en planificación de inventario", 
            "Contramedida": "Ajuste manual de stock y notificación a proveedor", 
            "Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-15", "Estatus Seguimiento": "Atrasada", 
            "Investigación Tipo 2": "Sí", "Estatus": "Atrasado"}
        ]

        st.session_state.df_problemas = pd.DataFrame(data_inicial)

    # Convertir fechas a datetime
    for col in ["Fecha Ocurrencia", "Fecha Seguimiento"]:
        if col in st.session_state.df_problemas.columns:
            st.session_state.df_problemas[col] = pd.to_datetime(st.session_state.df_problemas[col], errors="coerce")

    st.markdown("""

    ### 📌 Reporta un problema de contención """)
    # Expander 1: Reportar un nuevo problema
    with st.expander("Accede al reporte", expanded=False):
        
        categorias = ["Seguridad", "Calidad", "Costo", "Entrega"]
        
        # 🔴 1️⃣ CONCERN (PREOCUPACIÓN) - ¿Cuál es el problema?
        st.subheader("🔴 Concern (Preocupación)")
        problema_tipo = st.selectbox("Seleccione la categoría del problema", categorias)
        fecha_ocurrencia = st.date_input("📅 Fecha de ocurrencia del problema")
        problema = st.text_area("❓ ¿Qué sabe usted sobre el problema exacto?")

        # ⚠️ 2️⃣ CAUSE (CAUSA) - ¿Qué lo originó?
        st.subheader("⚠️ Cause (Causa)")
        causa = st.text_area("🔍 ¿Cuál es la posible causa raíz del problema?")

        # 🛠️ 3️⃣ COUNTERMEASURE (CONTRAMEDIDA) - ¿Cómo se solucionará?
        st.subheader("🛠️ Countermeasure (Contramedida)")
        contramedida = st.text_area("✅ ¿Qué acción inmediata o temporal puede tomarse para reducir o eliminar el problema?")

        # ✅ 4️⃣ CHECK (VERIFICACIÓN) - Seguimiento y estatus
        st.subheader("✅ Check (Verificación)")
        seguimiento = st.radio("📊 ¿Es necesario un seguimiento adicional?", ["Sí", "No"])
        fecha_seguimiento = st.date_input("📅 Fecha de seguimiento", disabled=(seguimiento == "No"))
        estatus_seguimiento = st.selectbox("📌 Estatus del seguimiento", ["En proceso", "Atrasada", "Cerrada"], disabled=(seguimiento == "No"))
        investigar_mas = st.checkbox("🔬 ¿Necesita investigar más a fondo usando métodos de Tipo 2?")
        estatus = st.selectbox("📈 Estatus del problema", ["Abierto", "En proceso", "Atrasado", "Cerrado"])

        # Guardar los datos ingresados
        if st.button("💾 Guardar Nuevo Problema"):
            nuevo_problema = pd.DataFrame([{
                "Categoría": problema_tipo,
                "Fecha Ocurrencia": pd.to_datetime(fecha_ocurrencia),
                "Problema": problema,
                "Causa": causa,
                "Contramedida": contramedida,
                "Seguimiento": seguimiento,
                "Fecha Seguimiento": pd.to_datetime(fecha_seguimiento) if seguimiento == "Sí" else pd.NaT,
                "Estatus Seguimiento": estatus_seguimiento if seguimiento == "Sí" else "N/A",
                "Investigación Tipo 2": "Sí" if investigar_mas else "No",
                "Estatus": estatus
            }])
            
            st.session_state.df_problemas = pd.concat([st.session_state.df_problemas, nuevo_problema], ignore_index=True)
            st.success("✅ Nuevo problema guardado correctamente")

    st.markdown("""

    ### 📝 Reporta los avances """)
    # Expander 2: Reporta avances en los problemas existentes
    with st.expander("Ingresa el progreso"):
        df_editado = st.data_editor(st.session_state.df_problemas, num_rows="dynamic")

        if st.button("Guardar Cambios en Problemas"):
            st.session_state.df_problemas = df_editado
            st.rerun()  # Refresca la app para actualizar la tabla HTML

    st.markdown("""

    ### 📊 Visualiza el Histórico de Problemas """)
    # Expander 3: Visualiza el Histórico de Problemas
    with st.expander("Revisa como vamos", expanded=True):
        filtro_categoria = st.selectbox("Filtrar por categoría", ["Todas"] + categorias)
        df_mostrar = st.session_state.df_problemas.copy()

        if filtro_categoria != "Todas":
            df_mostrar = df_mostrar[df_mostrar["Categoría"] == filtro_categoria]

        # Formatear fechas antes de mostrar
        if "Fecha Ocurrencia" in df_mostrar.columns:
            df_mostrar["Fecha Ocurrencia"] = df_mostrar["Fecha Ocurrencia"].dt.strftime("%Y-%m-%d")
        if "Fecha Seguimiento" in df_mostrar.columns:
            df_mostrar["Fecha Seguimiento"] = df_mostrar["Fecha Seguimiento"].dt.strftime("%Y-%m-%d").replace("NaT", "N/A")

        # Definir colores para las categorías
        categoria_colores = {
            "Seguridad": "#FF4B4B",
            "Calidad": "#4B83FF",
            "Costo": "#FFA64B",
            "Entrega": "#4BFF83"
        }

        # Generar tabla HTML con colores
        def generar_tabla_html(df):
            table_html = "<table style='width:100%; border-collapse: collapse;'>"
            table_html += "<tr style='background-color: #dddddd; text-align: left;'><th>Categoría</th><th>Fecha Ocurrencia</th><th>Problema</th><th>Causa</th><th>Estatus</th></tr>"

            for _, row in df.iterrows():
                color = categoria_colores.get(row["Categoría"], "#FFFFFF")
                table_html += f"<tr style='background-color: {color}; color: white;'>"
                table_html += f"<td>{row['Categoría']}</td>"
                table_html += f"<td>{row['Fecha Ocurrencia']}</td>"
                table_html += f"<td>{row['Problema']}</td>"
                table_html += f"<td>{row['Causa']}</td>"
                table_html += f"<td>{row['Estatus']}</td>"
                table_html += "</tr>"

            table_html += "</table>"
            return table_html

        st.markdown(generar_tabla_html(df_mostrar), unsafe_allow_html=True)
#__________________________________________________________________________________________________________________________________________________________________

#Problemas de tipo 2 - Desviación del estandar

# 📌 Función para calcular cumplimiento dinámico
def calcular_cumplimiento(df, mejor_es_mayor):
    resultados_prom = df["Resultados"].mean()
    meta_prom = df["Meta"].mean()

    # Caso especial para LTI (Seguridad)
    if not mejor_es_mayor:  
        if resultados_prom == 0:  
            return 100  # Sin eventos = 100% cumplimiento
        return max(0, min(100, (1 - (resultados_prom / (meta_prom + 1))) * 100))

    # Casos para RFT, OEE y OTIF (donde mayor es mejor)
    if meta_prom == 0:
        return 100 if mejor_es_mayor else 0

    return max(0, min(100, (resultados_prom / meta_prom) * 100))  # Limitar a 100%

# 📌 Función para inicializar MDI con datos corregidos
def inicializar_mdi():
    if "mdi" not in st.session_state:
        st.session_state["mdi"] = {
            "Seguridad": {"indicador": "LTI", "mejor_es_mayor": False, "datos": pd.DataFrame({
                "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
                "Resultados": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], 
                "Meta": [0] * 12,
                "Causa": ["", "", "", "Falta de EPP", "", "", "", "Condiciones inseguras", "", "", "", ""]})},

            "Calidad": {"indicador": "RFT", "mejor_es_mayor": True, "datos": pd.DataFrame({
                "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
                "Resultados": [96, 97, 94, 95, 92, 91, 89, 85, 97, 96, 98, 99], 
                "Meta": [95] * 12,
                "Causa": ["", "", "Materia prima defectuosa", "", "Falla de calibración", "", "Falta de estandarización", "Error en proceso", "", "", "", ""]})},

            "Costo": {"indicador": "OEE", "mejor_es_mayor": True, "datos": pd.DataFrame({
                "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
                "Resultados": [82, 85, 79, 81, 80, 77, 76, 75, 85, 84, 82, 86], 
                "Meta": [80] * 12,
                "Causa": ["", "", "Mantenimiento inadecuado", "", "", "Baja eficiencia operativa", "", "Desgaste de equipos", "", "", "", ""]})},

            "Entrega": {"indicador": "OTIF", "mejor_es_mayor": True, "datos": pd.DataFrame({
                "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
                "Resultados": [92, 94, 91, 89, 95, 97, 93, 96, 94, 90, 92, 91], 
                "Meta": [90] * 12,
                "Causa": ["", "", "", "Falla logística", "", "", "", "", "", "Demora del proveedor", "", ""]})},
        }

        # 🔄 Calcular cumplimiento dinámico para cada perspectiva
        for perspectiva, data in st.session_state["mdi"].items():
            data["cumplimiento"] = round(calcular_cumplimiento(data["datos"], data["mejor_es_mayor"]), 2)

with tabs[1]:
    inicializar_mdi()
    # 📖 Resumen del Problema Tipo 2
    st.markdown("""

    ## 🔄 Management Daily Improvement (MDI) & DMAIC Cycle

    Los **problemas tipo 2** ocurren cuando hay una **desviación del estándar previamente definido** en una operación, proceso o sistema.  

    Se centran en **restaurar y mejorar el estándar** a través de la **gestión diaria y análisis estructurado**.



    ### 🏭 **Management Daily Improvement (MDI) y la Cultura Toyota**

    - El **MDI (Mejora Diaria de Gestión)** es clave en Toyota para detectar y corregir desviaciones en tiempo real.  

    - Se basa en la **observación sistemática de métricas clave** en Seguridad, Calidad, Costo y Entrega (**SQCD**).  

    - Los **supervisores y equipos** deben identificar, registrar y actuar sobre desviaciones detectadas.  

    - Se apoya en el **ciclo DMAIC** para implementar mejoras efectivas.  



    ### 🔬 **Ciclo DMAIC**

    Los problemas de desviación del estándar se analizan y resuelven con el enfoque **DMAIC**:



    1️⃣ **Definir**: Identificar el estándar afectado y describir la desviación.  

    2️⃣ **Medir**: Cuantificar el impacto con datos históricos y métricas clave.  

    3️⃣ **Analizar**: Determinar la causa raíz mediante herramientas como Ishikawa, Pareto o 5 Porqués.  

    4️⃣ **Implementar**: Aplicar acciones correctivas para restaurar el estándar.  

    5️⃣ **Controlar**: Asegurar que la mejora sea sostenible en el tiempo.  



    📌 **Este tablero MDI ayuda a visualizar las desviaciones en SQCD, permitiendo aplicar el ciclo DMAIC para mejorar los procesos.** 🚀  

    """)

    # 📌 Diccionario de iconos por categoría SQCD
    mdi_icons = {
        "Seguridad": "🛑",
        "Calidad": "✔️",
        "Costo": "💰",
        "Entrega": "🚚"
    }

    st.header("📊 Management Daily Improvement SQCD")

    # 📌 Obtener las perspectivas del tablero MDI
    perspectives = list(st.session_state["mdi"].keys())
    col1, col2, col3, col4 = st.columns(4)

    for i, perspective in enumerate(perspectives):
        col = [col1, col2, col3, col4][i]
        with col:
            data = st.session_state["mdi"][perspective]

            # 📋 Expander para editar los datos
            with st.expander(f"📋 Datos de {perspective}"):
                df_editable = st.data_editor(
                    data["datos"], use_container_width=True, num_rows="dynamic", key=f"datos_{perspective}"
                )

                # 🔄 Actualizar el DataFrame y el cumplimiento después de la edición
                st.session_state["mdi"][perspective]["datos"] = df_editable
                nuevo_cumplimiento = calcular_cumplimiento(df_editable, data["mejor_es_mayor"])
                st.session_state["mdi"][perspective]["cumplimiento"] = round(nuevo_cumplimiento, 2)

            # 📌 Mostrar Icono + Categoría
            icon = mdi_icons.get(perspective, "📊")  # Si no encuentra el icono, usa un default
            st.markdown(f"### {icon} {perspective}")

            # 🏆 Gráfico de cumplimiento (Gauge) - ALTURA REDUCIDA
            cumplimiento = st.session_state["mdi"][perspective]["cumplimiento"]

            # 🔄 Definir color según el valor de cumplimiento
            if cumplimiento < 90:
                color_gauge = "red"  # 🔴 Menos de 90%
            elif 90 <= cumplimiento < 100:
                color_gauge = "yellow"  # 🟡 Entre 90% y 100%
            else:
                color_gauge = "green"  # 🟢 Más de 100%

            # 🔄 Ajustar dinámicamente el rango del gauge
            max_range = max(100, cumplimiento + 5)  # Asegurar que siempre haya espacio para valores >100%

            fig_gauge = go.Figure(go.Indicator(
                mode="gauge+number",
                value=cumplimiento,
                number={"font": {"size": 25}},  # 🔽 REDUCE el tamaño del número del cumplimiento
                title={'text': f"{data['indicador']}", 'font': {'size': 20}},
                gauge={'axis': {'range': [0, max_range]}, 'bar': {'color': color_gauge}}
            ))
            fig_gauge.update_layout(height=280)  # 🔽 Ajuste de altura del gauge
            st.plotly_chart(fig_gauge, use_container_width=True)

            # 📉 Gráfico de control de tendencia - ALTURA AJUSTADA
            fig_control = go.Figure()
            fig_control.add_trace(go.Scatter(
                x=df_editable["Fecha"], y=df_editable["Resultados"],
                mode='lines+markers', name='Resultados'
            ))
            fig_control.add_hline(y=df_editable["Meta"].mean(), line_dash="dash", line_color="red",
                                annotation_text="Meta", annotation_position="top right")
            fig_control.update_layout(
                title=f"Tendencia de {perspective}",
                xaxis_title="Fecha", yaxis_title="Valor",
                height=280  # 🔽 Ajuste de altura del gráfico de tendencias
            )
            st.plotly_chart(fig_control, use_container_width=True)

            # 📊 Gráfico de causas repetitivas corregido - ALTURA REDUCIDA
            df_causas = df_editable[df_editable["Causa"] != ""].copy()  # Excluir valores vacíos
            df_causas = df_causas["Causa"].value_counts().reset_index()
            df_causas.columns = ["Causa", "Frecuencia"]

            if not df_causas.empty:
                fig_barras = px.bar(df_causas, x="Frecuencia", y="Causa", orientation='h',
                                    title=f"Causas más repetitivas en {perspective}",
                                    text_auto=True)  # Muestra los valores en las barras
                fig_barras.update_yaxes(categoryorder='total ascending')  # Invierte el eje Y
                fig_barras.update_layout(height=250)  # 🔽 Ajuste de altura del gráfico de barras
                st.plotly_chart(fig_barras, use_container_width=True)


    st.header("📝 DMAIC Action Plan")

    # 📌 Inicializar el DataFrame en la sesión si no existe
    if "acciones" not in st.session_state:
        st.session_state.acciones = [
            {"categoria": "Seguridad", "descripcion": "Capacitación en uso de EPP obligatorio.", "fecha_inicio": "2024-01-10", "fecha_fin": "2024-01-20", "estado": "Abierta",
            "Definir": "Riesgo identificado en inspección.", "Medir": "2 incidentes en 3 meses.", "Analizar": "Falta de EPP adecuado.", "Implementar": "Entrega de EPP.", "Controlar": "Auditorías mensuales."},
            {"categoria": "Seguridad", "descripcion": "Implementación de checklist diario de condiciones inseguras.", "fecha_inicio": "2024-02-01", "fecha_fin": "2024-02-10", "estado": "Cerrada",
            "Definir": "Condiciones inseguras reportadas.", "Medir": "10 reportes en un mes.", "Analizar": "Falta de control visual.", "Implementar": "Checklists diarios.", "Controlar": "Supervisión de líderes."},
            {"categoria": "Calidad", "descripcion": "Cambio de proveedor de materia prima defectuosa.", "fecha_inicio": "2024-03-05", "fecha_fin": "2024-03-15", "estado": "Vencida",
            "Definir": "Defectos recurrentes en producción.", "Medir": "5% de scrap.", "Analizar": "Proveedores inconsistentes.", "Implementar": "Cambio de proveedor.", "Controlar": "Evaluación mensual."},
            {"categoria": "Calidad", "descripcion": "Revisión y ajuste de estándares de calidad en inspección final.", "fecha_inicio": "2024-04-01", "fecha_fin": "2024-04-10", "estado": "Pendiente",
            "Definir": "Errores detectados en auditoría.", "Medir": "Tasa de defectos >2%.", "Analizar": "Falta de criterios claros.", "Implementar": "Capacitación y ajuste de estándares.", "Controlar": "Revisión semanal."},
            {"categoria": "Costo", "descripcion": "Optimización de parámetros de mantenimiento preventivo.", "fecha_inicio": "2024-05-02", "fecha_fin": "2024-05-12", "estado": "Abierta",
            "Definir": "Fallas recurrentes en equipos.", "Medir": "Tiempo de inactividad de 5%.", "Analizar": "Mantenimiento reactivo en lugar de preventivo.", "Implementar": "Plan de mantenimiento preventivo.", "Controlar": "KPIs de disponibilidad."},
            {"categoria": "Costo", "descripcion": "Rediseño de layout para reducir tiempos de inactividad.", "fecha_inicio": "2024-06-01", "fecha_fin": "2024-06-15", "estado": "Pendiente",
            "Definir": "Retrasos en cambio de herramientas.", "Medir": "Tiempo promedio de 30 min por cambio.", "Analizar": "Mal distribución de áreas.", "Implementar": "Optimización del layout.", "Controlar": "Monitoreo de tiempos."},
            {"categoria": "Entrega", "descripcion": "Negociación de tiempos de entrega con proveedor clave.", "fecha_inicio": "2024-07-10", "fecha_fin": "2024-07-20", "estado": "Cerrada",
            "Definir": "Atrasos en entrega de materiales.", "Medir": "Promedio de 5 días de retraso.", "Analizar": "Proveedor con problemas logísticos.", "Implementar": "Renegociación de tiempos.", "Controlar": "Indicador de cumplimiento de entrega."},
            {"categoria": "Entrega", "descripcion": "Implementación de monitoreo en tiempo real de pedidos.", "fecha_inicio": "2024-08-01", "fecha_fin": "2024-08-10", "estado": "Vencida",
            "Definir": "Pedidos sin visibilidad de avance.", "Medir": "40% de pedidos sin trazabilidad.", "Analizar": "Falta de sistema de monitoreo.", "Implementar": "Implementación de tracking en tiempo real.", "Controlar": "Reporte de seguimiento diario."}
        ]

        # 📌 Convertir a DataFrame
        df_acciones = pd.DataFrame(st.session_state.acciones)

        # 📌 Expansor para mostrar y editar las acciones
        with st.expander("📌 Ver y Editar Acciones con Ciclo DMAIC", expanded=False):
            
            # 📝 Permitir edición de acciones con posibilidad de agregar/eliminar filas
            df_editable = st.data_editor(df_acciones, num_rows="dynamic", use_container_width=True)
            
            # 🔄 Actualizar los datos en `st.session_state`
            st.session_state.acciones = df_editable.to_dict(orient="records")

        # 📌 Recalcular estados de acciones tras edición
        estados_acciones = {"Abierta": 0, "Cerrada": 0, "Vencida": 0, "Pendiente": 0}
        for accion in df_editable["estado"]:
            estados_acciones.setdefault(accion, 0)
            estados_acciones[accion] += 1

        # 📌 Mostrar métricas con colores (Ahora se actualizan correctamente)
        col1, col2, col3, col4 = st.columns(4)
        col1.markdown(f"<h2 style='color:green;'>Abiertas: {estados_acciones.get('Abierta', 0)}</h2>", unsafe_allow_html=True)
        col2.markdown(f"<h2 style='color:gray;'>Cerradas: {estados_acciones.get('Cerrada', 0)}</h2>", unsafe_allow_html=True)
        col3.markdown(f"<h2 style='color:red;'>Vencidas: {estados_acciones.get('Vencida', 0)}</h2>", unsafe_allow_html=True)
        col4.markdown(f"<h2 style='color:yellow;'>Pendientes: {estados_acciones.get('Pendiente', 0)}</h2>", unsafe_allow_html=True)

        # 📊 Gantt de Acciones (Se actualiza con los cambios)
        fig = px.timeline(df_editable, x_start="fecha_inicio", x_end="fecha_fin", y="descripcion",
                        color="estado", color_discrete_map={
                            "Abierta": "green", "Cerrada": "gray", "Vencida": "red", "Pendiente": "yellow"
                        },
                        title="📅 Estado de las Acciones con DMAIC", labels={"estado": "Estado de la Acción"},
                        category_orders={"estado": ["Abierta", "Pendiente", "Vencida", "Cerrada"]})

        fig.update_yaxes(categoryorder="total ascending")  # Ordenar acciones
        fig.update_layout(xaxis_title="Fechas", yaxis_title="Descripción de la Acción", height=350, showlegend=True)

        # 📌 Mostrar gráfico Gantt
        st.plotly_chart(fig, use_container_width=True)


#__________________________________________________________________________________________________________________________________________________________________
# Problemas de condición Objetivo

# 📌 Precargar imágenes de referencia
imagen_actual_default = "current.jpg"
imagen_futura_default = "future.jpg"

with tabs[2]:
    # 📖 Introducción a Problemas de Condición Objetivo y VSM
    st.markdown("""

    ## 🔀 Value Stream Mapping (VSM) & A3 Thinking  

    Los problemas de **Condición Objetivo** surgen cuando se busca alcanzar una **meta futura específica** en un proceso sin que haya una falla evidente en el presente. No se trata de corregir defectos actuales, sino de **mejorar el flujo y la eficiencia** para lograr un estado futuro optimizado.



    ### 📌 Relación entre VSM y A3  

    🔹 **Value Stream Mapping (VSM)** permite visualizar la situación actual, identificar desperdicios y diseñar un flujo futuro eficiente.  

    🔹 **A3 Thinking** estructura el análisis y la implementación de mejoras, asegurando que las acciones sean alineadas con la estrategia organizacional.  



    ### 🔄 Proceso de Transformación  

    1️⃣ **Evaluar el estado actual**: Mapear el flujo de valor existente e identificar oportunidades de mejora.  

    2️⃣ **Definir la meta futura**: Establecer una condición objetivo alineada con la estrategia de la empresa.  

    3️⃣ **Diseñar el estado futuro**: Optimizar el flujo mediante la eliminación de desperdicios y sincronización de procesos.  

    4️⃣ **Implementar mejoras con A3**: Planificar y ejecutar acciones basadas en análisis estructurado.  



    Este enfoque permite **reducir Lead Time, mejorar sincronización y aumentar la eficiencia operativa**, facilitando una transición controlada hacia un proceso más ágil y competitivo. 🚀📊  

    """)

    st.markdown("<h1 style='text-align: center;'>📄 A3 - Resolución de Problemas</h1>", unsafe_allow_html=True)

    # 📌 Distribuir en dos columnas de igual tamaño
    col_izq, col_der = st.columns([2, 2])

    # 📌 Sección Izquierda: Situación Actual y Análisis
    with col_izq:
        with st.container():
            st.subheader("📜 1. Antecedentes")
            antecedentes = st.text_area("Describe los antecedentes del problema", value="El Lead Time actual es de 23.6 días, generando retrasos y costos elevados.")

            st.subheader("📊 2. Situación Actual")
            situacion_actual = st.text_area("Describe la situación actual", value="El flujo del proceso tiene esperas innecesarias, loteo excesivo y transporte ineficiente.")

            st.subheader("📷 Imagen del Problema (Current State VSM)")
            imagen_actual = st.file_uploader("Sube una imagen del estado actual", type=["png", "jpg", "jpeg"])
            if imagen_actual:
                st.image(imagen_actual, caption="Estado Actual - VSM", use_container_width=True)
            else:
                st.image(imagen_actual_default, caption="Estado Actual (Ejemplo)", use_container_width=True)

            st.subheader("🔎 3. Análisis de Causa Raíz")
            causas = st.text_area("Identifica las causas raíz", value="- Loteo grande\n- Retrasos en el proceso\n- Falta de flujo continuo.")

            st.subheader("🎯 4. Metas")
            metas = st.text_area("Define las metas a alcanzar", value="Reducir el Lead Time a 4.5 días mejorando la sincronización del proceso.")

    # 📌 Sección Derecha: Contramedidas y Seguimiento
    with col_der:
        with st.container():
            st.subheader("🛠️ 5. Contramedidas (Plan de Acción)")
            plan = st.text_area("Desarrolla el plan de acción", value="- Reducir tamaños de lote\n- Implementar flujo continuo\n- Mejorar la sincronización del proceso.")

            st.subheader("📷 Imagen del Estado Futuro (Future State VSM)")
            imagen_futura = st.file_uploader("Sube una imagen del estado futuro", type=["png", "jpg", "jpeg"])
            if imagen_futura:
                st.image(imagen_futura, caption="Estado Futuro - VSM", use_container_width=True)
            else:
                st.image(imagen_futura_default, caption="Estado Futuro (Ejemplo)", use_container_width=True)

            st.subheader("📅 6. Tablero de Acciones (Gantt)")

            # 📌 Inicializar DataFrame si no existe en la sesión
            if "acciones_a3" not in st.session_state:
                st.session_state.acciones_a3 = pd.DataFrame([
                    {"Task": "Mapear proceso actual", "Start": "2024-02-01", "Finish": "2024-02-10"},
                    {"Task": "Reducir tamaños de lote", "Start": "2024-02-15", "Finish": "2024-02-20"},
                    {"Task": "Definir flujo continuo", "Start": "2024-02-21", "Finish": "2024-02-28"},
                    {"Task": "Capacitación sobre nuevas prácticas", "Start": "2024-03-01", "Finish": "2024-03-05"},
                    {"Task": "Implementación final", "Start": "2024-03-06", "Finish": "2024-03-10"},
                ])

            # 📌 Expander para editar o agregar acciones
            with st.expander("📋 Editar Tablero de Acciones", expanded=False):
                df_acciones = st.data_editor(st.session_state.acciones_a3, use_container_width=True, num_rows="dynamic")
                st.session_state.acciones_a3 = df_acciones  # Guardar cambios en la sesión

            # 🔄 Ajustar altura del Gantt dinámicamente
            if not df_acciones.empty:
                df_acciones.columns = ["Task", "Start", "Finish"]
                num_tareas = len(df_acciones)
                altura_dinamica = max(200, min(num_tareas * 50, 500))

                # 📊 Generar Gantt después de la edición
                tareas = df_acciones.to_dict("records")
                fig_gantt = ff.create_gantt(tareas, title="Plan de Implementación A3", index_col="Task", show_colorbar=False)
                fig_gantt.update_layout(showlegend=False, height=altura_dinamica)
                st.plotly_chart(fig_gantt, use_container_width=True)

            # 📌 Tablero de Seguimiento de Indicadores
            st.subheader("📊 7. Seguimiento de Indicadores de Éxito")

            # 📌 Inicializar DataFrame si no existe en la sesión
            if "indicadores_a3" not in st.session_state:
                st.session_state.indicadores_a3 = pd.DataFrame([
                    {"Indicador": "Lead Time (días)", "Antes": 23.6, "Meta": 4.5, "Resultado": None, "Status": "En proceso"},
                    {"Indicador": "Tamaño de lote", "Antes": 100, "Meta": 30, "Resultado": None, "Status": "En proceso"},
                    {"Indicador": "Tiempo de ciclo (min)", "Antes": 12, "Meta": 6, "Resultado": None, "Status": "En proceso"},
                ])

            # 📌 Mostrar tabla editable
            df_editable = st.data_editor(st.session_state.indicadores_a3, use_container_width=True, num_rows="dynamic")
            st.session_state.indicadores_a3 = df_editable  # Guardar cambios en la sesión

#__________________________________________________________________________________________________________________________________________________________________

# 📌 Problemas de Innovación
with tabs[3]:
    st.markdown("<h1 style='text-align: left;'>🚀 Funnel de Innovación</h1>", unsafe_allow_html=True)

    # 📖 Introducción a la Innovación según Art Smalley
    st.markdown("""

    ## 🌟 Innovación como Cuarto Tipo de Problema  

    Según **Art Smalley**, la innovación es el tipo de problema más avanzado, ya que requiere **crear soluciones completamente nuevas** en lugar de corregir fallas existentes.  



    🔹 **Objetivo:** Superar las limitaciones actuales y desarrollar mejoras **disruptivas** en procesos, productos y servicios.  

    🔹 **Ejemplo:** Implementar **automatización en manufactura** para eliminar la variabilidad humana y aumentar la eficiencia.  

    🔹 **Método:** Para lograr innovación estructurada, combinamos **SCAMPER** (generación de ideas) con **Design Thinking** (planificación y ejecución).  



    📌 **Ejemplo de Innovación según *Four Types of Problems***  

    - Toyota implementando **Producción Just-In-Time** para eliminar inventarios excesivos.  

    - Ford introduciendo **manufactura modular** para reducir tiempos de cambio de línea.  

    - Amazon desarrollando **almacenes automatizados** con robots para mejorar eficiencia logística.  

    """)

    st.markdown("""

    ## 📝 Generación de Innovación con SCAMPER & Design Thinking""" )
    # 📌 Expander para SCAMPER y Design Thinking
    with st.expander(" Registro de ideas Innovadoras", expanded=False):
        st.subheader("🧠 SCAMPER - Generación de Ideas")
        problema = st.text_area("Describe el problema o necesidad que quieres innovar", 
                                value="Reducir tiempos de cambio en la línea de producción.")
        tecnica_scamper = st.selectbox("Selecciona una técnica SCAMPER", 
                                       ["Sustituir", "Combinar", "Adaptar", "Modificar", "Poner en otro uso", "Eliminar", "Reorganizar"])
        idea_scamper = st.text_area("Propón una idea innovadora basada en SCAMPER", 
                                    value="Implementar cambios rápidos con herramientas modulares.")

        # 📌 Design Thinking - Desarrollo de Innovación
        st.subheader("🎨 Plan de Acción - Design Thinking")
        fase_design = st.selectbox("Selecciona la fase actual", 
                                   ["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"])
        tarea_design = st.text_area("Describe la tarea o acción clave en esta fase", 
                                    value="Analizar impacto de tiempos de cambio en productividad.")
        fecha_inicio = st.date_input("Fecha de inicio de la tarea")
        fecha_fin = st.date_input("Fecha de compromiso")

        if st.button("💾 Guardar Innovación"):
            nueva_idea = pd.DataFrame([[problema, tecnica_scamper, idea_scamper, fase_design, tarea_design, fecha_inicio, fecha_fin]],
                                      columns=["Problema", "SCAMPER", "Idea SCAMPER", "Fase DT", "Tarea", "Inicio", "Compromiso"])
            st.session_state.ideas_innovacion = pd.concat([st.session_state.ideas_innovacion, nueva_idea], ignore_index=True)
            st.success("✅ Innovación guardada correctamente.")

    # 📌 Inicializar el tablero con una distribución realista en el Funnel
    if "ideas_innovacion" not in st.session_state:
        st.session_state.ideas_innovacion = pd.DataFrame([
            # 🔵 EMPATIZAR (10 ideas)
            {"Problema": "Reducir tiempos de cambio", "SCAMPER": "Modificar", 
            "Idea SCAMPER": "Uso de herramientas modulares", "Fase DT": "Empatizar", 
            "Tarea": "Análisis de tiempos actuales", "Inicio": "2024-01-01", "Compromiso": "2024-01-15"},
            {"Problema": "Optimizar flujo de materiales", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Implementación de logística autónoma", "Fase DT": "Empatizar", 
            "Tarea": "Identificar cuellos de botella", "Inicio": "2024-01-02", "Compromiso": "2024-01-16"},
            {"Problema": "Minimizar errores en ensamblaje", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Guiado con realidad aumentada", "Fase DT": "Empatizar", 
            "Tarea": "Identificación de errores recurrentes", "Inicio": "2024-01-03", "Compromiso": "2024-01-17"},
            {"Problema": "Reducción de desperdicios", "SCAMPER": "Eliminar", 
            "Idea SCAMPER": "Optimización de corte CNC", "Fase DT": "Empatizar", 
            "Tarea": "Medición de desperdicios", "Inicio": "2024-01-04", "Compromiso": "2024-01-18"},
            {"Problema": "Reducir consumo energético", "SCAMPER": "Adaptar", 
            "Idea SCAMPER": "Energía renovable en manufactura", "Fase DT": "Empatizar", 
            "Tarea": "Evaluación del consumo actual", "Inicio": "2024-01-05", "Compromiso": "2024-01-19"},
            {"Problema": "Rediseñar layout de planta", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Modelo de flujo continuo", "Fase DT": "Empatizar", 
            "Tarea": "Análisis de distribución", "Inicio": "2024-01-06", "Compromiso": "2024-01-20"},
            {"Problema": "Automatización de inventarios", "SCAMPER": "Combinar", 
            "Idea SCAMPER": "RFID con control en tiempo real", "Fase DT": "Empatizar", 
            "Tarea": "Evaluar soluciones existentes", "Inicio": "2024-01-07", "Compromiso": "2024-01-21"},
            {"Problema": "Reducir errores en ensamblaje", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Instrucciones con realidad aumentada", "Fase DT": "Empatizar", 
            "Tarea": "Prueba de tecnologías", "Inicio": "2024-01-08", "Compromiso": "2024-01-22"},
            {"Problema": "Optimización de distribución de tareas", "SCAMPER": "Modificar", 
            "Idea SCAMPER": "Algoritmos de asignación inteligente", "Fase DT": "Empatizar", 
            "Tarea": "Análisis de cargas de trabajo", "Inicio": "2024-01-09", "Compromiso": "2024-01-23"},
            {"Problema": "Reducir tiempo de configuración de maquinaria", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Implementación de configuraciones rápidas", "Fase DT": "Empatizar", 
            "Tarea": "Estudio de tiempos de cambio", "Inicio": "2024-01-10", "Compromiso": "2024-01-24"},
            
            # 🟠 DEFINIR (7 ideas)
            {"Problema": "Automatizar control de calidad", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Inspección con IA", "Fase DT": "Definir", 
            "Tarea": "Análisis de defectos comunes", "Inicio": "2024-01-11", "Compromiso": "2024-01-25"},

            {"Problema": "Aumentar eficiencia en picking", "SCAMPER": "Adaptar", 
            "Idea SCAMPER": "Picking con robots móviles", "Fase DT": "Definir", 
            "Tarea": "Identificar oportunidades de automatización", "Inicio": "2024-01-12", "Compromiso": "2024-01-26"},

            {"Problema": "Reducir desperdicio de empaque", "SCAMPER": "Eliminar", 
            "Idea SCAMPER": "Empaque reutilizable", "Fase DT": "Definir", 
            "Tarea": "Evaluación de materiales alternativos", "Inicio": "2024-01-13", "Compromiso": "2024-01-27"},

            {"Problema": "Optimizar planificación de producción", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Algoritmo de secuenciación dinámica", "Fase DT": "Definir", 
            "Tarea": "Evaluación de algoritmos existentes", "Inicio": "2024-01-14", "Compromiso": "2024-01-28"},

            {"Problema": "Reducción de tiempos en línea de ensamble", "SCAMPER": "Modificar", 
            "Idea SCAMPER": "Uso de estaciones de trabajo móviles", "Fase DT": "Definir", 
            "Tarea": "Análisis de tiempos de operación", "Inicio": "2024-01-15", "Compromiso": "2024-01-29"},

            {"Problema": "Mejorar ergonomía en estaciones de trabajo", "SCAMPER": "Adaptar", 
            "Idea SCAMPER": "Implementación de estaciones ajustables", "Fase DT": "Definir", 
            "Tarea": "Identificación de riesgos ergonómicos", "Inicio": "2024-01-16", "Compromiso": "2024-01-30"},

            {"Problema": "Reducir costos en consumibles de producción", "SCAMPER": "Combinar", 
            "Idea SCAMPER": "Uso de materiales biodegradables", "Fase DT": "Definir", 
            "Tarea": "Análisis de alternativas sustentables", "Inicio": "2024-01-17", "Compromiso": "2024-01-31"},

            # 🟡 IDEAR (4 ideas)
            {"Problema": "Automatizar planificación de producción", "SCAMPER": "Combinar", 
            "Idea SCAMPER": "Sistema con machine learning", "Fase DT": "Idear", 
            "Tarea": "Desarrollo del prototipo", "Inicio": "2024-01-15", "Compromiso": "2024-02-05"},

            {"Problema": "Optimización de rutas de logística", "SCAMPER": "Modificar", 
            "Idea SCAMPER": "Uso de IA en distribución", "Fase DT": "Idear", 
            "Tarea": "Prueba con datos históricos", "Inicio": "2024-01-16", "Compromiso": "2024-02-06"},

            {"Problema": "Automatización de gestión de pedidos", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Integración de blockchain en trazabilidad", "Fase DT": "Idear", 
            "Tarea": "Desarrollo de modelo de trazabilidad", "Inicio": "2024-01-17", "Compromiso": "2024-02-07"},

            {"Problema": "Estandarización de procesos manuales", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Aplicaciones móviles para control de procesos", "Fase DT": "Idear", 
            "Tarea": "Desarrollo de interfaz de usuario", "Inicio": "2024-01-18", "Compromiso": "2024-02-08"},

            # 🟢 PROTOTIPAR (3 ideas)
            {"Problema": "Implementar manufactura flexible", "SCAMPER": "Adaptar", 
            "Idea SCAMPER": "Uso de robots colaborativos", "Fase DT": "Prototipar", 
            "Tarea": "Configuración inicial", "Inicio": "2024-01-20", "Compromiso": "2024-02-10"},

            {"Problema": "Automatización de gestión de personal", "SCAMPER": "Combinar", 
            "Idea SCAMPER": "Análisis de rendimiento con AI", "Fase DT": "Prototipar", 
            "Tarea": "Prueba con dataset real", "Inicio": "2024-01-21", "Compromiso": "2024-02-11"},

            {"Problema": "Monitoreo predictivo de fallas", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Implementación de sensores IoT con IA", "Fase DT": "Prototipar", 
            "Tarea": "Desarrollo del modelo de predicción", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"},

            # 🔴 TESTEAR (2 ideas)
            {"Problema": "Optimización de órdenes de producción", "SCAMPER": "Reorganizar", 
            "Idea SCAMPER": "Planificación adaptativa", "Fase DT": "Testear", 
            "Tarea": "Validación con producción real", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"},

            {"Problema": "Automatización del control de calidad", "SCAMPER": "Sustituir", 
            "Idea SCAMPER": "Cámaras de visión artificial con IA", "Fase DT": "Testear", 
            "Tarea": "Comparación de defectos detectados manualmente vs IA", "Inicio": "2024-01-23", "Compromiso": "2024-02-13"}, 

            # 🔴 IMPLEMENTACIÓN (1 idea)
            {"Problema": "Implementar manufactura sin papel", "SCAMPER": "Adaptar", 
             "Idea SCAMPER": "Digitalización con tablets", "Fase DT": "Implementación", 
             "Tarea": "Capacitación de operarios", "Inicio": "2024-01-25", "Compromiso": "2024-02-10"},
        ])

    st.markdown("""

    ## 📋 Ver y Editar Innovaciones Guardadas""" )
    # 📌 Expander para visualizar y editar el DataFrame de Innovaciones
    with st.expander("Ajusta el progreso de las ideas innovadoras", expanded=False):
        df_ideas = st.data_editor(st.session_state.ideas_innovacion, use_container_width=True, num_rows="dynamic")
        st.session_state.ideas_innovacion = df_ideas  # Guardar cambios

    # 📊 Visualización del Funnel en horizontal con Plotly
    st.subheader("📊 Funnel de Innovación - Evolución de Ideas")
    if not st.session_state.ideas_innovacion.empty:
        funnel_counts = st.session_state.ideas_innovacion["Fase DT"].value_counts().reset_index()
        funnel_counts.columns = ["Fase", "Cantidad"]

        fig_funnel = go.Figure(go.Funnel(
            orientation="v",  # 🏆 FUNNEL EN HORIZONTAL
            y=funnel_counts["Cantidad"],
            x=funnel_counts["Fase"],
            textinfo="value+percent initial",
            marker={"color": ["blue", "green", "orange", "red", "purple", "gray"]}
        ))

        fig_funnel.update_layout(title="Funnel de Innovación - Design Thinking")
        st.plotly_chart(fig_funnel, use_container_width=True)

    # 📌 Seguimiento de Acciones en un Gantt
    st.subheader("📅 Tablero de Acciones y Compromisos")
    if not st.session_state.ideas_innovacion.empty:
        fig_gantt = px.timeline(st.session_state.ideas_innovacion, x_start="Inicio", x_end="Compromiso", y="Tarea",
                                color="Fase DT", title="Tareas y Fechas de Innovación",
                                category_orders={"Fase DT": ["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"]})
        fig_gantt.update_yaxes(categoryorder="total ascending")  
        fig_gantt.update_layout(showlegend=True)
        st.plotly_chart(fig_gantt, use_container_width=True)