Skip to content

Latest commit

 

History

History
215 lines (168 loc) · 6.81 KB

File metadata and controls

215 lines (168 loc) · 6.81 KB

PhpFacturae

Tests Latest Version on Packagist Total Downloads PHP PHPStan License

Librería PHP moderna para generar, firmar y exportar facturas electrónicas en formato FacturaE (3.2, 3.2.1, 3.2.2) con firma XAdES-EPES — sin dependencias externas.

La alternativa moderna a Facturae-PHP: API fluent con named arguments, enums nativos de PHP 8.2+, tipado estricto y PHPStan nivel 8.

use PhpFacturae\Invoice;
use PhpFacturae\Party;
use PhpFacturae\Signer;

Invoice::create('FAC-001')
    ->series('A')
    ->date('2025-03-01')
    ->seller(Party::company('B12345674', 'Mi Empresa S.L.')
        ->address('C/ Mayor 10', '28013', 'Madrid', 'Madrid'))
    ->buyer(Party::person('12345678Z', 'Laura', 'Gómez', 'Ruiz')
        ->address('C/ Sol 3', '28012', 'Madrid', 'Madrid'))
    ->line('Diseño logotipo', price: 450.00, vat: 21)
    ->transferPayment(iban: 'ES91 2100 0418 4502 0005 1332', dueDate: '2025-03-31')
    ->sign(Signer::pfx('certificado.pfx', 'password'))
    ->export('factura.xsig');

¿Por qué PhpFacturae?

PhpFacturae josemmo/facturae-php
API Fluent con named arguments Arrays asociativos
PHP mínimo 8.2+ con enums y readonly 5.6+
Tipado Estricto · PHPStan nivel 8 Sin análisis estático
Impuestos Named args: vat:, igic:, irpf: Constantes: TAX_IVA + arrays
Dependencias Cero (solo ext-dom, ext-openssl) Cero
Rendimiento ~0.2 ms / factura

Instalación

composer require php-facturae/php-facturae

Requiere PHP 8.2+ con ext-openssl (firma), ext-dom (XML) y ext-curl (TSA, opcional).

Uso rápido

Líneas e impuestos

->line('Producto', price: 100, vat: 21)                          // IVA 21 %
->line('Servicio profesional', price: 500, vat: 21, irpf: 15)    // IVA + retención IRPF
->line('Producto canario', price: 100, igic: 7)                  // IGIC 7 %
->line('Joyería', price: 200, vat: 21, surcharge: 5.2)           // IVA + recargo equivalencia
->exemptLine('Formación', price: 2000, reason: 'Art. 20.Uno.9')  // Exenta

Para combinaciones más específicas, customLine acepta un array de TaxBreakdown:

->customLine('Producto canario', price: 300, taxes: [
    new TaxBreakdown(Tax::IGIC, 7),
    new TaxBreakdown(Tax::REIGIC, 0.5),
])

Partes (emisor / receptor)

// Persona jurídica
Party::company('B12345674', 'Empresa S.L.')
    ->tradeName('Nombre Comercial')
    ->address('C/ Mayor 10', '28013', 'Madrid', 'Madrid')
    ->email('admin@empresa.es')
    ->merchantRegister(book: '1', register: 'Madrid', sheet: 'T-12345', folio: '100')

// Persona física
Party::person('12345678Z', 'Laura', 'Gómez', 'Ruiz')
    ->address('C/ Sol 3', '28012', 'Madrid', 'Madrid')

// Extranjero
Party::company('FR12345678901', 'Entreprise SAS')
    ->address('12 Rue de la Paix', '75002', 'Paris', 'Île-de-France', 'FRA')

Centros administrativos para FACe:

Party::company('S2800000A', 'Ministerio de Ejemplo')
    ->address('C/ Oficial 1', '28001', 'Madrid', 'Madrid')
    ->centre('01', 'L01234567', 'Oficina contable')
    ->centre('02', 'L01234567', 'Órgano gestor')
    ->centre('03', 'L01234567', 'Unidad tramitadora')

Pagos

->transferPayment(iban: 'ES91...', dueDate: '2025-04-01')
->cashPayment(dueDate: '2025-03-01')
->cardPayment(dueDate: '2025-03-01')
->directDebitPayment(iban: 'ES80...', dueDate: '2025-03-10')

Pagos fraccionados (divide el total en N plazos, ajusta céntimos en el último):

->splitPayments(
    method: PaymentMethod::Transfer,
    installments: 3,
    firstDueDate: '2025-04-01',
    intervalDays: 30,
    iban: 'ES91...',
)

Descuentos y cargos

->generalDiscount('Cliente VIP', rate: 5)
->generalDiscount('Promoción', amount: 50.00)
->generalCharge('Portes', amount: 15.00)

Rectificativas

->corrects(
    invoiceNumber: 'FAC-001',
    reason: CorrectionReason::TaxableBase,
    method: CorrectionMethod::FullReplacement,
    series: 'A',
    periodStart: '2025-01-01',
    periodEnd: '2025-03-31',
)

22 motivos en CorrectionReason, 4 métodos en CorrectionMethod.

Adjuntos

->attachFile('/path/to/contrato.pdf', 'Contrato firmado')
->attach(Attachment::fromData($rawPdf, 'application/pdf', 'Albarán'))

Firma electrónica XAdES

// PKCS#12
->sign(Signer::pfx('certificado.pfx', 'password'))

// PEM
->sign(Signer::pem('cert.pem', 'key.pem'))

// Con sellado de tiempo TSA
->sign(Signer::pfx('certificado.pfx', 'password')->timestamp('https://freetsa.org/tsr'))

También firma XMLs generados por otros programas:

$signedXml = Pkcs12Signer::pfx('cert.pfx', 'pass')->sign(file_get_contents('factura.xml'));

Otros

->schema(Schema::V3_2_2)                                  // Versión XSD (por defecto 3.2.2)
->operationDate('2025-02-28')                              // Fecha operación (devengo)
->billingPeriod(from: '2025-02-01', to: '2025-02-28')     // Periodo facturación
->legalLiteral('Factura exenta de IVA por aplicación del REF Canario.')

Features

  • XML FacturaE 3.2 / 3.2.1 / 3.2.2
  • Firma XAdES-EPES + sellado de tiempo TSA
  • 29 impuestos · 19 métodos de pago · 36 unidades de medida
  • Multi-impuesto por línea, recargo de equivalencia
  • Operaciones exentas y no sujetas
  • Facturas rectificativas (22 motivos + periodo fiscal)
  • Descuentos y cargos generales
  • Adjuntos embebidos (PDF, imágenes, etc.)
  • Pagos fraccionados con ajuste de céntimos
  • Personas físicas / jurídicas / extranjeros
  • Centros administrativos FACe (DIR3)
  • PHPStan nivel 8 · CI con PHP 8.2, 8.3 y 8.4
  • Envío directo a FACe (AAPP)
  • Envío a FACeB2B
  • Suplidos
  • Cesionarios (factoring)
  • Terceros (third-party issuer)

Contribuir

git clone https://github.com/php-facturae/php-facturae.git
cd php-facturae
composer install
vendor/bin/phpunit
vendor/bin/phpstan analyse src --level=8

¿Encontraste un bug? Abre un issue. ¿Quieres aportar código? Los PRs son bienvenidos.

Licencia

MIT © Mario Pérez