Skip to content

Alta de comprobantes

Luke Hourquebie edited this page Sep 10, 2021 · 1 revision

Introducción

El objetivo principal de esta API es el alta de comprobantes, por lo que el propósito de esta página es el de explicar cómo realizar la integración del mismo.

El endpoint de alta de comprobantes de esta API cuenta con numerosas validaciones junto a sus respectivos mensajes de error, lo cual sirve para rápidamente detectar problemas antes de que la petición sea efectivamente enviada a AFIP. Más allá de eso, la API posibilita que el usuario no tenga que preocuparse por indicarle el número de comprobante, el cual se calcula automáticamente incrementando el valor del último comprobante emitido (en los web services de AFIP se requiere acción manual para esto).

Para dar soporte a varios tipos de facturas, conceptos y tributos, la API dispone de varios endpoints para consultar información que llamamos "datos estáticos". Para poder generar comprobantes, es necesario utilizar cada uno de estos identificadores para determinar, por ejemplo, que se quiere emitir una factura A con servicios como conceptos, con impuestos de IVA, Ingresos Brutos y percepciones.

Datos estáticos

Existen varios datos estáticos importantes a utilizar durante la generación de un comprobante. Ninguno de los endpoints siguientes tiene parámetros de entrada más allá de la autenticación correspondiente como entidad para consultarlos.

Tipos de comprobantes

Retorna los diferentes tipos de comprobantes. Es necesario utilizar un identificador de ellos (id) para el parámetro bill_type_id en el alta de un comprobante.

Endpoint

GET /v1/bill_types

Respuesta

[
  {
    "id":"1",
    "name":"Factura A"
  },
  {
    "id":"2",
    "name":"Nota de Débito A"
  },
  {
    "id":"3",
    "name":"Nota de Crédito A"
  },
  {
    "id":"6",
    "name":"Factura B"
  },
  {
    "id":"7",
    "name":"Nota de Débito B"
  },
  {
    "id":"8",
    "name":"Nota de Crédito B"
  },
  {
    "id":"4",
    "name":"Recibos A"
  },
  {
    "id":"5",
    "name":"Notas de Venta al contado A"
  },
  {
    "id":"9",
    "name":"Recibos B"
  },
  {
    "id":"10",
    "name":"Notas de Venta al contado B"
  },
  {
    "id":"63",
    "name":"Liquidacion A"
  },
  {
    "id":"64",
    "name":"Liquidacion B"
  },
  {
    "id":"34",
    "name":"Cbtes. A del Anexo I, Apartado A,inc.f),R.G.Nro. 1415"
  },
  {
    "id":"35",
    "name":"Cbtes. B del Anexo I,Apartado A,inc. f),R.G. Nro. 1415"
  },
  {
    "id":"39",
    "name":"Otros comprobantes A que cumplan con R.G.Nro. 1415"
  },
  {
    "id":"40",
    "name":"Otros comprobantes B que cumplan con R.G.Nro. 1415"
  },
  {
    "id":"60",
    "name":"Cta de Vta y Liquido prod. A"
  },
  {
    "id":"61",
    "name":"Cta de Vta y Liquido prod. B"
  },
  {
    "id":"11",
    "name":"Factura C"
  },
  {
    "id":"12",
    "name":"Nota de Débito C"
  },
  {
    "id":"13",
    "name":"Nota de Crédito C"
  },
  {
    "id":"15",
    "name":"Recibo C"
  },
  {
    "id":"49",
    "name":"Comprobante de Compra de Bienes Usados a Consumidor Final"
  },
  {
    "id":"51",
    "name":"Factura M"
  },
  {
    "id":"52",
    "name":"Nota de Débito M"
  },
  {
    "id":"53",
    "name":"Nota de Crédito M"
  },
  {
    "id":"54",
    "name":"Recibo M"
  }
]

Tipos de conceptos

Retorna los diferentes tipos de conceptos de un comprobante. Es necesario utilizar un identificador de ellos (id) para el parámetro concept_type_id en el alta de un comprobante.

Endpoint

GET /v1/concept_types

Respuesta

[
  {
    "id":"1",
    "name":"Producto"
  },
  {
    "id":"2",
    "name":"Servicios"
  },
  {
    "id":"3",
    "name":"Productos y Servicios"
  }
]

Tipos de documentos

Retorna los diferentes tipos de documentos de un comprobante, y se utiliza para indicar el tipo de documento del receptor del mismo. Es necesario utilizar un identificador de ellos (id) para el parámetro recipient_type_id en el alta de un comprobante.

Endpoint

GET /v1/document_types

Respuesta

[
  {
    "id":"80",
    "name":"CUIT"
  },
  {
    "id":"86",
    "name":"CUIL"
  },
  {
    "id":"87",
    "name":"CDI"
  },
  {
    "id":"89",
    "name":"LE"
  },
  {
    "id":"90",
    "name":"LC"
  },
  {
    "id":"91",
    "name":"CI Extranjera"
  },
  {
    "id":"92",
    "name":"en trámite"
  },
  {
    "id":"93",
    "name":"Acta Nacimiento"
  },
  {
    "id":"95",
    "name":"CI Bs. As. RNP"
  },
  {
    "id":"96",
    "name":"DNI"
  },
  {
    "id":"94",
    "name":"Pasaporte"
  },
  {
    "id":"0",
    "name":"CI Policía Federal"
  },
  {
    "id":"1",
    "name":"CI Buenos Aires"
  },
  {
    "id":"2",
    "name":"CI Catamarca"
  },
  {
    "id":"3",
    "name":"CI Córdoba"
  },
  {
    "id":"4",
    "name":"CI Corrientes"
  },
  {
    "id":"5",
    "name":"CI Entre Ríos"
  },
  {
    "id":"6",
    "name":"CI Jujuy"
  },
  {
    "id":"7",
    "name":"CI Mendoza"
  },
  {
    "id":"8",
    "name":"CI La Rioja"
  },
  {
    "id":"9",
    "name":"CI Salta"
  },
  {
    "id":"10",
    "name":"CI San Juan"
  },
  {
    "id":"11",
    "name":"CI San Luis"
  },
  {
    "id":"12",
    "name":"CI Santa Fe"
  },
  {
    "id":"13",
    "name":"CI Santiago del Estero"
  },
  {
    "id":"14",
    "name":"CI Tucumán"
  },
  {
    "id":"16",
    "name":"CI Chaco"
  },
  {
    "id":"17",
    "name":"CI Chubut"
  },
  {
    "id":"18",
    "name":"CI Formosa"
  },
  {
    "id":"19",
    "name":"CI Misiones"
  },
  {
    "id":"20",
    "name":"CI Neuquén"
  },
  {
    "id":"21",
    "name":"CI La Pampa"
  },
  {
    "id":"22",
    "name":"CI Río Negro"
  },
  {
    "id":"23",
    "name":"CI Santa Cruz"
  },
  {
    "id":"24",
    "name":"CI Tierra del Fuego"
  },
  {
    "id":"99",
    "name":"Doc. (Otro)"
  }
]

Tipos de IVA

Retorna los diferentes tipos de IVA para un comprobante. En el parámetro iva del alta de comprobantes, que es un arreglo, los atributos id de cada elemento están dados por los identificadores (id) de la respuesta de este endpoint.

Endpoint

GET /v1/iva_types

Respuesta

[
  {
    "id":"3",
    "name":"0%"
  },
  {
    "id":"4",
    "name":"10.5%"
  },
  {
    "id":"5",
    "name":"21%"
  },
  {
    "id":"6",
    "name":"27%"
  },
  {
    "id":"8",
    "name":"5%"
  },
  {
    "id":"9",
    "name":"2.5%"
  }
]

Tipos de tributos

Retorna los diferentes tipos de tributos para un comprobante. En el parámetro taxes del alta de comprobantes, que es un arreglo, los atributos id de cada elemento están dados por los identificadores (id) de la respuesta de este endpoint.

Endpoint

GET /v1/tax_types

Respuesta

[
  {
    "id":"1",
    "name":"Impuestos nacionales"
  },
  {
    "id":"2",
    "name":"Impuestos provinciales"
  },
  {
    "id":"3",
    "name":"Impuestos municipales"
  },
  {
    "id":"4",
    "name":"Impuestos Internos"
  },
  {
    "id":"99",
    "name":"Otro"
  },
  {
    "id":"5",
    "name":"IIBB"
  },
  {
    "id":"6",
    "name":"Percepción de IVA"
  },
  {
    "id":"7",
    "name":"Percepción de IIBB"
  },
  {
    "id":"8",
    "name":"Percepciones por Impuestos Municipales"
  },
  {
    "id":"9",
    "name":"Otras Percepciones"
  },
  {
    "id":"13",
    "name":"Percepción de IVA a no Categorizado"
  }
]

Puntos de venta

Retorna los diferentes puntos de venta registros por la entidad que consulta. Es necesario utilizar un identificador de ellos (id) para el parámetro sale_point_id en el alta de un comprobante.

Endpoint

GET /v1/sale_points

Respuesta

[
    {
        "id": "3",
        "name": "0003",
        "type": "CAE - Ri Iva",
        "enabled": true
    }
]

Alta de un comprobante

Ya detallados los datos estáticos, lo siguiente es generar un comprobante. Para ello, disponemos de un único endpoint para cualquier tipo de comprobante, en donde los parámetros varían en función del tipo que se quiera emitir.

Endpoint

POST /v1/invoices

Cuerpo

Cuerpo de ejemplo para factura

{
  "external_id":5,
  "concept_type_id":3,
  "sale_point_id":"0001",
  "recipient_type_id":80,
  "recipient_number":"20123456789",
  "bill_type_id":1,
  "service_from":"20200701",
  "service_to":"20200731",
  "due_date":"20201017",
  "net_amount":1505.0,
  "untaxed_amount":495.0,
  "exempt_amount":0.0,
  "tax_amount":250.0,
  "iva_amount":316.05,
  "total_amount":2566.05,
  "taxes":[
    {
      "id":1,
      "net_amount":150,
      "total_amount":150,
      "rate":2
    },
    {
      "id":2,
      "net_amount":100,
      "total_amount":100,
      "rate":2
    }
  ],
  "iva":[
    {
      "id":5,
      "net_amount":1505,
      "total_amount":316.05
    }
  ],
  "items":[
    {
      "description":"Servicios de Informática",
      "quantity":10,
      "unit_price":150.5,
      "bonus_percentage":0,
      "metric_unit":"horas",
      "iva_aliquot_id":97
    },
    {
      "description":"Servicios de hosting",
      "quantity":1,
      "unit_price":550,
      "bonus_percentage":10,
      "metric_unit":"unidades",
      "iva_aliquot_id":99
    }
  ]
}

Cuerpo de ejemplo para nota de crédito

{
  "concept_type_id":3,
  "sale_point_id":"0001",
  "recipient_type_id":80,
  "recipient_number":"20123456789",
  "bill_type_id":3,
  "service_from":"20200701",
  "service_to":"20200731",
  "due_date":"20200831",
  "net_amount":1505.0,
  "untaxed_amount":495.0,
  "exempt_amount":0.0,
  "tax_amount":250.0,
  "iva_amount":316.05,
  "total_amount":2566.05,
  "taxes":[
    {
      "id":1,
      "net_amount":150,
      "total_amount":150,
      "rate":2
    },
    {
      "id":2,
      "net_amount":100,
      "total_amount":100,
      "rate":2
    }
  ],
  "iva":[
    {
      "id":5,
      "net_amount":1505,
      "total_amount":316.05
    }
  ],
  "items":[
    {
      "description":"Servicios de Informática",
      "quantity":10,
      "unit_price":150.5,
      "bonus_percentage":0,
      "metric_unit":"horas",
      "iva_aliquot_id":97
    },
    {
      "description":"Servicios de hosting",
      "quantity":1,
      "unit_price":550,
      "bonus_percentage":10,
      "metric_unit":"unidades",
      "iva_aliquot_id":99
    }
  ],
  "associated_invoices":[
    {
      "bill_type_id":1,
      "sale_point_id":"0009",
      "number":"00000052",
      "date":"20200815"
    }
  ]
}

Respuesta

Respuesta exitosa (HTTP 201)

{
  "bill":"0001-00000015",
  "bill_number":"00000015",
  "sale_point_id":"0001",
  "cae":"68306662537038",
  "cae_expiracy":"03/08/2018",
  "internal_id":25
}

Respuesta parcial (HTTP 100)

En caso de que los web services de AFIP hayan ocasionado un timeout en la conexión (lo cual no es algo usual pero puede suceder), la API no puede determinar el resultado de la petición así que encola la solicitud y retorna con código de estado HTTP 100 Continue. Por lo tanto, el cliente debe volver a llamar a este endpoint con los mismos valores para recibir el resultado de la operación.

{}

Respuesta con errores de validación local (HTTP 400)

{
  "errors":[
    "Fecha de vencimiento es anterior a fecha de comprobante"
  ],
  "afip_errors":null
}

Respuesta con errores de validación externa de AFIP (HTTP 400)

{
  "errors":null,
  "afip_errors":[
    "El numero o fecha del comprobante no se corresponde con el proximo a autorizar. Consultar metodo FECompUltimoAutorizado. (error 10016)"
  ]
}