domingo, 6 de noviembre de 2016

Se terminan la programación de SP diarios

(5 horas)

Este día se estuvieron programando los SP que se encargan de cobrar al cliente y disminuir su monto de dinero. Además se encarga de agregar el dinero al comercio y cobrar un multa que se le acredita al banco. Se presenta a continuación el SP programado:

USE [II Proyecto - Banco]
GO

CREATE PROCEDURE BASP_CobrarCompra
   
    @inFecha date

AS
BEGIN
    BEGIN TRY

        SET LANGUAGE Spanish
        SET NOCOUNT ON

        DECLARE @IPCLIENT VARCHAR(15)
        SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))

        DECLARE @TipoMov int
        DECLARE @ID_TipoCreditoXCompraComercio int, @ID_TipoDebitoXCompra int, @ID_TipoDebitoXComisionBanco int
       
        SELECT @ID_TipoDebitoXCompra = ID, @TipoMov = Tipo FROM dbo.Tipo_Movimiento_Estado_Cuenta WHERE Nombre = 'Debito por Compra'
        SELECT @ID_TipoCreditoXCompraComercio = ID FROM dbo.Tipo_Movimiento_Estado_Cuenta WHERE Nombre = 'Credito por compra a Comercio'
        SELECT @ID_TipoDebitoXComisionBanco = ID FROM dbo.Tipo_Movimiento_Estado_Cuenta WHERE Nombre = 'Debito por Comision Banco'

        BEGIN TRANSACTION Transaccion
       
        UPDATE [dbo].[Estado_Cuenta]
           SET [Saldo_Acumulado] = [Saldo_Acumulado] + (S.Suma * @TipoMov)
              ,[PostIn] = @IPCLIENT
              ,[PostBy] = CURRENT_USER
              ,[PostDate] = CURRENT_TIMESTAMP
         FROM (SELECT SUM(M.Monto) Suma, M.Fk_Estado_Cuenta
               FROM dbo.Movimientos_Estado_Cuenta M
               WHERE M.Fk_Tipo_Movimiento_Estado_Cuenta = @ID_TipoDebitoXCompra
               AND Fecha = @inFecha
               GROUP BY M.Fk_Estado_Cuenta) S

         WHERE ID = S.Fk_Estado_Cuenta
       
        SELECT @TipoMov = Tipo FROM dbo.Tipo_Movimiento_Estado_Cuenta WHERE Nombre = 'Credito por compra a Comercio'

        INSERT INTO [dbo].[Movimientos_Estado_Cuenta]
                   ([Fk_Tipo_Movimiento_Estado_Cuenta]
                   ,[Fk_Estado_Cuenta]
                   ,[Fecha]
                   ,[Monto]
                   ,[PostIn]
                   ,[PostBy]
                   ,[PostDate])
             SELECT @ID_TipoCreditoXCompraComercio, MAX(E.ID), @inFecha, M.Monto * @TipoMov, @IPCLIENT, CURRENT_USER, CURRENT_TIMESTAMP
             FROM dbo.Estado_Cuenta E, dbo.Movimientos_Estado_Cuenta M
             WHERE M.Fecha = @inFecha
             AND M.Fk_Tipo_Movimiento_Estado_Cuenta = @ID_TipoDebitoXCompra
             AND M.Fk_CuentaComercio = E.Fk_Cuenta
             GROUP BY M.Monto
       
        SELECT @TipoMov = Tipo FROM dbo.Tipo_Movimiento_Estado_Cuenta WHERE Nombre = 'Debito por Comision Banco'

        INSERT INTO [dbo].[Movimientos_Estado_Cuenta]
                   ([Fk_Tipo_Movimiento_Estado_Cuenta]
                   ,[Fk_Estado_Cuenta]
                   ,[Fecha]
                   ,[Monto]
                   ,[PostIn]
                   ,[PostBy]
                   ,[PostDate])
             SELECT @ID_TipoDebitoXComisionBanco, MAX(E.ID), @inFecha, M.Monto * CONVERT(float, P.Valor) * @TipoMov, @IPCLIENT, CURRENT_USER, CURRENT_TIMESTAMP
             FROM dbo.Estado_Cuenta E, dbo.Movimientos_Estado_Cuenta M, dbo.Parametros P
             WHERE M.Fecha = @inFecha
             AND P.Nombre = 'Comision'
             AND M.Fk_Tipo_Movimiento_Estado_Cuenta = @ID_TipoCreditoXCompraComercio
             AND M.Fk_CuentaComercio = E.Fk_Cuenta
             GROUP BY M.Monto, P.Valor
       
        IF @@TRANCOUNT > 0
        BEGIN
            COMMIT TRAN Transaccion
        END
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN Transaccion
        END
    END CATCH
END
GO

 El siguiente SP se encarga de cargar los datos diarios del archivo XML. Lo que hace basicamente es abrir el XML y buscar en la fecha que se desea iterar. Se cargarán los datos para ese día y se correrán los SP que corresponden para ese día. Lo mostramos a continuación:

USE [II Proyecto - Banco]
GO

CREATE PROCEDURE BASP_CargarXMLFecha
   
    @inFecha date

AS
BEGIN
    BEGIN TRY

        SET LANGUAGE Spanish
        SET NOCOUNT ON

        DECLARE @IPCLIENT VARCHAR(15)
        SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))

        DECLARE @XMLwithOpenXML TABLE
        (
        ID INT IDENTITY PRIMARY KEY,
        XMLData XML,
        LoadedDateTime DATETIME
        )

        INSERT INTO @XMLwithOpenXML(XMLData, LoadedDateTime)
        SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
        FROM OPENROWSET(BULK 'C:\Users\Administrator\Desktop\Datos de Prueba - II Proyecto.xml', SINGLE_BLOB) AS x;

        DECLARE @XML AS XML, @hDoc AS INT

        SELECT @XML = XMLData FROM @XMLwithOpenXML

        EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

        BEGIN TRANSACTION Transaccion

        --Aqui empiezan los inserts
        --Movimientos
        INSERT INTO dbo.Movimientos_Estado_Cuenta(Fk_Tipo_Movimiento_Estado_Cuenta, Fk_Estado_Cuenta, Fk_CuentaComercio, Fecha, Monto, PostIn, PostBy, PostDate)
        SELECT Fk_Tipo_Movimiento_Estado_Cuenta, MAX(E.ID), CASE Fk_CuentaComercio
                                                                        WHEN 'null' THEN NULL
                                                                        ELSE CONVERT(int, Fk_CuentaComercio)
                                                                   END , Fecha, Monto, @IPCLIENT, CURRENT_USER, CURRENT_TIMESTAMP
        FROM dbo.Estado_Cuenta E, OPENXML(@hDoc, 'Proyecto/Registro/Dia/Pago')
        WITH
        (
        Fk_Tipo_Movimiento_Estado_Cuenta int 'FK_TipoMovEC',
        Fk_CuentaA int 'FK_Cuenta',
        Fk_CuentaComercio varchar(25) 'FK_CuentaComercioCompras',
        Fecha date 'Fecha',
        Monto money 'Monto'
        )
        WHERE Fecha = @inFecha
        AND Fk_CuentaA = E.Fk_Cuenta
        GROUP BY Fk_Tipo_Movimiento_Estado_Cuenta, Fk_CuentaA, Fk_CuentaComercio, Fecha, Monto

        EXEC sp_xml_removedocument @hDoc
       
        IF @@TRANCOUNT > 0
        BEGIN
            COMMIT TRAN Transaccion
        END
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRAN Transaccion
        END
    END CATCH
END
GO

El siguiente SP es muy sencillo. Solo correrá los SP diarios, así como el nombre lo indica.

USE [II Proyecto - Banco]
GO

CREATE PROCEDURE BASP_ProcesoDiario
   
    @inFecha date

AS
BEGIN
   
    EXEC dbo.BASP_CargarXMLFecha @inFecha
    EXEC dbo.BASP_CobrarCompra @inFecha
    --Aca van los SP de Meter y Sacar Plata
    EXEC dbo.BASP_MultaSaldoMinimo @inFecha
    EXEC dbo.BASP_CargosXServicio @inFecha
    EXEC dbo.BASP_MultaMaxRetiros @inFecha
    EXEC dbo.BASP_InteresAcumulado @inFecha
    EXEC dbo.BASP_Corte @inFecha

END
GO

 Y por último este SP genera las fechas para la simulación:

USE [II Proyecto - Banco]
GO

CREATE PROCEDURE BASP_SIMULACION

AS
BEGIN

    DECLARE @Fecha date = '2016-01-01'

    WHILE @Fecha < '2017-01-01'
    BEGIN
   
        EXEC dbo.BASP_ProcesoDiario @Fecha

        SET @Fecha = DATEADD(DAY, 1, @Fecha)

    END
END
GO







No hay comentarios:

Publicar un comentario