mx

package
v0.200.0-rc2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 23, 2024 License: Apache-2.0 Imports: 10 Imported by: 2

README

🇲🇽 GOBL Mexico Tax Regime

Mexico uses the CFDI (Comprobante Fiscal Digital por Internet) format for their e-invoicing system.

Example MX GOBL files can be found in the examples (YAML uncalculated documents) and examples/out (JSON calculated envelopes) subdirectories.

Public Documentation

Mexico specifics

Mexican invoices as defined in the CFDI specification must include a set of specific codes that will either need to be known in advance by the supplier or requested from the customer during their purchase process.

The following sections highlight these codes and how they can be defined inside your GOBL documents.

LugarExpedicion - Issue Place

Every MX invoice needs to specify the postal code of place where it was issued. In a GOBL Invoice, you can provide this value using the mx-cfdi-issue-place extension under the tax of the invoice.

Example
{
  "$schema": "https://gobl.org/draft-0/bill/invoice",
  // [...]
  "tax": {
    "ext": {
      "mx-cfdi-issue-place": "26015"
    }
  },
  // [...]
}
RegimenFiscal - Fiscal Regime

Every Supplier and Customer in a Mexican invoice must be associated with a fiscal regime code. You'll need to ensure this field's value is requested from customers when they require an invoice.

In GOBL the mx-cfdi-fiscal-regime extension key is used alongside the value expected by the SAT.

Example

The following example will associate the supplier with the 601 fiscal regime code:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",
  // [...]
  "supplier": {
    "name": "ESCUELA KEMPER URGATE",
    "tax_id": {
      "country": "MX",
      "code": "EKU9003173C9"
    },
    "ext": {
      "mx-cfdi-fiscal-regime": "601"
    }
  }
  // [...]
}
DomicilioFiscalReceptor - Receipt's Tax Address

In CFDI, DomicilioFiscalReceptor is a mandatory field that specifies the postal code of the recepient's tax address. In a GOBL Invoice, you can provide this value setting the mx-cfdi-post-code extension of the invoice's customer.

Example
{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "customer": {
    "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA",
    "tax_id": {
      "country": "MX",
      "code": "URE180429TM6"
    },
    "ext": {
      "mx-cfdi-fiscal-regime": "601",
      "mx-cfdi-use": "G01",
      "mx-cfdi-post-code": "65000"
    }
  }

  // [...]
}
UsoCFDI - CFDI Use

The CFDI’s UsoCFDI field specifies how the invoice's recipient will use the invoice to deduce taxes for the expenditure made. In a GOBL Invoice, include the mx-cfdi-use extension in the customer.

This field will be validated for presence and will be checked against the list of codes defined as part of the CFDI specification.

Example

The following GOBL maps to the G03 (Gastos en general) value of the UsoCFDI field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "customer": {
    "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA",
    "tax_id": {
      "country": "MX",
      "code": "URE180429TM6"
    },
    "ext": {
      "mx-cfdi-fiscal-regime": "601",
      "mx-cfdi-use": "G01",
      "mx-cfdi-post-code": "65000"
    }
  }

  // [...]
}
MetodoPago – Payment Method

The CFDI’s MetodoPago field specifies whether the invoice has been fully paid at the moment of issuing the invoice (PUE - Pago en una sola exhibición) or whether it will be paid in one or several instalments after that (PPD – Pago en parcialidades o diferido).

In GOBL, the presence or absence of payment advances covering the invoice’s total payable amount will determine whether the MetodoPago will be set to PUE or PPD.

Please note that if you don't include any advances in your GOBL invoice, it will be assumed that the payment of the invoice is outstanding (MetodoPago = PPD). This implies that the invoice supplier will have to issue “CFDI de Complemento de Pago” (remittance advice) documents at a later stage when receiving the invoice payments.

Examples

The following GOBL will map to the PUE (Pago en una sola exhibición) value of the MetodoPago field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "payment": {
    "advances": [
      {
        "key": "credit-transfer",
        "desc": "Full credit card payment",
        "amount": "232.00"
      }
    ]
  },

  "totals": {
    "payable": "232.00",
    "advance": "232.00",
    "due": "0.00"
    // [...]
  }
}

The following GOBL will map to the PPD (Pago en parcialidades o diferido) value of the MetodoPago field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "payment": {
    "advances": [
      {
        "key": "credit-transfer",
        "desc": "Partial credit card payment",
        "amount": "100.00"
      }
    ]
  },

  "totals": {
    "payable": "232.00",
    "advance": "100.00",
    "due": "132.00"
    // [...]
  }
}

The following GOBL will map to the PPD (Pago en parcialidades o diferido) value of the MetodoPago field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // No "payment" key [...]

  "totals": {
    "payable": "232.00",
    // [...]
  }
}
FormaPago - Payment Means

The CFDI’s FormaPago field specifies an invoice's means of payment.

If the invoice hasn't been fully paid at the time of issuing the invoice (MetodoPago = PPD, see the previous section) the value of FormaPago will always be set to 99 (Por definir).

Otherwise (MetodoPago = PUE), the FormaPago value will be mapped from the key of the largest payment advance in the GOBL invoice. The following table lists all the supported values and how GOBL will map them:

Code Name GOBL Payment Advance Key
01 Efectivo cash
02 Cheque nominativo cheque
03 Transferencia electrónica de fondos credit-transfer
04 Tarjeta de crédito card
05 Monedero electrónico online+wallet
06 Dinero electrónico online
08 Vales de despensa other+grocery-vouchers
12 Dación en pago other+in-kind
13 Pago por subrogación other+subrogation
14 Pago por consignación other+consignment
15 Condonación other+debt-relief
17 Compensación netting
23 Novación other+novation
24 Confusión other+merger
25 Remisión de deuda other+remission
26 Prescripción o caducidad other+expiration
27 A satisfacción del acreedor other+satisfy-creditor
28 Tarjeta de débito card+debit
29 Tarjeta de servicios card+services
30 Aplicación de anticipos other+advance
31 Intermediario pagos other+intermediary
99 Por definir other
Example

The following GOBL maps to the 05 (Monedero electrónico) value of the FormaPago field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "payment": {
    "advances": [
      {
        "key": "online+wallet",
        "desc": "Prepago con monedero electrónico",
        "amount": "100.00"
      }
    ]
  }
}
ClaveUnidad - Unit Code

The CFDI’s ClaveUnidad field specifies the unit in which the quantity of an invoice's line is given. These are UNECE codes that GOBL will map directly from the invoice's line item unit. See the source code for the full list of supported units with their associated UNECE codes.

Example

The following GOBL maps to the KGM (Kilogram) value of the ClaveUnidad field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "lines": [
    {
      // [...]

      "item": {
        "name": "Jasmine rice",
        "unit": "kg",
        "price": "1.27"
      },
    }
  ]
}
ClaveProdServ - Product or Service Code

The CFDI’s ClaveProdServ field specifies the type of an invoice's line item. GOBL uses the line item extension key mx-cfdi-prod-serv to map the code directly to the ClaveProdServ field.

The catalogue of available Product or Service codes that form part of the CFDI standard is immense with some 50.000 entries to choose from. Due the huge number of codes GOBL will not validate these fields, you'll have to check with local accountants to check which code should be used for your products or services.

Example

The following GOBL maps to the 10101602 ("live ducks") value to the ClaveProdServ field:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "lines": [
    {
      // [...]

      "item": {
        "name": "Selección de patos vivos",
        "ext": {
          "mx-cfdi-prod-serv": "10101602"
        }
      },
    }
  ]
}
Generic RFCs

In MX, CFDI invoices to end consumers need to use a generic RFC code (XAXX010101000) in the document's Receptor and some specific values for the supplier extensions. In GOBL, you don't need to enter those values explicitly. Just set the simplified tax tag in your invoice and exclude the customer, the GOBL to CFDI conversor will take care of the rest:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "tax": {
    "tags": [
      "simplified"
    ]
  }

  // No "customer" entry

}

Similarly, CFDI invoices to foreign customers are required to use the foreign generic RFC (XEXX010101000) along with some specific values for the extensions. The country and the local tax code of the supplier are included in separated CFDI fields. And again, in GOBL, you just need to provide the actual country and tax code of the supplier (without extensions), and the GOBL to CFDI conversor will take care of producing the correct document:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",

  // [...]

  "customer": {
    "name": "Almuerzos Colombianos SAS",
    "tax_id": {
      "country": "CO",
      "code": "9014514805"
    }
  }

  // [...]
}
Complements

Complements let you include additional complementary information to your GOBL documents. The following sections describe the complements made available by the MX regime, their purpose and how you can use them.

Fuel Account Balance

The Fuel Account Balance complement carries the data to produce a CFDI’s “Complemento de Estado de Cuenta de Combustibles para Monederos Electrónicos” (version 1.2 revision B) providing detailed information about fuel purchases made with electronic wallets.

In Mexico, e-wallet suppliers use this complement to report this information in the invoices to their customers.

Learn more about this complement here:

Food Vouchers

The Food Vouchers complement carries the data to produce a CFDI's “Complemento de Vales de Despensa” (version 1.0) providing detailed information about food vouchers issued by an e-wallet supplier to its customer's employees.

In Mexico, e-wallet suppliers use this complement to report this information in the invoices to their customers.

Learn more about this complement here:

Documentation

Overview

Package mx provides the Mexican tax regime.

Index

Constants

View Source
const (
	StampSATSignature   cbc.Key = "sat-sig"          // Signature - Sello Digital del SAT (optional)
	StampSATSerial      cbc.Key = "sat-serial"       // Cert Serial - Número de Certificado SAT
	StampSATTimestamp   cbc.Key = "sat-timestamp"    // Timestamp - Fecha y hora de certificación del SAT
	StampSATUUID        cbc.Key = "sat-uuid"         // Folio Fiscal
	StampSATURL         cbc.Key = "sat-url"          // URL QR Code
	StampSATProviderRFC cbc.Key = "sat-provider-rfc" // Provider RFC - RFC del Proveedor de Certificación
	StampSATChain       cbc.Key = "sat-chain"        // Cadena original del complemento de certificación digital del SAT
)

Official SAT codes to include in stamps.

View Source
const (
	KeyFormaPago    cbc.Key = "sat-forma-pago"    // for mapping to c_FormaPago’s codes
	KeyTipoRelacion cbc.Key = "sat-tipo-relacion" // for mapping to c_TipoRelacion’s codes
	KeyImpuesto     cbc.Key = "sat-impuesto"      // for mapping to c_Impuesto’s codes
)

Custom keys used typically in meta or codes information.

View Source
const (
	TaxCategoryRVAT  cbc.Code = "RVAT"  // IVA (Retenido)
	TaxCategoryIEPS  cbc.Code = "IEPS"  // Impuesto Especial sobre Producción y Servicios
	TaxCategoryRIEPS cbc.Code = "RIEPS" // Impuesto Especial sobre Producción y Servicios (Retenido)
	TaxCategoryISR   cbc.Code = "ISR"   // Impuesto Sobre la Renta
)

Local tax categories

View Source
const (
	TaxIdentityCodeGeneric cbc.Code = "XAXX010101000"
	TaxIdentityCodeForeign cbc.Code = "XEXX010101000"
)

Constants used to specific tax identity codes.

View Source
const (
	TaxIdentityTypePerson  cbc.Key = "person"
	TaxIdentityTypeCompany cbc.Key = "company"
)

Tax Identity Type

View Source
const (
	TaxIdentityPatternPerson  = `^([A-ZÑ&]{4})([0-9]{6})([A-Z0-9]{3})$`
	TaxIdentityPatternCompany = `^([A-ZÑ&]{3})([0-9]{6})([A-Z0-9]{3})$`
)

Tax Identity Patterns

View Source
const (
	TaxRateExempt cbc.Key = "exempt"
)

Local tax rates

Variables

View Source
var (
	TaxIdentityRegexpPerson  = regexp.MustCompile(TaxIdentityPatternPerson)
	TaxIdentityRegexpCompany = regexp.MustCompile(TaxIdentityPatternCompany)
)

Tax Identity Regexp

Functions

func DetermineTaxCodeType

func DetermineTaxCodeType(code cbc.Code) cbc.Key

DetermineTaxCodeType determines the type of tax code or provides an empty key if it looks invalid.

func New

func New() *tax.RegimeDef

New provides the tax region definition

func Normalize added in v0.200.0

func Normalize(doc any)

Normalize performs regime specific calculations.

func Validate

func Validate(doc any) error

Validate validates a document against the tax regime.

func ValidateTaxCode added in v0.200.0

func ValidateTaxCode(value interface{}) error

ValidateTaxCode validates a tax code according to the rules defined by the Mexican SAT.

func ValidateTaxIdentity added in v0.200.0

func ValidateTaxIdentity(tID *tax.Identity) error

ValidateTaxIdentity validates a tax identity for SAT.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL