diff --git a/src/main/java/com/imprimelibros/erp/cart/CartController.java b/src/main/java/com/imprimelibros/erp/cart/CartController.java index 5fa7504..b0a28b7 100644 --- a/src/main/java/com/imprimelibros/erp/cart/CartController.java +++ b/src/main/java/com/imprimelibros/erp/cart/CartController.java @@ -80,7 +80,7 @@ public class CartController { else if (direcciones != null && direcciones.containsKey("direcciones")) model.addAttribute("direcciones", direcciones.get("direcciones")); - var summary = service.getCartSummary(cart, locale); + var summary = service.getCartSummary(cart, locale, true); model.addAttribute("cartSummary", summary); if (summary.get("errorShipmentCost") != null && (Boolean) summary.get("errorShipmentCost")) model.addAttribute("errorEnvio", true); @@ -165,7 +165,7 @@ public class CartController { try { service.updateCart(id, updateRequest); - var cartSummary = service.getCartSummary(service.getCartById(id), locale); + var cartSummary = service.getCartSummary(service.getCartById(id), locale, true); model.addAttribute("cartSummary", cartSummary); return "imprimelibros/cart/_cartSummary :: cartSummary(summary=${cartSummary})"; diff --git a/src/main/java/com/imprimelibros/erp/cart/CartService.java b/src/main/java/com/imprimelibros/erp/cart/CartService.java index 83f1848..6443f28 100644 --- a/src/main/java/com/imprimelibros/erp/cart/CartService.java +++ b/src/main/java/com/imprimelibros/erp/cart/CartService.java @@ -163,7 +163,7 @@ public class CartService { return itemRepo.findByCartId(cart.getId()).size(); } - public Map getCartSummaryRaw(Cart cart, Locale locale) { + public Map getCartSummaryRaw(Cart cart, Locale locale, Boolean hasTaxes) { double base = 0.0; double iva4 = 0.0; @@ -269,6 +269,11 @@ public class CartService { } } + if(!hasTaxes) { + iva4 = 0.0; + iva21 = 0.0; + } + double totalBeforeDiscount = base + iva4 + iva21 + shipment; int fidelizacion = this.getDescuentoFidelizacion(cart.getUserId()); double descuento = totalBeforeDiscount * fidelizacion / 100.0; @@ -318,8 +323,8 @@ public class CartService { return 0; } - public Map getCartSummary(Cart cart, Locale locale) { - Map raw = getCartSummaryRaw(cart, locale); + public Map getCartSummary(Cart cart, Locale locale, Boolean hasTaxes) { + Map raw = getCartSummaryRaw(cart, locale, hasTaxes); double base = (Double) raw.get("base"); double iva4 = (Double) raw.get("iva4"); diff --git a/src/main/java/com/imprimelibros/erp/checkout/CheckoutController.java b/src/main/java/com/imprimelibros/erp/checkout/CheckoutController.java index 79a9563..c33ee1d 100644 --- a/src/main/java/com/imprimelibros/erp/checkout/CheckoutController.java +++ b/src/main/java/com/imprimelibros/erp/checkout/CheckoutController.java @@ -22,6 +22,7 @@ import com.imprimelibros.erp.direcciones.DireccionService; import com.imprimelibros.erp.cart.Cart; import com.imprimelibros.erp.cart.CartService; + @Controller @RequestMapping("/checkout") public class CheckoutController { @@ -58,10 +59,25 @@ public class CheckoutController { Long userId = Utils.currentUserId(principal); Cart cart = cartService.getOrCreateActiveCart(userId); - model.addAttribute("summary", cartService.getCartSummary(cart, locale)); + model.addAttribute("summary", cartService.getCartSummary(cart, locale, true)); return "imprimelibros/checkout/checkout"; // crea esta vista si quieres (tabla simple) } + @GetMapping({"/get-summary", "/get-summary/{direccionId}"}) + public String getCheckoutSummary(@PathVariable(required = false) Long direccionId, Principal principal, Model model, Locale locale) { + Long userId = Utils.currentUserId(principal); + Cart cart = cartService.getOrCreateActiveCart(userId); + Boolean hasTaxes = true; + if(direccionId != null) { + hasTaxes = direccionService.hasTaxes(direccionId); + } + Map summary = cartService.getCartSummary(cart, locale, hasTaxes); + model.addAttribute("summary", summary); + + return "imprimelibros/checkout/_summary :: checkoutSummary(summary=${summary})"; + } + + @GetMapping("/get-address/{id}") public String getDireccionCard(@PathVariable Long id, Model model, Locale locale) { Direccion dir = direccionService.findById(id) diff --git a/src/main/java/com/imprimelibros/erp/direcciones/DireccionService.java b/src/main/java/com/imprimelibros/erp/direcciones/DireccionService.java index f74561a..afdc54d 100644 --- a/src/main/java/com/imprimelibros/erp/direcciones/DireccionService.java +++ b/src/main/java/com/imprimelibros/erp/direcciones/DireccionService.java @@ -153,4 +153,26 @@ public class DireccionService { return false; } + public Boolean hasTaxes(Long direccionId) { + if(direccionId == null) { + return true; // Si no hay dirección, asumimos que sí tiene impuestos + } + Optional 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; + } + } + } diff --git a/src/main/java/com/imprimelibros/erp/facturacion/service/FacturacionService.java b/src/main/java/com/imprimelibros/erp/facturacion/service/FacturacionService.java index f7d4e9f..8a50e4f 100644 --- a/src/main/java/com/imprimelibros/erp/facturacion/service/FacturacionService.java +++ b/src/main/java/com/imprimelibros/erp/facturacion/service/FacturacionService.java @@ -8,7 +8,6 @@ import com.imprimelibros.erp.facturacion.dto.FacturaDireccionMapper; import com.imprimelibros.erp.facturacion.dto.FacturaGuardarDto; import com.imprimelibros.erp.facturacion.dto.FacturaLineaUpsertDto; 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.FacturaPagoRepository; import com.imprimelibros.erp.facturacion.repo.FacturaRepository; diff --git a/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java b/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java index 8b22879..4845258 100644 --- a/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java +++ b/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java @@ -1,5 +1,6 @@ package com.imprimelibros.erp.pedidos; +import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDateTime; import java.util.ArrayList; @@ -81,7 +82,8 @@ public class PedidoService { Pedido pedido = new Pedido(); Cart cart = cartService.getCartById(cartId); - Map cartSummaryRaw = cartService.getCartSummaryRaw(cart, Locale.getDefault()); + Boolean hasTaxes = direccionService.hasTaxes(direccionFacturacionId); + Map cartSummaryRaw = cartService.getCartSummaryRaw(cart, Locale.getDefault(), hasTaxes); // Datos económicos (ojo con las claves, son las del summaryRaw) pedido.setBase((Double) cartSummaryRaw.getOrDefault("base", 0.0d)); @@ -137,6 +139,11 @@ public class PedidoService { Presupuesto p = presupuestoRepository.findById(pCart.getId()) .orElseThrow(() -> new IllegalStateException("Presupuesto no encontrado: " + pCart.getId())); p.setEstado(Presupuesto.Estado.aceptado); + if(!hasTaxes){ + p.setIvaImporte21(BigDecimal.ZERO); + p.setIvaImporte4(BigDecimal.ZERO); + p.setTotalConIva(p.getBaseImponible()); + } presupuestoRepository.save(p); PedidoLinea linea = new PedidoLinea(); diff --git a/src/main/java/com/imprimelibros/erp/pedidos/PedidosController.java b/src/main/java/com/imprimelibros/erp/pedidos/PedidosController.java index 1e774fc..442cf50 100644 --- a/src/main/java/com/imprimelibros/erp/pedidos/PedidosController.java +++ b/src/main/java/com/imprimelibros/erp/pedidos/PedidosController.java @@ -29,7 +29,6 @@ import com.imprimelibros.erp.datatables.DataTablesResponse; import com.imprimelibros.erp.facturacion.service.FacturacionService; import com.imprimelibros.erp.i18n.TranslationService; import com.imprimelibros.erp.paises.PaisesService; -import com.imprimelibros.erp.presupuesto.service.PresupuestoService; import com.imprimelibros.erp.users.UserDao; import jakarta.persistence.criteria.Join; @@ -38,14 +37,11 @@ import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; @Controller @RequestMapping("/pedidos") public class PedidosController { - private final PresupuestoService presupuestoService; - private final PedidoRepository repoPedido; private final PedidoService pedidoService; private final UserDao repoUser; @@ -58,7 +54,7 @@ public class PedidosController { public PedidosController(PedidoRepository repoPedido, PedidoService pedidoService, UserDao repoUser, MessageSource messageSource, TranslationService translationService, PedidoLineaRepository repoPedidoLinea, PaisesService paisesService, - FacturacionService facturacionService, PresupuestoService presupuestoService) { + FacturacionService facturacionService) { this.repoPedido = repoPedido; this.pedidoService = pedidoService; this.repoUser = repoUser; @@ -67,7 +63,6 @@ public class PedidosController { this.repoPedidoLinea = repoPedidoLinea; this.paisesService = paisesService; this.facturacionService = facturacionService; - this.presupuestoService = presupuestoService; } @GetMapping diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java b/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java index 132832c..b8408cf 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java @@ -109,21 +109,6 @@ 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 public Presupuesto clone() { @@ -188,10 +173,6 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable { @Column(name = "iva_reducido") private Boolean ivaReducido; - @Column(name = "entrega_tipo") - @Enumerated(EnumType.STRING) - private Entrega entregaTipo; - @Column(name = "iva_importe_4", precision = 12, scale = 2) private BigDecimal ivaImporte4; @@ -531,14 +512,6 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable { this.ivaReducido = ivaReducido; } - public Entrega getEntregaTipo() { - return entregaTipo; - } - - public void setEntregaTipo(Entrega entregaTipo) { - this.entregaTipo = entregaTipo; - } - public BigDecimal getIvaImporte4() { return ivaImporte4; } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java index c7d601e..529980b 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java @@ -37,7 +37,6 @@ public class PresupuestoFormDataMapper { public String paginasColor = ""; public String posicionPaginasColor = ""; public String tipoEncuadernacion = "fresado"; // enum name - public String entregaTipo = "peninsula"; // enum name public boolean ivaReducido = true; } @@ -157,7 +156,6 @@ public class PresupuestoFormDataMapper { vm.datosGenerales.tipoEncuadernacion = enumName(p.getTipoEncuadernacion(), "fresado"); - vm.datosGenerales.entregaTipo = enumName(p.getEntregaTipo(), "peninsula"); vm.datosGenerales.ivaReducido = Boolean.TRUE.equals(p.getIvaReducido()); // ===== Interior diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java index 0afc5ee..a92c8cd 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoService.java @@ -329,7 +329,7 @@ public class PresupuestoService { .filter(Objects::nonNull) .map(tirada -> tirada + 4) .collect(Collectors.toList())); - if(presupuesto.getSelectedTirada() != null) { + if (presupuesto.getSelectedTirada() != null) { presupuesto.setSelectedTirada(presupuesto.getSelectedTirada()); } } else { @@ -337,7 +337,7 @@ public class PresupuestoService { .filter(Objects::nonNull) .collect(Collectors.toList())); } - + body.put("selectedTirada", presupuesto.getSelectedTirada() != null ? presupuesto.getSelectedTirada() : presupuesto.getTirada1()); body.put("tamanio", tamanio); @@ -352,7 +352,7 @@ public class PresupuestoService { body.put("cubierta", cubierta); body.put("guardas", null); // Para las reimpresiones - if(presupuesto.getIsReimpresion() != null && presupuesto.getIsReimpresion()) { + if (presupuesto.getIsReimpresion() != null && presupuesto.getIsReimpresion()) { body.put("reimpresion", 1); body.put("iskn", presupuesto.getProveedorRef1()); } @@ -1124,9 +1124,9 @@ public class PresupuestoService { try { // retractilado: recalcular precio if (s.get("id").equals("retractilado")) { - + String p = obtenerPrecioRetractilado(cantidad); - if(p != null){ + if (p != null) { double precio_retractilado = Double.parseDouble(p); s.put("price", precio_retractilado); } else { @@ -1149,7 +1149,7 @@ public class PresupuestoService { } } try { - if(presupuesto.getSelectedTirada() != null && presupuesto.getSelectedTirada().equals(tirada)) + if (presupuesto.getSelectedTirada() != null && presupuesto.getSelectedTirada().equals(tirada)) presupuesto.setServiciosJson(new ObjectMapper().writeValueAsString(servicios)); } catch (Exception ignore) { System.out.println("Error guardando servicios JSON: " + ignore.getMessage()); @@ -1162,21 +1162,19 @@ public class PresupuestoService { // Si la entrega es en peninsula, se mira el valor del iva // Canarias y paises UE no llevan IVA - if (presupuesto.getEntregaTipo() == Presupuesto.Entrega.peninsula) { - // Si el iva es reducido, el precio de la tirada y el del prototipo llevan IVA - // 4% - if (presupuesto.getIvaReducido()) { - ivaImporte4 = baseImponible.add(serviciosIva4).multiply(BigDecimal.valueOf(4)).divide( - BigDecimal.valueOf(100), 2, - RoundingMode.HALF_UP); - ivaImporte21 = serviciosTotal.subtract(serviciosIva4).multiply(BigDecimal.valueOf(21)).divide( - BigDecimal.valueOf(100), 2, - RoundingMode.HALF_UP); - } else { - ivaImporte21 = baseImponible.add(serviciosTotal).multiply(BigDecimal.valueOf(21)).divide( - BigDecimal.valueOf(100), 2, - RoundingMode.HALF_UP); - } + // Si el iva es reducido, el precio de la tirada y el del prototipo llevan IVA + // 4% + if (presupuesto.getIvaReducido()) { + ivaImporte4 = baseImponible.add(serviciosIva4).multiply(BigDecimal.valueOf(4)).divide( + BigDecimal.valueOf(100), 2, + RoundingMode.HALF_UP); + ivaImporte21 = serviciosTotal.subtract(serviciosIva4).multiply(BigDecimal.valueOf(21)).divide( + BigDecimal.valueOf(100), 2, + RoundingMode.HALF_UP); + } else { + ivaImporte21 = baseImponible.add(serviciosTotal).multiply(BigDecimal.valueOf(21)).divide( + BigDecimal.valueOf(100), 2, + RoundingMode.HALF_UP); } baseImponible = baseImponible.add(serviciosTotal); BigDecimal totalConIva = baseImponible.add(ivaImporte21).add(ivaImporte4); @@ -1332,10 +1330,10 @@ public class PresupuestoService { } return true; } - + public Boolean hasMaquetacion(Presupuesto presupuesto) { if (presupuesto.getServiciosJson() != null && !presupuesto.getServiciosJson().isEmpty()) { - if(presupuesto.getServiciosJson().contains("maquetacion")) { + if (presupuesto.getServiciosJson().contains("maquetacion")) { return true; } } @@ -1474,7 +1472,6 @@ public class PresupuestoService { target.setServiciosTotal(src.getServiciosTotal()); target.setBaseImponible(src.getBaseImponible()); target.setIvaReducido(src.getIvaReducido()); - target.setEntregaTipo(src.getEntregaTipo()); target.setIvaImporte4(src.getIvaImporte4()); target.setIvaImporte21(src.getIvaImporte21()); target.setTotalConIva(src.getTotalConIva()); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f6c8336..3562c23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=erp # Active profile -#spring.profiles.active=local -spring.profiles.active=dev +spring.profiles.active=local +#spring.profiles.active=dev #spring.profiles.active=test #spring.profiles.active=prod diff --git a/src/main/resources/db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml b/src/main/resources/db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml new file mode 100644 index 0000000..e8945a0 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml @@ -0,0 +1,20 @@ +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 diff --git a/src/main/resources/db/changelog/master.yml b/src/main/resources/db/changelog/master.yml index d3b8d6f..975bb53 100644 --- a/src/main/resources/db/changelog/master.yml +++ b/src/main/resources/db/changelog/master.yml @@ -48,4 +48,6 @@ databaseChangeLog: - include: file: db/changelog/changesets/0024-series-facturacion-seeder.yml - include: - file: db/changelog/changesets/0025-create-facturas-direcciones.yml \ No newline at end of file + file: db/changelog/changesets/0025-create-facturas-direcciones.yml + - include: + file: db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/checkout/checkout.js b/src/main/resources/static/assets/js/pages/imprimelibros/checkout/checkout.js index c1ece71..76d9fab 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/checkout/checkout.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/checkout/checkout.js @@ -18,8 +18,8 @@ $(() => { $('#addBillingAddressBtn').on('click', seleccionarDireccionEnvio); - $('#authorization-required').on('change', function () { - if($(this).is(':checked')) { + $(document).on('change', '#authorization-required', function () { + if ($(this).is(':checked')) { if ($('#direccion-div .direccion-card').length > 0) { $('#btn-checkout').prop('disabled', false); } @@ -148,6 +148,23 @@ $(() => { $('#btn-checkout').prop('disabled', false); } hideLoader(); + + if (direccionId) { + $.ajax({ + url: `/checkout/get-summary/${direccionId}`, + type: 'GET', + success: function (response) { + const parent = $('.cart-summary-container').parent(); + $('.cart-summary-container').remove(); + parent.append(response); + $('#dirFactId').val(direccionId); + }, + error: function () { + console.error('Error al actualizar el resumen del carrito.'); + } + }); + } + return true; } hideLoader(); @@ -164,6 +181,18 @@ $(() => { $card.remove(); $('#addBillingAddressBtn').removeClass('d-none'); $('#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(); + parent.append(response); + }, + error: function () { + console.error('Error al actualizar el resumen del carrito.'); + } + }); }); @@ -194,7 +223,7 @@ $(() => { type: 'POST', // PUT simulado via _method data: $form.serialize(), dataType: 'html', - success: function (html) { + success: async function (html) { // Si por cualquier motivo llega 200 con fragmento, lo insertamos igual if (typeof html === 'string' && html.indexOf('id="direccionForm"') !== -1 && html.indexOf(' { } // Éxito real: cerrar y recargar tabla $('#direccionFormModal').modal('hide'); - seleccionarDireccionEnvio(); + await seleccionarDireccionEnvio(); + }, error: function (xhr) { // Con 422 devolvemos el fragmento con errores aquí diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/wizard.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/wizard.js index 026f2eb..7aac975 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/wizard.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/wizard.js @@ -34,7 +34,6 @@ export default class PresupuestoWizard { paginasColor: 0, posicionPaginasColor: '', tipoEncuadernacion: 'fresado', - entregaTipo: 'peninsula', ivaReducido: true, }, interior: { @@ -130,7 +129,6 @@ export default class PresupuestoWizard { this.divPosicionPaginasColor = $('#div-posicion-paginas-color'); this.posicionPaginasColor = $('#posicionPaginasColor'); this.paginas = $('#paginas'); - this.entregaTipo = $('#entregaTipo'); this.ivaReducido = $('#iva-reducido'); this.btnIvaReducidoDetail = $('#btn-iva-reducido-detail'); this.datos_generales_alert = $('#datos-generales-alert'); @@ -666,7 +664,6 @@ export default class PresupuestoWizard { paginasColor: this.paginasColor.val(), posicionPaginasColor: this.posicionPaginasColor.val(), tipoEncuadernacion: $('.tipo-libro input:checked').val() || 'fresado', - entregaTipo: this.entregaTipo.val(), ivaReducido: this.ivaReducido.is(':checked'), }; } @@ -688,7 +685,6 @@ export default class PresupuestoWizard { paginasColor: data.paginasColor, posicionPaginasColor: data.posicionPaginasColor, tipoEncuadernacion: data.tipoEncuadernacion, - entregaTipo: data.entregaTipo, ivaReducido: data.ivaReducido, }; } @@ -736,7 +732,6 @@ export default class PresupuestoWizard { } } - this.entregaTipo.val(this.formData.datosGenerales.entregaTipo); this.ivaReducido.prop('checked', this.formData.datosGenerales.ivaReducido); } diff --git a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_datos-generales.html b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_datos-generales.html index 227b8a1..abde6c7 100644 --- a/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_datos-generales.html +++ b/src/main/resources/templates/imprimelibros/presupuestos/presupuestador-items/_datos-generales.html @@ -302,19 +302,6 @@ -
-
- - -
-