Appearance
SICORE — Formato Técnico de Exportación
Módulo: Compras Tipo: Technical Reference Estado: ✅ Implementado Última actualización: 2026-03-26
Descripción General
SICORE (Sistema de Control de Retenciones) es la plataforma de ARCA mediante la cual los agentes de retención declaran las retenciones practicadas. El sistema Bautista, como agente de retención de Ganancias, genera dos archivos de texto de posición fija que se importan en la aplicación SICORE de ARCA:
| Archivo | Descripción | Longitud de registro |
|---|---|---|
retenciones.txt | Una línea por cada retención practicada en el período | 145 caracteres |
sujetos_retenidos.txt | Una línea por cada proveedor único retenido en el período | 83 caracteres |
Ambos archivos se comprimen en un único ZIP (sicore_consolidado_MMYYYY.zip) que se importa directamente en SICORE de ARCA.
Reglas del Formato de Posición Fija
Cada registro tiene longitud fija y estricta. No existe separador de campos — la posición de inicio y longitud de cada campo definen su ubicación.
| Tipo de campo | Alineación | Relleno | Codificación | Observación |
|---|---|---|---|---|
| Alfanumérico / Texto | Izquierda | Espacios a la derecha | UTF-8 (sin caracteres extendidos) | Truncar si el valor supera la longitud |
| Numérico / Entero | Derecha | Ceros a la izquierda | — | |
| Importe decimal | Derecha | Ceros a la izquierda | — | Centavos implícitos: el valor se multiplica por 100 y se truncan los decimales. Ej: 1234.56 → 00000000123456 en 14 posiciones |
| Fecha SICORE | — | — | — | Formato dd/mm/aaaa (10 caracteres fijos, incluyendo las barras) |
| CUIT / CUIL (como número de documento) | Izquierda | Espacios a la derecha | — | Tipo Texto: 11 dígitos sin guiones, alineado izquierda. Ej: 20123456789 (20 pos. en retenciones.txt, 11 pos. en sujetos_retenidos.txt) |
Nota: El campo "Número de documento del retenido" (pos. 112-131 en
retenciones.txt, pos. 1-11 ensujetos_retenidos.txt) es tipo Texto según el formato oficial SICORE v9.0 exportado por la aplicación SICORE. El CUIT/CUIL de 11 dígitos se ubica alineado a la izquierda con espacios de relleno a la derecha.
Restricciones globales:
- Todos los registros de un mismo archivo tienen exactamente la misma longitud (
retenciones.txt= 145,sujetos_retenidos.txt= 83). - Codificación del archivo: Windows-1252.
- Terminación de línea: CRLF (
\r\n).
Tipo de Documento ARCA
ARCA distingue el tipo de documento del sujeto retenido según el prefijo del número de CUIT/CUIL. Este campo ocupa 2 posiciones en ambos archivos.
| Prefijos del identificador | Tipo | Código ARCA | Descripción |
|---|---|---|---|
| 20, 23, 24, 27 | CUIL | 86 | Persona física |
| 30, 33, 34 | CUIT | 80 | Persona jurídica |
| Cualquier otro prefijo | CUIT | 80 | Fallback (tratado como persona jurídica) |
La detección está implementada en Core/Afip/IdentificadorFiscal::codigoTipoDocumentoAfip(). El campo se emite de forma dinámica en función del CUIT del proveedor — no es un valor fijo.
Helpers de Formato
La clase Core/Afip/FormatoAfip centraliza los helpers de formato de posición fija utilizados en la generación de ambos archivos. Sus métodos son estáticos:
| Método | Cuándo usar |
|---|---|
texto(string $val, int $len) | Campos alfanuméricos: razón social, domicilio, localidad, número de comprobante |
entero(int|string $val, int $len) | Campos numéricos enteros: código de comprobante, código de impuesto, número certificado |
importeCentavos(float|string $val, int $len) | Importes monetarios: importe del comprobante, base de cálculo, importe de retención |
fechaDdMmAaaa(?string $fechaIso) | Fechas SICORE (dd/mm/aaaa): fecha del comprobante, fecha de retención, fecha de vigencia |
padIzquierdaCeros(string $text, int $length) | Relleno numérico genérico izquierda con ceros |
La clase Core/Afip/IdentificadorFiscal complementa a FormatoAfip para campos relacionados con identificadores fiscales:
| Método | Cuándo usar |
|---|---|
padLeft(int $len) | Disponible en IdentificadorFiscal para uso genérico; no se usa para el campo número de documento en SICORE (ese campo usa FormatoAfip::texto()) |
codigoTipoDocumentoAfip() | Tipo de documento del retenido (pos. 110-111 en retenciones.txt y pos. 82-83 en sujetos_retenidos.txt) |
Limitaciones Actuales
| Limitación | Descripción | Estado |
|---|---|---|
| Código de impuesto | Hardcodeado a 0217 (Ganancias) mediante la constante CODIGO_IMPUESTO_GANANCIAS. ARCA define también los códigos 064, 172, 210, 218, 219, 466 y 767 para otros regímenes. | Constante nombrada — extensible con patrón Strategy cuando se incorporen otros impuestos |
| Código de operación | Hardcodeado a 1 (Retención) mediante la constante CODIGO_OPERACION_RETENCION. ARCA define también el código 2 (Percepción) y 4 (Imposibilidad de retención). | Constante nombrada — extensible con patrón Strategy |
| Código de condición | Solo mapea 01 (Inscripto) y 02 (No inscripto). ARCA define 19 códigos de condición posibles. La base de datos solo almacena el estado inscripto/no inscripto del proveedor en el campo detgan. | Limitación de la estructura de datos actual |
| Notas de Crédito | El campo "número de certificado original" (pos. 132-145) usa 0 como valor de fallback para NCs, porque la tabla detgan no almacena el número del certificado original que se revierte. Se emite un error_log con el número de comprobante afectado para trazabilidad. | Deuda técnica — ver Roadmap |
| Beneficiarios del exterior | No soportado. ARCA requiere campos adicionales para estos casos (CUIT del país, denominación del ordenante, acrecentamiento, CUIT del ordenante). | Fuera del scope actual |
Roadmap de Extensibilidad
Impuesto y Operación (patrón Strategy)
Las constantes CODIGO_IMPUESTO_GANANCIAS (0217) y CODIGO_OPERACION_RETENCION (1) están declaradas con nombre explícito en SicoreRetenciones. Cuando el sistema incorpore retenciones de IVA (código 767) u otros impuestos, estas constantes deberán convertirse en una estrategia configurable por régimen, de manera que la lógica de construcción de línea no cambie — solo la configuración de qué impuesto y operación emitir.
El diseño actual con constantes nombradas facilita esa transición sin reescribir la lógica de formato.
Notas de Crédito
Para exportar correctamente el campo "número de certificado original" en NCs, se requiere agregar el campo numret_original INT NULL a la tabla detgan, populado en el momento en que se registra la retención de crédito en el proceso de orden de pago. Con ese dato disponible, se elimina el fallback 0 en SicoreRetenciones::buildLineaRetencion().
Beneficiarios del Exterior
Para soportar este caso se necesitan campos adicionales en el registro de retención: denominación del ordenante, tipo de acrecentamiento, CUIT del país y CUIT del ordenante. Ver instructivo ARCA SICORE v8.0 r9, sección 4.3.1.1.
Referencia de Clases
| Clase | Ubicación | Responsabilidad |
|---|---|---|
IdentificadorFiscal | Core/Afip/IdentificadorFiscal | Value Object canónico para CUIT/CUIL: normalización (strip guiones/espacios), detección del tipo de documento ARCA (80/86), validación por dígito verificador, padding numérico izquierda con ceros |
FormatoAfip | Core/Afip/FormatoAfip | Helpers estáticos de formato de posición fija: texto, entero, importe centavos, fechas SICORE y Libro IVA |
SicoreRetenciones | models/modulo-compra/SicoreRetenciones | Construcción del archivo retenciones.txt y sujetos_retenidos.txt; orquestado por SicoreRetencionesController |
Referencias
- Índice SICORE — Descripción general y tabla de campos
- Proceso de exportación — Flujo completo, query SQL, casos de borde
- Instructivo ARCA SICORE v8.0 r9 — Especificación oficial de ARCA
Sistema Bautista ERP - Módulo Compras