mx

package
v0.65.0 Latest Latest
Warning

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

Go to latest
Published: Dec 21, 2023 License: Apache-2.0 Imports: 15 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.

Table of contents

Public Documentation

Zones

In Mexican GOBL documents, the supplier and customer addresses are optional, however the parties’ tax identity zones must be included and contain the fiscal address’ postal code of each party. The supplier’s tax identity zone will map to the LugarExpedicion (Place of issue) CFDI field, and the customer’s one will map to the DomicilioFiscalReceptor (Recipient Fiscal Address) field in the CFDI.

Example

The following example will set 21000 as the LugarExpedicion of the CFDI and 86991 as the DomicilioFiscalReceptor:

{
  "$schema": "https://gobl.org/draft-0/bill/invoice",
  // [...]
  "supplier": {
    "name": "ESCUELA KEMPER URGATE",
    "tax_id": {
      "country": "MX",
      "zone": "21000",
      "code": "EKU9003173C9"
    },
    // [...]
  },
  "customer": {
    "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA",
    "tax_id": {
      "country": "MX",
      "zone": "86991",
      "code": "URE180429TM6"
    },
  // [...]
}

Local Codes

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.

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",
      "zone": "26015",
      "code": "EKU9003173C9"
    },
    "ext": {
      "mx-cfdi-fiscal-regime": "601"
    }
  }
  // [...]
}
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",
      "zone": "65000",
      "code": "URE180429TM6"
    },
    "ext": {
      "mx-cfdi-fiscal-regime": "601"
      "mx-cfdi-use": "G01"
    }
  }

  // [...]
}
FormaPago - Payment Means

The CFDI’s FormaPago field specifies an invoice's means of payment. The following table lists all the supported values and how GOBL will map them from the invoice's payment instructions key:

Code Name GOBL Payment Instructions 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": {
    "instructions": {
      "key": "online+wallet"
    }
  }
}
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"
        }
      },
    }
  ]
}

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 (
	ExtKeyCFDIFiscalRegime = "mx-cfdi-fiscal-regime"
	ExtKeyCFDIUse          = "mx-cfdi-use"
	ExtKeyCFDIProdServ     = "mx-cfdi-prod-serv" // name from XML field: ClaveProdServ
)

Mexican CFDI extension keys required by the SAT (tax authority in Mexico) in all invoices and cannot be determined automatically.

View Source
const (
	CURPPattern           = "" /* 132-byte string literal not displayed */
	SocialSecurityPattern = "^[0-9]{11}$"
)

Complement's Codes Patterns

View Source
const (
	FuelAccountInterimPrecision = 3
	FuelAccountFinalPrecision   = 2
	FuelAccountRatePrecision    = 6
)

Constants for the precision of complement's amounts

View Source
const (
	FuelAccountTaxCodeVAT  = cbc.Code("IVA")
	FuelAccountTaxCodeIEPS = cbc.Code("IEPS")
)

Constants for the complement's allowed tax codes

View Source
const (
	KeySATFormaPago         cbc.Key = "sat-forma-pago"          // for mapping to c_FormaPago’s codes
	KeySATTipoDeComprobante cbc.Key = "sat-tipo-de-comprobante" // for mapping to c_TipoDeComprobante’s codes
	KeySATTipoRelacion      cbc.Key = "sat-tipo-relacion"       // for mapping to c_TipoRelacion’s codes
	KeySATImpuesto          cbc.Key = "sat-impuesto"            // for mapping to c_Impuesto’s codes
)

Custom keys used typically in meta or codes information.

View Source
const (
	MeansKeyWallet          cbc.Key = "wallet"
	MeansKeyGroceryVouchers cbc.Key = "grocery-vouchers"
	MeansKeyInKind          cbc.Key = "in-kind"
	MeansKeySubrogation     cbc.Key = "subrogation"
	MeansKeyConsignment     cbc.Key = "consignment"
	MeansKeyDebtRelief      cbc.Key = "debt-relief"
	MeansKeyNovation        cbc.Key = "novation"
	MeansKeyMerger          cbc.Key = "merger"
	MeansKeyRemission       cbc.Key = "remission"
	MeansKeyExpiration      cbc.Key = "expiration"
	MeansKeySatisfyCreditor cbc.Key = "satisfy-creditor"
	MeansKeyDebit           cbc.Key = "debit"
	MeansKeyServices        cbc.Key = "services"
	MeansKeyAdvance         cbc.Key = "advance"
	MeansKeyIntermediary    cbc.Key = "intermediary"
)

Regime Specific Payment Means Extension Keys

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 (
	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 (
	FoodVouchersFinalPrecision = 2
)

Constants for the precision of the complement's amounts

View Source
const (
	StampProviderSATUUID cbc.Key = "sat-uuid" // a.k.a. Folio Fiscal
)

SAT official codes to include in stamps.

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

Constants used to specific tax identity codes.

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

Local tax rates

Variables

View Source
var (
	CURPRegexp           = regexp.MustCompile(CURPPattern)
	SocialSecurityRegexp = regexp.MustCompile(SocialSecurityPattern)
)

Complement's Codes Regexps

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

Tax Identity Regexp

View Source
var FuelAccountValidTaxCodes = []interface{}{
	FuelAccountTaxCodeVAT,
	FuelAccountTaxCodeIEPS,
}

FuelAccountValidTaxCodes lists of the complement's allowed tax codes

Functions

func Calculate

func Calculate(doc interface{}) error

Calculate performs regime specific calculations.

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.Regime

New provides the tax region definition

func Validate

func Validate(doc interface{}) error

Validate validates a document against the tax regime.

Types

type FoodVouchers added in v0.61.0

type FoodVouchers struct {
	// Customer's employer registration number (maps to `registroPatronal`).
	EmployerRegistration string `json:"employer_registration,omitempty" jsonschema:"title=Employer Registration"`
	// Customer's account number (maps to `numeroDeCuenta`).
	AccountNumber string `json:"account_number" jsonschema:"title=Account Number"`
	// Sum of all line amounts (calculated, maps to `total`).
	Total num.Amount `json:"total" jsonschema:"title=Total" jsonschema_extras:"calculated=true"`
	// List of food vouchers issued to the customer's employees (maps to `Conceptos`).
	Lines []*FoodVouchersLine `json:"lines" jsonschema:"title=Lines"`
}

FoodVouchers 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.

This struct maps to the `ValesDeDespensa` root node in the CFDI's complement.

func (*FoodVouchers) Calculate added in v0.61.0

func (fvc *FoodVouchers) Calculate() error

Calculate performs the complement's calculations and normalisations.

func (*FoodVouchers) Validate added in v0.61.0

func (fvc *FoodVouchers) Validate() error

Validate checks the FoodVouchers data according to the SAT's rules for the "Complemento de Vales de Despensa".

type FoodVouchersEmployee added in v0.60.0

type FoodVouchersEmployee struct {
	// Employee's tax identity code (maps to `rfc`).
	TaxCode cbc.Code `json:"tax_code" jsonschema:"title=Employee's Tax Identity Code"`
	// Employee's CURP ("Clave Única de Registro de Población", maps to `curp`).
	CURP cbc.Code `json:"curp" jsonschema:"title=Employee's CURP"`
	// Employee's name (maps to `nombre`).
	Name string `json:"name" jsonschema:"title=Employee's Name"`
	// Employee's Social Security Number (maps to `numSeguridadSocial`).
	SocialSecurity cbc.Code `json:"social_security,omitempty" jsonschema:"title=Employee's Social Security Number"`
}

FoodVouchersEmployee represents an employee that received a food voucher. It groups employee related field that appears under the `Concepto` node in the CFDI's complement.

func (*FoodVouchersEmployee) Validate added in v0.60.0

func (fve *FoodVouchersEmployee) Validate() error

Validate checks the FoodVouchersEmployee data is valid.

type FoodVouchersLine added in v0.60.0

type FoodVouchersLine struct {
	// Identifier of the e-wallet that received the food voucher (maps to `Identificador`).
	EWalletID cbc.Code `json:"e_wallet_id" jsonschema:"title=E-wallet Identifier"`
	// Date and time of the food voucher's issue (maps to `Fecha`).
	IssueDateTime cal.DateTime `json:"issue_date_time" jsonschema:"title=Issue Date and Time"`
	// Employee that received the food voucher.
	Employee *FoodVouchersEmployee `json:"employee,omitempty" jsonschema:"title=Employee"`
	// Amount of the food voucher (maps to `importe`).
	Amount num.Amount `json:"amount" jsonschema:"title=Amount"`
}

FoodVouchersLine represents a single food voucher issued to the e-wallet of one of the customer's employees. It maps to one `Concepto` node in the CFDI's complement.

func (*FoodVouchersLine) Validate added in v0.60.0

func (fvl *FoodVouchersLine) Validate() error

Validate checks the FoodVouchersLine data is valid.

type FuelAccountBalance added in v0.60.0

type FuelAccountBalance struct {
	// Customer's account number (maps to `NumeroDeCuenta`).
	AccountNumber string `json:"account_number" jsonschema:"title=Account Number"`
	// Sum of all line totals (i.e. taxes not included) (calculated, maps to `SubTotal`).
	Subtotal num.Amount `json:"subtotal" jsonschema:"title=Subtotal" jsonschema_extras:"calculated=true"`
	// Grand total after taxes have been applied (calculated, maps to `Total`).
	Total num.Amount `json:"total" jsonschema:"title=Total" jsonschema_extras:"calculated=true"`
	// List of fuel purchases made with the customer's e-wallets (maps to `Conceptos`).
	Lines []*FuelAccountLine `json:"lines" jsonschema:"title=Lines"`
}

FuelAccountBalance 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 are required to report this complementary information in the invoices they issue to their customers.

This struct maps to the `EstadoDeCuentaCombustible` root node in the CFDI's complement.

func (*FuelAccountBalance) Calculate added in v0.60.0

func (fab *FuelAccountBalance) Calculate() error

Calculate performs the complement's calculations and normalisations.

func (*FuelAccountBalance) Validate added in v0.60.0

func (fab *FuelAccountBalance) Validate() error

Validate ensures that the complement's data is valid.

type FuelAccountItem added in v0.60.0

type FuelAccountItem struct {
	// Type of fuel (one of `c_ClaveTipoCombustible` codes, maps to `TipoCombustible`).
	Type cbc.Code `json:"type" jsonschema:"title=Type"`
	// Reference unit of measure used in the price and the quantity (maps to `Unidad`).
	Unit org.Unit `json:"unit,omitempty" jsonschema:"title=Unit"`
	// Name of the fuel (maps to `NombreCombustible`).
	Name string `json:"name" jsonschema:"title=Name"`
	// Base price of a single unit of the fuel without taxes (maps to `ValorUnitario`).
	Price num.Amount `json:"price" jsonschema:"title=Price"`
}

FuelAccountItem provides the details of a fuel purchase. Its fields map to attributes of the `ConceptoEstadoDeCuentaCombustible` node in the CFDI's complement.

func (*FuelAccountItem) Validate added in v0.60.0

func (fai *FuelAccountItem) Validate() error

Validate ensures that the item's data is valid.

type FuelAccountLine added in v0.60.0

type FuelAccountLine struct {
	// Identifier of the e-wallet used to make the purchase (maps to `Identificador`).
	EWalletID cbc.Code `json:"e_wallet_id" jsonschema:"title=E-wallet Identifier"`
	// Date and time of the purchase (maps to `Fecha`).
	PurchaseDateTime cal.DateTime `json:"purchase_date_time" jsonschema:"title=Purchase Date and Time"`
	// Tax Identity Code of the fuel's vendor (maps to `Rfc`)
	VendorTaxCode cbc.Code `json:"vendor_tax_code" jsonschema:"title=Vendor's Tax Identity Code"`
	// Code of the service station where the purchase was made (maps to `ClaveEstacion`).
	ServiceStationCode cbc.Code `json:"service_station_code" jsonschema:"title=Service Station Code"`
	// Amount of fuel units purchased (maps to `Cantidad`)
	Quantity num.Amount `json:"quantity" jsonschema:"title=Quantity"`
	// Details of the fuel purchased.
	Item *FuelAccountItem `json:"item" jsonschema:"title=Item"`
	// Identifier of the purchase (maps to `FolioOperacion`).
	PurchaseCode cbc.Code `json:"purchase_code" jsonschema:"title=Purchase Code"`
	// Result of quantity multiplied by the unit price (maps to `Importe`).
	Total num.Amount `json:"total" jsonschema:"title=Total"`
	// Map of taxes applied to the purchase (maps to `Traslados`).
	Taxes []*FuelAccountTax `json:"taxes" jsonschema:"title=Taxes"`
}

FuelAccountLine represents a single fuel purchase made with an e-wallet issued by the invoice's supplier. It maps to one `ConceptoEstadoDeCuentaCombustible` node in the CFDI's complement.

func (*FuelAccountLine) Validate added in v0.60.0

func (fal *FuelAccountLine) Validate() error

Validate ensures that the line's data is valid.

type FuelAccountTax added in v0.60.0

type FuelAccountTax struct {
	// Code that identifies the tax ("IVA" or "IEPS", maps to `Impuesto`)
	Code cbc.Code `json:"code" jsonschema:"title=Code"`
	// Rate applicable to either the line total (tasa) or the line quantity (cuota) (maps to `TasaOCuota`).
	Rate num.Amount `json:"rate" jsonschema:"title=Rate"`
	// Total amount of the tax once the rate has been applied (maps to `Importe`).
	Amount num.Amount `json:"amount" jsonschema:"title=Amount"`
}

FuelAccountTax represents a single tax applied to a fuel purchase. It maps to one `Traslado` node in the CFDI's complement.

func (*FuelAccountTax) Validate added in v0.60.0

func (fat *FuelAccountTax) Validate() error

Validate ensures that the tax's data is valid.

Jump to

Keyboard shortcuts

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