OdooWiki OCA HUB

Comunicación VERI*FACTU

l10n_es_verifactu_oca folder_open OCA/l10n-spain open_in_new
Accounting/Localizations/EDI License: AGPL-3

Módulo para la presentación inmediata de la facturación.

auto_awesome What this module does

AI-generated from the code · Odoo 18.0

Connects Odoo invoicing to the Spanish VERI*FACTU tax system, sending sales invoices and refunds to the tax agency automatically and adding the required QR and hash chain to each invoice.

This module makes Odoo ready for the Spanish VERI*FACTU obligation for immediate invoice reporting. Once enabled on a company, sales invoices and refunds get a registration key, a tax key, a description and a hash that links each document to the previous one, and they are sent to the tax agency through a scheduled job.

Where it appears: - New VERI*FACTU settings on the company, on sales journals, on fiscal positions and on the tax agency. - Extra fields on invoices, including a refund specific type for article 80 cases. - A cancellation wizard and buttons to resend invoices that were rejected or accepted with errors. - A QR code and legal text on the printed invoice report. - Log screens for invoice entries, send responses and chaining records.

Business rules and automatic behaviour: - Sales journals of a VERI*FACTU company are forced into restricted hash mode and cannot be switched off. - Invoices are only eligible from the company start date, on sales journals, and when the fiscal position is active for the agency. - Posting an invoice checks the configuration and taxes; unmapped taxes or inconsistent taxes block the process. - Invoices already sent cannot be cancelled, reset to draft, or have their number or date changed. - A scheduled job sends pending entries in batches and creates activities when there are connection errors or incorrect responses.

It touches invoicing, journals, companies, partners, fiscal positions and the Spanish tax agency configuration.

Menus it adds

verifactu_chaining_menuverifactu_developer_menumenu_verifactu_invoice_entry_responsemenu_verifactu_mapmenu_verifactu_registration_keys
Models and fields (18)
  • res.company · extends an existing modelverifactu_test (VERI*FACTU test environment?), verifactu_enabled (VERI*FACTU enabled), verifactu_start_date (VERI*FACTU start date), verifactu_chaining_id (VERI*FACTU chaining), verifactu_description (VERI*FACTU description), verifactu_developer_id (VERI*FACTU developer)
  • res.partner · extends an existing modelverifactu_enabled (VERI*FACTU enabled)
  • account.move · new modelverifactu_refund_specific_type (VERI*FACTU refund specific type)
  • verifactu.map · new modelname (Model), date_to, date_from, map_lines (Lines)
  • account.journal · extends an existing modelverifactu_enabled (VERI*FACTU enabled), restrict_mode_hash_table, company_verifactu_enabled (VERI*FACTU company enabled), restrict_mode_hash_table_readonly
  • aeat.tax.agency · extends an existing modelverifactu_wsdl_out (VERI*FACTU WSDL), verifactu_qr_base_url (VERI*FACTU QR Base URL), verifactu_wsdl_out_test_address (VERI*FACTU Test Address), verifactu_qr_base_url_test_address (VERI*FACTU QR Base URL Test)
  • verifactu.mixin · new modelaeat_state, verifactu_qr (VERI*FACTU QR), verifactu_csv (VERI*FACTU CSV), verifactu_hash (VERI*FACTU hash), verifactu_qr_url (VERI*FACTU URL), verifactu_return (VERI*FACTU return), verifactu_enabled (VERI*FACTU enabled), verifactu_tax_key (VERI*FACTU tax key), verifactu_macrodata (VERI*FACTU macrodata?), verifactu_send_date (VERI*FACTU send date), verifactu_description (VERI*FACTU description), verifactu_hash_string (VERI*FACTU hash string), verifactu_refund_type (VERI*FACTU refund type), verifactu_cancel_reason (VERI*FACTU cancel reason), verifactu_registration_key (VERI*FACTU registration key), verifactu_invoice_entry_ids (VERI*FACTU invoice entries), verifactu_registration_date (VERI*FACTU registration date), verifactu_response_line_ids (VERI*FACTU response lines), last_verifactu_invoice_entry_id (VERI*FACTU last invoice entry), last_verifactu_response_line_id (VERI*FACTU response line), verifactu_registration_key_code (VERI*FACTU key code)
  • verifactu.chaining · new modelname, sif_id (SIF ID), installation_number, last_verifactu_invoice_entry_id (Last invoice entry)
  • verifactu.map.line · new modelcode, name, tax_xmlid_ids (Taxes templates), verifactu_map_id (Parent mapping)
  • verifactu.developer · new modelvat (Developer VAT), name (Developer Name), version, sif_name (SIF Name), file_name, responsibility_declaration
  • account.move.reversal · extends an existing model
  • account.chart.template · extends an existing model
  • account.fiscal.position · extends an existing modelverifactu_enabled, verifactu_tax_key (VERI*FACTU tax key), verifactu_registration_key (VERI*FACTU registration key)
  • verifactu.invoice.entry · new modelmodel, company_id (Company), entry_type, send_state, document_id (Document), send_attempt, document_hash, document_name, previous_hash (Previous Hash), aeat_json_data (AEAT JSON Data), last_error_code, response_line_ids (Responses), last_response_line_id (Last Response Line), verifactu_chaining_id (Chaining), previous_invoice_entry_id (Previous Invoice Entry)
  • verifactu.registration.key · new modelcode, name, verifactu_tax_key (VERI*FACTU tax key)
  • verifactu.cancel.invoice.wizard · new modelinvoice_id (Invoice), cancel_reason (Cancellation reason)
  • verifactu.invoice.entry.response · new modelname, header, response, invoice_data, date_response, verifactu_csv (VERI*FACTU CSV), activity_type_id (Activity Type), response_line_ids (Response lines)
  • verifactu.invoice.entry.response.line · new modelmodel, entry_id, response, error_code, send_state (VERI*FACTU send state), document_id (Document), document_name, verifactu_csv, is_cancellation (Is cancellation), entry_response_id

Text generated by AI (DeepSeek) from reading the Odoo 18.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub

Availability by version

Reviewed: 2026-11-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 5 confirmed, 4 with no information of 9 versions.

Sources · Odoo 15.0

Confirmed on 2026-11-03 in branch 15.0 of OCA/l10n-spain.

terminal Installation and usage

OCA documentation · Odoo 18.0

Para instalar esté módulo necesita:

  • Libreria Python Zeep, se puede instalar con el comando 'pip install zeep'
  • Libreria Python Requests, se puede instalar con el comando 'pip install requests'

Para configurar este módulo es necesario:

  • Acceder a Facturación/Contabilidad -\> Configuración -\> AEAT -\> Agencia Tributaria, podrás consultar las URLs del servicio SOAP de Hacienda. Estas URLs pueden cambiar según comunidades
  • El certificado enviado por la FMNT es en formato p12, este certificado no se puede usar directamente con Zeep. Accede a Facturación/Contabilidad -\> Configuración -\> AEAT -\> Certificados AEAT, y allí podrás: Subir el certificado p12 y extraer las claves públicas y privadas con el botón "Obtener claves"
  • Debes tener en cuenta que los certificados se alojan en una carpeta accesible por la instalación de Odoo.
  • Completar los datos de desarrollador y del encadenamiento a nivel de compañía en la pestaña de VERI*FACTU.

En caso de que la obtención de claves no funcione y uses Linux, cuentas con los siguientes comandos para tratar de solucionarlo:

  • Clave pública: "openssl pkcs12 -in Certificado.p12 -nokeys -out publicCert.crt -nodes"
  • Clave privada: "openssl pkcs12 -in Certificado.p12 -nocerts -out privateKey.pem -nodes"
  • Establecer en las posiciones fiscales la clave de impuestos y la clave de registro VERI*FACTU.
  • Para aplicar las claves ejecute el asistente de actualización del módulo accountchart_update.

Cuando se valida una factura, automáticamente genera el registro de envío para verifactu. Cada minuto se enviarán todos aquellos registros pendientes de enviar mediante un cron.

info

Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.