El catálogo de formatos
El catálogo da un inventario de solo lectura de los formatos que el motor de ingesta puede parsear. Es global primero y estático: los parsers integrados no llevan tenant, así que cada llamador autenticado ve la misma respuesta. El catálogo usa un árbol
region → family → variant que corresponde a los ejes del descriptor canónico de formato.
XX para formatos neutrales respecto a la región. Incluso una familia con un único layout canónico (por ejemplo camt) nombra su layout como el variant (camt053 arriba).
El catálogo integrado contiene estas claves de formato:
El catálogo no toma parámetros de ruta, de consulta ni de cuerpo. El tenant no afecta al catálogo integrado.
Plantillas de layout
Cuando un archivo usa un layout de ancho fijo específico de un operador o de una marca que ningún parser integrado cubre, registra una plantilla de layout. Una plantilla ubica un layout posicional bajo los ejes
{region, family, variant}. La ruta de parseo la resuelve como una fuente de layout aditiva para tu tenant.
Cada envío y cada edición pasan por un control de buena formación antes del almacenamiento. El desbordamiento, el solapamiento, la ausencia de campos obligatorios, una columna de dinero mal marcada o un kind desconocido se rechazan con 422. Un registro sin campos se rechaza con 400. Matcher nunca almacena esa plantilla. Matcher no usa una plantilla cuya clave coincide con un formato integrado.
Regla intocable del dinero: el campo llamado
amount es la columna de dinero, y debe declarar kind: "decimal". El control de envío rechaza un campo amount que omite o marca mal su tipo. Matcher lee amount como un número con punto decimal explícito y no aplica decimales implícitos: 000000010050 se lee como 10050.Crear una plantilla
region: región ISO alfa-2 (en mayúsculas) oXX.family: familia de formato de enumeración cerrada bajo la que se ubica la plantilla.variant: eje abierto de operador o marca (no debe estar en blanco).discriminatorStart/discriminatorLength: el rango de bytes que el parser lee para elegir un tipo de registro.records[]: cada tipo de registro con suwidthfijo (bytes) y susfieldsposicionales ordenados. Los offsets empiezan en cero.fields[].name:external_id,amount,currency,dateydescriptionse asignan a la transacción. Todos los demás nombres van a los metadatos. Sin un campocurrency, la moneda esBRL.fields[].kind:string,decimal(token literal de dinero o numérico, parseado más adelante) odate.requiredFields(opcional): nombres de campo que la variante debe declarar en sus tipos de registro.
201 con la plantilla almacenada, incluida su formatKey (por ejemplo br/cnab400/acme-cobranca), el discriminador, el layout posicional completo y recordWidths.
Listar y obtener plantillas
Actualizar y eliminar una plantilla
PUT es un reemplazo completo, no un parche parcial. Los invariantes de rango de bytes son propiedades de todo el layout. El reemplazo pasa por el mismo control de buena formación que aplica la ruta de creación. Un layout que falla se rechaza con 422, y la plantilla almacenada queda sin cambios.
204. Una plantilla ausente devuelve 404.

