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.FileName =="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; ActionResult? req; (cont, req) = ParseContratoFromForm(formData); if (req != null && cont == null) return req; var ret = RepositorioContratos.Singleton.AdminCargaContrato(cont, cli.Dni); //WIP //Falta Carga del archivo a minio //Falta añadir la url al contrato //Falta generar canones //Falta mandar notificaciones } 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 (!formData.TryGetValue("monto", out var montoValues) || string.IsNullOrEmpty(montoValues.FirstOrDefault()) || !TryParseDecimal(montoValues.FirstOrDefault(), out decimal monto)) { return (null, BadRequest(new { message = "Campo 'monto' inválido o faltante." })); } if (monto <= 0.0m){ return (null, BadRequest(new { message = "No se cargo el monto de alquiler" })); } bool tieneOpcionVenta = false; if (formData.TryGetValue("tieneopcionventa", out var tieneOpcionValues) && !string.IsNullOrEmpty(tieneOpcionValues.FirstOrDefault())) { if (!TryParseBool(tieneOpcionValues.FirstOrDefault(), out tieneOpcionVenta)) { return (null, BadRequest(new { message = "Campo 'tieneopcionventa' inválido." })); } } int divisaOpcionVenta = 0; decimal montoOpcionVenta = 0m; if (tieneOpcionVenta) { if (formData.TryGetValue("divisaOpcionVenta", out var divisaOpcValues) && !string.IsNullOrEmpty(divisaOpcValues.FirstOrDefault())) { if (!TryParseInt(divisaOpcValues.FirstOrDefault(), out int divisaOpcParsed)) { return (null, BadRequest(new { message = "Campo 'divisaOpcionVenta' inválido." })); } divisaOpcionVenta = divisaOpcParsed; } if (formData.TryGetValue("montoOpcionVenta", out var montoOpcValues) && !string.IsNullOrEmpty(montoOpcValues.FirstOrDefault())) { if (!TryParseDecimal(montoOpcValues.FirstOrDefault(), out decimal montoOpcParsed)) { return (null, BadRequest(new { message = "Campo 'montoOpcionVenta' inválido." })); } montoOpcionVenta = montoOpcParsed; } } if (montoOpcionVenta <= 0.0m){ return (null, BadRequest(new { message = "No se cargo el monto de la opcion de venta" })); } var cont = new Contrato{ Cancelado=0, Habilitado=1, Cantgarantemin=cantGarantMin, Dniinquilino=dniInquilino, Dnipropietario=dniPropietario, Fechainicio=DateTime.Now, Iddivisa=idDivisa, Idpropiedad=idPropiedad, Monto=monto, MesesDurationContrato = mesesDuration, MesesHastaAumento=mesesHastaAumento, Idgarantes = ParseGarantes(formData), Tieneopcionventa=tieneOpcionVenta?1ul:0ul, }; if(cont.Tieneopcionventa==1ul){ cont.IdventaNavigation = new Venta{ Idestado = 1, Monto= montoOpcionVenta, Iddivisa = divisaOpcionVenta }; } return (cont, null); } private Garante[] ParseGarantes(IFormCollection formData) { var garantes = new List(); var garanteKeys = formData.Keys.Where(k => k.StartsWith("garantes[")).ToList(); var garanteCount = garanteKeys.Count / 6; for (int i = 0; i < garanteCount; i++) { var dni = formData.TryGetValue($"garantes[{i}].dni", out var dniValue) ? dniValue.ToString() ?? "" : ""; 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(); } } }