Class: VerifactuRails::RespuestaConsulta

Inherits:
Object
  • Object
show all
Defined in:
lib/verifactu_rails/consulta.rb

Overview

Respuesta a una consulta (RespuestaConsultaLR.xsd).

Igual que Respuesta: solo lee. Lo que llega de la AEAT es la verdad, y una respuesta que no encaje con lo que esperamos no debe impedir leer el resto.

LO QUE DEVUELVE ES UNA FOTO, NO UN LIBRO (comprobado contra preproducción): una fila por FACTURA con su estado ACTUAL, no un histórico de registros de facturación. Si una factura se subsanó, se devuelve la subsanación y el alta original desaparece; si se anuló, se devuelve la anulación con estado "Anulado". Consecuencia práctica: la cadena NO se puede reconstruir entera desde aquí, porque los eslabones sustituidos ya no salen y los registros que encadenaban tras ellos parecen huérfanos aunque la cadena esté intacta.

Defined Under Namespace

Classes: Anotado

Constant Summary collapse

NS =
'https://www2.agenciatributaria.gob.es/static_files/common/internet/' \
'dep/aplicaciones/es/aeat/tike/cont/ws/RespuestaConsultaLR.xsd'
NS_SF_RESP =
'https://www2.agenciatributaria.gob.es/static_files/common/internet/' \
'dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd'
NS_SOAP =
'http://schemas.xmlsoap.org/soap/envelope/'
ESTADOS =

OJO: NO son los mismos estados que en RespuestaSuministro. Aquí no existe "Incorrecto" -un registro rechazado no se almacena, así que no se puede consultar- y sí existe "Anulado", que es el estado que da sentido a todo este servicio.

%w[Correcto AceptadoConErrores Anulado].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(xml) ⇒ RespuestaConsulta

Returns a new instance of RespuestaConsulta.



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/verifactu_rails/consulta.rb', line 191

def initialize(xml)
  @xml = xml
  doc = Nokogiri::XML(xml)
  raiz = doc.at_xpath('//c:RespuestaConsultaFactuSistemaFacturacion', 'c' => NS)

  if raiz.nil?
    raise RespuestaError,
          'La respuesta no contiene RespuestaConsultaFactuSistemaFacturacion. ' \
          "#{resumen_de_fallo(doc)}"
  end

  @ejercicio = texto(raiz, 'c:PeriodoImputacion/c:Ejercicio')
  @periodo = texto(raiz, 'c:PeriodoImputacion/c:Periodo')
  @indicador_paginacion = texto(raiz, 'c:IndicadorPaginacion')
  @resultado = texto(raiz, 'c:ResultadoConsulta')
  @registros = raiz.xpath('c:RegistroRespuestaConsultaFactuSistemaFacturacion', 'c' => NS)
                   .map { |n| leer_registro(n) }
  @clave_paginacion = leer_clave(raiz.at_xpath('c:ClavePaginacion', 'c' => NS))
end

Instance Attribute Details

#clave_paginacionObject (readonly)

Returns the value of attribute clave_paginacion.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def clave_paginacion
  @clave_paginacion
end

#ejercicioObject (readonly)

Returns the value of attribute ejercicio.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def ejercicio
  @ejercicio
end

#indicador_paginacionObject (readonly)

Returns the value of attribute indicador_paginacion.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def indicador_paginacion
  @indicador_paginacion
end

#periodoObject (readonly)

Returns the value of attribute periodo.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def periodo
  @periodo
end

#registrosObject (readonly)

Returns the value of attribute registros.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def registros
  @registros
end

#resultadoObject (readonly)

Returns the value of attribute resultado.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def resultado
  @resultado
end

#xmlObject (readonly)

Returns the value of attribute xml.



188
189
190
# File 'lib/verifactu_rails/consulta.rb', line 188

def xml
  @xml
end

Instance Method Details

#a_subsanarObject



219
# File 'lib/verifactu_rails/consulta.rb', line 219

def a_subsanar = registros.select(&:aceptado_con_errores?)

#anuladosObject



218
# File 'lib/verifactu_rails/consulta.rb', line 218

def anulados = registros.select(&:anulado?)

#con_datos?Boolean

Returns:

  • (Boolean)


211
# File 'lib/verifactu_rails/consulta.rb', line 211

def con_datos? = resultado == 'ConDatos'

#hay_mas_paginas?Boolean

Quedan más páginas. La siguiente consulta se hace repitiendo el mismo filtro con clave_paginacion:, no cambiando el periodo.

Returns:

  • (Boolean)


216
# File 'lib/verifactu_rails/consulta.rb', line 216

def hay_mas_paginas? = indicador_paginacion == 'S'

#sin_datos?Boolean

Returns:

  • (Boolean)


212
# File 'lib/verifactu_rails/consulta.rb', line 212

def sin_datos? = resultado == 'SinDatos'

#subsanacionesObject



220
# File 'lib/verifactu_rails/consulta.rb', line 220

def subsanaciones = registros.select(&:subsanacion?)

#to_sObject



222
223
224
225
# File 'lib/verifactu_rails/consulta.rb', line 222

def to_s
  "#{resultado} (#{registros.size} registros: #{anulados.size} anulados, " \
    "#{a_subsanar.size} con errores)#{hay_mas_paginas? ? ', hay más páginas' : ''}"
end