USE BD_SPDV
IF EXISTS (SELECT * FROM sys.objects where (type='p' and name='ActualizarInventarioConTasa') or  (type='fn' and name='sp_PermiteActualizarInventarioConTasa'))
BEGIN
PRINT(N'ELIMINADO PROCEDIMIENTO dbo.ActualizarInventarioConTasa')
PRINT(N'ELIMINADO FUNCION sp_PermiteActualizarInventarioConTasa')
DROP PROCEDURE dbo.ActualizarInventarioConTasa
DROP FUNCTION dbo.sp_PermiteActualizarInventarioConTasa
END
GO
CREATE PROCEDURE [dbo].[ActualizarInventarioConTasa]
    @Valor FLOAT
AS
BEGIN
    BEGIN TRY
        -- Comenzar una nueva transacción
        BEGIN TRANSACTION

        DECLARE @PermiteActualizar BIT

        -- Obtener la última tasa de cambio
        DECLARE @UltimaTasa FLOAT
        SELECT @UltimaTasa = Valor FROM dbo.TASA_CAMBIO ORDER BY Fecha DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY   

        -- Insertar nueva tasa de cambio
        INSERT INTO dbo.TASA_CAMBIO (Valor) VALUES (@Valor)

        -- Verificar si se permite actualizar el inventario con la tasa
        SELECT @PermiteActualizar = dbo.sp_PermiteActualizarInventarioConTasa()

        IF @PermiteActualizar = 1
        BEGIN    
            -- Actualizar precios de detalle
            UPDATE INVENTARIO
            SET PrecioDetal = ROUND(I.PrecioDetal + (I.PrecioDetal * IMP.PorcentajeImpuesto / 100), 2)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioDetal, 2) <> 0

            -- Actualizar precios de mayor
            UPDATE INVENTARIO
            SET PrecioMayor = ROUND(I.PrecioMayor + (I.PrecioMayor * IMP.PorcentajeImpuesto / 100), 2)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioMayor, 2) <> 0

            -- Actualizar precios de afiliados
            UPDATE INVENTARIO
            SET PrecioAfiliado = ROUND(I.PrecioAfiliado + (I.PrecioAfiliado * IMP.PorcentajeImpuesto / 100), 2)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioAfiliado, 2) <> 0

            -- Actualizar precios de promoción
            UPDATE INVENTARIO
            SET PrecioPromocion = ROUND(I.PrecioPromocion + (I.PrecioPromocion * IMP.PorcentajeImpuesto / 100), 2)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioPromocion, 2) <> 0

            -- Actualizar precios de detalle con tasa anterior
            UPDATE INVENTARIO
            SET PrecioDetal = ROUND(PrecioDetal / @UltimaTasa, 2)
            WHERE ROUND(PrecioDetal, 2) <> 0

            -- Actualizar precios de mayor con tasa anterior
            UPDATE INVENTARIO
            SET PrecioMayor = ROUND(PrecioMayor / @UltimaTasa, 2)
            WHERE ROUND(PrecioMayor, 2) <> 0

            -- Actualizar precios de afiliados con tasa anterior
            UPDATE INVENTARIO
            SET PrecioAfiliado = ROUND(PrecioAfiliado / @UltimaTasa, 2)
            WHERE ROUND(PrecioAfiliado, 2) <> 0

            -- Actualizar precios de promoción con tasa anterior
            UPDATE INVENTARIO
            SET PrecioPromocion = ROUND(PrecioPromocion / @UltimaTasa, 2)
            WHERE ROUND(PrecioPromocion, 2) <> 0

            -- Actualizar precios de detalle con nueva tasa
            UPDATE INVENTARIO
            SET PrecioDetal = ROUND(PrecioDetal * @Valor, 2)
            WHERE ROUND(PrecioDetal, 2) <> 0

            -- Actualizar precios de mayor con nueva tasa
            UPDATE INVENTARIO
            SET PrecioMayor = ROUND(PrecioMayor * @Valor, 2)
            WHERE ROUND(PrecioMayor, 2) <> 0

            -- Actualizar precios de afiliados con nueva tasa
            UPDATE INVENTARIO
            SET PrecioAfiliado = ROUND(PrecioAfiliado * @Valor, 2)
            WHERE ROUND(PrecioAfiliado, 2) <> 0

            -- Actualizar precios de promoción con nueva tasa
            UPDATE INVENTARIO
            SET PrecioPromocion = ROUND(PrecioPromocion * @Valor, 2)
            WHERE ROUND(PrecioPromocion, 2) <> 0

            -- Actualizar precios de detalle con impuesto excluido
            UPDATE INVENTARIO
            SET PrecioDetal = ROUND(I.PrecioDetal / (1 + (IMP.PorcentajeImpuesto / 100)), 4)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioDetal, 2) <> 0

            -- Actualizar precios de mayor con impuesto excluido
            UPDATE INVENTARIO
            SET PrecioMayor = ROUND(I.PrecioMayor / (1 + (IMP.PorcentajeImpuesto / 100)), 4)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioMayor, 2) <> 0

            -- Actualizar precios de afiliados con impuesto excluido
            UPDATE INVENTARIO
            SET PrecioAfiliado = ROUND(I.PrecioAfiliado / (1 + (IMP.PorcentajeImpuesto / 100)), 4)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioAfiliado, 2) <> 0

            -- Actualizar precios de promoción con impuesto excluido
            UPDATE INVENTARIO
            SET PrecioPromocion = ROUND(I.PrecioPromocion / (1 + (IMP.PorcentajeImpuesto / 100)), 4)
            FROM INVENTARIO I
            INNER JOIN IMPUESTOS IMP ON IMP.Codigo = I.TipoImpuesto
            WHERE ROUND(I.PrecioPromocion, 2) <> 0
        END   
        
        -- Si todo va bien, realizar COMMIT
        COMMIT
    END TRY
    
    BEGIN CATCH
        -- Realizar ROLLBACK en caso de error
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK
        END
        
        -- Manejo del error
        DECLARE @ErrorMessage NVARCHAR(4000)
        DECLARE @ErrorSeverity INT
        DECLARE @ErrorState INT

        SELECT 
            @ErrorMessage = ERROR_MESSAGE(),
            @ErrorSeverity = ERROR_SEVERITY(),
            @ErrorState = ERROR_STATE()

        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
    END CATCH
END
GO
CREATE FUNCTION [dbo].[sp_PermiteActualizarInventarioConTasa]()
RETURNS BIT
AS
BEGIN
    DECLARE @PermiteActualizar BIT

    -- Verificar si existe un registro con IdTabla igual a 'ActTasa'
    IF EXISTS (SELECT 1 FROM TABLA_VALORES WHERE IdTabla = 'ActTasa')
    BEGIN
        -- Obtener el valor de Descripcion
        SELECT @PermiteActualizar = CASE WHEN Descripcion = 'TRUE' THEN 1 ELSE 0 END
        FROM TABLA_VALORES
        WHERE IdTabla = 'ActTasa'
    END
    ELSE
    BEGIN
        -- Si no existe un registro con IdTabla igual a 'ActTasa', establecer @PermiteActualizar en 0 (false)
        SET @PermiteActualizar = 0
    END

    -- Retornar el valor de @PermiteActualizar
    RETURN @PermiteActualizar
END
GO
PRINT(N'CREADO PROCEDIMIENTO dbo.ActualizarInventarioConTasa')
PRINT(N'CREADA FUNCION sp_PermiteActualizarInventarioConTasa')
PRINT(N'PROCESO FINALIZADO')



