Files
AlquilaFacil/Aspnet/Controllers/CargaContratoAdminController.cs

354 lines
16 KiB
C#

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<IActionResult> 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);
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<mesesHastaAumento) return (null, BadRequest( new { message = "El contrato no puede durar menos que el tiempo 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 && tieneOpcionVenta){
return (null, BadRequest(new { message = "No se cargo el monto de la opcion de venta" }));
}
var cont = new Contrato{
Cancelado=0,
Habilitado=0,
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<Garante>();
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<MinioConfigcus>(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<bool> 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;
}
}
}