Mexico - CFDI - Account

l10n_mx_cfdi_account
REPOSITORY
REPOSITORYOCA/l10n-mexico
GIT
GIThttps://github.com/OCA/l10n-mexico.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/l10n-mexico/tree/19.0/l10n_mx_cfdi_account
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Alexis López Zubieta <alexis.lopez@augetec.com> (Auge TEC)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Alexis López Zubieta <alexis.lopez@augetec.com> (Auge TEC)
COMMITTERS
COMMITTERSMaxime Chambreuil, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/l10n-mexico
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/l10n-mexico:
    - l10n_mx_cfdi
    - l10n_mx_catalogs
odoo/odoo:
    - base
    - product
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - l10n_mx
    - account
    - onboarding
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES facturama
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides electronic invoicing for Mexico:

- Generation of electronic invoices compliant with the CFDI 4.0 standard.
- Customization of fiscal documents according to user needs.
- Centralized management of electronic invoices within Odoo.
- Tracking and recording of issued and received fiscal documents.

Code Analysis

Views touched (18)
XML IDNameModelTypeStatus
account_view_account_invoice_filter_cfdi account.invoice.filter.cfdi account.move filter Inherits account.view_account_invoice_filter
account_view_out_invoice_tree_cfdi account.out.invoice.tree.cfdi account.move xpath Inherits account.view_out_invoice_tree
certificate_cancel_wizard_form Cancelar CFDI l10n_mx_cfdi_account.document_cancel form New
cfdi_invoice_generic_create_form Crear CFDI al Público en General l10n_mx_cfdi_account.generic_invoice_create form New
download_cfdi_files_wizard_form Descargar CFDIs l10n_mx_cfdi_account.dl_cfdi_files_wizard form New
external_layout_bold external_layout_bold ir.ui.view qweb Inherits web.external_layout_bold
external_layout_boxed external_layout_boxed ir.ui.view qweb Inherits web.external_layout_boxed
external_layout_standard external_layout_standard ir.ui.view qweb Inherits web.external_layout_standard
external_layout_striped external_layout_striped ir.ui.view qweb Inherits web.external_layout_striped
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_invoice_document report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
report_invoice_with_payments report_invoice_with_payments ir.ui.view qweb Inherits account.report_invoice_with_payments
report_payment_receipt report_payment_receipt ir.ui.view qweb Inherits account.report_payment_receipt
report_payment_receipt_document_cfdi report_payment_receipt_document_cfdi ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.l10n.mx res.config.settings xpath Inherits l10n_mx.res_config_settings_view_form
view_account_payment_form_inherit Account Payment: Payment Form account.payment field Inherits account.view_account_payment_form
view_account_payment_register_form_inherit Account Move Payment: CFDI generation account.payment.register group Inherits account.view_account_payment_register_form
view_move_form account.move.view.form.inherit.cfdi.account account.move xpath Inherits account.view_move_form
Models touched (12)

New fields (14)
  • cfdi_data_in_attachments Boolean
    compute='_compute_cfdi_data_in_attachments' string='CFDI data in attachments'
  • cfdi_document_id Many2one → l10n_mx_cfdi.document
    compute='_compute_cfdi_document_id' copy=False readonly=True store=True string='CFDI' args: 'l10n_mx_cfdi.document'
  • cfdi_document_name Char
    readonly=True related='cfdi_document_id.name' store=True string='Folio CFDI'
  • cfdi_document_state Selection
    readonly=True related='cfdi_document_id.state' string='CFDI Status'
  • cfdi_posted Boolean
    compute='_compute_cfdi_posted' store=True string='CFDI Posted'
  • cfdi_required Boolean
    default=False string='Requiere CFDI'
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='Uso de CFDI' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • l10n_mx_cfdi_auto Boolean
    readonly=True related='company_id.l10n_mx_cfdi_auto' string='CFDI Automatico'
  • l10n_mx_cfdi_enabled Boolean
    readonly=True related='company_id.l10n_mx_cfdi_enabled' string='CFDI Habilitado'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Forma de pago' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    string='Método de pago' args: 'l10n_mx_catalogs.c_metodo_pago'
  • receiver_id Many2one → res.partner
    readonly=True string='Receptor' args: 'res.partner'
  • related_cert_ids Many2many → l10n_mx_cfdi.document
    copy=False readonly=True string='Documentos' args: 'l10n_mx_cfdi.document'
Public methods (11)
  • action_generate_cfdi(self)
  • action_load_from_attachment(self)
  • action_post(self)
    Override the action_post method to create the CFDI
  • button_draft(self)
  • create_invoice_cfdi(self)
    Create the CFDI
  • create_refund_cfdi(self)
    Create CFDI of type 'E' (Egreso).
  • default_get(self, field_names)
    @api.model
  • gater_invoice_cfdi_item_data(self, line)
    Gather the data for a CFDI item. :param line: The invoice line :return: The CFDI item data
  • gather_invoice_cfdi_items_data(self)
    Gather the data for the CFDI items
  • prepare_invoice_cfdi_total_taxes(self)
  • validate_invoice_items_for_cfdi_generation(self)

New fields (3)
  • cfdi_discount Monetary
    compute='_compute_cfdi_fields' store=True
  • cfdi_price_unit Monetary
    compute='_compute_cfdi_fields' store=True
  • cfdi_subtotal Monetary
    compute='_compute_cfdi_fields' store=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    Create Payments and Credit Note CFDI if required
  • unlink(self)
    Cancel related Payments CFDI if any

New fields (7)
  • cfdi_document_id Many2one → l10n_mx_cfdi.document
    compute='_compute_cfdi_document_id' copy=False readonly=True store=True string='CFDI' args: 'l10n_mx_cfdi.document'
  • cfdi_document_state Selection
    readonly=True related='cfdi_document_id.state' string='CFDI Status'
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='Uso de CFDI' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • l10n_mx_cfdi_auto Boolean
    readonly=True related='company_id.l10n_mx_cfdi_auto' string='CFDI Automatico'
  • l10n_mx_cfdi_enabled Boolean
    readonly=True related='company_id.l10n_mx_cfdi_enabled' string='CFDI Habilitado'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Forma de pago' args: 'l10n_mx_catalogs.c_forma_pago'
  • related_cert_ids Many2many → l10n_mx_cfdi.document
    copy=False readonly=True string='Documentos' args: 'l10n_mx_cfdi.document'
Public methods (4)
  • action_generate_cfdi(self)
  • cancel_payment_cfdi(self)
  • create_payment_cfdi(self)
    Create payment-type ('P') CFDI matching invoice payments if needed.
  • prepare_payment_cfdi(self)

New fields (1)
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    required=True string='Forma de Pago' args: 'l10n_mx_catalogs.c_forma_pago'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • extract_is_retention(self)
  • extract_l10n_mx_tax_code(self)

New fields (2)
  • related_invoice_id Many2one → account.move
    readonly=True string='Factura relacionada' args: 'account.move'
  • related_payment_id Many2one → account.payment
    readonly=True string='Pago relacionado' args: 'account.payment'
Public methods (3)
  • action_check_status(self)
  • create(self, vals_list)
  • download_files_if_needed(self)

New fields (3)
  • cfdi_document_ids Many2many → l10n_mx_cfdi.document
    relation='l10n_mx_cfdi_download_cfdi_files_wizard_rel' required=True string='CFDI Documents' args: 'l10n_mx_cfdi.document'
  • invoice_ids Many2many → account.move
    required=True string='Facturas' args: 'account.move'
  • zip_file Many2one → ir.attachment
    ondelete='cascade' readonly=True args: 'ir.attachment'
Public methods (2)
  • action_download_zip(self)
  • default_get(self, field_names)
    @api.model

New fields (7)
  • cancel_reason_id Many2one → l10n_mx_catalogs.c_motivo_cancelacion
    required=True string='Razón' args: 'l10n_mx_catalogs.c_motivo_cancelacion'
  • certificate_ids Many2many → l10n_mx_cfdi.document
    required=True string='Certificados' args: 'l10n_mx_cfdi.document'
  • related_invoices Many2many → account.move
    string='Facturas Relacionadas' args: 'account.move'
  • replacement_certificate_id Many2one → l10n_mx_cfdi.document
    string='Reemplazo' args: 'l10n_mx_cfdi.document'
  • requires_replacement Boolean
    compute='_compute_requires_replacement' store=False
  • simulate_operation Boolean
    default=False groups='base.group_system' help='Simulate the cancel operation without sending the request to the SAT'
  • single_cancel Boolean
    default=True
Public methods (2)
  • cancel_certificate(self)
  • default_get(self, field_names)
    @api.model

New fields (10)
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    readonly=True required=True string='Uso de CFDI' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • date Date
    default=fields.Date.context_today required=True string='Fecha'
  • fiscal_regime_id Many2one → l10n_mx_catalogs.c_regimen_fiscal
    compute='_compute_fiscal_regime_id' readonly=True required=True string='Régimen Fiscal' args: 'l10n_mx_catalogs.c_regimen_fiscal'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] required=True string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • meses_id Many2one → l10n_mx_catalogs.c_meses
    required=True string='Mes' args: 'l10n_mx_catalogs.c_meses'
  • move_ids Many2many → account.move
    required=True string='Facturas' args: 'account.move'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Forma de Pago' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    readonly=True string='Metodo de Pago' args: 'l10n_mx_catalogs.c_metodo_pago'
  • periodicity_id Many2one → l10n_mx_catalogs.c_periodicidad
    required=True string='Periodicity' args: 'l10n_mx_catalogs.c_periodicidad'
  • year Text
    required=True string='Año'
Public methods (2)
  • create_cfdi(self)
    Emit CFDI 'Al Público en General'
  • default_get(self, field_names)
    @api.model

New fields (1)
  • l10n_mx_cfdi_auto Boolean
    help='Enable to automatically sign CFDI when validating invoices.' readonly=False related='company_id.l10n_mx_cfdi_auto' args: 'Create CFDI on post'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/l10n-mexico
GIT
GIThttps://github.com/OCA/l10n-mexico.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/l10n-mexico/tree/17.0/l10n_mx_cfdi_account
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Alexis López Zubieta <alexis.lopez@augetec.com> (Auge TEC)
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Alexis López Zubieta <alexis.lopez@augetec.com> (Auge TEC)
COMMITTERS
COMMITTERSMaxime Chambreuil, GitHub, Jesús Alan Ramos Rodríguez, Weblate, OCA-git-bot, oca-ci, Samuel Macias Oropeza (smo)
WEBSITE
WEBSITEhttps://github.com/OCA/l10n-mexico
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/l10n-mexico:
    - l10n_mx_cfdi
    - l10n_mx_catalogs
odoo/odoo:
    - base
    - product
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - l10n_mx
    - account
    - onboarding
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES facturama
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides electronic invoicing for Mexico:

- Generation of electronic invoices compliant with the CFDI 4.0 standard.
- Customization of fiscal documents according to user needs.
- Centralized management of electronic invoices within Odoo.
- Tracking and recording of issued and received fiscal documents.

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
account_view_account_invoice_filter_cfdi account.invoice.filter.cfdi account.move filter Inherits account.view_account_invoice_filter
account_view_out_invoice_tree_cfdi account.out.invoice.tree.cfdi account.move xpath Inherits account.view_out_invoice_tree
certificate_cancel_wizard_form Cancelar CFDI l10n_mx_cfdi_account.document_cancel form New
cfdi_invoice_generic_create_form Crear CFDI al Público en General l10n_mx_cfdi_account.generic_invoice_create form New
download_cfdi_files_wizard_form Descargar CFDIs l10n_mx_cfdi_account.dl_cfdi_files_wizard form New
external_layout_bold external_layout_bold ir.ui.view qweb Inherits web.external_layout_bold
external_layout_boxed external_layout_boxed ir.ui.view qweb Inherits web.external_layout_boxed
external_layout_standard external_layout_standard ir.ui.view qweb Inherits web.external_layout_standard
external_layout_striped external_layout_striped ir.ui.view qweb Inherits web.external_layout_striped
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_invoice_document report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
report_invoice_with_payments report_invoice_with_payments ir.ui.view qweb Inherits account.report_invoice_with_payments
report_payment_receipt report_payment_receipt ir.ui.view qweb Inherits account.report_payment_receipt
report_payment_receipt_document_cfdi report_payment_receipt_document_cfdi ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.l10n.mx res.config.settings xpath Inherits l10n_mx.res_config_settings_view_form
view_account_invoice_send_wizard_form_inherit account.move.send.no_print account.move.send div Inherits account.account_move_send_form
view_account_payment_form_inherit Account Payment: Payment Form account.payment field Inherits account.view_account_payment_form
view_account_payment_register_form_inherit Account Move Payment: CFDI generation account.payment.register group Inherits account.view_account_payment_register_form
view_move_form account.move.view.form.inherit.cfdi.account account.move xpath Inherits account.view_move_form
Models touched (12)

New fields (14)
  • cfdi_data_in_attachments Boolean
    compute='_compute_cfdi_data_in_attachments' string='CFDI data in attachments'
  • cfdi_document_id Many2one → l10n_mx_cfdi.document
    compute='_compute_cfdi_document_id' copy=False readonly=True store=True string='CFDI' args: 'l10n_mx_cfdi.document'
  • cfdi_document_name Char
    readonly=True related='cfdi_document_id.name' store=True string='Folio CFDI'
  • cfdi_document_state Selection
    readonly=True related='cfdi_document_id.state' string='CFDI Status'
  • cfdi_posted Boolean
    compute='_compute_cfdi_posted' store=True string='Requiere CFDI'
  • cfdi_required Boolean
    default=False string='Requiere CFDI'
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='Uso de CFDI' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • l10n_mx_cfdi_auto Boolean
    readonly=True related='company_id.l10n_mx_cfdi_auto' string='CFDI Automatico'
  • l10n_mx_cfdi_enabled Boolean
    readonly=True related='company_id.l10n_mx_cfdi_enabled' string='CFDI Habilitado'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Forma de pago' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    string='Método de pago' args: 'l10n_mx_catalogs.c_metodo_pago'
  • receiver_id Many2one → res.partner
    readonly=True string='Receptor' args: 'res.partner'
  • related_cert_ids Many2many → l10n_mx_cfdi.document
    copy=False readonly=True string='Documentos' args: 'l10n_mx_cfdi.document'
Public methods (12)
  • action_generate_cfdi(self)
  • action_load_from_attachment(self)
  • action_post(self)
    Override the action_post method to create the CFDI
  • button_draft(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create_invoice_cfdi(self)
    Create the CFDI
  • create_refund_cfdi(self)
    Create CFDI of type 'E' (Egreso).
  • default_get(self, field_names)
    @api.model
  • gater_invoice_cfdi_item_data(self, line)
    Gather the data for a CFDI item. :param line: The invoice line :return: The CFDI item data
  • gather_invoice_cfdi_items_data(self)
    Gather the data for the CFDI items
  • prepare_invoice_cfdi_total_taxes(self)
  • validate_invoice_items_for_cfdi_generation(self)

New fields (3)
  • cfdi_discount Monetary
    compute='_compute_cfdi_fields' store=True
  • cfdi_price_unit Monetary
    compute='_compute_cfdi_fields' store=True
  • cfdi_subtotal Monetary
    compute='_compute_cfdi_fields' store=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    Create Payments and Credit Note CFDI if required
  • unlink(self)
    Cancel related Payments CFDI if any

New fields (0)

No new fields.

Public methods (4)
  • action_generate_cfdi(self)
  • cancel_payment_cfdi(self)
  • create_payment_cfdi(self)
    Create payment-type ('P') CFDI matching invoice payments if needed.
  • prepare_payment_cfdi(self)

New fields (1)
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    required=True string='Forma de Pago' args: 'l10n_mx_catalogs.c_forma_pago'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • extract_is_retention(self)
  • extract_l10n_mx_tax_code(self)

New fields (2)
  • related_invoice_id Many2one → account.move
    readonly=True string='Factura relacionada' args: 'account.move'
  • related_payment_id Many2one → account.payment
    readonly=True string='Pago relacionado' args: 'account.payment'
Public methods (2)
  • action_check_status(self)
  • create(self, vals_list)

New fields (3)
  • cfdi_document_ids Many2many → l10n_mx_cfdi.document
    relation='l10n_mx_cfdi_download_cfdi_files_wizard_rel' required=True string='CFDI Documents' args: 'l10n_mx_cfdi.document'
  • invoice_ids Many2many → account.move
    required=True string='Facturas' args: 'account.move'
  • zip_file Many2one → ir.attachment
    ondelete='cascade' readonly=True args: 'ir.attachment'
Public methods (2)
  • action_download_zip(self)
  • default_get(self, field_names)
    @api.model

New fields (7)
  • cancel_reason_id Many2one → l10n_mx_catalogs.c_motivo_cancelacion
    required=True string='Razón' args: 'l10n_mx_catalogs.c_motivo_cancelacion'
  • certificate_ids Many2many → l10n_mx_cfdi.document
    required=True string='Certificados' args: 'l10n_mx_cfdi.document'
  • related_invoices Many2many → account.move
    string='Facturas Relacionadas' args: 'account.move'
  • replacement_certificate_id Many2one → l10n_mx_cfdi.document
    string='Reemplazo' args: 'l10n_mx_cfdi.document'
  • requires_replacement Boolean
    compute='_compute_requires_replacement' store=False
  • simulate_operation Boolean
    default=False groups='base.group_system' help='Simulate the cancel operation without sending the request to the SAT'
  • single_cancel Boolean
    default=True
Public methods (2)
  • cancel_certificate(self)
  • default_get(self, field_names)
    @api.model

New fields (10)
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    readonly=True required=True string='Uso de CFDI' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • date Date
    default=fields.Date.context_today required=True string='Fecha'
  • fiscal_regime_id Many2one → l10n_mx_catalogs.c_regimen_fiscal
    compute='_compute_fiscal_regime_id' readonly=True required=True string='Régimen Fiscal' args: 'l10n_mx_catalogs.c_regimen_fiscal'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] required=True string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • meses_id Many2one → l10n_mx_catalogs.c_meses
    required=True string='Mes' args: 'l10n_mx_catalogs.c_meses'
  • move_ids Many2many → account.move
    required=True string='Facturas' args: 'account.move'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Forma de Pago' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    readonly=True string='Metodo de Pago' args: 'l10n_mx_catalogs.c_metodo_pago'
  • periodicity_id Many2one → l10n_mx_catalogs.c_periodicidad
    required=True string='Periodicity' args: 'l10n_mx_catalogs.c_periodicidad'
  • year Text
    required=True string='Año'
Public methods (2)
  • create_cfdi(self)
    Emit CFDI 'Al Público en General'
  • default_get(self, field_names)
    @api.model

New fields (1)
  • l10n_mx_cfdi_auto Boolean
    help='Enable to automatically sign CFDI when validating invoices.' readonly=False related='company_id.l10n_mx_cfdi_auto' args: 'Create CFDI on post'
Public methods (0)

No public methods.