Laravel Greenter es un paquete para emitir comprobantes electrónicos desde Laravel utilizando Greenter. Permite:
- Firmar comprobantes digitalmente
- Enviarlos a SUNAT (SEE o API REST)
- Generar su representación impresa en PDF (HTML y PDF)
- 📦 Requisitos
- 🚀 Instalación
- ⚙️ Configuración Inicial
- 🧰 Uso Básico
- 📦 Otros Tipos de Comprobantes
- 🎨 Generar Representación Impresa
- 🧪 Facades Disponibles
- 🧱 Estructura del Paquete
- 🔐 Seguridad Recomendada
- 📄 Licencia
Este paquete requiere:
- PHP >= 8.1
- Laravel 11.x o superior
- Extensiones PHP:
soap
,openssl
- wkhtmltopdf (opcional, para generación de PDF)
Instala el paquete con Composer:
composer require codersfree/laravel-greenter
Publica los archivos de configuración y recursos:
php artisan vendor:publish --tag=greenter-laravel
Esto generará:
config/greenter.php
: configuración principal del paquetepublic/images/logo.png
: logo usado en PDFspublic/certs/certificate.pem
: certificado digital de prueba
En config/greenter.php
, configura los datos de la empresa emisora:
'company' => [
'ruc' => '20000000001',
'razonSocial' => 'GREEN SAC',
'nombreComercial' => 'GREEN',
'address' => [
'ubigeo' => '150101',
'departamento' => 'LIMA',
'provincia' => 'LIMA',
'distrito' => 'LIMA',
'direccion' => 'Av. Villa Nueva 221',
],
]
Cuando estés listo para pasar a producción, edita el archivo config/greenter.php
, cambia el valor de mode
a 'prod'
y reemplaza las credenciales de prueba por las credenciales reales proporcionadas por SUNAT:
'mode' => 'prod',
'company' => [
'certificate' => public_path('certs/certificate.pem'),
'clave_sol' => [
'user' => 'USUARIO_SOL',
'password' => 'CLAVE_SOL',
],
'credentials' => [
'client_id' => '...',
'client_secret' => '...',
],
],
⚠️ Importante: Nunca subas tus certificados o credenciales a tu repositorio. Usa variables de entorno.
Primero define los datos del comprobante:
$data = [
"ublVersion" => "2.1",
"tipoOperacion" => "0101", // Catálogo 51
"tipoDoc" => "01", // Catálogo 01
"serie" => "F001",
"correlativo" => "1",
"fechaEmision" => now(),
"formaPago" => [
'tipo' => 'Contado',
],
"tipoMoneda" => "PEN", // Catálogo 02
"client" => [
"tipoDoc" => "6", // Catálogo 06
"numDoc" => "20000000001",
"rznSocial" => "EMPRESA X",
],
"mtoOperGravadas" => 100.00,
"mtoIGV" => 18.00,
"totalImpuestos" => 18.00,
"valorVenta" => 100.00,
"subTotal" => 118.00,
"mtoImpVenta" => 118.00,
"details" => [
[
"codProducto" => "P001",
"unidad" => "NIU", // Catálogo 03
"cantidad" => 2,
"mtoValorUnitario" => 50.00,
"descripcion" => "PRODUCTO 1",
"mtoBaseIgv" => 100,
"porcentajeIgv" => 18.00,
"igv" => 18.00,
"tipAfeIgv" => "10",
"totalImpuestos" => 18.00,
"mtoValorVenta" => 100.00,
"mtoPrecioUnitario" => 59.00,
],
],
"legends" => [
[
"code" => "1000", // Catálogo 15
"value" => "SON CIENTO DIECIOCHO CON 00/100 SOLES",
],
],
];
Envía el comprobante a SUNAT:
use CodersFree\LaravelGreenter\Facades\Greenter;
use Illuminate\Support\Facades\Storage;
try {
$response = Greenter::send('invoice', $data);
$name = $response->getDocument()->getName();
Storage::put("sunat/xml/{$name}.xml", $response->getXml());
Storage::put("sunat/cdr/{$name}.zip", $response->getCdrZip());
return response()->json([
'success' => true,
'cdrResponse' => $response->readCdr(),
'xml' => Storage::url("sunat/xml/{$name}.xml"),
'cdr' => Storage::url("sunat/cdr/{$name}.zip"),
]);
} catch (\Throwable $e) {
return response()->json([
'success' => false,
'code' => $e->getCode(),
'message' => $e->getMessage(),
], 500);
}
Puedes emitir comprobantes desde distintas empresas sin cambiar archivos de configuración:
$data = [ ... ]; // Datos del comprobante
$response = Greenter::setCompany([
'ruc' => '20999999999',
'razonSocial' => 'Otra Empresa SAC',
'certificate' => Storage::path('certs/otro_cert.pem'),
// Otros datos...
])->send('invoice', $data);
Además de facturas, puedes emitir:
Tipo de Comprobante | Código | Descripción |
---|---|---|
Factura | invoice |
Factura electrónica (01) |
Boleta | invoice |
Boleta de venta (03) |
Nota de Crédito | note |
Nota de crédito electrónica (07) |
Nota de Débito | note |
Nota de débito electrónica (08) |
Guía de Remisión | despatch |
Guía de remisión electrónica |
Resumen Diario | summary |
Resumen diario de boletas (RC) |
Comunicación de Baja | voided |
Comunicación de baja (RA) |
Retención | retention |
Comprobante de retención |
Percepción | perception |
Comprobante de percepción |
Consulta la documentación de Greenter para ver los campos específicos de cada uno.
$data = [ ... ];
$response = Greenter::send('invoice', $data);
$html = GreenterReport::generateHtml($response->getDocument());
Es necesario tener wkhtmltopdf instalado en el sistema para generar archivos PDF. Una vez instalado, configura la ruta del ejecutable en el archivo config/greenter.php
:
'report' => [
'bin_path' => '/usr/local/bin/wkhtmltopdf',
],
$data = [ ... ];
$response = Greenter::send('invoice', $data);
$pdf = GreenterReport::generatePdf($response->getDocument());
Storage::put("sunat/pdf/{$name}.pdf", $pdf);
Parámetros adicionales:
$html = GreenterReport::setParams([
'system' => [
'logo' => public_path('images/logo.png'),
'hash' => '',
],
'user' => [
'header' => 'Telf: <b>(01) 123456</b>',
'extras' => [
['name' => 'CONDICIÓN DE PAGO', 'value' => 'Contado'],
['name' => 'VENDEDOR', 'value' => 'VENDEDOR PRINCIPAL'],
],
'footer' => '<p>Nro Resolución: <b>123456789</b></p>',
]
])->generateHtml($response->getDocument());
Opciones de generación:
$html = GreenterReport::setOptions([
'no-outline',
'viewport-size' => '1280x1024',
'page-width' => '21cm',
'page-height' => '29.7cm',
])->generateHtml($response->getDocument());
Publica las plantillas del reporte:
php artisan vendor:publish --tag=greenter-templates
Ubicación por defecto:
resources/views/vendor/laravel-greenter
Puedes personalizar y cambiar la ruta:
'report' => [
'template' => resource_path('templates/laravel-greenter'),
],
Alias | Función principal |
---|---|
Greenter |
Firma y envía comprobantes electrónicos |
GreenterReport |
Genera HTML o PDF de la representación impresa |
Ejemplos de métodos disponibles:
Greenter::send('invoice', $data);
GreenterReport::generateHtml($document);
GreenterReport::generatePdf($document);
- Usa
.env
para tus claves y certificados - Nunca subas archivos sensibles al repositorio
- Protege rutas usando
storage_path()
oconfig_path()
- Valida los datos antes de emitir comprobantes
Este paquete está bajo licencia MIT. Desarrollado por CodersFree