public async Task<ActionResult> ProcesarSolicitudAlterna(INGRESOMODEL _model)
        {
            //sim tiempo
            Thread.Sleep(2000);

            // retorno de mensaje de error
            string error = "";

            // validaciones del ingreso
            if (_model.ID == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // validar la existencia del ingreso
            // get entity
            var _entity = await _context.INGRESO.FindAsync(_model.ID);

            if (_entity == null)
            {
                return HttpNotFound();
            }

            //validar que este ingreso no se haya procesado antes
            // var _pruebaProcesamiento = await _context.DATOSSOCIOECONOMICOS.FindAsync(IDINGRESO);
            //var _pruebaProcesamiento = _entity.STATUSFLOW;

            //if (_pruebaProcesamiento > 1)
            //{
            //    //return RedirectToAction("ResultadoProcesamiento", "SolicitudIngreso", new { IDRESUMEN = 1 });
            //    //error al procesar
            //    error = "error al procesar, ya existe un proceso solicitado!";
            //    return Json(new { success = false, message = "error al procesar, ya existe un proceso solicitado!" }, JsonRequestBehavior.AllowGet);
            //}

            try
            {
                //procesamiento
                /* STATUSFLOW
                 * SOL -- 1
                 * MED -- 2
                 * PSQ -- 3
                 * PS  -- 4
                 * TS  -- 5
                 * CONF -- 6
                 * DENG -- 7
                 * ING -- 8
                 * EGRE -- 9
                 * */

                // BUSCAR PROCEDIMIENTO

                _context.spCrearProcesamientoIngreso(_model.ID, DateTime.Now);

                //return Json(new { success = true, message = "Solicitud Procesada correctamente!" }, JsonRequestBehavior.AllowGet);
                return RedirectToAction(_model.actionName, "SolicitudIngreso");

            }
            catch (Exception ex)
            {
                error = ex.Message;
                //return RedirectToAction("ResultadoProcesamiento", "SolicitudIngreso", new { IDRESUMEN = 2 });
               // return Json(new { success = false, message = "No se ha podido procesar la solocitud" }, JsonRequestBehavior.AllowGet);
                return RedirectToAction("DetalleErrorProcesamiento", "SolicitudIngreso", new { detalle = ex.Message });
            }
        }
        // get
        public async Task<ActionResult> ProcesarSolicitudAlterna(int? ID)
        {
            try {

                // validaciones del ingreso
                if (ID == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }

                // validar la existencia del ingreso
                // get entity
                var _entity = await _context.INGRESO.FindAsync(ID);


                if (_entity == null)
                {
                    return HttpNotFound();
                }

                var _model = new INGRESOMODEL { 
                    ID = _entity.ID,
                    STATUSFLOW = _entity.STATUSFLOW,
                    FICHA = _entity.FICHA,
                    OBSERVACIONES = _entity.OBSERVACIONES,
                    FECHAINGRESOSISTEMA = _entity.FECHAINGRESOSISTEMA
                    
                    
                };

                // luego se comprueba algunos detalles
                //si ese ingreso está activo
                //solicitud de ficha por ingreso
                //_entity.FICHA = await _context.FICHA.FindAsync(_entity.IDPERSONA);

                //
                _model.actionName = actionNameFunc((int)_model.STATUSFLOW);
                //return View(_entity);
                return PartialView("_ProcesarSolicitudAlterna", _model);

            }catch(Exception ex)
            {
                return RedirectToAction("DetalleErrorProcesamiento", "SolicitudIngreso", new { detalle = ex.Message });
            }
        }
        public async Task<ActionResult> InfoNuevoIngreso(INGRESOMODEL _model)
        {
            if (ModelState.IsValid)
            {
                // validar si no existe un egreso pendiente
                //tiene al menos un ingreso registrado (re-ingreso)
                if (await _context.INGRESO.FirstOrDefaultAsync(i => i.IDPERSONA == _model.IDPERSONA) != null)
                {
                    // comprueba que al menos un registro tenga fecha de egrso nula
                    if (await _context.INGRESO.FirstOrDefaultAsync(i => i.FECHAEGRESOPV != null) != null)
                    {
                        // duvuele un mesaje de egreso pendiente, no puede tener un egreso pendiente
                        ModelState.AddModelError("", "Este paciente tien un Egreso pendiente, por favor notificar al Director sobre este caso");
                        ViewBag.IDCRENTROTERAPEUTICO = new SelectList(_context.CENTROTERAPEUTICOes, "ID", "NOMBRE", _model.IDCRENTROTERAPEUTICO);
                        return View(_model);
                    }
                    else
                    {
                        // get y set entity
                        var _entity = new INGRESO
                        {
                            NUMEXPEDIENTE = _model.NUMEXPEDIENTE,
                            FECHAINGRESOSISTEMA = DateTime.Now,
                            OBSERVACIONES = _model.OBSERVACIONES,
                            STATUSFLOW = 1,
                            IDPERSONA = _model.IDPERSONA
                        };

                        // guardar 
                        _context.INGRESO.Add(_entity);
                        await _context.SaveChangesAsync();

                        // crear carpeta de documentos
                        var pathFichaDocus = Path.Combine(Server.MapPath("~/App_Data/DocumentosIngreso/" + _entity.IDPERSONA.ToString() + ""), _entity.ID.ToString());

                        //orden de crear carpeta
                        Directory.CreateDirectory(pathFichaDocus);

                        // establecer el centroterapéutico de desarrollo
                        var _entityCTD = new CENTRODESARROLLOINGRESO
                        {
                            
                            IDINGRESO = _entity.ID,
                            IDCENTROTERAPEUTICO = _model.IDCRENTROTERAPEUTICO,
                            FECHAREGISTRO = DateTime.Now,
                            
                        };

                        // guardar el registro
                        _context.CENTRODESARROLLOINGRESO.Add(_entityCTD);
                        await _context.SaveChangesAsync();

                        // redireccionar a los documentos
                        // los docuemtos son dependencia del ingreso
                        return RedirectToAction("EntregaDocumentosIngreso", "SolicitudIngreso", new { ID = _entity.ID });
                    }
                }
                else
                {
                    // get y set entity
                    var _entity = new INGRESO
                    {
                        NUMEXPEDIENTE = _model.NUMEXPEDIENTE,
                        FECHAINGRESOSISTEMA = DateTime.Now,
                        OBSERVACIONES = _model.OBSERVACIONES,
                        STATUSFLOW = 1,
                        IDPERSONA = _model.IDPERSONA
                    };

                    // guardar 
                    _context.INGRESO.Add(_entity);
                    await _context.SaveChangesAsync();

                    // establecer el centroterapéutico de desarrollo
                    var _entityCTD = new CENTRODESARROLLOINGRESO
                    {

                        IDINGRESO = _entity.ID,
                        IDCENTROTERAPEUTICO = _model.IDCRENTROTERAPEUTICO,
                        FECHAREGISTRO = DateTime.Now,

                    };

                    // guardar el registro
                    _context.CENTRODESARROLLOINGRESO.Add(_entityCTD);
                    await _context.SaveChangesAsync();

                    // crear carpeta de documentos por ingreso
                    // crear capeta de interno
                    // crear carpeta de documentos
                    var pathFichaDocus = Path.Combine(Server.MapPath("~/App_Data/DocumentosIngreso/" + _entity.IDPERSONA.ToString() + ""), _entity.ID.ToString());

                    //orden de crear carpeta
                    Directory.CreateDirectory(pathFichaDocus);
                    // redireccionar a los documentos
                    // los docuemtos son dependencia del ingreso
                    return RedirectToAction("EntregaDocumentosIngreso", "SolicitudIngreso", new { ID = _entity.ID });
                }

            }

            ViewBag.IDCRENTROTERAPEUTICO = new SelectList(_context.CENTROTERAPEUTICOes, "ID", "NOMBRE", _model.IDCRENTROTERAPEUTICO);
            return View(_model);
        }
        //3. Info Nuevo ingreso
        // un nuevo ingreso está relacionado a una ficha única
        //
        //GET
        public async Task<ActionResult> InfoNuevoIngreso(int? ID)
        {
            // COPROBAR QUE LA entrada es válida
            if (ID == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //get entiy
            var _entity = await _context.FICHA.FindAsync(ID);

            //si es nula, retorna no encontrada
            if (_entity == null)
            {
                return HttpNotFound();
            }

            // set model
            var _model = new INGRESOMODEL();
            _model.FICHA = _entity;

            _model.IDPERSONA = _entity.ID;

            //Viewbags

            //to view
            ViewBag.IDCRENTROTERAPEUTICO = new SelectList(_context.CENTROTERAPEUTICOes, "ID", "NOMBRE");
            return View(_model);
        }
        // modificación del estado
        public async Task<ActionResult> EditarEstadoIngreso(INGRESOMODEL _model)
        {
            Thread.Sleep(2000);

            try
            {

                // get entity 
                var _entity = new INGRESO();

                // find
                _entity = await _context.INGRESO.FindAsync(_model.ID);

                //set cambios
                // _entity.FECHAFIRMAACUERDO = _model.FECHAFIRMAACUERDO;
                _entity.FECHAUTORIZACION = _model.FECHAUTORIZACION;
                _entity.ACEPTADO = _model.ACEPTADO;
                //_entity.CONTRATO = _model.CONTRATO;
                _entity.OBSERVACIONES = _model.OBSERVACIONES;

                //save data 
                _context.Entry(_entity).State = EntityState.Modified;
                await _context.SaveChangesAsync();


                return Json(new { success = true, message = "Se ha cambiado el estado con éxito!" }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { success = false, message = ex.Message }, JsonRequestBehavior.AllowGet);
            }

        } 
        //get de evaluación Social
        public async Task<ActionResult> EvaluacionSocial(int? ID)
        {
            // validaciones del ingreso
            if (ID == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // validar la existencia del ingreso
            // get entity
            var _entity = await _context.INGRESO.FindAsync(ID);


            if (_entity == null)
            {
                return HttpNotFound();
            }

            // set viewModel
            var _viewModel = new INGRESOMODEL();

            _viewModel.ACEPTADO = _entity.ACEPTADO;
            _viewModel.ID = _entity.ID;
            _viewModel.STATUSFLOW = _entity.STATUSFLOW;
            _viewModel.NUMEXPEDIENTE = _entity.NUMEXPEDIENTE;
            _viewModel.OBSERVACIONES = _entity.OBSERVACIONES;
            
            // get utilidades
            _viewModel.DROGAS = await _context.DATOSPROBLEMADROGAS_DROGAS.ToListAsync();
            _viewModel.ESCOLARIDADES = await _context.INFORMACIONACADEMICA_ESCOLARIDAD.ToListAsync();
            _viewModel.OFICIOS = await _context.INFORMACIONACADEMICA_OFICIOS.ToListAsync();
            // luego se comprueba algunos detalles
            //si ese ingreso está activo
            //solicitud de ficha por ingreso
            _viewModel.FICHA = await _context.FICHA.FindAsync(_entity.IDPERSONA);

            _entity.FICHA = await _context.FICHA.FindAsync(_entity.IDPERSONA);
            //Viewbags
            

            // to view
            return View(_entity);
        }