diff --git a/Aspnet/Controllers/CargaContratoAdminController.cs b/Aspnet/Controllers/CargaContratoAdminController.cs index c01729f..ee718ca 100644 --- a/Aspnet/Controllers/CargaContratoAdminController.cs +++ b/Aspnet/Controllers/CargaContratoAdminController.cs @@ -1,6 +1,13 @@ 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{ @@ -42,4 +49,233 @@ public class CargarContratoAdminController: ControllerBase{ 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(); + } + } } diff --git a/Front/src/paginas/CargarContratoAdmin.svelte b/Front/src/paginas/CargarContratoAdmin.svelte index 923d94d..653df58 100644 --- a/Front/src/paginas/CargarContratoAdmin.svelte +++ b/Front/src/paginas/CargarContratoAdmin.svelte @@ -11,8 +11,6 @@ dnipropietario: 0n, iddivisa: 0, idpropiedad: 0, - idventa: 0n, - indiceactualizacion: 0, mesesDurationContrato: 0, mesesHastaAumento: 0, monto: 0, @@ -137,8 +135,6 @@ formData.append('dnipropietario', contrato.dnipropietario.toString()); formData.append('iddivisa', contrato.iddivisa.toString()); formData.append('idpropiedad', contrato.idpropiedad.toString()); - formData.append('idventa', contrato.idventa.toString()); - formData.append('indiceactualizacion', contrato.indiceactualizacion.toString()); formData.append('mesesDurationContrato', contrato.mesesDurationContrato.toString()); formData.append('mesesHastaAumento', contrato.mesesHastaAumento.toString()); formData.append('monto', contrato.monto.toString()); @@ -180,8 +176,6 @@ dnipropietario: 0n, iddivisa: 0, idpropiedad: 0, - idventa: 0n, - indiceactualizacion: 0, mesesDurationContrato: 0, mesesHastaAumento: 0, monto: 0, @@ -323,20 +317,6 @@ -
- -
- -
-
-
diff --git a/Modelo/RepositorioContratos.cs b/Modelo/RepositorioContratos.cs index 8d073f4..e723275 100644 --- a/Modelo/RepositorioContratos.cs +++ b/Modelo/RepositorioContratos.cs @@ -4,6 +4,29 @@ using Microsoft.EntityFrameworkCore; namespace Modelo; public class RepositorioContratos: RepositorioBase { + + + public bool AdminCargaContrato(Contrato? cont, long dni){ + if (cont == null) return false; + + var con = Context; + + cont.Id = (con.Contratos.Any() ? con.Contratos.Max(x => x.Id) : 0) + 1; + + if (cont.IdventaNavigation != null){ + cont.IdventaNavigation.Id = (con.Ventas.Any()?con.Ventas.Count():0)+1; + con.Ventas.Add(cont.IdventaNavigation); + } + + var prop = con.Propiedades.FirstOrDefault(x=>x.Id == cont.Idpropiedad); + if (prop == null)return false; + + prop.Idestado = 2; + con.Contratos.Add(cont); + GenerarLog(con, dni, "Carga del contrato por parte de admin"); + return Guardar(con); + } + public IQueryable? ObtenerContratosPorEmailInquilino(string email) { var con = Context; try{