SET SQLBLANKLINES ON;

/
-- Query para asociar la mensaualidad correcta en las liquidaciones para cada usuario y borrar el resto 
DECLARE

    pAnyo NUMBER := 2025;
    pMes NUMBER := 2;

    CURSOR CSOL IS 
        WITH q AS (SELECT ID_SOLICITANTE_89, ANYO_89, MES_89, COUNT(*) AS TOTAL
        FROM AD74A89T00 
        GROUP BY ID_SOLICITANTE_89, ANYO_89, MES_89)
        SELECT DISTINCT(Q.ID_SOLICITANTE_89), Q.ANYO_89, Q.MES_89, Q.TOTAL
        --, M.ID_MENSUALIDAD_89, M.IMPORTE_89
        --, L.*
        FROM q INNER JOIN AD74A89T00 M ON (Q.ID_SOLICITANTE_89 = M.ID_SOLICITANTE_89)
        INNER JOIN AE01B.AE01B00T00 L ON (TO_CHAR(M.ID_MENSUALIDAD_89) = L.COD_ORIGEN_00)
        WHERE Q.TOTAL > 1
        AND Q.ANYO_89 = M.ANYO_89 AND Q.MES_89 = M.MES_89
        AND M.ANYO_89 = pAnyo AND M.MEs_89 = pMes
        ORDER BY Q.ID_SOLICITANTE_89;
        
    CURSOR CMEN (W_SOLICITANTE NUMBER) IS
        SELECT *
        FROM AD74A89T00 M
        WHERE M.ID_SOLICITANTE_89 = W_SOLICITANTE
        AND M.ANYO_89 = pAnyo AND M.MEs_89 = pMes;
        
    wContMal NUMBER := 0;
    wContBien NUMBER := 0;
    wSolicitante NUMBER := 0;
    wMaxMensualidad number;

BEGIN

     -- SOLICITANTES
    DBMS_OUTPUT.PUT_LINE('#####SOLICITANTES#####');
    FOR SOL IN CSOL LOOP    
        wSolicitante:= SOL.ID_SOLICITANTE_89;
        DBMS_OUTPUT.PUT_LINE('------IDSOLICITANTE: '|| SOL.ID_SOLICITANTE_89 || ' - TOTAL MENSUALIDADES: '|| SOL.TOTAL || '------');    
        
        DBMS_OUTPUT.PUT_LINE('  #MENSUALIDADES#');
        SELECT MAX(ID_MENSUALIDAD_89) INTO wMaxMensualidad FROM AD74A89T00 M WHERE M.ANYO_89 = pAnyo AND M.MEs_89 = pMes AND M.ID_SOLICITANTE_89 = wSolicitante;
        DBMS_OUTPUT.PUT_LINE('  --MAX(mensualidad) ' || pAnyo || '/' || pMes ||': ' ||  wMaxMensualidad || '--');
        
        FOR MEN IN CMEN(wSolicitante) LOOP
            
            -- Para todas las que son diferents a MAX(mensualidad)
            --  - Actulizar en AE10B00T00 donde el codOrigen en la mensualidad actual con la max(mensualidad)
            --  - Borrar de AD74A89T00 la mensualidad actual
            
            IF MEN.ID_MENSUALIDAD_89 <> wMaxMensualidad THEN
                DBMS_OUTPUT.PUT_LINE('    --MENSULAIDAD ACTUAL ' || MEN.ID_MENSUALIDAD_89  ||',  MÁXIMA MENSUALIDAD: ' ||  wMaxMensualidad || '--');
                -- Solo las de tipo de ingreso 2: TLCOP
                DBMS_OUTPUT.PUT_LINE('      UPDATE AE01B.AE01B00T00 SET COD_ORIGEN_00 = ' || wMaxMensualidad || ' WHERE COD_ORIGEN_00 = ' || MEN.ID_MENSUALIDAD_89  ||' AND ID_TIPO_INGRESO_00=2;');
                UPDATE AE01B.AE01B00T00 SET COD_ORIGEN_00 = wMaxMensualidad WHERE COD_ORIGEN_00 = TO_CHAR(MEN.ID_MENSUALIDAD_89) AND ID_TIPO_INGRESO_00=2;
                DBMS_OUTPUT.PUT_LINE('      DELETE FROM AD74A89T00 WHERE ID_MENSUALIDAD_89 = ' || MEN.ID_MENSUALIDAD_89);
                DELETE FROM AD74A89T00 WHERE ID_MENSUALIDAD_89 = TO_CHAR(MEN.ID_MENSUALIDAD_89);
                wContMal:=wContMal+1;
            ELSE 
                DBMS_OUTPUT.PUT_LINE('    --MENSUALIDAD ACTUAL ' || MEN.ID_MENSUALIDAD_89 || ': ES LA MÁXIMA. No se hace nada');
                wContBien:=wContBien+1;
            END IF;            
        END LOOP;        
    END LOOP;
    COMMIT;
    
    --TOTALES
    DBMS_OUTPUT.PUT_LINE('TOTAL MENSUALIDADES: ' || (wContMal + wContBien) || ', Duplicadas: ' || wContMal || ', Correctas: ' || wContBien);
END;
/