Skip to content

createNodeConcepto

Este método agrega un nodo cfdi:Concepto al comprobante, representando un producto o servicio incluido en la factura.
Cada concepto contiene información detallada como la descripción, clave del producto, unidad de medida, cantidad, importe y atributos relacionados con impuestos.

USO POR INSTANCIA: 1 a ilimitados.

ts
factura.createNodeConcepto({
  concepto: {...},
  impuestos: {...},
  aCuentaTerceros: {...},
  informacionAduanera: [...],
  cuentaPredial: [...],
});

Propiedad: concepto

Esta propiedad representa la información completa de un producto o servicio que será incluido en el comprobante como un nodo cfdi:Concepto.

Debe ser un objeto que contenga los datos fiscales y comerciales del concepto, como clave SAT, cantidad, unidad, precio, importe, impuestos, descuentos, entre otros.

Es un campo obligatorio al llamar createNodeConcepto().

ts
factura.createNodeConcepto({
  concepto: {
    claveProdServ: 50211503,
    cantidad: 1,
    claveUnidad: "H87",
    unidad: "Pieza",
    descripcion: "Cigarros",
    valorUnitario: 200,
    importe: 200,
    objetoImp: "02",
    noIdentificacion: "123456789",
    descuento: 0,
  },
});
PropiedadTipoDescripción
claveProdServc_ClaveProdServClave que permita clasificar los conceptos del comprobante como productos o servicios.
cantidadstring - numberCantidad de bienes o servicios que correspondan al concepto.
claveUnidadc_ClaveUnidadClave unidad del producto o servicio.
unidadstringNombre de la unidad de medida correspondiente a la claveUnidad.
descripcionstringDescripción del producto o servicio a facturar.
valorUnitariostring - numberValor o precio unitario del producto o servicio.
importestring - numberImporte total de producto o servicio, resultado de la multiplicación de la cantidad por el valorUnitario.
objetoImpc_ObjectoImpClave correspondiente para indicar si la operación es objeto o no de impuesto.
noIdentificacionstring(opcional) Identificador del producto o servicio, puede ser el código de barras, SKU o cualquier otro identificador.
descuentostring - number(opcional) Valor a aplicar al importe. debe contener la misma cantidad de decimales que el importe.

¿Para qué se utiliza?

Cada objeto concepto será transformado en un nodo XML individual que representa un ítem de la factura. Si el comprobante tiene múltiples productos o servicios, se deben pasar múltiples objetos concepto llamando al método varias veces.

Propiedad: impuestos

La propiedad impuestos dentro del objeto concepto permite definir los impuestos aplicables a cada producto o servicio facturado. Este campo se utiliza para desglosar los impuestos trasladados (como el IVA) o retenidos (como ISR o IVA retenido), según lo establecido en las reglas del SAT.

ts
factura.createNodeConcepto({
  concepto: {...},
  impuestos: { 
    traslados: [...], 
    retenciones: [...] 
  }, 
});

Cada concepto puede tener sus propios impuestos, los cuales se detallan dentro de esta propiedad. Es fundamental que coincidan con el valor de la propiedad objetoImp, ya que si el concepto no está sujeto a impuestos, esta propiedad debe omitirse.

A continuación, documentamos la subpropiedad traslados, que representa los impuestos trasladados al cliente, como el IVA.

Subpropiedad: traslados

La subpropiedad traslados permite especificar los impuestos trasladados al cliente dentro del concepto, como el IVA. Es un arreglo de objetos, ya que un mismo concepto puede incluir uno o más impuestos.

Cada objeto dentro del arreglo define un impuesto con su base, tipo, tasa o cuota, y el importe calculado.

ts
factura.createNodeConcepto({
  concepto: {...},
  impuestos: {
    traslados: [ 
      { 
        base: 1, 
        impuesto: "002", 
        tipoFactor: "Tasa", 
        tasaOCuota: 0.16, 
        importe: 0.16, 
      }, 
    ], 
  },
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
basestring - numberValor para el cálculo del impuesto que se traslada.
impuestoc_ImpuestoClave del tipo de impuesto aplicable.
tipoFactorc_TipoFactorTipo de factor que se aplica a la base del impuesto.
tasaOCuotastring - numberRequerido si el tipoFactor es distinto a "Exento". Valor de la tasa o cuota del impuesto.
importestring - numberRequerido si el tipoFactor es distinto a "Exento". Importe del impuesto trasladado que aplica a cada concepto.

Subpropiedad: retenciones

La subpropiedad retenciones permite declarar los impuestos retenidos aplicables al concepto, como ISR o IVA retenido. Al igual que traslados, se define como un arreglo de objetos, ya que pueden existir múltiples retenciones por concepto.

Estas retenciones deben reflejarse de forma correcta para cumplir con los requisitos del SAT y afectar correctamente los totales del CFDI.

ts
factura.createNodeConcepto({
  concepto: {...},
  impuestos: {
    retenciones: [
      {
        base: 1, 
        impuesto: "002", 
        tipoFactor: "Tasa", 
        tasaOCuota: 0.16, 
        importe: 0.16, 
      }, 
    ], 
  }, 
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
basestring - numberValor para el cálculo del impuesto que se retiene.
impuestoc_ImpuestoClave del tipo de impuesto aplicable.
tipoFactorc_TipoFactorTipo de factor que se aplica a la base del impuesto.
tasaOCuotastring - numberValor de la tasa o cuota del impuesto.
importestring - numberImporte del impuesto trasladado que aplica a cada concepto.

Propiedad: aCuentaTerceros

La propiedad aCuentaTerceros permite declarar que el concepto se factura a nombre y por cuenta de un tercero, en sustitución del antiguo complemento PorCuentaDeTerceros del CFDI 3.3. Con el estándar CFDI 4.0, el SAT eliminó ese complemento y lo reemplazó con el elemento <ACuentaTerceros> directamente dentro del nodo cfdi:Concepto.

Este nodo es útil cuando, por ejemplo, un comisionista, agente de cobranza o representante legal realiza operaciones en nombre de otra entidad.

ts
factura.createNodeConcepto({
  concepto: {...},
  aCuentaTerceros: {
    rfcACuentaTerceros: "FIMA420127R44", 
    nombreACuentaTerceros: "MARTON ALEJANDRO SANZI FIERROR", 
    regimenFiscalACuentaTerceros: 606, 
    domicilioFiscalACuentaTerceros: 64000, 
  }, 
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
rfcACuentaTercerosstringRFC del contribuyente Tercero.
nombreACuentaTercerosstringNombre, denominación o razón social del contribuyente Tercero.
regimenFiscalACuentaTercerosc_RegimenFiscalClave del régimen del contribuyente Tercero.
domicilioFiscalACuentaTercerosstring - numberCódigo postal del domicilio fiscal del Tercero.

Propiedad: informacionAduanera

La propiedad informacionAduanera permite declarar los datos del pedimento aduanal correspondiente a mercancías importadas. Este nodo debe incluirse cuando el producto o servicio facturado proviene del comercio exterior, es decir, cuando fue importado legalmente al país.

Cada entrada en el arreglo representa un pedimento aduanal válido, registrado ante la autoridad aduanera.

ts
fac.createNodeConcepto({
  concepto: {...},
  informacionAduanera: [
    {
      numeroPedimento: "12345678", 
    }, 
  ], 
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
numeroPedimentostringNúmero del pedimento que ampara la importación del producto.

Propiedad: cuentaPredial

La propiedad cuentaPredial se utiliza cuando el concepto facturado está relacionado con el uso, goce o arrendamiento de un inmueble, y dicho inmueble cuenta con un número de cuenta predial registrado ante una entidad catastral.

Este dato permite identificar el bien inmueble con precisión y es requerido por el SAT en operaciones que involucren propiedad raíz.

ts
factura.createNodeConcepto({
  concepto: {...},
  cuentaPredial: [
    {
      numero: "aB3cD4eF5gH6iJ7kL8mN9oP0", 
    }, 
  ], 
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
numerostringNúmero de la cuenta predial del inmueble.

ℹ️ ¿Cuándo debe usarse?

Este nodo es obligatorio cuando se emite un CFDI por:

Arrendamiento de inmuebles

Uso temporal de terrenos, locales o propiedades

Cualquier servicio vinculado a un bien inmueble registrado

Propiedad: complementoConcepto

La propiedad complementoConcepto permite incluir complementos específicos directamente dentro de un concepto. Estos complementos son estructuras XML adicionales definidas por el SAT para ciertos sectores o actividades (por ejemplo: educación, arrendamiento, donativos, notarios, etc.).

Se utiliza cuando un producto o servicio requiere información adicional normativa según su giro o sector regulado.

ts
factura.createNodeConcepto({
  concepto: {...},
  complementoConcepto: [ 
    { 
      node: "iedu:instEducativas", 
      attributes: { 
        "xmlns:iedu": "http://www.sat.gob.mx/iedu", 
        rfcPago: "CACX7605101P8", 
      }, 
    }, 
  ], 
});

Parámetros disponibles

A continuación se muestra una tabla con las propiedades que acepta este método:

PropiedadTipoDescripción
nodestringNombre del nodo del complemento con prefijo.
attributesobjectAtributos del nodo. Se definen como un objeto plano con claves y valores.

Complementos comunes por concepto

Algunos de los complementos que pueden usarse en conceptos incluyen:

iedu:instEducativas – Instituciones educativas privadas

donat:Donatarias – Donatarias autorizadas

notarios:NotariosPublicos – Operaciones ante notarios

valesdedespensa:ValesDeDespensa – Vales entregados por la empresa

Propiedad: parte

La propiedad parte permite desglosar un concepto en subcomponentes o productos individuales que lo integran. Es útil cuando un concepto general (como un paquete, kit o servicio compuesto) está formado por varios productos o servicios más pequeños, los cuales se desean describir individualmente sin facturarlos por separado.

Cada elemento dentro del arreglo representa una parte que conforma el concepto principal, y puede incluir también información aduanera si aplica.

ts
factura.createNodeConcepto({
  concepto: {...},
  parte: [ 
    { 
      concepto: { 
        cantidad: "2", 
        claveProdServ: "10101501", 
        descripcion: "Parte de prueba", 
        unidad: "MTR", 
        noIdentificacion: "P-12345", 
        valorUnitario: "50.00", 
        importe: "100.00", 
      }, 
      informacionAduanera: [ 
        { 
          numeroPedimento: "12345678", 
        }, 
      ], 
    }, 
  ], 
});

Subpropiedad: concepto

El objeto concepto dentro de una parte describe el producto o servicio específico que forma parte del concepto principal.

ts
factura.createNodeConcepto({
  concepto: {...},
  parte: [
    {
      concepto: { 
        cantidad: "2", 
        claveProdServ: "10101501", 
        descripcion: "Parte de prueba", 
        unidad: "MTR", 
        noIdentificacion: "P-12345", 
        valorUnitario: "50.00", 
        importe: "100.00", 
      }, 
      informacionAduanera: [
        {
          numeroPedimento: "12345678",
        },
      ],
    },
  ],
});
PropiedadTipoDescripción
cantidadstring - numberCantidad de unidades de la parte.
claveProdServc_ClaveProdServClave del producto o servicio según el catálogo del SAT.
descripcionstringDescripción detallada del componente.
unidadstringUnidad de medida.
noIdentificacionstring(opcional) Número de identificación interna del producto.
valorUnitariostring - numberPrecio unitario (sin impuestos ni descuentos).
importestring - numberImporte total del componente.

Subpropiedad: informacionAduanera

Este campo es opcional y permite indicar si la parte fue importada, incluyendo el número de pedimento aduanal correspondiente.

ts
factura.createNodeConcepto({
  concepto: {...},
  parte: [
    {
      concepto: {
        cantidad: "2",
        claveProdServ: "10101501",
        descripcion: "Parte de prueba",
        unidad: "MTR",
        noIdentificacion: "P-12345",
        valorUnitario: "50.00",
        importe: "100.00",
      },
      informacionAduanera: [ 
        { 
          numeroPedimento: "12345678", 
        }, 
      ], 
    },
  ],
});
PropiedadTipoDescripción
numeroPedimentostringNúmero de pedimento aduanal válido conforme a la estructura del SAT.

Lanzado bajo la licencia MIT.