Caso · producto de Kip-Up

La boleta sale del sistema y SUNAT la acepta

En Perú una venta queda cerrada cuando SUNAT acepta el comprobante, y cada comprobante tiene tres días calendario para llegar. Kuantera lo arma, lo firma y lo envía. Está escrita desde cero y no pasa por ningún intermediario.

días para que SUNAT reciba cada comprobante; si no llega, deja de valer
3
intermediarios entre el negocio y SUNAT: emite él, con su certificado
0
estados en el panel: en cola, enviado, aceptado, observado y rechazado
5
casos probados contra el entorno de pruebas de SUNAT
6

Cómo se usa

Del login a la boleta aceptada, en seis pasos: se entra, se elige el cliente de la libreta, se buscan los productos y al emitir el servidor firma y envía. Pulsa un paso para ir directo o déjalo correr.

Ver la grabación real contra SUNAT 15 s · el mismo flujo que la simulación
Emisión real contra el entorno de pruebas de SUNAT: la boleta B001-16 sale por S/ 36.00, entra «en cola», y al final SUNAT contesta código 0, aceptada. Queda guardada con la constancia, el XML firmado y el PDF.

El viaje de una boleta

Un comprobante electrónico peruano es un XML con una firma dentro, envuelto en un ZIP y entregado por SOAP. Todo eso está escrito en el propio proyecto, en packages/sunat, sin librerías de terceros, porque ahí se decide si el comprobante vale o lo rechazan por una cifra mal puesta.

  1. Se arma

    La venta se convierte en un XML en formato UBL 2.1: tipo de comprobante, serie y número, las líneas con su afectación y los totales. Las boletas llevan el IGV incluido; las facturas, el valor de venta.

    <!-- boleta -->
    <cbc:ID>B001-00000417</cbc:ID>
    <cbc:InvoiceTypeCode>03</…>
    <cbc:PayableAmount currencyID="PEN">
      19.50
    </cbc:PayableAmount>
  2. Se firma, con lo del negocio

    Cada comprobante se firma con el certificado digital y la clave SOL del negocio que emite, nunca con los míos ni con los de la agencia, porque ante SUNAT el emisor es el negocio. Firmar por otros con credenciales propias obligaría a inscribirse como proveedor de servicios electrónicos, que es otro negocio y otra responsabilidad.

    <ds:Signature>
      <ds:CanonicalizationMethod
        Algorithm="…xml-c14n…"/>
      <ds:SignatureMethod
        Algorithm="…rsa-sha256"/>
    </ds:Signature>
  3. Se envía sin frenar la venta

    La API acepta el comprobante, lo numera y lo devuelve al momento; un proceso aparte lo manda a SUNAT y reintenta si el servicio está caído, que pasa más de lo que uno esperaría.

    • En cola
    • Enviado
    • Reintento si SUNAT no contesta
  4. SUNAT responde

    Vuelve una constancia con su código: aceptado, aceptado con observaciones o rechazado. El panel enseña esa respuesta tal como llega y, si es un rechazo, el comprobante se vuelve a emitir con el mismo número en vez de gastar otro.

    • Aceptado · código 0
    • Observado
    • Rechazado
  5. Se guarda, y cada uno ve lo suyo

    Constancia, XML firmado y PDF quedan con el comprobante, y un aviso diario vigila los plazos. Cada empresa ve solo lo suyo por la seguridad a nivel de fila de PostgreSQL, que el rol de la API no puede saltarse: si una consulta olvida filtrar por empresa, devuelve vacío en vez de datos ajenos.

    • Constancia
    • XML firmado
    • PDF y ticket
    • RLS por empresa

Qué es y qué no es

Probado contra el entorno de pruebas de SUNAT

  • Factura y boleta, con IGV incluido o sin él según el caso
  • Notas de crédito y débito
  • Detracción y recargo al consumo
  • Envío en segundo plano con reintentos y plazos vigilados
  • Cada empresa aislada en la base de datos

Todavía no

  • Emitir con un RUC real en producción. Hasta que eso ocurra, no diré que está terminada.
  • Las bolsas plásticas: SUNAT rechaza el comprobante si su número no coincide con la cantidad de la línea. Lo encontré emitiendo comprobantes de prueba y está anotado como error, con su XML, para corregirlo.

¿Emites comprobantes y te pelas con el facturador?

Sistemas que emiten ante SUNAT desde dentro, sin copiar datos a otra pantalla y sin depender de un tercero para la parte que decide si la venta existe.

Hablemos →