Compare commits

..

8 Commits

Author SHA1 Message Date
efb3a5e833 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
2026-02-26 11:11:52 +00:00
bc09810d30 terminados primeras modificaciones 2026-02-26 12:11:21 +01:00
27eabde40f solucionado problema con cargar solapas de cubierta y formato. También añadido los lomos desde sk al guardar 2026-02-25 21:09:04 +01:00
5286f12d76 trabajando en obtener lomos 2026-02-25 15:08:30 +01:00
355c5b6019 trabajando2 2026-02-24 20:57:51 +01:00
e4c1692ef0 añadido lomo 2026-02-24 14:50:27 +01:00
f3d96361a0 corregidos varios problemas 2026-02-24 14:32:47 +01:00
b7453b1138 trabajando 2026-02-24 13:24:39 +01: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> <systemPath>${project.basedir}/src/main/resources/lib/org.json.jar</systemPath>
</dependency> </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> </dependencies>

View File

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

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) { public Map<String, Object> savePresupuesto(Map<String, Object> requestBody) {
return performWithRetryMap(() -> { return performWithRetryMap(() -> {
String url = this.skApiUrl + "api/guardar"; String url = this.skApiUrl + "api/guardar";

View File

@ -184,11 +184,14 @@ public class PaymentController {
// Campos ordenables // Campos ordenables
List<String> orderable = List.of( List<String> orderable = List.of(
"transferId", "client",
"transfer_id",
"status", "status",
"amountCents", "amountCents",
"payment.amountRefundedCents", "amountCentsRefund",
"createdAt", "updatedAt"); "payment.orderId",
"createdAt",
"processedAt");
Specification<PaymentTransaction> base = (root, query, cb) -> cb.or( Specification<PaymentTransaction> base = (root, query, cb) -> cb.or(
cb.equal(root.get("status"), PaymentTransactionStatus.pending), cb.equal(root.get("status"), PaymentTransactionStatus.pending),
@ -215,6 +218,26 @@ public class PaymentController {
return DataTable return DataTable
.of(repoPaymentTransaction, PaymentTransaction.class, dt, searchable) .of(repoPaymentTransaction, PaymentTransaction.class, dt, searchable)
.orderable(orderable) .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("created_at", pago -> Utils.formatDateTime(pago.getCreatedAt(), locale))
.add("processed_at", pago -> Utils.formatDateTime(pago.getProcessedAt(), locale)) .add("processed_at", pago -> Utils.formatDateTime(pago.getProcessedAt(), locale))
.add("client", pago -> { .add("client", pago -> {
@ -237,14 +260,14 @@ public class PaymentController {
return ""; return "";
}) })
.add("order_id", pago -> { .add("order_id", pago -> {
if (pago.getStatus() != PaymentTransactionStatus.pending) { //if (pago.getStatus() != PaymentTransactionStatus.pending) {
if (pago.getPayment() != null && pago.getPayment().getOrderId() != null) { if (pago.getPayment() != null && pago.getPayment().getOrderId() != null) {
return pago.getPayment().getOrderId().toString(); return pago.getPayment().getOrderId().toString();
} else { } else {
return ""; 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", pago -> Utils.formatCurrency(pago.getAmountCents() / 100.0, locale))
.add("amount_cents_refund", pago -> .add("amount_cents_refund", pago ->

View File

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

View File

@ -271,7 +271,7 @@ public class PedidoService {
Integer counter = 1; Integer counter = 1;
for (PedidoLinea linea : lineas) { for (PedidoLinea linea : lineas) {
if (linea.getEstado() == Estado.pendiente_pago 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(); Presupuesto presupuesto = linea.getPresupuesto();
linea.setEstado(getEstadoInicial(presupuesto)); linea.setEstado(getEstadoInicial(presupuesto));
@ -311,6 +311,7 @@ public class PedidoService {
return true; return true;
} }
@Transactional
public Map<String, Object> actualizarEstado(Long pedidoLineaId, Locale locale) { public Map<String, Object> actualizarEstado(Long pedidoLineaId, Locale locale) {
PedidoLinea pedidoLinea = pedidoLineaRepository.findById(pedidoLineaId).orElse(null); PedidoLinea pedidoLinea = pedidoLineaRepository.findById(pedidoLineaId).orElse(null);
@ -327,8 +328,8 @@ public class PedidoService {
"message", messageSource.getMessage("pedido.errors.cannot-update", null, locale)); "message", messageSource.getMessage("pedido.errors.cannot-update", null, locale));
} }
// Rango: >= haciendo_ferro y < enviado // Rango: >= procesando_pedido y < enviado
if (estadoOld.getPriority() < PedidoLinea.Estado.haciendo_ferro.getPriority() if (estadoOld.getPriority() < PedidoLinea.Estado.procesando_pedido.getPriority()
|| estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) { || estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) {
return Map.of( return Map.of(
"success", false, "success", false,
@ -788,7 +789,7 @@ public class PedidoService {
if (presupuestoService.hasMaquetacion(p)) { if (presupuestoService.hasMaquetacion(p)) {
return Estado.maquetacion; return Estado.maquetacion;
} else { } 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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import jakarta.validation.Validator; 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.PresupuestoMaquetacion;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMarcapaginas; import com.imprimelibros.erp.presupuesto.classes.PresupuestoMarcapaginas;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto; 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.service.PresupuestoService;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups; import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import com.imprimelibros.erp.users.UserDao; import com.imprimelibros.erp.users.UserDao;
import com.imprimelibros.erp.users.UserDetailsImpl; 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.Utils;
import com.imprimelibros.erp.common.web.IpUtils; import com.imprimelibros.erp.common.web.IpUtils;
@ -151,7 +152,8 @@ public class PresupuestoController {
return ResponseEntity.badRequest().body(errores); return ResponseEntity.badRequest().body(errores);
} }
Map<String, Object> resultado = new HashMap<>(); 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("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo")); resultado.put("lomo", datosInterior.get("lomo"));
resultado.putAll(presupuestoService.obtenerOpcionesAcabadosCubierta(presupuesto, locale)); 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("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo")); resultado.put("lomo", datosInterior.get("lomo"));
@ -309,7 +312,8 @@ public class PresupuestoController {
presupuesto.setGramajeInterior(Integer.parseInt(opciones.get(0))); // Asignar primera opción 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("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo")); resultado.put("lomo", datosInterior.get("lomo"));
@ -335,7 +339,8 @@ public class PresupuestoController {
} }
Map<String, Object> resultado = new HashMap<>(); 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("solapas", datosInterior.get("maxSolapas"));
resultado.put("lomo", datosInterior.get("lomo")); resultado.put("lomo", datosInterior.get("lomo"));
@ -650,8 +655,7 @@ public class PresupuestoController {
"presupuesto.reimprimir.success.title", "presupuesto.reimprimir.success.title",
"presupuesto.reimprimir.success.text", "presupuesto.reimprimir.success.text",
"presupuesto.reimprimir.error.title", "presupuesto.reimprimir.error.title",
"presupuesto.reimprimir.error.internal" "presupuesto.reimprimir.error.internal");
);
Map<String, String> translations = translationService.getTranslations(locale, keys); Map<String, String> translations = translationService.getTranslations(locale, keys);
model.addAttribute("languageBundle", translations); model.addAttribute("languageBundle", translations);
@ -908,6 +912,14 @@ public class PresupuestoController {
return ResponseEntity.badRequest().body(errores); 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 { try {
Map<String, Object> saveResult = presupuestoService.guardarPresupuesto( 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") @PostMapping("/{id}/comentario")
@ResponseBody @ResponseBody
public String actualizarComentario(@PathVariable Long id, public String actualizarComentario(@PathVariable Long id,
@ -951,7 +987,6 @@ public class PresupuestoController {
return Map.of("id", entity); return Map.of("id", entity);
} }
@PostMapping("/api/reimprimir/{id}") @PostMapping("/api/reimprimir/{id}")
@ResponseBody @ResponseBody
public Map<String, Object> reimprimirPresupuesto(@PathVariable Long id) { public Map<String, Object> reimprimirPresupuesto(@PathVariable Long id) {

View File

@ -126,6 +126,13 @@ public class PresupuestoFormatter {
}, },
locale); 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); textoResumen += ms.getMessage("presupuesto.resumen-texto-end", null, locale);
return textoResumen; return textoResumen;

View File

@ -281,6 +281,12 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
@Column(name = "papel_interior_id") @Column(name = "papel_interior_id")
private Integer papelInteriorId; 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) @NotNull(message = "{presupuesto.errores.gramaje-interior}", groups = PresupuestoValidationGroups.Interior.class)
@Column(name = "gramaje_interior") @Column(name = "gramaje_interior")
private Integer gramajeInterior; private Integer gramajeInterior;
@ -720,6 +726,22 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
this.papelInteriorId = papelInteriorId; 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() { public Integer getGramajeInterior() {
return gramajeInterior; 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.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -20,6 +18,8 @@ public class PresupuestoFormDataMapper {
public Cubierta cubierta = new Cubierta(); public Cubierta cubierta = new Cubierta();
public Servicios servicios = new Servicios(); public Servicios servicios = new Servicios();
public Integer selectedTirada; public Integer selectedTirada;
public Double lomo;
public Double lomoCubierta;
// ===== Datos Generales ===== // ===== Datos Generales =====
public static class DatosGenerales { public static class DatosGenerales {
@ -194,6 +194,10 @@ public class PresupuestoFormDataMapper {
// ===== Selected tirada // ===== Selected tirada
vm.selectedTirada = p.getSelectedTirada(); vm.selectedTirada = p.getSelectedTirada();
// ===== Lomos
vm.lomo = p.getLomo();
vm.lomoCubierta = p.getLomoCubierta();
// ===== Servicios desde JSONs // ===== Servicios desde JSONs
vm.servicios.servicios = parse(p.getServiciosJson(), vm.servicios.servicios = parse(p.getServiciosJson(),
new TypeReference<List<PresupuestoFormDataDto.Servicios.DatosServicios>>() { new TypeReference<List<PresupuestoFormDataDto.Servicios.DatosServicios>>() {

View File

@ -6,6 +6,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.Locale; 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.presupuesto.marcapaginas.MarcapaginasRepository;
import com.imprimelibros.erp.users.UserDao; 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 jakarta.servlet.http.HttpServletRequest;
import com.imprimelibros.erp.externalApi.skApiClient; 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. * PRIVADO (futuro botón "Guardar"): persiste el presupuesto como borrador.
*/ */
@ -1540,4 +1621,77 @@ public class PresupuestoService {
return ip; 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,4 +1,4 @@
databaseChangeLog: databaseChangeLog:
- include: - include:
file: db/changelog/changesets/0001-baseline.yml file: db/changelog/changesets/0001-baseline.yml
- include: - include:
@ -51,3 +51,9 @@ databaseChangeLog:
file: db/changelog/changesets/0025-create-facturas-direcciones.yml file: db/changelog/changesets/0025-create-facturas-direcciones.yml
- include: - include:
file: db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml 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.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.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.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.title=Resumen de la cesta
cart.resumen.base=Base imponible 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.procesando_pago=Procesando pago
pedido.estado.denegado_pago=Pago denegado pedido.estado.denegado_pago=Pago denegado
pedido.estado.aprobado=Aprobado pedido.estado.aprobado=Aprobado
pedido.estado.procesando_pedido=Procesando pedido
pedido.estado.maquetacion=Maquetación pedido.estado.maquetacion=Maquetación
pedido.estado.haciendo_ferro=Haciendo ferro pedido.estado.haciendo_ferro_digital=Haciendo ferro digital
pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ferro pedido.estado.esperando_aceptacion_ferro_digital=Esperando aceptación de ferro digital
pedido.estado.ferro_cliente=Esperando aprobación de ferro 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.produccion=Producción
pedido.estado.terminado=Terminado pedido.estado.terminado=Terminado
pedido.estado.enviado=Enviado pedido.estado.enviado=Enviado

View File

@ -117,6 +117,10 @@ presupuesto.continuar-cubierta=Diseño cubierta
# Pestaña cubierta # Pestaña cubierta
presupuesto.plantilla-cubierta=Plantilla de 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-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=Tipo de cubierta
presupuesto.tipo-cubierta-descripcion=Seleccione el tipo de cubierta y sus opciones presupuesto.tipo-cubierta-descripcion=Seleccione el tipo de cubierta y sus opciones
presupuesto.tapa-blanda=Tapa blanda 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-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-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-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.resumen-deposito-legal=Ejemplares para el Depósito Legal
presupuesto.volver-extras=Extras del libro presupuesto.volver-extras=Extras del libro
presupuesto.resumen.inicie-sesion=Inicie sesión para continuar 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) { if (direccionId) {
$.ajax({ $.ajax({
url: `/checkout/get-summary/${direccionId}`, url: `/checkout/get-summary/${direccionId}/${$('input[name="method"]').val()}`,
type: 'GET', type: 'GET',
success: function (response) { success: function (response) {
const parent = $('.cart-summary-container').parent(); const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove(); $('.cart-summary-container').remove();
parent.append(response); parent.append(response);
$('#dirFactId').val(direccionId); $('#dirFactId').val(direccionId);
$('#dirFactWarning').addClass('d-none');
}, },
error: function () { error: function () {
console.error('Error al actualizar el resumen del carrito.'); console.error('Error al actualizar el resumen del carrito.');
@ -187,6 +188,7 @@ $(() => {
success: function (response) { success: function (response) {
const parent = $('.cart-summary-container').parent(); const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove(); $('.cart-summary-container').remove();
$('#dirFactWarning').removeClass('d-none');
parent.append(response); parent.append(response);
}, },
error: function () { error: function () {

View File

@ -107,6 +107,8 @@ export default class PresupuestoWizard {
} }
}, },
selectedTirada: 10, selectedTirada: 10,
lomo: 0,
lomoCubierta: 0
} }
// pestaña datos generales // pestaña datos generales
@ -443,7 +445,9 @@ export default class PresupuestoWizard {
...this.#getDatosGeneralesData(), ...this.#getDatosGeneralesData(),
...this.#getInteriorData(), ...this.#getInteriorData(),
...this.#getCubiertaData(), ...this.#getCubiertaData(),
selectedTirada: this.formData.selectedTirada selectedTirada: this.formData.selectedTirada,
lomo: this.formData.lomo,
lomoCubierta: this.formData.lomoCubierta
}; };
const sobrecubierta = data.sobrecubierta; const sobrecubierta = data.sobrecubierta;
@ -714,17 +718,14 @@ export default class PresupuestoWizard {
.prop('checked', true); .prop('checked', true);
this.#updateTipoEncuadernacion(); this.#updateTipoEncuadernacion();
this.formatoPersonalizado.trigger('change');
$('.paginas').trigger('change');
if (this.formatoPersonalizado.is(':checked')) { if (this.formatoPersonalizado.is(':checked')) {
this.ancho.val(this.formData.datosGenerales.ancho); this.ancho.val(this.formData.datosGenerales.ancho);
this.alto.val(this.formData.datosGenerales.alto); this.alto.val(this.formData.datosGenerales.alto);
} else { } else {
const option = this.formato.find('option').filter(() => { const option = this.formato.find('option').filter((index, element) => {
return $(this).data('ancho') == this.formData.datosGenerales.ancho && return $(element).data('ancho') == this.formData.datosGenerales.ancho &&
$(this).data('alto') == this.formData.datosGenerales.alto; $(element).data('alto') == this.formData.datosGenerales.alto;
}); });
if (option.length) { 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); this.ivaReducido.prop('checked', this.formData.datosGenerales.ivaReducido);
} }
@ -965,6 +968,7 @@ export default class PresupuestoWizard {
} else { } else {
const maxSolapas = data.solapas ?? 120; const maxSolapas = data.solapas ?? 120;
const lomo = data.lomo ?? 0; const lomo = data.lomo ?? 0;
$('.solapas-presupuesto').attr('max', maxSolapas); $('.solapas-presupuesto').attr('max', maxSolapas);
$('.max-solapa-text').text(function (_, textoActual) { $('.max-solapa-text').text(function (_, textoActual) {
return textoActual.replace(/\d+/, maxSolapas); return textoActual.replace(/\d+/, maxSolapas);
@ -989,16 +993,16 @@ export default class PresupuestoWizard {
this.acabadoSobrecubierta.val(this.formData.cubierta.sobrecubierta.acabado); this.acabadoSobrecubierta.val(this.formData.cubierta.sobrecubierta.acabado);
this.fajaSobrecubierta.val(this.formData.cubierta.faja.acabado); this.fajaSobrecubierta.val(this.formData.cubierta.faja.acabado);
if(lomo < 10){ if (lomo < 10) {
this.formData.cubierta.cabezada = "NOCAB"; this.formData.cubierta.cabezada = "NOCAB";
this.cabezada.val("NOCAB"); this.cabezada.val("NOCAB");
this.cabezada.prop("disabled", true); this.cabezada.prop("disabled", true);
if(this.formData.cubierta.tipoCubierta === 'tapaDuraLomoRedondo'){ if (this.formData.cubierta.tipoCubierta === 'tapaDuraLomoRedondo') {
this.formData.cubierta.tipoCubierta = 'tapaDura'; this.formData.cubierta.tipoCubierta = 'tapaDura';
} }
$("#tapaDuraLomoRedondo").addClass("d-none"); $("#tapaDuraLomoRedondo").addClass("d-none");
} }
else{ else {
this.cabezada.prop("disabled", false); this.cabezada.prop("disabled", false);
$("#tapaDuraLomoRedondo").removeClass("d-none"); $("#tapaDuraLomoRedondo").removeClass("d-none");
} }
@ -1018,6 +1022,7 @@ export default class PresupuestoWizard {
const dataCubierta = this.#getCubiertaData(); const dataCubierta = this.#getCubiertaData();
this.#updateCubiertaData(dataCubierta); this.#updateCubiertaData(dataCubierta);
this.formData.lomo = lomo;
this.#cacheFormData(); this.#cacheFormData();
} }
@ -1139,13 +1144,21 @@ export default class PresupuestoWizard {
#initCubierta() { #initCubierta() {
this.btn_plantilla_cubierta.on('click', () => { 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({ Swal.fire({
position: 'top-end', position: 'top-end',
icon: 'info', icon: 'info',
title: window.languageBundle.get('presupuesto.plantilla-cubierta'), title: window.languageBundle.get('presupuesto.plantilla-cubierta'),
html: ` html: `
<div class="text-center p-4"> <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>
<div class="acitivity-timeline p-4"> <div class="acitivity-timeline p-4">
${window.languageBundle.get('presupuesto.plantilla-cubierta-text')} ${window.languageBundle.get('presupuesto.plantilla-cubierta-text')}
@ -1437,7 +1450,10 @@ export default class PresupuestoWizard {
#getCubiertaData() { #getCubiertaData() {
const tipoCubierta = $('.tapa-cubierta input:checked').val() || 'tapaBlanda'; 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 tamanioSolapasCubierta = $('#tamanio-solapas-cubierta').val() || '80';
const cubiertaCaras = parseInt(this.carasImpresionCubierta.val()) || 2; const cubiertaCaras = parseInt(this.carasImpresionCubierta.val()) || 2;
const papelGuardasId = parseInt($('#papel-guardas option:selected').data('papel-id')) || 3; 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)); 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) { 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.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]; 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> </div>
<form th:action="@{/pagos/redsys/crear}" method="post"> <form th:action="@{/pagos/redsys/crear}" method="post">
<input type="hidden" name="amountCents" th:value="${summary.amountCents}" /> <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" name="cartId" th:value="${summary.cartId}" />
<input type="hidden" id="dirFactId" name="dirFactId" value="" /> <input type="hidden" id="dirFactId" name="dirFactId" value="" />
<button id="btn-checkout" type="submit" class="btn btn-secondary w-100 mt-2" <button id="btn-checkout" type="submit" class="btn btn-secondary w-100 mt-2"

View File

@ -50,6 +50,9 @@
<div> <div>
<h5 th:text="#{checkout.billing-address}" class="mb-3">Dirección de envío</h5> <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" <button type="button" class="btn btn-secondary mb-3" id="addBillingAddressBtn"
th:text="#{cart.shipping.add}">Añadir dirección th:text="#{cart.shipping.add}">Añadir dirección
</button> </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

@ -18,6 +18,17 @@
<h5 id="resumen-titulo" class="text-center"></h5> <h5 id="resumen-titulo" class="text-center"></h5>
<h6 th:if="${presupuesto?.isReimpresion}" th:text="#{presupuesto.reimpresion}" <h6 th:if="${presupuesto?.isReimpresion}" th:text="#{presupuesto.reimpresion}"
class="text-uppercase bg-danger text-white text-center">REIMPRESION</h6> 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" <table id="resumen-tabla-final" class="table table-borderless table-striped mt-3"
th:data-currency="#{app.currency}"> th:data-currency="#{app.currency}">
<thead> <thead>

View File

@ -44,18 +44,40 @@
<input type="hidden" id="presupuesto_id" th:value="${presupuesto.id}" /> <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="row" id="card presupuesto-row animate-fadeInUpBounce">
<div class="card"> <div class="card">
<div class="card-header"> <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> presupuesto</h4>
</div> </div>
<div class="card-body"> <div class="card-body">
<div th:if="${presupuesto.isReimpresion}" class="row"> <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>
<div class="card col-12 col-sm-9 mx-auto"> <div class="card col-12 col-sm-9 mx-auto">
@ -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/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/duplicate-reprint.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/plantilla-cubierta.js}"></script>
</th:block> </th:block>
</body> </body>