feat: implementado todo lo de auditoria tocaria testearlo nomás

This commit is contained in:
2025-01-27 20:13:15 -03:00
parent 7b1e70999f
commit 17fae0e777
20 changed files with 204 additions and 115 deletions

View File

@@ -0,0 +1,98 @@
using Entidades;
using Microsoft.EntityFrameworkCore;
namespace Modelo.Facade;
public class AuditoriaFacade {
private readonly AlquilaFacilContext _context;
private readonly FiltroCambios _filtradoDeCambios=new();
private readonly ValidadorDeCambios _validadorDeCambios=new();
private readonly PersistenciaLog _persistenciaDeLog=new();
public AuditoriaFacade(AlquilaFacilContext context) {
_context = context;
}
public void GenerarLog(long dniUsuario, string v) {
var cambios = _filtradoDeCambios.FiltrarCambios(_context.ChangeTracker.Entries());
var fechaActual = DateTime.Now;
var log = new Log{
Fecha = fechaActual,
Dniusuario = dniUsuario,
Accion = v
};
log.LogDetalles = ProcesarCambios(cambios, fechaActual, dniUsuario);
_persistenciaDeLog.GuardarLog(log, log.LogDetalles);
}
private List<LogDetalle> ProcesarCambios(IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> cambios,
DateTime fechaActual, long dniUsuario) {
var logDetalles = new List<LogDetalle>();
foreach (var cambio in cambios) {
var nombreTabla = cambio.Entity.GetType().Name;
Console.WriteLine($"Entidad: {cambio.Entity.GetType().Name}, Estado: {cambio.State}");
switch (cambio.State) {
case EntityState.Modified:
foreach (var propiedad in cambio.OriginalValues.Properties) {
if (propiedad.Name == "Token") break;
var valorAnterior = cambio.OriginalValues[propiedad]?.ToString();
var valorNuevo = cambio.CurrentValues[propiedad]?.ToString();
if (_validadorDeCambios.ValidarCambio(valorAnterior??"", valorNuevo??"")) {
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = valorAnterior,
ValorNuevo = valorNuevo
});
}
}
break;
case EntityState.Added:
foreach (var propiedad in cambio.CurrentValues.Properties) {
if (propiedad.Name == "Token") break;
var valorNuevo = cambio.CurrentValues[propiedad]?.ToString();
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = null,
ValorNuevo = valorNuevo
});
}
break;
case EntityState.Deleted:
foreach (var propiedad in cambio.OriginalValues.Properties) {
if (propiedad.Name == "Token") break;
var valorAnterior = cambio.OriginalValues[propiedad]?.ToString();
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = valorAnterior,
ValorNuevo = null
});
}
break;
default:
Console.WriteLine($"Estado no manejado: {cambio.State}");
break;
}
}
return logDetalles;
}
}

View File

@@ -0,0 +1,6 @@
namespace Modelo.Facade;
public class FiltroCambios {
public IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> FiltrarCambios(IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> cambios) {
return cambios.Where(c => c.Entity.GetType().Name != "EntidadExcluida");
}
}

View File

@@ -0,0 +1,11 @@
using Entidades;
namespace Modelo.Facade;
public class PersistenciaLog {
private AlquilaFacilContext _context {get{return new AlquilaFacilContext();}}
public void GuardarLog(Log log, IEnumerable<LogDetalle> detalles) {
var con = _context;
con.Logs.Add(log);
con.LogDetalles.AddRange(detalles);
con.SaveChanges();
}
}

View File

@@ -0,0 +1,6 @@
namespace Modelo.Facade;
public class ValidadorDeCambios {
public bool ValidarCambio(string valorAnterior, string valorNuevo) {
return !string.IsNullOrEmpty(valorNuevo) && valorAnterior != valorNuevo;
}
}

View File

@@ -1,4 +1,6 @@
using Entidades;
using Microsoft.EntityFrameworkCore;
using Modelo.Facade;
namespace Modelo;
@@ -9,6 +11,12 @@ public abstract class RepositorioBase<S>
private static readonly S instance = new();
public static S Singleton { get { return instance; }}
public void GenerarLog(AlquilaFacilContext context, long dni, string accion) {
var Auditoria = new AuditoriaFacade(context);
Auditoria.GenerarLog(dni, accion??"");
return;
}
public bool Guardar(AlquilaFacilContext context) {
bool ret = false;
try

View File

@@ -27,7 +27,7 @@ public class RepositorioCanons: RepositorioBase<RepositorioCanons> {
return cc;
}
public bool SetRecibo(Canon c, Recibo re) {
public bool SetRecibo(Canon c, Recibo re, long dni) {
var con = Context;
var cc = con.Canons
.Include(x=>x.Idcontratos)
@@ -51,10 +51,12 @@ public class RepositorioCanons: RepositorioBase<RepositorioCanons> {
ccc.IdpropiedadNavigation.Idestado = 3;
}
GenerarLog(con, dni, $"Set Recibo");
return Guardar(con);
}
public bool CrearCanons(decimal aumento, long idcontrato) {
public bool CrearCanons(decimal aumento, long idcontrato, long dni) {
var con = Context;
aumento/=100;
@@ -86,6 +88,8 @@ public class RepositorioCanons: RepositorioBase<RepositorioCanons> {
con.Canons.Add(c);
cont.Idcanons.Add(c);
}
GenerarLog(con, dni, $"Crear Canones");
return Guardar(con);
}
}

View File

@@ -14,7 +14,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
}
}
public bool CargaPrecontrato( Contrato? c = null, Notificacione? n = null) {
public bool CargaPrecontrato(long dni, Contrato? c = null, Notificacione? n = null) {
if (c == null || c.Habilitado == 1) return false;
if (n == null) return false;
var con = Context;
@@ -29,10 +29,10 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
con.Contratos.Add(c);
con.Notificaciones.Add(n);
GenerarLog(con, dni, $"CargaPrecontrato");
return Guardar(con);
}
public bool CargaGarantes(List<Garante> gar, string emailInquilino, int idpropiedad) {
public bool CargaGarantes(List<Garante> gar, string emailInquilino, int idpropiedad, long dni) {
var con = Context;
Contrato? contr = con.Contratos.Include(x=>x.DniinquilinoNavigation).Include(x=>x.Idgarantes)
.FirstOrDefault(x=>x.Idpropiedad == idpropiedad &&
@@ -48,7 +48,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
con.Garantes.Add(i);
contr.Idgarantes.Add(i);
}
GenerarLog(con, dni, $"Alta Garantes");
return Guardar(con);
}
@@ -75,7 +75,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
}
public bool CancelarPrecontrato(string emailInquilino, int idpropiedad) {
public bool CancelarPrecontrato(string emailInquilino, int idpropiedad, long dni) {
var con = Context;
Contrato? contr = con.Contratos.Include(x=>x.DniinquilinoNavigation)
.FirstOrDefault(x=>x.Idpropiedad == idpropiedad &&
@@ -86,6 +86,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
if (contr == null || contr.IdpropiedadNavigation == null) return false;
contr.Cancelado = 1;
contr.IdpropiedadNavigation.Idestado = 1;
GenerarLog(con, dni, $"Cancelar Precontrato");
return Guardar(con);
}
@@ -101,16 +102,17 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
return contr;
}
public bool AddUrl(long id, string nuevoNombreArchivo) {
public bool AddUrl(long id, string nuevoNombreArchivo, long dni) {
var con = Context;
Contrato? contrato = con.Contratos
.FirstOrDefault(x=>x.Id == id);
if (contrato == null) return false;
contrato.UrlContrato = nuevoNombreArchivo;
GenerarLog(con, dni, $"Añadido contrato");
return Guardar(con);
}
public bool AceptarContrato(long idcontrato) {
public bool AceptarContrato(long idcontrato, long dni) {
var con = Context;
Contrato? cont = con.Contratos
.Include(x=>x.Idcanons)
@@ -151,15 +153,18 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
cont.Idcanons.Add(can);
}
}
GenerarLog(con, dni, $"Aceptado contrato");
return Guardar(con);
}
public bool CancelarPrecontrato(long idcontrato) {
public bool CancelarPrecontrato(long idcontrato, long dni) {
var con = Context;
Contrato? cont = con.Contratos.Include(x=>x.IdpropiedadNavigation).FirstOrDefault(x=>x.Id ==idcontrato && x.Habilitado ==0);
if (cont == null|| cont.IdpropiedadNavigation==null) return false;
cont.Cancelado = 1;
cont.IdpropiedadNavigation.Idestado = 1;
GenerarLog(con, dni, $"Cancelar Precontrato");
return Guardar(con);
}
@@ -214,7 +219,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
return Guardar(con);
}
public bool CargaPrecontratoOpcionVenta(Contrato c, Notificacione n, Venta v) {
public bool CargaPrecontratoOpcionVenta(Contrato c, Notificacione n, Venta v, long dni) {
if (c == null || c.Habilitado == 1) return false;
if (n == null) return false;
var con = Context;
@@ -233,6 +238,7 @@ public class RepositorioContratos: RepositorioBase<RepositorioContratos> {
con.Ventas.Add(v);
con.Contratos.Add(c);
con.Notificaciones.Add(n);
GenerarLog(con, dni, $"Carga Precontrato con opcion venta");
return Guardar(con);
}

View File

@@ -4,18 +4,20 @@ using Microsoft.EntityFrameworkCore;
namespace Modelo;
public class RepositorioDefectos: RepositorioBase<RepositorioDefectos> {
public bool AltaDefecto(Defecto defecto){
public bool AltaDefecto(Defecto defecto, long dni){
var con = Context;
defecto.Id = con.Defectos.Any()? con.Defectos.Count()+1 : 1;
con.Defectos.Add(defecto);
GenerarLog(con, dni, $"Alta Defecto: {defecto.Id}");
return Guardar(con);
}
public bool MarcarPago(long iddefecto){
public bool MarcarPago(long iddefecto, long dni){
var con = Context;
var d = con.Defectos.FirstOrDefault(x=>x.Id == iddefecto);
if (d == null)return false;
d.Idestado = 2;
GenerarLog(con, dni, $"Marcado Pago Defecto: {iddefecto}");
return Guardar(con);
}

View File

@@ -4,19 +4,6 @@ using Microsoft.EntityFrameworkCore;
namespace Modelo;
public class RepositorioGrupos: RepositorioBase<RepositorioGrupos> {
public bool CrearGrupo(string descripcion)
{
var con = Context;
int mx = con.Grupos.Max(grupo => grupo.Id);
Grupo gru = new Grupo{
Id = mx+1,
Nombre = descripcion,
};
con.Grupos.Add(gru);
return Guardar(con);
}
public IQueryable<Permiso> ListarPermisosDeGrupo(string grupo) {
var con = Context;

View File

@@ -49,18 +49,4 @@ public class RepositorioPermisos: RepositorioBase<RepositorioPermisos> {
return tienePermiso;
}
#if DEBUG
public bool CrearPermiso(string descripcion) {
var con = Context;
int mx = con.Permisos.Max(x => x.Id);
Permiso per = new Permiso{
Id = mx+1,
Descripcion = descripcion
};
con.Permisos.Add(per);
return Guardar(con);
}
#endif
}

View File

@@ -70,7 +70,7 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades> {
return (int)filasInsertadasParam.Value == 1? true: false;
}
public bool PatchPropiedad(Propiedade prop) {
public bool PatchPropiedad(Propiedade prop, long dni) {
var con = Context;
Propiedade? propi = con.Propiedades.Include(x=>x.IdServicios).FirstOrDefault(x=>x.Id == prop.Id);
@@ -90,7 +90,7 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades> {
if (servi == null) return false;
propi.IdServicios.Add(servi);
}
GenerarLog(con, dni, $"Se modificó: {prop.Id}");
return Guardar(con);
}
@@ -156,23 +156,23 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades> {
}else{
prop.Idestado = 1;
}
GenerarLog(con, cli.Dni, $"Baja propiedad: {prop.Id}");
return Guardar(con);
}
public bool BajaPropiedad(int id) {
public bool BajaPropiedad(int id, long dni) {
var con = Context;
Propiedade? prop = con.Propiedades.FirstOrDefault(x=>x.Id == id);
if (prop == null||prop.Dnipropietario == 0) return false;
prop.Idestado = prop.Idestado == 3 ? 1 : 3;
GenerarLog(con, dni, $"Baja propiedad: {prop.Id}");
return Guardar(con);
}
public bool BajaServiciosAPropiedad(int idprop, List<int> idserv) {
public bool BajaServiciosAPropiedad(int idprop, List<int> idserv, long dni) {
var con = Context;
Propiedade? prop = con.Propiedades.Include(x=>x.IdServicios).FirstOrDefault(x => x.Id == idprop);
if (prop == null) return false;
@@ -186,7 +186,7 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades> {
prop.IdServicios.Remove(servicio);
}
}
GenerarLog(con, dni, $"Baja servicios a propiedad: {prop.Id}");
return Guardar(con);
}

View File

@@ -28,6 +28,7 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
if (cli.Dni == 0) return false;
cli.Idgrupos.Add(grupo);
GenerarLog(con, cli.Dni, $"Alta Inquilino: {cli.Dni}");
return Guardar(con);
}
@@ -52,6 +53,7 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
if (cli.Dni == 0) return false;
cli.Idgrupos.Add(grupo);
GenerarLog(con, cli.Dni, $"Alta Propietario: {cli.Dni}");
return Guardar(con);
}
@@ -67,7 +69,8 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
public bool CheckUsuario(LoginDto logindto) {
if (logindto.Contraseña ==null)return false;
string Contraseña = HacerHash(logindto.Contraseña);
Cliente? usu = Context.Clientes.FirstOrDefault(a => a.Email == logindto.Email);
@@ -137,6 +140,7 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
}
cli.Idgrupos.Add(gru);
GenerarLog(con, cli.Dni, $"Añadir grupo: {gru.Nombre}");
return Guardar(con);
}
@@ -150,6 +154,7 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
return false;
}
cli.Idgrupos.Remove(gru);
GenerarLog(con, cli.Dni, $"Eliminar de grupo: {gru.Nombre}");
return Guardar(con);
}
@@ -164,7 +169,7 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
} else {
cli.Habilitado = 0;
}
GenerarLog(con, cli.Dni, $"Baja cliente id: {cli.Dni}");
return Guardar(con);
}

View File

@@ -51,7 +51,7 @@ public class RepositorioVentas: RepositorioBase<RepositorioVentas> {
return venta;
}
public bool PatchVenta(Venta venta) {
public bool PatchVenta(Venta venta, long dni) {
var con = Context;
var a = con.Ventas.FirstOrDefault(x=>x.Id == venta.Id);
@@ -60,15 +60,16 @@ public class RepositorioVentas: RepositorioBase<RepositorioVentas> {
a.Idpropiedad = venta.Idpropiedad;
a.Fechainicio = venta.Fechainicio;
a.Idestado=2;
GenerarLog(con, dni, $"Se Ejercio la opcion de venta para la propiedad: {venta.Idpropiedad}");
return Guardar(con);
}
public bool SetUrlRecibo(long id, string nuevoNombreArchivo) {
public bool SetUrlRecibo(long id, string nuevoNombreArchivo, long dni) {
var con = Context;
var venta = con.Ventas.FirstOrDefault(x=>x.Id == id);
if (venta==null) return false;
venta.UrlRecibo = nuevoNombreArchivo;
GenerarLog(con, dni, $"Se seteo el recibo con nombre: {nuevoNombreArchivo}");
return Guardar(con);
}
}