Cfdi.Complementos.Complemento behaviour (cfdi_complementos v4.0.2)

Copy Markdown

Estructura base, comportamiento y DSL común de los complementos SAT.

Cada complemento concreto se declara con use Cfdi.Complementos.Complemento pasando sus tres constantes:

defmodule Cfdi.Complementos.Iedu do
  use Cfdi.Complementos.Complemento,
    key: "iedu:instEducativas",
    xmlns: "http://www.sat.gob.mx/iedu",
    xsd: "http://www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd"
end

El macro genera:

  • defstruct [:data] — la carga útil es un mapa opaco
  • new/1 — envuelve el mapa
  • get_complement/1 — metadatos + carga útil para ensamblar cfdi:Complemento y xsi:schemaLocation
  • key/0, xmlns/0, xsd/0, xmlns_key/0, local_name/0 — accessors
  • __complemento__/0 — marca de introspección que usa Cfdi.Complementos.Registry para el descubrimiento

Identidad de un complemento

El identificador autoritativo de un complemento es la URI de su namespace (xmlns/0), NO el prefijo. El prefijo que aparece en key/0 (iedu, pago20) es la convención del SAT y la que emitimos al serializar, pero un XML de terceros puede declarar el mismo namespace con cualquier prefijo:

<x:instEducativas xmlns:x="http://www.sat.gob.mx/iedu"/>

sigue siendo el complemento de instituciones educativas. Por eso Registry.by_xmlns/1 es la vía de resolución preferida al decodificar XML, y Registry.by_key/1 sólo sirve cuando ya se conoce la key canónica.

Summary

Types

Mapa estándar para ensamblar cfdi:Complemento y xsi:schemaLocation.

t()

Functions

Metadatos de un complemento genérico, no registrado.

Types

complement_result()

@type complement_result() :: %{
  complement: term(),
  key: String.t(),
  schema_location: String.t(),
  xmlns: String.t(),
  xmlns_key: String.t()
}

Mapa estándar para ensamblar cfdi:Complemento y xsi:schemaLocation.

t()

@type t() :: %Cfdi.Complementos.Complemento{
  data: term() | nil,
  key: String.t() | nil,
  xmlns: String.t() | nil,
  xsd: String.t() | nil
}

Callbacks

get_complement(term)

@callback get_complement(term()) :: complement_result()

Functions

get_complement(complemento)

@spec get_complement(t()) :: complement_result()

Metadatos de un complemento genérico, no registrado.

Cfdi.Decoder cae acá cuando encuentra en un XML un complemento cuyo namespace no resuelve a ningún módulo conocido: en vez de descartarlo —perder datos fiscales en silencio— lo envuelve en este struct, que preserva su key, su namespace y su carga útil. Así el complemento sobrevive el ida y vuelta aunque la librería no lo conozca.