Cfdi.Complementos.Registry (cfdi_complementos v4.0.2)

Copy Markdown

Índice inverso de los complementos: dado lo que aparece en un XML, resuelve el módulo que lo maneja.

Es la pieza que permite decodificar (CFDI.from_xml/2): al serializar, cada complemento sabe su propia key; al deserializar hace falta el camino contrario, "http://www.sat.gob.mx/Pagos20"Cfdi.Complementos.Pago20.

Descubrimiento

Los módulos NO se listan a mano: se descubren en runtime recorriendo los módulos de la aplicación :cfdi_complementos y quedándose con los que exponen __complemento__/0 (marca que agrega use Cfdi.Complementos.Complemento). Agregar un complemento nuevo lo registra solo — no hay lista que se desincronice.

El índice se construye una vez y se cachea en :persistent_term.

Resolver por namespace, no por prefijo

by_xmlns/1 es la vía correcta al decodificar XML: la URI del namespace es el identificador autoritativo. El prefijo es convención y un emisor puede usar el que quiera. Ver Cfdi.Complementos.Complemento.

Summary

Functions

Todos los módulos de complemento conocidos.

Resuelve el módulo por su key canónica (con prefijo del SAT).

Resuelve el módulo por la URI de su namespace. Vía preferida al decodificar.

Descarta el índice cacheado. Útil tras recompilar en desarrollo.

Functions

all()

@spec all() :: [module()]

Todos los módulos de complemento conocidos.

by_key(key)

@spec by_key(String.t()) :: module() | nil

Resuelve el módulo por su key canónica (con prefijo del SAT).

Sólo sirve cuando la key ya viene en la convención oficial; para XML de terceros usar by_xmlns/1.

by_xmlns(uri)

@spec by_xmlns(String.t()) :: module() | nil

Resuelve el módulo por la URI de su namespace. Vía preferida al decodificar.

iex> Cfdi.Complementos.Registry.by_xmlns("http://www.sat.gob.mx/Pagos20")
Cfdi.Complementos.Pago20

refresh()

@spec refresh() :: :ok

Descarta el índice cacheado. Útil tras recompilar en desarrollo.