PHP code example of taiwanleaftea / tlt-verifactu

1. Go to this page and download the library: Download taiwanleaftea/tlt-verifactu library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

taiwanleaftea / tlt-verifactu example snippets


'mode' => env('VERIFACTU_MODE', VerifactuMode::ONLINE->value),

'registry_scope' => env('VERIFACTU_REGISTRY_SCOPE'),

'online_sign_records' => false,

'allow_representative_certificate' => false,

'enable_cancel_invoice_in_production' => env('VERIFACTU_ENABLE_CANCEL_INVOICE_IN_PRODUCTION', false),

$result = Verifactu::cancelInvoice(record: $invoice->verifactu_record_id);

use Taiwanleaftea\TltVerifactu\Support\Facades\VatValidator;

// Offline validation by format
echo VatValidator::formatValid('ES', 'B12345678');

// Online validation via the VIES service
$response = VatValidator::online('ES', 'B12345678');
if ($response->success) {
    // VAT number is present in the VIES database
    echo $response->valid;
    // Data returned from the VIES database (varies per country)
    echo $response->vatNumber;
    echo $response->countryCode;
    echo $response->requestDate;
    echo $response->name;
    echo $response->address;
} else {
    foreach ($response->errors as $error) {
        echo $error . PHP_EOL;
    }
}

use Illuminate\Support\Carbon;
use Taiwanleaftea\TltVerifactu\Classes\Certificate;
use Taiwanleaftea\TltVerifactu\Classes\LegalPerson;
use Taiwanleaftea\TltVerifactu\Classes\Recipient;
use Taiwanleaftea\TltVerifactu\Enums\EstadoRegistro;
use Taiwanleaftea\TltVerifactu\Enums\ExemptOperationType;
use Taiwanleaftea\TltVerifactu\Enums\IdType;
use Taiwanleaftea\TltVerifactu\Enums\InvoiceType;
use Taiwanleaftea\TltVerifactu\Enums\OperationQualificationType;
use Taiwanleaftea\TltVerifactu\Enums\RejectionStatus;
use Taiwanleaftea\TltVerifactu\Exceptions\CertificateException;
use Taiwanleaftea\TltVerifactu\Support\Facades\Verifactu;

$certificate = new Certificate('certificate.p12', 'password');
$issuer = new LegalPerson('XYZ SA', 'A12345678', 'ES', IdType::NIF);
$recipient = new Recipient('ABC SL', 'B12345678', 'ES', IdType::NIF);
Verifactu::config($certificate);

$previous = [
    'number' => '2025/1',
    'date' => Carbon::createFromFormat('Y-m-d', '2025-01-10'),
    'hash' => '8B709172FA124AC15D8F8570F941EBA70F99088628D4A59BF675627A7E250F15',
];

$invoice = [
    'number' => '2025/2',
    'date' => Carbon::createFromFormat('Y-m-d', '2025-01-12'),
    'description' => 'Invoice description',
    'type' => InvoiceType::STANDARD,
    'amount' => 121,
    'base' => 100,
    'vat' => 21,
    'rate' => 21,
];

try {
    $result = Verifactu::submitInvoice(
        issuer: $issuer,
        invoiceData: $invoice,
        options: [], // 'exempt_operation' => ExemptOperationType::E1
        operationQualificationType: OperationQualificationType::SUBJECT_DIRECT,
        previous: $previous, // or null for the first invoice
        recipient: $recipient,
    );
} catch (CertificateException $e) {
    $this->error($e->getMessage());
    exit();
}

echo $result->hash;
echo $result->json; // JSON response from the SOAP client

if ($result->success) {
    echo 'Success';
    echo $result->csv; // CSV code from AEAT
    echo $result->qrSVG; // QR code as SVG string
    echo $result->qrURI; // Fully qualified URI for further QR code generation
} else {
    if ($result->status == EstadoRegistro::ACCEPTED_ERRORES) {
        // Invoice was registered with errors
        echo $result->status->name;
        echo $result->csv;
    }

    echo 'Errors:' . PHP_EOL;
    foreach ($result->errors as $error) {
        echo $error;
    }
}

$invoice = [
    'number' => '2025/2',
    'date' => Carbon::createFromFormat('Y-m-d', '2025-01-12'),
    'description' => 'Invoice description',
    'type' => InvoiceType::STANDARD,
    'amount' => 176,
    'breakdown' => [
        ['rate' => 21, 'base' => 100, 'vat' => 21],
        ['rate' => 10, 'base' => 50, 'vat' => 5],
    ],
];

$result = Verifactu::submitSimplifiedInvoice(
    issuer: $issuer,
    invoiceData: [
        'number' => '2025/3',
        'date' => Carbon::createFromFormat('Y-m-d', '2025-01-12'),
        'description' => 'Simplified invoice description',
        'amount' => 12.10,
        'base' => 10,
        'vat' => 2.10,
        'rate' => 21,
    ],
    options: [],
    previous: $previous,
);

$result = Verifactu::subsanateInvoice(
    issuer: $issuer,
    recordId: $invoice->verifactu_record_id,
    invoiceData: $correctedInvoice,
    operationQualificationType: OperationQualificationType::SUBJECT_DIRECT,
    recipient: $recipient,
);

$result = Verifactu::submitInvoice(
    issuer: $issuer,
    invoiceData: $invoice,
    options: [
        'subsanacion' => true,
        'rechazo_previo' => RejectionStatus::NOT_IN_AEAT, // X
    ],
    previous: $previous,
    recipient: $recipient,
);

$result = Verifactu::submitRectificationInvoice(
    rectifiedRecordId: $originalResult->registryRecordId,
    invoiceData: ['number' => 'R-2026-001'],
);

$previousId = Verifactu::getPreviousRecordId(recordId: $invoice->verifactu_record_id);
$previousHash = Verifactu::getPreviousHash(recordId: $invoice->verifactu_record_id);
$previousRecord = Verifactu::getPreviousRecord(recordId: $invoice->verifactuRecord);

// Backward-compatible alias:
$previousId = Verifactu::getPreviousId(recordId: $invoice->verifactu_record_id);

$previousHash = Verifactu::getPreviousHash(
    issuerNif: 'A12345678',
    registryScope: 'main-backend',
);

'mode' => VerifactuMode::NO_VERIFACTU->value,

use Taiwanleaftea\TltVerifactu\Classes\Certificate;
use Taiwanleaftea\TltVerifactu\Support\Facades\Verifactu;

$certificate = new Certificate('certificate.p12', 'password');
Verifactu::config($certificate);

echo $result->request; // unsigned XML
echo $result->signedRequest; // XAdES-EPES signed XML
echo $result->registryRecordId;
echo $result->registryRecord?->id;

use Illuminate\Support\Carbon;
use Taiwanleaftea\TltVerifactu\Support\Facades\Verifactu;
use Taiwanleaftea\TltVerifactu\Exceptions\QRGeneratorException;

// Base64-encoded PNG
try {
    $qrcode = Verifactu::generateQrPNG(
        issuerNIF: 'A12345678',
        invoiceDate: Carbon::createFromFormat('Y-m-d', '2025-01-12'),
        number: '2025/2',
        totalAmount: '121.00',
    );
} catch (QRGeneratorException $e) {
    echo $e->getMessage();
}

// QR code in SVG format
$qrcode = Verifactu::generateQrSVG(
    issuerNIF: 'A12345678',
    invoiceDate: Carbon::createFromFormat('Y-m-d', '2025-01-12'),
    number: '2025/2',
    totalAmount: '121.00',
);
bash
php artisan vendor:publish --tag=tlt-verifactu --ansi --force
bash
php artisan migrate
bash
php artisan vendor:publish --tag=tlt-verifactu-migrations --ansi