From 9559652f40744abb8b66901976457b4b82f242a4 Mon Sep 17 00:00:00 2001 From: Marco Gallegos Date: Sun, 14 Sep 2025 08:36:50 -0600 Subject: [PATCH] feat: Add automatic anticipo notes to tickets and optimize for 58mm printers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add automatic notes for anticipo tickets with commitment and cancellation policy - Optimize ticket layout for 58mm thermal printers (reduced from 72mm) - Improve ticket spacing with better margins (0.1cm/0.05cm) - Add proper capitalization for service titles (e.g. "anticipo" → "Anticipo") - Enhance total amount formatting with larger font size (15px) and better spacing - Add visual separation between payment method and staff information 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- README.md | 11 ++++++++++- package.json | 2 +- print.js | 16 +++++++++++++++- styles.css | 22 ++++++++++++++-------- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d7be4f1..25866fa 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Este es un sistema de Punto de Venta (POS) simple y eficiente, diseñado para ge - **Sistema de descuentos**: Descuentos por porcentaje o monto fijo con motivo - **Cálculo automático de totales**: Subtotal, descuento y total final en tiempo real - **Programación de citas**: Fecha y hora integradas en el flujo de ventas - - **Generación de tickets**: Recibos optimizados para impresión térmica de 58mm + - **Generación de tickets**: Recibos optimizados para impresión térmica de 58mm con notas automáticas para anticipos - **Exportación a CSV**: Historial completo de ventas exportable - **Gestión de Clientes:** Registro y consulta de clientes, con expediente completo incluyendo historial de servicios y cursos. - **Gestión de Productos:** Administración completa de servicios y cursos con precios actualizables. @@ -128,6 +128,15 @@ El sistema está diseñado para ser desplegado fácilmente utilizando Docker y D --- +## Historial - Versión 1.5.5 + +### 🎫 **Mejoras en Tickets de Anticipo** +- **Notas automáticas**: Los tickets de anticipo incluyen automáticamente notas sobre compromiso de tiempo y política de cancelación +- **Optimización 58mm**: Tickets optimizados específicamente para impresoras térmicas de 58mm con mejor aprovechamiento del espacio +- **Formato mejorado**: Capitalización automática de títulos de servicios y mejor espaciado visual + +--- + ## Historial - Versión 1.5.0 ### 🎫 **Reorganización de Interface** diff --git a/package.json b/package.json index 672cc77..62e357c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ap-pos", - "version": "1.5.4", + "version": "1.5.5", "main": "app.js", "scripts": { "start": "node server.js" diff --git a/print.js b/print.js index b4fa34d..54d90f8 100644 --- a/print.js +++ b/print.js @@ -40,7 +40,8 @@ function templateTicket(mov, settings) { } const montoFormateado = Number(mov.monto).toFixed(2); - const tipoServicio = mov.subtipo === 'Retoque' ? `Retoque de ${mov.tipo}` : mov.tipo; + const tipoServicio = mov.subtipo === 'Retoque' ? `Retoque de ${mov.tipo}` : + (mov.tipo.charAt(0).toUpperCase() + mov.tipo.slice(1).toLowerCase()); const lines = []; lines.push('
'); @@ -144,6 +145,16 @@ function templateTicket(mov, settings) { } } + // Add special notes for anticipo tickets + const isAnticipo = mov.tipo === 'Anticipo' || (mov.concepto && mov.concepto.toLowerCase().includes('anticipo')); + if (isAnticipo) { + lines.push('
'); + lines.push('
Al dejar tu anticipo, te agradecemos tu compromiso con nuestro tiempo, de la misma forma en que nosotros respetamos el tuyo.
'); + lines.push('
'); + lines.push('
Las cancelaciones con menos de 24 horas no son reembolsables.
'); + lines.push('
'); + } + if (mov.notas) lines.push(`
Notas: ${esc(mov.notas)}
`); lines.push('
'); @@ -154,6 +165,9 @@ function templateTicket(mov, settings) { // MÉTODO DE PAGO DEBAJO DEL TOTAL - ALINEADO A LA IZQUIERDA if (mov.metodo) lines.push(`
Método: ${esc(mov.metodo)}
`); + // PEQUEÑO ESPACIO ANTES DE TE ATENDIÓ + if (mov.staff) lines.push('
'); + // TE ATENDIÓ DEBAJO DEL MÉTODO DE PAGO if (mov.staff) lines.push(`
Te atendió: ${esc(mov.staff)}
`); diff --git a/styles.css b/styles.css index 734cfc7..84b208b 100644 --- a/styles.css +++ b/styles.css @@ -870,11 +870,11 @@ button.action-btn { /* Estilos del Ticket */ .ticket { - width: 72mm; - max-width: 72mm; + width: 58mm; + max-width: 58mm; background: #fff; color: #000; - padding: 8px 2px; + padding: 6px 1mm; box-sizing: border-box; font: 13px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; border: 1px solid #ccc; /* Visible en pantalla, no en impresión */ @@ -895,12 +895,18 @@ button.action-btn { .t-small { font-size: 11px; line-height: 1.3; } .t-service-title { margin-bottom: 6px; font-size: 12px; } .t-service-detail { margin-bottom: 3px; } +.t-anticipo-note { + word-wrap: break-word; + width: 100%; + text-align: left; + line-height: 1.4; +} .t-divider { border-top: 1px dashed #000; margin: 8px 0; } .t-row { display: flex; justify-content: space-between; margin-bottom: 2px; } .t-row-label { font-weight: bold; } .t-service-detail-label { font-weight: bold; } .t-footer { margin-top: 10px; } -.t-total-large { font-size: 13px; } +.t-total-large { font-size: 15px; margin: 6px 0; } .t-qr-section { margin-top: 12px; @@ -962,15 +968,15 @@ button.action-btn { } @page { - size: 72mm auto; - margin: 0.3cm 0.1cm; + size: 58mm auto; + margin: 0.1cm 0.05cm; } /* Configuración adicional para impresión PDF */ @media print { body { - width: 72mm !important; - max-width: 72mm !important; + width: 58mm !important; + max-width: 58mm !important; } }