diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 759c19d..008551d 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -6,11 +6,217 @@ using Entidades; using System.Linq.Expressions; using AlquilaFacil.StrategyBusquedaAdmin; using System.Diagnostics; +using AlquilaFacil.Builder; +using Minio.DataModel.Args; +using Minio; +using AlquilaFacil.Config; +using System.Text.Json; namespace AlquilaFacil.Controllers; [ApiController] public class AdminController: ControllerBase { + + [HttpGet("api/contratos/controlPagos")] + public IActionResult obtenerContratosInpagos([FromHeader(Name = "Auth")] string Auth) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); + if (validacion1 == false) return Unauthorized(); + + var contratos = RepositorioContratos.Singleton.ObtenerContratosInpagos(); + + List dtos = new(); + foreach (var i in contratos) { + if (i.DniinquilinoNavigation == null || i.IdpropiedadNavigation == null + || i.DnipropietarioNavigation == null) continue; + + var cont = new ContratoDtoBuilder() + .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") + .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) + .SetPropietario($"{i.DnipropietarioNavigation.Nombre} {i.DnipropietarioNavigation.Apellido}") + .SetId(i.Id) + .SetTipo(i.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion) + .SetFechaInicio(i.Fechainicio) + .SetEstado(i.Habilitado, i.Cancelado) + .Build(); + dtos.Add(cont); + } + return Ok(dtos); + } + + [HttpGet("api/contratos/controlPagos/propiedad")] + public IActionResult obtenerPropiedad([FromHeader(Name = "Auth")] string Auth, int id = 0) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + if (id <= 0) return BadRequest(new { message = "No hay propiedades con id igual o menor a 0"}); + var i = RepositorioContratos.Singleton.ObtenerContratoPorId(id); + if (i == null || i.DniinquilinoNavigation == null || + i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null)return BadRequest(new { message = "Fallo la query"}); + + var cont = new ContratoPropiedadDtoBuilder() + .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") + .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) + .SetId(i.Id) + .SetPropietario($"{i.DnipropietarioNavigation.Nombre} {i.DnipropietarioNavigation.Apellido}") + .SetTipo(i.IdpropiedadNavigation.IdtipropiedadNavigation.Descripcion) + .SetFechaInicio(i.Fechainicio) + .SetEstado(i.Habilitado, i.Cancelado) + .SetHabitaciones(i.IdpropiedadNavigation.Canthabitaciones) + .SetPiso(i.IdpropiedadNavigation.Piso??0) + .SetLetra(i.IdpropiedadNavigation.Letra??"") + .SetMesesAumento(i.MesesHastaAumento) + .SetMesesDuracion(i.MesesDurationContrato) + .Build(); + + return Ok(cont); + } + + private readonly IMinioClient mc; + public AdminController(IMinioClient minioClient) { + mc = minioClient; + if (mc == null){ + MinioConfigcus? mcon = JsonSerializer.Deserialize(System.IO.File.ReadAllText("./settings.json"))?? null; + if (mcon == null) throw new Exception(); + + mc = new MinioClient().WithCredentials(mcon.usr, mcon.scrt) + .WithEndpoint("192.168.1.11:9000") + .WithSSL(false) + .Build(); + } + } + [HttpGet("/api/admin/contrato/verDocumento")] + public IActionResult verDocumento([FromHeader(Name = "Auth")] string Auth, int idcontrato = 0){ + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + + Contrato? contr = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); + + try{ + var memstream = new MemoryStream(); + + var goa = new GetObjectArgs() + .WithBucket("alquilafacil") + .WithObject(contr.UrlContrato) + .WithCallbackStream(stream => { + memstream.Position=0; + stream.CopyTo(memstream); + }); + + mc.GetObjectAsync(goa).Wait(); + memstream.Position = 0; + + if (memstream.Length == 0) return BadRequest(new { message = "El archivo está vacío" }); + + return File(memstream, "application/pdf", contr.UrlContrato); + + } catch (Exception e){ + Console.Error.WriteLine(e); + return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + } + } + + [HttpGet("api/admin/contrato/canons")] + public IActionResult ObtenerCanones([FromHeader(Name="Auth")]string Auth, int id = 0){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); + if (cont == null) return BadRequest(new { message = "No existe el contrato"}); + + var list = RepositorioCanons.Singleton.ObtenerCanonsPorContrato(id); + if (list == null) return BadRequest(new { message = "No hay contrato por esa id"}); + + DateTime date = DateTime.Now; + bool ret =list.Any(x=>x.Pagado ==0 && date > x.Fecha); + if (ret == true) return BadRequest(new { message = "Este contrato no tiene canones vencidos"}); + + string divisa =""; + if (cont.Iddivisa == 0) divisa = "AR$"; else if (cont.Iddivisa == 1) divisa = "US$"; + + List d = new(); + + foreach (var i in list) { + var c = new CanonDtoBuilder() + .SetId(i.Id) + .SetPago(i.Idrecibo==null?false:true) + .SetDivisa(divisa==""?"Ugh esta mal cargado la divisa en el contrato":divisa) + .SetMes(i.Fecha) + .SetMesNum(int.Parse((i.Fecha.Month - cont.Fechainicio.Month).ToString()) + 1) + .SetMonto(i.Monto) + .Build(); + d.Add(c); + } + + return Ok(d); + } + + [HttpPost("api/admin/contrato/marcarPago")] + public IActionResult realizarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null)return Unauthorized(); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.Idcontrato); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id"}); + + Canon? c = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); + if (c == null) return BadRequest(new { message = "no hay un canon por esa id"}); + + Recibo re = new Recibo{ + Monto = c.Monto, + Fecha = DateTime.Now, + }; + + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni, "Admin Marca Recibo Como Pago"); + return ret ? + Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + } + + [HttpPost("api/admin/notificarInquilino")] + public IActionResult NotificarInquilino([FromHeader(Name ="Auth")]string Auth, NotificarAdmin data){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin"); + if (validacion1 == false) return Unauthorized(); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null)return Unauthorized(); + + if (data.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"}); + if (data.Idcontrato <= 0) return BadRequest(new {message = "La id de contrato no puede ser 0 o menor"}); + if (data.Idcanon <= 0) return BadRequest(new {message = "La id de contrato no puede ser 0 o menor"}); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(data.Idcontrato); + if (cont == null || cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null) return BadRequest(new { message = "no hay un contrato por esa id"}); + + Canon? can = RepositorioCanons.Singleton.ObtenerCanonPorId(data.Idcanon); + if (can == null)return BadRequest(new { message = "No existe un canon por esa id"}); + + var n = new NotificacioneBuilder() + .SetAccion("Notificacion Inquilino") + .SetMensaje(data.Mensaje) + .SetLeido(false) + .SetDnicliente(cont.DniinquilinoNavigation.Dni) + .SetDniremitente(cont.DnipropietarioNavigation.Dni) + .SetIdpropiedad(cont.IdpropiedadNavigation.Id) + .SetFecha(DateTime.Now) + .Build(); + var ret = RepositorioNotificaciones.Singleton.AltaNotificacion(n, cli.Dni); + return ret? + Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" }); + + } + [HttpGet("api/admin/clientes")] public IActionResult GetClientes([FromHeader(Name ="Auth")]string Auth){ if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -21,6 +227,46 @@ public class AdminController: ControllerBase return Ok(list); } + [HttpGet("api/admin/cliente")] + public IActionResult ObtenerCliente([FromHeader(Name ="Auth")]string Auth, long dni = 0){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); + if (validacion1 == false) return Unauthorized(); + if (dni <= 0) return BadRequest(new { message = "No puede haber un dni 0 o menor"}); + + Cliente? cambio = RepositorioUsuarios.Singleton.ObtenerClientePorDni(dni); + if (cambio == null) BadRequest(new { message = "no hay un cliente por ese dni"}); + + UpdateUsuarioAdmin a = new UpdateUsuarioAdmin{ + Apellido = cambio.Apellido, + Celular = cambio.Celular, + Domicilio = cambio.Domicilio, + Nombre = cambio.Nombre, + }; + + return Ok(a); + } + + [HttpPatch("api/admin/cliente")] + public IActionResult PatchCliente([FromHeader(Name ="Auth")]string Auth, [FromBody]UpdateUsuarioAdmin dto, [FromQuery]long dni=0){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); + if (validacion1 == false) return Unauthorized(); + if (dni <= 0) return BadRequest(new { message = "No puede haber un dni 0 o menor"}); + + var validacion2 = checkdto(dto); + if (validacion2 != "") return BadRequest(new { message = validacion2}); + + Cliente?cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + bool ret = RepositorioUsuarios.Singleton.PatchUsuario(dto, dni, cli.Dni); + + return ret? + Ok(new { message = "Se actualizaron los datos"}): + BadRequest(new { message = "Fallo al guardar los datos"}); + } + [HttpGet("api/admin/clientes/grupo")] public IActionResult GetGruposByCliente([FromHeader(Name ="Auth")]string Auth, [FromQuery]long Dni){ if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -38,12 +284,15 @@ public class AdminController: ControllerBase var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); if (validacion1 == false) return Unauthorized(); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); + if (data.email == "" || data.grupo == "") return BadRequest(new { message = "Faltan datos en la request" }); var ret = RepositorioUsuarios.Singleton.CheckGrupo(data.email, data.grupo); if (ret) return BadRequest(new { message = $"El usuario ya pertenece al grupo {data.grupo}"}); - var ret2 = RepositorioUsuarios.Singleton.AñadirClienteAGrupo(data.email, data.grupo); + var ret2 = RepositorioUsuarios.Singleton.AñadirClienteAGrupo(data.email, data.grupo, cli.Dni); return ret2 ? Ok(new {message = "Se Añadio al Grupo"}): BadRequest(new { message = "Fallo al añadirse al Grupo" }); } @@ -54,6 +303,10 @@ public class AdminController: ControllerBase var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); if (validacion1 == false) return Unauthorized(); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); + + if (data.email == "" || data.grupo == "") return BadRequest(new { message = "Faltan datos en la request" }); //una ward para que no me bloquee a mi mismo de tener acceso a admin @@ -74,7 +327,7 @@ public class AdminController: ControllerBase if ( ret5 == null || ret5.Where(x=>x.Habilitado == 0).Count() > 0) return BadRequest(new { message = "Aun tenes alquileres pendientes o fallo al intentar obtener la lista de alquileres, no se puede dar de baja"}); } - var ret2 = RepositorioUsuarios.Singleton.EliminarClienteAGrupo(data.email, data.grupo); + var ret2 = RepositorioUsuarios.Singleton.EliminarClienteAGrupo(data.email, data.grupo, cli.Dni); return ret2 ? Ok(new {message = $"Se elimino del Grupo: {data.grupo}"}): BadRequest(new { message = "Fallo al añadirse al Grupo" }); } @@ -117,8 +370,11 @@ public class AdminController: ControllerBase if (validacion1 == false) return Unauthorized(); if (id <= 0) return BadRequest(new { message = "Falto indicar id Propiedad"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); - var ret = RepositorioPropiedades.Singleton.BajaPropiedad(id); + var ret = RepositorioPropiedades.Singleton.BajaPropiedad(id, cli.Dni); return ret ? Ok(new {message = "Se cambio el estado de la propiedad"}): BadRequest(new { message = "No se pudo dar de baja"}); } @@ -149,4 +405,13 @@ public class AdminController: ControllerBase int ret = RepositorioPropiedades.Singleton.CuantasPaginasBusqueda(cantidadHabitaciones, servicios, tipoPropiedad, 0); return Ok(new { message = ret}); } + + private string checkdto(UpdateUsuarioAdmin d){ + string ret =""; + if (d.Nombre=="") ret+="Campo Nombre vacio\n"; + if (d.Apellido=="") ret+="Campo Apellido vacio\n"; + if (d.Celular=="") ret+="Campo Celular vacio\n"; + if (d.Domicilio=="")ret+="Campo Domicilio vacio\n"; + return ret; + } } \ No newline at end of file diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index 6c6e822..1f45809 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -82,10 +82,10 @@ public class ContratoController: ControllerBase { Recibo re = new Recibo{ Monto = c.Monto, - Fecha = c.Fecha, + Fecha = DateTime.Now, }; - bool ret = RepositorioCanons.Singleton.SetRecibo(c, re); + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); return ret ? Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); @@ -111,10 +111,10 @@ public class ContratoController: ControllerBase { Recibo re = new Recibo{ Monto = c.Monto, - Fecha = c.Fecha, + Fecha = DateTime.Now, }; - bool ret = RepositorioCanons.Singleton.SetRecibo(c, re); + bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); return ret ? Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); } @@ -133,7 +133,7 @@ public class ContratoController: ControllerBase { if (cont == null) return BadRequest(new { message = "no hay un contrato por esa id"}); if (cli.Dni != cont.Dnipropietario) return BadRequest(new {message = "No sos el propietario o intenta volviendote a logear"}); - var ret = RepositorioCanons.Singleton.CrearCanons(dto.aumento, dto.idcontrato); + var ret = RepositorioCanons.Singleton.CrearCanons(dto.aumento, dto.idcontrato, cli.Dni); return ret ? Ok(new { message = "Se crearon los canons correctamente"}):BadRequest(new { message = "No se pudo guardar"}); } @@ -352,14 +352,14 @@ public class ContratoController: ControllerBase { bool ret; if (dto.TieneOpcionVenta==false){ - ret = RepositorioContratos.Singleton.CargaPrecontrato(precontrato, notificacion); + ret = RepositorioContratos.Singleton.CargaPrecontrato(cli.Dni, precontrato, notificacion); } else { Venta v = new Venta{ Idestado = 1, Iddivisa = dto.iddivisa, Monto = dto.MontoOpcion, }; - ret = RepositorioContratos.Singleton.CargaPrecontratoOpcionVenta(precontrato, notificacion, v); + ret = RepositorioContratos.Singleton.CargaPrecontratoOpcionVenta(precontrato, notificacion, v, cli.Dni); } if (ret) { @@ -411,7 +411,7 @@ public class ContratoController: ControllerBase { var contr = RepositorioContratos.Singleton.ObtenerContrato(dto.EmailInquilino, dto.Idpropiedad); if (contr == null) return BadRequest(new { message = "No existe el contrato o ya fue activado"}); - var ret = RepositorioContratos.Singleton.CargaGarantes(gar, dto.EmailInquilino, dto.Idpropiedad); + var ret = RepositorioContratos.Singleton.CargaGarantes(gar, dto.EmailInquilino, dto.Idpropiedad, cli.Dni); if (ret) { Console.WriteLine(dto.fecha); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.fecha); @@ -440,6 +440,9 @@ public class ContratoController: ControllerBase { var validacion2 = ValidarCancelarDto(dto); if (validacion2 != "") return BadRequest(new {message = validacion2}); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli==null) return Unauthorized(); + Cliente? pro = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(dto.EmailPropietario); if (pro == null) return BadRequest(new {message = "No Existe Usuario con ese email"}); if (pro.Token != Auth) return BadRequest(new {message = "El token de auth no corresponde al token el usuario propietario"}); @@ -451,10 +454,10 @@ public class ContratoController: ControllerBase { var inq = RepositorioInquilinos.Singleton.ObtenerInquilinoPorEmail(dto.EmailInquilino); if (inq == null) return BadRequest(new {message = "No hay un inquilino por ese email"}); - var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.EmailInquilino, dto.idpropiedad); + var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.EmailInquilino, dto.idpropiedad, cli.Dni); if (ret) { prop.Idestado = 1; - ret = RepositorioPropiedades.Singleton.PatchPropiedad(prop); + ret = RepositorioPropiedades.Singleton.PatchPropiedad(prop, pro.Dni); if (ret){ RepositorioNotificaciones.Singleton.MarcarComoLeido(pro.Dni, dto.fecha); var noti = new NotificacioneBuilder() @@ -549,7 +552,7 @@ public class ContratoController: ControllerBase { bool ret = await subirContrato(contrato, nuevoNombreArchivo); if(ret == false) return BadRequest(new {message = "No se pudo subir el archivo"}); - ret = RepositorioContratos.Singleton.AddUrl(contr.Id, nuevoNombreArchivo); + ret = RepositorioContratos.Singleton.AddUrl(contr.Id, nuevoNombreArchivo, cli.Dni); if (ret == false) return BadRequest(new { message = "No se pudo guardar la url del contrato" }); var noti = new NotificacioneBuilder() @@ -670,7 +673,7 @@ public class ContratoController: ControllerBase { if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); if (cli.Dni != contr.Dniinquilino) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); - bool ret = RepositorioContratos.Singleton.AceptarContrato(dto.Idcontrato); + bool ret = RepositorioContratos.Singleton.AceptarContrato(dto.Idcontrato, cli.Dni); if (ret == false) return BadRequest(new { message ="fallo al aceptar el contrato"}); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); @@ -707,7 +710,7 @@ public class ContratoController: ControllerBase { if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); if (cli.Dni != contr.Dniinquilino) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); - var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.Idcontrato); + var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.Idcontrato, cli.Dni); if (ret == false) return BadRequest(new {message = "Fallo al intentar cancelar el precontrato"}); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); diff --git a/Aspnet/Controllers/DefectoController.cs b/Aspnet/Controllers/DefectoController.cs index a7f9fef..6096e7c 100644 --- a/Aspnet/Controllers/DefectoController.cs +++ b/Aspnet/Controllers/DefectoController.cs @@ -53,6 +53,9 @@ public class DefectoController: ControllerBase { var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); if (validacion1 == false) return Unauthorized(); + Cliente? cli =RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + string r = ValidarDto(data); if (r != "") return BadRequest(new { message = r }); @@ -65,7 +68,7 @@ public class DefectoController: ControllerBase { Idestado = 1, }; - var b = RepositorioDefectos.Singleton.AltaDefecto(defecto); + var b = RepositorioDefectos.Singleton.AltaDefecto(defecto, cli.Dni); return b ?Ok(new { message = "Se cargo el Defecto en el sistema"}):BadRequest(new { message ="No se pudo cargar el defecto en el sistema"}); } @@ -86,8 +89,11 @@ public class DefectoController: ControllerBase { var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); if (validacion1 == false) return Unauthorized(); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli==null) return Unauthorized(); + if (iddefecto<=0) return BadRequest(new { message = "No hay canones con id 0 o menor"}); - bool ret = RepositorioDefectos.Singleton.MarcarPago(iddefecto); + bool ret = RepositorioDefectos.Singleton.MarcarPago(iddefecto, cli.Dni); return ret ? Ok(new { message = "Se marco como pagado" }):BadRequest(new { message = "Fallo el acceso a la base de datos o no se encontro el defecto" }); diff --git a/Aspnet/Controllers/EstadisticaController.cs b/Aspnet/Controllers/EstadisticaController.cs index 93db4df..b00e5d9 100644 --- a/Aspnet/Controllers/EstadisticaController.cs +++ b/Aspnet/Controllers/EstadisticaController.cs @@ -17,6 +17,19 @@ public class EstadisticaController: ControllerBase { var a = RepositorioEstadisticas.Singleton.ObtenerDataIniciadosPorAño(year); return Ok(a); } + + [HttpGet("api/contrato/stats")] + public IActionResult ObtenerMesesPagos([FromHeader(Name ="Auth")]string Auth, long idcontrato=0){ + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) return Unauthorized(); + + if (idcontrato<=0) return BadRequest(new {message = "No puede tener un id contrato menor o igual a 0"}); + + var ret = RepositorioEstadisticas.Singleton.ObtenerDatosPagosContrato(idcontrato); + return Ok(ret); + } + [HttpGet("api/tabla/alquileresIniciados")] public IActionResult tablaalquileresIniciadosEsteAño([FromHeader(Name ="Auth")]string Auth, int year) { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); diff --git a/Aspnet/Controllers/GruposController.cs b/Aspnet/Controllers/GruposController.cs deleted file mode 100644 index be028f2..0000000 --- a/Aspnet/Controllers/GruposController.cs +++ /dev/null @@ -1,22 +0,0 @@ -#if DEBUG -using Microsoft.AspNetCore.Mvc; -using Modelo; -namespace AlquilaFacil.Controllers; - -[ApiController] -public class GruposController: ControllerBase { - [HttpPost("api/admin/grupos")] - public IActionResult CrearGrupo([FromBody] AdminGrupo grupo, [FromHeader(Name = "Auth")] string Auth) { - if (!string.IsNullOrEmpty(Auth)) return BadRequest(); - var ret2 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); - if (ret2 == false) return BadRequest(ret2); - - if (String.IsNullOrEmpty(grupo.descripcion)) return BadRequest(); - - bool ret = RepositorioGrupos.Singleton.CrearGrupo(grupo.descripcion); - return (ret) ? Ok(ret) : BadRequest(); - } -} - -public record AdminGrupo(string descripcion); -#endif \ No newline at end of file diff --git a/Aspnet/Controllers/LogsController.cs b/Aspnet/Controllers/LogsController.cs new file mode 100644 index 0000000..c232bd1 --- /dev/null +++ b/Aspnet/Controllers/LogsController.cs @@ -0,0 +1,62 @@ +using Entidades.Dto; +using Microsoft.AspNetCore.Mvc; +using Modelo; + +namespace AlquilaFacil.Controllers; + +[ApiController] +public class LogsController: ControllerBase { + + [HttpGet("/api/Logs")] + public IActionResult ObtenerLogs([FromHeader(Name = "Auth")] string Auth, int pag=1) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + if (validacion1 == false) return Unauthorized(); + if (pag<=0) return BadRequest(new { message = "no puede haber una pagina 0 o menor"}); + + pag-=1; + + var l = RepositorioLogs.Singleton.ObtenerLogsPaginado(pag); + List ll = new(); + foreach (var i in l) { + ll.Add(new LogDto{ + Fecha = i.Fecha, + Accion = i.Accion, + Dniusuario = i.Dniusuario, + }); + } + return Ok(ll); + } + + [HttpGet("/api/Logs/detalle")] + public IActionResult ObtenerLogs([FromHeader(Name = "Auth")] string Auth, [FromQuery]DateTime fecha, [FromQuery]long idusuario) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + if (validacion1 == false) return Unauthorized(); + if (idusuario<=0) return BadRequest(new { message = "no puede haber un id 0 o menor"}); + + var l = RepositorioLogs.Singleton.ObtenerDetallesLogs(fecha, idusuario); + List ll = new(); + foreach (var i in l) { + ll.Add(new LogDetalleDto{ + Fecha = i.Fecha, + Dniusuario = i.Dniusuario, + NombreTabla = i.NombreTabla, + Columna = i.Columna, + ValorAnterior = i.ValorAnterior, + ValorNuevo = i.ValorNuevo, + }); + } + return Ok(ll); + } + + [HttpGet("/api/Logs/cantPag")] + public IActionResult cantidadPaginas([FromHeader(Name = "Auth")] string Auth){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + if (validacion1 == false) return Unauthorized(); + + int c = RepositorioLogs.Singleton.ObtenerCantidadPaginas(); + return Ok(c); + } +} \ No newline at end of file diff --git a/Aspnet/Controllers/NotificacionesController.cs b/Aspnet/Controllers/NotificacionesController.cs index 3fadadd..76dc46b 100644 --- a/Aspnet/Controllers/NotificacionesController.cs +++ b/Aspnet/Controllers/NotificacionesController.cs @@ -121,4 +121,38 @@ public class NotificacionesController: ControllerBase { return ret? Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" }); } + + [HttpPost("api/notificar/ConsultaCompra")] + public IActionResult EnviarConsultaCompra([FromHeader(Name ="Auth")]string Auth, AltaNotificacionDto dto) { + if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + + if (dto.Accion == "") return BadRequest(new{message = "El campo Accion esta vacio"}); + if (dto.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"}); + + Cliente?cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + + Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(dto.Propiedad); + if (prop == null) return BadRequest(new { message = "No hay una propiedad con id 0 o menor"}); + + var n = new NotificacioneBuilder() + .SetAccion("Consulta Compra") + .SetMensaje(dto.Mensaje) + .SetLeido(false) + .SetDnicliente(prop.Dnipropietario??0) + .SetDniremitente(cli.Dni) + .SetIdpropiedad(prop.Id) + .SetFecha(DateTime.Now) + .Build(); + var ret2= RepositorioNotificaciones.Singleton.AltaNotificacion(n, cli.Dni); + return ret2? + Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" }); + + } } \ No newline at end of file diff --git a/Aspnet/Controllers/PermisosController.cs b/Aspnet/Controllers/PermisosController.cs deleted file mode 100644 index a63f9a1..0000000 --- a/Aspnet/Controllers/PermisosController.cs +++ /dev/null @@ -1,23 +0,0 @@ -#if DEBUG -using System.Text.Json; -using Microsoft.AspNetCore.Mvc; -using Modelo; -namespace AlquilaFacil.Controllers; - -[ApiController] -public class PermisosController: ControllerBase { - [HttpPost("api/admin/permisos")] - public IActionResult CrearPermisos([FromBody] AdminPermiso permiso, [FromHeader(Name = "Auth")] string Auth) { - if (!string.IsNullOrEmpty(Auth)) return BadRequest(); - var ret2 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); - if (ret2 == false) return BadRequest(ret2); - - if (String.IsNullOrEmpty(permiso.descripcion)) return BadRequest(); - - bool ret = RepositorioPermisos.Singleton.CrearPermiso(permiso.descripcion); - return (ret) ? Ok(ret) : BadRequest(); - } -} - -public record AdminPermiso(string descripcion); -#endif \ No newline at end of file diff --git a/Aspnet/Controllers/PropiedadesController.cs b/Aspnet/Controllers/PropiedadesController.cs index 26f34b6..5b03bbc 100644 --- a/Aspnet/Controllers/PropiedadesController.cs +++ b/Aspnet/Controllers/PropiedadesController.cs @@ -25,6 +25,72 @@ public class PropiedadesController: ControllerBase { return Ok(ret); } + [HttpGet("/api/propiedades/Venta")] + public IActionResult ObtenerPropiedadesParaVenta([FromHeader(Name = "Auth")] string Auth, int pag = 0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + + if (pag<=0) return BadRequest(new { message = "no existe una pagina 0"}); + + pag-=1; + + var props = RepositorioPropiedades.Singleton.ObtenerPropiedadesEnVenta(pag); + if (props == null) return BadRequest(new { message = "no tengo claro que fallo creo que no existen propiedades en venta"}); + + List l = new(); + + foreach (var i in props) { + var p = new PropiedadesVentaDto{ + Id = i.Id, + Ubicacion = i.Ubicacion, + Canthabitaciones = i.Canthabitaciones, + Divisa = i.IddivisaNavigation.Signo, + Letra = i.Letra??"", + Monto = i.Monto, + Piso = i.Piso??0, + Servicios =string.Join(", ", i.IdServicios.Select(s => s.Descripcion)), + Tipo = i.IdtipropiedadNavigation.Descripcion, + }; + l.Add(p); + } + + int cantpag = RepositorioPropiedades.Singleton.ObtenerPaginasDePropiedadesEnVenta(); + + return Ok(new { propiedades = l, cantpaginas = cantpag}); + } + + [HttpGet("api/propiedades/Venta/Propietario")] + public IActionResult ObtenerPropiedadesVentaDePropietario( [FromHeader(Name = "Auth")] string Auth){ + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var props = RepositorioPropiedades.Singleton.ObtenerPropiedadesAVentaPorDni(cli.Dni); + List ll = new(); + + foreach (var i in props) { + var a = new PropiedadesDto { + id = i.Id, + Ubicacion = i.Ubicacion, + canthabitaciones = i.Canthabitaciones, + Iddivisa = i.Iddivisa, + letra = i.Letra??"", + Monto = (int)i.Monto, //mmmm + piso = i.Piso??0, + Servicios = string.Join(", ", i.IdServicios.Select(x => x.Descripcion)), + Tipo = i.IdtipropiedadNavigation.Descripcion, + }; + ll.Add(a); + } + return Ok(ll); + } + [HttpGet("api/propiedad")] public IActionResult ObtenerPropiedadPorId(int Id, [FromHeader(Name = "Auth")] string Auth) { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -146,7 +212,7 @@ public class PropiedadesController: ControllerBase { Iddivisa = propiedad.Iddivisa, }; - bool ret = RepositorioPropiedades.Singleton.PatchPropiedad(Prop); + bool ret = RepositorioPropiedades.Singleton.PatchPropiedad(Prop, cli.Dni); return (ret)? Ok(new {message = "Fue modificado Correctamente"}): BadRequest(new {message = "Fallo al modificar la base de datos"}); @@ -203,11 +269,13 @@ public class PropiedadesController: ControllerBase { if (servicio.idServicios.Count() < 1) return BadRequest(new {message ="Falta añadir servicios"}); if (servicio.idServicios.Any(x => x<= 0)) return BadRequest(new {message ="No tienen haber ids negativas o cero de servicio"}); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + var serv = RepositorioServicios.Singleton.ObtenerServiciosPorPropiedad(servicio.propiedadid); var repetidos = serv.Intersect(servicio.idServicios); - bool ret = RepositorioPropiedades.Singleton.BajaServiciosAPropiedad(servicio.propiedadid, servicio.idServicios); + bool ret = RepositorioPropiedades.Singleton.BajaServiciosAPropiedad(servicio.propiedadid, servicio.idServicios, cli.Dni); return ret ? Ok(new {message ="Se Eliminaron los servicios seleccionados de la propiedad"}) : BadRequest(new {message ="Fallo al eliminarse los servicios de la propiedad"}); diff --git a/Aspnet/Controllers/VentaController.cs b/Aspnet/Controllers/VentaController.cs index b9857dd..6518713 100644 --- a/Aspnet/Controllers/VentaController.cs +++ b/Aspnet/Controllers/VentaController.cs @@ -14,6 +14,145 @@ namespace AlquilaFacil.Controllers; [ApiController] public class VentaController:ControllerBase { + [HttpPost("api/venta/AceptarConsultaVenta")] + public IActionResult AceptarConsultaVenta([FromHeader(Name="Auth")]string Auth, NotificacionMarcarLeidoDto dto) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + if (dto.Email == "") return BadRequest(new { message = "Falta dato Email"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) Unauthorized(); + if (cli.Email != dto.Email) return BadRequest(new {message = "El token de autorizacion no corresponde a tu usuario"}); + RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); + + Notificacione? n = RepositorioNotificaciones.Singleton.ObtenerNotificacionPorKeys(cli.Dni, dto.Fecha); + if (n == null) return BadRequest(new { message = "No se encuentra la notificacion"}); + + Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(n.Idpropiedad); + if (prop == null) return BadRequest(new { message = "No se encuentra una propiedad por ese id"}); + Venta? v = new Venta{ + Fechainicio = DateTime.Now, + IdVendedor = prop.Dnipropietario, + IdComprador = n.Dniremitente, + Monto = prop.Monto, + Idpropiedad = prop.Id, + Iddivisa = prop.Iddivisa, + Idestado = 2, + + }; + + bool ret = RepositorioVentas.Singleton.IniciarVenta(v, cli.Dni); + if (ret){ + var noti = new NotificacioneBuilder() + .SetAccion("Notificacion") + .SetMensaje("Debe Realizar el pago para que se registre el traspaso de la propiedad") + .SetLeido(false) + .SetDnicliente(n.Dniremitente) + .SetDniremitente(n.Dnicliente) + .SetIdpropiedad(n.Idpropiedad) + .SetFecha(DateTime.Now) + .Build(); + ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); + } + return ret? + Ok(new { message = "Se inicio la venta"}):BadRequest(new { message ="fallo al iniciar la venta"}); + } + + [HttpPost("api/venta/CancelarConsultaVenta")] + public IActionResult CancelarConsultaVenta([FromHeader(Name="Auth")]string Auth, NotificacionMarcarLeidoDto dto) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + + if (dto.Email == "") return BadRequest(new { message = "Falta dato Email"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) Unauthorized(); + if (cli.Email != dto.Email) return BadRequest(new {message = "El token de autorizacion no corresponde a tu usuario"}); + + RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); + Notificacione? n = RepositorioNotificaciones.Singleton.ObtenerNotificacionPorKeys(cli.Dni, dto.Fecha); + var noti = new NotificacioneBuilder() + .SetAccion("Notificacion") + .SetMensaje("El propietario no quiere vender") + .SetLeido(false) + .SetDnicliente(n.Dniremitente) + .SetDniremitente(n.Dnicliente) + .SetIdpropiedad(n.Idpropiedad) + .SetFecha(DateTime.Now) + .Build(); + + var ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); + return ret ? + Ok(new{message = "Se Envio una notificacion"}):BadRequest(new{message = "Fallo al Descartar Consulta"}); + } + + [HttpGet("/api/propiedad/EstaALaVenta")] + public IActionResult EstaALaVenta([FromHeader(Name="Auth")]string Auth, int idprop=0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + if (idprop<=0) return BadRequest(new { message = "No hay propiedades con id 0 o menor"}); + + Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(idprop); + if (prop == null) return BadRequest(new { message = "No hay propiedades por ese id"}); + return Ok(new { EstaAVenta = prop.Idestado ==4?true:false}); + } + + [HttpPut("/api/propiedad/setPropiedadAVenta")] + public IActionResult setPropiedadAVenta([FromHeader(Name="Auth")]string Auth, SetVentaDto dto) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + + if (dto.iddivisa != 0 && dto.iddivisa!=1) return BadRequest(new { message = "no hay una divisa por esa id"}); + if (dto.idpropiedad<=0) return BadRequest(new { message = "No hay propiedades con id 0 o menor"}); + if (dto.monto<1) return BadRequest(new { message = "No se pueden hacer ventas por montos menores a 1"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(dto.idpropiedad); + if (prop == null) return BadRequest(new { message = "No hay propiedades por ese id"}); + + if (cli.Dni != prop.Dnipropietario) return Unauthorized(); + + var ret = RepositorioVentas.Singleton.SetVenta(prop.Id, dto.monto, dto.iddivisa, cli.Dni); + return ret? + Ok(new { message = "Se puso la propiedad de venta"}) : BadRequest(new { message = "No se pudo poner a la Venta"}); + } + + [HttpPut("/api/propiedad/unsetPropiedadAVenta")] + public IActionResult unsetPropiedadAVenta([FromHeader(Name="Auth")]string Auth, SetVentaDto dto) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false) { + return Unauthorized(); + } + + if (dto.iddivisa != 0 && dto.iddivisa!=1) return BadRequest(new { message = "no hay una divisa por esa id"}); + if (dto.idpropiedad<=0) return BadRequest(new { message = "No hay propiedades con id 0 o menor"}); + if (dto.monto<1) return BadRequest(new { message = "No se pueden hacer ventas por montos menores a 1"}); + + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(dto.idpropiedad); + if (prop == null) return BadRequest(new { message = "No hay propiedades por ese id"}); + + if (cli.Dni != prop.Dnipropietario) return Unauthorized(); + + bool ret = RepositorioVentas.Singleton.UnSetVenta(prop.Id, dto.monto, dto.iddivisa, cli.Dni); + + return ret? + Ok(new { message = "Se Bajo la propiedad de venta"}) : BadRequest(new { message = "No se pudo Bajar de venta"}); + } + [HttpPost("/api/ventas/ejercerOpcionVenta")] public IActionResult EjercerOpcionVenta([FromHeader(Name="Auth")]string Auth, [FromQuery]long idcontrato=0) { var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); @@ -36,7 +175,7 @@ public class VentaController:ControllerBase { venta.Idpropiedad = cont.Idpropiedad; venta.Fechainicio = DateTime.Now; - bool ret = RepositorioVentas.Singleton.PatchVenta(venta); + bool ret = RepositorioVentas.Singleton.PatchVenta(venta, cli.Dni); return ret? Ok(new { message = "Se ejercio la opcion de venta"}): @@ -44,7 +183,7 @@ public class VentaController:ControllerBase { } [HttpPost("/api/ventas/subirReciboPago")] - public async Task SubirRecibo([FromHeader(Name="Auth")]string Auth, [FromForm]IFormFile file, long idventa ) { + public async Task SubirRecibo([FromHeader(Name="Auth")]string Auth, IFormFile file, long idventa ) { if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); if (validacion1 == false){ @@ -72,7 +211,7 @@ public class VentaController:ControllerBase { bool ret = await subirContrato(file, nuevoNombreArchivo); if(ret == false) return BadRequest(new {message = "No se pudo subir el archivo"}); - ret = RepositorioVentas.Singleton.SetUrlRecibo(venta.Id, nuevoNombreArchivo); + ret = RepositorioVentas.Singleton.SetUrlRecibo(venta.Id, nuevoNombreArchivo, cli.Dni); if (ret == false) return BadRequest(new { message = "no se pudo guardar el nombre del archivo subido"}); return Ok(new { message = "Se Subio el Recibo"}); diff --git a/Entidades/Admin/NotificarAdmin.cs b/Entidades/Admin/NotificarAdmin.cs new file mode 100644 index 0000000..2205b50 --- /dev/null +++ b/Entidades/Admin/NotificarAdmin.cs @@ -0,0 +1,6 @@ +namespace Entidades.Admin; +public class NotificarAdmin { + public string Mensaje { get; set; }=""; + public long Idcontrato{get;set;} + public long Idcanon {get; set;} +} \ No newline at end of file diff --git a/Entidades/Admin/UpdateUsuarioAdmin.cs b/Entidades/Admin/UpdateUsuarioAdmin.cs new file mode 100644 index 0000000..97846fc --- /dev/null +++ b/Entidades/Admin/UpdateUsuarioAdmin.cs @@ -0,0 +1,8 @@ +namespace Entidades.Admin; +public class UpdateUsuarioAdmin { + public string Nombre { get; set; } = null!; + public string Apellido { get; set; } = null!; + public string Domicilio { get; set; } = null!; + public string Celular { get; set; } = null!; + +} \ No newline at end of file diff --git a/Entidades/Alquilafacilcontext.cs b/Entidades/Alquilafacilcontext.cs index 286427c..1412713 100644 --- a/Entidades/Alquilafacilcontext.cs +++ b/Entidades/Alquilafacilcontext.cs @@ -35,6 +35,10 @@ public partial class AlquilaFacilContext : DbContext public virtual DbSet Grupos { get; set; } + public virtual DbSet Logs { get; set; } + + public virtual DbSet LogDetalles { get; set; } + public virtual DbSet Notificaciones { get; set; } public virtual DbSet Permisos { get; set; } @@ -324,7 +328,7 @@ public partial class AlquilaFacilContext : DbContext .HasColumnType("int(11)") .HasColumnName("id"); entity.Property(e => e.Descripcion) - .HasMaxLength(11) + .HasMaxLength(30) .HasColumnName("descripcion"); }); @@ -417,6 +421,62 @@ public partial class AlquilaFacilContext : DbContext .HasColumnName("nombre"); }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Fecha, e.Dniusuario }).HasName("PRIMARY"); + + entity.ToTable("Log"); + + entity.HasIndex(e => e.Dniusuario, "fk_log_clientes"); + + entity.Property(e => e.Fecha) + .HasColumnType("datetime") + .HasColumnName("fecha"); + entity.Property(e => e.Dniusuario) + .HasColumnType("bigint(20)") + .HasColumnName("dniusuario"); + entity.Property(e => e.Accion) + .HasMaxLength(255) + .HasColumnName("accion"); + + entity.HasOne(d => d.DniusuarioNavigation).WithMany(p => p.Logs) + .HasForeignKey(d => d.Dniusuario) + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_log_clientes"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.Id, e.Fecha, e.Dniusuario, e.NombreTabla, e.Columna }).HasName("PRIMARY"); + + entity.ToTable("LogDetalle"); + + entity.HasIndex(e => new { e.Fecha, e.Dniusuario }, "LogDetalle_ibfk_1"); + + entity.Property(e => e.Id) + .HasColumnType("int(11)") + .HasColumnName("id"); + entity.Property(e => e.Fecha) + .HasColumnType("datetime") + .HasColumnName("fecha"); + entity.Property(e => e.Dniusuario) + .HasColumnType("bigint(20)") + .HasColumnName("dniusuario"); + entity.Property(e => e.NombreTabla).HasColumnName("nombreTabla"); + entity.Property(e => e.Columna).HasColumnName("columna"); + entity.Property(e => e.ValorAnterior) + .HasColumnType("text") + .HasColumnName("valorAnterior"); + entity.Property(e => e.ValorNuevo) + .HasColumnType("text") + .HasColumnName("valorNuevo"); + + entity.HasOne(d => d.Log).WithMany(p => p.LogDetalles) + .HasForeignKey(d => new { d.Fecha, d.Dniusuario }) + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("LogDetalle_ibfk_1"); + }); + modelBuilder.Entity(entity => { entity.HasKey(e => new { e.Dnicliente, e.Fecha }).HasName("PRIMARY"); diff --git a/Entidades/Cliente.cs b/Entidades/Cliente.cs index 9f69cbb..4fe77e0 100644 --- a/Entidades/Cliente.cs +++ b/Entidades/Cliente.cs @@ -27,6 +27,8 @@ public partial class Cliente public virtual ICollection ContratoDnipropietarioNavigations { get; set; } = new List(); + public virtual ICollection Logs { get; set; } = new List(); + public virtual ICollection NotificacioneDniclienteNavigations { get; set; } = new List(); public virtual ICollection NotificacioneDniremitenteNavigations { get; set; } = new List(); diff --git a/Entidades/Dto/PropiedadesVentaDto.cs b/Entidades/Dto/PropiedadesVentaDto.cs new file mode 100644 index 0000000..84cfc2b --- /dev/null +++ b/Entidades/Dto/PropiedadesVentaDto.cs @@ -0,0 +1,12 @@ +namespace Entidades.Dto; +public class PropiedadesVentaDto { + public int Id { get; set; } + public string Ubicacion { get; set; } = ""; + public int Canthabitaciones { get; set; } + public int Piso { get; set; } + public string Letra { get; set; } = ""; + public string Tipo { get; set; } = ""; + public string? Servicios {get;set;} = ""; + public decimal Monto { get; set; } + public string Divisa { get; set; }=""; +} \ No newline at end of file diff --git a/Entidades/Dto/SetVentaDto.cs b/Entidades/Dto/SetVentaDto.cs new file mode 100644 index 0000000..7debd54 --- /dev/null +++ b/Entidades/Dto/SetVentaDto.cs @@ -0,0 +1,6 @@ +namespace Entidades.Dto; +public class SetVentaDto { + public int idpropiedad {get; set;} + public decimal monto {get; set;} + public int iddivisa {get; set;} +} \ No newline at end of file diff --git a/Entidades/Log.cs b/Entidades/Log.cs new file mode 100644 index 0000000..99d4ca5 --- /dev/null +++ b/Entidades/Log.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Entidades; + +public partial class Log +{ + public DateTime Fecha { get; set; } + + public long Dniusuario { get; set; } + + public string Accion { get; set; } = null!; + + public virtual Cliente DniusuarioNavigation { get; set; } = null!; + + public virtual ICollection LogDetalles { get; set; } = new List(); +} diff --git a/Entidades/Logdetalle.cs b/Entidades/Logdetalle.cs new file mode 100644 index 0000000..db3946f --- /dev/null +++ b/Entidades/Logdetalle.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Entidades; + +public partial class LogDetalle +{ + public DateTime Fecha { get; set; } + + public long Dniusuario { get; set; } + + public string NombreTabla { get; set; } = null!; + + public string Columna { get; set; } = null!; + + public string? ValorAnterior { get; set; } + + public string? ValorNuevo { get; set; } + + public int Id { get; set; } + + public virtual Log Log { get; set; } = null!; +} diff --git a/Entidades/Logs/LogDetalleDto.cs b/Entidades/Logs/LogDetalleDto.cs new file mode 100644 index 0000000..195d831 --- /dev/null +++ b/Entidades/Logs/LogDetalleDto.cs @@ -0,0 +1,9 @@ +namespace Entidades.Dto; +public class LogDetalleDto { + public DateTime Fecha { get; set; } + public long Dniusuario { get; set; } + public string NombreTabla { get; set; } = null!; + public string Columna { get; set; } = null!; + public string? ValorAnterior { get; set; } + public string? ValorNuevo { get; set; } +} \ No newline at end of file diff --git a/Entidades/Logs/LogDto.cs b/Entidades/Logs/LogDto.cs new file mode 100644 index 0000000..998ac45 --- /dev/null +++ b/Entidades/Logs/LogDto.cs @@ -0,0 +1,7 @@ +namespace Entidades.Dto; +public class LogDto { + public DateTime Fecha { get; set; } + public long Dniusuario { get; set; } + public string Accion { get; set; } = null!; +} + diff --git a/Front/src/App.svelte b/Front/src/App.svelte index d5c2f3f..b5870a8 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -24,6 +24,11 @@ import Informes from "./paginas/Informes.svelte"; import CompraYVentas from "./paginas/CompraYVenta.svelte"; import Ventas from "./paginas/Ventas.svelte"; + import VerLogs from "./paginas/VerLogs.svelte"; + import ControlPagos from "./paginas/ControlPagos.svelte"; + import ContratoAdmin from "./paginas/ContratoAdmin.svelte"; + import BuscarVentas from "./paginas/BuscarVentas.svelte"; + import MisPropiedadesEnVenta from "./paginas/MisPropiedadesEnVenta.svelte"; @@ -72,6 +77,11 @@ + + + + + @@ -102,6 +112,21 @@ + + + + + + + + + + + + + + + @@ -135,6 +160,10 @@ - + + + + + diff --git a/Front/src/Componentes/FormAltaDefecto.svelte b/Front/src/Componentes/FormAltaDefecto.svelte index 2cf9067..1b05669 100644 --- a/Front/src/Componentes/FormAltaDefecto.svelte +++ b/Front/src/Componentes/FormAltaDefecto.svelte @@ -59,7 +59,7 @@ id="danioUso" class="form-check-input" bind:group={formData.pagainquilino} - value="0" + value="1" required /> @@ -70,7 +70,7 @@ id="danioEstructural" class="form-check-input" bind:group={formData.pagainquilino} - value="1" + value="0" /> diff --git a/Front/src/Componentes/ModalLogs.svelte b/Front/src/Componentes/ModalLogs.svelte new file mode 100644 index 0000000..28638a3 --- /dev/null +++ b/Front/src/Componentes/ModalLogs.svelte @@ -0,0 +1,63 @@ + + + \ No newline at end of file diff --git a/Front/src/Componentes/ModalModificarPropietarios.svelte b/Front/src/Componentes/ModalModificarPropietarios.svelte new file mode 100644 index 0000000..8a0f07b --- /dev/null +++ b/Front/src/Componentes/ModalModificarPropietarios.svelte @@ -0,0 +1,54 @@ + + + \ No newline at end of file diff --git a/Front/src/Componentes/ModalPublicarPropiedadParaVenta.svelte b/Front/src/Componentes/ModalPublicarPropiedadParaVenta.svelte new file mode 100644 index 0000000..ea0d4ff --- /dev/null +++ b/Front/src/Componentes/ModalPublicarPropiedadParaVenta.svelte @@ -0,0 +1,55 @@ + + + diff --git a/Front/src/Componentes/NavBarLogin.svelte b/Front/src/Componentes/NavBarLogin.svelte index 59c245f..343e94c 100644 --- a/Front/src/Componentes/NavBarLogin.svelte +++ b/Front/src/Componentes/NavBarLogin.svelte @@ -1,7 +1,7 @@ -{#if cantpag>1} +{#if cantpag>0}