
--PLAN ESTRATEGICO
ALTER TABLE AB3907T00 ADD FECHA_MODIFICACION DATE;

--PLAN DE GESTION
ALTER TABLE AB3909T00 ADD FECHA_MODIFICACION  DATE;

COMMENT ON COLUMN AB39A.AB3907T00.FECHA_MODIFICACION IS 'Fecha de modificación';
COMMENT ON COLUMN AB39A.AB3909T00.FECHA_MODIFICACION IS 'Fecha de modificación';
 



create or replace PROCEDURE PROC_VERSIONA_PLAN_ESTATEGICO (
-- Codigo del plan estrategico
codigo_pe IN PLS_INTEGER
) AS

    -- Version a la que tendremos que hacer el versionado
    maxVersion INTEGER;    
    -- Posicion del recorrido de inserts
    counter INTEGER;        
    -- Valor recuperado del type table para recodificacion
    codElemFromType    INTEGER;
    -- Valor del elemento destino
    elemDest    INTEGER;  
    -- Cursor para recorrer los elementos
    CURSOR curELEMENTO IS SELECT CODELEMENTOPE, codigo_pe CODPLANE, 
        ELEMBASE, ORDEN, NIVEL, NOMBRE, 
        NOMBRECAS, HELBURU, HELBURUCAS,IDELEMENTO,  CODELEMENTOPEPADRE,
        HAS_EUS,HAS_ELEBI,AURRE_EUS,AURRE_ELEBI,AMAI_EUS,AMAI_ELEBI,OHARRAK,
    HAS_VALOR, AURRE_VALOR, AMAI_VALOR, TIENEELEBI, TIENEVALOR, TIENESINO,
    HAS_SINO, AURRE_SINO, AMAI_SINO, TIENEEUS
        FROM ELEMENTOS_PE
        WHERE
        CODPLANE = codigo_pe AND
        CODVERSIONPE = maxVersion ORDER BY CODELEMENTOPE;
    reg curELEMENTO%ROWTYPE;

    -- Cursor para actualizar los elementos padre
    CURSOR curELEMENTOPADRE IS SELECT CODPLANE, CODVERSIONPE, CODELEMENTOPE, CODELEMENTOPEPADRE
        FROM ELEMENTOS_PE
        WHERE
        CODPLANE = codigo_pe AND
        CODVERSIONPE = maxVersion+1 AND
        CODELEMENTOPEPADRE IS NOT NULL ORDER BY CODELEMENTOPEPADRE;
    regPadre curELEMENTOPADRE%ROWTYPE;
    
    TYPE RECORD_RECODIFICACION IS RECORD(
      CODELEMENTO_ORIG NUMBER,
      CODELEMENTO_DEST NUMBER);
    TYPE TBL_RECODIFICACION IS TABLE OF RECORD_RECODIFICACION INDEX BY BINARY_INTEGER;
    
    rec_recod RECORD_RECODIFICACION;
    tbl_recod TBL_RECODIFICACION;
    
BEGIN

    counter:=1;
    -- Recuperacion de la version maxima dado un plan estrategico
    SELECT DISTINCT MAX(CODVERSION) VERSION INTO maxVersion FROM PLANES_ESTRATEGICOS WHERE CODPLANE = codigo_pe ;

    -- Realizamos la copia del plan para la tabla de PLANES_ESTRATEGICOS
    BEGIN
        INSERT INTO PLANES_ESTRATEGICOS 
        (CODPLANE,CODVERSION,CODENTIDAD,CODPLANIFICACION,ANYOINICIO,ANYOFIN,
         ACTIVO,INDICE_OBLIGAT,NIVEL_CUMPLIMIENTO_REQEUS,PORCENTAJE_BILIN,
         FECHA_ALTA,FECHA_ACEPTACION_PLAN,NOMBRE,NOMBREEUS,SOLICITAR_TXOSTENA,FECHA_MODIFICACION)
        SELECT 
        CODPLANE,(maxversion+1) CODVERSION,CODENTIDAD,CODPLANIFICACION,ANYOINICIO,ANYOFIN,
         ACTIVO,INDICE_OBLIGAT,NIVEL_CUMPLIMIENTO_REQEUS,PORCENTAJE_BILIN,
         SYSDATE,FECHA_ACEPTACION_PLAN,NOMBRE,NOMBREEUS,SOLICITAR_TXOSTENA,SYSDATE
        FROM PLANES_ESTRATEGICOS
        WHERE
        CODPLANE = codigo_pe AND
        CODVERSION = maxVersion;
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.put_line ( 'Error versionando PLANES_ESTRATEGICOS: '|| DBMS_UTILITY.format_error_stack ());
        RAISE;
    END;   

    -- Realizamos la copia del plan para la tabla de EJES_PE  
    BEGIN
        INSERT INTO EJES_PE (CODPLANE, ID_EJE, HELBURU, HELBURUCAS, CODVERSIONPE)
        SELECT 
        CODPLANE, ID_EJE, HELBURU, HELBURUCAS, (maxversion+1)
        FROM EJES_PE
        WHERE
        CODPLANE = codigo_pe AND
        CODVERSIONPE = maxVersion;
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.put_line ( 'Error versionando EJES_PE: '|| DBMS_UTILITY.format_error_stack ());
        RAISE;
    END;
  
    -- Realizamos la copia del plan para la tabla de ELEMENTOS_PE  
    BEGIN                                    

       OPEN curELEMENTO;
       FETCH curELEMENTO INTO reg;
       WHILE curELEMENTO%FOUND LOOP
     
      SELECT ELEMENTOS_PE_SEQ.NEXTVAL INTO ElemDest FROM DUAL;
     
            INSERT INTO ELEMENTOS_PE 
            (CODELEMENTOPE, CODPLANE, CODVERSIONPE, ELEMBASE, 
            ORDEN, NIVEL, NOMBRE, NOMBRECAS, IDELEMENTO,
            HELBURU, HELBURUCAS,  CODELEMENTOPEPADRE,
            HAS_EUS,HAS_ELEBI,AURRE_EUS,AURRE_ELEBI,AMAI_EUS,AMAI_ELEBI,OHARRAK,
      HAS_VALOR, AURRE_VALOR, AMAI_VALOR, TIENEELEBI, TIENEVALOR, TIENESINO,
      HAS_SINO, AURRE_SINO, AMAI_SINO, TIENEEUS) VALUES
            (ElemDest,reg.CODPLANE,(maxVersion+1),reg.ELEMBASE,
            reg.ORDEN,reg.NIVEL,reg.NOMBRE,reg.NOMBRECAS,reg.IDELEMENTO,
            reg.HELBURU,reg.HELBURUCAS,reg.CODELEMENTOPEPADRE,
            reg.HAS_EUS,reg.HAS_ELEBI,reg.AURRE_EUS,reg.AURRE_ELEBI,reg.AMAI_EUS,reg.AMAI_ELEBI,reg.OHARRAK,
      reg.HAS_VALOR, reg.AURRE_VALOR, reg.AMAI_VALOR, reg.TIENEELEBI, reg.TIENEVALOR, reg.TIENESINO,
      reg.HAS_SINO, reg.AURRE_SINO, reg.AMAI_SINO, reg.TIENEEUS);
            
            -- Guardamos los datos para la posterior recodificacion
            rec_recod.CODELEMENTO_ORIG := reg.CODELEMENTOPE;
            rec_recod.CODELEMENTO_DEST := ElemDest;
            
            -- INSERT INTO AB39LGT00 (CODORIGEN, CODDESTINO) VALUES (rec_recod.CODELEMENTO_ORIG,rec_recod.CODELEMENTO_DEST );
      
            tbl_recod(counter) := rec_recod;
            
            counter:=counter+1;            
            
            FETCH curELEMENTO INTO reg;
       END LOOP;        
           
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.put_line ( 'Error versionando ELEMENTOS_PE: '|| DBMS_UTILITY.format_error_stack ());
        RAISE;
    END; 

    -- Realizamos la recodificacion de ELEMENTOS_PE
    BEGIN                                    

       OPEN curELEMENTOPADRE;
       FETCH curELEMENTOPADRE INTO regPadre;
       WHILE curELEMENTOPADRE%FOUND LOOP
            codElemFromType:=null;
            -- Recorremos el Array para recuperar el codigo actual del padre
          FOR counter IN tbl_recod.FIRST .. tbl_recod.LAST LOOP
                -- INSERT INTO AB39LGT00 (CODORIGEN, CODDESTINO) VALUES (tbl_recod(counter).CODELEMENTO_ORIG,tbl_recod(counter).CODELEMENTO_DEST );
                if (regPadre.CODELEMENTOPEPADRE = tbl_recod(counter).CODELEMENTO_ORIG) then
                    codElemFromType := tbl_recod(counter).CODELEMENTO_DEST;
                end if;
                exit when regPadre.CODELEMENTOPEPADRE = tbl_recod(counter).CODELEMENTO_ORIG;
          END LOOP;                        

            UPDATE ELEMENTOS_PE  SET 
            CODELEMENTOPEPADRE = codElemFromType
            WHERE
            CODPLANE = regPadre.CODPLANE AND
            CODVERSIONPE = regPadre.CODVERSIONPE AND
            CODELEMENTOPE = regPadre.CODELEMENTOPE AND
            CODELEMENTOPEPADRE IS NOT NULL;
        
            FETCH curELEMENTOPADRE INTO regPadre;
       END LOOP;        
           
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.put_line ( 'Error recalculando elementosPadre en ELEMENTOS_PE: '|| DBMS_UTILITY.format_error_stack ());
        RAISE;
    END; 

END PROC_VERSIONA_PLAN_ESTATEGICO;


COMMIT;

EXIT;