public FileResult DescargarDocumento()
        {
            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            int     IdDocumento    = HttpContext.Session.GetComplexData <int>("IdDocumento");

            proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
            Documento documento = proceso.Solicitud.Participantes.Find(participante => participante.RUN.Equals(IdParticipante)).Documentos.Find(documento => documento.Id == IdDocumento);
            String    extension = Path.GetExtension(documento.CopiaDoc);
            String    tipoDoc   = "";

            switch (extension)
            {
            case ".jpeg":
                tipoDoc = "image/jpeg";
                break;

            case ".jpg":
                tipoDoc = "image/jpg'";
                break;

            case ".png":
                tipoDoc = "image/png'";
                break;

            default:
                tipoDoc = "application/pdf";
                break;
            }

            string nombreArchivoAux = Path.GetFileName(documento.CopiaDoc);
            var    fileContent      = new System.Net.WebClient().DownloadData(documento.CopiaDoc);

            return(File(fileContent, tipoDoc, nombreArchivoAux));
        }
        public JsonResult DocumentosSeleccionados()
        {
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");

            if (IdParticipante != null)
            {
                List <Persona> participantes  = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
                int            montoDocsSelec = 0;
                for (int i = 0; i < participantes.Count(); i++)
                {
                    for (int j = 0; participantes[i].Documentos != null && j < participantes[i].Documentos.Count(); j++)
                    {
                        if (participantes[i].Documentos[j].Estado == 1)
                        {
                            montoDocsSelec += participantes[i].Documentos[j].Monto;
                        }
                    }
                }

                var datos = new
                {
                    participante    = participantes.Find(participante => participante.RUN == IdParticipante),
                    montoSolicitado = proceso.Solicitud.Monto,
                    montoDocsSelec
                };
                return(Json(datos));
            }

            return(Json(new object()));
        }
        public FileResult DescargarDG()
        {
            //Proceso proceso = obtenerProceso();
            Proceso proceso = HttpContext.Session.GetComplexData <Proceso>("Proceso");

            proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
            //proceso.Organizacion = ConsultaSolicitud.LeerOrganizacion(proceso.Solicitud.Id);
            GeneradorPDF generadorPDF = new GeneradorPDF(_converter);

            return(File(generadorPDF.PDF(proceso, "Declaración de gastos"), "application/pdf", "DeclaracionDeGastos.pdf"));
        }
        public JsonResult GenerarDG(int Excedente)
        {
            try
            {
                Proceso proceso = HttpContext.Session.GetComplexData <Proceso>("Proceso");
                proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
                List <Persona> participantes = proceso.Solicitud.Participantes.FindAll(participante => participante.RUN != "-1");

                /*Documentos en conjuntos se encuentra en el participante "-1" el cual estara en la variable participanteAux*/
                Persona participanteAux          = proceso.Solicitud.Participantes.Find(participante => participante.RUN == "-1");
                int     cantParticipantes        = participantes.Count();
                int     totalRendido             = proceso.DeclaracionGastos.TotalRendido;
                int     montoMaxParticipante     = 0,
                        totalRendidoParticipante = 0,
                        faltanteRendir           = 0,
                        totalGrupalRendido       = 0,
                        montoMaximoRendir        = proceso.Solicitud.Monto + Excedente;

                /*Calcula el monto total a rendir por persona. En caso de existir documento seleccionados dentro del usuario "-1" (documentos realizados en conjunto),
                 * se debe restar al monto solicitado y luego se debe dividir ese resultado se debe dividir por la cantidad de participantes del evento */
                if (cantParticipantes > 0)
                {
                    /*Verifica si existen documentos en comun seleccionados*/
                    totalGrupalRendido   = participanteAux.Documentos.Where(doc => doc.Estado == 1).Sum(doc => doc.Monto);
                    montoMaxParticipante = (montoMaximoRendir - totalGrupalRendido) / cantParticipantes;
                }

                /*Selecciona boletas por participante. En caso de que la actividad sea masiva, no pasara por esta seccion*/
                for (int i = 0; i < cantParticipantes && totalRendido < montoMaximoRendir; i++)
                {
                    faltanteRendir = montoMaxParticipante - totalRendidoParticipante;
                    totalRendido  += seleccionarDocumentosParticipante(faltanteRendir, participantes[i].Documentos);
                }

                /*Si falta dinero por rendir se seleccionan boletas en comun que tienen los participantes en comun. En caso
                 * de que la actividad sea masiva, siempre pasara por esta seccion*/
                if (totalRendido < montoMaximoRendir)
                {
                    faltanteRendir = montoMaximoRendir - totalRendido;
                    totalRendido   = seleccionarDocumentosParticipante(faltanteRendir, participanteAux.Documentos);
                }
                return(Json(true));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            return(Json(false));
        }
        public JsonResult DatosDocumento()
        {
            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            int     IdDocumento    = HttpContext.Session.GetComplexData <int>("IdDocumento");

            proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
            Documento documento = proceso.Solicitud.Participantes.Find(participante => participante.RUN.Equals(IdParticipante)).Documentos.Find(documento => documento.Id == IdDocumento);
            var       datos     = new
            {
                documento,
                estadoProceso      = proceso.Estado,
                estadoFinalProceso = proceso.EstadoFinal
            };


            return(Json(datos));
        }
        public JsonResult LeerParticipante()
        {
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");

            proceso = ConsultasGenerales.LeerEstadoProceso(proceso);
            HttpContext.Session.SetComplexData("Proceso", proceso);
            HttpContext.Session.SetInt32("EstadoProceso", proceso.Estado);
            HttpContext.Session.SetString("EstadoFinalProceso", proceso.EstadoFinal);

            if (IdParticipante != null)
            {
                for (int j = 0; j < proceso.Solicitud.Participantes.Count(); j++)
                {
                    proceso.Solicitud.Participantes[j].Documentos = null;
                }
                List <Persona> participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
                int            montoDocs     = 0;
                for (int i = 0; i < participantes.Count(); i++)
                {
                    for (int j = 0; participantes[i].Documentos != null && j < participantes[i].Documentos.Count(); j++)
                    {
                        montoDocs += participantes[i].Documentos[j].Monto;
                    }
                }

                var datos = new
                {
                    participante    = participantes.Find(participante => participante.RUN == IdParticipante),
                    montoSolicitado = proceso.Solicitud.Monto,
                    montoDocs,
                    estado      = proceso.Estado,
                    estadoFinal = proceso.EstadoFinal
                };
                return(Json(datos));
            }

            return(Json(new object()));
        }
        public JsonResult LeerParticipantes()
        {
            Proceso proceso = HttpContext.Session.GetComplexData <Proceso>("Proceso");

            proceso = ConsultasGenerales.LeerEstadoProceso(proceso);
            HttpContext.Session.SetComplexData("Proceso", proceso);
            if (proceso.Solicitud.Participantes != null)
            {
                for (int j = 0; j < proceso.Solicitud.Participantes.Count(); j++)
                {
                    proceso.Solicitud.Participantes[j].Documentos = null;
                }

                var datos = new
                {
                    participantes   = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias),
                    montoSolicitado = proceso.Solicitud.Monto,
                    estado          = proceso.Estado,
                    estadoFinal     = proceso.EstadoFinal
                };
                return(Json(datos));
            }
            return(Json(new object()));
        }
        public JsonResult CrearDeclaracionDocumento(String CodigoDocumento, String Proveedor, DateTime FechaDocumento, int Monto,
                                                    String DescripcionDocumento, int Categoria, String TipoDocumento, IFormFile Archivo)
        {
            string  msj, titulo;
            bool    validar;
            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            int     IdDocumento    = 1;

            proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
            List <Documento> documentos = proceso.Solicitud.Participantes.Find(participante => participante.RUN.Equals(IdParticipante)).Documentos;

            if (documentos != null)
            {
                int      i         = documentos.Count - 1;
                FileInfo archivo   = new FileInfo(documentos[i].CopiaDoc);
                String   nombreDoc = Path.GetFileNameWithoutExtension(archivo.Name);
                IdDocumento = Convert.ToInt32(nombreDoc) + 1;
            }

            Documento DocumentoAux = new Documento()
            {
                CodigoDocumento      = CodigoDocumento,
                Proveedor            = Proveedor,
                FechaDocumento       = FechaDocumento,
                Monto                = Monto,
                DescripcionDocumento = DescripcionDocumento,
                Categoria            = proceso.Solicitud.Categorias.Find(categoria => categoria.Id == Categoria),
                TipoDocumento        = TipoDocumento,
                CopiaDoc             = GuardarArchivoDeclaracionGastos(Archivo, proceso.Solicitud.Id, IdDocumento, IdParticipante)
            };

            DocumentoAux.Id = ConsultaDeclaracionGastos.CrearDocumento(DocumentoAux, IdParticipante, proceso.DeclaracionGastos.Id);

            if (DocumentoAux.Id > 0)
            {
                validar = true;
                titulo  = "Datos guardados exitosamente";
                msj     = "Los datos se han guardado exitosamente";
            }
            else if (DocumentoAux.Id == -2)
            {
                System.IO.File.Delete(DocumentoAux.CopiaDoc);
                validar = false;
                titulo  = "Se ha producido un problema";
                msj     = "Los datos no se han registrado correctamente. Esto se debe a que ya se encuentra registrado un documento con el mismo código y proveedor.";
            }
            else
            {
                validar = false;
                titulo  = "Se ha producido un problema";
                msj     = "Los datos no se han guardado correctamente. Verifique que tenga conexión a internet e intentelo nuevamente. Si el problema persiste favor de contactarse con soporte.";
            }

            var datos = new
            {
                validar,
                titulo,
                msj
            };

            return(Json(datos));
        }
        public JsonResult EliminarDocumentosPaticipante(String IdParticipante)
        {
            //Usuario usuario = HttpContext.Session.GetComplexData<UsuarioRepresentante>("DatosUsuario");
            String tipoUsuario = HttpContext.Session.GetString("TipoUsuario");

            if (tipoUsuario.Equals("Estudiante dirigente"))
            {
                Usuario             usuario        = HttpContext.Session.GetComplexData <Usuario>("DatosUsuario");
                List <Organizacion> organizaciones = ConsultaUsuario.LeerOrganizacion(usuario.Id, tipoUsuario);
                Organizacion        organizacion   = organizaciones[0];

                Proceso proceso = HttpContext.Session.GetComplexData <Proceso>("Proceso");
                proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
                if (IdParticipante == null)
                {
                    IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
                }

                string webRootPath = _webHostEnvironment.WebRootPath;

                try
                {
                    int  cantParticipantes = proceso.Solicitud.Participantes.Count();
                    bool existenDocumentosParticipantes = false;
                    for (int i = 0; i < cantParticipantes; i++)
                    {
                        if (!proceso.Solicitud.Participantes[i].RUN.Equals(IdParticipante) && proceso.Solicitud.Participantes[i].Documentos != null && proceso.Solicitud.Participantes[i].Documentos.Count() > 0)
                        {
                            existenDocumentosParticipantes = true;
                        }
                    }

                    int validar = ConsultaDeclaracionGastos.EliminarDocumentosParticipante(proceso.DeclaracionGastos.Id, IdParticipante);

                    if (validar == 1)
                    {
                        string rutaCarpetaParticiapnte = Path.Combine(webRootPath, "Procesos", organizacion.Nombre, proceso.Solicitud.FechaTerminoEvento.Year.ToString(), proceso.Solicitud.Id.ToString(), "DeclaracionGastos", IdParticipante);
                        string rutaCarpetaDG           = Path.Combine(webRootPath, "Procesos", organizacion.Nombre, proceso.Solicitud.FechaTerminoEvento.Year.ToString(), proceso.Solicitud.Id.ToString(), "DeclaracionGastos");

                        if (existenDocumentosParticipantes && Directory.Exists(rutaCarpetaParticiapnte))
                        {
                            Directory.Delete(rutaCarpetaParticiapnte, true);
                            return(Json("1"));
                        }
                        else if (!existenDocumentosParticipantes && Directory.Exists(rutaCarpetaDG))
                        {
                            Directory.Delete(rutaCarpetaDG, true);
                            return(Json("1"));
                        }
                        else
                        {
                            return(Json("0"));
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
            return(Json("-1"));
        }
        public JsonResult EliminarDocumento(int IdDocumento)
        {
            string msj, titulo, carpetaDeclaracionGasto = "", carpetaRepresentante = "";
            /*Obtiene el ID del participante al cual se le eliminara el documento*/
            String IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            /*Obtiene los datos del proceso en general*/
            Proceso proceso = HttpContext.Session.GetComplexData <Proceso>("Proceso");
            /*Lee los documentos y se los asigna a los perticipantes correspondientes*/
            List <Persona> participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);

            int       cantDocumentos             = 0;
            int       cantParticipantes          = participantes.Count();
            int       cantDocumentosParticipante = 0;
            Documento documento       = null;
            int       respEliminacion = -1;
            Boolean   validar         = false;

            try
            {
                for (int i = 0; i < cantParticipantes; i++)
                {
                    cantDocumentos += participantes[i].Documentos.Count();
                    if (participantes[i].RUN.Equals(IdParticipante))
                    {
                        cantDocumentosParticipante = participantes[i].Documentos.Count();
                        documento = participantes[i].Documentos.Find(documento => documento.Id == IdDocumento);
                    }
                }

                /*Eliminacion del documento*/
                if (documento != null)
                {
                    /*Elimina un documento en particular*/
                    respEliminacion = ConsultaDeclaracionGastos.EliminarDocumento(IdDocumento);
                    if (respEliminacion == 1)
                    {
                        System.IO.File.Delete(documento.CopiaDoc);
                    }
                }

                /*Eliminacion de carpetas en caso de que no existan documentos asociados tanto al participante como a la declaracion de gastos*/
                string[] ruta = documento.CopiaDoc.Split("\\");

                for (int i = 0; i < ruta.Length - 1; i++)
                {
                    if (i < ruta.Length - 2)
                    {
                        carpetaDeclaracionGasto = Path.Combine(carpetaDeclaracionGasto, ruta[i]);
                    }
                    carpetaRepresentante = Path.Combine(carpetaRepresentante, ruta[i]);
                }

                /*Borrara la carpeta que contiene los documentos del participante*/
                if (cantDocumentosParticipante == 1 && respEliminacion == 1)
                {
                    System.IO.Directory.Delete(carpetaRepresentante);
                }

                /*Borrara la carpeta de Declaracion de gastos que contiene los documentos(Boletas o facturas)*/
                if (cantDocumentos == 1 && respEliminacion == 1)
                {
                    System.IO.Directory.Delete(carpetaDeclaracionGasto);
                }

                if (respEliminacion == 1)
                {
                    validar = true;
                    titulo  = "Eliminación exitosa";
                    msj     = "Se ha eliminado el documento exitosamente";
                }
                else if (respEliminacion == -1)
                {
                    validar = false;
                    titulo  = "Se ha producido un problema";
                    msj     = "El documento no se ha podido eliminar. Verifique que tenga conexión a internet e intentelo nuevamente. Si el problema persiste favor de contactarse con soporte.";
                }
                else
                {
                    validar = false;
                    titulo  = "Se ha producido un problema";
                    msj     = "El documento no se ha podido eliminar. Puede que exista un problema en la funcion que elimina el documento en la base de datos. Favor de contactarse con soporte.";
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                validar = false;
                titulo  = "Error";
                msj     = "Es probable que no se pueda eliminar el documento debido a que la carpeta donde se encuentra el documento no se encuentre vacia.";
            }
            var datos = new
            {
                validar,
                titulo,
                msj
            };

            return(Json(datos));
        }
        public JsonResult ModificarDocumento(String CodigoDocumento, String Proveedor, DateTime FechaDocumento, int Monto,
                                             String DescripcionDocumento, int Categoria, String TipoDocumento, IFormFile Archivo, Boolean CambioArchivo)
        {
            String msj, titulo, rutaDoc;
            bool   validar;

            Proceso proceso        = HttpContext.Session.GetComplexData <Proceso>("Proceso");
            String  IdParticipante = HttpContext.Session.GetComplexData <String>("IdParticipante");
            int     IdDocumento    = HttpContext.Session.GetComplexData <int>("IdDocumento");

            proceso.Solicitud.Participantes = ConsultaDeclaracionGastos.LeerDocumentos(proceso.DeclaracionGastos.Id, proceso.Solicitud.Participantes, proceso.Solicitud.Categorias);
            Documento documento = proceso.Solicitud.Participantes.Find(participante => participante.RUN.Equals(IdParticipante)).Documentos.Find(documento => documento.Id == IdDocumento);

            if (documento.CodigoDocumento != CodigoDocumento || documento.Proveedor != Proveedor || documento.FechaDocumento != FechaDocumento || documento.Monto != Monto ||
                documento.DescripcionDocumento != DescripcionDocumento || documento.Categoria.Id != Categoria || documento.TipoDocumento != TipoDocumento || CambioArchivo)
            {
                rutaDoc = documento.CopiaDoc;
                if (CambioArchivo)
                {
                    System.IO.File.Delete(documento.CopiaDoc);
                    Path.GetFileNameWithoutExtension(documento.CopiaDoc);
                    int nombreDoc = Convert.ToInt32(Path.GetFileNameWithoutExtension(documento.CopiaDoc));
                    rutaDoc = GuardarArchivoDeclaracionGastos(Archivo, proceso.Solicitud.Id, nombreDoc, IdParticipante);
                }

                Documento DocumentoAux = new Documento()
                {
                    Id = documento.Id,
                    CodigoDocumento      = CodigoDocumento,
                    Proveedor            = Proveedor,
                    FechaDocumento       = FechaDocumento,
                    Monto                = Monto,
                    DescripcionDocumento = DescripcionDocumento,
                    Categoria            = proceso.Solicitud.Categorias.Find(categoria => categoria.Id == Categoria),
                    TipoDocumento        = TipoDocumento,
                    CopiaDoc             = rutaDoc
                };

                int respuesta = ConsultaDeclaracionGastos.ModificarDocumento(DocumentoAux);

                if (respuesta == 1)
                {
                    validar = true;
                    titulo  = "Datos modificados exitosamente";
                    msj     = "Los datos se han modificado exitosamente";
                }
                else
                {
                    validar = false;
                    titulo  = "Se ha producido un problema";
                    msj     = "Los datos no se han modificado correctamente. Verifique que tenga conexión a internet e intentelo nuevamente. Si el problema persiste favor de contactarse con soporte.";
                }
            }
            else
            {
                validar = true;
                titulo  = "No existen cambios";
                msj     = "No se han guardados los datos debido a que no existen cambios";
            }
            var datos = new
            {
                validar,
                titulo,
                msj
            };

            return(Json(datos));
        }