falta procesar el resultado

This commit is contained in:
Jaime Jiménez
2025-09-10 22:44:00 +02:00
parent 030e8af3d3
commit 6a9c197a02
12 changed files with 259 additions and 93 deletions

View File

@ -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 {

View File

@ -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<String, String> 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<String, Object> 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);
}
}

View File

@ -593,81 +593,72 @@ public class PresupuestoService {
return price_prototipo;
}
public HashMap<String, Object> getPrecioMaquetacion(Presupuesto presupuesto) {
public HashMap<String, Object> getPrecioMaquetacion(PresupuestoMaquetacion presupuestoMaquetacion) {
try {
if (Boolean.TRUE.equals(presupuesto.getPresupuestoMaquetacion())
&& presupuesto.getPresupuestoMaquetacionData() != null
&& !presupuesto.getPresupuestoMaquetacionData().equals("{}")) {
List<MaquetacionPrecios> lista = maquetacionPreciosRepository.findAll();
String jsonData = presupuesto.getPresupuestoMaquetacionData();
ObjectMapper objectMapper = new ObjectMapper();
PresupuestoMaquetacion pm = objectMapper.readValue(jsonData, PresupuestoMaquetacion.class);
List<MaquetacionPrecios> lista = maquetacionPreciosRepository.findAll();
// helper para obtener un precio por clave
java.util.function.Function<String, Double> 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<String, Double> 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<String, Object> 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<String, Object> 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());
}

View File

@ -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;