PHPackages                             puyu-pe/qillqay - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. puyu-pe/qillqay

ActiveLibrary[PDF &amp; Document Generation](/categories/documents)

puyu-pe/qillqay
===============

Librería para generar documentos en PDF para los proyectos de Puyu.pe

0.10.2(8mo ago)0745[7 issues](https://github.com/puyu-pe/qillqay/issues)MITPHPPHP &gt;=7.4.0

Since Sep 9Pushed 8mo ago2 watchersCompare

[ Source](https://github.com/puyu-pe/qillqay)[ Packagist](https://packagist.org/packages/puyu-pe/qillqay)[ RSS](/packages/puyu-pe-qillqay/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (4)Versions (35)Used By (0)

PUYU.PE QILLQAY
===============

[](#puyupe-qillqay)

Libreria para generar representación de CPE
-------------------------------------------

[](#libreria-para-generar-representación-de-cpe)

\*\* LIBRERIA EN PRUEBAS \*\*

Libreria para generar documentos en formatos A4 y ticket en PDF y HTML:

Documentos electrónicos:

- Facturas
- Boletas
- Notas de Crédito
- Guias de remisión (solo a4)

Documentos personalizados (desde el mismo formato de objeto y/o html):

- Requiere datos adicionales (ver generación de objeto)

Utilización
===========

[](#utilización)

Requerimientos
--------------

[](#requerimientos)

- PHP 7.4
- Binario wkhtmltopdf 0.12.6 (mínimo)

Instalación
-----------

[](#instalación)

- Ejecutar el comando:

```
composer require puyu-pe/qillqay

```

Utilización
-----------

[](#utilización-1)

- Incluir la libreria

```
use PuyuPe\Qillqay\Generate;

```

- Generar el objeto $data, el cual es el objeto $invoice que se usa para enviar a nexus ()
- Se puede usar el comando json\_encode en caso de tener el json en una variable de tipo string

```
$data = json_decode([JSON])

```

- Caso contrario generar el objeto:

```
$data = (object) [
    'company' => (object) [
        'ruc' => '20527056579',
        'razonSocial' => 'NOMBRE DE LA EMPRESA',
        'nombreComercial' => null,
        'address' => (object) [
            'ubigueo' => '030109',
            'codigoPais' => 'PE',
            'departamento' => 'Apurímac',
            'provincia' => 'Abancay',
            'distrito' => 'Abancay',
            'urbanizacion' => null,
            'direccion' => 'Av. Garcilazo de la Vega S/N',
            'codLocal' => '0000',
        ],
        'email' => null,
        'telephone' => '083-321965',
    ],
    'tipoOperacion' => '0101',
    'formato' => 'ticket',
    'tipoDoc' => '03',
    'tipoDocNombre' => '', // REQUERIDO SI tipoDoc = 00
    'codLocal' => '0000',
    'serie' => 'B001',
    'correlativo' => '25735',
    'fechaEmision' => '2023-09-19 09:12:58',
    'fechaVencimiento' => '2023-09-19',
    'tipoMoneda' => 'PEN',
    'mtoOperGravadas' => '0.00',
    'mtoOperExoneradas' => '6.00',
    'mtoOperInafectas' => '0.00',
    'mtoIGV' => '0.00',
    'totalImpuestos' => '0.00',
    'valorVenta' => '6.00',
    'subTotal' => '6.00',
    'mtoImpVenta' => '6.00',
    'formaPago' => (object) [
        'moneda' => 'PEN',
        'tipo' => 'Contado',
        'monto' => '6.0000',
    ],
    'cuotas' => [],
    'client' => (object) [
        'tipoDoc' => '1',
        'numDoc' => '70430738',
        'rznSocial' => 'LUIS ALFREDO HUAMANI QUISPE',
        'address' => (object) [
            'direccion' => null
        ]
    ],
    'cashier' => (object) [
        'tipoDoc' => 1,
        'numDoc' => '-',
        'rznSocial' => 'ucaja'
    ],
    'detailsHeader' => //REQUERIDO SI tipoDoc = 00
        [ // ENCABEZADO A MOSTRAR => DATO EN details
            (object) [
             'title ' => 'CODIGO',
             'field' => 'codProducto',
             'align' => 'left' //Alineación de items, opcional, por defecto derecha (right)
             ],
            (object) [
             'title ' => 'UNIDAD',
             'field' => 'unidad'
             ],
            (object) [
             'title ' => 'DESCRIPCION',
             'field' => 'descripcion'
             ],
            (object) [
             'title ' => 'CANTIDAD',
             'field' => 'cantidad'
             ],
            (object)
            [ 'title ' => 'PRECIO ,
            'field' UNITARIO' => 'mtoPrecioUnitario'
            ],
            (object) [
             'title ' => 'TOTAL',
             'field' => 'total'
             ],
        ],
    'details' => [ //DE ACUERDO A detailsHeader, si tipodoc = 00 incluir todos los mencionados en field
        (object) [
            'codProducto' => '1.3.23.14.1',
            'unidad' => 'NIU',
            'descripcion' => 'CONSTANCIA DE NOTAS POR SEMESTRE',
            'cantidad' => '1.00',
            'mtoValorUnitario' => '6.00',
            'mtoValorVenta' => '6.00',
            'mtoBaseIgv' => '6.00',
            'porcentajeIgv' => 0,
            'igv' => 0,
            'tipAfeIgv' => '20',
            'totalImpuestos' => 0,
            'mtoPrecioUnitario' => '6.00',
            'total' => '6.00' //REQUERIDO SI tipoDoc = 00
        ],
    ],
    'detailsSummary' => [ //REQUERIDO SI tipoDoc = 00
        (object) [ // TOTALES O RESUMEN A MOSTRAR
            'title' => 'TOTAL',
            'value' => '6.00',
            'colspan' => 2 //Requerido para formato ticket
        ],
    ],
    'legends' => [
        (object) [
            'code' => '1000',
            'value' => 'SEIS  CON 00/100 SOLES.',
        ],
    ],
    'observation' => null,
    'documentFooter' => null,
    'params' => [VER CAMPO ADICIONAL]
];

```

- Adicionar un campo params al objeto, debe contener la siguiente estructura:

```
$data->params = (object) [
    'system' => (object) [
        'hash' => 'm70vBMajaapHr5ByjkwEER8tCjc=',
        'background' => '#000000',
        'appMessage' => 'Emitido desde YUBIZ.PUYU.PE', //Requerido en formato ticket
        'customCss' => '[CSS adicional para modificar estilos del documento, opcional]',
        'anulled' => false,
        'rejected' => false,
        'production' => true,
    ],
    'user' => (object) [
        //mensaje genérico para todos
        'footer' => 'MUCHAS GRACIAS POR SU PREFERENCIAConsulte el documento electrónico en :http://localhost:8080/10123456789',
        'extras' => [
            (object) [
                'name' => 'FORMA DE PAGO',
                'value' => 'Contado PEN 36.00',
            ],
            (object) [
                'name' => 'CAJERO',
                'value' => 'nombre',
            ],
            (object) [
                'name' => 'OBSERVACIÓN',
                'value' => '[Mensaje final u observación del documento, puede ser nulo]',
            ],
        ],
        'logo' => 'data:image/png;base64,[codigo]',
    ],
    'stringQr' => '', //Cadena a generar codigo QR, requerido para CPE
    'documentFooter' => null, //Mensaje adicional para documentos, como numeros de cuenta o números de contacto.
];

```

- Se requieren los siguientes parámetros al momento de llamar a una de las funciones:

```
$data = Objeto de datos para generar el documento, para la función fromObject.
$html = Cadena html para generar el documento, para la función fromHtml.
$format = Formato de retorno del objeto (Opcional)
          [pdf : Valor por defecto, stream pdf, html: Cadena html, file : Archivo en disco temporal (en pruebas)]
$size = Tamaño del documento a generar (ticket, a4), solo para función fromHtml (Valor por defecto : a4).
$wkhtmlPath = Ruta del archivo binario o ejecutable, valor por defecto 'wkhtmltopdf'. (Opcional)
$env = Entorno de ejecución, solo usado para pruebas unitarias (Opcional, Valor por defecto run)

```

- Llamar a la función fromObject usando el siguiente codigo:

```
$data = [OBJETO DE DATOS]

return Generate::fromObject($data); //Stream de archivo pdf (tamaño segun parametro de objeto)
return Generate::fromObject($data, 'pdf', 'ruta/a/wkhtmltopdf'); //Stream de archivo pdf indicando la ruta del binario/ejecutable
$html = Generate::fromObject($data, 'html'); //Generar string formato html
$location = Generate::fromObject($data, 'file'); //Archivo temporal en pdf (En pruebas)

```

- Llamar a la función fromHtml (debe incluir el css):
- fromHtml($html, $format = 'pdf', $size = 'a4', $height = 210, $wkhtmlPath = 'wkhtmltopdf', $env = 'run')

```
$html = [cadena html a generar]

return Generate::fromHtml($html); //Stream de archivo pdf en tamaño a4
return Generate::fromHtml($html, 'pdf', 'ticket'); //Stream de archivo pdf en tamaño ticket
return Generate::fromHtml($html, 'pdf', 'ticket', tamaño); //Generar archivo en formato ticket indicando alto de la página
return Generate::fromHtml($html, 'pdf', 'a4', 'ruta/a/wkhtmltopdf'); //Stream de archivo pdf en tamaño a4 indicando la ruta del binario/ejecutable

```

Se genera un stream del archivo, asi que no es necesario agregar return o asignarlo a una variable

Documentos personalizados (tipoDoc = `00`)
------------------------------------------

[](#documentos-personalizados-tipodoc--00)

> Los documentos “custom” se procesan cuando el tipo de documento es `00`. La plantilla Twig evalúa esta condición con:

```
{% set isCustom = doc.tipoDoc in ['00'] %}
```

### Datos adicionales requeridos para `tipoDoc = 00`

[](#datos-adicionales-requeridos-para-tipodoc--00)

Además del objeto estándar, se **requiere**:

- `doc.tipoDocNombre` (string): nombre visible del documento custom.
- `doc.detailsHeader` (array de objetos): define el **encabezado** y mapea columnas de `details`. Campos soportados por columna:

    - `field` (string, **requerido**): clave presente en cada item de `details`.
    - `title` (string, recomendado): etiqueta a mostrar en el encabezado.
    - `type` (string, opcional): uno de `text` (default), `number`, `currency`, `boolean`, `date`.
    - `decimals` (int, opcional): número de decimales para `number`/`currency` (por defecto: `number=0`, `currency=2`).
    - `format` (string, opcional): formato para `date` (por defecto: `d/m/Y`).
    - `align` (string, opcional): `left|center|right`. Si se omite, se infiere por `type` (`number/currency=right`, `boolean=center`, demás `left`).
    - `null_as` (string, opcional): placeholder si el valor es `null` o vacío.
- `doc.details` (array de objetos): filas del detalle. **Cada objeto debe incluir** los campos listados en `detailsHeader[*].field`.
- `doc.detailsSummary` (array de objetos, opcional): totales/resumen. Para `ticket`, incluya `colspan`.

### Ejemplo mínimo de configuración

[](#ejemplo-mínimo-de-configuración)

```
$data->tipoDoc       = '00';
$data->tipoDocNombre = 'CONSTANCIA';
$data->detailsHeader = [
    (object) ['title' => 'CÓDIGO',      'field' => 'codProducto', 'type' => 'text',    'align' => 'left'],
    (object) ['title' => 'DESCRIPCIÓN', 'field' => 'descripcion', 'type' => 'text'],
    (object) ['title' => 'CANT.',       'field' => 'cantidad',    'type' => 'number',  'decimals' => 0],
    (object) ['title' => 'P. UNIT',     'field' => 'precio',      'type' => 'currency','decimals' => 2],
    (object) ['title' => 'TOTAL',       'field' => 'total',       'type' => 'currency'],
];
$data->details = [
    (object) [
        'codProducto' => '1.3.23.14.1',
        'descripcion' => 'CONSTANCIA DE NOTAS POR SEMESTRE',
        'cantidad'    => '1',
        'precio'      => '6.00',
        'total'       => '6.00',
    ],
];
$data->detailsSummary = [
    (object) ['title' => 'TOTAL', 'value' => '6.00', 'colspan' => 2],
];
```

### Vista previa

[](#vista-previa)

[![img.png](img.png)](img.png)

###  Health Score

35

—

LowBetter than 79% of packages

Maintenance60

Regular maintenance activity

Popularity17

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 87.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~22 days

Recently: every ~38 days

Total

33

Last Release

253d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c642eee481d7256c466e884d7b0098c28e57e5309d3afd148fd90c9696bf9ea6?d=identicon)[PuyuPe](/maintainers/PuyuPe)

---

Top Contributors

[![cristhiansj](https://avatars.githubusercontent.com/u/12085431?v=4)](https://github.com/cristhiansj "cristhiansj (132 commits)")[![velnae](https://avatars.githubusercontent.com/u/19869532?v=4)](https://github.com/velnae "velnae (17 commits)")[![OscarDevCPP](https://avatars.githubusercontent.com/u/143469741?v=4)](https://github.com/OscarDevCPP "OscarDevCPP (2 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/puyu-pe-qillqay/health.svg)

```
[![Health](https://phpackages.com/badges/puyu-pe-qillqay/health.svg)](https://phpackages.com/packages/puyu-pe-qillqay)
```

###  Alternatives

[reportico-web/reportico

Reportico Open Source PHP Report Designer

17120.5k2](/packages/reportico-web-reportico)[greenter/report

Representacion Impresa para Facturacion Electrónica SUNAT - Perú

1224.1k1](/packages/greenter-report)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
