--|||StoreProcedures|||--
--Eliminar los datos de las tablas
CREATE PROCEDURE [dbo].[VaciarTablas]
AS
BEGIN
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?';
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
EXEC sp_MSForEachTable 'DELETE FROM ?';
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?';
EXEC sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 0)'
END
GO
--Leer Abonados del XML
CREATE PROCEDURE [dbo].[readXML_Abonados]
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Abonados.xml', SINGLE_BLOB) as Abonados(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_Abonados FROM OPENXML(@hDoc, 'XML/Abonado/dbo.Abonado')
WITH(
Nombre [nvarchar](50),
Identificacion int
)
begin
INSERT INTO Abonado(Nombre,Identificacion) SELECT Nombre,Identificacion FROM #tmp_Abonados
end
DROP TABLE #tmp_Abonados
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
return 0 --failed
END CATCH
END
GO
--Leer Tipos de servicio del XML
CREATE PROCEDURE [dbo].[readXML_TipoServicio]
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Tiposervicio.xml', SINGLE_BLOB) as TipoServicio(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_TipoServicio FROM OPENXML(@hDoc,'XML/TipoServicio/dbo.TipoServicio')
WITH(
Nombre [nvarchar](50),
Valor float,
Variable int
)
begin
INSERT INTO TipoServicio(Nombre,Valor,Variante) SELECT Nombre,Valor,Variable FROM #tmp_TipoServicio
end
DROP TABLE #tmp_TipoServicio
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
SELECT ERROR_MESSAGE() --MOSTRAR EL ERROR
return 0 --failed
END CATCH
END
GO
--Leer Municipalidades del XML
CREATE PROCEDURE [dbo].[readXML_Municipalidades]
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Municipalidades.xml', SINGLE_BLOB) as Municipalidades(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_Municipalidades FROM OPENXML(@hDoc,'XML/Municipalidades/dbo.Municipalidades')
WITH(
Nombre [nvarchar](50),
DiaEmite int,
DiaLimite int,
TasaInteres float,
ValorMAgua float
)
begin
INSERT INTO Municipalidad(Nombre,DiaEmite,DiaLimite,TasaInteresMorosidad,ValorMCubicoAgua)
SELECT Nombre,DiaEmite,DiaLimite,TasaInteres,ValorMAgua FROM #tmp_Municipalidades
end
DROP TABLE #tmp_Municipalidades
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
SELECT ERROR_MESSAGE() --MOSTRAR EL ERROR
return 0 --failed
END CATCH
END
GO
--Leer Propiedades del XML
CREATE PROCEDURE [dbo].[readXML_Propiedades]
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Propiedades.xml', SINGLE_BLOB) as Propiedades(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_Propiedades FROM OPENXML(@hDoc,'XML/Propiedades/dbo.Propiedades')
WITH(
NumeroFinca int,
IdMunicipalidad int,
IdAbonado int,
Descripcion nvarchar(100),
Valor money,
CodigoPostal int
)
begin
INSERT INTO Propiedad(NumeroFinca,FK_Municipalidad,FK_Abonado,Descripcion,Valor,CodPostal)
SELECT NumeroFinca,IdMunicipalidad,IdAbonado,Descripcion,Valor,CodigoPostal FROM #tmp_Propiedades
end
DROP TABLE #tmp_Propiedades
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
SELECT ERROR_MESSAGE() --MOSTRAR EL ERROR
return 0 --failed
END CATCH
END
GO
--Leer Servicios por propiedad del XML
CREATE PROCEDURE [dbo].[readXML_ServiciosXpropiedad]
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Servicioxpropiedad.xml', SINGLE_BLOB) as ServiciosXpropiedad(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_ServiciosXpropiedad FROM OPENXML(@hDoc,'XML/ServicioXPropiedad/dbo.ServicioXPropiedad')
WITH(
NumeroFinca int,
IDServicio int,
FechaContratacion Date
)
begin
INSERT INTO ServicioXPropiedad (FK_Propiedad,FK_Servicio,FechaContratacionServicio)
SELECT NumeroFinca,IDServicio,FechaContratacion FROM #tmp_ServiciosXpropiedad
end
DROP TABLE #tmp_ServiciosXpropiedad
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
SELECT ERROR_MESSAGE() --MOSTRAR EL ERROR
return 0 --failed
END CATCH
END
GO
---Lectura de consumo de agua
CREATE PROCEDURE readXML_Lectura @Fecha date
AS
BEGIN
DECLARE @xml xml
DECLARE @hdoc int
DECLARE @ID int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\ConsumoAgua.xml', SINGLE_BLOB) as ConsumoAgua(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_ConsumoAgua FROM OPENXML(@hDoc, 'XML/ConsumoAgua/dbo.ConsumoAgua')
WITH(
NumeroFinca int,
FechaLectura date,
QM3 int
)WHERE FechaLectura = @Fecha
begin
INSERT INTO ConsumoAgua(FK_Propiedad,FechaLectura,Q) SELECT dbo.Propiedad.ID,#tmp_ConsumoAgua.FechaLectura,#tmp_ConsumoAgua.QM3
FROM #tmp_ConsumoAgua INNER JOIN
dbo.Propiedad ON #tmp_ConsumoAgua.NumeroFinca = dbo.Propiedad.NumeroFinca
end
DROP TABLE #tmp_ConsumoAgua
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
return 0 --failed
END CATCH
END
GO
------Generar recibos
CREATE PROCEDURE [dbo].[generar_recibos] @IDMuni int , @Fecha date
AS
BEGIN
DECLARE @Propiedades table (ID int,NumeroFinca int)
DECLARE @Servicios table (ID int, FKServicio int, Nombre VARCHAR(30),valor FLOAT)
DECLARE @DAY int
DECLARE @MONTH int
DECLARE @YEAR int
DECLARE @FechaLimite date
DECLARE @MontoTotal Money = 0
DECLARE @ConsumoDeAgua float
DECLARE @ValorAgua float
DECLARE @FacturaID int
BEGIN TRY
begin tran
--Calcular la fecha limite de pago
SELECT @DAY = m.DiaLimite FROM Municipalidad m WHERE m.ID = @IDMuni
SELECT @YEAR = DATEPART ( YEAR , @Fecha)
SELECT @MONTH = DATEPART ( MONTH , @Fecha)
SELECT @FechaLimite = dateadd(mm, (@YEAR - 1900) * 12 + @MONTH - 1 , @DAY - 1)
INSERT INTO @Propiedades(ID,NumeroFinca) SELECT p.ID,p.NumeroFinca FROM Propiedad p WHERE p.FK_Municipalidad = @IDMuni
DECLARE @PropiedadId int = 0
WHILE(1 = 1)
BEGIN
SELECT @PropiedadId = MIN(ID)FROM @Propiedades WHERE ID > @PropiedadId
IF @PropiedadId IS NULL BREAK
BEGIN
--Calcular monto propiedades
--Llenar una tabla con lo servicios por cada propiedad.
INSERT INTO @Servicios(ID,FKServicio, Nombre ,valor) SELECT dbo.TipoServicio.ID,dbo.ServicioXPropiedad.FK_Servicio, dbo.TipoServicio.Nombre, dbo.TipoServicio.Valor
FROM dbo.ServicioXPropiedad INNER JOIN dbo.TipoServicio ON dbo.ServicioXPropiedad.FK_Servicio = dbo.TipoServicio.ID WHERE FK_Propiedad = @PropiedadId
--CREAR EL NUEVO RECIBO
INSERT INTO Recibo (FK_Propiedad,FechaEmision,PagoTotalNoIntereses,InteresMoratorio,TotalPagado,FechaLimite,FechaPagado)
VALUES ( @PropiedadId,@Fecha,0,0,0,@FechaLimite,NULL)
--Asigno el ID de factura
SELECT @FacturaID = MAX(ID) FROM Recibo
--Recorremos cada uno de los servicios de la propiedad
DECLARE @ServiciosId int = 0
WHILE(1 = 1)
BEGIN
SELECT @ServiciosId = MIN(ID)FROM @Servicios WHERE ID > @ServiciosId
IF @ServiciosId IS NULL BREAK
BEGIN
DECLARE @Monto float = 0
DECLARE @IDServicio int;
SELECT @IDServicio = ID FROM @Servicios WHERE ID = @ServiciosId
IF(@IDServicio=1)
BEGIN
--Sumar el valor del agua multiplicado por el precio de la ultima lectura
SELECT @ValorAgua = ts.Valor FROM @Servicios ts WHERE ts.ID = @IDServicio
SELECT TOP 1 @ConsumoDeAgua = Q FROM ConsumoAgua ca WHERE ca.FK_Propiedad = @PropiedadId ORDER BY ca.FechaLectura DESC
SET @MontoTotal = @MontoTotal+CAST(@ConsumoDeAgua*@ValorAgua AS MONEY)
--INSERTAR UNA LINEA
INSERT INTO Linea (FK_Propiedad,FK_Recibo,FK_TipoServicio,Monto,NumeroLinea) VALUES (@PropiedadId,@FacturaID,@ServiciosId,CAST(@ConsumoDeAgua*@ValorAgua AS MONEY),@IDServicio);
END
ELSE
BEGIN
--Sumar el valor de todos los servicios de una propiedad
SELECT @Monto = s.valor FROM @Servicios s WHERE s.ID = @IDServicio;
SET @MontoTotal = @MontoTotal+CAST(@Monto AS MONEY)
--INSERTAR UNA LINEA
INSERT INTO Linea (FK_Propiedad,FK_Recibo,FK_TipoServicio,Monto,NumeroLinea) VALUES (@PropiedadId,@FacturaID,@ServiciosId,CAST(@Monto AS MONEY),@IDServicio);
END
END
END
UPDATE Recibo SET PagoTotalNoIntereses = @MontoTotal WHERE ID = @FacturaID
END
DELETE FROM @Servicios
SET @MontoTotal = 0
END
commit tran
return 1
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
SELECT ERROR_MESSAGE() --MOSTRAR EL ERROR
return 0 --failed
END CATCH
END
GO
--Calculo de interes Moratorio
CREATE PROCEDURE [dbo].[CalculoInteresMoratorio] @Fecha Date
AS
BEGIN
DECLARE @TasaInteres float
DECLARE @DiasRetraso int
DECLARE @MuniID int
DECLARE @PropiedadID int
DECLARE @FechaLimite date
DECLARE @MontoTotal Money
DECLARE @MontoInteresMoratorio float
DECLARE @Recibos table (ID int,FK_Propiedad int,PagoTotalNoIntereses money,FechaLimite datetime)
BEGIN TRY
begin
begin tran
--DO HERE
INSERT INTO @Recibos(ID,FK_Propiedad,PagoTotalNoIntereses,FechaLimite) SELECT r.ID,r.FK_Propiedad,r.PagoTotalNoIntereses,r.FechaLimite FROM Recibo r WHERE r.TotalPagado = 0 AND r.FechaLimite < @Fecha
--SELECT * FROM @Recibos
DECLARE @RecibosId int = 0
WHILE(1 = 1)
BEGIN
SELECT @RecibosId = MIN(ID)FROM @Recibos WHERE ID > @RecibosId
IF @RecibosId IS NULL BREAK
BEGIN
-- Monto a Cobrar x (tasa de interese moratorio/360) x cantidad de días de atraso.
--Obtener FK_Propiedad
SELECT @PropiedadID = FK_Propiedad FROM @Recibos WHERE ID = @RecibosId
--Obtener el IDMunipal
SELECT @MuniID = p.FK_Municipalidad FROM Propiedad p WHERE p.ID = @PropiedadID
SELECT @TasaInteres = TasaInteresMorosidad FROM Municipalidad WHERE ID = @MuniID
--Obtener diferencia de dias
SELECT @FechaLimite = r.FechaLimite FROM @Recibos r WHERE r.ID = @RecibosId
SELECT @MontoTotal = re.PagoTotalNoIntereses FROM Recibo re WHERE ID = @RecibosID
SELECT @DiasRetraso = DATEDIFF(DAY,@FechaLimite,@Fecha)
SET @MontoInteresMoratorio = @MontoTotal*(@TasaInteres/360)* @DiasRetraso
UPDATE Recibo SET InteresMoratorio = @MontoInteresMoratorio WHERE ID = @RecibosID
END
END
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
return 0 --failed
END CATCH
END
GO
--Lectura de pagos
CREATE PROCEDURE [dbo].[readXML_Pagos] @Fecha date
AS
BEGIN
DECLARE @Pagos table (ID int identity(1,1),NumeroFinca int,FechaPago date)
DECLARE @xml xml
DECLARE @hdoc int
DECLARE @ID int
DECLARE @MontoInteres Money
DECLARE @MontoNoInteres Money
DECLARE @MontoTotal Money
DECLARE @PropiedadID int
DECLARE @ReciboID int
BEGIN TRY
SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data-P2\Pagos.xml',
SINGLE_BLOB) as Pagos(roow)
if (@xml IS NOT NULL)
begin
begin tran
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml
SELECT * INTO #tmp_Pagos FROM OPENXML(@hDoc, 'XML/Pagos/pago')
WITH(
NumeroFinca int,
FechaPago date
)WHERE FechaPago = @Fecha
begin
DECLARE @PractitionerId int = 0
WHILE(1 = 1)
BEGIN
SELECT @PractitionerId = MIN(NumeroFinca)FROM #tmp_Pagos WHERE NumeroFinca > @PractitionerId
IF @PractitionerId IS NULL BREAK
BEGIN
SELECT @PropiedadID = f.ID FROM Propiedad f WHERE f.NumeroFinca = @PractitionerId
--SELECT @PractitionerId,@PropiedadID
SELECT TOP 1 @ReciboID = re.ID FROM Recibo re WHERE re.FK_Propiedad = @PropiedadID ORDER BY re.FechaLimite DESC
SELECT @MontoNoInteres = re1.PagoTotalNoIntereses FROM Recibo re1 WHERE re1.ID = @ReciboID
SELECT @MontoInteres = re2.InteresMoratorio FROM Recibo re2 WHERE re2.ID = @ReciboID
--SELECT @MontoInteres,@MontoNoInteres,@MontoInteres+@MontoNoInteres
UPDATE Recibo SET TotalPagado = (@MontoNoInteres+@MontoInteres),FechaPagado = @Fecha WHERE Recibo.ID = @ReciboID
END
END
end
DROP TABLE #tmp_Pagos
end
commit tran
return 1 --successful
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
return 0 --failed
END CATCH
END
<Abonado>
<dbo.Abonado Nombre="Latonya Joyce" Identificacion = "1000" />
<dbo.Abonado Nombre="Carlton Cardenas" Identificacion = "1001" />
<dbo.Abonado Nombre="Charity Dickerson" Identificacion = "1002" />
<dbo.Abonado Nombre="Jacquelyn Banks" Identificacion = "1003" />
<dbo.Abonado Nombre="Mindy Garcia" Identificacion = "1004" />
<dbo.Abonado Nombre="Sonia Chang" Identificacion = "1005" />
<dbo.Abonado Nombre="Damon Bates" Identificacion = "1006" />
<dbo.Abonado Nombre="Evan Blair" Identificacion = "1007" />
<dbo.Abonado Nombre="Brenda Zuniga" Identificacion = "1008" />
<dbo.Abonado Nombre="Benny Macias" Identificacion = "1009" />
<dbo.Abonado Nombre="Leanne Patton" Identificacion = "1010" />
<dbo.Abonado Nombre="Leo Brown" Identificacion = "1011" />
<dbo.Abonado Nombre="Tabatha Rodriguez" Identificacion = "1012" />
<dbo.Abonado Nombre="Kelly Wood" Identificacion = "1013" />
<dbo.Abonado Nombre="Ericka Cruz" Identificacion = "1014" />
<dbo.Abonado Nombre="Jayson Stevens" Identificacion = "1015" />
<dbo.Abonado Nombre="Marco Lane" Identificacion = "1016" />
<dbo.Abonado Nombre="Vickie Curtis" Identificacion = "1017" />
<dbo.Abonado Nombre="Guillermo Wong" Identificacion = "1018" />
<dbo.Abonado Nombre="Alice Andrews" Identificacion = "1019" />
<dbo.Abonado Nombre="Roberto Davila" Identificacion = "1020" />
<dbo.Abonado Nombre="Lillian Kirk" Identificacion = "1021" />
<dbo.Abonado Nombre="Joanne Henderson" Identificacion = "1022" />
<dbo.Abonado Nombre="Debbie Brooks" Identificacion = "1023" />
<dbo.Abonado Nombre="Warren Mayer" Identificacion = "1024" />
<dbo.Abonado Nombre="Shawn Arnold" Identificacion = "1025" />
<dbo.Abonado Nombre="Tom Mc Intyre" Identificacion = "1026" />
<dbo.Abonado Nombre="Jose Horne" Identificacion = "1027" />
<dbo.Abonado Nombre="Wade Mullins" Identificacion = "1028" />
<dbo.Abonado Nombre="Randy Price" Identificacion = "1029" />
<dbo.Abonado Nombre="Larry Douglas" Identificacion = "1030" />
<dbo.Abonado Nombre="Grant Ritter" Identificacion = "1031" />
<dbo.Abonado Nombre="Wendi Glenn" Identificacion = "1032" />
<dbo.Abonado Nombre="Tamiko Guerra" Identificacion = "1033" />
<dbo.Abonado Nombre="Darla Valentine" Identificacion = "1034" />
<dbo.Abonado Nombre="Vickie Shannon" Identificacion = "1035" />
<dbo.Abonado Nombre="Nora Dudley" Identificacion = "1036" />
<dbo.Abonado Nombre="Josephine Dalton" Identificacion = "1037" />
<dbo.Abonado Nombre="Janet Jensen" Identificacion = "1038" />
<dbo.Abonado Nombre="Kurt Forbes" Identificacion = "1039" />
</Abonado>
</XML>