示例#1
0
 /// <summary>
 /// Devuelve el campo que se corresponde con la descripción facilitada
 /// o null si no lo encuentra.
 /// </summary>
 /// <param name="descripcion">Descripción del campo.</param>
 /// <returns>Devuelve el campo que se corresponde con la descripción facilitada
 /// o null si no lo encuentra.</returns>
 public RegistroCampo this[string descripcion]
 {
     get
     {
         throw new NotImplementedException(Errores.MostrarMensaje("ConjuntoDeEmpaquetables.000",
                                                                  "indexador ConjuntoDeEmpaquetables[string descripcion]"));
     }
 }
示例#2
0
        /// <summary>
        /// Presenta la declaración.
        /// <param name="test">Indica si la presentación se realiza en el entorno en pruebas de la AEAT.</param>
        /// <param name="certRef">Ruta de certificado para la presentación, en caso de que se utilice uno externo.</param>
        /// <param name="certClave">Contraseña del certificado.</param>
        /// </summary>
        /// <returns>Respuesta a la operación de presentación.</returns>
        public virtual Respuesta Presentar(bool test = false, string certRef = null, string certClave = null)
        {
            if (!_Confirmado)
            {
                throw new InvalidOperationException(Errores.MostrarMensaje("RegistroMod.003"));
            }

            return(new Peticion(this, test, certRef, certClave).Presentar());
        }
示例#3
0
        /// <summary>
        /// Recupera la página del índice específicado.
        /// </summary>
        /// <param name="indicePagina">Indice de la página a añadir.</param>
        /// <param name="indiceGrupo">Cuando existen varía páginas
        /// del mimo número de página en el modelo, aquí se indica
        /// el indice en base 0 de la página que se quiere recuperar
        /// (si no se especifica se devuelve la primera coincidencia).</param>
        /// <param name="crear">Si es true y no se encuentra la página
        /// entre los empaquetables, la crea.</param>
        /// <param name="numeroPaginaHija">Indica si se tiene que resuperar una subpágina
        /// contenida en la página principal indicada por indice en base 1 de la subpágina</param>
        /// <returns>Página recuperada si existe, recién creada
        /// si no existe y crear=true o null si no existe e índiceGrupo no
        /// es igual a 0 o crear es false.</returns>
        public RegistroMod RecuperaPagina(int indicePagina, int indiceGrupo = 0,
                                          bool crear = false, int numeroPaginaHija = 0)
        {
            RegistroMod paginaPrincipal = null;

            if (indicePagina == -1)
            {
                paginaPrincipal = this;
            }

            if (paginaPrincipal == null && !PaginasMapa.ContainsKey(indicePagina))
            {
                throw new ArgumentException(Errores.MostrarMensaje("RegistroMod.000", $"{indicePagina}"));
            }

            if (paginaPrincipal == null)
            {
                int count = 0;

                string typeName = PaginasMapa[indicePagina];

                Type tipoObjetivo = Type.GetType(typeName);

                if (paginaPrincipal == null)
                {
                    foreach (var pagina in Paginas.Empaquetables)
                    {
                        if (pagina.GetType().IsAssignableFrom(tipoObjetivo) && indiceGrupo == count++)
                        {
                            paginaPrincipal = pagina as RegistroMod;
                        }
                    }
                }

                if (paginaPrincipal == null && crear) // Si la página no existe y se permite crear.
                {
                    paginaPrincipal = InsertaPagina(indicePagina);
                }
            }

            if (numeroPaginaHija == 0) // Si no busco una página hija, devuelvo la actual
            {
                return(paginaPrincipal);
            }

            // Si busco una página hija

            if (paginaPrincipal?.Registros?.Empaquetables != null && paginaPrincipal?.Registros?.Empaquetables.Count < numeroPaginaHija - 1)
            {
                throw new ArgumentException(Errores.MostrarMensaje("ConjuntoDeEmpaquetables.001", $"{numeroPaginaHija-1}"));
            }

            return(paginaPrincipal?.Registros?.Empaquetables[numeroPaginaHija - 1] as RegistroMod);
        }
示例#4
0
        /// <summary>
        /// Devuelve una cadena con la representación del titular del
        /// certificado que va a realizar la presentación.
        /// </summary>
        public string Presentador(string certRef = null, string certClave = null)
        {
            var certificado = Certificado.Cargar(certRef, certClave);

            var titular = Certificado.Titular(certificado);

            if (titular == null)
            {
                throw new Exception(
                          Errores.MostrarMensaje("RegistroMod.002", $"{ certificado.Subject}"));
            }

            return($"{titular}");
        }
示例#5
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="pagina">Pagina del modelo que representa el fichero
        /// en la que se encuentra la instancia de registro de campo definida
        /// en el diseño de registro correspondiente de la AEAT.</param>
        /// <param name="posicion">Posición dónde empieza el registro
        /// de la instancia en la página del modelo.</param>
        /// <param name="longitud">Longitud del campo.</param>
        /// <param name="tipo">Cadena que representa el tipo de dato
        /// según la documentación del diseño de registro de la AEAT ('A',
        /// 'An', 'N'...)</param>
        /// <param name="descripcion">Descripción del campo en el diseño
        /// de registro de la AEAT.</param>
        /// <param name="clave">clave únivoca del campo en la página. Genralmente se utiliza como
        /// clave el número de casilla.</param>
        /// <param name="valor">Valor para el campo.</param>
        /// <param name="decimales">Número de decimales.</param>
        /// <param name="negativo">Indica si acepta número negativos.</param>
        public RegistroCampo(int pagina, int posicion, int longitud,
                             string tipo, string descripcion, string clave = null,
                             object valor = null, int decimales = 2, bool negativo = false)
        {
            RegistroCampoTipo registroTipo;

            if (!Enum.TryParse(tipo, out registroTipo))
            {
                throw new ArgumentException(
                          Errores.MostrarMensaje("RegistroCampo.000", tipo));
            }

            Tipo = registroTipo;

            if (pagina < 0 || pagina > 30)
            {
                throw new ArgumentException(
                          Errores.MostrarMensaje("RegistroCampo.001", $"{pagina}"));
            }

            if (posicion < 0 || posicion > 10000)
            {
                throw new ArgumentException(
                          Errores.MostrarMensaje("RegistroCampo.002", $"{posicion}"));
            }

            if (longitud < 0 || longitud > 6000)
            {
                throw new ArgumentException(
                          Errores.MostrarMensaje("RegistroCampo.003", $"{longitud}"));
            }

            Pagina      = pagina;
            Posicion    = posicion;
            Longitud    = longitud;
            Descripcion = descripcion;
            Clave       = clave;
            Decimales   = decimales;
            Negativo    = negativo;

            string nombreTipoConversor = $"AeatModelos.Conversores.{Tipo}";
            Type   tipoConversor       = AeatModelosContexto.AeatModelos.GetType(nombreTipoConversor);

            _Conversor = Activator.CreateInstance(tipoConversor, this) as IConversor;


            Valor = valor;
        }
示例#6
0
        /// <summary>
        /// Presenta la declaración.
        /// <param name="test">Indica si la presentación se realiza en el entorno en pruebas de la AEAT.</param>
        /// <param name="certRef">Ruta de certificado para la presentación, en caso de que se utilice uno externo.</param>
        /// <param name="certClave">Contraseña del certificado.</param>
        /// </summary>
        /// <returns>Respuesta a la operación de presentación.</returns>
        public override Respuesta Presentar(bool test = false, string certRef = null, string certClave = null)
        {
            if (!_Confirmado)
            {
                throw new InvalidOperationException(Errores.MostrarMensaje("RegistroMod.003"));
            }

            if (Convert.ToInt32(Ejercicio) > 2021)
            {
                return(new PeticionPresBasicaDos(this, test, certRef, certClave, System.Text.Encoding.UTF8).Presentar());
            }
            else
            {
                return(base.Presentar(test, certRef, certClave));
            }
        }
示例#7
0
        /// <summary>
        /// Añade una página del índice específicado.
        /// </summary>
        /// <param name="indicePagina">Indice de la página a añadir.</param>
        /// <returns>Página añadida.</returns>
        public RegistroMod InsertaPagina(int indicePagina)
        {
            if (!PaginasMapa.ContainsKey(indicePagina))
            {
                throw new ArgumentException(
                          Errores.MostrarMensaje("RegistroMod.000", $"{indicePagina}"));
            }

            string typeName = PaginasMapa[indicePagina];

            Type        tipoEmpaquetable = Type.GetType(typeName);
            RegistroMod pagina           = Activator.CreateInstance(tipoEmpaquetable, Ejercicio, Periodo) as RegistroMod;

            Paginas.Empaquetables.Add(pagina);

            return(pagina);
        }
示例#8
0
 /// <summary>
 /// Actualiza el valor de todos los campos calculados.
 /// </summary>
 public virtual void Calcular()
 {
     throw new NotImplementedException(Errores.MostrarMensaje("RegistroMod.001",
                                                              "método Calcular() de la clase RegistroMod"));
 }
示例#9
0
 /// <summary>
 /// Compone un empaquetable a partir de su forma
 /// en texto de fichero.
 /// </summary>
 /// <param name="texto">Segmento de texto.</param>
 /// <returns>Objeto IEmpaquetable representado
 /// por el segmento de texto</returns>
 public object DeFichero(string texto)
 {
     throw new NotImplementedException(Errores.MostrarMensaje("ConjuntoDeEmpaquetables.000",
                                                              "método DeFichero(string texto) de la clase ConjuntoDeEmpaquetables"));
 }
示例#10
0
        /// <summary>
        /// Presenta la declaración.
        /// <param name="test">Indica si la presentación se realiza en el entorno en pruebas de la AEAT.</param>
        /// <param name="certRef">Ruta de certificado para la presentación, en caso de que se utilice uno externo.</param>
        /// <param name="certClave">Contraseña del certificado.</param>
        /// </summary>
        /// <returns>Respuesta a la operación de presentación.</returns>
        public override Respuesta Presentar(bool test = false, string certRef = null, string certClave = null)
        {
            if (!_Confirmado)
            {
                throw new InvalidOperationException(Errores.MostrarMensaje("RegistroMod.003"));
            }

            int indiceUltimaPagina = RegistroCampos.Count;

            string registroTipo1 = null;
            string registroTipo2 = RegistroCampos[indiceUltimaPagina].AFichero();

            for (decimal p = 1; p < indiceUltimaPagina; p++)
            {
                registroTipo1 += RegistroCampos[p].AFichero();
            }


            VariablesEnvio.Clear();
            VariablesEnvio.Add("", registroTipo1);
            OrdenVariablesEnvio = new string[1] {
                ""
            };


            // 1. Inicialización
            var peticionInicializarEnvio = new PeticionTgvi(this, test, certRef, certClave, "InicializarEnvio");

            peticionInicializarEnvio.PreparaPeticion();

            if (string.IsNullOrWhiteSpace(this["ModeloDeclaracion"].Valor.ToString()))
            {
                throw new InvalidOperationException("Debe indicar el número de modelo en la casilla 'ModeloDeclaracion' en la página princial");
            }

            string numeroModelo = this["ModeloDeclaracion"].Valor.ToString();

            peticionInicializarEnvio.PeticionHttp.Headers.Add("MODELO", numeroModelo);
            peticionInicializarEnvio.PeticionHttp.Headers.Add("EJERCICIO", Ejercicio);
            peticionInicializarEnvio.PeticionHttp.Headers.Add("PERIODO", Periodo);
            peticionInicializarEnvio.PeticionHttp.Headers.Add("NDC", $"{this["NIF"].Valor}");
            peticionInicializarEnvio.PeticionHttp.Headers.Add("IDIOMA", "ES");
            peticionInicializarEnvio.PeticionHttp.Headers.Add("NUMBLOQUES", "1");
            peticionInicializarEnvio.PeticionHttp.Headers.Add("CODIFICACION", "ISO-8859-1");

            var respuestaTgvi = peticionInicializarEnvio.Presentar() as RespuestaTgvi;

            if (respuestaTgvi.Erronea)
            {
                return(respuestaTgvi);
            }

            string cookie = respuestaTgvi.Cookie;

            // 2. Envío datos

            if ((RegistroCampos[indiceUltimaPagina] as ConjuntoDeEmpaquetables).Empaquetables.Count > 40000)
            {
                throw new NotImplementedException("No implementada la paginación.");
            }

            VariablesEnvio[""] = registroTipo2;

            var peticionEnvio = new PeticionTgvi(this, test, certRef, certClave, "EnviarDatos", Encoding.UTF8, "text/plain; charset=UTF-8");

            peticionEnvio.PreparaPeticion();

            peticionEnvio.PeticionHttp.Headers.Add("IDENVIO", respuestaTgvi.IdEnvio);
            peticionEnvio.PeticionHttp.Headers.Add("NUMBLOQUE", "1");
            peticionEnvio.PeticionHttp.Headers.Add("CODIFICACION", "UTF-8");
            peticionEnvio.PeticionHttp.Headers.Add("Set-Cookie", cookie);


            respuestaTgvi = peticionEnvio.Presentar() as RespuestaTgvi;

            if (respuestaTgvi.Erronea)
            {
                RespuestaError errorInicial = respuestaTgvi.Errores[0];

                // Obtenemos el fichero con los registros erróneos.

                var peticionErrores = new PeticionTgvi(this, test, certRef, certClave, "RecuperarErrores", Encoding.UTF8, "text/plain; charset=UTF-8");

                peticionErrores.PreparaPeticion();

                peticionErrores.PeticionHttp.Headers.Add("IDENVIO", respuestaTgvi.IdEnvio);
                peticionErrores.PeticionHttp.Headers.Add("CODIFICACION", "UTF-8");
                peticionErrores.PeticionHttp.Headers.Add("Set-Cookie", cookie);

                respuestaTgvi = peticionErrores.Presentar() as RespuestaTgvi;

                respuestaTgvi.Errores.Add(errorInicial);

                return(respuestaTgvi);
            }

            // 3. Presentación

            VariablesEnvio[""] = "";

            var peticionPresentacion = new PeticionTgvi(this, test, certRef, certClave, "PresentarEnvio", Encoding.UTF8, "text/plain; charset=UTF-8");

            peticionPresentacion.PreparaPeticion();

            peticionPresentacion.PeticionHttp.Headers.Add("IDENVIO", respuestaTgvi.IdEnvio);
            peticionPresentacion.PeticionHttp.Headers.Add("FIRNIF", peticionPresentacion.CertificadoTitular.NIF);
            peticionPresentacion.PeticionHttp.Headers.Add("FIRNOMBRE", peticionPresentacion.CertificadoTitular.Nombre);
            peticionPresentacion.PeticionHttp.Headers.Add("FIR", "FirmaBasica");
            peticionEnvio.PeticionHttp.Headers.Add("Set-Cookie", cookie);


            respuestaTgvi = peticionPresentacion.Presentar() as RespuestaTgvi;

            if (respuestaTgvi.Erronea)
            {
                return(respuestaTgvi);
            }

            string pdfUrlServer = Parametros.Actuales.Pruebas ? "www6.aeat.es" : (test ? "www6.aeat.es" : "www2.agenciatributaria.gob.es");
            string pdfUrl       = $"https://{pdfUrlServer}/wlpl/inwinvoc/es.aeat.dit.adu.eeca.catalogo.VisualizaSc?COMPLETA=SI&ORIGEN=D&CSV={respuestaTgvi.CSV}";

            respuestaTgvi.DescargaPdfEnlace(pdfUrl);

            return(respuestaTgvi);
        }