From 030e8af3d3bd5ff1914f4ba95105123906f31132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Wed, 10 Sep 2025 12:17:24 +0200 Subject: [PATCH 1/3] hecho el backed del presupuesto maquetacion --- .../erp/presupuesto/Presupuesto.java | 19 +++- .../erp/presupuesto/PresupuestoService.java | 105 +++++++++++++++++- .../classes/PresupuestoMaquetacion.java | 78 +++++++++++++ .../maquetacion/MaquetacionMatrices.java | 44 ++++++++ .../MaquetacionMatricesRepository.java | 14 +++ .../maquetacion/MaquetacionPrecios.java | 30 +++++ .../MaquetacionPreciosRepository.java | 10 ++ src/main/resources/application.properties | 7 +- .../erp/presupuestoMaquetacionTest.java | 49 ++++++++ 9 files changed, 350 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java create mode 100644 src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatrices.java create mode 100644 src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatricesRepository.java create mode 100644 src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPrecios.java create mode 100644 src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPreciosRepository.java create mode 100644 src/test/java/com/imprimelibros/erp/presupuestoMaquetacionTest.java diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java index 19aa0b8..83cb397 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java @@ -171,6 +171,12 @@ public class Presupuesto implements Cloneable{ @Column(name = "alto_faja") private Integer altoFaja = 0; + @Column(name = "presupuesto_maquetacion") + private Boolean presupuestoMaquetacion = false; + @Column(name = "presupuesto_maquetacion_data") + private String presupuestoMaquetacionData; + + // Getters y Setters public String getAutor() { return autor; @@ -512,5 +518,16 @@ public class Presupuesto implements Cloneable{ this.selectedTirada = selectedTirada; } - + public Boolean getPresupuestoMaquetacion() { + return presupuestoMaquetacion; + } + public void setPresupuestoMaquetacion(Boolean presupuestoMaquetacion) { + this.presupuestoMaquetacion = presupuestoMaquetacion; + } + public String getPresupuestoMaquetacionData() { + return presupuestoMaquetacionData; + } + public void setPresupuestoMaquetacionData(String presupuestoMaquetacionData) { + this.presupuestoMaquetacionData = presupuestoMaquetacionData; + } } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java index ae18f25..a3f0949 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java @@ -12,16 +12,24 @@ import java.text.NumberFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; + +import java.math.BigDecimal; +import java.math.RoundingMode; + import com.imprimelibros.erp.configurationERP.VariableService; import com.imprimelibros.erp.presupuesto.Presupuesto.TipoCubierta; import com.imprimelibros.erp.presupuesto.classes.ImagenPresupuesto; import com.imprimelibros.erp.presupuesto.classes.PresupuestadorItems; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionPrecios; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionPreciosRepository; +import com.imprimelibros.erp.presupuesto.classes.PresupuestoMaquetacion; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatrices; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatricesRepository; import com.imprimelibros.erp.externalApi.skApiClient; @Service @@ -36,6 +44,12 @@ public class PresupuestoService { @Autowired protected skApiClient skApiClient; + @Autowired + protected MaquetacionPreciosRepository maquetacionPreciosRepository; + + @Autowired + protected MaquetacionMatricesRepository maquetacionMatricesRepository; + private final PresupuestadorItems presupuestadorItems; public PresupuestoService(PresupuestadorItems presupuestadorItems) { @@ -516,7 +530,7 @@ public class PresupuestoService { put("id", "ejemplar-prueba"); put("title", messageSource.getMessage("presupuesto.extras-ejemplar-prueba", null, locale)); put("description", ""); - if(price_prototipo == 0.0) { + if (price_prototipo == 0.0) { put("price", messageSource.getMessage("presupuesto.consultar-soporte", null, locale)); put("priceUnit", ""); } else { @@ -578,4 +592,91 @@ public class PresupuestoService { } return price_prototipo; } + + public HashMap getPrecioMaquetacion(Presupuesto presupuesto) { + try { + if (Boolean.TRUE.equals(presupuesto.getPresupuestoMaquetacion()) + && presupuesto.getPresupuestoMaquetacionData() != null + && !presupuesto.getPresupuestoMaquetacionData().equals("{}")) { + + String jsonData = presupuesto.getPresupuestoMaquetacionData(); + ObjectMapper objectMapper = new ObjectMapper(); + PresupuestoMaquetacion pm = objectMapper.readValue(jsonData, PresupuestoMaquetacion.class); + List lista = maquetacionPreciosRepository.findAll(); + + // helper para obtener un precio por clave + java.util.function.Function price = key -> lista.stream() + .filter(p -> key.equals(p.getKey())) + .map(MaquetacionPrecios::getValue) + .findFirst() + .orElse(0.0); + + BigDecimal precio = BigDecimal.ZERO; + + // millar_maquetacion * (numCaracteres / 1000.0) + BigDecimal millares = BigDecimal.valueOf(pm.getNumCaracteres()).divide(BigDecimal.valueOf(1000), 6, + RoundingMode.HALF_UP); + precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("millar_maquetacion")))); + + // Numero de paginas estimado + int numPaginas = 0; + Integer matricesPorPagina = maquetacionMatricesRepository.findMatrices( + MaquetacionMatrices.Formato.valueOf(pm.getFormato()), + MaquetacionMatrices.FontSize.valueOf(pm.getFontSize())); + if (matricesPorPagina != null && matricesPorPagina > 0) { + numPaginas = pm.getNumCaracteres() / matricesPorPagina; + } + // Precio por pagina estimado + BigDecimal precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); + double precioPaginaEstimado = 0.0; + if (numPaginas > 0) { + precioPaginaEstimado = precioRedondeado + .divide(BigDecimal.valueOf(numPaginas), 2, RoundingMode.HALF_UP) + .doubleValue(); + } + + // tabla, columna, foto + precio = precio + .add(BigDecimal.valueOf(pm.getNumTablas()).multiply(BigDecimal.valueOf(price.apply("tabla")))); + precio = precio.add( + BigDecimal.valueOf(pm.getNumColumnas()).multiply(BigDecimal.valueOf(price.apply("columnas")))); + precio = precio + .add(BigDecimal.valueOf(pm.getNumFotos()).multiply(BigDecimal.valueOf(price.apply("foto")))); + + if (pm.isCorreccionOrtotipografica()) { + precio = precio + .add(millares.multiply(BigDecimal.valueOf(price.apply("correccion_ortotipografica")))); + } + if (pm.isTextoMecanografiado()) { + precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("mecanoescritura_por_millar")))); + } + if (pm.isDisenioPortada()) { + precio = precio.add(BigDecimal.valueOf(price.apply("disenio_portada"))); + } + if (pm.isEpub()) { + precio = precio.add(BigDecimal.valueOf(price.apply("epub"))); + } + + // redondeo final + precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); + + HashMap out = new HashMap<>(); + out.put("precio", precioRedondeado.doubleValue()); + out.put("numPaginasEstimadas", numPaginas); + out.put("precioPaginaEstimado", precioPaginaEstimado); + return out; + } + } catch (JsonProcessingException e) { + System.out.println("Error procesando JSON de presupuesto maquetacion: " + e.getMessage()); + } catch (Exception e) { + System.out.println("Error procesando presupuesto maquetacion: " + e.getMessage()); + } + + HashMap out = new HashMap<>(); + out.put("precio", 0.0); + out.put("numPaginasEstimadas", 0); + out.put("precioPaginaEstimado", 0.0); + return out; + } + } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java b/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java new file mode 100644 index 0000000..2e77e0b --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java @@ -0,0 +1,78 @@ +package com.imprimelibros.erp.presupuesto.classes; + +public class PresupuestoMaquetacion { + + private int numCaracteres; + private String formato; + private String fontSize; + private int numTablas; + private int numColumnas; + private int numFotos; + private boolean correccionOrtotipografica; + private boolean textoMecanografiado; + private boolean disenioPortada; + private boolean epub; + + public int getNumCaracteres() { + return numCaracteres; + } + public void setNumCaracteres(int numCaracteres) { + this.numCaracteres = numCaracteres; + } + public String getFormato() { + return formato; + } + public void setFormato(String formato) { + this.formato = formato; + } + public String getFontSize() { + return fontSize; + } + public void setFontSize(String fontSize) { + this.fontSize = fontSize; + } + public int getNumTablas() { + return numTablas; + } + public void setNumTablas(int numTablas) { + this.numTablas = numTablas; + } + public int getNumColumnas() { + return numColumnas; + } + public void setNumColumnas(int numColumnas) { + this.numColumnas = numColumnas; + } + public int getNumFotos() { + return numFotos; + } + public void setNumFotos(int numFotos) { + this.numFotos = numFotos; + } + public boolean isCorreccionOrtotipografica() { + return correccionOrtotipografica; + } + public void setCorreccionOrtotipografica(boolean correccionOrtotipografica) { + this.correccionOrtotipografica = correccionOrtotipografica; + } + public boolean isTextoMecanografiado() { + return textoMecanografiado; + } + public void setTextoMecanografiado(boolean textoMecanografiado) { + this.textoMecanografiado = textoMecanografiado; + } + public boolean isDisenioPortada() { + return disenioPortada; + } + public void setDisenioPortada(boolean disenioPortada) { + this.disenioPortada = disenioPortada; + } + public boolean isEpub() { + return epub; + } + public void setEpub(boolean epub) { + this.epub = epub; + } + + +} diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatrices.java b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatrices.java new file mode 100644 index 0000000..e826b08 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatrices.java @@ -0,0 +1,44 @@ +package com.imprimelibros.erp.presupuesto.maquetacion; + +import jakarta.persistence.*; + +@Entity +@Table(name = "maquetacion_matrices_formato") +public class MaquetacionMatrices { + + public enum Formato{ + A5, _17x24_, A4 + } + + public enum FontSize{ + small, medium, big + } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + private Formato formato; + + @Enumerated(EnumType.STRING) + private FontSize tamanio_letra; + + private int matrices_pagina; + + public Long getId() { + return id; + } + + public Formato getFormato() { + return formato; + } + + public FontSize getTamanioLetra() { + return tamanio_letra; + } + + public int getMatricesPagina() { + return matrices_pagina; + } +} diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatricesRepository.java b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatricesRepository.java new file mode 100644 index 0000000..eef7dc4 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionMatricesRepository.java @@ -0,0 +1,14 @@ +package com.imprimelibros.erp.presupuesto.maquetacion; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +@Repository +public interface MaquetacionMatricesRepository extends JpaRepository { + + @Query("SELECT m.matrices_pagina FROM MaquetacionMatrices m WHERE m.formato = :formato AND m.tamanio_letra = :tamanioLetra") + Integer findMatrices(@Param("formato") MaquetacionMatrices.Formato formato, + @Param("tamanioLetra") MaquetacionMatrices.FontSize tamanioLetra); +} diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPrecios.java b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPrecios.java new file mode 100644 index 0000000..7ad21ed --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPrecios.java @@ -0,0 +1,30 @@ +package com.imprimelibros.erp.presupuesto.maquetacion; + +import jakarta.persistence.*; + +@Entity +@Table(name = "maquetacion_precios") +public class MaquetacionPrecios { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "keyword") + private String key; + + @Column(name = "value") + private Double value; + + public Long getId() { + return id; + } + + public String getKey() { + return key; + } + + public Double getValue() { + return value; + } +} diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPreciosRepository.java b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPreciosRepository.java new file mode 100644 index 0000000..a05f1c6 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/presupuesto/maquetacion/MaquetacionPreciosRepository.java @@ -0,0 +1,10 @@ +package com.imprimelibros.erp.presupuesto.maquetacion; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MaquetacionPreciosRepository extends JpaRepository { + + MaquetacionPrecios findByKey(String key); +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a7df1b0..8ace703 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,13 +4,14 @@ logging.level.org.springframework.security=DEBUG logging.level.root=WARN logging.level.org.springframework=ERROR -spring.datasource.url=jdbc:mysql://127.0.0.1:3309/imprimelibros?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Europe/Madrid&characterEncoding=utf8 +spring.datasource.url=jdbc:mysql://localhost:3309/imprimelibros +#spring.datasource.url=jdbc:mysql://127.0.0.1:3309/imprimelibros?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Europe/Madrid&characterEncoding=utf8 spring.datasource.username=imprimelibros_user spring.datasource.password=om91irrDctd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -#safekat.api.url=http://localhost:8000/ -safekat.api.url=https://erp-dev.safekat.es/ +safekat.api.url=http://localhost:8000/ +#safekat.api.url=https://erp-dev.safekat.es/ safekat.api.email=imnavajas@coit.es safekat.api.password=Safekat2024 diff --git a/src/test/java/com/imprimelibros/erp/presupuestoMaquetacionTest.java b/src/test/java/com/imprimelibros/erp/presupuestoMaquetacionTest.java new file mode 100644 index 0000000..baea119 --- /dev/null +++ b/src/test/java/com/imprimelibros/erp/presupuestoMaquetacionTest.java @@ -0,0 +1,49 @@ +package com.imprimelibros.erp; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.imprimelibros.erp.presupuesto.PresupuestoService; +import com.imprimelibros.erp.presupuesto.Presupuesto; + +@SpringBootTest +class presupuestoMaquetacionTest { + + @Autowired + protected PresupuestoService presupuestoService; + + private static final Logger log = LoggerFactory.getLogger(presupuestoMaquetacionTest.class); + + @Test + void testCalculoMaquetacion() { + String resultado = this.test(); + + System.out.println("📦 Resultado:"); + System.out.println(resultado); + log.info("📦 Resultado: {}", resultado); + + assertNotNull(resultado, "El resultado no debe ser null"); + assertTrue(resultado.trim().startsWith("{"), "El resultado debe comenzar con { (JSON)"); + assertTrue(resultado.trim().endsWith("}"), "El resultado debe terminar con } (JSON)"); + } + + public String test() { + + Presupuesto presupuesto = new Presupuesto(); + presupuesto.setPresupuestoMaquetacion(true); + presupuesto.setPresupuestoMaquetacionData( + "{\"numCaracteres\":200000,\"formato\":\"A5\",\"fontSize\":\"medium\",\"numTablas\":5,\"numColumnas\":1,\"numFotos\":10,\"correccionOrtotipografica\":true,\"textoMecanografiado\":false,\"disenioPortada\":true,\"epub\":true}"); + + Map resultado = presupuestoService.getPrecioMaquetacion(presupuesto); + return resultado.toString(); + } + +} From 6a9c197a0255f545bfddde87422b713021fab578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Wed, 10 Sep 2025 22:44:00 +0200 Subject: [PATCH 2/3] falta procesar el resultado --- .../erp/config/SecurityConfig.java | 1 - .../presupuesto/PresupuestoController.java | 31 ++++- .../erp/presupuesto/PresupuestoService.java | 129 ++++++++---------- .../classes/PresupuestoMaquetacion.java | 35 ++--- .../resources/i18n/presupuesto_es.properties | 23 +++- .../presupuestador/presupuesto-maquetacion.js | 29 ++++ .../presupuestador/service-option-card.js | 2 +- .../templates/imprimelibros/home.html | 1 + .../imprimelibros/partials/modal-form.html | 15 ++ .../presupuestos/presupuestador.html | 8 ++ .../presupuesto-maquetacion-form.html | 73 ++++++++++ .../erp/presupuestoMaquetacionTest.java | 5 +- 12 files changed, 259 insertions(+), 93 deletions(-) create mode 100644 src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js create mode 100644 src/main/resources/templates/imprimelibros/partials/modal-form.html create mode 100644 src/main/resources/templates/imprimelibros/presupuestos/presupuesto-maquetacion-form.html diff --git a/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java b/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java index 09f52a9..01a7cdc 100644 --- a/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java +++ b/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java @@ -4,7 +4,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration public class SecurityConfig { diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java index 926ea81..f6b172a 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java @@ -1,6 +1,7 @@ package com.imprimelibros.erp.presupuesto; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import java.util.HashMap; import java.util.Locale; @@ -14,16 +15,19 @@ import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.http.MediaType; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import com.imprimelibros.erp.externalApi.skApiClient; import com.imprimelibros.erp.presupuesto.classes.ImagenPresupuesto; +import com.imprimelibros.erp.presupuesto.classes.PresupuestoMaquetacion; import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups; -@RestController +@Controller @RequestMapping("/presupuesto") public class PresupuestoController { @@ -89,8 +93,9 @@ public class PresupuestoController { @PostMapping("/public/validar/cubierta") public ResponseEntity validarCubierta( @Validated(PresupuestoValidationGroups.Cubierta.class) Presupuesto presupuesto, + BindingResult result, @RequestParam(name = "calcular", defaultValue = "true") boolean calcular, - BindingResult result, Locale locale) { + Locale locale) { Map errores = new HashMap<>(); @@ -301,4 +306,24 @@ public class PresupuestoController { return ResponseEntity.ok(price); } + + @GetMapping(value="/public/maquetacion/form", produces = MediaType.TEXT_HTML_VALUE) + public String getMaquetacionForm(Model model) { + model.addAttribute("presupuestoMaquetacion", new PresupuestoMaquetacion()); + return "imprimelibros/presupuestos/presupuesto-maquetacion-form :: maquetacionForm"; + } + + + @GetMapping("/public/maquetacion") + public ResponseEntity getPresupuestoMaquetacion( + PresupuestoMaquetacion presupuestoMaquetacion, + Model model, Locale locale) { + Map resultado = presupuestoService.getPrecioMaquetacion(presupuestoMaquetacion); + if((Double)resultado.get("precio") == 0.0 && (Integer)resultado.get("numPaginasEstimadas") == 0 + && (Double)resultado.get("precioPaginaEstimado") == 0.0){ + return ResponseEntity.badRequest().body(messageSource.getMessage("presupuesto.errores.presupuesto-maquetacion", null, locale)); + } + return ResponseEntity.ok(resultado); + } + } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java index a3f0949..b8ccddc 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoService.java @@ -593,81 +593,72 @@ public class PresupuestoService { return price_prototipo; } - public HashMap getPrecioMaquetacion(Presupuesto presupuesto) { + public HashMap getPrecioMaquetacion(PresupuestoMaquetacion presupuestoMaquetacion) { try { - if (Boolean.TRUE.equals(presupuesto.getPresupuestoMaquetacion()) - && presupuesto.getPresupuestoMaquetacionData() != null - && !presupuesto.getPresupuestoMaquetacionData().equals("{}")) { + List lista = maquetacionPreciosRepository.findAll(); - String jsonData = presupuesto.getPresupuestoMaquetacionData(); - ObjectMapper objectMapper = new ObjectMapper(); - PresupuestoMaquetacion pm = objectMapper.readValue(jsonData, PresupuestoMaquetacion.class); - List lista = maquetacionPreciosRepository.findAll(); + // helper para obtener un precio por clave + java.util.function.Function price = key -> lista.stream() + .filter(p -> key.equals(p.getKey())) + .map(MaquetacionPrecios::getValue) + .findFirst() + .orElse(0.0); - // helper para obtener un precio por clave - java.util.function.Function price = key -> lista.stream() - .filter(p -> key.equals(p.getKey())) - .map(MaquetacionPrecios::getValue) - .findFirst() - .orElse(0.0); + BigDecimal precio = BigDecimal.ZERO; - BigDecimal precio = BigDecimal.ZERO; + // millar_maquetacion * (numCaracteres / 1000.0) + BigDecimal millares = BigDecimal.valueOf(presupuestoMaquetacion.getNumCaracteres()).divide(BigDecimal.valueOf(1000), 6, + RoundingMode.HALF_UP); + precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("millar_maquetacion")))); - // millar_maquetacion * (numCaracteres / 1000.0) - BigDecimal millares = BigDecimal.valueOf(pm.getNumCaracteres()).divide(BigDecimal.valueOf(1000), 6, - RoundingMode.HALF_UP); - precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("millar_maquetacion")))); - - // Numero de paginas estimado - int numPaginas = 0; - Integer matricesPorPagina = maquetacionMatricesRepository.findMatrices( - MaquetacionMatrices.Formato.valueOf(pm.getFormato()), - MaquetacionMatrices.FontSize.valueOf(pm.getFontSize())); - if (matricesPorPagina != null && matricesPorPagina > 0) { - numPaginas = pm.getNumCaracteres() / matricesPorPagina; - } - // Precio por pagina estimado - BigDecimal precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); - double precioPaginaEstimado = 0.0; - if (numPaginas > 0) { - precioPaginaEstimado = precioRedondeado - .divide(BigDecimal.valueOf(numPaginas), 2, RoundingMode.HALF_UP) - .doubleValue(); - } - - // tabla, columna, foto - precio = precio - .add(BigDecimal.valueOf(pm.getNumTablas()).multiply(BigDecimal.valueOf(price.apply("tabla")))); - precio = precio.add( - BigDecimal.valueOf(pm.getNumColumnas()).multiply(BigDecimal.valueOf(price.apply("columnas")))); - precio = precio - .add(BigDecimal.valueOf(pm.getNumFotos()).multiply(BigDecimal.valueOf(price.apply("foto")))); - - if (pm.isCorreccionOrtotipografica()) { - precio = precio - .add(millares.multiply(BigDecimal.valueOf(price.apply("correccion_ortotipografica")))); - } - if (pm.isTextoMecanografiado()) { - precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("mecanoescritura_por_millar")))); - } - if (pm.isDisenioPortada()) { - precio = precio.add(BigDecimal.valueOf(price.apply("disenio_portada"))); - } - if (pm.isEpub()) { - precio = precio.add(BigDecimal.valueOf(price.apply("epub"))); - } - - // redondeo final - precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); - - HashMap out = new HashMap<>(); - out.put("precio", precioRedondeado.doubleValue()); - out.put("numPaginasEstimadas", numPaginas); - out.put("precioPaginaEstimado", precioPaginaEstimado); - return out; + // Numero de paginas estimado + int numPaginas = 0; + Integer matricesPorPagina = maquetacionMatricesRepository.findMatrices( + presupuestoMaquetacion.getFormato(), + presupuestoMaquetacion.getCuerpoTexto()); + if (matricesPorPagina != null && matricesPorPagina > 0) { + numPaginas = presupuestoMaquetacion.getNumCaracteres() / matricesPorPagina; } - } catch (JsonProcessingException e) { - System.out.println("Error procesando JSON de presupuesto maquetacion: " + e.getMessage()); + // Precio por pagina estimado + BigDecimal precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); + double precioPaginaEstimado = 0.0; + if (numPaginas > 0) { + precioPaginaEstimado = precioRedondeado + .divide(BigDecimal.valueOf(numPaginas), 2, RoundingMode.HALF_UP) + .doubleValue(); + } + + // tabla, columna, foto + precio = precio + .add(BigDecimal.valueOf(presupuestoMaquetacion.getNumTablas()).multiply(BigDecimal.valueOf(price.apply("tabla")))); + precio = precio.add( + BigDecimal.valueOf(presupuestoMaquetacion.getNumColumnas()).multiply(BigDecimal.valueOf(price.apply("columnas")))); + precio = precio + .add(BigDecimal.valueOf(presupuestoMaquetacion.getNumFotos()).multiply(BigDecimal.valueOf(price.apply("foto")))); + + if (presupuestoMaquetacion.isCorreccionOrtotipografica()) { + precio = precio + .add(millares.multiply(BigDecimal.valueOf(price.apply("correccion_ortotipografica")))); + } + if (presupuestoMaquetacion.isTextoMecanografiado()) { + precio = precio.add(millares.multiply(BigDecimal.valueOf(price.apply("mecanoescritura_por_millar")))); + } + if (presupuestoMaquetacion.isDisenioPortada()) { + precio = precio.add(BigDecimal.valueOf(price.apply("disenio_portada"))); + } + if (presupuestoMaquetacion.isEpub()) { + precio = precio.add(BigDecimal.valueOf(price.apply("epub"))); + } + + // redondeo final + precioRedondeado = precio.setScale(2, RoundingMode.HALF_UP); + + HashMap out = new HashMap<>(); + out.put("precio", precioRedondeado.doubleValue()); + out.put("numPaginasEstimadas", numPaginas); + out.put("precioPaginaEstimado", precioPaginaEstimado); + return out; + } catch (Exception e) { System.out.println("Error procesando presupuesto maquetacion: " + e.getMessage()); } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java b/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java index 2e77e0b..a2e8568 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/classes/PresupuestoMaquetacion.java @@ -1,17 +1,20 @@ package com.imprimelibros.erp.presupuesto.classes; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatrices.FontSize; +import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatrices.Formato;; + public class PresupuestoMaquetacion { - private int numCaracteres; - private String formato; - private String fontSize; - private int numTablas; - private int numColumnas; - private int numFotos; - private boolean correccionOrtotipografica; - private boolean textoMecanografiado; - private boolean disenioPortada; - private boolean epub; + private int numCaracteres = 200000; + private Formato formato = Formato.A5; + private FontSize cuerpoTexto = FontSize.medium; + private int numTablas = 0; + private int numColumnas = 1; + private int numFotos = 0; + private boolean correccionOrtotipografica = false; + private boolean textoMecanografiado = false; + private boolean disenioPortada = false; + private boolean epub = false; public int getNumCaracteres() { return numCaracteres; @@ -19,17 +22,17 @@ public class PresupuestoMaquetacion { public void setNumCaracteres(int numCaracteres) { this.numCaracteres = numCaracteres; } - public String getFormato() { + public Formato getFormato() { return formato; } - public void setFormato(String formato) { + public void setFormato(Formato formato) { this.formato = formato; } - public String getFontSize() { - return fontSize; + public FontSize getCuerpoTexto() { + return cuerpoTexto; } - public void setFontSize(String fontSize) { - this.fontSize = fontSize; + public void setCuerpoTexto(FontSize cuerpoTexto) { + this.cuerpoTexto = cuerpoTexto; } public int getNumTablas() { return numTablas; diff --git a/src/main/resources/i18n/presupuesto_es.properties b/src/main/resources/i18n/presupuesto_es.properties index 9998bda..521d2e1 100644 --- a/src/main/resources/i18n/presupuesto_es.properties +++ b/src/main/resources/i18n/presupuesto_es.properties @@ -160,6 +160,25 @@ presupuesto.paginas=Páginas presupuesto.solapas=Solapas presupuesto.papel-gramaje=Papel y gramaje +presupuesto.maquetacion=Presupuesto de maquetación +presupuesto.maquetacion.num-caracteres=Número de caracteres +presupuesto.maquetacion.num-caracteres-descripcion=Caracteres con espacios (obtenidos desde Word) +presupuesto.maquetacion.formato=Formato +presupuesto.maquetacion.formato-descripcion=Seleccione el tamaño que más se aproxime +presupuesto.maquetacion.cuerpo-texto=Cuerpo de texto +presupuesto.maquetacion.cuerpo-texto-pequeño=Pequeño +presupuesto.maquetacion.cuerpo-texto-medio=Medio (12pt) +presupuesto.maquetacion.cuerpo-texto-grande=Grande +presupuesto.maquetacion.cuerpo-texto-descripcion=Tamaño de letra usado (medio=12pt) +presupuesto.maquetacion.num-columnas=Número de columnas +presupuesto.maquetacion.num-columnas-descripcion=Número de columnas en las que se quiere maquetar el libro +presupuesto.maquetacion.num-fotos=Número total imágenes/figuras +presupuesto.maquetacion.num-tablas=Número de tablas +presupuesto.maquetacion.correccion-ortotipografica=Corrección ortotipográfica +presupuesto.maquetacion.texto-mecanografiado=Texto mecanografiado +presupuesto.maquetacion.diseno-portada=Diseño de portada +presupuesto.maquetacion.epub=Generación Epub + # Errores presupuesto.errores-title=Corrija los siguientes errores: presupuesto.errores.titulo=El título es obligatorio @@ -181,4 +200,6 @@ presupuesto.errores.tipo-cubierta=Seleccione el tipo de cubierta presupuesto.errores.solapas-cubierta=Seleccione si desea o no solapas en la cubierta presupuesto.errores.papel-cubierta=Seleccione el tipo de papel para la cubierta presupuesto.errores.gramaje-cubierta=Seleccione el gramaje del papel para la cubierta -presupuesto.errores.acabado-cubierta=Seleccione el acabado de la cubierta \ No newline at end of file +presupuesto.errores.acabado-cubierta=Seleccione el acabado de la cubierta + +presupuesto.errores.presupuesto-maquetacion=No se pudo calcular el presupuesto de maquetación. \ No newline at end of file diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js new file mode 100644 index 0000000..e4a02f4 --- /dev/null +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/presupuesto-maquetacion.js @@ -0,0 +1,29 @@ +$(document).on('click', '#maquetacion', function (e) { + e.preventDefault(); + $.get("/presupuesto/public/maquetacion/form", function (data) { + $("#maquetacionModalBody").html(data); + $("#maquetacionModal").modal("show"); + }); +}); + +$(document).on("submit", "#maquetacionForm", function (e) { + e.preventDefault(); + + const $form = $(this); + + $.ajax({ + url: $form.attr("action"), + type: $form.attr("method"), + data: $form.serialize(), + success: function (data) { + // obtener el json devuelto + const json = JSON.parse(data); + + }, + error: function (xhr, status, error) { + $("#maquetacionModalBody").html( + "
" + xhr.responseText + "
" + ); + } + }); +}); \ No newline at end of file diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/service-option-card.js b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/service-option-card.js index e6d7bc9..d9416f0 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/service-option-card.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/presupuestador/service-option-card.js @@ -18,7 +18,7 @@ class ServiceOptionCard { : ''; const $card = $(`
- +