/// <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]")); } }
/// <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()); }
/// <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); }
/// <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}"); }
/// <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; }
/// <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)); } }
/// <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); }
/// <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")); }
/// <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")); }
/// <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); }