create or replace PROCEDURE PASO_HISTORICO_LIQ(P_NUM_MESES NUMBER) IS 
    vFechaHistorico date;
    vEstadoLiq ae01b.AE01B00T00.estado_liq_00%type;
    
    vSolicitanteAux AD74A89T00.id_solicitante_89%type;
    
    cursor cMensualidades (vAnio number, vMes number) is 
    select * from AD74A89T00
    where anyo_89 <= vAnio and mes_89 <= vMes
    order by id_solicitante_89, anyo_89, mes_89 asc;
  
BEGIN
    select trunc(ADD_MONTHS(sysdate, -P_NUM_MESES)) into vFechaHistorico from dual;
    --dbms_output.put_line('fecha hasta del historico:'||vFechaHistorico);
    
    -- Pasar a histórico los plazos que ya han cumplido "un año" configurado el numero de meses por parametro
    -- y que se han cobrado correctamente
    -- Si un plazo está pendiente de cobro: 
        -- ese y todos los posteriores del mismo beneficiario, se mantendrán en las tablas ordinarias, 
        -- independientemente del tiempo transcurrido. 
    
    for r89 in cMensualidades(to_number(to_char(vFechaHistorico,'rrrr')), to_number(to_char(vFechaHistorico,'mm'))) loop
        --dbms_output.put_line('idSolicitante: '||r89.id_solicitante_89||', idMensualidad: '||r89.id_mensualidad_89); -- con meses=31 solo hay un registro en desa
        if vSolicitanteAux is null or r89.id_solicitante_89 != vSolicitanteAux  then 
            vSolicitanteAux := null;
        end if;
        
        select estado_liq_00 into vEstadoLiq from ae01b.AE01B00T00 where id_liquidacion_00 = ( select max(id_liquidacion_00)
        from ae01b.AE01B00T00 where ejercicio_00 = r89.anyo_89 and cod_origen_00 = r89.id_mensualidad_89
        AND id_tipo_ingreso_00 = (select id_tipo_ingreso_30 from ae01b.ae01b30t00 where tipo_ingreso_30 = 'TLCOP'));
                
        --dbms_output.put_line('estado liquidacion: '||vEstadoLiq);
        if (vEstadoLiq <> 60 or vSolicitanteAux is not null) then
            --dbms_output.put_line('no se ha recibido el cobro definitivo, no se pasa a historico');
            vSolicitanteAux := r89.id_solicitante_89;
                    
        else 
            -- el cobro es definitivo, se crean los registros en las tablas del historico 
            begin
                insert into ad74a89t01 select * from ad74a89t00 where id_mensualidad_89 = r89.id_mensualidad_89;
                insert into ae01b.ae01b00t01 select * from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89;
                    
                insert into ae01b.ae01b01t01 select * from ae01b.ae01b01t00 where id_liquidacion_01 
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89);
                    
                insert into ae01b.ae01b02t01 select * from ae01b.ae01b02t00 where id_liquidacion_02
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89);
                    
                insert into ae01b.ae01b03t01  select * from ae01b.ae01b03t00 where id_operacion_03
                                            in ( select id_operacion_02 from ae01b.ae01b02t00 where id_liquidacion_02
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89));
                    
                -- y se borran de las tablas ordinarias: AD74A89T00, AE01B00T00, AE01B01T00, AE01B02T00 y AE01B03T00 
                delete from ae01b.ae01b03t00 where id_operacion_03 in (select id_operacion_02 from ae01b.ae01b02t00 where id_liquidacion_02
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89));
                                              
                delete from ae01b.ae01b02t00 where id_liquidacion_02
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89);
                   
                delete from ae01b.ae01b01t00 where id_liquidacion_01 
                                            in ( select id_liquidacion_00 from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89);
                    
                delete from ae01b.ae01b00t00 where cod_origen_00 = r89.id_mensualidad_89;
        
                delete from ad74a89t00 where id_mensualidad_89 = r89.id_mensualidad_89;
                    
                commit;
            exception 
                when others then 
                    --dbms_output.put_line('Error: '||sqlcode||'-'||sqlerrm);
                    rollback;
            end;
        end if;

    end loop;
END PASO_HISTORICO_LIQ;