martes, 30 de junio de 2020

28-29-30/06/2020

Se termino el procesamiento de pagos:

   En el cual se consigue el id del recibo mas viejo respecto a la propiedad y al concepto de cobro que viene en la tabla de pagos:
    SET @idRecibo = (SELECT TOP 1 R.id 
FROM [dbo].[Recibos] R
INNER JOIN @Pagos P ON P.idTipoRecibo = R.id_CC
INNER JOIN [dbo].[Propiedad] PR ON PR.numFinca = P.numFinca AND PR.id = R.id_Propiedad
WHERE R.estado = 0 AND P.id = @idMenor
ORDER BY R.fecha ASC)

Despues se busca el comprobante de pago:
SET @idComprobante = (SELECT CP.id--ERROR
FROM [dbo].[ComprobantePago] CP
INNER JOIN [ReciboPagado] RP ON CP.id = RP.id_Comprobante
INNER JOIN [dbo].[Recibos] R ON R.id = RP.id_Recibo 
WHERE CP.fecha = @fechaOperacion AND R.id_Propiedad = @idPropiedad)
--SI NO EXISTE LO CREA
IF @idComprobante IS NULL
BEGIN
INSERT INTO [dbo].[ComprobantePago](fecha,total)
SELECT @fechaOperacion,0
SET @idComprobante = IDENT_CURRENT('[dbo].                                                                                                   [ComprobantePago]')
END

O se crea en el caso que no exista
Y despues se verifica si es necesario realizar un recibo por morosidad:

                                                SET @fechaVence = (SELECT fechaVence FROM [dbo].[Recibos] R
   INNER JOIN @idRecibosPagar idRP ON                                                                                                     idRP.idRecibo = R.id
   WHERE @idMenorRecibo = idRP.id)
IF @fechaVence <= @fechaOperacion
BEGIN

Y se genera el recibo por morosidad, al final al comprobante de pago se le actualiza el monto y se sigue con la iteracion:

                                                UPDATE [dbo].[ComprobantePago]
SET [total] = [total]+@montoRecibo+@montoMoratorio
WHERE id = @idComprobante
SET @idMenor = @idMenor+1


y generación de recibos:
    
DECLARE @dia int
--SET @dia  = DAY(@fecha)
INSERT INTO [dbo].[Recibos](id_CC,monto,estado,id_Propiedad,fecha,fechaVence)
SELECT 
CC.id,
CASE WHEN (CC.esFijo = 'Si' AND CC.id != 1) THEN CC.monto 
WHEN (CC.esImpuesto = 'Si') THEN P.valor/100*CCPo.valorPorcentual
WHEN (CC.id = 1) THEN 
CASE WHEN (P.M3acumuladosAgua-P.M3AcumuladosUltimoRecibo)*CCC.valorPorM3>CCC.montoMinimoRecibo
THEN (P.M3acumuladosAgua-P.M3AcumuladosUltimoRecibo)*CCC.valorPorM3
ELSE CCC.montoMinimoRecibo END
END,
0,
P.id,
@fecha,
DATEADD(d,CC.diasParaVencer,@fecha)
FROM [dbo].[CCDePropiedad] CCP 
INNER JOIN [dbo].[ConceptoDeCobro] CC ON CCP.id_CC = CC.id
INNER JOIN [dbo].[Propiedad] P ON CCP.id_Propiedad = P.id
FULL OUTER JOIN [dbo].[CCPorcentaje] CCPo ON CCPo.id = CC.id
FULL OUTER JOIN [dbo].[CCConsumo] CCC ON CCC.id = CC.id
WHERE CC.diaDeCobro = @dia

 solo falta probar reconexion y corte, y hay un problema con pagos esta tratando de establecer una variable y le retorna mas de un valor.

Durante los 3 días se trabajo aproximadamente 17h en total

Referencias:

sábado, 27 de junio de 2020

27/06/2020

Hoy se logro probar lo que teníamos hasta el momento con los nuevos XML, inserta todas las entidades básicas bien y guarda los cambios correspondientes en la bitácora de cambios, también procesa las transacciones de agua y los cambios de valor de propiedades bien, se corrigió un el SP que cambiaba los valores de las propiedades, este era masivo y estaba dando errores con los datos, los errores eran que almacenaba en la bitácora entidades con json desuse y json antes iguales a null por lo que investigue y no encontré solución, al final me pase a iterativo y funciono muy bien y esa fue la solución:


declare @jsonAntes varchar(500), @jsonDespues varchar(500), @idMenor int, @idMayor int, @insertedAt DATE
SELECT @idMenor = min([id]), @idMayor=max([id]) FROM inserted
SET @insertedAt = (SELECT fechaDeIngreso FROM inserted WHERE [id] = @idMenor)
WHILE @idMenor<=@idMayor
BEGIN
SET @jsonAntes = (SELECT [id], [valor], [direccion], [numFinca], [fechaDeIngreso],[M3acumuladosAgua],[M3AcumuladosUltimoRecibo]
FROM deleted WHERE [id] = @idMenor AND activo = 1
FOR JSON PATH)
SET @jsonDespues = (SELECT [id], [valor], [direccion], [numFinca], [fechaDeIngreso],[M3acumuladosAgua],[M3AcumuladosUltimoRecibo]
FROM inserted WHERE [id] = @idMenor AND activo = 1
FOR JSON PATH)
EXEC [dbo].[SP_BitacoraCambioInsert] 
@inIdEntityType = 1,
@inEntityID = @idMenor, 
@inJsonAntes = @jsonAntes,
@inJsonDespues = @jsonDespues, 
@inInsertedBy = 'usuario1', 
@inInsertedIn = '1.1787.0289',
@inInsertedAt = @insertedAt
SET @idMenor = @idMenor+1 
END



Ya esta implementado el proceso de los pagos pero no se ha probado.

Ya se implemento el SP que selecciona elementos de la bitácora dependiendo de la entidad y rangos de fechas:

DECLARE @fechaDesde DATE , @fechaHasta DATE
SET @fechaDesde = CONVERT(DATE,@inFechaDesde,121)
SET @fechaHasta = CONVERT(DATE,@inFechaHasta,121)
SELECT [jsonAntes],[jsonDespues],[insertedAt],U.nombre,[insertedIn] 
FROM [dbo].[BitacoraCambio] BC
INNER JOIN [dbo].[Usuario] U ON U.id = BC.insertedBy 
WHERE (insertedAt BETWEEN @fechaDesde AND @fechaHasta) 
AND (idEntityType = @inIdEntidad)


Referencias:

jueves, 25 de junio de 2020

25/6/2020

Hoy se termino el proceso de los consumos y ajustes de consumo, se implemento el método iterativo para esto, que consiste en sacar el id mas pequenno y el mas grande e iterar sobre ellos, dependiendo del tipo de movimiento que haya se decide que hacer por ejemplo si es de tipo 1 entonces seria simplemente una lectura, si es de tipo 2 seria un ajuste de crédito y si es de tipo 3 seria un ajuste de debito, esto se ve reflejado en los cases:



DECLARE @idMenor INT, @idMayor INT
SELECT @idMenor = min([id]), @idMayor=max([id]) FROM @inConsumo
BEGIN TRAN
WHILE @idMenor<=@idMayor
BEGIN
INSERT INTO [dbo].[MovConsumo](fecha,montoM3,lecturaConsumo,nuevoM3Consumo,id_Propiedad,idTipoMov)
SELECT 
C.Fecha,
CASE WHEN (C.idTipo = 1) THEN C.LecturaM3-P.M3acumuladosAgua
ELSE C.LecturaM3
END,
CASE WHEN (C.idTipo = 1) THEN C.LecturaM3
ELSE NULL
END,
CASE WHEN (C.idTipo = 1) THEN C.LecturaM3
WHEN (C.idTipo = 2) THEN P.M3acumuladosAgua-C.LecturaM3
ELSE P.M3acumuladosAgua+C.LecturaM3
END,
P.id,
C.idTipo
FROM [dbo].[Propiedad] P
INNER JOIN @inConsumo C ON C.numFinca = P.[numFinca]
WHERE C.id = @idMenor

UPDATE [Propiedad]
SET M3acumuladosAgua = CASE WHEN (C.idTipo = 1) THEN C.LecturaM3
WHEN (C.idTipo = 2) THEN M3acumuladosAgua-C.LecturaM3
ELSE M3acumuladosAgua+C.LecturaM3
END
FROM [Propiedad] P
INNER JOIN @inConsumo C ON C.numFinca = P.[numFinca]
WHERE C.id = @idMenor

SET @idMenor = @idMenor+1 
END

Se trabajo por 4h

miércoles, 24 de junio de 2020

22-24/6/2020



Se empezó a crear las tablas variables que almacenan los datos del xml y se envian a SPs:

Se empezó con la el proceso de pagar recibos: problema: evaluar si ya han pasado dias y cobrar la multa por esos dias.

Se finalizo proceso para cambiar el valor de las propiedades:
                        UPDATE [dbo].[Propiedad]
SET valor = NVP.nuevoValor
FROM [dbo].[Propiedad]
INNER JOIN @nuevosValProp NVP ON Propiedad.numFinca = NVP.numFinca 


Referencias:
https://www.c-sharpcorner.com/article/temporary-tables-and-table-variables-in-sql/#:~:text=So%20table%20variable%20is%20faster,Primary%20Key%20or%20Unique%20Constraint.&text=Whereas%2C%20Table%20variables%20are%20only%20visible%20in%20the%20created%20routine.

Horas trabajadas: 7h

lunes, 22 de junio de 2020

22/06/2020

Se actualizo el diagrama implementando nuevas clases para el modelo de credito-debito
Este es el diagrama actualmente.

Quedamos a espera de feedback del profesor.

Horas trabajadas 2h

sábado, 20 de junio de 2020

20-06-2020

* Se copio el proyecto web de la parte 1 y se agrego al repositorio de github.

* Se creo una nueva carpeta para contener todas las paginas del administrador, además se cambiaron todas las instrucciones que redireccionan a otro archivo para que ahora entren a este carpeta. También se movieron todos los archivos css a una nueva carpeta. Esto se hizo porque las paginas del administrador ahora se tienen que separar de las de un usuario corriente. Ejemplo del cambio realizado:
 " Response.Redirect("~/WebPages/Admin/StartPage.aspx"); "
 " <link rel="stylesheet" href="/css/Admin/StartPage.css" type="text/css" media="screen" /> "

* Se investigo como obtener la ip del usuario utilizando asp.net. El método que se uso para obtener la ip es el siguiente:
                    string userIp = Request.UserHostAddress;

* Ahora se guarda el nombre del usuario así como la ip una vez que se hace login.
     - Esto se hace utilizando las siguientes variables de sesión
                    HttpContext.Current.Session["userName"] = user;
                    HttpContext.Current.Session["userIp"] = userIp;

* Se añadieron los parámetros @inUsuarioACargo y @inIPusuario a todos los métodos que llamaban a un SP relacionan con un CRUD.
       cmd.Parameters.Add("@inUsuarioACargo", SqlDbType.VarChar).Value = Session["userName"];
       cmd.Parameters.Add("@inIPusuario", SqlDbType.VarChar).Value = Session["userIp"];

* Se creo la pagina inicial para el usuario corriente. Al iniciar sesión esta pagina  muestra las propiedades que el usuario puede ver

* Se dio un problema con servidor sql. El programa Microsoft SQl Server Management Studio daba un error a la hora de intentar conectar con el servidor. Investigando un poco se encontró que los servicios necesarios para el servidor estaban detenidos, así que se volvieron a iniciar. Para iniciar los servicios se debe abrir el programa sql server configuration manager, y en la pestaña sql server services activar todos los servicios.

* Se trabajó durante 2h 30m

Links:
https://github.com/madri308/proyectoBases/commit/de0f315ae284ccd99a25314f8f568ef12efaa90f
https://www.c-sharpcorner.com/article/get-ip-address-in-Asp-Net/
https://github.com/madri308/proyectoBases/commit/53efe1295f63c53c373dde9b08b910fcd8750906

martes, 16 de junio de 2020

16/6/2020

Ya se guardan todos los cambios en las tablas usuariosDePropiedad, propietariosDePropiedades, propietarios, usuarios y propiedades(Con trigger), el codigo que guarda todo esto es el siguiente:


--GUARDA EL ID y fecha
SET @insertedAt = GETDATE()
SET @idModified = (SELECT [id] FROM [dbo].[Usuario] WHERE [nombre] = @inNombreOriginal)
----GUARDA EL JSON DEL ROW DE USUARIO ANTES
SET @jsonAntes = (SELECT [id], [nombre], [password], [tipoDeUsuario], [fechaDeIngreso]
FROM [dbo].[Usuario] WHERE [id] = @idModified
FOR JSON PATH)
--ACTUALIZA AL USUARIO
UPDATE [dbo].[Usuario]
SET [nombre] = CASE @inNombre
WHEN '-1' THEN [nombre]
ELSE @inNombre
END,
[password]= CASE @inPassword
WHEN '-1' THEN [password]
ELSE @inPassword
END,
[tipoDeUsuario] = CASE @inTipoDeUsuario
WHEN '-1' THEN [tipoDeUsuario]
ELSE @inTipoDeUsuario
END
WHERE [nombre] = @inNombreOriginal AND [activo] = 1
--GUARDA EL JSON DEL ROW DE USUARIO DESPUES
SET @jsonDespues = (SELECT [id], [nombre], [password], [tipoDeUsuario], [fechaDeIngreso]
FROM [dbo].[Usuario] WHERE [id] = @idModified
FOR JSON PATH)
--INSERTA EL CAMBIO
EXEC [dbo].[SP_BitacoraCambioInsert] @inIdEntityType = 3,@inEntityID = @idModified, @inJsonAntes = @jsonAntes,
@inJsonDespues = @jsonDespues, @inInsertedBy = @inUsuarioACargo, 
@inInsertedIn = @inIPusuario, @inInsertedAt = @insertedAt



Este es un ejemplo para la actualizacion de usuarios pero para los demas es muy parecido, se generan los json antes y depsues de la modificacion. se genera el cambio y se ejecuta el SP que me inserta los cambios en la bitacora
Se trabajo 1 hora

lunes, 15 de junio de 2020

Problema "This binary file has changed"

Estábamos teniendo el problema de que los archivos .sql no se estaban viendo, y solo aparecía "This binary file has changed":


Buscando en internet nos dimos cuenta que era un asunto de formato de encoding, la manera en que Microsoft SQL managment studio estaba guardando los archivos hacia que github pensara que fueran archivos binarios. 
Encontramos varias soluciones para afrontar este problema, una fue agregar un archivo .gittribute en el cual se especificaba que ciertos archivos no debian tomarse como binarios, algo así como excepciones con la siguiente linea: *.sql text working-tree-encoding=UTF-16LE eol=CRLF

Esto lo intentamos pero a la hora de insertar archivos nos daba problemas de formato ya que no todos los .sql tenían ese problema por lo que utilizamos otra solución, que fue la siguiente:

  • En el path: C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\SqlWorkbenchProjectItems\Sql se encuentra el archivo SQLfile.sql
  • Este archivo se abría y se seleccionaba la manera de guardarlo con la opción de encode = utf8
  • Esto genera que todos los archivos generado por Microsoft SQL Server Management Studio que sean .sql se guardaran con ese formato, dicho formato si se puede visualizar en github.
  • Y se cambiaron los formatos de los archivos que ya se habían creado a encode = UTF8
  • Se actualizaron todos los archivos en github
  • Hicimos pruebas para verificar que con esto de ahora en adelante los cambios que se hagan en estos archivos se visualizaran y ademas los archivos que se creen nuevos también.
Todas las pruebas que realizamos se ven reflejadas en varios commits en el github.

Referencias:

Se duro aproximadamente 2h 30min investigando y solucionando el problema.