spTop20Morosos actualización

Se trabajó en la creación del stored procedure encargado de devolver los 20 abonados con la morosidad más alta, de forma descendente (aprox 2hrs)

Luego de su debido proceso de debbugeo se logró el resultado deseado mediante el siguiente código:

declare @TablaMorosos table (sec int identity(1,1), id_abonado int, total_morosidad int)
declare @cont int
set @cont = 1
while @cont <= 40
begin
    --se declaran las tablas
    --recibo consulta que va a contener los datos de los recibos aún no pagados por el abonado
    --resultado en el que se le va a ingresar el calculo del monto de los recibos a pagar
    DECLARE @reciboConsulta table (sec int identity(1,1), idRecibo int, numeroFinca int, idmuni int, idAbonado int, valor int, nombre varchar(30), fechaEmision dateTime, fechaLimite dateTime, fechaPagado dateTime, valorMAgua float, tasaInteres int)
    DECLARE @resultado table (sec int identity(1,1), idRecibo int, montoAgua float, montoAlumbrado float, montoBasura float, montoParques float, montoPatente float, intMoratorio float, morosidad float, impuestoPropiedad float, subTotal float)


    --obtiene los recibos que aún no han sido pagados = null por el abonado
    Insert into @reciboConsulta Select Recibo.ID, Recibo.NumeroFinca, IdMunicipalidad, IdAbonado, Valor, Abonado.Nombre, FechaEmision, FechaLimite, FechaPagado, ValorMAgua, TasaInteres from Propiedad join Abonado on Propiedad.IdAbonado = Abonado.ID
            join Recibo on Propiedad.NumeroFinca = Recibo.NumeroFinca
            join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.IdAbonado = @cont and FechaPagado is null ORDER BY FechaEmision desc
    --se declaran variables para obtener los datos
    DECLARE @low int = 1
    DECLARE @high int = 0

    DECLARE @montoAgua float = 0
    DECLARE @montoAlumbrado float = 0
    DECLARE @montoBasura float = 0
    DECLARE @montoParques float = 0
    DECLARE @montoPatente float = 0
    DECLARE @intMoratorio float = 0
    DECLARE @subTotal float = 0
    DECLARE @morosidad float = 0
    DECLARE @numFinca int = 0
    DECLARE @idRecibo int = 0

    DECLARE @fechalimite dateTime
    DECLARE @interesMoratorio float = 0
    DECLARE @impuestoPropiedad float = 0

    Print 'comienza loop------------------------------'

    Select @high = max(T.sec) from @reciboConsulta T
    --procede a iterar por los recibos para obtener el valor a pagar del agua,alumbrado,parques,patente,interesMoratiorio en caso de que el servicio no sea solicitado settea un 0 en la tabla
    while @low <= @high
    Begin
       
        --obtiene numero de finca e id recibo a pagar
        Set @numFinca = (Select numeroFinca from @reciboConsulta where sec = @low)

        Set @idRecibo = (Select idRecibo from @reciboConsulta where sec = @low)

        --obtiene el valor del pago correspondiente al recibo del agua por medio del id del recibo
        Execute dbo.spGetCalculoAguaPorRecibo @idRecibo,@montoAgua out
        --obtiene los servicios que paga la finca al mes, en caso de no haber solicitado algún servicio se settea un 0 al valor para no afectar el subtotal
        Execute spGetPagos @numFinca,@montoAlumbrado out,@montoBasura out,@montoParques out,@montoPatente out

        --suma subtotal

        Set @subtotal = @montoAlumbrado + @montoBasura +  @montoParques + @montoPatente + @montoAgua

        --obtiene el id de la municipalidad por medio del numero de finca para sacar el interes moratorio
        Set @interesMoratorio = (Select Municipalidad.TasaInteres from Municipalidad where Municipalidad.ID = (Select Municipalidad.ID from Propiedad join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.NumeroFinca = @numFinca))


        Set @fechalimite = (Select FechaLimite from Recibo where Recibo.ID = @idRecibo)

        Set @impuestoPropiedad = (Select Valor from Propiedad where Propiedad.NumeroFinca = @numFinca)
        Set @impuestoPropiedad = @impuestoPropiedad * 0.5

        --datediff = dias de atraso
        if(DATEDIFF(DAY,@fechalimite,GETDATE()) > 0)
            Set @morosidad = @subtotal * (@interesMoratorio/360) * DATEDIFF(DAY,@fechalimite,GETDATE())
           
        Insert into @resultado values (@idRecibo,@montoAgua,@montoAlumbrado,@montoBasura,@montoParques,@montoPatente,@interesMoratorio,@morosidad,@impuestoPropiedad,@subTotal)
       

        Set @low = @low + 1
    end
    insert into @TablaMorosos (id_abonado, total_morosidad) values (@cont, (select sum(morosidad) from @resultado))
    set @cont = @cont + 1
    delete from @reciboConsulta
    delete from @resultado

   
end
 Select top 20 * from @TablaMorosos order by total_morosidad desc

end


El procedimiento se encarga de calcular la morosidad de cada recibo de cada abonado, estos valores se suman y se guardan en una tabla temporal con el id del abonado y la suma de sus morosidades. Luego se despliegan los primeros 20 registros ordenados de mayor a meor.

El resultado de esto, con los datos suministrados es:

Comentarios

Entradas populares de este blog

XML y carga de datos (actualización)

Última reunión

actualización