BEGIN
    -- Eliminar registros existentes
    DELETE FROM concentrado 
    WHERE Docente = p_Docente;
    
    -- Insertar datos con los NOMBRES EXACTOS de columnas
    INSERT INTO concentrado (
        Docente, Trimestre, Especialidad, Curso, Paralelo, Asignatura, Cestudiante, Estudiante,
        `T1.F.M1.N1`, `T1.F.M1.N2`, `T1.F.M1.N3`, `T1.F.M1.N4`, `T1.F.M1.N5`, `T1.F.M1.N6`, `T1.F.M1.N7`, `T1.F.M1.N8`, 
        `T1.F.M1.P`, `T1.R.M1.N1`, `T1.F.M1.PF`,
        -- NUEVOS CAMPOS MÓDULO 1
        `T1.F`, `T1.S.M1.N1`, `T1.S.M1.N2`, `T1.S.M1.N3`, `T1.S`, `T1`,
        
        `T1.F.M2.N1`, `T1.F.M2.N2`, `T1.F.M2.N3`, `T1.F.M2.N4`, `T1.F.M2.N5`, `T1.F.M2.N6`, `T1.F.M2.N7`, `T1.F.M2.N8`, 
        `T1.F.M2.P`, `T1.R.M2.N1`, `T1.F.M2.PF`,
        -- NUEVOS CAMPOS MÓDULO 2
        `T2.F`, `T2.S.M1.N1`, `T2.S.M1.N2`, `T2.S.M1.N3`, `T2.S`, `T2`,
        
        `T1.F.M3.N1`, `T1.F.M3.N2`, `T1.F.M3.N3`, `T1.F.M3.N4`, `T1.F.M3.N5`, `T1.F.M3.N6`, `T1.F.M3.N7`, `T1.F.M3.N8`, 
        `T1.F.M3.P`, `T1.R.M3.N1`, `T1.F.M3.PF`,
        -- NUEVOS CAMPOS MÓDULO 3
        `T3.F`, `T3.S.M1.N1`, `T3.S.M1.N2`, `T3.S.M1.N3`, `T3.S`, `T3`
    )
    SELECT 
        p_Docente,
        'PRIMERO' as Trimestre,
        Especialidad,
        Curso,
        Paralelo,
        Asignatura,
        Cestudiante,
        Estudiante,
        
        -- MÓDULO 1 - N1 a N8
        MAX(CASE WHEN Indicador = 'T1.F.M1.N1' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N2' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N3' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N4' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N5' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N6' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N7' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M1.N8' THEN Calificacion END),
        
        -- Promedio Módulo 1
        ROUND(
            AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                      'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                  THEN Calificacion END),
            2
        ),
        
        -- Refuerzo Módulo 1
        MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END),
        
        -- PF Calculado Módulo 1 - CONTROL DE NULOS
        CASE 
            WHEN MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END) IS NULL THEN
                ROUND(
                    AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                              'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                          THEN Calificacion END),
                    2
                )
            WHEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                               'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                           THEN Calificacion END),
                     2
                 ) > MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)
            THEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                               'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                           THEN Calificacion END),
                     2
                 )
            ELSE ROUND(
                     (ROUND(
                         AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                   'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                               THEN Calificacion END),
                         2
                     ) + MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)) / 2,
                     2
                 )
        END,
        
        -- NUEVOS CAMPOS MÓDULO 1
        -- T1.F: Promedio de los PF de los 3 módulos (calculado directamente)
        CASE 
            WHEN 
                COUNT(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                            'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8',
                                            'T1.R.M1.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                            'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8',
                                            'T1.R.M2.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                            'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8',
                                            'T1.R.M3.N1') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- Módulo 1 PF
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                          'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                           'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                           'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                            'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 2 PF
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                          'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                           'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                           'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                            'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 3 PF
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                          'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                           'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                           'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                            'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    )
                ) / 
                GREATEST(
                    (CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                           'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8',
                                                           'T1.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                           'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8',
                                                           'T1.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                           'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8',
                                                           'T1.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                    1
                ),
                2
            )
            ELSE NULL
        END,
        
        -- T1.S.M1.N1
        MAX(CASE WHEN Indicador = 'T1.S.M1.N1' THEN Calificacion END),
        
        -- T1.S.M1.N2
        MAX(CASE WHEN Indicador = 'T1.S.M1.N2' THEN Calificacion END),
        
        -- T1.S.M1.N3
        MAX(CASE WHEN Indicador = 'T1.S.M1.N3' THEN Calificacion END),
        
        -- T1.S: Promedio de T1.S.M1.N1, T1.S.M1.N2, T1.S.M1.N3
        CASE 
            WHEN COUNT(CASE WHEN Indicador IN ('T1.S.M1.N1','T1.S.M1.N2','T1.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                AVG(CASE WHEN Indicador IN ('T1.S.M1.N1','T1.S.M1.N2','T1.S.M1.N3') THEN Calificacion END),
                2
            )
            ELSE NULL
        END,
        
        -- T1: T1.F * 0.7 + T1.S * 0.3
        CASE 
            WHEN 
                (COUNT(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                            'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8',
                                            'T1.R.M1.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                            'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8',
                                            'T1.R.M2.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                            'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8',
                                            'T1.R.M3.N1') THEN Calificacion END) > 0)
                AND COUNT(CASE WHEN Indicador IN ('T1.S.M1.N1','T1.S.M1.N2','T1.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- T1.F (mismo cálculo de arriba)
                    CASE 
                        WHEN 
                            COUNT(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                        'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8',
                                                        'T1.R.M1.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                        'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8',
                                                        'T1.R.M2.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                        'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8',
                                                        'T1.R.M3.N1') THEN Calificacion END) > 0
                        THEN 
                            (
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                                      'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                                       'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                                       'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                                        'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T1.R.M1.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                                      'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                                       'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                                       'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                                        'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                                      'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                                       'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                                       'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                                        'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                )
                            ) / 
                            GREATEST(
                                (CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M1.N1','T1.F.M1.N2','T1.F.M1.N3','T1.F.M1.N4',
                                                                       'T1.F.M1.N5','T1.F.M1.N6','T1.F.M1.N7','T1.F.M1.N8',
                                                                       'T1.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                                       'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8',
                                                                       'T1.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                                       'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8',
                                                                       'T1.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                                1
                            )
                        ELSE NULL
                    END * 0.7
                ) +
                (
                    -- T1.S
                    CASE 
                        WHEN COUNT(CASE WHEN Indicador IN ('T1.S.M1.N1','T1.S.M1.N2','T1.S.M1.N3') THEN Calificacion END) > 0
                        THEN AVG(CASE WHEN Indicador IN ('T1.S.M1.N1','T1.S.M1.N2','T1.S.M1.N3') THEN Calificacion END)
                        ELSE NULL
                    END * 0.3
                ),
                2
            )
            ELSE NULL
        END,

        -- [CONTINÚA CON EL RESTO DE LOS CAMPOS ORIGINALES...]
        -- MÓDULO 2 - N1 a N8
        MAX(CASE WHEN Indicador = 'T1.F.M2.N1' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N2' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N3' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N4' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N5' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N6' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N7' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M2.N8' THEN Calificacion END),
        
        -- Promedio Módulo 2
        ROUND(
            AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                      'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                  THEN Calificacion END),
            2
        ),
        
        -- Refuerzo Módulo 2
        MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END),
        
        -- PF Calculado Módulo 2 - CONTROL DE NULOS
        CASE 
            WHEN MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END) IS NULL THEN
                ROUND(
                    AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                              'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                          THEN Calificacion END),
                    2
                )
            WHEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                               'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                           THEN Calificacion END),
                     2
                 ) > MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)
            THEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                               'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                           THEN Calificacion END),
                     2
                 )
            ELSE ROUND(
                     (ROUND(
                         AVG(CASE WHEN Indicador IN ('T1.F.M2.N1','T1.F.M2.N2','T1.F.M2.N3','T1.F.M2.N4',
                                                   'T1.F.M2.N5','T1.F.M2.N6','T1.F.M2.N7','T1.F.M2.N8') 
                               THEN Calificacion END),
                         2
                     ) + MAX(CASE WHEN Indicador = 'T1.R.M2.N1' THEN Calificacion END)) / 2,
                     2
                 )
        END,
        
        -- NUEVOS CAMPOS MÓDULO 2
        -- T2.F: Promedio de los PF de los 3 módulos (Trimestre 2)
        CASE 
            WHEN 
                COUNT(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                            'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8',
                                            'T2.R.M1.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                            'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8',
                                            'T2.R.M2.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                            'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8',
                                            'T2.R.M3.N1') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- Módulo 1 PF (Trimestre 2)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                          'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                           'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                           'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                            'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 2 PF (Trimestre 2)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                          'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                           'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                           'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                            'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 3 PF (Trimestre 2)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                          'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                           'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                           'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                            'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    )
                ) / 
                GREATEST(
                    (CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                           'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8',
                                                           'T2.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                           'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8',
                                                           'T2.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                           'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8',
                                                           'T2.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                    1
                ),
                2
            )
            ELSE NULL
        END,
        
        -- T2.S.M1.N1
        MAX(CASE WHEN Indicador = 'T2.S.M1.N1' THEN Calificacion END),
        
        -- T2.S.M1.N2
        MAX(CASE WHEN Indicador = 'T2.S.M1.N2' THEN Calificacion END),
        
        -- T2.S.M1.N3
        MAX(CASE WHEN Indicador = 'T2.S.M1.N3' THEN Calificacion END),
        
        -- T2.S: Promedio de T2.S.M1.N1, T2.S.M1.N2, T2.S.M1.N3
        CASE 
            WHEN COUNT(CASE WHEN Indicador IN ('T2.S.M1.N1','T2.S.M1.N2','T2.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                AVG(CASE WHEN Indicador IN ('T2.S.M1.N1','T2.S.M1.N2','T2.S.M1.N3') THEN Calificacion END),
                2
            )
            ELSE NULL
        END,
        
        -- T2: T2.F * 0.7 + T2.S * 0.3
        CASE 
            WHEN 
                (COUNT(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                            'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8',
                                            'T2.R.M1.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                            'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8',
                                            'T2.R.M2.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                            'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8',
                                            'T2.R.M3.N1') THEN Calificacion END) > 0)
                AND COUNT(CASE WHEN Indicador IN ('T2.S.M1.N1','T2.S.M1.N2','T2.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- T2.F (mismo cálculo de arriba)
                    CASE 
                        WHEN 
                            COUNT(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                        'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8',
                                                        'T2.R.M1.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                        'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8',
                                                        'T2.R.M2.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                        'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8',
                                                        'T2.R.M3.N1') THEN Calificacion END) > 0
                        THEN 
                            (
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                                      'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                                       'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                                       'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                                        'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T2.R.M1.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                                      'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                                       'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                                       'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                                        'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T2.R.M2.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                                      'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                                       'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                                       'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                                        'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T2.R.M3.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                )
                            ) / 
                            GREATEST(
                                (CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M1.N1','T2.F.M1.N2','T2.F.M1.N3','T2.F.M1.N4',
                                                                       'T2.F.M1.N5','T2.F.M1.N6','T2.F.M1.N7','T2.F.M1.N8',
                                                                       'T2.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M2.N1','T2.F.M2.N2','T2.F.M2.N3','T2.F.M2.N4',
                                                                       'T2.F.M2.N5','T2.F.M2.N6','T2.F.M2.N7','T2.F.M2.N8',
                                                                       'T2.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T2.F.M3.N1','T2.F.M3.N2','T2.F.M3.N3','T2.F.M3.N4',
                                                                       'T2.F.M3.N5','T2.F.M3.N6','T2.F.M3.N7','T2.F.M3.N8',
                                                                       'T2.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                                1
                            )
                        ELSE NULL
                    END * 0.7
                ) +
                (
                    -- T2.S
                    CASE 
                        WHEN COUNT(CASE WHEN Indicador IN ('T2.S.M1.N1','T2.S.M1.N2','T2.S.M1.N3') THEN Calificacion END) > 0
                        THEN AVG(CASE WHEN Indicador IN ('T2.S.M1.N1','T2.S.M1.N2','T2.S.M1.N3') THEN Calificacion END)
                        ELSE NULL
                    END * 0.3
                ),
                2
            )
            ELSE NULL
        END,

        -- [CONTINÚA CON MÓDULO 3 Y T3...]
        -- MÓDULO 3 - N1 a N8
        MAX(CASE WHEN Indicador = 'T1.F.M3.N1' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N2' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N3' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N4' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N5' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N6' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N7' THEN Calificacion END),
        MAX(CASE WHEN Indicador = 'T1.F.M3.N8' THEN Calificacion END),
        
        -- Promedio Módulo 3
        ROUND(
            AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                      'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                  THEN Calificacion END),
            2
        ),
        
        -- Refuerzo Módulo 3
        MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END),
        
        -- PF Calculado Módulo 3 - CONTROL DE NULOS
        CASE 
            WHEN MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END) IS NULL THEN
                ROUND(
                    AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                              'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                          THEN Calificacion END),
                    2
                )
            WHEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                               'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                           THEN Calificacion END),
                     2
                 ) > MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)
            THEN ROUND(
                     AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                               'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                           THEN Calificacion END),
                     2
                 )
            ELSE ROUND(
                     (ROUND(
                         AVG(CASE WHEN Indicador IN ('T1.F.M3.N1','T1.F.M3.N2','T1.F.M3.N3','T1.F.M3.N4',
                                                   'T1.F.M3.N5','T1.F.M3.N6','T1.F.M3.N7','T1.F.M3.N8') 
                               THEN Calificacion END),
                         2
                     ) + MAX(CASE WHEN Indicador = 'T1.R.M3.N1' THEN Calificacion END)) / 2,
                     2
                 )
        END,
        
        -- NUEVOS CAMPOS MÓDULO 3
        -- T3.F: Promedio de los PF de los 3 módulos (Trimestre 3)
        CASE 
            WHEN 
                COUNT(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                            'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8',
                                            'T3.R.M1.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                            'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8',
                                            'T3.R.M2.N1') THEN Calificacion END) > 0 OR
                COUNT(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                            'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8',
                                            'T3.R.M3.N1') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- Módulo 1 PF (Trimestre 3)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                          'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                           'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                           'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                            'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 2 PF (Trimestre 3)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                          'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                           'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                           'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                            'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    ) +
                    -- Módulo 3 PF (Trimestre 3)
                    COALESCE(
                        CASE 
                            WHEN MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                          'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                      THEN Calificacion END)
                            WHEN AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                           'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                     THEN Calificacion END) > 
                                 MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END)
                            THEN AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                           'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                     THEN Calificacion END)
                            ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                            'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                      THEN Calificacion END) + 
                                  MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END)) / 2
                        END,
                        0
                    )
                ) / 
                GREATEST(
                    (CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                           'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8',
                                                           'T3.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                           'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8',
                                                           'T3.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                     CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                           'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8',
                                                           'T3.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                    1
                ),
                2
            )
            ELSE NULL
        END,
        
        -- T3.S.M1.N1
        MAX(CASE WHEN Indicador = 'T3.S.M1.N1' THEN Calificacion END),
        
        -- T3.S.M1.N2
        MAX(CASE WHEN Indicador = 'T3.S.M1.N2' THEN Calificacion END),
        
        -- T3.S.M1.N3
        MAX(CASE WHEN Indicador = 'T3.S.M1.N3' THEN Calificacion END),
        
        -- T3.S: Promedio de T3.S.M1.N1, T3.S.M1.N2, T3.S.M1.N3
        CASE 
            WHEN COUNT(CASE WHEN Indicador IN ('T3.S.M1.N1','T3.S.M1.N2','T3.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                AVG(CASE WHEN Indicador IN ('T3.S.M1.N1','T3.S.M1.N2','T3.S.M1.N3') THEN Calificacion END),
                2
            )
            ELSE NULL
        END,
        
        -- T3: T3.F * 0.7 + T3.S * 0.3
        CASE 
            WHEN 
                (COUNT(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                            'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8',
                                            'T3.R.M1.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                            'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8',
                                            'T3.R.M2.N1') THEN Calificacion END) > 0 OR
                 COUNT(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                            'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8',
                                            'T3.R.M3.N1') THEN Calificacion END) > 0)
                AND COUNT(CASE WHEN Indicador IN ('T3.S.M1.N1','T3.S.M1.N2','T3.S.M1.N3') THEN Calificacion END) > 0
            THEN ROUND(
                (
                    -- T3.F (mismo cálculo de arriba)
                    CASE 
                        WHEN 
                            COUNT(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                        'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8',
                                                        'T3.R.M1.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                        'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8',
                                                        'T3.R.M2.N1') THEN Calificacion END) > 0 OR
                            COUNT(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                        'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8',
                                                        'T3.R.M3.N1') THEN Calificacion END) > 0
                        THEN 
                            (
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                                      'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                                       'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                                       'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                                        'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T3.R.M1.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                                      'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                                       'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                                       'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                                        'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T3.R.M2.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                ) +
                                COALESCE(
                                    CASE 
                                        WHEN MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END) IS NULL THEN
                                            AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                                      'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                                  THEN Calificacion END)
                                        WHEN AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                                       'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                                 THEN Calificacion END) > 
                                             MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END)
                                        THEN AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                                       'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                                 THEN Calificacion END)
                                        ELSE (AVG(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                                        'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8') 
                                                  THEN Calificacion END) + 
                                              MAX(CASE WHEN Indicador = 'T3.R.M3.N1' THEN Calificacion END)) / 2
                                    END,
                                    0
                                )
                            ) / 
                            GREATEST(
                                (CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M1.N1','T3.F.M1.N2','T3.F.M1.N3','T3.F.M1.N4',
                                                                       'T3.F.M1.N5','T3.F.M1.N6','T3.F.M1.N7','T3.F.M1.N8',
                                                                       'T3.R.M1.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M2.N1','T3.F.M2.N2','T3.F.M2.N3','T3.F.M2.N4',
                                                                       'T3.F.M2.N5','T3.F.M2.N6','T3.F.M2.N7','T3.F.M2.N8',
                                                                       'T3.R.M2.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END +
                                 CASE WHEN COUNT(CASE WHEN Indicador IN ('T3.F.M3.N1','T3.F.M3.N2','T3.F.M3.N3','T3.F.M3.N4',
                                                                       'T3.F.M3.N5','T3.F.M3.N6','T3.F.M3.N7','T3.F.M3.N8',
                                                                       'T3.R.M3.N1') THEN Calificacion END) > 0 THEN 1 ELSE 0 END),
                                1
                            )
                        ELSE NULL
                    END * 0.7
                ) +
                (
                    -- T3.S
                    CASE 
                        WHEN COUNT(CASE WHEN Indicador IN ('T3.S.M1.N1','T3.S.M1.N2','T3.S.M1.N3') THEN Calificacion END) > 0
                        THEN AVG(CASE WHEN Indicador IN ('T3.S.M1.N1','T3.S.M1.N2','T3.S.M1.N3') THEN Calificacion END)
                        ELSE NULL
                    END * 0.3
                ),
                2
            )
            ELSE NULL
        END
        
    FROM calificaciones 
    WHERE Docente = p_Docente
    GROUP BY Especialidad, Curso, Paralelo,Estudiante;
    
    SELECT CONCAT('Datos insertados correctamente. Estudiantes: ', 
                 ROW_COUNT()) AS Mensaje;
    
END