Compare commits

..

1 Commits

49 changed files with 225 additions and 3470 deletions

10
pom.xml
View File

@ -191,16 +191,6 @@
<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

@ -80,7 +80,7 @@ public class CartController {
else if (direcciones != null && direcciones.containsKey("direcciones")) else if (direcciones != null && direcciones.containsKey("direcciones"))
model.addAttribute("direcciones", direcciones.get("direcciones")); model.addAttribute("direcciones", direcciones.get("direcciones"));
var summary = service.getCartSummary(cart, locale, true); var summary = service.getCartSummary(cart, locale);
model.addAttribute("cartSummary", summary); model.addAttribute("cartSummary", summary);
if (summary.get("errorShipmentCost") != null && (Boolean) summary.get("errorShipmentCost")) if (summary.get("errorShipmentCost") != null && (Boolean) summary.get("errorShipmentCost"))
model.addAttribute("errorEnvio", true); model.addAttribute("errorEnvio", true);
@ -165,7 +165,7 @@ public class CartController {
try { try {
service.updateCart(id, updateRequest); service.updateCart(id, updateRequest);
var cartSummary = service.getCartSummary(service.getCartById(id), locale, true); var cartSummary = service.getCartSummary(service.getCartById(id), locale);
model.addAttribute("cartSummary", cartSummary); model.addAttribute("cartSummary", cartSummary);
return "imprimelibros/cart/_cartSummary :: cartSummary(summary=${cartSummary})"; return "imprimelibros/cart/_cartSummary :: cartSummary(summary=${cartSummary})";

View File

@ -163,7 +163,7 @@ public class CartService {
return itemRepo.findByCartId(cart.getId()).size(); return itemRepo.findByCartId(cart.getId()).size();
} }
public Map<String, Object> getCartSummaryRaw(Cart cart, Locale locale, Boolean hasTaxes) { public Map<String, Object> getCartSummaryRaw(Cart cart, Locale locale) {
double base = 0.0; double base = 0.0;
double iva4 = 0.0; double iva4 = 0.0;
@ -269,11 +269,6 @@ public class CartService {
} }
} }
if(!hasTaxes) {
iva4 = 0.0;
iva21 = 0.0;
}
double totalBeforeDiscount = base + iva4 + iva21 + shipment; double totalBeforeDiscount = base + iva4 + iva21 + shipment;
int fidelizacion = this.getDescuentoFidelizacion(cart.getUserId()); int fidelizacion = this.getDescuentoFidelizacion(cart.getUserId());
double descuento = totalBeforeDiscount * fidelizacion / 100.0; double descuento = totalBeforeDiscount * fidelizacion / 100.0;
@ -323,8 +318,8 @@ public class CartService {
return 0; return 0;
} }
public Map<String, Object> getCartSummary(Cart cart, Locale locale, Boolean hasTaxes) { public Map<String, Object> getCartSummary(Cart cart, Locale locale) {
Map<String, Object> raw = getCartSummaryRaw(cart, locale, hasTaxes); Map<String, Object> raw = getCartSummaryRaw(cart, locale);
double base = (Double) raw.get("base"); double base = (Double) raw.get("base");
double iva4 = (Double) raw.get("iva4"); double iva4 = (Double) raw.get("iva4");

View File

@ -48,7 +48,7 @@ public class CheckoutController {
"app.cancelar", "app.cancelar",
"app.seleccionar", "app.seleccionar",
"app.yes", "app.yes",
"checkout.billing-address.title", "checkout.billing-address.title",
"checkout.billing-address.new-address", "checkout.billing-address.new-address",
"checkout.billing-address.select-placeholder", "checkout.billing-address.select-placeholder",
"checkout.billing-address.errors.noAddressSelected"); "checkout.billing-address.errors.noAddressSelected");
@ -58,28 +58,10 @@ public class CheckoutController {
Long userId = Utils.currentUserId(principal); Long userId = Utils.currentUserId(principal);
Cart cart = cartService.getOrCreateActiveCart(userId); Cart cart = cartService.getOrCreateActiveCart(userId);
model.addAttribute("summary", cartService.getCartSummary(cart, locale, true)); model.addAttribute("summary", cartService.getCartSummary(cart, locale));
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}/{method}" })
public String getCheckoutSummary(@PathVariable(required = false) Long direccionId,
@PathVariable(required = false) String method, Principal principal, Model model, Locale locale) {
Long userId = Utils.currentUserId(principal);
Cart cart = cartService.getOrCreateActiveCart(userId);
Boolean hasTaxes = true;
if (direccionId != null) {
hasTaxes = direccionService.hasTaxes(direccionId);
}
Map<String, Object> summary = cartService.getCartSummary(cart, locale, hasTaxes);
model.addAttribute("summary", summary);
if (method != null) {
model.addAttribute("method", method);
}
return "imprimelibros/checkout/_summary :: checkoutSummary(summary=${summary})";
}
@GetMapping("/get-address/{id}") @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

@ -153,26 +153,4 @@ public class DireccionService {
return false; return false;
} }
public Boolean hasTaxes(Long direccionId) {
if(direccionId == null) {
return true; // Si no hay dirección, asumimos que sí tiene impuestos
}
Optional<Direccion> dir = repo.findById(direccionId);
if (dir == null || dir.isEmpty()) {
throw new RuntimeException("Dirección no encontrada");
}
if(dir.get().getPaisCode3().toLowerCase().equals("esp")) {
int provincia = dir.get().getCp() / 1000;
if (provincia == 35 || provincia == 38 ) {
return false; // Canarias (sin IVA)lñ.
}
return true; // España (todas las provincias)
}
else{
// Fuera de España, asumimos que no tiene impuestos (puedes ajustar esto según tus necesidades)
return false;
}
}
} }

View File

@ -1,47 +0,0 @@
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,62 +128,6 @@ 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

@ -8,6 +8,7 @@ import com.imprimelibros.erp.facturacion.dto.FacturaDireccionMapper;
import com.imprimelibros.erp.facturacion.dto.FacturaGuardarDto; import com.imprimelibros.erp.facturacion.dto.FacturaGuardarDto;
import com.imprimelibros.erp.facturacion.dto.FacturaLineaUpsertDto; import com.imprimelibros.erp.facturacion.dto.FacturaLineaUpsertDto;
import com.imprimelibros.erp.facturacion.dto.FacturaPagoUpsertDto; import com.imprimelibros.erp.facturacion.dto.FacturaPagoUpsertDto;
import com.imprimelibros.erp.facturacion.repo.FacturaDireccionRepository;
import com.imprimelibros.erp.facturacion.repo.FacturaLineaRepository; import com.imprimelibros.erp.facturacion.repo.FacturaLineaRepository;
import com.imprimelibros.erp.facturacion.repo.FacturaPagoRepository; import com.imprimelibros.erp.facturacion.repo.FacturaPagoRepository;
import com.imprimelibros.erp.facturacion.repo.FacturaRepository; import com.imprimelibros.erp.facturacion.repo.FacturaRepository;

View File

@ -184,14 +184,11 @@ public class PaymentController {
// Campos ordenables // Campos ordenables
List<String> orderable = List.of( List<String> orderable = List.of(
"client", "transferId",
"transfer_id",
"status", "status",
"amountCents", "amountCents",
"amountCentsRefund", "payment.amountRefundedCents",
"payment.orderId", "createdAt", "updatedAt");
"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),
@ -218,26 +215,6 @@ 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 -> {
@ -260,14 +237,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

@ -13,7 +13,7 @@ public interface PedidoDireccionRepository extends JpaRepository<PedidoDireccion
// Si en tu código sueles trabajar con el objeto: // Si en tu código sueles trabajar con el objeto:
List<PedidoDireccion> findByPedidoLinea(PedidoLinea pedidoLinea); List<PedidoDireccion> findByPedidoLinea(PedidoLinea pedidoLinea);
PedidoDireccion findFirstByPedidoIdAndFacturacionTrue(Long pedidoId); PedidoDireccion findByPedidoIdAndFacturacionTrue(Long pedidoId);
@Query(""" @Query("""
select distinct d select distinct d

View File

@ -14,16 +14,14 @@ 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),
procesando_pedido("pedido.estado.procesando_pedido", 5), maquetacion("pedido.estado.maquetacion", 5),
maquetacion("pedido.estado.maquetacion", 6), haciendo_ferro("pedido.estado.haciendo_ferro", 6),
haciendo_ferro_digital("pedido.estado.haciendo_ferro_digital", 7), esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 7),
esperando_aceptacion_ferro_digital("pedido.estado.esperando_aceptacion_ferro_digital", 8), ferro_cliente("pedido.estado.ferro_cliente", 8),
haciendo_ferro("pedido.estado.haciendo_ferro", 9), produccion("pedido.estado.produccion", 9),
esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 10), terminado("pedido.estado.terminado", 10),
produccion("pedido.estado.produccion", 11), enviado("pedido.estado.enviado", 11),
terminado("pedido.estado.terminado", 12), cancelado("pedido.estado.cancelado", 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

@ -1,6 +1,5 @@
package com.imprimelibros.erp.pedidos; package com.imprimelibros.erp.pedidos;
import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@ -69,7 +68,7 @@ public class PedidoService {
} }
public PedidoDireccion getPedidoDireccionFacturacionByPedidoId(Long pedidoId) { public PedidoDireccion getPedidoDireccionFacturacionByPedidoId(Long pedidoId) {
return pedidoDireccionRepository.findFirstByPedidoIdAndFacturacionTrue(pedidoId); return pedidoDireccionRepository.findByPedidoIdAndFacturacionTrue(pedidoId);
} }
@Transactional @Transactional
@ -82,8 +81,7 @@ public class PedidoService {
Pedido pedido = new Pedido(); Pedido pedido = new Pedido();
Cart cart = cartService.getCartById(cartId); Cart cart = cartService.getCartById(cartId);
Boolean hasTaxes = direccionService.hasTaxes(direccionFacturacionId); Map<String, Object> cartSummaryRaw = cartService.getCartSummaryRaw(cart, Locale.getDefault());
Map<String, Object> cartSummaryRaw = cartService.getCartSummaryRaw(cart, Locale.getDefault(), hasTaxes);
// Datos económicos (ojo con las claves, son las del summaryRaw) // Datos económicos (ojo con las claves, son las del summaryRaw)
pedido.setBase((Double) cartSummaryRaw.getOrDefault("base", 0.0d)); pedido.setBase((Double) cartSummaryRaw.getOrDefault("base", 0.0d));
@ -139,11 +137,6 @@ public class PedidoService {
Presupuesto p = presupuestoRepository.findById(pCart.getId()) Presupuesto p = presupuestoRepository.findById(pCart.getId())
.orElseThrow(() -> new IllegalStateException("Presupuesto no encontrado: " + pCart.getId())); .orElseThrow(() -> new IllegalStateException("Presupuesto no encontrado: " + pCart.getId()));
p.setEstado(Presupuesto.Estado.aceptado); p.setEstado(Presupuesto.Estado.aceptado);
if(!hasTaxes){
p.setIvaImporte21(BigDecimal.ZERO);
p.setIvaImporte4(BigDecimal.ZERO);
p.setTotalConIva(p.getBaseImponible());
}
presupuestoRepository.save(p); presupuestoRepository.save(p);
PedidoLinea linea = new PedidoLinea(); PedidoLinea linea = new PedidoLinea();
@ -157,12 +150,9 @@ public class PedidoService {
// Guardar las direcciones asociadas a la línea del pedido // Guardar las direcciones asociadas a la línea del pedido
Map<String, Object> direcciones_presupuesto = this.getDireccionesPresupuesto(cart, p); Map<String, Object> direcciones_presupuesto = this.getDireccionesPresupuesto(cart, p);
saveDireccionesPedidoLinea(direcciones_presupuesto, pedidoGuardado, linea); saveDireccionesPedidoLinea(direcciones_presupuesto, pedidoGuardado, linea, direccionFacturacionId);
} }
if(direccionFacturacionId != null && pedidoGuardado != null && pedidoGuardado.getId() != null){
saveDireccionFacturacionPedido(pedidoGuardado, direccionFacturacionId);
}
return pedidoGuardado; return pedidoGuardado;
} }
@ -206,7 +196,7 @@ public class PedidoService {
Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null); Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null);
if (pedido != null) { if (pedido != null) {
PedidoDireccion direccionPedido = pedidoDireccionRepository.findFirstByPedidoIdAndFacturacionTrue(pedidoId); PedidoDireccion direccionPedido = pedidoDireccionRepository.findByPedidoIdAndFacturacionTrue(pedidoId);
if (direccionPedido == null) { if (direccionPedido == null) {
// crear // crear
@ -253,7 +243,7 @@ public class PedidoService {
} }
public PedidoDireccion getDireccionFacturacionPedido(Long pedidoId) { public PedidoDireccion getDireccionFacturacionPedido(Long pedidoId) {
return pedidoDireccionRepository.findFirstByPedidoIdAndFacturacionTrue(pedidoId); return pedidoDireccionRepository.findByPedidoIdAndFacturacionTrue(pedidoId);
} }
public List<PedidoDireccion> getDireccionesEntregaPedidoLinea(Long pedidoLineaId) { public List<PedidoDireccion> getDireccionesEntregaPedidoLinea(Long pedidoLineaId) {
@ -271,7 +261,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.procesando_pago) { || linea.getEstado() == Estado.denegado_pago) {
Presupuesto presupuesto = linea.getPresupuesto(); Presupuesto presupuesto = linea.getPresupuesto();
linea.setEstado(getEstadoInicial(presupuesto)); linea.setEstado(getEstadoInicial(presupuesto));
@ -311,7 +301,6 @@ 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);
@ -328,8 +317,8 @@ public class PedidoService {
"message", messageSource.getMessage("pedido.errors.cannot-update", null, locale)); "message", messageSource.getMessage("pedido.errors.cannot-update", null, locale));
} }
// Rango: >= procesando_pedido y < enviado // Rango: >= haciendo_ferro y < enviado
if (estadoOld.getPriority() < PedidoLinea.Estado.procesando_pedido.getPriority() if (estadoOld.getPriority() < PedidoLinea.Estado.haciendo_ferro.getPriority()
|| estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) { || estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) {
return Map.of( return Map.of(
"success", false, "success", false,
@ -656,7 +645,7 @@ public class PedidoService {
private void saveDireccionesPedidoLinea( private void saveDireccionesPedidoLinea(
Map<String, Object> direcciones, Map<String, Object> direcciones,
Pedido pedido, Pedido pedido,
PedidoLinea linea) { PedidoLinea linea, Long direccionFacturacionId) {
String email = pedido.getCreatedBy().getUserName(); String email = pedido.getCreatedBy().getUserName();
@ -703,12 +692,7 @@ public class PedidoService {
pedidoDireccionRepository.save(direccion); pedidoDireccionRepository.save(direccion);
} }
} }
}
private void saveDireccionFacturacionPedido(Pedido pedido, Long direccionFacturacionId) {
if (direccionFacturacionId != null) { if (direccionFacturacionId != null) {
String email = pedido.getCreatedBy().getUserName();
Direccion dirFact = direccionService.findById(direccionFacturacionId).orElse(null); Direccion dirFact = direccionService.findById(direccionFacturacionId).orElse(null);
if (dirFact != null) { if (dirFact != null) {
HashMap<String, Object> dirFactMap = new HashMap<>(); HashMap<String, Object> dirFactMap = new HashMap<>();
@ -729,7 +713,7 @@ public class PedidoService {
false, false,
dirFactMap, dirFactMap,
pedido, pedido,
null, linea,
false, false,
true); true);
pedidoDireccionRepository.save(direccion); pedidoDireccionRepository.save(direccion);
@ -789,7 +773,7 @@ public class PedidoService {
if (presupuestoService.hasMaquetacion(p)) { if (presupuestoService.hasMaquetacion(p)) {
return Estado.maquetacion; return Estado.maquetacion;
} else { } else {
return Estado.procesando_pedido; return Estado.haciendo_ferro;
} }
} }

View File

@ -12,7 +12,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ByteArrayResource;
@ -30,22 +29,23 @@ import com.imprimelibros.erp.datatables.DataTablesResponse;
import com.imprimelibros.erp.facturacion.service.FacturacionService; import com.imprimelibros.erp.facturacion.service.FacturacionService;
import com.imprimelibros.erp.i18n.TranslationService; import com.imprimelibros.erp.i18n.TranslationService;
import com.imprimelibros.erp.paises.PaisesService; import com.imprimelibros.erp.paises.PaisesService;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
import com.imprimelibros.erp.users.UserDao; import com.imprimelibros.erp.users.UserDao;
import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType; import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Subquery;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
@Controller @Controller
@RequestMapping("/pedidos") @RequestMapping("/pedidos")
public class PedidosController { public class PedidosController {
private final PresupuestoService presupuestoService;
private final PedidoRepository repoPedido; private final PedidoRepository repoPedido;
private final PedidoService pedidoService; private final PedidoService pedidoService;
private final UserDao repoUser; private final UserDao repoUser;
@ -58,7 +58,7 @@ public class PedidosController {
public PedidosController(PedidoRepository repoPedido, PedidoService pedidoService, UserDao repoUser, public PedidosController(PedidoRepository repoPedido, PedidoService pedidoService, UserDao repoUser,
MessageSource messageSource, TranslationService translationService, MessageSource messageSource, TranslationService translationService,
PedidoLineaRepository repoPedidoLinea, PaisesService paisesService, PedidoLineaRepository repoPedidoLinea, PaisesService paisesService,
FacturacionService facturacionService) { FacturacionService facturacionService, PresupuestoService presupuestoService) {
this.repoPedido = repoPedido; this.repoPedido = repoPedido;
this.pedidoService = pedidoService; this.pedidoService = pedidoService;
this.repoUser = repoUser; this.repoUser = repoUser;
@ -67,6 +67,7 @@ public class PedidosController {
this.repoPedidoLinea = repoPedidoLinea; this.repoPedidoLinea = repoPedidoLinea;
this.paisesService = paisesService; this.paisesService = paisesService;
this.facturacionService = facturacionService; this.facturacionService = facturacionService;
this.presupuestoService = presupuestoService;
} }
@GetMapping @GetMapping
@ -110,7 +111,6 @@ public class PedidosController {
"id", "id",
"createdBy.fullName", "createdBy.fullName",
"createdAt", "createdAt",
"titulos",
"total", "total",
"estado"); "estado");
@ -118,10 +118,8 @@ public class PedidosController {
if (!isAdmin) { if (!isAdmin) {
base = base.and((root, query, cb) -> cb.equal(root.get("createdBy").get("id"), currentUserId)); base = base.and((root, query, cb) -> cb.equal(root.get("createdBy").get("id"), currentUserId));
} }
String clientSearch = dt.getColumnSearch("cliente"); String clientSearch = dt.getColumnSearch("cliente");
String estadoSearch = dt.getColumnSearch("estado"); String estadoSearch = dt.getColumnSearch("estado");
String titulosSearch = dt.getColumnSearch("titulos");
// 2) Si hay filtro, traducirlo a userIds y añadirlo al Specification // 2) Si hay filtro, traducirlo a userIds y añadirlo al Specification
if (clientSearch != null) { if (clientSearch != null) {
@ -153,45 +151,11 @@ public class PedidosController {
base = base.and((root, query, cb) -> cb.disjunction()); base = base.and((root, query, cb) -> cb.disjunction());
} }
} }
if (titulosSearch != null && !titulosSearch.isBlank()) {
String like = "%" + titulosSearch.trim().toLowerCase() + "%";
base = base.and((root, query, cb) -> {
Subquery<Long> minLineaIdSq = query.subquery(Long.class);
var plMin = minLineaIdSq.from(PedidoLinea.class);
minLineaIdSq.select(cb.min(plMin.get("id")));
minLineaIdSq.where(cb.equal(plMin.get("pedido"), root));
Subquery<String> firstTitleSq = query.subquery(String.class);
var plFirst = firstTitleSq.from(PedidoLinea.class);
var prFirst = plFirst.join("presupuesto", JoinType.LEFT);
firstTitleSq.select(cb.lower(cb.coalesce(prFirst.get("titulo"), "")));
firstTitleSq.where(
cb.equal(plFirst.get("pedido"), root),
cb.equal(plFirst.get("id"), minLineaIdSq));
return cb.like(firstTitleSq, like);
});
}
Long total = repoPedido.count(base); Long total = repoPedido.count(base);
return DataTable return DataTable
.of(repoPedido, Pedido.class, dt, searchable) .of(repoPedido, Pedido.class, dt, searchable)
.orderable(orderable) .orderable(orderable)
.orderable("titulos", (root, query, cb) -> {
Subquery<Long> minLineaIdSq = query.subquery(Long.class);
var plMin = minLineaIdSq.from(PedidoLinea.class);
minLineaIdSq.select(cb.min(plMin.get("id")));
minLineaIdSq.where(cb.equal(plMin.get("pedido"), root));
Subquery<String> firstTitleSq = query.subquery(String.class);
var plFirst = firstTitleSq.from(PedidoLinea.class);
var prFirst = plFirst.join("presupuesto", JoinType.LEFT);
firstTitleSq.select(cb.lower(cb.coalesce(prFirst.get("titulo"), "")));
firstTitleSq.where(
cb.equal(plFirst.get("pedido"), root),
cb.equal(plFirst.get("id"), minLineaIdSq));
return firstTitleSq;
})
.add("id", Pedido::getId) .add("id", Pedido::getId)
.add("created_at", pedido -> Utils.formatInstant(pedido.getCreatedAt(), locale)) .add("created_at", pedido -> Utils.formatInstant(pedido.getCreatedAt(), locale))
.add("cliente", pedido -> { .add("cliente", pedido -> {
@ -207,38 +171,6 @@ public class PedidosController {
return ""; return "";
} }
}) })
.add("titulos", pedido -> {
List<PedidoLinea> lineas = repoPedidoLinea.findByPedidoIdOrderByIdAsc(pedido.getId());
if (lineas.isEmpty()) {
return "";
}
List<Presupuesto> presupuestos = lineas.stream()
.map(PedidoLinea::getPresupuesto)
.filter(presupuesto -> presupuesto != null)
.collect(Collectors.toList());
if (presupuestos.isEmpty()) {
return "";
}
String primerTitulo = presupuestos.get(0).getTitulo();
if (primerTitulo == null) {
primerTitulo = "";
} else {
primerTitulo = primerTitulo.trim();
}
int extras = presupuestos.size() - 1;
if (extras <= 0) {
return primerTitulo;
}
String suffix = messageSource.getMessage(
"pedido.table.titulos.and-more",
new Object[] { extras },
locale);
return primerTitulo + " " + suffix;
})
.add("estado", pedido -> { .add("estado", pedido -> {
List<PedidoLinea> lineas = repoPedidoLinea.findByPedidoId(pedido.getId()); List<PedidoLinea> lineas = repoPedidoLinea.findByPedidoId(pedido.getId());
if (lineas.isEmpty()) { if (lineas.isEmpty()) {
@ -519,4 +451,4 @@ public class PedidosController {
} }
} }
} }

View File

@ -34,7 +34,6 @@ 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;
@ -49,12 +48,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;
@ -152,8 +151,7 @@ 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), Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
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));
@ -275,8 +273,7 @@ public class PresupuestoController {
} }
} }
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
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"));
@ -312,11 +309,10 @@ 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), Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
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"));
return ResponseEntity.ok(resultado); return ResponseEntity.ok(resultado);
} }
@ -339,11 +335,10 @@ public class PresupuestoController {
} }
Map<String, Object> resultado = new HashMap<>(); Map<String, Object> resultado = new HashMap<>();
Map<String, Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), Map<String , Object> datosInterior = apiClient.getMaxSolapas(presupuestoService.toSkApiRequest(presupuesto), locale);
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"));
return ResponseEntity.ok(resultado); return ResponseEntity.ok(resultado);
} }
@ -655,7 +650,8 @@ 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);
@ -680,7 +676,7 @@ public class PresupuestoController {
"presupuesto.add.error.save.title", "presupuesto.add.error.save.title",
"presupuesto.iva-reducido", "presupuesto.iva-reducido",
"presupuesto.iva-reducido-descripcion", "presupuesto.iva-reducido-descripcion",
"presupuesto.duplicar.title", "presupuesto.duplicar.title",
"presupuesto.duplicar.text", "presupuesto.duplicar.text",
"presupuesto.duplicar.confirm", "presupuesto.duplicar.confirm",
"presupuesto.duplicar.cancelar", "presupuesto.duplicar.cancelar",
@ -912,14 +908,6 @@ 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(
@ -945,30 +933,6 @@ 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,
@ -980,17 +944,18 @@ public class PresupuestoController {
@PostMapping("/api/duplicar/{id}") @PostMapping("/api/duplicar/{id}")
@ResponseBody @ResponseBody
public Map<String, Object> duplicarPresupuesto( public Map<String, Object> duplicarPresupuesto(
@PathVariable Long id, @PathVariable Long id,
@RequestParam(name = "titulo", defaultValue = "") String titulo) { @RequestParam(name = "titulo", defaultValue = "") String titulo) {
Long entity = presupuestoService.duplicarPresupuesto(id, titulo); Long entity = presupuestoService.duplicarPresupuesto(id, titulo);
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) {
Long entity = presupuestoService.reimprimirPresupuesto(id); Long entity = presupuestoService.reimprimirPresupuesto(id);
return Map.of("id", entity); return Map.of("id", entity);
} }

View File

@ -126,13 +126,6 @@ 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

@ -109,6 +109,21 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
} }
} }
public enum Entrega {
peninsula("presupuesto.entrega.peninsula"),
canarias("presupuesto.entrega.canarias"),
paises_ue("presupuesto.entrega.paises-ue");
private final String messageKey;
Entrega(String messageKey) {
this.messageKey = messageKey;
}
public String getMessageKey() {
return messageKey;
}
}
@Override @Override
public Presupuesto clone() { public Presupuesto clone() {
@ -173,6 +188,10 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
@Column(name = "iva_reducido") @Column(name = "iva_reducido")
private Boolean ivaReducido; private Boolean ivaReducido;
@Column(name = "entrega_tipo")
@Enumerated(EnumType.STRING)
private Entrega entregaTipo;
@Column(name = "iva_importe_4", precision = 12, scale = 2) @Column(name = "iva_importe_4", precision = 12, scale = 2)
private BigDecimal ivaImporte4; private BigDecimal ivaImporte4;
@ -281,12 +300,6 @@ 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;
@ -518,6 +531,14 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
this.ivaReducido = ivaReducido; this.ivaReducido = ivaReducido;
} }
public Entrega getEntregaTipo() {
return entregaTipo;
}
public void setEntregaTipo(Entrega entregaTipo) {
this.entregaTipo = entregaTipo;
}
public BigDecimal getIvaImporte4() { public BigDecimal getIvaImporte4() {
return ivaImporte4; return ivaImporte4;
} }
@ -726,22 +747,6 @@ 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,7 +1,9 @@
package com.imprimelibros.erp.presupuesto.dto; package com.imprimelibros.erp.presupuesto.service;
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;
@ -18,8 +20,6 @@ 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 {
@ -37,6 +37,7 @@ public class PresupuestoFormDataMapper {
public String paginasColor = ""; public String paginasColor = "";
public String posicionPaginasColor = ""; public String posicionPaginasColor = "";
public String tipoEncuadernacion = "fresado"; // enum name public String tipoEncuadernacion = "fresado"; // enum name
public String entregaTipo = "peninsula"; // enum name
public boolean ivaReducido = true; public boolean ivaReducido = true;
} }
@ -156,6 +157,7 @@ public class PresupuestoFormDataMapper {
vm.datosGenerales.tipoEncuadernacion = enumName(p.getTipoEncuadernacion(), "fresado"); vm.datosGenerales.tipoEncuadernacion = enumName(p.getTipoEncuadernacion(), "fresado");
vm.datosGenerales.entregaTipo = enumName(p.getEntregaTipo(), "peninsula");
vm.datosGenerales.ivaReducido = Boolean.TRUE.equals(p.getIvaReducido()); vm.datosGenerales.ivaReducido = Boolean.TRUE.equals(p.getIvaReducido());
// ===== Interior // ===== Interior
@ -194,10 +196,6 @@ 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,8 +6,6 @@ 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;
@ -44,15 +42,6 @@ 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;
@ -340,7 +329,7 @@ public class PresupuestoService {
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(tirada -> tirada + 4) .map(tirada -> tirada + 4)
.collect(Collectors.toList())); .collect(Collectors.toList()));
if (presupuesto.getSelectedTirada() != null) { if(presupuesto.getSelectedTirada() != null) {
presupuesto.setSelectedTirada(presupuesto.getSelectedTirada()); presupuesto.setSelectedTirada(presupuesto.getSelectedTirada());
} }
} else { } else {
@ -348,7 +337,7 @@ public class PresupuestoService {
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
body.put("selectedTirada", body.put("selectedTirada",
presupuesto.getSelectedTirada() != null ? presupuesto.getSelectedTirada() : presupuesto.getTirada1()); presupuesto.getSelectedTirada() != null ? presupuesto.getSelectedTirada() : presupuesto.getTirada1());
body.put("tamanio", tamanio); body.put("tamanio", tamanio);
@ -363,7 +352,7 @@ public class PresupuestoService {
body.put("cubierta", cubierta); body.put("cubierta", cubierta);
body.put("guardas", null); body.put("guardas", null);
// Para las reimpresiones // Para las reimpresiones
if (presupuesto.getIsReimpresion() != null && presupuesto.getIsReimpresion()) { if(presupuesto.getIsReimpresion() != null && presupuesto.getIsReimpresion()) {
body.put("reimpresion", 1); body.put("reimpresion", 1);
body.put("iskn", presupuesto.getProveedorRef1()); body.put("iskn", presupuesto.getProveedorRef1());
} }
@ -1135,9 +1124,9 @@ public class PresupuestoService {
try { try {
// retractilado: recalcular precio // retractilado: recalcular precio
if (s.get("id").equals("retractilado")) { if (s.get("id").equals("retractilado")) {
String p = obtenerPrecioRetractilado(cantidad); String p = obtenerPrecioRetractilado(cantidad);
if (p != null) { if(p != null){
double precio_retractilado = Double.parseDouble(p); double precio_retractilado = Double.parseDouble(p);
s.put("price", precio_retractilado); s.put("price", precio_retractilado);
} else { } else {
@ -1160,7 +1149,7 @@ public class PresupuestoService {
} }
} }
try { try {
if (presupuesto.getSelectedTirada() != null && presupuesto.getSelectedTirada().equals(tirada)) if(presupuesto.getSelectedTirada() != null && presupuesto.getSelectedTirada().equals(tirada))
presupuesto.setServiciosJson(new ObjectMapper().writeValueAsString(servicios)); presupuesto.setServiciosJson(new ObjectMapper().writeValueAsString(servicios));
} catch (Exception ignore) { } catch (Exception ignore) {
System.out.println("Error guardando servicios JSON: " + ignore.getMessage()); System.out.println("Error guardando servicios JSON: " + ignore.getMessage());
@ -1173,19 +1162,21 @@ public class PresupuestoService {
// Si la entrega es en peninsula, se mira el valor del iva // Si la entrega es en peninsula, se mira el valor del iva
// Canarias y paises UE no llevan IVA // Canarias y paises UE no llevan IVA
// Si el iva es reducido, el precio de la tirada y el del prototipo llevan IVA if (presupuesto.getEntregaTipo() == Presupuesto.Entrega.peninsula) {
// 4% // Si el iva es reducido, el precio de la tirada y el del prototipo llevan IVA
if (presupuesto.getIvaReducido()) { // 4%
ivaImporte4 = baseImponible.add(serviciosIva4).multiply(BigDecimal.valueOf(4)).divide( if (presupuesto.getIvaReducido()) {
BigDecimal.valueOf(100), 2, ivaImporte4 = baseImponible.add(serviciosIva4).multiply(BigDecimal.valueOf(4)).divide(
RoundingMode.HALF_UP); BigDecimal.valueOf(100), 2,
ivaImporte21 = serviciosTotal.subtract(serviciosIva4).multiply(BigDecimal.valueOf(21)).divide( RoundingMode.HALF_UP);
BigDecimal.valueOf(100), 2, ivaImporte21 = serviciosTotal.subtract(serviciosIva4).multiply(BigDecimal.valueOf(21)).divide(
RoundingMode.HALF_UP); BigDecimal.valueOf(100), 2,
} else { RoundingMode.HALF_UP);
ivaImporte21 = baseImponible.add(serviciosTotal).multiply(BigDecimal.valueOf(21)).divide( } else {
BigDecimal.valueOf(100), 2, ivaImporte21 = baseImponible.add(serviciosTotal).multiply(BigDecimal.valueOf(21)).divide(
RoundingMode.HALF_UP); BigDecimal.valueOf(100), 2,
RoundingMode.HALF_UP);
}
} }
baseImponible = baseImponible.add(serviciosTotal); baseImponible = baseImponible.add(serviciosTotal);
BigDecimal totalConIva = baseImponible.add(ivaImporte21).add(ivaImporte4); BigDecimal totalConIva = baseImponible.add(ivaImporte21).add(ivaImporte4);
@ -1308,76 +1299,6 @@ 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.
*/ */
@ -1411,10 +1332,10 @@ public class PresupuestoService {
} }
return true; return true;
} }
public Boolean hasMaquetacion(Presupuesto presupuesto) { public Boolean hasMaquetacion(Presupuesto presupuesto) {
if (presupuesto.getServiciosJson() != null && !presupuesto.getServiciosJson().isEmpty()) { if (presupuesto.getServiciosJson() != null && !presupuesto.getServiciosJson().isEmpty()) {
if (presupuesto.getServiciosJson().contains("maquetacion")) { if(presupuesto.getServiciosJson().contains("maquetacion")) {
return true; return true;
} }
} }
@ -1553,6 +1474,7 @@ public class PresupuestoService {
target.setServiciosTotal(src.getServiciosTotal()); target.setServiciosTotal(src.getServiciosTotal());
target.setBaseImponible(src.getBaseImponible()); target.setBaseImponible(src.getBaseImponible());
target.setIvaReducido(src.getIvaReducido()); target.setIvaReducido(src.getIvaReducido());
target.setEntregaTipo(src.getEntregaTipo());
target.setIvaImporte4(src.getIvaImporte4()); target.setIvaImporte4(src.getIvaImporte4());
target.setIvaImporte21(src.getIvaImporte21()); target.setIvaImporte21(src.getIvaImporte21());
target.setTotalConIva(src.getTotalConIva()); target.setTotalConIva(src.getTotalConIva());
@ -1621,77 +1543,4 @@ 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

@ -29,7 +29,6 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import com.imprimelibros.erp.datatables.DataTablesRequest; import com.imprimelibros.erp.datatables.DataTablesRequest;
import com.imprimelibros.erp.datatables.DataTablesParser; import com.imprimelibros.erp.datatables.DataTablesParser;
@ -378,7 +377,7 @@ public class UserController {
@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) { @RequestParam(defaultValue = "10") int size) {
Pageable pageable = PageRequest.of(Math.max(0, page - 1), size, Sort.by(Sort.Direction.ASC, "fullName")); Pageable pageable = PageRequest.of(Math.max(0, page - 1), size);
Page<User> users = userService.findByRoleAndSearch(role, q, pageable); Page<User> users = userService.findByRoleAndSearch(role, q, pageable);

View File

@ -1,20 +0,0 @@
databaseChangeLog:
- changeSet:
id: 0026-drop-entrega-tipo-from-presupuesto
author: jjo
changes:
- dropColumn:
tableName: presupuesto
columnName: entrega_tipo
rollback:
- addColumn:
tableName: presupuesto
columns:
- column:
name: entrega_tipo
type: ENUM('peninsula', 'canarias', 'paises_ue')
defaultValue: peninsula
afterColumn: base_imponible
constraints:
nullable: false

View File

@ -1,18 +0,0 @@
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

@ -1,18 +0,0 @@
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

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

View File

@ -29,8 +29,6 @@ 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,12 +22,10 @@ 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_digital=Haciendo ferro digital pedido.estado.haciendo_ferro=Haciendo ferro
pedido.estado.esperando_aceptacion_ferro_digital=Esperando aceptación de ferro digital pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ferro
pedido.estado.haciendo_ferro=Haciendo ejemplar de prueba pedido.estado.ferro_cliente=Esperando aprobación de ferro
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
@ -49,8 +47,6 @@ pedido.prueba=Prueba
pedido.table.id=Num. Pedido pedido.table.id=Num. Pedido
pedido.table.cliente=Cliente pedido.table.cliente=Cliente
pedido.table.fecha=Fecha pedido.table.fecha=Fecha
pedido.table.titulos=Títulos
pedido.table.titulos.and-more=y {0} más
pedido.table.importe=Importe pedido.table.importe=Importe
pedido.table.estado=Estado pedido.table.estado=Estado
pedido.table.acciones=Acciones pedido.table.acciones=Acciones
@ -77,4 +73,4 @@ pedido.errors.connecting-server-error=Error al conectar con el servidor externo.
pedido.errors.cannot-update=No se puede actualizar el estado de una línea con ese estado inicial. pedido.errors.cannot-update=No se puede actualizar el estado de una línea con ese estado inicial.
pedido.success.estado-actualizado=Estado del pedido actualizado correctamente. pedido.success.estado-actualizado=Estado del pedido actualizado correctamente.
pedido.success.same-estado=Sin cambios en el estado. pedido.success.same-estado=Sin cambios en el estado.
pedido.success.pedido-cancelado=Pedido cancelado correctamente. pedido.success.pedido-cancelado=Pedido cancelado correctamente.

View File

@ -117,10 +117,6 @@ 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
@ -238,7 +234,6 @@ 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

@ -1,674 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,502 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,748 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@ -1,576 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@ -18,8 +18,8 @@ $(() => {
$('#addBillingAddressBtn').on('click', seleccionarDireccionEnvio); $('#addBillingAddressBtn').on('click', seleccionarDireccionEnvio);
$(document).on('change', '#authorization-required', function () { $('#authorization-required').on('change', function () {
if ($(this).is(':checked')) { if($(this).is(':checked')) {
if ($('#direccion-div .direccion-card').length > 0) { if ($('#direccion-div .direccion-card').length > 0) {
$('#btn-checkout').prop('disabled', false); $('#btn-checkout').prop('disabled', false);
} }
@ -148,24 +148,6 @@ $(() => {
$('#btn-checkout').prop('disabled', false); $('#btn-checkout').prop('disabled', false);
} }
hideLoader(); hideLoader();
if (direccionId) {
$.ajax({
url: `/checkout/get-summary/${direccionId}/${$('input[name="method"]').val()}`,
type: 'GET',
success: function (response) {
const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove();
parent.append(response);
$('#dirFactId').val(direccionId);
$('#dirFactWarning').addClass('d-none');
},
error: function () {
console.error('Error al actualizar el resumen del carrito.');
}
});
}
return true; return true;
} }
hideLoader(); hideLoader();
@ -182,19 +164,6 @@ $(() => {
$card.remove(); $card.remove();
$('#addBillingAddressBtn').removeClass('d-none'); $('#addBillingAddressBtn').removeClass('d-none');
$('#btn-checkout').prop('disabled', true); $('#btn-checkout').prop('disabled', true);
$.ajax({
url: `/checkout/get-summary`,
type: 'GET',
success: function (response) {
const parent = $('.cart-summary-container').parent();
$('.cart-summary-container').remove();
$('#dirFactWarning').removeClass('d-none');
parent.append(response);
},
error: function () {
console.error('Error al actualizar el resumen del carrito.');
}
});
}); });
@ -225,7 +194,7 @@ $(() => {
type: 'POST', // PUT simulado via _method type: 'POST', // PUT simulado via _method
data: $form.serialize(), data: $form.serialize(),
dataType: 'html', dataType: 'html',
success: async function (html) { success: function (html) {
// Si por cualquier motivo llega 200 con fragmento, lo insertamos igual // Si por cualquier motivo llega 200 con fragmento, lo insertamos igual
if (typeof html === 'string' && html.indexOf('id="direccionForm"') !== -1 && html.indexOf('<html') === -1) { if (typeof html === 'string' && html.indexOf('id="direccionForm"') !== -1 && html.indexOf('<html') === -1) {
$('#direccionFormModalBody').html(html); $('#direccionFormModalBody').html(html);
@ -236,8 +205,7 @@ $(() => {
} }
// Éxito real: cerrar y recargar tabla // Éxito real: cerrar y recargar tabla
$('#direccionFormModal').modal('hide'); $('#direccionFormModal').modal('hide');
await seleccionarDireccionEnvio(); seleccionarDireccionEnvio();
}, },
error: function (xhr) { error: function (xhr) {
// Con 422 devolvemos el fragmento con errores aquí // Con 422 devolvemos el fragmento con errores aquí

View File

@ -71,7 +71,7 @@ $(() => {
// ----------------------------- // -----------------------------
$table.on('click', '.btn-view-factura', function () { $table.on('click', '.btn-view-factura', function () {
const row = dt.row($(this).closest('tr')).data(); const row = dt.row($(this).closest('tr')).data();
window.open('/facturas/' + row.id, '_blank', 'noopener,noreferrer'); window.location.href = `/facturas/${row.id}`;
}); });
// ----------------------------- // -----------------------------

View File

@ -48,7 +48,6 @@ $(() => {
{ data: 'id', name: 'id', orderable: true }, { data: 'id', name: 'id', orderable: true },
{ data: 'cliente', name: 'createdBy.fullName', orderable: true }, { data: 'cliente', name: 'createdBy.fullName', orderable: true },
{ data: 'created_at', name: 'createdAt', orderable: true }, { data: 'created_at', name: 'createdAt', orderable: true },
{ data: 'titulos', name: 'titulos', orderable: true },
{ data: 'total', name: 'total', orderable: true }, { data: 'total', name: 'total', orderable: true },
{ data: 'estado', name: 'estado', orderable: true }, { data: 'estado', name: 'estado', orderable: true },
{ data: 'actions', name: 'actions', orderable: false, searchable: false } { data: 'actions', name: 'actions', orderable: false, searchable: false }

View File

@ -1,8 +1,8 @@
$(() => { $(() => {
$(document).on('click', '.btn-view', function () { $(document).on('click', '.btn-view', function () {
let pedidoId = $(this).data('id'); let pedidoId = $(this).data('id');
if(!pedidoId) return; let url = `/pedidos/view/${pedidoId}`;
window.open('/pedidos/view/' + pedidoId, '_blank', 'noopener,noreferrer'); window.location.href = url;
}); });
$(document).on('click', '.btn-pay', async function () { $(document).on('click', '.btn-pay', async function () {

View File

@ -47,7 +47,6 @@ $(() => {
columns: [ columns: [
{ data: 'id', name: 'id', orderable: true }, { data: 'id', name: 'id', orderable: true },
{ data: 'created_at', name: 'createdAt', orderable: true }, { data: 'created_at', name: 'createdAt', orderable: true },
{ data: 'titulos', name: 'titulos', orderable: true },
{ data: 'total', name: 'total', orderable: true }, { data: 'total', name: 'total', orderable: true },
{ data: 'estado', name: 'estado', orderable: true }, { data: 'estado', name: 'estado', orderable: true },
{ data: 'actions', name: 'actions', orderable: false, searchable: false } { data: 'actions', name: 'actions', orderable: false, searchable: false }

View File

@ -34,6 +34,7 @@ export default class PresupuestoWizard {
paginasColor: 0, paginasColor: 0,
posicionPaginasColor: '', posicionPaginasColor: '',
tipoEncuadernacion: 'fresado', tipoEncuadernacion: 'fresado',
entregaTipo: 'peninsula',
ivaReducido: true, ivaReducido: true,
}, },
interior: { interior: {
@ -107,8 +108,6 @@ export default class PresupuestoWizard {
} }
}, },
selectedTirada: 10, selectedTirada: 10,
lomo: 0,
lomoCubierta: 0
} }
// pestaña datos generales // pestaña datos generales
@ -131,6 +130,7 @@ export default class PresupuestoWizard {
this.divPosicionPaginasColor = $('#div-posicion-paginas-color'); this.divPosicionPaginasColor = $('#div-posicion-paginas-color');
this.posicionPaginasColor = $('#posicionPaginasColor'); this.posicionPaginasColor = $('#posicionPaginasColor');
this.paginas = $('#paginas'); this.paginas = $('#paginas');
this.entregaTipo = $('#entregaTipo');
this.ivaReducido = $('#iva-reducido'); this.ivaReducido = $('#iva-reducido');
this.btnIvaReducidoDetail = $('#btn-iva-reducido-detail'); this.btnIvaReducidoDetail = $('#btn-iva-reducido-detail');
this.datos_generales_alert = $('#datos-generales-alert'); this.datos_generales_alert = $('#datos-generales-alert');
@ -445,9 +445,7 @@ 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;
@ -668,6 +666,7 @@ export default class PresupuestoWizard {
paginasColor: this.paginasColor.val(), paginasColor: this.paginasColor.val(),
posicionPaginasColor: this.posicionPaginasColor.val(), posicionPaginasColor: this.posicionPaginasColor.val(),
tipoEncuadernacion: $('.tipo-libro input:checked').val() || 'fresado', tipoEncuadernacion: $('.tipo-libro input:checked').val() || 'fresado',
entregaTipo: this.entregaTipo.val(),
ivaReducido: this.ivaReducido.is(':checked'), ivaReducido: this.ivaReducido.is(':checked'),
}; };
} }
@ -689,6 +688,7 @@ export default class PresupuestoWizard {
paginasColor: data.paginasColor, paginasColor: data.paginasColor,
posicionPaginasColor: data.posicionPaginasColor, posicionPaginasColor: data.posicionPaginasColor,
tipoEncuadernacion: data.tipoEncuadernacion, tipoEncuadernacion: data.tipoEncuadernacion,
entregaTipo: data.entregaTipo,
ivaReducido: data.ivaReducido, ivaReducido: data.ivaReducido,
}; };
} }
@ -718,14 +718,17 @@ 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((index, element) => { const option = this.formato.find('option').filter(() => {
return $(element).data('ancho') == this.formData.datosGenerales.ancho && return $(this).data('ancho') == this.formData.datosGenerales.ancho &&
$(element).data('alto') == this.formData.datosGenerales.alto; $(this).data('alto') == this.formData.datosGenerales.alto;
}); });
if (option.length) { if (option.length) {
@ -733,8 +736,7 @@ export default class PresupuestoWizard {
} }
} }
this.formatoPersonalizado.trigger('change'); this.entregaTipo.val(this.formData.datosGenerales.entregaTipo);
$('.paginas').trigger('change');
this.ivaReducido.prop('checked', this.formData.datosGenerales.ivaReducido); this.ivaReducido.prop('checked', this.formData.datosGenerales.ivaReducido);
} }
@ -968,7 +970,6 @@ 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);
@ -993,16 +994,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");
} }
@ -1022,7 +1023,6 @@ 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();
} }
@ -1144,21 +1144,13 @@ 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="${url}" class="img-fluid" alt="" /> <img src="/assets/images/imprimelibros/presupuestador/plantilla-cubierta.png" 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')}
@ -1450,10 +1442,7 @@ export default class PresupuestoWizard {
#getCubiertaData() { #getCubiertaData() {
const tipoCubierta = $('.tapa-cubierta input:checked').val() || 'tapaBlanda'; const tipoCubierta = $('.tapa-cubierta input:checked').val() || 'tapaBlanda';
let solapas = 0; const solapas = $('.solapas-cubierta input:checked').val() == 'sin-solapas' ? 0 : 1 || 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;
@ -1700,11 +1689,6 @@ 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];
@ -1913,6 +1897,15 @@ export default class PresupuestoWizard {
...result, ...result,
}; };
if (!this.formData.servicios.servicios.some(s => s.id === "marcapaginas") && result.precio > 0) {
this.formData.servicios.servicios.push({
id: "marcapaginas",
label: $(`label[for="marcapaginas"] .service-title`).text().trim(),
units: 1,
price: result.precio,
});
}
this.#cacheFormData(); this.#cacheFormData();
}); });

View File

@ -72,7 +72,7 @@ import { preguntarTipoPresupuesto, duplicar, reimprimir } from './presupuesto-ut
e.preventDefault(); e.preventDefault();
const id = $(this).data('id'); const id = $(this).data('id');
if (id) { if (id) {
window.open('/presupuesto/view/' + id, '_blank', 'noopener,noreferrer'); window.location.href = '/presupuesto/view/' + id;
} }
}); });
@ -196,7 +196,7 @@ import { preguntarTipoPresupuesto, duplicar, reimprimir } from './presupuesto-ut
e.preventDefault(); e.preventDefault();
const id = $(this).data('id'); const id = $(this).data('id');
if (id) { if (id) {
window.open('/presupuesto/edit/' + id, '_blank', 'noopener,noreferrer'); window.location.href = '/presupuesto/edit/' + id;
} }
}); });

View File

@ -1,33 +0,0 @@
$(() => {
$('#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

@ -55,11 +55,7 @@ export async function preguntarTipoPresupuesto() {
url: 'users/api/get-users', // ajusta a tu endpoint url: 'users/api/get-users', // ajusta a tu endpoint
dataType: 'json', dataType: 'json',
delay: 250, delay: 250,
data: (params) => ({ data: (params) => ({ q: params.term }),
q: params.term || '',
page: params.page || 1,
size: 10,
}),
processResults: data => ({ processResults: data => ({
results: data.results, results: data.results,
pagination: data.pagination pagination: data.pagination

View File

@ -56,8 +56,6 @@
<h5 class="fs-14 text-truncate mb-1"> <h5 class="fs-14 text-truncate mb-1">
<span th:text="#{cart.item.presupuesto-numero}">Presupuesto #</span> <span th:text="#{cart.item.presupuesto-numero}">Presupuesto #</span>
<span th:text="${item.presupuestoId != null ? item.presupuestoId : ''}">#</span> <span th:text="${item.presupuestoId != null ? item.presupuestoId : ''}">#</span>
<a th:href="@{|/presupuesto/edit/${item.presupuestoId}|}"
th:text="#{pedido.view.view-presupuesto}" class="badge bg-secondary">Ver presupuesto</a>
</h5> </h5>
<ul class="list-unstyled text-muted mb-1 ps-0"> <ul class="list-unstyled text-muted mb-1 ps-0">

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" th:value="${method} ?: 'card'" /> <input type="hidden" name="method" value="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,9 +50,6 @@
<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

@ -1,61 +0,0 @@
<!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

@ -37,7 +37,6 @@
<tr> <tr>
<th class="text-start" scope="col" th:text="#{pedido.table.id}">Num. Pedido</th> <th class="text-start" scope="col" th:text="#{pedido.table.id}">Num. Pedido</th>
<th class="text-start" scope="col" th:text="#{pedido.table.fecha}">Fecha</th> <th class="text-start" scope="col" th:text="#{pedido.table.fecha}">Fecha</th>
<th class="text-start" scope="col" th:text="#{pedido.table.titulos}">Títulos</th>
<th class="text-start" scope="col" th:text="#{pedido.table.importe}">Importe</th> <th class="text-start" scope="col" th:text="#{pedido.table.importe}">Importe</th>
<th class="text-start" scope="col" th:text="#{pedido.table.estado}">Estado</th> <th class="text-start" scope="col" th:text="#{pedido.table.estado}">Estado</th>
<th class="text-start" scope="col" th:text="#{pedido.table.acciones}">Acciones</th> <th class="text-start" scope="col" th:text="#{pedido.table.acciones}">Acciones</th>
@ -45,7 +44,6 @@
<tr> <tr>
<th><input type="text" class="form-control form-control-sm input-filter" data-col="id" /></th> <th><input type="text" class="form-control form-control-sm input-filter" data-col="id" /></th>
<th></th> <th></th>
<th><input type="text" class="form-control form-control-sm input-filter" data-col="titulos" /></th>
<th></th> <th></th>
<th> <th>
<select class="form-select form-select-sm input-filter" data-col="estado"> <select class="form-select form-select-sm input-filter" data-col="estado">

View File

@ -38,7 +38,6 @@
<th class="text-start" scope="col" th:text="#{pedido.table.id}">Num. Pedido</th> <th class="text-start" scope="col" th:text="#{pedido.table.id}">Num. Pedido</th>
<th class="text-start" scope="col" th:text="#{pedido.table.cliente}">Cliente</th> <th class="text-start" scope="col" th:text="#{pedido.table.cliente}">Cliente</th>
<th class="text-start" scope="col" th:text="#{pedido.table.fecha}">Fecha</th> <th class="text-start" scope="col" th:text="#{pedido.table.fecha}">Fecha</th>
<th class="text-start" scope="col" th:text="#{pedido.table.titulos}">Títulos</th>
<th class="text-start" scope="col" th:text="#{pedido.table.importe}">Importe</th> <th class="text-start" scope="col" th:text="#{pedido.table.importe}">Importe</th>
<th class="text-start" scope="col" th:text="#{pedido.table.estado}">Estado</th> <th class="text-start" scope="col" th:text="#{pedido.table.estado}">Estado</th>
<th class="text-start" scope="col" th:text="#{pedido.table.acciones}">Acciones</th> <th class="text-start" scope="col" th:text="#{pedido.table.acciones}">Acciones</th>
@ -47,7 +46,6 @@
<th><input type="text" class="form-control form-control-sm input-filter" data-col="id" /></th> <th><input type="text" class="form-control form-control-sm input-filter" data-col="id" /></th>
<th><input type="text" class="form-control form-control-sm input-filter" data-col="createdBy.fullName" /></th> <th><input type="text" class="form-control form-control-sm input-filter" data-col="createdBy.fullName" /></th>
<th></th> <th></th>
<th><input type="text" class="form-control form-control-sm input-filter" data-col="titulos" /></th>
<th></th> <th></th>
<th> <th>
<select class="form-select form-select-sm input-filter" data-col="estado"> <select class="form-select form-select-sm input-filter" data-col="estado">

View File

@ -302,6 +302,19 @@
</label> </label>
</div> </div>
</div> </div>
<div class="row justify-content-center mb-2">
<div class="col-sm-3 justify-content-center">
<label for="entregaTipo" class="form-label mt-2"
th:text="#{presupuesto.entrega}">Entrega</label>
<select class="form-select select2 datos-generales-data" id="entregaTipo" name="entregaTipo">
<option selected value="peninsula" th:text="#{presupuesto.entrega.peninsula}">Península
y
Baleares</option>
<option value="canarias" th:text="#{presupuesto.entrega.canarias}">Canarias</option>
<option value="paises_ue" th:text="#{presupuesto.entrega.paises-ue}">Países UE</option>
</select>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -16,19 +16,8 @@
<div class="col-9 mx-auto mt-4"> <div class="col-9 mx-auto mt-4">
<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,40 +44,18 @@
<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}"> <h4 id="titulo" class="card-title mb-0 text-uppercase" th:text="${resumen.titulo}">Resumen del
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}" <h6 th:text="#{presupuesto.reimpresion}" class="bg-danger py-2 text-center text-white text-uppercase">REIMPRESION</h6>
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">
@ -229,7 +207,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -256,8 +234,6 @@
<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>