/// <summary>
        /// Funcion de Anulacion de NC segun datos enviados
        /// </summary>
        /// <param name="Resol">Resolucion de proveedor a la que pertenece el documento</param>
        /// <param name="TipoDoc">TipoDoc de documento a anular</param>
        /// <param name="Serie">Serie del documento a anular</param>
        /// <param name="DocNo">Correlativo del documento a anular</param>
        /// <returns>Respuesta de éxito o fallo de anulacion de documento. Ver Variable de mensaje</returns>
        //Anulacion de NC al proveedor
        public bool AnularDocNC(string Resol, string TipoDoc, string Serie, string NoNC)
        {
            bool   resultado = false;
            string msg       = null;

            //Seteo de variables de negocio
            this.Resolucion  = Resol;
            this.TipoDoc     = TipoDoc;
            this.SerieDoc    = Serie;
            this.NoDocumento = NoNC;

            //Seteo de modo de funcion
            Funcion = Modo.Anulacion;

            //Carga de Datos
            CargarDatos();

            try
            {
                //Obtencion de Clase del proveedor para ejecucion del proceso
                string provider = utl.convertirString(DocProvider.Rows[0]["ClassName"]);

                //Seleccion de interface segun clase de proveedor
                IFacElecInterface inter = ObtenerInterface(provider);

                //Carga de elementos en la interface
                inter.DocHeader   = this.DocHeader;
                inter.DocDetail   = this.DocDetail;
                inter.DocProvider = this.DocProvider;

                //Ejecucion de proceso
                List <Parameter> res = inter.AnularDocNC();

                //Bitacora de ejecucion
                GuardarBitacora(res);

                //Obtencion de resultados
                resultado = utl.convertirBoolean(res.FirstOrDefault(f => f.ParameterName.Equals("Resultado")).Value);
                msg       = utl.convertirString(res.FirstOrDefault(f => f.ParameterName.Equals("Mensaje")).Value);
                string extmsg = null;

                if (resultado)
                {
                    //Actualizacion de registro de anulacion
                    ActualizarRegsitroAnulacion(res);
                }

                //Captura de mensajes
                this.Mensaje = msg + extmsg;
            }
            catch (Exception ex)
            {
                //Captura de Excepcion
                err.AddErrors(ex, "Anulacion de NC");
                this.Mensaje = "Error en la Ejecución: " + ex.Message;
            }

            return(resultado);
        }
        //Obtencion de interface de servicio de facturacion electronica
        private IFacElecInterface ObtenerInterface(string proveedor)
        {
            //Busqueda de clase proveedor para instanciar interface
            var _className = (from t in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
                              where t.Name.Equals(proveedor)
                              select t.FullName).Single();

            //Instancia de interface
            IFacElecInterface _class = (IFacElecInterface)Activator.CreateInstance(Type.GetType(_className));

            //Retorno de interface
            return(_class);
        }
        /// <summary>
        /// Funcion de Registro de documento segun datos enviados
        /// </summary>
        /// <param name="Resol">Resolucion de proveedor a la que pertenece el documento</param>
        /// <param name="TipoDoc">TipoDoc de documento a registrar</param>
        /// <param name="Serie">Serie del documento a registrar</param>
        /// <param name="DocNo">Correlativo del documento a registrar</param>
        /// <returns>Respuesta de éxito o fallo de registro. Ver Variable de mensaje</returns>
        //Registro de documento al proveedor
        public bool RegistrarDocumento(string Resol, string TipoDoc, string Serie, string DocNo)
        {
            bool   resultado = false;
            string msg = null, cae = null;

            //Seteo de variables de negocio
            this.Resolucion  = Resol;
            this.TipoDoc     = TipoDoc;
            this.SerieDoc    = Serie;
            this.NoDocumento = DocNo;

            //Seteo de modo de funcion
            Funcion = Modo.Registro;

            //Carga de Datos
            CargarDatos();

            try
            {
                //Obtencion de Clase del proveedor para ejecucion del proceso
                string provider = utl.convertirString(DocProvider.Rows[0]["ClassName"]);

                //Seleccion de interface segun clase de proveedor
                IFacElecInterface inter = ObtenerInterface(provider);

                //Carga de elementos en la interface
                inter.DocHeader   = this.DocHeader;
                inter.DocDetail   = this.DocDetail;
                inter.DocProvider = this.DocProvider;

                //Ejecucion de proceso
                List <Parameter> res = inter.RegistrarDocumento();

                //Bitacora de ejecucion
                GuardarBitacora(res);

                //Obtencion de resultados
                resultado = utl.convertirBoolean(res.FirstOrDefault(f => f.ParameterName.Equals("Resultado")).Value);
                msg       = utl.convertirString(res.FirstOrDefault(f => f.ParameterName.Equals("Mensaje")).Value);
                cae       = utl.convertirString(res.FirstOrDefault(f => f.ParameterName.Equals("CAE")).Value);
                string extmsg = null;

                //Verificacion de resultado exitoso
                if (resultado)
                {
                    //Actualizacion de registros
                    ActualizarRegistro(res);

                    //Ejecucion de proceso de Documento PDF
                    ProcesoPDF(res, ref extmsg);
                }
                else if (cae != "")
                {
                    //Actualizacion por si CAE no regresa vacio pero dio error
                    //ActualizarRegistroCAE(res);
                    ActualizarRegistro(res);
                    resultado = true;
                    msg       = "Se hizo registro de Documento. (E)";
                }

                //Captura de mensajes
                this.Mensaje = msg + extmsg;
            }
            catch (Exception ex)
            {
                //Captura de Excepcion
                err.AddErrors(ex, "Registro de Documento");
                this.Mensaje = "Error en la Ejecución: " + ex.Message;
            }

            return(resultado);
        }
        /// <summary>
        /// Funcion de obtencion de documento segun datos enviados
        /// </summary>
        /// <param name="Resol">Resolucion de proveedor a la que pertenece el documento</param>
        /// <param name="TipoDoc">TipoDoc de documento a obtener</param>
        /// <param name="Serie">Serie del documento a obtener</param>
        /// <param name="DocNo">Correlativo del documento a obtener</param>
        /// <returns>Respuesta de éxito o fallo de obtencion de documento. Ver Variable de mensaje</returns>
        //Obtencion del documento del proveedor
        public bool ObtenerDocumento(string Resol, string TipoDoc, string Serie, string DocNo)
        {
            bool   resultado = false;
            string msg       = null;

            //Seteo de variables de negocio
            this.Resolucion  = Resol;
            this.TipoDoc     = TipoDoc;
            this.SerieDoc    = Serie;
            this.NoDocumento = DocNo;

            //Seteo de modo de funcion
            Funcion = Modo.Obtencion;

            //Carga de Datos
            CargarDatos();

            try
            {
                //Seteo de variables de archivo
                string filename   = this.Resolucion + this.TipoDoc + this.SerieDoc + this.NoDocumento + ".pdf";
                string localpath  = utl.convertirString(utl.getConfigValue(this.ConfigFile, "DOCPATH", "services"));
                string remotepath = utl.convertirString(utl.getConfigValue(this.ConfigFile, "FTP_REMOTE_PATH", "ftp"));


                //Verificacion de existencia de archivo en servidor
                if (ftp.fileExist(remotepath, filename))
                {
                    //Descarga de documento
                    resultado = DescargarDocumento();

                    //Verificacion de resultado
                    if (!resultado)
                    {
                        this.Mensaje = "No se pudo descargar el documento. Revisar log";
                    }
                }
                else
                {
                    //Obtencion de Clase del proveedor para ejecucion del proceso
                    string provider = utl.convertirString(DocProvider.Rows[0]["ClassName"]);

                    //Seleccion de interface segun clase de proveedor
                    IFacElecInterface inter = ObtenerInterface(provider);

                    //Carga de elementos en la interface
                    inter.DocHeader   = this.DocHeader;
                    inter.DocDetail   = this.DocDetail;
                    inter.DocProvider = this.DocProvider;

                    //Ejecucion de proceso
                    List <Parameter> res = inter.ObtenerDocumento();

                    //Obtencion de resultados
                    resultado = utl.convertirBoolean(res.FirstOrDefault(f => f.ParameterName.Equals("Resultado")).Value);
                    msg       = utl.convertirString(res.FirstOrDefault(f => f.ParameterName.Equals("Mensaje")).Value);
                    string extmsg = null;

                    //Verificacion de resultado
                    if (resultado)
                    {
                        //Ejecucion de proceso de documento PDF
                        ProcesoPDF(res, ref extmsg);

                        if (extmsg != null)
                        {
                            //Captura de mensajes
                            this.Mensaje = msg + extmsg;
                            resultado    = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Captura de Excepcion
                err.AddErrors(ex, "Obtencion de Documento");
                this.Mensaje = "Error en la Ejecución: " + ex.Message;
            }

            return(resultado);
        }