create or replace PROCEDURE FCT_SINCRONIZAR_COMPOSICAO (
    P_NRCOMPSERVICO IN FCT_COMPSERVICO.NRCOMPSERVICO%TYPE,
    P_NRORG         IN NUMBER
)
AS
    V_ELEMENTO_EXISTE_ITCOMP NUMBER;
BEGIN
    FOR C_ELEMENTOS IN (
        SELECT IT.IDELEMENTO    AS IDELEMENTO_IT,
               IT.IDELEMENTOPAI AS IDELEMENTOPAI_IT,
               EL.IDELEMENTO    AS IDELEMENTO_EL,
               EL.IDELEMENTOPAI AS IDELEMENTOPAI_EL
          FROM FCT_ITCOMPSERVICO IT
          LEFT JOIN FCT_SERVICOORCA EL
            ON IT.IDELEMENTO = EL.IDELEMENTO
           AND IT.NRORG      = EL.NRORG
         WHERE IT.NRCOMPSERVICO = P_NRCOMPSERVICO
           AND IT.NRORG         = P_NRORG
         ORDER BY IT.IDELEMENTO
    ) LOOP
    
        IF (C_ELEMENTOS.IDELEMENTO_EL IS NULL) THEN
        
            DELETE FROM FCT_ITCOMPSERVICO
             WHERE IDELEMENTO    = C_ELEMENTOS.IDELEMENTO_IT
               AND NRCOMPSERVICO = P_NRCOMPSERVICO
               AND NRORG         = P_NRORG;
             
        ELSIF (NVL(C_ELEMENTOS.IDELEMENTOPAI_IT, -1) <> NVL(C_ELEMENTOS.IDELEMENTOPAI_EL, -1)) THEN
        
            /* Verifica se o novo elemento pai ja existe dentro da composicao.
            Se existir, e realizado o update nos itens da composicao para atualizar o novo pai do elemento.
            Se nao existir, o elemento e excluido. */
            SELECT COUNT(*)
              INTO V_ELEMENTO_EXISTE_ITCOMP
              FROM FCT_ITCOMPSERVICO
             WHERE NRCOMPSERVICO = P_NRCOMPSERVICO
               AND NRORG         = P_NRORG
               AND IDELEMENTO    = C_ELEMENTOS.IDELEMENTOPAI_EL;

            IF (V_ELEMENTO_EXISTE_ITCOMP > 0) THEN
                
                UPDATE FCT_ITCOMPSERVICO
                   SET IDELEMENTOPAI = C_ELEMENTOS.IDELEMENTOPAI_EL
                 WHERE IDELEMENTO    = C_ELEMENTOS.IDELEMENTO_IT
                   AND NRCOMPSERVICO = P_NRCOMPSERVICO
                   AND NRORG         = P_NRORG;

            ELSE

                DELETE FROM FCT_ITCOMPSERVICO
                 WHERE IDELEMENTO    = C_ELEMENTOS.IDELEMENTO_IT
                   AND NRCOMPSERVICO = P_NRCOMPSERVICO
                   AND NRORG         = P_NRORG;

            END IF;
               
        END IF;
    END LOOP; --C_ELEMENTOS
    
    COMMIT;
END;
/
