diff --git a/pom.xml b/pom.xml
index 9054bfb..578047b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -120,6 +120,25 @@
8.10.1
+
+
+ com.maxmind.geoip2
+ geoip2
+ 4.2.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.h2database
+ h2
+ test
+
+
diff --git a/src.zip b/src.zip
new file mode 100644
index 0000000..bcb1f3b
Binary files /dev/null and b/src.zip differ
diff --git a/src/main/java/com/imprimelibros/erp/auth/PasswordResetService.java b/src/main/java/com/imprimelibros/erp/auth/PasswordResetService.java
index cfba12f..5ea5137 100644
--- a/src/main/java/com/imprimelibros/erp/auth/PasswordResetService.java
+++ b/src/main/java/com/imprimelibros/erp/auth/PasswordResetService.java
@@ -6,15 +6,10 @@ import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.Locale;
-import java.util.Map;
-import org.springframework.context.MessageSource;
-import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import org.thymeleaf.context.Context;
-import org.thymeleaf.spring6.SpringTemplateEngine;
import com.imprimelibros.erp.common.email.EmailService;
import com.imprimelibros.erp.users.User;
@@ -26,26 +21,17 @@ public class PasswordResetService {
private final PasswordResetTokenRepository tokenRepo;
private final UserDao userRepo;
private final PasswordEncoder passwordEncoder;
- private final JavaMailSender mailSender;
- private final SpringTemplateEngine templateEngine;
- private final MessageSource messages;
private final EmailService emailService;
public PasswordResetService(
PasswordResetTokenRepository tokenRepo,
UserDao userRepo,
PasswordEncoder passwordEncoder,
- JavaMailSender mailSender,
- SpringTemplateEngine templateEngine,
- MessageSource messages,
EmailService emailService
) {
this.tokenRepo = tokenRepo;
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
- this.mailSender = mailSender;
- this.templateEngine = templateEngine;
- this.messages = messages;
this.emailService = emailService;
}
diff --git a/src/main/java/com/imprimelibros/erp/common/email/EmailService.java b/src/main/java/com/imprimelibros/erp/common/email/EmailService.java
index d94f8fa..4b64166 100644
--- a/src/main/java/com/imprimelibros/erp/common/email/EmailService.java
+++ b/src/main/java/com/imprimelibros/erp/common/email/EmailService.java
@@ -1,6 +1,5 @@
package com.imprimelibros.erp.common.email;
-import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.context.MessageSource;
diff --git a/src/main/java/com/imprimelibros/erp/common/jpa/AbstractAuditedSoftDeleteEntity.java b/src/main/java/com/imprimelibros/erp/common/jpa/AbstractAuditedSoftDeleteEntity.java
new file mode 100644
index 0000000..8d6a117
--- /dev/null
+++ b/src/main/java/com/imprimelibros/erp/common/jpa/AbstractAuditedSoftDeleteEntity.java
@@ -0,0 +1,70 @@
+package com.imprimelibros.erp.common.jpa;
+
+import jakarta.persistence.*;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import java.time.Instant;
+
+import com.imprimelibros.erp.users.User;
+
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public abstract class AbstractAuditedSoftDeleteEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ // Auditoría temporal
+ @CreatedDate
+ @Column(name = "created_at", updatable = false)
+ private Instant createdAt;
+
+ @LastModifiedDate
+ @Column(name = "updated_at")
+ private Instant updatedAt;
+
+ // Auditoría por usuario (nullable si público anónimo)
+ @CreatedBy
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "created_by")
+ private User createdBy;
+
+ @LastModifiedBy
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "updated_by")
+ private User updatedBy;
+
+ // Soft delete
+ @Column(name = "deleted", nullable = false)
+ private boolean deleted = false;
+
+ @Column(name = "deleted_at")
+ private Instant deletedAt;
+
+ // Getters/Setters
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+
+ public Instant getCreatedAt() { return createdAt; }
+ public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }
+
+ public Instant getUpdatedAt() { return updatedAt; }
+ public void setUpdatedAt(Instant updatedAt) { this.updatedAt = updatedAt; }
+
+ public User getCreatedBy() { return createdBy; }
+ public void setCreatedBy(User createdBy) { this.createdBy = createdBy; }
+
+ public User getUpdatedBy() { return updatedBy; }
+ public void setUpdatedBy(User updatedBy) { this.updatedBy = updatedBy; }
+
+ public boolean isDeleted() { return deleted; }
+ public void setDeleted(boolean deleted) { this.deleted = deleted; }
+
+ public Instant getDeletedAt() { return deletedAt; }
+ public void setDeletedAt(Instant deletedAt) { this.deletedAt = deletedAt; }
+}
diff --git a/src/main/java/com/imprimelibros/erp/common/web/IpUtils.java b/src/main/java/com/imprimelibros/erp/common/web/IpUtils.java
new file mode 100644
index 0000000..41068c8
--- /dev/null
+++ b/src/main/java/com/imprimelibros/erp/common/web/IpUtils.java
@@ -0,0 +1,33 @@
+package com.imprimelibros.erp.common.web;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import java.util.Arrays;
+import java.util.List;
+
+public final class IpUtils {
+ private IpUtils() {}
+
+ private static final List HEADERS = Arrays.asList(
+ "X-Forwarded-For",
+ "X-Real-IP",
+ "CF-Connecting-IP",
+ "True-Client-IP",
+ "X-Client-IP",
+ "X-Forwarded",
+ "Forwarded-For",
+ "Forwarded"
+ );
+
+ public static String getClientIp(HttpServletRequest request) {
+ for (String h : HEADERS) {
+ String v = request.getHeader(h);
+ if (v != null && !v.isBlank() && !"unknown".equalsIgnoreCase(v)) {
+ // X-Forwarded-For puede traer lista: "client, proxy1, proxy2"
+ String first = v.split(",")[0].trim();
+ if (!first.isBlank()) return first;
+ }
+ }
+ return request.getRemoteAddr();
+ }
+}
diff --git a/src/main/java/com/imprimelibros/erp/config/JpaAuditConfig.java b/src/main/java/com/imprimelibros/erp/config/JpaAuditConfig.java
new file mode 100644
index 0000000..5729aaf
--- /dev/null
+++ b/src/main/java/com/imprimelibros/erp/config/JpaAuditConfig.java
@@ -0,0 +1,36 @@
+package com.imprimelibros.erp.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.domain.AuditorAware;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import com.imprimelibros.erp.users.User;
+
+import java.util.Optional;
+
+@Configuration
+@EnableJpaAuditing(auditorAwareRef = "auditorAware")
+public class JpaAuditConfig {
+
+ @Bean
+ public AuditorAware auditorAware() {
+ return () -> {
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth == null || !auth.isAuthenticated()) return Optional.empty();
+
+ Object principal = auth.getPrincipal();
+ if (principal instanceof User u) return Optional.of(u);
+
+ if (principal instanceof UserDetails ud) {
+ // Si tu principal es UserDetails y no la entidad User,
+ // aquí podrías cargar User por username si lo necesitas.
+ return Optional.empty();
+ }
+ return Optional.empty();
+ };
+ }
+}
diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/GeoIpService.java b/src/main/java/com/imprimelibros/erp/presupuesto/GeoIpService.java
new file mode 100644
index 0000000..b222f43
--- /dev/null
+++ b/src/main/java/com/imprimelibros/erp/presupuesto/GeoIpService.java
@@ -0,0 +1,37 @@
+package com.imprimelibros.erp.presupuesto;
+
+import java.util.Optional;
+
+public interface GeoIpService {
+
+ class GeoData {
+ public final String pais;
+ public final String region;
+ public final String ciudad;
+
+ public GeoData(String pais, String region, String ciudad) {
+ this.pais = pais;
+ this.region = region;
+ this.ciudad = ciudad;
+ }
+
+ public String getPais() {
+ return pais;
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public String getCiudad() {
+ return ciudad;
+ }
+
+ }
+
+ /**
+ * @param ip Ip original (no anonimizada) - la implementación debe manejar IPv4/IPv6.
+ * @return GeoData si se pudo resolver; Optional.empty() en caso de error o IP privada.
+ */
+ Optional lookup(String ip);
+}
diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java
index 50033f0..3a6b04b 100644
--- a/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java
+++ b/src/main/java/com/imprimelibros/erp/presupuesto/Presupuesto.java
@@ -9,14 +9,35 @@ import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import com.imprimelibros.erp.presupuesto.validation.Tamanio;
import com.imprimelibros.erp.common.HtmlStripConverter;
+import com.imprimelibros.erp.common.jpa.AbstractAuditedSoftDeleteEntity;
import jakarta.persistence.*;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.SQLRestriction;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.imprimelibros.erp.users.User;
+
@ConsistentTiradas(groups = PresupuestoValidationGroups.DatosGenerales.class)
@Tamanio(groups = PresupuestoValidationGroups.DatosGenerales.class)
+@EntityListeners(AuditingEntityListener.class)
@Entity
-@Table(name = "presupuesto")
-public class Presupuesto implements Cloneable{
+@Table(name = "presupuesto", indexes = {
+ @Index(name = "idx_presupuesto_origen_estado", columnList = "origen, estado"),
+ @Index(name = "idx_presupuesto_session", columnList = "session_id"),
+ @Index(name = "idx_presupuesto_user", columnList = "user_id"),
+ @Index(name = "idx_presupuesto_deleted", columnList = "deleted"),
+ @Index(name = "idx_presupuesto_geo", columnList = "pais, region, ciudad")
+})
+@SQLDelete(sql = "UPDATE presupuesto SET deleted = 1, deleted_at = NOW(3) WHERE id = ?")
+@SQLRestriction("deleted = 0")
+public class Presupuesto extends AbstractAuditedSoftDeleteEntity implements Cloneable {
public enum TipoEncuadernacion {
fresado("presupuesto.fresado"),
@@ -69,6 +90,14 @@ public class Presupuesto implements Cloneable{
}
}
+ public enum Origen {
+ publico, privado
+ }
+
+ public enum Estado {
+ borrador, aceptado, modificado
+ }
+
@Override
public Presupuesto clone() {
try {
@@ -78,9 +107,89 @@ public class Presupuesto implements Cloneable{
}
}
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
+ // ====== NUEVOS: Origen/Estado/Usuario/Session/Geo/IP/Totales/JSONs ======
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "origen", nullable = false)
+ private Origen origen = Origen.publico;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "estado", nullable = false)
+ private Estado estado = Estado.borrador;
+
+ // Usuario autenticado (nullable en público)
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "user_id")
+ private User user;
+
+ // Continuidad en público
+ @Column(name = "session_id", length = 64)
+ private String sessionId;
+
+ @Column(name = "visitor_id", length = 64)
+ private String visitorId;
+
+ // IP anonimizada / truncada + geolocalización resumida (para estadísticas)
+ @Column(name = "ip_hash", length = 88) // SHA-256 base64 ≈ 44 chars; dejamos margen
+ private String ipHash;
+
+ @Column(name = "ip_trunc", length = 64)
+ private String ipTrunc; // p.ej. "192.168.0.0" o "2a02:xxxx::"
+
+ @Column(name = "pais", length = 64)
+ private String pais;
+
+ @Column(name = "region", length = 128)
+ private String region;
+
+ @Column(name = "ciudad", length = 128)
+ private String ciudad;
+
+ // Totales de la tirada seleccionada y del presupuesto
+ @Column(name = "precio_unitario", precision = 12, scale = 4)
+ private BigDecimal precioUnitario;
+
+ @Column(name = "precio_total_tirada", precision = 12, scale = 2)
+ private BigDecimal precioTotalTirada;
+
+ @Column(name = "servicios_total", precision = 12, scale = 2)
+ private BigDecimal serviciosTotal;
+
+ @Column(name = "base_imponible", precision = 12, scale = 2)
+ private BigDecimal baseImponible;
+
+ @Column(name = "iva_tipo", precision = 5, scale = 2)
+ private BigDecimal ivaTipo;
+
+ @Column(name = "iva_importe", precision = 12, scale = 2)
+ private BigDecimal ivaImporte;
+
+ @Column(name = "total_con_iva", precision = 12, scale = 2)
+ private BigDecimal totalConIva;
+
+ // JSONs de apoyo (todas las tiradas, servicios, bloques de
+ // maquetación/marcapáginas y snapshot)
+ @Lob
+ @Column(name = "precios_por_tirada_json", columnDefinition = "json")
+ private String preciosPorTiradaJson; // [{tirada, precio_unitario, precio_total_tirada}, ...]
+
+ @Lob
+ @Column(name = "servicios_json", columnDefinition = "json")
+ private String serviciosJson;
+
+ @Lob
+ @Column(name = "datos_maquetacion_json", columnDefinition = "json")
+ private String datosMaquetacionJson;
+
+ @Lob
+ @Column(name = "datos_marcapaginas_json", columnDefinition = "json")
+ private String datosMarcapaginasJson;
+
+ @Lob
+ @Column(name = "pricing_snapshot", columnDefinition = "json")
+ private String pricingSnapshotJson;
+
+ // ====== TUS CAMPOS ORIGINALES ======
@NotNull(message = "{presupuesto.errores.tipo-encuadernacion}", groups = PresupuestoValidationGroups.DatosGenerales.class)
@Enumerated(EnumType.STRING)
@@ -192,39 +301,267 @@ public class Presupuesto implements Cloneable{
@NotNull(message = "{presupuesto.errores.acabado-cubierta}", groups = PresupuestoValidationGroups.Cubierta.class)
@Column(name = "acabado")
- private Integer acabado = 1;
+ private Integer acabado = 1;
@Column(name = "sobrecubierta")
private Boolean sobrecubierta = false;
+
@Column(name = "papel_sobrecubierta_id")
private Integer papelSobrecubiertaId = 2;
+
@Column(name = "gramaje_sobrecubierta")
private Integer gramajeSobrecubierta = 170;
+
@Column(name = "tamanio_solapas_sobrecubierta")
private Integer tamanioSolapasSobrecubierta = 80;
+
@Column(name = "acabado_sobrecubierta")
- private Integer acabadoSobrecubierta = 0; // 0: sin acabado,
+ private Integer acabadoSobrecubierta = 0;
@Column(name = "faja")
private Boolean faja = false;
+
@Column(name = "papel_faja_id")
private Integer papelFajaId = 2;
+
@Column(name = "gramaje_faja")
private Integer gramajeFaja = 170;
+
@Column(name = "tamanio_solapas_faja")
private Integer tamanioSolapasFaja = 80;
+
@Column(name = "acabado_faja")
- private Integer acabadoFaja = 0; // 0: sin acabado
+ private Integer acabadoFaja = 0;
+
@Column(name = "alto_faja")
private Integer altoFaja = 0;
- @Column(name = "presupuesto_maquetacion")
- private Boolean presupuestoMaquetacion = false;
- @Column(name = "presupuesto_maquetacion_data")
- private String presupuestoMaquetacionData;
+ // ====== AUDIT ======
+
+ @CreatedDate
+ @Column(name = "created_at", updatable = false)
+ private LocalDateTime createdAt;
+
+ @CreatedBy
+ @Column(name = "created_by", updatable = false) // BIGINT o VARCHAR: ajusta el tipo del campo
+ private Long createdBy; // o String si tu columna es texto
- // Getters y Setters
+
+
+ // ====== MÉTODOS AUX ======
+
+ public String resumenPresupuesto() {
+ return String.format("%s - %s - %dx%d mm - %d Páginas (N:%d C:%d) - Tira:%d",
+ this.titulo,
+ this.tipoEncuadernacion,
+ this.ancho,
+ this.alto,
+ (this.paginasNegro != null ? this.paginasNegro : 0)
+ + (this.paginasColorTotal != null ? this.paginasColorTotal : 0),
+ this.paginasNegro != null ? this.paginasNegro : 0,
+ this.paginasColorTotal != null ? this.paginasColorTotal : 0,
+ this.selectedTirada != null ? this.selectedTirada : 0);
+ }
+
+ public Integer[] getTiradas() {
+ return new Integer[] { tirada1, tirada2, tirada3, tirada4 };
+ }
+
+ // ====== GETTERS/SETTERS (incluye nuevos y existentes) ======
+
+ public Origen getOrigen() {
+ return origen;
+ }
+
+ public void setOrigen(Origen origen) {
+ this.origen = origen;
+ }
+
+ public Estado getEstado() {
+ return estado;
+ }
+
+ public void setEstado(Estado estado) {
+ this.estado = estado;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public String getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(String sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public String getVisitorId() {
+ return visitorId;
+ }
+
+ public void setVisitorId(String visitorId) {
+ this.visitorId = visitorId;
+ }
+
+ public String getIpHash() {
+ return ipHash;
+ }
+
+ public void setIpHash(String ipHash) {
+ this.ipHash = ipHash;
+ }
+
+ public String getIpTrunc() {
+ return ipTrunc;
+ }
+
+ public void setIpTrunc(String ipTrunc) {
+ this.ipTrunc = ipTrunc;
+ }
+
+ public String getPais() {
+ return pais;
+ }
+
+ public void setPais(String pais) {
+ this.pais = pais;
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getCiudad() {
+ return ciudad;
+ }
+
+ public void setCiudad(String ciudad) {
+ this.ciudad = ciudad;
+ }
+
+ public BigDecimal getPrecioUnitario() {
+ return precioUnitario;
+ }
+
+ public void setPrecioUnitario(BigDecimal precioUnitario) {
+ this.precioUnitario = precioUnitario;
+ }
+
+ public BigDecimal getPrecioTotalTirada() {
+ return precioTotalTirada;
+ }
+
+ public void setPrecioTotalTirada(BigDecimal precioTotalTirada) {
+ this.precioTotalTirada = precioTotalTirada;
+ }
+
+ public BigDecimal getServiciosTotal() {
+ return serviciosTotal;
+ }
+
+ public void setServiciosTotal(BigDecimal serviciosTotal) {
+ this.serviciosTotal = serviciosTotal;
+ }
+
+ public BigDecimal getBaseImponible() {
+ return baseImponible;
+ }
+
+ public void setBaseImponible(BigDecimal baseImponible) {
+ this.baseImponible = baseImponible;
+ }
+
+ public BigDecimal getIvaTipo() {
+ return ivaTipo;
+ }
+
+ public void setIvaTipo(BigDecimal ivaTipo) {
+ this.ivaTipo = ivaTipo;
+ }
+
+ public BigDecimal getIvaImporte() {
+ return ivaImporte;
+ }
+
+ public void setIvaImporte(BigDecimal ivaImporte) {
+ this.ivaImporte = ivaImporte;
+ }
+
+ public BigDecimal getTotalConIva() {
+ return totalConIva;
+ }
+
+ public void setTotalConIva(BigDecimal totalConIva) {
+ this.totalConIva = totalConIva;
+ }
+
+ public String getPreciosPorTiradaJson() {
+ return preciosPorTiradaJson;
+ }
+
+ public void setPreciosPorTiradaJson(String preciosPorTiradaJson) {
+ this.preciosPorTiradaJson = preciosPorTiradaJson;
+ }
+
+ public String getServiciosJson() {
+ return serviciosJson;
+ }
+
+ public void setServiciosJson(String serviciosJson) {
+ this.serviciosJson = serviciosJson;
+ }
+
+ public String getDatosMaquetacionJson() {
+ return datosMaquetacionJson;
+ }
+
+ public void setDatosMaquetacionJson(String datosMaquetacionJson) {
+ this.datosMaquetacionJson = datosMaquetacionJson;
+ }
+
+ public String getDatosMarcapaginasJson() {
+ return datosMarcapaginasJson;
+ }
+
+ public void setDatosMarcapaginasJson(String datosMarcapaginasJson) {
+ this.datosMarcapaginasJson = datosMarcapaginasJson;
+ }
+
+ public String getPricingSnapshotJson() {
+ return pricingSnapshotJson;
+ }
+
+ public void setPricingSnapshotJson(String pricingSnapshotJson) {
+ this.pricingSnapshotJson = pricingSnapshotJson;
+ }
+
+ public TipoEncuadernacion getTipoEncuadernacion() {
+ return tipoEncuadernacion;
+ }
+
+ public void setTipoEncuadernacion(TipoEncuadernacion tipoEncuadernacion) {
+ this.tipoEncuadernacion = tipoEncuadernacion;
+ }
+
+ public String getTitulo() {
+ return titulo;
+ }
+
+ public void setTitulo(String titulo) {
+ this.titulo = titulo;
+ }
+
public String getAutor() {
return autor;
}
@@ -269,14 +606,18 @@ public class Presupuesto implements Cloneable{
return tirada4;
}
- public Integer[] getTiradas() {
- return new Integer[] { tirada1, tirada2, tirada3, tirada4 };
- }
-
public void setTirada4(Integer tirada4) {
this.tirada4 = tirada4;
}
+ public Integer getSelectedTirada() {
+ return selectedTirada;
+ }
+
+ public void setSelectedTirada(Integer selectedTirada) {
+ this.selectedTirada = selectedTirada;
+ }
+
public Integer getAncho() {
return ancho;
}
@@ -301,22 +642,6 @@ public class Presupuesto implements Cloneable{
this.formatoPersonalizado = formatoPersonalizado;
}
- public String getTitulo() {
- return titulo;
- }
-
- public void setTitulo(String titulo) {
- this.titulo = titulo;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
public Integer getPaginasNegro() {
return paginasNegro;
}
@@ -333,14 +658,6 @@ public class Presupuesto implements Cloneable{
this.paginasColor = paginasColor;
}
- public TipoEncuadernacion getTipoEncuadernacion() {
- return tipoEncuadernacion;
- }
-
- public void setTipoEncuadernacion(TipoEncuadernacion tipoEncuadernacion) {
- this.tipoEncuadernacion = tipoEncuadernacion;
- }
-
public String getPosicionPaginasColor() {
return posicionPaginasColor;
}
@@ -557,36 +874,5 @@ public class Presupuesto implements Cloneable{
this.altoFaja = altoFaja;
}
- public Integer getSelectedTirada() {
- return selectedTirada;
- }
-
- public void setSelectedTirada(Integer selectedTirada) {
- 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;
- }
-
- public String resumenPresupuesto() {
- return String.format("%s - %s - %dx%d mm - %d Páginas (N:%d C:%d) - Tira:%d",
- this.titulo,
- this.tipoEncuadernacion,
- this.ancho,
- this.alto,
- this.paginasNegro + this.paginasColorTotal,
- this.paginasNegro,
- this.paginasColorTotal,
- this.selectedTirada != null ? this.selectedTirada : 0);
- }
+
}
diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java
index 55ffb02..045c7ee 100644
--- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java
+++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java
@@ -29,6 +29,7 @@ import com.imprimelibros.erp.presupuesto.classes.PresupuestoMaquetacion;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoMarcapaginas;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
+import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
@Controller
@@ -388,13 +389,22 @@ public class PresupuestoController {
// Se hace un post para no tener problemas con la longitud de la URL
@PostMapping("/public/resumen")
- public ResponseEntity> getResumen(@RequestBody Map body, Locale locale) {
+ public ResponseEntity> getResumen(
+ @RequestBody Map body,
+ Locale locale,
+ HttpServletRequest request) {
+
Presupuesto p = objectMapper.convertValue(body.get("presupuesto"), Presupuesto.class);
@SuppressWarnings("unchecked")
List