Beispiel #1
0
        public ActionResult NuevoContrato()
        {
            ContratoWebHookMambu contratoWebHook = new ContratoWebHookMambu();

            System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Request.InputStream);
            string rawSendGridJSON        = reader.ReadToEnd();

            contratoWebHook = new JavaScriptSerializer().Deserialize <ContratoWebHookMambu>(rawSendGridJSON);


            if (contratoWebHook != null)
            {
                Dictionary <string, object> parametros = new Dictionary <string, object>();
                parametros.Add("idContrato", contratoWebHook.IdContrato);

                //Consulta para validar si el contrato ya existe.
                //Ya que la petición del webhook ha estado enviando valores duplicados
                string existe       = OperacionesBD.ValidaExisteContrato(parametros);
                string existeCadena = (existe == "1" ? " existe" : " no existe");

                //Una vez que se valide que el contrato que esta por crearse no existe
                //se procede a obtener informacion de mambu para posteriormente agregar
                //la informacion concentrada en la BD de VFMéxico
                if (existe.Equals("0"))
                {
                    //Obtenemos las transacciones del contrato
                    List <Loan> loans = Operaciones.ObtenerCuentasPrestamo(contratoWebHook.IdContrato);

                    long contador = 0;

                    log.Info("Contrato Nuevo :" + contador.ToString() + " DE: " + loans.Count().ToString());

                    if (loans != null && loans.Count > 0)
                    {
                        Dictionary <string, string> datos = new Dictionary <string, string>();

                        foreach (var loan in loans)
                        {
                            int numeroPago = 1;

                            Dictionary <string, object> parametrosExisteCredito = new Dictionary <string, object>();
                            parametrosExisteCredito.Add("idCredito", contratoWebHook.IdCredito);

                            //Creamos instancias de los objetos que se obtendra información
                            Credito  credito          = new Credito();
                            Cliente  cliente          = new Cliente();
                            Contrato contratoInsertar = new Contrato();

                            string keyGrupo = string.Empty;

                            credito.diasVencidos = 0;
                            credito.idCredito    = contratoWebHook.IdCredito;

                            //Obtenemos las amortizaciones de contrato
                            List <Repayment> amortizaciones = Operaciones.ObtenerAmortizaciones(loan.id);

                            // datos de Sucursal
                            //Validar que el id de sucursal de contratowebhook sea el mismo
                            datos = Operaciones.ObtenerDatosSucursal(loan.assignedBranchKey);

                            credito.idSucursal     = datos.Where(z => z.Key.Equals("idSucursal")).FirstOrDefault().Value.ToString();
                            credito.nombreSucursal = datos.Where(z => z.Key.Equals("nombreSucursal")).FirstOrDefault().Value.ToString();

                            Dictionary <string, string> datosCliente = new Dictionary <string, string>();
                            //Se obtiene el cliente y su informacion faltante
                            datosCliente = Operaciones.ObtenerDatosCliente(loan.accountHolderKey);

                            try
                            {
                                contratoWebHook.Cliente.nombre           = datosCliente.Where(z => z.Key.Equals("nombreCliente")).FirstOrDefault().Value.ToString();
                                contratoWebHook.Cliente.apellidoPaterno  = datosCliente.Where(z => z.Key.Equals("paternoCliente")).FirstOrDefault().Value.ToString();
                                contratoWebHook.Cliente.apellidoMaterno  = datosCliente.Where(z => z.Key.Equals("maternoCliente")).FirstOrDefault().Value.ToString();
                                contratoWebHook.Cliente.fechaNacimiento  = Convert.ToDateTime(datosCliente.Where(z => z.Key.Equals("fechaNacimiento")).FirstOrDefault().Value.ToString());
                                contratoWebHook.Cliente.sexo             = datosCliente.Where(z => z.Key.Equals("sexo")).FirstOrDefault().Value.ToString();
                                contratoWebHook.Cliente.coloniaPoblacion = datosCliente.Where(z => z.Key.Equals("coloniaPoblacion")).FirstOrDefault().Value.ToString();

                                credito.keyGrupo = datosCliente.Where(z => z.Key.Equals("keyGrupo")).FirstOrDefault().Value.ToString();
                            }
                            catch
                            {
                                credito.keyGrupo = loan.accountHolderKey;
                            }

                            credito.idCliente = contratoWebHook.Cliente.idCliente;

                            Cliente clienteCamposPersonalizados = new Cliente();

                            clienteCamposPersonalizados = Operaciones.ObtenerDatosClienteActualiza(loan.accountHolderKey);

                            //Obtenemos los datos de la identificacion capturada
                            contratoWebHook.Cliente.tipoDocumento     = clienteCamposPersonalizados.idDocuments[0].issuingAuthority;
                            contratoWebHook.Cliente.vigenciaDocumento = clienteCamposPersonalizados.idDocuments[0].validUntil;

                            var customFields = clienteCamposPersonalizados.customInformation.Where(x => x.customFieldID.Equals("Edad_Clientes") && Convert.ToInt32(x.value) < 19).ToList().Count.ToString();

                            if (customFields == null)
                            {
                                contratoWebHook.Cliente.numeroDependientes = "0";
                            }
                            else
                            {
                                contratoWebHook.Cliente.numeroDependientes = customFields;
                            }

                            // datos del Producto
                            credito.nombreProducto = contratoWebHook.NombreDelProducto;
                            credito.keyProducto    = loan.productTypeKey;

                            // si no es individual entonces va a buscar los datos del Grupo
                            if (!loan.accountHolderKey.Equals(credito.keyGrupo))
                            {
                                Dictionary <string, string> datosGrupo = Operaciones.ObtenerDatosGrupo(credito.keyGrupo);

                                credito.idGrupo     = datosGrupo.Where(z => z.Key.Equals("idGrupo")).FirstOrDefault().Value.ToString();
                                credito.nombreGrupo = datosGrupo.Where(z => z.Key.Equals("nombreGrupo")).FirstOrDefault().Value.ToString();
                            }
                            else
                            {
                                credito.idGrupo     = contratoWebHook.Cliente.idCliente;
                                credito.nombreGrupo = cliente.nombre + " " + cliente.apellidoPaterno + " " + cliente.apellidoMaterno;
                            }

                            credito.metodologia = contratoWebHook.Metodologia;

                            // la última fecha de las amortizaciones es la Fecha Esperada de Liquidación
                            credito.fechaEsperadaLiquidacion = DateTime.Parse(amortizaciones.LastOrDefault().dueDate);
                            credito.fechaContrato            = DateTime.Parse(loan.fechaDeCreacion);
                            credito.fechaDesembolso          = DateTime.Parse(DateTimeOffset.Parse(loan.disbursementDetails.expectedDisbursementDate).ToString("yyyy-MM-dd"));
                            credito.fechaBaja        = DateTime.Parse("01/01/1900");
                            credito.fechaLiquidacion = DateTime.Parse("01/01/1900");

                            credito.frecuenciaPagoNumero = loan.repaymentPeriodCount;
                            credito.frecuenciaPagoUnidad = loan.repaymentPeriodUnit;

                            credito.numeroPagos = amortizaciones.Count();

                            credito.tasaAnual   = loan.interestRate;
                            credito.tasaMensual = credito.tasaAnual / 12;
                            credito.tasaDiaria  = credito.tasaAnual / 360;

                            credito.estatus = loan.accountState;

                            Dictionary <string, string> datosProducto = Negocio.Operaciones.ObtenerDatosProducto(loan.productTypeKey);
                            credito.idProducto = datosProducto.Where(z => z.Key.Equals("idProducto")).FirstOrDefault().Value.ToString();

                            if (loans.Count > 0)
                            {
                                credito.tipoCredito = Negocio.Globales.Constantes.TIPO_CREDITO_GRUPAL;
                            }
                            else
                            {
                                credito.tipoCredito = Negocio.Globales.Constantes.TIPO_CREDITO_INDIVIDUAL;
                            }

                            //Obtener los datos de oficial de credito
                            List <CustomFieldValue> campo = Operaciones.ObtenerCampoPersonalizadoContrato(contratoWebHook.IdContrato, "Oficial_de_Credito_Asignado_Cuen", string.Empty);

                            var userKey = campo.FirstOrDefault(x => x.customFieldKey == ConstantesMambu.KEY_CAMPO_OFICIAL_CREDITO).linkedEntityKeyValue;

                            Usuario userMambu = Operaciones.ObtenerUsuarioMambu(userKey);


                            // datos del contrato
                            contratoInsertar.idCliente            = contratoWebHook.Cliente.idCliente;
                            contratoInsertar.idContrato           = loan.id;
                            contratoInsertar.idCredito            = contratoWebHook.IdCredito;
                            contratoInsertar.montoCapital         = loan.loanAmount;
                            contratoInsertar.montoComisiones      = loan.feesPaid;
                            contratoInsertar.saldo                = loan.principalBalance;
                            contratoInsertar.capitalPagado        = loan.principalPaid;
                            contratoInsertar.interesPagado        = loan.interestPaid;
                            contratoInsertar.estatus              = loan.accountState;
                            contratoInsertar.subEstatus           = loan.accountSubState;
                            contratoInsertar.beneficiario         = contratoWebHook.Beneficiario;
                            contratoInsertar.pda                  = contratoWebHook.PDA;
                            contratoInsertar.sector               = contratoWebHook.Sector;
                            contratoInsertar.subSector            = contratoWebHook.SubSector;
                            contratoInsertar.propositoCredito     = contratoWebHook.PropositoCredito;
                            contratoInsertar.empleosCreados       = contratoWebHook.EmpleadosCreadosTC.ToString();
                            contratoInsertar.empleosSostenidos    = contratoWebHook.EmpleadosSostenidosTC.ToString();
                            contratoInsertar.fuenteFondeo         = contratoWebHook.FuenteFondeo;
                            contratoInsertar.valorBien            = contratoWebHook.ValorBien;
                            contratoInsertar.formaDesembolso      = contratoWebHook.FormaDesembolso;
                            contratoInsertar.nombreOficialCredito = contratoWebHook.NombreOficialCredito;
                            contratoInsertar.numeroOficialCredito = userMambu.id;
                            contratoInsertar.fechaCierre          = Convert.ToDateTime(loan.closeDate.Year == 1 ? "01/01/1900" : loan.closeDate.ToString());

                            foreach (Repayment amortizacion in amortizaciones)
                            {
                                Pago pago = new Pago();

                                pago.numeroCuota     = numeroPago;
                                pago.idContrato      = loan.id;
                                pago.estatus         = amortizacion.state;
                                pago.fechaPago       = DateTime.Parse(amortizacion.dueDate);
                                pago.fechaPagado     = DateTime.Parse(amortizacion.repaidDate == null ? amortizacion.repaidDate = "01/01/1900" : amortizacion.repaidDate);
                                pago.capitalEsperado = decimal.Parse(amortizacion.principalDue);
                                pago.interesEsperado = decimal.Parse(amortizacion.interestDue);
                                pago.capitalPagado   = decimal.Parse(amortizacion.principalPaid);
                                pago.interesPagado   = decimal.Parse(amortizacion.interestPaid);


                                // inserta las Amortizaciones
                                OperacionesBD.InsertarAmortizaciones(pago);


                                numeroPago += 1;
                            }

                            List <Transaccion> transacciones = Operaciones.ObtenerTransacciones(Constantes.TRANSACTIONS_TYPE_DISBURSMENT, loan.encodedKey).ToList();

                            transacciones.AddRange(Operaciones.ObtenerTransacciones(Constantes.TRANSACTIONS_TYPE_REPAYMENT, loan.encodedKey).ToList());

                            foreach (Transaccion transaccion in transacciones)
                            {
                                Movimiento movimiento = new Movimiento();

                                string existeMovimiento = Negocio.OperacionesBD.ExisteTransaccion(transaccion.transactionId);

                                if (transaccion.type.Equals("REPAYMENT"))
                                {
                                    movimiento.codigo = "PAGO";
                                }
                                else if (transaccion.type.Equals("DISBURSMENT"))
                                {
                                    movimiento.codigo = "DESEMBOLSO";
                                }
                                else if (transaccion.type.Equals(Negocio.Globales.Constantes.ESTATUS_WRITE_OFF))
                                {
                                    movimiento.codigo = "CASTIGO";
                                }
                                else
                                {
                                    movimiento.codigo = "";
                                }
                                movimiento.fechaMovimiento = DateTime.Parse(transaccion.creationDate);
                                movimiento.fechaValor      = DateTime.Parse(transaccion.entryDate);
                                movimiento.idContrato      = loan.id;
                                movimiento.idTransaccion   = transaccion.transactionId;
                                movimiento.montoCapital    = transaccion.principalPaid;
                                movimiento.montoInteres    = transaccion.interestPaid;
                                movimiento.montoTotal      = transaccion.amount;
                                movimiento.saldo           = transaccion.principalBalance;

                                if (existeMovimiento.Equals("0"))
                                {
                                    OperacionesBD.InsertarMovimiento(movimiento);
                                }
                            }

                            List <AnidaFee> comitions = loan.disbursementDetails.fees;

                            //Validacion para comision
                            foreach (var comition in comitions)
                            {
                                if (comition.fee.name.ToUpper().Contains("COMISIÓN") || comition.fee.name.ToUpper().Contains("COMISION"))
                                {
                                    Movimiento movimiento = new Movimiento();

                                    movimiento.codigo          = "COMISIÓN";
                                    movimiento.fechaMovimiento = Convert.ToDateTime(comition.fee.creationDate);
                                    movimiento.fechaValor      = Convert.ToDateTime(loan.disbursementDetails.disbursementDate);
                                    movimiento.idContrato      = loan.id;
                                    movimiento.idTransaccion   = -1;
                                    movimiento.montoCapital    = 0;
                                    movimiento.montoInteres    = 0;
                                    movimiento.montoTotal      = Convert.ToDecimal(comition.fee.amount);
                                    movimiento.saldo           = 0;

                                    OperacionesBD.InsertarMovimiento(movimiento);
                                }
                                else if (comition.fee.name.ToUpper().Contains("GASTO"))
                                {
                                    Movimiento movimiento = new Movimiento();

                                    movimiento.codigo          = "SEGURO";
                                    movimiento.fechaMovimiento = Convert.ToDateTime(comition.fee.creationDate);
                                    movimiento.fechaValor      = Convert.ToDateTime(loan.disbursementDetails.disbursementDate);
                                    movimiento.idContrato      = loan.id;
                                    movimiento.idTransaccion   = -1;
                                    movimiento.montoCapital    = 0;
                                    movimiento.montoInteres    = 0;
                                    movimiento.montoTotal      = Convert.ToDecimal(comition.fee.amount);
                                    movimiento.saldo           = 0;

                                    OperacionesBD.InsertarMovimiento(movimiento);
                                }
                            }

                            //Validamos que no exista el crédito
                            string existeCredito = string.Empty;
                            existeCredito = OperacionesBD.ExisteCredito(parametrosExisteCredito);

                            if (existeCredito.Equals("0"))
                            {
                                OperacionesBD.InsertarCredito(credito);
                            }
                            else
                            {
                            }

                            Dictionary <string, object> parametrosGrupo = new Dictionary <string, object>();
                            parametrosGrupo.Add("idGrupo", credito.idGrupo);
                            parametrosGrupo.Add("nombreGrupo", credito.nombreGrupo);
                            //Validamos que el grupo no exista
                            string existeGrupo = Negocio.OperacionesBD.ExisteGrupo(credito.idGrupo);

                            if (existeGrupo.Equals("0"))
                            {
                                Negocio.OperacionesBD.InsertarGrupo(parametrosGrupo);
                            }

                            //Validar que el cliente exista en la BD, en caso de que ya se encuentre no se inserta
                            Dictionary <string, object> parametrosCliente = new Dictionary <string, object>();
                            parametrosCliente.Add("idCliente", contratoWebHook.Cliente.idCliente);
                            string existeCliente = OperacionesBD.ExisteCliente(parametrosCliente);

                            if (existeCliente.Equals("0"))
                            {
                                OperacionesBD.InsertarCliente(contratoWebHook.Cliente);
                            }


                            OperacionesBD.InsertarContrato(contratoInsertar);

                            transacciones.Clear();
                            transacciones = null;

                            amortizaciones.Clear();
                            amortizaciones = null;

                            datos.Clear();
                            datos = null;
                            datos = new Dictionary <string, string>();

                            cliente         = null;
                            credito         = null;
                            contratoWebHook = null;
                        }
                    }
                    else
                    {
                    }
                }
                else
                {
                }
            }
            else
            {
            }
            return(new HttpStatusCodeResult(200));
        }