Skip to main content

Visión General

SUNAT define códigos estandarizados para cada tipo de documento electrónico. El sistema gestiona facturas, boletas, notas y guías de remisión.
Cada tipo de documento tiene reglas específicas de emisión, numeración y envío a SUNAT.

Documentos de Venta

01 - Factura Electrónica

Factura

Uso: Ventas a empresas (contribuyentes con RUC)Características:
  • Permite deducción de IGV
  • Envío sincrónico a SUNAT (respuesta inmediata)
  • Serie: F### (ej: F001, F002)
  • Cliente debe tener RUC
Generación en el sistema:
SunatService.php:178
$invoice = new Invoice();
$invoice->setUblVersion('2.1')
    ->setTipoOperacion('0101')
    ->setTipoDoc('01')              // Código SUNAT para factura
    ->setSerie($venta->serie)       // F001, F002, etc.
    ->setCorrelativo((string) $venta->numero)
    ->setFechaEmision($this->fechaParaGreenter($venta->fecha_emision))
    ->setTipoMoneda($venta->tipo_moneda ?? 'PEN')
    ->setCompany($company)
    ->setClient($client);

03 - Boleta de Venta Electrónica

Boleta

Uso: Ventas a consumidores finales (personas sin RUC)Características:
  • NO permite deducción de IGV
  • Envío mediante Resumen Diario (asíncrono)
  • Serie: B### (ej: B001, B002)
  • Cliente puede tener DNI o ser “cliente varios”
Diferencias con factura:
// Boleta
$invoice->setTipoDoc('03');
$invoice->setSerie('B001');

// Cliente puede ser genérico
$client->setTipoDoc('0')      // Sin documento
    ->setNumDoc('00000000')
    ->setRznSocial('CLIENTES VARIOS');
Las boletas deben enviarse a SUNAT mediante Resumen Diario al final del día. El envío individual no es aceptado.

07 - Nota de Crédito Electrónica

Nota de Crédito

Uso: Anulaciones, devoluciones o descuentos sobre documentos emitidosCaracterísticas:
  • Debe referenciar un documento previo (factura o boleta)
  • Envío sincrónico a SUNAT
  • Serie: FC## (facturas) o BC## (boletas)
  • Requiere motivo de emisión
Generación:
SunatService.php:333
$note = new Note();
$note->setUblVersion('2.1')
    ->setTipoDoc('07')                          // Nota de crédito
    ->setSerie($nota->serie)                    // FC01, BC01
    ->setCorrelativo((string) $nota->numero)
    ->setTipDocAfectado($nota->tipo_doc_afectado)  // '01' o '03'
    ->setNumDocfectado($nota->serie_num_afectado)  // F001-00000123
    ->setCodMotivo($nota->motivo->codigo_sunat)     // '01', '02', etc.
    ->setDesMotivo($nota->descripcion_motivo);
Motivos de emisión:
CódigoDescripción
01Anulación de la operación
02Anulación por error en el RUC
03Corrección por error en la descripción
04Descuento global
05Descuento por ítem
06Devolución total
07Devolución por ítem
08Bonificación
09Disminución en el valor
10Otros conceptos

08 - Nota de Débito Electrónica

Nota de Débito

Uso: Incrementos sobre documentos emitidos (intereses, penalidades)Características:
  • Aumenta el valor de una factura o boleta previa
  • Envío sincrónico a SUNAT
  • Serie: FD## (facturas) o BD## (boletas)
Generación:
SunatService.php:460
$note = new Note();
$note->setUblVersion('2.1')
    ->setTipoDoc('08')                          // Nota de débito
    ->setSerie($nota->serie)
    ->setCorrelativo((string) $nota->numero)
    ->setTipDocAfectado($nota->tipo_doc_afectado)
    ->setNumDocfectado($nota->serie_num_afectado)
    ->setCodMotivo($nota->motivo->codigo_sunat)
    ->setDesMotivo($nota->descripcion_motivo);

Documentos de Traslado

09 - Guía de Remisión Remitente

Guía de Remisión

Uso: Traslado de mercancías por el propietarioCaracterísticas:
  • Versión 2022 (GRE REST API)
  • Envío asíncrono con ticket
  • Serie: T### (ej: T001)
  • Requiere datos de transporte y conductor
Generación:
SunatService.php:632
$despatch = (new Despatch())
    ->setVersion('2022')
    ->setTipoDoc('09')                      // Guía de remisión remitente
    ->setSerie($guia->serie)
    ->setCorrelativo((string) $guia->numero)
    ->setFechaEmision($fechaEmision)
    ->setCompany($company)
    ->setDestinatario($destinatario)
    ->setEnvio($shipment)
    ->setDetails($details);

31 - Guía de Remisión Transportista

Guía Transportista

Uso: Traslado de mercancías por un transportista terceroCaracterísticas:
  • Emitida por la empresa de transporte
  • Requiere datos del remitente
  • Serie: T###
Generación:
SunatService.php:728
$despatch = (new Despatch())
    ->setVersion('2022')
    ->setTipoDoc('31')                      // Guía transportista
    ->setSerie($guia->serie)
    ->setCorrelativo((string) $guia->numero)
    ->setTercero($remitente)                // Quién envía la mercancía
    ->setDestinatario($destinatario)
    ->setEnvio($shipment);

Documentos de Resumen

RC - Resumen de Comprobantes (Resumen Diario)

Resumen Diario

Uso: Envío masivo de boletas emitidas en un díaCaracterísticas:
  • Obligatorio para boletas
  • Se envía al final del día
  • Retorna ticket para consulta posterior
  • Serie: RC-YYYYMMDD-###
Generación:
SunatService.php:1180
$summary = (new Summary())
    ->setFecGeneracion(new \DateTime())              // Hoy
    ->setFecResumen(\DateTime::createFromFormat('Y-m-d', $fechaResumen))  // Día de las boletas
    ->setCorrelativo($correlativo)                   // 001, 002, ...
    ->setCompany($company)
    ->setDetails($details);                          // Array de boletas

RA - Resumen de Anulaciones (Comunicación de Baja)

Comunicación de Baja

Uso: Anular facturas o boletas ya enviadas a SUNATCaracterísticas:
  • Para anular documentos sincrónicos (facturas)
  • Retorna ticket
  • Serie: RA-YYYYMMDD-###
Generación:
SunatService.php:1080
$voided = (new Voided())
    ->setCorrelativo($correlativo)
    ->setFecGeneracion(new \DateTime())
    ->setFecComunicacion(new \DateTime())
    ->setCompany($company)
    ->setDetails($details);                          // Documentos a anular

Nomenclatura de Series

Facturas

  • F001, F002, F999
  • Comienzan con F
  • 4 caracteres (letra + 3 dígitos)

Boletas

  • B001, B002, B999
  • Comienzan con B
  • 4 caracteres

Notas de Crédito

  • FC01, BC01 (facturas/boletas)
  • 4 caracteres

Guías

  • T001, T002
  • Comienzan con T
  • 4 caracteres

Formato de Nombres de Archivo

SUNAT requiere un formato específico:
{RUC}-{TipoDoc}-{Serie}-{Numero}.xml
Ejemplos:
20612706702-01-F001-00000123.xml    # Factura
20612706702-03-B001-00004567.xml    # Boleta
20612706702-07-FC01-00000012.xml    # Nota de crédito
20612706702-09-T001-00000089.xml    # Guía de remisión
Generación automática:
SunatService.php:233
$nombreArchivo = $invoice->getName();  // Greenter genera el nombre
// Resultado: "20612706702-01-F001-00000123"

Consulta de Tipos de Documento

La tabla tipo_documentos almacena los tipos disponibles:
CREATE TABLE tipo_documentos (
    id_tipo_doc INT PRIMARY KEY,
    descripcion VARCHAR(100),
    cod_sunat VARCHAR(2),           -- '01', '03', '07', etc.
    tipo VARCHAR(50),               -- 'factura', 'boleta', 'nota'
    serie_formato VARCHAR(10),      -- 'F###', 'B###'
    activo BOOLEAN
);
Datos iniciales:
DB::table('tipo_documentos')->insert([
    ['descripcion' => 'Factura', 'cod_sunat' => '01', 'tipo' => 'factura', 'serie_formato' => 'F###'],
    ['descripcion' => 'Boleta', 'cod_sunat' => '03', 'tipo' => 'boleta', 'serie_formato' => 'B###'],
    ['descripcion' => 'Nota de Crédito', 'cod_sunat' => '07', 'tipo' => 'nota_credito', 'serie_formato' => 'FC##'],
    ['descripcion' => 'Nota de Débito', 'cod_sunat' => '08', 'tipo' => 'nota_debito', 'serie_formato' => 'FD##'],
    ['descripcion' => 'Guía de Remisión', 'cod_sunat' => '09', 'tipo' => 'guia', 'serie_formato' => 'T###'],
]);

Relación con Modelo de Datos

Validación de Series

El sistema valida que la serie coincida con el tipo de documento:
$tipoDoc = TipoDocumento::where('cod_sunat', '01')->first();
$serieFormato = $tipoDoc->serie_formato;  // 'F###'

if (!preg_match('/^F\d{3}$/', $serie)) {
    throw new \Exception('Serie inválida para factura. Formato esperado: F###');
}

Build docs developers (and LLMs) love