Saltar al contenido
Todas las publicaciones

P6

Factura electrónica por dentro

Qué pasa por dentro al emitir una factura electrónica en Perú: XML UBL 2.1, firma digital, envío al OSE o SUNAT, CDR y PDF con QR.

Más de lo que parece

Cuando una bodega emite una factura electrónica en Perú, por fuera parece un botón y un PDF. Por dentro pasan varias cosas, y cada una tiene que salir bien para que el comprobante tenga validez. Lo aprendí construyendo FactuPerú, un sistema de facturación hecho con Laravel y Filament, MySQL y Docker.

Aquí recorro ese flujo paso a paso, con los fotogramas del video, y explico por qué la emisión no ocurre mientras quien vende espera frente a la pantalla.

Todos los datos que aparecen en las imágenes (productos, montos, serie y RUC) son de ejemplo.

El flujo

1. Venta y XML

El sistema arma el comprobante en XML con el estándar UBL 2.1: serie, número, fecha, emisor, receptor y totales.

Fotograma del video: el comprobante armado en XML con el estándar UBL 2.1 (datos de ejemplo)

2. Firma digital

El XML se firma con un certificado digital (XMLDSig). Sin firma, el comprobante no tiene validez.

Fotograma del video: el XML firmado con un certificado digital (datos de ejemplo)

3. Envío

El comprobante firmado viaja a un OSE homologado o directamente a SUNAT.

4. Respuesta: la CDR

Vuelve la Constancia de Recepción (CDR), que indica si el comprobante fue aceptado, aceptado con observaciones o rechazado.

Fotograma del video: vuelve la CDR con el comprobante aceptado (datos de ejemplo)

5. Archivo y representación impresa

Se guardan el XML firmado y la CDR, y se genera la representación impresa: un PDF con su código QR.

Fotograma del video: se guardan el XML y la CDR y sale el PDF con QR (datos de ejemplo)

Por qué va en una cola

Hablar con el OSE puede tardar, y quien vende no tiene por qué esperar frente a la pantalla. Por eso la emisión va en un Job encolado (pseudocódigo ilustrativo):

EmitirComprobante::dispatch($venta);
// armar → firmar → enviar → guardar CDR

La venta se registra al momento y el comprobante sigue su camino en segundo plano. La cola también da el lugar natural para manejar cada respuesta: reintentar, registrar observaciones o tratar un rechazo.

Lo que aprendí

La parte difícil no es "hacer un PDF". Es respetar el estándar al detalle y manejar bien cada respuesta (reintentos, observaciones, rechazos) sin perder un solo comprobante. El PDF es la cara visible; lo que tiene validez es el XML firmado y su CDR.

¿Y tú?

Si has integrado facturación electrónica: ¿qué te costó más, el XML, la firma o el OSE?

  • #FacturacionElectronica
  • #Laravel
  • #SoftwareArchitecture
  • #Peru
  • #DesarrolloDeSoftware

¿Necesitas algo parecido en tu equipo o tu producto?

Cuéntame el contexto y te respondo en menos de 24 horas. Si prefieres revisar la trayectoria antes, el CV está a un clic.