falta el selector de acabados

This commit is contained in:
Jaime Jiménez
2025-09-12 18:58:42 +02:00
parent cc8b30add6
commit 2798316745
11 changed files with 376 additions and 97 deletions

View File

@ -26,6 +26,7 @@ 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.classes.PresupuestoMarcapaginas;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import jakarta.validation.Valid;
@ -344,4 +345,34 @@ public class PresupuestoController {
return ResponseEntity.ok(resultado);
}
@GetMapping(value = "/public/marcapaginas/form", produces = MediaType.TEXT_HTML_VALUE)
public String getMarcapaginasForm(Model model) {
model.addAttribute("presupuestoMarcapaginas", new PresupuestoMarcapaginas());
return "imprimelibros/presupuestos/presupuesto-marcapaginas-form :: marcapaginasForm";
}
@GetMapping("/public/marcapaginas")
public ResponseEntity<?> getPresupuestoMarcapaginas(
@Valid @ModelAttribute PresupuestoMarcapaginas presupuestoMarcapaginas,
BindingResult result,
Locale locale) {
if (result.hasErrors()) {
// Construimos un mapa field -> mensaje para tu AJAX
Map<String, String> errores = result.getFieldErrors().stream()
.collect(java.util.stream.Collectors.toMap(
fe -> fe.getField(),
fe -> fe.getDefaultMessage(),
(a, b) -> a));
return ResponseEntity.badRequest().body(errores);
}
Map<String, Object> resultado = presupuestoService.getPrecioMarcapaginas(presupuestoMarcapaginas, locale);
if ((Double) resultado.get("precio_total") == 0.0 && (Double) resultado.get("precio_unitario") == 0.0) {
return ResponseEntity.badRequest()
.body(messageSource.getMessage("presupuesto.errores.presupuesto-marcapaginas", null, locale));
}
return ResponseEntity.ok(resultado);
}
}

View File

@ -27,9 +27,11 @@ 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.marcapaginas.Marcapaginas;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMaquetacion;
import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatrices;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMarcapaginas;
import com.imprimelibros.erp.presupuesto.maquetacion.MaquetacionMatricesRepository;
import com.imprimelibros.erp.presupuesto.marcapaginas.MarcapaginasRepository;
import com.imprimelibros.erp.externalApi.skApiClient;
@Service
@ -50,6 +52,9 @@ public class PresupuestoService {
@Autowired
protected MaquetacionMatricesRepository maquetacionMatricesRepository;
@Autowired
protected MarcapaginasRepository marcapaginasRepository;
private final PresupuestadorItems presupuestadorItems;
public PresupuestoService(PresupuestadorItems presupuestadorItems) {
@ -607,7 +612,8 @@ public class PresupuestoService {
BigDecimal precio = BigDecimal.ZERO;
// millar_maquetacion * (numCaracteres / 1000.0)
BigDecimal millares = BigDecimal.valueOf(presupuestoMaquetacion.getNumCaracteres()).divide(BigDecimal.valueOf(1000), 6,
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"))));
@ -630,11 +636,14 @@ public class PresupuestoService {
// tabla, columna, foto
precio = precio
.add(BigDecimal.valueOf(presupuestoMaquetacion.getNumTablas()).multiply(BigDecimal.valueOf(price.apply("tabla"))));
.add(BigDecimal.valueOf(presupuestoMaquetacion.getNumTablas())
.multiply(BigDecimal.valueOf(price.apply("tabla"))));
precio = precio.add(
BigDecimal.valueOf(presupuestoMaquetacion.getNumColumnas()).multiply(BigDecimal.valueOf(price.apply("columnas"))));
BigDecimal.valueOf(presupuestoMaquetacion.getNumColumnas())
.multiply(BigDecimal.valueOf(price.apply("columnas"))));
precio = precio
.add(BigDecimal.valueOf(presupuestoMaquetacion.getNumFotos()).multiply(BigDecimal.valueOf(price.apply("foto"))));
.add(BigDecimal.valueOf(presupuestoMaquetacion.getNumFotos())
.multiply(BigDecimal.valueOf(price.apply("foto"))));
if (presupuestoMaquetacion.isCorreccionOrtotipografica()) {
precio = precio
@ -658,7 +667,12 @@ public class PresupuestoService {
out.put("numPaginasEstimadas", numPaginas);
out.put("precioPaginaEstimado", precioPaginaEstimado);
HashMap<String, String> language = new HashMap<>();
language.put("add_to_presupuesto", messageSource.getMessage("presupuesto.add-to-presupuesto", null, locale));
language.put("num_paginas_estimadas",
messageSource.getMessage("presupuesto.maquetacion.num-paginas-estimadas", null, locale));
language.put("precio_por_pagina_estimado",
messageSource.getMessage("presupuesto.maquetacion.precio-por-pagina-estimado", null, locale));
language.put("add_to_presupuesto",
messageSource.getMessage("presupuesto.add-to-presupuesto", null, locale));
language.put("cancel", messageSource.getMessage("app.cancelar", null, locale));
language.put("presupuesto_maquetacion", messageSource.getMessage("presupuesto.maquetacion", null, locale));
out.put("language", language);
@ -675,4 +689,92 @@ public class PresupuestoService {
return out;
}
public HashMap<String, Object> getPrecioMarcapaginas(PresupuestoMarcapaginas presupuestoMarcapaginas,
Locale locale) {
try {
List<Marcapaginas> m = marcapaginasRepository.findPrecios(presupuestoMarcapaginas);
if (m.isEmpty() || m.get(0) == null) {
HashMap<String, Object> out = new HashMap<>();
out.put("precio_unidad", 0.0);
out.put("precio_total", 0.0);
return out;
}
Marcapaginas marcapaginas = m.get(0);
Double precio = 0.0;
Double margen = 0.0;
Double pvp = 0.0;
BigDecimal data = BigDecimal.ZERO;
if (marcapaginas.getUnidades_max() >= presupuestoMarcapaginas.getUnidades()) {
precio = marcapaginas.getPrecio_unidades_min() +
(presupuestoMarcapaginas.getUnidades() - marcapaginas.getUnidades_min())
* (marcapaginas.getPrecio_unidades_max() - marcapaginas.getPrecio_unidades_min())
/ (marcapaginas.getUnidades_max() - marcapaginas.getUnidades_min());
data = new BigDecimal(precio);
precio = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
margen = 1.0 * marcapaginas.getMargen_unidades_min() +
(1.0 * presupuestoMarcapaginas.getUnidades() - 1.0 * marcapaginas.getUnidades_min())
* (1.0 * marcapaginas.getMargen_unidades_max()
- 1.0 * marcapaginas.getMargen_unidades_min())
/ (1.0 * marcapaginas.getUnidades_max() - 1.0 * marcapaginas.getUnidades_min());
data = new BigDecimal(margen);
margen = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
pvp = precio + (precio * margen / 100);
data = new BigDecimal(pvp);
pvp = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
} else {
// precio unidad para el máximo de unidades
precio = marcapaginas.getPrecio_unidades_max() / marcapaginas.getUnidades_max();
precio = precio * presupuestoMarcapaginas.getUnidades();
data = new BigDecimal(precio);
precio = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
margen = 1.0 * marcapaginas.getMargen_unidades_max();
data = new BigDecimal(margen);
margen = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
pvp = precio + (precio * margen / 100);
data = new BigDecimal(pvp);
pvp = data.setScale(2, RoundingMode.HALF_UP).doubleValue();
}
Double precio_unidad = pvp / presupuestoMarcapaginas.getUnidades();
data = new BigDecimal(precio_unidad);
precio_unidad = data.setScale(6, RoundingMode.HALF_UP).doubleValue();
HashMap<String, Object> resultado;
resultado = new HashMap<>();
resultado.put("precio_unitario", precio_unidad);
resultado.put("precio_total", pvp);
HashMap<String, String> language = new HashMap<>();
language.put("precio_unidad", messageSource.getMessage("presupuesto.marcapaginas.precio-unidad", null, locale));
language.put("precio_total", messageSource.getMessage("presupuesto.marcapaginas.precio-total", null, locale));
language.put("add_to_presupuesto",
messageSource.getMessage("presupuesto.add-to-presupuesto", null, locale));
language.put("cancel", messageSource.getMessage("app.cancelar", null, locale));
language.put("presupuesto_marcapaginas", messageSource.getMessage("presupuesto.marcapaginas", null, locale));
resultado.put("language", language);
return resultado;
} catch (Exception e) {
System.out.println("Error procesando presupuesto marcapaginas: " + e.getMessage());
}
HashMap<String, Object> out = new HashMap<>();
out.put("precio_unidad", 0.0);
out.put("precio_total", 0.0);
return out;
}
}