diff --git a/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs index ab8a5e5..6665c4d 100644 --- a/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs +++ b/Aspnet/Builder/DtoBuilder/ContratoPropiedadDtoBuilder.cs @@ -1,74 +1,94 @@ using Entidades.Dto; namespace AlquilaFacil.Builder; -public class ContratoPropiedadDtoBuilder : Builder{ - public ContratoPropiedadDtoBuilder SetId(long id ){ +public class ContratoPropiedadDtoBuilder : Builder +{ + public ContratoPropiedadDtoBuilder SetId(long id) + { data.id = id; return this; } - public ContratoPropiedadDtoBuilder SetUbicacion(string ub){ + public ContratoPropiedadDtoBuilder SetUbicacion(string ub) + { data.Ubicacion = ub; return this; } - public ContratoPropiedadDtoBuilder SetTipo(string tipo){ + public ContratoPropiedadDtoBuilder SetTipo(string tipo) + { data.TipoPropiedad = tipo; return this; } - public ContratoPropiedadDtoBuilder SetFechaInicio(DateTime fec) { + public ContratoPropiedadDtoBuilder SetFechaInicio(DateTime fec) + { data.Fechainicio = fec; return this; } - public ContratoPropiedadDtoBuilder SetInquilino(string inquilino){ + public ContratoPropiedadDtoBuilder SetInquilino(string inquilino) + { data.Inquilino = inquilino; return this; } - public ContratoPropiedadDtoBuilder SetPropietario(string propietario){ + public ContratoPropiedadDtoBuilder SetPropietario(string propietario) + { data.Propietario = propietario; return this; } - public ContratoPropiedadDtoBuilder SetEstado(ulong habilitado, ulong cancelado) { - bool Habilitado = habilitado == 0?false:true; - bool Cancelado = cancelado == 0?false:true; + public ContratoPropiedadDtoBuilder SetEstado(ulong habilitado, ulong cancelado) + { + bool Habilitado = habilitado == 0 ? false : true; + bool Cancelado = cancelado == 0 ? false : true; - if (Habilitado == true && Cancelado == false){ + if (Habilitado == true && Cancelado == false) + { data.Estado = "Alquiler Iniciado"; - } else if (Cancelado == true && Habilitado == false) { + } + else if (Cancelado == true && Habilitado == false) + { data.Estado = "Nunca Empezo Esta Cancelado"; - } else if (Habilitado == false && Cancelado ==false){ + } + else if (Habilitado == false && Cancelado == false) + { data.Estado = "Esta en Proceso"; - } else if (Habilitado == true && Cancelado == true){ + } + else if (Habilitado == true && Cancelado == true) + { data.Estado = "Terminado"; } return this; } - public ContratoPropiedadDtoBuilder SetHabitaciones(int habitaciones){ + public ContratoPropiedadDtoBuilder SetHabitaciones(int habitaciones) + { data.Habitaciones = habitaciones; return this; } - public ContratoPropiedadDtoBuilder SetPiso(int piso){ + public ContratoPropiedadDtoBuilder SetPiso(int piso) + { data.Piso = piso; return this; } - public ContratoPropiedadDtoBuilder SetLetra(string letra){ + public ContratoPropiedadDtoBuilder SetLetra(string letra) + { data.Letra = letra; return this; } - public ContratoPropiedadDtoBuilder SetMesesAumento(int mesesAumento){ + public ContratoPropiedadDtoBuilder SetMesesAumento(int mesesAumento) + { data.MesesAumento = mesesAumento; return this; } - public ContratoPropiedadDtoBuilder SetMesesDuracion(int mesesDurationContrato) { + public ContratoPropiedadDtoBuilder SetMesesDuracion(int mesesDurationContrato) + { data.MesesDuracion = mesesDurationContrato; return this; } diff --git a/Aspnet/Builder/DtoBuilder/GrupoyPermisoDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/GrupoyPermisoDtoBuilder.cs new file mode 100644 index 0000000..ad02d72 --- /dev/null +++ b/Aspnet/Builder/DtoBuilder/GrupoyPermisoDtoBuilder.cs @@ -0,0 +1,50 @@ +using Entidades.Dto; + +namespace AlquilaFacil.Builder; +public class GrupoDtoBuilder : Builder +{ + public GrupoDtoBuilder ConNombre(string nombre) + { + data.Nombre = nombre; + return this; + } + + public GrupoDtoBuilder ConHabilitado(bool habilitado) + { + data.Habilitado = habilitado; + return this; + } + + public GrupoDtoBuilder ConIdGrupo(int id) + { + data.idgrupo = id; + return this; + } + + public GrupoDtoBuilder ConGruposIncluidos(HashSet grupos) + { + data.GruposIncluidos = grupos; + return this; + } + + public GrupoDtoBuilder ConPermisos(List permisos) + { + data.Permisos = permisos; + return this; + } +} + +public class PermisoDtoBuilder : Builder +{ + public PermisoDtoBuilder ConId(int id) + { + data.Id = id; + return this; + } + + public PermisoDtoBuilder ConDescripcion(string descripcion) + { + data.Descripcion = descripcion; + return this; + } +} diff --git a/Aspnet/Builder/DtoBuilder/UsuarioDtoBuilder.cs b/Aspnet/Builder/DtoBuilder/UsuarioDtoBuilder.cs new file mode 100644 index 0000000..88bc7cb --- /dev/null +++ b/Aspnet/Builder/DtoBuilder/UsuarioDtoBuilder.cs @@ -0,0 +1,41 @@ +using Entidades.Dto; + +namespace AlquilaFacil.Builder; +public class UsuarioDtoBuilder : Builder +{ + public UsuarioDtoBuilder SetDni(long dni) + { + data.Dni = dni; + return this; + } + public UsuarioDtoBuilder SetNombre(string nombre) + { + data.Nombre = nombre; + return this; + } + public UsuarioDtoBuilder SetApellido(string apellido) + { + data.Apellido = apellido; + return this; + } + public UsuarioDtoBuilder SetDomicilio(string domicilio) + { + data.Domicilio = domicilio; + return this; + } + public UsuarioDtoBuilder SetCelular(string celular) + { + data.Celular = celular; + return this; + } + public UsuarioDtoBuilder SetEmail(string email) + { + data.Email = email; + return this; + } + public UsuarioDtoBuilder SetEmailRecuperacion(string? email) + { + data.EmailRecuperacion = email ?? ""; + return this; + } +} diff --git a/Aspnet/Builder/PermisoBuilder.cs b/Aspnet/Builder/PermisoBuilder.cs new file mode 100644 index 0000000..c6753d3 --- /dev/null +++ b/Aspnet/Builder/PermisoBuilder.cs @@ -0,0 +1,15 @@ +using Entidades; +public class PermisoBuilder : Builder +{ + public PermisoBuilder SetDescripcion(string desc) + { + data.Descripcion = desc; + return this; + } + + public PermisoBuilder SetID(int id) + { + data.Id = id; + return this; + } +} diff --git a/Aspnet/Controllers/AccionesController.cs b/Aspnet/Controllers/AccionesController.cs index 9be95b8..8c4b9a9 100644 --- a/Aspnet/Controllers/AccionesController.cs +++ b/Aspnet/Controllers/AccionesController.cs @@ -1,20 +1,20 @@ -using System.ComponentModel.DataAnnotations; using Entidades.Dto; using Microsoft.AspNetCore.Mvc; using Modelo; -using System.Text.Json; +using Entidades; - namespace AlquilaFacil.Controllers; [ApiController] -public class AccionesController: ControllerBase { - +public class AccionesController : ControllerBase +{ + [HttpGet("api/acciones")] - public IActionResult ListarAccionesPorUsuario([FromHeader(Name ="Email")] string Email, [FromHeader(Name = "Auth")] string Auth) { + public IActionResult ListarAccionesPorUsuario([FromHeader(Name = "Email")] string Email, [FromHeader(Name = "Auth")] string Auth) + { if (Email == "" || Email == null) return BadRequest(); - - if (Auth == "") return Unauthorized(new { esValido = false}); + + if (Auth == "") return Unauthorized(new { esValido = false }); bool esValido = RepositorioUsuarios.Singleton.CheckToken(Email, Auth); if (!esValido) return Unauthorized(); @@ -24,9 +24,11 @@ public class AccionesController: ControllerBase { return Ok(Permisos); } + [HttpPost("api/acciones/grupo")] - public IActionResult ListarAccionesPorGrupo([FromHeader(Name = "Auth")] string Auth, - [FromBody] AccionesPorGrupoDto req) { + public IActionResult ListarAccionesPorGrupo([FromHeader(Name = "Auth")] string Auth, + [FromBody] AccionesPorGrupoDto req) + { if (string.IsNullOrEmpty(Auth)) return BadRequest(); bool esValido = RepositorioUsuarios.Singleton.CheckToken(req.Email, Auth); if (esValido == false) return BadRequest(esValido); @@ -37,4 +39,35 @@ public class AccionesController: ControllerBase { var permisos = RepositorioGrupos.Singleton.ListarPermisosDeGrupo(req.Grupo); return Ok(permisos); } -} \ No newline at end of file + /* + [HttpPost("api/acciones/crear")] //creo que es codido duplicado + public IActionResult CrearAcciones([FromHeader(Name = "Auth")] string Auth, + [FromBody] CrearAccionesDto req) + { + if (string.IsNullOrEmpty(Auth)) return BadRequest(); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 1); //wip lo voy a usar para crear el permiso que va + if (ret == false) return Unauthorized(); + + if (string.IsNullOrWhiteSpace(req.Descripcion)) + { + return BadRequest(new { message = "La descripción no puede estar vacía" }); + } + + if (req.Descripcion.Length > 25) + { + return BadRequest(new { message = "La descripción no puede ser mayor a 25 caracteres" }); + } + + var per = new Permiso + { + Descripcion = req.Descripcion, + }; + var ret2 = RepositorioPermisos.Singleton.CrearPermiso(per); + return ret2 ? Ok(new { message = "se creo correctamente" }) : BadRequest(new { message = "No se pudo crear el permiso" }); + } + */ +} diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index d41d0e0..1d895c6 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -47,7 +47,7 @@ public class AdminController: ControllerBase [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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); if (id <= 0) return BadRequest(new { message = "No hay propiedades con id igual o menor a 0"}); @@ -89,7 +89,7 @@ public class AdminController: ControllerBase [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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); @@ -123,7 +123,7 @@ public class AdminController: ControllerBase [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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); @@ -161,7 +161,7 @@ public class AdminController: ControllerBase [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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); @@ -188,7 +188,7 @@ public class AdminController: ControllerBase [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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); @@ -269,6 +269,7 @@ public class AdminController: ControllerBase BadRequest(new { message = "Fallo al guardar los datos"}); } + public record GrupoI_D(int Id, string Descripcion); [HttpGet("api/admin/clientes/grupo")] public IActionResult GetGruposByCliente([FromHeader(Name ="Auth")]string Auth, [FromQuery]long Dni){ if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -277,9 +278,10 @@ public class AdminController: ControllerBase if (Dni <= 0) return BadRequest(new {message = "No puede tener un dni con numero negativo o cero"}); - IEnumerable list = RepositorioGrupos.Singleton.ObtenerGruposPorDni(Dni); + IEnumerable list = RepositorioGrupos.Singleton.ObtenerGruposPorDni(Dni).Select(x=> new GrupoI_D(x.Id,x.Nombre)); return Ok(list); } + [HttpPatch("api/admin/cliente/addGrupo")] public IActionResult AddGrupoACliente([FromHeader(Name = "Auth")]string Auth, [FromBody]EmailGrupo data){ if (String.IsNullOrEmpty(Auth)) return Unauthorized(); @@ -362,7 +364,9 @@ public class AdminController: ControllerBase } // lo da de baja si no tiene el grupo propietario y no tiene alquileres pendientes var ret = RepositorioUsuarios.Singleton.BajaCliente(Dni); - return Ok(ret); + return ret ? + Ok(new { message = "Cliente ha sido modificado" }) : + BadRequest(new { message = "No se pudo modificar al cliente" }); } [HttpDelete("api/admin/propiedad")] @@ -416,4 +420,4 @@ public class AdminController: ControllerBase if (d.Domicilio=="")ret+="Campo Domicilio vacio\n"; return ret; } -} \ No newline at end of file +} diff --git a/Aspnet/Controllers/CargaContratoAdminController.cs b/Aspnet/Controllers/CargaContratoAdminController.cs new file mode 100644 index 0000000..e899de6 --- /dev/null +++ b/Aspnet/Controllers/CargaContratoAdminController.cs @@ -0,0 +1,353 @@ +using Microsoft.AspNetCore.Mvc; +using AlquilaFacil.Config; +using Modelo; +using Entidades.Dto; +using Entidades; +using Minio; +using Minio.DataModel; +using Minio.DataModel.Args; +using Minio.Exceptions; +using System.Text.Json; + +[ApiController] +public class CargarContratoAdminController: ControllerBase{ + + [HttpGet("api/admin/contrato/data")] + public IActionResult GetData([FromHeader(Name ="Auth")]string Auth) { + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay usuario por ese token"}); + + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 20); + if (validacion1 == false) return Unauthorized(); + + var divisas = RepositorioDivisas.Singleton.ObtenerDivisas(); + + var propiedades = RepositorioPropiedades.Singleton.ListarPropiedades().ToList() + .Select(x=> new {id = x.id, + ubicacion = x.Ubicacion}); + + var inquilinos = RepositorioInquilinos.Singleton.GetInquilinos().ToList() + .Select(x=>new {dni=x.Dni, nombre = x.Nombre}); + + var propietarios = RepositorioPropietario.Singleton.GetPropietarios().ToList() + .Select(x=>new {dni=x.Dni, nombre = x.Nombre}); + + return Ok(new {divisas, + propiedades, + inquilinos, + propietarios}); + } + + [HttpGet("api/admin/contrato/propieades")] + public IActionResult GetPropiedadesPorPropietario([FromHeader(Name ="Auth")]string Auth, long dnipropietario){ + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay usuario por ese token"}); + + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 20); + if (validacion1 == false) return Unauthorized(); + + var propiedades = RepositorioPropiedades.Singleton.ObtenerPropiedadEnAlquilerPorDni(dnipropietario); + return Ok(propiedades); + } + + [HttpPost("api/admin/contrato/carga")] + public async Task CargaContrato([FromHeader(Name="Auth")]string Auth) { + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay usuario por ese token"}); + + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 20); + if (validacion1 == false) return Unauthorized(); + + if (!Request.HasFormContentType) { + return BadRequest(new { message = "La solicitud debe contener datos de formulario (FormData)." }); + } + + var formData = await Request.ReadFormAsync(); + if (formData == null) { + return BadRequest(new { message = "No se pudieron leer los datos del formulario." }); + } + + var archivoContrato = Request.Form.Files.FirstOrDefault(x=>x.Name =="archivoContrato"); + if (archivoContrato == null) return BadRequest(new { message = "Falto Subir el archivo" }); + + if (archivoContrato.ContentType != "application/pdf") { + return BadRequest(new { message = "El archivo debe ser un PDF." }); + } + + Contrato? cont; IActionResult? req; + + (cont, req) = ParseContratoFromForm(formData); + if (req != null && cont == null) return req; + + var ret = RepositorioContratos.Singleton.AdminCargaContrato(cont, cli.Dni); + if(ret == false) return BadRequest( new {message = "No se pudo cargar el contrato" }); + + var inq = RepositorioUsuarios.Singleton.ObtenerClientePorDni(cont.Dniinquilino??0); + + cont = RepositorioContratos.Singleton.ObtenerContrato(inq.Email, cont.Idpropiedad ?? 0); + if (cont == null) return BadRequest(new { message = "No se pudo recuperar el contrato" }); + + + string nuevoNombreArchivo = $"id:{cont.Id}-inq:{cont.Dniinquilino}-propi:{cont.Dnipropietario}-idprop:{cont.Idpropiedad}.pdf"; + + ret = await subirContrato(archivoContrato, nuevoNombreArchivo); + if (ret == false) return BadRequest(new { message = "No se pudo subir el archivo" }); + + ret = RepositorioContratos.Singleton.AddUrl(cont.Id, nuevoNombreArchivo, cli.Dni); + if (ret == false) return BadRequest(new { message = "No se pudo guardar la url del contrato" }); + + ret = RepositorioContratos.Singleton.GenerarCanones(cont.Id, cli.Dni); + if (ret == false) return BadRequest( new { message = "Fallo al generar canones" }); + + var noti = new NotificacioneBuilder() + .SetDniremitente(int.Parse(cli.Dni.ToString())) + .SetIdpropiedad(cont.Idpropiedad ?? 0) + .SetDnicliente(cont.Dniinquilino ?? 0) + .SetAccion("Notificacion") + .SetMensaje($"Contrato Cargado desde Administracion") + .SetFecha(DateTime.Now) + .SetLeido(false) + .Build(); + + var noti2 = new NotificacioneBuilder() + .SetDniremitente(int.Parse(cli.Dni.ToString())) + .SetIdpropiedad(cont.Idpropiedad ?? 0) + .SetDnicliente(cont.Dnipropietario ?? 0) + .SetAccion("Notificacion") + .SetMensaje($"Contrato Cargado desde Administracion") + .SetFecha(DateTime.Now) + .SetLeido(false) + .Build(); + + ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); + if (ret == false) return BadRequest( new { message = "No se pudo entregar la notificacion al inquilino" }); + + ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti2); + if (ret == false) return BadRequest( new { message = "No se pudo entregar la notificacion al propietario" }); + + return Ok(new { message = "Se cargo el contrato" }); + + + } + + private (Contrato? contratoDto, IActionResult? errorResult) ParseContratoFromForm(IFormCollection formData) { + if (formData == null) { + return (null, BadRequest(new { message = "No se pudieron leer los datos del formulario." })); + } + + bool TryParseInt(string? value, out int result) => int.TryParse(value, out result); + bool TryParseLong(string? value, out long result) => long.TryParse(value, out result); + bool TryParseDecimal(string? value, out decimal result) => decimal.TryParse(value, out result); + bool TryParseBool(string? value, out bool result) => bool.TryParse(value, out result); + + int cantGarantMin = 0; + if (formData.TryGetValue("cantgarantemin", out var cantGarantMinValues) && + !string.IsNullOrEmpty(cantGarantMinValues.FirstOrDefault()) && + !TryParseInt(cantGarantMinValues.FirstOrDefault(), out cantGarantMin)) { + return (null, BadRequest(new { message = "Campo 'cantgarantemin' inválido." })); + } + if (cantGarantMin<1) return (null, BadRequest(new { message = "Minimo 1 garante" })); + + if (!formData.TryGetValue("dniinquilino", out var dniInqValues) || + string.IsNullOrEmpty(dniInqValues.FirstOrDefault()) || + !TryParseLong(dniInqValues.FirstOrDefault(), out long dniInquilino)) { + return (null, BadRequest(new { message = "Campo 'dniinquilino' inválido o faltante." })); + } + if (dniInquilino<=0) return (null, BadRequest(new { message = "No pueden haber dni 0 o menor" })); + + if (!formData.TryGetValue("dnipropietario", out var dniPropValues) || + string.IsNullOrEmpty(dniPropValues.FirstOrDefault()) || + !TryParseLong(dniPropValues.FirstOrDefault(), out long dniPropietario)) { + return (null, BadRequest(new { message = "Campo 'dnipropietario' inválido o faltante." })); + } + if (dniPropietario<=0) return (null, BadRequest(new { message = "No pueden haber dni 0 o menor" })); + + if (!formData.TryGetValue("iddivisa", out var idDivisaValues) || + string.IsNullOrEmpty(idDivisaValues.FirstOrDefault()) || + !TryParseInt(idDivisaValues.FirstOrDefault(), out int idDivisa)) { + return (null, BadRequest(new { message = "Campo 'iddivisa' inválido o faltante." })); + } + + if (!formData.TryGetValue("idpropiedad", out var idPropValues) || + string.IsNullOrEmpty(idPropValues.FirstOrDefault()) || + !TryParseInt(idPropValues.FirstOrDefault(), out int idPropiedad)) { + return (null, BadRequest(new { message = "Campo 'idpropiedad' inválido o faltante." })); + } + + if (!formData.TryGetValue("mesesDurationContrato", out var mesesDurValues) || + string.IsNullOrEmpty(mesesDurValues.FirstOrDefault()) || + !TryParseInt(mesesDurValues.FirstOrDefault(), out int mesesDuration)) { + return (null, BadRequest(new { message = "Campo 'mesesDurationContrato' inválido o faltante." })); + } + + if (mesesDuration <= 0){ + return (null, BadRequest(new { message = "No se cargaron los meses de duracion del contrato" })); + } + + int mesesHastaAumento = 0; + if (formData.TryGetValue("mesesHastaAumento", out var mesesHastaValues) && + !string.IsNullOrEmpty(mesesHastaValues.FirstOrDefault())) { + if (!TryParseInt(mesesHastaValues.FirstOrDefault(), out mesesHastaAumento)) + { + return (null, BadRequest(new { message = "Campo 'mesesHastaAumento' inválido." })); + } + } + + if (mesesHastaAumento <= 0){ + return (null, BadRequest(new { message = "No se cargaron los meses hasta el aumento" })); + } + if (mesesDuration(); + + var garanteKeys = formData.Keys.Where(k => k.StartsWith("garantes[")).ToList(); + var garanteCount = garanteKeys.Count / 6; + + for (int i = 0; i < garanteCount; i++) { + + int dni = 0; + if (formData.TryGetValue($"garantes[{i}].dni", out var dniValue) && + !string.IsNullOrEmpty(dniValue.FirstOrDefault())) + { + int.TryParse(dniValue.FirstOrDefault(), out dni); + } + + var nombre = formData.TryGetValue($"garantes[{i}].nombre", out var nombreValue) ? nombreValue.ToString() ?? "" : ""; + var apellido = formData.TryGetValue($"garantes[{i}].apellido", out var apellidoValue) ? apellidoValue.ToString() ?? "" : ""; + var domicilio = formData.TryGetValue($"garantes[{i}].domicilio", out var domicilioValue) ? domicilioValue.ToString() ?? "" : ""; + var celular = formData.TryGetValue($"garantes[{i}].celular", out var celularValue) ? celularValue.ToString() ?? "" : ""; + var domicilioLaboral = formData.TryGetValue($"garantes[{i}].domicilioLaboral", out var domLaboralValue) ? domLaboralValue.ToString() ?? "" : ""; + + var garante = new Garante{ + Dni = dni, + Nombre = nombre, + Apellido = apellido, + Domicilio = domicilio, + Celular = celular, + Domiciliolaboral = domicilioLaboral + }; + garantes.Add(garante); + } + + return garantes.ToArray(); + } + + + private readonly IMinioClient mc; + public CargarContratoAdminController(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("0.0.0.0: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; + } + } +} diff --git a/Aspnet/Controllers/ContratoController.cs b/Aspnet/Controllers/ContratoController.cs index f617f37..0740652 100644 --- a/Aspnet/Controllers/ContratoController.cs +++ b/Aspnet/Controllers/ContratoController.cs @@ -15,30 +15,34 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class ContratoController: ControllerBase { - +public class ContratoController : ControllerBase +{ + [HttpPost("api/contrato/GenerarRecibo")] - public ActionResult GenerarRecibo([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto, bool html= true) { + public ActionResult GenerarRecibo([FromHeader(Name = "Auth")] string Auth, MarcarPagoDto dto, bool html = true) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false){ - validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { return Unauthorized(); } } - if (dto.Idcontrato <= 0) return BadRequest(new { message = "No puede tener un contrato con id 0 o menor"}); + if (dto.Idcontrato <= 0) return BadRequest(new { message = "No puede tener un contrato con id 0 o menor" }); Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.Idcontrato); - if (cont == null) return BadRequest(new { message = "No hay un contrato por ese id"}); + if (cont == null) return BadRequest(new { message = "No hay un contrato por ese id" }); if (cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null || - cont.IdpropiedadNavigation.IdtipropiedadNavigation == null) return BadRequest(new { message = "comunicate con el admin esta mal cargado el contratod de alguina forma"}); + cont.IdpropiedadNavigation.IdtipropiedadNavigation == null) return BadRequest(new { message = "comunicate con el admin esta mal cargado el contratod de alguina forma" }); Canon? can = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); - if (can == null) return BadRequest(new { message = "no hay un canon para ese contrato con esa fecha"}); - if (can.IdreciboNavigation == null) return BadRequest(new { message = "No hay un recibo para ese canon"}); + if (can == null) return BadRequest(new { message = "no hay un canon para ese contrato con esa fecha" }); + if (can.IdreciboNavigation == null) return BadRequest(new { message = "No hay un recibo para ese canon" }); var cdb = new ContratoDtoBuilder() .SetInquilino($"{cont.DniinquilinoNavigation.Nombre} {cont.DniinquilinoNavigation.Apellido}") @@ -52,124 +56,138 @@ public class ContratoController: ControllerBase { var dof = new DocumentoFacade(); MemoryStream? memstr = new(); - if (html){ + if (html) + { dof.GenerarHtml(cdb, can.IdreciboNavigation, memstr); return File(memstr, "text/html", "Recibo.html"); - } else { - dof.GenerarPdf (cdb, can.IdreciboNavigation, memstr); + } + else + { + dof.GenerarPdf(cdb, can.IdreciboNavigation, memstr); return File(memstr, "application/pdf", "Recibo.pdf"); } } [HttpPost("api/contratos/marcarPago")] - public IActionResult marcarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + public IActionResult marcarPago([FromHeader(Name = "Auth")] string Auth, MarcarPagoDto dto) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false)return Unauthorized(); - if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + 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(); + 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"}); + 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 propietario o intenta volviendote a logear"}); + if (cli.Dni != cont.Dnipropietario) return BadRequest(new { message = "No sos propietario o intenta volviendote a logear" }); Canon? c = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); - if (c == null) return BadRequest(new { message = "no hay un canon por esa id"}); + if (c == null) return BadRequest(new { message = "no hay un canon por esa id" }); - Recibo re = new Recibo{ + Recibo re = new Recibo + { Monto = c.Monto, Fecha = DateTime.Now, }; bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); return ret ? - Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + Ok(new { message = "Se guardo correctamente" }) : BadRequest(new { message = "No se pudo guardar" }); } [HttpPost("api/contratos/realizarPago")] - public IActionResult realizarPago([FromHeader(Name="Auth")]string Auth, MarcarPagoDto dto) { + public IActionResult realizarPago([FromHeader(Name = "Auth")] string Auth, MarcarPagoDto dto) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); if (validacion1 == false) return Unauthorized(); - if (dto.Idcontrato<=0) return BadRequest(new { message = "No puede existir un contrato con id 0 o menor"}); + 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(); + 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"}); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id" }); - if (cli.Dni != cont.Dniinquilino) return BadRequest(new {message = "No sos inquilino o intenta volviendote a logear"}); + if (cli.Dni != cont.Dniinquilino) return BadRequest(new { message = "No sos inquilino o intenta volviendote a logear" }); Canon? c = RepositorioCanons.Singleton.ObtenerCanonContrato(dto.fecha, dto.Idcontrato); - if (c == null) return BadRequest(new { message = "no hay un canon por esa id"}); + if (c == null) return BadRequest(new { message = "no hay un canon por esa id" }); - Recibo re = new Recibo{ + Recibo re = new Recibo + { Monto = c.Monto, Fecha = DateTime.Now, }; bool ret = RepositorioCanons.Singleton.SetRecibo(c, re, cli.Dni); return ret ? - Ok(new { message = "Se guardo correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + Ok(new { message = "Se guardo correctamente" }) : BadRequest(new { message = "No se pudo guardar" }); } [HttpPost("api/contratos/crearcanons")] - public IActionResult crearCanons([FromHeader(Name="Auth")]string Auth, CrearCanonsDto dto){ + public IActionResult crearCanons([FromHeader(Name = "Auth")] string Auth, CrearCanonsDto dto) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false)return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); if (cli == null) return Unauthorized(); - - if (dto.idcontrato <=0) return BadRequest(new { message ="estan mal cargados los datos"}); - + + if (dto.idcontrato <= 0) return BadRequest(new { message = "estan mal cargados los datos" }); + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(dto.idcontrato); - 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"}); + 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, cli.Dni); return ret ? - Ok(new { message = "Se crearon los canons correctamente"}):BadRequest(new { message = "No se pudo guardar"}); + Ok(new { message = "Se crearon los canons correctamente" }) : BadRequest(new { message = "No se pudo guardar" }); } [HttpGet("api/contratos/canon")] - public ActionResult getCanons([FromHeader(Name="Auth")]string Auth, int id = 0) { + public ActionResult getCanons([FromHeader(Name = "Auth")] string Auth, int id = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false){ - validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { return Unauthorized(); } } Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if(cli == null) return Unauthorized(); + if (cli == null) return Unauthorized(); var cont = RepositorioContratos.Singleton.ObtenerContratoPorId(id); - if (cont == null) return BadRequest(new { message = "No existe el contrato"}); - if ( cont.Dnipropietario != cli.Dni && cont.Dniinquilino != cli.Dni) return Unauthorized(); + if (cont == null) return BadRequest(new { message = "No existe el contrato" }); + if (cont.Dnipropietario != cli.Dni && cont.Dniinquilino != cli.Dni) return Unauthorized(); var list = RepositorioCanons.Singleton.ObtenerCanonsPorContrato(id); - if (list == null) return BadRequest(new { message = "No hay contrato por esa id"}); + if (list == null) return BadRequest(new { message = "No hay contrato por esa id" }); - string divisa =""; + string divisa = ""; if (cont.Iddivisa == 0) divisa = "AR$"; else if (cont.Iddivisa == 1) divisa = "US$"; - + List d = new(); - foreach (var i in list) { + foreach (var i in list) + { + int totalMeses = (i.Fecha.Year - cont.Fechainicio.Year) * 12 + (i.Fecha.Month - cont.Fechainicio.Month); + int mesNum = totalMeses + 1; 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) + .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) + .SetMesNum(mesNum) .SetMonto(i.Monto) .Build(); d.Add(c); @@ -179,18 +197,20 @@ public class ContratoController: ControllerBase { } [HttpGet("api/contratos/propietario")] - public IActionResult ObtenerContratosPorPropietario([FromHeader(Name="Auth")]string Auth) { + public IActionResult ObtenerContratosPorPropietario([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + if (cli == null) return Unauthorized(); var list = RepositorioContratos.Singleton.ObtenerContratosDePropietario(cli.Dni); List dtos = new(); - foreach (var i in list) { + foreach (var i in list) + { if (i.DniinquilinoNavigation == null || i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null) continue; @@ -209,19 +229,20 @@ public class ContratoController: ControllerBase { } [HttpGet("api/contrato/propietario")] - public IActionResult ObtenerContratoPorPropietarioPorId([FromHeader(Name="Auth")]string Auth, int id=0) { + public IActionResult ObtenerContratoPorPropietarioPorId([FromHeader(Name = "Auth")] string Auth, int id = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + if (cli == null) return Unauthorized(); - if (id <= 0) return BadRequest(new { message = "No hay propiedades con id igual o menor a 0"}); + 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"}); - if (cli.Dni != i.Dnipropietario) return BadRequest(new { message = "No sos el propietario"}); + i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null) return BadRequest(new { message = "Fallo la query" }); + if (cli.Dni != i.Dnipropietario) return BadRequest(new { message = "No sos el propietario" }); var cont = new ContratoPropiedadDtoBuilder() .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") @@ -232,28 +253,30 @@ public class ContratoController: ControllerBase { .SetFechaInicio(i.Fechainicio) .SetEstado(i.Habilitado, i.Cancelado) .SetHabitaciones(i.IdpropiedadNavigation.Canthabitaciones) - .SetPiso(i.IdpropiedadNavigation.Piso??0) - .SetLetra(i.IdpropiedadNavigation.Letra??"") + .SetPiso(i.IdpropiedadNavigation.Piso ?? 0) + .SetLetra(i.IdpropiedadNavigation.Letra ?? "") .SetMesesAumento(i.MesesHastaAumento) .SetMesesDuracion(i.MesesDurationContrato) .Build(); - + return Ok(cont); } [HttpGet("api/contratos/inquilino")] - public IActionResult ObtenerContratosPorInquilino([FromHeader(Name="Auth")]string Auth) { + public IActionResult ObtenerContratosPorInquilino([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + if (cli == null) return Unauthorized(); var list = RepositorioContratos.Singleton.ObtenerContratosDeInquilino(cli.Dni); - + List dtos = new(); - foreach (var i in list) { + foreach (var i in list) + { if (i.DniinquilinoNavigation == null || i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null) continue; @@ -272,20 +295,21 @@ public class ContratoController: ControllerBase { } [HttpGet("api/contrato/inquilino")] - public IActionResult ObtenerContratoPorInquilinoPorId([FromHeader(Name="Auth")]string Auth, int id=0) { + public IActionResult ObtenerContratoPorInquilinoPorId([FromHeader(Name = "Auth")] string Auth, int id = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + if (cli == null) return Unauthorized(); - if (id <= 0) return BadRequest(new { message = "No hay propiedades con id igual o menor a 0"}); + 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"}); - if (cli.Dni != i.Dniinquilino) return BadRequest(new { message = "No sos el inquilino"}); - + i.IdpropiedadNavigation == null || i.DnipropietarioNavigation == null) return BadRequest(new { message = "Fallo la query" }); + if (cli.Dni != i.Dniinquilino) return BadRequest(new { message = "No sos el inquilino" }); + var cont = new ContratoPropiedadDtoBuilder() .SetInquilino($"{i.DniinquilinoNavigation.Nombre} {i.DniinquilinoNavigation.Apellido}") .SetUbicacion(i.IdpropiedadNavigation.Ubicacion) @@ -295,36 +319,35 @@ public class ContratoController: ControllerBase { .SetFechaInicio(i.Fechainicio) .SetEstado(i.Habilitado, i.Cancelado) .SetHabitaciones(i.IdpropiedadNavigation.Canthabitaciones) - .SetPiso(i.IdpropiedadNavigation.Piso??0) - .SetLetra(i.IdpropiedadNavigation.Letra??"") + .SetPiso(i.IdpropiedadNavigation.Piso ?? 0) + .SetLetra(i.IdpropiedadNavigation.Letra ?? "") .SetMesesAumento(i.MesesHastaAumento) .SetMesesDuracion(i.MesesDurationContrato) .Build(); - + return Ok(cont); } - + [HttpPost("api/contratos/precontrato")] - public IActionResult IniciarPrecontrato([FromHeader(Name = "Auth")]string Auth, [FromBody] PrecontratoDto dto) { - if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) return Unauthorized(); + public IActionResult IniciarPrecontrato([FromHeader(Name = "Auth")] string Auth, [FromBody] PrecontratoDto dto) + { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); string validacion2 = ValidarDtoPrecontrato(dto); - if (validacion2 != "") return BadRequest(new {message = validacion2}); - + if (validacion2 != "") return BadRequest(new { message = validacion2 }); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "Tu token no corresponde a ningun cliente (volvete a logear)"}); - if (cli.Email != dto.EmailPropietario) return BadRequest(new {message = "No Corresponde el email de propietario con el del token"}); - + if (cli == null) return BadRequest(new { message = "Tu token no corresponde a ningun cliente (volvete a logear)" }); + if (cli.Email != dto.EmailPropietario) return BadRequest(new { message = "No Corresponde el email de propietario con el del token" }); + Cliente? propi = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(dto.EmailPropietario); - if (propi == null || propi.Dni == 0) return BadRequest(new {message = "No hay propietario por ese email"}); + if (propi == null || propi.Dni == 0) return BadRequest(new { message = "No hay propietario por ese email" }); Cliente? inq = RepositorioInquilinos.Singleton.ObtenerInquilinoPorEmail(dto.EmailInquilino); - if (inq == null || inq.Dni == 0) return BadRequest(new {message = "No hay inquilinos por ese email"}); + if (inq == null || inq.Dni == 0) return BadRequest(new { message = "No hay inquilinos por ese email" }); Propiedade? p = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(dto.IdPropiedad); - if (p == null || p.Id == 0) return BadRequest(new {message = "La id de propiedad no corresponde a una propiedad"}); + if (p == null || p.Id == 0) return BadRequest(new { message = "La id de propiedad no corresponde a una propiedad" }); var precontrato = new PrecontratoBuilder() .SetHabilitado() @@ -339,7 +362,7 @@ public class ContratoController: ControllerBase { .SetOpcionVenta(dto.TieneOpcionVenta) .Build(); - + var notificacion = new NotificacioneBuilder() .SetAccion("Carge Garantes") .SetDniremitente(propi.Dni) @@ -351,10 +374,14 @@ public class ContratoController: ControllerBase { .Build(); bool ret; - if (dto.TieneOpcionVenta==false){ + if (dto.TieneOpcionVenta == false) + { ret = RepositorioContratos.Singleton.CargaPrecontrato(cli.Dni, precontrato, notificacion); - } else { - Venta v = new Venta{ + } + else + { + Venta v = new Venta + { Idestado = 1, Iddivisa = dto.iddivisa, Monto = dto.MontoOpcion, @@ -362,41 +389,78 @@ public class ContratoController: ControllerBase { ret = RepositorioContratos.Singleton.CargaPrecontratoOpcionVenta(precontrato, notificacion, v, cli.Dni); } - if (ret) { + if (ret == false) return BadRequest(new { message = "No se pudo cargar el precontrato" }); + + if (ret) + { ret = RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, DateTime.Parse(dto.fechaprimernotificacion)); } - return (ret)? - Ok(new {message = "Se Cargo el precontrato y envio una notificacion al inquilino"}): - BadRequest(new {message = "No se pudo cargar el precontrato"}); + + return (ret) ? + Ok(new { message = "Se Cargo el precontrato y envio una notificacion al inquilino" }) : + BadRequest(new { message = "No se pudo enviar la notificacion" }); } - - [HttpPut("api/contratos/addGarantes")] - public IActionResult AddGarantes([FromHeader(Name = "Auth")]string Auth, AltaGarantesDto dto) { + + [HttpGet("api/precontrato/preCargaGarantes/data")] + public IActionResult ObtenerDatosParaMostrarleAlInquilinoPreCargaGarantes([FromHeader(Name="Auth")]string Auth, int propiedadId){ + if (propiedadId<=0) return BadRequest(new { message = "Numero de propiedad inexistente"}); + + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay cliente por ese token" }); + + Contrato? contrato = RepositorioContratos.Singleton.ObtenerPreContratoPorIdDePropiedadyCliente(cli, propiedadId); + + if (contrato == null) return BadRequest(new {message = "no se pudo encontrar los datos del precontrato"}); + + PreContratoDataDto d = new PreContratoDataDto + { + TieneOpcionDeVenta = contrato.Tieneopcionventa == 1, + + MontoOpcionDeVenta = contrato.Tieneopcionventa == 1 && contrato.IdventaNavigation != null + ? contrato.IdventaNavigation.Monto + : null, + + MonedaOpcionDeVenta = contrato.Tieneopcionventa == 1 + && contrato.IdventaNavigation != null + && contrato.IdventaNavigation.IddivisaNavigation != null + ? contrato.IdventaNavigation.IddivisaNavigation.Signo + : null, + + DuracionEnMeses = contrato.MesesDurationContrato, + + FrecuenciaAumentoEnMeses = contrato.MesesHastaAumento + }; + return Ok(d); + } + + [HttpPut("api/contratos/addGarantes")] + public IActionResult AddGarantes([FromHeader(Name = "Auth")] string Auth, AltaGarantesDto dto) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) return Unauthorized(); var validacion2 = ValidarDtoAltaGarantes(dto); - if (validacion2 != "") return BadRequest(new {message = validacion2}); - + if (validacion2 != "") return BadRequest(new { message = validacion2 }); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "Tu token no corresponde a ningun cliente (volvete a logear)"}); - if (cli.Email != dto.EmailInquilino) return BadRequest(new {message = "No Corresponde el email de inquilino con el del token"}); + if (cli == null) return BadRequest(new { message = "Tu token no corresponde a ningun cliente (volvete a logear)" }); + if (cli.Email != dto.EmailInquilino) return BadRequest(new { message = "No Corresponde el email de inquilino con el del token" }); var validacion4 = RepositorioContratos.Singleton.CantidadGarantesEncontrato(dto.EmailInquilino, dto.Idpropiedad); - if (validacion4 <= 0 || dto.garantes.Count()!=validacion4) return BadRequest(new{message="Cantidad de garantes incorrecta"}); + if (validacion4 <= 0 || dto.garantes.Count() != validacion4) return BadRequest(new { message = "Cantidad de garantes incorrecta" }); Cliente? propi = RepositorioPropietario.Singleton.ObtenerPropietarioPorIdPropiedad(dto.Idpropiedad); - if(propi == null) return BadRequest(new{message = "No se encuentra el propietario de la propiedad"}); + if (propi == null) return BadRequest(new { message = "No se encuentra el propietario de la propiedad" }); - foreach (var i in dto.garantes) { + foreach (var i in dto.garantes) + { string validacion3 = ValidarDtoGarante(i); - if (validacion3 != "") return BadRequest( new { message = validacion3 }); + if (validacion3 != "") return BadRequest(new { message = validacion3 }); } - + List gar = new(); - foreach (var i in dto.garantes) { + foreach (var i in dto.garantes) + { Garante g = new GaranteBuilder() .SetNombre(i.Nombre) .SetApellido(i.Apellido) @@ -407,13 +471,14 @@ public class ContratoController: ControllerBase { .Build(); gar.Add(g); } - + var contr = RepositorioContratos.Singleton.ObtenerContrato(dto.EmailInquilino, dto.Idpropiedad); - if (contr == null) return BadRequest(new { message = "No existe el contrato o ya fue activado"}); + 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, cli.Dni); - if (ret) { - Console.WriteLine(dto.fecha); + if (ret) + { + //Console.WriteLine(dto.fecha); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.fecha); var noti = new NotificacioneBuilder() @@ -428,37 +493,38 @@ public class ContratoController: ControllerBase { ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); } return ret ? - Ok(new {message = "Se Añadieron los Garantes"}):BadRequest(new { message = "Fallo la carga"}); + Ok(new { message = "Se Añadieron los Garantes" }) : BadRequest(new { message = "Fallo la carga" }); } [HttpPut("api/contratos/cancelar")] - public IActionResult CancelarPrecontrato([FromHeader(Name = "Auth")]string Auth, CancelarPrecontratoDto dto) { + public IActionResult CancelarPrecontrato([FromHeader(Name = "Auth")] string Auth, CancelarPrecontratoDto dto) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) return Unauthorized(); var validacion2 = ValidarCancelarDto(dto); - if (validacion2 != "") return BadRequest(new {message = validacion2}); + if (validacion2 != "") return BadRequest(new { message = validacion2 }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + 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"}); + 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" }); Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(dto.idpropiedad); - if (prop == null) return BadRequest(new {message = "No existe la propiedad por esa id"}); - if (prop.Dnipropietario != pro.Dni) return BadRequest(new {message = "Este propietario no es el dueño de la propiedad"}); - + if (prop == null) return BadRequest(new { message = "No existe la propiedad por esa id" }); + if (prop.Dnipropietario != pro.Dni) return BadRequest(new { message = "Este propietario no es el dueño de la propiedad" }); + var inq = RepositorioInquilinos.Singleton.ObtenerInquilinoPorEmail(dto.EmailInquilino); - if (inq == null) return BadRequest(new {message = "No hay un inquilino por ese email"}); + if (inq == null) return BadRequest(new { message = "No hay un inquilino por ese email" }); var ret = RepositorioContratos.Singleton.CancelarPrecontrato(dto.EmailInquilino, dto.idpropiedad, cli.Dni); - if (ret) { + if (ret) + { prop.Idestado = 1; ret = RepositorioPropiedades.Singleton.PatchPropiedad(prop, pro.Dni); - if (ret){ + if (ret) + { RepositorioNotificaciones.Singleton.MarcarComoLeido(pro.Dni, dto.fecha); var noti = new NotificacioneBuilder() .SetAccion("ContratoCancelado") @@ -470,35 +536,43 @@ public class ContratoController: ControllerBase { .SetLeido(false) .Build(); ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); - if (ret){ - return Ok(new {message = "Se cancelo el precontrato"}); - }else{ - return Ok(new {message = "Se cancelo el precontrato, pero no se pudo notificar al inquilino"}); + if (ret) + { + return Ok(new { message = "Se cancelo el precontrato" }); + } + else + { + return Ok(new { message = "Se cancelo el precontrato, pero no se pudo notificar al inquilino" }); } - }else{ - return BadRequest(new {message = "No se pudo setear la propiedad como Disponible en busqueda"}); } - }else{ - return BadRequest(new {message = "Se fallo al intentar cancelar el precontrato"}); + else + { + return BadRequest(new { message = "No se pudo setear la propiedad como Disponible en busqueda" }); + } + } + else + { + return BadRequest(new { message = "Se fallo al intentar cancelar el precontrato" }); } } [HttpGet("api/contratos/precontrato/listaGarantes")] - public IActionResult ObtenerListaGarantes([FromHeader(Name = "Auth")]string Auth, long idcontrato = 0, [FromQuery] string EmailPropietario = "" ) { + public IActionResult ObtenerListaGarantes([FromHeader(Name = "Auth")] string Auth, long idcontrato = 0, [FromQuery] string EmailPropietario = "") + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) return Unauthorized(); - - if (idcontrato == 0 || EmailPropietario == "") return BadRequest(new { message = "Estan mal cargados los datos"}); + + if (idcontrato == 0 || EmailPropietario == "") return BadRequest(new { message = "Estan mal cargados los datos" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "No hay un propietario por ese token"}); - if (cli.Email != EmailPropietario) return BadRequest(new {message = "El Email del usuario no coinside con el del token"}); - + if (cli == null) return BadRequest(new { message = "No hay un propietario por ese token" }); + if (cli.Email != EmailPropietario) return BadRequest(new { message = "El Email del usuario no coinside con el del token" }); + Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(idcontrato); - if (contr == null) return BadRequest(new {message = "No hay un precontrato por esa id"}); + if (contr == null) return BadRequest(new { message = "No hay un precontrato por esa id" }); + if (contr.Dnipropietario != cli.Dni) return BadRequest(new { message = "No Coinside los datos del token con el propietario en el precontrato" }); LinkedList list = new(); - foreach (var i in contr.Idgarantes) { + foreach (var i in contr.Idgarantes) + { list.AddFirst(new GaranteDtoBuilder() .SetCelular(i.Celular) .SetDni(i.Dni) @@ -512,10 +586,12 @@ public class ContratoController: ControllerBase { } private readonly IMinioClient mc; - public ContratoController(IMinioClient minioClient) { + public ContratoController(IMinioClient minioClient) + { mc = minioClient; - if (mc == null){ - MinioConfigcus? mcon = JsonSerializer.Deserialize(System.IO.File.ReadAllText("./settings.json"))?? null; + 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) @@ -526,162 +602,170 @@ public class ContratoController: ControllerBase { } [HttpPost("api/contratos/subirContrato")] - public async Task subirContrato([FromHeader(Name = "Auth")]string Auth, [FromForm]long idcontrato, [FromForm]DateTime ubicarnotificacion, IFormFile contrato) { + public async Task subirContrato([FromHeader(Name = "Auth")] string Auth, [FromForm] long idcontrato, [FromForm] DateTime ubicarnotificacion, IFormFile contrato) + { 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"}); + + if (idcontrato <= 0) return BadRequest(new { message = "No puede tener un id contrato menor o igual a 0" }); Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(idcontrato); - if (contr == null) return BadRequest(new { message = "No hay precontrato por esa id"}); + if (contr == null) return BadRequest(new { message = "No hay precontrato por esa id" }); if (contr.Dniinquilino == 0 || contr.Dnipropietario == 0 || contr.Idpropiedad == 0 || - contr.Dniinquilino == null || contr.Dnipropietario == null || contr.Idpropiedad == null) { - return BadRequest(new { message = "Estan mal cargados los datos del precontrato comunicate con un administrador"}); - } + contr.Dniinquilino == null || contr.Dnipropietario == null || contr.Idpropiedad == null) + { + return BadRequest(new { message = "Estan mal cargados los datos del precontrato comunicate con un administrador" }); + } Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null || contr.DnipropietarioNavigation == null) return BadRequest(new { message ="No se pudo checkear que el token corresponda al propietario"}); - if (cli.Dni != contr.DnipropietarioNavigation.Dni) return BadRequest(new { message = "el token de usuario no coinside con el usuario propietario"}); + if (cli == null || contr.DnipropietarioNavigation == null) return BadRequest(new { message = "No se pudo checkear que el token corresponda al propietario" }); + if (cli.Dni != contr.DnipropietarioNavigation.Dni) return BadRequest(new { message = "el token de usuario no coinside con el usuario propietario" }); if (contrato == null) return BadRequest(new { message = "Debe subir un archivo." }); if (contrato.ContentType != "application/pdf") return BadRequest(new { message = "El archivo debe ser un documento PDF." }); if (!Path.GetExtension(contrato.FileName).Equals(".pdf", StringComparison.OrdinalIgnoreCase)) return BadRequest(new { message = "El archivo debe tener la extensión .pdf." }); string nuevoNombreArchivo = $"id:{contr.Id}-inq:{contr.Dniinquilino}-propi:{contr.Dnipropietario}-idprop:{contr.Idpropiedad}.pdf"; - + bool ret = await subirContrato(contrato, nuevoNombreArchivo); - if(ret == false) return BadRequest(new {message = "No se pudo subir el archivo"}); - + if (ret == false) return BadRequest(new { message = "No se pudo subir el archivo" }); + 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() - .SetDniremitente(contr.Dnipropietario??0) - .SetIdpropiedad(contr.Idpropiedad??0) - .SetDnicliente(contr.Dniinquilino??0) + .SetDniremitente(contr.Dnipropietario ?? 0) + .SetIdpropiedad(contr.Idpropiedad ?? 0) + .SetDnicliente(contr.Dniinquilino ?? 0) .SetAccion("Aceptar Contrato") .SetMensaje($"El propietario: {contr.Dnipropietario}, hizo un documento de contrato: {contr.Id}") .SetFecha(DateTime.Now) .SetLeido(false) .Build(); - + RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, ubicarnotificacion); ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); - return (ret)? - Ok(new { message = "se notifico al futuro inquilino"}): BadRequest(new { message = "No se pudo enviar la notificacion"}); - + return (ret) ? + Ok(new { message = "se notifico al futuro inquilino" }) : BadRequest(new { message = "No se pudo enviar la notificacion" }); } + [HttpGet("api/contrato/DocumentoFinal")] - public IActionResult ObtenerContratoFinal ([FromHeader(Name = "Auth")]string Auth, [FromQuery]long idcontrato) { + public IActionResult ObtenerContratoFinal([FromHeader(Name = "Auth")] string Auth, [FromQuery] long idcontrato) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false){ - validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { + return Unauthorized(); + } } - if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + if (idcontrato <= 0) return BadRequest(new { message = "La id no puede ser igual o menor a 0" }); Contrato? contr = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); - if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un contrato por esa id"}); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un contrato por esa id" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token"}); - if (cli.Dni != contr.Dniinquilino && cli.Dni != contr.Dnipropietario) return BadRequest(new { message = "El token no corresponde con el del inquilino"}); + if (cli == null) return BadRequest(new { message = "No hay un cliente por ese token" }); + if (cli.Dni != contr.Dniinquilino && cli.Dni != contr.Dnipropietario) return BadRequest(new { message = "El token no corresponde con el del inquilino" }); - try{ - var memstream = new MemoryStream(); + try + { + var memstream = new MemoryStream(); var goa = new GetObjectArgs() .WithBucket("alquilafacil") .WithObject(contr.UrlContrato) - .WithCallbackStream(stream => { - memstream.Position=0; + .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){ + + } + catch (Exception e) + { Console.Error.WriteLine(e); - return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe" }); } } [HttpGet("api/contrato/getdocumento")] - public IActionResult ObtenerContrato([FromHeader(Name = "Auth")]string Auth, [FromQuery]long idcontrato) { + public IActionResult ObtenerContrato([FromHeader(Name = "Auth")] string Auth, [FromQuery] long idcontrato) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false){ - validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) return Unauthorized(); - } - if (idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); + if (idcontrato <= 0) return BadRequest(new { message = "La id no puede ser igual o menor a 0" }); Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(idcontrato); - if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id"}); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - 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"}); + 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" }); string nuevoNombreArchivo = $"id:{contr.Id}-inq:{contr.Dniinquilino}-propi:{contr.Dnipropietario}-idprop:{contr.Idpropiedad}.pdf"; - try{ - var memstream = new MemoryStream(); + try + { + var memstream = new MemoryStream(); var goa = new GetObjectArgs() .WithBucket("alquilafacil") .WithObject(nuevoNombreArchivo) - .WithCallbackStream(stream => { - memstream.Position=0; + .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", nuevoNombreArchivo); - - } catch (Exception e){ + + } + catch (Exception e) + { Console.Error.WriteLine(e); - return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe" }); } } [HttpPost("api/contratos/aceptarContrato")] - public IActionResult AceptarContrato([FromHeader(Name = "Auth")]string Auth, [FromBody] AceptarContratoDto dto){ + public IActionResult AceptarContrato([FromHeader(Name = "Auth")] string Auth, [FromBody] AceptarContratoDto dto) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) return Unauthorized(); - if (dto.Idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); - + if (dto.Idcontrato <= 0) return BadRequest(new { message = "La id no puede ser igual o menor a 0" }); + Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(dto.Idcontrato); - if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id"}); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - 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"}); + 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, cli.Dni); - if (ret == false) return BadRequest(new { message ="fallo al aceptar el contrato"}); + if (ret == false) return BadRequest(new { message = "fallo al aceptar el contrato" }); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); var noti = new NotificacioneBuilder() .SetDniremitente(cli.Dni) - .SetIdpropiedad(contr.Idpropiedad??0) - .SetDnicliente(contr.Dnipropietario??0) + .SetIdpropiedad(contr.Idpropiedad ?? 0) + .SetDnicliente(contr.Dnipropietario ?? 0) .SetAccion("Aceptado Contrato") .SetMensaje($"Se inicio el alquiler") .SetFecha(DateTime.Now) @@ -690,58 +774,61 @@ public class ContratoController: ControllerBase { ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); return ret ? - Ok(new { message = "Se acepto el contrato y se crearon los Canons a ser pagados"}) : - BadRequest(new { message = "No se pudo aceptar el contrato"}); - + Ok(new { message = "Se acepto el contrato y se crearon los Canons a ser pagados" }) : + BadRequest(new { message = "No se pudo aceptar el contrato" }); + } [HttpPut("api/contratos/rechazarPreContrato")] - public IActionResult CancelarContrato([FromHeader(Name = "Auth")]string Auth, [FromBody] RechazarPreContrato dto ) { + public IActionResult CancelarContrato([FromHeader(Name = "Auth")] string Auth, [FromBody] RechazarPreContrato dto) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) return Unauthorized(); - if (dto.Idcontrato <= 0) return BadRequest(new {message = "La id no puede ser igual o menor a 0"}); - + if (dto.Idcontrato <= 0) return BadRequest(new { message = "La id no puede ser igual o menor a 0" }); + Contrato? contr = RepositorioContratos.Singleton.ObtenerPreContratoPorId(dto.Idcontrato); - if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id"}); + if (contr == null || contr.Dniinquilino == 0) return BadRequest(new { message = "No hay un precontrato por esa id" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - 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"}); + 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, cli.Dni); - if (ret == false) return BadRequest(new {message = "Fallo al intentar cancelar el precontrato"}); + if (ret == false) return BadRequest(new { message = "Fallo al intentar cancelar el precontrato" }); RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, dto.Fecha); var noti = new NotificacioneBuilder() .SetDniremitente(cli.Dni) - .SetIdpropiedad(contr.Idpropiedad??0) - .SetDnicliente(contr.Dnipropietario??0) + .SetIdpropiedad(contr.Idpropiedad ?? 0) + .SetDnicliente(contr.Dnipropietario ?? 0) .SetAccion("Rechazo Contrato") .SetMensaje($"Se cancelo el proceso para alquilar de: {cli.Nombre}") .SetFecha(DateTime.Now) .SetLeido(false) .Build(); ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); - - return ret? - Ok(new { message = "Se cancelo el proceso para iniciar el alquiler"}): - BadRequest(new { message = "No se pudo cancelar"}); + + return ret ? + Ok(new { message = "Se cancelo el proceso para iniciar el alquiler" }) : + BadRequest(new { message = "No se pudo cancelar" }); } - private async Task subirContrato(IFormFile f, string flname) { - try { + 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){ + if (!encontrado) + { var mb = new MakeBucketArgs().WithBucket("alquilafacil"); await mc.MakeBucketAsync(mb).ConfigureAwait(false); } - using (var stream = new MemoryStream()){ + using (var stream = new MemoryStream()) + { await f.CopyToAsync(stream); - stream.Position=0; + stream.Position = 0; PutObjectArgs putbj = new PutObjectArgs() .WithBucket("alquilafacil") .WithObject(flname) @@ -751,28 +838,42 @@ public class ContratoController: ControllerBase { await mc.PutObjectAsync(putbj); } return true; - } catch (Exception e ) { + } + catch (Exception e) + { Console.Error.WriteLine(e.Message); return false; } } [HttpGet("api/contratos/garantes")] - public IActionResult ObtenerGarantes([FromHeader(Name ="Auth")] string Auth, int idcontrato) { + public IActionResult ObtenerGarantes([FromHeader(Name = "Auth")] string Auth, int idcontrato) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(); - if(idcontrato <= 0) return BadRequest(); - - Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(); - - Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); - if (cont == null) return BadRequest(); + if (idcontrato <= 0) return BadRequest(new { message = "No puede ser un contrato id menor a 0" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No existe el cliente para el token" }); + + Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(idcontrato); + if (cont == null) return BadRequest(new { message = "El contrato no existe" }); + + bool esInquilinoOPropietario = (cont.Dniinquilino ?? 0) == cli.Dni || (cont.Dnipropietario ?? 0) == cli.Dni; + bool tienePermiso = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); + + if (esInquilinoOPropietario == false) + { + return BadRequest(new { message = "No tiene acceso a este path" }); + } + else if (tienePermiso == false && esInquilinoOPropietario == false) + { + return BadRequest(new { message = "No tiene acceso a este path de admin" }); + } - if ((cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni)|| !RepositorioGrupos.Singleton.CheckGrupos(Auth, "Admin")) return BadRequest(); - var list = cont.Idgarantes; List l = new(); - foreach (var i in list) { + foreach (var i in list) + { l.Add(new GaranteDtoBuilder() .SetCelular(i.Celular) .SetDni(i.Dni) @@ -783,20 +884,22 @@ public class ContratoController: ControllerBase { .Build()); } return Ok(l); - } + } - private string ValidarCancelarDto(CancelarPrecontratoDto dto) { + private string ValidarCancelarDto(CancelarPrecontratoDto dto) + { if (dto == null) return "dto nulo"; string ret = ""; - if (dto.EmailInquilino =="") ret += "No puede tener un EmailInquilino Vacio\n"; - if (dto.EmailPropietario =="") ret += "No puede tener un EmailPropietario Vacio\n"; - if (dto.idpropiedad <= 0 ) ret += "No puede tener id propiedad igual o menor a 0\n"; + if (dto.EmailInquilino == "") ret += "No puede tener un EmailInquilino Vacio\n"; + if (dto.EmailPropietario == "") ret += "No puede tener un EmailPropietario Vacio\n"; + if (dto.idpropiedad <= 0) ret += "No puede tener id propiedad igual o menor a 0\n"; if (dto.fecha == DateTime.MinValue) ret += "Falta fecha\n"; return ret; - } + } - private string ValidarDtoGarante(GaranteDto g) { + private string ValidarDtoGarante(GaranteDto g) + { string ret = ""; if (g == null) return "dto nulo"; @@ -809,29 +912,31 @@ public class ContratoController: ControllerBase { return ret; } - private string ValidarDtoAltaGarantes(AltaGarantesDto dto){ + private string ValidarDtoAltaGarantes(AltaGarantesDto dto) + { string ret = ""; if (dto == null) return "dto nulo"; - if (dto.garantes.Count()<=0) ret += "No se puede tener 0 o menos garantes\n"; - if (dto.Idpropiedad<=0) ret += "la id de propiedad no puede ser igual o menor a 0\n"; + if (dto.garantes.Count() <= 0) ret += "No se puede tener 0 o menos garantes\n"; + if (dto.Idpropiedad <= 0) ret += "la id de propiedad no puede ser igual o menor a 0\n"; if (dto.EmailInquilino == "") ret += "El email de inquilino no puede estar vacio\n"; - + return ret; } - private string ValidarDtoPrecontrato( PrecontratoDto dto) { + private string ValidarDtoPrecontrato(PrecontratoDto dto) + { string ret = ""; if (dto == null) return "dto nulo"; - if (dto.CantidadGarantes<0) ret += "la cantidad de garantes necesarios no pueden ser menor a 0\n"; - if (dto.CantidadGarantes>10) ret += "Hay un maximo de 10 garantes\n"; + if (dto.CantidadGarantes < 0) ret += "la cantidad de garantes necesarios no pueden ser menor a 0\n"; + if (dto.CantidadGarantes > 10) ret += "Hay un maximo de 10 garantes\n"; if (dto.EmailInquilino == "") ret += "el email del inquilino no puede ser nulo\n"; if (dto.EmailPropietario == "") ret += "el email del propietario no puede estar vacio\n"; - if (dto.IdPropiedad <= 0) ret += "la id de propiedad no puede ser igual o menor a 0\n"; + if (dto.IdPropiedad <= 0) ret += "la id de propiedad no puede ser igual o menor a 0\n"; 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"; + 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 6096e7c..189384a 100644 --- a/Aspnet/Controllers/DefectoController.cs +++ b/Aspnet/Controllers/DefectoController.cs @@ -7,17 +7,21 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class DefectoController: ControllerBase { +public class DefectoController : ControllerBase +{ [HttpGet("api/defectos")] - public IActionResult ObtenerDefectosEnContrato([FromHeader(Name = "Auth")] string Auth, long Idcontrato = 0) { - if (Idcontrato <= 0) return BadRequest( new { message = "La id de contrato no puede ser menor o igual a 0"}); + public IActionResult ObtenerDefectosEnContrato([FromHeader(Name = "Auth")] string Auth, long Idcontrato = 0) + { + if (Idcontrato <= 0) return BadRequest(new { message = "La id de contrato no puede ser menor o igual a 0" }); if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false){ - validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); - if (validacion1 == false) { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { return Unauthorized(); } } @@ -26,19 +30,20 @@ public class DefectoController: ControllerBase { if (cli == null) return Unauthorized(); Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(Idcontrato); - if (cont == null) return BadRequest(new { message = "No hay contrato por esa id"}); + if (cont == null) return BadRequest(new { message = "No hay contrato por esa id" }); - if (cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni) return BadRequest(new { message = "no deberias tener acceso a esto"}); + if (cont.Dniinquilino != cli.Dni && cont.Dnipropietario != cli.Dni) return BadRequest(new { message = "no deberias tener acceso a esto" }); var l = RepositorioDefectos.Singleton.ObtenerDefectosPorIdContrato(Idcontrato); List ll = new(); - foreach (var i in l){ + foreach (var i in l) + { var n = new DefectoDtoBuilder() - .SetId(i.Id) + .SetId(i.Id) .SetDesc(i.Descripcion) .SetCosto(i.Costo) .SetEstado(i.IdestadoNavigation.Descipcion) - .SetIdContrato(i.Idcontrato??0) + .SetIdContrato(i.Idcontrato ?? 0) .SetPagaInquilino(i.Pagainquilino) .SetDivisa(i.IddivisaNavigation.Signo) .Build(); @@ -48,54 +53,58 @@ public class DefectoController: ControllerBase { } [HttpPost("api/defecto")] - public IActionResult AltaDefecto([FromHeader(Name = "Auth")] string Auth, AltaDefectoDto data) { + public IActionResult AltaDefecto([FromHeader(Name = "Auth")] string Auth, AltaDefectoDto data) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Inquilino"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); if (validacion1 == false) return Unauthorized(); - Cliente? cli =RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); if (cli == null) return Unauthorized(); string r = ValidarDto(data); if (r != "") return BadRequest(new { message = r }); - Defecto defecto = new Defecto{ + Defecto defecto = new Defecto + { Costo = data.Costo, Descripcion = data.Descripcion, Idcontrato = data.Idcontrato, Iddivisa = data.Iddivisa, - Pagainquilino = data.Pagainquilino==0?0Lu:1Lu, + Pagainquilino = data.Pagainquilino == 0 ? 0Lu : 1Lu, Idestado = 1, }; 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"}); + return b ? Ok(new { message = "Se cargo el Defecto en el sistema" }) : BadRequest(new { message = "No se pudo cargar el defecto en el sistema" }); } - private string ValidarDto(AltaDefectoDto d){ - string ret =""; + private string ValidarDto(AltaDefectoDto d) + { + string ret = ""; if (d == null) return "Dto nulo"; - if (d.Iddivisa <0 || d.Iddivisa>1) ret +="No son divisas validas\n"; - if (d.Descripcion == "") ret+="La descripcion no puede estar vacia\n"; - if (d.Idcontrato<=0)ret += "No puede haber un id de contrato igual o menor a 0\n"; + if (d.Iddivisa < 0 || d.Iddivisa > 1) ret += "No son divisas validas\n"; + if (d.Descripcion == "") ret += "La descripcion no puede estar vacia\n"; + if (d.Idcontrato <= 0) ret += "No puede haber un id de contrato igual o menor a 0\n"; return ret; } - [HttpPut("api/defecto/marcarpago")] - public IActionResult MarcarPago([FromHeader(Name = "Auth")] string Auth, long iddefecto = 0) { + [HttpPut("api/defecto/marcarpago")] + public IActionResult MarcarPago([FromHeader(Name = "Auth")] string Auth, long iddefecto = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); if (validacion1 == false) return Unauthorized(); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli==null) return Unauthorized(); + if (cli == null) return Unauthorized(); - if (iddefecto<=0) return BadRequest(new { message = "No hay canones con id 0 o menor"}); + if (iddefecto <= 0) return BadRequest(new { message = "No hay canones con id 0 o menor" }); 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" }); + 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 b00e5d9..1f53f9c 100644 --- a/Aspnet/Controllers/EstadisticaController.cs +++ b/Aspnet/Controllers/EstadisticaController.cs @@ -5,44 +5,64 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class EstadisticaController: ControllerBase { - [HttpGet("api/stats/alquileresIniciados")] - public IActionResult alquileresIniciadosEsteAño([FromHeader(Name ="Auth")]string Auth, int year) { +public class EstadisticaController : ControllerBase +{ + [HttpGet("/api/stats/Pagos")] + public IActionResult EstadisticasPagos([FromHeader(Name ="Auth")] string Auth, int year){ if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 6); if (validacion1 == false) return Unauthorized(); - + + ChartData stats; + List tabla; + + (stats, tabla) = RepositorioEstadisticas.Singleton.InformePagos(year); + + return Ok(new { chart = stats, tabla = tabla}); + } + + + [HttpGet("api/stats/alquileresIniciados")] + public IActionResult alquileresIniciadosEsteAño([FromHeader(Name = "Auth")] string Auth, int year) + { + if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 6); + if (validacion1 == false) return Unauthorized(); + var validacion2 = RepositorioContratos.Singleton.HayContratosEnAño(year); - if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año"}); + if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año" }); 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){ + 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 validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + 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) { + public IActionResult tablaalquileresIniciadosEsteAño([FromHeader(Name = "Auth")] string Auth, int year) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 6); if (validacion1 == false) return Unauthorized(); - - var validacion2 = RepositorioContratos.Singleton.HayContratosEnAño(year); - if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año"}); - var a = RepositorioEstadisticas.Singleton.TablaObtenerContratosIniciadosPorAño(year); - if (a == null) return BadRequest(new { message = "Fallo al obtener el contrato"}); - List informe =new(); - foreach (var i in a) { + var validacion2 = RepositorioContratos.Singleton.HayContratosEnAño(year); + if (validacion2 == false) return BadRequest(new { message = "No hay contratos en ese año" }); + var a = RepositorioEstadisticas.Singleton.TablaObtenerContratosIniciadosPorAño(year); + if (a == null) return BadRequest(new { message = "Fallo al obtener el contrato" }); + + List informe = new(); + foreach (var i in a) + { var d = new InformesAlquilerBuilder() .SetId(i.Id).SetUbicacion(i.IdpropiedadNavigation.Ubicacion) .SetDivisa(i.IddivisaNavigation.Signo) @@ -52,22 +72,24 @@ public class EstadisticaController: ControllerBase { return Ok(informe); } [HttpGet("api/stats/duracionContrato")] - public IActionResult DuracionContrato([FromHeader(Name ="Auth")]string Auth) { + public IActionResult DuracionContrato([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 6); if (validacion1 == false) return Unauthorized(); - + var a = RepositorioEstadisticas.Singleton.ObtenerDataDuracionContratos(); return Ok(a); } [HttpGet("api/tabla/duracionContrato")] - public IActionResult TablaDuracionContrato([FromHeader(Name ="Auth")]string Auth) { + public IActionResult TablaDuracionContrato([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrWhiteSpace(Auth)) return BadRequest(""); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 6); if (validacion1 == false) return Unauthorized(); - + var a = RepositorioEstadisticas.Singleton.TablaObtenerDataDuracionContratos(); return Ok(a); } -} \ No newline at end of file +} diff --git a/Aspnet/Controllers/GruposController.cs b/Aspnet/Controllers/GruposController.cs new file mode 100644 index 0000000..3a7120d --- /dev/null +++ b/Aspnet/Controllers/GruposController.cs @@ -0,0 +1,86 @@ +using Microsoft.AspNetCore.Mvc; +using Modelo; +using AlquilaFacil.Builder; +using Entidades; +using Entidades.Dto; +namespace AlquilaFacil.Controllers; + +[ApiController] +public class GruposController : ControllerBase +{ + [HttpGet("api/admin/grupos")] + public IActionResult ObtenerGrupos([FromHeader(Name = "Auth")] string Auth) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 18) || + RepositorioPermisos.Singleton.CheckPermisos(Auth, 9) || + RepositorioPermisos.Singleton.CheckPermisos(Auth, 19); + if (ret == false) return BadRequest(new { message = "No tiene permiso para ver todos los grupos" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + var grupos = RepositorioGrupos.Singleton.ListarTodosLosGrupos() + .Select(g => new GrupoDtoBuilder() + .ConNombre(g.Nombre) + .ConIdGrupo(g.Id) + .ConHabilitado(g.Habilitado ?? false) + .ConGruposIncluidos(new HashSet(g.IdGrupoHijos + .Select(id => id.Nombre ?? ""))) + .ConPermisos(g.Idpermisos.Select(p => new PermisoDtoBuilder() + .ConId(p.Id) + .ConDescripcion(p.Descripcion) + .Build()) + .ToList()) + .Build()) + .ToList(); + + return Ok(grupos); + + } + [HttpPatch("/api/grupo")] + public IActionResult PatchGrupo([FromHeader(Name = "Auth")] string Auth, GrupoDto grupo) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 18); + if (ret == false) return BadRequest(new { message = "No tiene permiso para Gestionar grupos" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + bool ret2 = RepositorioGrupos.Singleton.PatchGrupo(grupo, cli); + return ret2 ? Ok(new { message = "Se Modifico el grupo" }) : BadRequest(new { message = "Fallo al editar el grupo" }); + } + + [HttpPost("/api/grupo")] + public IActionResult PostGrupo([FromHeader(Name = "Auth")] string Auth, GrupoDto grupo) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 18); + if (ret == false) return BadRequest(new { message = "No tiene permiso para Gestionar grupos" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + if (grupo.Nombre.Length > 12) + { + return BadRequest(new { message = "El nombre del grupo no puede superar los 12 caracteres" }); + } + + bool ret2 = RepositorioGrupos.Singleton.AddGrupo(grupo, cli); + return ret2 ? Ok(new { message = "Se Añadio el grupo" }) : BadRequest(new { message = "Fallo al añadirse el grupo" }); + } + + [HttpDelete("/api/grupo")] + public IActionResult DeleteGrupo([FromHeader(Name = "Auth")] string Auth, [FromQuery] int id) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 18); + if (ret == false) return BadRequest(new { message = "No tiene permiso para Gestionar grupos" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + if (id <= 0) return BadRequest(new { message = "El ID del grupo debe ser mayor que cero" }); + var (ret2, estado) = RepositorioGrupos.Singleton.ToggleGrupo(id, cli); + return ret2 + ? Ok(new { message = (estado ? "Grupo habilitado exitosamente" : "Grupo deshabilitado exitosamente") }) + : BadRequest(new { message = "No se pudo cambiar el estado del grupo" }); + } +} diff --git a/Aspnet/Controllers/InquilinoController.cs b/Aspnet/Controllers/InquilinoController.cs index 7e4b413..84d6fc9 100644 --- a/Aspnet/Controllers/InquilinoController.cs +++ b/Aspnet/Controllers/InquilinoController.cs @@ -9,11 +9,12 @@ using System.Security.Cryptography; namespace AlquilaFacil.Controllers; [ApiController] -public class InquilinoController: ControllerBase +public class InquilinoController : ControllerBase { - + [HttpGet("api/inquilino")] - public IActionResult Get([FromHeader(Name = "Auth")] string Auth) { + public IActionResult Get([FromHeader(Name = "Auth")] string Auth) + { if (!string.IsNullOrEmpty(Auth)) return BadRequest(); var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); @@ -25,18 +26,20 @@ public class InquilinoController: ControllerBase } [HttpPost("api/inquilino")] - public IActionResult Post([FromBody] CrearClienteDto cid, [FromHeader(Name = "Auth")] string Auth) { - if (string.IsNullOrEmpty(Auth)) return BadRequest(new {message = "El String Auth Esta Vacio"}); + public IActionResult Post([FromBody] CrearClienteDto cid, [FromHeader(Name = "Auth")] string Auth) + { + if (string.IsNullOrEmpty(Auth)) return BadRequest(new { message = "El String Auth Esta Vacio" }); var ret3 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 4); - if (ret3 == false) return BadRequest(new {message = "Falló el permiso"}); + if (ret3 == false) return BadRequest(new { message = "Falló el permiso" }); Cliente? rep = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); if (rep == null) return Unauthorized(); var ret = verificarCrearUsuario(cid); - if (ret != "") return BadRequest(new {message = ret}); - - var cli = new Cliente { + if (ret != "") return BadRequest(new { message = ret }); + + var cli = new Cliente + { Dni = cid.dni, Nombre = cid.nombre, Domicilio = cid.domicilio, @@ -45,13 +48,15 @@ public class InquilinoController: ControllerBase Email = cid.email, Contraseña = Encoding.UTF8.GetBytes(HacerHash(cid.contraseña)), Habilitado = 1, + EmailRecuperacion = cid.email, }; bool ret2 = RepositorioUsuarios.Singleton.AltaInquilino(cli, rep.Dni); - return (ret2) ? Ok(new {message = "Se dio de alta la cuenta"}) : BadRequest(new {message = "Fallo Dar de Alta El inquilino"}); + return (ret2) ? Ok(new { message = "Se dio de alta la cuenta" }) : BadRequest(new { message = "Fallo Dar de Alta El inquilino" }); } - private string verificarCrearUsuario(CrearClienteDto cid) { + private string verificarCrearUsuario(CrearClienteDto cid) + { string msg = ""; if (cid.email == string.Empty) msg += "Falta ingresar el email\n"; @@ -65,8 +70,9 @@ public class InquilinoController: ControllerBase return msg; } - private string HacerHash(string pass){ + private string HacerHash(string pass) + { var buf = SHA256.HashData(Encoding.UTF8.GetBytes(pass)); - return BitConverter.ToString(buf).Replace("-",""); + return BitConverter.ToString(buf).Replace("-", ""); } } diff --git a/Aspnet/Controllers/LoginController.cs b/Aspnet/Controllers/LoginController.cs index b4efd38..b25e99a 100644 --- a/Aspnet/Controllers/LoginController.cs +++ b/Aspnet/Controllers/LoginController.cs @@ -19,7 +19,7 @@ public class LoginController: ControllerBase if (!usuario) return Unauthorized(new {message = "El usuario no existe o la contraseña es incorrecta"}); string tokenString = GenerarToken(loginDto); - RepositorioUsuarios.Singleton.GuardarToken(loginDto, tokenString); + RepositorioUsuarios.Singleton.GuardarToken(loginDto, tokenString, Request.HttpContext.Connection.RemoteIpAddress); var cookieOptions = new CookieOptions { @@ -52,7 +52,27 @@ public class LoginController: ControllerBase } } - + + [HttpDelete("/api/logout")] + public IActionResult CerrarSesion([FromHeader(Name = "Auth")]string Auth){ + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null ) return BadRequest(new { message = "No hay un cliente con ese token" }); + + var log = new LoginDto { + Email = cli.Email, + Contraseña = "", + }; + + string tokenString = GenerarToken(log); + + try{ + RepositorioUsuarios.Singleton.GuardarToken(log, tokenString, Request.HttpContext.Connection.RemoteIpAddress, "Cerrar Sesión"); + } catch { + return BadRequest( new { message = "Fallo al cambiar el token" } ); + } + return Ok(new { message = "Se Cerro la sesion" }); + } + private string GenerarToken(LoginDto loginDto){ var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes("ffb2cdc15d472e41a5b626e294c45020"); diff --git a/Aspnet/Controllers/LogsController.cs b/Aspnet/Controllers/LogsController.cs index c232bd1..1f074bd 100644 --- a/Aspnet/Controllers/LogsController.cs +++ b/Aspnet/Controllers/LogsController.cs @@ -5,21 +5,25 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class LogsController: ControllerBase { +public class LogsController : ControllerBase +{ [HttpGet("/api/Logs")] - public IActionResult ObtenerLogs([FromHeader(Name = "Auth")] string Auth, int pag=1) { + public IActionResult ObtenerLogs([FromHeader(Name = "Auth")] string Auth, int pag = 1) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 7); if (validacion1 == false) return Unauthorized(); - if (pag<=0) return BadRequest(new { message = "no puede haber una pagina 0 o menor"}); + if (pag <= 0) return BadRequest(new { message = "no puede haber una pagina 0 o menor" }); - pag-=1; + pag -= 1; var l = RepositorioLogs.Singleton.ObtenerLogsPaginado(pag); List ll = new(); - foreach (var i in l) { - ll.Add(new LogDto{ + foreach (var i in l) + { + ll.Add(new LogDto + { Fecha = i.Fecha, Accion = i.Accion, Dniusuario = i.Dniusuario, @@ -29,16 +33,19 @@ public class LogsController: ControllerBase { } [HttpGet("/api/Logs/detalle")] - public IActionResult ObtenerLogs([FromHeader(Name = "Auth")] string Auth, [FromQuery]DateTime fecha, [FromQuery]long idusuario) { + 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"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 7); if (validacion1 == false) return Unauthorized(); - if (idusuario<=0) return BadRequest(new { message = "no puede haber un id 0 o menor"}); + 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{ + foreach (var i in l) + { + ll.Add(new LogDetalleDto + { Fecha = i.Fecha, Dniusuario = i.Dniusuario, NombreTabla = i.NombreTabla, @@ -51,12 +58,13 @@ public class LogsController: ControllerBase { } [HttpGet("/api/Logs/cantPag")] - public IActionResult cantidadPaginas([FromHeader(Name = "Auth")] string Auth){ + public IActionResult cantidadPaginas([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Informes"); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 7); 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 76dc46b..6080115 100644 --- a/Aspnet/Controllers/NotificacionesController.cs +++ b/Aspnet/Controllers/NotificacionesController.cs @@ -7,79 +7,85 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class NotificacionesController: ControllerBase { +public class NotificacionesController : ControllerBase +{ [HttpGet("api/notificaciones")] - public IActionResult GetNotificaciones([FromHeader(Name ="Auth")]string Auth, bool leido = false) { + public IActionResult GetNotificaciones([FromHeader(Name = "Auth")] string Auth, bool leido = false) + { if (string.IsNullOrEmpty(Auth)) return Unauthorized(); - + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "Fallo al intentar encontrar tu usuario (puede que te hayas logeado desde otro dispositivo?)"}); - + if (cli == null) return BadRequest(new { message = "Fallo al intentar encontrar tu usuario (puede que te hayas logeado desde otro dispositivo?)" }); + IQueryable notificaciones = RepositorioNotificaciones.Singleton.ObtenerNotificacionesDeUsuario(cli.Dni) - .Where(x=>x.Leido == leido); - - + .Where(x => x.Leido == leido); + + List noti = new(); - foreach (Notificacione i in notificaciones) { - if(i.DniclienteNavigation == null || i.DniremitenteNavigation==null) return BadRequest(new { message = "Esta mal cargado el precontrato"}); + foreach (Notificacione i in notificaciones) + { + if (i.DniclienteNavigation == null || i.DniremitenteNavigation == null) return BadRequest(new { message = "Esta mal cargado el precontrato" }); var dto = new NotificacionDtoBuilder() - .SetRemitente(i.DniremitenteNavigation.Email??"") - .SetAccion(i.Accion??"") - .SetMensaje(i.Mensaje??"") + .SetRemitente(i.DniremitenteNavigation.Email ?? "") + .SetAccion(i.Accion ?? "") + .SetMensaje(i.Mensaje ?? "") .SetFecha(i.Fecha) - .SetPropiedad(i.Idpropiedad.ToString()??"") - .SetReceptor(i.DniclienteNavigation.Email??"") + .SetPropiedad(i.Idpropiedad.ToString() ?? "") + .SetReceptor(i.DniclienteNavigation.Email ?? "") .Build(); noti.Add(dto); } - + return Ok(noti); } [HttpGet("api/notificaciones/haySinLeer")] - public IActionResult GetHayNotis([FromHeader(Name ="Auth")]string Auth) { + public IActionResult GetHayNotis([FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); var cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "Fallo al intentar encontrar tu usuario (puede que te hayas logeado desde otro dispositivo?)"}); + if (cli == null) return BadRequest(new { message = "Fallo al intentar encontrar tu usuario (puede que te hayas logeado desde otro dispositivo?)" }); bool ret = RepositorioNotificaciones.Singleton.HayNotis(cli.Dni); - return Ok(new {message = ret}); + return Ok(new { message = ret }); } [HttpPut("api/notificaciones")] - public IActionResult MarcarComoLeido([FromHeader(Name = "Auth")]string Auth, NotificacionMarcarLeidoDto nota) { + public IActionResult MarcarComoLeido([FromHeader(Name = "Auth")] string Auth, NotificacionMarcarLeidoDto nota) + { if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); - if (nota.Fecha == null || String.IsNullOrWhiteSpace(nota.Email)) return BadRequest(new {message = "Faltan datos"}); + if (nota.Fecha == null || String.IsNullOrWhiteSpace(nota.Email)) return BadRequest(new { message = "Faltan datos" }); Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); - if (cli == null) return BadRequest(new {message = "El token de autorizacion no pertenese a ningun Usuario"}); + if (cli == null) return BadRequest(new { message = "El token de autorizacion no pertenese a ningun Usuario" }); + + if (cli.Email != nota.Email) return BadRequest(new { message = "El token de autorizacion no corresponde a tu usuario" }); - if (cli.Email != nota.Email) return BadRequest(new {message = "El token de autorizacion no corresponde a tu usuario"}); - bool ret = RepositorioNotificaciones.Singleton.MarcarComoLeido(cli.Dni, nota.Fecha); return ret ? - Ok(new{message = "Se Marco como leido"}):BadRequest(new{message = "Fallo al marcarse como leido"}); + Ok(new { message = "Se Marco como leido" }) : BadRequest(new { message = "Fallo al marcarse como leido" }); } [HttpPost("api/notificaciones/consultaAlquiler")] - public IActionResult ConsultaAlquiler([FromHeader(Name ="Auth")]string Auth, [FromBody] AltaNotificacionDto data) { + public IActionResult ConsultaAlquiler([FromHeader(Name = "Auth")] string Auth, [FromBody] AltaNotificacionDto data) + { if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); bool validacion1 = RepositorioUsuarios.Singleton.CheckToken(data.Remitente, Auth); - if (validacion1 == false) return BadRequest(new {message = "el token no corresponde a su usuario"}); + if (validacion1 == false) return BadRequest(new { message = "el token no corresponde a su usuario" }); - if (data.Accion == "") return BadRequest(new{message = "El campo Accion esta vacio"}); - if (data.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"}); + if (data.Accion == "") return BadRequest(new { message = "El campo Accion esta vacio" }); + if (data.Mensaje == "") return BadRequest(new { message = "El campo Mensaje esta vacio" }); Cliente? inq = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); if (inq == null) return BadRequest(new { message = "no hay un usuario para el cual el token de autorizacion corresponda (vuelvase a logear)" }); Propiedade? prop = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(data.Propiedad); - if (prop == null || prop.Idestado != 1) return BadRequest(new{message="No hay una propiedad dada de alta para ese id"}); - if (prop.DnipropietarioNavigation == null) return BadRequest(new{message="la propiedad no tiene propietario dado de alto ????"}); + if (prop == null || prop.Idestado != 1) return BadRequest(new { message = "No hay una propiedad dada de alta para ese id" }); + if (prop.DnipropietarioNavigation == null) return BadRequest(new { message = "la propiedad no tiene propietario dado de alto ????" }); var noti = new NotificacioneBuilder() .SetAccion(data.Accion) @@ -90,23 +96,24 @@ public class NotificacionesController: ControllerBase { .SetIdpropiedad(prop.Id) .SetFecha(DateTime.Now) .Build(); - + var ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); - return ret? - Ok(new {message = "Se envio la notificacion"}):BadRequest(new {message = "Fallo al intentar guardar la notificacion"}); + return ret ? + Ok(new { message = "Se envio la notificacion" }) : BadRequest(new { message = "Fallo al intentar guardar la notificacion" }); } [HttpPost("api/notificarInquilino")] - public IActionResult NotificarInq([FromHeader(Name ="Auth")]string Auth, [FromBody] AvisoInquilinoDto data) { + public IActionResult NotificarInq([FromHeader(Name = "Auth")] string Auth, [FromBody] AvisoInquilinoDto data) + { if (String.IsNullOrWhiteSpace(Auth)) return Unauthorized(); - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false)return Unauthorized(); - - if (data.Mensaje == "") return BadRequest(new {message = "El campo Mensaje esta vacio"}); - if (data.Idpropiedad <= 0) return BadRequest(new {message = "La id de propiedad no puede ser 0 o menor"}); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) return Unauthorized(); + + if (data.Mensaje == "") return BadRequest(new { message = "El campo Mensaje esta vacio" }); + if (data.Idpropiedad <= 0) return BadRequest(new { message = "La id de propiedad no puede ser 0 o menor" }); Contrato? cont = RepositorioContratos.Singleton.ObtenerContratoPorId(data.Idpropiedad); - if (cont == null || cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null) return BadRequest(new { message = "no hay un contrato por esa id"}); + if (cont == null || cont.DniinquilinoNavigation == null || cont.DnipropietarioNavigation == null || cont.IdpropiedadNavigation == null) return BadRequest(new { message = "no hay un contrato por esa id" }); var n = new NotificacioneBuilder() .SetAccion("Notificacion Inquilino") @@ -118,41 +125,42 @@ public class NotificacionesController: ControllerBase { .SetFecha(DateTime.Now) .Build(); var ret = RepositorioNotificaciones.Singleton.AltaNotificacion(n); - return ret? - Ok(new { message = "se envio el aviso" }):BadRequest(new { message = "Fallo al intentar enviar el aviso" }); + 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) { + 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(); - } + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 16); + 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"}); + 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); + 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"}); + 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) + .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" }); + 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/PermisoController.cs b/Aspnet/Controllers/PermisoController.cs new file mode 100644 index 0000000..42c61eb --- /dev/null +++ b/Aspnet/Controllers/PermisoController.cs @@ -0,0 +1,61 @@ +using Microsoft.AspNetCore.Mvc; +using Modelo; +using Entidades; +using Entidades.Dto; +using AlquilaFacil.Builder; +namespace AlquilaFacil.Controllers; + +[ApiController] +public class PermisoController : ControllerBase +{ + [HttpPost("api/permisos")] + public IActionResult CrearPermiso([FromHeader(Name = "Auth")] string Auth, PermisoDto perm) + { + var ret1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 17); + if (ret1 == false) return BadRequest(new { message = "No tienes permiso para esto" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + if (String.IsNullOrWhiteSpace(perm.Descripcion)) return BadRequest(new { message = "No puede tener una descripcion vacia" }); + if (perm.Descripcion.Length > 25) return BadRequest(new { message = "la descripcion no puede tener más de 25 caractéres" }); + + var permiso = new PermisoBuilder().SetDescripcion(perm.Descripcion).Build(); + + var ret = RepositorioPermisos.Singleton.CrearPermiso(permiso, cli); + + return ret ? Ok() : BadRequest(); + } + [HttpPatch("api/permisos")] + public IActionResult PatchPermiso([FromHeader(Name = "Auth")] string Auth, PermisoDto perm) + { + var ret1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 17); + if (ret1 == false) return BadRequest(new { message = "No tienes permiso para esto" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un cliente por el token que enviaste" }); + + if (perm.Id <= 0) return BadRequest(new { message = "No puede haber una id 0 o menor" }); + if (String.IsNullOrWhiteSpace(perm.Descripcion)) return BadRequest(new { message = "No puede tener una descripcion vacia" }); + if (perm.Descripcion.Length > 25) return BadRequest(new { message = "la descripcion no puede tener más de 25 caractéres" }); + + var permiso = new PermisoBuilder().SetDescripcion(perm.Descripcion).SetID(perm.Id).Build(); + + var ret = RepositorioPermisos.Singleton.PatchPermiso(permiso, cli); + + return ret ? Ok() : BadRequest(); + } + [HttpGet("/api/permisos/todos")] + public IActionResult ObtenerTodosLosPermisos([FromHeader(Name = "Auth")] string Auth) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 18); + if (ret == false) return BadRequest(new { message = "No tiene permiso para ver Todos los permisos" }); + + var permisos = RepositorioPermisos.Singleton.ListarPermisos(); + var perms = permisos.Select(permiso => new PermisoDtoBuilder() + .ConId(permiso.Id) + .ConDescripcion(permiso.Descripcion) + .Build()); + return Ok(perms); + } +} diff --git a/Aspnet/Controllers/PropiedadesController.cs b/Aspnet/Controllers/PropiedadesController.cs index 5b03bbc..00fd9a5 100644 --- a/Aspnet/Controllers/PropiedadesController.cs +++ b/Aspnet/Controllers/PropiedadesController.cs @@ -6,9 +6,11 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class PropiedadesController: ControllerBase { +public class PropiedadesController : ControllerBase +{ [HttpGet("api/propiedades")] - public IActionResult ListarPropiedades([FromHeader(Name = "Auth")] string Auth, int pag = 0) { + public IActionResult ListarPropiedades([FromHeader(Name = "Auth")] string Auth, int pag = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); if (validacion1 == false) validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); @@ -16,9 +18,12 @@ public class PropiedadesController: ControllerBase { IQueryable ret; - if (pag == 0){ + if (pag == 0) + { ret = RepositorioPropiedades.Singleton.ListarPropiedades(); - } else{ + } + else + { ret = RepositorioPropiedades.Singleton.ListarPropiedadesPorPagina(pag); } @@ -26,31 +31,35 @@ public class PropiedadesController: ControllerBase { } [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) { + public IActionResult ObtenerPropiedadesParaVenta([FromHeader(Name = "Auth")] string Auth, int pag = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 16); + if (validacion1 == false) + { return Unauthorized(); } - if (pag<=0) return BadRequest(new { message = "no existe una pagina 0"}); + if (pag <= 0) return BadRequest(new { message = "no existe una pagina 0" }); - pag-=1; + 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"}); + 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{ + 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??"", + Letra = i.Letra ?? "", Monto = i.Monto, - Piso = i.Piso??0, - Servicios =string.Join(", ", i.IdServicios.Select(s => s.Descripcion)), + Piso = i.Piso ?? 0, + Servicios = string.Join(", ", i.IdServicios.Select(s => s.Descripcion)), Tipo = i.IdtipropiedadNavigation.Descripcion, }; l.Add(p); @@ -58,31 +67,35 @@ public class PropiedadesController: ControllerBase { int cantpag = RepositorioPropiedades.Singleton.ObtenerPaginasDePropiedadesEnVenta(); - return Ok(new { propiedades = l, cantpaginas = cantpag}); + 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) { + public IActionResult ObtenerPropiedadesVentaDePropietario([FromHeader(Name = "Auth")] string Auth) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 15); + if (validacion1 == false) + { return Unauthorized(); } - + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); if (cli == null) return Unauthorized(); - var props = RepositorioPropiedades.Singleton.ObtenerPropiedadesAVentaPorDni(cli.Dni); + var props = RepositorioPropiedades.Singleton.ObtenerPropiedadesAVentaPorDni(cli.Dni); List ll = new(); - foreach (var i in props) { - var a = new PropiedadesDto { + foreach (var i in props) + { + var a = new PropiedadesDto + { id = i.Id, Ubicacion = i.Ubicacion, canthabitaciones = i.Canthabitaciones, Iddivisa = i.Iddivisa, - letra = i.Letra??"", + letra = i.Letra ?? "", Monto = (int)i.Monto, //mmmm - piso = i.Piso??0, + piso = i.Piso ?? 0, Servicios = string.Join(", ", i.IdServicios.Select(x => x.Descripcion)), Tipo = i.IdtipropiedadNavigation.Descripcion, }; @@ -92,71 +105,79 @@ public class PropiedadesController: ControllerBase { } [HttpGet("api/propiedad")] - public IActionResult ObtenerPropiedadPorId(int Id, [FromHeader(Name = "Auth")] string Auth) { + public IActionResult ObtenerPropiedadPorId(int Id, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); if (validacion1 == false) return Unauthorized(); - if (Id < 0) return BadRequest(new {message ="la id de propiedad no puede ser negativa"}); + if (Id < 0) return BadRequest(new { message = "la id de propiedad no puede ser negativa" }); var ret = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(Id); - if (ret == null) return BadRequest(new {message ="No existe la propiedad"}); + if (ret == null) return BadRequest(new { message = "No existe la propiedad" }); return Ok(ret); } [HttpGet("api/propiedad/cantPagina")] - public IActionResult ObtenerCantidadDePaginas([FromHeader(Name = "Auth")] string Auth, int estado = 0) { + public IActionResult ObtenerCantidadDePaginas([FromHeader(Name = "Auth")] string Auth, int estado = 0) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); if (validacion1 == false) return Unauthorized(); - if (estado < 0) return BadRequest(new {message = "No puede tener un numero menor a 0"}); + if (estado < 0) return BadRequest(new { message = "No puede tener un numero menor a 0" }); int cant; - if(estado == 0){ + if (estado == 0) + { cant = RepositorioPropiedades.Singleton.CuantasPaginas(); - }else{ + } + else + { cant = RepositorioPropiedades.Singleton.CuantasPaginas(estado); } - - return Ok(new {message = cant}); - + + return Ok(new { message = cant }); + } [HttpGet("api/propiedades/Propietario")] - public IActionResult ObtenerPropiedadesPorPropietario ( + public IActionResult ObtenerPropiedadesPorPropietario( [FromHeader(Name = "Email")] string email, - [FromHeader(Name = "Auth")] string Auth) { + [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); email = email.Trim(); - if (String.IsNullOrEmpty(email)) return BadRequest(new {message ="falta campo email"}); + if (String.IsNullOrEmpty(email)) return BadRequest(new { message = "falta campo email" }); IQueryable ret = RepositorioPropiedades.Singleton.ObtenerPropiedadesPorEmail(email); return Ok(ret); } [HttpGet("api/propiedades/Propietario/Bajas")] - public IActionResult ObtenerPropiedadesPorPropietarioBajas ( + public IActionResult ObtenerPropiedadesPorPropietarioBajas( [FromHeader(Name = "Email")] string email, - [FromHeader(Name = "Auth")] string Auth) { + [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 8); if (validacion1 == false) return Unauthorized(); email = email.Trim(); - if (String.IsNullOrEmpty(email)) return BadRequest(new {message ="falta campo email"}); + if (String.IsNullOrEmpty(email)) return BadRequest(new { message = "falta campo email" }); IQueryable ret = RepositorioPropiedades.Singleton.ObtenerPropiedadesDeBajaPorEmail(email); return Ok(ret); } [HttpPost("api/propiedad")] - public IActionResult AltaPropiedad([FromBody] AltaPropiedadDto propiedad, [FromHeader(Name = "Auth")] string Auth) { + public IActionResult AltaPropiedad([FromBody] AltaPropiedadDto propiedad, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 1); if (validacion1 == false) return Unauthorized(); @@ -165,9 +186,10 @@ public class PropiedadesController: ControllerBase { if (validacion2 != "") return BadRequest(new { message = validacion2 }); Cliente? cli = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(propiedad.Email); - if (cli == null) return BadRequest(new { message = "El email no corresponde a un propietario"}); + if (cli == null) return BadRequest(new { message = "El email no corresponde a un propietario" }); - Propiedade Prop = new Propiedade{ + Propiedade Prop = new Propiedade + { Canthabitaciones = propiedad.Canthabitaciones, Dnipropietario = cli.Dni, Idtipropiedad = propiedad.Idtipropiedad, @@ -178,28 +200,33 @@ public class PropiedadesController: ControllerBase { Iddivisa = propiedad.Iddivisa, }; - var ret = RepositorioPropiedades.Singleton.AñadirPropiedad(Prop); - return (ret)? - Ok(new { message = "Fue Cargado Correctamente"}) : - BadRequest(new { message = "Fallo al momento de añadir la propiedad a la base de datos"}); + Cliente? responsable = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return Unauthorized(); + + var ret = RepositorioPropiedades.Singleton.AñadirPropiedad(Prop, responsable.Dni); + return (ret) ? + Ok(new { message = "Fue Cargado Correctamente" }) : + BadRequest(new { message = "Fallo al momento de añadir la propiedad a la base de datos" }); } [HttpPatch("api/propiedad")] - public IActionResult PatchPropiedad([FromBody] PatchPropiedadDto propiedad, [FromHeader(Name = "Auth")] string Auth) { - + public IActionResult PatchPropiedad([FromBody] PatchPropiedadDto propiedad, [FromHeader(Name = "Auth")] string Auth) + { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); - + string validacion2 = ValidarPropiedad(propiedad); if (validacion2 != "") return BadRequest(new { message = validacion2 }); - + Cliente? cli = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(propiedad.Email); - if (cli == null) return BadRequest(new { message = "El email no corresponde a un propietario"}); + if (cli == null) return BadRequest(new { message = "El email no corresponde a un propietario" }); List servs = RepositorioServicios.Singleton.ObtenerServiciosPorDescripcion(propiedad.Servicios); - - Propiedade Prop = new Propiedade{ + + Propiedade Prop = new Propiedade + { Id = propiedad.id, Canthabitaciones = propiedad.Canthabitaciones, Dnipropietario = cli.Dni, @@ -213,61 +240,64 @@ public class PropiedadesController: ControllerBase { }; 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"}); - } + return (ret) ? + Ok(new { message = "Fue modificado Correctamente" }) : + BadRequest(new { message = "Fallo al modificar la base de datos" }); + } [HttpDelete("api/propiedad")] - public IActionResult BajaPropiedad(int id, [FromHeader(Name = "Auth")] string Auth, [FromHeader(Name = "Email")] string email){ + public IActionResult BajaPropiedad(int id, [FromHeader(Name = "Auth")] string Auth, [FromHeader(Name = "Email")] string email) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); - if (String.IsNullOrEmpty(email)) return BadRequest(new { message = "Fallo al identificarse el usuario"}); - if (id <= 0) return BadRequest(new { message = "No es una id valida"}); + if (String.IsNullOrEmpty(email)) return BadRequest(new { message = "Fallo al identificarse el usuario" }); + if (id <= 0) return BadRequest(new { message = "No es una id valida" }); Cliente? propie = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(email); var ret = RepositorioPropiedades.Singleton.BajaPropiedad(id, propie); - return ret ? - Ok(new { message = $"Se Cambio el estado de la propiedad con id {id}"}): - BadRequest(new {message="Fallo al cambiar el estado de la propiedad"}); - } + return ret ? + Ok(new { message = $"Se Cambio el estado de la propiedad con id {id}" }) : + BadRequest(new { message = "Fallo al cambiar el estado de la propiedad" }); + } [HttpPut("api/propiedades/addServicio")] - public IActionResult AñadirServicio([FromBody] ServicioAPropiedadDto Servicios, [FromHeader(Name = "Auth")] string Auth) { + public IActionResult AñadirServicio([FromBody] ServicioAPropiedadDto Servicios, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); - if (Servicios.propiedadid <= 0) return BadRequest(new {message ="No puede tener una id negativa o cero"}); - if (Servicios.idServicios.Count() < 1) return BadRequest(new {message ="Falta añadir servicios"}); - if (Servicios.idServicios.Any(x => x<= 0)) return BadRequest(new {message ="No tienen haber ids negativas o cero de servicio"}); + if (Servicios.propiedadid <= 0) return BadRequest(new { message = "No puede tener una id negativa o cero" }); + if (Servicios.idServicios.Count() < 1) return BadRequest(new { message = "Falta añadir servicios" }); + if (Servicios.idServicios.Any(x => x <= 0)) return BadRequest(new { message = "No tienen haber ids negativas o cero de servicio" }); var serv = RepositorioServicios.Singleton.ObtenerServiciosPorPropiedad(Servicios.propiedadid); - + bool validacion2 = Servicios.idServicios.Any(x => serv.Contains(x)); - if (validacion2 == true) return BadRequest(new {message ="Hay elementos repetidos"}); + if (validacion2 == true) return BadRequest(new { message = "Hay elementos repetidos" }); bool ret = RepositorioPropiedades. Singleton.AñadirServicioAPropiedad(Servicios.propiedadid, Servicios.idServicios); return ret ? - Ok(new {message ="Los Servicios Se Cargaron correctamente a la propiedad"}) : BadRequest(new {message ="No se pudo Cargar los Servicios a la propiedad"}); + Ok(new { message = "Los Servicios Se Cargaron correctamente a la propiedad" }) : BadRequest(new { message = "No se pudo Cargar los Servicios a la propiedad" }); } [HttpPut("api/propiedades/RmServicio")] - public IActionResult EliminarServicio([FromBody] ServicioAPropiedadDto servicio, [FromHeader(Name = "Auth")] string Auth) { + public IActionResult EliminarServicio([FromBody] ServicioAPropiedadDto servicio, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); if (validacion1 == false) return Unauthorized(); - if (servicio.propiedadid <= 0) return BadRequest(new {message ="No puede tener una id negativa o cero"}); - 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"}); + if (servicio.propiedadid <= 0) return BadRequest(new { message = "No puede tener una id negativa o cero" }); + 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); @@ -276,49 +306,51 @@ public class PropiedadesController: ControllerBase { var repetidos = serv.Intersect(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"}); + Ok(new { message = "Se Eliminaron los servicios seleccionados de la propiedad" }) : BadRequest(new { message = "Fallo al eliminarse los servicios de la propiedad" }); } - private string ValidarPropiedad(AltaPropiedadDto prop) { + private string ValidarPropiedad(AltaPropiedadDto prop) + { if (prop == null) return "Esta mal formado el body de la request"; string ret = ""; if (String.IsNullOrEmpty(prop.Email)) ret += "Falta Definir un email de propietario\n"; - + if (prop.Canthabitaciones < 0) ret += "No se puede tener una cantidad de habitaciones negativa\n"; - + if (prop.Idtipropiedad <= 0) ret += "No tiene un tipo de propiedad asociada\n"; - + if (String.IsNullOrEmpty(prop.Ubicacion)) ret += "Tiene que definir la ubicacion de la propiedad\n"; - - if (prop.Monto<=1) ret += "El monto tiene que ser como minimo mayor a 0"; - - if (prop.Iddivisa<0 || prop.Iddivisa>1) ret += "se tiene que elejir entre AR$ y US$"; + + if (prop.Monto <= 1) ret += "El monto tiene que ser como minimo mayor a 0"; + + if (prop.Iddivisa < 0 || prop.Iddivisa > 1) ret += "se tiene que elejir entre AR$ y US$"; return ret; } - private string ValidarPropiedad(PatchPropiedadDto prop) { + private string ValidarPropiedad(PatchPropiedadDto prop) + { if (prop == null) return "Esta mal formado el body de la request"; string ret = ""; - if (prop.id <1) ret += "No Cargo el dato de id"; + if (prop.id < 1) ret += "No Cargo el dato de id"; if (String.IsNullOrEmpty(prop.Email)) ret += "Falta Definir un email de propietario\n"; - - if (prop.id <1 ) ret += "No puede haber una id menor a 1\n"; - + + if (prop.id < 1) ret += "No puede haber una id menor a 1\n"; + if (prop.Canthabitaciones < 0) ret += "No se puede tener una cantidad de habitaciones negativa\n"; if (prop.tipo <= 0) ret += "No tiene un tipo de propiedad asociada\n"; if (String.IsNullOrEmpty(prop.Ubicacion)) ret += "Tiene que definir la ubicacion de la propiedad\n"; - if (prop.Monto<=1) ret += "El monto tiene que ser como minimo mayor a 0"; - - if (prop.Iddivisa<0 || prop.Iddivisa>1) ret += "se tiene que elejir entre AR$ y US$"; + if (prop.Monto <= 1) ret += "El monto tiene que ser como minimo mayor a 0"; + + if (prop.Iddivisa < 0 || prop.Iddivisa > 1) ret += "se tiene que elejir entre AR$ y US$"; return ret; diff --git a/Aspnet/Controllers/PropietarioController.cs b/Aspnet/Controllers/PropietarioController.cs index 86588cf..62055d4 100644 --- a/Aspnet/Controllers/PropietarioController.cs +++ b/Aspnet/Controllers/PropietarioController.cs @@ -9,10 +9,12 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class PropietarioController: ControllerBase { +public class PropietarioController : ControllerBase +{ [HttpGet("api/propietario")] - public IActionResult ObtenerPropietarioPorDni(long Dni, [FromHeader(Name ="Auth")] string Auth) { + public IActionResult ObtenerPropietarioPorDni(long Dni, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 14); if (validacion1 == false) return Unauthorized(); @@ -22,8 +24,9 @@ public class PropietarioController: ControllerBase { } [HttpPost("api/propietario")] - public IActionResult AltaPropietario([FromBody]CrearClienteDto Propietario, - [FromHeader(Name = "Auth")] string Auth) { + public IActionResult AltaPropietario([FromBody] CrearClienteDto Propietario, + [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 5); if (validacion1 == false) return Unauthorized(); @@ -33,8 +36,9 @@ public class PropietarioController: ControllerBase { string validacion2 = verificarCrearUsuario(Propietario); if (validacion2 != "") return BadRequest(validacion2); - - var cli = new Cliente { + + var cli = new Cliente + { Dni = Propietario.dni, Nombre = Propietario.nombre, Domicilio = Propietario.domicilio, @@ -43,15 +47,17 @@ public class PropietarioController: ControllerBase { Email = Propietario.email, Contraseña = Encoding.UTF8.GetBytes(HacerHash(Propietario.contraseña)), Habilitado = 1, + EmailRecuperacion = Propietario.email, }; bool ret = RepositorioUsuarios.Singleton.AltaPropietario(cli, rep.Dni); - return ret ? - Ok(new {message = "Se añadio el propietario exitosamente"}) : BadRequest(); + return ret ? + Ok(new { message = "Se añadio el propietario exitosamente" }) : BadRequest(); } [HttpPatch("api/propietarios")] - public IActionResult PatchPropietario([FromBody]CrearClienteDto Propietario, [FromHeader(Name = "Auth")] string Auth){ + public IActionResult PatchPropietario([FromBody] CrearClienteDto Propietario, [FromHeader(Name = "Auth")] string Auth) + { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 5); if (validacion1 == false) return Unauthorized(); @@ -59,7 +65,8 @@ public class PropietarioController: ControllerBase { string validacion2 = verificarCrearUsuario(Propietario); if (validacion2 != "") return BadRequest(validacion2); - var cli = new Cliente { + var cli = new Cliente + { Dni = Propietario.dni, Nombre = Propietario.nombre, Domicilio = Propietario.domicilio, @@ -69,11 +76,12 @@ public class PropietarioController: ControllerBase { Contraseña = Encoding.UTF8.GetBytes(HacerHash(Propietario.contraseña)) }; var ret = RepositorioUsuarios.Singleton.ActualizarPropietario(cli); - return ret ? - Ok(new {message = "Se Modifico el propietario exitosamente"}) : BadRequest(); + return ret ? + Ok(new { message = "Se Modifico el propietario exitosamente" }) : BadRequest(); } - private string verificarCrearUsuario(CrearClienteDto cid) { + private string verificarCrearUsuario(CrearClienteDto cid) + { string msg = ""; if (cid.email == string.Empty) msg += "Falta ingresar el email\n"; @@ -87,8 +95,9 @@ public class PropietarioController: ControllerBase { return msg; } - private string HacerHash(string pass){ + private string HacerHash(string pass) + { var buf = SHA256.HashData(Encoding.UTF8.GetBytes(pass)); - return BitConverter.ToString(buf).Replace("-",""); + return BitConverter.ToString(buf).Replace("-", ""); } -} \ No newline at end of file +} diff --git a/Aspnet/Controllers/UsuarioController.cs b/Aspnet/Controllers/UsuarioController.cs new file mode 100644 index 0000000..1df5a15 --- /dev/null +++ b/Aspnet/Controllers/UsuarioController.cs @@ -0,0 +1,177 @@ +using AlquilaFacil.Builder; +using Microsoft.AspNetCore.Mvc; +using Modelo; +using Entidades; +using AlquilaFacil.Emailer.Sender; + +namespace AlquilaFacil.Controllers; + +[ApiController] +public class UsuarioController : ControllerBase +{ + [HttpGet("/api/usuario")] + public IActionResult ObtenerInfoUsuario([FromHeader(Name = "Auth")] string Auth) + { + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un usuari por ese token" }); + + var usu = new UsuarioDtoBuilder() + .SetNombre(cli.Nombre).SetApellido(cli.Apellido) + .SetEmail(cli.Email).SetCelular(cli.Celular) + .SetDni(cli.Dni).SetDomicilio(cli.Domicilio) + .SetEmailRecuperacion(cli.EmailRecuperacion) + .Build(); + return Ok(usu); + } + + public class bodyCambiarContraseña + { + public string contraseña { get; set; } = ""; + } + + [HttpPatch("/api/usuario")] + public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] bodyCambiarContraseña body) + { + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" }); + + if (body.contraseña.Length < 8) return BadRequest(new { message = "Tiene que tener por lo menos 8 caracteres" }); + + bool ret = RepositorioUsuarios.Singleton.CambiarContraseña(body.contraseña, cli); + return ret ? Ok(new { message = "Contraseña cambiada con éxito" }) : BadRequest(new { message = "No se pudo cambiar la contraseña" }); + } + + public class bodyCambiarContraAdmin : bodyCambiarContraseña + { + public long Dni { get; set; } + } + + [HttpPatch("/api/admin/contraseña")] + public IActionResult CambiarPassAdmin([FromHeader(Name = "Auth")] string Auth, [FromBody] bodyCambiarContraAdmin body) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9); + if (!ret) return BadRequest(new { message = "No tienes permisos para cambiar contraseñas de usuario" }); + + if (body.contraseña.Length < 8 || string.IsNullOrWhiteSpace(body.contraseña)) return BadRequest(new { message = "La contraseña debe tener al menos 8 caracteres y no puede estar vacía" }); + + if (body.Dni <= 0) return BadRequest(new { message = "El DNI no puede estar vacío" }); + + Cliente? usu = RepositorioUsuarios.Singleton.ObtenerClientePorDni(body.Dni); + if (usu == null) return BadRequest(new { message = "No existe un usuario con ese DNI" }); + + ret = RepositorioUsuarios.Singleton.CambiarContraseña(body.contraseña, usu); + return ret ? Ok(new { message = "Contraseña cambiada con éxito" }) : BadRequest(new { message = "No se pudo cambiar la contraseña" }); + + } + + public record SetEmail(string EmailRecuperacion); + [HttpPut("/api/usuario/emailrecuperacion")] + public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] SetEmail setemail) + { + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" }); + + string emailrecuperacion = setemail.EmailRecuperacion; + if (!emailrecuperacion.Contains("@")) return BadRequest(new { message = "Tiene que ser un email" }); + + bool ret = RepositorioUsuarios.Singleton.SetEmailRecuperacion(emailrecuperacion, cli); + if (ret == false) return BadRequest(new { message = "No se pudo actualizar el email de recuperación" }); + + Task.Run(() => + { + AvisoEmailSender s = new(); + s.Send(cli.Email, setemail.EmailRecuperacion); + }); + + return Ok(new { message = "Email de recuperación actualizado con éxito" }); + } + + public record RecuperarUsuarioDto(string Email, string EmailRecuperacion); + [HttpPost("/api/recuperarUsuario")] + public IActionResult RecuperarUsuario([FromBody] RecuperarUsuarioDto mails) + { + bool check = RepositorioUsuarios.Singleton.CheckEmailRecuperacion(mails.Email, mails.EmailRecuperacion); + if (check == false) return BadRequest(new { message = "El email no corresponde al email de recuperacion" }); + + string pin = ""; + var ran = new Random(); + for (int i = 0; i < 6; i++) pin += ran.Next(0, 10); + + bool ret = RepositorioUsuarios.Singleton.SetF2aPin(pin, mails.Email); + if (ret == false) return BadRequest(new { message = "no se pudo generar/guardar el codigo 2fa" }); + + Task.Run(() => + { + OtpEmailSender s = new(); + s.Send(mails.EmailRecuperacion, mails.Email, pin); + }); + + return Ok(new { message = $"Se envio un email de recuperacion a {mails.EmailRecuperacion}" }); + } + + public record ingreso2fa(string Pin, string Email); + [HttpPost("/api/ingresar2fa")] + public IActionResult IngresarUsuario([FromBody] ingreso2fa data) + { + if (!data.Email.Contains("@")) return BadRequest(new { message = "Tiene que ser un email" }); + if (data.Pin.Length != 6) return BadRequest(new { message = "el pin tiene que tener 6 digitos" }); + + (bool check, long Dni) = RepositorioUsuarios.Singleton.Check2fa(data.Email, data.Pin); + if (check == false) return BadRequest(new { message = "El pin es incorrecto" }); + + var cli = RepositorioUsuarios.Singleton.ObtenerClientePorDni(Dni); + + //esto literalmente no se puede triggerear pero lo pongo para evitar una warning + if (cli == null) return BadRequest(new { message = "El usuario no existe" }); + + return Ok(new { token = cli.Token }); + } + + public record Crearusuario(long Dni, string Nombre, string Apellido, string Domicilio, string Celular, + string Email, string Contraseña, string? EmailRecuperacion, List grupos); + [HttpPost("api/crearusuario")] + public IActionResult CrearUsuario([FromHeader(Name ="Auth")] string Auth, [FromBody] Crearusuario cu) + { + var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 19); + if (!ret) return BadRequest(new { message = "No tienes permisos para Crear un usuario" }); + + Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth); + if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" }); + + string rett = ""; + + if (cu.Dni <= 0) + rett += "No puede haber un documento con numero menor o igual a 0"; + if (cu.Apellido.Length > 20) + rett += "Apellido excede los 20 caracteres. "; + if (cu.Nombre.Length > 20) + rett += "Nombre excede los 20 caracteres. "; + if (cu.Celular.Length > 40) + rett += "Celular excede los 40 caracteres. "; + if (cu.Domicilio.Length > 40) + rett += "Domicilio excede los 40 caracteres. "; + if (cu.Email.Length > 50) + rett += "Email excede los 50 caracteres. "; + if (cu.EmailRecuperacion?.Length > 50) + rett += "Email de recuperación excede los 50 caracteres. "; + + if (rett != "") return BadRequest(new { message = rett }); + + Cliente clii = new Cliente + { + Habilitado = 1, + Dni = cu.Dni, + Nombre = cu.Nombre, + Apellido = cu.Apellido, + Celular = cu.Celular, + Email = cu.Email, + EmailRecuperacion = ((cu.EmailRecuperacion ?? "").Length == 0) ? cu.Email : cu.EmailRecuperacion, + Domicilio = cu.Domicilio + }; + + var rettt = RepositorioUsuarios.Singleton.AltaUsuario(cli.Dni, clii, cu.Contraseña, cu.grupos); + + return rettt + ? Ok(new { message = "Usuario creado exitosamente." }) + : BadRequest(new { message = "Hubo un error al crear el usuario." }); } +} diff --git a/Aspnet/Controllers/VentaController.cs b/Aspnet/Controllers/VentaController.cs index 76706ca..3e16478 100644 --- a/Aspnet/Controllers/VentaController.cs +++ b/Aspnet/Controllers/VentaController.cs @@ -1,5 +1,3 @@ -using System.Configuration; -using System.Formats.Asn1; using System.Text.Json; using AlquilaFacil.Builder; using AlquilaFacil.Config; @@ -12,27 +10,31 @@ using Modelo; namespace AlquilaFacil.Controllers; [ApiController] -public class VentaController:ControllerBase { +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) { + public IActionResult AceptarConsultaVenta([FromHeader(Name = "Auth")] string Auth, NotificacionMarcarLeidoDto dto) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 15); + if (validacion1 == false) + { return Unauthorized(); } - if (dto.Email == "") return BadRequest(new { message = "Falta dato Email"}); + 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"}); + 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"}); + 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{ + 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, @@ -44,7 +46,8 @@ public class VentaController:ControllerBase { }; bool ret = RepositorioVentas.Singleton.IniciarVenta(v, cli.Dni); - if (ret){ + if (ret) + { var noti = new NotificacioneBuilder() .SetAccion("Notificacion") .SetMensaje("Debe Realizar el pago para que se registre el traspaso de la propiedad") @@ -56,25 +59,27 @@ public class VentaController:ControllerBase { .Build(); ret = RepositorioNotificaciones.Singleton.AltaNotificacion(noti); } - return ret? - Ok(new { message = "Se inicio la venta"}):BadRequest(new { message ="fallo al iniciar la venta"}); + 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) { + public IActionResult CancelarConsultaVenta([FromHeader(Name = "Auth")] string Auth, NotificacionMarcarLeidoDto dto) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 15); + if (validacion1 == false) + { return Unauthorized(); } - if (dto.Email == "") return BadRequest(new { message = "Falta dato Email"}); + 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"}); + 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); + Notificacione? n = RepositorioNotificaciones.Singleton.ObtenerNotificacionPorKeys(cli.Dni, dto.Fecha); var noti = new NotificacioneBuilder() .SetAccion("Notificacion") .SetMensaje("El propietario no quiere vender") @@ -84,90 +89,84 @@ public class VentaController:ControllerBase { .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}); + Ok(new { message = "Se Envio una notificacion" }) : BadRequest(new { message = "Fallo al Descartar Consulta" }); } [HttpPut("/api/propiedad/setPropiedadAVenta")] - public IActionResult setPropiedadAVenta([FromHeader(Name="Auth")]string Auth, SetVentaDto dto) { - var validacion1 = RepositorioGrupos.Singleton.CheckGrupos(Auth, "Propietario"); - if (validacion1 == false) { + public IActionResult setPropiedadAVenta([FromHeader(Name = "Auth")] string Auth, SetVentaDto dto) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 2); + var validacion2 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 8); + if (validacion1 == false || validacion2 == 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"}); + 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 (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"}); + 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) { + public IActionResult unsetPropiedadAVenta([FromHeader(Name = "Auth")] string Auth, SetVentaDto dto) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 15); + 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"}); + + 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 (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"}); + 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) { + public IActionResult EjercerOpcionVenta([FromHeader(Name = "Auth")] string Auth, [FromQuery] long idcontrato = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { return Unauthorized(); } - if (idcontrato <= 0) return BadRequest(new { message = "No pueden hacer cotratos con id 0 o menor"}); + 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"}); + 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; @@ -177,31 +176,30 @@ public class VentaController:ControllerBase { 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"}); + 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 ) { + 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(); - } + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 13); + if (validacion1 == false) + { + return Unauthorized(); } - if (idventa <=0) return BadRequest(new { message = "Las id 0 o menor no son validas" }); + 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 (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 (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." }); @@ -209,39 +207,45 @@ public class VentaController:ControllerBase { 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"}); + 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"}); + if (ret == false) return BadRequest(new { message = "no se pudo guardar el nombre del archivo subido" }); - return Ok(new { message = "Se Subio el Recibo"}); + return Ok(new { message = "Se Subio el Recibo" }); } private readonly IMinioClient mc; - public VentaController(IMinioClient minioClient) { + public VentaController(IMinioClient minioClient) + { mc = minioClient; - if (mc == null){ - MinioConfigcus? mcon = JsonSerializer.Deserialize(System.IO.File.ReadAllText("./settings.json"))?? null; + 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("0.0.0.0:9000") .WithSSL(false) .Build(); - } + } } - private async Task subirContrato(IFormFile f, string flname) { - try { + 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){ + if (!encontrado) + { var mb = new MakeBucketArgs().WithBucket("alquilafacil"); await mc.MakeBucketAsync(mb).ConfigureAwait(false); } - using (var stream = new MemoryStream()){ + using (var stream = new MemoryStream()) + { await f.CopyToAsync(stream); - stream.Position=0; + stream.Position = 0; PutObjectArgs putbj = new PutObjectArgs() .WithBucket("alquilafacil") .WithObject(flname) @@ -251,140 +255,140 @@ public class VentaController:ControllerBase { await mc.PutObjectAsync(putbj); } return true; - } catch (Exception e ) { + } + 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(); - } + public IActionResult verRecibo([FromHeader(Name = "Auth")] string Auth, long idventa = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 13); + if (validacion1 == false) + { + return Unauthorized(); } - if (idventa <= 0) return BadRequest(new { message = "No existen ventas validas para la id 0"}); + 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 (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(); + try + { + var memstream = new MemoryStream(); var goa = new GetObjectArgs() .WithBucket("alquilafacil") .WithObject(venta.UrlRecibo) - .WithCallbackStream(stream => { - memstream.Position=0; + .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){ + + } + catch (Exception e) + { Console.Error.WriteLine(e); - return BadRequest(new { message = "Fallo al intentar obtener el archivo del almacenamiento o este no existe"}); + 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(); - } + public IActionResult PropietarioVerifica([FromHeader(Name = "Auth")] string Auth, long idventa = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 13); + if (validacion1 == false) + { + return Unauthorized(); } - if (idventa <= 0) return BadRequest(new { message = "No existen ventas validas para la id 0"}); + 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 == 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 = ""}); + 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"}); + public IActionResult ObtenerVenta([FromHeader(Name = "Auth")] string Auth, long idventa = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 13); + + 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(); + 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??"") + .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}); + 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(); - } - } + public IActionResult ObtenerVentas([FromHeader(Name = "Auth")] string Auth) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 13); 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"}); + if (ventas == null) return BadRequest(new { message = "no estas involucrado en ninguna venta o compra" }); List lista = new(); - foreach (var i in ventas) { + 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??"") + .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); } @@ -392,43 +396,51 @@ public class VentaController:ControllerBase { } [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) { + public IActionResult ObtenerDto([FromHeader(Name = "Auth")] string Auth, long idcontrato = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { return Unauthorized(); } } - if (idcontrato == 0) return BadRequest(new { message = "No existen contatos validos para la id 0"}); + 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"}); + if (cont == null) return BadRequest(new { message = "No hay un contrato por esa id" }); var dto = new OpcionVentaDtoBuilder() - .SetId(cont.Idventa??0) + .SetId(cont.Idventa ?? 0) .SetMonto(cont.IdventaNavigation.Monto) .SetDivisa(cont.IdventaNavigation.IddivisaNavigation.Signo) .SetEnOrden(puedeEjercer(cont)) - .SetFueEjercido(cont.IdventaNavigation.Idestado??0) + .SetFueEjercido(cont.IdventaNavigation.Idestado ?? 0) .Build(); - + return Ok(dto); } - private bool puedeEjercer(Contrato c) { + private bool puedeEjercer(Contrato c) + { bool ret = c.Idcanons.All(x => x.Pagado == 1); - if (ret) { + 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) { + if (canonConFechaMasTardia != null && canonConFechaMasTardia.Fecha.Year >= DateTime.Now.Year + && canonConFechaMasTardia.Fecha.Month >= DateTime.Now.Month) + { ret = true; - }else{ + } + else + { ret = false; } } @@ -437,24 +449,27 @@ public class VentaController:ControllerBase { } [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) { + public IActionResult TieneOpcionVenta([FromHeader(Name = "Auth")] string Auth, long idcontrato = 0) + { + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 11); + if (validacion1 == false) + { + validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 12); + if (validacion1 == false) + { return Unauthorized(); } } - if (idcontrato == 0) return BadRequest(new { message = "No existen contatos validos para la id 0"}); - + 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(); + 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}); + return Ok(new { message = cont.Tieneopcionventa }); } -} \ No newline at end of file +} diff --git a/Aspnet/Emailer/Builder/EmailBuilder.cs b/Aspnet/Emailer/Builder/EmailBuilder.cs new file mode 100644 index 0000000..20df36b --- /dev/null +++ b/Aspnet/Emailer/Builder/EmailBuilder.cs @@ -0,0 +1,38 @@ +using System.Net.Mail; +namespace AlquilaFacil.Emailer.Builder; + +public class EmailBuilder +{ + private MailMessage _message = new(); + + public EmailBuilder To(string to) + { + _message.To.Add(to); + return this; + } + + public EmailBuilder Subject(string subject) + { + _message.Subject = subject; + return this; + } + + public EmailBuilder Body(string email, string pin, string modo = "2fa") + { + _message.IsBodyHtml = true; + switch (modo) + { + case "2fa": + _message.Body = new HtmlGenerator().GenerarMail2fa(email, pin); + break; + case "aviso": + _message.Body = new HtmlGenerator().AvisoSetEmail(email, pin); + break; + default: + break; + } + return this; + } + + public MailMessage Build() => _message; +} diff --git a/Aspnet/Emailer/Builder/EmailHtmlGenerator.cs b/Aspnet/Emailer/Builder/EmailHtmlGenerator.cs new file mode 100644 index 0000000..8475e6c --- /dev/null +++ b/Aspnet/Emailer/Builder/EmailHtmlGenerator.cs @@ -0,0 +1,112 @@ +namespace AlquilaFacil.Emailer.Builder; + +public class HtmlGenerator +{ + public string GenerarMail2fa(string emailUsuario, string pin) + { + var msg = $""" + + + +
+ + + + + + +
+
+ Aqui esta su codigo OTP: +
+

+ {pin} +

+
+ Este codigo es del usuario con email:{emailUsuario} +
+
+ Si no sabes para que es el email, ignoralo. +
+
+
+ + + + """; + + return msg; + } + public string AvisoSetEmail(string emailUsuario, string emailreq) + { + var msg = $""" + + + +
+ + + + + + +
+
+ Aviso: +
+

+ Se seteo este email : {emailreq}, como email de respaldo +

+
+ +
+
+ Si no sabes para que es el email, ignoralo. +
+
+
+ + + + """; + + return msg; + } + +} diff --git a/Aspnet/Emailer/Decorator/AvisoEmailSender.cs b/Aspnet/Emailer/Decorator/AvisoEmailSender.cs new file mode 100644 index 0000000..94bd831 --- /dev/null +++ b/Aspnet/Emailer/Decorator/AvisoEmailSender.cs @@ -0,0 +1,11 @@ +namespace AlquilaFacil.Emailer.Sender; +using AlquilaFacil.Emailer.Builder; + +public class AvisoEmailSender : EmailSender +{ + public void Send(string emailusu, string emailreq) + { + var mail = new EmailBuilder().Body(emailusu, emailreq, "aviso").To(emailreq).Subject("AvisoEmail").Build(); + base.Send(mail); + } +} diff --git a/Aspnet/Emailer/Decorator/EmailerSender.cs b/Aspnet/Emailer/Decorator/EmailerSender.cs new file mode 100644 index 0000000..d3d0f7d --- /dev/null +++ b/Aspnet/Emailer/Decorator/EmailerSender.cs @@ -0,0 +1,50 @@ +using System.Net.Mail; +using System.Net; +using System.Text.Json; + +namespace AlquilaFacil.Emailer.Sender; + +public class EmailSender +{ + protected static SmtpClient? smtp = null; + protected void configSmtp(MailMessage mail) + { + var jsonContent = File.ReadAllText("settings.json"); + var options = JsonSerializer.Deserialize>(jsonContent); + if (options == null) return; + + + bool check = options.ContainsKey("smtpHost"); + check = options.ContainsKey("smtpPort"); + check = options.ContainsKey("emailAddr"); + check = options.ContainsKey("emailPass"); + + if (check == false) return; + mail.Sender = new MailAddress(options["emailAddr"]); + mail.From = new MailAddress(options["emailAddr"]); + + if (null != smtp) return; + smtp = new(); + smtp.DeliveryMethod = SmtpDeliveryMethod.Network; + smtp.EnableSsl = true; + smtp.Host = options["smtpHost"]; + smtp.Port = int.Parse(options["smtpPort"].ToString()); + smtp.Credentials = new NetworkCredential(options["emailAddr"], options["emailPass"]); + } + + public virtual void Send(MailMessage message) + { + configSmtp(message); + if (smtp == null) return; + try + { + smtp.Send(message); + message.Dispose(); + } + catch (Exception) + { + throw; + } + } + +} diff --git a/Aspnet/Emailer/Decorator/OtpEmailSender.cs b/Aspnet/Emailer/Decorator/OtpEmailSender.cs new file mode 100644 index 0000000..c0a20b0 --- /dev/null +++ b/Aspnet/Emailer/Decorator/OtpEmailSender.cs @@ -0,0 +1,13 @@ +namespace AlquilaFacil.Emailer.Sender; +using AlquilaFacil.Emailer.Builder; +public class OtpEmailSender : EmailSender +{ + + public void Send(string To, string email, string pin) + { + var mail = new EmailBuilder().To(To).Body(email, pin).Subject("Mail de Recuperacion").Build(); + + base.Send(mail); + + } +} diff --git a/Aspnet/Program.cs b/Aspnet/Program.cs index aa81588..eb7495a 100644 --- a/Aspnet/Program.cs +++ b/Aspnet/Program.cs @@ -35,6 +35,15 @@ builder.Services.AddCors(options => .AllowAnyMethod() .AllowCredentials(); }); + + options.AddPolicy("AllowSvelteAppv6", + builder => + { + builder.WithOrigins("http://[::1]:5173") + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); }); var app = builder.Build(); diff --git a/Aspnet/bin/Debug/net8.0/settings.json b/Aspnet/bin/Debug/net8.0/settings.json index ca7cba9..b3fc1c9 100644 --- a/Aspnet/bin/Debug/net8.0/settings.json +++ b/Aspnet/bin/Debug/net8.0/settings.json @@ -1,4 +1,9 @@ { - "usr":"nwFNMLJcn5m0owbzeXMs", - "scrt":"Mf9HxTir5mIGwWSBtQXd6DRK2k00V0EyXk7QTu70" + "usr": "nwFNMLJcn5m0owbzeXMs", + "scrt": "Mf9HxTir5mIGwWSBtQXd6DRK2k00V0EyXk7QTu70", + "connectiondb": "Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none", + "smtpHost": "smtp.gmail.com", + "smtpPort": "587", + "emailAddr": "emailerpasillo@gmail.com", + "emailPass": "hgwa mznx xuff exws" } diff --git a/Aspnet/settings.json b/Aspnet/settings.json index ca7cba9..b3fc1c9 100644 --- a/Aspnet/settings.json +++ b/Aspnet/settings.json @@ -1,4 +1,9 @@ { - "usr":"nwFNMLJcn5m0owbzeXMs", - "scrt":"Mf9HxTir5mIGwWSBtQXd6DRK2k00V0EyXk7QTu70" + "usr": "nwFNMLJcn5m0owbzeXMs", + "scrt": "Mf9HxTir5mIGwWSBtQXd6DRK2k00V0EyXk7QTu70", + "connectiondb": "Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none", + "smtpHost": "smtp.gmail.com", + "smtpPort": "587", + "emailAddr": "emailerpasillo@gmail.com", + "emailPass": "hgwa mznx xuff exws" } diff --git a/Entidades/Alquilafacilcontext.cs b/Entidades/Alquilafacilcontext.cs index 0d9ce17..d0fb684 100644 --- a/Entidades/Alquilafacilcontext.cs +++ b/Entidades/Alquilafacilcontext.cs @@ -1,5 +1,7 @@ -using System; +using System; using System.Collections.Generic; +using System.Text.Json; + using Microsoft.EntityFrameworkCore; namespace Entidades; @@ -54,9 +56,29 @@ public partial class AlquilaFacilContext : DbContext public virtual DbSet Ventas { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) -#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. - => optionsBuilder.UseMySQL("Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none"); - + { + if (!optionsBuilder.IsConfigured) + { + try + { + var jsonContent = File.ReadAllText("settings.json"); + var options = JsonSerializer.Deserialize>(jsonContent); + if (options != null && options.ContainsKey("connectiondb")) + { + optionsBuilder.UseMySQL(options["connectiondb"]); + } + else + { + throw new Exception("No se encontró la clave 'connectiondb' en el archivo settings.json"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error al configurar la conexión a la base de datos: {ex.Message}"); + throw; + } + } + } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => @@ -111,6 +133,12 @@ public partial class AlquilaFacilContext : DbContext entity.Property(e => e.Email) .HasMaxLength(50) .HasColumnName("email"); + entity.Property(e => e.EmailRecuperacion) + .HasMaxLength(50) + .HasColumnName("emailRecuperacion"); + entity.Property(e => e.F2a) + .HasMaxLength(6) + .HasColumnName("f2a"); entity.Property(e => e.Habilitado) .HasDefaultValueSql("b'1'") .HasColumnType("bit(1)") @@ -416,6 +444,10 @@ public partial class AlquilaFacilContext : DbContext entity.Property(e => e.Id) .HasColumnType("int(11)") .HasColumnName("id"); + entity.Property(e => e.Habilitado) + .IsRequired() + .HasDefaultValueSql("'1'") + .HasColumnName("habilitado"); entity.Property(e => e.Nombre) .HasMaxLength(12) .HasColumnName("nombre"); diff --git a/Entidades/Cliente.cs b/Entidades/Cliente.cs index 4fe77e0..8bb00d0 100644 --- a/Entidades/Cliente.cs +++ b/Entidades/Cliente.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace Entidades; @@ -23,6 +23,11 @@ public partial class Cliente public ulong Habilitado { get; set; } + public string? EmailRecuperacion { get; set; } + + public string? F2a { get; set; } + + public virtual ICollection ContratoDniinquilinoNavigations { get; set; } = new List(); public virtual ICollection ContratoDnipropietarioNavigations { get; set; } = new List(); diff --git a/Entidades/Dto/CrearAccionesDto.cs b/Entidades/Dto/CrearAccionesDto.cs new file mode 100644 index 0000000..5e8a23f --- /dev/null +++ b/Entidades/Dto/CrearAccionesDto.cs @@ -0,0 +1,5 @@ +namespace Entidades.Dto; +public class CrearAccionesDto +{ + public string Descripcion { get; set; } = ""; +} diff --git a/Entidades/Dto/GrupoYPermisoDto.cs b/Entidades/Dto/GrupoYPermisoDto.cs new file mode 100644 index 0000000..6d4155b --- /dev/null +++ b/Entidades/Dto/GrupoYPermisoDto.cs @@ -0,0 +1,16 @@ +namespace Entidades.Dto; +public class GrupoDto +{ + public int idgrupo { get; set; } + public string Nombre { get; set; } = ""; + public bool Habilitado { get; set; } = false; + public HashSet GruposIncluidos { get; set; } = []; + public List Permisos { get; set; } = []; + +} + +public class PermisoDto +{ + public int Id { get; set; } + public string Descripcion { get; set; } = ""; +} diff --git a/Entidades/Dto/PreContratoDataDto.cs b/Entidades/Dto/PreContratoDataDto.cs new file mode 100644 index 0000000..cc02485 --- /dev/null +++ b/Entidades/Dto/PreContratoDataDto.cs @@ -0,0 +1,7 @@ +public class PreContratoDataDto{ + public bool TieneOpcionDeVenta { get; set; } + public decimal? MontoOpcionDeVenta { get; set; } + public string? MonedaOpcionDeVenta { get; set; } + public int DuracionEnMeses { get; set; } + public int? FrecuenciaAumentoEnMeses { get; set; } +} diff --git a/Entidades/Dto/PropietarioDto.cs b/Entidades/Dto/PropietarioDto.cs new file mode 100644 index 0000000..a80224c --- /dev/null +++ b/Entidades/Dto/PropietarioDto.cs @@ -0,0 +1,6 @@ +namespace Entidades.Dto; +public class PropietarioDto{ + public string Nombre {get; set;} = ""; + public long Dni {get; set;} + public string Apellido {get; set;} = ""; +} diff --git a/Entidades/Dto/UsuarioDto.cs b/Entidades/Dto/UsuarioDto.cs new file mode 100644 index 0000000..844934e --- /dev/null +++ b/Entidades/Dto/UsuarioDto.cs @@ -0,0 +1,12 @@ +namespace Entidades.Dto; + +public class UsuarioDto +{ + public long Dni { get; set; } + public string Nombre { get; set; } = null!; + public string Apellido { get; set; } = null!; + public string Domicilio { get; set; } = null!; + public string Celular { get; set; } = null!; + public string Email { get; set; } = null!; + public string? EmailRecuperacion { get; set; } = null!; +} diff --git a/Entidades/Estadopropiedad.cs b/Entidades/Estadopropiedad.cs index a220579..ed87dfa 100644 --- a/Entidades/Estadopropiedad.cs +++ b/Entidades/Estadopropiedad.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace Entidades; diff --git a/Entidades/Grupo.cs b/Entidades/Grupo.cs index 4aac993..c81225a 100644 --- a/Entidades/Grupo.cs +++ b/Entidades/Grupo.cs @@ -1,18 +1,20 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace Entidades; -public partial class Grupo:IComponenteSeguridad +public partial class Grupo : IComponenteSeguridad { public int Id { get; set; } public string Nombre { get; set; } = null!; + public bool? Habilitado { get; set; } + [JsonIgnore] public virtual ICollection IdGrupoHijos { get; set; } = new List(); - + [JsonIgnore] public virtual ICollection IdGrupoPadres { get; set; } = new List(); @@ -25,13 +27,16 @@ public partial class Grupo:IComponenteSeguridad { if (visitados.Contains(Id)) return; visitados.Add(Id); - foreach (var permiso in Idpermisos) { - permisos.Add(permiso); - } - foreach (var subgrupo in IdGrupoPadres) { - subgrupo.ObtenerPermisos(permisos, visitados); - } + if (this.Habilitado == false) return; + var componentes = new List(); + componentes.AddRange(Idpermisos); + componentes.AddRange(IdGrupoHijos); + + foreach (var componente in componentes) + { + componente.ObtenerPermisos(permisos, visitados); + } } } diff --git a/Entidades/Informes/InformePagos.cs b/Entidades/Informes/InformePagos.cs new file mode 100644 index 0000000..fd47743 --- /dev/null +++ b/Entidades/Informes/InformePagos.cs @@ -0,0 +1,9 @@ +namespace Entidades.Informes; + +public class InformePagos +{ + public int Mes { get; set; } + public int Realizados { get; set; } + public int Atrasados {get;set;} + public int Sin_realizar {get;set;} +} diff --git a/Entidades/Logdetalle.cs b/Entidades/Logdetalle.cs index db3946f..9b3b469 100644 --- a/Entidades/Logdetalle.cs +++ b/Entidades/Logdetalle.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace Entidades; diff --git a/Entidades/Tipopropiedad.cs b/Entidades/Tipopropiedad.cs index c0235cb..c842eec 100644 --- a/Entidades/Tipopropiedad.cs +++ b/Entidades/Tipopropiedad.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace Entidades; diff --git a/Entidades/makefile b/Entidades/makefile index b9d75c1..da00705 100644 --- a/Entidades/makefile +++ b/Entidades/makefile @@ -1,6 +1,10 @@ run: - dotnet ef dbcontext scaffold "Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none" MySql.EntityFrameworkCore -o . + dotnet ef dbcontext scaffold "Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none" MySql.EntityFrameworkCore -o . ./convert_to_pascalcase.sh clean: rm *.cs + +table: + dotnet ef dbcontext scaffold "Server=127.0.0.1;Port=3306;Database=AlquilaFacil;Uid=AlquilaFacil;Pwd=.n@9c2ve*0,b1ETv].Kipa/~pR~V;Connection Timeout=5;SslMode=none" MySql.EntityFrameworkCore -o ./tmp + ./convert_to_pascalcase.sh diff --git a/Front/bun.lockb b/Front/bun.lockb index 3bc8666..59bbdc7 100755 Binary files a/Front/bun.lockb and b/Front/bun.lockb differ diff --git a/Front/public/edit.svg b/Front/public/edit.svg new file mode 100644 index 0000000..3dc80af --- /dev/null +++ b/Front/public/edit.svg @@ -0,0 +1,21 @@ + + + + + + diff --git a/Front/public/key.svg b/Front/public/key.svg new file mode 100644 index 0000000..eb0c13e --- /dev/null +++ b/Front/public/key.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/Front/public/logout.svg b/Front/public/logout.svg new file mode 100644 index 0000000..3af916e --- /dev/null +++ b/Front/public/logout.svg @@ -0,0 +1,21 @@ + + + + + + diff --git a/Front/public/plus.svg b/Front/public/plus.svg new file mode 100644 index 0000000..c0ae662 --- /dev/null +++ b/Front/public/plus.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/Front/public/user.svg b/Front/public/user.svg new file mode 100644 index 0000000..1beb5d7 --- /dev/null +++ b/Front/public/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/src/App.svelte b/Front/src/App.svelte index 59f47f0..bcf328b 100644 --- a/Front/src/App.svelte +++ b/Front/src/App.svelte @@ -1,170 +1,201 @@ - - - + + + + + - - - - - - - - + + + - - - - + + + + - - - - + + + + - - - - - - - - - + + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - + + + + - - - - + + + + - - - - - - - - - - - - - + + + + - - - - - - - - - + + + + - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/Front/src/Componentes/BotonEsquina.svelte b/Front/src/Componentes/BotonEsquina.svelte new file mode 100644 index 0000000..550a2f8 --- /dev/null +++ b/Front/src/Componentes/BotonEsquina.svelte @@ -0,0 +1,41 @@ + + + + + diff --git a/Front/src/Componentes/Estadisticas/fChart.svelte b/Front/src/Componentes/Estadisticas/fChart.svelte index a57ec3c..d33965d 100644 --- a/Front/src/Componentes/Estadisticas/fChart.svelte +++ b/Front/src/Componentes/Estadisticas/fChart.svelte @@ -1,59 +1,56 @@
- +
- diff --git a/Front/src/Componentes/LoginPanel.svelte b/Front/src/Componentes/LoginPanel.svelte index 9de9755..d0a764f 100644 --- a/Front/src/Componentes/LoginPanel.svelte +++ b/Front/src/Componentes/LoginPanel.svelte @@ -1,66 +1,283 @@ - - - Iniciar Sesión - - -
- - - - - - - - - -
-{#if errorMessage} -