Procesar movimientos
Se dedicó 3 horas para crear el sp de procesamiento de movimientos del xml, se tardó más de lo esperado por problemas con los joins pero se logró resolver para que leyera correctamente.
USE [TC]
GO
/****** Object: StoredProcedure [dbo].[ProcesoMovimientos] Script Date: 12/2/2024 1:06:20 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ProcesoMovimientos]
@inFechaActual DATE
, @outCodeResult INT
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
--declaraciones
DECLARE @XMLDoc XML
-- almacena el contenido del xml de catalogos
SELECT @XMLDoc = CAST(BulkColumn AS XML)
FROM OPENROWSET(BULK 'C:\OperacionesFinal.xml'
, SINGLE_BLOB) AS x;
DECLARE @Mov_XML TABLE(
Nombre VARCHAR(16)
, TF VARCHAR(16)
, fechaMovimiento DATE
, Monto MONEY
, Descripcion VARCHAR(64)
, referencia VARCHAR(64))
INSERT INTO @Mov_XML(
Nombre
, TF
, fechaMovimiento
, Monto
, Descripcion
, referencia)
SELECT
XMLDATA.value('@Nombre', 'VARCHAR(16)')
, XMLDATA.value('@TF', 'VARCHAR(16)')
, XMLDATA.value('@FechaMovimiento', 'DATE')
, XMLDATA.value('@Monto', 'MONEY')
, XMLDATA.value('@Descripcion', 'VARCHAR(64)')
, XMLDATA.value('@Referencia', 'VARCHAR(64)')
FROM @XMLDoc.nodes(
'/root/fechaOperacion[@Fecha=sql:variable("@inFechaActual")]
/Movimiento/Movimiento')
AS T(XMLDATA);
BEGIN TRAN tprocesarMov
-- si el mov es en una tf inactiva es sospechoso
IF EXISTS (
SELECT 1
FROM @Mov_XML mov
INNER JOIN dbo.TF tf
ON tf.codigo = mov.TF
WHERE tf.esActiva = 0
)
BEGIN
CREATE TABLE #MovimientosSospechosos(
id INT IDENTITY(1,1)
, idTipoMovimiento INT
, idTF INT
, fechaMovimiento DATE
, Monto MONEY
, Descripcion VARCHAR(64)
, referencia VARCHAR(64))
INSERT INTO #MovimientosSospechosos(
idTipoMovimiento
, idTF
, fechaMovimiento
, Monto
, Descripcion
, referencia )
SELECT
tm.id
, tf.id
, mov.fechaMovimiento
, mov.Monto
, mov.Descripcion
, mov.referencia
FROM @Mov_XML mov
INNER JOIN dbo.TipoMovimiento tm ON tm.nombre = mov.Nombre
INNER JOIN dbo.TF tf ON tf.codigo = mov.TF
END
/* si no es sospechoso se hacen los incrementos
o rebajos en el saldo de la tcm asociada a la tf
y se inserta el movimiento */
ELSE
BEGIN
INSERT INTO dbo.Movimientos(
idTipoMovimiento
, idTF
, fechaMovimiento
, Monto
, Descripcion
, referencia )
SELECT
tm.id
, tf.id
, mov.fechaMovimiento
, mov.Monto
, mov.Descripcion
, mov.referencia
FROM @Mov_XML mov
INNER JOIN dbo.TipoMovimiento tm ON tm.nombre = mov.Nombre
INNER JOIN dbo.TF tf ON tf.codigo = mov.TF
-- debito suma, credito resta
UPDATE dbo.TCM
SET tcm.saldoActual = tcm.saldoActual +
CASE WHEN tm.Accion = 'Debito' THEN mov.Monto
ELSE -mov.Monto
END
FROM dbo.TCM tcm
INNER JOIN dbo.TF tf
ON tf.idTarjetaCredito = tcm.id
INNER JOIN dbo.Movimientos mov
ON mov.idTF = tf.id
INNER JOIN dbo.TipoMovimiento tm
ON tm.id = mov.idTipoMovimiento
WHERE tf.id = mov.idTF;
-- Si no es TCM, entonces es TCA
UPDATE dbo.TCM
SET tcm.saldoActual = tc.saldoActual +
CASE
WHEN tm.Accion = 'Debito' THEN mov.Monto
ELSE -mov.Monto
END
-- hay que conseguir la tcm a partir de la tca
FROM dbo.TCM tc
INNER JOIN dbo.TCA tca
ON tc.id = tca.idTCM
INNER JOIN dbo.TF tf
ON tf.idTarjetaCredito = tca.id
INNER JOIN dbo.Movimientos mov
ON mov.idTF = tf.id
INNER JOIN dbo.TipoMovimiento tm
ON tm.id = mov.idTipoMovimiento
WHERE tf.id = mov.idTF;
COMMIT TRAN tprocesarMov
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT >0
BEGIN
ROLLBACK TRAN tprocesarMov;
END;
INSERT INTO [dbo].[DBError] VALUES (
SUSER_SNAME(),
ERROR_NUMBER(),
ERROR_STATE(),
ERROR_SEVERITY(),
ERROR_LINE(),
ERROR_PROCEDURE(),
ERROR_MESSAGE(),
GETDATE()
);
SET @outCodeResult = 50005; -- error en BD
END CATCH
SET NOCOUNT OFF;
END;
Comentarios
Publicar un comentario