verifactu-utils
v1.1.0
Published
Complete TypeScript implementation for Spanish VeriFactu tax compliance system
Maintainers
Readme
VeriFactu TypeScript
Complete TypeScript implementation for Spanish VeriFactu tax compliance system with AEAT integration.
Features
- ✅ Complete VeriFactu Implementation - Full support for Spanish tax invoice registration
- ✅ AEAT Integration - Direct communication with Spanish tax authority systems
- ✅ Blockchain Management - Invoice chaining and integrity validation
- ✅ XAdES-EPES Digital Signatures - Secure XML signing with certificates
- ✅ Enhanced Tax Calculations - Proper rounding and multi-rate support
- ✅ Rectifying Invoices - Complete support for corrective invoices
- ✅ Batch Processing - High-performance concurrent invoice submission
- ✅ International Support - EU VAT/VIES validation
- ✅ QR Code Generation - Compliant QR codes for invoice verification
- ✅ Comprehensive Error Handling - Structured error codes and recovery
- ✅ Metrics & Monitoring - Built-in performance tracking
- ✅ Production Ready - Enterprise-grade architecture
Quick Start
Installation
npm install
npm run buildBasic Usage
import { VeriFactu } from "./src";
// Initialize the system
const veriFactu = new VeriFactu({
environment: "test",
certificatePath: "path/to/certificate.pfx",
certificatePassword: "password",
signRecords: true,
});
// Create and register an invoice
const invoice = veriFactu.createInvoice({
number: "INV-001",
date: new Date(),
sellerId: "B12345678",
sellerName: "My Company SL",
buyerId: "B87654321",
buyerName: "Client Company SL",
items: [
{
taxScheme: "RegimenGeneral",
taxType: "S1",
taxRate: 21,
taxBase: 100,
taxAmount: 21,
},
],
});
const result = await veriFactu.registerInvoice(invoice);
console.log("Registration result:", result);Configuration
Create a configuration file or use environment variables:
const config = {
environment: "test", // or 'prod'
certificatePath: "./certificates/company.pfx",
certificatePassword: "your_certificate_password",
signRecords: true,
systemInfo: {
nombreSistemaInformatico: "MyERP",
idSistemaInformatico: "MYERP-001",
version: "1.0.0",
numeroInstalacion: "001",
usoSoloVerifactu: "S",
usoMultiOTI: "N",
multiplesOT: "N",
},
loggingEnabled: true,
};Project Structure
src/
├── index.ts # Main exports and CLI
├── core/ # Core business logic
│ ├── Invoice.ts # Invoice model and validation
│ ├── InvoiceEntry.ts # Invoice registration logic
│ ├── InvoiceCancellation.ts # Invoice cancellation
│ └── TaxCalculator.ts # Tax calculation utilities
├── models/ # Data models and interfaces
│ ├── types.ts # TypeScript interfaces
│ ├── enums.ts # Enumerations
│ └── errors.ts # Error handling
├── blockchain/ # Blockchain management
│ └── Blockchain.ts # Invoice chaining logic
├── aeat/ # AEAT integration
│ └── AEATClient.ts # API communication
├── xml/ # XML processing
│ ├── XmlGenerator.ts # XML generation
│ └── XmlSigner.ts # Digital signatures
├── validation/ # Validation logic
│ ├── NifValidator.ts # Spanish ID validation
│ └── ConfigValidator.ts # Configuration validation
├── utils/ # Utilities
│ ├── QRGenerator.ts # QR code generation
│ ├── Settings.ts # Configuration management
│ ├── Metrics.ts # Performance monitoring
│ └── helpers.ts # Helper functions
├── processing/ # Advanced processing
│ ├── BatchProcessor.ts # Batch operations
│ └── InvoiceQueue.ts # Queue management
├── examples/ # Usage examples
│ └── Examples.ts # Complete examples
└── testing/ # Testing utilities
└── TestDataGenerator.ts # Test data generationExamples
Basic Invoice Registration
npm run example:basicimport {
VeriFactu,
TipoFactura,
ClaveRegimen,
CalificacionOperacion,
} from "./src";
const invoice = new Invoice("INV-001", new Date(), "B72877814");
invoice.invoiceType = TipoFactura.F1;
invoice.sellerName = "WEFINZ GANDIA SL";
invoice.buyerID = "B44531218";
invoice.buyerName = "WEFINZ SOLUTIONS SL";
invoice.taxItems = [
{
taxScheme: ClaveRegimen.RegimenGeneral,
taxType: CalificacionOperacion.S1,
taxRate: 21,
taxBase: 100,
taxAmount: 21,
},
];
const entry = new InvoiceEntry(invoice);
await entry.save();Rectifying Invoice
const rectifyingInvoice = new Invoice("RECT-001", new Date(), "B72877814");
rectifyingInvoice.invoiceType = TipoFactura.R1;
rectifyingInvoice.rectifyingDetails = {
tipoRectificativa: TipoRectificativa.S,
facturasRectificadas: [
{
idEmisorFacturaRectificada: "B72877814",
numSerieFacturaRectificada: "ORIG-001",
fechaExpedicionFacturaRectificada: "15-11-2024",
},
],
};Batch Processing
npm run example:batchimport { EnhancedBatchProcessor, TestDataGenerator } from "./src";
const invoices = TestDataGenerator.generateTestBatch(50, "B72877814");
const stats = await EnhancedBatchProcessor.processBatch(invoices, {
maxConcurrent: 10,
validateBeforeSubmit: true,
});
console.log(`Processed ${stats.totalInvoices} invoices`);
console.log(
`Success rate: ${((stats.successfulInvoices / stats.totalInvoices) * 100).toFixed(2)}%`
);QR Code Generation
import { buildQrUrl, renderQrPng } from "./src";
const qrUrl = buildQrUrl({
nif: "B72877814",
numserie: "INV-001",
fecha: "15-11-2024",
importe: 121.0,
env: "test",
});
await renderQrPng(qrUrl, "./invoice-qr.png");API Reference
Core Classes
Invoice
Main invoice model with validation and tax calculations.
const invoice = new Invoice(number: string, date: Date, sellerId: string);
invoice.addTaxItem(taxItem: TaxItem);
const validation = await invoice.validate();InvoiceEntry
Handles invoice registration with AEAT.
const entry = new InvoiceEntry(invoice);
await entry.save();
console.log(entry.status, entry.csv);Blockchain
Manages invoice chaining and integrity.
const blockchain = Blockchain.Get(sellerId);
await blockchain.Add(registro);
const integrity = await blockchain.validateIntegrity();AEATClient
Communicates with Spanish tax authority.
const client = new AEATClient();
const response = await client.sendRegistroAlta(xmlString);Configuration
Settings
Global configuration management.
Settings.Current.environment = "test";
Settings.Current.certificatePath = "path/to/cert.pfx";
await Settings.Save();Utilities
NifValidator
Spanish tax ID validation.
const isValid = NifValidator.validateNif("12345678Z");
const isValidCif = NifValidator.validateCif("B12345678");TaxCalculator
Enhanced tax calculations.
const taxAmount = TaxCalculator.calculateTaxAmount(base, rate);
const validation = TaxCalculator.validateTaxRates(taxItems);Testing
Run the comprehensive self-test:
npm run selftestRun specific examples:
npm run example:basic
npm run example:batch
npm run example:completeConfiguration Options
| Option | Type | Description | Default |
| ----------------------- | --------------------------- | --------------------------- | -------- |
| environment | 'test' \| 'prod' | AEAT environment | 'test' |
| certificatePath | string | Path to PKCS#12 certificate | - |
| certificatePassword | string | Certificate password | - |
| signRecords | boolean | Enable XML signing | false |
| loggingEnabled | boolean | Enable console logging | false |
| skipNifAEATValidation | boolean | Skip NIF validation | false |
| impuesto | 'IVA' \| 'IGIC' \| 'IPSI' | Tax type | 'IVA' |
Error Handling
The system provides structured error handling:
try {
await invoiceEntry.save();
} catch (error) {
if (error instanceof VeriFactuError) {
console.log(`Error [${error.code}]: ${error.message}`);
// Handle specific error types
switch (error.code) {
case VeriFactuErrorCode.VALIDATION_ERROR:
// Handle validation errors
break;
case VeriFactuErrorCode.NETWORK_ERROR:
// Handle network errors
break;
}
}
}Production Deployment
- Certificate Setup: Obtain valid certificates from AEAT
- Environment Configuration: Set
environment: 'prod' - Logging: Enable comprehensive logging
- Monitoring: Use built-in metrics system
- Error Handling: Implement proper error recovery
- Backup: Ensure blockchain data is backed up
Environment Variables
VERIFACTU_ENVIRONMENT=prod
VERIFACTU_CERT_PATH=/path/to/production.pfx
VERIFACTU_CERT_PASSWORD=production_password
VERIFACTU_LOGGING=trueLicense
MIT License - see LICENSE file for details.
Support
For issues and questions:
- Check the examples in
/src/examples/ - Run self-tests to verify setup
- Review AEAT documentation
- Open GitHub issues for bugs
Contributing
- Fork the repository
- Create feature branch
- Add tests for new functionality
- Ensure all tests pass
- Submit pull request
Changelog
v1.0.0
- Initial release
- Complete VeriFactu implementation
- AEAT integration
- Blockchain management
- Digital signatures
- Batch processing
- International support
