private async Task Notifica(PropiedadIndustrial pin, string mailestado)
        {
            try
            {
                DateTime hoy    = DateTime.Now;
                Correo   correo = new Correo()
                {
                    Modulo        = "Capital Humano",
                    ClavePersona  = pin.ClavePersona,
                    TipoCorreo    = "2",
                    Seccion       = "Propiedad Industrial",
                    Descripcion1  = "<b>Titulo:</b> " + pin.Titulo + "<br/>",
                    Descripcion2  = "<b>Tipo de Propiedad:</b> " + pin.TipoPropiedadIndustrial.Descripcion + "<br/>",
                    Descripcion3  = "<b>Estado:</b> " + pin.EstadoFlujo.Descripcion + "<br/>",
                    Descripcion4  = "",
                    Justificacion = pin.Justificacion,
                    Estado        = mailestado,
                    coautores     = pin.listacoautores
                };
                getCorreoConfig conf   = new getCorreoConfig();
                SendCorreo      send   = new SendCorreo();
                var             result = await send.Coautores(correo, conf);

                if (!result)
                {
                    throw new Exception("No se pudo enviar el correo!");
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }
        private async Task <Solicitud> GeneraSolicitud(PropiedadIndustrial pi)
        {
            try
            {
                DateTime  hoy       = DateTime.Now;
                Solicitud solicitud = new Solicitud()
                {
                    ClavePersona      = pi.ClavePersona,
                    TipoInformacionId = 16,
                    InformacionId     = pi.PropiedadIndustrialId.ToString(),
                    FechaSolicitud    = hoy,
                    EstadoFlujoId     = pi.EstadoFlujoId,
                    titulo            = pi.Titulo
                };
                SolicitudRepository sol = new SolicitudRepository();
                var existe = await sol.existe(solicitud.TipoInformacionId, solicitud.InformacionId);

                if (existe == null)
                {
                    solicitud = await sol.Create(solicitud);
                }
                else
                {
                    existe.EstadoFlujoId = 2;
                    solicitud            = await sol.UpdateEstadoActualizacion(existe);
                }

                return(solicitud);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        private async Task EnviarNotificacion(string clavepersona, PropiedadIndustrial p)
        {
            try
            {
                DateTime hoy    = DateTime.Now;
                Correo   correo = new Correo()
                {
                    Modulo       = "Capital Humano",
                    ClavePersona = clavepersona,
                    TipoCorreo   = "1",
                    Seccion      = "Propiedad Industrial",
                    coautores    = p.listacoautores
                };
                getCorreoConfig conf   = new getCorreoConfig();
                SendCorreo      send   = new SendCorreo();
                var             result = await send.Coautores(correo, conf);

                if (!result)
                {
                    throw new Exception("No se pudo enviar el correo!");
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }
        private async Task Aprobar(PropiedadIndustrial pin)
        {
            try
            {
                Solicitud solicitud = new Solicitud()
                {
                    TipoInformacionId = 16,
                    InformacionId     = pin.PropiedadIndustrialId.ToString()
                };
                SolicitudRepository sol = new SolicitudRepository();
                var existe = await sol.existe(solicitud.TipoInformacionId, solicitud.InformacionId);

                if (existe != null)
                {
                    existe.EstadoFlujoId = 3;
                    solicitud            = await sol.UpdateEstadoActualizacion(existe);

                    //registra bitacora

                    await RegistraBitacora(existe.SolicitudId, existe.ClavePersona, "Aprobado: " + pin.Justificacion, existe.EstadoFlujoId, 1);
                }



                //enviar correo de rechazo
                await Notifica(pin, "Aprobada");

                await CreaNuevoOC(pin);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e.InnerException);
            }
        }
        private async Task FlujoEstado2(PropiedadIndustrial _propiedadindustrial)
        {
            var nuevasolicitud = await this.GeneraSolicitud(_propiedadindustrial);

            if (nuevasolicitud != null && nuevasolicitud.SolicitudId > 0)
            {
                //crear registro bitacora
                var bitacora = RegistraBitacora(nuevasolicitud.SolicitudId, nuevasolicitud.ClavePersona, "Se envió la solicitud", 1, 0);
            }

            await EnviarNotificacion(nuevasolicitud.ClavePersona, _propiedadindustrial);
        }
 public async Task CreateCH(PropiedadIndustrial propiedadindustrial)
 {
     try
     {
         propiedadindustrial.EsPropiedadInstituto = false;
         propiedadindustrial.EstadoFlujoId        = 1;
         _pictx.PropiedadIndustrial.Add(propiedadindustrial);
         await _pictx.SaveChangesAsync();
     }
     catch (Exception e)
     {
         throw new Exception(e.Message, e);
     }
 }
        public async Task <IHttpActionResult> CreateCH(PropiedadIndustrial propiedadindustrial)
        {
            try
            {
                log.Info(new MDCSet(this.ControllerContext.RouteData));
                await _piRepo.CreateCH(propiedadindustrial);

                return(Ok("Registro creado exitosamente!"));
            }
            catch (Exception e)
            {
                log.Error(new MDCSet(this.ControllerContext.RouteData), e);
                return(InternalServerError(e));
            }
        }
        public async Task <IHttpActionResult> Update(PropiedadIndustrial propiedadindustrial)
        {
            try
            {
                log.Info(new MDCSet(this.ControllerContext.RouteData));
                var respuesta = await _piRepo.Update(propiedadindustrial);

                return(Ok(respuesta));
            }
            catch (DbUpdateConcurrencyException e)
            {
                log.Error(new MDCSet(this.ControllerContext.RouteData), e);
                return(StatusCode(HttpStatusCode.NoContent));
            }
        }
 private async Task CreaNuevoOC(PropiedadIndustrial _propiedadindustrial)
 {
     try
     {
         await new NuevoOCRepository().Create(
             new NuevoOC("CH",
                         "PI",
                         _propiedadindustrial.Titulo,
                         "IndexCH.html#/detallespiexterno/" + _propiedadindustrial.PropiedadIndustrialId + "/",
                         _propiedadindustrial.PropiedadIndustrialId + ""
                         ));
     }
     catch (Exception e)
     {
         throw new Exception(e.Message, e.InnerException);
     }
 }
        public async Task <IHttpActionResult> GetAllPropiedadInstitutoReporte(PropiedadIndustrial p)
        {
            try
            {
                log.Info(new MDCSet(this.ControllerContext.RouteData));
                var derechosautor = await _piRepo.GetAllPropiedadInstitutoReporte(p);

                if (derechosautor == null)
                {
                    return(NotFound());
                }
                return(Ok(derechosautor));
            }
            catch (Exception e)
            {
                log.Error(new MDCSet(this.ControllerContext.RouteData), e);
                return(InternalServerError(e));
            }
        }
        public async Task <string> Update(PropiedadIndustrial propiedadindustrial)
        {
            try
            {
                string mensaje = "Registro actualizado exitosamente!";
                var    _propiedadindustrial = await _pictx.PropiedadIndustrial.FirstOrDefaultAsync(e => e.PropiedadIndustrialId == propiedadindustrial.PropiedadIndustrialId);

                if (_propiedadindustrial.AdjuntoId != null && _propiedadindustrial != null && (!String.IsNullOrEmpty(propiedadindustrial.accion) && propiedadindustrial.accion == "elimina"))
                {
                    var id = _propiedadindustrial.AdjuntoId;
                    _propiedadindustrial.AdjuntoId = null;
                    await _pictx.SaveChangesAsync();

                    await new AdjuntoRepository().Delete(id);
                }
                if (propiedadindustrial.EsPropiedadInstituto)
                {
                    propiedadindustrial.EstadoFlujoId = 3;
                }
                if (propiedadindustrial.Adjunto != null)
                {
                    if (propiedadindustrial.Adjunto.AdjuntoId == 0)
                    {
                        Adjunto key = await new AdjuntoRepository().CreateAd(propiedadindustrial.Adjunto);
                        propiedadindustrial.AdjuntoId         = key.AdjuntoId;
                        propiedadindustrial.Adjunto.AdjuntoId = key.AdjuntoId;
                    }
                }
                var autores = await _pictx.AutoresPI.Where(e => e.PropiedadIndustrialId == propiedadindustrial.PropiedadIndustrialId).ToListAsync();

                if (autores.Count > 0)
                {
                    _pictx.AutoresPI.RemoveRange(autores);
                    await _pictx.SaveChangesAsync();
                }
                if (propiedadindustrial.Inventores.Count > 0)
                {
                    foreach (var autor in propiedadindustrial.Inventores)
                    {
                        autor.PropiedadIndustrialId = propiedadindustrial.PropiedadIndustrialId;
                    }
                    _pictx.AutoresPI.AddRange(propiedadindustrial.Inventores);
                    await _pictx.SaveChangesAsync();
                }


                if (_propiedadindustrial != null)
                {
                    _pictx.Entry(_propiedadindustrial).State = EntityState.Modified;
                    if (propiedadindustrial.EstadoFlujoId == 3 && propiedadindustrial.EsPropiedadInstituto == false)
                    {
                        DateTime hoy = DateTime.Now;
                        propiedadindustrial.FechaValidacion = hoy;
                    }
                    _pictx.Entry(_propiedadindustrial).CurrentValues.SetValues(propiedadindustrial);

                    await _pictx.SaveChangesAsync();
                }
                _propiedadindustrial = await _pictx.PropiedadIndustrial
                                       .Include(e => e.EstadoFlujo)
                                       .Include(e => e.TipoPropiedadIndustrial)
                                       .FirstOrDefaultAsync(e => e.PropiedadIndustrialId == propiedadindustrial.PropiedadIndustrialId);

                _propiedadindustrial.Justificacion = propiedadindustrial.Justificacion;
                if (_propiedadindustrial.EstadoFlujoId == 2)
                {
                    if (!String.IsNullOrEmpty(propiedadindustrial.listacoautores))
                    {
                        _propiedadindustrial.listacoautores = propiedadindustrial.listacoautores;
                    }
                    await FlujoEstado2(_propiedadindustrial);
                }
                if (propiedadindustrial.Rechazar)
                {
                    if (!String.IsNullOrEmpty(propiedadindustrial.listacoautores))
                    {
                        _propiedadindustrial.listacoautores = propiedadindustrial.listacoautores;
                    }
                    await Rechazar(_propiedadindustrial);

                    mensaje = "Solicitud rechazada!";
                }
                if (propiedadindustrial.Aprobar)
                {
                    if (!String.IsNullOrEmpty(propiedadindustrial.listacoautores))
                    {
                        _propiedadindustrial.listacoautores = propiedadindustrial.listacoautores;
                    }
                    await Aprobar(_propiedadindustrial);

                    mensaje = "Solicitud aprobada!";
                }


                return(mensaje);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }
        public async Task <IEnumerable <Object> > GetAllPropiedadInstitutoReporte(PropiedadIndustrial parametros)
        {
            try
            {
                GEN_Context _gen       = new GEN_Context();
                var         unidadesId = await(_pictx.DerechosAutor
                                               .Where(e => e.ClaveUnidad != "")
                                               .Select(e => e.ClaveUnidad))
                                         .AsNoTracking().ToListAsync();

                var unidades = await _gen.dbSetUnidadOrganizacional.AsNoTracking()
                               .Where(x => unidadesId.Contains(x.ClaveUnidad) && //)
                                      x.FechaEfectiva == _gen.dbSetUnidadOrganizacional
                                      .Where(f => f.FechaEfectiva <= DateTime.Now &&
                                             f.ClaveUnidad == x.ClaveUnidad)
                                      .Max(f => f.FechaEfectiva)
                                      )
                               .ToListAsync();



                var propiedadindustrial = (from pi in _pictx.PropiedadIndustrial.AsNoTracking()
                                           .Include(e => e.EstadoDelProceso)
                                           .Include(e => e.TipoPropiedadIndustrial)
                                           .Include(e => e.EstadoDelProceso)
                                           .Include(e => e.Inventores)
                                           .Where(e => e.EsPropiedadInstituto == true)
                                           select pi);


                if (propiedadindustrial != null)
                {
                    if (!String.IsNullOrEmpty(parametros.busquedaFecha))  //busqueda por fecha
                    {
                        propiedadindustrial = propiedadindustrial.Where(e => (DbFunctions.TruncateTime(e.FechaExpedicion) >= DbFunctions.TruncateTime(parametros.fechaInicioComparacion) &&
                                                                              DbFunctions.TruncateTime(e.FechaExpedicion) <= DbFunctions.TruncateTime(parametros.fechaFinalComparacion)) ||
                                                                        e.FechaExpedicion == null);
                    }
                    if (!String.IsNullOrEmpty(parametros.Titulo))
                    {
                        var listaPI = await GetPILikeNombreLatin1(parametros.Titulo);

                        propiedadindustrial = propiedadindustrial.Where(e => listaPI.Contains(e.PropiedadIndustrialId));
                    }

                    if (!String.IsNullOrEmpty(parametros.NumeroProyecto))
                    {
                        propiedadindustrial = propiedadindustrial.Where(e => e.NumeroProyecto.Contains(parametros.NumeroProyecto));
                    }

                    if (!String.IsNullOrEmpty(parametros.nombrePersona))
                    {
                        var listaPersonas = await GetAutoresByPILikeNombreLatin1(parametros.nombrePersona);

                        List <int> ids = listaPersonas.Select(x => Convert.ToInt32(x)).ToList();
                        propiedadindustrial = propiedadindustrial.Where(e => listaPersonas.Contains(e.PropiedadIndustrialId));
                    }

                    if (parametros.TipoPropiedadIndustrialId != 0)
                    {
                        propiedadindustrial = propiedadindustrial.Where(e => e.TipoPropiedadIndustrialId == parametros.TipoPropiedadIndustrialId);
                    }

                    if (!String.IsNullOrEmpty(parametros.ClaveUnidad))
                    {
                        propiedadindustrial = propiedadindustrial.Where(e => e.ClaveUnidad == parametros.ClaveUnidad);
                    }

                    if (parametros.EstadoDelProcesoId != 0)
                    {
                        propiedadindustrial = propiedadindustrial.Where(e => e.EstadoDelProcesoId == parametros.EstadoDelProcesoId);
                    }

                    List <BusquedaParams> datos = propiedadindustrial.Select(x => new BusquedaParams
                    {
                        propiedadIndustrialId = x.PropiedadIndustrialId,
                        ConsecutivoInterno    = x.ConsecutivoInterno,
                        Titulo                  = x.Titulo,
                        NumeroProyecto          = x.NumeroProyecto,
                        inventores              = x.Inventores,
                        tipoPropiedadIndustrial = x.TipoPropiedadIndustrial.Descripcion,
                        fechaExpedicion2        = x.FechaExpedicion,
                        // unidadOrganizacional = x.UnidadOrganizacional.NombreUnidad,
                        estadoDelProceso   = x.EstadoDelProceso.Descripcion,
                        expediente         = x.Expediente,
                        fechaPresentacion  = x.FechaPresentacion,
                        fechaVencimiento   = x.FechaVencimiento,
                        fechaProximoPago   = x.FechaProximoPago,
                        numeroTitulo       = x.NumeroTitulo,
                        fechaInicioTramite = x.FechaInicioTramite,
                        licenciado         = x.Licenciado,
                        ClaveUnidad        = x.ClaveUnidad,
                        Observaciones      = x.Observaciones
                    }).ToList();

                    foreach (var prop in datos)
                    {
                        if (prop.ClaveUnidad != null)
                        {
                            prop.UnidadOrganizacional = (from unidad in unidades
                                                         where unidad.ClaveUnidad == prop.ClaveUnidad
                                                         select unidad).FirstOrDefault();
                        }

                        if (prop.NumeroProyecto != null)
                        {
                            prop.Proyecto = await(from proyecto in _gen.dbSetProyectoGEN.AsNoTracking()
                                                  where proyecto.ProyectoId == prop.NumeroProyecto
                                                  select proyecto.Nombre)
                                            .FirstOrDefaultAsync();
                        }
                    }

                    return(datos);
                }

                return(null);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message, e);
            }
        }