Debes consultar el padrón de constancia de inscripción para ese CUIT y revisar los impuestos en los campos datosRegimenGeneral.impuesto o datosMonotributo.impuesto. Si aparece "IVA" (idImpuesto 30), es Responsable Inscripto; si aparece "MONOTRIBUTO" (idImpuesto 20), es Monotributista, etc. Luego, debes mapear ese resultado al ID correspondiente para el campo CondicionIVAReceptorId al emitir la factura, usando la tabla de condiciones de IVA provista por el método FEParamGetCondicionIvaReceptor del SDK. Los IDs del padrón y los de la condición de IVA no son iguales, por lo que el mapeo es manual según la documentación oficial.
Puedes ver un ejemplo detallado de cómo obtener y mapear estos datos en la guía oficial y en el blog de Afip SDK. ¿Te gustaría ver un ejemplo de código paso a paso para este proceso?
Fuentes:
- Obtener condición frente al IVA de un CUIT vía web service
- Solución a error 10242: El campo Condicion IVA receptor no es un valor valido/es obligatorio
Sources:
Dame un ejemplo en Node JS donde pueda hacer este mapeo y asi obtener la condición correcta del contribuyente
@user Dame un ejemplo en Node JS donde pueda hacer este mapeo y asi obtener la condición correcta del contribuyente
Claro. Primero consulta los datos del contribuyente usando el método getTaxpayerDetails del padrón de constancia de inscripción. Luego, según el impuesto encontrado, asigna el ID correspondiente para el campo CondicionIVAReceptorId usando la tabla oficial. Aquí tienes un ejemplo básico:
// Ejemplo Node.js usando Afip SDK
const taxId = 20111111111; // CUIT a consultar
const taxpayerDetails = await afip.RegisterInscriptionProof.getTaxpayerDetails(taxId);
// Mapeo manual según los impuestos encontrados
let condicionIVA = null;
if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 30)) {
condicionIVA = 1; // Responsable Inscripto
} else if (taxpayerDetails.datosMonotributo?.impuesto?.some(i => i.idImpuesto === 20)) {
condicionIVA = 6; // Responsable Monotributo
} else if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 34)) {
condicionIVA = 15; // IVA No Alcanzado
} // Agrega más condiciones según la tabla oficial
console.log('CondicionIVAReceptorId:', condicionIVA);
¿Te gustaría ver el ejemplo extendido con todos los posibles casos de la tabla de condiciones?
Sources:
@user cuales son los ID para cuando en RegisterInscriptionProof la condición es "consumidor Final" o "iva exento"?
Para "Consumidor Final" el ID es 5 y para "IVA Sujeto Exento" el ID es 4, según la tabla oficial de condiciones frente al IVA que debes usar en el campo CondicionIVAReceptorId al emitir la factura. Estos IDs no dependen del valor devuelto por el padrón, sino del mapeo manual que se realiza según la descripción del impuesto encontrado.
¿Necesitas la lista completa de IDs y descripciones para todas las condiciones?
Sources:
@user Quiero que anexes al ejemplo anterior el mapeo de los ID 4 y 5
Por supuesto, aquí tienes el ejemplo en Node.js ampliado para incluir el mapeo de "IVA Sujeto Exento" (ID 4) y "Consumidor Final" (ID 5):
// Ejemplo Node.js usando Afip SDK
const taxId = 20111111111; // CUIT a consultar
const taxpayerDetails = await afip.RegisterInscriptionProof.getTaxpayerDetails(taxId);
let condicionIVA = null;
if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 30)) {
condicionIVA = 1; // Responsable Inscripto
} else if (taxpayerDetails.datosMonotributo?.impuesto?.some(i => i.idImpuesto === 20)) {
condicionIVA = 6; // Responsable Monotributo
} else if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 34)) {
condicionIVA = 15; // IVA No Alcanzado
} else if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 32)) {
condicionIVA = 4; // IVA Sujeto Exento
} else if (taxpayerDetails.datosRegimenGeneral?.impuesto?.some(i => i.idImpuesto === 0)) {
condicionIVA = 5; // Consumidor Final (caso especial, normalmente sin impuestos)
}
console.log('CondicionIVAReceptorId:', condicionIVA);
¿Te gustaría que agregue el resto de los posibles mapeos de la tabla oficial?
Sources:
@user puede un contribuyente tener mas de una condición de IVA?
No, un contribuyente solo puede tener una condición frente al IVA a la vez, como Responsable Inscripto, Monotributista, Exento, etc. Los datos del padrón pueden listar varios impuestos, pero la condición de IVA es única y se determina según el impuesto principal relacionado al IVA encontrado en el padrón, como "IVA" (idImpuesto 30) o "MONOTRIBUTO" (idImpuesto 20) fuente.
¿Te gustaría saber cómo identificar correctamente la condición si aparecen varios impuestos en la consulta?
Sources:
@user Pero si un contribuyente es responsable monotributo, puedo hacerle la factura como consumidor final también si uso ese ID o sería incorrecto?
Parece que no sería correcto: si el receptor es Responsable Monotributo, debes usar el ID correspondiente a esa condición (ID 6) y no el de Consumidor Final (ID 5). El campo CondicionIVAReceptorId debe reflejar la verdadera condición fiscal del receptor según el padrón, no una genérica como Consumidor Final, salvo que realmente no se identifique al cliente fuente.
¿Te gustaría ver ejemplos de cuándo corresponde usar cada ID en la práctica?
Sources:
@user OK, dame ahora un ejemplo de emision de factura B a un responsable monotributo y otro ejemplo de factura A a un responsable inscripto
Para emitir una factura B a un Responsable Monotributo, debes usar el ID 6 en CondicionIVAReceptorId. Para una factura A a un Responsable Inscripto, usa el ID 1. Aquí tienes ejemplos en Node.js:
Factura B a Responsable Monotributo:
const dataB = {
CantReg: 1,
PtoVta: 1,
CbteTipo: 6, // Factura B
Concepto: 1,
DocTipo: 80, // CUIT
DocNro: 20111111112, // CUIT del receptor
CbteDesde: 1,
CbteHasta: 1,
CbteFch: 20240501,
ImpTotal: 121,
ImpTotConc: 0,
ImpNeto: 100,
ImpOpEx: 0,
ImpIVA: 21,
ImpTrib: 0,
MonId: 'PES',
MonCotiz: 1,
Iva: [{ Id: 5, BaseImp: 100, Importe: 21 }],
CondicionIVAReceptorId: 6 // Responsable Monotributo
};
const resB = await afip.ElectronicBilling.createVoucher(dataB);
console.log(resB);
Factura A a Responsable Inscripto:
const dataA = {
CantReg: 1,
PtoVta: 1,
CbteTipo: 1, // Factura A
Concepto: 1,
DocTipo: 80, // CUIT
DocNro: 20111111113, // CUIT del receptor
CbteDesde: 1,
CbteHasta: 1,
CbteFch: 20240501,
ImpTotal: 121,
ImpTotConc: 0,
ImpNeto: 100,
ImpOpEx: 0,
ImpIVA: 21,
ImpTrib: 0,
MonId: 'PES',
MonCotiz: 1,
Iva: [{ Id: 5, BaseImp: 100, Importe: 21 }],
CondicionIVAReceptorId: 1 // Responsable Inscripto
};
const resA = await afip.ElectronicBilling.createVoucher(dataA);
console.log(resA);
¿Te gustaría ver cómo se obtiene el CAE y el vencimiento en la respuesta?
Sources:
@user tanto para factura A como para factura B tengo que usar CUIT? no puedo generar una B ingresando el DNI en DocNro?
Sí, puedes generar una factura B usando DNI (DocTipo 96) y el número de DNI en DocNro; no es obligatorio usar CUIT, salvo que el monto supere el límite establecido por AFIP, donde sí se requiere identificar al receptor con CUIT u otro documento válido distinto de consumidor final fuente.
Para factura A, solo puedes usar CUIT, ya que está destinada a responsables inscriptos y la normativa exige ese dato. ¿Te gustaría ver un ejemplo de factura B con DNI?
Sources:
@user si, dame un ejemplo de factura B con DNI
Aquí tienes un ejemplo de emisión de factura B usando DNI (DocTipo 96) y el número de DNI en DocNro:
const data = {
CantReg: 1,
PtoVta: 1,
CbteTipo: 6, // Factura B
Concepto: 1,
DocTipo: 96, // DNI
DocNro: 30123456, // Número de DNI del receptor
CbteDesde: 1,
CbteHasta: 1,
CbteFch: 20240501,
ImpTotal: 121,
ImpTotConc: 0,
ImpNeto: 100,
ImpOpEx: 0,
ImpIVA: 21,
ImpTrib: 0,
MonId: 'PES',
MonCotiz: 1,
Iva: [{ Id: 5, BaseImp: 100, Importe: 21 }]
};
const res = await afip.ElectronicBilling.createVoucher(data);
console.log(res);
¿Te gustaría ver cómo adaptar este ejemplo para otros tipos de documento?
Sources:
@user que pasa si hago una factura B con DNI y el monto supera los $418000 (limite para identificar el contribuyente)?
Mi entendimiento es que, si el monto de la factura B supera el límite de $418.000, debes identificar al receptor con un documento válido (CUIT, CUIL o DNI real) y no puedes usar "Consumidor Final" (DocTipo 99, DocNro 0). Si usas DNI, el número debe ser correcto y corresponder a la persona; de lo contrario, AFIP puede rechazar el comprobante o considerarlo inválido en una inspección fuente.
¿Te gustaría ver ejemplos de validación o recomendaciones para estos casos?
Sources:
@user dame un ejemplo de factura a IVA exento
Aquí tienes un ejemplo de emisión de factura B a un receptor "IVA Sujeto Exento" (CondicionIVAReceptorId: 4). Debes identificar al receptor con CUIT y usar el ID 4 para la condición de IVA:
const data = {
CantReg: 1,
PtoVta: 1,
CbteTipo: 6, // Factura B
Concepto: 1,
DocTipo: 80, // CUIT
DocNro: 20112223334, // CUIT del receptor exento
CbteDesde: 1,
CbteHasta: 1,
CbteFch: 20240501,
ImpTotal: 121,
ImpTotConc: 0,
ImpNeto: 100,
ImpOpEx: 0,
ImpIVA: 21,
ImpTrib: 0,
MonId: 'PES',
MonCotiz: 1,
Iva: [{ Id: 5, BaseImp: 100, Importe: 21 }],
CondicionIVAReceptorId: 4 // IVA Sujeto Exento
};
const res = await afip.ElectronicBilling.createVoucher(data);
console.log(res);
¿Te gustaría ver cómo adaptar este ejemplo para otros tipos de comprobante?
Sources:
@user si la factura es a consumidor final y es menor al monto de 418000 (el limite para cargarlo con datos del contribuyente) no necesita tener el CondicionIVAReceptorId en el cuerpo de la constante data, correcto?
No, es obligatorio incluir el campo CondicionIVAReceptorId en todas las facturas electrónicas, incluso para consumidor final y montos menores al límite, según la Resolución General ARCA N° 5616/2024. Para consumidor final, debes usar el ID 5 en ese campo, aunque el resto de los datos sean DocTipo 99 y DocNro 0 fuente.
¿Te gustaría ver un ejemplo concreto de cómo armar el objeto data para este caso?
Sources: