13 de junio de 2026
El array de IVA (AlicIva) en WSFEv1: cuándo es obligatorio (errores 10018 a 10021)
En WSFEv1, si ImpIVA es mayor a 0 tenés que mandar el array de IVA (objeto Iva con AlicIva) o AFIP rechaza con error 10018. Cada AlicIva necesita Id (alícuota válida de FEParamGetTiposIva, error 10019), BaseImp mayor a 0 (10020) e Importe (10021). Nada de esto aplica a Factura C, que no discrimina IVA.
Cuándo el array de IVA es obligatorio (10018)
Si tu comprobante tiene IVA (ImpIVA > 0), el array de IVA es obligatorio. Textual del manual (código 10018):
«Si <ImpIVA> es mayor a 0 el objeto <IVA> y <AlicIva> son obligatorios. El objeto <AlicIva> es obligatorio y no debe ser nulo si ingresa <IVA>. No aplica para comprobantes tipo C».
Dos consecuencias clave:
- Factura C (Monotributo) no informa AlicIva — no discrimina IVA, así que todo este bloque no aplica para tipo C.
- Si
ImpIVA = 0, el manual indica que «los objetos<IVA>y<AlicIva>solo deben informarse con ImpIVA = 3 (iva 0)» — en la práctica, informando la alícuota de IVA 0% (Id 3); confirmá los Id con FEParamGetTiposIva.
Los tres campos de cada AlicIva (10019, 10020, 10021)
| Código | Campo de AlicIva |
|---|---|
| 10019 | Id obligatorio, y debe ser un valor devuelto por FEParamGetTiposIva |
| 10020 | BaseImp obligatorio y mayor a 0 |
| 10021 | Importe obligatorio y mayor o igual a 0 |
Citas textuales del manual oficial de ARCA (WSFEv1):
- 10019 → «El campo Id en AlicIVA es obligatorio informarlo. Si el tipo de comprobante es 2, 3, 7, 8, 52 o 53 informarlo es opcional. Siempre que se informe Id, debe ser un valor devuelto por el método FEParamGetTiposIva».
- 10020 → «El campo BaseImp en AlicIVA es obligatorio y debe ser mayor a 0. Excepto para comprobantes 2, 3, 7, 8, 52 o 53 que puede ser cero o no ser informado».
- 10021 → «El campo Importe en AlicIVA es obligatorio, mayor o igual 0. Excepto para comprobantes 2, 3, 7, 8, 52 o 53 que puede ser cero o no ser informado».
Los tres llevan la aclaración «No aplica para comprobantes tipo C».
Ejemplo y el caso Factura C
// Factura A/B con IVA 21%: el array de IVA es obligatorio
const voucher = {
ImpNeto: 10000,
ImpIVA: 2100,
Iva: [
// Id 5 = 21% — confirmá las alícuotas con FEParamGetTiposIva
{ Id: 5, BaseImp: 10000, Importe: 2100 },
],
};
// Factura C (Monotributo): NO se informa AlicIva — no discrimina IVAEl BaseImp y el Importe de cada AlicIva tienen que cerrar contra ImpNeto e ImpIVA (y la suma entra en el control 10048 de ImpTotal). Calcular eso con floats arrastra fracciones de centavo: hacé la aritmética en centavos enteros por alícuota.
Checklist:
ImpIVA > 0→ mandá el arrayIvacon al menos unAlicIva→ evita 10018.AlicIva.Idde FEParamGetTiposIva → evita 10019.AlicIva.BaseImp > 0→ evita 10020;AlicIva.Importe >= 0→ evita 10021.- Factura C (tipo C): no se informa AlicIva.