Last active
April 13, 2023 04:49
-
-
Save rvalyi/6f158be7e8865cd24833a4b2791851c6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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