From d99ef65268ad83bed628c6bf19084a9c4fa751b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Mon, 13 Oct 2025 14:38:30 +0200 Subject: [PATCH] =?UTF-8?q?draft=20de=20impresion=20presupuesto,=20a=C3=B1?= =?UTF-8?q?adiendo=20posibilidades=20de=20iva?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/pdf/TemplateRegistry.java | 1 - src/main/resources/i18n/pdf_en.properties | 0 src/main/resources/i18n/pdf_es.properties | 21 ++ .../resources/i18n/presupuesto_es.properties | 9 + .../static/assets/css/bootstrap-for-pdf.css | 59 ++++ .../static/assets/css/presupuestador.css | 1 + .../static/assets/css/presupuestopdf.css | 334 +++++++++++++++--- .../static/assets/images/logo-watermark.png | Bin 0 -> 7635 bytes .../imprimelibros/pdf/presupuesto-a4.html | 299 +++++++++------- .../_datos-generales.html | 73 +++- .../imprimelibros/erp/pdf/PdfSmokeTest.java | 167 +++++---- 11 files changed, 712 insertions(+), 252 deletions(-) create mode 100644 src/main/resources/i18n/pdf_en.properties create mode 100644 src/main/resources/i18n/pdf_es.properties create mode 100644 src/main/resources/static/assets/css/bootstrap-for-pdf.css create mode 100644 src/main/resources/static/assets/images/logo-watermark.png diff --git a/src/main/java/com/imprimelibros/erp/pdf/TemplateRegistry.java b/src/main/java/com/imprimelibros/erp/pdf/TemplateRegistry.java index 71f19c1..12008f7 100644 --- a/src/main/java/com/imprimelibros/erp/pdf/TemplateRegistry.java +++ b/src/main/java/com/imprimelibros/erp/pdf/TemplateRegistry.java @@ -8,7 +8,6 @@ public class TemplateRegistry { public TemplateRegistry(PdfModuleConfig config) { this.config = config; - System.out.println("PDF templates registrados => " + config.getTemplates()); } public String resolve(DocumentType type, String templateId) { diff --git a/src/main/resources/i18n/pdf_en.properties b/src/main/resources/i18n/pdf_en.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/i18n/pdf_es.properties b/src/main/resources/i18n/pdf_es.properties new file mode 100644 index 0000000..4b71644 --- /dev/null +++ b/src/main/resources/i18n/pdf_es.properties @@ -0,0 +1,21 @@ +pdf.company.name=Impresión ImprimeLibros S.L. +pdf.company.address=C/ José Picón, 28 local A +pdf.company.postalcode=28028 +pdf.company.city=Madrid +pdf.company.phone=+34 910052574 + +pdf.presupuesto=PRESUPUESTO +pdf.factura=FACTURA +pdf.pedido=PEDIDO + +# Presupuesto +pdf.presupuesto.number=PRESUPUESTO Nº: +pdf.presupuesto.client=CLIENTE: +pdf.presupuesto.date=FECHA: + +pdf.presupuesto.titulo=Título: + +pdf.politica-privacidad=Política de privacidad +pdf.politica-privacidad.responsable=Responsable: Impresión Imprime Libros - CIF: B04998886 - Teléfono de contacto: 910052574 +pdf.politica-privacidad.correo-direccion=Correo electrónico: info@imprimelibros.com - Dirección postal: Calle José Picón, Nº 28 Local A, 28028, Madrid +pdf.politica-privacidad.aviso=Le comunicamos que los datos que usted nos facilite quedarán incorporados en nuestro registro interno de actividades de tratamiento con el fin de llevar a cabo una adecuada gestión fiscal y contable. Los datos proporcionados se conservarán mientras se mantenga la relación comercial o durante los años necesarios para cumplir con las obligaciones legales. Así mismo, los datos no serán cedidos a terceros salvo en aquellos casos en que exista una obligación legal. Tiene derecho a acceder a sus datos personales, rectificar los datos inexactos, solicitar su supresión, limitar alguno de los tratamientos u oponerse a algún uso vía e-mail, personalmente o mediante correo postal. \ No newline at end of file diff --git a/src/main/resources/i18n/presupuesto_es.properties b/src/main/resources/i18n/presupuesto_es.properties index f6d2736..f05835b 100644 --- a/src/main/resources/i18n/presupuesto_es.properties +++ b/src/main/resources/i18n/presupuesto_es.properties @@ -72,6 +72,15 @@ presupuesto.espiral-descripcion=Espiral (a partir de 20 páginas) presupuesto.wire-o=Wire-O presupuesto.wireo=Wire-O presupuesto.wire-o-descripcion=Wire-O (a partir de 20 páginas) +presupuesto.informacion-adicional=Información adicional +presupuesto.informacion-adicional-descripcion=Datos adicionales +presupuesto.iva-reducido=I.V.A reducido +presupuesto.iva-reducido-descripcion=Se verificará que el pedido cumpla con los requisitos establecidos en el Artículo 91 de la Ley 37/1992, sobre inserción de publicidad, antes de proceder con su producción, lo que garantiza la aplicación del IVA reducido del 4%. +presupuesto.entrega=Entrega +presupuesto.entrega.peninsula=Península y Baleares +presupuesto.entrega.canarias=Canarias +presupuesto.entrega.paises-ue=Países UE + presupuesto.encuadernacion-descripcion=Seleccione la encuadernación del libro presupuesto.continuar-interior=Continuar a diseño interior diff --git a/src/main/resources/static/assets/css/bootstrap-for-pdf.css b/src/main/resources/static/assets/css/bootstrap-for-pdf.css new file mode 100644 index 0000000..598f91e --- /dev/null +++ b/src/main/resources/static/assets/css/bootstrap-for-pdf.css @@ -0,0 +1,59 @@ +/* ======================= + Bootstrap for PDF (compatible con OpenHTMLtoPDF) + ======================= */ + +/* -- TEXT ALIGN -- */ +.text-start { text-align: left !important; } +.text-center { text-align: center !important; } +.text-end { text-align: right !important; } + +/* -- FONT WEIGHT -- */ +.fw-normal { font-weight: 400 !important; } +.fw-semibold { font-weight: 600 !important; } +.fw-bold { font-weight: 700 !important; } + +/* -- SPACING (margin/padding) -- */ +.mt-1 { margin-top: 0.25rem !important; } +.mt-2 { margin-top: 0.5rem !important; } +.mt-3 { margin-top: 1rem !important; } +.mb-1 { margin-bottom: 0.25rem !important; } +.mb-2 { margin-bottom: 0.5rem !important; } +.mb-3 { margin-bottom: 1rem !important; } + +.p-1 { padding: 0.25rem !important; } +.p-2 { padding: 0.5rem !important; } +.p-3 { padding: 1rem !important; } + +/* -- TABLE -- */ +.table { + width: 100%; + border-collapse: collapse; + font-size: 10.5pt; +} + +.table th, +.table td { + padding: 6px; + border: 1px solid #dee2e6; +} + +.table thead th { + background-color: #f8f9fa; + font-weight: 700; +} + +/* -- BORDER -- */ +.border { + border: 1px solid #dee2e6 !important; +} + +.border-0 { border: 0 !important; } + +/* -- BACKGROUND -- */ +.bg-light { background-color: #f8f9fa !important; } +.bg-white { background-color: #fff !important; } + +/* -- DISPLAY UTILS (limited) -- */ +.d-block { display: block !important; } +.d-inline { display: inline !important; } +.d-inline-block { display: inline-block !important; } diff --git a/src/main/resources/static/assets/css/presupuestador.css b/src/main/resources/static/assets/css/presupuestador.css index 6d6a116..060f000 100644 --- a/src/main/resources/static/assets/css/presupuestador.css +++ b/src/main/resources/static/assets/css/presupuestador.css @@ -414,6 +414,7 @@ .form-switch-presupuesto .form-check-input:checked { border-color: #92b2a7; + background-color: #cbcecd; } .form-switch-custom.form-switch-presupuesto .form-check-input:checked::before { diff --git a/src/main/resources/static/assets/css/presupuestopdf.css b/src/main/resources/static/assets/css/presupuestopdf.css index 1b1063a..165d183 100644 --- a/src/main/resources/static/assets/css/presupuestopdf.css +++ b/src/main/resources/static/assets/css/presupuestopdf.css @@ -1,54 +1,169 @@ +:root { + --verde: #92b2a7; + --letterspace: 8px; + /* ← puedes ajustar este valor en el root */ + -ink: #1b1e28; + --muted: #5b6472; + --accent: #0ea5e9; + /* azul tira a cyan */ + --line: #e6e8ef; + --bg-tag: #f4f7fb; +} + /* Open Sans (rutas relativas desde css → fonts) */ @font-face { font-family: "Open Sans"; src: url("../fonts/OpenSans-Regular.ttf") format("truetype"); font-weight: 400; } + @font-face { font-family: "Open Sans"; src: url("../fonts/OpenSans-SemiBold.ttf") format("truetype"); font-weight: 600; } + @font-face { font-family: "Open Sans"; src: url("../fonts/OpenSans-Bold.ttf") format("truetype"); font-weight: 700; } -:root { - --ink: #1b1e28; - --muted: #5b6472; - --accent: #0ea5e9; /* azul tira a cyan */ - --line: #e6e8ef; - --bg-tag: #f4f7fb; -} @page { size: A4; - margin: 15mm 14mm 18mm 14mm; - @bottom-right { content: "Página " counter(page) " / " counter(pages); } + margin: 0; } -html, body { - font-family: "Open Sans", Arial, sans-serif; +html, +body { + font-family: "Open Sans" !important; color: var(--ink); font-size: 11pt; line-height: 1.35; } -/* Top band */ -.topbar { - display: table; - width: 100%; - border-bottom: 2px solid var(--accent); - padding-bottom: 6mm; - margin-bottom: 6mm; +.page-content { + padding: 15mm 14mm 28mm 14mm; /* ↑ deja 10mm extra para no pisar el footer */ + box-sizing: border-box; /* para que el padding no desborde */ } -.brand { display: table-cell; width: 60%; vertical-align: top; } -.logo { height: 30px; display: block; margin-bottom: 4px; } -.brand-name { font-weight: 700; } -.brand-meta { color: var(--muted); font-size: 9.5pt; } -.doc-title { display: table-cell; width: 40%; text-align: right; font-weight: 700; letter-spacing: 3px; } + + +body.has-watermark { + background-image: none !important; +} + +/* ====== HEADER (tabla) ====== */ +.il-header { + width: 100%; + border-collapse: collapse; + margin: 0 0 8mm 0; + /* ↓ espacio bajo el header */ +} + +.il-left, +.il-right { + vertical-align: middle; +} + +.il-left { + width: 50%; +} + +.il-right { + width: 50%; + text-align: right; +} + +.il-logo { + height: 70px; +} + +/* ← tamaño logo */ + +/* Caja superior derecha con esquinas */ +.il-company-box { + display: inline-block; + align-items: end; + /* para alinear a la derecha sin ocupar todo */ + position: relative; + padding: 4mm 4mm; + /* ← espacio texto ↔ esquinas */ + color: #000; + font-size: 10.5pt; + /* ← tamaño de letra */ + line-height: 1; + /* ← separación entre líneas */ + max-width: 75mm; + /* ← ancho máximo de la caja */ + text-align: center; +} + +/* Esquinas */ +.il-company-box .corner { + position: absolute; + width: 20px; + /* ← anchura esquina */ + height: 20px; + /* ← altura esquina */ + border-color: #92b2a7; + /* ← color esquina */ +} + +.corner.tl { + top: 0; + left: 0; + border-top: 2px solid #92b2a7; + border-left: 2px solid #92b2a7; +} + +.corner.tr { + top: 0; + right: 0; + border-top: 2px solid #92b2a7; + border-right: 2px solid #92b2a7; +} + +.corner.bl { + bottom: 0; + left: 0; + border-bottom: 2px solid #92b2a7; + border-left: 2px solid #92b2a7; +} + +.corner.br { + bottom: 0; + right: 0; + border-bottom: 2px solid #92b2a7; + border-right: 2px solid #92b2a7; +} + + +.company-line { + margin: 1.5mm 0; +} + + + +/* Nueva banda verde PRESUPUESTO */ +.doc-banner { + width: 100%; + background-color: #92b2a7 !important; /* ← tu verde corporativo */ + color: white; + text-align: center; + padding: 2mm 0; + margin-bottom: 4mm; + display: block; /* evita conflictos */ +} + +.banner-text { + font-family: "Open Sans", Arial, sans-serif !important; + font-weight: 400; + font-size: 20pt; + letter-spacing: 8px; /* ← configurable */ +} + + /* ficha superior */ .sheet-info { @@ -57,41 +172,99 @@ html, body { margin: 4mm 0 6mm 0; font-size: 10.5pt; } + .sheet-info td { border: 1px solid var(--line); padding: 4px 6px; } -.sheet-info .lbl { color: var(--muted); margin-right: 4px; } -.sheet-info .val { font-weight: 700; } + +.sheet-info .lbl { + color: var(--muted); + margin-right: 4px; +} + +/*.sheet-info .val { +}*/ /* Línea título libro */ .line-title { + font-family: "Open Sans", Arial, sans-serif !important; margin: 3mm 0 5mm 0; - padding: 4px 6px; - background: var(--bg-tag); - border-left: 3px solid var(--accent); + padding: 2px 4px; font-size: 10.5pt; + font-weight: 600; + color: #5c5c5c; +} + +.line-title .lbl { + margin-right: 6px; + font-weight: 600; } -.line-title .lbl { color: var(--muted); margin-right: 6px; font-weight: 600; } /* Specs 2 columnas */ -.specs { display: table; width: 100%; table-layout: fixed; margin-bottom: 6mm; } -.specs .col { display: table-cell; width: 50%; padding-right: 6mm; vertical-align: top; } -.specs .col:last-child { padding-right: 0; } +.specs-wrapper { + width: 180mm; + margin-left: 15mm; /* ← margen izquierdo real del A4 */ + margin-right: auto; /* opcional */ + color: #5c5c5c; +} + +.align-with-text { + margin-left: 1mm; + margin-right: 0; + width: auto; +} + +.specs { + display: table; + width: 100%; + table-layout: fixed; + margin-bottom: 6mm; +} +.specs .col { + display: table-cell; + width: 50%; + padding-right: 6mm; + vertical-align: top; +} +.specs .col:last-child { + padding-right: 0; +} + .block-title { text-transform: uppercase; font-weight: 700; color: var(--accent); - font-size: 10pt; + font-size: 8pt; margin: 2mm 0 1mm 0; } -.kv { margin: 1mm 0; } -.kv span { color: var(--muted); display: inline-block; min-width: 55%; } -.kv b { font-weight: 600; } -.subblock { margin-top: 3mm; } -.services { margin: 0; padding-left: 14px; } -.services li { margin: 1mm 0; } +.kv { + margin: 1mm 0; +} + +.kv span { + color: var(--muted); + display: inline-block; + min-width: 55%; +} + +.kv b { + font-weight: 600; +} + +.subblock { + margin-top: 3mm; +} + +.services { + margin: 0; + padding-left: 14px; +} + +.services li { + margin: 1mm 0; +} /* Bloque marcapáginas */ .bookmark { @@ -100,8 +273,10 @@ html, body { padding: 3mm; background: #fff; } + .bookmark .bk-title { - font-weight: 700; margin-bottom: 2mm; + font-weight: 700; + margin-bottom: 2mm; } /* Tabla de precios (tiradas) */ @@ -111,6 +286,7 @@ html, body { margin-top: 6mm; font-size: 10.5pt; } + .prices thead th { text-align: left; padding: 6px; @@ -118,27 +294,81 @@ html, body { background: #eef8fe; font-weight: 700; } + .prices tbody td { border-bottom: 1px solid var(--line); padding: 6px; } -.prices .col-tirada { width: 22%; font-weight: 700; } + +.prices .col-tirada { + width: 22%; + font-weight: 700; +} /* Footer */ + .footer { - margin-top: 8mm; + position: fixed; + left: 14mm; + right: 14mm; + bottom: 18mm; border-top: 1px solid var(--line); padding-top: 4mm; - display: table; - width: 100%; - font-size: 9.5pt; + font-size: 7.5pt; + color: var(--muted); + z-index: 10; /* sobre la marca */ + background: transparent; +} + + +.footer .address { + display: table-cell; + width: 45%; +} + +.footer .privacy { + display: table-cell; + width: 55%; +} + +.pv-title { + font-weight: 700; + margin-bottom: 1mm; + color: var(--ink); +} + +.pv-text { + line-height: 1.25; +} + +.page-count { + margin-top: 2mm; + text-align: right; + font-size: 9pt; color: var(--muted); } -.footer .address { display: table-cell; width: 45%; } -.footer .privacy { display: table-cell; width: 55%; } -.pv-title { font-weight: 700; margin-bottom: 1mm; color: var(--ink); } -.pv-text { line-height: 1.25; } -.page-count { margin-top: 2mm; text-align: right; font-size: 9pt; color: var(--muted); } -.page::after { content: counter(page); } -.pages::after { content: counter(pages); } +.page::after { + content: counter(page); +} + +.pages::after { + content: counter(pages); +} + +/* Caja a página completa SIN vw/vh y SIN z-index negativo */ +.watermark { + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; /* ocupa toda la HOJA */ + pointer-events: none; + z-index: 0; /* debajo del contenido */ +} + +.watermark img { + position: absolute; + top: 245mm; /* baja/sube (70–85%) */ + left: 155mm; /* desplaza a la derecha si quieres */ + transform: translate(-50%, -50%) rotate(-15deg); + width: 60%; /* tamaño grande, ya no hay recorte por márgenes */ + max-width: none; +} diff --git a/src/main/resources/static/assets/images/logo-watermark.png b/src/main/resources/static/assets/images/logo-watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..87a35222edeb10b1edfc98585032e45b9a579840 GIT binary patch literal 7635 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/templates/imprimelibros/pdf/presupuesto-a4.html b/src/main/resources/templates/imprimelibros/pdf/presupuesto-a4.html index 6e58aeb..06f4e45 100644 --- a/src/main/resources/templates/imprimelibros/pdf/presupuesto-a4.html +++ b/src/main/resources/templates/imprimelibros/pdf/presupuesto-a4.html @@ -1,142 +1,199 @@ + Presupuesto + - - -
-
- -
-
ImprimeLibros ERP
-
- C. José Picón, 28 local A · 28028 Madrid - · 910052574 - · info@imprimelibros.com - · B04998886 -
-
-
-
P R E S U P U E S T O
+ + + +
+ Marca de agua
- - - - - - - -
PRESUPUESTO Nº: 153153CLIENTE: JUAN JOSÉ MÉNDEZFECHA: 10/10/2025
+
+ - -
- Título: - Libro de prueba -
- - -
-
-
Encuadernación
-
Encuadernación:Fresado
-
Formato: - 148x210 mm -
-
Páginas:132
-
Páginas Negro:100
-
Páginas Color:32
- -
-
Interior
-
Tipo de impresión:Color Premium
-
Papel interior:Estucado Mate
-
Gramaje interior:115
-
-
- -
-
-
Cubierta
-
Tipo de cubierta:Tapa blanda
-
Solapas:
-
Tamaño solapas:80 mm
-
Impresión:Una cara
-
Papel cubierta:Estucado mate
-
Gramaje cubierta:250
-
Acabado:Plastificado Brillo 1/C
-
- -
-
Servicios Extras
- -
-
    -
  • - Ferro Digital - 0,00 € -
  • -
-
- - -
-
Marcapáginas
-
Tamaño:50x210
-
Papel:Estucado mate 300 g
-
Impresión:Una cara
-
Plastificado:Brillo 1/C
-
-
-
-
- - - - + +
- - - - - + + - - - - - - - - - +
TIRADAIMPRESIÓNIVATOTALUNIDAD + + +
+ + + + + +
+ ImprimeLibros ERP
+
C/ José Picón, 28 local A
+
+ 28028 + Madrid +
+
+34 910052574
+
+
100 uds.152,15€7,68€159,99€1,52€
+ + + +
+ +
+ + + + + + + - -
PRESUPUESTO Nº: 153153CLIENTE: JUAN JOSÉ + MÉNDEZFECHA: 10/10/2025
+ + + +
+ Título: + Libro de prueba +
+ + +
+
+
+
Encuadernación
+
Encuadernación:Fresado
+
Formato: + 148x210 mm +
+
Páginas:132
+
Páginas Negro:100
+
Páginas Color:32
+ +
+
Interior
+
Tipo de impresión:Color + Premium
+
Papel interior:Estucado + Mate +
+
Gramaje interior:115
+
+
+ +
+
+
Cubierta
+
Tipo de cubierta:Tapa + blanda +
+
Solapas:
+
Tamaño solapas:80 mm
+
Impresión:Una cara
+
Papel cubierta:Estucado + mate +
+
Gramaje cubierta:250
+
Acabado:Plastificado + Brillo 1/C
+
+ +
+
Servicios Extras
+ +
+
    +
  • + Ferro Digital + 0,00 € +
  • +
+
+ + +
+
Marcapáginas
+
Tamaño:50x210
+
Papel:Estucado + mate + 300 g
+
Impresión:Una cara +
+
Plastificado:Brillo + 1/C
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TIRADAIMPRESIÓNIVATOTALUNIDAD
100 uds.152,15€7,68€159,99€1,52€
Sin datos de tiradas.
+ +