Condicin IVA para facturacin

RunLLM
RunLLM

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:

Sources:

Mauricio Calgaro
Mauricio Calgaro

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

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user cuales son los ID para cuando en RegisterInscriptionProof la condición es "consumidor Final" o "iva exento"?

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user Quiero que anexes al ejemplo anterior el mapeo de los ID 4 y 5

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user puede un contribuyente tener mas de una condición de IVA?

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@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?

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@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

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user tanto para factura A como para factura B tengo que usar CUIT? no puedo generar una B ingresando el DNI en DocNro?

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user si, dame un ejemplo de factura B con DNI

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user que pasa si hago una factura B con DNI y el monto supera los $418000 (limite para identificar el contribuyente)?

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@user dame un ejemplo de factura a IVA exento

RunLLM
RunLLM

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:

Mauricio Calgaro
Mauricio Calgaro

@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?

RunLLM
RunLLM

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: