354 lines
16 KiB
C#
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, 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<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;
|
|
}
|
|
}
|
|
}
|