Class: VerifactuRails::Libro::Reconciliacion

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

Overview

Contraste entre lo que dice el libro registro y lo que la AEAT tiene realmente anotado.

SOLO LEE. No corrige nada, ni siquiera lo que parece obvio, y es una decisión, no una versión reducida: lo que esto detecta es divergencia entre el sistema de registro y la AEAT, y un job que reescribiera el estado local para "cuadrar" taparía justo lo que se le ha pedido revelar. Además no hace falta: Remesa ya reintenta sola lo que quedó en 'enviando', porque un duplicado cuenta como éxito.

QUÉ PUEDE Y QUÉ NO PUEDE COMPROBAR. La consulta devuelve una FOTO POR FACTURA, no el histórico de registros (comprobado contra preproducción: 6 registros sobre 4 facturas devolvieron 4 filas). Una subsanación sustituye al alta original y la anulación sustituye a lo anulado, así que los eslabones intermedios ya no se devuelven. Consecuencias directas:

- Se reconcilia el ESTADO ACTUAL de cada factura. Es lo que esto hace.
- NO se puede auditar el encadenamiento contra la AEAT. Los registros
sustituidos faltan, y los que encadenaban tras ellos parecen huérfanos
aunque la cadena esté intacta. Detectar una bifurcación sigue siendo
cosa del índice único local, no de aquí.

Por eso se compara contra el registro VIGENTE de cada factura -el último anotado con ese IDFactura-, que es el que la AEAT debería estar devolviendo.

Defined Under Namespace

Classes: Divergencia, Informe

Constant Summary collapse

MAXIMO_PAGINAS =

La AEAT avisa de que preproducción es para pruebas puntuales, no para carga. Un tope explícito evita que un fallo de paginación se convierta en una tromba de peticiones; que se ha alcanzado se DICE (Informe#truncado?) en vez de devolver medio informe con cara de completo.

100

Instance Method Summary collapse

Constructor Details

#initialize(cadena, transporte:) ⇒ Reconciliacion

Returns a new instance of Reconciliacion.



60
61
62
63
# File 'lib/verifactu_rails/libro/reconciliacion.rb', line 60

def initialize(cadena, transporte:)
  @cadena = cadena
  @transporte = transporte
end

Instance Method Details

#revisar(ejercicio:, periodo:) ⇒ Informe

Parameters:

  • periodo (String, Integer)

    mes de imputación (8 y '08' valen igual).

Returns:



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/verifactu_rails/libro/reconciliacion.rb', line 67

def revisar(ejercicio:, periodo:)
  periodo = format('%<mes>02d', mes: periodo.to_i)
  remotas, truncado = descargar(ejercicio: ejercicio, periodo: periodo)
  nuestras, ajenas = remotas.partition { |fila| de_esta_instalacion?(fila) }
  pendientes = nuestras.index_by { |fila| clave(fila) }

  divergencias = vigentes(ejercicio: ejercicio, periodo: periodo).flat_map do |id, local|
    comparar(local, pendientes.delete(id))
  end
  # Lo que sobra está en la AEAT y no en el libro. Es el caso grave: o
  # factura otro sistema para este obligado, o se reutilizó un número de
  # instalación que ya tenía historia.
  divergencias += pendientes.each_value.map { |fila| solo_en_aeat(fila) }

  Informe.new(ejercicio: ejercicio.to_s, periodo: periodo,
              facturas_locales: vigentes(ejercicio: ejercicio, periodo: periodo).size,
              filas_aeat: nuestras.size, ajenas: ajenas.size,
              divergencias: divergencias, truncado: truncado)
end