documentation/content-rst/applications/finance/fiscal_localizations/mexico.rst
2025-02-27 18:56:07 +07:00

1105 lines
50 KiB
ReStructuredText
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

======
Mexico
======
.. _sat-catalog: http://omawww.sat.gob.mx/tramitesyservicios/Paginas/catalogos_emision_cfdi_
complemento_ce.htm
.. |SAT| replace:: :abbr:`SAT (Servicio de Administración Tributaria)`
.. |DIOT| replace:: :abbr:`DIOT (Declaración Informativa de Operaciones con Terceros)`
.. |PAC| replace:: :abbr:`PAC (Proveedor Autorizado de Certificación / Authorized Certification
Provider)`
.. |RFC| replace:: :abbr:`RFC (Registro Federal de Contribuyentes)`
.. |PPD| replace:: :abbr:`PPD (Pago en Parcialidades o Diferido/Payment in Installements or
Deferred)`
.. |PUE| replace:: :abbr:`PUE (Pago en una Sola Exhibición/Payment in a Single Exhibition)`
Webinars
========
A video on the Mexican localization is also available. This video covers how to implement this
localization from scratch, including how to set up the configurations, how to complete common
workflows, and provides an in-depth look at several specific use cases, as well.
- `Video webinar of a complete demo <https://www.youtube.com/watch?v=5cdogjm0GCI>`_.
Introduction
============
The Odoo Mexican localization modules allow for the signing of electronic invoices, according to the
specifications of the |SAT| for `version 4.0 of the CFDI <http://omawww.sat.gob.mx/
tramitesyservicios/Paginas/documentos/Anexo_20_Guia_de_llenado_CFDI.pdf>`_, a legal requirement, as
of January 1, 2022. These modules also add relevant accounting reports (such as: the |DIOT|,
enables foreign trade, and the creation of delivery guides).
.. note::
In order to electronically sign any documents in Odoo, ensure the *Sign* application is
installed.
.. seealso::
:doc:`Documentation on e-invoicing's legality and compliance in Mexico
<../accounting/customer_invoices/electronic_invoicing/mexico>`
Configuration
=============
Requirements
------------
It is necessary to meet the following requirements before configuring the Mexican localization
modules in Odoo:
.. _mx-requirements:
#. Be registered in the |SAT|, with a valid |RFC|.
#. Have a `Certificate of Digital Seal <https://www.gob.mx/sat/acciones-y-programas/
certificado-de-sello-digital>`_ (CSD).
#. Choose a PAC (Proveedor Autorizado de Certificación / Authorized Certification Provider).
Currently, Odoo works with the following |PAC|\s: `Solución Factible
<https://solucionfactible.com/>`_, `Quadrum (formerly Finkok) <https://cfdiquadrum.com.mx/>`_ and
`SW Sapien - Smarter Web <https://sw.com.mx/>`_.
#. Have knowledge and experience with billing, sales, and accounting in Odoo. This documentation
**only** contains the necessary information needed to use Odoo.
Installing modules
------------------
:ref:`Install <general/install>` the following modules to get all the features of the Mexican
localization. The :doc:`Accounting <../accounting>` and *Contacts* modules are required to be
installed for this configuration:
.. list-table::
:header-rows: 1
:widths: 25 25 50
* - Name
- Technical name
- Description
* - :guilabel:`Mexico - Accounting`
- `l10n_mx`
- The default :doc:`fiscal localization package <../fiscal_localizations>`, adds accounting
characteristics for the Mexican localization, such as: the most common taxes and the chart of
accounts based on `the SAT account grouping code
<https://www.gob.mx/cms/uploads/attachment/file/151586/codigo_agrupador.pdf>`_.
* - :guilabel:`EDI for Mexico`
- `l10n_mx_edi`
- Includes all the technical and functional requirements to generate and validate
:doc:`Electronics Documents <../accounting/customer_invoices/electronic_invoicing>` — based
on the technical documentation published by the |SAT|. This allows you to send invoices (with
or without addedums) and payment complements to the government.
* - :guilabel:`EDI v4.0 for Mexico`
- `l10n_mx_edi_40`
- Necessary to create XML documents with the correct specifications of the CFDI 4.0.
* - :guilabel:`Odoo Mexican Localization Reports`
- `l10n_mx_reports`
- Adapts reports for Mexico's Electronic Accounting: Chart of Accounts, Trial Balance, and
|DIOT|.
* - :guilabel:`Mexico - Localization Reports for Closing`
- `l10n_mx_reports_closing`
- Necessary to create the Closing Entry (Also known as the *month 13th move*).
* - :guilabel:`Odoo Mexican XML Polizas Export`
- `l10n_mx_xml_polizas`
- Allows the export of XML files of Journal Entries for a compulsory audit.
* - :guilabel:`Odoo Mexican XML Polizas Export Edi bridge`
- `l10n_mx_xml_polizas_edi`
- Complements the module `l10n_mx_xml_polizas`.
.. note::
When installing a database from scratch and selecting :guilabel:`Mexico` as the country, Odoo
automatically installs the following modules: :guilabel:`Mexico - Accounting`, :guilabel:`EDI for
Mexico`, and :guilabel:`EDI v4.0 for Mexico`.
The following modules are optional. It's recommended to install them *only* if meeting a specific
requirement. Make sure that they are needed for the business.
.. list-table::
:header-rows: 1
:widths: 25 25 50
* - Name
- Technical name
- Description
* - :guilabel:`EDI for Mexico (Advanced Features)`
- `l10n_mx_edi_extended`
- Adds the external trade complement to invoices: A legal requirement for selling products to
foreign countries.
* - :guilabel:`EDI v4.0 for Mexico (COMEX)`
- `l10n_mx_edi_extended_40`
- Adapts the module `l10n_mx_edi_extended` for CFDI 4.0.
* - :guilabel:`Mexico - Electronic Delivery Guide`
- `l10n_mx_edi_stock`
- Lets you create a *Carta Porte*: A bill of lading that proves to the government you are
sending goods between A & B with a signed electronic document.
* - :guilabel:`Electronic Delivery Guide for Mexico CFDI 4.0`
- `l10n_mx_edi_stock_40`
- Adapts the module `l10n_mx_edi_stock` for CFDI 4.0
* - :guilabel:`Odoo Mexico Localization for Stock/Landing`
- `l10n_mx_edi_landing`
- Allows managing customs numbers related to landed costs in electronic documents.
Configure your company
----------------------
After installing the correct modules, the next step is to verify that your company is configured
with the correct data. To do so, go to :menuselection:`Settings --> General Settings --> Companies`,
and select :guilabel:`Update Info` under your company name.
Enter the full :guilabel:`Address` in the resulting form, including: :guilabel:`ZIP` code,
:guilabel:`State`, :guilabel:`Country`, and |RFC| (:guilabel:`VAT` number).
According to the requirements of the CFDI 4.0, the name of the main company contact **must**
coincide with your business name registered in the |SAT|, without the legal entity abbreviation.
.. image:: mexico/mx-company-info.png
:alt: Main company contact requirements for a correct invoicing.
.. important::
From a legal point of view, a Mexican company **must** use the local currency (MXN). Therefore,
Odoo does not provide features to manage an alternative configuration. If you want to manage
another currency, let MXN be the default currency and use a :doc:`pricelist
<../../sales/sales/products_prices/prices/pricing>`, instead.
Next, go to :menuselection:`Settings --> Accounting --> Electronic Invoicing (MX) --> Fiscal
Regime`, then select the regime that applies to your company from the drop-down list, and click
:guilabel:`Save`.
.. image:: mexico/mx-fiscal-regime.png
:alt: Fiscal regime configuration in the Accounting settings.
.. tip::
If you want to test the Mexican localization, the company can be configured with a real address
within Mexico (including all fields), and add `EKU9003173C9` as the :guilabel:`VAT` and `ESCUELA
KEMPER URGATE` as the :guilabel:`Company Name`. For the :guilabel:`Fiscal Regime`, use
:guilabel:`General de Ley Personas Morales`.
Contacts
--------
To create a contact that can be invoiced, go to :menuselection:`Contacts --> Create`. Then, enter
the contact name, full :guilabel:`Address` including: :guilabel:`ZIP` code, :guilabel:`State`,
:guilabel:`Country`, and |RFC| (:guilabel:`VAT` number).
.. important::
As with your own company, all of your contacts needs to have their correct business name
registered in the |SAT|. This also applies to the :guilabel:`Fiscal Regime`, which needs to be
added in the :guilabel:`MX EDI` tab.
Taxes
-----
Some additional configurations for factor type and tax objects need to be added to the sales taxes
in order to properly sign invoices.
Factor type
~~~~~~~~~~~
The *Factor Type* field is pre-loaded in the default taxes. If new taxes are created, you need to
make sure to configure this field. To do so, go to :menuselection:`Accounting --> Configuration -->
Taxes`, then enable the :guilabel:`Factor Type` field in the :guilabel:`Advanced Options` tab for
all records, with the :guilabel:`Tax Type` set as :guilabel:`Sales`.
.. image:: mexico/mx-factor-type.png
:alt: Factor Type Sales tax type configuration.
.. tip::
Mexico manages two different kinds of 0% VAT to accommodate two scenarios:
- *0% VAT* set the :guilabel:`Factor Type` as :guilabel:`Tasa`
- *VAT Exempt* set the :guilabel:`Factor Type` as :guilabel:`Exento`
Tax object
~~~~~~~~~~
One requirement of the CFDI 4.0 is that the resulting XML file needs (or does not need) to break
down the taxes of the operation. There are three different possible values that are added in the XML
file:
- `01`: Not subject to tax - this value is added automatically if your invoice line doesn't contain
any taxes.
- `02`: Subject to tax - this is the default configuration of any invoice line that contains taxes.
- `03`: Subject to tax and not forced to break down - this value can be triggered on-demand for
certain customers to replace the value 02.
To use the `03` value, navigate to :menuselection:`Contacts --> your customer's invoice --> MX EDI
tab`, and activate the :guilabel:`No Tax Breakdown` checkbox.
.. image:: mexico/mx-tax-breakdown.png
:alt: No Tax Breakdown option on the MX EDI tab of the customer's invoice.
.. important::
The :guilabel:`No Tax Breakdown` value applies **only** to specific fiscal regimes and/or taxes.
Consult your accountant first to see if it is needed for your business before making any
modification.
Other tax configurations
~~~~~~~~~~~~~~~~~~~~~~~~
When registering a payment, Odoo will carry out the movement of taxes from the *Cash Basis
Transition Account* to the account set in the :guilabel:`Definition` tab. For such movement, a tax
base account will be used: (`Base Imponible de Impuestos en Base a Flujo de Efectivo`) in the
journal entry when reclassifying taxes. **Do not delete this account**.
If you create a new tax in :menuselection:`Accounting --> Configuration --> Taxes`, you need to add
the correct :guilabel:`Tax Grids` for it (`IVA`, `ISR` or `IEPS`). Odoo **only** supports these
three groups of taxes.
.. image:: mexico/mx-taxes-config.png
:alt: Tax accounts available for Odoo.
Products
--------
To configure products, go to :menuselection:`Accounting --> Customers --> Products`, then select a
product to configure, or :guilabel:`Create` a new one. In the :guilabel:`Accounting` tab, and in the
:guilabel:`UNSPSC Product Category` field, select the category that represents the product. The
process can be done manually, or through :doc:`a bulk import <../../essentials/export_import_data>`.
.. note::
All products need to have an |SAT| code associated with them in order to prevent validation
errors.
Electronic invoicing
--------------------
PAC credentials
~~~~~~~~~~~~~~~
After you have processed your `Private Key (CSD)
<https://www.sat.gob.mx/aplicacion/16660/genera-y-descarga-tus-archivos-a-traves-de-la-aplicacion-
certifica>`_ with the |SAT|, you **must** register directly with the :ref:`PAC <mx-requirements>` of
your choice before you start creating invoices from Odoo.
Once you've created your account with any of these providers, go to :menuselection:`Settings -->
Accounting --> Electronic Invoicing (MX)`. Under the :guilabel:`MX PAC` section, enter the name of
your |PAC| with your credentials (:guilabel:`PAC username` and :guilabel:`PAC password`).
.. image:: mexico/mx-pac-account.png
:alt: Configuring PAC credentials from the Accounting settings.
.. tip::
If you do not have credentials, but want to test the electronic invoicing, you can activate the
:guilabel:`MX PAC test environment` checkbox, and select :guilabel:`Solucion Factible` as the
|PAC|. You do not need to add a username or password for a test environment.
.cer and .key certificates
~~~~~~~~~~~~~~~~~~~~~~~~~~
The `digital certificates of the company
<https://www.gob.mx/tramites/ficha/certificado-de-sello-digital/SAT139>`_ must be uploaded within
the :guilabel:`MX Certificates` section. To do so, navigate to :menuselection:`Settings -->
Accounting --> Electronic Invoicing (MX)`. Under the :guilabel:`MX Certificates` section, select
:guilabel:`Add a line`, and a window will open. Click :guilabel:`Create`, and from there, upload
your digital :guilabel:`Certificate` (:file:`.cer` file), your :guilabel:`Certificate Key`
(:file:`.key` file), and your :guilabel:`Certificate Password`. To finish, click on :guilabel:`Save
& Close`.
.. image:: mexico/mx-certificates.png
:alt: Certificate and key upload inputs.
.. tip::
If you still do not have one of the contracted |PAC|\s and you want to test electronic invoicing,
you can use the following |SAT| test certificates:
- :download:`Certificate <mexico/certificate.cer>`
- :download:`Certificate Key <mexico/certificate.key>`
- **Password**: ``12345678a``
Workflows
=========
Electronic invoicing
--------------------
The invoicing process in Odoo is based on `Annex 20
<http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm>`_ version 4.0 of electronic
invoicing of the |SAT|.
Customer invoices
~~~~~~~~~~~~~~~~~
To start invoicing from Odoo, a customer invoice must be created using the :doc:`standard invoicing
flow <../accounting/customer_invoices>`.
While the document is in draft mode, changes can be made to it (the correct :guilabel:`Payment Way`
or :guilabel:`Usage` that the customer might require can be added, for example.)
After you :guilabel:`Confirm` the customer invoice, a blue message appears stating: :guilabel:`The
invoice will be processed asynchronously by the following E-invoicing service: CFDI (4.0)`.
Pressing the :guilabel:`Process Now` button sends the document to the government so it can be
signed. After receiving the signed document back from the government, the :guilabel:`Fiscal Folio`
field appears on the document, and the XML file is attached in the chatter.
.. tip::
If you click :guilabel:`Retry` in the :guilabel:`SAT status` field on the invoice, you can
confirm if the XML file is valid in the |SAT|.
If you are in a testing environment, you will always receive the message :guilabel:`Not Found`.
To send the signed invoice to your client by mail, you can send both the XML and PDF files together,
directly from Odoo, by clicking the :guilabel:`Send & Print` button. You can also download the PDF
file to your computer, by clicking the :guilabel:`Print` button, and selecting the desired print
option.
Credit notes
~~~~~~~~~~~~
While an invoice is a document type "I" (Ingreso), a credit note is a document type "E" (Egreso).
The only addition to the :doc:`standard flow for credit notes
<../accounting/customer_invoices/credit_notes>` is that, as a requirement of the |SAT|, there has
to be a relation between a credit note and an invoice through the fiscal folio.
Because of this requirement, the field :guilabel:`CFDI Origin` adds this relation with a `01|`,
followed by the fiscal folio of the original invoice.
.. image:: mexico/mx-creating-credit-note.png
:alt: Example CFDI Origin number.
.. tip::
For the :guilabel:`CFDI Origin` field to be automatically added, use the :guilabel:`Add Credit
Note` button from the invoice, instead of creating it manually.
Payment complements
~~~~~~~~~~~~~~~~~~~
Payment policy
**************
One addition of the Mexican localization is the :guilabel:`Payment Policy` field. According to
the SAT documentation, there are two types of payments:
- `PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition)
- `PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred)
.. seealso::
:doc:`../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs`
The difference lies in the *Due Date* or *Payment Terms* of the invoice.
To configure |PUE| invoices, navigate to :menuselection:`Accounting --> Customers --> Invoices`,
and either select an invoice :guilabel:`Due Date` within the same month, or choose a payment term
that does not imply changing the due month (immediate payment, 15 days, 21 days, all falling within
the current month).
.. image:: mexico/mx-pue-payment.png
:alt: Example of an invoice with the PUE requirements.
.. tip::
Some :guilabel:`Payment Terms` are already installed by default, and can be managed from
:menuselection:`Accounting --> Configuration --> Payment Terms`.
To configure |PPD| invoices, navigate to :menuselection:`Accounting --> Customers --> Invoices`, and
select an invoice with a :guilabel:`Due Date` after the first day of the following month. This also
applies if your :guilabel:`Payment Term` is due in the following month.
.. image:: mexico/mx-ppd-payment.png
:alt: Example of an invoice with the PPD requirements.
.. important::
Because the |PPD| policy implies that an invoice is not going to get paid at the moment, the
correct :guilabel:`Payment Way` for the |PPD| invoices is :guilabel:`99 - Por Definir` (To
define).
Payment flow
************
In both cases, the payment process in Odoo :doc:`is the same <../accounting/customer_invoices>`, the
main difference being payments related to |PPD| invoices trigger the creation of a document type "P"
(Pago).
If a payment is related to a |PUE| invoice, it can be registered with the wizard, and be associated
with the corresponding invoice. To do so, navigate to :menuselection:`Accounting --> Customers -->
Invoices`, and select an invoice. Then, click the :guilabel:`Register Payment` button. The invoice
status changes to :guilabel:`In Payment`, since the payment is effectively validated when it is bank
reconciled.
.. seealso::
:doc:`../accounting/bank/reconciliation`
While this process is the same for PPD invoices, the addition of the creating an :doc:`electronic
document <../accounting/customer_invoices/electronic_invoicing>` means some additional requirements
are needed to correctly send the document to the |SAT|.
From an invoice, you need to confirm the specific :guilabel:`Payment Way` where you received the
payment. Because of this, the :guilabel:`Payment Way` field **cannot** be set as `99 - Por Definir
(To Define)`.
If you are going to add a bank account number in the :guilabel:`Accounting` tab of a customer's
contact card, it must have a valid account number.
.. note::
The exact configurations are in the `Anexo 20 of the SAT
<http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm>`_. Usually, the
:guilabel:`Bank Account` needs to be 10 or 18 digits for transfers, 16 for credit or debit cards.
If a payment is related to a signed invoice with the :guilabel:`Payment Policy` `PPD`, Odoo
generates the corresponding payment complement automatically, once you click :guilabel:`Process
Now`.
.. image:: mexico/mx-signed-complement.png
:alt: CFDI (4.0) E-invoicing service process payment now message.
.. warning::
A payment in MXN **cannot** be used to pay multiple invoices in USD. Instead, the payment should
be separated into multiple payments, using the :guilabel:`Register Payment` button on the
corresponding invoices.
Invoice cancellations
~~~~~~~~~~~~~~~~~~~~~
It is possible to cancel the EDI documents sent to the |SAT|. According to the `Reforma Fiscal 2022
<https://www.sat.gob.mx/consultas/91447/nuevo-esquema-de-cancelacion>`_, since January 1st, 2022,
there are two requirements for this:
- With all cancellation requests, you **must** specify a *cancellation reason*.
- After 24 hours have passed since the creation of the invoice, the client **must** be asked to
accept the cancellation.
There are four different cancellation reasons. In Odoo, you can cancel invoices with the reasons *01
Invoices sent with errors with a relation*, and *02 Invoices sent with errors without a relation*.
The following sections break down the process of cancelling invoices for each cancellation reason in
Odoo.
.. important::
Odoo has certain limitations to cancelling invoices in the |SAT|: The reasons 03 and 04
(*Operation did not take place* and *Nominative transactions related to a global invoice*,
respectively) are not currently supported by Odoo. For this, you need to cancel the invoice
directly in the |SAT|, and press :guilabel:`Retry` in the :guilabel:`SAT Status field`.
01 - invoices sent with errors with a relation
**********************************************
This cancellation reason must be used when a new invoice needs to substitute the original one, due
to an error in any field.
Begin by navigating to :menuselection:`Accounting --> Customers --> Invoices`, and select the old
invoice. Copy the :guilabel:`Fiscal Folio` from the old invoice. Then, navigate to the new invoice,
and in the :guilabel:`CFDI Origin` field, add the value `04|` and paste the :guilabel:`Fiscal Folio`
of the old invoice after the value. Finally, sign the new document.
Next, navigate back to the old invoice, and notice the :guilabel:`Substituted By` field is now
available. Click the :guilabel:`Request EDI Cancellation` button on the old invoice, and then click
:guilabel:`Process Now` in the blue section that appears. The invoice status changes to
:guilabel:`Cancelled`, and a confirmation is logged in the chatter.
Now, the invoice should be cancelled in the |SAT| as well. You can confirm this was done correctly,
by pressing :guilabel:`Retry` in the |SAT| status field.
If the document was cancelled more than 24 hours after its creation, you may need to ask the client
to accept the cancellation in their “Buzón Tributario” directly from the `SAT website
<https://www.sat.gob.mx/home>`_.
.. note::
The `04|` is only a code that helps Odoo to perform this process. It has no relation to the
method 04 reason for cancellation.
.. image:: mexico/mx-01-invoice-cancellation-substitute.png
:alt: Old invoice with CFDI Origin.
.. image:: mexico/mx-01-invoice-cancellation.png
:alt: Invoice with the Substituted By field referencing the CFDI Origin invoice.
02 - invoices sent with errors without a relation
*************************************************
This cancellation reason has to be used when an invoice was sent with an error in any field, and
does not need to be replaced by another one.
For this case, navigate to :menuselection:`Accounting --> Customers --> Invoices`, and select the
old invoice. From here, the only requirement is to click the :guilabel:`Request EDI Cancellation`
button, and then click the :guilabel:`Process Now` button.
Because the field :guilabel:`Substituted By` does not appear when using this cancellation reason,
the |SAT| should automatically detect that the cancellation reason is 02.
Payment cancellations
*********************
It is also possible to cancel *Payment Complements*. For this, go to the payment, via
:menuselection:`Accounting --> Customers --> Payments`, and select :guilabel:`Request EDI
Cancellation`. As with invoices, a blue button will appear. Click :guilabel:`Process now`, and the
document will be sent to the |SAT|. After a few seconds, you can click :guilabel:`Retry` to confirm
the current |SAT| status.
Finally, the payment status is moved to :guilabel:`Cancelled`.
.. note::
Just like invoices, when you create a new *Payment Complement*, you can add the relation of the
original document, by adding a `04|` plus the fiscal folio in the :guilabel:`CFDI Origin` field.
Invoicing special use cases
~~~~~~~~~~~~~~~~~~~~~~~~~~~
CFDI to public
**************
If the customer you are selling goods or services to does not require an invoice, a *CFDI to Public*
has to be created.
If you use the :guilabel:`Customer` name `PUBLICO EN GENERAL`, an error will be triggered. This is a
main change in the CFDI 4.0 that requires invoices with that specific name to need additional
fields, which Odoo does not currently support. So, for a *CFDI to Public* to be created, you need to
add any name to your customer that is **not** `PUBLICO EN GENERAL`. (For example: `CLIENTE FINAL`).
In addition to this, it is required that the :guilabel:`ZIP` code of your company is added, the
generic |RFC| is set as `XAXX010101000`, and the :guilabel:`Fiscal Regime` of your customer must be
set as: `Sin obligaciones fiscales`.
.. image:: mexico/mx-cfdi-to-public.png
:alt: CFDI to Public Customer field configuration.
Multicurrency
*************
The main currency in Mexico is MXN. While this is mandatory for all Mexican companies, it is
possible to send and receive invoices (and payments) in different currencies. To enable the use of
:doc:`multicurrency <../accounting/get_started/multi_currency>`, navigate to the
:menuselection:`Accounting --> Settings --> Currencies`, and set :guilabel:`Mexican Bank` as the
:guilabel:`Service` in the :guilabel:`Automatic Currency Rates` section. Then, set the
:guilabel:`Interval` field to the frequency you wish to update the exchange rates.
This way, the XML file of the document will have the correct exchange rate, and the total amount,
in both the foreign currency and in MXN.
It is highly recommended to use :doc:`a bank account for each currency
<../accounting/bank/foreign_currency>`.
.. note::
The only currencies that automatically update their exchange rate daily are: USD, EUR, GBP, and
JPY.
.. image:: mexico/mx-multicurrency-1.png
:alt: Multi-currency configuration in the Accounting settings.
Down payments
*************
There can be cases where you receive a payment in advance from a customer that needs to be applied
to an invoice later. In order to do this in Odoo, it is required to properly link invoices to each
other with the :guilabel:`CFDI Origin` field. To do so, it is necessary to have the :doc:`Sales
<../../sales>` app installed.
.. seealso::
`The official documentation for registration of down payments in Mexico
<http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Caso_uso_Anticipo.pdf>`_.
First, navigate to the :menuselection:`Sales` app to create a product `Anticipo` and configure it.
The :guilabel:`Product Type` must be :guilabel:`Service`, and use the :guilabel:`UNSPSC Category`
must be: `84111506 Servicios de facturación`.
Then, go to :menuselection:`Sales --> Settings --> Invoicing --> Down Payments`, and add the
*Anticipo* product as the default.
Create a sales order with the total amount, and create a down payment (either using a percentage or
fixed amount). Then, sign the document, and :guilabel:`Register the Payment`.
When the time comes for the customer to get the final invoice, create it again from the same sales
order. In the :guilabel:`Create Invoices` wizard, select :guilabel:`Regular Invoice`, and uncheck
:guilabel:`Deduct down payments`.
Then, copy the :guilabel:`Fiscal Folio` from the first invoice, and paste it into the
:guilabel:`CDFI Origin` of the second invoice, adding the prefix `07|` before the value. Then, sign
the document.
After this, create a credit note for the first invoice. Copy the :guilabel:`Fiscal Folio` from the
second invoice, and paste it in the :guilabel:`CFDI Origin` of the credit note, adding the prefix
`07|`. Then, sign the document.
With this, all electronic documents are linked to each other. The final step is to fully pay the new
invoice. At the bottom of the new invoice, you can find the credit note in the
:guilabel:`Outstanding credits` - add it as payment. Finally, register the remaining amount with the
:guilabel:`Register Payment` wizard.
External trade
--------------
The external trade is a complement to a regular invoice that adds certain values in both the XML and
PDF, to invoices with a foreign customer according to `SAT regulations
<http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_comercio_exterior.htm>`_, such as:
- The specific address of the receiver and the sender
- The addition of a :guilabel:`Tariff Fraction` that identifies the type of product
- The correct :guilabel:`Incoterm` (International Commercial Terms), among others (*certificate of
origin* and *special units of measure*).
This allows the correct identification of exporters and importers, in addition to expanding the
description of the merchandise sold.
Since January 1, 2018, external trade is a requirement for taxpayers, who carry export operations of
type A1. While the current CFDI is 4.0, the external trade is currently on version 1.1
In order to use this feature, the modules :guilabel:`l10n_mx_edi_extended` and
:guilabel:`l10n_mx_edi_extended_40` have to be installed.
.. important::
Before installing, make sure your business needs to use this feature. Consult your accountant
first, if needed, before installing any modules.
Configuration
~~~~~~~~~~~~~
Contacts
********
To configure your company contact for external trade, navigate to :menuselection:`Accounting -->
Customers --> Customers`, and select your :guilabel:`Company`. While the CFDI 4.0 requirements ask
you to add a valid :guilabel:`ZIP` code in your contact, the external trade complement adds the
requirement that your :guilabel:`City` and the :guilabel:`State` must also be valid. All three
fields must coincide with the `Official SAT Catalog <sat-catalog_>`_, or you will receive an error.
.. warning::
Add the :guilabel:`City` and :guilabel:`State` in the company's *contact*, not in the company
itself. You can find your company's contact in :menuselection:`Accounting --> Customers -->
Customers`.
The fields :guilabel:`Locality` and :guilabel:`Colony Code` are optional and can be added in the
company directly in :menuselection:`Settings --> General Settings --> Companies`. These two fields
have to coincide with the data in the |SAT|.
.. image:: mexico/mx-external-trade-rescompany.png
:alt: Optional external trade company fields.
To configure the contact data for a foreign receiving client, navigate to :menuselection:`Accounting
--> Customers --> Customers`, and select the foreign client's contact. The contact must have the
following fields completed to avoid errors:
#. The entire company :guilabel:`Address`, including a valid :guilabel:`ZIP` code and the foreign
:guilabel:`Country`.
#. The format of the foreign :guilabel:`VAT` (tax identification number, for example: Colombia
`123456789-1`)
#. In the :guilabel:`MX EDI` tab, you need to address if the customer receives goods for a period of
time temporarily (:guilabel:`Temporary`) or permanently (:guilabel:`Definitive`).
.. important::
If the new contact was created by duplicating another existing contact from Mexico, make sure to
delete any carried over information from the :guilabel:`Fiscal Regime` field. In addition, do not
enable the :guilabel:`No Tax Breakdown` option. Selecting this option hides mandatory fields that
are required for external trade contact configuration.
.. image:: mexico/mx-external-trade-customer-contact.png
:alt: Required external trade customer fields.
.. note::
In the resulting XML and PDF files, the :guilabel:`VAT` is automatically replaced by the generic
VAT for abroad transactions: `XEXX010101000`.
Products
********
All products involved with external trade have four fields that are required, two of them exclusive
to external trade.
#. The :guilabel:`Internal Reference` of the product is in the :guilabel:`General Information` tab.
#. The :guilabel:`Weight` of the product must be more than `0`.
#. The `correct <https://www.ventanillaunica.gob.mx/vucem/Clasificador.html>`_ :guilabel:`Tariff
Fraction` of the product in the :guilabel:`Accounting` tab.
#. The :guilabel:`UMT Aduana` corresponds to the :guilabel:`Tariff Fraction`.
.. image:: mexico/mx-external-trade-product.png
:alt: Required external trade product fields.
.. tip::
- If the UoM code of the :guilabel:`Tariff Fraction` is `01`, the correct :guilabel:`UMT Aduana`
is `kg`.
- If the UoM code of the :guilabel:`Tariff Fraction` is `06`, the correct :guilabel:`UMT Aduana`
is `Units`.
Invoicing flow
~~~~~~~~~~~~~~
Before creating an invoice, it is important to take into account that external trade invoices
require to convert the amounts of your product into USD. Therefore, :doc:`multicurrency
<../accounting/get_started/multi_currency>` **must** be enabled and *USD* **must** be activated in
the :guilabel:`Currencies` section. The correct :guilabel:`Service` to run is :guilabel:`Mexican
Bank`.
Then, with the correct exchange rate set up in :menuselection:`Accounting --> Settings -->
Currency`, the only fields left are :guilabel:`Incoterm` and the optional :guilabel:`Certificate
Source` in the :guilabel:`Other Info` tab.
.. image:: mexico/mx-external-trade-other-info.png
:alt: External trade Other Info tab of a product.
Finally, sign the invoice with the same process as a regular invoice, and click the
:guilabel:`Process Now` button.
Delivery guide
--------------
A `Carta Porte <https://www.sat.gob.mx/consultas/68823/complemento-carta-porte->`_ is a bill of
lading: a document that states the type, quantity, and destination of goods being carried.
On December 1st, 2021, version 2.0 of this CFDI was implemented for all transportation providers,
intermediaries, and owners of goods. Odoo is able to generate a document type "T" (Traslado), which,
unlike other documents, is created in a delivery order instead of an invoice or payment.
Odoo can create XML and PDF files with (or without) ground transport, and can process materials that
are treated as *Dangerous Hazards*.
In order to use this feature, the modules :guilabel:`l10n_mx_edi_extended`,
:guilabel:`l10n_mx_edi_extended_40`, :guilabel:`l10n_mx_edi_stock` and
:guilabel:`l10n_mx_edi_stock_40` have to be installed.
In addition to this, it is necessary to have the :doc:`Inventory
<../../inventory_and_mrp/inventory>` and :doc:`Sales <../../sales/sales>` apps installed, as well.
.. important::
Odoo does not support Carta Porte type document type "I" (Ingreso), air, or marine transport.
Consult your accountant first if this feature is needed before doing any modifications.
Configuration
~~~~~~~~~~~~~
Odoo manages two different types of CFDI:
- **No Federal Highways**: Is used when the *Distance to Destination* is `less than 30 KM
<http://omawww.sat.gob.mx/cartaporte/Paginas/documentos/PreguntasFrecuentes_Autotransporte.pdf>`_.
- **Federal Transport**: Is used when the *Distance to Destination* exceeds 30 KM.
Other than the standard requirements of regular invoicing (The |RFC| of the customer, the UNSPSC
code, etc.), if you are using *No Federal Highways*, no external configuration is needed.
For *Federal Transport*, several configurations have to be added to contacts, vehicle setups, and
products. Those configurations are added to the XML and PDF files.
Contacts and vehicles
*********************
Like the external trade feature, the :guilabel:`Address` in both the company and the final customer
must be complete. The :guilabel:`ZIP` code, :guilabel:`City`, and :guilabel:`State` must coincide
with the `Official SAT Catalog for Carta Porte <sat-catalog_>_`.
.. tip::
The field, :guilabel:`Locality`, is optional for both addresses.
.. image:: mexico/mx-delivery-guide-contacts.png
:alt: Delivery guide contact configuration.
.. important::
The origin address used for the delivery guide is set in :menuselection:`Inventory -->
Configuration --> Warehouses Management --> Warehouses`. While this is set as the company address
by default, you can change it according to your correct warehouse address.
Another addition to this feature is the :guilabel:`Vehicle Setups` menu found in
:menuselection:`Inventory --> Settings --> Mexico`. This menu lets you add all the information
related to the vehicle used for the delivery order.
All fields are mandatory to create a correct delivery guide.
.. tip::
The fields, :guilabel:`Vehicle Plate Number` and :guilabel:`Number Plate`, must contain between
5 to 7 characters.
In the :guilabel:`Intermediaries` section, you must add the operator of the vehicle. The only
mandatory fields for this contact are the :guilabel:`VAT` and :guilabel:`Operator Licence`.
.. image:: mexico/mx-delivery-guide-vehicle.png
:alt: Delivery guide vehicle configuration.
Products
********
Similar to regular invoicing, all products must have a :guilabel:`UNSPSC category`. In addition to
this, there are two extra configurations for products involved in delivery guides:
- The :guilabel:`Product Type` must be set as :guilabel:`Storable Product` for stock movements to be
created.
- In the :guilabel:`Inventory` tab, the field :guilabel:`Weight` should have more than `0`.
.. warning::
Creating a delivery guide of a product with the value `0` will trigger an error. As the
:guilabel:`Weight` has been already stored in the delivery order, it is needed to return the
products, and create the delivery order (and delivery guide) again with the correct amounts.
.. image:: mexico/mx-delivery-guide-products.png
:alt: Delivery guide product configuration.
Sales and inventory flow
~~~~~~~~~~~~~~~~~~~~~~~~
To create a delivery guide, first, you need to create and confirm a sales order from
:menuselection:`Sales --> Sales Order`. This generates a :guilabel:`Delivery` smart button. Click
it, and :guilabel:`Validate` the transfer.
After the status is set to :guilabel:`Done`, you can edit the transfer, and select the
:guilabel:`Transport Type` (either :guilabel:`No Federal Highways` or :guilabel:`Federal
Transport`).
If your delivery guide has the type :guilabel:`No Federal Highways`, you can save the transfer, and
then click :guilabel:`Generate Delivery Guide`. The resulting XML can be found in the chatter.
.. note::
Other than the :guilabel:`UNSPSC` in all products, delivery guides that use :guilabel:`No Federal
Highways` do not require any special configuration to be sent to the government.
If your delivery guide has the type, :guilabel:`Federal Transport`, the tab :guilabel:`MX EDI`
appears. There, enter a value in :guilabel:`Distance to Destination (KM)` bigger than `0`, and
select the :guilabel:`Vehicle Setup` used for this delivery.
.. image:: mexico/mx-delivery-guide-federal-transport.png
:alt: Delivery guide MX EDI tab configuration.
Dangerous hazards
*****************
Certain values in the :guilabel:`UNSPSC Category` are considered in the `official SAT catalog
<http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_carta_porte.htm>`_ as *dangerous
hazards*. These categories need additional considerations when creating a delivery guide with
:guilabel:`Federal Transport`.
First, select your product from :menuselection:`Inventory --> Products --> Products`. Then, in the
:guilabel:`Accounting` tab, the fields :guilabel:`Hazardous Material Designation Code (MX)` and
:guilabel:`Hazardous Packaging (MX)` must be filled with the correct code from the |SAT| catalog.
.. image:: mexico/mx-delivery-guide-hazards-designation.png
:alt: Delivery guide hazardous material product required fields.
In :menuselection:`Inventory --> Settings --> Mexico --> Vehicle Setup`, the data from the
:guilabel:`Environment Insurer` and :guilabel:`Environment Insurance Policy` has to be filed, as
well. After this, continue with the regular process to create a delivery guide.
.. image:: mexico/mx-delivery-guide-hazards-environment.png
:alt: Delivery Guide environment insurer required fields.
Customs numbers
---------------
A *customs declaration* (Pedimento Aduanero) is a fiscal document that certifies that all
contributions to the fiscal entity (the |SAT|) has been paid for, including the import/export of
goods.
According to the `Annex 20 <http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm>`_ of
CFDI 4.0, in documents where the invoiced goods come from a first-hand import operation, the field,
:guilabel:`Customs Number`, needs to be added to all lines of products involved with the operation.
To do so, the module :guilabel:`l10n_mx_edi_landing` must be installed, in addition to the
:doc:`Inventory <../../inventory_and_mrp/inventory>`, :doc:`Purchase
<../../inventory_and_mrp/purchase>` and :doc:`Sales <../../sales/sales>` apps.
.. important::
Do not confuse this feature with external trade. The customs numbers are directly related to
importing goods, while the external trade complement is related to exporting. Consult your
accountant first if this feature is needed before doing any modifications.
Configuration
~~~~~~~~~~~~~
In order to track the correct customs number for a specific invoice, Odoo uses :doc:`landed costs
<../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs>`. Go to
:menuselection:`Inventory --> Configuration --> Settings --> Valuation`. Make sure that
:guilabel:`Landed Costs` is activated.
Begin by creating a *service*-type product called, `Pedimento`. In the :guilabel:`Purchase` tab,
activate :guilabel:`Is a Landed Cost`, and select a :guilabel:`Default Split Method`.
Then, configure the *storable products* that hold the customs numbers. To do so, create the storable
products, and make sure the :guilabel:`Product Category` has the following configuration.
- :guilabel:`Costing Method`: Either :guilabel:`FIFO` or :guilabel:`AVCO`
- :guilabel:`Inventory Valuation`: :guilabel:`Automated`
- :guilabel:`Stock Valuation Account`: :guilabel:`115.01.01 Inventario`
- :guilabel:`Stock Journal`: :guilabel:`Inventory Valuation`
- :guilabel:`Stock Input Account`: :guilabel:`115.05.01 Mercancías en tránsito`
- :guilabel:`Stock Output Account`: :guilabel:`115.05.01 Mercancías en tránsito`
.. image:: mexico/mx-landing-configuration.png
:alt: Storable products general configuration.
.. image:: mexico/mx-landing-configuration-category.png
:alt: Storable product category configuration.
Purchase and sales flow
~~~~~~~~~~~~~~~~~~~~~~~
After you configure your product, follow the standard :doc:`purchase flow
<../../inventory_and_mrp/purchase>`.
Create a purchase order from :menuselection:`Purchase --> Orders --> Purchase Order`. Then, confirm
the order to display a :guilabel:`Receipt` smart button. Click on the :guilabel:`Receipt` smart
button to :guilabel:`Validate` the receipt.
Go to :menuselection:`Inventory --> Operations --> Landed Costs`, and create a new record. Add the
transfer that you just created, and both: the product `Pedimento` and :guilabel:`Customs number`.
Optionally, you can add a cost amount. After this, validate the landed cost. Once
:guilabel:`Posted`, all products related to that receipt have the customs number assigned.
.. warning::
You can only add the *Pedimentos* number **once**, so be careful when associating the correct
number with the transfer(s).
.. image:: mexico/mx-landing-inventory.png
:alt: Customs number on a landed costs Inventory record.
Now, create a sales order, and confirm it. This should trigger a :guilabel:`Delivery` smart button.
Validate it.
Finally, create an invoice from the sales order, and confirm it. The invoice line related to your
product has a customs number in it. This number should match the customs number added in the
*Landed Costs* record you created earlier.
.. image:: mexico/mx-landing-invoice.png
:alt: Customs number on confirmed sales order product.
Electronic accounting
---------------------
For Mexico, `Electronic Accounting
<https://www.sat.gob.mx/aplicacion/42150/envia-tu-contabilidad-electronica>`_ refers to the
obligation to keep accounting records and entries through electronic means, and to enter accounting
information on a monthly basis, through the |SAT| website.
It consists of three main XML files:
#. The updated list of the chart of accounts that you are currently using.
#. A monthly trial balance, plus a closing entry report, also known as: *Trial Balance Month 13*.
#. Either optional, or for a compulsory audit, an export of the journal entries in your general
ledger.
The resulting XML files follow the requirements of the `Anexo Técnico de Contabilidad Electrónica
1.3 <https://www.gob.mx/cms/uploads/attachment/file/151135/Anexo24_05012015.pdf>`_.
In addition to this, you can generate the `DIOT
<https://www.sat.gob.mx/declaracion/74295/presenta-tu-declaracion-informativa-de-operaciones-con-
terceros-(diot)->`_: A report of vendor's journal entries that involve IVA taxes that can be
exported in a :file:`.txt` file.
In order to use these reports, the modules :guilabel:`l10n_mx_reports`,
:guilabel:`l10n_mx_reports_closing`, :guilabel:`l10n_mx_xml_polizas` and
:guilabel:`l10n_mx_xml_polizas_edi` have to be installed, as well as the :doc:`Accounting
<../accounting/get_started>`.
.. important::
The specific characteristics and obligations of the reports that you send might change according
to your fiscal regime. Always contact your accountant before sending any documents to the
government.
.. _l10n_mx/chart-of-accounts:
Chart of accounts
~~~~~~~~~~~~~~~~~
The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` in México follows a
specific pattern based on |SAT|'s' `Código agrupador de cuentas
<http://omawww.sat.gob.mx/fichas_tematicas/buzon_tributario/Documents/codigo_agrupador.pdf>`_.
You can create any account, as long as it respects |SAT|'s encoding group: the pattern is
`NNN.YY.ZZ` or `NNN.YY.ZZZ`.
.. example::
Some examples are `102.01.99` or `401.01.001`.
When a new account is created in :menuselection:`Accounting --> Configuration --> Chart of
Accounts`, with the |SAT| encoding group pattern, the correct grouping code appears in
:guilabel:`Tags`, and your account appears in the *COA* report.
Once you create all your accounts, make sure the correct :guilabel:`Tags` are added.
.. note::
You cannot use any pattern that ends a section with a 0 (such as `100.01.01`, `301.00.003` or
`604.77.00`). This triggers errors in the report.
Once everything is set up, go to :menuselection:`Accounting --> Reporting --> Trial Balance`,
click the :icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and
select :guilabel:`COA SAT (XML)`. This generates an XML file with your accounts, which you can
upload directly to the |SAT| website.
Trial balance
~~~~~~~~~~~~~
The trial balance reports the initial balance, credit, and total balance of your accounts, provided
that you added their correct :ref:`encoding group <l10n_mx/chart-of-accounts>`.
To generate this report in an XML format, go to :menuselection:`Accounting --> Reporting -->
Trial Balance`. Select the month you want to download in the calendar, then click the
:icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and select
:guilabel:`SAT (XML)`.
.. image:: mexico/mx-reports-trial-balance.png
:alt: Trial balance report.
.. note::
Odoo does not generate the *Balanza de Comprobación Complementaria*.
Month 13 trial balance
**********************
The *Month 13* report is a closing balance sheet that shows any adjustments or movements made in the
accounting to close the year.
To generate it, proceed as follows:
#. Go to :menuselection:`Accounting --> Accounting --> Journal Entries` and create a new entry for
all the amounts to be changed, balancing the debit and/or credit of each one.
#. In the :guilabel:`Other Info` tab, enable the :guilabel:`Month 13 Closing` option.
#. Go to :menuselection:`Accounting --> Reporting --> Trial Balance`, click the calendar, and select
:guilabel:`Month 13`.
#. Click the :icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and
select :guilabel:`SAT (XML)`.
.. image:: mexico/mx-reports-trial-balance-13-report.png
:alt: Trial Balance Month 13 report.
General ledger
~~~~~~~~~~~~~~
By law, all transactions in Mexico must be recorded digitally. Since Odoo automatically creates all
the underlying journal entries of your invoicing and payments, you can export your journal entries
to comply with |SAT|'s audits and/or tax refunds.
.. tip::
You can filter by period, or by journal, according to your current needs.
To create the XML, go to :menuselection:`Accounting --> Reporting --> General Ledger`, click the
:icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and select
:guilabel:`XML (Polizas)`. In the :guilabel:`XML Polizas Export Options` window, choose between four
different :guilabel:`Export` types:
- :guilabel:`Tax audit`
- :guilabel:`Audit certification`
- :guilabel:`Return of goods`
- :guilabel:`Compensation`
For :guilabel:`Tax audit` or :guilabel:`Audit certification`, you need to write the
:guilabel:`Order Number` provided by the |SAT|. For :guilabel:`Return of goods`, or
:guilabel:`Compensation`, you need to write your :guilabel:`Process Number`, also provided by the
|SAT|.
.. note::
If you want to see this report without sending it, use `ABC6987654/99` for :guilabel:`Order
Number` and `AB123451234512` for :guilabel:`Process Number`.
DIOT report
~~~~~~~~~~~
The DIOT (Declaración Informativa de Operaciones con Terceros / *Informative Declaration of
Operations with Third Parties*) is an additional obligation with the |SAT|, where the current status
of creditable and non-creditable payments, withholdings, and refunds of VAT from your vendor bills,
are provided to the |SAT|.
Unlike other reports, the |DIOT| is uploaded to a software provided by the |SAT| that contains the
A-29 form. In Odoo, you can download the records of your transactions as a :file:`.txt` file that
can be uploaded to the form, avoiding direct capture of this data.
The transactions file contains the total amount of your payments registered in vendor bills, broken
down into the corresponding types of IVA. The :guilabel:`VAT` and :guilabel:`Country` is mandatory
for all vendors.
To generate the |DIOT| report, go to :menuselection:`Accounting --> Reporting --> Tax Reports`.
Select the month you want to download in the calendar, then click the :icon:`fa-caret-down`
(:guilabel:`down arrow`) next to the :guilabel:`PDF` button to select :guilabel:`Report: DIOT (MX)`
and download the :file:`.txt` file.
.. image:: mexico/mx-reports-diot-example.png
:alt: A Vendor Bill that is In Payment.
.. important::
You need to fill the :guilabel:`L10N Mx Type of Operation` field in the :guilabel:`Accounting`
tab of each one of your vendors to prevent validation errors. Make sure that your foreign
customers have their country set up for :guilabel:`L10N Mx Nationality` to appear automatically.
.. image:: mexico/mx-reports-diot-contact.png
:alt: DIOT information on a vendor contact.