Resolución N° 5.616/2024. Más información

Crear Factura Electrónica de ARCA en Replit

Con prompt listo para pegar


Crear Factura Electrónica de ARCA en Replit

Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.

Conectar tu sistema con la facturación electrónica de ARCA

Conectar tu sistema con la facturación electrónica de ARCA

Guía paso a paso

El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).

En este tutorial vamos a usar Replit para crear una app con formulario y backend Express. El backend va a llamar al web service de factura electrónica (wsfe) usando Afip SDK API.

Requisitos previos

Para poder seguir esta guía, primero necesitarás:

Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT 20409378472 sin obtener un certificado propio.

Cuando quieras usar tu CUIT, podés seguir la guía para usar tu propio certificado para desarrollo.

Crear el proyecto en Replit

Creá un nuevo Repl de Node.js.

Configurar el token

Antes de pedirle a Replit Agent que genere la app, agregá estos secrets desde Tools > Secrets:

  • AFIP_SDK_ACCESS_TOKEN: tu access_token de Afip SDK
  • AFIP_TAX_ID: 20409378472
  • AFIP_ENVIRONMENT: dev

Prompt listo para pegar en Replit

Abrí Replit Agent y pegá este prompt:

Quiero crear una app en Replit para emitir Factura Electrónica de ARCA usando Afip SDK API.

Necesito que generes toda la app lista para usar.

Stack:
- Node.js
- Express
- Frontend simple con HTML, CSS y JavaScript
- Backend Express para llamar a Afip SDK API

Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener CAE y vencimiento del CAE.
- Mostrar el resultado en pantalla.

Reglas importantes:
- No llames a Afip SDK API desde el frontend.
- No muestres el access token en HTML ni JavaScript del navegador.
- Usá `process.env.AFIP_SDK_ACCESS_TOKEN`.
- La app debe limitarse a emitir el comprobante y mostrar el CAE.

Secrets disponibles:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev

Crear estos archivos:
- `package.json`
- `server.js`
- `public/index.html`
- `public/styles.css`
- `public/app.js`

Pantalla:
- Título: "Emitir Factura Electrónica de ARCA".
- Formulario con:
  - Punto de venta, default 1.
  - Tipo de comprobante, default 6.
  - Concepto, default 1.
  - Tipo de documento, default 99.
  - Número de documento, default 0.
  - Importe neto, default 100.
  - IVA, default 21.
  - Condición IVA receptor, default 5.
- Botón "Emitir factura".
- Caja de resultado con número de comprobante, CAE y vencimiento.
- Caja de error con mensajes entendibles.

Backend:
Crear `POST /api/facturas/emitir`.

Ese endpoint debe:

1. Leer los datos del formulario.
2. Llamar a Afip SDK API para obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
  "environment": "dev",
  "tax_id": "20409378472",
  "wsid": "wsfe"
}

3. Con el `token` y `sign` de la respuesta, obtener el último comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
  "environment": "dev",
  "method": "FECompUltimoAutorizado",
  "wsid": "wsfe",
  "params": {
    "Auth": {
      "Token": token,
      "Sign": sign,
      "Cuit": "20409378472"
    },
    "PtoVta": puntoDeVenta,
    "CbteTipo": tipoDeComprobante
  }
}

4. Calcular `nextVoucherNumber` como `FECompUltimoAutorizadoResult.CbteNro + 1`.

5. Crear la factura:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
  "environment": "dev",
  "method": "FECAESolicitar",
  "wsid": "wsfe",
  "params": {
    "Auth": {
      "Token": token,
      "Sign": sign,
      "Cuit": "20409378472"
    },
    "FeCAEReq": {
      "FeCabReq": {
        "CantReg": 1,
        "PtoVta": puntoDeVenta,
        "CbteTipo": tipoDeComprobante
      },
      "FeDetReq": {
        "FECAEDetRequest": {
          "Concepto": concepto,
          "DocTipo": docTipo,
          "DocNro": docNro,
          "CbteDesde": nextVoucherNumber,
          "CbteHasta": nextVoucherNumber,
          "CbteFch": fechaActualYYYYMMDD,
          "ImpTotal": importeNeto + importeIVA,
          "ImpTotConc": 0,
          "ImpNeto": importeNeto,
          "ImpOpEx": 0,
          "ImpIVA": importeIVA,
          "ImpTrib": 0,
          "MonId": "PES",
          "MonCotiz": 1,
          "CondicionIVAReceptorId": condicionIVAReceptorId,
          "Iva": {
            "AlicIva": [
              {
                "Id": 5,
                "BaseImp": importeNeto,
                "Importe": importeIVA
              }
            ]
          }
        }
      }
    }
  }
}

6. Extraer de la respuesta:
- CAE
- CAEFchVto
- CbteDesde

7. Devolver al frontend:
{
  "success": true,
  "voucherNumber": CbteDesde,
  "cae": CAE,
  "caeExpiration": CAEFchVto
}

Manejo de errores:
- Si Afip SDK API responde con error, devolver `success: false` y un mensaje claro.
- Si aparece error 10016, explicar que el número de comprobante no es el próximo autorizado.
- Si aparece error 10242, explicar que falta la condición IVA receptor.
- Loguear detalles en consola del servidor, pero no mostrar secrets.

Agregá instrucciones en pantalla para que el usuario solo complete importes y presione "Emitir factura".

Probar la emisión

Cuando Replit termine de generar la app, presioná Run.

Con los valores iniciales, la app debería emitir una Factura B de prueba por $121 en ambiente dev.

Al finalizar, la pantalla debe mostrar:

  • Número de comprobante
  • CAE
  • Vencimiento del CAE

Ejemplos de otros tipos de comprobantes

Problemas comunes

Si estás teniendo el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar, te recomiendo leer este artículo.

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Pasos para resolver este error

Si estás teniendo el error (10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor, te recomiendo leer este artículo.

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Pasos para resolver este error

Luego, lo único que queda es pasar a modo producción. Podés seguir la guía para pasar a producción con Afip SDK.


Ante cualquier duda o pregunta, podés resolverla rápidamente en la Comunidad Afip SDK.

Conéctate a ARCA hoy mismo

Evitá la complejidad de ARCA. Con Afip SDK integrás tu sistema en minutos y te enfocás en hacer crecer tu negocio.