ps-invoice-preview
Skill4 starsChanged 13 days agoMITView on GitHub
Generates a local invoice PDF viewer for PrestaShop projects, deployed as invoice-preview/index.php (subfolder, ROOT = dirname(__DIR__)). Lists the last 50 orders (searchable by reference/customer/id), renders the real PDF invoice for any order straight from classes/pdf/HTMLTemplateInvoice.php + pdf/*.tpl (respecting any themes/{child}/pdf/*.tpl override PS itself resolves) inline in the browser via an iframe, with a "Generar factura" button for orders that don't have one yet. Zero placeholders to fill in — admin dir, Lando URL, DB credentials and shop name are all auto-detected at runtime from config/parameters.php and the PS_SHOP_NAME configuration value. Gated behind backoffice employee auth (Cookie class, always denies on failure). Geist-font UI matching the ps-email-preview visual style. Use this skill whenever the user wants to preview, inspect, or debug PrestaShop invoice/receipt PDF templates without going through the backoffice order page each time, asks "cómo se ve la factura", "quiero ver el PDF de la factura", "invoice preview", "visor de facturas", "previsualizar recibo/rebut", or is iterating on pdf/invoice*.tpl, pdf/footer.tpl, or HTMLTemplateInvoice overrides. Trigger proactively when the user is about to edit invoice/receipt PDF layout.
In this repository37 other files it gives its agents.
- blast-radiusSkill
- elementflow-kbSkill
- gitlab-changelog-releaseSkill
- gitlab-ci-quality-gatesSkill
- gitlab-project-bootstrapSkill
- gitlab-security-setupSkill
- gitlab-wiki-bootstrapSkill
- lando-checkSkill
- lando-img-placeholderSkill
- lando-mail-smtpSkill
- lando-setupSkill
- mallard-releaseSkill
- mr-flowSkill
- no-commentsSkill
- paginated-report-pdfSkill
- panda-kbSkill
- ploi-prestashop-deploySkill
- prestashop-kbSkill
- ps-consoleSkill
- ps-css-buildSkill
- ps-demo-userSkill
- ps-email-previewSkill
- ps-image-regenSkill
- ps-new-projectSkill
- ps-one-page-checkoutSkill
- ps-project-docSkill
- ps-security-auditSkill
- ps-storefront-polishSkill
- ps-theme-cacheSkill
- ps-translateSkill
- ps-view-transitionsSkill
- ps-watchSkill
- reflectSkill
- show-me-your-workSkill
- skill-authorSkill
- task-contextSkill
- verify-ps-projectSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 76
No hace falta configurar nada — es solo para poder decirle al usuario a qué URL ir a loguearse si el visor le muestra "Acceso restringido".
- Distinctive: line 106
No es necesario salvo que el proyecto ya use ese patrón en otro lado.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
PS Invoice Preview
Genera un visor de facturas PDF para PrestaShop en un solo archivo PHP.
Renderiza el PDF real (mismo motor que usa el backoffice: HTMLTemplateInvoice
pdf/*.tpl) para cualquier pedido, directo en el navegador, sin pasar por el backoffice. Pensado para iterar rápido sobre cambios de maquetación de factura (pdf/invoice*.tpl,pdf/footer.tpl, overrides de tema).
A diferencia de ps-email-preview, esta skill no necesita placeholders:
todo se detecta en runtime dentro del propio PHP (carpeta de admin, URL,
credenciales DB, nombre de tienda). El paso de generación es una copia
directa del asset.
Características del visor
- Sidebar con últimos 50 pedidos — buscador en tiempo real por referencia, nombre/apellido de cliente o ID de pedido
- Estado del pedido — badge con el nombre del estado actual (
order_state_lang) - Pedido con factura generada → botón "Ver factura #N" que carga el PDF real en un iframe
- Pedido sin factura → botón "Generar factura" que llama a
$order->setInvoice(true)y recarga - PDF real, no una aproximación HTML — usa
PDF::TEMPLATE_INVOICE+Order::getInvoicesCollection(), el mismo pipeline que el backoffice (AdminOrders→ generar factura PDF), así que respeta cualquier override enthemes/{child}/pdf/*.tplo clasesoverride/classes/pdf/HTMLTemplateInvoice.phptal cual estarían en producción - Auto-detección de carpeta admin — busca la primera carpeta de primer nivel con
init.php+bootstrap.php(cubre admins renombrados por seguridad, ej.panelAmics) - Nombre de tienda dinámico — lee
PS_SHOP_NAMEde la config PS para el<title>y el encabezado del sidebar - Sin caché — cada carga re-renderiza el PDF desde cero contra la BD actual
Paso 1 — Detectar el contexto del proyecto (opcional, informativo)
# Child theme (para saber dónde el usuario debe poner sus overrides de pdf/)
grep -rl "^parent:" themes/*/config/theme.yml 2>/dev/null
# Nombre del proyecto Lando → URL de acceso
grep "^name:" .lando.yml | head -1LANDO_URL=https://{nombre-lando}.lndo.site(mismo cálculo que enps-email-preview: los puntos de versión se eliminan, ej.v9.1→v91)CHILD_THEME— solo se usa para comunicarle al usuario dónde crear sus overrides (themes/{child}/pdf/*.tpl); el visor mismo no lo necesita como variable porque PS resuelve la ruta internamente víaHTMLTemplate::getTemplate().
Paso 2 — Verificar la carpeta de admin
El visor necesita saber si hay sesión de empleado activa. Detecta automáticamente
la carpeta de admin buscando init.php + bootstrap.php, pero si el proyecto
tiene una convención rara, verifica manualmente:
find . -maxdepth 1 -type d -iname "*admin*"No hace falta configurar nada — es solo para poder decirle al usuario a qué URL ir a loguearse si el visor le muestra "Acceso restringido".
Paso 3 — Generar invoice-preview/index.php
Copia el asset tal cual (no hay placeholders que sustituir):
mkdir -p invoice-preview/
cp {ruta-de-este-skill}/assets/invoice-preview.php invoice-preview/index.phpEl archivo usa ROOT = dirname(__DIR__) para subir un nivel y acceder a PS.
Nota PS8 vs PS9
El asset bootea el contexto con el contenedor legacy 'front'
(PrestaShop\PrestaShop\Adapter\ContainerBuilder::getContainer('front', _PS_MODE_DEV_)),
porque es el que expone prestashop.core.localization.locale.repository
(necesario para que Tools/Locale formateen precios dentro de los .tpl).
Esto funciona en PS8 y PS9. Si el proyecto es PS9 con AdminKernel disponible
y se prefiere ese camino, se puede reemplazar bootPsContext() por:
require_once ROOT . '/autoload.php';
$kernel = new AdminKernel(_PS_ENV_, _PS_MODE_DEV_);
$kernel->boot();
Context::getContext()->container = $kernel->getContainer();No es necesario salvo que el proyecto ya use ese patrón en otro lado.
Paso 4 — Verificar y comunicar al usuario
Confirma al usuario:
- La URL de acceso:
{LANDO_URL}/invoice-preview/ - Que necesita estar logueado en el backoffice (mismo guard que
ps-email-preview) - Dónde van sus overrides de plantilla de factura:
themes/{CHILD_THEME}/pdf/{nombre}.tpl(ej.invoice.tpl,invoice.product-tab.tpl,footer.tpl,header.tpl) — PS resuelve child → core automáticamente (para PDFs no hay nivel intermedio de parent theme, a diferencia de emails: verclasses/pdf/HTMLTemplate.php::getTemplate()) - Que "Ver factura" pide un pedido con
invoice_numberya generado; si no lo tiene, aparece "Generar factura"
Notas importantes
- El archivo
invoice-preview/index.phpes solo para desarrollo local — no subir a producción. - Antes de tocar un
.tplde factura, recomienda al usuario limpiar el caché de clases de PS si acaba de tocar unoverride/classes/pdf/*.php:var/cache/{dev,prod}/class_index.php— si no, Smarty puede fallar con "unknown modifier" al no cargar el override que registra el modifier. - Los templates de factura son compartidos entre tipos de documento cuando
aplica:
pdf/footer.tpl,pdf/header.tplypdf/pagination.tpllos usan TODOS los PDFs (factura, albarán, abono, devolución), no solo la factura. Si el usuario pide "quitar X del pie de la factura" y X está enfooter.tpl, avisa que el cambio afectará también a los demás documentos PDF, salvo que se prefiera duplicar lógica condicional por tipo de documento dentro del tpl. - Para forzar quitar una columna de la tabla de productos (ej. impuestos) sin
tocar la config global (
PS_TAX), reutiliza el layout que el core YA aplica cuando$isTaxEnabledes false (vercomputeLayout()enclasses/pdf/HTMLTemplateInvoice.php): en el override del.tpl, fuerza{assign var='widthColProduct' value=$layout.product.width+$layout.tax_code.width}y quita los bloques{if $isTaxEnabled}correspondientes, sin envolverlos en condicional — así el resto de cálculos de impuestos sigue intacto.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

