TFS_ANTIGUO/SInCathay/ULA.Cathay.Credito/ControllersWebApi/Desembolso/DesembolsoAPIController.cs

482 lines
No EOL
23 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Ultimus.Utilitarios;
using ULA.Cathay.CreditoModel.Credito;
using ULA.Cathay.CreditoModel.DAL.Credito;
using ULA.Cathay.Credito.Json;
using Ultimus.Interfaces;
using ULA.Cathay.CreditoModel.Entidades;
using ULA.Cathay.Credito.ServicioSAP;
using System.Text;
namespace ULA.Cathay.Credito.ControllersWebApi.Desembolso
{
public class DesembolsoAPIController : ApiController
{
UltimusLogs logs = new UltimusLogs("DesembolsoAPIController");
public DesembolsoAPIController()
{
GlobalAPIController.SetRegionalConfig();
}
#region Guardar
[HttpPost]
public DesembolsoJSON Guardar(DesembolsoJSON model)
{
SolicitudDAL SolicitudDal = new SolicitudDAL();
DesembolsoDatosGeneralesDAL DesembolsoDatosGeneralesDal = new DesembolsoDatosGeneralesDAL();
ProcesosDAL ProcesosDal = new ProcesosDAL();
Procesos Desembolso;
DesembolsoDatosGenerales mDesembolsoDatosGenerales;
ICollection<Solicitante> Solicitantes;
SolicitanteDAL SolicitanteDal = new SolicitanteDAL();
ClienteDAL ClienteDal = new ClienteDAL();
Solicitante solicitante;
DesembolsoFacturasDAL DesembolsoFacturasDal = new DesembolsoFacturasDAL();
ICollection<DesembolsoFacturas> facturas;
ICollection<DesemboloDetalleOrdenCompra> DetalleOrdenCompra;
DesemboloDetalleOrdenCompraDAL DesemboloDetalleOrdenCompraDal = new DesemboloDetalleOrdenCompraDAL();
ICollection<DesembolsoDetalleAdelantosContraContrato> DetalleAdelantosContraContrato;
DesembolsoDetalleAdelantosContraContratoDAL DesembolsoDetalleAdelantosContraContratoDal = new DesembolsoDetalleAdelantosContraContratoDAL();
BitacoraDocumentosClienteDAL BitacoraDocumentosClienteDal = new BitacoraDocumentosClienteDAL();
bool EsCreacionSolicitud = false;
CaratulaCreditoDAL CaratulaCreditoDal = new CaratulaCreditoDAL();
CaratulaCredito caratula;
Oferta ofertaCaratula = new Oferta();
Solicitante SolicitanteDatosCredito = new Solicitante();
try
{
EsCreacionSolicitud = model.IdSolicitud == 0;
if (EsCreacionSolicitud)
{
caratula = CaratulaCreditoDal.Obtener(0, model.Solicitud.DesembolsoDatosGenerales.NroCaratulaSublimite);
if (caratula == null || caratula.IdSolicitud == 0)
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "No se encontro carátula en el BPM para este sublímite";
return model;
}
ofertaCaratula = new OfertaFacilidadesDAL().ObtenerOfertaFacilidades(new Oferta() { IdSolicitud = caratula.IdSolicitud });
if (ofertaCaratula == null || ofertaCaratula.IdSolicitud == 0 || ofertaCaratula.OfertaFacilidades == null || ofertaCaratula.OfertaFacilidades.Count == 0)
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "La carátula en el BPM no tiene una oferta con sublimites relacionados";
return model;
}
else
{
TipoFacilidad facilidadCodigoSubLimite = ofertaCaratula.OfertaFacilidades.Where(x => x.TipoFacilidad.CodigoSAP == model.Solicitud.DesembolsoDatosGenerales.CodigoSublimite && x.TipoFacilidad.IdTipoFacilidad == model.Solicitud.DesembolsoDatosGenerales.IdTipoFacilidad).Select(x => x.TipoFacilidad).FirstOrDefault();
if (facilidadCodigoSubLimite != null)
model.Solicitud.DesembolsoDatosGenerales.IdTipoFacilidad = facilidadCodigoSubLimite.IdTipoFacilidad;
if (!ofertaCaratula.OfertaFacilidades.Where(x => x.IdTipoFacilidad == model.Solicitud.DesembolsoDatosGenerales.IdTipoFacilidad).Any())
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "La carátula en el BPM no tiene dentro de su oferta una facilidad relacionada al sublimite seleccionado";
return model;
}
}
SolicitanteDatosCredito = new SolicitanteDAL().ObteneCliente(caratula.IdSolicitud);
model.Solicitud.DesembolsoDatosGenerales.IdSolicitudCredito = caratula.IdSolicitud;
}
Desembolso = ProcesosDal.Obtener(EnumProcesos.Desembolso);
model.Solicitud.IdEstadoBandeja = "E";
model.Solicitud.Proceso = Desembolso.NombreProceso.Trim();
mDesembolsoDatosGenerales = model.Solicitud.DesembolsoDatosGenerales;
Solicitantes = model.Solicitud.Solicitante;
model.Solicitud.ClearVirtualProperties();
model.Solicitud = SolicitudDal.Insertar(model.Solicitud);
solicitante = Solicitantes != null ? Solicitantes.Where(c => c.EsPrincipal == true).FirstOrDefault() : null;
if (solicitante != null)
{
solicitante.IdSolicitud = model.Solicitud.IdSolicitud;
solicitante.EsPrincipal = true;
if (SolicitanteDatosCredito.Cliente != null)
solicitante.Cliente.IdEjecutivo = SolicitanteDatosCredito.Cliente.IdEjecutivo;
solicitante.Cliente = ClienteDal.InsertarActualizarCliente(solicitante.Cliente);
solicitante.IdCliente = solicitante.Cliente.IdCliente;
SolicitanteDal.InsertarActualizar(solicitante);
model.Solicitud.Solicitante = SolicitanteDal.ObtenerSolicitantes(model.Solicitud.IdSolicitud);
}
if (mDesembolsoDatosGenerales != null)
{
mDesembolsoDatosGenerales.IdSolicitud = model.Solicitud.IdSolicitud;
if (mDesembolsoDatosGenerales.DesembolsoFacturas != null)
mDesembolsoDatosGenerales = DesembolsoFacturasDal.InsertarActualizar(mDesembolsoDatosGenerales);
facturas = mDesembolsoDatosGenerales.DesembolsoFacturas;
if (mDesembolsoDatosGenerales.DesemboloDetalleOrdenCompra != null)
mDesembolsoDatosGenerales = DesemboloDetalleOrdenCompraDal.InsertarActualizar(mDesembolsoDatosGenerales);
DetalleOrdenCompra = mDesembolsoDatosGenerales.DesemboloDetalleOrdenCompra;
if (mDesembolsoDatosGenerales.DesemboloDetalleOrdenCompra != null)
mDesembolsoDatosGenerales = DesembolsoDetalleAdelantosContraContratoDal.InsertarActualizar(mDesembolsoDatosGenerales);
DetalleAdelantosContraContrato = mDesembolsoDatosGenerales.DesembolsoDetalleAdelantosContraContrato;
mDesembolsoDatosGenerales = DesembolsoDatosGeneralesDal.InsertarActualizar(mDesembolsoDatosGenerales);
mDesembolsoDatosGenerales.DesembolsoFacturas = facturas;
mDesembolsoDatosGenerales.DesembolsoDetalleAdelantosContraContrato = DetalleAdelantosContraContrato;
mDesembolsoDatosGenerales.DesemboloDetalleOrdenCompra = DetalleOrdenCompra;
model.Solicitud.DesembolsoDatosGenerales = mDesembolsoDatosGenerales;
}
//busca y genera la lista de documentos del cliente
if (EsCreacionSolicitud == true && ofertaCaratula != null && ofertaCaratula.IdSolicitud != 0 && ofertaCaratula.OfertaFacilidades != null && ofertaCaratula.OfertaFacilidades.Count != 0)
BitacoraDocumentosClienteDal.GenerarListaDocumentos(model.Solicitud.IdSolicitud, model.UltimusStep, ofertaCaratula.IdSolicitud);
model.CodigoRespuesta = TipoCodigoRespuesta.EXITOSO.ToString();
}
catch (Exception ex)
{
logs.Error(ex);
model.CodigoRespuesta = TipoCodigoRespuesta.ERROR.ToString();
}
return model;
}
#endregion
#region Cargar
[HttpGet]
public DesembolsoJSON Cargar(int IdSolicitud)
{
DesembolsoJSON model = new DesembolsoJSON();
SolicitudDAL SolicitudDal = new SolicitudDAL();
DesembolsoDatosGeneralesDAL DesembolsoDatosGeneralesDal = new DesembolsoDatosGeneralesDAL();
SolicitanteDAL SolicitanteDal = new SolicitanteDAL();
try
{
model.Solicitud = SolicitudDal.Obtener(IdSolicitud);
if (model.Solicitud != null)
{
model.Solicitud.Solicitante = SolicitanteDal.ObtenerSolicitantes(IdSolicitud);
model.Solicitud.DesembolsoDatosGenerales = DesembolsoDatosGeneralesDal.Obtener(IdSolicitud);
}
model.CodigoRespuesta = TipoCodigoRespuesta.EXITOSO.ToString();
}
catch (Exception ex)
{
logs.Error(ex);
model.CodigoRespuesta = TipoCodigoRespuesta.ERROR.ToString();
}
return model;
}
#endregion
#region BuscarLinea
[HttpPost]
public DesembolsoJSON BuscarLinea(DesembolsoJSON model)
{
SAPServicioIntegracionAPIController SAP = new SAPServicioIntegracionAPIController();
BpResponse ClienteSAP;
DatosEntrada DatosSAP = new DatosEntrada();
EjecutivoDAL EjecutivoDal = new EjecutivoDAL();
Ejecutivo ejecutivo = null;
List<Lineas> LineasCliente;
DesembolsoDatosGenerales mDesembolsoDatosGenerales;
Cliente cliente;
bool EstatusCCSS = false;
BitacoraDocumentosClienteDAL BitacoraDocumentosClienteDal = new BitacoraDocumentosClienteDAL();
CatalogosDAL CatalogosDal = new CatalogosDAL();
try
{
if (model.Solicitud == null || model.Solicitud.Solicitante == null || model.Solicitud.Solicitante.Count == 0)
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "Debe definir el número BP";
return model;
}
cliente = model.Solicitud.Solicitante.FirstOrDefault().Cliente;
DatosSAP.NumeroCliente = cliente.CodigoBP;
DatosSAP.TipoConsulta = EnumOperacionesCliente.Ambas;
ClienteSAP = SAP.ConsultaBP(DatosSAP);
if (ClienteSAP == null || string.IsNullOrEmpty(ClienteSAP.NumCliente))
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "No se encontro el cliente en SAP";
return model;
}
LineasCliente = ClienteSAP.Linea;
model.LineaCliente = LineasCliente != null ? LineasCliente.Where(c => c.TipoClaseLinea == "6").FirstOrDefault() : null;
if (model.LineaCliente == null || string.IsNullOrEmpty(model.LineaCliente.NumeroLinea))
{
model.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
model.DescripcionRespuesta = "No se encontro la línea en SAP";
return model;
}
model.OperacionesCliente = ClienteSAP.Operacion;
EstatusCCSS = SAP.ConsultaMorosidadCCSS(DatosSAP) > 0;
//carga lista temporal de documentos
model.BitacoraDocumentosRecientesCliente = BitacoraDocumentosClienteDal.ObtenerBitacoraDocumentosRecientes(ClienteSAP.Identificacion);
#region DATOS GENERALES
mDesembolsoDatosGenerales = model.Solicitud.DesembolsoDatosGenerales == null ? new DesembolsoDatosGenerales() : model.Solicitud.DesembolsoDatosGenerales;
mDesembolsoDatosGenerales.NumeroLinea = model.LineaCliente.NumeroLinea;
mDesembolsoDatosGenerales.MontoDisponibleLinea = model.LineaCliente.MontoDisponible;
mDesembolsoDatosGenerales.MontoAprobadoLineaSAP = model.LineaCliente.Monto;
mDesembolsoDatosGenerales.MonedaLinea = model.LineaCliente.Moneda;
mDesembolsoDatosGenerales.IdTipoMonedaDesembolso = model.LineaCliente.Moneda == "CRC" ? 0 : 1;
mDesembolsoDatosGenerales.FechaVencimientoLinea = model.LineaCliente.FechaVencimiento;
mDesembolsoDatosGenerales.MontoDisponibleSublimite = null;
mDesembolsoDatosGenerales.NroCaratulaSublimite = null;
mDesembolsoDatosGenerales.CodigoSublimite = null;
mDesembolsoDatosGenerales.Operaciones_Mora = model.OperacionesCliente != null && model.OperacionesCliente.Any(c => c.FechaVencimiento.AddMonths(1) < DateTime.Now);
mDesembolsoDatosGenerales.CCSS_Atrasado = EstatusCCSS;
model.Solicitud.DesembolsoDatosGenerales = mDesembolsoDatosGenerales;
#endregion
#region CLIENTE
ejecutivo = EjecutivoDal.ObtenerEjecutivoXUserID(model.UltimusUserID);
List<Cliente> listaCliente = new ClienteDAL().Obtener(null, cliente.CodigoBP);
Cliente oUltimoRegistroCliente = listaCliente.Where(x => x.IdTipoTramite != EnumTipoTramite.SolicitudDesembolso).OrderByDescending(x => x.IdCliente).FirstOrDefault();
cliente.IdCliente = 0;
cliente.IdTipoTramite = EnumTipoTramite.SolicitudDesembolso;
cliente.IdClasificacionCliente = oUltimoRegistroCliente.IdClasificacionCliente;
cliente.IdTipoCliente = oUltimoRegistroCliente.IdTipoCliente;
cliente.IdTipoIngreso = oUltimoRegistroCliente.IdTipoIngreso;
cliente.IdTipoIdentificacion = oUltimoRegistroCliente.IdTipoIdentificacion;
//cliente.IdTipoCliente = string.IsNullOrEmpty(ClienteSAP.PrimerApellido) ? EnumTipoCliente.Juridico : EnumTipoCliente.Fisico;
if (cliente.IdTipoCliente == EnumTipoCliente.Juridico)
cliente.NumeroIdentificacion = ClienteSAP.Identificacion.Replace("-", "");
else
cliente.NumeroIdentificacion = ClienteSAP.Identificacion;
cliente.PrimerNombre = ClienteSAP.Nombre;
cliente.SegundoNombre = oUltimoRegistroCliente.SegundoNombre;
cliente.PrimerApellido = ClienteSAP.PrimerApellido;
cliente.SegundoApellido = ClienteSAP.SegundoApellido;
cliente.ClienteesCorporativo = oUltimoRegistroCliente.ClienteesCorporativo;
cliente.SolicitarRequisitosBasicos = false;
cliente.RazonSocial = ClienteSAP.Nombre;
cliente.Contacto = oUltimoRegistroCliente.Contacto;
cliente.Puesto = oUltimoRegistroCliente.Puesto;
cliente.IdEjecutivo = ejecutivo != null ? (int?)ejecutivo.IdEjecutivo : null;
cliente.ReferenciasCIC = null;
cliente.ReferenciasCIBERISK = null;
cliente.ReferenciasCCSS = null;
cliente.ComentariosCIC = null;
cliente.ComentariosCIBERISK = null;
cliente.ComentariosCCSS = null;
cliente.PatronoGobierno = null;
cliente.CodigoCiiu = ClienteSAP.CodigoCiiu;
var mDivisionCIIU = CatalogosDal.Obtener_DivisionCIIU().Where(c => c.IdDivisionCIIU == ClienteSAP.CodigoCiiu).FirstOrDefault();
cliente.DesCiiu = mDivisionCIIU == null ? null : mDivisionCIIU.Descripcion;
cliente.CodNivelCapacidadPago = ClienteSAP.CodNivelCapacidadPago;
cliente.DescNivelCapacidadPago = ClienteSAP.DescNivelCapacidadPago;
cliente.CodigoCategoriaRiesgo = ClienteSAP.CategoriaRiesgo;
int CodRiesgoCambiario;
if (!string.IsNullOrWhiteSpace(ClienteSAP.CodRiesgoCambiario) && int.TryParse(ClienteSAP.CodRiesgoCambiario, out CodRiesgoCambiario))
cliente.CodRiesgoCambiario = CodRiesgoCambiario;
cliente.DescRiesgoCambiario = ClienteSAP.DescRiesgoCambiario;
cliente.CodGeneraMonedaExtrangera = ClienteSAP.CodGeneraMonedaExtrangera;
cliente.DescGeneraMonedaExtrangera = ClienteSAP.DescGeneraMonedaExtrangera;
cliente.CodClasificacionMetodologia = null;
cliente.DescClasificacionMetodologia = null;
cliente.UsuarioCreador = model.UltimusUserID;
cliente.FechaCreacion = DateTime.Now;
model.Solicitud.Solicitante = new List<Solicitante>();
model.Solicitud.Solicitante.Add(new Solicitante
{
EsPrincipal = true,
IdTipoSolicitante = 1,
Cliente = cliente
});
#endregion
model.CodigoRespuesta = TipoCodigoRespuesta.EXITOSO.ToString();
}
catch (Exception ex)
{
logs.Error(ex);
model.CodigoRespuesta = TipoCodigoRespuesta.ERROR.ToString();
}
return model;
}
#endregion
#region ValidarReglasDecisionInclusionCaratulaUnica
[HttpPost]
public BaseJson ValidarReglasDecisionInclusionCaratulaUnica(ControlAprobacionJSON model)
{
BaseJson validateResp = new BaseJson() { CodigoRespuesta = TipoCodigoRespuesta.EXITOSO.ToString() };
DesembolsoJSON modelDesembolso = null;
StringBuilder sbMessage = new StringBuilder();
try
{
if (model.Aprobacion.IdDecision == EnumDecision.Desembolso_AvanzarConCondicionesActuales)
{
modelDesembolso = Cargar(model.IdSolicitud);
#region Valida Estado de Operaciones
if (modelDesembolso.Solicitud.DesembolsoDatosGenerales.Operaciones_Mora == true)
{
sbMessage.Append(" - Cliente con Operaciones en Estado de Mora<br>");
}
#endregion
#region Valida Estado con CCSS
if (modelDesembolso.Solicitud.DesembolsoDatosGenerales.CCSS_Atrasado == true)
{
sbMessage.Append(" - Cliente con atrasos con la CCSS<br>");
}
#endregion
#region Valida SobreGiro en Linea
decimal MontoDisponibleLinea = modelDesembolso.Solicitud.DesembolsoDatosGenerales.MontoDisponibleLinea ?? 0;
decimal MontoDesembolso = modelDesembolso.Solicitud.DesembolsoDatosGenerales.MontoDesembolso ?? 0;
if (MontoDesembolso > MontoDisponibleLinea)
{
sbMessage.Append(" - Desembolso con SobreGiro según disponible en SAP para la Línea<br>");
}
#endregion
#region Valida SobreGiro en Facilidad/SubLimite
decimal MontoDisponibleFacilidad = modelDesembolso.Solicitud.DesembolsoDatosGenerales.MontoDisponibleSublimite ?? 0;
decimal MontoDesembolsoFacilidad = modelDesembolso.Solicitud.DesembolsoDatosGenerales.MontoDesembolso ?? 0;
if (MontoDesembolsoFacilidad > MontoDisponibleFacilidad)
{
sbMessage.Append(" - Desembolso con SobreGiro según disponible en SAP para el SubLimite<br>");
}
#endregion
#region Fecha Vencimiento Linea
if (Math.Round((DateTime.Now - modelDesembolso.Solicitud.DesembolsoDatosGenerales.FechaVencimientoLinea.Value).TotalDays) > 0)
{
sbMessage.Append(" - La línea de crédito está vencida<br>");
}
#endregion
if (sbMessage.Length > 0)
{
validateResp.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
validateResp.DescripcionRespuesta = string.Format("Estimado usuario<br>Las condiciones del cliente y/o el desembolso requieren una revalidación de la aprobación de la línea.<br> Debe seleccionar la opción de <b>Gestionar una carátula de aprobación única.</b><br><br>Los motivo evaluados son:<br><br>{0}", sbMessage.ToString());
}
}
}
catch (Exception ex)
{
logs.Error(ex);
validateResp.CodigoRespuesta = TipoCodigoRespuesta.ERROR.ToString();
}
return validateResp;
}
#endregion
#region ValidarCaratulasTemporales
[HttpGet]
public BaseJson ValidarCaratulasTemporales(int IdSolicitud)
{
BaseJson validateResp = new BaseJson() { CodigoRespuesta = TipoCodigoRespuesta.EXITOSO.ToString() };
CaratulaCreditoDAL ConnCaratulaCredito = new CaratulaCreditoDAL();
try
{
CaratulaCredito modelCaratulaCredito = ConnCaratulaCredito.ObtenerUltimaCaratulaAprobada(IdSolicitud, EnumTipoCaratula.Temporal, EnumTipoTramite.CambioCondiciones);
if (modelCaratulaCredito != null)
{
validateResp.CodigoRespuesta = TipoCodigoRespuesta.ADVERTENCIA.ToString();
validateResp.DescripcionRespuesta = "Existen carátulas de credito temporales para cambio de condiciones formalizadas para el cliente. Por favor verifique las mismas antes de continuar con ek trámite.";
}
}
catch (Exception ex)
{
logs.Error(ex);
validateResp.CodigoRespuesta = TipoCodigoRespuesta.ERROR.ToString();
validateResp.DescripcionRespuesta = ex.Message;
}
return validateResp;
}
#endregion
[HttpGet]
public decimal ObtenerMontoDisponibleSublimite(int IdTipoFacilidad, string CodigoBP)
{
decimal respuesta = 0;
SAPServicioIntegracionAPIController SAP = new SAPServicioIntegracionAPIController();
List<Lineas> Resultados = new List<Lineas>();
DatosEntrada DatosEntrada= new DatosEntrada();
try
{
TipoFacilidad TipoFacilidad = new TipoFacilidadDAL().Obtener(IdTipoFacilidad);
DatosEntrada.NumeroCliente= CodigoBP;
Resultados =SAP.ConsultaLineasCliente(DatosEntrada);
Lineas linea = Resultados.Where(c => c.TipoClaseLinea == "6").FirstOrDefault();
if(linea !=null)
{
respuesta = linea.Sublimites.Where(x => x.Clasesublimite == TipoFacilidad.CodigoSAP).FirstOrDefault().Disponible;
}
}
catch (Exception ex)
{
logs.Error(ex);
}
return respuesta;
}
}
}