armandolazarte/afip-sdk

SDK moderno para servicios web de AFIP - Argentina

Installs: 0

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/armandolazarte/afip-sdk

v1.2.0 2025-09-03 12:31 UTC

This package is auto-updated.

Last update: 2025-12-03 12:56:05 UTC


README

PHP Version License

SDK moderno y completamente refactorizado para interactuar con los servicios web de AFIP (Argentina) usando PHP 8.2+.

🚀 Características

  • PHP 8.2+ con tipos estrictos
  • Clases readonly e inmutables
  • ComprobanteBuilder con API fluida
  • AfipConfiguracionBuilder con API fluida
  • Manejo robusto de excepciones
  • Nombres en español (métodos, variables, constantes)
  • PSR-4 autoloading
  • Configuración por objetos
  • Interfaces fluidas y fáciles de usar

📦 Instalación

composer require armandolazarte/afip-sdk

🏗️ Estructura del Proyecto

src/
├── Afip.php                           # Clase principal
├── ServicioWebAfip.php                # Clase base para servicios
├── Configuracion/
│   └── AfipConfiguracion.php          # Configuración del SDK
├── Autenticacion/
│   └── TokenAutorizacion.php          # Manejo de tokens
├── Excepciones/
│   ├── AfipExcepcion.php              # Excepción base
│   ├── CertificadoExcepcion.php       # Errores de certificados
│   ├── ConfiguracionExcepcion.php     # Errores de configuración
│   ├── FirmaDigitalExcepcion.php      # Errores de firma digital
│   ├── NegocioExcepcion.php           # Errores de lógica AFIP
│   ├── ServicioExcepcion.php          # Errores de servicios
│   ├── SoapExcepcion.php              # Errores de comunicación SOAP
│   ├── TokenExcepcion.php             # Errores de autenticación
│   └── WsdlExcepcion.php              # Errores de WSDL
├── Recursos/                          # 📦 WSDL del SDK (automático)
│   ├── wsaa.wsdl
│   ├── wsfe.wsdl
│   └── ...otros wsdl
├── Servicios/
│   ├── FacturacionElectronica.php     # Facturación electrónica
│   ├── PadronAlcanceCinco.php         # Padrón alcance 5
│   ├── PadronAlcanceCuatro.php        # Padrón alcance 4
│   ├── PadronAlcanceDiez.php          # Padrón alcance 10
│   ├── PadronAlcanceTrece.php         # Padrón alcance 13
│   └── ComprobanteInscripcion.php     # Comprobante inscripción
├── DTO/                               # Data Transfer Objects
│   ├── Comprobante.php
│   └── RespuestaComprobante.php
├── Builders/                          # Pattern Builder para DTOs
│   ├── ComprobanteBuilder.php         # Builder fluido para comprobantes
│   └── AfipConfiguracionBuilder.php   # Builder fluido para configuraciones
├── Constantes/
│   └── AfipConstantes.php             # Todas las constantes AFIP
└── Utilidades/
    ├── AfipUtilidad.php             # Utilidades generales
    └── TokensUtilidad.php             # Utilidades para tokens

🎯 Uso Básico

Configuración

use AfipSDK\Afip;
use AfipSDK\Configuracion\AfipConfiguracion;
use AfipSDK\Builders\AfipConfiguracionBuilder;

// NUEVA API Fluida con Builder (Recomendada) - Ambiente de testing
$configuracion = AfipConfiguracionBuilder::testing()
    ->conCuit(20123456789)
    ->conCertificado('certificado.pem')
    ->conClavePrivada('clave_privada.pem')
    ->conFraseClave('mi_frase_secreta')
    ->conCarpetaCertificados(__DIR__ . '/certificados/')
    ->conCarpetaTokens(__DIR__ . '/tokens/')
    ->construir();

// NUEVA API Fluida con Builder - Ambiente de producción
$configuracion = AfipConfiguracionBuilder::produccion()
    ->conCuit(20123456789)
    ->conCertificado('cert_prod.pem')
    ->conClavePrivada('key_prod.pem')
    ->conFraseClave('frase_super_secreta')
    ->sinExcepciones() // Método conveniente
    ->construir();

// API Tradicional AfipConfiguracion (también soportada)
$configuracion = AfipConfiguracion::testing()
    ->conCuit(20123456789)
    ->conCertificado('certificado.pem')
    ->conClavePrivada('clave_privada.pem')
    ->conFraseClave('mi_frase_secreta');

// Constructor directo (también soportado)
$configuracion = AfipConfiguracion::testing(20123456789, [
    'certificado' => 'certificado.pem',
    'clavePrivada' => 'clave_privada.pem',
    'fraseClave' => 'mi_frase_secreta',
    'carpetaTokens' => __DIR__ . '/tokens/'
]);

$afip = new Afip($configuracion);

🏗️ ComprobanteBuilder - API Fluida

El SDK incluye un ComprobanteBuilder que permite crear comprobantes de forma fluida y con validaciones automáticas.

Características del Builder

  • API fluida fácil de leer
  • Cálculos automáticos de totales
  • Validaciones en tiempo de construcción
  • Mapeo automático de códigos AFIP
  • Soporte para todos los tipos de comprobante

Uso Básico del Builder

use AfipSDK\Builders\ComprobanteBuilder;
use AfipSDK\Constantes\AfipConstantes;

// Factura C simple
$factura = ComprobanteBuilder::factura('C', 1, AfipConstantes::TIPOS_DOCUMENTO['DNI'], 12345678)
    ->conImporteNeto(1000.00)
    ->construir();

// Factura A con IVA múltiple
$facturaCompleja = ComprobanteBuilder::factura('A', 1, AfipConstantes::TIPOS_DOCUMENTO['CUIT'], 30202020204)
    ->conImporteNeto(20000.00)
    ->conImporteExento(1000.00)
    ->agregarIva(21.0, 15000.00)    // IVA 21% sobre $15000
    ->agregarIva(10.5, 5000.00)     // IVA 10.5% sobre $5000
    ->agregarTributo(2, 'Ingresos Brutos', 20000.00, 3.0)
    ->conMoneda('USD', 350.00)
    ->configurarComoServicio('20250101', '20250131', '20250228')
    ->construir();

// Crear en AFIP
$respuesta = $facturacion->crearSiguienteComprobante($facturaCompleja->paraAfip());

Métodos Avanzados del Builder

Descuentos y Recargos

$facturaConDescuento = ComprobanteBuilder::factura('A', 1, 80, 30202020204)
    ->conImporteNeto(10000.00)
    ->agregarIva(21.0, 10000.00)
    ->conDescuento(5.0, 10000.00)    // 5% descuento = $500
    ->construir();

$facturaConRecargo = ComprobanteBuilder::factura('A', 1, 80, 30202020204)
    ->conImporteNeto(8000.00)
    ->agregarIva(21.0, 8000.00)
    ->conRecargo(3.0, 8000.00)       // 3% recargo financiero = $240
    ->construir();

Percepciones e Impuestos

$facturaConPercepciones = ComprobanteBuilder::factura('A', 1, 80, 30202020204)
    ->conImporteNeto(15000.00)
    ->agregarIva(21.0, 15000.00)
    ->agregarTributo(2, 'Ingresos Brutos', 15000.00, 3.0)
    ->agregarPercepcion(1, 'Percepción IVA', 15000.00, 2.0)
    ->agregarPercepcion(2, 'Percepción Ganancias', 15000.00, 1.5)
    ->construir();

Facturas de Crédito Electrónica (FCE)

$facturaCredito = ComprobanteBuilder::factura('A', 1, 80, 30202020204)
    ->conImporteNeto(20000.00)
    ->agregarIva(21.0, 20000.00)
    ->comoFacturaCredito('0123456789012345678901', 'EMPRESA.ALIAS')
    ->configurarComoServicio('20250101', '20250131', '20250228')
    ->construir();

Notas de Crédito

$notaCredito = ComprobanteBuilder::notaCredito('A', 1, 80, 30202020204)
    ->conImporteNeto(5000.00)
    ->agregarIva(21.0, 5000.00)
    ->conComprobanteAsociado(1, 1, 123)  // Factura asociada
    ->construir();

Exportación

$facturaExportacion = ComprobanteBuilder::factura('A', 1, 80, 30202020204)
    ->conImporteNeto(25000.00)
    ->agregarIva(0.0, 25000.00)  // Exportaciones IVA 0%
    ->paraExportacion('1', 'PE-2025-001')
    ->conTransporte('Marítimo', 'Buque MV Exportador')
    ->construir();

Métodos Disponibles en ComprobanteBuilder

Método Descripción
factura($tipo, $ptoVta, $docTipo, $docNro) Crear builder para factura
notaCredito($tipo, $ptoVta, $docTipo, $docNro) Crear builder para nota de crédito
conImporteNeto($importe) Establecer importe neto gravado
conImporteExento($importe) Establecer importe exento
conImporteNoGravado($importe) Establecer importe no gravado
agregarIva($porcentaje, $baseImponible, $importe?) Agregar alícuota de IVA
agregarTributo($id, $desc, $baseImp, $porcentaje?) Agregar tributo (Ing. Brutos, etc.)
agregarPercepcion($id, $desc, $baseImp, $porc?) Agregar percepción
conDescuento($porcentaje, $baseImporte) Aplicar descuento
conRecargo($porcentaje, $baseImporte) Aplicar recargo financiero
conFecha($fecha) Establecer fecha específica
conMoneda($monedaId, $cotizacion) Configurar moneda extranjera
configurarComoServicio($desde, $hasta, $vto?) Configurar como servicio
configurarComoProductosYServicios($desde, $hasta) Configurar como productos y servicios
conCondicionIva($condicion) Sobrescribir condición IVA del receptor
conComprobanteAsociado($tipo, $ptoVta, $nro) Asociar comprobante (notas)
paraExportacion($tipo, $permiso?) Configurar para exportación
conTransporte($tipo, $detalle) Agregar información de transporte
comoFacturaCredito($cbu, $alias?) Convertir a FCE
agregarDatoOpcional($id, $valor) Agregar dato opcional válido de AFIP
validarAntesDeConstruir($validar) Habilitar/deshabilitar validaciones automáticas
construir() Construir el objeto Comprobante final

Facturación Electrónica

// Obtener servicio de facturación
$facturacion = $afip->FacturacionElectronica;

// Crear comprobante
$datosComprobante = [
    'CbteTipo' => 11, // Factura C
    'PtoVta' => 1,
    'Concepto' => 1, // Productos
    'DocTipo' => 80, // CUIT
    'DocNro' => 20123456789,
    'CbteFch' => date('Ymd'),
    'ImpTotal' => 121.00,
    'ImpTotConc' => 0.00,
    'ImpNeto' => 100.00,
    'ImpOpEx' => 0.00,
    'ImpIVA' => 21.00,
    'ImpTrib' => 0.00,
    'MonId' => 'PES',
    'MonCotiz' => 1,
    'Iva' => [
        [
            'Id' => 5, // 21%
            'BaseImp' => 100.00,
            'Importe' => 21.00
        ]
    ]
];

$respuesta = $facturacion->crearSiguienteComprobante($datosComprobante);

echo "CAE: " . $respuesta['CAE'] . "\n";
echo "Número: " . $respuesta['numeroComprobante'] . "\n";
echo "Vencimiento: " . $respuesta['CAEFchVto'] . "\n";

// Consultar último comprobante
$ultimo = $facturacion->obtenerUltimoComprobante(1, 11);

// Obtener información de comprobante
$info = $facturacion->obtenerInformacionComprobante($ultimo, 1, 11);

Padrón de Contribuyentes

// Obtener servicio de padrón
$padron = $afip->PadronAlcanceCinco;

// Consultar contribuyente
$contribuyente = $padron->obtenerDatosContribuyente(20123456789);

if ($contribuyente) {
    echo "Razón Social: " . $contribuyente->razonSocial . "\n";
    echo "Estado: " . $contribuyente->estadoClave . "\n";
}

// Consultar múltiples contribuyentes
$contribuyentes = $padron->obtenerDatosContribuyentes([
    20123456789,
    20987654321,
    20555666777
]);

📋 Información del SDK

🏗️ AfipConfiguracionBuilder - API Fluida para Configuración

El SDK incluye un AfipConfiguracionBuilder que permite crear configuraciones AFIP de forma fluida con validaciones automáticas.

Características del AfipConfiguracionBuilder

  • API fluida autodocumentada
  • Validaciones en tiempo de construcción
  • Factory methods para testing y producción
  • Métodos de conveniencia como sinExcepciones()
  • Compatible 100% con AfipConfiguracion original

Uso Básico del AfipConfiguracionBuilder

use AfipSDK\Builders\AfipConfiguracionBuilder;

// Configuración básica para testing
$configuracion = AfipConfiguracionBuilder::testing()
    ->conCuit(20123456789)
    ->conCertificado('certificado.pem')
    ->conClavePrivada('clave.key')
    ->conFraseClave('mi_passphrase')
    ->construir();

// Configuración completa para producción
$configuracion = AfipConfiguracionBuilder::produccion()
    ->conCuit(20123456789)
    ->conCertificado('cert_prod.pem')
    ->conClavePrivada('key_prod.key')
    ->conFraseClave('passphrase_ultra_segura')
    ->conCarpetaCertificados('/etc/ssl/afip/')
    ->conCarpetaTokens('/var/cache/afip_tokens/')
    ->conCarpetaRecursos('/opt/afip-sdk/recursos/')
    ->sinExcepciones() // Método de conveniencia
    ->construir();

// Configuración mínima
$configuracion = AfipConfiguracionBuilder::testing()
    ->conCuit(20123456789)
    ->conCertificado('cert.pem')
    ->conClavePrivada('key.pem')
    ->construir();

Métodos Avanzados del AfipConfiguracionBuilder

Reutilización y Factory Pattern

// Crear configuración base reutilizable
$builderBase = AfipConfiguracionBuilder::testing()
    ->conCarpetaCertificados('/certificados/')
    ->conCarpetaTokens('/tokens/');

// Cliente A
$configClienteA = $builderBase
    ->conCuit(20111111111)
    ->conCertificado('cliente_a.pem')
    ->conClavePrivada('cliente_a.key')
    ->construir();

// Cliente B
$configClienteB = $builderBase
    ->conCuit(20222222222)
    ->conCertificado('cliente_b.pem')
    ->conClavePrivada('cliente_b.key')
    ->construir();

// Factory personalizado
function crearConfiguracionCliente(int $cuit, string $nombre): AfipConfiguracion
{
    return AfipConfiguracionBuilder::testing()
        ->conCuit($cuit)
        ->conCertificado($nombre . '_cert.pem')
        ->conClavePrivada($nombre . '_key.pem')
        ->conCarpetaCertificados("/clientes/{$nombre}/certificados/")
        ->conCarpetaTokens("/clientes/{$nombre}/tokens/")
        ->construir();
}

Configuraciones Condicionales

$ambiente = $_ENV['AFIP_AMBIENTE'] ?? 'testing';

$configuracion = ($ambiente === 'produccion' ?
    AfipConfiguracionBuilder::produccion() :
    AfipConfiguracionBuilder::testing())
    ->conCuit(20123456789)
    ->conCertificado($ambiente === 'produccion' ? 'prod.pem' : 'test.pem')
    ->conClavePrivada($ambiente === 'produccion' ? 'prod.key' : 'test.key')
    ->construir();

Métodos Disponibles en AfipConfiguracionBuilder

Método Descripción
testing() Factory method para ambiente de testing
produccion() Factory method para ambiente de producción
conCuit(int $cuit) Establece el CUIT del contribuyente
conCertificado(string $archivo) Establece el archivo de certificado
conClavePrivada(string $archivo) Establece el archivo de clave privada
conFraseClave(string $frase) Establece la passphrase de la clave
conCarpetaCertificados(string $ruta) Establece la carpeta de certificados
conCarpetaTokens(string $ruta) Establece la carpeta de tokens
conCarpetaRecursos(string $ruta) Establece la carpeta de recursos
conExcepciones(bool $habilitar) Habilita/deshabilita excepciones
sinExcepciones() Método de conveniencia para deshabilitar excepciones
construir() Construye el objeto AfipConfiguracion final

Compatibilidad con AfipConfiguracion Original

El AfipConfiguracionBuilder es completamente compatible con la clase AfipConfiguracion original:

// AMBAS FORMAS crean exactamente la MISMA clase
$configOriginal = AfipConfiguracion::testing(20123456789, [
    'certificado' => 'cert.pem',
    'clavePrivada' => 'key.pem'
]);

$configBuilder = AfipConfiguracionBuilder::testing()
    ->conCuit(20123456789)
    ->conCertificado('cert.pem')
    ->conClavePrivada('key.pem')
    ->construir();

// Ambas son instancias de AfipConfiguracion
echo $configOriginal::class; // AfipSDK\Configuracion\AfipConfiguracion
echo $configBuilder::class;  // AfipSDK\Configuracion\AfipConfiguracion

// El código existente NO necesita cambios
$afip = new Afip($configOriginal); // Funciona
$afip = new Afip($configBuilder);  // También funciona

Obtener Versión

// Obtener solo la versión
$version = $afip->obtenerVersion();
echo "Versión: " . $version; // Ej: "1.0.0"

// Obtener información completa del SDK
$info = $afip->obtenerInformacionSdk();
print_r($info);
/*
Array (
    [version] => 1.0.0
    [nombre] => AFIP SDK
    [descripcion] => SDK moderno para servicios web de AFIP - Argentina
    [servicios_disponibles] => Array (
        [0] => FacturacionElectronica
        [1] => PadronAlcanceCuatro
        [2] => PadronAlcanceCinco
        [3] => ComprobanteInscripcion
        [4] => PadronAlcanceDiez
        [5] => PadronAlcanceTrece
    )
    [ambiente] => testing
    [cuit] => 20123456789
)
*/

// Acceso directo a la constante
echo Afip::VERSION; // "1.0.0"

🔧 Servicios Disponibles

| Servicio | Clase Descripción | | ----------------------- | ------------------------ | ------------------------------------ | | Facturación Electrónica | FacturacionElectronica | Emisión de comprobantes electrónicos | | Padrón Alcance 4 | PadronAlcanceCuatro | Consulta básica de contribuyentes | | Padrón Alcance 5 | PadronAlcanceCinco | Consulta avanzada de contribuyentes | | Padrón Alcance 10 | PadronAlcanceDiez | Consulta con datos fiscales | | Padrón Alcance 13 | PadronAlcanceTrece | Consulta por documento | | Comprobante Inscripción | ComprobanteInscripción | Constancia de inscripción |

🛡️ Manejo de Excepciones

El SDK incluye excepciones específicas para diferentes tipos de errores:

Excepciones Específicas

use AfipSDK\Excepciones\ConfiguracionExcepcion;
use AfipSDK\Excepciones\CertificadoExcepcion;
use AfipSDK\Excepciones\WsdlExcepcion;
use AfipSDK\Excepciones\TokenExcepcion;
use AfipSDK\Excepciones\FirmaDigitalExcepcion;
use AfipSDK\Excepciones\SoapExcepcion;
use AfipSDK\Excepciones\ServicioExcepcion;
use AfipSDK\Excepciones\NegocioExcepcion;
use AfipSDK\Excepciones\AfipExcepcion;

try {
    $comprobante = $facturacion->crearSiguienteComprobante($datos);
} catch (ConfiguracionExcepcion $e) {
    echo "Error de configuración: " . $e->getMessage();
} catch (CertificadoExcepcion $e) {
    echo "Error de certificado: " . $e->getMessage();
} catch (TokenExcepcion $e) {
    echo "Error de autenticación: " . $e->getMessage();
} catch (NegocioExcepcion $e) {
    echo "Error de AFIP: " . $e->getMessage();
} catch (AfipExcepcion $e) {
    echo "Error general AFIP: " . $e->getMessage();
} catch (Exception $e) {
    echo "Error inesperado: " . $e->getMessage();
}

Tipos de Excepciones

Excepción Descripción
ConfiguracionExcepcion Errores de configuración del SDK
CertificadoExcepcion Problemas con certificados y claves privadas
WsdlExcepcion Errores al cargar archivos WSDL
TokenExcepcion Problemas de autenticación y tokens
FirmaDigitalExcepcion Errores en el proceso de firma digital
SoapExcepcion Errores de comunicación SOAP
ServicioExcepcion Servicios no implementados o inválidos
NegocioExcepcion Errores específicos de reglas de AFIP
AfipExcepcion Excepción base (catch-all)

⚙️ Configuración Avanzada

Servicios Web Genéricos

El SDK incluye la clase ServicioWebGenerico para trabajar con servicios AFIP no implementados específicamente:

// Crear un servicio genérico
$configuracionServicio = [
    'WSDL' => 'https://ejemplo.com/servicio.wsdl',
    'URL' => 'https://ejemplo.com/servicio',
    'WSDL_PRUEBA' => 'https://testing.com/servicio.wsdl',
    'URL_PRUEBA' => 'https://testing.com/servicio'
];

$servicio = $afip->servicioWeb('MiServicioCustom', $configuracionServicio);

// Llamar a métodos del servicio
$resultado = $servicio->llamarMetodo('ConsultarDatos', $parametros);

Configuración de Carpetas

$configuracion = AfipConfiguracion::testing(
    cuit: 20123456789,
    opciones: [
        'carpetaRecursos' => '/ruta/completa/recursos/',
        'carpetaTokens' => '/ruta/completa/tokens/',
        'certificado' => 'mi_cert.pem',
        'clavePrivada' => 'mi_key.pem'
    ]
);

🪧 Ejemplos Prácticos

En la carpeta ejemplos/ encontrarás más de 30 ejemplos prácticos organizados por categorías:

🔰 Básicos (basicos/)

  • configuracion-basica.php - Setup inicial del SDK
  • uso.php - Flujo completo típico de facturación
  • manejo_excepciones.php - Manejo de errores específicos

💰 Facturación (facturacion/)

  • factura-a.php, factura-b.php, factura-c.php - Tipos de facturas
  • facturacion-con-dto.php - Usando DTOs simplificados
  • facturacion-manual.php - Control total con arrays
  • consulta-comprobante.php - Consultar comprobantes emitidos

🏗️ Builder (facturacion/builder/)

  • facturacion.php - Ejemplos básicos con ComprobanteBuilder
  • facturacion-avanzada.php - Métodos avanzados del Builder
  • casos-especiales.php - Casos especiales y edge cases
  • test-simple.php - Tests de descuentos y recargos
  • verificacion-metodos.php - Verificación completa de métodos
  • debug.php - Debug y estructura de datos

📝 Notas de Crédito (facturacion/notas-credito/)

  • nota-credito-a.php, nota-credito-b.php, nota-credito-c.php
  • nota-credito.php - Ejemplo general de notas

🔍 Consultas (consultas/)

  • consultas-padron.php - Padrón múltiples alcances
  • padron-alcance-5.php - Padrón Alcance 5 específico
  • puntos_venta.php - Gestión de puntos de venta

📊 Tipos (consultas/tipos/)

  • tipos_comprobante.php, tipos_documento.php, tipos_moneda.php
  • tipos_alicuota_iva.php, tipos_tributo.php - Códigos AFIP

⚙️ Configuración (configuracion/)

  • builder_basico.php - Uso básico del AfipConfiguracionBuilder
  • builder_avanzado.php - Métodos avanzados y encadenamiento fluido
  • builder_casos_uso.php - Casos de uso específicos (múltiples clientes, factories, etc.)
  • comparativa.php - Comparación entre AfipConfiguracion y AfipConfiguracionBuilder

🔧 Servicios (servicios/)

  • comprobante-inscripcion.php - Constancias de inscripción
  • monitoreo-servicios.php - Estado de servicios AFIP
  • servicio_generico.php - Servicios personalizados
  • cotizacion_monedas.php - Consulta de cotizaciones

🚀 Avanzados (avanzados/)

  • configuracion-avanzada.php - Configuración para producción
  • utilidades-validaciones.php - Validaciones y cálculos
  • manejo_tokens.php - Gestión avanzada de tokens

📊 Reportes (reportes/)

  • guardado-json.php - Persistencia en JSON
  • informacion_adicional_util.php - Utilidades adicionales

🧪 Testing

# Ejecutar tests unitarios
composer test:unit

# Ejecutar todas las validaciones de calidad
composer quality

# Formateo de código
composer lint

# Análisis estático
composer test:types

# Refactoring automático
composer refactor

# Modernizar código (lint + refactor + types + tests)
composer modernize

📋 Requisitos

  • PHP 8.2 o superior
  • Extensión SOAP
  • Extensión OpenSSL
  • Extensión SimpleXML
  • Certificados válidos de AFIP

🤝 Contribuciones

Las contribuciones son bienvenidas. Por favor:

  1. Fork el proyecto
  2. Crea una rama para tu feature (git checkout -b feature/nueva-funcionalidad)
  3. Commit tus cambios (git commit -am 'Agregar nueva funcionalidad')
  4. Push a la rama (git push origin feature/nueva-funcionalidad)
  5. Crea un Pull Request

📄 Licencia

Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.

🔗 Enlaces Útiles

Documentación General

Facturación Electrónica

Padrón de Contribuyentes

Comprobante de Inscripción

🆘 Soporte

Si encuentras algún problema o tienes preguntas:

⚠️ Importante: Este SDK está diseñado específicamente para uso en Argentina con los servicios web oficiales de AFIP. Asegúrate de tener los certificados y permisos necesarios antes de usar en producción.