Merge branch 'mod/modificaciones_problemas_varios' into 'main'

solucionado problema con cargar solapas de cubierta y formato. También añadido...

See merge request jjimenez/erp-imprimelibros!48
This commit is contained in:
2026-02-26 11:11:52 +00:00
31 changed files with 3231 additions and 119 deletions

10
pom.xml
View File

@ -191,6 +191,16 @@
<systemPath>${project.basedir}/src/main/resources/lib/org.json.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-codec</artifactId>
<version>1.17</version>
</dependency>
</dependencies>

View File

@ -22,7 +22,6 @@ import com.imprimelibros.erp.direcciones.DireccionService;
import com.imprimelibros.erp.cart.Cart;
import com.imprimelibros.erp.cart.CartService;
@Controller
@RequestMapping("/checkout")
public class CheckoutController {
@ -49,7 +48,7 @@ public class CheckoutController {
"app.cancelar",
"app.seleccionar",
"app.yes",
"checkout.billing-address.title",
"checkout.billing-address.title",
"checkout.billing-address.new-address",
"checkout.billing-address.select-placeholder",
"checkout.billing-address.errors.noAddressSelected");
@ -63,20 +62,23 @@ public class CheckoutController {
return "imprimelibros/checkout/checkout"; // crea esta vista si quieres (tabla simple)
}
@GetMapping({"/get-summary", "/get-summary/{direccionId}"})
public String getCheckoutSummary(@PathVariable(required = false) Long direccionId, Principal principal, Model model, Locale locale) {
@GetMapping({ "/get-summary", "/get-summary/{direccionId}/{method}" })
public String getCheckoutSummary(@PathVariable(required = false) Long direccionId,
@PathVariable(required = false) String method, Principal principal, Model model, Locale locale) {
Long userId = Utils.currentUserId(principal);
Cart cart = cartService.getOrCreateActiveCart(userId);
Boolean hasTaxes = true;
if(direccionId != null) {
if (direccionId != null) {
hasTaxes = direccionService.hasTaxes(direccionId);
}
Map<String, Object> summary = cartService.getCartSummary(cart, locale, hasTaxes);
model.addAttribute("summary", summary);
if (method != null) {
model.addAttribute("method", method);
}
return "imprimelibros/checkout/_summary :: checkoutSummary(summary=${summary})";
}
@GetMapping("/get-address/{id}")
public String getDireccionCard(@PathVariable Long id, Model model, Locale locale) {

View File

@ -0,0 +1,47 @@
package com.imprimelibros.erp.error;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.imprimelibros.erp.common.Utils;
import java.time.ZonedDateTime;
@Controller
public class ErrorPageController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request, Model model) {
Object statusObj = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
Integer statusCode = statusObj != null ? Integer.valueOf(statusObj.toString()) : 500;
HttpStatus status = HttpStatus.resolve(statusCode);
if (status == null) status = HttpStatus.INTERNAL_SERVER_ERROR;
Object message = request.getAttribute(RequestDispatcher.ERROR_MESSAGE);
Object exception = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
Object path = request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);
model.addAttribute("status", status.value());
model.addAttribute("error", status.getReasonPhrase());
model.addAttribute("message", message != null ? message : "");
model.addAttribute("path", path != null ? path : "");
model.addAttribute("timestamp", ZonedDateTime.now());
// Puedes usar esto para cambiar iconos/texto según status
model.addAttribute("is404", status == HttpStatus.NOT_FOUND);
model.addAttribute("is403", status == HttpStatus.FORBIDDEN);
model.addAttribute("is500", status.is5xxServerError());
if(Utils.isCurrentUserAdmin())
// una sola vista para todos los errores
return "imprimelibros/error/error";
else
return "redirect:/"; // redirige a home para usuarios no admin
}
}

View File

@ -128,6 +128,62 @@ public class skApiClient {
});
}
public Map<String, Object> getLomos(Map<String, Object> requestBody) {
try {
String jsonResponse = performWithRetry(() -> {
String url = this.skApiUrl + "api/get-lomos";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(authService.getToken()); // token actualizado
Map<String, Object> data = new HashMap<>();
data.put("clienteId", requestBody.get("clienteId"));
data.put("tamanio", requestBody.get("tamanio"));
data.put("tirada", requestBody.get("tirada"));
data.put("paginas", requestBody.get("paginas"));
data.put("paginasColor", requestBody.get("paginasColor"));
data.put("papelInteriorDiferente", 0);
data.put("paginasCuadernillo", requestBody.get("paginasCuadernillo"));
data.put("tipo", requestBody.get("tipo"));
data.put("isColor", requestBody.get("isColor"));
data.put("isHq", requestBody.get("isHq"));
data.put("interior", requestBody.get("interior"));
data.put("cubierta", requestBody.get("cubierta"));
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(data, headers);
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.POST,
entity,
String.class);
return response.getBody();
});
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonResponse);
if (root.get("lomoInterior") == null || !root.get("lomoInterior").isDouble()) {
throw new RuntimeException();
}
Double lomoInterior = root.get("lomoInterior").asDouble();
Double lomoCubierta = root.get("lomoCubierta").asDouble();
return Map.of(
"lomoInterior", lomoInterior,
"lomoCubierta", lomoCubierta);
} catch (JsonProcessingException e) {
// Fallback al 80% del ancho
return Map.of(
"lomoInterior", 0.0,
"lomoCubierta", 0.0);
}
}
public Map<String, Object> savePresupuesto(Map<String, Object> requestBody) {
return performWithRetryMap(() -> {
String url = this.skApiUrl + "api/guardar";

View File

@ -184,11 +184,14 @@ public class PaymentController {
// Campos ordenables
List<String> orderable = List.of(
"transferId",
"client",
"transfer_id",
"status",
"amountCents",
"payment.amountRefundedCents",
"createdAt", "updatedAt");
"amountCentsRefund",
"payment.orderId",
"createdAt",
"processedAt");
Specification<PaymentTransaction> base = (root, query, cb) -> cb.or(
cb.equal(root.get("status"), PaymentTransactionStatus.pending),
@ -215,6 +218,26 @@ public class PaymentController {
return DataTable
.of(repoPaymentTransaction, PaymentTransaction.class, dt, searchable)
.orderable(orderable)
.orderable("client", (root, query, cb) -> {
var sq = query.subquery(String.class);
var u = sq.from(User.class);
sq.select(u.get("fullName"));
sq.where(cb.equal(u.get("id"), root.join("payment").get("userId")));
return sq;
})
.orderable("transfer_id", (root, query, cb) -> {
var orderId = root.join("payment").get("orderId").as(Long.class);
return cb.<Long>selectCase()
.when(cb.isNull(orderId), Long.MAX_VALUE)
.otherwise(orderId);
})
.orderable("payment.orderId", (root, query, cb) -> {
var orderId = root.join("payment").get("orderId").as(Long.class);
return cb.<Long>selectCase()
.when(cb.isNull(orderId), Long.MAX_VALUE)
.otherwise(orderId);
})
.orderable("amountCentsRefund", (root, query, cb) -> root.join("payment").get("amountRefundedCents"))
.add("created_at", pago -> Utils.formatDateTime(pago.getCreatedAt(), locale))
.add("processed_at", pago -> Utils.formatDateTime(pago.getProcessedAt(), locale))
.add("client", pago -> {
@ -237,14 +260,14 @@ public class PaymentController {
return "";
})
.add("order_id", pago -> {
if (pago.getStatus() != PaymentTransactionStatus.pending) {
//if (pago.getStatus() != PaymentTransactionStatus.pending) {
if (pago.getPayment() != null && pago.getPayment().getOrderId() != null) {
return pago.getPayment().getOrderId().toString();
} else {
return "";
}
}
return messageSource.getMessage("pagos.transferencia.no-pedido", null, "Pendiente", locale);
//}
//return messageSource.getMessage("pagos.transferencia.no-pedido", null, "Pendiente", locale);
}).add("amount_cents", pago -> Utils.formatCurrency(pago.getAmountCents() / 100.0, locale))
.add("amount_cents_refund", pago ->

View File

@ -14,14 +14,16 @@ public class PedidoLinea {
procesando_pago("pedido.estado.procesando_pago", 2),
denegado_pago("pedido.estado.denegado_pago", 3),
aprobado("pedido.estado.aprobado", 4),
maquetacion("pedido.estado.maquetacion", 5),
haciendo_ferro("pedido.estado.haciendo_ferro", 6),
esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 7),
ferro_cliente("pedido.estado.ferro_cliente", 8),
produccion("pedido.estado.produccion", 9),
terminado("pedido.estado.terminado", 10),
enviado("pedido.estado.enviado", 11),
cancelado("pedido.estado.cancelado", 12);
procesando_pedido("pedido.estado.procesando_pedido", 5),
maquetacion("pedido.estado.maquetacion", 6),
haciendo_ferro_digital("pedido.estado.haciendo_ferro_digital", 7),
esperando_aceptacion_ferro_digital("pedido.estado.esperando_aceptacion_ferro_digital", 8),
haciendo_ferro("pedido.estado.haciendo_ferro", 9),
esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 10),
produccion("pedido.estado.produccion", 11),
terminado("pedido.estado.terminado", 12),
enviado("pedido.estado.enviado", 13),
cancelado("pedido.estado.cancelado", 14);
private final String messageKey;
private final int priority;

View File

@ -271,7 +271,7 @@ public class PedidoService {
Integer counter = 1;
for (PedidoLinea linea : lineas) {
if (linea.getEstado() == Estado.pendiente_pago
|| linea.getEstado() == Estado.denegado_pago) {
|| linea.getEstado() == Estado.denegado_pago || linea.getEstado() == Estado.procesando_pago) {
Presupuesto presupuesto = linea.getPresupuesto();
linea.setEstado(getEstadoInicial(presupuesto));
@ -311,6 +311,7 @@ public class PedidoService {
return true;
}
@Transactional
public Map<String, Object> actualizarEstado(Long pedidoLineaId, Locale locale) {
PedidoLinea pedidoLinea = pedidoLineaRepository.findById(pedidoLineaId).orElse(null);
@ -327,8 +328,8 @@ public class PedidoService {
"message", messageSource.getMessage("pedido.errors.cannot-update", null, locale));
}
// Rango: >= haciendo_ferro y < enviado
if (estadoOld.getPriority() < PedidoLinea.Estado.haciendo_ferro.getPriority()
// Rango: >= procesando_pedido y < enviado
if (estadoOld.getPriority() < PedidoLinea.Estado.procesando_pedido.getPriority()
|| estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) {
return Map.of(
"success", false,
@ -788,7 +789,7 @@ public class PedidoService {
if (presupuestoService.hasMaquetacion(p)) {
return Estado.maquetacion;
} else {
return Estado.haciendo_ferro;
return Estado.procesando_pedido;
}
}

View File

@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import jakarta.validation.Validator;
@ -48,12 +49,12 @@ import com.imprimelibros.erp.presupuesto.classes.ImagenPresupuesto;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMaquetacion;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMarcapaginas;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import com.imprimelibros.erp.presupuesto.dto.PresupuestoFormDataMapper;
import com.imprimelibros.erp.presupuesto.dto.PresupuestoFormDataMapper.PresupuestoFormDataDto;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import com.imprimelibros.erp.users.UserDao;
import com.imprimelibros.erp.users.UserDetailsImpl;
import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper;
import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper.PresupuestoFormDataDto;
import com.imprimelibros.erp.common.Utils;
import com.imprimelibros.erp.common.web.IpUtils;
@ -151,7 +152,8 @@ public class PresupuestoController {
return ResponseEntity.badRequest().body(errores);
}
Map<String, Object> resultado = new HashMap<>();
Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto),
locale);
resultado.put("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo"));
resultado.putAll(presupuestoService.obtenerOpcionesAcabadosCubierta(presupuesto, locale));
@ -273,7 +275,8 @@ public class PresupuestoController {
}
}
Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto),
locale);
resultado.put("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo"));
@ -309,10 +312,11 @@ public class PresupuestoController {
presupuesto.setGramajeInterior(Integer.parseInt(opciones.get(0))); // Asignar primera opción
}
}
Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto),
locale);
resultado.put("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo"));
return ResponseEntity.ok(resultado);
}
@ -335,10 +339,11 @@ public class PresupuestoController {
}
Map<String, Object> resultado = new HashMap<>();
Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto),
locale);
resultado.put("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo"));
return ResponseEntity.ok(resultado);
}
@ -650,8 +655,7 @@ public class PresupuestoController {
"presupuesto.reimprimir.success.title",
"presupuesto.reimprimir.success.text",
"presupuesto.reimprimir.error.title",
"presupuesto.reimprimir.error.internal"
);
"presupuesto.reimprimir.error.internal");
Map<String, String> translations = translationService.getTranslations(locale, keys);
model.addAttribute("languageBundle", translations);
@ -676,7 +680,7 @@ public class PresupuestoController {
"presupuesto.add.error.save.title",
"presupuesto.iva-reducido",
"presupuesto.iva-reducido-descripcion",
"presupuesto.duplicar.title",
"presupuesto.duplicar.title",
"presupuesto.duplicar.text",
"presupuesto.duplicar.confirm",
"presupuesto.duplicar.cancelar",
@ -908,6 +912,14 @@ public class PresupuestoController {
return ResponseEntity.badRequest().body(errores);
}
try {
Map<String, Object> lomos = presupuestoService.obtenerLomos(presupuesto);
presupuesto.setLomo(Double.valueOf(lomos.get("lomoInterior").toString()));
presupuesto.setLomoCubierta(Double.valueOf(lomos.get("lomoCubierta").toString()));
} catch (Exception ex) {
log.error("Error al obtener lomos desde SK API", ex);
}
try {
Map<String, Object> saveResult = presupuestoService.guardarPresupuesto(
@ -933,6 +945,30 @@ public class PresupuestoController {
}
}
@GetMapping("/api/plantilla-cubierta.png")
public ResponseEntity<byte[]> getPlantillaCubierta(
@RequestParam("tipo") String tipoLibro,
@RequestParam("tapa") String tapa,
@RequestParam("ancho") Integer ancho,
@RequestParam("alto") Integer alto,
@RequestParam("lomo") Integer lomo,
@RequestParam("solapas") Integer solapas,
Locale locale) {
Presupuesto.TipoEncuadernacion tipoEncuadernacion = Presupuesto.TipoEncuadernacion.valueOf(tipoLibro);
Presupuesto.TipoCubierta tipoCubierta = Presupuesto.TipoCubierta.valueOf(tapa);
byte[] png = presupuestoService.obtenerPlantillaCubierta(tipoEncuadernacion, tipoCubierta, ancho, alto, lomo,
solapas, locale);
if (png == null)
return ResponseEntity.notFound().build();
return ResponseEntity.ok()
.cacheControl(CacheControl.noCache())
.contentType(MediaType.IMAGE_PNG)
.body(png);
}
@PostMapping("/{id}/comentario")
@ResponseBody
public String actualizarComentario(@PathVariable Long id,
@ -944,18 +980,17 @@ public class PresupuestoController {
@PostMapping("/api/duplicar/{id}")
@ResponseBody
public Map<String, Object> duplicarPresupuesto(
@PathVariable Long id,
@RequestParam(name = "titulo", defaultValue = "") String titulo) {
@PathVariable Long id,
@RequestParam(name = "titulo", defaultValue = "") String titulo) {
Long entity = presupuestoService.duplicarPresupuesto(id, titulo);
return Map.of("id", entity);
}
@PostMapping("/api/reimprimir/{id}")
@ResponseBody
public Map<String, Object> reimprimirPresupuesto(@PathVariable Long id) {
Long entity = presupuestoService.reimprimirPresupuesto(id);
return Map.of("id", entity);
}

View File

@ -126,6 +126,13 @@ public class PresupuestoFormatter {
},
locale);
}
textoResumen += ms.getMessage(
"presupuesto.resumen-lomos",
new Object[] {
p.getLomo() != null ? Math.round(p.getLomo()) : "N/D",
p.getLomoCubierta() != null ? Math.round(p.getLomoCubierta()) : "N/D"
},
locale);
textoResumen += ms.getMessage("presupuesto.resumen-texto-end", null, locale);
return textoResumen;

View File

@ -281,6 +281,12 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
@Column(name = "papel_interior_id")
private Integer papelInteriorId;
@Column(name = "lomo")
private Double lomo;
@Column(name = "lomo_cubierta")
private Double lomoCubierta;
@NotNull(message = "{presupuesto.errores.gramaje-interior}", groups = PresupuestoValidationGroups.Interior.class)
@Column(name = "gramaje_interior")
private Integer gramajeInterior;
@ -720,6 +726,22 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
this.papelInteriorId = papelInteriorId;
}
public Double getLomo() {
return lomo;
}
public void setLomo(Double lomo) {
this.lomo = lomo;
}
public Double getLomoCubierta() {
return lomoCubierta;
}
public void setLomoCubierta(Double lomoCubierta) {
this.lomoCubierta = lomoCubierta;
}
public Integer getGramajeInterior() {
return gramajeInterior;
}

View File

@ -1,9 +1,7 @@
package com.imprimelibros.erp.presupuesto.service;
package com.imprimelibros.erp.presupuesto.dto;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import org.springframework.stereotype.Service;
@ -20,6 +18,8 @@ public class PresupuestoFormDataMapper {
public Cubierta cubierta = new Cubierta();
public Servicios servicios = new Servicios();
public Integer selectedTirada;
public Double lomo;
public Double lomoCubierta;
// ===== Datos Generales =====
public static class DatosGenerales {
@ -194,6 +194,10 @@ public class PresupuestoFormDataMapper {
// ===== Selected tirada
vm.selectedTirada = p.getSelectedTirada();
// ===== Lomos
vm.lomo = p.getLomo();
vm.lomoCubierta = p.getLomoCubierta();
// ===== Servicios desde JSONs
vm.servicios.servicios = parse(p.getServiciosJson(),
new TypeReference<List<PresupuestoFormDataDto.Servicios.DatosServicios>>() {

View File

@ -6,6 +6,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.Locale;
@ -42,6 +44,15 @@ import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatricesReposito
import com.imprimelibros.erp.presupuesto.marcapaginas.MarcapaginasRepository;
import com.imprimelibros.erp.users.UserDao;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.springframework.core.io.ClassPathResource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import jakarta.servlet.http.HttpServletRequest;
import com.imprimelibros.erp.externalApi.skApiClient;
@ -1297,6 +1308,76 @@ public class PresupuestoService {
}
public Map<String, Object> obtenerLomos(Presupuesto presupuesto) {
try {
Map<String, Object> response = apiClient.getLomos(this.toSkApiRequest(presupuesto));
return response;
} catch (Exception e) {
System.out.println("Error obteniendo lomos: " + e.getMessage());
return Map.of();
}
}
public byte[] obtenerPlantillaCubierta(
Presupuesto.TipoEncuadernacion tipoLibro,
Presupuesto.TipoCubierta tapa,
Integer ancho,
Integer alto,
Integer lomo,
Integer solapas,
Locale locale) {
try {
String plantillaName = "plantilla";
if (tipoLibro == Presupuesto.TipoEncuadernacion.grapado) {
plantillaName += "-grapado";
}
if (solapas > 0) {
plantillaName += "-solapas";
}
plantillaName += ".svg";
Integer sangrado = 5; // mm,
if (tapa != Presupuesto.TipoCubierta.tapaBlanda && tipoLibro != Presupuesto.TipoEncuadernacion.grapado) {
sangrado = 20;
}
Integer ancho_t = lomo + sangrado * 2 + ancho * 2 + solapas * 2;
Integer alto_t = alto + sangrado * 2;
// 3) Leer SVG template como texto
String basePath = "static/assets/images/imprimelibros/presupuestador/templates-cubierta/";
String svg = readClasspathText(basePath + plantillaName);
// 4) Sustituciones {{...}}
Map<String, String> vars = new HashMap<>();
NumberFormat nf = NumberFormat.getIntegerInstance(locale);
vars.put("ancho", nf.format(ancho)); // mm o lo que representes
vars.put("alto", nf.format(alto));
vars.put("ancho_t", nf.format(ancho_t));
vars.put("alto_t", nf.format(alto_t));
vars.put("lomo_t", nf.format(lomo != null ? lomo : 0));
vars.put("solapa_t", nf.format(solapas != null ? solapas : 0));
vars.put("sangrado", nf.format(sangrado));
vars.put("portada", messageSource.getMessage("presupuesto.plantilla-cubierta.portada", null, locale));
vars.put("contraportada",
messageSource.getMessage("presupuesto.plantilla-cubierta.contraportada", null, locale));
vars.put("lomo", messageSource.getMessage("presupuesto.plantilla-cubierta.lomo", null, locale));
vars.put("solapa", messageSource.getMessage("presupuesto.plantilla-cubierta.solapa", null, locale));
svg = replaceMustache(svg, vars);
// 5) Render SVG -> PNG (Batik)
svg = sanitizeForBatik(svg);
return svgToPng(svg, /* dpi */ 300f);
} catch (Exception e) {
System.err.println("Error obteniendo plantilla de cubierta: " + e.getMessage());
return null;
}
}
/**
* PRIVADO (futuro botón "Guardar"): persiste el presupuesto como borrador.
*/
@ -1540,4 +1621,77 @@ public class PresupuestoService {
return ip;
}
private static String readClasspathText(String path) throws IOException {
ClassPathResource res = new ClassPathResource(path);
try (InputStream in = res.getInputStream()) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
}
private static String replaceMustache(String svg, Map<String, String> vars) {
String out = svg;
for (var entry : vars.entrySet()) {
out = out.replace("{{" + entry.getKey() + "}}", entry.getValue());
}
return out;
}
private static byte[] svgToPng(String svgXml, float dpi) throws Exception {
PNGTranscoder t = new PNGTranscoder();
// Esto SÍ es correcto (convierte unidades a mm según DPI)
t.addTranscodingHint(PNGTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, 25.4f / dpi);
// ❌ NO uses KEY_AOI con null (provoca tu error)
// t.addTranscodingHint(PNGTranscoder.KEY_AOI, null);
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
TranscoderInput input = new TranscoderInput(new StringReader(svgXml));
TranscoderOutput output = new TranscoderOutput(out);
t.transcode(input, output);
return out.toByteArray();
}
}
private static String sanitizeForBatik(String svg) {
String out = svg;
// 1) Batik: context-stroke/context-fill
out = out.replace("context-stroke", "#000");
out = out.replace("context-fill", "none");
// 2) Batik: auto-start-reverse
out = out.replace("auto-start-reverse", "auto");
// 3) Reemplazar markers Triangle*/marker6* -> Arrow2S*
out = replaceMarkerAttr(out, "marker-start", "Arrow2Sstart");
out = replaceMarkerAttr(out, "marker-end", "Arrow2Send");
// 4) Lo MISMO pero cuando viene dentro de style="...marker-start:url(#X);..."
out = replaceMarkerInStyle(out, "marker-start", "Arrow2Sstart");
out = replaceMarkerInStyle(out, "marker-end", "Arrow2Send");
return out;
}
private static String replaceMarkerAttr(String svg, String attr, String newId) {
// Soporta: marker-start="url(#Triangle-5)" o marker-start='url( #Triangle-5 )'
Pattern p = Pattern.compile(
"(" + attr
+ "\\s*=\\s*)([\"'])\\s*url\\(\\s*#(Triangle[^\\s\\)\"']*|marker6[^\\s\\)\"']*)\\s*\\)\\s*\\2",
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(svg);
return m.replaceAll("$1$2url(#" + newId + ")$2");
}
private static String replaceMarkerInStyle(String svg, String prop, String newId) {
// Soporta dentro de style: marker-start:url(#Triangle-5) (con espacios
// opcionales)
Pattern p = Pattern.compile(
"(" + prop + "\\s*:\\s*)url\\(\\s*#(Triangle[^\\s\\)\"';]*|marker6[^\\s\\)\"';]*)\\s*\\)",
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(svg);
return m.replaceAll("$1url(#" + newId + ")");
}
}

View File

@ -0,0 +1,18 @@
databaseChangeLog:
- changeSet:
id: 0027-add-lomo-to-presupuesto
author: jjo
changes:
- addColumn:
tableName: presupuesto
columns:
- column:
name: lomo
type: DECIMAL(12, 2)
defaultValueNumeric: 0
afterColumn: papel_interior_id
rollback:
- dropColumn:
tableName: presupuesto
columnName: lomo

View File

@ -0,0 +1,18 @@
databaseChangeLog:
- changeSet:
id: 0028-add-lomo-cubierta-to-presupuesto
author: jjo
changes:
- addColumn:
tableName: presupuesto
columns:
- column:
name: lomo_cubierta
type: DECIMAL(12, 2)
defaultValueNumeric: 0
afterColumn: lomo
rollback:
- dropColumn:
tableName: presupuesto
columnName: lomo_cubierta

View File

@ -0,0 +1,43 @@
databaseChangeLog:
- changeSet:
id: 0029-update-estados-pedidos-lineas
author: jjo
changes:
- modifyDataType:
tableName: pedidos_lineas
columnName: estado
newDataType: >
enum(
'pendiente_pago',
'procesando_pago',
'denegado_pago',
'aprobado',
'procesando_pedido',
'maquetacion',
'haciendo_ferro_digital',
'esperando_aceptacion_ferro_digital',
'haciendo_ferro',
'esperando_aceptacion_ferro',
'produccion',
'terminado',
'enviado',
'cancelado'
)
rollback:
- modifyDataType:
tableName: pedidos_lineas
columnName: estado
newDataType: >
enum(
'pendiente_pago',
'procesando_pago',
'denegado_pago',
'aprobado',
'maquetacion',
'haciendo_ferro',
'esperando_aceptacion_ferro',
'produccion',
'terminado',
'enviado',
'cancelado'
)

View File

@ -1,53 +1,59 @@
databaseChangeLog:
- include:
file: db/changelog/changesets/0001-baseline.yml
- include:
file: db/changelog/changesets/0002-create-pedidos.yml
- include:
file: db/changelog/changesets/0003-create-paises.yml
- include:
file: db/changelog/changesets/0004-create-direcciones.yml
- include:
file: db/changelog/changesets/0005-add-carts-onlyoneshipment.yml
- include:
file: db/changelog/changesets/0006-add-cart-direcciones.yml
- include:
file: db/changelog/changesets/0007-payments-core.yml
- include:
file: db/changelog/changesets/0008-update-cart-status-constraint.yml
- include:
file: db/changelog/changesets/0009-add-composite-unique-txid-type.yml
- include:
file: db/changelog/changesets/0010-drop-unique-tx-gateway.yml
- include:
file: db/changelog/changesets/0011-update-pedidos-presupuesto.yml
- include:
file: db/changelog/changesets/0012--drop-unique-gateway-txid-2.yml
- include:
file: db/changelog/changesets/0013-drop-unique-refund-gateway-id.yml
- include:
file: db/changelog/changesets/0014-create-pedidos-direcciones.yml
- include:
file: db/changelog/changesets/0015-alter-pedidos-lineas-and-presupuesto-estados.yml
- include:
file: db/changelog/changesets/0016-fix-enum-estado-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0017-add-fecha-entrega-to-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0018-change-presupuesto-ch-3.yml
- include:
file: db/changelog/changesets/0019-add-estados-pago-to-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0020-add-estados-pago-to-pedidos-lineas-2.yml
- include:
file: db/changelog/changesets/0021-add-email-and-is-palets-to-pedidos-direcciones.yml
- include:
file: db/changelog/changesets/0022-add-estados-pago-to-pedidos-lineas-3.yml
- include:
file: db/changelog/changesets/0023-facturacion.yml
- include:
file: db/changelog/changesets/0024-series-facturacion-seeder.yml
- include:
file: db/changelog/changesets/0025-create-facturas-direcciones.yml
- include:
file: db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml
databaseChangeLog:
- include:
file: db/changelog/changesets/0001-baseline.yml
- include:
file: db/changelog/changesets/0002-create-pedidos.yml
- include:
file: db/changelog/changesets/0003-create-paises.yml
- include:
file: db/changelog/changesets/0004-create-direcciones.yml
- include:
file: db/changelog/changesets/0005-add-carts-onlyoneshipment.yml
- include:
file: db/changelog/changesets/0006-add-cart-direcciones.yml
- include:
file: db/changelog/changesets/0007-payments-core.yml
- include:
file: db/changelog/changesets/0008-update-cart-status-constraint.yml
- include:
file: db/changelog/changesets/0009-add-composite-unique-txid-type.yml
- include:
file: db/changelog/changesets/0010-drop-unique-tx-gateway.yml
- include:
file: db/changelog/changesets/0011-update-pedidos-presupuesto.yml
- include:
file: db/changelog/changesets/0012--drop-unique-gateway-txid-2.yml
- include:
file: db/changelog/changesets/0013-drop-unique-refund-gateway-id.yml
- include:
file: db/changelog/changesets/0014-create-pedidos-direcciones.yml
- include:
file: db/changelog/changesets/0015-alter-pedidos-lineas-and-presupuesto-estados.yml
- include:
file: db/changelog/changesets/0016-fix-enum-estado-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0017-add-fecha-entrega-to-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0018-change-presupuesto-ch-3.yml
- include:
file: db/changelog/changesets/0019-add-estados-pago-to-pedidos-lineas.yml
- include:
file: db/changelog/changesets/0020-add-estados-pago-to-pedidos-lineas-2.yml
- include:
file: db/changelog/changesets/0021-add-email-and-is-palets-to-pedidos-direcciones.yml
- include:
file: db/changelog/changesets/0022-add-estados-pago-to-pedidos-lineas-3.yml
- include:
file: db/changelog/changesets/0023-facturacion.yml
- include:
file: db/changelog/changesets/0024-series-facturacion-seeder.yml
- include:
file: db/changelog/changesets/0025-create-facturas-direcciones.yml
- include:
file: db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml
- include:
file: db/changelog/changesets/0027-add-lomo-to-presupuesto.yml
- include:
file: db/changelog/changesets/0028-add-lomo-cubierta-to-presupuesto.yml
- include:
file: db/changelog/changesets/0029-update-estados-pedidos-lineas.yml

View File

@ -29,6 +29,8 @@ cart.shipping.tipo-envio=Tipo de envío:
cart.shipping.errors.units-error=Por favor, introduzca un número válido entre 1 y {max}.
cart.shipping.errors.noAddressSelected=Debe seleccionar una dirección de envío para el pedido.
cart.shipping.errors.fillAddressesItems=Debe seleccionar una dirección de envío para cada artículo de la cesta.
cart.shipping.errors.fillBillingAddressItems=Debe seleccionar una dirección de facturación para poder realizar el pago.
cart.resumen.title=Resumen de la cesta
cart.resumen.base=Base imponible

View File

@ -22,10 +22,12 @@ pedido.estado.pendiente_pago=Pendiente de pago
pedido.estado.procesando_pago=Procesando pago
pedido.estado.denegado_pago=Pago denegado
pedido.estado.aprobado=Aprobado
pedido.estado.procesando_pedido=Procesando pedido
pedido.estado.maquetacion=Maquetación
pedido.estado.haciendo_ferro=Haciendo ferro
pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ferro
pedido.estado.ferro_cliente=Esperando aprobación de ferro
pedido.estado.haciendo_ferro_digital=Haciendo ferro digital
pedido.estado.esperando_aceptacion_ferro_digital=Esperando aceptación de ferro digital
pedido.estado.haciendo_ferro=Haciendo ejemplar de prueba
pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ejemplar de prueba
pedido.estado.produccion=Producción
pedido.estado.terminado=Terminado
pedido.estado.enviado=Enviado

View File

@ -117,6 +117,10 @@ presupuesto.continuar-cubierta=Diseño cubierta
# Pestaña cubierta
presupuesto.plantilla-cubierta=Plantilla de cubierta
presupuesto.plantilla-cubierta-text=Recuerde que la cubierta es el conjunto formado por la portada, contraportada, lomo y solapas, en caso de que las lleve.<br/><br/><br/>Si tiene dudas de las medidas puede solicitarnos una plantilla cuando haga el pedido.
presupuesto.plantilla-cubierta.portada=Portada
presupuesto.plantilla-cubierta.contraportada=Contraportada
presupuesto.plantilla-cubierta.lomo=Lomo
presupuesto.plantilla-cubierta.solapa=Solapa
presupuesto.tipo-cubierta=Tipo de cubierta
presupuesto.tipo-cubierta-descripcion=Seleccione el tipo de cubierta y sus opciones
presupuesto.tapa-blanda=Tapa blanda
@ -234,6 +238,7 @@ presupuesto.resumen-texto-acabado-cubierta= <li>Acabado: {0}. </li>
presupuesto.resumen-texto-end=</ul>
presupuesto.resumen-texto-sobrecubierta=<li>Sobrecubierta impresa en {0} {1} gr. <ul><li>Acabado: {2}</li><li>Solapas: {3} mm.</li></ul></li>
presupuesto.resumen-texto-faja=<li>Faja impresa en {0} {1} gr. con un alto de {2} mm. <ul><li>Acabado: {3}</li><li>Solapas: {4} mm.</li></ul></li>
presupuesto.resumen-lomos=<li>Dimensiones de los lomos: <ul><li>Lomo interior: {0} mm</li><li>Lomo total: {1} mm</li></ul></li>
presupuesto.resumen-deposito-legal=Ejemplares para el Depósito Legal
presupuesto.volver-extras=Extras del libro
presupuesto.resumen.inicie-sesion=Inicie sesión para continuar

View File

@ -0,0 +1,674 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="189.90369mm"
height="122.48086mm"
viewBox="0 0 189.90369 122.48086"
version="1.1"
id="svg1"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="plantilla-grapado-solapas.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.4378367"
inkscape:cx="427.37815"
inkscape:cy="265.32915"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<rect
x="148.51912"
y="407.19812"
width="184.41943"
height="125.40522"
id="rect7" />
<rect
x="171.09036"
y="459.02292"
width="159.26704"
height="90.413605"
id="rect3" />
<marker
id="Arrow2Sstart"
inkscape:isstock="true"
inkscape:stockid="Arrow2Sstart"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SstartPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.3,0,0,0.3,-0.69,0)" />
</marker>
<marker
id="Arrow2Send"
inkscape:isstock="true"
inkscape:stockid="Arrow2Send"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SendPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4" />
</marker>
<marker
style="overflow:visible"
id="marker6-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-4"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-12" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-0" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1-7" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5-7"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4-7" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3-0" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7-6" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3-0-6" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8-0-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7-6-1" />
</marker>
</defs>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-14.044687,-5.7512817)">
<rect
style="opacity:1;fill:#dee3db;fill-opacity:1;stroke:#8292a8;stroke-width:0.624;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect2"
width="182.32635"
height="115.28469"
x="14.044687"
y="5.7512817" />
<g
id="g2"
transform="translate(2.2085342,-0.96640021)">
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.69881;stroke-dasharray:none;stroke-opacity:1"
id="rect1"
width="82.014671"
height="94.487244"
x="22.535099"
y="17.283327" />
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.66258;stroke-dasharray:none;stroke-opacity:1"
id="rect1-8"
width="78.523048"
height="94.523483"
x="104.56826"
y="17.359972" />
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1-7"
width="18.953001"
height="94.775017"
x="164.55183"
y="17.203754" />
<path
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.157;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 23.921577,124.62439 58.700742,-0.18401"
id="path4" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5);marker-end:url(#marker6-3);paint-order:normal"
d="m 107.44694,98.144427 54.56369,0.224688"
id="path5-3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3);marker-end:url(#marker6-3-9);paint-order:normal"
d="M 43.754233,98.310783 102.27388,98.02943"
id="path5-3-0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6);marker-end:url(#marker6-3-9-5);paint-order:normal"
d="M 114.29411,109.14665 113.88575,19.631562"
id="path5-3-0-9"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-4);marker-end:url(#marker6-3-9-0);paint-order:normal"
d="m 13.752058,124.20085 178.229792,0.0889"
id="path5-3-0-6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6-1);marker-end:url(#marker6-3-9-5-7);paint-order:normal"
d="M 196.99745,120.60716 196.58909,9.1942972"
id="path5-3-0-9-3"
sodipodi:nodetypes="cc" />
</g>
<g
id="g4"
transform="matrix(1.2478873,0,0,1.2478873,-26.713293,-112.63102)">
<text
xml:space="preserve"
id="text3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(4.9613536,4.4099808)"><tspan
x="57.642538"
y="136.9912"
id="tspan6"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan5">{{contraportada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2"
transform="matrix(1.2478873,0,0,1.2478873,41.181684,-112.61247)">
<text
xml:space="preserve"
id="text3-7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.1290346,4.4099808)"><tspan
x="64.690151"
y="136.9912"
id="tspan9"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan8">{{portada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2-9"
transform="matrix(0,-1.2478873,1.2478873,0,0.59255852,162.33513)">
<text
xml:space="preserve"
id="text3-7-3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-8);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.5239521,4.4099808)"><tspan
x="65.841054"
y="136.9912"
id="tspan11"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan10">{{solapa}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-8"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1-7-8"
width="18.953001"
height="94.775017"
x="24.558743"
y="16.180035" />
<g
id="g4-2-9-0"
transform="matrix(0,-1.2478873,1.2478873,0,-141.60976,162.27774)">
<text
xml:space="preserve"
id="text3-7-3-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-8-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.5239521,4.4099808)"><tspan
x="65.841054"
y="136.9912"
id="tspan13"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan12">{{solapa}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-8-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="-65.329605"
y="113.37225"
id="text13-8-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan13-2-3"
style="stroke-width:0"
x="-65.32299"
y="113.37225">{{alto}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="137.0002"
y="101.62363"
id="text13-3"><tspan
sodipodi:role="line"
id="tspan13-6"
style="stroke-width:0"
x="137.00682"
y="101.62363">{{ancho}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="75.285461"
y="101.62363"
id="text13-3-1"><tspan
sodipodi:role="line"
id="tspan13-6-4"
style="stroke-width:0"
x="75.292076"
y="101.62363">{{ancho}} mm</tspan></text>
<g
id="g4-7-0"
transform="matrix(1.2478873,0,0,1.2478873,-134.4255,19.484879)" />
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.07859"
y="126.83306"
id="text7"><tspan
sodipodi:role="line"
id="tspan7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.08521"
y="126.83306">{{ancho_t}} mm</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1-9);marker-end:url(#marker6-3-8-0);paint-order:normal"
d="m 169.57878,97.434632 13.02331,0.06153"
id="path5-3-7-8"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="176.14073"
y="101.38786"
id="text7-7-3"><tspan
sodipodi:role="line"
id="tspan7-1-4"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="176.14735"
y="101.38786">{{solapa_t}} mm</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1-9-0);marker-end:url(#marker6-3-8-0-6);paint-order:normal"
d="m 27.840231,97.50449 13.023235,0.06153"
id="path5-3-7-8-9"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="34.403442"
y="101.45772"
id="text7-7-3-6"><tspan
sodipodi:role="line"
id="tspan7-1-4-3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="34.410057"
y="101.45772">{{solapa_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.871456"
y="202.53311"
id="text7-8"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="-63.864841"
y="202.53311">{{alto_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="11.526331"
id="text7-1"><tspan
sodipodi:role="line"
id="tspan7-6"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.14731"
y="11.526331">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="117.33289"
id="text7-1-1"><tspan
sodipodi:role="line"
id="tspan7-6-8"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.1473"
y="117.33289">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.443714"
y="20.223143"
id="text7-1-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.437099"
y="20.223143">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.462257"
y="192.31326"
id="text7-1-5-3"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.455643"
y="192.31326">{{sangrado}} mm</tspan></text>
<path
style="fill:#ff0000;stroke:#8292a8;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
d="m 106.42015,36.849792 v 6.808552"
id="path7" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.865;stroke-dasharray:none;stroke-opacity:1"
d="m 106.97219,35.561688 v 7.728625"
id="path8" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.865;stroke-dasharray:none;stroke-opacity:1"
d="m 106.81658,77.188818 v 7.728625"
id="path8-9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,502 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="189.90369mm"
height="122.48086mm"
viewBox="0 0 189.90369 122.48086"
version="1.1"
id="svg1"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="plantilla-grapado.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.4378367"
inkscape:cx="427.37815"
inkscape:cy="265.32915"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g2" />
<defs
id="defs1">
<rect
x="148.51912"
y="407.19812"
width="184.41943"
height="125.40522"
id="rect7" />
<rect
x="171.09036"
y="459.02292"
width="159.26704"
height="90.413605"
id="rect3" />
<marker
id="Arrow2Sstart"
inkscape:isstock="true"
inkscape:stockid="Arrow2Sstart"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SstartPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.3,0,0,0.3,-0.69,0)" />
</marker>
<marker
id="Arrow2Send"
inkscape:isstock="true"
inkscape:stockid="Arrow2Send"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SendPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4" />
</marker>
<marker
style="overflow:visible"
id="marker6-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-4"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-12" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-0" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1-7" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5-7"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4-7" />
</marker>
</defs>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-14.044687,-5.7512817)">
<rect
style="opacity:1;fill:#dee3db;fill-opacity:1;stroke:#8292a8;stroke-width:0.624;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect2"
width="182.32635"
height="115.28469"
x="14.044687"
y="5.7512817" />
<g
id="g2"
transform="translate(2.2085342,-0.96640021)">
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.69881;stroke-dasharray:none;stroke-opacity:1"
id="rect1"
width="82.014671"
height="94.487244"
x="22.535099"
y="17.283327" />
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.66258;stroke-dasharray:none;stroke-opacity:1"
id="rect1-8"
width="78.523048"
height="94.523483"
x="104.56826"
y="17.359972" />
<path
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.157;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 23.921577,124.62439 58.700742,-0.18401"
id="path4" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5);marker-end:url(#marker6-3);paint-order:normal"
d="m 107.44694,98.144427 72.96518,0.224688"
id="path5-3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3);marker-end:url(#marker6-3-9);paint-order:normal"
d="M 24.800702,97.758738 102.27388,98.02943"
id="path5-3-0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6);marker-end:url(#marker6-3-9-5);paint-order:normal"
d="M 114.29411,109.14665 113.88575,19.631562"
id="path5-3-0-9"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-4);marker-end:url(#marker6-3-9-0);paint-order:normal"
d="m 13.752058,124.20085 178.229792,0.0889"
id="path5-3-0-6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6-1);marker-end:url(#marker6-3-9-5-7);paint-order:normal"
d="M 196.99745,120.60716 196.58909,9.1942972"
id="path5-3-0-9-3"
sodipodi:nodetypes="cc" />
</g>
<g
id="g4"
transform="matrix(1.2478873,0,0,1.2478873,-26.713293,-112.63102)">
<text
xml:space="preserve"
id="text3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(-2.6328943,4.4099808)"><tspan
x="57.642538"
y="136.9912"
id="tspan6"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan5">{{contraportada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2"
transform="matrix(1.2478873,0,0,1.2478873,50.382429,-112.61247)">
<text
xml:space="preserve"
id="text3-7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.1290346,4.4099808)"><tspan
x="64.690151"
y="136.9912"
id="tspan9"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan8">{{portada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="-65.329605"
y="113.37225"
id="text13-8-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan13-2-3"
style="stroke-width:0"
x="-65.32299"
y="113.37225">{{alto}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="146.20094"
y="101.62363"
id="text13-3"><tspan
sodipodi:role="line"
id="tspan13-6"
style="stroke-width:0"
x="146.20757"
y="101.62363">{{ancho}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="65.808701"
y="101.62363"
id="text13-3-1"><tspan
sodipodi:role="line"
id="tspan13-6-4"
style="stroke-width:0"
x="65.815315"
y="101.62363">{{ancho}} mm</tspan></text>
<g
id="g4-7-0"
transform="matrix(1.2478873,0,0,1.2478873,-134.4255,19.484879)" />
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.07859"
y="126.83306"
id="text7"><tspan
sodipodi:role="line"
id="tspan7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.08521"
y="126.83306">{{ancho_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.871456"
y="202.53311"
id="text7-8"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="-63.864841"
y="202.53311">{{alto_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="11.526331"
id="text7-1"><tspan
sodipodi:role="line"
id="tspan7-6"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.14731"
y="11.526331">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="117.33289"
id="text7-1-1"><tspan
sodipodi:role="line"
id="tspan7-6-8"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.1473"
y="117.33289">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.443714"
y="20.223143"
id="text7-1-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.437099"
y="20.223143">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.462257"
y="192.31326"
id="text7-1-5-3"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.455643"
y="192.31326">{{sangrado}} mm</tspan></text>
<path
style="fill:#ff0000;stroke:#8292a8;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
d="m 106.42015,36.849792 v 6.808552"
id="path7" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.865;stroke-dasharray:none;stroke-opacity:1"
d="m 106.97219,35.561688 v 7.728625"
id="path8" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.865;stroke-dasharray:none;stroke-opacity:1"
d="m 106.81658,77.188818 v 7.728625"
id="path8-9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,748 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="189.90369mm"
height="122.48086mm"
viewBox="0 0 189.90369 122.48086"
version="1.1"
id="svg1"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="plantilla-solapas.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.0167041"
inkscape:cx="370.31423"
inkscape:cy="136.22449"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<rect
x="148.51912"
y="407.19812"
width="184.41943"
height="125.40522"
id="rect7" />
<rect
x="171.09036"
y="459.02292"
width="159.26704"
height="90.413605"
id="rect3" />
<marker
id="Arrow2Sstart"
inkscape:isstock="true"
inkscape:stockid="Arrow2Sstart"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SstartPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.3,0,0,0.3,-0.69,0)" />
</marker>
<marker
id="Arrow2Send"
inkscape:isstock="true"
inkscape:stockid="Arrow2Send"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SendPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4" />
</marker>
<marker
style="overflow:visible"
id="marker6-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-4"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-12" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-0" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1-7" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5-7"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4-7" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3-0" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7-6" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3-0-6" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8-0-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7-6-1" />
</marker>
</defs>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-14.044687,-5.7512817)">
<rect
style="opacity:1;fill:#dee3db;fill-opacity:1;stroke:#8292a8;stroke-width:0.624;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect2"
width="182.32635"
height="115.28469"
x="14.044687"
y="5.7512817" />
<g
id="g2"
transform="translate(2.2085342,-0.96640021)">
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.57858;stroke-dasharray:none;stroke-opacity:1"
id="rect1"
width="70.725983"
height="94.607483"
x="22.474981"
y="17.039194" />
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.57858;stroke-dasharray:none;stroke-opacity:1"
id="rect1-8"
width="70.725983"
height="94.607483"
x="112.79771"
y="17.057735" />
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1"
width="18.953001"
height="94.775017"
x="93.596756"
y="16.97538" />
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1-7"
width="18.953001"
height="94.775017"
x="164.55183"
y="17.019739" />
<path
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.157;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 23.921577,124.62439 58.700742,-0.18401"
id="path4" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5);marker-end:url(#marker6-3);paint-order:normal"
d="m 115.91162,98.144427 46.09901,0.224688"
id="path5-3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3);marker-end:url(#marker6-3-9);paint-order:normal"
d="M 43.754233,98.310783 90.128901,98.02943"
id="path5-3-0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6);marker-end:url(#marker6-3-9-5);paint-order:normal"
d="M 123.29,109.14665 122.88164,19.631562"
id="path5-3-0-9"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1);marker-end:url(#marker6-3-8);paint-order:normal"
d="m 96.545605,29.398843 13.023315,0.06153"
id="path5-3-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-4);marker-end:url(#marker6-3-9-0);paint-order:normal"
d="m 13.752058,124.20085 178.229792,0.0889"
id="path5-3-0-6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6-1);marker-end:url(#marker6-3-9-5-7);paint-order:normal"
d="M 196.99745,120.60716 196.58909,9.1942972"
id="path5-3-0-9-3"
sodipodi:nodetypes="cc" />
</g>
<g
id="g4"
transform="matrix(1.2478873,0,0,1.2478873,-26.713293,-112.63102)">
<text
xml:space="preserve"
id="text3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(0.00878441,4.4099808)"><tspan
x="57.642538"
y="136.9912"
id="tspan9"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan8">{{contraportada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2"
transform="matrix(1.2478873,0,0,1.2478873,45.088586,-112.61247)">
<text
xml:space="preserve"
id="text3-7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.1290346,4.4099808)"><tspan
x="64.690151"
y="136.9912"
id="tspan11"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan10">{{portada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2-9"
transform="matrix(0,-1.2478873,1.2478873,0,0.59255852,162.33513)">
<text
xml:space="preserve"
id="text3-7-3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-8);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.5239521,4.4099808)"><tspan
x="65.841054"
y="136.9912"
id="tspan13"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan12">{{solapa}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-8"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1-7-8"
width="18.953001"
height="94.775017"
x="24.558743"
y="15.99602" />
<g
id="g4-2-9-0"
transform="matrix(0,-1.2478873,1.2478873,0,-141.60976,162.27774)">
<text
xml:space="preserve"
id="text3-7-3-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-8-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.5239521,4.4099808)"><tspan
x="65.841054"
y="136.9912"
id="tspan15"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan14">{{solapa}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-8-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2-1"
transform="matrix(0,-1.2478873,1.2478873,0,-70.725767,159.15213)">
<text
xml:space="preserve"
id="text3-7-8"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-2);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(0.00878441,4.4099808)"><tspan
x="67.641254"
y="136.9912"
id="tspan17"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan16">{{lomo}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-2"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="-65.329605"
y="122.36808"
id="text13-8-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan13-2-3"
style="stroke-width:0"
x="-65.32299"
y="122.36808">{{alto}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="141.23253"
y="101.62363"
id="text13-3"><tspan
sodipodi:role="line"
id="tspan13-6"
style="stroke-width:0"
x="141.23915"
y="101.62363">{{ancho}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="69.212975"
y="101.62363"
id="text13-3-1"><tspan
sodipodi:role="line"
id="tspan13-6-4"
style="stroke-width:0"
x="69.219589"
y="101.62363">{{ancho}} mm</tspan></text>
<g
id="g4-7-0"
transform="matrix(1.2478873,0,0,1.2478873,-134.4255,19.484879)" />
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.07859"
y="126.83306"
id="text7"><tspan
sodipodi:role="line"
id="tspan7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.08521"
y="126.83306">{{ancho_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.31609"
y="26.035662"
id="text7-7"><tspan
sodipodi:role="line"
id="tspan7-1"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.32271"
y="26.035662">{{lomo_t}} mm</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1-9);marker-end:url(#marker6-3-8-0);paint-order:normal"
d="m 169.57878,97.434632 13.02331,0.06153"
id="path5-3-7-8"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="176.14073"
y="101.38786"
id="text7-7-3"><tspan
sodipodi:role="line"
id="tspan7-1-4"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="176.14735"
y="101.38786">{{solapa_t}} mm</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1-9-0);marker-end:url(#marker6-3-8-0-6);paint-order:normal"
d="m 27.840231,97.50449 13.023235,0.06153"
id="path5-3-7-8-9"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="34.403442"
y="101.45772"
id="text7-7-3-6"><tspan
sodipodi:role="line"
id="tspan7-1-4-3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="34.410057"
y="101.45772">{{solapa_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.871456"
y="202.53311"
id="text7-8"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="-63.864841"
y="202.53311">{{alto_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="11.526331"
id="text7-1"><tspan
sodipodi:role="line"
id="tspan7-6"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.14731"
y="11.526331">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="117.33289"
id="text7-1-1"><tspan
sodipodi:role="line"
id="tspan7-6-8"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.1473"
y="117.33289">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.443714"
y="20.223143"
id="text7-1-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.437099"
y="20.223143">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.462257"
y="192.31326"
id="text7-1-5-3"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.455643"
y="192.31326">{{sangrado}} mm</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -0,0 +1,576 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="189.90369mm"
height="122.48086mm"
viewBox="0 0 189.90369 122.48086"
version="1.1"
id="svg1"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
sodipodi:docname="plantilla.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.4378367"
inkscape:cx="311.23144"
inkscape:cy="214.55844"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<rect
x="148.51912"
y="407.19812"
width="184.41943"
height="125.40522"
id="rect7" />
<rect
x="171.09036"
y="459.02292"
width="159.26704"
height="90.413605"
id="rect3" />
<marker
id="Arrow2Sstart"
inkscape:isstock="true"
inkscape:stockid="Arrow2Sstart"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SstartPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.3,0,0,0.3,-0.69,0)" />
</marker>
<marker
id="Arrow2Send"
inkscape:isstock="true"
inkscape:stockid="Arrow2Send"
orient="auto"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.72,4.03 -2.21,0.02 8.72,-4 c -1.75,2.37 -1.74,5.62 0,8.03 z"
id="Arrow2SendPath"
style="fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4" />
</marker>
<marker
style="overflow:visible"
id="marker6-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-3" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-8"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-7" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-4"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-12" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-0"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-0" />
</marker>
<marker
style="overflow:visible"
id="Triangle-5-3-6-1"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135-4-1-1-7" />
</marker>
<marker
style="overflow:visible"
id="marker6-3-9-5-7"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Triangle arrow"
markerWidth="0.5"
markerHeight="0.5"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid"
markerUnits="userSpaceOnUse">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path6-1-8-4-7" />
</marker>
</defs>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-14.044687,-5.7512817)">
<rect
style="opacity:1;fill:#dee3db;fill-opacity:1;stroke:#8292a8;stroke-width:0.624;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect2"
width="182.32635"
height="115.28469"
x="14.044687"
y="5.7512817" />
<g
id="g2"
transform="translate(2.2085342,-0.96640021)">
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.57858;stroke-dasharray:none;stroke-opacity:1"
id="rect1"
width="70.725983"
height="94.607483"
x="22.474981"
y="17.039194" />
<rect
style="opacity:1;fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.57858;stroke-dasharray:none;stroke-opacity:1"
id="rect1-8"
width="70.725983"
height="94.607483"
x="112.79771"
y="17.057735" />
<rect
style="fill:#c9d9d4;fill-opacity:1;stroke:#8292a8;stroke-width:1.4395;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect1-8-1"
width="18.953001"
height="94.775017"
x="93.596756"
y="16.97538" />
<path
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:1.157;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 23.921577,124.62439 58.700742,-0.18401"
id="path4" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5);marker-end:url(#marker6-3);paint-order:normal"
d="m 115.91162,98.144427 64.68451,-0.235349"
id="path5-3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3);marker-end:url(#marker6-3-9);paint-order:normal"
d="M 25.444754,98.264779 90.128901,98.02943"
id="path5-3-0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6);marker-end:url(#marker6-3-9-5);paint-order:normal"
d="M 123.29,109.14665 122.88164,19.631562"
id="path5-3-0-9"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-1);marker-end:url(#marker6-3-8);paint-order:normal"
d="m 96.545605,29.398843 13.023315,0.06153"
id="path5-3-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-4);marker-end:url(#marker6-3-9-0);paint-order:normal"
d="m 13.752058,124.20085 178.229792,0.0889"
id="path5-3-0-6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.820919;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:1.64183, 0.820919;stroke-dashoffset:0.328368;stroke-opacity:1;marker-start:url(#Triangle-5-3-6-1);marker-end:url(#marker6-3-9-5-7);paint-order:normal"
d="M 196.99745,120.60716 196.58909,9.1942972"
id="path5-3-0-9-3"
sodipodi:nodetypes="cc" />
</g>
<g
id="g4"
transform="matrix(1.2478873,0,0,1.2478873,-35.709132,-112.63102)">
<text
xml:space="preserve"
id="text3"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(0.00878441,4.4099808)"><tspan
x="57.642538"
y="136.9912"
id="tspan9"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan8">{{contraportada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2"
transform="matrix(1.2478873,0,0,1.2478873,54.613592,-112.61247)">
<text
xml:space="preserve"
id="text3-7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(2.1290346,4.4099808)"><tspan
x="64.690151"
y="136.9912"
id="tspan11"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan10">{{portada}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<g
id="g4-2-1"
transform="matrix(0,-1.2478873,1.2478873,0,-70.725767,159.15213)">
<text
xml:space="preserve"
id="text3-7-8"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.58611px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Bold';font-variant-ligatures:no-common-ligatures discretionary-ligatures no-contextual;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;white-space:pre-wrap;shape-inside:url(#rect4-6-2);display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.37291;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
x="27.970261"
y="0"
transform="translate(0.00878441,4.4099808)"><tspan
x="67.641254"
y="136.9912"
id="tspan13"><tspan
style="font-variant-ligatures:normal;text-orientation:upright"
id="tspan12">{{lomo}}</tspan></tspan></text>
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:none;stroke-width:0.825551;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect4-6-2"
width="50.751522"
height="10.636283"
x="51.35844"
y="135.72629" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="-65.329605"
y="130.30556"
id="text13-8-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan13-2-3"
style="stroke-width:0"
x="-65.32299"
y="130.30556">{{alto}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="150.52528"
y="101.62363"
id="text13-3"><tspan
sodipodi:role="line"
id="tspan13-6"
style="stroke-width:0"
x="150.53191"
y="101.62363">{{ancho}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-orientation:upright;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:3.8;stroke-dasharray:none;stroke-dashoffset:0.994541;stroke-opacity:1;paint-order:normal"
x="60.058235"
y="101.62363"
id="text13-3-1"><tspan
sodipodi:role="line"
id="tspan13-6-4"
style="stroke-width:0"
x="60.06485"
y="101.62363">{{ancho}} mm</tspan></text>
<g
id="g4-7-0"
transform="matrix(1.2478873,0,0,1.2478873,-134.4255,19.484879)" />
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.07859"
y="126.83306"
id="text7"><tspan
sodipodi:role="line"
id="tspan7"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.08521"
y="126.83306">{{ancho_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:2.82222px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.31609"
y="26.035662"
id="text7-7"><tspan
sodipodi:role="line"
id="tspan7-1"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.82222px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="105.32271"
y="26.035662">{{lomo_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52778px;text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.871456"
y="202.53311"
id="text7-8"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-2"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52778px;font-family:Arial, boldl;-inkscape-font-specification:'Arial, boldl Bold';stroke-width:0.264583"
x="-63.864841"
y="202.53311">{{alto_t}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="11.526331"
id="text7-1"><tspan
sodipodi:role="line"
id="tspan7-6"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.1473"
y="11.526331">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="105.14069"
y="117.33289"
id="text7-1-1"><tspan
sodipodi:role="line"
id="tspan7-6-8"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="105.1473"
y="117.33289">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.443714"
y="20.223143"
id="text7-1-5"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.437099"
y="20.223143">{{sangrado}} mm</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';text-align:center;letter-spacing:0.0132292px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="-63.462257"
y="192.31326"
id="text7-1-5-3"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan7-6-4-4"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.52778px;font-family:Arial;-inkscape-font-specification:'Arial Italic Condensed';stroke-width:0.264583"
x="-63.455643"
y="192.31326">{{sangrado}} mm</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -151,13 +151,14 @@ $(() => {
if (direccionId) {
$.ajax({
url: `/checkout/get-summary/${direccionId}`,
url: `/checkout/get-summary/${direccionId}/${$('input[name="method"]').val()}`,
type: 'GET',
success: function (response) {
const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove();
parent.append(response);
$('#dirFactId').val(direccionId);
$('#dirFactWarning').addClass('d-none');
},
error: function () {
console.error('Error al actualizar el resumen del carrito.');
@ -187,6 +188,7 @@ $(() => {
success: function (response) {
const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove();
$('#dirFactWarning').removeClass('d-none');
parent.append(response);
},
error: function () {

View File

@ -107,6 +107,8 @@ export default class PresupuestoWizard {
}
},
selectedTirada: 10,
lomo: 0,
lomoCubierta: 0
}
// pestaña datos generales
@ -443,7 +445,9 @@ export default class PresupuestoWizard {
...this.#getDatosGeneralesData(),
...this.#getInteriorData(),
...this.#getCubiertaData(),
selectedTirada: this.formData.selectedTirada
selectedTirada: this.formData.selectedTirada,
lomo: this.formData.lomo,
lomoCubierta: this.formData.lomoCubierta
};
const sobrecubierta = data.sobrecubierta;
@ -714,17 +718,14 @@ export default class PresupuestoWizard {
.prop('checked', true);
this.#updateTipoEncuadernacion();
this.formatoPersonalizado.trigger('change');
$('.paginas').trigger('change');
if (this.formatoPersonalizado.is(':checked')) {
this.ancho.val(this.formData.datosGenerales.ancho);
this.alto.val(this.formData.datosGenerales.alto);
} else {
const option = this.formato.find('option').filter(() => {
return $(this).data('ancho') == this.formData.datosGenerales.ancho &&
$(this).data('alto') == this.formData.datosGenerales.alto;
const option = this.formato.find('option').filter((index, element) => {
return $(element).data('ancho') == this.formData.datosGenerales.ancho &&
$(element).data('alto') == this.formData.datosGenerales.alto;
});
if (option.length) {
@ -732,6 +733,8 @@ export default class PresupuestoWizard {
}
}
this.formatoPersonalizado.trigger('change');
$('.paginas').trigger('change');
this.ivaReducido.prop('checked', this.formData.datosGenerales.ivaReducido);
}
@ -965,6 +968,7 @@ export default class PresupuestoWizard {
} else {
const maxSolapas = data.solapas ?? 120;
const lomo = data.lomo ?? 0;
$('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas);
@ -989,16 +993,16 @@ export default class PresupuestoWizard {
this.acabadoSobrecubierta.val(this.formData.cubierta.sobrecubierta.acabado);
this.fajaSobrecubierta.val(this.formData.cubierta.faja.acabado);
if(lomo < 10){
if (lomo < 10) {
this.formData.cubierta.cabezada = "NOCAB";
this.cabezada.val("NOCAB");
this.cabezada.prop("disabled", true);
if(this.formData.cubierta.tipoCubierta === 'tapaDuraLomoRedondo'){
this.formData.cubierta.tipoCubierta = 'tapaDura';
if (this.formData.cubierta.tipoCubierta === 'tapaDuraLomoRedondo') {
this.formData.cubierta.tipoCubierta = 'tapaDura';
}
$("#tapaDuraLomoRedondo").addClass("d-none");
}
else{
else {
this.cabezada.prop("disabled", false);
$("#tapaDuraLomoRedondo").removeClass("d-none");
}
@ -1018,6 +1022,7 @@ export default class PresupuestoWizard {
const dataCubierta = this.#getCubiertaData();
this.#updateCubiertaData(dataCubierta);
this.formData.lomo = lomo;
this.#cacheFormData();
}
@ -1139,13 +1144,21 @@ export default class PresupuestoWizard {
#initCubierta() {
this.btn_plantilla_cubierta.on('click', () => {
let url = `/presupuesto/api/plantilla-cubierta.png
?tipo=${this.formData.datosGenerales.tipoEncuadernacion}
&tapa=${this.formData.cubierta.tipoCubierta}
&ancho=${this.formData.datosGenerales.ancho}
&alto=${this.formData.datosGenerales.alto}
&lomo=${Math.round(this.formData.lomo) || 0}
&solapas=${this.formData.cubierta.solapasCubierta == 1 ? this.formData.cubierta.tamanioSolapasCubierta : 0}`;
url = url.trim().replace(/\s+/g, '');
Swal.fire({
position: 'top-end',
icon: 'info',
title: window.languageBundle.get('presupuesto.plantilla-cubierta'),
html: `
<div class="text-center p-4">
<img src="/assets/images/imprimelibros/presupuestador/plantilla-cubierta.png" class="img-fluid" alt="" />
<img src="${url}" class="img-fluid" alt="" />
</div>
<div class="acitivity-timeline p-4">
${window.languageBundle.get('presupuesto.plantilla-cubierta-text')}
@ -1437,7 +1450,10 @@ export default class PresupuestoWizard {
#getCubiertaData() {
const tipoCubierta = $('.tapa-cubierta input:checked').val() || 'tapaBlanda';
const solapas = $('.solapas-cubierta input:checked').val() == 'sin-solapas' ? 0 : 1 || 0;
let solapas = 0;
if (tipoCubierta === 'tapaBlanda') {
solapas = $('.solapas-cubierta input:checked').val() == 'conSolapas' ? 1 : 0 || 0;
}
const tamanioSolapasCubierta = $('#tamanio-solapas-cubierta').val() || '80';
const cubiertaCaras = parseInt(this.carasImpresionCubierta.val()) || 2;
const papelGuardasId = parseInt($('#papel-guardas option:selected').data('papel-id')) || 3;
@ -1684,6 +1700,11 @@ export default class PresupuestoWizard {
this.divTiradas.append(item.renderCol(this.divTiradas));
}
if (data.lomo_cubierta) {
this.formData.lomoCubierta = data.lomo_cubierta;
this.#cacheFormData();
}
if (this.divTiradas.find('.tirada-card input[type="radio"]:checked').length === 0) {
this.divTiradas.find('.tirada-card input[type="radio"]').first().prop('checked', true).trigger('change');
this.formData.selectedTirada = this.divTiradas.find('.tirada-card input[type="radio"]').first().data('unidades') || data.tiradas[0];

View File

@ -0,0 +1,33 @@
$(() => {
$('#btn-plantilla-cubierta').on('click', () => {
let url = `/presupuesto/api/plantilla-cubierta.png
?tipo=${$('#tipoEncuadernacion').val()}
&tapa=${$('#tipoCubierta').val()}
&ancho=${$('#ancho').val()}
&alto=${$('#alto').val()}
&lomo=${Math.round($('#lomo').val()) || 0}
&solapas=${$('#solapasCubierta').val() == 1 ? $('#tamanioSolapasCubierta').val() : 0}`;
url = url.trim().replace(/\s+/g, '');
Swal.fire({
position: 'top-end',
icon: 'info',
title: window.languageBundle.get('presupuesto.plantilla-cubierta'),
html: `
<div class="text-center p-4">
<img src="${url}" class="img-fluid" alt="" />
</div>
<div class="acitivity-timeline p-4">
${window.languageBundle.get('presupuesto.plantilla-cubierta-text')}
</div>
`,
confirmButtonClass: 'btn btn-primary w-xs mt-2',
showConfirmButton: false,
showCloseButton: true,
buttonsStyling: false,
customClass: {
confirmButton: 'btn btn-secondary me-2', // clases para el botón confirmar
cancelButton: 'btn btn-light' // clases para cancelar
},
});
});
});

View File

@ -48,7 +48,7 @@
</div>
<form th:action="@{/pagos/redsys/crear}" method="post">
<input type="hidden" name="amountCents" th:value="${summary.amountCents}" />
<input type="hidden" name="method" value="card" />
<input type="hidden" name="method" th:value="${method} ?: 'card'" />
<input type="hidden" name="cartId" th:value="${summary.cartId}" />
<input type="hidden" id="dirFactId" name="dirFactId" value="" />
<button id="btn-checkout" type="submit" class="btn btn-secondary w-100 mt-2"

View File

@ -50,6 +50,9 @@
<div>
<h5 th:text="#{checkout.billing-address}" class="mb-3">Dirección de envío</h5>
<div id="dirFactWarning" class="alert alert-danger alert-shipment" role="alert"
th:text="#{cart.shipping.errors.fillBillingAddressItems}"></div>
<button type="button" class="btn btn-secondary mb-3" id="addBillingAddressBtn"
th:text="#{cart.shipping.add}">Añadir dirección
</button>

View File

@ -0,0 +1,61 @@
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{imprimelibros/layout}">
<head>
<th:block layout:fragment="pagetitle" />
<th:block th:replace="~{imprimelibros/partials/head-css :: head-css}" />
<th:block layout:fragment="pagecss">
<link th:href="@{/assets/libs/datatables/dataTables.bootstrap5.min.css}" rel="stylesheet" />
</th:block>
</head>
<body>
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}"
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
<th:block layout:fragment="content">
<!-- CONTENIDO -->
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="card shadow-sm">
<div class="card-body p-4 p-md-5 text-center">
<h1 class="display-4 mb-2" th:text="${status}">404</h1>
<h4 class="mb-3" th:text="${error}">Not Found</h4>
<p class="text-muted mb-4"
th:text="${message != null and !#strings.isEmpty(message)} ? ${message} : 'Ha ocurrido un error inesperado.'">
Ha ocurrido un error inesperado.
</p>
<div class="small text-muted mb-4">
<div><strong>Ruta:</strong> <span th:text="${path}">/logout</span></div>
<div><strong>Fecha:</strong> <span
th:text="${#temporals.format(timestamp, 'dd/MM/yyyy HH:mm:ss')}">--</span></div>
</div>
<div class="d-flex gap-2 justify-content-center">
<a class="btn btn-primary" th:href="@{/}">Volver al inicio</a>
<a class="btn btn-outline-secondary" href="javascript:history.back()">Atrás</a>
</div>
<!-- Opcional: bloque extra sólo para 404 -->
<div class="mt-4" th:if="${is404}">
<div class="alert alert-warning mb-0">
No se ha encontrado el recurso solicitado.
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /CONTENIDO -->
</div>
</body>
</html>

View File

@ -16,8 +16,19 @@
<div class="col-9 mx-auto mt-4">
<h5 id="resumen-titulo" class="text-center"></h5>
<h6 th:if="${presupuesto?.isReimpresion}" th:text="#{presupuesto.reimpresion}"
class="text-uppercase bg-danger text-white text-center">REIMPRESION</h6>
<h6 th:if="${presupuesto?.isReimpresion}" th:text="#{presupuesto.reimpresion}"
class="text-uppercase bg-danger text-white text-center">REIMPRESION</h6>
<div class="row justify-content-center mb-3">
<div class="col-auto">
<button type="button" id="btn-plantilla-cubierta" class="btn btn-outline-primary btn-border">
<i class="ri-questionnaire-line label-icon align-middle fs-16 me-2"></i>
<span th:text="#{presupuesto.plantilla-cubierta}">
Plantilla de cubierta
</span>
</button>
</div>
</div>
<table id="resumen-tabla-final" class="table table-borderless table-striped mt-3"
th:data-currency="#{app.currency}">
<thead>

View File

@ -44,18 +44,40 @@
<input type="hidden" id="presupuesto_id" th:value="${presupuesto.id}" />
<input type="hidden" id="ancho" th:value="${presupuesto.ancho}" />
<input type="hidden" id="alto" th:value="${presupuesto.alto}" />
<input type="hidden" id="lomo" th:value="${presupuesto.lomo}" />
<input type="hidden" id="tipoEncuadernacion" th:value="${presupuesto.tipoEncuadernacion}" />
<input type="hidden" id="tipoCubierta" th:value="${presupuesto.tipoCubierta}" />
<input type="hidden" id="solapasCubierta" th:value="${presupuesto.solapasCubierta}" />
<input type="hidden" id="tamanioSolapasCubierta" th:value="${presupuesto.tamanioSolapasCubierta}" />
<div class="row" id="card presupuesto-row animate-fadeInUpBounce">
<div class="card">
<div class="card-header">
<h4 id="titulo" class="card-title mb-0 text-uppercase" th:text="${resumen.titulo}">Resumen del
<h4 id="titulo" class="card-title mb-0 text-uppercase" th:text="${resumen.titulo}">
Resumen del
presupuesto</h4>
</div>
<div class="card-body">
<div th:if="${presupuesto.isReimpresion}" class="row">
<h6 th:text="#{presupuesto.reimpresion}" class="bg-danger py-2 text-center text-white text-uppercase">REIMPRESION</h6>
<h6 th:text="#{presupuesto.reimpresion}"
class="bg-danger py-2 text-center text-white text-uppercase">REIMPRESION</h6>
</div>
<div class="row justify-content-center mb-3">
<div class="col-auto">
<button type="button" id="btn-plantilla-cubierta"
class="btn btn-outline-primary btn-border">
<i class="ri-questionnaire-line label-icon align-middle fs-16 me-2"></i>
<span th:text="#{presupuesto.plantilla-cubierta}">
Plantilla de cubierta
</span>
</button>
</div>
</div>
<div class="card col-12 col-sm-9 mx-auto">
@ -207,7 +229,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
@ -234,6 +256,8 @@
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/resumen-view.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/duplicate-reprint.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/plantilla-cubierta.js}"></script>
</th:block>
</body>