承接 codersfree/laravel-greenter 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

codersfree/laravel-greenter

Composer 安装命令:

composer require codersfree/laravel-greenter

包简介

Laravel package for Greenter

README 文档

README

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)
  • Gestionar respuestas estructuradas (CDRs)
  • Generar XML firmados
  • Generar su representación impresa en PDF (HTML y PDF)

MIT License

📚 Tabla de Contenidos

📦 Requisitos

Este paquete requiere:

  • PHP >= 8.1
  • Laravel 11.x o superior
  • Extensiones PHP: soap, openssl, dom, xml
  • wkhtmltopdf (opcional, para generación de PDF)

🚀 Instalación

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 paquete
  • public/images/logo.png: logo usado en PDFs
  • public/certs/certificate.pem: certificado digital de prueba

⚙️ Configuración Inicial

🏢 Datos de la Empresa Emisora

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',
    ],
]

🛠️ Cambiar a Producción

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.

🧰 Uso Básico

🧾 Emisión de Comprobante Electrónico

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",
        ],
    ],
];

⚠️ Importante: Para saber qué datos debes enviar según el tipo de comprobante que estés emitiendo, te recomendamos revisar la documentación oficial de greenter

Envía el comprobante a SUNAT:

use CodersFree\LaravelGreenter\Facades\Greenter;
use Illuminate\Support\Facades\Storage;

// Enviar a SUNAT
$response = Greenter::send('invoice', $data); //invoice, note, despatch, etc

// Guardar XML
$xml = $response->getXml();
if($xml)
{
    Storage::put("sunat/xml/{$name}.xml", $response->getXml());
}

//Guardamos CDR
if($response->getSunatResponse()->getSuccess())
{
    $cdrZip = $response->getSunatResponse()->getCdrZip();
    Storage::put("sunat/cdr/R-{$name}.zip", $cdrZip);
}

📨 Estructura de la Respuesta

El método Greenter::send() devuelve una instancia de SendResultDTO. Esta clase encapsula toda la información del proceso de firma y envío.

namespace CodersFree\LaravelGreenter\DTOs;

use Greenter\Model\DocumentInterface;

class SendResultDTO
{
    public function __construct(
        private ?DocumentInterface $document = null,
        private ?string $xml = null,
        private ?string $hash = null,
        private ?SunatResponseDto $sunatResponse = null,
    ) {
    }
}
<?php

namespace CodersFree\LaravelGreenter\DTOs;

class SunatResponseDto
{
    public function __construct(
        private ?bool $success = null,
        private ?ErrorDto $error = null,
        private ?string $cdrZip = null,
        private ?CdrResponseDto $cdrResponse = null,
    ) {
    }    
}
<?php

namespace CodersFree\LaravelGreenter\DTOs;

class ErrorDto
{
    public function __construct(
        private ?string $code = null,
        private ?string $message = null,
    ) {
    }
}
<?php

namespace CodersFree\LaravelGreenter\DTOs;

class CdrResponseDto
{
    /**
     * @param string[]|null $notes
     */
    public function __construct(
        private ?bool $accepted = null,
        private ?string $id = null,
        private ?string $code = null,
        private ?string $description = null,
        private ?array $notes = null,
    ) {}
}

Métodos disponibles (Getters)

Puedes acceder a los objetos y valores utilizando los getters de cada DTO:

// --- SendResultDTO ---
$response->getXml();           // string: XML firmado
$response->getHash();          // string: Hash del XML
$response->getDocument();      // DocumentInterface: Objeto del documento (Invoice, Note, etc)
$sunatResponse = $response->getSunatResponse(); // SunatResponseDto

// --- SunatResponseDto ---
$sunatResponse->getSuccess();          // bool: Indica si hubo respuesta de SUNAT (true incluso si fue rechazada con CDR)
$sunatResponse->getCdrZip();           // string|null: Contenido del ZIP del CDR (binario)
$sunatResponse->getError();            // ErrorDto|null: Objeto de error si falló la conexión/validación
$cdrResponse = $sunatResponse->getCdrResponse(); // CdrResponseDto|null: Objeto con datos del CDR

// --- CdrResponseDto ---
if ($cdrResponse) {
    $cdrResponse->getAccepted();        // bool: true si el estado es aceptado
    $cdrResponse->getCode();           // string: '0' = Aceptado
    $cdrResponse->getDescription();    // string: Mensaje de respuesta de SUNAT
    $cdrResponse->getNotes();          // array: Observaciones
}

// --- ErrorDto ---
$error = $sunat->getError();
if ($error) {
    $error->getCode();         // string: Código de error
    $error->getMessage();      // string: Descripción del error
}

Convertir a Array

Para facilitar la creación de APIs, todos los DTOs implementan un método toArray(). Ejemplo:

return response()->json($response->toArray());

🔁 Emisión Dinámica para Múltiples Empresas

Para cambiar de empresa, credenciales o personalizar parámetros del reporte en tiempo de ejecución, utiliza el helper config() de Laravel antes de llamar a los métodos de Laravel Greenter.

// Configuración dinámica
config([
    // Cambiar empresa emisora
    'greenter.company.ruc' => '20999999999',
    'greenter.company.razonSocial' => 'OTRA EMPRESA SAC',
    'greenter.company.clave_sol.user' => 'MODDATOS',
    'greenter.company.clave_sol.password' => 'MODDATOS',
    'greenter.company.certificate' => storage_path('certs/otro_cert.pem'),

    // Personalizar reporte
    'greenter.report.system.logo' => public_path('images/otro_logo.png'),
    'greenter.report.user.header' => 'Teléfono: 999-999-999',
]);

// Ahora emite el comprobante con la nueva configuración
$result = Greenter::send('invoice', $data);

🔏 Gestión de XML

Si necesitas manipular el XML manualmente o enviarlo posteriormente.

Generar XML Firmado

Genera el XML sin enviarlo a SUNAT:

use CodersFree\LaravelGreenter\Facades\GreenterXml;

$xmlSigned = GreenterXml::generateXml('invoice', $data); // Retorna string

Enviar XML existente

Si ya tienes un XML firmado y deseas enviarlo:

// Retorna el mismo SendResultDTO explicado arriba
$result = Greenter::sendXml('invoice', $xmlSigned);

🎨 Generar Representación Impresa

🧾 HTML

use CodersFree\LaravelGreenter\Facades\GreenterReport;

$result = Greenter::send('invoice', $data);
$document = $result->getDocument();

if($document)
{
    $html = GreenterReport::generateHtml($document);
}

🖨️ PDF

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',
],
use CodersFree\LaravelGreenter\Facades\GreenterReport;

$result = Greenter::send('invoice', $data);
$document = $result->getDocument();

if($document)
{
    $name = $document->getName();

    // Generar PDF
    $pdf = GreenterReport::generatePdf($document);
    Storage::put("sunat/pdf/{$name}.pdf", $pdf);
}

🛠️ Generar Reporte sin Enviar a SUNAT

Si necesitas visualizar el PDF antes de enviar el comprobante o simplemente para pruebas, debes construir el documento usando los Builders:

use CodersFree\LaravelGreenter\Builders\InvoiceBuilder;
use CodersFree\LaravelGreenter\Facades\GreenterReport;

$data = [ ... ]; // Tus datos

// 1. Construir el documento manualmente
// Usa InvoiceBuilder, NoteBuilder, DespatchBuilder, etc. según corresponda
$document = (new InvoiceBuilder())->build($data);
$name = $document->getName();

// 2. Generar el reporte
$pdf = GreenterReport::generatePdf($document);
Storage::put("sunat/pdf/{$name}.pdf", $pdf);

📦 Otros Tipos de Comprobantes

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.

🎨 Personalizar Plantillas

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'),
],

🧪 Facades Disponibles

Alias Función principal
Greenter Firma y envía comprobantes electrónicos
GreenterXml Genera únicamente el XML firmado a partir de los datos.
GreenterReport Genera HTML o PDF de la representación impresa

🔐 Seguridad Recomendada

  • Usa .env para tus claves y certificados
  • Nunca subas archivos sensibles al repositorio
  • Protege rutas usando storage_path() o config_path()
  • Valida los datos antes de emitir comprobantes

📄 Licencia

Este paquete está bajo licencia MIT. Desarrollado por CodersFree

codersfree/laravel-greenter 适用场景与选型建议

codersfree/laravel-greenter 是一款 基于 Twig 开发的 Composer 扩展包,目前已累计 2.19k 次下载、GitHub Stars 达 28, 最近一次更新时间为 2025 年 06 月 14 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「pdf」 「laravel」 「facturacion」 「sunat」 「greenter」 「facturas」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 codersfree/laravel-greenter 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 codersfree/laravel-greenter 我们能提供哪些服务?
定制开发 / 二次开发

基于 codersfree/laravel-greenter 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 2.19k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 28
  • 点击次数: 15
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 28
  • Watchers: 0
  • Forks: 8
  • 开发语言: Twig

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-06-14