PHP Classes

How can PHP invoice generator package generate valid invoices to use in Spain using the package Laravel Verifactu: Manage fiscal documents using Verifactu API

Recommend this page to a friend!
  Info   Documentation   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2025-11-16 (22 days ago) RSS 2.0 feedNot yet rated by the usersTotal: Not yet counted Not yet ranked
Version License PHP version Categories
laravelverifactu 1.0Custom (specified...7PHP 7, Business, Documents
Description 

Authors

Alberto Rial Barreiro
Jacobo Cantorna Cigarrán


Contributor
This package is specific mainly for applications used in Spain Spain .

This package can manage fiscal documents using Verifactu API.

It can send HTTP requests to the Agencia Tributaria Web services API to perform several types of operations.

Currently, it can:

- Define the recipients of invoices

- Define the invoice's breakdown

- Generate invoices


In Spanish:

Paquete Laravel para gestión y registro de facturación electrónica VeriFactu. Compatible con Laravel 10 a 12.x.

Picture of Jacobo Cantorna Cigarrán
  Performance   Level  
Name: Jacobo Cantorna Cigarrán <contact>
Classes: 3 packages by
Country: Spain Spain
Age: 45
All time rank: Not yet ranked
Week rank: Not yet ranked
Innovation award
Innovation award
Nominee: 2x

Instructions

Please read this document to learn how to generate invoices for Spanish businesses.

Documentation

Laravel Verifactu - Sistema de facturación electrónica

Paquete Laravel 10/11/12 para gestión y registro de facturación electrónica VeriFactu

<p align="center"> <a href="https://scrutinizer-ci.com/g/squareetlabs/LaravelVerifactu/"><img src="https://scrutinizer-ci.com/g/squareetlabs/LaravelVerifactu/badges/quality-score.png?b=master" alt="Quality Score"></a> <a href="https://scrutinizer-ci.com/g/squareetlabs/LaravelVerifactu/"><img src="https://scrutinizer-ci.com/g/squareetlabs/LaravelVerifactu/badges/code-intelligence.svg?b=master" alt="Code Intelligence"></a> <a href="https://packagist.org/packages/squareetlabs/laravel-verifactu"><img class="latest_stable_version_img" src="https://poser.pugx.org/squareetlabs/laravel-verifactu/v/stable" alt="Latest Stable Version"></a> <a href="https://packagist.org/packages/squareetlabs/laravel-verifactu"><img class="total_img" src="https://poser.pugx.org/squareetlabs/laravel-verifactu/downloads" alt="Total Downloads"></a> <a href="https://packagist.org/packages/squareetlabs/laravel-verifactu"><img class="license_img" src="https://poser.pugx.org/squareetlabs/laravel-verifactu/license" alt="License"></a> </p>

Características principales

  • Modelos Eloquent para invoices, breakdowns y recipients
  • Enum types para campos fiscales (invoice type, tax type, regime, etc.)
  • Helpers para operaciones de fecha, string y hash
  • Servicio AEAT client (configurable e inyectable)
  • Form Requests para validación
  • API Resources para respuestas RESTful
  • Factories y tests unitarios para todos los componentes core
  • Listo para extensión y uso en producción

Instalación

composer require squareetlabs/laravel-verifactu

Publica la configuración y migraciones:

php artisan vendor:publish --provider="Squareetlabs\VeriFactu\Providers\VeriFactuServiceProvider"
php artisan migrate

Configuración

Edita tu archivo .env o config/verifactu.php según tus necesidades:

return [
    'enabled' => true,
    'default_currency' => 'EUR',
    'issuer' => [
        'name' => env('VERIFACTU_ISSUER_NAME', ''),
        'vat' => env('VERIFACTU_ISSUER_VAT', ''),
    ],
    // ...
];

Uso rápido

Crear una Invoice (Ejemplo de Controller)

use Squareetlabs\VeriFactu\Http\Requests\StoreInvoiceRequest;
use Squareetlabs\VeriFactu\Models\Invoice;
use Squareetlabs\VeriFactu\Http\Resources\InvoiceResource;

public function store(StoreInvoiceRequest $request)
{
    $invoice = Invoice::create($request->validated());
    // Opcionalmente puedes asociar breakdowns y recipients
    // $invoice->breakdowns()->createMany([...]);
    // $invoice->recipients()->createMany([...]);
    return new InvoiceResource($invoice->load(['breakdowns', 'recipients']));
}

Ejemplos de tipos de Invoice

A continuación, ejemplos de cómo crear cada tipo de invoice usando el modelo y enums:

Factura estándar

use Squareetlabs\VeriFactu\Models\Invoice;
use Squareetlabs\VeriFactu\Enums\InvoiceType;

$invoice = Invoice::create([
    'number' => 'INV-STD-001',
    'date' => '2024-07-01',
    'customer_name' => 'Standard Customer',
    'customer_tax_id' => 'C12345678',
    'issuer_name' => 'Issuer S.A.',
    'issuer_tax_id' => 'B87654321',
    'amount' => 100.00,
    'tax' => 21.00,
    'total' => 121.00,
    'type' => InvoiceType::STANDARD,
]);

Factura simplificada

$invoice = Invoice::create([
    'number' => 'INV-SIMP-001',
    'date' => '2024-07-01',
    'customer_name' => 'Simplified Customer',
    'customer_tax_id' => 'C87654321',
    'issuer_name' => 'Issuer S.A.',
    'issuer_tax_id' => 'B87654321',
    'amount' => 50.00,
    'tax' => 10.50,
    'total' => 60.50,
    'type' => InvoiceType::SIMPLIFIED,
]);

Factura de sustitución

$invoice = Invoice::create([
    'number' => 'INV-SUB-001',
    'date' => '2024-07-01',
    'customer_name' => 'Substitute Customer',
    'customer_tax_id' => 'C11223344',
    'issuer_name' => 'Issuer S.A.',
    'issuer_tax_id' => 'B87654321',
    'amount' => 80.00,
    'tax' => 16.80,
    'total' => 96.80,
    'type' => InvoiceType::SUBSTITUTE,
    // Puedes añadir aquí la relación con facturas sustituidas si implementas la lógica
]);

Factura rectificativa (R1)

$invoice = Invoice::create([
    'number' => 'INV-RECT-001',
    'date' => '2024-07-01',
    'customer_name' => 'Rectified Customer',
    'customer_tax_id' => 'C55667788',
    'issuer_name' => 'Issuer S.A.',
    'issuer_tax_id' => 'B87654321',
    'amount' => 120.00,
    'tax' => 25.20,
    'total' => 145.20,
    'type' => InvoiceType::RECTIFICATIVE_R1,
    // Puedes añadir aquí la relación con facturas rectificadas y el motivo si implementas la lógica
]);

> Nota: Para facturas rectificativas y sustitutivas, si implementas los campos y relaciones adicionales (como facturas rectificadas/sustituidas, tipo de rectificación, importe de rectificación), deberás añadirlos en el array de creación.

Envío de Invoice a AEAT (Ejemplo de Controller)

use Illuminate\Http\Request;
use Squareetlabs\VeriFactu\Services\AeatClient;
use Squareetlabs\VeriFactu\Models\Invoice;

class InvoiceAeatController extends Controller
{
    public function send(Request $request, AeatClient $aeatClient, $invoiceId)
    {
        $invoice = Invoice::with(['breakdowns', 'recipients'])->findOrFail($invoiceId);
        $result = $aeatClient->sendInvoice($invoice);
        // Puedes registrar el resultado, lanzar eventos, etc.
        return response()->json($result, $result['status'] === 'success' ? 200 : 422);
    }
}

> Nota: Protege este endpoint con autenticación/autorización adecuada. > > El resultado incluirá el XML enviado y recibido, útil para depuración. > > Si el certificado no es válido o hay error de validación, el array tendrá 'status' => 'error' y 'message'.

Validación y creación de Breakdown (Ejemplo de Controller)

use Squareetlabs\VeriFactu\Http\Requests\StoreBreakdownRequest;
use Squareetlabs\VeriFactu\Models\Breakdown;

public function storeBreakdown(StoreBreakdownRequest $request)
{
    $breakdown = Breakdown::create($request->validated());
    return response()->json($breakdown);
}

Uso de Helpers

use Squareetlabs\VeriFactu\Helpers\DateTimeHelper;
use Squareetlabs\VeriFactu\Helpers\StringHelper;
use Squareetlabs\VeriFactu\Helpers\HashHelper;

$dateIso = DateTimeHelper::formatIso8601('2024-01-01 12:00:00');
$sanitized = StringHelper::sanitize('  &Hello <World>  ');
$hash = HashHelper::generateInvoiceHash([
    'issuer_tax_id' => 'A12345678',
    'invoice_number' => 'INV-001',
    'issue_date' => '2024-01-01',
    'invoice_type' => 'F1',
    'total_tax' => '21.00',
    'total_amount' => '121.00',
    'previous_hash' => '',
    'generated_at' => '2024-01-01T12:00:00+01:00',
]);

Uso avanzado

Integración de eventos y listeners

Puedes disparar eventos cuando se crean, actualizan o envían invoices a AEAT. Ejemplo:

// app/Events/InvoiceSentToAeat.php
namespace App\Events;

use Squareetlabs\VeriFactu\Models\Invoice;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class InvoiceSentToAeat
{
    use Dispatchable, SerializesModels;
    public function __construct(public Invoice $invoice, public array $aeatResponse) {}
}

Despacha el evento tras el envío:

use App\Events\InvoiceSentToAeat;

// ... después de enviar a AEAT
InvoiceSentToAeat::dispatch($invoice, $result);

Crea un listener para notificaciones o logging:

// app/Listeners/LogAeatResponse.php
namespace App\Listeners;

use App\Events\InvoiceSentToAeat;
use Illuminate\Support\Facades\Log;

class LogAeatResponse
{
    public function handle(InvoiceSentToAeat $event)
    {
        Log::info('AEAT response', [
            'invoice_id' => $event->invoice->id,
            'response' => $event->aeatResponse,
        ]);
    }
}

Registra tu evento y listener en EventServiceProvider:

protected $listen = [
    \App\Events\InvoiceSentToAeat::class => [
        \App\Listeners\LogAeatResponse::class,
    ],
];

Políticas de autorización

Puedes restringir el acceso a invoices usando policies de Laravel:

// app/Policies/InvoicePolicy.php
namespace App\Policies;

use App\Models\User;
use Squareetlabs\VeriFactu\Models\Invoice;

class InvoicePolicy
{
    public function view(User $user, Invoice $invoice): bool
    {
        return $user->id === $invoice->user_id;
    }

    public function update(User $user, Invoice $invoice): bool
    {
        return $user->id === $invoice->user_id && $invoice->status === 'draft';
    }
}

Registra la policy en AuthServiceProvider:

protected $policies = [
    \Squareetlabs\VeriFactu\Models\Invoice::class => \App\Policies\InvoicePolicy::class,
];

Úsala en tu controller:

public function update(Request $request, Invoice $invoice)
{
    $this->authorize('update', $invoice);
    // ...
}

Integración de notificaciones

Puedes notificar a usuarios o admins cuando una invoice se envía o falla:

// app/Notifications/InvoiceSentNotification.php
namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Squareetlabs\VeriFactu\Models\Invoice;

class InvoiceSentNotification extends Notification
{
    use Queueable;
    public function __construct(public Invoice $invoice) {}

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new \Illuminate\Notifications\Messages\MailMessage)
            ->subject('Invoice Sent to AEAT')
            ->line('Invoice #' . $this->invoice->number . ' was sent to AEAT successfully.');
    }
}

Despacha la notificación en tu job o listener:

$user->notify(new \App\Notifications\InvoiceSentNotification($invoice));

Integración con colas (queues)

Puedes enviar invoices a AEAT de forma asíncrona usando colas:

use Squareetlabs\VeriFactu\Models\Invoice;
use App\Jobs\SendInvoiceToAeatJob;

// Despacha el job a la cola
SendInvoiceToAeatJob::dispatch($invoice->id);

En tu job, implementa ShouldQueue:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendInvoiceToAeatJob implements ShouldQueue
{
    // ...
}

Configura tu conexión de cola en .env y ejecuta el worker:

php artisan queue:work

Auditoría

Puedes usar paquetes como owen-it/laravel-auditing para auditar cambios en invoices:

  1. Instala el paquete:
    composer require owen-it/laravel-auditing
    
  2. Añade el contrato `\OwenIt\Auditing\Contracts\Auditable` a tu modelo:
    use OwenIt\Auditing\Contracts\Auditable;
    
    class Invoice extends Model implements Auditable
    {
        use \OwenIt\Auditing\Auditable;
        // ...
    }
    
  3. Ahora todos los cambios en invoices serán auditados automáticamente. Puedes ver los logs:
    $audits = $invoice->audits;
    

Testing

Ejecuta todos los tests unitarios:

php artisan test
# o
vendor/bin/phpunit

Contribuir

Las contribuciones son bienvenidas. Por favor:

  1. Fork el proyecto
  2. Crea una rama para tu feature
  3. Commit tus cambios
  4. Push a la rama
  5. Abre un Pull Request

Licencia

Este paquete es open-source bajo la Licencia MIT.

Soporte

  • Documentación técnica: https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/informacion-tecnica.html
  • Issues: https://github.com/squareetlabs/LaravelVerifactu/issues

Autores

Si este paquete te ha sido útil, Ħno olvides darle una estrella en GitHub!


  Files folder image Files (40)  
File Role Description
Files folder imageconfig (1 file)
Files folder imagedatabase (2 directories)
Files folder imagesrc (8 directories)
Files folder imagetests (1 file, 1 directory)
Accessible without login Plain text file .scrutinizer.yml Data Auxiliary data
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE.md Lic. License text
Accessible without login Plain text file README.md Doc. Documentation

  Files folder image Files (40)  /  config  
File Role Description
  Accessible without login Plain text file verifactu.php Aux. Configuration script

  Files folder image Files (40)  /  database  
File Role Description
Files folder imagefactories (1 directory)
Files folder imagemigrations (3 files)

  Files folder image Files (40)  /  database  /  factories  
File Role Description
Files folder imageSquareetlabs (1 directory)

  Files folder image Files (40)  /  database  /  factories  /  Squareetlabs  
File Role Description
Files folder imageVeriFactu (1 directory)

  Files folder image Files (40)  /  database  /  factories  /  Squareetlabs  /  VeriFactu  
File Role Description
Files folder imageModels (3 files)

  Files folder image Files (40)  /  database  /  factories  /  Squareetlabs  /  VeriFactu  /  Models  
File Role Description
  Plain text file BreakdownFactory.php Class Class source
  Plain text file InvoiceFactory.php Class Class source
  Plain text file RecipientFactory.php Class Class source

  Files folder image Files (40)  /  database  /  migrations  
File Role Description
  Plain text file 2024_01_01_000000_..._invoices_table.php Class Class source
  Plain text file 2024_01_01_000001_...reakdowns_table.php Class Class source
  Plain text file 2024_01_01_000002_...ecipients_table.php Class Class source

  Files folder image Files (40)  /  src  
File Role Description
Files folder imageEnums (5 files)
Files folder imageExceptions (1 file)
Files folder imageFacades (1 file)
Files folder imageHelpers (3 files)
Files folder imageHttp (2 directories)
Files folder imageModels (3 files)
Files folder imageProviders (1 file)
Files folder imageServices (1 file)

  Files folder image Files (40)  /  src  /  Enums  
File Role Description
  Accessible without login Plain text file ForeignIdType.php Aux. Configuration script
  Accessible without login Plain text file InvoiceType.php Aux. Configuration script
  Accessible without login Plain text file OperationType.php Aux. Configuration script
  Accessible without login Plain text file RegimeType.php Aux. Configuration script
  Accessible without login Plain text file TaxType.php Aux. Configuration script

  Files folder image Files (40)  /  src  /  Exceptions  
File Role Description
  Plain text file VeriFactuException.php Class Class source

  Files folder image Files (40)  /  src  /  Facades  
File Role Description
  Plain text file VeriFactu.php Class Class source

  Files folder image Files (40)  /  src  /  Helpers  
File Role Description
  Plain text file DateTimeHelper.php Class Class source
  Plain text file HashHelper.php Class Class source
  Plain text file StringHelper.php Class Class source

  Files folder image Files (40)  /  src  /  Http  
File Role Description
Files folder imageRequests (3 files)
Files folder imageResources (3 files)

  Files folder image Files (40)  /  src  /  Http  /  Requests  
File Role Description
  Plain text file StoreBreakdownRequest.php Class Class source
  Plain text file StoreInvoiceRequest.php Class Class source
  Plain text file StoreRecipientRequest.php Class Class source

  Files folder image Files (40)  /  src  /  Http  /  Resources  
File Role Description
  Plain text file BreakdownResource.php Class Class source
  Plain text file InvoiceResource.php Class Class source
  Plain text file RecipientResource.php Class Class source

  Files folder image Files (40)  /  src  /  Models  
File Role Description
  Plain text file Breakdown.php Class Class source
  Plain text file Invoice.php Class Class source
  Plain text file Recipient.php Class Class source

  Files folder image Files (40)  /  src  /  Providers  
File Role Description
  Plain text file VeriFactuServiceProvider.php Class Class source

  Files folder image Files (40)  /  src  /  Services  
File Role Description
  Plain text file AeatClient.php Class Class source

  Files folder image Files (40)  /  tests  
File Role Description
Files folder imageUnit (7 files)
  Plain text file TestCase.php Class Class source

  Files folder image Files (40)  /  tests  /  Unit  
File Role Description
  Plain text file AeatClientTest.php Class Class source
  Plain text file BreakdownModelTest.php Class Class source
  Plain text file DateTimeHelperTest.php Class Class source
  Plain text file HashHelperTest.php Class Class source
  Plain text file InvoiceModelTest.php Class Class source
  Plain text file RecipientModelTest.php Class Class source
  Plain text file StringHelperTest.php Class Class source

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads  
 100%
Total:0
This week:0