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; } } }