Mexico - CFDI Generation

l10n_mx_cfdi
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
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYAccounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Auge TEC
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, 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_catalogs
odoo/odoo:
    - base
    - product
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES facturama
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the configuration used by electronic invoicing and
payroll for Mexico:

- Integration with PAC for the issuance and stamping of documents.
- Management of different series for the issuers.
- Administration of different CFDI issuers for the same company.

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
action_l10n_mx_cfdi_service_form CFDI Service Settings l10n_mx_cfdi.cfdi_service form New
cfdi_id_data cfdi_id_data ir.ui.view qweb New
cfdi_issuer_data cfdi_issuer_data ir.ui.view qweb New
cfdi_payment_data cfdi_payment_data ir.ui.view qweb New
cfdi_receiver_data cfdi_receiver_data ir.ui.view qweb New
cfdi_related_documents cfdi_related_documents ir.ui.view qweb New
cfdi_signature_data cfdi_signature_data ir.ui.view qweb New
default_issuer_data default_issuer_data ir.ui.view qweb New
default_receiver_data default_receiver_data ir.ui.view qweb New
l10n_mx_cfdi_series_form_view Serie CFDI l10n_mx_cfdi.series form New
l10n_mx_cfdi_series_list_view Serie CFDI l10n_mx_cfdi.series list New
product_template_form_view_inherit Product Template: CFDI code and measurement unit fields product.template xpath Inherits product.product_template_form_view
view_cfdi_issuer CFDI Issuer l10n_mx_cfdi.issuer form New
view_l10n_mx_cfdi_document_form CFDI Form View l10n_mx_cfdi.document form New
view_l10n_mx_cfdi_document_list CFDI List View l10n_mx_cfdi.document list New
view_l10n_mx_cfdi_document_search CFDI Search View l10n_mx_cfdi.document search New
view_partner_form_inherit Partner: tax regime field res.partner xpath Inherits base.view_partner_form
Models touched (9)

New fields (6)
  • company_ids Many2many → res.company
    default=<expr> string='Companies' args: 'res.company'
  • name Char
    required=True
  • password Char
    groups='base.group_system' required=True
  • sandbox_mode Boolean
    default=False groups='base.group_system'
  • stamps_available Integer
    readonly=True string='Stamps available'
  • user Char
    groups='base.group_system' required=True
Public methods (9)
  • cancel_cfdi(self, cfdi_id: str, reason, uuid_replacement)
  • check_cfdi_status(self, uudi, issuer_rfc, receiver_rfc, amount_total)
  • create_cfdi(self, cfdi_data: dict)
  • get_cancellation_request_proof(self, cfdi_id: str)
  • get_cfdi_pdf(self, cfdi_id: str)
  • get_cfdi_xml(self, cfdi_id: str)
  • get_csd_status(self, rfc: str)
  • register_csd(self, rfc: str, cert_base64: bytes, key_base64: bytes, key_password: str)
  • unregister_csd(self, rfc)

New fields (7)
  • currency_id Many2one → res.currency
    default=<expr> readonly=True required=True string='Moneda' args: 'res.currency'
  • partner_id Many2one → res.partner
    default=<expr> ondelete='restrict' readonly=True required=True string='Contacto' args: 'res.partner'
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    ondelete='cascade' required=True string='Servicio' args: 'l10n_mx_cfdi.cfdi_service'
  • stamp_number Integer
    required=True string='Cantidad de Folios'
  • stamp_price Monetary
    currency_field='currency_id' required=True string='Precio por Folio'
  • topup_date Datetime
    default=fields.Datetime.now() string='Fecha de Adquisición'
  • total Monetary
    compute='_compute_total' currency_field='currency_id' store=True string='Precio Total'
Public methods (0)

No public methods.

New fields (35)
  • cancellation_request_proof_file Binary
    attachment=True readonly=True string='Acuse de solicitud de cancelación'
  • cancellation_request_proof_filename Char
    readonly=True string='Nombre del archivo de acuse de solicitud de cancelación'
  • cert_data_json Char
    readonly=True
  • cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado'
  • cfdi_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del CFDI'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • files_in_cache Boolean
    compute='_compute_download_files_if_needed' readonly=True store=False
  • folio Char
  • is_global_note Boolean
    default=False readonly=True string='Nota global'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] required=True string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • issuing_datetime Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de emisión'
  • 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'
  • name Char
    compute='_compute_name' readonly=True store=True string='Nombre'
  • original_string Char
    compute='_compute_load_json_data' readonly=True string='Cadena original'
  • pdf_file Binary
    attachment=True readonly=True string='Archivo PDF'
  • pdf_filename Char
    readonly=True string='Nombre del archivo PDF'
  • receiver_id Many2one → res.partner
    required=True string='Receptor' args: 'res.partner'
  • related_document_ids One2many → l10n_mx_cfdi.document_relation
    string='Documentos relacionados' args: 'l10n_mx_cfdi.document_relation', 'source_id'
  • rfc_prov_certif Char
    compute='_compute_load_json_data' readonly=True string='RFC del proveedor de certificación'
  • sat_cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado del SAT'
  • sat_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del SAT'
  • serie Char
  • signing_date Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de timbrado'
  • standalone Boolean
    compute='_compute_standalone' help='Si está marcado, el certificado no esta relacionado a otros documentos del sistema' store=True string='Independiente'
  • state Selection
    default='draft' readonly=True string='Estado' args: [('draft', 'Borrador'), ('pending', 'Pendiente'), ('published', 'Publicada'), ('pending_cancel', 'Cancelación pendiente'), ('canceled', 'Cancelada'), ('unknown', 'Desconocido')]
  • tax_codes Char
    compute='_compute_load_json_data' readonly=True string='Código de impuesto'
  • tracking_id Char
    readonly=True string='ID del documento en el API'
  • type Selection
    readonly=True args: [('I', 'Ingreso'), ('E', 'Egreso'), ('P', 'Pago'), ('T', 'Traslado')]
  • uuid Char
    help='UUID asignado por el SAT' readonly=True string='UUID'
  • verification_qr_code Binary
    compute='_compute_load_json_data' readonly=True string='Código QR de Verificación'
  • verification_url Char
    compute='_compute_load_json_data' readonly=True string='URL de verificación'
  • version Char
    default='4.0'
  • xml_file Binary
    attachment=True readonly=True string='Archivo XML'
  • xml_filename Char
    readonly=True string='Nombre del archivo XML'
Public methods (5)
  • action_cancel(self)
  • action_check_status(self)
  • action_get_cancellation_request_proof(self)
  • cancel(self, reason: str, replacement=None, simulate=False)
  • publish(self, cfdi_data)

New fields (3)
  • relation_type_id Many2one → l10n_mx_catalogs.c_tipo_relacion
    required=True args: 'l10n_mx_catalogs.c_tipo_relacion'
  • source_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
  • target_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
Public methods (0)

No public methods.

New fields (9)
  • certificate_file Binary
    groups='base.group_system'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • fiscal_name Char
    help='Razón Social del Emisor'
  • key_file Binary
    groups='base.group_system'
  • key_password Char
    groups='base.group_system' string='Password'
  • logo_url Char
    string='URL del logo'
  • partner_id Many2one → res.partner
    delegate=True ondelete='cascade' required=True args: 'res.partner'
  • registered Boolean
    store=True
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    args: 'l10n_mx_cfdi.cfdi_service'
Public methods (3)
  • default_get(self, fields_list)
    @api.model
  • register_issuer(self)
    Registers the certificate in the SAT
  • unregister_issuer(self)
    Unregisters the certificate in the SAT

New fields (1)
  • code Char
    copy=False
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (2)
  • l10n_mx_cfdi_product_code_id Many2one → l10n_mx_catalogs.c_clave_prod_serv
    string='Código de Producto' args: 'l10n_mx_catalogs.c_clave_prod_serv'
  • l10n_mx_cfdi_product_measurement_unit_id Many2one → l10n_mx_catalogs.c_clave_unidad
    string='Unidad de Medida' args: 'l10n_mx_catalogs.c_clave_unidad'
Public methods (0)

No public methods.

New fields (2)
  • l10n_mx_cfdi_auto Boolean
    default=True help='Enable to automatically sign CFDI when validating invoices.' args: 'Create CFDI on post'
  • l10n_mx_cfdi_enabled Boolean
    compute='_compute_l10n_mx_cfdi_enabled' help='Enable CFDI for this company.' args: 'Enable CFDI'
Public methods (0)

No public methods.

New fields (4)
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='CFDI Usage' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Payment Form' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    string='Payment Method' args: 'l10n_mx_catalogs.c_metodo_pago'
  • tax_regime Many2one → l10n_mx_catalogs.c_regimen_fiscal
    string='Fiscal Regime' args: 'l10n_mx_catalogs.c_regimen_fiscal'
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
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, Weblate, OCA-git-bot, oca-ci, Samuel Macias Oropeza (smo), Santiago Rodriguez
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_catalogs
odoo/odoo:
    - base
    - product
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES facturama
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the configuration used by electronic invoicing and
payroll for Mexico:

- Integration with PAC for the issuance and stamping of documents.
- Management of different series for the issuers.
- Administration of different CFDI issuers for the same company.

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
action_l10n_mx_cfdi_service_form Configuración del Servicio CFDI l10n_mx_cfdi.cfdi_service form New
cfdi_id_data cfdi_id_data ir.ui.view qweb New
cfdi_issuer_data cfdi_issuer_data ir.ui.view qweb New
cfdi_payment_data cfdi_payment_data ir.ui.view qweb New
cfdi_receiver_data cfdi_receiver_data ir.ui.view qweb New
cfdi_related_documents cfdi_related_documents ir.ui.view qweb New
cfdi_signature_data cfdi_signature_data ir.ui.view qweb New
default_issuer_data default_issuer_data ir.ui.view qweb New
default_receiver_data default_receiver_data ir.ui.view qweb New
l10n_mx_cfdi_series_form_view Serie CFDI l10n_mx_cfdi.series form New
l10n_mx_cfdi_series_list_view Serie CFDI l10n_mx_cfdi.series tree New
product_template_form_view_inherit Product Template: CFDI code and measurement unit fields product.template xpath Inherits product.product_template_form_view
view_cfdi_issuer Emisor de CFDIs l10n_mx_cfdi.issuer form New
view_l10n_mx_cfdi_document_form Documentos CFDI l10n_mx_cfdi.document form New
view_l10n_mx_cfdi_document_search Documentos CFDI l10n_mx_cfdi.document search New
view_l10n_mx_cfdi_document_tree Documentos CFDI l10n_mx_cfdi.document tree New
view_partner_form_inherit Partner: tax regime field res.partner xpath Inherits base.view_partner_form
Models touched (9)

New fields (9)
  • company_ids Many2many → res.company
    default=<expr> string='Compañías' args: 'res.company'
  • name Char
    required=True string='Nombre'
  • password Char
    groups='base.group_system' required=True
  • sandbox_mode Boolean
    default=False groups='base.group_system'
  • stamps_available Integer
    compute='_compute_stamps_available' readonly=True string='Folios Disponibles'
  • stamps_used Integer
    compute='_compute_stamps_used' readonly=True
  • topup_ids One2many → l10n_mx_cfdi.cfdi_service.topup
    string='Recargas' args: 'l10n_mx_cfdi.cfdi_service.topup', 'service_id'
  • usage_sequence_id Many2one → ir.sequence
    default=_create_usage_sequence ondelete='cascade' string='Secuencia de uso de Folios' args: 'ir.sequence'
  • user Char
    groups='base.group_system' required=True
Public methods (9)
  • cancel_cfdi(self, cfdi_id: str, reason, uuid_replacement)
  • check_cfdi_status(self, uudi, issuer_rfc, receiver_rfc, amount_total)
  • create_cfdi(self, cfdi_data: dict)
  • get_cancellation_request_proof(self, cfdi_id: str)
  • get_cfdi_pdf(self, cfdi_id: str)
  • get_cfdi_xml(self, cfdi_id: str)
  • get_csd_status(self, rfc: str)
  • register_csd(self, rfc: str, cert_base64: bytes, key_base64: bytes, key_password: str)
  • unregister_csd(self, rfc)

New fields (7)
  • currency_id Many2one → res.currency
    default=<expr> readonly=True required=True string='Moneda' args: 'res.currency'
  • partner_id Many2one → res.partner
    default=<expr> ondelete='restrict' readonly=True required=True string='Contacto' args: 'res.partner'
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    ondelete='cascade' required=True string='Servicio' args: 'l10n_mx_cfdi.cfdi_service'
  • stamp_number Integer
    required=True string='Cantidad de Folios'
  • stamp_price Monetary
    currency_field='currency_id' required=True string='Precio por Folio'
  • topup_date Datetime
    default=fields.Datetime.now() string='Fecha de Adquisición'
  • total Monetary
    compute='_compute_total' currency_field='currency_id' store=True string='Precio Total'
Public methods (0)

No public methods.

New fields (37)
  • cancellation_request_proof_file Binary
    attachment=True readonly=True string='Acuse de solicitud de cancelación'
  • cancellation_request_proof_filename Char
    readonly=True string='Nombre del archivo de acuse de solicitud de cancelación'
  • cert_data_json Char
    readonly=True
  • cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado'
  • cfdi_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del CFDI'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • files_in_cache Boolean
    compute='_compute_download_files_if_needed' readonly=True store=False
  • folio Char
  • is_global_note Boolean
    default=False readonly=True string='Nota global'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] required=True string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • issuing_datetime Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de emisión'
  • 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'
  • name Char
    compute='_compute_name' readonly=True store=True string='Nombre'
  • original_string Char
    compute='_compute_load_json_data' readonly=True string='Cadena original'
  • pdf_file Binary
    attachment=True readonly=True string='Archivo PDF'
  • pdf_filename Char
    readonly=True string='Nombre del archivo PDF'
  • receiver_id Many2one → res.partner
    required=True string='Receptor' args: 'res.partner'
  • related_document_ids One2many → l10n_mx_cfdi.document_relation
    string='Documentos relacionados' args: 'l10n_mx_cfdi.document_relation', 'source_id'
  • 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'
  • rfc_prov_certif Char
    compute='_compute_load_json_data' readonly=True string='RFC del proveedor de certificación'
  • sat_cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado del SAT'
  • sat_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del SAT'
  • serie Char
  • signing_date Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de timbrado'
  • standalone Boolean
    compute='_compute_standalone' help='Si está marcado, el certificado no esta relacionado a otros documentos del sistema' store=True string='Independiente'
  • state Selection
    default='draft' readonly=True string='Estado' args: [('draft', 'Borrador'), ('pending', 'Pendiente'), ('published', 'Publicada'), ('pending_cancel', 'Cancelación pendiente'), ('canceled', 'Cancelada'), ('unknown', 'Desconocido')]
  • tax_codes Char
    compute='_compute_load_json_data' readonly=True string='Código de impuesto'
  • tracking_id Char
    readonly=True string='ID del documento en el API'
  • type Selection
    readonly=True args: [('I', 'Ingreso'), ('E', 'Egreso'), ('P', 'Pago'), ('T', 'Traslado')]
  • uuid Char
    help='UUID asignado por el SAT' readonly=True string='UUID'
  • verification_qr_code Binary
    compute='_compute_load_json_data' readonly=True string='Código QR de Verificación'
  • verification_url Char
    compute='_compute_load_json_data' readonly=True string='URL de verificación'
  • version Char
    default='4.0'
  • xml_file Binary
    attachment=True readonly=True string='Archivo XML'
  • xml_filename Char
    readonly=True string='Nombre del archivo XML'
Public methods (8)
  • action_cancel(self)
  • action_check_status(self)
  • action_get_cancellation_request_proof(self)
  • cancel(self, reason: str, replacement=None, simulate=False)
  • create(self, vals_list)
  • download_files_if_needed(self)
  • get_sequence_for_cfdi_type(self, vals_list)
    @api.model
  • publish(self, cfdi_data)

New fields (3)
  • relation_type_id Many2one → l10n_mx_catalogs.c_tipo_relacion
    required=True args: 'l10n_mx_catalogs.c_tipo_relacion'
  • source_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
  • target_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
Public methods (0)

No public methods.

New fields (14)
  • certificate_file Binary
    groups='account.group_account_manager'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • fiscal_name Char
    help='Razón Social del Emisor'
  • invoice_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Ingresos' args: 'l10n_mx_cfdi.series'
  • key_file Binary
    groups='account.group_account_manager'
  • key_password Char
    groups='account.group_account_manager' string='Password'
  • logo_url Char
    string='URL del logo'
  • partner_id Many2one → res.partner
    delegate=True ondelete='cascade' required=True args: 'res.partner'
  • payment_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Pagos' args: 'l10n_mx_cfdi.series'
  • refund_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Egresos' args: 'l10n_mx_cfdi.series'
  • registered Boolean
    store=True
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    args: 'l10n_mx_cfdi.cfdi_service'
  • transfer_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Traslados' args: 'l10n_mx_cfdi.series'
  • use_origin_document_sequence Boolean
    help='Usar serie del documento de origen para los CFDI generados' string='Usar Serie de Origen'
Public methods (3)
  • default_get(self, fields_list)
    @api.model
  • register_issuer(self)
    Registers the certificate in the SAT
  • unregister_issuer(self)
    Unregisters the certificate in the SAT

New fields (1)
  • code Char
    copy=False
Public methods (1)
  • create(self, vals)
    @api.model

New fields (2)
  • l10n_mx_cfdi_product_code_id Many2one → l10n_mx_catalogs.c_clave_prod_serv
    string='Código de Producto' args: 'l10n_mx_catalogs.c_clave_prod_serv'
  • l10n_mx_cfdi_product_measurement_unit_id Many2one → l10n_mx_catalogs.c_clave_unidad
    string='Unidad de Medida' args: 'l10n_mx_catalogs.c_clave_unidad'
Public methods (0)

No public methods.

New fields (2)
  • l10n_mx_cfdi_auto Boolean
    default=True help='Enable to automatically sign CFDI when validating invoices.' args: 'Create CFDI on post'
  • l10n_mx_cfdi_enabled Boolean
    compute='_compute_l10n_mx_cfdi_enabled' help='Enable CFDI for this company.' args: 'Enable CFDI'
Public methods (0)

No public methods.

New fields (4)
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='CFDI Usage' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Payment Form' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    string='Payment Method' args: 'l10n_mx_catalogs.c_metodo_pago'
  • tax_regime Many2one → l10n_mx_catalogs.c_regimen_fiscal
    string='Fiscal Regime' args: 'l10n_mx_catalogs.c_regimen_fiscal'
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/15.0/l10n_mx_cfdi
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
COMMITTERSGitHub, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/l10n-mexico
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/l10n-mexico:
    - l10n_mx_catalogs
odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - l10n_mx
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES facturama
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (35)
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
action_l10n_mx_cfdi_service_form Configuración del Servicio CFDI l10n_mx_cfdi.cfdi_service form New
certificate_cancel_wizard_form Cancelar CFDI l10n_mx_cfdi.document_cancel form New
cfdi_id_data cfdi_id_data ir.ui.view qweb New
cfdi_invoice_generic_create_form Crear CFDI al Público en General l10n_mx_cfdi.generic_invoice_create form New
cfdi_issuer_data cfdi_issuer_data ir.ui.view qweb New
cfdi_payment_data cfdi_payment_data ir.ui.view qweb New
cfdi_receiver_data cfdi_receiver_data ir.ui.view qweb New
cfdi_related_documents cfdi_related_documents ir.ui.view qweb New
cfdi_signature_data cfdi_signature_data ir.ui.view qweb New
default_issuer_data default_issuer_data ir.ui.view qweb New
default_receiver_data default_receiver_data ir.ui.view qweb New
download_cfdi_files_wizard_form Descargar CFDIs l10n_mx_cfdi.download_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
l10n_mx_cfdi_series_form_view Serie CFDI l10n_mx_cfdi.series form New
l10n_mx_cfdi_series_list_view Serie CFDI l10n_mx_cfdi.series tree New
product_template_form_view_inherit Product Template: CFDI code and measurement unit fields product.template xpath Inherits product.product_template_form_view
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.invoice.send.no_print account.invoice.send div Inherits account.account_invoice_send_wizard_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_cfdi_issuer Emisor de CFDIs l10n_mx_cfdi.issuer form New
view_l10n_mx_cfdi_document_form Documentos CFDI l10n_mx_cfdi.document form New
view_l10n_mx_cfdi_document_search Documentos CFDI l10n_mx_cfdi.document search New
view_l10n_mx_cfdi_document_tree Documentos CFDI l10n_mx_cfdi.document tree New
view_partner_form_inherit Partner: tax regime field res.partner field Inherits base.view_partner_form
Models touched (18)

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 (4)
  • action_generate_cfdi(self)
  • cancel_payment_cfdi(self)
  • create_payment_cfdi(self)
    Create CFDI of type payment ('P') matching the invoice payments if they are required.
  • 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 (9)
  • company_ids Many2many → res.company
    default=<expr> string='Compañías' args: 'res.company'
  • name Char
    required=True string='Nombre'
  • password Char
    groups='base.group_system' required=True
  • sandbox_mode Boolean
    default=False groups='base.group_system'
  • stamps_available Integer
    compute='_compute_stamps_available' readonly=True string='Folios Disponibles'
  • stamps_used Integer
    compute='_compute_stamps_used' readonly=True
  • topup_ids One2many → l10n_mx_cfdi.cfdi_service.topup
    string='Recargas' args: 'l10n_mx_cfdi.cfdi_service.topup', 'service_id'
  • usage_sequence_id Many2one → ir.sequence
    default=_create_usage_sequence ondelete='cascade' string='Secuencia de uso de Folios' args: 'ir.sequence'
  • user Char
    groups='base.group_system' required=True
Public methods (9)
  • cancel_cfdi(self, cfdi_id: str, reason, uuid_replacement)
  • check_cfdi_status(self, uudi, issuer_rfc, receiver_rfc, amount_total)
  • create_cfdi(self, cfdi_data: dict)
  • get_cancellation_request_proof(self, cfdi_id: str)
  • get_cfdi_pdf(self, cfdi_id: str)
  • get_cfdi_xml(self, cfdi_id: str)
  • get_csd_status(self, rfc: str)
  • register_csd(self, rfc: str, cert_base64: bytes, key_base64: bytes, key_password: str)
  • unregister_csd(self, rfc)

New fields (7)
  • currency_id Many2one → res.currency
    default=<expr> readonly=True required=True string='Moneda' args: 'res.currency'
  • partner_id Many2one → res.partner
    default=<expr> ondelete='restrict' readonly=True required=True string='Contacto' args: 'res.partner'
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    ondelete='cascade' required=True string='Servicio' args: 'l10n_mx_cfdi.cfdi_service'
  • stamp_number Integer
    required=True string='Cantidad de Folios'
  • stamp_price Monetary
    currency_field='currency_id' required=True string='Precio por Folio'
  • topup_date Datetime
    default=fields.Datetime.now() string='Fecha de Adquisición'
  • total Monetary
    compute='_compute_total' currency_field='currency_id' store=True string='Precio Total'
Public methods (0)

No public methods.

New fields (37)
  • cancellation_request_proof_file Binary
    attachment=True readonly=True string='Acuse de solicitud de cancelación'
  • cancellation_request_proof_filename Char
    readonly=True string='Nombre del archivo de acuse de solicitud de cancelación'
  • cert_data_json Char
    readonly=True
  • cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado'
  • cfdi_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del CFDI'
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • files_in_cache Boolean
    compute='_compute_download_files_if_needed' readonly=True store=False
  • folio Char
  • is_global_note Boolean
    default=False readonly=True string='Nota global'
  • issuer_id Many2one → l10n_mx_cfdi.issuer
    domain=[('registered', '=', True)] required=True string='Emisor' args: 'l10n_mx_cfdi.issuer'
  • issuing_datetime Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de emisión'
  • 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'
  • name Char
    compute='_compute_name' readonly=True store=True string='Nombre'
  • original_string Char
    compute='_compute_load_json_data' readonly=True string='Cadena original'
  • pdf_file Binary
    attachment=True readonly=True string='Archivo PDF'
  • pdf_filename Char
    readonly=True string='Nombre del archivo PDF'
  • receiver_id Many2one → res.partner
    required=True string='Receptor' args: 'res.partner'
  • related_document_ids One2many → l10n_mx_cfdi.document_relation
    string='Documentos relacionados' args: 'l10n_mx_cfdi.document_relation', 'source_id'
  • 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'
  • rfc_prov_certif Char
    compute='_compute_load_json_data' readonly=True string='RFC del proveedor de certificación'
  • sat_cert_number Char
    compute='_compute_load_json_data' readonly=True string='Número de certificado del SAT'
  • sat_signature Char
    compute='_compute_load_json_data' readonly=True string='Firma del SAT'
  • serie Char
  • signing_date Datetime
    compute='_compute_load_json_data' readonly=True string='Fecha de timbrado'
  • standalone Boolean
    compute='_compute_standalone' help='Si está marcado, el certificado no esta relacionado a otros documentos del sistema' store=True string='Independiente'
  • state Selection
    default='draft' readonly=True string='Estado' args: [('draft', 'Borrador'), ('pending', 'Pendiente'), ('published', 'Publicada'), ('pending_cancel', 'Cancelación pendiente'), ('canceled', 'Cancelada'), ('unknown', 'Desconocido')]
  • tax_codes Char
    compute='_compute_load_json_data' readonly=True string='Código de impuesto'
  • tracking_id Char
    readonly=True string='ID del documento en el API'
  • type Selection
    readonly=True args: [('I', 'Ingreso'), ('E', 'Egreso'), ('P', 'Pago'), ('T', 'Traslado')]
  • uuid Char
    help='UUID asignado por el SAT' readonly=True string='UUID'
  • verification_qr_code Binary
    compute='_compute_load_json_data' readonly=True string='Código QR de Verificación'
  • verification_url Char
    compute='_compute_load_json_data' readonly=True string='URL de verificación'
  • version Char
    default='4.0'
  • xml_file Binary
    attachment=True readonly=True string='Archivo XML'
  • xml_filename Char
    readonly=True string='Nombre del archivo XML'
Public methods (7)
  • action_cancel(self)
  • action_check_status(self)
  • action_get_cancellation_request_proof(self)
  • cancel(self, reason: str, replacement=None, simulate=False)
  • create(self, vals_list)
  • get_sequence_for_cfdi_type(self, vals_list)
    @api.model
  • publish(self, cfdi_data)

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 (3)
  • relation_type_id Many2one → l10n_mx_catalogs.c_tipo_relacion
    required=True args: 'l10n_mx_catalogs.c_tipo_relacion'
  • source_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
  • target_id Many2one → l10n_mx_cfdi.document
    ondelete='cascade' required=True args: 'l10n_mx_cfdi.document'
Public methods (0)

No public methods.

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 (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 (14)
  • certificate_file Binary
    groups='account.group_account_manager'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • fiscal_name Char
    help='Razón Social del Emisor'
  • invoice_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Ingresos' args: 'l10n_mx_cfdi.series'
  • key_file Binary
    groups='account.group_account_manager'
  • key_password Char
    groups='account.group_account_manager' string='Password'
  • logo_url Char
    string='URL del logo'
  • partner_id Many2one → res.partner
    delegate=True ondelete='cascade' required=True args: 'res.partner'
  • payment_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Pagos' args: 'l10n_mx_cfdi.series'
  • refund_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Egresos' args: 'l10n_mx_cfdi.series'
  • registered Boolean
    store=True
  • service_id Many2one → l10n_mx_cfdi.cfdi_service
    args: 'l10n_mx_cfdi.cfdi_service'
  • transfer_sequence_id Many2one → l10n_mx_cfdi.series
    default=<expr> string='Serie Traslados' args: 'l10n_mx_cfdi.series'
  • use_origin_document_sequence Boolean
    help='Usar serie del documento de origen para los CFDI generados' string='Usar Serie de Origen'
Public methods (3)
  • default_get(self, fields_list)
    @api.model
  • register_issuer(self)
    Registers the certificate in the SAT
  • unregister_issuer(self)
    Unregisters the certificate in the SAT

New fields (1)
  • code Char
    copy=False
Public methods (1)
  • create(self, vals)
    @api.model

New fields (2)
  • l10n_mx_cfdi_product_code_id Many2one → l10n_mx_catalogs.c_clave_prod_serv
    string='Código de Producto' args: 'l10n_mx_catalogs.c_clave_prod_serv'
  • l10n_mx_cfdi_product_measurement_unit_id Many2one → l10n_mx_catalogs.c_clave_unidad
    string='Unidad de Medida' args: 'l10n_mx_catalogs.c_clave_unidad'
Public methods (0)

No public methods.

New fields (2)
  • l10n_mx_cfdi_auto Boolean
    default=True help='Enable to automatically sign CFDI when validating invoices.' args: 'Create CFDI on post'
  • l10n_mx_cfdi_enabled Boolean
    compute='_compute_l10n_mx_cfdi_enabled' help='Enable CFDI for this company.' args: 'Enable CFDI'
Public methods (0)

No public methods.

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.

New fields (4)
  • cfdi_use_id Many2one → l10n_mx_catalogs.c_uso_cfdi
    string='CFDI Usage' args: 'l10n_mx_catalogs.c_uso_cfdi'
  • payment_form_id Many2one → l10n_mx_catalogs.c_forma_pago
    string='Payment Form' args: 'l10n_mx_catalogs.c_forma_pago'
  • payment_method_id Many2one → l10n_mx_catalogs.c_metodo_pago
    string='Payment Method' args: 'l10n_mx_catalogs.c_metodo_pago'
  • tax_regime Many2one → l10n_mx_catalogs.c_regimen_fiscal
    string='Fiscal Regime' args: 'l10n_mx_catalogs.c_regimen_fiscal'
Public methods (0)

No public methods.