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

Entradas más populares de este blog

CargaXML

Crear TH