Skip to content

Instantly share code, notes, and snippets.

@rvalyi
Last active April 13, 2023 04:49
Show Gist options
  • Save rvalyi/6f158be7e8865cd24833a4b2791851c6 to your computer and use it in GitHub Desktop.
Save rvalyi/6f158be7e8865cd24833a4b2791851c6 to your computer and use it in GitHub Desktop.
# Copyright 2022 Akretion - Raphaël Valyi <raphael.valyi@akretion.com>
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.en.html).
# Generated by https://github.com/akretion/xsdata-odoo
#
import textwrap
from odoo import fields, models
__NAMESPACE__ = "http://www.sat.gob.mx/cfd/4"
class Comprobante(models.AbstractModel):
"Estándar de Comprobante Fiscal Digital por Internet."
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.comprobante"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante"
cfd40_InformacionGlobal = fields.Many2one(
comodel_name="cfd.40.informacionglobal",
string="Nodo condicional",
help=(
"Nodo condicional para precisar la información relacionada con el "
"comprobante global."
),
)
cfd40_CfdiRelacionados = fields.One2many(
"cfd.40.cfdirelacionados",
"cfd40_CfdiRelacionados_Comprobante_id",
string="Nodo opcional",
help=(
"Nodo opcional para precisar la información de los comprobantes "
"relacionados."
),
)
cfd40_Emisor = fields.Many2one(
comodel_name="cfd.40.emisor",
string="Nodo requerido",
xsd_required=True,
help=(
"Nodo requerido para expresar la información del contribuyente "
"emisor del comprobante."
),
)
cfd40_Receptor = fields.Many2one(
comodel_name="cfd.40.receptor",
string="Nodo requerido (Receptor)",
xsd_required=True,
help=(
"Nodo requerido para precisar la información del contribuyente "
"receptor del comprobante."
),
)
cfd40_Conceptos = fields.Many2one(
comodel_name="cfd.40.conceptos",
string="Nodo requerido (Conceptos)",
xsd_required=True,
help=(
"Nodo requerido para listar los conceptos cubiertos por el " "comprobante."
),
)
cfd40_Impuestos = fields.Many2one(
comodel_name="cfd.40.impuestos",
string="Nodo condicional (Impuestos)",
help=(
"Nodo condicional para expresar el resumen de los impuestos " "aplicables."
),
)
cfd40_Complemento = fields.Many2one(
comodel_name="cfd.40.complemento",
string="Nodo opcional donde",
help=(
"Nodo opcional donde se incluye el complemento Timbre Fiscal "
"Digital de manera obligatoria y los nodos complementarios "
"determinados por el SAT, de acuerdo con las disposiciones "
"particulares para un sector o actividad específica."
),
)
cfd40_Addenda = fields.Many2one(
comodel_name="cfd.40.addenda",
string="Nodo opcional (Addenda)",
help=(
"Nodo opcional para recibir las extensiones al presente formato "
"que sean de utilidad al contribuyente. Para las reglas de uso del"
" mismo, referirse al formato origen."
),
)
cfd40_Version = fields.Char(
string="Atributo requerido con valor prefijado",
xsd_required=True,
help=(
"Atributo requerido con valor prefijado a 4.0 que indica la "
"versión del estándar bajo el que se encuentra expresado el "
"comprobante."
),
)
cfd40_Serie = fields.Char(
string="Atributo opcional para precisar la serie",
help=(
"Atributo opcional para precisar la serie para control interno del"
" contribuyente. Este atributo acepta una cadena de caracteres."
),
)
cfd40_Folio = fields.Char(
string="Atributo opcional",
help=(
"Atributo opcional para control interno del contribuyente que "
"expresa el folio del comprobante, acepta una cadena de "
"caracteres."
),
)
cfd40_Fecha = fields.Char(
string="Atributo requerido para la expresión",
xsd_required=True,
xsd_type="tdCFDI:t_FechaH",
help=(
"Atributo requerido para la expresión de la fecha y hora de "
"expedición del Comprobante Fiscal Digital por Internet. Se "
"expresa en la forma AAAA-MM-DDThh:mm:ss y debe corresponder con "
"la hora local donde se expide el comprobante."
),
)
cfd40_Sello = fields.Char(
string="Atributo requerido",
xsd_required=True,
help=(
"Atributo requerido para contener el sello digital del comprobante"
" fiscal, al que hacen referencia las reglas de resolución "
"miscelánea vigente. El sello debe ser expresado como una cadena "
"de texto en formato Base 64."
),
)
cfd40_FormaPago = fields.Char(
string="Atributo condicional",
xsd_type="catCFDI:c_FormaPago",
help=(
"Atributo condicional para expresar la clave de la forma de pago "
"de los bienes o servicios amparados por el comprobante."
),
)
cfd40_NoCertificado = fields.Char(
string="Atributo requerido (NoCertificado)",
xsd_required=True,
help=(
"Atributo requerido para expresar el número de serie del "
"certificado de sello digital que ampara al comprobante, de "
"acuerdo con el acuse correspondiente a 20 posiciones otorgado por"
" el sistema del SAT."
),
)
cfd40_Certificado = fields.Char(
string="Atributo requerido que sirve",
xsd_required=True,
help=(
"Atributo requerido que sirve para incorporar el certificado de "
"sello digital que ampara al comprobante, como texto en formato "
"base 64."
),
)
cfd40_CondicionesDePago = fields.Char(
string="Atributo condicional (CondicionesDePago)",
help=(
"Atributo condicional para expresar las condiciones comerciales "
"aplicables para el pago del comprobante fiscal digital por "
"Internet. Este atributo puede ser condicionado mediante atributos"
" o complementos."
),
)
cfd40_SubTotal = fields.Char(
string="Atributo requerido (SubTotal)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para representar la suma de los importes de "
"los conceptos antes de descuentos e impuesto. No se permiten "
"valores negativos."
),
)
cfd40_Descuento = fields.Char(
string="Atributo condicional (Descuento)",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo condicional para representar el importe total de los "
"descuentos aplicables antes de impuestos. No se permiten valores "
"negativos. Se debe registrar cuando existan conceptos con "
"descuento."
),
)
cfd40_Moneda = fields.Char(
string="Atributo requerido (Moneda)",
xsd_required=True,
xsd_type="catCFDI:c_Moneda",
help=(
"Atributo requerido para identificar la clave de la moneda "
"utilizada para expresar los montos, cuando se usa moneda nacional"
" se registra MXN. Conforme con la especificación ISO 4217."
),
)
cfd40_TipoCambio = fields.Float(
string="Atributo condicional (TipoCambio)",
help=(
"Atributo condicional para representar el tipo de cambio FIX "
"conforme con la moneda usada. Es requerido cuando la clave de "
"moneda es distinta de MXN y de XXX. El valor debe reflejar el "
"número de pesos mexicanos que equivalen a una unidad de la divisa"
" señalada en el atributo moneda. Si el valor está fuera del "
"porcentaje aplicable a la moneda tomado del catálogo c_Moneda, el"
" emisor debe obtener del PAC que vaya a timbrar el CFDI, de "
"manera no automática, una clave de confirmación para ratificar "
"que el valor es correcto e integrar dicha clave en el atributo "
"Confirmacion."
),
)
cfd40_Total = fields.Char(
string="Atributo requerido (Total)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para representar la suma del subtotal, menos "
"los descuentos aplicables, más las contribuciones recibidas "
"(impuestos trasladados - federales y/o locales, derechos, "
"productos, aprovechamientos, aportaciones de seguridad social, "
"contribuciones de mejoras) menos los impuestos retenidos "
"federales y/o locales. Si el valor es superior al límite que "
"establezca el SAT en la Resolución Miscelánea Fiscal vigente, el "
"emisor debe obtener del PAC que vaya a timbrar el CFDI, de manera"
" no automática, una clave de confirmación para ratificar que el "
"valor es correcto e integrar dicha clave en el atributo "
"Confirmacion. No se permiten valores negativos."
),
)
cfd40_TipoDeComprobante = fields.Char(
string="Atributo requerido (TipoDeComprobante)",
xsd_required=True,
xsd_type="catCFDI:c_TipoDeComprobante",
help=(
"Atributo requerido para expresar la clave del efecto del "
"comprobante fiscal para el contribuyente emisor."
),
)
cfd40_Exportacion = fields.Char(
string="Atributo requerido (Exportacion)",
xsd_required=True,
xsd_type="catCFDI:c_Exportacion",
help=(
"Atributo requerido para expresar si el comprobante ampara una "
"operación de exportación."
),
)
cfd40_MetodoPago = fields.Char(
string="Atributo condicional (MetodoPago)",
xsd_type="catCFDI:c_MetodoPago",
help=(
"Atributo condicional para precisar la clave del método de pago "
"que aplica para este comprobante fiscal digital por Internet, "
"conforme al Artículo 29-A fracción VII incisos a y b del CFF."
),
)
cfd40_LugarExpedicion = fields.Char(
string="Atributo requerido (LugarExpedicion)",
xsd_required=True,
xsd_type="catCFDI:c_CodigoPostal",
help=(
"Atributo requerido para incorporar el código postal del lugar de "
"expedición del comprobante (domicilio de la matriz o de la "
"sucursal)."
),
)
cfd40_Confirmacion = fields.Char(
string="Atributo condicional (Confirmacion)",
help=(
"Atributo condicional para registrar la clave de confirmación que "
"entregue el PAC para expedir el comprobante con importes grandes,"
" con un tipo de cambio fuera del rango establecido o con ambos "
"casos. Es requerido cuando se registra un tipo de cambio o un "
"total fuera del rango establecido."
),
)
class InformacionGlobal(models.AbstractModel):
"""Nodo condicional para precisar la información relacionada con el
comprobante global."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.informacionglobal"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.InformacionGlobal"
cfd40_Periodicidad = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_Periodicidad",
help=(
"Atributo requerido para expresar el período al que corresponde la"
" información del comprobante global."
),
)
cfd40_Meses = fields.Char(
string="Atributo requerido para expresar el mes",
xsd_required=True,
xsd_type="catCFDI:c_Meses",
help=(
"Atributo requerido para expresar el mes o los meses al que "
"corresponde la información del comprobante global."
),
)
class CfdiRelacionados(models.AbstractModel):
"""Nodo opcional para precisar la información de los comprobantes
relacionados."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.cfdirelacionados"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.CfdiRelacionados"
cfd40_CfdiRelacionados_Comprobante_id = fields.Many2one(
comodel_name="cfd.40.comprobante", xsd_implicit=True, ondelete="cascade"
)
cfd40_CfdiRelacionado = fields.One2many(
"cfd.40.cfdirelacionado",
"cfd40_CfdiRelacionado_CfdiRelacionados_id",
string="Nodo requerido",
help=(
"Nodo requerido para precisar la información de los comprobantes "
"relacionados."
),
)
cfd40_TipoRelacion = fields.Char(
string="Atributo requerido para indicar la clave",
xsd_required=True,
xsd_type="catCFDI:c_TipoRelacion",
help=(
"Atributo requerido para indicar la clave de la relación que "
"existe entre éste que se está generando y el o los CFDI previos."
),
)
class CfdiRelacionado(models.AbstractModel):
"""Nodo requerido para precisar la información de los comprobantes
relacionados."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.cfdirelacionado"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.CfdiRelacionados.CfdiRelacionado"
cfd40_CfdiRelacionado_CfdiRelacionados_id = fields.Many2one(
comodel_name="cfd.40.cfdirelacionados", xsd_implicit=True, ondelete="cascade"
)
cfd40_UUID = fields.Char(
string="Atributo requerido",
xsd_required=True,
help=(
"Atributo requerido para registrar el folio fiscal (UUID) de un "
"CFDI relacionado con el presente comprobante, por ejemplo: Si el "
"CFDI relacionado es un comprobante de traslado que sirve para "
"registrar el movimiento de la mercancía. Si este comprobante se "
"usa como nota de crédito o nota de débito del comprobante "
"relacionado. Si este comprobante es una devolución sobre el "
"comprobante relacionado. Si éste sustituye a una factura "
"cancelada."
),
)
class Emisor(models.AbstractModel):
"""Nodo requerido para expresar la información del contribuyente emisor del
comprobante."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.emisor"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Emisor"
cfd40_Rfc = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="tdCFDI:t_RFC",
help=(
"Atributo requerido para registrar la Clave del Registro Federal "
"de Contribuyentes correspondiente al contribuyente emisor del "
"comprobante."
),
)
cfd40_Nombre = fields.Char(
string="Atributo requerido (Nombre)",
xsd_required=True,
help=(
"Atributo requerido para registrar el nombre, denominación o razón"
" social del contribuyente inscrito en el RFC, del emisor del "
"comprobante."
),
)
cfd40_RegimenFiscal = fields.Char(
string="Atributo requerido (RegimenFiscal)",
xsd_required=True,
xsd_type="catCFDI:c_RegimenFiscal",
help=(
"Atributo requerido para incorporar la clave del régimen del "
"contribuyente emisor al que aplicará el efecto fiscal de este "
"comprobante."
),
)
cfd40_FacAtrAdquirente = fields.Char(
string="Atributo condicional",
help=(
"Atributo condicional para expresar el número de operación "
"proporcionado por el SAT cuando se trate de un comprobante a "
"través de un PCECFDI o un PCGCFDISP."
),
)
class Receptor(models.AbstractModel):
"""Nodo requerido para precisar la información del contribuyente receptor
del comprobante."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.receptor"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Receptor"
cfd40_Rfc = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="tdCFDI:t_RFC",
help=(
"Atributo requerido para registrar la Clave del Registro Federal "
"de Contribuyentes correspondiente al contribuyente receptor del "
"comprobante."
),
)
cfd40_Nombre = fields.Char(
string="Atributo requerido (Nombre)",
xsd_required=True,
help=(
"Atributo requerido para registrar el nombre(s), primer apellido, "
"segundo apellido, según corresponda, denominación o razón social "
"del contribuyente, inscrito en el RFC, del receptor del "
"comprobante."
),
)
cfd40_DomicilioFiscalReceptor = fields.Char(
string="DomicilioFiscalReceptor",
xsd_required=True,
help=(
"Atributo requerido para registrar el código postal del domicilio "
"fiscal del receptor del comprobante."
),
)
cfd40_ResidenciaFiscal = fields.Char(
string="Atributo condicional",
xsd_type="catCFDI:c_Pais",
help=(
"Atributo condicional para registrar la clave del país de "
"residencia para efectos fiscales del receptor del comprobante, "
"cuando se trate de un extranjero, y que es conforme con la "
"especificación ISO 3166-1 alpha-3. Es requerido cuando se incluya"
" el complemento de comercio exterior o se registre el atributo "
"NumRegIdTrib."
),
)
cfd40_NumRegIdTrib = fields.Char(
string="Atributo condicional (NumRegIdTrib)",
help=(
"Atributo condicional para expresar el número de registro de "
"identidad fiscal del receptor cuando sea residente en el "
"extranjero. Es requerido cuando se incluya el complemento de "
"comercio exterior."
),
)
cfd40_RegimenFiscalReceptor = fields.Char(
string="RegimenFiscalReceptor",
xsd_required=True,
xsd_type="catCFDI:c_RegimenFiscal",
help=(
"Atributo requerido para incorporar la clave del régimen fiscal "
"del contribuyente receptor al que aplicará el efecto fiscal de "
"este comprobante."
),
)
cfd40_UsoCFDI = fields.Char(
string="Atributo requerido (UsoCFDI)",
xsd_required=True,
xsd_type="catCFDI:c_UsoCFDI",
help=(
"Atributo requerido para expresar la clave del uso que dará a esta"
" factura el receptor del CFDI."
),
)
class Conceptos(models.AbstractModel):
"""Nodo requerido para listar los conceptos cubiertos por el
comprobante."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.conceptos"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos"
cfd40_Concepto = fields.One2many(
"cfd.40.concepto",
"cfd40_Concepto_Conceptos_id",
string="Nodo requerido",
help=(
"Nodo requerido para registrar la información detallada de un bien"
" o servicio amparado en el comprobante."
),
)
class Concepto(models.AbstractModel):
"""Nodo requerido para registrar la información detallada de un bien o
servicio amparado en el comprobante."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.concepto"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto"
cfd40_Concepto_Conceptos_id = fields.Many2one(
comodel_name="cfd.40.conceptos", xsd_implicit=True, ondelete="cascade"
)
cfd40_Impuestos = fields.Many2one(
comodel_name="cfd.40.impuestos",
string="Nodo condicional",
help=(
"Nodo condicional para capturar los impuestos aplicables al "
"presente concepto."
),
)
cfd40_ACuentaTerceros = fields.Many2one(
comodel_name="cfd.40.acuentaterceros",
string="Nodo opcional",
help=(
"Nodo opcional para registrar información del contribuyente "
"Tercero, a cuenta del que se realiza la operación."
),
)
cfd40_InformacionAduanera = fields.One2many(
"cfd.40.informacionaduanera",
"cfd40_InformacionAduanera_Concepto_id",
string="Nodo opcional (InformacionAduanera)",
help=(
"Nodo opcional para introducir la información aduanera aplicable "
"cuando se trate de ventas de primera mano de mercancías "
"importadas o se trate de operaciones de comercio exterior con "
"bienes o servicios."
),
)
cfd40_CuentaPredial = fields.One2many(
"cfd.40.cuentapredial",
"cfd40_CuentaPredial_Concepto_id",
string="Nodo opcional para asentar el número",
help=(
"Nodo opcional para asentar el número de cuenta predial con el que"
" fue registrado el inmueble, en el sistema catastral de la "
"entidad federativa de que trate, o bien para incorporar los datos"
" de identificación del certificado de participación inmobiliaria "
"no amortizable."
),
)
cfd40_ComplementoConcepto = fields.Many2one(
comodel_name="cfd.40.complementoconcepto",
string="Nodo opcional donde",
help=(
"Nodo opcional donde se incluyen los nodos complementarios de "
"extensión al concepto definidos por el SAT, de acuerdo con las "
"disposiciones particulares para un sector o actividad específica."
),
)
cfd40_Parte = fields.One2many(
"cfd.40.parte",
"cfd40_Parte_Concepto_id",
string="Nodo opcional para expresar las partes",
help=(
"Nodo opcional para expresar las partes o componentes que integran"
" la totalidad del concepto expresado en el comprobante fiscal "
"digital por Internet."
),
)
cfd40_ClaveProdServ = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_ClaveProdServ",
help=(
"Atributo requerido para expresar la clave del producto o del "
"servicio amparado por el presente concepto. Es requerido y deben "
"utilizar las claves del catálogo de productos y servicios, cuando"
" los conceptos que registren por sus actividades correspondan con"
" dichos conceptos."
),
)
cfd40_NoIdentificacion = fields.Char(
string="Atributo opcional",
help=(
"Atributo opcional para expresar el número de parte, identificador"
" del producto o del servicio, la clave de producto o servicio, "
"SKU o equivalente, propia de la operación del emisor, amparado "
"por el presente concepto. Opcionalmente se puede utilizar claves "
"del estándar GTIN."
),
)
cfd40_Cantidad = fields.Float(
string="Atributo requerido (Cantidad)",
xsd_required=True,
help=(
"Atributo requerido para precisar la cantidad de bienes o "
"servicios del tipo particular definido por el presente concepto."
),
)
cfd40_ClaveUnidad = fields.Char(
string="Atributo requerido (ClaveUnidad)",
xsd_required=True,
xsd_type="catCFDI:c_ClaveUnidad",
help=(
"Atributo requerido para precisar la clave de unidad de medida "
"estandarizada aplicable para la cantidad expresada en el "
"concepto. La unidad debe corresponder con la descripción del "
"concepto."
),
)
cfd40_Unidad = fields.Char(
string="Atributo opcional (Unidad)",
help=(
"Atributo opcional para precisar la unidad de medida propia de la "
"operación del emisor, aplicable para la cantidad expresada en el "
"concepto. La unidad debe corresponder con la descripción del "
"concepto."
),
)
cfd40_Descripcion = fields.Char(
string="Atributo requerido (Descripcion)",
xsd_required=True,
help=(
"Atributo requerido para precisar la descripción del bien o "
"servicio cubierto por el presente concepto."
),
)
cfd40_ValorUnitario = fields.Char(
string="Atributo requerido (ValorUnitario)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para precisar el valor o precio unitario del "
"bien o servicio cubierto por el presente concepto."
),
)
cfd40_Importe = fields.Char(
string="Atributo requerido (Importe)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para precisar el importe total de los bienes o"
" servicios del presente concepto. Debe ser equivalente al "
"resultado de multiplicar la cantidad por el valor unitario "
"expresado en el concepto. No se permiten valores negativos."
),
)
cfd40_Descuento = fields.Char(
string="Atributo opcional (Descuento)",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo opcional para representar el importe de los descuentos "
"aplicables al concepto. No se permiten valores negativos."
),
)
cfd40_ObjetoImp = fields.Char(
string="Atributo requerido (ObjetoImp)",
xsd_required=True,
xsd_type="catCFDI:c_ObjetoImp",
help=(
"Atributo requerido para expresar si la operación comercial es "
"objeto o no de impuesto."
),
)
class Impuestos(models.AbstractModel):
"""Nodo condicional para capturar los impuestos aplicables al presente
concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.impuestos"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Impuestos"
cfd40_Traslados = fields.Many2one(
comodel_name="cfd.40.traslados",
string="Nodo opcional",
help=(
"Nodo opcional para asentar los impuestos trasladados aplicables "
"al presente concepto."
),
)
cfd40_Retenciones = fields.Many2one(
comodel_name="cfd.40.retenciones",
string="Nodo opcional (Retenciones)",
help=(
"Nodo opcional para asentar los impuestos retenidos aplicables al "
"presente concepto."
),
)
class Traslados(models.AbstractModel):
"""Nodo opcional para asentar los impuestos trasladados aplicables al
presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.traslados"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Impuestos.Traslados"
cfd40_Traslado = fields.One2many(
"cfd.40.traslado",
"cfd40_Traslado_Traslados_id",
string="Nodo requerido",
help=(
"Nodo requerido para asentar la información detallada de un "
"traslado de impuestos aplicable al presente concepto."
),
)
class Traslado(models.AbstractModel):
"""Nodo requerido para asentar la información detallada de un traslado de
impuestos aplicable al presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.traslado"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Impuestos.Traslados.Traslado"
cfd40_Traslado_Traslados_id = fields.Many2one(
comodel_name="cfd.40.traslados", xsd_implicit=True, ondelete="cascade"
)
cfd40_Base = fields.Float(
string="Atributo requerido para señalar la base",
xsd_required=True,
help=(
"Atributo requerido para señalar la base para el cálculo del "
"impuesto, la determinación de la base se realiza de acuerdo con "
"las disposiciones fiscales vigentes. No se permiten valores "
"negativos."
),
)
cfd40_Impuesto = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_Impuesto",
help=(
"Atributo requerido para señalar la clave del tipo de impuesto "
"trasladado aplicable al concepto."
),
)
cfd40_TipoFactor = fields.Char(
string="Atributo requerido (TipoFactor)",
xsd_required=True,
xsd_type="catCFDI:c_TipoFactor",
help=(
"Atributo requerido para señalar la clave del tipo de factor que "
"se aplica a la base del impuesto."
),
)
cfd40_TasaOCuota = fields.Float(
string="Atributo condicional",
help=(
"Atributo condicional para señalar el valor de la tasa o cuota del"
" impuesto que se traslada para el presente concepto. Es requerido"
" cuando el atributo TipoFactor tenga una clave que corresponda a "
"Tasa o Cuota."
),
)
cfd40_Importe = fields.Char(
string="Atributo condicional (Importe)",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo condicional para señalar el importe del impuesto "
"trasladado que aplica al concepto. No se permiten valores "
"negativos. Es requerido cuando TipoFactor sea Tasa o Cuota."
),
)
class Retenciones(models.AbstractModel):
"""Nodo opcional para asentar los impuestos retenidos aplicables al
presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.retenciones"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Impuestos.Retenciones"
cfd40_Retencion = fields.One2many(
"cfd.40.retencion",
"cfd40_Retencion_Retenciones_id",
string="Nodo requerido",
help=(
"Nodo requerido para asentar la información detallada de una "
"retención de impuestos aplicable al presente concepto."
),
)
class Retencion(models.AbstractModel):
"""Nodo requerido para asentar la información detallada de una retención de
impuestos aplicable al presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.retencion"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Impuestos.Retenciones.Retencion"
cfd40_Retencion_Retenciones_id = fields.Many2one(
comodel_name="cfd.40.retenciones", xsd_implicit=True, ondelete="cascade"
)
cfd40_Retencion_Retenciones_id = fields.Many2one(
comodel_name="cfd.40.retenciones", xsd_implicit=True, ondelete="cascade"
)
cfd40_Base = fields.Float(
string="Atributo requerido para señalar la base",
xsd_required=True,
help=(
"Atributo requerido para señalar la base para el cálculo de la "
"retención, la determinación de la base se realiza de acuerdo con "
"las disposiciones fiscales vigentes. No se permiten valores "
"negativos."
),
)
cfd40_Impuesto = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_Impuesto",
help=(
"Atributo requerido para señalar la clave del tipo de impuesto "
"retenido aplicable al concepto."
),
)
cfd40_TipoFactor = fields.Char(
string="Atributo requerido (TipoFactor)",
xsd_required=True,
xsd_type="catCFDI:c_TipoFactor",
help=(
"Atributo requerido para señalar la clave del tipo de factor que "
"se aplica a la base del impuesto."
),
)
cfd40_TasaOCuota = fields.Float(
string="Atributo requerido para señalar la tasa",
xsd_required=True,
help=(
"Atributo requerido para señalar la tasa o cuota del impuesto que "
"se retiene para el presente concepto."
),
)
cfd40_Importe = fields.Char(
string="Atributo requerido (Importe)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para señalar el importe del impuesto retenido "
"que aplica al concepto. No se permiten valores negativos."
),
)
class AcuentaTerceros(models.AbstractModel):
"""Nodo opcional para registrar información del contribuyente Tercero, a
cuenta del que se realiza la operación."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.acuentaterceros"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.AcuentaTerceros"
cfd40_RfcACuentaTerceros = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="tdCFDI:t_RFC",
help=(
"Atributo requerido para registrar la Clave del Registro Federal "
"de Contribuyentes del contribuyente Tercero, a cuenta del que se "
"realiza la operación."
),
)
cfd40_NombreACuentaTerceros = fields.Char(
string="NombreACuentaTerceros",
xsd_required=True,
help=(
"Atributo requerido para registrar el nombre, denominación o razón"
" social del contribuyente Tercero correspondiente con el Rfc, a "
"cuenta del que se realiza la operación."
),
)
cfd40_RegimenFiscalACuentaTerceros = fields.Char(
string="RegimenFiscalACuentaTerceros",
xsd_required=True,
xsd_type="catCFDI:c_RegimenFiscal",
help=(
"Atributo requerido para incorporar la clave del régimen del "
"contribuyente Tercero, a cuenta del que se realiza la operación."
),
)
cfd40_DomicilioFiscalACuentaTerceros = fields.Char(
string="DomicilioFiscalACuentaTerceros",
xsd_required=True,
help=(
"Atributo requerido para incorporar el código postal del domicilio"
" fiscal del Tercero, a cuenta del que se realiza la operación."
),
)
class InformacionAduanera(models.AbstractModel):
"""Nodo opcional para introducir la información aduanera aplicable cuando
se trate de ventas de primera mano de mercancías importadas o se trate
de operaciones de comercio exterior con bienes o servicios."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.informacionaduanera"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.InformacionAduanera"
cfd40_InformacionAduanera_Concepto_id = fields.Many2one(
comodel_name="cfd.40.concepto", xsd_implicit=True, ondelete="cascade"
)
cfd40_InformacionAduanera_Parte_id = fields.Many2one(
comodel_name="cfd.40.parte", xsd_implicit=True, ondelete="cascade"
)
cfd40_NumeroPedimento = fields.Char(
string="Atributo requerido",
xsd_required=True,
help=(
"Atributo requerido para expresar el número del pedimento que "
"ampara la importación del bien que se expresa en el siguiente "
"formato: últimos 2 dígitos del año de validación seguidos por dos"
" espacios, 2 dígitos de la aduana de despacho seguidos por dos "
"espacios, 4 dígitos del número de la patente seguidos por dos "
"espacios, 1 dígito que corresponde al último dígito del año en "
"curso, salvo que se trate de un pedimento consolidado iniciado en"
" el año inmediato anterior o del pedimento original de una "
"rectificación, seguido de 6 dígitos de la numeración progresiva "
"por aduana."
),
)
class CuentaPredial(models.AbstractModel):
"""Nodo opcional para asentar el número de cuenta predial con el que fue
registrado el inmueble, en el sistema catastral de la entidad
federativa de que trate, o bien para incorporar los datos de
identificación del certificado de participación inmobiliaria no
amortizable."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.cuentapredial"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.CuentaPredial"
cfd40_CuentaPredial_Concepto_id = fields.Many2one(
comodel_name="cfd.40.concepto", xsd_implicit=True, ondelete="cascade"
)
cfd40_Numero = fields.Char(
string="Atributo requerido",
xsd_required=True,
help=(
"Atributo requerido para precisar el número de la cuenta predial "
"del inmueble cubierto por el presente concepto, o bien para "
"incorporar los datos de identificación del certificado de "
"participación inmobiliaria no amortizable, tratándose de "
"arrendamiento."
),
)
class ComplementoConcepto(models.AbstractModel):
"""Nodo opcional donde se incluyen los nodos complementarios de extensión
al concepto definidos por el SAT, de acuerdo con las disposiciones
particulares para un sector o actividad específica."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.complementoconcepto"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.ComplementoConcepto"
class Parte(models.AbstractModel):
"""Nodo opcional para expresar las partes o componentes que integran la
totalidad del concepto expresado en el comprobante fiscal digital por
Internet."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.parte"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Parte"
cfd40_Parte_Concepto_id = fields.Many2one(
comodel_name="cfd.40.concepto", xsd_implicit=True, ondelete="cascade"
)
cfd40_InformacionAduanera = fields.One2many(
"cfd.40.informacionaduanera",
"cfd40_InformacionAduanera_Parte_id",
string="Nodo opcional",
help=(
"Nodo opcional para introducir la información aduanera aplicable "
"cuando se trate de ventas de primera mano de mercancías "
"importadas o se trate de operaciones de comercio exterior con "
"bienes o servicios."
),
)
cfd40_ClaveProdServ = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_ClaveProdServ",
help=(
"Atributo requerido para expresar la clave del producto o del "
"servicio amparado por la presente parte. Es requerido y deben "
"utilizar las claves del catálogo de productos y servicios, cuando"
" los conceptos que registren por sus actividades correspondan con"
" dichos conceptos."
),
)
cfd40_NoIdentificacion = fields.Char(
string="Atributo opcional",
help=(
"Atributo opcional para expresar el número de serie, número de "
"parte del bien o identificador del producto o del servicio "
"amparado por la presente parte. Opcionalmente se puede utilizar "
"claves del estándar GTIN."
),
)
cfd40_Cantidad = fields.Float(
string="Atributo requerido (Cantidad)",
xsd_required=True,
help=(
"Atributo requerido para precisar la cantidad de bienes o "
"servicios del tipo particular definido por la presente parte."
),
)
cfd40_Unidad = fields.Char(
string="Atributo opcional (Unidad)",
help=(
"Atributo opcional para precisar la unidad de medida propia de la "
"operación del emisor, aplicable para la cantidad expresada en la "
"parte. La unidad debe corresponder con la descripción de la "
"parte."
),
)
cfd40_Descripcion = fields.Char(
string="Atributo requerido (Descripcion)",
xsd_required=True,
help=(
"Atributo requerido para precisar la descripción del bien o "
"servicio cubierto por la presente parte."
),
)
cfd40_ValorUnitario = fields.Char(
string="Atributo opcional para precisar el valor",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo opcional para precisar el valor o precio unitario del "
"bien o servicio cubierto por la presente parte. No se permiten "
"valores negativos."
),
)
cfd40_Importe = fields.Char(
string="Atributo opcional (Importe)",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo opcional para precisar el importe total de los bienes o "
"servicios de la presente parte. Debe ser equivalente al resultado"
" de multiplicar la cantidad por el valor unitario expresado en la"
" parte. No se permiten valores negativos."
),
)
class InformacionAduanera(models.AbstractModel):
_description = "InformacionAduanera"
_name = "cfd.40.informacionaduanera"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Conceptos.Concepto.Parte.InformacionAduanera"
cfd40_InformacionAduanera_Concepto_id = fields.Many2one(
comodel_name="cfd.40.concepto", xsd_implicit=True, ondelete="cascade"
)
cfd40_InformacionAduanera_Parte_id = fields.Many2one(
comodel_name="cfd.40.parte", xsd_implicit=True, ondelete="cascade"
)
cfd40_NumeroPedimento = fields.Char(
string="Atributo requerido",
xsd_required=True,
help=(
"Atributo requerido para expresar el número del pedimento que "
"ampara la importación del bien que se expresa en el siguiente "
"formato: últimos 2 dígitos del año de validación seguidos por dos"
" espacios, 2 dígitos de la aduana de despacho seguidos por dos "
"espacios, 4 dígitos del número de la patente seguidos por dos "
"espacios, 1 dígito que corresponde al último dígito del año en "
"curso, salvo que se trate de un pedimento consolidado iniciado en"
" el año inmediato anterior o del pedimento original de una "
"rectificación, seguido de 6 dígitos de la numeración progresiva "
"por aduana."
),
)
class Impuestos(models.AbstractModel):
"""Nodo condicional para capturar los impuestos aplicables al presente
concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.impuestos"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Impuestos"
cfd40_Retenciones = fields.Many2one(
comodel_name="cfd.40.retenciones",
string="Nodo condicional",
help=(
"Nodo condicional para capturar los impuestos retenidos "
"aplicables. Es requerido cuando en los conceptos se registre "
"algún impuesto retenido."
),
)
cfd40_Traslados = fields.Many2one(
comodel_name="cfd.40.traslados",
string="Nodo condicional (Traslados)",
help=(
"Nodo condicional para capturar los impuestos trasladados "
"aplicables. Es requerido cuando en los conceptos se registre un "
"impuesto trasladado."
),
)
cfd40_TotalImpuestosRetenidos = fields.Char(
string="Atributo condicional",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo condicional para expresar el total de los impuestos "
"retenidos que se desprenden de los conceptos expresados en el "
"comprobante fiscal digital por Internet. No se permiten valores "
"negativos. Es requerido cuando en los conceptos se registren "
"impuestos retenidos."
),
)
cfd40_TotalImpuestosTrasladados = fields.Char(
string="TotalImpuestosTrasladados",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo condicional para expresar el total de los impuestos "
"trasladados que se desprenden de los conceptos expresados en el "
"comprobante fiscal digital por Internet. No se permiten valores "
"negativos. Es requerido cuando en los conceptos se registren "
"impuestos trasladados."
),
)
class Retenciones(models.AbstractModel):
"""Nodo opcional para asentar los impuestos retenidos aplicables al
presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.retenciones"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Impuestos.Retenciones"
cfd40_Retencion = fields.One2many(
"cfd.40.retencion",
"cfd40_Retencion_Retenciones_id",
string="Nodo requerido",
help=(
"Nodo requerido para la información detallada de una retención de "
"impuesto específico."
),
)
class Retencion(models.AbstractModel):
"""Nodo requerido para asentar la información detallada de una retención de
impuestos aplicable al presente concepto."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.retencion"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Impuestos.Retenciones.Retencion"
cfd40_Retencion_Retenciones_id = fields.Many2one(
comodel_name="cfd.40.retenciones", xsd_implicit=True, ondelete="cascade"
)
cfd40_Retencion_Retenciones_id = fields.Many2one(
comodel_name="cfd.40.retenciones", xsd_implicit=True, ondelete="cascade"
)
cfd40_Impuesto = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_Impuesto",
help=(
"Atributo requerido para señalar la clave del tipo de impuesto " "retenido."
),
)
cfd40_Importe = fields.Char(
string="Atributo requerido (Importe)",
xsd_required=True,
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo requerido para señalar el monto del impuesto retenido. "
"No se permiten valores negativos."
),
)
class Traslados(models.AbstractModel):
_description = "Traslados"
_name = "cfd.40.traslados"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Impuestos.Traslados"
cfd40_Traslado = fields.One2many(
"cfd.40.traslado",
"cfd40_Traslado_Traslados_id",
string="Nodo requerido",
help=(
"Nodo requerido para la información detallada de un traslado de "
"impuesto específico."
),
)
class Traslado(models.AbstractModel):
_description = "Traslado"
_name = "cfd.40.traslado"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Impuestos.Traslados.Traslado"
cfd40_Traslado_Traslados_id = fields.Many2one(
comodel_name="cfd.40.traslados", xsd_implicit=True, ondelete="cascade"
)
cfd40_Base = fields.Char(
string="Atributo requerido para señalar la suma",
xsd_required=True,
help=(
"Atributo requerido para señalar la suma de los atributos Base de "
"los conceptos del impuesto trasladado. No se permiten valores "
"negativos."
),
)
cfd40_Impuesto = fields.Char(
string="Atributo requerido",
xsd_required=True,
xsd_type="catCFDI:c_Impuesto",
help=(
"Atributo requerido para señalar la clave del tipo de impuesto "
"trasladado."
),
)
cfd40_TipoFactor = fields.Char(
string="Atributo requerido (TipoFactor)",
xsd_required=True,
xsd_type="catCFDI:c_TipoFactor",
help=(
"Atributo requerido para señalar la clave del tipo de factor que "
"se aplica a la base del impuesto."
),
)
cfd40_TasaOCuota = fields.Float(
string="Atributo condicional",
help=(
"Atributo condicional para señalar el valor de la tasa o cuota del"
" impuesto que se traslada por los conceptos amparados en el "
"comprobante."
),
)
cfd40_Importe = fields.Char(
string="Atributo condicional (Importe)",
xsd_type="tdCFDI:t_Importe",
help=(
"Atributo condicional para señalar la suma del importe del "
"impuesto trasladado, agrupado por impuesto, TipoFactor y "
"TasaOCuota. No se permiten valores negativos."
),
)
class Complemento(models.AbstractModel):
"""Nodo opcional donde se incluye el complemento Timbre Fiscal Digital de
manera obligatoria y los nodos complementarios determinados por el SAT,
de acuerdo con las disposiciones particulares para un sector o
actividad específica."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.complemento"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Complemento"
class Addenda(models.AbstractModel):
"""Nodo opcional para recibir las extensiones al presente formato que sean
de utilidad al contribuyente. Para las reglas de uso del mismo,
referirse al formato origen."""
_description = textwrap.dedent(" %s" % (__doc__,))
_name = "cfd.40.addenda"
_inherit = "spec.mixin.cfd"
_binding_type = "Comprobante.Addenda"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment