public string AlmacenarDeclaracionProvisional(DeclaracionProvisional pro, string xmlDeclaracion, string xmlSatMessage, string pdfBase64, string htmlBase64)
        {
            string uriBlob = string.Empty;

            try
            {
                RegistroEvento.Informacion(String.Format("Inicia AlmacenarDeclaracionProvisional con los sigs datos, rfc {0}, idDeclaracion {1}, ejercicio {2}, tipo decla {3}",
                                                         pro.rfc, pro.idDeclaracion, pro.ejercicio, pro.tipoDeclaracion), CodigoEvento.InformacionNegocio, String.Empty, "Declaracion");


                using (var administrador = new AdministradorDeclaracion())
                {
                    uriBlob = administrador.RecibeDeclaracionDyp(pro, xmlDeclaracion, xmlSatMessage, pdfBase64, htmlBase64);
                }

                RegistroEvento.Informacion(String.Format("Termino sin Error AlmacenarDeclaracionProvisional con los sigs datos, rfc {0}, idDeclaracion {1}, ejercicio {2}, tipo decla {3}",
                                                         pro.rfc, pro.idDeclaracion, pro.ejercicio, pro.tipoDeclaracion), CodigoEvento.InformacionNegocio, String.Empty, "Declaracion");
            }
            catch (Exception ex)
            {
                RegistraEvento.Instancia.EscribeEvento(ex);
                RegistroEvento.Error(ref ex, CodigoEvento.ErrorInfraestrucura, GetType().Name);
                throw ex;
            }
            return(uriBlob);
        }
        /// <summary>
        /// Almacena una declaración temporal en el Blob
        /// </summary>
        /// <param name="declaracionBase64">Archivo en base 64 de la declaración</param>
        /// <param name="rfc">Rfc del contribuyente</param>
        /// <param name="regimen">Regimen a presentar</param>
        /// <param name="ejercicio">Identificador del ejercicio</param>
        /// <param name="periodo">Identificador del periodo</param>
        /// <param name="periododescripcion">Descripción del periodo</param>
        /// <param name="tipoDeclaracion">Tipo de declaración presentada</param>
        /// <param name="tipoDeclaracionDescripcion">Descripción de la declaración</param>
        /// <param name="tipoComplementaria">Tipo de complemetaria</param>
        /// <param name="tipoComplementariaDescripcion">Decripción del tipo de complementaria</param>
        /// <param name="tipoPersona">Tipo de persona F o M</param>
        /// <param name="subregimen">Identificadores de subregimen separados con "," </param>
        /// <param name="areageografica">Identificador del area geografica</param>
        /// <param name="sinCalculo">Bandera que indica si se implementara calculo automatico</param>
        /// <returns>Uri del Blob</returns>
        public string AlmacenarDeclaracionTemporal(string declaracionBase64, string rfcContribuyente, string idDeclaracion, int ejercicio,
                                                   string periodo, string periodoDescripcion, string periodicidad, string periodicidadDescripcion,
                                                   string tipoDeclaracion, string tipoDeclaracionDescripcion, string tipoComplementaria, string tipoComplementariaDescripcion, string NoReforma,
                                                   bool contieneErrores = false)
        {
            string uriBlob = string.Empty;

            try
            {
                RegistroEvento.Informacion(String.Format("Inicia AlmacenarDeclaracionTemporal con los sigs datos, rfc {0}, idDeclaracion {1}, ejercicio {2}, tipo decla {3}",
                                                         rfcContribuyente, idDeclaracion, ejercicio, tipoDeclaracion), CodigoEvento.InformacionNegocio, String.Empty, "Declaracion");

                string declaracion = Utileria.Instancia.DeCodificarBase64(declaracionBase64);
                using (var administrador = new AdministradorDeclaracion())
                {
                    uriBlob = administrador.AlmacenarDeclaracionTemporal(declaracion, rfcContribuyente, idDeclaracion, ejercicio,
                                                                         periodo, periodoDescripcion, periodicidad, periodicidadDescripcion,
                                                                         tipoDeclaracion, tipoDeclaracionDescripcion, tipoComplementaria, tipoComplementariaDescripcion, NoReforma, contieneErrores);
                }

                RegistroEvento.Informacion(String.Format("Termino sin Error AlmacenarDeclaracionTemporal con los sigs datos, rfc {0}, idDeclaracion {1}, ejercicio {2}, tipo decla {3}",
                                                         rfcContribuyente, idDeclaracion, ejercicio, tipoDeclaracion), CodigoEvento.InformacionNegocio, String.Empty, "Declaracion");
            }
            catch (Exception ex)
            {
                RegistraEvento.Instancia.EscribeEvento(ex);
                RegistroEvento.Error(ref ex, CodigoEvento.ErrorInfraestrucura, GetType().Name);
                throw ex;
            }
            return(uriBlob);
        }
        public string RecuperarXmlConceptos(Dictionary <string, string> listaDeclaraciones, string rfc, bool codificada = true)
        {
            XDocument xmlDocumento = XDocument.Parse("<modeloDatos/>");
            string    xmlRetorno   = string.Empty;

            try
            {
                Parallel.ForEach(listaDeclaraciones.Keys, (valueListaConceptos) =>
                {
                    string xml           = string.Empty;
                    string concepto      = valueListaConceptos;
                    string idDeclaracion = listaDeclaraciones[valueListaConceptos];

                    string mensaje = string.Format("Solicitud de recupera declaración. Rfc {0}. IdDeclaracion {1} Concepto {2}. ", rfc, idDeclaracion, concepto);
                    Logger.RegistroEvento.Informacion(mensaje, CodigoEvento.InformacionDatos, GetType().Name, string.Empty);

                    // Obtenemos el xml del modelo de datos temporal
                    Stream streamModeloDatos = null;
                    using (var administrador = new AdministradorDeclaracion())
                    {
                        streamModeloDatos = administrador.RecuperarXmlConcepto(rfc, idDeclaracion, concepto);
                    }
                    if (streamModeloDatos != null)
                    {
                        streamModeloDatos.Seek(0, SeekOrigin.Begin);
                        XDocument xdDeclaracion = XDocument.Load(streamModeloDatos);
                        var nodosEntidad        = xdDeclaracion.Root.Elements("entidad").ToList();
                        xmlDocumento.Root.Add(nodosEntidad);
                        //var nodosAgrupados = xdDeclaracion.Root.Elements("entidad").Where(x => x.Attribute("claveimpuesto") != null).ToList();
                    }
                    else
                    {
                        string mensajeError = string.Format("Declaración temporal vacía o no se encuentra. Rfc {0}. IdDeclaracion {1}.", rfc, idDeclaracion);
                        throw new Exception("Se generó un error al obtener la declaración temporal: " + mensajeError);
                    }
                });
            }
            catch (Exception ex)
            {
                Logger.RegistroEvento.Error(ref ex, CodigoEvento.ErrorDatos, GetType().Name,
                                            rfc: rfc);
                throw new Exception("Se generó un error al obtener la declaración por conceptos. Inténtelo más tarde.", ex);
            }

            if (codificada)
            {
                xmlRetorno = Utileria.Instancia.CodificarBase64(xmlDocumento.ToString());
            }
            else
            {
                xmlRetorno = xmlDocumento.ToString();
            }

            return(xmlRetorno);
        }
        /// <summary>
        ///  Recupera Xml de la declaración temporal del contribuyente en Base 64
        /// </summary>
        /// <param name="rfc">Rfc del contribuyente</param>
        /// <param name="regimen">Identificador del regimen o formato</param>
        /// <param name="ejercicio">Identificador del ejercicio</param>
        /// <returns>Archivo xml de la declaración en Base64</returns>
        public string RecuperarXmlDeclaracionTemporal(string rfc, string idDeclaracion, bool codificada = true)
        {
            string xml = string.Empty;

            try
            {
                string mensaje = string.Format("Solicitud de declaración temporal. Rfc {0}. IdDeclaracion {1}. ", rfc, idDeclaracion);
                Logger.RegistroEvento.Informacion(mensaje, CodigoEvento.InformacionDatos, GetType().Name, string.Empty);

                // Obtenemos el xml del modelo de datos temporal
                Stream streamModeloDatos = null;
                using (var administrador = new AdministradorDeclaracion())
                {
                    var configuracionSAS = CacheConfiguracion.Instancia.RecuperarConfiguracionSAS();
                    streamModeloDatos = administrador.RecuperaXmlTemporal(rfc, idDeclaracion, configuracionSAS);
                }
                if (streamModeloDatos != null)
                {
                    streamModeloDatos.Seek(0, SeekOrigin.Begin);
                    XDocument document = XDocument.Load(streamModeloDatos);

                    var fechaActualizada = document.XPathSelectElement("//*[local-name()='modeloDatos']/*[local-name()='entidad' and @tipo='SAT_DATOS_GENERALES']/*[local-name()='propiedad' and @claveinformativa='38']");
                    if (fechaActualizada != null)
                    {
                        fechaActualizada.Value = ConfiguracionApp.AdaptadorCloud.RecuperarFechaSinHoraISO();
                    }
                    if (codificada)
                    {
                        xml = Utileria.Instancia.CodificarBase64(document.ToString());
                    }
                    else
                    {
                        xml = document.ToString();
                    }
                }
                else
                {
                    string mensajeError = string.Format("Declaración temporal vacía o no se encuentra. Rfc {0}. IdDeclaracion {1}.", rfc, idDeclaracion);
                    throw new Exception("Se generó un error al obtener la declaración temporal: " + mensajeError);
                }
            }
            catch (Exception ex)
            {
                Logger.RegistroEvento.Error(ref ex, CodigoEvento.ErrorDatos, GetType().Name,
                                            rfc: rfc, regimen: idDeclaracion);
                throw new Exception("Se generó un error al obtener la declaración temporal. Inténtelo más tarde.", ex);
            }
            return(xml);
        }
        public List <DeclaracionTemporal> RecuperaEntidadDeclaracionTemporal(string rfc)
        {
            List <DeclaracionTemporal> declaracionTemporal = null;

            try
            {
                using (var administrador = new AdministradorDeclaracion())
                {
                    declaracionTemporal = administrador.RecuperaEntidadDeclaracionTemporal(rfc);
                }
            }
            catch (Exception ex)
            {
                RegistraEvento.Instancia.EscribeEvento(ex);
            }
            return(declaracionTemporal);
        }
        public string RecuperarXmlProvisonal(string rfc, string idDeclaracion, bool codificada = true)
        {
            string xml = string.Empty;

            try
            {
                string mensaje = string.Format("Solicitud de recupera declaración. Rfc {0}. IdDeclaracion {1}. ", rfc, idDeclaracion);
                Logger.RegistroEvento.Informacion(mensaje, CodigoEvento.InformacionDatos, GetType().Name, string.Empty);

                // Obtenemos el xml del modelo de datos temporal
                Stream streamModeloDatos = null;
                using (var administrador = new AdministradorDeclaracion())
                {
                    streamModeloDatos = administrador.RecuperarXmlProvisonal(rfc, idDeclaracion);
                }
                if (streamModeloDatos != null)
                {
                    streamModeloDatos.Seek(0, SeekOrigin.Begin);
                    XDocument document = XDocument.Load(streamModeloDatos);
                    if (codificada)
                    {
                        xml = Utileria.Instancia.CodificarBase64(document.ToString());
                    }
                    else
                    {
                        xml = document.ToString();
                    }
                }
                else
                {
                    string mensajeError = string.Format("Declaración temporal vacía o no se encuentra. Rfc {0}. IdDeclaracion {1}.", rfc, idDeclaracion);
                    throw new Exception("Se generó un error al obtener la declaración temporal: " + mensajeError);
                }
            }
            catch (Exception ex)
            {
                Logger.RegistroEvento.Error(ref ex, CodigoEvento.ErrorDatos, GetType().Name,
                                            rfc: rfc, regimen: idDeclaracion);
                throw new Exception("Se generó un error al obtener la declaración temporal. Inténtelo más tarde.", ex);
            }
            return(xml);
        }
        /// <summary>
        /// Elimina la declaración temporal del contribuyente
        /// </summary>
        /// <param name="rfc">Rfc del contribuyente</param>
        /// <param name="regimen">Identificador del regimen o formato</param>
        /// <param name="ejercicio">Identificador del ejercicio</param>
        public bool EliminarDeclaracionTemporal(string rfc, string idDeclaracion)
        {
            bool eliminado = true;

            try
            {
                using (var administrador = new AdministradorDeclaracion())
                {
                    DeclaracionTemporal declaracionTemporal = administrador.RecuperaEntidadDeclaracionTemporal(rfc, idDeclaracion);
                    if (declaracionTemporal != null)
                    {
                        administrador.EliminarArchivoBlob(declaracionTemporal.BlobUri);
                        administrador.EliminarDeclaracionTemporal(declaracionTemporal);
                        // Verificamos que realmente se borro la temporal
                        eliminado = administrador.RecuperaEntidadDeclaracionTemporal(rfc, idDeclaracion) != null ? false : true;
                    }
                }
            }
            catch (Exception ex)
            {
                RegistraEvento.Instancia.EscribeEvento(ex);
            }
            return(eliminado);
        }