diff --git a/Aspnet/Builder/DtoBuilder/OpcionVentaDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/OpcionVentaDtoBuilder.cs new file mode 100644 index 0000000..8df2256 --- /dev/null +++ b/Aspnet/Builder/DtoBuilder/OpcionVentaDtoBuilder.cs @@ -0,0 +1,25 @@ +using Entidades.Dto; + +namespace AlquilaFacil.Builder; +public class OpcionVentaDtoBuilder: Builder{ + public OpcionVentaDtoBuilder SetId(long id) { + data.Id = id; + return this; + } + public OpcionVentaDtoBuilder SetMonto(decimal monto) { + data.Monto = monto; + return this; + } + public OpcionVentaDtoBuilder SetDivisa(string divisa) { + data.Divisa = divisa; + return this; + } + public OpcionVentaDtoBuilder SetEnOrden(bool v) { + data.EnOrden = v; + return this; + } + public OpcionVentaDtoBuilder SetFueEjercido(int idestado) { + data.FueEjercido = idestado==1?false:true; + return this; + } +} \ No newline at end of file diff --git a/Aspnet/Builder/DtoBuilder/VentasDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/VentasDtoBuilder.cs new file mode 100644 index 0000000..38a7f25 --- /dev/null +++ b/Aspnet/Builder/DtoBuilder/VentasDtoBuilder.cs @@ -0,0 +1,41 @@ +using Entidades.Dto; + +namespace AlquilaFacil.Builder; +public class VentasDtoBuilder: Builder { + public VentasDtoBuilder SetId(long id) { + data.Id = id; + return this; + } + public VentasDtoBuilder SetMonto(decimal monto) { + data.Monto = monto; + return this; + } + public VentasDtoBuilder SetDivisa(string divisa) { + data.Divisa = divisa; + return this; + } + public VentasDtoBuilder SetUbicacion(string ubicacion) { + data.Ubicacion = ubicacion; + return this; + } + public VentasDtoBuilder SetNombreVendedor(string nombre) { + data.NombreVendedor = nombre; + return this; + } + public VentasDtoBuilder SetIdVendedor(long idVendedor) { + data.IdVendedor = idVendedor; + return this; + } + public VentasDtoBuilder SetNombreComprador(string nombre) { + data.NombreComprador = nombre; + return this; + } + public VentasDtoBuilder SetIdComprador(long Id) { + data.IdComprador = Id; + return this; + } + public VentasDtoBuilder SetEstado(string estado) { + data.Estado = estado; + return this; + } +} \ No newline at end of file diff --git a/Aspnet/Builder/PrecontratoBuilder.cs b/Aspnet/Builder/PrecontratoBuilder.cs index 5e58b57..5d20313 100644 --- a/Aspnet/Builder/PrecontratoBuilder.cs +++ b/Aspnet/Builder/PrecontratoBuilder.cs @@ -47,4 +47,9 @@ public class PrecontratoBuilder : Builder { data.MesesDurationContrato = mesesDuracionContrato; return this; } + + public PrecontratoBuilder SetOpcionVenta(bool tieneOpcionVenta){ + data.Tieneopcionventa = tieneOpcionVenta == false?0Lu:1Lu; + return this; + } } \ No newline at end of file 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 fa6c146..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"}); } @@ -336,6 +336,7 @@ public class ContratoController: ControllerBase { .SetPropiedad(p.Id) .SetFecha(DateTime.Parse(dto.fechaprimernotificacion)) .SetMesesDuracion(dto.MesesDuracionContrato) + .SetOpcionVenta(dto.TieneOpcionVenta) .Build(); @@ -349,7 +350,18 @@ public class ContratoController: ControllerBase { .SetMensaje($"El propietario {propi.Nombre} {propi.Apellido} te requiere que carges informacion de {dto.CantidadGarantes} Garantes") .Build(); - var ret = RepositorioContratos.Singleton.CargaPrecontrato(precontrato, notificacion); + bool ret; + if (dto.TieneOpcionVenta==false){ + 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, cli.Dni); + } + if (ret) { ret = RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, DateTime.Parse(dto.fechaprimernotificacion)); } @@ -399,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); @@ -428,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"}); @@ -439,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() @@ -537,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() @@ -658,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); @@ -695,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); @@ -816,6 +831,7 @@ public class ContratoController: ControllerBase { if (dto.MesesHastaAumento <= 0) ret += "No puede tener 0 o menos meses hasta el aumento\n"; if (dto.MesesDuracionContrato <= 0) ret += "No puede tener 0 o menos meses de duracion\n"; if (dto.MesesDuracionContrato < dto.MesesHastaAumento) ret += "el tiempo hasta aumento no puede ser mayor de \n"; + if (dto.TieneOpcionVenta == true && dto.MontoOpcion <=0) ret +="No puede tener un monto de venta negativo o 0"; return ret; } 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 new file mode 100644 index 0000000..6518713 --- /dev/null +++ b/Aspnet/Controllers/VentaController.cs @@ -0,0 +1,460 @@ +using System.Configuration; +using System.Formats.Asn1; +using System.Text.Json; +using AlquilaFacil.Builder; +using AlquilaFacil.Config; +using Entidades; +using Entidades.Dto; +using Microsoft.AspNetCore.Mvc; +using Minio; +using Minio.DataModel.Args; +using Modelo; + +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"); + if (validacion1 == false) { + return Unauthorized(); + } + if (idcontrato <= 0) return BadRequest(new { message = "No pueden hacer cotratos con id 0 o menor"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Contrato? cont = RepositorioVentas.Singleton.ObtenerVentaPorContrato(idcontrato); + if (cont == null || cont.IdventaNavigation == null) return BadRequest(new { message = "no hay un contrato por esa id"}); + if (cont.Tieneopcionventa == 0) return BadRequest(new { message = "No tiene opcion de venta"}); + if (puedeEjercer(cont) == false) return BadRequest(new { message = "No cumple con los requisitos para ejercer la opcion de compra"}); + + Venta venta = cont.IdventaNavigation; + venta.IdVendedor = cont.Dnipropietario; + venta.IdComprador = cont.Dniinquilino; + venta.Idpropiedad = cont.Idpropiedad; + venta.Fechainicio = DateTime.Now; + + bool ret = RepositorioVentas.Singleton.PatchVenta(venta, cli.Dni); + + return ret? + Ok(new { message = "Se ejercio la opcion de venta"}): + BadRequest(new { message = "No se pude ejercer la opcion de venta"}); + } + + [HttpPost("/api/ventas/subirReciboPago")] + 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){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + + if (idventa <=0) return BadRequest(new { message = "Las id 0 o menor no son validas" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Venta? venta = RepositorioVentas.Singleton.ObtenerVentaPorId(idventa); + if (venta == null) return BadRequest(new { message = "no hay una venta por esa id"}); + + if (cli.Dni !=venta.IdComprador && cli.Dni != venta.IdVendedor) return Unauthorized(); + + if (file == null) return BadRequest(new { message = "Debe subir un archivo." }); + if (file.ContentType != "application/pdf") return BadRequest(new { message = "El archivo debe ser un documento PDF." }); + if (!Path.GetExtension(file.FileName).Equals(".pdf", StringComparison.OrdinalIgnoreCase)) return BadRequest(new { message = "El archivo debe tener la extensión .pdf." }); + + string nuevoNombreArchivo = $"id:{venta.Id}-comprador:{venta.IdComprador}-vendedor:{venta.IdVendedor}-idprop:{venta.Idpropiedad}.pdf"; + 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, 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"}); + + } + private readonly IMinioClient mc; + public VentaController(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(); + } + } + private async Task subirContrato(IFormFile f, string flname) { + try { + var buck = new BucketExistsArgs().WithBucket("alquilafacil"); + bool encontrado = await mc.BucketExistsAsync(buck).ConfigureAwait(false); + + if(!encontrado){ + var mb = new MakeBucketArgs().WithBucket("alquilafacil"); + await mc.MakeBucketAsync(mb).ConfigureAwait(false); + } + using (var stream = new MemoryStream()){ + await f.CopyToAsync(stream); + stream.Position=0; + PutObjectArgs putbj = new PutObjectArgs() + .WithBucket("alquilafacil") + .WithObject(flname) + .WithStreamData(stream) + .WithContentType("application/pdf") + .WithObjectSize(stream.Length); + await mc.PutObjectAsync(putbj); + } + return true; + } catch (Exception e ) { + Console.Error.WriteLine(e.Message); + return false; + } + } + + [HttpGet("/api/ventas/verRecibo")] + public IActionResult verRecibo([FromHeader(Name="Auth")]string Auth, long idventa=0){ + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + if (idventa <= 0) return BadRequest(new { message = "No existen ventas validas para la id 0"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Venta? venta = RepositorioVentas.Singleton.ObtenerVentaPorId(idventa); + if (venta == null) return BadRequest(new { message = "no hay una venta con esa id"}); + if (cli.Dni != venta.IdComprador && cli.Dni != venta.IdVendedor) return Unauthorized(); + + try{ + var memstream = new MemoryStream(); + + var goa = new GetObjectArgs() + .WithBucket("alquilafacil") + .WithObject(venta.UrlRecibo) + .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", venta.UrlRecibo); + + } catch (Exception e){ + Console.Error.WriteLine(e); + return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + } + } + + + [HttpPost("/api/ventas/propietarioverifica")] + public IActionResult PropietarioVerifica([FromHeader(Name="Auth")]string Auth, long idventa=0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + if (idventa <= 0) return BadRequest(new { message = "No existen ventas validas para la id 0"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var ventas = RepositorioVentas.Singleton.ObtenerVentaPorId(idventa); + if (ventas == null) return BadRequest(new { message ="No hay una venta con ese id"}); + if (ventas.IdVendedor != cli.Dni) return Unauthorized(); + + bool ret = RepositorioVentas.Singleton.EfectuarVenta(idventa); + return ret ? Ok(new { message = "Se traspaso la propiedad"}): BadRequest(new { message = ""}); + } + + + [HttpGet("/api/venta")] + public IActionResult ObtenerVenta([FromHeader(Name="Auth")]string Auth, long idventa=0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + if (idventa <= 0) return BadRequest(new { message = "No existen ventas validas para la id 0"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var ventas = RepositorioVentas.Singleton.ObtenerVentaPorId(idventa); + if (ventas == null) return BadRequest(new { message ="No hay una venta con ese id"}); + if (ventas.IdVendedor !=cli.Dni && ventas.IdComprador != cli.Dni) return Unauthorized(); + + var v = new VentasDtoBuilder() + .SetId(ventas.Id) + .SetMonto(ventas.Monto) + .SetDivisa(ventas.IddivisaNavigation.Signo) + .SetUbicacion(ventas.IdpropiedadNavigation.Ubicacion) + .SetNombreVendedor($"{ventas.IdVendedorNavigation.Nombre} {ventas.IdVendedorNavigation.Apellido}") + .SetIdVendedor(ventas.IdVendedor??0) + .SetNombreComprador($"{ventas.IdCompradorNavigation.Nombre} {ventas.IdCompradorNavigation.Apellido}") + .SetIdComprador(ventas.IdComprador??0) + .SetEstado(ventas.IdestadoNavigation.Descripcion??"") + .Build(); + + return Ok(new { data = v, iscomprador = (ventas.IdComprador==cli.Dni)?true:false, + necesitaRecibo = ventas.UrlRecibo==null?true:false}); + } + + [HttpGet("/api/ventas")] + public IActionResult ObtenerVentas([FromHeader(Name="Auth")]string Auth) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var ventas = RepositorioVentas.Singleton.ObtenerVentasPorDni(cli.Dni); + if (ventas == null) return BadRequest(new { message ="no estas involucrado en ninguna venta o compra"}); + + List lista = new(); + foreach (var i in ventas) { + var v = new VentasDtoBuilder() + .SetId(i.Id) + .SetMonto(i.Monto) + .SetDivisa(i.IddivisaNavigation.Signo) + .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) + .SetNombreVendedor($"{i.IdVendedorNavigation.Nombre} {i.IdVendedorNavigation.Apellido}") + .SetIdVendedor(i.IdVendedor??0) + .SetNombreComprador($"{i.IdCompradorNavigation.Nombre} {i.IdCompradorNavigation.Apellido}") + .SetIdComprador(i.IdComprador??0) + .SetEstado(i.IdestadoNavigation.Descripcion??"") + .Build(); + lista.Add(v); + } + return Ok(lista); + } + + [HttpGet("/api/opcionventa")] + public IActionResult ObtenerDto([FromHeader(Name="Auth")]string Auth, long idcontrato=0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + if (idcontrato == 0) return BadRequest(new { message = "No existen contatos validos para la id 0"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Contrato? cont = RepositorioVentas.Singleton.ObtenerVentaPorContrato(idcontrato); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id"}); + + var dto = new OpcionVentaDtoBuilder() + .SetId(cont.Idventa??0) + .SetMonto(cont.IdventaNavigation.Monto) + .SetDivisa(cont.IdventaNavigation.IddivisaNavigation.Signo) + .SetEnOrden(puedeEjercer(cont)) + .SetFueEjercido(cont.IdventaNavigation.Idestado??0) + .Build(); + + return Ok(dto); + } + + private bool puedeEjercer(Contrato c) { + bool ret = c.Idcanons.All(x => x.Pagado == 1); + + if (ret) { + var canonConFechaMasTardia = c.Idcanons.OrderByDescending(x => x.Fecha).FirstOrDefault(); + + if (canonConFechaMasTardia != null && canonConFechaMasTardia.Fecha.Year >= DateTime.Now.Year + && canonConFechaMasTardia.Fecha.Month >= DateTime.Now.Month) { + ret = true; + }else{ + ret = false; + } + } + + return ret; + } + + [HttpGet("/api/contrato/tieneopcionventa")] + public IActionResult TieneOpcionVenta([FromHeader(Name="Auth")]string Auth, long idcontrato=0) { + var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + if (validacion1 == false){ + validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + if (validacion1 == false) { + return Unauthorized(); + } + } + + if (idcontrato == 0) return BadRequest(new { message = "No existen contatos validos para la id 0"}); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id"}); + if (cont.Dniinquilino !=cli.Dni && cont.Dnipropietario != cli.Dni) return Unauthorized(); + + return Ok( new { message = cont.Tieneopcionventa}); + } +} \ No newline at end of file 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 afd29c8..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"); @@ -670,6 +730,9 @@ public partial class AlquilaFacilContext : DbContext entity.Property(e => e.Monto) .HasPrecision(12) .HasColumnName("monto"); + entity.Property(e => e.UrlRecibo) + .HasColumnType("text") + .HasColumnName("urlRecibo"); entity.HasOne(d => d.IdCompradorNavigation).WithMany(p => p.VentaIdCompradorNavigations) .HasForeignKey(d => d.IdComprador) 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/OpcionVentaDto.cs b/Entidades/Dto/OpcionVentaDto.cs new file mode 100644 index 0000000..3f11e1d --- /dev/null +++ b/Entidades/Dto/OpcionVentaDto.cs @@ -0,0 +1,8 @@ +namespace Entidades.Dto; +public class OpcionVentaDto{ + public long Id { get; set;} + public decimal Monto { get; set;} + public string Divisa { get; set;} =""; + public bool EnOrden { get; set;} + public bool FueEjercido { get; set; } +} \ No newline at end of file diff --git a/Entidades/Dto/PrecontratoDto.cs b/Entidades/Dto/PrecontratoDto.cs index 650e075..d1a76fa 100644 --- a/Entidades/Dto/PrecontratoDto.cs +++ b/Entidades/Dto/PrecontratoDto.cs @@ -8,4 +8,6 @@ public class PrecontratoDto { public bool TieneOpcionVenta { get; set; } public string fechaprimernotificacion { get; set; } = ""; public int MesesDuracionContrato { get; set; } + public Decimal MontoOpcion {get; set; } + public int iddivisa { get; set; } } \ No newline at end of file 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/Dto/VentasDto.cs b/Entidades/Dto/VentasDto.cs new file mode 100644 index 0000000..5ee9937 --- /dev/null +++ b/Entidades/Dto/VentasDto.cs @@ -0,0 +1,12 @@ +namespace Entidades.Dto; +public class VentasDto { + public long Id { get; set; } + public decimal Monto { get; set; } + public string Divisa { get; set; }=""; + public string Ubicacion { get; set; }=""; + public string NombreVendedor { get; set; }=""; + public long IdVendedor { get; set; } + public string NombreComprador { get; set; }=""; + public long IdComprador { get; set; } + public string Estado { 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/Entidades/Venta.cs b/Entidades/Venta.cs index 200b45c..b5c5b81 100644 --- a/Entidades/Venta.cs +++ b/Entidades/Venta.cs @@ -17,12 +17,14 @@ public partial class Venta public int? Idpropiedad { get; set; } - public DateTime Fechainicio { get; set; } + public DateTime? Fechainicio { get; set; } public DateTime? Fechafinal { get; set; } public int Iddivisa { get; set; } + public string? UrlRecibo { get; set; } + public virtual ICollection Contratos { get; set; } = new List(); public virtual Cliente? IdCompradorNavigation { get; set; } diff --git a/Front/src/App.svelte b/Front/src/App.svelte index 8575022..b5870a8 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -21,7 +21,14 @@ import ControlAlquileresPropietario from "./paginas/ControlAlquileresPropietario.svelte"; import ContratosPropietario from "./paginas/ContratosPropietario.svelte"; import ContratoInquilino from "./paginas/ContratoInquilino.svelte"; - import Informes from "./paginas/Informes.svelte"; + 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"; @@ -70,6 +77,11 @@ + + + + + @@ -95,6 +107,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -123,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/ModalPrecontrato.svelte b/Front/src/Componentes/ModalPrecontrato.svelte index 6f04d38..a44bdf9 100644 --- a/Front/src/Componentes/ModalPrecontrato.svelte +++ b/Front/src/Componentes/ModalPrecontrato.svelte @@ -1,16 +1,19 @@ @@ -25,11 +28,23 @@
+ \ No newline at end of file diff --git a/Front/src/paginas/VerLogs.svelte b/Front/src/paginas/VerLogs.svelte new file mode 100644 index 0000000..1ba00e3 --- /dev/null +++ b/Front/src/paginas/VerLogs.svelte @@ -0,0 +1,111 @@ + + + + +{#if modaldata} + !!(modaldata = "")}/> +{/if} + +{#if showmodal} + !!(showmodal=!showmodal)} log={ll}/> +{/if} + +
+ + + + + + + + + + + + {#each Logs as l} + + + + + + + {/each} + +
FechaId UsuarioAccion
{l.fecha}{l.dniusuario}{l.accion} + +
+
+ +
+
diff --git a/Front/src/types.d.ts b/Front/src/types.d.ts index b525e18..bc113a5 100644 --- a/Front/src/types.d.ts +++ b/Front/src/types.d.ts @@ -10,6 +10,18 @@ export type PropiedadDto = { iddivisa: number } +export type PropiedadVentaDto = { + id: number, + ubicacion: string, + tipo: string, + piso: string | null, + letra: string | null, + canthabitaciones: number, + servicios: string, + monto: number, + divisa: string +} + export type AdminParametrosBusqueda = { cantidadhabitaciones: number=0, tipopropiedad: number=0, @@ -144,4 +156,66 @@ export type ChartData = { label: string, data:string[], }] +} + +export type OpcionVentaDto = { + id:number, + monto:number, + divisa:string, + enOrden:boolean, + fueEjercido:boolean +} + +export type VentasDto = { + id:number, + monto:numver, + divisa:string, + ubicacion:string, + nombreVendedor:string, + idVendedor:number, + nombreComprador:string, + idComprador:number, + estado:string, +} + +export type LogDto = { + fecha:Date, + dniusuario:number, + accion:string +} + +export type LogDetalleDto = { + fecha:Date, + dniusuario:number, + nombreTabla:string, + columna:string, + valorAnterior:string, + valorNuevo:string +} + +export type UpdateCliente = { + dni:number, + nombre:string, + apellido:string, + domicilio:string, + celular:string, +} + +export type setVenta = { + idpropiedad:number, + monto:number, + iddivisa:number, +} + +export type PatchPropiedad = { + id:number, + ubicacion:string, + canthabitaciones:number, + piso:number, + letra:string, + email:string, + tipo:number, + servicios: string[], + monto:number, + iddivisa:number } \ No newline at end of file diff --git a/Modelo/Facade/AuditoriaFacade.cs b/Modelo/Facade/AuditoriaFacade.cs new file mode 100644 index 0000000..949f7e9 --- /dev/null +++ b/Modelo/Facade/AuditoriaFacade.cs @@ -0,0 +1,119 @@ +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 ProcesarCambios(IEnumerable cambios, + DateTime fechaActual, long dniUsuario) { + + var logDetalles = new List(); + 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??"")) { + if (!_context.LogDetalles.Any(ld => + ld.Fecha == fechaActual && + ld.Dniusuario == dniUsuario && + ld.NombreTabla == nombreTabla && + ld.Columna == propiedad.Name)) + { + 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(); + + if (!_context.LogDetalles.Any(ld => + ld.Fecha == fechaActual && + ld.Dniusuario == dniUsuario && + ld.NombreTabla == nombreTabla && + ld.Columna == propiedad.Name)) + { + 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(); + + if (!_context.LogDetalles.Any(ld => + ld.Fecha == fechaActual && + ld.Dniusuario == dniUsuario && + ld.NombreTabla == nombreTabla && + ld.Columna == propiedad.Name)) + { + 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; + } +} diff --git a/Modelo/Facade/FiltroCambios.cs b/Modelo/Facade/FiltroCambios.cs new file mode 100644 index 0000000..7aa6d1c --- /dev/null +++ b/Modelo/Facade/FiltroCambios.cs @@ -0,0 +1,6 @@ +namespace Modelo.Facade; +public class FiltroCambios { + public IEnumerable FiltrarCambios(IEnumerable cambios) { + return cambios.Where(c => c.Entity.GetType().Name != "EntidadExcluida"); + } +} diff --git a/Modelo/Facade/PersistenciaLog.cs b/Modelo/Facade/PersistenciaLog.cs new file mode 100644 index 0000000..90342a7 --- /dev/null +++ b/Modelo/Facade/PersistenciaLog.cs @@ -0,0 +1,16 @@ +using Entidades; +namespace Modelo.Facade; +public class PersistenciaLog { + private AlquilaFacilContext _context {get{return new AlquilaFacilContext();}} + public void GuardarLog(Log log, IEnumerable detalles) { + var con = _context; + int j = 1; + foreach (var i in log.LogDetalles) { + i.Id = j; + j++; + } + con.Logs.Add(log); + //con.LogDetalles.AddRange(detalles); + con.SaveChanges(); + } +} diff --git a/Modelo/Facade/ValidadorCambios.cs b/Modelo/Facade/ValidadorCambios.cs new file mode 100644 index 0000000..f49a25f --- /dev/null +++ b/Modelo/Facade/ValidadorCambios.cs @@ -0,0 +1,6 @@ +namespace Modelo.Facade; +public class ValidadorDeCambios { + public bool ValidarCambio(string valorAnterior, string valorNuevo) { + return !string.IsNullOrEmpty(valorNuevo) && valorAnterior != valorNuevo; + } +} diff --git a/Modelo/RepositorioBase.cs b/Modelo/RepositorioBase.cs index 11eeabc..26a4142 100644 --- a/Modelo/RepositorioBase.cs +++ b/Modelo/RepositorioBase.cs @@ -1,4 +1,6 @@ using Entidades; +using Microsoft.EntityFrameworkCore; +using Modelo.Facade; namespace Modelo; @@ -9,6 +11,12 @@ public abstract class RepositorioBase 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 diff --git a/Modelo/RepositorioCanons.cs b/Modelo/RepositorioCanons.cs index f1811da..584e811 100644 --- a/Modelo/RepositorioCanons.cs +++ b/Modelo/RepositorioCanons.cs @@ -27,7 +27,13 @@ public class RepositorioCanons: RepositorioBase { return cc; } - public bool SetRecibo(Canon c, Recibo re) { + public Canon? ObtenerCanonPorId(long id){ + var con = Context; + var cnn = con.Canons.FirstOrDefault(x=>x.Id == id); + return cnn; + } + + public bool SetRecibo(Canon c, Recibo re, long dni, string mensaje= "Set Recibo") { var con = Context; var cc = con.Canons .Include(x=>x.Idcontratos) @@ -51,10 +57,12 @@ public class RepositorioCanons: RepositorioBase { ccc.IdpropiedadNavigation.Idestado = 3; } + GenerarLog(con, dni, mensaje); + 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 +94,8 @@ public class RepositorioCanons: RepositorioBase { con.Canons.Add(c); cont.Idcanons.Add(c); } + GenerarLog(con, dni, $"Crear Canones"); + return Guardar(con); } } \ No newline at end of file diff --git a/Modelo/RepositorioContratos.cs b/Modelo/RepositorioContratos.cs index d371346..5119af3 100644 --- a/Modelo/RepositorioContratos.cs +++ b/Modelo/RepositorioContratos.cs @@ -14,7 +14,7 @@ public class RepositorioContratos: RepositorioBase { } } - 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 { con.Contratos.Add(c); con.Notificaciones.Add(n); - + GenerarLog(con, dni, $"CargaPrecontrato"); return Guardar(con); } - public bool CargaGarantes(List gar, string emailInquilino, int idpropiedad) { + public bool CargaGarantes(List 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 { con.Garantes.Add(i); contr.Idgarantes.Add(i); } - + GenerarLog(con, dni, $"Alta Garantes"); return Guardar(con); } @@ -75,7 +75,7 @@ public class RepositorioContratos: RepositorioBase { } - 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 { 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 { 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 { 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); } @@ -201,4 +206,53 @@ public class RepositorioContratos: RepositorioBase { var con = Context; return con.Contratos.Where(x=>x.Fechainicio.Year == year).Any(); } + + public bool SetOpcionVenta(Venta v, long idcontrato) { + var con = Context; + var cont = con.Contratos.Include(x=>x.IdventaNavigation).FirstOrDefault(x=>x.Id == idcontrato); + if (cont != null) return false; + + v.Id = (con.Ventas.Any()?con.Ventas.Count():0)+1; + + cont.IdventaNavigation = v; + con.Ventas.Add(v); + return Guardar(con); + } + + 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; + + var prop = con.Propiedades.FirstOrDefault(x=>x.Id==c.Idpropiedad); + if (prop == null) return false; + prop.Idestado = 2; + + c.Iddivisa = prop.Iddivisa; + c.Id = (con.Contratos.Any() ? con.Contratos.Max(x => x.Id) : 0) + 1; + c.Monto = prop.Monto; + + v.Id = (con.Ventas.Any()?con.Ventas.Count():0)+1; + c.Idventa = v.Id; + + con.Ventas.Add(v); + con.Contratos.Add(c); + con.Notificaciones.Add(n); + GenerarLog(con, dni, $"Carga Precontrato con opcion venta"); + + return Guardar(con); + } + + public IQueryable ObtenerContratosInpagos() { + var con = Context; + DateTime d = DateTime.Now; + var l = con.Contratos + .Include(x=>x.DniinquilinoNavigation) + .Include(x=>x.DnipropietarioNavigation) + .Include(x=>x.IdpropiedadNavigation) + .ThenInclude(x=>x.IdtipropiedadNavigation) + .Include(x=>x.Idcanons) + .Where(x=>x.Idcanons.Any(x=>x.Pagado ==0 && d > x.Fecha)); + return l; + } } diff --git a/Modelo/RepositorioDefectos.cs b/Modelo/RepositorioDefectos.cs index df62251..fbbf099 100644 --- a/Modelo/RepositorioDefectos.cs +++ b/Modelo/RepositorioDefectos.cs @@ -4,18 +4,20 @@ using Microsoft.EntityFrameworkCore; namespace Modelo; public class RepositorioDefectos: RepositorioBase { - 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); } diff --git a/Modelo/RepositorioEstadisticas.cs b/Modelo/RepositorioEstadisticas.cs index c9100a0..c9ed217 100644 --- a/Modelo/RepositorioEstadisticas.cs +++ b/Modelo/RepositorioEstadisticas.cs @@ -47,6 +47,34 @@ public class RepositorioEstadisticas: RepositorioBase { return data; } + public ChartData? ObtenerDatosPagosContrato(long idcontrato) { + var con = Context; + var cont = con.Contratos.Include(c=>c.Idcanons).ThenInclude(x=>x.IdreciboNavigation) + .Where(x=>x.Habilitado==1) + .FirstOrDefault(x=>x.Id == idcontrato); + if(cont==null)return null; + + var data = new ChartData(); + data.Labels= ["Pago", "Sin Pagar", "Pago Atrasado"]; + + Dataset d1 = new(); + d1.Label="Estadistica Pagos"; + + var l = new List(["0","0","0"]); + + l[0] = cont.Idcanons.Where(x=>x.Pagado == 1Lu && x.IdreciboNavigation != null && x.IdreciboNavigation.Fecha <= x.Fecha) + .Count().ToString(); + + l[1] = cont.Idcanons.Where(x=>x.Pagado==0).Count().ToString(); + + l[2] = cont.Idcanons.Where(x=>x.Pagado == 1Lu && x.IdreciboNavigation != null && x.IdreciboNavigation.Fecha > x.Fecha) + .Count().ToString(); + d1.Data.AddRange(l); + data.Datasets.Add(d1); + + return data; + } + public IQueryable TablaObtenerContratosIniciadosPorAño(int year) { var con = Context; var contratosPorMes = con.Contratos.Include(x=>x.IddivisaNavigation).Include(x=>x.IdpropiedadNavigation) @@ -69,4 +97,5 @@ public class RepositorioEstadisticas: RepositorioBase { return l; } + } \ No newline at end of file diff --git a/Modelo/RepositorioGrupos.cs b/Modelo/RepositorioGrupos.cs index 81cc13d..2f5a476 100644 --- a/Modelo/RepositorioGrupos.cs +++ b/Modelo/RepositorioGrupos.cs @@ -4,19 +4,6 @@ using Microsoft.EntityFrameworkCore; namespace Modelo; public class RepositorioGrupos: RepositorioBase { - 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 ListarPermisosDeGrupo(string grupo) { var con = Context; diff --git a/Modelo/RepositorioLogs.cs b/Modelo/RepositorioLogs.cs new file mode 100644 index 0000000..d03d46b --- /dev/null +++ b/Modelo/RepositorioLogs.cs @@ -0,0 +1,29 @@ +using System.Linq; +using Entidades; +using Microsoft.EntityFrameworkCore; + +namespace Modelo; +public class RepositorioLogs: RepositorioBase { + public int ObtenerCantidadPaginas() { + var con = Context; + float a = con.Logs.Count()/10f; + int b = (int)a; + if (b != a){ + b++; + } + return b; + } + + public IOrderedEnumerable ObtenerDetallesLogs(DateTime fecha, long idusuario) { + var con = Context; + var d = con.Logs.Include(x=>x.LogDetalles) + .FirstOrDefault(x => x.Fecha == fecha && x.Dniusuario == idusuario); + return d.LogDetalles.OrderBy(x=>x.Id); + } + + public IQueryable? ObtenerLogsPaginado(int pag) { + var con = Context; + var l = con.Logs.OrderByDescending(x=>x.Fecha).Skip(10*pag).Take(10); + return l; + } +} \ No newline at end of file diff --git a/Modelo/RepositorioNotificaciones.cs b/Modelo/RepositorioNotificaciones.cs index d925c9a..a7f6e57 100644 --- a/Modelo/RepositorioNotificaciones.cs +++ b/Modelo/RepositorioNotificaciones.cs @@ -20,10 +20,13 @@ public class RepositorioNotificaciones : RepositorioBasex.Leido == false && x.Dnicliente == dni).Any(); return hay; } + + public Notificacione? ObtenerNotificacionPorKeys(long dni, DateTime? fecha) { + var con = Context; + var n = con.Notificaciones.FirstOrDefault(x => x.Dnicliente ==dni && x.Fecha == fecha); + return n; + } } \ No newline at end of file diff --git a/Modelo/RepositorioPermisos.cs b/Modelo/RepositorioPermisos.cs index e92a993..a5d4445 100644 --- a/Modelo/RepositorioPermisos.cs +++ b/Modelo/RepositorioPermisos.cs @@ -49,18 +49,4 @@ public class RepositorioPermisos: RepositorioBase { 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 } \ No newline at end of file diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 62ba127..36c0c99 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -70,7 +70,7 @@ public class RepositorioPropiedades: RepositorioBase { 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 { 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 { }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 idserv) { + public bool BajaServiciosAPropiedad(int idprop, List 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 { prop.IdServicios.Remove(servicio); } } - + GenerarLog(con, dni, $"Baja servicios a propiedad: {prop.Id}"); return Guardar(con); } @@ -611,4 +611,27 @@ public class RepositorioPropiedades: RepositorioBase { return (int)Math.Ceiling((double)totalRegistros / registrosPorPagina); } + + public IQueryable? ObtenerPropiedadesEnVenta(int pag){ + var con = Context; + + var props = con.Propiedades.Include(x=>x.IdServicios).Include(x=>x.IddivisaNavigation) + .Include(c=>c.IdtipropiedadNavigation) + .Where(x=>x.Idestado ==4 && !x.Venta.Any(x=>x.Idestado ==2)) + .Skip(pag*10).Take(10); + return props; + } + public int ObtenerPaginasDePropiedadesEnVenta(){ + var con = Context; + + var props = con.Propiedades.Where(x=>x.Idestado ==4 && !x.Venta.Any(x=>x.Idestado ==2)).Count(); + return (int)Math.Ceiling((double)props / 10); + } + + public IQueryable ObtenerPropiedadesAVentaPorDni(long dni) { + var con = Context; + var l = con.Propiedades.Include(x=>x.IdServicios).Include(x=>x.IdtipropiedadNavigation) + .Where(x=>x.Dnipropietario == dni && x.Idestado ==4); + return l; + } } \ No newline at end of file diff --git a/Modelo/RepositorioUsuarios.cs b/Modelo/RepositorioUsuarios.cs index f0dd6af..08bec3f 100644 --- a/Modelo/RepositorioUsuarios.cs +++ b/Modelo/RepositorioUsuarios.cs @@ -3,6 +3,7 @@ using System.Text; using Entidades.Dto; using Entidades; using Microsoft.EntityFrameworkCore; +using Entidades.Admin; namespace Modelo; @@ -28,6 +29,7 @@ public class RepositorioUsuarios: RepositorioBase { if (cli.Dni == 0) return false; cli.Idgrupos.Add(grupo); + GenerarLog(con, cli.Dni, $"Alta Inquilino: {cli.Dni}"); return Guardar(con); } @@ -52,6 +54,7 @@ public class RepositorioUsuarios: RepositorioBase { if (cli.Dni == 0) return false; cli.Idgrupos.Add(grupo); + GenerarLog(con, cli.Dni, $"Alta Propietario: {cli.Dni}"); return Guardar(con); } @@ -67,7 +70,8 @@ public class RepositorioUsuarios: RepositorioBase { 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); @@ -126,7 +130,7 @@ public class RepositorioUsuarios: RepositorioBase { return list; } - public bool AñadirClienteAGrupo(string email, string grupo) { + public bool AñadirClienteAGrupo(string email, string grupo, long dni) { var con = Context; var cli = con.Clientes.Include(x => x.Idgrupos).FirstOrDefault(x => x.Email == email); @@ -137,10 +141,11 @@ public class RepositorioUsuarios: RepositorioBase { } cli.Idgrupos.Add(gru); + GenerarLog(con, dni, $"Añadir grupo: {gru.Nombre}"); return Guardar(con); } - public bool EliminarClienteAGrupo(string email, string grupo) { + public bool EliminarClienteAGrupo(string email, string grupo, long dniresponsable) { var con = Context; var cli = con.Clientes.Include(x => x.Idgrupos).FirstOrDefault(x => x.Email == email); @@ -150,6 +155,7 @@ public class RepositorioUsuarios: RepositorioBase { return false; } cli.Idgrupos.Remove(gru); + GenerarLog(con, dniresponsable, $"Eliminar de grupo: {gru.Nombre}"); return Guardar(con); } @@ -164,7 +170,7 @@ public class RepositorioUsuarios: RepositorioBase { } else { cli.Habilitado = 0; } - + GenerarLog(con, cli.Dni, $"Baja cliente id: {cli.Dni}"); return Guardar(con); } @@ -181,4 +187,18 @@ public class RepositorioUsuarios: RepositorioBase { if (cli == null|| cli.Dni == 0) return null; return cli; } + + public bool PatchUsuario(UpdateUsuarioAdmin dto, long dni, long responsabledni) { + var con = Context; + var usu = con.Clientes.FirstOrDefault(x=>x.Dni ==dni); + if (usu == null) return false; + + usu.Nombre = dto.Nombre; + usu.Apellido = dto.Apellido; + usu.Celular = dto.Celular; + usu.Domicilio = dto.Domicilio; + + GenerarLog(con, responsabledni, "Patch Usuario"); + return Guardar(con); + } } diff --git a/Modelo/RepositorioVentas.cs b/Modelo/RepositorioVentas.cs new file mode 100644 index 0000000..6ead78f --- /dev/null +++ b/Modelo/RepositorioVentas.cs @@ -0,0 +1,113 @@ +using Entidades; +using Microsoft.EntityFrameworkCore; + +namespace Modelo; +public class RepositorioVentas: RepositorioBase { + public bool EfectuarVenta(long idventa) { + var con = Context; + var vent = con.Ventas.Include(x=>x.IdpropiedadNavigation).FirstOrDefault(x => x.Id == idventa); + if (vent == null||vent.Idestado != 2) return false; + + vent.IdpropiedadNavigation.Dnipropietario = vent.IdComprador; + + vent.IdpropiedadNavigation.Idestado=3; + vent.Idestado=3; + vent.Fechafinal = DateTime.Now; + return Guardar(con); + } + + public bool IniciarVenta(Venta v, long dni) { + var con = Context; + v.Id = (con.Ventas.Any()?con.Ventas.Count():0)+1; + + con.Ventas.Add(v); + GenerarLog(con, dni, "Alta Venta espera recibo"); + return Guardar(con); + } + + public Contrato? ObtenerVentaPorContrato(long idcontrato) { + var con = Context; + var c = con.Contratos.Include(x=>x.Idcanons).Include(x=>x.IdventaNavigation).ThenInclude(x=>x.IddivisaNavigation) + .FirstOrDefault(x=>x.Id == idcontrato); + if (c == null || c.IdventaNavigation == null) return null; + return c; + } + + public Venta? ObtenerVentaPorId(long idventa) { + var con = Context; + var vent = con.Ventas + .Include(x=>x.IddivisaNavigation) + .Include(x=>x.IdestadoNavigation) + .Include(x=>x.IdVendedorNavigation) + .Include(x=>x.IdCompradorNavigation) + .Include(x=>x.IdpropiedadNavigation) + .Where(x=>x.Idestado != 1) + .FirstOrDefault(x=>x.Id == idventa); + if (vent == null) return null; + return vent; + } + + public IQueryable? ObtenerVentasPorDni(long dni) { + var con = Context; + var venta = con.Ventas + .Include(x=>x.IddivisaNavigation) + .Include(x=>x.IdestadoNavigation) + .Include(x=>x.IdVendedorNavigation) + .Include(x=>x.IdCompradorNavigation) + .Include(x=>x.IdpropiedadNavigation) + .Where(x=>(x.IdComprador == dni || x.IdVendedor == dni) && x.Idestado!=1 ) + .Distinct(); + return venta; + } + + public bool PatchVenta(Venta venta, long dni) { + var con = Context; + var a = con.Ventas.FirstOrDefault(x=>x.Id == venta.Id); + + a.IdVendedor = venta.IdVendedor; + a.IdComprador = venta.IdComprador; + 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, 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); + } + + public bool SetVenta(int idpropiedad, decimal monto, int iddivisa, long dni) { + var con = Context; + Propiedade? cont = con.Propiedades.Include(x=>x.Contratos).FirstOrDefault(x=>x.Id == idpropiedad); + if (cont==null) return false; + if (cont.Idestado == 2 || cont.Idestado == 4) return false; + if (cont.Contratos.Any(x=>x.Habilitado == 1 && x.Cancelado == 0)) return false; + + cont.Monto = monto; + cont.Iddivisa = iddivisa; + cont.Idestado = 4; + GenerarLog(con, dni, "Se puso la propiedad de venta"); + return Guardar(con); + } + + public bool UnSetVenta(int id, decimal monto, int iddivisa, long dni) { + var con = Context; + Propiedade? cont = con.Propiedades.Include(x=>x.Venta).Include(x=>x.Contratos).FirstOrDefault(x=>x.Id == id); + if (cont==null) return false; + if (cont.Idestado != 4) return false; + if (cont.Contratos.Any(x=>x.Habilitado == 1 && x.Cancelado == 0)) return false; + if (cont.Venta.Any(x=>x.Idestado == 2)) return false; + + cont.Monto = monto; + cont.Iddivisa = iddivisa; + cont.Idestado = 3; + GenerarLog(con, dni, "Se Bajo la propiedad de venta"); + return Guardar(con); + } +} \ No newline at end of file