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