Module: VerifactuRails::IdOtro

Defined in:
lib/verifactu_rails/registro.rb

Overview

Identificación de quien no tiene NIF español (sf:IDOtroType).

Las reglas NO son las mismas según quién se identifique. Un destinatario admite "no censado" (07) y desde España acepta 03 o 07; un tercero no admite 07 en absoluto y desde España solo acepta 03 (Validaciones v1.2.2, ap. 12 y 13). Por eso lo que varía entra por parámetro: duplicar el método era la vía segura a que las dos copias se desincronizaran.

Constant Summary collapse

TIPOS =

Lista L7 del Excel de diseños.

%w[02 03 04 05 06 07].freeze
PAISES =

sf:CountryType2. Se toman del XSD, que es el contrato.

%w[
  AF AL DE AD AO AI AQ AG SA DZ AR AM AW AU AT AZ BS BH BD BB BE BZ BJ BM BY
  BO BA BW BV BR BN BG BF BI BT CV KY KH CM CA CF CC CO KM CG CD CK KP KR CI
  CR HR CU TD CZ CL CN CY CW DK DM DO EC EG AE ER SK SI ES US EE ET FO PH FI
  FJ FR GA GM GE GS GH GI GD GR GL GU GT GG GN GQ GW GY HT HM HN HK HU IN ID
  IR IQ IE IM IS IL IT JM JP JE JO KZ KE KG KI KW LA LS LV LB LR LY LI LT LU
  XG MO MK MG MY MW MV ML MT FK MP MA MH MU MR YT UM MX FM MD MC MN ME MS MZ
  MM NA NR CX NP NI NE NG NU NF NO NC NZ IO OM NL BQ PK PW PA PG PY PE PN PF
  PL PT PR QA GB RW RO RU RE SB SV WS AS KN SM SX PM VC SH LC ST SN RS SC SL
  SG SY SO LK SZ ZA SD SS SE CH SR TH TW TZ TJ PS TF TL TG TK TO TT TN TC TM
  TR TV UA UG UY UZ VU VA VE VN VG VI WF YE DJ ZM ZW QU XB XU XN
].freeze

Class Method Summary collapse

Class Method Details

.normalizar(datos, quien:, tipos_con_es:, prohibidos: []) ⇒ Object

Parameters:

  • quien (String)

    para el mensaje de error

  • tipos_con_es (Array<String>)

    IDType admitidos si CodigoPais = "ES"

  • prohibidos (Array<String>) (defaults to: [])

    IDType que este bloque no admite nunca

Raises:



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/verifactu_rails/registro.rb', line 123

def normalizar(datos, quien:, tipos_con_es:, prohibidos: [])
  tipo = Formato.enumerado(datos.fetch(:id_type), 'IDType', TIPOS - prohibidos)
  pais = datos[:codigo_pais] && Formato.enumerado(datos[:codigo_pais], 'CodigoPais', PAISES)

  # "No censado" solo tiene sentido en España.
  if tipo == '07' && pais != 'ES'
    raise ValidacionError, "IDType=07 (no censado) exige CodigoPais='ES'"
  end
  if pais == 'ES' && !tipos_con_es.include?(tipo)
    raise ValidacionError,
          "Con CodigoPais='ES', el IDType de #{quien} solo puede ser " \
          "#{tipos_con_es.join(' o ')}"
  end
  # Con NIF-IVA (02) el país va implícito en el propio identificador.
  raise ValidacionError, "IDType=#{tipo} exige CodigoPais" if tipo != '02' && pais.nil?

  { 'CodigoPais' => pais, 'IDType' => tipo,
    'ID' => Formato.limitar(datos.fetch(:id), 'ID', 20) }.compact
end