La finalidad de esta biblioteca es la generación, conservación y envío de registros relacionados con la emisión de facturas a la AEAT mediante un sistema VERI*FACTU.
En primer lugar se encuentran los ejemplos de la operativa básica más común. Después encontraremos causísticas más complejas...
Esperamos que esta documentación sea de utilidad, y agradeceremos profundamente cualquier tipo de colaboración o sugerencia.
Podéis dirigir cualquier duda o consulta a info@irenesolutions.com.
En este ejemplo calcularemos el hash de el registro de alta de verifactu que aparece en la documentación técnica.
// Creamos una instacia de la clase factura
var invoice = new Invoice()
{
InvoiceType = TipoFactura.F1,
InvoiceID = "12345678/G33",
InvoiceDate = new DateTime(2024, 1, 1),
SellerID = "89890001K",
TotalTaxOutput = 12.35m,
TotalAmount = 123.45m
};
// Obtenemos una instancia de la clase RegistroAlta a partir de
// la instancia del objeto de negocio Invoice
var registro = invoice.GetRegistroAlta();
// El registro no ha sido envíado, pero forzamos el valor de
// FechaHoraHusoGenRegistro para que coincida con el ejemplo de la AEAT
var fechaHoraHusoGenRegistro = new DateTime(2024, 1, 1, 19, 20, 30); //2024-01-01T19:20:30+01:00 en España peninsula
registro.FechaHoraHusoGenRegistro = XmlParser.GetXmlDateTimeIso8601(fechaHoraHusoGenRegistro);
// Obtenemos el valor de la huella
var hash = registro.GetHashOutput(); // 3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
2. Obtención de la «URL» de cotejo o remisión de información de la factura contenida en el código «QR»
En este ejemplo obtendremos la url para el servicio de validación de una factura de las especificaciones técnicas de la AEAT.
Note
En la documentación técnica de la AEAT el último carácter debería se '1' pero por error consta '4'.
// Creamos una instacia de la clase factura
var invoice = new Invoice()
{
InvoiceType = TipoFactura.F1,
InvoiceID = "12345678&G33",
InvoiceDate = new DateTime(2024, 1, 1),
SellerID = "89890001K",
TotalAmount = 241.1m
};
// Obtenemos una instancia de la clase RegistroAlta a partir de
// la instancia del objeto de negocio Invoice
var registro = invoice.GetRegistroAlta();
// Obtenemos la url de validación
var urlValidacion = registro.GetUrlValidate(); // https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?nif=89890001K&numserie=12345678%26G33&fecha=01-01-2024&importe=241.1
En este ejemplo obtendremos la imágen del QR de la url para el servicio de validación de una factura de las especificaciones técnicas de la AEAT, que hemos visto en el ejemplo anterior.
// Creamos una instacia de la clase factura
var invoice = new Invoice()
{
InvoiceType = TipoFactura.F1,
InvoiceID = "12345678&G33",
InvoiceDate = new DateTime(2024, 1, 1),
SellerID = "89890001K",
TotalAmount = 241.1m
};
// Obtenemos una instancia de la clase RegistroAlta a partir de
// la instancia del objeto de negocio Invoice
var registro = invoice.GetRegistroAlta();
// Obtenemos la imágen del QR
var bmQr = registro.GetValidateQr();
File.WriteAllBytes(@"C:\Users\usuario\Downloads\zz\ValidateQrSampe.bmp", bmQr);
El bitmap obtenido:
Url que consta en el QR:
Es este ejemplo iniciaremos la cadena de bloques de el vendedor ue figura en los ejemplos de la AEAT con NIF '89890001K'. Iniciaremos la cadena de bloques con el primer ejemplo y luego anñadiremos a la cadena el segundo ejemplo:
// Creamos una instacia de la clase factura (primera factura)
var invoiceFirst = new Invoice()
{
InvoiceType = TipoFactura.F1,
InvoiceID = "12345678/G33",
InvoiceDate = new DateTime(2024, 1, 1),
SellerID = "89890001K",
TotalTaxOutput = 12.35m,
TotalAmount = 123.45m
};
// Obtenemos una instancia de la clase RegistroAlta a partir de
// la instancia del objeto de negocio Invoice
var registroFirst = invoiceFirst.GetRegistroAlta();
// El registro no ha sido envíado, pero forzamos el valor de
// FechaHoraHusoGenRegistro para que coincida con el ejemplo de la AEAT
var fechaHoraHusoGenRegistro = new DateTime(2024, 1, 1, 19, 20, 30); //2024-01-01T19:20:30+01:00 en España peninsula
registroFirst.FechaHoraHusoGenRegistro = XmlParser.GetXmlDateTimeIso8601(fechaHoraHusoGenRegistro);
// Ahora obtenemos el controlador de la cadena de bloques del vendedor
var blockchain = Blockchain.GetInstance(invoiceFirst.SellerID);
// Añadimos el registro de alta
blockchain.Add(registroFirst);
// Creamos una instacia de la clase factura (primera segunda)
var invoiceSecond = new Invoice()
{
InvoiceType = TipoFactura.F1,
InvoiceID = "12345679/G34",
InvoiceDate = new DateTime(2024, 1, 1),
SellerID = "89890001K",
TotalTaxOutput = 12.35m,
TotalAmount = 123.45m
};
// Obtenemos una instancia de la clase RegistroAlta a partir de
// la instancia del objeto de negocio Invoice
var registroSecond = invoiceSecond.GetRegistroAlta();
// El registro no ha sido envíado, pero forzamos el valor de
// FechaHoraHusoGenRegistro para que coincida con el ejemplo de la AEAT
fechaHoraHusoGenRegistro = new DateTime(2024, 1, 1, 19, 20, 35); //2024-01-01T19:20:35+01:00 en España peninsula
registroSecond.FechaHoraHusoGenRegistro = XmlParser.GetXmlDateTimeIso8601(fechaHoraHusoGenRegistro);
// Añadimos el registro de alta
blockchain.Add(registroSecond);
Debug.Print($"La huella de la primera factura es: {registroFirst.GetHashOutput()}");
Debug.Print($"La huella de la segunda factura es: {registroSecond.GetHashOutput()}");