sat_catalogos

Catálogos oficiales del SAT para CFDI 4.0, generados automáticamente desde catCFDI.xsd y catCFDI.xlsx.

Estos archivos son auto-generados por sat_catalogos_codegen. NO EDITAR a mano.

Catálogos disponibles

SimpleType SAT Módulo Elixir Variante Átomos Extras
c_FormaPagoSat.Catalogos.FormaPago:with_atoms
c_MetodoPagoSat.Catalogos.MetodoPago:with_atoms
c_TipoDeComprobanteSat.Catalogos.TipoComprobante:with_atoms
c_ImpuestoSat.Catalogos.Impuesto:with_atoms
c_UsoCFDISat.Catalogos.UsoCFDI:with_atoms
c_ExportacionSat.Catalogos.Exportacion:with_atoms
c_MonedaSat.Catalogos.Moneda:with_atoms
c_RegimenFiscalSat.Catalogos.RegimenFiscal:regimen_fiscal No persona_fisica, persona_moral, inicio_vigencia, fin_vigencia
c_PeriodicidadSat.Catalogos.Periodicidad:strings_only No
c_MesesSat.Catalogos.Meses:strings_only No
c_TipoRelacionSat.Catalogos.TipoRelacion:strings_only No
c_ObjetoImpSat.Catalogos.ObjetoImp:strings_only No
c_TipoFactorSat.Catalogos.TipoFactor:strings_only No
c_PaisSat.Catalogos.Pais:strings_only No
c_EstadoSat.Catalogos.Estado:strings_only No

API

Catálogos con átomos (FormaPago, MetodoPago, TipoComprobante, Impuesto, UsoCFDI, Exportacion, Moneda)

# Todos los registros
list/0  :: [%{value: atom(), code: String.t(), label: String.t(), deprecated: boolean()}]

# ¿Existe este código SAT?
valid?/1 :: (String.t()) -> boolean()   # solo acepta string; atom/integer → false

# Átomo → código SAT string
value/1  :: (atom()) -> String.t() | nil

# Código SAT string → mapa completo
from_code/1 :: (String.t()) -> {:ok, %{value: atom(), code: String.t(), label: String.t(), deprecated: boolean()}} | :error

Catálogos string-only (RegimenFiscal, Periodicidad, Meses, TipoRelacion, ObjetoImp, TipoFactor, Pais, Estado)

# Todos los registros
list/0  :: [%{value: String.t(), label: String.t(), deprecated: boolean(), ...extras}]

# ¿Existe este código SAT?
valid?/1 :: (String.t()) -> boolean()   # no hay value/1 en estos módulos

# Código SAT string → mapa completo
from_code/1 :: (String.t()) -> {:ok, %{value: String.t(), label: String.t(), deprecated: boolean(), ...extras}} | :error

Nota: los catálogos string-only no exponen value/1. El campo :value de cada entrada es directamente el código SAT como string.

Ejemplos

alias Sat.Catalogos.{FormaPago, MetodoPago, RegimenFiscal, Pais, TipoFactor}

# Átomo → código SAT
FormaPago.value(:efectivo)
# => "01"

# Código SAT → mapa completo
FormaPago.from_code("01")
# => {:ok, %{value: :efectivo, code: "01", label: "Efectivo", deprecated: false}}

# Validación por código string
FormaPago.valid?("01")   # => true
FormaPago.valid?("ZZ")   # => false
FormaPago.valid?(:efectivo)  # => false (solo acepta string)

# MetodoPago (atom-bearing)
MetodoPago.from_code("PUE")
# => {:ok, %{value: :pago_en_una_exhibicion, code: "PUE", label: "Pago en una sola exhibición", deprecated: false}}

# RegimenFiscal (string-only con extras)
RegimenFiscal.from_code("601")
# => {:ok, %{value: "601", label: "General de Ley Personas Morales",
#            persona_fisica: false, persona_moral: true,
#            inicio_vigencia: ~D[2022-01-01], fin_vigencia: nil, deprecated: false}}

RegimenFiscal.valid?("626")  # RESICO => true
RegimenFiscal.valid?(601)    # integer => false

# TipoFactor (string-only; el código ES el valor)
TipoFactor.valid?("Tasa")   # => true
TipoFactor.from_code("Tasa")
# => {:ok, %{value: "Tasa", label: "Tasa", deprecated: false}}

# Pais
Pais.valid?("MEX")  # => true
Pais.from_code("MEX")
# => {:ok, %{value: "MEX", label: "México", deprecated: false}}

Campos en entradas deprecadas

Las entradas deprecadas siguen siendo accesibles y retornan deprecated: true. Esto permite validar CFDIs históricos. Para filtrar solo activos:

FormaPago.list() |> Enum.reject(& &1.deprecated)